summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett.damore@Sun.COM>2009-04-27 23:06:04 -0700
committerGarrett D'Amore <garrett.damore@Sun.COM>2009-04-27 23:06:04 -0700
commit88447a05f537aabe9a1bc3d5313f22581ec992a7 (patch)
treea790bb3bed2aaa853eb36e26fdb803c0870515c9
parent8813556ecd95e7cfdcd7de743ccde2d8702b0b89 (diff)
downloadillumos-joyent-88447a05f537aabe9a1bc3d5313f22581ec992a7.tar.gz
PSARC 2008/318 Boomer: Next Generation Solaris Audio
6824027 Deliver Boomer (PSARC 2008/318) audio system 6216252 mixerctl needs CLI options to set the play,record gain and the balance 6824524 inadequate locking in usb_as isoc pipe handling causes audio corruption 6819627 Add support for Ensoniq ES1371 (for VMware) 6803095 HP Mini 1000 After probing devices at install constant white noise 6775793 Audio distortion when adjusting volume via Gnome Volume Applet 6763299 VT8233/A/8235/8237 AC97 Audio Controller vendor 0x1106 device 0x3059 6819634 need driver for SiS AC'97 audio 6486306 Audio driver should allow for plugs configuration 6363625 default sampling rate should be set to 8k in mixer mode 6754251 audioixp has no quiesce() 6828944 devfsadm support for ISDN links can be removed 6759385 audiovia823x has no quiesce() 6754454 audio810 has no quiesce() 6819142 VirtualBox - No Audio 6389136 audio mixer could do device cleanup 6717717 audiohd does not attach to "pciclass,0403", but "pciexclass,0403" 6495365 Attach of "Creative Technology Ltd SB Audigy 2 NX" panics 6193343 Audio Mixer Sample Rate Conversion, Audio Support Module leak kernel memory --HG-- rename : usr/src/pkgdefs/SUNWad810/postinstall => usr/src/pkgdefs/SUNWad810/postinstall.tmpl rename : usr/src/pkgdefs/SUNWad810/preremove => usr/src/pkgdefs/SUNWad810/preremove.tmpl rename : usr/src/pkgdefs/SUNWadixp/postinstall => usr/src/pkgdefs/SUNWadixp/postinstall.tmpl rename : usr/src/pkgdefs/SUNWadixp/preremove => usr/src/pkgdefs/SUNWadixp/preremove.tmpl rename : usr/src/pkgdefs/SUNWaudd/postinstall => usr/src/pkgdefs/SUNWaudd/postinstall.tmpl rename : usr/src/pkgdefs/SUNWaudd/preremove => usr/src/pkgdefs/SUNWaudd/preremove.tmpl rename : usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c => usr/src/uts/common/io/audio/drv/audio1575/audio1575.c rename : usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf => usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf rename : usr/src/uts/sun/sys/audio/audio1575.h => usr/src/uts/common/io/audio/drv/audio1575/audio1575.h rename : usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c => usr/src/uts/common/io/audio/drv/audio810/audio810.c rename : usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf => usr/src/uts/common/io/audio/drv/audio810/audio810.conf rename : usr/src/uts/common/sys/audio/audio810.h => usr/src/uts/common/io/audio/drv/audio810/audio810.h rename : usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c => usr/src/uts/common/io/audio/drv/audiohd/audiohd.c rename : usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf => usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf rename : usr/src/uts/common/sys/audio/audiohd.h => usr/src/uts/common/io/audio/drv/audiohd/audiohd.h rename : usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c => usr/src/uts/common/io/audio/drv/audioixp/audioixp.c rename : usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf => usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf rename : usr/src/uts/common/sys/audio/audioixp.h => usr/src/uts/common/io/audio/drv/audioixp/audioixp.h rename : usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c => usr/src/uts/common/io/audio/drv/audiots/audiots.c rename : usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf => usr/src/uts/common/io/audio/drv/audiots/audiots.conf rename : usr/src/uts/common/sys/audio/audiots.h => usr/src/uts/common/io/audio/drv/audiots/audiots.h rename : usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c => usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c rename : usr/src/uts/sun/sys/audio/audio_4231.h => usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h rename : usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c => usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c rename : usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c => usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c rename : usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf => usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf
-rw-r--r--usr/src/Makefile.lint2
-rw-r--r--usr/src/cmd/allocate/Makefile24
-rw-r--r--usr/src/cmd/allocate/audio_clean.c296
-rw-r--r--usr/src/cmd/allocate/audio_clean.sh (renamed from usr/src/cmd/allocate/audio_clean_wrapper.sh)57
-rw-r--r--usr/src/cmd/allocate/devalloc_defaults6
-rw-r--r--usr/src/cmd/audio/Makefile10
-rw-r--r--usr/src/cmd/audio/audioplay/audioplay.c159
-rw-r--r--usr/src/cmd/audio/audiorecord/audiorecord.c149
-rw-r--r--usr/src/cmd/audio/audiotest/Makefile50
-rw-r--r--usr/src/cmd/audio/audiotest/audiotest.c575
-rw-r--r--usr/src/cmd/audio/audiotest/audiotest.xcl (renamed from usr/src/cmd/mdb/sparc/v9/audiosup/Makefile)42
-rw-r--r--usr/src/cmd/audio/audiotest/wavedata.c194
-rw-r--r--usr/src/cmd/audio/audiotest/wavedata.h42792
-rw-r--r--usr/src/cmd/audio/mixerctl/Makefile9
-rw-r--r--usr/src/cmd/audio/mixerctl/mixerctl.c1644
-rw-r--r--usr/src/cmd/devfsadm/audio_link.c362
-rw-r--r--usr/src/cmd/mdb/Makefile.common3
-rw-r--r--usr/src/cmd/mdb/common/modules/audiosup/audiosup.c227
-rw-r--r--usr/src/cmd/svc/milestone/Makefile6
-rw-r--r--usr/src/cmd/svc/milestone/devices-audio44
-rw-r--r--usr/src/cmd/svc/milestone/devices-audio.xml91
-rw-r--r--usr/src/pkgdefs/SUNWad810/Makefile8
-rw-r--r--usr/src/pkgdefs/SUNWad810/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWad810/postinstall)57
-rw-r--r--usr/src/pkgdefs/SUNWad810/preremove52
-rw-r--r--usr/src/pkgdefs/SUNWad810/preremove.tmpl (renamed from usr/src/cmd/mdb/intel/ia32/audiosup/Makefile)19
-rw-r--r--usr/src/pkgdefs/SUNWadixp/Makefile9
-rw-r--r--usr/src/pkgdefs/SUNWadixp/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWadixp/postinstall)38
-rw-r--r--usr/src/pkgdefs/SUNWadixp/preremove.tmpl (renamed from usr/src/cmd/mdb/intel/amd64/audiosup/Makefile)20
-rw-r--r--usr/src/pkgdefs/SUNWauda/prototype_com12
-rw-r--r--usr/src/pkgdefs/SUNWaudd/Makefile7
-rw-r--r--usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl6
-rw-r--r--usr/src/pkgdefs/SUNWaudd/postinstall69
-rw-r--r--usr/src/pkgdefs/SUNWaudd/postinstall.tmpl (renamed from usr/src/pkgdefs/SUNWaudd/preremove)37
-rw-r--r--usr/src/pkgdefs/SUNWaudd/preremove.tmpl (renamed from usr/src/pkgdefs/SUNWadixp/preremove)33
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_com12
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_i38621
-rw-r--r--usr/src/pkgdefs/SUNWaudd/prototype_sparc12
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_com20
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_i3868
-rw-r--r--usr/src/pkgdefs/SUNWaudh/prototype_sparc8
-rw-r--r--usr/src/pkgdefs/SUNWaudiohd/postinstall4
-rw-r--r--usr/src/pkgdefs/SUNWcsr/prototype_com2
-rw-r--r--usr/src/pkgdefs/SUNWmdb/prototype_i3864
-rw-r--r--usr/src/pkgdefs/SUNWmdb/prototype_sparc3
-rw-r--r--usr/src/pkgdefs/SUNWmdbr/prototype_i3864
-rw-r--r--usr/src/pkgdefs/SUNWmdbr/prototype_sparc3
-rw-r--r--usr/src/pkgdefs/SUNWtsg/prototype_com11
-rw-r--r--usr/src/pkgdefs/SUNWusb/prototype_i3863
-rw-r--r--usr/src/pkgdefs/SUNWusb/prototype_sparc1
-rw-r--r--usr/src/pkgdefs/etc/exception_list_sparc15
-rw-r--r--usr/src/tools/findunref/exception_list.open8
-rw-r--r--usr/src/tools/scripts/bfu.sh116
-rw-r--r--usr/src/uts/common/Makefile.files25
-rw-r--r--usr/src/uts/common/Makefile.rules49
-rw-r--r--usr/src/uts/common/brand/lx/io/lx_audio.c54
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97.c1974
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_ad.c257
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_alc.c219
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_cmi.c311
-rw-r--r--usr/src/uts/common/io/audio/ac97/ac97_impl.h113
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.c1952
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf (renamed from usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf)32
-rw-r--r--usr/src/uts/common/io/audio/drv/audio1575/audio1575.h468
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.c1971
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.conf97
-rw-r--r--usr/src/uts/common/io/audio/drv/audio810/audio810.h267
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.c1458
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf)32
-rw-r--r--usr/src/uts/common/io/audio/drv/audioens/audioens.h210
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.c (renamed from usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c)5474
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf)16
-rw-r--r--usr/src/uts/common/io/audio/drv/audiohd/audiohd.h (renamed from usr/src/uts/common/sys/audio/impl/audiohd_impl.h)298
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.c1675
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf)29
-rw-r--r--usr/src/uts/common/io/audio/drv/audioixp/audioixp.h286
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.c1736
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf46
-rw-r--r--usr/src/uts/common/io/audio/drv/audiopci/audiopci.h233
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.c2015
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.conf (renamed from usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf)28
-rw-r--r--usr/src/uts/common/io/audio/drv/audiots/audiots.h (renamed from usr/src/uts/common/sys/audio/impl/audiots_impl.h)247
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c1070
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf41
-rw-r--r--usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h191
-rw-r--r--usr/src/uts/common/io/audio/impl/audio.conf38
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_client.c1675
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_client.h260
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_ctrl.c375
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_ddi.c465
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_engine.c1197
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_fltdata.c9283
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_format.c894
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_grc3.c388
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_grc3.h275
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_impl.h472
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_input.c229
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_oss.c2577
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_output.c463
-rw-r--r--usr/src/uts/common/io/audio/impl/audio_sun.c1967
-rw-r--r--usr/src/uts/common/io/audio/impl/austr.c62
-rw-r--r--usr/src/uts/common/io/audio/impl/austr.conf38
-rw-r--r--usr/src/uts/common/io/audio/inc.flg128
-rw-r--r--usr/src/uts/common/io/audio/sada/amsrc2/README106
-rw-r--r--usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c1037
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audio810/README383
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c3490
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c3389
-rw-r--r--usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c4264
-rw-r--r--usr/src/uts/common/io/audio/sada/framework/audio_support.c4209
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_ad.c5155
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c5376
-rw-r--r--usr/src/uts/common/io/audio/sada/mixer/am_main.c4273
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c1956
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h161
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c2378
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf11
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c1202
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c153
-rw-r--r--usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c947
-rw-r--r--usr/src/uts/common/io/usb/inc.flg191
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac.wlcmd6
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd5
-rw-r--r--usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd5
-rw-r--r--usr/src/uts/common/sys/Makefile16
-rw-r--r--usr/src/uts/common/sys/audio/ac97.h284
-rw-r--r--usr/src/uts/common/sys/audio/am_src1.h77
-rw-r--r--usr/src/uts/common/sys/audio/am_src2.h55
-rw-r--r--usr/src/uts/common/sys/audio/audio810.h84
-rw-r--r--usr/src/uts/common/sys/audio/audio_apm.h331
-rw-r--r--usr/src/uts/common/sys/audio/audio_common.h304
-rw-r--r--usr/src/uts/common/sys/audio/audio_driver.h241
-rw-r--r--usr/src/uts/common/sys/audio/audio_mixer.h114
-rw-r--r--usr/src/uts/common/sys/audio/audio_oss.h908
-rw-r--r--usr/src/uts/common/sys/audio/audio_src.h102
-rw-r--r--usr/src/uts/common/sys/audio/audio_support.h116
-rw-r--r--usr/src/uts/common/sys/audio/audio_trace.h140
-rwxr-xr-xusr/src/uts/common/sys/audio/audiohd.h89
-rw-r--r--usr/src/uts/common/sys/audio/audioixp.h77
-rw-r--r--usr/src/uts/common/sys/audio/audiots.h86
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src1_impl.h96
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src2_impl.h107
-rw-r--r--usr/src/uts/common/sys/audio/impl/am_src2_table.h1493
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio810_impl.h350
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h425
-rw-r--r--usr/src/uts/common/sys/audio/impl/audio_support_impl.h122
-rw-r--r--usr/src/uts/common/sys/audio/impl/audioixp_impl.h459
-rw-r--r--usr/src/uts/common/sys/audioio.h20
-rw-r--r--usr/src/uts/common/sys/audiovar.h472
-rw-r--r--usr/src/uts/common/sys/mixer.h16
-rw-r--r--usr/src/uts/common/sys/soundcard.h31
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h51
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h15
-rw-r--r--usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h7
-rw-r--r--usr/src/uts/intel/Makefile.intel.shared13
-rw-r--r--usr/src/uts/intel/ac97/Makefile (renamed from usr/src/uts/intel/amsrc2/Makefile)44
-rw-r--r--usr/src/uts/intel/audio/Makefile80
-rw-r--r--usr/src/uts/intel/audio810/Makefile73
-rw-r--r--usr/src/uts/intel/audioens/Makefile82
-rw-r--r--usr/src/uts/intel/audiohd/Makefile60
-rw-r--r--usr/src/uts/intel/audioixp/Makefile67
-rw-r--r--usr/src/uts/intel/audiopci/Makefile82
-rw-r--r--usr/src/uts/intel/audiovia823x/Makefile (renamed from usr/src/uts/intel/usb_ac_dacf/Makefile)46
-rw-r--r--usr/src/uts/intel/austr/Makefile85
-rw-r--r--usr/src/uts/intel/mixer/Makefile154
-rw-r--r--usr/src/uts/intel/os/dacf.conf10
-rw-r--r--usr/src/uts/intel/usb_ac/Makefile17
-rw-r--r--usr/src/uts/intel/usb_ah/Makefile4
-rw-r--r--usr/src/uts/intel/usb_as/Makefile22
-rw-r--r--usr/src/uts/intel/warlock/Makefile19
-rw-r--r--usr/src/uts/sparc/Makefile.sparc.shared9
-rw-r--r--usr/src/uts/sparc/ac97/Makefile (renamed from usr/src/uts/intel/audiosup/Makefile)51
-rw-r--r--usr/src/uts/sparc/amsrc2/main.c74
-rw-r--r--usr/src/uts/sparc/audio/Makefile80
-rw-r--r--usr/src/uts/sparc/audio1575/Makefile70
-rw-r--r--usr/src/uts/sparc/audio810/Makefile155
-rw-r--r--usr/src/uts/sparc/audiocs/Makefile66
-rw-r--r--usr/src/uts/sparc/audioens/Makefile82
-rw-r--r--usr/src/uts/sparc/audiohd/Makefile156
-rw-r--r--usr/src/uts/sparc/audioixp/Makefile117
-rw-r--r--usr/src/uts/sparc/audiopci/Makefile82
-rw-r--r--usr/src/uts/sparc/audiosup/Makefile128
-rw-r--r--usr/src/uts/sparc/audiots/Makefile68
-rw-r--r--usr/src/uts/sparc/austr/Makefile (renamed from usr/src/uts/sparc/amsrc2/Makefile)73
-rw-r--r--usr/src/uts/sparc/mixer/Makefile156
-rw-r--r--usr/src/uts/sparc/os/dacf.conf10
-rw-r--r--usr/src/uts/sparc/usb_ac/Makefile10
-rw-r--r--usr/src/uts/sparc/usb_ac_dacf/Makefile89
-rw-r--r--usr/src/uts/sparc/usb_ah/Makefile6
-rw-r--r--usr/src/uts/sparc/usb_as/Makefile22
-rw-r--r--usr/src/uts/sparc/warlock/Makefile22
-rw-r--r--usr/src/uts/sun/Makefile.files5
-rw-r--r--usr/src/uts/sun/Makefile.rules15
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c2406
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h (renamed from usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h)286
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c567
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c573
-rw-r--r--usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf (renamed from usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf)25
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c4119
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c3020
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c1332
-rw-r--r--usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c1459
-rw-r--r--usr/src/uts/sun/sys/Makefile10
-rw-r--r--usr/src/uts/sun/sys/audio/audio1575.h83
-rw-r--r--usr/src/uts/sun/sys/audio/audio_4231.h92
-rw-r--r--usr/src/uts/sun/sys/audio/impl/audio1575_impl.h766
205 files changed, 95574 insertions, 57977 deletions
diff --git a/usr/src/Makefile.lint b/usr/src/Makefile.lint
index 7c3ce96683..c4adef0aea 100644
--- a/usr/src/Makefile.lint
+++ b/usr/src/Makefile.lint
@@ -35,6 +35,8 @@ COMMON_SUBDIRS = \
cmd/acctadm \
cmd/asa \
cmd/amt \
+ cmd/audio/audiotest \
+ cmd/audio/mixerctl \
cmd/audit \
cmd/auditconfig \
cmd/auditd \
diff --git a/usr/src/cmd/allocate/Makefile b/usr/src/cmd/allocate/Makefile
index cd572ed03e..5691423a21 100644
--- a/usr/src/cmd/allocate/Makefile
+++ b/usr/src/cmd/allocate/Makefile
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
ETCTSOLFILES = devalloc_defaults
@@ -33,13 +31,14 @@ include ../Makefile.cmd
ROOTSEC = $(ROOTETC)/security
ROOTSECDEV = $(ROOTSEC)/dev
ROOTSECLIB = $(ROOTSEC)/lib
-ROOTDIRS = $(ROOTSECDEV) $(ROOTSECLIB)
+ROOTSECAUD = $(ROOTSEC)/audio
+ROOTDIRS = $(ROOTSECDEV) $(ROOTSECLIB) $(ROOTSECAUD)
RTLCKS = audio fd0 sr0 st0 st1
CLEANfd = fd_clean
CLEANsr = sr_clean
CLEANst = st_clean
-CLEANaudio = audio_clean_wrapper
+CLEANaudio = audio_clean
CLEANdisk = disk_clean
CLEAN_SCRIPTS = $(CLEANfd) $(CLEANsr) $(CLEANst) $(CLEANaudio) $(CLEANdisk)
WDW_SCRIPTS = wdwmsg wdwwrapper
@@ -50,10 +49,9 @@ ALLSCRIPTS = allscripts.sh
PROGalloc = allocate
PROGmkdevalloc = mkdevalloc
PROGdminfo = dminfo
-PROGaudio = audio_clean
PROGaddalloc = add_allocatable
PROG = $(PROGalloc) $(PROGmkdevalloc) $(PROGdminfo) \
- $(PROGaudio) $(PROGaddalloc)
+ $(PROGaddalloc)
LINKPROGalloc = deallocate list_devices
LINKPROGmkdevalloc = mkdevmaps
@@ -72,7 +70,6 @@ ROOTWDWLINKS = $(WDW_LINKS:%=$(ROOTSECLIB)/%.windowing)
ROOTPROG = $(PROGallocate:%=$(ROOTUSRSBIN)/%) \
$(PROGmkdevalloc:%=$(ROOTUSRSBIN)/%) \
$(PROGdminfo:%=$(ROOTUSRSBIN)/%) \
- $(PROGaudio:%=$(ROOTSECLIB)/%) \
$(PROGaddaloc:%=$(ROOTUSRSBIN)/%)
ROOTLINKalloc = $(LINKPROGalloc:%=$(ROOTUSRSBIN)/%)
ROOTLINKmkdevalloc = $(LINKPROGmkdevalloc:%=$(ROOTUSRSBIN)/%)
@@ -82,13 +79,11 @@ ROOTLINKS = $(ROOTLINKalloc) $(ROOTLINKmkdevalloc) $(ROOTLINKaddalloc)
PROGallocOBJS = allocate.o allocate3.o
PROGmkdevallocOBJS = mkdevalloc.o
PROGdminfoOBJS = dminfo.o
-PROGaudioOBJS = audio_clean.o
PROGaddallocOBJS = add_allocatable.o
OBJS = $(PROGallocOBJS) \
$(PROGmkdevallocOBJS) \
$(PROGdminfoOBJS) \
- $(PROGaudioOBJS) \
$(PROGaddallocOBJS)
SRCS = $(OBJS:%.o=%.c)
@@ -109,7 +104,6 @@ lint := LDLIBS += -lbsm -lsec -lsecdb -ldevinfo -ltsol
$(PROGalloc) := LDLIBS += -lbsm -lsec -lsecdb -ldevinfo -ltsol
$(PROGmkdevalloc) := LDLIBS += -lbsm
$(PROGdminfo) := LDLIBS += -lbsm
-$(PROGaudio) := LDLIBS += -lbsm
$(PROGaddalloc) := LDLIBS += -lbsm -lsecdb -ltsol
CLOBBERFILES += $(SCRIPTS)
@@ -143,10 +137,6 @@ $(PROGdminfo) : $(PROGdminfoOBJS)
$(LINK.c) $(PROGdminfoOBJS) -o $@ $(LDLIBS)
$(POST_PROCESS)
-$(PROGaudio) : $(PROGaudioOBJS)
- $(LINK.c) $(PROGaudioOBJS) -o $@ $(LDLIBS)
- $(POST_PROCESS)
-
$(ROOTDIRS) :
$(INS.dir)
@@ -157,10 +147,6 @@ $(ROOTSECLIB)/%: %
$(RM) $@
$(INS.file)
-$(ROOTSECLIB)/audio_clean : audio_clean
- $(RM) $@
- $(INS.file) $(@F)
-
$(ROOTLINKalloc) : $(PROGalloc:%=$(ROOTUSRSBIN)/%)
$(RM) $@
$(LN) $(PROGalloc:%=$(ROOTUSRSBIN)/%) $@
diff --git a/usr/src/cmd/allocate/audio_clean.c b/usr/src/cmd/allocate/audio_clean.c
deleted file mode 100644
index 24753b8569..0000000000
--- a/usr/src/cmd/allocate/audio_clean.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * audio_clean - Clear any residual data that may be residing in the in the
- * audio device driver or chip.
- *
- * Usage: audio_clean [-Iisf] device_name
- *
- * Note: The same operation is performed for any of the "ifs" flags.
- * The "I" flag is a silent form of "i". Support for the flags
- * is provided so that the framework is place if added
- * functionality is required.
- *
- * Note: The AUDIO_SETINFO ioctl is used instead of the low level
- * AUDIOSETREG command which is used to perform low level
- * operations on the device. If a process had previously used
- * AUDIOSETREG to monkey with the device, then the driver would
- * have reset the chip when the process performed a close,
- * so this can just clear the info structure.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <stropts.h>
-#include <unistd.h>
-#include <bsm/devices.h>
-#include <sys/audioio.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#ifndef TEXT_DOMAIN
-#define TEXT_DOMAIN "SUNW_OST_OSCMD"
-#endif
-
-#ifdef DEBUG
-static void print_info(audio_info_t *);
-static void print_prinfo(audio_prinfo_t *);
-#endif /* DEBUG */
-
-static void
-usage(char *prog)
-{
- (void) fprintf(stderr, "%s%s", prog,
- gettext(" : usage:[-I|-s|-f|-i] device\n"));
-}
-
-int
-main(int argc, char **argv)
-{
- int err = 0;
- int Audio_fd;
- int forced = 0; /* Command line options */
- int initial = 0;
- int standard = 0;
- int verbose = 1; /* default is to be verbose */
- int c;
- char *prog, *devname, *devpath;
- devmap_t *dm;
- struct stat st;
- audio_info_t info;
-
- (void) setlocale(LC_ALL, "");
- (void) textdomain(TEXT_DOMAIN);
-
- prog = argv[0]; /* save program initiation name */
-
- /*
- * Parse arguments. Currently i, s and f all do the
- * the same thing.
- */
-
- while ((c = getopt(argc, argv, "Iifs")) != -1) {
- switch (c) {
- case 'I':
- verbose = 0;
- initial++;
- if (standard || forced)
- err++;
- break;
- case 'i':
- initial++;
- if (standard || forced)
- err++;
- break;
- case 's':
- standard++;
- if (initial || forced)
- err++;
- break;
- case 'f':
- forced++;
- if (initial || standard)
- err++;
- break;
- case '?':
- err++;
- break;
- default:
- err++;
- break;
- }
- if (err) {
- if (verbose)
- usage(prog);
- exit(1);
- }
- }
-
- if ((argc - optind) != 1) {
- if (verbose)
- usage(prog);
- exit(1);
- } else {
- devname = argv[optind];
- }
-
- setdmapent();
- if ((dm = getdmapnam(devname)) == NULL) {
- enddmapent();
- if (verbose)
- (void) fprintf(stderr, "%s%s",
- devname,
- gettext(" : No such allocatable device\n"));
- exit(1);
- }
- enddmapent();
- if (dm->dmap_devarray == NULL || dm->dmap_devarray[0] == NULL) {
- if (verbose)
- (void) fprintf(stderr, "%s%s",
- devname,
- gettext(" : No such allocatable device\n"));
- exit(1);
- }
- devpath = strdup(dm->dmap_devarray[0]);
- freedmapent(dm);
-
- /*
- * Validate and open the audio device
- */
- err = stat(devpath, &st);
-
- if (err < 0) {
- if (verbose) {
- (void) fprintf(stderr, gettext("%s: cannot stat "),
- prog);
- perror("audio_clean");
- }
- exit(1);
- }
- if (!S_ISCHR(st.st_mode)) {
- if (verbose)
- (void) fprintf(stderr,
- gettext("%s: %s is not an audio device\n"), prog,
- devpath);
- exit(1);
- }
-
- /*
- * Since the device /dev/audio can suspend if someone else is
- * using it we check to see if we're going to hang before we
- * do anything.
- */
- Audio_fd = open(devpath, O_WRONLY | O_NDELAY);
-
- if ((Audio_fd < 0) && (errno == EBUSY)) {
- if (verbose)
- (void) fprintf(stderr, gettext("%s: waiting for %s..."),
- prog, devpath);
- exit(0);
- } else if (Audio_fd < 0) {
- if (verbose) {
- (void) fprintf(stderr, gettext("%s: error opening "),
- prog);
- perror(devpath);
- }
- exit(1);
- }
-
-#ifdef DEBUG
- /*
- * Read the audio_info structure.
- */
-
- if (ioctl(Audio_fd, AUDIO_GETINFO, &info) != 0) {
- perror("Ioctl AUDIO_GETINFO error");
- (void) close(Audio_fd);
- exit(1);
- }
-
- print_info(&info);
-#endif /* DEBUG */
-
-/* LINTED */
- AUDIO_INITINFO(&info); /* clear audit info structure */
-
- if (ioctl(Audio_fd, AUDIO_SETINFO, &info) != 0) {
- if (verbose)
- perror(gettext("Ioctl AUDIO_SETINFO error"));
- (void) close(Audio_fd);
- exit(1);
- }
-
-#ifdef DEBUG
- if (ioctl(Audio_fd, AUDIO_GETINFO, &info) != 0) {
- perror("Ioctl AUDIO_GETINFO-2 error");
- (void) close(Audio_fd);
- exit(1);
- }
-
- print_info(&info);
-#endif /* DEBUG */
-
- return (0);
-}
-
-
-#ifdef DEBUG
-void
-print_info(audio_info_t *info)
-{
- print_prinfo(&info->play);
- print_prinfo(&info->record);
- (void) printf("monitor_gain %d\n", info->monitor_gain);
- (void) fflush(stdout);
-}
-
-
-void
-print_prinfo(audio_prinfo_t *prinfo)
-{
- /* The following values decribe audio data encoding: */
- (void) printf("sample_rate %d\n", prinfo->sample_rate);
- (void) printf("channels %d\n", prinfo->channels);
- (void) printf("precision %d\n", prinfo->precision);
- (void) printf("encoding %d\n", prinfo->encoding);
-
- /* The following values control audio device configuration */
- (void) printf("gain %d\n", prinfo->gain);
- (void) printf("port %d\n", prinfo->port);
- (void) printf("avail_ports %d\n", prinfo->avail_ports);
- (void) printf("mod_ports %d\n", prinfo->mod_ports);
-
- /* These are Reserved for future use, but we clear them */
- (void) printf("_xxx %d\n", prinfo->_xxx);
-
- (void) printf("buffer_size %d\n", prinfo->buffer_size);
-
- /* The following values describe driver state */
- (void) printf("samples %d\n", prinfo->samples);
- (void) printf("eof %d\n", prinfo->eof);
- (void) printf("pause %d\n", prinfo->pause);
- (void) printf("error %d\n", prinfo->error);
- (void) printf("waiting %d\n", prinfo->waiting);
- (void) printf("balance %d\n", prinfo->balance);
-
- /* The following values are read-only state flags */
- (void) printf("open %d\n", prinfo->open);
- (void) printf("active %d\n", prinfo->active);
-}
-#endif /* DEBUG */
diff --git a/usr/src/cmd/allocate/audio_clean_wrapper.sh b/usr/src/cmd/allocate/audio_clean.sh
index 2a7820c098..24ccea7fdb 100644
--- a/usr/src/cmd/allocate/audio_clean_wrapper.sh
+++ b/usr/src/cmd/allocate/audio_clean.sh
@@ -19,12 +19,10 @@
#
# CDDL HEADER END
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
-# This is a wrapper for the audio_clean program.
+# This is the audio_clean program.
#
# Following is the syntax for calling the script:
# scriptname [-s|-f|-i|-I] devicename [-A|-D] [username] [zonename]
@@ -56,16 +54,15 @@
# dialogs. To present dialogs to the user, the dtksh script
# /etc/security/lib/wdwmsg may be used.
#
-# This particular script, audio_clean_wrapper, will work using stdin/stdout, or
-# using dialogs. A symbolic link audio_clean_wrapper.windowing points to
-# audio_clean_wrapper.
+# This particular script, audio_clean, will work using stdin/stdout, or
+# using dialogs. A symbolic link audio_clean.windowing points to
+# audio_clean.
trap "" INT TERM QUIT TSTP ABRT
USAGE="usage: $0 [-s|-f|-i|-I] devicename [-A|-D][username][zonename][zonepath]"
PATH="/usr/bin:/usr/sbin"
-CLEAN_PROG="/etc/security/lib/audio_clean"
WDWMSG="/etc/security/lib/wdwmsg"
MODE="allocate"
@@ -92,22 +89,13 @@ msg() {
fi
}
-alloc_msg() {
- msg "Audio device allocated in zone $ZONENAME." \
- "\nTurn on microphone if audio recording is to be performed." \
- "\nTurn microphone off when not recording."
-}
-
-dealloc_msg() {
- msg "Please make sure the microphone is turned off."
-}
-
fail_msg() {
if [ "$MODE" = "allocate" ]; then
msg "$0: Allocate of $DEVICE failed."
else
msg "$0: Deallocate of $DEVICE failed."
fi
+ exit 1
}
#
@@ -147,18 +135,33 @@ if [ "$MODE" != "allocate" -a "$MODE" != "deallocate" ]; then
fi
ZONENAME=$4
ZONEPATH=$5
-
-$CLEAN_PROG -$FLAG $DEVICE
-
-if [ $? -ne 0 ]; then
- fail_msg
- exit 1
+SAVEDIR=/etc/security/audio
+MAP=`dminfo -v -n $AUDIO`
+DEVICE=`echo $MAP | cut -f1 -d:`
+TYPE=`echo $MAP | cut -f2 -d:`
+FILES=`echo $MAP | cut -f3 -d:`
+
+if [ ! -d ${SAVEDIR} ]
+then
+ /usr/bin/mkdir -m 0755 -p ${SAVEDIR} || fail_msg
+ /usr/bin/chown root:sys ${SAVEDIR} || fail_msg
fi
-if [ "$MODE" = "allocate" ]; then
- alloc_msg
+for d in $FILES
+do
+ x="`expr $d : '/dev/mixer[0-9][0-9]*'`"
+ if [ "$x" -ne 0 ] ; then
+ DEVNM=$d
+ break
+ fi
+done
+SAVEFILE="${SAVEDIR}/`basename ${DEVNM}`"
+
+if [ "${FLAG}" = "i" -a ! -r "${SAVEFILE}" ]
+then
+ /usr/sbin/mixerctl -d ${DEVNM} -f -s ${SAVEFILE} || fail_msg
else
- dealloc_msg
+ /usr/sbin/mixerctl -d ${DEVNM} -r ${SAVEFILE} || fail_msg
fi
exit 0
diff --git a/usr/src/cmd/allocate/devalloc_defaults b/usr/src/cmd/allocate/devalloc_defaults
index 56ef8ce53a..98cca2668d 100644
--- a/usr/src/cmd/allocate/devalloc_defaults
+++ b/usr/src/cmd/allocate/devalloc_defaults
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# Default device_allocation attributes for device types.
# Device types supported -
# audio, fd, sr, st, rmdisk
@@ -39,7 +37,7 @@
# e.g.: minlabel="TS A B";maxlabel="TS AB";auths=solaris.device.allocate;\
# cleanscript=/bin/true
#
-audio:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/audio_clean_wrapper
+audio:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/audio_clean
fd:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/disk_clean
sr:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/disk_clean
st:minlabel=admin_low;maxlabel=admin_high;auths=solaris.device.allocate;cleanscript=/etc/security/lib/tape_clean
diff --git a/usr/src/cmd/audio/Makefile b/usr/src/cmd/audio/Makefile
index 73a66ce21b..20fdea8d51 100644
--- a/usr/src/cmd/audio/Makefile
+++ b/usr/src/cmd/audio/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# cmd/audio/Makefile
#
@@ -32,6 +29,7 @@ include ../Makefile.cmd
SUBDIRS = \
mixerctl \
+ audiotest \
utilities .WAIT \
audioplay \
audiorecord \
diff --git a/usr/src/cmd/audio/audioplay/audioplay.c b/usr/src/cmd/audio/audioplay/audioplay.c
index c898626a80..882c4d9087 100644
--- a/usr/src/cmd/audio/audioplay/audioplay.c
+++ b/usr/src/cmd/audio/audioplay/audioplay.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,10 @@
* CDDL HEADER END
*/
/*
- * Copyright 1993-2003 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/* Command-line audio play utility */
#include <stdio.h>
@@ -64,15 +61,12 @@
/* Local variables */
static char *prog;
-static char prog_opts[] = "VEiv:b:d:p:?"; /* getopt() flags */
+static char prog_opts[] = "VEiv:d:?"; /* getopt() flags */
static char *Stdin;
#define MAX_GAIN (100) /* maximum gain */
-#define LEFT_BAL (-100) /* min/max balance */
-#define MID_BAL (0)
-#define RIGHT_BAL (100)
/*
* This defines the tolerable sample rate error as a ratio between the
* sample rates of the audio data and the audio device.
@@ -86,12 +80,7 @@ static char *Stdin;
static unsigned Volume = INT_MAX; /* output volume */
static double Savevol; /* saved volume level */
-static unsigned int Balance = INT_MAX; /* output balance */
-static unsigned int Savebal; /* saved output balance */
-static unsigned int Port = INT_MAX;
- /* output port (spkr, line, hp-jack) */
-static unsigned int Saveport = 0;
- /* save prev. val so we can restore */
+
static int Verbose = FALSE; /* verbose messages */
static int Immediate = FALSE;
/* don't hang waiting for device */
@@ -153,7 +142,6 @@ static void sigint(int sig);
static void open_audio(void);
static int path_open(char *fname, int flags, mode_t mode, char *path);
static int parse_unsigned(char *str, unsigned *dst, char *flag);
-static int scale_balance(int g);
static int reconfig(void);
static void initmux(int unitsz, int unitsp);
static void demux(int unitsz, int cnt);
@@ -165,21 +153,15 @@ static void
usage(void)
{
Error(stderr, MGET("Play an audio file -- usage:\n"
- "\t%s [-iV] [-v vol] [-b bal]\n"
- "\t%.*s [-p speaker|headphone|line|aux1|aux2|spdif]\n"
- "\t%.*s [-d dev] [file ...]\n"
+ "\t%s [-iV] [-v vol] [-d dev] [file ...]\n"
"where:\n"
"\t-i\tDon't hang if audio device is busy\n"
"\t-V\tPrint verbose warning messages\n"
"\t-v\tSet output volume (0 - %d)\n"
- "\t-b\tSet output balance (%d=left, %d=center, %d=right)\n"
- "\t-p\tSpecify output port\n"
"\t-d\tSpecify audio device (default: /dev/audio)\n"
"\tfile\tList of files to play\n"
"\t\tIf no files specified, read stdin\n"),
- prog, strlen(prog), " ",
- strlen(prog), " ",
- MAX_GAIN, LEFT_BAL, MID_BAL, RIGHT_BAL);
+ prog, MAX_GAIN);
exit(1);
}
@@ -193,10 +175,6 @@ sigint(int sig)
/* restore saved parameters */
if (Volume != INT_MAX)
(void) audio_set_play_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_play_balance(Audio_fd, &Savebal);
- if (Port != INT_MAX)
- (void) audio_set_play_port(Audio_fd, &Saveport);
if ((Audio_ctlfd >= 0) &&
(audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0)) {
(void) audio_set_play_config(Audio_fd, &Save_hdr);
@@ -263,29 +241,6 @@ open_audio(void)
exit(1);
}
}
-
- if (Balance != INT_MAX) {
- (void) audio_get_play_balance(Audio_fd, &Savebal);
- err = audio_set_play_balance(Audio_fd, &Balance);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set output balance for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -p flag, set the output port now */
- if (Port != INT_MAX) {
- (void) audio_get_play_port(Audio_fd, &Saveport);
- err = audio_set_play_port(Audio_fd, &Port);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set output port %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
}
/* Play a list of audio files. */
@@ -304,7 +259,6 @@ main(int argc, char **argv) {
int ifd;
int stdinseen;
int regular;
- int bal;
int swapBytes;
int frame;
char *outbuf;
@@ -342,16 +296,6 @@ main(int argc, char **argv) {
err++;
}
break;
- case 'b':
- bal = atoi(optarg);
- if ((bal > RIGHT_BAL) || (bal < LEFT_BAL)) {
- Error(stderr, MGET("%s: invalid value "
- "for -b\n"), prog);
- err++;
- } else {
- Balance = (unsigned)scale_balance(bal);
- }
- break;
case 'd':
Audio_dev = optarg;
break;
@@ -364,32 +308,6 @@ main(int argc, char **argv) {
case 'i':
Immediate = TRUE;
break;
- case 'p':
- /* a partial match is OK */
- if (strncmp(optarg, "speaker",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPEAKER;
- } else if (strncmp(optarg, "headphone",
- strlen(optarg)) == 0) {
- Port = AUDIO_HEADPHONE;
- } else if (strncmp(optarg, "line",
- strlen(optarg)) == 0) {
- Port = AUDIO_LINE_OUT;
- } else if (strncmp(optarg, "aux1",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX1_OUT;
- } else if (strncmp(optarg, "aux2",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX2_OUT;
- } else if (strncmp(optarg, "spdif",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPDIF_OUT;
- } else {
- Error(stderr, MGET("%s: invalid value "
- "for -p\n"), prog);
- err++;
- }
- break;
case '?':
usage();
/*NOTREACHED*/
@@ -416,13 +334,8 @@ main(int argc, char **argv) {
/* This should probably use audio_cntl instead of open_audio */
if ((argc <= 0) && isatty(fileno(stdin))) {
- if (Verbose) {
- Error(stderr,
- MGET("%s: No files - setting audio device parameters.\n"),
- prog);
- }
- open_audio();
- exit(0);
+ Error(stderr, MGET("%s: No files and stdin is a tty.\n"), prog);
+ exit(1);
}
/* Check on the -i status now. */
@@ -438,7 +351,7 @@ main(int argc, char **argv) {
Audio_fd = -1;
/* Try to open the control device and save the current format */
- (void) sprintf(ctldev, "%sctl", Audio_dev);
+ (void) snprintf(ctldev, sizeof (ctldev), "%sctl", Audio_dev);
Audio_ctlfd = open(ctldev, O_RDWR);
if (Audio_ctlfd >= 0) {
/*
@@ -521,7 +434,7 @@ main(int argc, char **argv) {
File_hdr.samples_per_unit = 1;
File_hdr.bytes_per_unit = 1;
adpcm_state = (struct audio_g72x_state *)malloc
- (sizeof (*adpcm_state) * File_hdr.channels);
+ (sizeof (*adpcm_state) * File_hdr.channels);
for (i = 0; i < File_hdr.channels; i++) {
g721_init_state(&adpcm_state[i]);
}
@@ -533,7 +446,7 @@ main(int argc, char **argv) {
File_hdr.samples_per_unit = 1;
File_hdr.bytes_per_unit = 1;
adpcm_state = (struct audio_g72x_state *)malloc
- (sizeof (*adpcm_state) * File_hdr.channels);
+ (sizeof (*adpcm_state) * File_hdr.channels);
for (i = 0; i < File_hdr.channels; i++) {
g723_init_state(&adpcm_state[i]);
}
@@ -911,10 +824,6 @@ nextfile:;
if (Volume != INT_MAX)
(void) audio_set_play_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_play_balance(Audio_fd, &Savebal);
- if (Port != INT_MAX)
- (void) audio_set_play_port(Audio_fd, &Saveport);
if ((Audio_ctlfd >= 0) && (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0)) {
(void) audio_set_play_config(Audio_fd, &Save_hdr);
}
@@ -958,7 +867,8 @@ reconfig(void)
if (ratio <= SAMPLE_RATE_THRESHOLD) {
if (Verbose) {
Error(stderr,
- MGET("%s: WARNING: %s sampled at %d, playing at %d\n"),
+ MGET("%s: WARNING: %s sampled at "
+ "%d, playing at %d\n"),
prog, Ifile, File_hdr.sample_rate,
Dev_hdr.sample_rate);
}
@@ -1067,7 +977,8 @@ path_open(char *fname, int flags, mode_t mode, char *path)
/* got a match! */
if (Verbose) {
Error(stderr,
- MGET("%s: Found %s in path at %s\n"),
+ MGET("%s: Found %s in path "
+ "at %s\n"),
prog, fname, fullpath);
}
return (open(fullpath, flags, mode));
@@ -1085,14 +996,6 @@ path_open(char *fname, int flags, mode_t mode, char *path)
}
-/* Convert local balance into device parameters */
-static int
-scale_balance(int g)
-{
- return (int)(((g + RIGHT_BAL) / (double)(RIGHT_BAL - LEFT_BAL)) *
- (double)AUDIO_RIGHT_BALANCE);
-}
-
/*
* initmux()
*
@@ -1119,47 +1022,41 @@ initmux(int unitsz, int unitsp)
out_ch_size = in_ch_size * unitsp / unitsz;
/* Allocate pointers to input channels */
- in_ch_data = (unsigned char **)malloc(sizeof (unsigned char *)
- * File_hdr.channels);
+ in_ch_data = malloc(sizeof (unsigned char *) * File_hdr.channels);
if (in_ch_data == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, sizeof (unsigned char *) *
- File_hdr.channels / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, sizeof (unsigned char *) * File_hdr.channels / 1000);
exit(1);
}
/* Allocate input channels */
for (c = 0; c < File_hdr.channels; c++) {
- in_ch_data[c] = (unsigned char *)malloc
- (sizeof (unsigned char) * in_ch_size);
+ in_ch_data[c] = malloc(sizeof (unsigned char) * in_ch_size);
if (in_ch_data[c] == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, in_ch_size / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, in_ch_size / 1000);
exit(1);
}
}
/* Allocate pointers to output channels */
- out_ch_data = (unsigned char **)malloc(sizeof (unsigned char *)
- * File_hdr.channels);
+ out_ch_data = malloc(sizeof (unsigned char *) * File_hdr.channels);
if (out_ch_data == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, sizeof (unsigned char *) *
- File_hdr.channels / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, sizeof (unsigned char *) * File_hdr.channels / 1000);
exit(1);
}
/* Allocate output channels */
for (c = 0; c < File_hdr.channels; c++) {
- out_ch_data[c] = (unsigned char *)malloc
- (sizeof (unsigned char) * out_ch_size);
+ out_ch_data[c] = malloc(sizeof (unsigned char) * out_ch_size);
if (out_ch_data[c] == NULL) {
- Error(stderr, MGET("%s: couldn't allocate %dK "
- "buf\n"), prog, out_ch_size / 1000);
+ Error(stderr, MGET("%s: couldn't allocate %dK buf\n"),
+ prog, out_ch_size / 1000);
exit(1);
}
}
diff --git a/usr/src/cmd/audio/audiorecord/audiorecord.c b/usr/src/cmd/audio/audiorecord/audiorecord.c
index dff332466a..d8b681d777 100644
--- a/usr/src/cmd/audio/audiorecord/audiorecord.c
+++ b/usr/src/cmd/audio/audiorecord/audiorecord.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,10 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/* Command-line audio record utility */
#include <stdio.h>
@@ -62,16 +59,11 @@
#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
#endif
-/* Defined until I get a copy of the apropriate audioio.h file. */
-#ifndef AUDIO_CD_IN
-#define AUDIO_CD_IN 0x04 /* input from the internal CD player */
-#endif
-
#define Error (void) fprintf
/* Local variables */
static char *prog;
-static char prog_opts[] = "aft:v:b:m:d:p:i:e:s:c:T:?"; /* getopt() flags */
+static char prog_opts[] = "aft:v:d:i:e:s:c:T:?"; /* getopt() flags */
static char *Stdout;
/* XXX - the input buffer size should depend on sample_rate */
@@ -82,20 +74,10 @@ static char swapBuf[AUDIO_BUFSIZ]; /* for byte swapping */
#define MAX_GAIN (100) /* maximum gain */
-#define LEFT_BAL (-100) /* min/max balance */
-#define MID_BAL (0)
-#define RIGHT_BAL (100)
-
static char *Info = NULL; /* pointer to info data */
static unsigned Ilen = 0; /* length of info data */
static unsigned Volume = INT_MAX; /* record volume */
static double Savevol; /* saved volume */
-static unsigned Monvol = INT_MAX; /* monitor volume */
-static double Savemonvol; /* saved monitor volume */
-static unsigned int Balance = INT_MAX; /* input balance */
-static unsigned int Savebal; /* saved input balance */
-static unsigned Port = INT_MAX; /* Input port (line, mic) */
-static unsigned Saveport = 0; /* restore value of input port */
static unsigned Sample_rate = 0;
static unsigned Channels = 0;
static unsigned Precision = 0; /* based on encoding */
@@ -130,7 +112,6 @@ extern char *optarg;
/* Local Functions */
static void usage(void);
static void sigint(int sig);
-static int scale_balance(int g);
static int parse_unsigned(char *str, unsigned *dst, char *flag);
static int parse_sample_rate(char *s, unsigned *rate);
@@ -139,17 +120,13 @@ static void
usage(void)
{
Error(stderr, MGET("Record an audio file -- usage:\n"
- "\t%s [-af] [-v vol] [-b bal] [-m monvol]\n"
- "\t%.*s [-p mic|line|cd|aux1|aux2|spdif]\n"
+ "\t%s [-af] [-v vol]\n"
"\t%.*s [-c channels] [-s rate] [-e encoding]\n"
"\t%.*s [-t time] [-i info] [-d dev] [-T au|wav|aif[f]] [file]\n"
"where:\n"
"\t-a\tAppend to output file\n"
"\t-f\tIgnore sample rate differences on append\n"
"\t-v\tSet record volume (0 - %d)\n"
- "\t-b\tSet record balance (%d=left, %d=center, %d=right)\n"
- "\t-m\tSet monitor volume (0 - %d)\n"
- "\t-p\tSpecify input port\n"
"\t-c\tSpecify number of channels to record\n"
"\t-s\tSpecify rate in samples per second\n"
"\t-e\tSpecify encoding (ulaw | alaw | [u]linear | linear8 )\n"
@@ -164,8 +141,7 @@ usage(void)
prog,
strlen(prog), " ",
strlen(prog), " ",
- strlen(prog), " ",
- MAX_GAIN, LEFT_BAL, MID_BAL, RIGHT_BAL, MAX_GAIN);
+ MAX_GAIN);
exit(1);
}
@@ -185,12 +161,6 @@ sigint(int sig)
if (Audio_fd >= 0) {
if (Volume != INT_MAX)
(void) audio_set_record_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_record_balance(Audio_fd, &Savebal);
- if (Monvol != INT_MAX)
- (void) audio_set_monitor_gain(Audio_fd, &Savemonvol);
- if (Port != INT_MAX)
- (void) audio_set_record_port(Audio_fd, &Saveport);
if (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0) {
(void) audio_set_record_config(Audio_fd, &Save_hdr);
}
@@ -211,11 +181,9 @@ main(int argc, char **argv)
int ofd;
int swapBytes = FALSE;
double vol;
- int bal;
struct stat st;
struct pollfd pfd;
char *cp;
- char ctldev[MAXPATHLEN];
(void) setlocale(LC_ALL, "");
(void) textdomain(TEXT_DOMAIN);
@@ -250,25 +218,6 @@ main(int argc, char **argv)
err++;
}
break;
- case 'b':
- bal = atoi(optarg);
- if ((bal > RIGHT_BAL) || (bal < LEFT_BAL)) {
- Error(stderr, MGET("%s: invalid value for "
- "-b\n"), prog);
- err++;
- } else {
- Balance = (unsigned)scale_balance(bal);
- }
- break;
- case 'm':
- if (parse_unsigned(optarg, &Monvol, "-m")) {
- err++;
- } else if (Monvol > MAX_GAIN) {
- Error(stderr, MGET("%s: invalid value for "
- "-m\n"), prog);
- err++;
- }
- break;
case 't':
Time = audio_str_to_secs(optarg);
if ((Time == HUGE_VAL) || (Time < 0.)) {
@@ -280,33 +229,6 @@ main(int argc, char **argv)
case 'd':
Audio_dev = optarg;
break;
- case 'p':
- /* a partial match is OK */
- if (strncmp(optarg, "microphone",
- strlen(optarg)) == 0) {
- Port = AUDIO_MICROPHONE;
- } else if (strncmp(optarg, "line",
- strlen(optarg)) == 0) {
- Port = AUDIO_LINE_IN;
- } else if ((strncmp(optarg, "cd",
- strlen(optarg)) == 0) || (strncmp(optarg,
- "internal-cd", strlen(optarg)) == 0)) {
- Port = AUDIO_CD_IN;
- } else if (strncmp(optarg, "aux1",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX1_IN;
- } else if (strncmp(optarg, "aux2",
- strlen(optarg)) == 0) {
- Port = AUDIO_AUX2_IN;
- } else if (strncmp(optarg, "spdif",
- strlen(optarg)) == 0) {
- Port = AUDIO_SPDIF_IN;
- } else {
- Error(stderr, MGET("%s: invalid value for "
- "-p\n"), prog);
- err++;
- }
- break;
case 'f':
Force = TRUE;
break;
@@ -703,44 +625,10 @@ openinput:
}
}
- if (Balance != INT_MAX) {
- (void) audio_get_record_balance(Audio_fd, &Savebal);
- err = audio_set_record_balance(Audio_fd, &Balance);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set record balance for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -m flag, set monitor volume now */
- if (Monvol != INT_MAX) {
- vol = (double)Monvol / (double)MAX_GAIN;
- (void) audio_get_monitor_gain(Audio_fd, &Savemonvol);
- err = audio_set_monitor_gain(Audio_fd, &vol);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set monitor volume for %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
- /* If -p flag, set the input port */
- if (Port != INT_MAX) {
- (void) audio_get_record_port(Audio_fd, &Saveport);
- err = audio_set_record_port(Audio_fd, &Port);
- if (err != AUDIO_SUCCESS) {
- Error(stderr,
- MGET("%s: could not set input port %s\n"),
- prog, Audio_dev);
- exit(1);
- }
- }
-
if (isatty(ofd)) {
- exit(0);
+ Error(stderr, MGET("%s: No files and stdout is a tty\n"),
+ prog);
+ exit(1);
}
/* Set up SIGINT handler so that final buffers may be flushed */
@@ -823,15 +711,9 @@ openinput:
Error(stderr, MGET("%s: WARNING: Data overflow occurred\n"),
prog);
- /* Reset record volume, balance, monitor volume, port, encoding */
+ /* Reset record volume, encoding */
if (Volume != INT_MAX)
(void) audio_set_record_gain(Audio_fd, &Savevol);
- if (Balance != INT_MAX)
- (void) audio_set_record_balance(Audio_fd, &Savebal);
- if (Monvol != INT_MAX)
- (void) audio_set_monitor_gain(Audio_fd, &Savemonvol);
- if (Port != INT_MAX)
- (void) audio_set_record_port(Audio_fd, &Saveport);
if (audio_cmp_hdr(&Save_hdr, &Dev_hdr) != 0) {
(void) audio_set_record_config(Audio_fd, &Save_hdr);
}
@@ -886,7 +768,8 @@ parse_sample_rate(char *s, unsigned *rate)
* XXX bug alert: could have multiple "." in string
* and mess things up.
*/
- for (cp = s; *cp && (isdigit(*cp) || (*cp == '.')); cp++);
+ for (cp = s; *cp && (isdigit(*cp) || (*cp == '.')); cp++)
+ /* NOP */;
if (*cp != NULL) {
if ((*cp == 'k') || (*cp == 'K')) {
drate *= 1000.0;
@@ -903,11 +786,3 @@ parse_sample_rate(char *s, unsigned *rate)
*rate = irint(drate);
return (0);
}
-
-/* Convert local balance into device parameters */
-static int
-scale_balance(int g)
-{
- return (int)(((g + RIGHT_BAL) / (double)(RIGHT_BAL - LEFT_BAL)) *
- (double)AUDIO_RIGHT_BALANCE);
-}
diff --git a/usr/src/cmd/audio/audiotest/Makefile b/usr/src/cmd/audio/audiotest/Makefile
new file mode 100644
index 0000000000..ad3033716c
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/Makefile
@@ -0,0 +1,50 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Makefile for cmd/audio/audiotest
+
+PROG= audiotest
+OBJS= audiotest.o wavedata.o
+SRCS= $(OBJS:%.o=%.c)
+
+include ../../Makefile.cmd
+
+CFLAGS += $(CCVERBOSE)
+XGETFLAGS += -a -x audiotest.xcl
+
+.KEEP_STATE:
+
+all: $(PROG)
+
+$(PROG): $(OBJS)
+ $(LINK.c) $(OBJS) -o $@
+ $(POST_PROCESS)
+
+install: all $(ROOTPROG)
+
+clean:
+
+lint: lint_SRCS
+
+include ../../Makefile.targ
diff --git a/usr/src/cmd/audio/audiotest/audiotest.c b/usr/src/cmd/audio/audiotest/audiotest.c
new file mode 100644
index 0000000000..c995ea16e9
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/audiotest.c
@@ -0,0 +1,575 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * This program is a general purpose test facility for audio output.
+ * It does not test record.
+ *
+ * The wavedata.c and wavedata.h files contain the actual samples compressed
+ * using the MS ADPCM algorithm.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+#include <sys/soundcard.h>
+#include <inttypes.h>
+#include <locale.h>
+
+#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
+#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
+#endif
+
+#define _(s) gettext(s)
+
+/*
+ * Channel selectors
+ */
+#define CH_LEFT (1 << 0)
+#define CH_RIGHT (1 << 1)
+#define CH_LREAR4 (1 << 2) /* quadraphonic */
+#define CH_RREAR4 (1 << 3) /* quadraphonic */
+#define CH_CENTER (1 << 2)
+#define CH_LFE (1 << 3)
+#define CH_LSURR (1 << 4)
+#define CH_RSURR (1 << 5)
+#define CH_LREAR (1 << 6)
+#define CH_RREAR (1 << 7)
+#define CH_STEREO (CH_LEFT|CH_RIGHT)
+#define CH_4 (CH_STEREO | CH_LREAR4 | CH_RREAR4)
+#define CH_5 (CH_STEREO | CH_CENTER | CH_LSURR | CH_RSURR)
+#define CH_7 (CH_5 | CH_LREAR | CH_RREAR)
+
+typedef struct chancfg {
+ int mask;
+ const char *name;
+ unsigned flags;
+ int16_t *data;
+ int len;
+} chancfg_t;
+
+typedef struct testcfg {
+ int nchan;
+ chancfg_t *tests[16];
+} testcfg_t;
+
+#define CFLAG_LFE 0x1 /* lfe channel - not full range */
+
+/*
+ * TRANSLATION_NOTE : The following strings are displayed during progress.
+ * Its important for alignment that they have the same displayed length.
+ */
+#define NM_LEFT "\t<left> ................"
+#define NM_RIGHT "\t<right> ..............."
+#define NM_LREAR "\t<left rear> ..........."
+#define NM_RREAR "\t<right rear> .........."
+#define NM_LSIDE "\t<left side> ..........."
+#define NM_RSIDE "\t<right side> .........."
+#define NM_CENTER "\t<center> .............."
+#define NM_LFE "\t<lfe> ................."
+#define NM_STEREO "\t<stereo> .............."
+#define NM_40 "\t<4.0 surround> ........"
+#define NM_50 "\t<5.0 surround> ........"
+#define NM_70 "\t<7.0 surround> ........"
+
+chancfg_t ch_left = { CH_LEFT, NM_LEFT, 0 };
+chancfg_t ch_right = { CH_RIGHT, NM_RIGHT, 0 };
+chancfg_t ch_stereo = { CH_STEREO, NM_STEREO, 0 };
+
+chancfg_t ch_center = { CH_CENTER, NM_CENTER, 0 };
+chancfg_t ch_lfe = { CH_LFE, NM_LFE, CFLAG_LFE };
+
+chancfg_t ch_lsurr_4 = { (1 << 2), NM_LREAR, 0 };
+chancfg_t ch_rsurr_4 = { (1 << 3), NM_RREAR, 0 };
+chancfg_t ch_4 = { CH_4, NM_40, 0 };
+
+chancfg_t ch_lsurr_5 = { CH_LSURR, NM_LREAR, 0 };
+chancfg_t ch_rsurr_5 = { CH_RSURR, NM_RREAR, 0 };
+chancfg_t ch_5 = { CH_5, NM_50, 0 };
+
+chancfg_t ch_lsurr_7 = { CH_LSURR, NM_LSIDE, 0 };
+chancfg_t ch_rsurr_7 = { CH_RSURR, NM_RSIDE, 0 };
+chancfg_t ch_lrear_7 = { CH_LREAR, NM_LREAR, 0 };
+chancfg_t ch_rrear_7 = { CH_RREAR, NM_RREAR, 0 };
+chancfg_t ch_7 = { CH_7, NM_70, 0 };
+
+testcfg_t test_stereo = {
+ 2, { &ch_left, &ch_right, &ch_stereo, NULL }
+};
+
+testcfg_t test_quad = {
+ 4, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_4, &ch_rsurr_4, &ch_4, NULL }
+};
+
+testcfg_t test_51 = {
+ 6, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_5, &ch_rsurr_5, &ch_center, &ch_lfe, &ch_5, NULL }
+};
+
+testcfg_t test_71 = {
+ 8, { &ch_left, &ch_right, &ch_stereo,
+ &ch_lsurr_7, &ch_rsurr_7, &ch_lrear_7, &ch_rrear_7,
+ &ch_center, &ch_lfe, &ch_7, NULL }
+};
+
+/*
+ * uncompress_wave() is defined in wavedata.c. It expands the audio
+ * samples stored in wavedata.h and returns the lenghth of the
+ * uncompressed version in bytes.
+ *
+ * The uncompressed wave data format is 16 bit (native) stereo
+ * recorded at 48000 Hz.
+ */
+extern int uncompress_wave(short *outbuf);
+
+static int data_len;
+
+#define MAXDEVICE 64
+extern void describe_error(int);
+
+#define SAMPLE_RATE 48000
+
+/*
+ * Operating mode flags (set from the command line).
+ */
+#define TF_LOOP 0x00000010 /* Loop until interrupted */
+
+static int mixerfd;
+static int num_devices_tested = 0;
+
+static short *sample_buf;
+
+void
+prepare(testcfg_t *tcfg)
+{
+ int nsamples;
+ int i;
+ chancfg_t *ccfg;
+ if ((sample_buf = malloc(2000000)) == NULL) {
+ perror("malloc");
+ exit(-1);
+ }
+
+ data_len = uncompress_wave(sample_buf);
+ nsamples = (data_len / sizeof (int16_t)) / 2;
+
+ for (i = 0; (ccfg = tcfg->tests[i]) != NULL; i++) {
+ int16_t *src, *dst;
+ int ch;
+ int samp;
+
+ src = sample_buf;
+
+ if (ccfg->flags != CFLAG_LFE) {
+ ccfg->len = nsamples * tcfg->nchan * sizeof (int16_t);
+ ccfg->data = malloc(ccfg->len);
+ if ((dst = ccfg->data) == NULL) {
+ perror("malloc");
+ exit(-1);
+ }
+ for (samp = 0; samp < nsamples; samp++) {
+ for (ch = 0; ch < tcfg->nchan; ch++) {
+ *dst = ((1U << ch) & ccfg->mask) ?
+ *src : 0;
+ dst++;
+ }
+ src += 2;
+ }
+ } else {
+ /* Skip LFE for now */
+ ccfg->len = 0;
+ }
+ }
+}
+
+/*
+ * The testdsp() routine checks the capabilities of a given audio device number
+ * (parameter n) and decides if the test sound needs to be played.
+ */
+
+/*ARGSUSED*/
+int
+testdsp(int hd, int flags, testcfg_t *tcfg)
+{
+ float ratio;
+ struct timeval t1, t2;
+ unsigned long t;
+ int sample_rate;
+ int delay;
+ long long total_bytes = 0;
+ unsigned int tmp, caps;
+ int i;
+ chancfg_t *ccfg;
+
+ caps = 0;
+ if (ioctl(hd, SNDCTL_DSP_GETCAPS, &caps) == -1) {
+ perror("SNDCTL_DSP_GETCAPS");
+ return (-1);
+ }
+
+ /*
+ * Setup the sample format. Since OSS will support AFMT_S16_NE
+ * regardless of the device we do not need to support any
+ * other formats.
+ */
+
+ tmp = AFMT_S16_NE;
+ if (ioctl(hd, SNDCTL_DSP_SETFMT, &tmp) == -1 || tmp != AFMT_S16_NE) {
+ (void) printf(_("Device doesn't support native 16-bit PCM\n"));
+ return (-1);
+ }
+
+ /*
+ * Setup the device for channels. Once again we can simply
+ * assume that stereo will always work before OSS takes care
+ * of this by emulation if necessary.
+ */
+ tmp = tcfg->nchan;
+ if (ioctl(hd, SNDCTL_DSP_CHANNELS, &tmp) == -1 || tmp != tcfg->nchan) {
+ (void) printf(_("The device doesn't support %d channels\n"),
+ tcfg->nchan);
+ return (-2);
+ }
+
+ /*
+ * Set up the sample rate.
+ */
+
+ tmp = SAMPLE_RATE;
+ if (ioctl(hd, SNDCTL_DSP_SPEED, &tmp) == -1) {
+ perror("SNDCTL_DSP_SPEED");
+ return (-3);
+ }
+
+ sample_rate = tmp;
+ if (sample_rate != SAMPLE_RATE) {
+ (void) printf(_("The device doesn't support %d Hz\n"),
+ SAMPLE_RATE);
+ return (-3);
+ }
+ (void) printf("\n");
+
+ /*
+ * This program will measure the real sampling rate by
+ * computing the total time required to play the sample.
+ *
+ * This is not terribly presice with short test sounds but it
+ * can be used to detect if the sampling rate badly
+ * wrong. Errors of few percents is more likely to be caused
+ * by poor accuracy of the system clock rather than problems
+ * with the sampling rate.
+ */
+ (void) gettimeofday(&t1, NULL);
+
+ for (i = 0; (ccfg = tcfg->tests[i]) != NULL; i++) {
+ (void) fputs(_(ccfg->name), stdout);
+ (void) fflush(stdout);
+ if (ccfg->flags & CFLAG_LFE) {
+ (void) printf(_("SKIPPED\n"));
+ continue;
+ }
+
+ if (write(hd, ccfg->data, ccfg->len) < 0) {
+ (void) printf(_("ERROR: %s\n"),
+ strerror(errno));
+ return (-3);
+ }
+ (void) printf(_("OK\n"));
+ total_bytes += ccfg->len;
+ }
+
+ (void) gettimeofday(&t2, NULL);
+ delay = 0;
+ (void) ioctl(hd, SNDCTL_DSP_GETODELAY, &delay); /* Ignore errors */
+
+ /*
+ * Perform the time computations using milliseconds.
+ */
+
+ t = t2.tv_sec - t1.tv_sec;
+ t *= 1000;
+
+ t += t2.tv_usec / 1000;
+ t -= t1.tv_usec / 1000;
+
+ total_bytes -= delay;
+ total_bytes *= 1000;
+
+ total_bytes /= t;
+ total_bytes /= (tcfg->nchan * sizeof (int16_t));
+
+ ratio = ((float)total_bytes / (float)sample_rate) * 100.0;
+ (void) printf(_("\t<measured sample rate %8.2f Hz (%4.2f%%)>\n"),
+ (float)sample_rate * ratio / 100.0, ratio - 100.0);
+ num_devices_tested++;
+
+ return (1);
+}
+
+static int
+find_num_devices(void)
+{
+ oss_sysinfo info;
+ struct utsname un;
+ /*
+ * Find out the number of available audio devices by calling
+ * SNDCTL_SYSINFO.
+ */
+
+ if (ioctl(mixerfd, SNDCTL_SYSINFO, &info) == -1) {
+ if (errno == ENXIO) {
+ (void) fprintf(stderr,
+ _("No supported sound hardware detected.\n"));
+ exit(-1);
+ } else {
+ perror("SNDCTL_SYSINFO");
+ (void) printf(_("Cannot get system information.\n"));
+ exit(-1);
+ }
+ }
+ (void) printf(_("Sound subsystem and version: %s %s (0x%08X)\n"),
+ info.product, info.version, info.versionnum);
+
+ if (uname(&un) != -1)
+ (void) printf(_("Platform: %s %s %s %s\n"),
+ un.sysname, un.release, un.version, un.machine);
+
+ return (info.numaudios);
+}
+
+/*
+ * The test_device() routine checks certain information about the device
+ * and calls testdsp() to play the test sound.
+ */
+
+int
+test_device(char *dn, int flags, testcfg_t *tcfg)
+{
+ oss_audioinfo ainfo;
+ int code;
+ int fd;
+
+ fd = open(dn, O_WRONLY, 0);
+ if (fd == -1) {
+ int err = errno;
+ perror(dn);
+ errno = err;
+ describe_error(errno);
+ return (0);
+ }
+
+ ainfo.dev = -1;
+ if (ioctl(fd, SNDCTL_AUDIOINFO, &ainfo) == -1) {
+ perror("SNDCTL_AUDIOINFO");
+ (void) close(fd);
+ return (1);
+ }
+
+ (void) printf(_("\n*** Scanning sound adapter #%d ***\n"),
+ ainfo.card_number);
+
+ (void) printf(_("%s (audio engine %d): %s\n"), ainfo.devnode, ainfo.dev,
+ ainfo.name);
+
+ if (!ainfo.enabled) {
+ (void) printf(_(" - Device not present - Skipping\n"));
+ (void) close(fd);
+ return (1);
+ }
+
+ if (!(ainfo.caps & PCM_CAP_OUTPUT)) {
+ (void) printf(_(" - Skipping input only device\n"));
+ (void) close(fd);
+ return (1);
+ }
+
+ (void) printf(_(" - Performing audio playback test... "));
+ (void) fflush(stdout);
+
+ code = testdsp(fd, flags, tcfg);
+ (void) close(fd);
+
+ return (code == 1);
+}
+
+void
+describe_error(int err)
+{
+ switch (err) {
+ case ENODEV:
+ (void) fprintf(stderr,
+ _("The device file was found in /dev but\n"
+ "the driver was not loaded.\n"));
+ break;
+
+ case ENXIO:
+ (void) fprintf(stderr,
+ _("There are no sound devices available.\n"
+ "The most likely reason is that the device you have\n"
+ "is malfunctioning or it's not supported.\n"
+ "It's also possible that you are trying to use the wrong "
+ "device file.\n"));
+ break;
+
+ case ENOSPC:
+ (void) fprintf(stderr,
+ _("Your system cannot allocate memory for the device\n"
+ "buffers. Reboot your machine and try again.\n"));
+ break;
+
+ case ENOENT:
+ (void) fprintf(stderr,
+ _("The device file is missing from /dev.\n"));
+ break;
+
+
+ case EBUSY:
+ (void) fprintf(stderr,
+ _("The device is busy. There is some other application\n"
+ "using it.\n"));
+ break;
+
+ default:
+ break;
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int t, i;
+ int maxdev;
+ int flags = 0;
+ int status = 0;
+ int numdev;
+ extern int optind;
+ testcfg_t *tcfg;
+
+ (void) setlocale(LC_ALL, "");
+ (void) textdomain(TEXT_DOMAIN);
+
+ tcfg = &test_stereo;
+
+ /*
+ * Simple command line switch handling.
+ */
+
+ while ((i = getopt(argc, argv, "l2457")) != EOF) {
+ switch (i) {
+ case 'l':
+ flags |= TF_LOOP;
+ break;
+ case '2':
+ tcfg = &test_stereo;
+ break;
+ case '4':
+ tcfg = &test_quad;
+ break;
+ case '5':
+ tcfg = &test_51;
+ break;
+ case '7':
+ tcfg = &test_71;
+ break;
+ default:
+ (void) printf(_("Usage: %s [options...] [device]\n"
+ " -2 Stereo test\n"
+ " -4 Quadraphonic 4.0 test\n"
+ " -5 Surround 5.1 test\n"
+ " -7 Surround 7.1 test\n"
+ " -l Loop test\n"), argv[0]);
+ exit(-1);
+ }
+ }
+
+ /*
+ * Open the mixer device used for calling SNDCTL_SYSINFO and
+ * SNDCTL_AUDIOINFO.
+ */
+ if ((mixerfd = open("/dev/mixer", O_RDWR, 0)) == -1) {
+ int err = errno;
+ perror("/dev/mixer");
+ errno = err;
+ describe_error(errno);
+ exit(-1);
+ }
+
+ prepare(tcfg); /* Prepare the wave data */
+
+ /*
+ * Enumerate all devices and play the test sounds.
+ */
+ maxdev = find_num_devices();
+ if (maxdev < 1) {
+ (void) printf(_("\n*** No audio hardware available ***\n"));
+ exit(-1);
+ }
+
+ numdev = (argc - optind);
+ do {
+ char *dn;
+ oss_audioinfo ainfo;
+
+ if (numdev > 0) {
+ for (t = 0; t < numdev; t++) {
+ dn = argv[optind + t];
+ if (!test_device(dn, flags, tcfg))
+ status++;
+ }
+ } else {
+ for (t = 0; t < maxdev; t++) {
+ ainfo.dev = t;
+ if (ioctl(mixerfd, SNDCTL_AUDIOINFO,
+ &ainfo) == -1) {
+ perror("SNDCTL_AUDIOINFO");
+ status++;
+ continue;
+ }
+ dn = ainfo.devnode;
+ if (!test_device(dn, flags, tcfg))
+ status++;
+ }
+ }
+
+ if (status == 0)
+ (void) printf(_("\n*** All tests completed OK ***\n"));
+ else
+ (void) printf(_("\n*** Errors were detected ***\n"));
+
+ } while (flags & TF_LOOP);
+
+ (void) close(mixerfd);
+
+ return (status);
+}
diff --git a/usr/src/cmd/mdb/sparc/v9/audiosup/Makefile b/usr/src/cmd/audio/audiotest/audiotest.xcl
index 33e20a4a01..42057d7af3 100644
--- a/usr/src/cmd/mdb/sparc/v9/audiosup/Makefile
+++ b/usr/src/cmd/audio/audiotest/audiotest.xcl
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -19,18 +18,31 @@
#
# CDDL HEADER END
#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-
-MODULE = audiosup.so
-MDBTGT = kvm
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../../../Makefile.cmd.64
-include ../../Makefile.sparcv9
-include ../../../Makefile.module
+#
+# separating newline
+#
+msgid "\n"
+#
+# getopt switches
+#
+msgid "l2457"
+#
+# file name
+#
+msgid "/dev/mixer"
+#
+# ioctls and system calls used with perror
+#
+msgid "malloc"
+msgid "SNDCTL_DSP_GETCAPS"
+msgid "SNDCTL_DSP_SPEED"
+msgid "SNDCTL_SYSINFO"
+msgid "SNDCTL_AUDIOINFO"
+#
+# argument to setlocale
+#
+msgid ""
diff --git a/usr/src/cmd/audio/audiotest/wavedata.c b/usr/src/cmd/audio/audiotest/wavedata.c
new file mode 100644
index 0000000000..94a05f51ea
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/wavedata.c
@@ -0,0 +1,194 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Test sounds for osstest
+ *
+ * Nodoc:
+ */
+
+#include <string.h>
+
+#include "wavedata.h"
+
+static int
+le_int(const unsigned char *p, int l)
+{
+ int i, val;
+
+ val = 0;
+
+ for (i = l - 1; i >= 0; i--) {
+ val = (val << 8) | p[i];
+ }
+
+ return (val);
+}
+
+int
+uncompress_wave(short *outbuf)
+{
+#define WAVE_FORMAT_ADPCM 0x0002
+
+ int i, n, dataleft, x, l = sizeof (inbuf);
+ const unsigned char *hdr = inbuf;
+ typedef struct {
+ int coeff1, coeff2;
+ }
+ adpcm_coeff;
+
+ adpcm_coeff coeff[32];
+ static int AdaptionTable[] = { 230, 230, 230, 230, 307, 409, 512, 614,
+ 768, 614, 512, 409, 307, 230, 230, 230
+ };
+
+ unsigned char buf[4096];
+
+ int channels = 1;
+ int p = 12, outp = 0;
+ int nBlockAlign = 2048;
+ int wSamplesPerBlock = 2036, wNumCoeff = 7;
+ int nib;
+ int ppp;
+
+ /* filelen = le_int(&hdr[4], 4); */
+
+ while (p < l - 16 && memcmp(&hdr[p], "data", 4) != 0) {
+ n = le_int(&hdr[p + 4], 4);
+
+ if (memcmp(&hdr[p], "fmt ", 4) == 0) {
+
+ /* fmt = le_int(&hdr[p + 8], 2); */
+ channels = le_int(&hdr[p + 10], 2);
+ /* speed = le_int(&hdr[p + 12], 4); */
+ nBlockAlign = le_int(&hdr[p + 20], 2);
+ /* bytes_per_sample = le_int(&hdr[p + 20], 2); */
+
+ wSamplesPerBlock = le_int(&hdr[p + 26], 2);
+ wNumCoeff = le_int(&hdr[p + 28], 2);
+
+ x = p + 30;
+
+ for (i = 0; i < wNumCoeff; i++) {
+ coeff[i].coeff1 = (short)le_int(&hdr[x], 2);
+ x += 2;
+ coeff[i].coeff2 = (short)le_int(&hdr[x], 2);
+ x += 2;
+ }
+ }
+
+ p += n + 8;
+ }
+
+ if (p < l - 16 && memcmp(&hdr[p], "data", 4) == 0) {
+
+ dataleft = n = le_int(&hdr[p + 4], 4);
+ p += 8;
+
+/*
+ * Playback procedure
+ */
+#define OUT_SAMPLE(s) { \
+ if (s > 32767) \
+ s = 32767; \
+ else if (s < -32768) \
+ s = -32768; \
+ outbuf[outp++] = s; \
+ n += 2; \
+ }
+
+#define GETNIBBLE \
+ ((nib == 0) ? \
+ (buf[x + nib++] >> 4) & 0x0f : buf[x++ + --nib] & 0x0f)
+
+ outp = 0;
+
+ ppp = p;
+ while (dataleft > nBlockAlign) {
+ int predictor[2], delta[2], samp1[2], samp2[2];
+
+ int x = 0;
+
+ (void) memcpy(buf, &inbuf[ppp], nBlockAlign);
+ ppp += nBlockAlign;
+ dataleft -= nBlockAlign;
+
+ nib = 0;
+ n = 0;
+
+ for (i = 0; i < channels; i++) {
+ predictor[i] = buf[x];
+ x++;
+ }
+
+ for (i = 0; i < channels; i++) {
+ delta[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ }
+
+ for (i = 0; i < channels; i++) {
+ samp1[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ OUT_SAMPLE(samp1[i]);
+ }
+
+ for (i = 0; i < channels; i++) {
+ samp2[i] = (short)le_int(&buf[x], 2);
+ x += 2;
+ OUT_SAMPLE(samp2[i]);
+ }
+
+ while (n < (wSamplesPerBlock * 2 * channels))
+ for (i = 0; i < channels; i++) {
+ int pred, new, error_delta, i_delta;
+
+ pred = ((samp1[i] *
+ coeff[predictor[i]].coeff1)
+ + (samp2[i] *
+ coeff[predictor[i]].coeff2)) / 256;
+ i_delta = error_delta = GETNIBBLE;
+
+ /* Convert to signed */
+ if (i_delta & 0x08)
+ i_delta -= 0x10;
+
+ new = pred + (delta[i] * i_delta);
+ OUT_SAMPLE(new);
+
+ delta[i] = delta[i] *
+ AdaptionTable[error_delta] / 256;
+ if (delta[i] < 16)
+ delta[i] = 16;
+
+ samp2[i] = samp1[i];
+ samp1[i] = new;
+ }
+ }
+
+ }
+
+ return (outp * 2);
+}
diff --git a/usr/src/cmd/audio/audiotest/wavedata.h b/usr/src/cmd/audio/audiotest/wavedata.h
new file mode 100644
index 0000000000..5e98da8b70
--- /dev/null
+++ b/usr/src/cmd/audio/audiotest/wavedata.h
@@ -0,0 +1,42792 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef WAVEDATA_H
+#define WAVEDATA_H
+
+static const unsigned char inbuf[] = {
+ 0x52, 0x49, 0x46, 0x46, 0x26, 0x38, 0x05, 0x00, 0x57, 0x41, 0x56, 0x45,
+ 0x66, 0x6d, 0x74, 0x20,
+ 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x80, 0xbb, 0x00, 0x00,
+ 0x9b, 0xbc, 0x00, 0x00,
+ 0x00, 0x08, 0x04, 0x00, 0x20, 0x00, 0xf4, 0x07, 0x07, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xcc, 0x01,
+ 0x30, 0xff, 0x88, 0x01, 0x18, 0xff, 0x66, 0x61, 0x63, 0x74, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x30,
+ 0x05, 0x00, 0x64, 0x61, 0x74, 0x61, 0xd4, 0x37, 0x05, 0x00, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0xf0,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x0f, 0x10, 0xf0, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x1f, 0x01, 0xf0,
+ 0x0f, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xe0, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x10, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x20, 0x00, 0xf0, 0x0f,
+ 0x00, 0x20, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x11, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x20, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x20, 0x00, 0xf0, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x20,
+ 0xf0, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x10, 0x20,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x01, 0x01, 0x0f, 0xf0, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0xe0, 0x10, 0x21, 0xf0, 0xef, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x01, 0x0f, 0x1f,
+ 0x00, 0xf2, 0x00, 0x1e, 0x10, 0x01, 0x00, 0x0f, 0x0f, 0x10, 0x01, 0x00,
+ 0x0f, 0x0f, 0xf0, 0x00,
+ 0x11, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x10, 0x0f,
+ 0x00, 0x00, 0x02, 0x10, 0x0e, 0x00, 0x10, 0xf0, 0x00, 0x10, 0x20, 0xf0,
+ 0x0f, 0xff, 0x10, 0x10,
+ 0x10, 0x0f, 0x0f, 0x0f, 0x00, 0x01, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x0f,
+ 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x21, 0x00,
+ 0xf1, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xef, 0x00,
+ 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xe0,
+ 0xf0, 0x10, 0x0f, 0x00,
+ 0xf1, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x21, 0xf0, 0xf0, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0xf1, 0x1f,
+ 0x30, 0x00, 0xe0, 0x1f,
+ 0x10, 0x20, 0x02, 0x0f, 0x1f, 0x00, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0xe0, 0x01, 0x00, 0x10, 0x0f, 0xf1, 0xf1, 0x00, 0x0f, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0xf1, 0x00, 0x00, 0x2e, 0xe0,
+ 0xe1, 0x0f, 0x0e, 0x12,
+ 0x01, 0xf0, 0xfe, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x01,
+ 0x10, 0x0f, 0x00, 0xf0,
+ 0xf1, 0x00, 0x00, 0x1f, 0x01, 0x01, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x11,
+ 0x01, 0x0f, 0x0f, 0x11,
+ 0x00, 0x00, 0x0f, 0x20, 0xf1, 0xf0, 0x0e, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0xfe, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x10, 0x0e, 0xf0, 0x02, 0x11, 0x0f, 0x00,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x10, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x02, 0x10, 0x1d,
+ 0xf0, 0xf1, 0x02, 0x0f,
+ 0x2f, 0x00, 0xe0, 0x00, 0x10, 0x10, 0xf1, 0x0f, 0x0f, 0x20, 0xf0, 0xf0,
+ 0x10, 0x20, 0x0f, 0x00,
+ 0x01, 0x10, 0x20, 0x00, 0x00, 0x11, 0x10, 0x1f, 0x00, 0x01, 0x00, 0x00,
+ 0x21, 0x0f, 0xff, 0x00,
+ 0x11, 0x12, 0x0f, 0xff, 0xf0, 0x00, 0x21, 0x0e, 0xf0, 0xf0, 0x10, 0x0f,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x0e, 0x00, 0x10, 0x00, 0x0f, 0x0f, 0xff, 0x01, 0x10, 0x1f, 0x0f, 0xf0,
+ 0x00, 0x00, 0x2f, 0x00,
+ 0xf0, 0xf0, 0x0f, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x01, 0x01, 0x00, 0x0e,
+ 0xf0, 0x01, 0x11, 0x00,
+ 0xff, 0x00, 0x01, 0x01, 0x00, 0x00, 0xf0, 0x00, 0xf2, 0xf0, 0x00, 0x0f,
+ 0x02, 0xf1, 0xd1, 0x00,
+ 0x00, 0x01, 0x0f, 0xe0, 0xf1, 0xf1, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x02, 0xf0, 0x0d, 0x00,
+ 0x01, 0x12, 0x00, 0xff, 0x00, 0x00, 0x11, 0x22, 0x00, 0x0e, 0xf1, 0x02,
+ 0x31, 0x00, 0xf0, 0x10,
+ 0x00, 0x01, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x01,
+ 0x10, 0x10, 0x0f, 0xf0,
+ 0x00, 0x02, 0x20, 0x00, 0x0f, 0x0e, 0x00, 0xf0, 0x12, 0x20, 0x0f, 0x0f,
+ 0xf0, 0x00, 0x11, 0x21,
+ 0x1f, 0x00, 0xf0, 0x00, 0x10, 0x2f, 0x00, 0xf2, 0x0f, 0x1f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0xe1, 0xf0, 0x0f, 0x41, 0x01, 0xd0, 0x00, 0x01, 0x31,
+ 0xf0, 0xf0, 0xff, 0x00,
+ 0xf2, 0x10, 0x0f, 0x00, 0xff, 0xef, 0x01, 0x22, 0x01, 0xfe, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0xf1,
+ 0x00, 0x1e, 0x00, 0xf0, 0xf1, 0x0f, 0x0e, 0x00, 0x02, 0xf0, 0x0e, 0x0e,
+ 0x10, 0x11, 0x00, 0x00,
+ 0x0e, 0x00, 0x11, 0x20, 0x0f, 0xfe, 0x01, 0x01, 0x00, 0x0e, 0x20, 0x00,
+ 0xe0, 0xff, 0x10, 0x22,
+ 0x00, 0xff, 0x0e, 0xf0, 0x01, 0x00, 0x0f, 0xff, 0x00, 0x11, 0x1f, 0x0f,
+ 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01,
+ 0x10, 0xff, 0xe0, 0x00,
+ 0x10, 0x20, 0xf0, 0xe0, 0x0f, 0x00, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xd0,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x00, 0x0f, 0x0f, 0x01, 0x00, 0xf0, 0x10, 0x00, 0x0e, 0x00, 0xe1, 0xf2,
+ 0xf0, 0x1f, 0x20, 0xe1,
+ 0xe0, 0x00, 0x11, 0x30, 0xf0, 0xff, 0x0f, 0x0f, 0x1e, 0x11, 0x01, 0x0f,
+ 0x0d, 0x00, 0x0f, 0x10,
+ 0x10, 0x0f, 0xef, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x2f, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x30, 0xe0, 0xe0, 0xf0, 0x10, 0x20, 0x00, 0xf0, 0xe1, 0x1f, 0x10, 0x02,
+ 0x00, 0x00, 0x20, 0x00,
+ 0xf1, 0xf1, 0x00, 0x20, 0x00, 0x0f, 0xe0, 0x02, 0x10, 0x2f, 0x00, 0x01,
+ 0x00, 0x00, 0x2e, 0x21,
+ 0x03, 0xfe, 0x0f, 0x30, 0x11, 0x01, 0x0f, 0x00, 0x23, 0x10, 0x00, 0x00,
+ 0x01, 0x21, 0x02, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x01, 0xc2, 0x00, 0x20, 0x30, 0xe1,
+ 0xe1, 0x00, 0x1f, 0x01,
+ 0x01, 0x00, 0x00, 0xe0, 0x01, 0x2f, 0x0e, 0xe0, 0xf4, 0x01, 0x1d, 0xfe,
+ 0xe1, 0x02, 0x00, 0x1e,
+ 0xf0, 0xe0, 0xf0, 0x0e, 0x20, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x01, 0x00,
+ 0x1f, 0x0d, 0xf0, 0xe2,
+ 0x1f, 0x2d, 0x0f, 0xe1, 0x01, 0x10, 0x0e, 0x0f, 0x00, 0x11, 0x0f, 0x1f,
+ 0x00, 0x00, 0xf1, 0x10,
+ 0x2f, 0x10, 0x00, 0x00, 0x02, 0x11, 0x0f, 0x1f, 0x10, 0x11, 0xf0, 0xf1,
+ 0x01, 0x10, 0x10, 0x00,
+ 0x00, 0xf1, 0x01, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0xfe, 0x01, 0x02, 0xff,
+ 0xee, 0x00, 0x00, 0x10,
+ 0xf0, 0xe0, 0x00, 0x11, 0x20, 0xf0, 0xde, 0x10, 0x21, 0x21, 0xf0, 0xe0,
+ 0x0f, 0x10, 0x1f, 0x10,
+ 0x00, 0xf1, 0xf0, 0x00, 0x21, 0x01, 0xf0, 0xe0, 0x00, 0x12, 0x01, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x02, 0x00, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x01, 0x10,
+ 0x00, 0x01, 0xff, 0x00,
+ 0x11, 0x02, 0xf0, 0x00, 0x11, 0x00, 0xef, 0x10, 0x12, 0xe2, 0xff, 0x1e,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x02, 0x0f, 0x00, 0x10, 0x02, 0x10, 0x00, 0x12, 0x00,
+ 0x0e, 0x00, 0x13, 0x00,
+ 0x00, 0x0e, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x00, 0x14, 0x00, 0xfe, 0x0e,
+ 0x01, 0x01, 0x1f, 0x0e,
+ 0xf1, 0x02, 0x0f, 0x2e, 0x00, 0xf0, 0x03, 0x00, 0x0f, 0x10, 0x10, 0x00,
+ 0xef, 0x0f, 0x01, 0x01,
+ 0x00, 0x0e, 0x00, 0x01, 0x10, 0x01, 0x11, 0x00, 0xef, 0x00, 0x20, 0x13,
+ 0x00, 0xdf, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0xe0, 0xf1, 0xf0, 0x01, 0x1f, 0xe0, 0xe0, 0xf2, 0x00,
+ 0x0d, 0x00, 0xef, 0xf0,
+ 0x01, 0x00, 0xef, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x10, 0x00, 0x02, 0x00,
+ 0x0e, 0x00, 0x32, 0x00, 0x0f, 0xe0, 0x00, 0x31, 0x1f, 0xff, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xd4, 0xff, 0xfc, 0xff, 0xf1, 0xff, 0xf6, 0xff, 0x0e, 0x0e, 0x01, 0x10,
+ 0x0f, 0xee, 0x00, 0x10,
+ 0x0f, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x02, 0x00, 0x0d, 0x0f, 0x00, 0x00,
+ 0x20, 0x0f, 0xdf, 0x00,
+ 0x11, 0x2f, 0x0e, 0xf1, 0xf1, 0x0f, 0x10, 0x10, 0x0e, 0xef, 0x1f, 0x2f,
+ 0x01, 0x01, 0x2e, 0x1c,
+ 0x00, 0xf2, 0x00, 0x6d, 0x10, 0xe1, 0x01, 0x1f, 0x3f, 0x11, 0x01, 0xe0,
+ 0x10, 0x20, 0x12, 0xf0,
+ 0xf0, 0x1f, 0x12, 0x02, 0x00, 0x0f, 0x00, 0x03, 0x02, 0x0f, 0x0f, 0x00,
+ 0x01, 0x11, 0x00, 0x02,
+ 0x00, 0x0e, 0x10, 0x01, 0xe2, 0x00, 0x2e, 0x00, 0xc0, 0x0e, 0x20, 0x00,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0x2e, 0x1d, 0x00, 0x03, 0x10, 0x2f, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x01,
+ 0x01, 0x10, 0x0e, 0xf0,
+ 0x11, 0x13, 0xf0, 0xd0, 0x00, 0x2f, 0x00, 0xd1, 0x00, 0x00, 0xf0, 0xdf,
+ 0x0e, 0x2f, 0x02, 0xf3,
+ 0xdf, 0x0d, 0x42, 0x03, 0xd0, 0x00, 0x10, 0x32, 0x02, 0xd0, 0x00, 0x1f,
+ 0x11, 0x13, 0xf0, 0xf0,
+ 0x0e, 0x30, 0x01, 0xd3, 0x00, 0x1f, 0x2f, 0x00, 0xe0, 0x03, 0x00, 0x1f,
+ 0x0e, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x10, 0x10, 0xe0, 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x10,
+ 0xf0, 0x00, 0xff, 0x01, 0x00, 0x10, 0x22, 0xe0, 0xed, 0x01, 0x12, 0x0e,
+ 0xef, 0x02, 0x01, 0x0f,
+ 0x1f, 0xf0, 0xd1, 0xd0, 0x1f, 0x40, 0x00, 0xff, 0xcf, 0xff, 0x1f, 0x2e,
+ 0x00, 0xd1, 0xf0, 0x0f,
+ 0x0d, 0x00, 0x03, 0x01, 0x00, 0x0e, 0xf1, 0x03, 0x20, 0xe0, 0xe1, 0x10,
+ 0x30, 0xf0, 0xd0, 0x00,
+ 0x22, 0x01, 0xfe, 0x0d, 0x10, 0x04, 0xd0, 0x00, 0x2d, 0x00, 0xe2, 0x0f,
+ 0x00, 0x13, 0x00, 0xff,
+ 0xd0, 0x10, 0x3f, 0x2f, 0xf0, 0xd2, 0x11, 0x3f, 0x1b, 0xf0, 0x00, 0x32,
+ 0x1f, 0x0f, 0x00, 0x30,
+ 0x0e, 0x00, 0x21, 0x12, 0x01, 0x0f, 0x0e, 0xf1, 0x12, 0x11, 0x0f, 0x10,
+ 0x11, 0xf3, 0xfe, 0x0d,
+ 0x20, 0x23, 0xe0, 0xd0, 0x1d, 0x31, 0xe2, 0xef, 0x10, 0x12, 0xe1, 0xe0,
+ 0x1e, 0x21, 0xf4, 0xe1,
+ 0x1e, 0x0e, 0xf1, 0xf2, 0x01, 0x2e, 0xe0, 0xd0, 0x00, 0x3f, 0x0e, 0xd2,
+ 0xe1, 0x0f, 0x3d, 0x00,
+ 0xff, 0xd1, 0x01, 0x1f, 0x10, 0x0f, 0xef, 0x00, 0x31, 0x02, 0xf0, 0xff,
+ 0x10, 0x02, 0xff, 0x00,
+ 0x10, 0x01, 0xe3, 0x00, 0x0f, 0x0d, 0x20, 0x03, 0x02, 0x0f, 0x1d, 0x00,
+ 0xf2, 0xe1, 0x1f, 0x3d,
+ 0x00, 0xc2, 0xf0, 0xf0, 0x00, 0x1e, 0x00, 0xd2, 0x12, 0x1d, 0x0e, 0xd0,
+ 0x0f, 0x10, 0x1e, 0x0d,
+ 0xfe, 0x01, 0x0f, 0x1d, 0x0f, 0xe1, 0x20, 0x2c, 0x1f, 0x00, 0x13, 0x0f,
+ 0x0c, 0x00, 0x31, 0x20,
+ 0x0e, 0xf0, 0xf2, 0x01, 0x0e, 0x1d, 0x20, 0xe3, 0xd2, 0x01, 0x00, 0x10,
+ 0x00, 0xee, 0x01, 0x21,
+ 0x01, 0xd2, 0x0f, 0x2c, 0x00, 0x00, 0x04, 0x01, 0x0f, 0xfe, 0x01, 0x13,
+ 0x30, 0x00, 0xe1, 0x10,
+ 0x10, 0x11, 0x00, 0xf0, 0x20, 0x31, 0x01, 0xff, 0x0e, 0x10, 0x44, 0x20,
+ 0x0f, 0x00, 0x01, 0x10,
+ 0x30, 0x10, 0x01, 0x00, 0xdf, 0x00, 0x41, 0x01, 0xd0, 0xd0, 0x12, 0x30,
+ 0x0f, 0xce, 0x03, 0x13,
+ 0x50, 0xfe, 0xc0, 0x00, 0x20, 0x23, 0xd2, 0xf1, 0x00, 0x00, 0x02, 0x12,
+ 0x22, 0xf0, 0xf0, 0x01,
+ 0x40, 0x01, 0xd1, 0x00, 0x4e, 0x00, 0xf0, 0xe0, 0x00, 0x10, 0x20, 0x02,
+ 0xe1, 0x0f, 0x1f, 0x11,
+ 0x02, 0xf0, 0x0f, 0x3f, 0xf1, 0xc2, 0x00, 0x5f, 0x00, 0xff, 0xf0, 0x10,
+ 0x40, 0xff, 0xc0, 0x01,
+ 0x50, 0x00, 0xf0, 0xdf, 0x10, 0x12, 0x11, 0xf0, 0xdf, 0x00, 0x10, 0x22,
+ 0xe0, 0xee, 0x01, 0x02,
+ 0x00, 0x0d, 0x00, 0xf2, 0xf0, 0x20, 0x1d, 0xf2, 0xf2, 0x0f, 0x2d, 0x02,
+ 0x02, 0x0e, 0xee, 0x02,
+ 0x12, 0xfe, 0xed, 0x21, 0x14, 0xe0, 0xec, 0x00, 0x21, 0x10, 0xf0, 0xd0,
+ 0xe0, 0x0f, 0x2e, 0x1f,
+ 0xf2, 0xe2, 0x0f, 0x1d, 0xf0, 0x01, 0x32, 0x10, 0x0e, 0xe0, 0x01, 0x01,
+ 0x0e, 0x1f, 0x20, 0xe2,
+ 0xd0, 0x0f, 0x2d, 0x1f, 0x02, 0xd1, 0x10, 0x2f, 0x00, 0xd0, 0x0e, 0x42,
+ 0x11, 0xff, 0xc0, 0x10,
+ 0x10, 0x2e, 0xf0, 0xf0, 0xf1, 0x10, 0x01, 0x00, 0xdd, 0x0f, 0x12, 0x03,
+ 0xfe, 0x0c, 0x00, 0x00,
+ 0xdf, 0xf1, 0x10, 0x3e, 0xf0, 0xc0, 0x00, 0x1f, 0x10, 0xf3, 0x02, 0x1e,
+ 0x20, 0x01, 0x03, 0x22,
+ 0x02, 0x00, 0x0f, 0x30, 0x10, 0xe2, 0xe2, 0x11, 0x30, 0xfc, 0xd0, 0xe3,
+ 0x10, 0x3f, 0x10, 0xdf,
+ 0xdf, 0x00, 0x00, 0xf1, 0x00, 0x20, 0xd0, 0xdf, 0xf1, 0x21, 0x12, 0xf0,
+ 0xd0, 0x0f, 0x00, 0x00,
+ 0x00, 0x02, 0xe1, 0x0f, 0x0c, 0x00, 0xe2, 0x10, 0x01, 0xd1, 0x00, 0xf1,
+ 0x01, 0xff, 0xd0, 0x04,
+ 0x02, 0x0e, 0xee, 0xf1, 0x43, 0x02, 0xef, 0xeb, 0x20, 0x40, 0x01, 0xd0,
+ 0x10, 0x1f, 0x0f, 0x0e,
+ 0x10, 0x10, 0xe5, 0xfe, 0x2d, 0x21, 0xf2, 0xfe, 0x1e, 0x21, 0x10, 0xfd,
+ 0x0f, 0x10, 0x00, 0x1d,
+ 0x1e, 0x0f, 0x00, 0x00, 0x20, 0xef, 0xff, 0x40, 0x30, 0x00, 0xdf, 0x0f,
+ 0x10, 0x63, 0x1e, 0xfd,
+ 0x00, 0x00, 0x0f, 0x0f, 0x20, 0x40, 0xfc, 0xef, 0xf1, 0x24, 0x2e, 0x0d,
+ 0x00, 0x14, 0x00, 0x0d,
+ 0xd2, 0x11, 0x4d, 0x0d, 0xe1, 0x05, 0x3f, 0xfc, 0xe0, 0x04, 0x30, 0x0d,
+ 0x0d, 0xd1, 0x02, 0x20,
+ 0x1e, 0xef, 0xdf, 0xfe, 0x1f, 0x30, 0xf2, 0xc0, 0x00, 0x5e, 0x00, 0x02,
+ 0xd2, 0x30, 0x7d, 0x02,
+ 0xf5, 0x01, 0x30, 0x0e, 0x02, 0x16, 0x11, 0xff, 0x00, 0xd3, 0x05, 0x2f,
+ 0x10, 0xe1, 0xd1, 0x00,
+ 0x10, 0x13, 0x02, 0x0e, 0xdd, 0x00, 0x14, 0x10, 0x1e, 0xff, 0xf2, 0x00,
+ 0x3e, 0x1e, 0xe1, 0xe5,
+ 0x10, 0x4b, 0xf0, 0xb1, 0x01, 0x20, 0x0f, 0x0e, 0xc1, 0x00, 0x00, 0x2b,
+ 0x00, 0x00, 0x30, 0x0f,
+ 0x0f, 0x20, 0x50, 0x1e, 0x00, 0x21, 0x04, 0x3f, 0x4b, 0x11, 0xf3, 0x00,
+ 0x3e, 0x0f, 0x13, 0x13,
+ 0xe0, 0x00, 0x30, 0x1f, 0xd2, 0xd4, 0x2e, 0x2e, 0x02, 0xa5, 0x00, 0x1e,
+ 0x20, 0xc5, 0xe1, 0x02,
+ 0x10, 0x21, 0xf2, 0xd0, 0xf0, 0x04, 0xf0, 0x10, 0xef, 0xc0, 0xf0, 0x1f,
+ 0x10, 0xc5, 0xc0, 0x0c,
+ 0x2f, 0x41, 0xc3, 0xb0, 0x00, 0x10, 0x20, 0x02, 0xe1, 0xe2, 0xe1, 0x0f,
+ 0x00, 0x13, 0xe2, 0x0f,
+ 0x0e, 0xf0, 0x00, 0xe1, 0xf1, 0x00, 0x2f, 0x0e, 0xe0, 0x00, 0xf1, 0xfe,
+ 0x0c, 0x00, 0x01, 0xe3,
+ 0x0c, 0x0b, 0x00, 0x00, 0xe3, 0x0b, 0xff, 0x00, 0x30, 0x11, 0xff, 0xec,
+ 0x1f, 0x10, 0x11, 0x00,
+ 0xfc, 0x20, 0x3e, 0xfe, 0xc1, 0x22, 0x4e, 0x0e, 0xc2, 0x00, 0x2e, 0x2c,
+ 0x02, 0xf4, 0x1f, 0x2b,
+ 0x00, 0xe0, 0x12, 0x20, 0x10, 0x0e, 0x0f, 0x00, 0x0f, 0x1d, 0x20, 0x33,
+ 0x00, 0xda, 0x00, 0x2f,
+ 0x03, 0xe0, 0x2c, 0x1f, 0xd0, 0xd3, 0xfe, 0x0f, 0x10, 0x11, 0xd0, 0xdf,
+ 0xfc, 0x00, 0x12, 0x00,
+ 0xe0, 0x00, 0x1f, 0x0f, 0xe3, 0x20, 0x4c, 0x12, 0x04, 0x00, 0xff, 0x30,
+ 0x50, 0x02, 0xf2, 0x04,
+ 0x0f, 0xfd, 0x00, 0x05, 0x12, 0x0f, 0x0e, 0x02, 0x01, 0xd1, 0x00, 0x14,
+ 0x3f, 0x0d, 0xd0, 0xe4,
+ 0x05, 0x2f, 0x4e, 0x0f, 0xa1, 0x05, 0x02, 0x2f, 0x2d, 0xf0, 0x02, 0x00,
+ 0x0e, 0x00, 0x0f, 0x41,
+ 0x01, 0xf0, 0x0d, 0x1e, 0x21, 0xe6, 0xe0, 0x20, 0x3e, 0x01, 0xe1, 0x22,
+ 0x10, 0x00, 0xf0, 0x21,
+ 0x7e, 0x0f, 0x03, 0x02, 0x2d, 0x2f, 0x02, 0xf0, 0xee, 0x10, 0x30, 0x0d,
+ 0xae, 0xf2, 0x01, 0x5c,
+ 0xfe, 0xd0, 0xf4, 0x10, 0x1d, 0x0c, 0xdf, 0x03, 0x04, 0x0f, 0xda, 0xff,
+ 0xf0, 0x02, 0x01, 0x0e,
+ 0xff, 0xc0, 0x00, 0x1f, 0x10, 0xc4, 0xe0, 0x00, 0x2e, 0x00, 0xcf, 0x02,
+ 0x22, 0x10, 0xe0, 0xc3,
+ 0x1f, 0x4e, 0xe0, 0xc1, 0x04, 0x32, 0x0e, 0xcc, 0xff, 0x00, 0x03, 0x04,
+ 0x10, 0x1e, 0xe0, 0xf1,
+ 0x21, 0x12, 0xce, 0xe1, 0x47, 0x20, 0xee, 0xb0, 0x03, 0x11, 0x1e, 0xef,
+ 0xe1, 0xe1, 0xef, 0x0e,
+ 0x11, 0xf0, 0xd0, 0x00, 0xff, 0xed, 0x0e, 0x12, 0x03, 0x0c, 0x1c, 0x01,
+ 0xd3, 0x11, 0x70, 0x0d,
+ 0xf0, 0xe1, 0x16, 0x10, 0x0c, 0xf0, 0xf1, 0x12, 0x20, 0xdc, 0xb0, 0x00,
+ 0x60, 0x00, 0xf1, 0xe0,
+ 0x00, 0x11, 0xf0, 0x02, 0x50, 0x00, 0x0f, 0xce, 0x01, 0x44, 0x4f, 0xfc,
+ 0xe1, 0x02, 0x10, 0x10,
+ 0x24, 0x20, 0x01, 0xe0, 0x01, 0x21, 0x60, 0x0f, 0xf1, 0x05, 0x30, 0x5e,
+ 0x00, 0x00, 0xf4, 0x13,
+ 0x62, 0x20, 0xfc, 0xd0, 0x12, 0x17, 0x12, 0x0d, 0x1f, 0xf0, 0xa2, 0x03,
+ 0x21, 0x20, 0xce, 0xd1,
+ 0x11, 0x61, 0x01, 0xf0, 0xef, 0x1d, 0x50, 0x10, 0xf1, 0xe1, 0x3d, 0x2f,
+ 0xf0, 0x00, 0x10, 0x22,
+ 0x30, 0x10, 0x01, 0xf0, 0x3e, 0x30, 0x12, 0x34, 0x30, 0xed, 0xfc, 0x10,
+ 0x41, 0x33, 0x02, 0x0e,
+ 0xfa, 0x00, 0x03, 0x21, 0x5c, 0xf0, 0xd1, 0xf2, 0x0e, 0x0d, 0x00, 0x11,
+ 0xc0, 0xee, 0x03, 0x04,
+ 0x3d, 0xea, 0xb0, 0x02, 0xf0, 0x10, 0x4d, 0x0e, 0xa3, 0xf0, 0x1f, 0x2d,
+ 0x00, 0xaf, 0x02, 0x02,
+ 0x0e, 0x0f, 0xf0, 0xe2, 0x01, 0x03, 0xe0, 0x0d, 0x2f, 0xb0, 0xe0, 0x00,
+ 0x3d, 0x1f, 0xd2, 0xb0,
+ 0x0a, 0x20, 0x41, 0xe0, 0xcc, 0x00, 0x01, 0xfd, 0x1f, 0xf0, 0xbe, 0xe0,
+ 0x21, 0x00, 0x9d, 0x00,
+ 0x02, 0xfe, 0xdc, 0xf0, 0x04, 0x10, 0x0d, 0xee, 0xf0, 0xf2, 0xde, 0x0d,
+ 0x40, 0x01, 0xf0, 0xde,
+ 0x00, 0x00, 0x01, 0x03, 0x32, 0x2d, 0xde, 0xc0, 0x36, 0x52, 0x0e, 0xed,
+ 0x00, 0x14, 0x00, 0xfe,
+ 0xff, 0x0e, 0x1e, 0xe0, 0xd2, 0x0f, 0x0c, 0x00, 0xd6, 0xf0, 0x0d, 0x1d,
+ 0x04, 0xb4, 0xff, 0x0c,
+ 0x20, 0x00, 0xc1, 0x0f, 0x0c, 0x00, 0xb2, 0x0d, 0x1a, 0x30, 0x10, 0xf3,
+ 0x0e, 0x1a, 0x60, 0x10,
+ 0x22, 0x30, 0x3f, 0x0e, 0x00, 0x35, 0x51, 0x1f, 0x4f, 0x25, 0x02, 0x0f,
+ 0x0f, 0x23, 0x60, 0x24,
+ 0xe2, 0x0f, 0x3f, 0x31, 0x11, 0x00, 0x40, 0x32, 0x00, 0x00, 0x4d, 0x01,
+ 0xe4, 0xf0, 0x4b, 0x51,
+ 0xf3, 0xd0, 0x2d, 0x4f, 0x00, 0xe3, 0x12, 0x70, 0x0c, 0xe1, 0x12, 0x30,
+ 0x0b, 0xe0, 0x03, 0x3e,
+ 0x0e, 0xf1, 0xe3, 0x0f, 0x2c, 0x0e, 0x04, 0x27, 0x00, 0xfe, 0x20, 0x32,
+ 0x00, 0xbf, 0x00, 0x54,
+ 0x02, 0xee, 0xd9, 0x10, 0x32, 0x01, 0xbe, 0x1f, 0x1f, 0xdd, 0xb0, 0x10,
+ 0x63, 0x0f, 0xdc, 0x0f,
+ 0x10, 0x13, 0x10, 0x0e, 0xcf, 0x0f, 0x10, 0x32, 0xe2, 0xdf, 0x0e, 0x00,
+ 0xd2, 0xd4, 0x0e, 0x0d,
+ 0x11, 0x13, 0xf0, 0xde, 0x2d, 0x40, 0x03, 0x07, 0x20, 0x0d, 0x90, 0x03,
+ 0x23, 0x01, 0xe2, 0x00,
+ 0x0f, 0xed, 0xd0, 0xf6, 0x00, 0x2f, 0xfe, 0xa2, 0xf0, 0x0c, 0x10, 0x02,
+ 0xc5, 0x0e, 0x0c, 0xf0,
+ 0xd0, 0xd4, 0x0f, 0x2b, 0xe0, 0xd1, 0xf3, 0xe0, 0xdf, 0xee, 0x10, 0x11,
+ 0xa4, 0xe0, 0x0f, 0x1e,
+ 0x01, 0xf1, 0x1f, 0xfe, 0xdf, 0xf1, 0x10, 0x30, 0x1f, 0x0c, 0x02, 0x43,
+ 0x10, 0x0e, 0x1f, 0x2f,
+ 0x0e, 0x20, 0x33, 0x01, 0xee, 0x0e, 0x40, 0x01, 0xd5, 0x02, 0x0f, 0x0c,
+ 0x20, 0x12, 0x05, 0xe0,
+ 0xed, 0x20, 0x60, 0x04, 0x17, 0x00, 0xfd, 0x10, 0x23, 0xf5, 0xf0, 0x2f,
+ 0x11, 0xe0, 0xf0, 0x01,
+ 0x05, 0x00, 0x2d, 0xf2, 0xd4, 0x00, 0x4e, 0x21, 0xf6, 0xc0, 0x3f, 0x40,
+ 0x01, 0xef, 0x1d, 0x63,
+ 0xe5, 0xfe, 0x1c, 0x50, 0xf0, 0xd5, 0x1f, 0x4e, 0x0f, 0xd0, 0x0f, 0x2e,
+ 0x40, 0xf1, 0xbd, 0xfe,
+ 0x00, 0x2f, 0x0c, 0xef, 0xe4, 0xd1, 0xfb, 0x0e, 0xe0, 0xc4, 0x10, 0x4d,
+ 0xdb, 0x80, 0x03, 0x10,
+ 0x0d, 0xfe, 0xe1, 0x22, 0x00, 0xc0, 0x00, 0x11, 0xf4, 0xd3, 0x00, 0x4f,
+ 0x0d, 0xe0, 0xb4, 0x05,
+ 0x2f, 0x6c, 0xf0, 0xe0, 0x0f, 0x11, 0x15, 0xf0, 0xfc, 0x30, 0xf0, 0x90,
+ 0x02, 0x03, 0x3f, 0xcb,
+ 0xe0, 0x00, 0x03, 0x0d, 0x1d, 0x22, 0xf3, 0xbf, 0x0f, 0x4f, 0x02, 0xd2,
+ 0x10, 0x20, 0xee, 0xfe,
+ 0x00, 0x25, 0x00, 0x1e, 0x30, 0xe0, 0xc1, 0x02, 0x20, 0x6f, 0xee, 0xd3,
+ 0x13, 0x3c, 0x00, 0xd2,
+ 0x10, 0x7c, 0x01, 0xf2, 0xff, 0x30, 0x20, 0xf0, 0xf0, 0x40, 0x2d, 0xff,
+ 0xe4, 0xd5, 0x2e, 0x7d,
+ 0x0f, 0x02, 0xe1, 0x01, 0x10, 0x3f, 0x40, 0x20, 0xef, 0xf0, 0x11, 0x43,
+ 0x5f, 0x0e, 0xf0, 0xd0,
+ 0x30, 0x52, 0x02, 0xce, 0x0d, 0x31, 0x04, 0xbf, 0x0c, 0x50, 0x22, 0xe0,
+ 0xdd, 0x1f, 0x5f, 0x20,
+ 0xf0, 0xf3, 0x0c, 0x4d, 0x1f, 0x00, 0x03, 0x1f, 0x2d, 0x02, 0x21, 0x1d,
+ 0x10, 0xe3, 0x00, 0x7b,
+ 0x11, 0xf2, 0xe0, 0x0d, 0x21, 0x60, 0x00, 0xcf, 0xf2, 0x14, 0x3f, 0x00,
+ 0xf0, 0x00, 0xf1, 0xf3,
+ 0x23, 0x2f, 0xe0, 0xd0, 0x0f, 0x00, 0x25, 0xf1, 0xb0, 0x0f, 0x10, 0x45,
+ 0xd2, 0x0e, 0x2e, 0x01,
+ 0x16, 0x40, 0x00, 0x0d, 0xe0, 0x05, 0x60, 0x00, 0xf0, 0xe0, 0xe0, 0x1f,
+ 0x10, 0xf0, 0xc0, 0x03,
+ 0x40, 0xde, 0xad, 0x00, 0x0d, 0x22, 0xe2, 0xb1, 0x00, 0x0b, 0x00, 0xe1,
+ 0xf5, 0x1e, 0x20, 0xb5,
+ 0xdf, 0x0c, 0x00, 0x03, 0x03, 0xee, 0xda, 0xe0, 0xd1, 0x01, 0x7e, 0xfe,
+ 0xd0, 0x01, 0x30, 0x00,
+ 0xfe, 0xce, 0x0d, 0x11, 0xf5, 0x10, 0x1d, 0xdf, 0xc3, 0xf0, 0x0d, 0x3f,
+ 0x20, 0xa0, 0xe3, 0x11,
+ 0x2c, 0xed, 0x0e, 0x00, 0xd1, 0xe0, 0x61, 0x10, 0xee, 0xeb, 0x30, 0x04,
+ 0xc2, 0xee, 0x3b, 0x11,
+ 0xc2, 0xef, 0xfe, 0x04, 0x01, 0x0d, 0xde, 0xf3, 0xff, 0x0a, 0xf0, 0xd3,
+ 0x02, 0x2e, 0x0c, 0xe0,
+ 0xe1, 0x25, 0x10, 0x11, 0x2e, 0x0d, 0xe2, 0xd4, 0x20, 0x50, 0x0d, 0xe0,
+ 0xf0, 0x00, 0x22, 0x03,
+ 0xb1, 0xfc, 0x4f, 0x25, 0xb3, 0xf0, 0x2d, 0x2e, 0x02, 0xf3, 0xfe, 0x0b,
+ 0x13, 0x42, 0x0c, 0xfd,
+ 0x2f, 0x5f, 0xe0, 0xf2, 0x42, 0x5a, 0xfc, 0xff, 0x31, 0x04, 0x00, 0x3c,
+ 0x40, 0xe1, 0xef, 0x2f,
+ 0x41, 0x33, 0xfb, 0xff, 0x30, 0x50, 0x12, 0x0e, 0xfe, 0x10, 0x71, 0x2f,
+ 0xd1, 0xf0, 0x30, 0x41,
+ 0xf6, 0xff, 0x2e, 0x20, 0xe2, 0xe5, 0x0f, 0x3e, 0x30, 0xd3, 0xcf, 0x0b,
+ 0x3f, 0x32, 0xf3, 0xfe,
+ 0x2c, 0x20, 0x00, 0x03, 0x30, 0x1f, 0x2c, 0x20, 0x12, 0x02, 0x11, 0x11,
+ 0xf0, 0xfe, 0x42, 0x07,
+ 0xb0, 0xff, 0x41, 0x04, 0xb1, 0x0d, 0x0f, 0x22, 0x07, 0xe1, 0xde, 0x0f,
+ 0xf2, 0xe2, 0xf1, 0x01,
+ 0xd4, 0xf0, 0x00, 0xef, 0xe1, 0xe5, 0x01, 0x10, 0xff, 0xd0, 0x02, 0xf2,
+ 0xe1, 0xef, 0x1e, 0x20,
+ 0xf7, 0x90, 0x0e, 0x10, 0x01, 0x00, 0x0a, 0x02, 0x01, 0x0d, 0xed, 0x32,
+ 0x31, 0x9c, 0xfe, 0x12,
+ 0x24, 0xfb, 0xdd, 0x01, 0x02, 0xf0, 0xec, 0x5d, 0x0e, 0xe0, 0xe3, 0x00,
+ 0x3c, 0xf0, 0xa3, 0x00,
+ 0x21, 0xf0, 0xe0, 0x01, 0x01, 0xe1, 0x21, 0x1f, 0x0c, 0x0e, 0x2e, 0x30,
+ 0x21, 0x01, 0x0c, 0x4d,
+ 0x00, 0xfe, 0x3d, 0x2e, 0x00, 0x12, 0x21, 0x1e, 0x4d, 0x1e, 0xd2, 0x03,
+ 0x70, 0x21, 0x01, 0xe0,
+ 0x00, 0x20, 0x2f, 0x11, 0x33, 0x01, 0xc2, 0xf1, 0x5c, 0x4f, 0xe7, 0xc3,
+ 0x00, 0x3e, 0x00, 0x00,
+ 0xf5, 0x15, 0xf0, 0xed, 0x20, 0x32, 0xe5, 0xc0, 0x0d, 0x30, 0x15, 0xd1,
+ 0xc0, 0x1d, 0x02, 0x14,
+ 0x00, 0xdd, 0xe0, 0x10, 0x02, 0xff, 0x0e, 0x10, 0x1f, 0x1c, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3c, 0x00, 0xdb, 0xff, 0x4c, 0x00, 0x99, 0xff, 0x1e, 0x3d, 0x20, 0x0f,
+ 0x0c, 0x20, 0x55, 0xd0,
+ 0xec, 0x2f, 0x40, 0xd0, 0xd0, 0x0d, 0x10, 0xe2, 0xdd, 0xfd, 0x30, 0x0f,
+ 0xda, 0xff, 0x22, 0x14,
+ 0xfd, 0x0a, 0x30, 0x01, 0xe1, 0x10, 0x2d, 0xf0, 0xff, 0x0d, 0x10, 0xf4,
+ 0xe0, 0x0b, 0x0f, 0xf2,
+ 0x02, 0x41, 0x00, 0xd1, 0x00, 0x1c, 0x61, 0x07, 0x03, 0x01, 0x50, 0x0e,
+ 0xe3, 0xf4, 0x31, 0x41,
+ 0xd4, 0xc0, 0x0e, 0x10, 0x11, 0xb5, 0xe3, 0x00, 0xfc, 0xd0, 0xb5, 0xf2,
+ 0xff, 0xc0, 0xc7, 0x01,
+ 0x10, 0xfd, 0xd2, 0xf4, 0xe2, 0x00, 0xfe, 0x02, 0x23, 0x0f, 0xc0, 0xe5,
+ 0x21, 0x3e, 0x3e, 0xe4,
+ 0x90, 0x0a, 0x3e, 0x12, 0xc2, 0xde, 0x0b, 0x10, 0x00, 0xd2, 0xbf, 0xca,
+ 0x0e, 0x21, 0x34, 0xac,
+ 0xfd, 0x01, 0x30, 0x0f, 0xfd, 0x2f, 0x1c, 0xfe, 0x40, 0x3c, 0x0c, 0x00,
+ 0x0d, 0x1a, 0x4f, 0x41,
+ 0xd0, 0xab, 0x1e, 0x30, 0x14, 0xee, 0x0c, 0x00, 0x00, 0x02, 0x10, 0x5a,
+ 0x1f, 0xe0, 0xd3, 0x30,
+ 0x3e, 0x0d, 0xf0, 0x03, 0x10, 0x1e, 0x02, 0x03, 0x3f, 0x1f, 0xf2, 0xe2,
+ 0x4e, 0x62, 0x07, 0xe0,
+ 0x0e, 0x00, 0x20, 0x23, 0xef, 0xcb, 0x00, 0x43, 0x1f, 0xcc, 0xc1, 0x11,
+ 0x20, 0x2f, 0x2e, 0x02,
+ 0xd2, 0xfd, 0x3e, 0x76, 0x11, 0xe0, 0x00, 0x01, 0x40, 0x00, 0xf5, 0xc2,
+ 0x00, 0x40, 0x02, 0xa4,
+ 0x00, 0x00, 0x2f, 0xe3, 0xf4, 0x22, 0x00, 0xde, 0xe1, 0x74, 0x35, 0xd0,
+ 0xec, 0x20, 0x24, 0x32,
+ 0x40, 0x0d, 0xb1, 0x03, 0x00, 0x3d, 0x2d, 0x01, 0xb7, 0xee, 0xfb, 0x30,
+ 0x32, 0xb0, 0xdc, 0x0f,
+ 0x20, 0xe1, 0xbf, 0x0c, 0x41, 0x00, 0xcc, 0xfd, 0x21, 0x31, 0xfd, 0xc0,
+ 0x3e, 0x20, 0xf0, 0xce,
+ 0xfd, 0xf0, 0x31, 0x41, 0xe2, 0x80, 0x0f, 0x0c, 0x11, 0x01, 0xf1, 0x10,
+ 0x0d, 0xce, 0x02, 0x50,
+ 0x0c, 0xef, 0xf4, 0x16, 0x00, 0x0d, 0x10, 0x3f, 0x22, 0xc1, 0xe0, 0x2f,
+ 0x3e, 0x00, 0x0e, 0x0e,
+ 0x00, 0xf2, 0xf1, 0xfe, 0x01, 0x42, 0x00, 0xd2, 0x34, 0x12, 0xe0, 0xef,
+ 0x02, 0x45, 0xe0, 0xcd,
+ 0x01, 0xf6, 0x11, 0x0f, 0xa0, 0xd0, 0x00, 0x30, 0x02, 0x90, 0xfa, 0x0f,
+ 0x10, 0x01, 0xc0, 0x0c,
+ 0x10, 0x10, 0xf0, 0x14, 0x3e, 0xfc, 0xe0, 0xf6, 0x10, 0x10, 0x2f, 0x0c,
+ 0xe0, 0x23, 0x3f, 0xea,
+ 0xe0, 0x31, 0x72, 0x0f, 0xbb, 0x3f, 0x40, 0xf6, 0xd0, 0x0e, 0x30, 0x40,
+ 0x00, 0xd2, 0xe0, 0x21,
+ 0x30, 0x0d, 0xe2, 0x16, 0x1f, 0x0c, 0x20, 0x65, 0xe2, 0xef, 0x1c, 0x71,
+ 0x03, 0x00, 0x00, 0xe2,
+ 0x1f, 0x6f, 0x06, 0xf1, 0x00, 0x1f, 0x11, 0xf2, 0x00, 0x51, 0x03, 0xe0,
+ 0xfe, 0x51, 0x17, 0xe2,
+ 0xdd, 0x20, 0x74, 0x01, 0xce, 0x0d, 0x25, 0x33, 0xd0, 0xf0, 0x00, 0x00,
+ 0x24, 0x21, 0xf4, 0xf1,
+ 0x0f, 0xff, 0xf2, 0x13, 0x02, 0x03, 0xe1, 0xb0, 0xf1, 0x02, 0x10, 0x00,
+ 0xd1, 0xe4, 0xbf, 0xee,
+ 0x3e, 0x71, 0xe7, 0xd0, 0x1e, 0x40, 0x01, 0xe1, 0xff, 0x1d, 0x50, 0x02,
+ 0xf2, 0xe1, 0x22, 0x00,
+ 0xe8, 0xe0, 0x61, 0x02, 0xa0, 0xff, 0x0d, 0x1e, 0xf2, 0xd6, 0xfe, 0xfc,
+ 0x00, 0xf0, 0xcd, 0x00,
+ 0x20, 0xed, 0x8e, 0xf1, 0x0b, 0x2c, 0x00, 0xf1, 0xdf, 0xdb, 0x31, 0x7f,
+ 0xfb, 0xbf, 0x02, 0x00,
+ 0x1f, 0x0d, 0xff, 0x01, 0x00, 0xfd, 0x1f, 0x42, 0x2f, 0xed, 0x00, 0x6c,
+ 0x01, 0xf3, 0x0b, 0x7e,
+ 0x10, 0x04, 0xf0, 0x0c, 0x30, 0x15, 0x02, 0xdd, 0x4a, 0x31, 0xe4, 0xf0,
+ 0x2f, 0x2d, 0x30, 0x13,
+ 0xe0, 0xcc, 0x02, 0x53, 0x1e, 0xdd, 0x00, 0x20, 0x00, 0xe7, 0x10, 0x6d,
+ 0x0f, 0x00, 0x03, 0x02,
+ 0x0e, 0x7e, 0x10, 0xe1, 0x02, 0x31, 0x20, 0x0f, 0x01, 0xf4, 0xf0, 0x40,
+ 0x42, 0x00, 0x00, 0x02,
+ 0x33, 0x5f, 0x0d, 0xe1, 0x22, 0x20, 0x00, 0xdf, 0x2f, 0x2f, 0xe0, 0xd2,
+ 0xf6, 0x0f, 0x3c, 0xf0,
+ 0xc3, 0x24, 0x50, 0xfc, 0xdf, 0x10, 0x53, 0x03, 0xdc, 0x4d, 0x11, 0xc0,
+ 0xeb, 0x60, 0x34, 0xe0,
+ 0xeb, 0x20, 0x02, 0x00, 0x5b, 0x3f, 0xe2, 0xc3, 0x2c, 0x3e, 0x01, 0xf1,
+ 0x01, 0xfd, 0x00, 0x13,
+ 0xe3, 0xcd, 0xf0, 0x01, 0x10, 0x20, 0xb7, 0xd4, 0x0c, 0x0e, 0xc1, 0xb4,
+ 0x00, 0xfe, 0xd0, 0xcf,
+ 0xf0, 0x02, 0xd5, 0xdf, 0xed, 0x00, 0xe6, 0xb2, 0x0e, 0x5e, 0xf3, 0xa5,
+ 0x00, 0x2d, 0x10, 0xf0,
+ 0xd5, 0x01, 0x2f, 0x3e, 0x0f, 0xc0, 0x16, 0x01, 0xef, 0x1f, 0x42, 0x00,
+ 0xb1, 0x03, 0x21, 0x3d,
+ 0xbf, 0xb3, 0x06, 0x30, 0x0e, 0xdd, 0xe3, 0xe0, 0xfc, 0x40, 0x10, 0xac,
+ 0xef, 0x00, 0xdf, 0xfc,
+ 0x0f, 0x0e, 0xb1, 0xe3, 0x1b, 0x3e, 0xb3, 0xd3, 0x0d, 0x7b, 0x0e, 0xd0,
+ 0x07, 0x00, 0x1a, 0x4f,
+ 0x01, 0xd3, 0xed, 0x2c, 0x70, 0x02, 0xf0, 0xfc, 0x10, 0x30, 0x0f, 0x3f,
+ 0x1d, 0x00, 0x03, 0x3f,
+ 0x0a, 0x00, 0x51, 0x20, 0xfd, 0x0e, 0x42, 0x36, 0x30, 0x1b, 0x20, 0x12,
+ 0x11, 0x00, 0x0e, 0x3e,
+ 0x70, 0x04, 0xe1, 0x00, 0x20, 0x20, 0x30, 0x05, 0xa2, 0x0e, 0x10, 0x57,
+ 0xff, 0xde, 0x01, 0x32,
+ 0x54, 0x01, 0xee, 0x0e, 0x20, 0x21, 0x40, 0x00, 0xf4, 0x01, 0x6c, 0x2f,
+ 0x02, 0x03, 0xe0, 0x1e,
+ 0x30, 0x04, 0x00, 0xeb, 0xee, 0x23, 0xf7, 0xcf, 0x0e, 0x51, 0xe2, 0xb0,
+ 0x0f, 0x00, 0x07, 0xf0,
+ 0xfd, 0xd0, 0x03, 0x01, 0xd0, 0xf1, 0x1f, 0xfe, 0xf1, 0xe5, 0xe0, 0x0b,
+ 0x21, 0xf7, 0x80, 0xff,
+ 0x2e, 0x30, 0xd5, 0xd1, 0x0f, 0x3e, 0x40, 0xd2, 0x00, 0x2d, 0x00, 0xc3,
+ 0x1f, 0x5a, 0x00, 0xc4,
+ 0xe1, 0x2f, 0x5c, 0xf0, 0xc4, 0x02, 0x0e, 0x3e, 0xd2, 0xb3, 0x0c, 0x3f,
+ 0x12, 0xd3, 0xe0, 0xfd,
+ 0xd0, 0xd0, 0x2e, 0x2b, 0x90, 0xf7, 0x01, 0x0e, 0xfd, 0x01, 0x04, 0xf0,
+ 0x0e, 0x6f, 0xf1, 0xe0,
+ 0x00, 0x2e, 0x32, 0x02, 0xbd, 0xe9, 0xd0, 0x35, 0x7f, 0xfd, 0xbf, 0x03,
+ 0x10, 0x1d, 0x2e, 0x0f,
+ 0xef, 0x00, 0x01, 0x08, 0x1e, 0x12, 0xe0, 0xfd, 0x00, 0xf5, 0x0f, 0x2c,
+ 0x30, 0x14, 0xf1, 0xee,
+ 0xfc, 0x00, 0x10, 0x22, 0x01, 0xe0, 0xba, 0xdf, 0xf0, 0x20, 0x23, 0xae,
+ 0xfe, 0x01, 0xd3, 0x0b,
+ 0x3e, 0x14, 0xf3, 0x1e, 0xde, 0xc2, 0x50, 0x58, 0xe0, 0xd2, 0x03, 0x4c,
+ 0x2c, 0x00, 0xc3, 0x00,
+ 0x1c, 0x10, 0x10, 0x4e, 0x10, 0xf2, 0xd0, 0x0b, 0x70, 0x50, 0xf2, 0xd1,
+ 0x2e, 0x2f, 0x12, 0x03,
+ 0xb5, 0x00, 0x3c, 0x40, 0xd3, 0xb6, 0x10, 0x3f, 0x0c, 0xe1, 0x04, 0xf1,
+ 0x0f, 0x2e, 0x21, 0xf1,
+ 0xe0, 0x40, 0x17, 0x70, 0x3b, 0xf0, 0xf3, 0x21, 0x20, 0x10, 0x3f, 0x4f,
+ 0xc4, 0xe2, 0x20, 0x5e,
+ 0x1d, 0x00, 0xd7, 0xf2, 0x7b, 0x30, 0xc2, 0xe2, 0x2f, 0x2e, 0x03, 0xd3,
+ 0x1e, 0xdf, 0x00, 0x65,
+ 0x00, 0xed, 0x02, 0x33, 0xfd, 0xcf, 0x72, 0x23, 0xdb, 0xfe, 0x32, 0x14,
+ 0xf0, 0xfc, 0x41, 0x04,
+ 0x02, 0x00, 0x0e, 0x0f, 0x55, 0x07, 0xa0, 0x0d, 0x00, 0x52, 0x05, 0xd0,
+ 0xfe, 0x10, 0x01, 0x02,
+ 0xf0, 0x1e, 0x0f, 0xe0, 0xe1, 0xe0, 0x10, 0x44, 0x00, 0x0a, 0xef, 0xe3,
+ 0x27, 0x10, 0xed, 0x30,
+ 0x41, 0x92, 0xf3, 0x2e, 0x2c, 0xdf, 0xf3, 0x46, 0x0f, 0x9c, 0x00, 0x01,
+ 0x21, 0xff, 0xe0, 0xde,
+ 0x0d, 0x0d, 0x04, 0x04, 0x0c, 0xdd, 0x00, 0x12, 0xd0, 0xfa, 0x51, 0x23,
+ 0xdf, 0xae, 0x00, 0x1e,
+ 0x22, 0xb2, 0xfe, 0xed, 0xf4, 0xff, 0x39, 0x00, 0x82, 0xf0, 0x01, 0x2e,
+ 0x0b, 0xc1, 0x03, 0x3f,
+ 0x39, 0xb1, 0xd1, 0x00, 0x3e, 0x4e, 0x00, 0xa1, 0xf0, 0x02, 0x32, 0x09,
+ 0xc0, 0x00, 0x12, 0x00,
+ 0xf0, 0x2e, 0x02, 0xe3, 0x1b, 0x0e, 0xf1, 0x75, 0x30, 0xbe, 0xff, 0x20,
+ 0x16, 0xf1, 0xe0, 0x1e,
+ 0x10, 0x05, 0xf1, 0xf2, 0xc3, 0xef, 0x11, 0x56, 0x11, 0xe1, 0x91, 0xf7,
+ 0x31, 0x4f, 0xe0, 0xc0,
+ 0x03, 0x31, 0x10, 0xe0, 0x0d, 0x30, 0xe0, 0xdc, 0x45, 0x34, 0x2c, 0x4d,
+ 0x11, 0xf4, 0x00, 0x50,
+ 0x7d, 0x00, 0xd3, 0x2f, 0x5b, 0x00, 0xe3, 0x1e, 0x1b, 0x00, 0x02, 0x41,
+ 0xf0, 0xd2, 0x01, 0x20,
+ 0x3c, 0xfe, 0x92, 0x07, 0xf1, 0x1b, 0x1f, 0x01, 0xc3, 0xd0, 0xec, 0x1e,
+ 0x60, 0xe2, 0xa1, 0x0f,
+ 0x1c, 0x2f, 0xf0, 0xe0, 0x0e, 0x00, 0x1f, 0x2b, 0x10, 0xd0, 0xfa, 0x0e,
+ 0x0f, 0xf1, 0xff, 0x18,
+ 0x40, 0x10, 0xde, 0xdf, 0x20, 0x40, 0x00, 0xff, 0xf0, 0x01, 0x20, 0x2e,
+ 0xf1, 0x17, 0x32, 0x0b,
+ 0x00, 0x04, 0xf0, 0xee, 0x30, 0x60, 0xe0, 0xb1, 0x1f, 0x5c, 0x01, 0xc0,
+ 0x00, 0x00, 0x40, 0x0c,
+ 0xe2, 0xe3, 0x1c, 0x4e, 0x00, 0x03, 0x0c, 0x0d, 0xf2, 0x47, 0x20, 0xc9,
+ 0xf0, 0x34, 0x50, 0xed,
+ 0xf0, 0x01, 0x10, 0x4e, 0x14, 0x00, 0xcb, 0xef, 0x00, 0x51, 0x02, 0xff,
+ 0x1d, 0x00, 0xd2, 0x00,
+ 0x12, 0x57, 0x0f, 0xee, 0xf4, 0x11, 0x20, 0xad, 0xf3, 0x07, 0x00, 0x2d,
+ 0xcf, 0xb4, 0x01, 0x30,
+ 0xee, 0xb0, 0x10, 0x10, 0xf1, 0xe3, 0x32, 0xfb, 0x0d, 0x7f, 0x05, 0xd4,
+ 0x0f, 0x7c, 0x30, 0xe2,
+ 0xf1, 0x1c, 0x1e, 0x13, 0x45, 0x0c, 0xfc, 0xf1, 0x31, 0x41, 0x0d, 0xdf,
+ 0x01, 0x70, 0x1c, 0xf0,
+ 0xb1, 0x13, 0x4c, 0x2c, 0xd0, 0x04, 0xf0, 0xec, 0x2f, 0x74, 0x00, 0xdc,
+ 0xff, 0xf5, 0x01, 0x2d,
+ 0x0f, 0xd7, 0x00, 0x00, 0xf0, 0x02, 0x11, 0xdf, 0x30, 0x42, 0x02, 0xf0,
+ 0x00, 0xe0, 0xec, 0x6e,
+ 0x37, 0xc5, 0xdf, 0x2e, 0x31, 0xe2, 0x00, 0x40, 0x01, 0x24, 0x0e, 0x0e,
+ 0x10, 0x32, 0x03, 0xbe,
+ 0x00, 0x47, 0xe0, 0xee, 0x10, 0x03, 0x81, 0x02, 0x30, 0x2c, 0xcf, 0xd0,
+ 0x02, 0x04, 0xed, 0xfb,
+ 0x03, 0xb5, 0x0e, 0x0d, 0xd2, 0x82, 0x00, 0x2d, 0x01, 0xe1, 0xe0, 0x00,
+ 0xf0, 0xf6, 0xff, 0xdc,
+ 0x00, 0xb5, 0xb3, 0x0f, 0x1b, 0x0f, 0xd2, 0xe4, 0xee, 0x1d, 0x01, 0xf1,
+ 0xde, 0x2f, 0x32, 0xc1,
+ 0xfd, 0x5d, 0x2d, 0xf4, 0xe7, 0x70, 0x2a, 0xdf, 0xe2, 0x43, 0x3e, 0xfe,
+ 0xa2, 0x10, 0x2e, 0x1e,
+ 0xd6, 0x02, 0x6f, 0x0d, 0xf0, 0xf2, 0x12, 0x33, 0x01, 0xcd, 0x0f, 0x01,
+ 0xfe, 0x60, 0x17, 0xf2,
+ 0xdd, 0x20, 0x40, 0xf1, 0xb3, 0x13, 0x4e, 0x0e, 0xc5, 0x01, 0x0f, 0x1d,
+ 0x00, 0x2f, 0xf4, 0xc2,
+ 0xf8, 0x2c, 0x00, 0xd3, 0xc0, 0x29, 0x10, 0xe2, 0xd0, 0x0d, 0xff, 0x43,
+ 0x10, 0xdb, 0x01, 0x31,
+ 0x0f, 0xee, 0x0e, 0x42, 0xe1, 0xdb, 0x1e, 0x03, 0xc2, 0x0c, 0x6f, 0xf0,
+ 0xd0, 0x02, 0x00, 0xf4,
+ 0x3d, 0x0a, 0xd0, 0xd6, 0x01, 0x0e, 0x0d, 0x50, 0xd4, 0xb0, 0x2f, 0x7f,
+ 0x0f, 0xd2, 0x00, 0x4c,
+ 0x1e, 0x04, 0xd3, 0x2b, 0x4e, 0x01, 0x02, 0x20, 0x3f, 0x01, 0xd1, 0x70,
+ 0x3f, 0x00, 0xf4, 0x06,
+ 0x10, 0x2c, 0x43, 0x14, 0xef, 0x0c, 0x63, 0x04, 0xf0, 0x2e, 0x4f, 0xd0,
+ 0x05, 0x33, 0x0f, 0xdf,
+ 0xe1, 0x34, 0x00, 0xe2, 0xf4, 0xaf, 0xee, 0x40, 0x25, 0xb2, 0xff, 0x0e,
+ 0x03, 0x06, 0x1f, 0xba,
+ 0xe0, 0x10, 0x23, 0xf1, 0xcb, 0x0e, 0x10, 0xe2, 0xdf, 0x2c, 0x11, 0xc0,
+ 0x1f, 0x6c, 0xe1, 0x02,
+ 0x0e, 0x09, 0xe0, 0x12, 0x3f, 0xc0, 0xbe, 0x0c, 0xf0, 0xf2, 0xf1, 0xeb,
+ 0xed, 0xef, 0x05, 0x00,
+ 0xfe, 0xa0, 0x01, 0x01, 0xed, 0x8e, 0x00, 0x47, 0xf3, 0xdb, 0x0e, 0x01,
+ 0x02, 0x0f, 0x0c, 0x10,
+ 0xf2, 0x0f, 0x0b, 0x00, 0xd0, 0x20, 0x4d, 0x20, 0xf1, 0x8b, 0xfe, 0x31,
+ 0x22, 0x0d, 0x0f, 0xdf,
+ 0xbf, 0x20, 0x77, 0x21, 0xcd, 0x00, 0x14, 0x20, 0x0f, 0xf1, 0x05, 0x10,
+ 0x4d, 0xf1, 0xb2, 0xf4,
+ 0x32, 0x5d, 0xec, 0xe4, 0x17, 0x11, 0x0f, 0x0f, 0x20, 0x00, 0x04, 0xf0,
+ 0xc0, 0x2f, 0x7f, 0x00,
+ 0xc7, 0x10, 0x0e, 0xf2, 0x37, 0x4f, 0xdf, 0xc2, 0x10, 0x50, 0x00, 0x02,
+ 0xf4, 0x01, 0x0d, 0x6f,
+ 0x23, 0xd7, 0x01, 0x20, 0x41, 0x10, 0xf1, 0xe0, 0x04, 0x74, 0x0d, 0xfa,
+ 0xf2, 0x14, 0x3f, 0xfb,
+ 0x01, 0x02, 0xf0, 0xff, 0x7f, 0x10, 0xf2, 0x01, 0xf0, 0xed, 0x10, 0x71,
+ 0x00, 0xd1, 0xdd, 0x2d,
+ 0x41, 0x0b, 0xce, 0xe2, 0x42, 0x3b, 0xee, 0xd0, 0x20, 0x04, 0x1d, 0x6b,
+ 0x00, 0xe6, 0x0f, 0x3d,
+ 0x10, 0x04, 0x04, 0x0e, 0x2c, 0x10, 0x34, 0x01, 0xde, 0xfe, 0x10, 0x34,
+ 0x30, 0xef, 0xae, 0x00,
+ 0x41, 0x13, 0xd6, 0xde, 0x1b, 0x22, 0xe2, 0xe1, 0x2e, 0xd2, 0x03, 0x0f,
+ 0xbf, 0x02, 0x51, 0xec,
+ 0xce, 0xf7, 0xe4, 0x0b, 0x30, 0xf0, 0x83, 0xe0, 0x0f, 0x0f, 0x12, 0x02,
+ 0xb1, 0xcd, 0xf1, 0x14,
+ 0x3c, 0xf1, 0x84, 0xfd, 0x0e, 0x23, 0x11, 0xed, 0xc3, 0x0f, 0x38, 0x10,
+ 0xd2, 0xe0, 0xfd, 0x0f,
+ 0x4f, 0x0d, 0x9f, 0x02, 0x10, 0x08, 0xff, 0x03, 0xe0, 0x0c, 0x30, 0x10,
+ 0xf0, 0xe0, 0x00, 0x08,
+ 0xa0, 0x01, 0x50, 0x0d, 0xd0, 0xe0, 0x10, 0x01, 0x10, 0x4e, 0xcd, 0xed,
+ 0x51, 0x04, 0xe0, 0x10,
+ 0x40, 0xdd, 0xd0, 0x41, 0x51, 0xf3, 0xe0, 0x1a, 0x4f, 0x0f, 0x00, 0x01,
+ 0x22, 0x1d, 0x58, 0x11,
+ 0xd1, 0xdd, 0x1d, 0x77, 0x20, 0x0d, 0xef, 0x03, 0x20, 0x0d, 0x40, 0x10,
+ 0x0f, 0x1f, 0x5f, 0x0f,
+ 0x0e, 0x3f, 0x4e, 0xfe, 0x12, 0x72, 0x2d, 0xc0, 0xf5, 0x33, 0x3b, 0xff,
+ 0xe6, 0x02, 0x3f, 0xff,
+ 0xe0, 0x73, 0x02, 0xf0, 0xe0, 0x00, 0x50, 0x21, 0xe4, 0xd0, 0x2c, 0x33,
+ 0x17, 0x12, 0x2e, 0xce,
+ 0xe0, 0x10, 0x70, 0x17, 0xe2, 0xdc, 0x0d, 0x01, 0xe0, 0x51, 0x32, 0xe0,
+ 0xab, 0x0e, 0x22, 0x41,
+ 0x0e, 0xdf, 0x0d, 0x0e, 0x13, 0xf7, 0xc0, 0xed, 0x0e, 0xf0, 0x07, 0x13,
+ 0xcd, 0xbd, 0x21, 0x34,
+ 0xbf, 0xd1, 0x02, 0x6c, 0x0f, 0xa0, 0x01, 0x0f, 0x1d, 0xef, 0xe0, 0x01,
+ 0x1f, 0x0c, 0xed, 0xfd,
+ 0x13, 0x07, 0x9f, 0x2e, 0x3f, 0xde, 0xd5, 0x53, 0x1b, 0xf0, 0xc3, 0x32,
+ 0x3e, 0xf0, 0xf3, 0x10,
+ 0x00, 0xd7, 0xf4, 0x1d, 0x70, 0x02, 0xc6, 0x00, 0x2f, 0x1f, 0xdf, 0xc4,
+ 0xc4, 0xfe, 0x4e, 0xe1,
+ 0xa5, 0x0f, 0x0f, 0x00, 0xf2, 0x0f, 0xef, 0xa3, 0x2f, 0x4c, 0xe3, 0xc2,
+ 0x09, 0x2f, 0x00, 0xe2,
+ 0x00, 0xff, 0xee, 0x0a, 0x00, 0xd0, 0xd2, 0x3c, 0x0d, 0x01, 0xe1, 0xbc,
+ 0xed, 0x3e, 0x72, 0xf2,
+ 0xbc, 0x0c, 0x30, 0x13, 0x00, 0xf9, 0x00, 0x00, 0x10, 0x2f, 0x00, 0xd5,
+ 0xc0, 0x5c, 0x40, 0xe0,
+ 0xb4, 0x01, 0x1e, 0x5a, 0x10, 0xd3, 0xe1, 0xff, 0x3e, 0x6f, 0xf1, 0xc5,
+ 0x10, 0x3e, 0x0f, 0xd0,
+ 0x13, 0x11, 0x2e, 0x1c, 0xe0, 0xf0, 0x72, 0x14, 0x04, 0xfc, 0x4c, 0x21,
+ 0x06, 0x00, 0x71, 0x01,
+ 0xf0, 0x00, 0x30, 0x25, 0x20, 0xf0, 0xee, 0x52, 0x36, 0xf0, 0xfd, 0x73,
+ 0x03, 0xff, 0xff, 0x42,
+ 0x22, 0xfd, 0x00, 0x17, 0x02, 0x00, 0x5c, 0x00, 0xd2, 0x31, 0x02, 0xe0,
+ 0xfc, 0x5f, 0x20, 0xc0,
+ 0xf3, 0x0f, 0x19, 0xf0, 0xb3, 0xf1, 0x0e, 0x30, 0xf4, 0x90, 0x1a, 0x01,
+ 0xd6, 0x00, 0x4c, 0xc0,
+ 0xd3, 0x32, 0xfe, 0xcd, 0x01, 0x03, 0xf2, 0x2c, 0x3d, 0xb2, 0xe7, 0x00,
+ 0x3c, 0x31, 0xd1, 0xb0,
+ 0x1d, 0x00, 0xe5, 0xe0, 0xfc, 0x6f, 0x01, 0xa0, 0x0e, 0x10, 0x30, 0xbd,
+ 0x00, 0x10, 0x1d, 0xcd,
+ 0x00, 0x40, 0xe2, 0xcd, 0x0f, 0x55, 0x0f, 0xf9, 0xf0, 0x00, 0x06, 0x02,
+ 0x11, 0x00, 0x18, 0x00,
+ 0x8e, 0xff, 0xe0, 0xff, 0xde, 0xff, 0x74, 0xff, 0x34, 0x15, 0x80, 0xff,
+ 0x20, 0x30, 0xdd, 0xdc,
+ 0x30, 0x56, 0x03, 0x10, 0x0c, 0xed, 0xf0, 0x30, 0x4c, 0x0b, 0xc0, 0xe2,
+ 0x20, 0x7f, 0x00, 0xf1,
+ 0xeb, 0x4c, 0x20, 0xe3, 0x23, 0x73, 0xf1, 0xef, 0x4d, 0x4d, 0x0c, 0xe0,
+ 0x17, 0x03, 0xf1, 0x30,
+ 0x30, 0x9e, 0xff, 0x40, 0x02, 0xc6, 0xf3, 0x31, 0x0e, 0x0d, 0xd0, 0xf0,
+ 0xff, 0x30, 0x05, 0xb1,
+ 0xfc, 0x1a, 0x1d, 0xbf, 0xe3, 0x16, 0x41, 0x0f, 0x1e, 0x2f, 0x00, 0xc0,
+ 0x0f, 0x60, 0x42, 0x01,
+ 0xb4, 0x03, 0x2e, 0x08, 0x0e, 0xf0, 0xe1, 0x20, 0x11, 0xd5, 0xd3, 0xf0,
+ 0x0f, 0x10, 0xfe, 0x28,
+ 0x2e, 0xd0, 0xe0, 0x30, 0x32, 0x33, 0x54, 0xf3, 0x91, 0x11, 0x63, 0x04,
+ 0xf0, 0xed, 0x1b, 0x20,
+ 0x03, 0xf4, 0xb2, 0x00, 0x3d, 0x20, 0xe5, 0xe1, 0x0f, 0x0e, 0x6c, 0x0f,
+ 0x06, 0x03, 0xf0, 0x0c,
+ 0x4e, 0x23, 0x04, 0x0e, 0xec, 0x01, 0x77, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0xd0, 0x40, 0x30, 0xd1,
+ 0xb1, 0xd3, 0x07, 0x32, 0xd0, 0x80, 0x03, 0x01, 0xe0, 0xe3, 0x05, 0xd3,
+ 0x02, 0x30, 0x83, 0xe6,
+ 0x00, 0x0e, 0x0e, 0xc0, 0x02, 0xe2, 0xd1, 0xf0, 0x1f, 0xfc, 0xcd, 0xf1,
+ 0xc0, 0xf9, 0x4d, 0xde,
+ 0x80, 0x01, 0x1e, 0xe8, 0x0e, 0x12, 0xd1, 0xdf, 0x00, 0x31, 0x20, 0xfe,
+ 0x0f, 0xe1, 0xe5, 0x55,
+ 0x44, 0x03, 0x01, 0x5b, 0xea, 0x0e, 0x21, 0x23, 0x01, 0x00, 0x11, 0xc3,
+ 0x00, 0x5b, 0x0d, 0xdd,
+ 0xdf, 0x7f, 0x2f, 0x02, 0xd4, 0x00, 0x3e, 0x7d, 0x18, 0x0e, 0x00, 0x11,
+ 0x60, 0x10, 0x10, 0x1e,
+ 0x2e, 0x0f, 0x20, 0x32, 0x01, 0x2c, 0x7b, 0x10, 0x03, 0x13, 0x11, 0x30,
+ 0x10, 0x0c, 0xfd, 0x46,
+ 0x26, 0xe1, 0xe0, 0x11, 0x11, 0x00, 0xfe, 0x2f, 0x31, 0xf1, 0xb0, 0x01,
+ 0x04, 0x40, 0x1c, 0xdd,
+ 0xe1, 0x21, 0xea, 0xab, 0x00, 0x02, 0xc0, 0x0d, 0x1c, 0x80, 0x02, 0x05,
+ 0xf1, 0xff, 0x0c, 0xfc,
+ 0x1f, 0x3f, 0xcb, 0xed, 0x40, 0x41, 0xe1, 0xe0, 0x20, 0x00, 0xfd, 0x09,
+ 0x0f, 0xa0, 0x02, 0x36,
+ 0x02, 0x80, 0x0f, 0x22, 0xf6, 0xc1, 0x10, 0x3e, 0x10, 0xd1, 0xe0, 0x1f,
+ 0x32, 0x35, 0x30, 0x0d,
+ 0xe0, 0x73, 0x30, 0x0a, 0xf0, 0x01, 0x30, 0x5e, 0xf0, 0xb1, 0x10, 0x2d,
+ 0xf9, 0x0e, 0x00, 0xd0,
+ 0xfe, 0x7c, 0x20, 0xc1, 0xc0, 0x2f, 0x50, 0xf0, 0xb0, 0x09, 0xfc, 0x30,
+ 0x11, 0xd0, 0xc0, 0x00,
+ 0x30, 0x0f, 0xc0, 0xd2, 0x13, 0x40, 0x0b, 0xcf, 0xd4, 0x06, 0x61, 0x00,
+ 0xe1, 0xf3, 0x00, 0x1e,
+ 0x25, 0xf5, 0xb0, 0x00, 0x11, 0xf0, 0xbc, 0x00, 0x46, 0xf0, 0xce, 0x0d,
+ 0x1f, 0x0e, 0xce, 0x05,
+ 0x14, 0x00, 0xdb, 0x0d, 0xf0, 0xf2, 0x01, 0xf0, 0xdd, 0x2f, 0x64, 0xb1,
+ 0xdd, 0x0d, 0x2f, 0x00,
+ 0xc0, 0xd1, 0x43, 0x14, 0xc3, 0x04, 0x01, 0xf9, 0x0b, 0x50, 0x01, 0xf0,
+ 0x1d, 0x2c, 0xee, 0xe0,
+ 0x70, 0x50, 0xde, 0x0d, 0x2c, 0x3d, 0xff, 0x03, 0x76, 0x00, 0xfe, 0x0f,
+ 0x4f, 0x1e, 0x00, 0x01,
+ 0x21, 0x1d, 0x18, 0x1c, 0x70, 0x06, 0xd1, 0x00, 0x7f, 0x10, 0xf2, 0xd3,
+ 0x12, 0x30, 0x0d, 0x0f,
+ 0xf5, 0xf6, 0x01, 0x20, 0x3f, 0xe1, 0xa2, 0x00, 0x3e, 0x5f, 0xd5, 0xd4,
+ 0x21, 0x3f, 0x00, 0x24,
+ 0x12, 0xef, 0x0d, 0x7f, 0xf2, 0xe3, 0x44, 0x12, 0xf0, 0xe0, 0x00, 0x22,
+ 0xe5, 0xc2, 0x42, 0x33,
+ 0xc2, 0xe0, 0xf1, 0xe5, 0x12, 0x60, 0xcb, 0xdf, 0x15, 0x21, 0xcf, 0xf1,
+ 0xe7, 0xd1, 0x2f, 0x5e,
+ 0xb0, 0xe2, 0x02, 0x00, 0x2d, 0xde, 0xff, 0x10, 0x10, 0x0c, 0x0e, 0xa5,
+ 0x03, 0x71, 0x20, 0xe3,
+ 0xe5, 0x01, 0x4f, 0x30, 0x07, 0x04, 0xf1, 0x00, 0x2f, 0x5e, 0x5f, 0x0e,
+ 0xe0, 0x27, 0x33, 0x32,
+ 0xf1, 0xf0, 0x0f, 0xef, 0x6e, 0x19, 0xbd, 0xf0, 0x20, 0x0f, 0xd0, 0x21,
+ 0x0e, 0x9b, 0x0f, 0x1f,
+ 0x0c, 0xad, 0x01, 0x36, 0x01, 0xcf, 0xfb, 0x0e, 0xf1, 0x32, 0x10, 0xd0,
+ 0xf0, 0x00, 0xfd, 0x19,
+ 0x1e, 0x0f, 0x3f, 0xe0, 0xbf, 0x3f, 0x3b, 0xab, 0xee, 0x20, 0x73, 0x01,
+ 0xde, 0x0c, 0x20, 0xe1,
+ 0xf1, 0x51, 0x02, 0xbf, 0x0c, 0x21, 0x04, 0xf5, 0x03, 0x00, 0xfb, 0x1c,
+ 0x30, 0x91, 0x01, 0x30,
+ 0x10, 0xc0, 0xf0, 0x3f, 0x1b, 0xcd, 0x0d, 0x01, 0xd5, 0x41, 0x1f, 0xbe,
+ 0x0f, 0x20, 0x00, 0xe1,
+ 0x22, 0x12, 0x00, 0x50, 0x01, 0xcc, 0x19, 0x70, 0x14, 0xf2, 0x00, 0x1b,
+ 0x0d, 0x01, 0x44, 0x31,
+ 0xdf, 0x00, 0x62, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x1d, 0xfd, 0xf6,
+ 0xe2, 0xb0, 0x14, 0x77,
+ 0xf2, 0xcf, 0x0e, 0x41, 0x05, 0xd1, 0x0f, 0x1f, 0x2f, 0x30, 0xe6, 0xc4,
+ 0x21, 0x20, 0xe0, 0x22,
+ 0x56, 0x02, 0xc1, 0x00, 0x20, 0xff, 0xef, 0x71, 0x31, 0xcf, 0xde, 0x10,
+ 0x25, 0x43, 0x30, 0xad,
+ 0xee, 0x01, 0x4f, 0x0c, 0xf2, 0xc7, 0x02, 0x10, 0x10, 0xe0, 0xaa, 0x0d,
+ 0x31, 0xf4, 0xb0, 0x0f,
+ 0x2e, 0xed, 0xfd, 0x00, 0x04, 0x02, 0xfe, 0x08, 0xfe, 0x00, 0x01, 0x00,
+ 0xe1, 0x03, 0x13, 0x40,
+ 0xda, 0x8c, 0x00, 0x22, 0x11, 0xed, 0xfb, 0x3f, 0x1f, 0xef, 0x0f, 0x00,
+ 0xc0, 0x7f, 0x6d, 0xea,
+ 0xed, 0x1e, 0x10, 0x02, 0x14, 0x01, 0xec, 0x0d, 0x41, 0xe3, 0xb0, 0x2f,
+ 0x5b, 0xeb, 0xef, 0x02,
+ 0x24, 0xf1, 0x1f, 0x2e, 0xce, 0xf0, 0x52, 0x00, 0xd0, 0x02, 0x25, 0x01,
+ 0xff, 0x1d, 0x0e, 0x9e,
+ 0x0f, 0x23, 0x10, 0xd8, 0xcc, 0x0e, 0x2e, 0x40, 0xf0, 0xcf, 0x0e, 0x10,
+ 0x6d, 0x08, 0xdd, 0xf0,
+ 0x20, 0x4f, 0xf0, 0xd2, 0x20, 0x0d, 0xef, 0x07, 0x63, 0x00, 0xd0, 0xf4,
+ 0x03, 0xf0, 0x0f, 0x2f,
+ 0x95, 0xf6, 0x41, 0x00, 0xc0, 0xe1, 0x30, 0x0e, 0x1f, 0x01, 0xd0, 0xde,
+ 0x10, 0x47, 0x25, 0x00,
+ 0xe0, 0x00, 0x20, 0x04, 0x75, 0x10, 0xf0, 0x00, 0x50, 0xff, 0xf2, 0x46,
+ 0xf0, 0xcf, 0x30, 0x45,
+ 0xd2, 0xe0, 0x1f, 0x01, 0xe3, 0x30, 0x50, 0xc2, 0xf0, 0x1e, 0x2f, 0x03,
+ 0x04, 0x71, 0x0f, 0xd0,
+ 0x06, 0x45, 0x02, 0xd0, 0x2f, 0x70, 0x27, 0xa5, 0x00, 0x0e, 0x5e, 0x00,
+ 0xe2, 0x11, 0x1e, 0xff,
+ 0x03, 0x11, 0x1c, 0x0f, 0x01, 0xd1, 0xd0, 0x62, 0x36, 0xe1, 0xce, 0x0d,
+ 0x01, 0x33, 0x10, 0xcb,
+ 0xcd, 0x02, 0xf4, 0x00, 0x0e, 0xf0, 0xa3, 0xe0, 0x4b, 0x3c, 0x9e, 0xe0,
+ 0x11, 0x20, 0x00, 0xe1,
+ 0xef, 0xff, 0x03, 0x27, 0x00, 0xcc, 0x0e, 0x00, 0xf3, 0xc4, 0x02, 0x02,
+ 0x04, 0x01, 0xcc, 0x0a,
+ 0x00, 0xe0, 0x10, 0x7f, 0x21, 0xa4, 0xf2, 0x1f, 0x3b, 0x0d, 0x00, 0x11,
+ 0xdf, 0xdc, 0x3e, 0x30,
+ 0x41, 0x22, 0xd1, 0xbb, 0xfc, 0x3e, 0x70, 0x23, 0xa4, 0x00, 0x2c, 0x2e,
+ 0x00, 0xf0, 0xff, 0x1c,
+ 0x7c, 0x00, 0x10, 0x0e, 0xff, 0x01, 0x15, 0x40, 0x0a, 0xdd, 0x00, 0x22,
+ 0x4f, 0x0c, 0x0e, 0x0e,
+ 0xeb, 0x0c, 0x7f, 0x31, 0xd2, 0xd0, 0x0e, 0x20, 0x30, 0x2e, 0xbf, 0xcf,
+ 0x0a, 0x20, 0x07, 0xa2,
+ 0x00, 0x4e, 0xec, 0xcd, 0x00, 0x31, 0xf0, 0xc0, 0x31, 0x0f, 0xd8, 0x3c,
+ 0x0e, 0x90, 0x00, 0x51,
+ 0x00, 0xe0, 0xf0, 0x01, 0x10, 0x50, 0xf1, 0xd3, 0x00, 0x22, 0x37, 0xf2,
+ 0xff, 0xff, 0x00, 0x10,
+ 0x40, 0xf0, 0x00, 0x20, 0x2f, 0x71, 0x26, 0xe2, 0x00, 0x5d, 0x17, 0xf6,
+ 0x10, 0x3f, 0xcf, 0xe2,
+ 0x40, 0x7d, 0xf0, 0xc4, 0x12, 0x20, 0x12, 0x01, 0x0f, 0xec, 0x0c, 0x10,
+ 0x03, 0x05, 0x22, 0xf4,
+ 0x81, 0x0e, 0x3c, 0xf1, 0xb3, 0x12, 0x20, 0x0f, 0x0e, 0x0e, 0xe1, 0x04,
+ 0x5b, 0xf8, 0xdf, 0x00,
+ 0x70, 0xf0, 0xd0, 0x11, 0x20, 0x0e, 0x0d, 0xde, 0xff, 0x0f, 0x64, 0xf7,
+ 0xc1, 0x10, 0x1d, 0x0e,
+ 0xe0, 0xff, 0x2e, 0xff, 0xc1, 0x24, 0x12, 0x00, 0xc8, 0xed, 0x21, 0x24,
+ 0xd0, 0xae, 0x00, 0x03,
+ 0x04, 0x01, 0xee, 0xfe, 0x01, 0xe0, 0x0e, 0xd0, 0xf0, 0x3d, 0x9a, 0x9e,
+ 0x10, 0x42, 0xe0, 0xd0,
+ 0x16, 0x12, 0x0b, 0xdc, 0xd0, 0x43, 0x42, 0xd0, 0xc0, 0x00, 0x12, 0x11,
+ 0x01, 0xf3, 0x10, 0xf8,
+ 0xbf, 0x25, 0x04, 0x01, 0x60, 0xf0, 0xc0, 0x00, 0x71, 0x03, 0xe1, 0x1e,
+ 0x1b, 0x0e, 0x00, 0x42,
+ 0xf2, 0xd0, 0x5e, 0x0e, 0xfd, 0xe0, 0x26, 0x21, 0xff, 0x0c, 0x0f, 0x06,
+ 0x33, 0x00, 0x3f, 0x71,
+ 0x04, 0xb1, 0x0e, 0x5a, 0x10, 0xd4, 0x02, 0x30, 0xe0, 0x00, 0x50, 0x0e,
+ 0xcd, 0x10, 0x30, 0x0e,
+ 0xc0, 0x07, 0x22, 0xf1, 0x03, 0x11, 0xdd, 0xbd, 0x00, 0x33, 0x52, 0xf0,
+ 0xcc, 0xf0, 0x37, 0x40,
+ 0x0c, 0xec, 0x0f, 0x1f, 0xef, 0x21, 0x64, 0x00, 0xca, 0x2d, 0x20, 0xd2,
+ 0x01, 0x53, 0x02, 0xdd,
+ 0x0b, 0x4f, 0x01, 0xe3, 0x34, 0x33, 0xd0, 0xfb, 0x1d, 0x5f, 0x00, 0x01,
+ 0xf1, 0x03, 0x13, 0x30,
+ 0x0e, 0xc3, 0xc7, 0x30, 0x7c, 0x0e, 0xc2, 0x03, 0x30, 0x20, 0xd2, 0xff,
+ 0x4a, 0xef, 0xc0, 0x5e,
+ 0x0b, 0xce, 0x10, 0x0f, 0xfe, 0xe1, 0x33, 0xfb, 0x9b, 0x00, 0x20, 0xed,
+ 0xff, 0xf0, 0x0d, 0x0d,
+ 0xf0, 0xff, 0x05, 0x06, 0xe0, 0x8e, 0x0e, 0x2e, 0x0e, 0xb2, 0x17, 0x03,
+ 0x00, 0xfc, 0xfb, 0x3f,
+ 0x32, 0x03, 0x80, 0xe0, 0x20, 0x13, 0xf1, 0xfe, 0xfc, 0xc0, 0xf3, 0x36,
+ 0x12, 0x80, 0x0e, 0x1e,
+ 0x10, 0xf0, 0xf3, 0x01, 0x0b, 0x1a, 0x0e, 0xfe, 0xd0, 0x12, 0x20, 0xed,
+ 0xe2, 0x07, 0x40, 0xfe,
+ 0x0e, 0xa1, 0xe2, 0x51, 0x00, 0x9e, 0x0c, 0x4e, 0x0e, 0xef, 0xcf, 0x19,
+ 0x2b, 0x2f, 0x00, 0xd0,
+ 0xdf, 0x20, 0x47, 0x02, 0xe0, 0x0d, 0xff, 0xf0, 0xd2, 0x13, 0x42, 0xe0,
+ 0xde, 0xcd, 0xef, 0x71,
+ 0x71, 0xe0, 0xe3, 0x21, 0x3a, 0xee, 0xe0, 0x2e, 0x5b, 0x01, 0xe3, 0x0d,
+ 0x29, 0x20, 0x14, 0x21,
+ 0x00, 0xf0, 0x10, 0x5f, 0x0d, 0xd0, 0x77, 0x02, 0xf0, 0x0f, 0x30, 0x1e,
+ 0xdc, 0xf0, 0x74, 0x21,
+ 0xce, 0x01, 0x16, 0x00, 0x1e, 0x1e, 0x00, 0xe1, 0x2d, 0x0c, 0x81, 0xf7,
+ 0x61, 0x0f, 0xef, 0xf2,
+ 0x03, 0x0e, 0x0f, 0x26, 0xe1, 0xbf, 0x20, 0x12, 0x00, 0xde, 0x00, 0x3f,
+ 0x19, 0xde, 0x01, 0x22,
+ 0xe0, 0xdd, 0x5d, 0x33, 0xe7, 0xe2, 0xd0, 0xf0, 0x7d, 0x6d, 0x01, 0xc4,
+ 0xf0, 0x2f, 0x70, 0xf0,
+ 0xef, 0x1e, 0x1b, 0x0e, 0x02, 0x06, 0xd3, 0x20, 0x6e, 0xf1, 0xe6, 0x01,
+ 0x20, 0x1e, 0x0f, 0xe3,
+ 0xf5, 0x41, 0x32, 0xe1, 0xef, 0x2e, 0x20, 0x02, 0xf1, 0x43, 0x47, 0xd4,
+ 0x03, 0x70, 0x2c, 0xd0,
+ 0xf3, 0x10, 0x4f, 0x02, 0xe5, 0xe1, 0x01, 0x42, 0x01, 0xae, 0xfd, 0x34,
+ 0x37, 0xd0, 0xdf, 0xd0,
+ 0x0e, 0x7b, 0x10, 0xc2, 0xd1, 0x00, 0x50, 0x1f, 0xdd, 0xec, 0x0d, 0x10,
+ 0x42, 0x03, 0xe0, 0x0c,
+ 0x1c, 0xe0, 0x04, 0x42, 0x0f, 0xce, 0xed, 0x2c, 0x2f, 0xde, 0xb9, 0xe0,
+ 0x12, 0x40, 0xcc, 0xef,
+ 0xf0, 0xbf, 0x11, 0x71, 0xea, 0xda, 0x0f, 0x11, 0x02, 0x00, 0x00, 0xbe,
+ 0x0d, 0xf3, 0x07, 0x30,
+ 0xee, 0xd0, 0x00, 0x5d, 0x0a, 0xcf, 0xf0, 0x10, 0x2f, 0xef, 0x1e, 0x3d,
+ 0x80, 0x02, 0x10, 0x2a,
+ 0xfd, 0x01, 0x04, 0x10, 0x2d, 0x0e, 0xd3, 0x04, 0x71, 0x10, 0xd0, 0xf0,
+ 0x3e, 0x01, 0x87, 0x01,
+ 0x40, 0x01, 0xfe, 0x09, 0x0e, 0x22, 0x44, 0x01, 0xfe, 0x00, 0x13, 0x40,
+ 0x2c, 0x00, 0x25, 0x01,
+ 0xc0, 0x4f, 0x73, 0x07, 0xf0, 0xde, 0x30, 0x61, 0x00, 0xd0, 0x10, 0x20,
+ 0x00, 0x0f, 0x2d, 0x00,
+ 0xd7, 0xe2, 0xe0, 0x40, 0x12, 0xe3, 0x84, 0xe1, 0x0f, 0x2f, 0x02, 0xc3,
+ 0xd4, 0x02, 0x4d, 0x08,
+ 0x9d, 0x00, 0x02, 0x30, 0xdd, 0xd1, 0x47, 0x20, 0xba, 0x0e, 0x20, 0x01,
+ 0xe2, 0x01, 0x1f, 0x0f,
+ 0xe1, 0xff, 0xe9, 0x2c, 0x5f, 0xd1, 0xc1, 0x0e, 0x7e, 0x0f, 0xe0, 0x0f,
+ 0x1a, 0xee, 0x00, 0x51,
+ 0x02, 0xf1, 0xef, 0x0c, 0x3e, 0x40, 0xfe, 0xdb, 0x0e, 0x0f, 0x60, 0x03,
+ 0xf3, 0x0f, 0xf9, 0x0d,
+ 0x32, 0x35, 0xe0, 0xbf, 0x10, 0x62, 0x00, 0xd0, 0x12, 0x52, 0xff, 0xdd,
+ 0x41, 0x04, 0xe0, 0xb0,
+ 0x37, 0x33, 0xe0, 0xd0, 0x21, 0x03, 0x0f, 0x49, 0x00, 0xa1, 0xf1, 0x10,
+ 0x3d, 0xf9, 0xde, 0xf0,
+ 0x02, 0x02, 0x30, 0xed, 0x80, 0x34, 0x11, 0xde, 0xd0, 0x44, 0x10, 0xef,
+ 0xf3, 0x16, 0x01, 0x00,
+ 0xfe, 0xae, 0x1f, 0x71, 0xf2, 0xd1, 0x1e, 0x3e, 0xe5, 0xf6, 0x20, 0xeb,
+ 0x0d, 0x30, 0xe1, 0xd2,
+ 0x74, 0x22, 0xe1, 0x00, 0x2d, 0x2b, 0x10, 0x33, 0x02, 0xb1, 0x20, 0x3c,
+ 0xfc, 0xd2, 0xf5, 0xb0,
+ 0x10, 0x70, 0x10, 0xb0, 0xf0, 0x30, 0x11, 0xf3, 0xe7, 0x43, 0x12, 0xde,
+ 0x1d, 0x52, 0xe4, 0xf0,
+ 0x50, 0xfe, 0xfc, 0x12, 0x07, 0x04, 0x14, 0x41, 0xe0, 0x00, 0x10, 0x10,
+ 0xe0, 0x33, 0x75, 0xf2,
+ 0xb1, 0x10, 0x2e, 0x0d, 0x0f, 0xf3, 0xf6, 0x12, 0x02, 0x13, 0x11, 0x9d,
+ 0xed, 0x3e, 0x2f, 0xc1,
+ 0xde, 0x0c, 0x2d, 0xe8, 0xe1, 0x07, 0xb0, 0x0c, 0x2e, 0xc1, 0xc1, 0x20,
+ 0x30, 0x90, 0x00, 0x2f,
+ 0x0d, 0xaf, 0x02, 0x22, 0x10, 0xd0, 0x01, 0x0c, 0xf8, 0xff, 0x30, 0xf1,
+ 0xa1, 0x01, 0x20, 0xf0,
+ 0xe0, 0x1c, 0xeb, 0xcf, 0x2f, 0x4d, 0xef, 0xc3, 0x04, 0x20, 0x10, 0x0f,
+ 0xec, 0xeb, 0x2f, 0x3f,
+ 0xa0, 0x03, 0x43, 0x0f, 0xfc, 0x2c, 0x3b, 0xfc, 0x0e, 0x70, 0x10, 0xcf,
+ 0x50, 0x21, 0xff, 0xfe,
+ 0x1f, 0x1f, 0x3e, 0x3d, 0xd4, 0x07, 0x42, 0x2e, 0x0b, 0x00, 0x24, 0x03,
+ 0xd2, 0x70, 0x4e, 0xde,
+ 0x0f, 0x30, 0x03, 0xd6, 0x72, 0x3e, 0xcc, 0xf0, 0x14, 0x22, 0x0f, 0xf0,
+ 0xf1, 0xff, 0x0b, 0x0e,
+ 0x00, 0xd0, 0x01, 0x00, 0xdb, 0x4b, 0x00, 0x84, 0xf3, 0x50, 0x0c, 0xfe,
+ 0x01, 0x01, 0xff, 0x11,
+ 0x54, 0xd3, 0xd1, 0x20, 0x7d, 0x0b, 0xc0, 0x03, 0x11, 0x2d, 0xee, 0xf3,
+ 0x04, 0x00, 0x0f, 0x10,
+ 0xfd, 0xd9, 0x01, 0x33, 0x00, 0xad, 0x0e, 0xf6, 0x05, 0x12, 0xb0, 0xf0,
+ 0x00, 0xe0, 0x33, 0x56,
+ 0x90, 0x00, 0x13, 0x21, 0xde, 0xfd, 0x30, 0xe5, 0xb4, 0x52, 0x0f, 0xea,
+ 0xe0, 0x14, 0x14, 0x11,
+ 0x00, 0xff, 0xde, 0x40, 0x32, 0x01, 0xe3, 0x15, 0x31, 0x2f, 0x1e, 0x2e,
+ 0xe0, 0xc5, 0x63, 0x20,
+ 0xde, 0xff, 0x4f, 0x0f, 0xcf, 0x0c, 0xfb, 0x20, 0xf0, 0x9e, 0x0e, 0x3e,
+ 0xff, 0xa0, 0xf9, 0x2e,
+ 0x42, 0xd3, 0xcf, 0x0c, 0x3d, 0xff, 0xe0, 0xff, 0x0d, 0x3c, 0xed, 0xad,
+ 0x0e, 0xee, 0x2e, 0x61,
+ 0x0f, 0xd8, 0xc8, 0x10, 0x31, 0x10, 0xbf, 0xf0, 0x01, 0x0f, 0x0b, 0xee,
+ 0xe1, 0x02, 0x00, 0xcf,
+ 0xfe, 0x1d, 0x0e, 0xd0, 0xc0, 0xe0, 0x0c, 0x0a, 0x00, 0x32, 0xcd, 0xad,
+ 0x04, 0x03, 0xdf, 0x7a,
+ 0x1d, 0xbf, 0x00, 0x20, 0xfd, 0xdc, 0x3e, 0x3e, 0xbe, 0xf0, 0x02, 0x22,
+ 0xd0, 0x09, 0x6c, 0xe0,
+ 0xd4, 0x02, 0x21, 0x10, 0xee, 0x1e, 0x61, 0xe1, 0xd0, 0x5f, 0x2f, 0xf2,
+ 0xe3, 0x2b, 0x2b, 0x00,
+ 0x05, 0x01, 0x0f, 0x20, 0x33, 0xf4, 0x10, 0x0f, 0xd2, 0x73, 0x3e, 0xce,
+ 0x01, 0x3f, 0x3e, 0xf0,
+ 0x01, 0x67, 0x06, 0xf0, 0xf0, 0x11, 0x74, 0x25, 0x03, 0xd2, 0x10, 0x30,
+ 0x10, 0x23, 0x02, 0xaf,
+ 0xf6, 0x27, 0x42, 0xf0, 0xf0, 0x40, 0x00, 0xb3, 0x46, 0x41, 0x02, 0x02,
+ 0x4d, 0x00, 0x6c, 0x00,
+ 0xd5, 0xff, 0x05, 0xff, 0xa4, 0x00, 0x57, 0xff, 0x32, 0x66, 0x12, 0x00,
+ 0x11, 0x13, 0x00, 0xfe,
+ 0x2f, 0x44, 0x05, 0xd1, 0x00, 0x30, 0x4f, 0x1f, 0xe0, 0xbe, 0x1e, 0x51,
+ 0x02, 0xf0, 0x20, 0x61,
+ 0x10, 0x0f, 0x00, 0x02, 0x44, 0x33, 0x00, 0x00, 0x27, 0xf3, 0xc0, 0x1d,
+ 0x60, 0x21, 0x18, 0x0d,
+ 0xf0, 0xd3, 0xc6, 0x02, 0x2f, 0x3f, 0x30, 0x4c, 0x2a, 0x00, 0xd3, 0x03,
+ 0x10, 0x8d, 0xe0, 0x40,
+ 0x3a, 0xee, 0xd3, 0x04, 0xf0, 0xbe, 0xdd, 0x0e, 0x2f, 0x00, 0x20, 0x0e,
+ 0x8e, 0xed, 0x0b, 0x1d,
+ 0xfd, 0xd0, 0xe1, 0x0f, 0x0b, 0xfd, 0xcd, 0xce, 0xe2, 0x01, 0x09, 0x1d,
+ 0x2f, 0xbf, 0xbd, 0xfd,
+ 0x0f, 0xc6, 0xd4, 0x00, 0x2b, 0x2e, 0xf0, 0xd0, 0xe0, 0x10, 0x1f, 0x00,
+ 0xbf, 0xbe, 0xc0, 0xf1,
+ 0x3f, 0x2f, 0xff, 0xe3, 0xc7, 0xa0, 0xfd, 0x00, 0x21, 0x4d, 0x2b, 0x0f,
+ 0xe3, 0xe4, 0xdf, 0xbd,
+ 0xf0, 0x11, 0x1c, 0xec, 0xe1, 0x05, 0x03, 0xf6, 0x20, 0xfa, 0x8c, 0x00,
+ 0x51, 0x12, 0xf1, 0x00,
+ 0x00, 0xe0, 0x00, 0x2f, 0xfe, 0xed, 0x22, 0xf7, 0xb3, 0x1e, 0x2b, 0x20,
+ 0x13, 0xe1, 0x0e, 0x3f,
+ 0x52, 0x22, 0x0e, 0xcc, 0xfe, 0x10, 0x43, 0x73, 0x4d, 0x1d, 0x00, 0xe9,
+ 0xdc, 0xf0, 0x51, 0x3f,
+ 0x2d, 0x00, 0x01, 0x01, 0x00, 0x03, 0x07, 0xe2, 0x10, 0x7e, 0x1f, 0xd0,
+ 0x06, 0x14, 0xf1, 0x00,
+ 0x4e, 0x1f, 0xe1, 0x83, 0xd0, 0xf0, 0x1d, 0x0b, 0xe0, 0x00, 0x4d, 0x0f,
+ 0x07, 0x63, 0x3e, 0x0b,
+ 0xf0, 0x00, 0x00, 0x12, 0x31, 0x20, 0x60, 0x40, 0x1c, 0xfc, 0xff, 0x00,
+ 0xef, 0xdf, 0x40, 0x7e,
+ 0x1a, 0x00, 0xf3, 0xe0, 0x0d, 0x1f, 0x03, 0x02, 0x21, 0x30, 0x41, 0x44,
+ 0x4a, 0x28, 0x00, 0x01,
+ 0x00, 0x1e, 0x01, 0xd3, 0x02, 0x60, 0x2e, 0x03, 0xb7, 0xc0, 0xef, 0x13,
+ 0x75, 0x20, 0x00, 0xd0,
+ 0xd0, 0xe0, 0x01, 0x62, 0x30, 0x0f, 0xe5, 0xf4, 0x00, 0xff, 0x01, 0x34,
+ 0x00, 0xfe, 0x00, 0xe1,
+ 0x81, 0xc2, 0xe1, 0xf0, 0x0f, 0x2e, 0x30, 0x04, 0xe3, 0x0a, 0xdd, 0x86,
+ 0x02, 0x0c, 0x0c, 0x00,
+ 0x05, 0x02, 0x00, 0x0f, 0xef, 0xce, 0xd0, 0x05, 0x21, 0x20, 0xff, 0x80,
+ 0xe1, 0x10, 0x0d, 0xda,
+ 0xcf, 0xf0, 0x10, 0x2f, 0x0c, 0xad, 0xc0, 0xf4, 0x00, 0x1a, 0x3c, 0x2f,
+ 0xe1, 0xc0, 0x0d, 0xec,
+ 0x8f, 0x00, 0x30, 0x22, 0x05, 0xf1, 0x00, 0x0f, 0x2f, 0x4f, 0x10, 0xf7,
+ 0xe4, 0x41, 0x61, 0x01,
+ 0xf0, 0x0f, 0x2d, 0x0e, 0x0f, 0xdf, 0xd2, 0xf3, 0xff, 0x1e, 0x7e, 0x1a,
+ 0xf0, 0xf2, 0x0e, 0x08,
+ 0x0f, 0x70, 0x31, 0x21, 0x02, 0x00, 0xfd, 0x00, 0x62, 0x10, 0xf0, 0x0f,
+ 0x0d, 0xee, 0xb7, 0xf4,
+ 0x20, 0x5c, 0x2e, 0x00, 0x0e, 0xfc, 0xff, 0x05, 0x17, 0xf1, 0xf0, 0x01,
+ 0xf3, 0xef, 0x0a, 0xe0,
+ 0x82, 0xf2, 0x31, 0x30, 0xd1, 0xe1, 0x7e, 0x2b, 0xe0, 0xd1, 0x11, 0x10,
+ 0xef, 0x0e, 0x5c, 0x1d,
+ 0x0f, 0x03, 0xa4, 0xc0, 0x0d, 0x0c, 0x00, 0x02, 0xf2, 0xc2, 0xd0, 0x09,
+ 0x1c, 0xfe, 0xb0, 0xf1,
+ 0x20, 0x0e, 0xf0, 0x03, 0x02, 0xe9, 0xec, 0x00, 0x51, 0x61, 0x12, 0xf0,
+ 0xec, 0x1e, 0x30, 0x10,
+ 0x22, 0x3f, 0x0e, 0xf6, 0x01, 0x3d, 0x5b, 0x0e, 0x1f, 0x73, 0x07, 0xf2,
+ 0x10, 0x4d, 0x0c, 0xf0,
+ 0x53, 0x45, 0x00, 0xee, 0xfd, 0x10, 0x32, 0x12, 0xe1, 0xa0, 0xe0, 0x2e,
+ 0x3a, 0xfd, 0xc0, 0xd1,
+ 0xd2, 0x03, 0x3f, 0xf8, 0xcd, 0x01, 0x33, 0x41, 0xe1, 0x80, 0xdc, 0x0e,
+ 0x21, 0x11, 0xe1, 0xf2,
+ 0x42, 0x42, 0x02, 0xbd, 0xd9, 0x00, 0x24, 0x02, 0xe2, 0x92, 0xd0, 0x0e,
+ 0x2f, 0x1f, 0xf8, 0xec,
+ 0xcc, 0xbf, 0x00, 0x10, 0x00, 0xe0, 0x1f, 0x5d, 0x10, 0xf4, 0xf3, 0x00,
+ 0xff, 0x00, 0x0f, 0xea,
+ 0x20, 0x73, 0x21, 0xf0, 0xde, 0xf0, 0x05, 0xe2, 0xb0, 0x0f, 0x30, 0x21,
+ 0x13, 0x37, 0xf7, 0xc1,
+ 0x00, 0x0f, 0x40, 0x40, 0x11, 0x02, 0x03, 0x71, 0x2d, 0x0e, 0x04, 0x45,
+ 0x22, 0x02, 0x0f, 0x2b,
+ 0x30, 0x21, 0x10, 0x0f, 0x32, 0x72, 0x4f, 0xee, 0xb0, 0x0f, 0x2f, 0x13,
+ 0xf0, 0x0f, 0x17, 0xf6,
+ 0x21, 0x72, 0x02, 0xf1, 0xff, 0xe0, 0xe3, 0x05, 0x00, 0xd0, 0x00, 0x2f,
+ 0xcc, 0xc1, 0x03, 0xcf,
+ 0xdb, 0x5b, 0x6f, 0x13, 0x05, 0x01, 0x3e, 0x3d, 0xf0, 0xd6, 0x02, 0x20,
+ 0x1d, 0xd0, 0xc3, 0x30,
+ 0x7e, 0x1e, 0xf2, 0xc0, 0xfa, 0x1e, 0x00, 0x00, 0x2e, 0x01, 0xe3, 0xd0,
+ 0xfd, 0x08, 0x0e, 0xf2,
+ 0x42, 0x70, 0x23, 0xf5, 0x80, 0xec, 0x0b, 0x0f, 0xe1, 0xd2, 0xf1, 0xe0,
+ 0xff, 0x0e, 0x1e, 0x3e,
+ 0x3e, 0x3f, 0x0f, 0x81, 0xe1, 0x2e, 0x1a, 0xee, 0xc0, 0xed, 0xee, 0x04,
+ 0x31, 0x0f, 0x00, 0x51,
+ 0x28, 0xdd, 0xa0, 0x03, 0x00, 0x1d, 0x50, 0x32, 0x0b, 0xe9, 0xef, 0x11,
+ 0x41, 0x22, 0x22, 0x50,
+ 0x4d, 0x09, 0xef, 0xe1, 0x02, 0x20, 0x30, 0x32, 0xf1, 0xcf, 0x1f, 0x1f,
+ 0xcb, 0x1f, 0x72, 0x33,
+ 0x14, 0x33, 0x20, 0xef, 0xd0, 0x2d, 0x3b, 0x42, 0x45, 0x20, 0x0f, 0x10,
+ 0x70, 0x2f, 0x01, 0x05,
+ 0xc0, 0xdf, 0x0f, 0x3f, 0x3f, 0x21, 0x13, 0xd3, 0x80, 0xfc, 0x3c, 0x22,
+ 0xf7, 0xf0, 0x0e, 0xf0,
+ 0x04, 0x53, 0x30, 0x0f, 0xe1, 0xe0, 0x0c, 0x2f, 0x12, 0xd4, 0x80, 0xdc,
+ 0x3e, 0x2f, 0xfc, 0xff,
+ 0xb7, 0xb4, 0xf0, 0x1e, 0x1d, 0x1e, 0x01, 0x14, 0x21, 0x0e, 0xfc, 0x1d,
+ 0x11, 0x05, 0x00, 0xeb,
+ 0x7f, 0x70, 0x51, 0x36, 0x12, 0x0f, 0xfe, 0xe0, 0xd1, 0x20, 0x40, 0xf0,
+ 0xf1, 0x10, 0x0a, 0xcc,
+ 0xe0, 0x01, 0xf0, 0xd1, 0x12, 0x40, 0xe0, 0x9f, 0xed, 0xfc, 0x0f, 0x04,
+ 0xf5, 0xe2, 0xe1, 0xf0,
+ 0x0d, 0x0c, 0x0f, 0xbf, 0xbe, 0xf2, 0x05, 0xd1, 0xb0, 0x0b, 0x0c, 0xa0,
+ 0xb1, 0xf1, 0x00, 0x02,
+ 0x02, 0x01, 0x0e, 0x0a, 0x0f, 0xf2, 0xf2, 0xf0, 0xdf, 0xce, 0x0c, 0x1e,
+ 0xf0, 0xd0, 0xd2, 0xa0,
+ 0xef, 0xe3, 0xdd, 0x08, 0x10, 0xb2, 0xc2, 0xe3, 0xf0, 0xbb, 0xed, 0x01,
+ 0xf4, 0xe1, 0x10, 0x4e,
+ 0x0a, 0xb0, 0xd3, 0xc0, 0xed, 0x39, 0x4e, 0x00, 0xd2, 0xd1, 0xd1, 0xd0,
+ 0x00, 0x32, 0x21, 0x2f,
+ 0x5b, 0x00, 0x94, 0x04, 0x32, 0x01, 0xff, 0x0c, 0x2f, 0x21, 0x01, 0x5f,
+ 0x5d, 0x2e, 0x20, 0x10,
+ 0x0d, 0x1d, 0x4c, 0x33, 0x27, 0x44, 0x3d, 0x1c, 0x70, 0x42, 0x01, 0x05,
+ 0x34, 0x41, 0x1f, 0x00,
+ 0x02, 0x22, 0x11, 0xf1, 0x02, 0x20, 0x0e, 0x1f, 0x4e, 0x11, 0x07, 0xc2,
+ 0xe1, 0x43, 0x15, 0xc3,
+ 0xe2, 0x02, 0xd3, 0xf1, 0x71, 0x07, 0xe7, 0x01, 0x00, 0xde, 0xa0, 0xf0,
+ 0x00, 0x04, 0x05, 0xd1,
+ 0xa0, 0xf0, 0x00, 0x00, 0x30, 0x10, 0xb1, 0xb1, 0xf0, 0x2e, 0x2c, 0x0f,
+ 0x02, 0x01, 0xed, 0xfe,
+ 0x00, 0xc3, 0xe7, 0x01, 0x09, 0xfd, 0x20, 0x61, 0x02, 0xb4, 0xb1, 0xfe,
+ 0x1c, 0x2e, 0x20, 0x01,
+ 0xdf, 0xe0, 0x13, 0x00, 0xf9, 0xfe, 0x00, 0x20, 0x00, 0x06, 0x31, 0x0f,
+ 0xff, 0x2e, 0x2d, 0x8f,
+ 0xd0, 0x6f, 0x50, 0x10, 0xfe, 0xfe, 0x0f, 0x20, 0x50, 0x4e, 0x1c, 0x00,
+ 0xf0, 0x08, 0x0a, 0x10,
+ 0x52, 0x20, 0x0f, 0x00, 0xfe, 0xd9, 0x00, 0x11, 0xe0, 0xfd, 0x3f, 0x31,
+ 0x0f, 0xdd, 0xdd, 0x30,
+ 0x11, 0xa0, 0xa0, 0xf8, 0x3e, 0x70, 0x22, 0x12, 0x0e, 0x08, 0xdf, 0xc1,
+ 0x10, 0x40, 0x11, 0x0f,
+ 0xfc, 0x00, 0x03, 0xf0, 0xdd, 0x28, 0x6f, 0x02, 0xf1, 0x2e, 0x2d, 0x0e,
+ 0xee, 0x01, 0x04, 0x80,
+ 0xee, 0x22, 0x35, 0x00, 0x0e, 0x2e, 0xfc, 0x8e, 0xe2, 0x05, 0x11, 0x10,
+ 0x20, 0x2f, 0xea, 0x9b,
+ 0x0f, 0x11, 0x00, 0xee, 0x10, 0x50, 0x40, 0x21, 0xf1, 0xdd, 0xeb, 0x10,
+ 0x42, 0x32, 0x20, 0xff,
+ 0xe4, 0x04, 0x3f, 0x4c, 0x0f, 0xbf, 0x0f, 0x5f, 0x11, 0xf3, 0x0f, 0x1b,
+ 0x00, 0x20, 0x6f, 0x0c,
+ 0xf0, 0xf5, 0x20, 0x2e, 0xef, 0xc4, 0xf4, 0x31, 0x5e, 0xfd, 0xb4, 0xf7,
+ 0x23, 0x10, 0xee, 0xc0,
+ 0xf0, 0x1e, 0x10, 0x03, 0xf2, 0x0f, 0xe1, 0xd7, 0x03, 0x0e, 0xbd, 0xf5,
+ 0x35, 0x11, 0x00, 0xf0,
+ 0xd0, 0xa2, 0xd3, 0x01, 0xf1, 0xe0, 0x30, 0x40, 0xc3, 0xb2, 0xf2, 0x04,
+ 0x30, 0x30, 0xa6, 0x91,
+ 0xf0, 0x12, 0x10, 0x09, 0x1f, 0x00, 0xef, 0xff, 0x30, 0x3f, 0x01, 0xf3,
+ 0x1d, 0x18, 0xfd, 0x0e,
+ 0xd0, 0xaf, 0x0f, 0x00, 0x80, 0xd0, 0x0e, 0x28, 0x0d, 0x0f, 0xe0, 0x00,
+ 0x20, 0x50, 0x3f, 0x1e,
+ 0xee, 0xc0, 0xff, 0x2c, 0x4d, 0x10, 0x0f, 0x28, 0x3e, 0x00, 0x00, 0x51,
+ 0x12, 0xc0, 0xbb, 0xfb,
+ 0x00, 0x22, 0x52, 0x20, 0x1c, 0x1c, 0x02, 0x15, 0x41, 0x10, 0x00, 0x50,
+ 0x20, 0xef, 0xb0, 0x0e,
+ 0x38, 0x0e, 0xf0, 0x02, 0xe0, 0xc0, 0xde, 0x0b, 0x0f, 0x02, 0x23, 0x01,
+ 0xb1, 0xc0, 0xce, 0xf5,
+ 0x35, 0x10, 0xee, 0xb0, 0xf2, 0xf2, 0xe2, 0x02, 0xf0, 0x82, 0xe5, 0x12,
+ 0x2f, 0x0b, 0xdf, 0xd1,
+ 0x02, 0x00, 0xe0, 0xd1, 0x40, 0x50, 0x00, 0xe1, 0xd0, 0xc0, 0x07, 0x12,
+ 0x0e, 0x0f, 0xf4, 0xa2,
+ 0xd0, 0x02, 0x0f, 0xba, 0xc1, 0x06, 0x41, 0x21, 0x01, 0xf0, 0xde, 0xce,
+ 0x00, 0x53, 0x15, 0x01,
+ 0x11, 0x12, 0x02, 0x02, 0x14, 0xf2, 0xd0, 0x01, 0x30, 0xe0, 0xe3, 0x67,
+ 0x30, 0x0e, 0xf1, 0x11,
+ 0x3f, 0xfe, 0x44, 0x77, 0x12, 0x1f, 0x1e, 0xff, 0x20, 0x70, 0x2f, 0xfe,
+ 0xfa, 0x0e, 0x00, 0x1f,
+ 0x7c, 0x3d, 0x00, 0x00, 0x1e, 0x1f, 0x10, 0x13, 0x10, 0x2c, 0x3d, 0x3a,
+ 0x1c, 0xac, 0xee, 0x36,
+ 0x44, 0x00, 0xec, 0xee, 0x11, 0xf0, 0xae, 0x00, 0x20, 0x00, 0xef, 0xef,
+ 0x00, 0x10, 0xe0, 0x80,
+ 0xdd, 0x08, 0xfd, 0xd0, 0x01, 0x0f, 0xcc, 0xb0, 0xe4, 0xd0, 0xed, 0x3d,
+ 0x7b, 0x1c, 0xf0, 0xd0,
+ 0xcc, 0xfc, 0x10, 0x22, 0x4e, 0x30, 0x02, 0xee, 0xea, 0x10, 0x70, 0x1f,
+ 0xf1, 0xf3, 0x01, 0x0e,
+ 0x00, 0x16, 0x20, 0x0e, 0xef, 0xc0, 0xd1, 0xf4, 0x02, 0x20, 0x50, 0x12,
+ 0xb2, 0xef, 0x4b, 0x3c,
+ 0xee, 0xa5, 0x16, 0x50, 0x1e, 0x00, 0xf1, 0x01, 0x21, 0x20, 0x02, 0x04,
+ 0x00, 0xd0, 0x05, 0x62,
+ 0x1e, 0xfe, 0x04, 0x23, 0x10, 0xe3, 0x05, 0x50, 0x1e, 0x12, 0x13, 0xee,
+ 0x9b, 0xd0, 0xf3, 0x10,
+ 0x50, 0x24, 0x02, 0xd0, 0xdf, 0xf0, 0xe0, 0xc6, 0xe4, 0xf1, 0xe0, 0x01,
+ 0x14, 0xe1, 0x80, 0xfd,
+ 0x0c, 0xd3, 0xd7, 0x11, 0x00, 0xe0, 0xce, 0x8d, 0xde, 0x0e, 0x20, 0x25,
+ 0x04, 0x00, 0x0a, 0xfe,
+ 0xc1, 0x02, 0x40, 0x40, 0x00, 0x01, 0x00, 0xfe, 0x01, 0x31, 0x30, 0x00,
+ 0x0d, 0x6f, 0x41, 0x0c,
+ 0xfa, 0x0f, 0x20, 0x10, 0x2f, 0xcc, 0xce, 0x77, 0x22, 0x0e, 0xed, 0xd0,
+ 0xe0, 0x00, 0x31, 0x30,
+ 0xfe, 0xcf, 0xd1, 0xd0, 0xc9, 0xfc, 0x0d, 0x3d, 0x30, 0x04, 0xb2, 0x0d,
+ 0x68, 0x2e, 0x0f, 0x0f,
+ 0x20, 0x20, 0xf0, 0x01, 0x42, 0x40, 0x10, 0x03, 0xe1, 0xa0, 0x0d, 0x5b,
+ 0x30, 0x17, 0x02, 0xf0,
+ 0x0c, 0xfb, 0xe0, 0x22, 0x60, 0x0f, 0xe0, 0xe0, 0xf0, 0xff, 0xff, 0x4f,
+ 0x5d, 0x1c, 0xe0, 0xc3,
+ 0x03, 0x21, 0x0e, 0x0c, 0xed, 0xcd, 0xf8, 0xfc, 0xf0, 0x24, 0x50, 0x0e,
+ 0x2d, 0x70, 0x02, 0xe2,
+ 0xf2, 0x15, 0x23, 0x30, 0x50, 0x04, 0xe3, 0x01, 0x00, 0xaf, 0xf2, 0x24,
+ 0x15, 0x04, 0xe1, 0xee,
+ 0x0c, 0x00, 0x10, 0x30, 0x05, 0xd3, 0xc0, 0x0e, 0x70, 0x50, 0x1d, 0x0a,
+ 0x0e, 0x00, 0xf3, 0xf6,
+ 0x11, 0x30, 0x4e, 0x1b, 0xf0, 0x03, 0x02, 0x00, 0xe0, 0xc0, 0xdf, 0x00,
+ 0x40, 0x1d, 0x0c, 0xdc,
+ 0xcd, 0x21, 0x74, 0x00, 0xdd, 0x00, 0x01, 0xec, 0x8e, 0xf5, 0x07, 0x12,
+ 0x20, 0x3e, 0x3e, 0x01,
+ 0xb4, 0x01, 0x70, 0x12, 0xf1, 0xef, 0x0a, 0x0d, 0x00, 0x20, 0x20, 0x00,
+ 0xe2, 0xe0, 0x0d, 0x0b,
+ 0x0e, 0x0f, 0x40, 0x44, 0xc4, 0xb0, 0x0e, 0x10, 0xff, 0xfe, 0x12, 0xe5,
+ 0x80, 0xc0, 0x10, 0x2c,
+ 0x0f, 0x01, 0x30, 0x1f, 0xee, 0x0a, 0x6f, 0x22, 0xe5, 0xc5, 0x02, 0x30,
+ 0x40, 0x20, 0x20, 0x11,
+ 0x06, 0x02, 0xd0, 0xbf, 0x0f, 0x30, 0x51, 0x22, 0x10, 0x0e, 0x0d, 0x20,
+ 0x27, 0xf2, 0xc0, 0x0d,
+ 0x4d, 0x20, 0x00, 0x1d, 0xde, 0x87, 0x04, 0x40, 0x2c, 0xed, 0xd2, 0xf5,
+ 0xf0, 0x1f, 0x3f, 0x00,
+ 0x0f, 0x2f, 0xf0, 0xb1, 0x02, 0x30, 0x2c, 0xdf, 0xa7, 0x02, 0x0f, 0xdd,
+ 0xf0, 0x02, 0xf0, 0x11,
+ 0x55, 0x01, 0xbc, 0xfc, 0x3f, 0x40, 0x30, 0x22, 0xc3, 0xa0, 0x0b, 0x1d,
+ 0x00, 0x01, 0x0e, 0x0b,
+ 0xfd, 0xdf, 0x15, 0x53, 0x10, 0x0c, 0xfe, 0xf0, 0x21, 0x02, 0xc0, 0x0e,
+ 0x12, 0xb5, 0xb0, 0x0e,
+ 0x1e, 0xe1, 0xf4, 0x03, 0xe1, 0x9f, 0xef, 0x1e, 0x0e, 0xce, 0xd8, 0x0e,
+ 0x02, 0xf7, 0x02, 0x00,
+ 0x90, 0xc0, 0x1f, 0x4e, 0x12, 0x07, 0x01, 0x00, 0xee, 0xff, 0x20, 0x40,
+ 0x20, 0xf0, 0x9f, 0xec,
+ 0x1d, 0x10, 0x01, 0x01, 0x00, 0xec, 0xd0, 0xe7, 0x01, 0x00, 0x21, 0x32,
+ 0xd2, 0xa5, 0x02, 0x0f,
+ 0xde, 0xc0, 0x00, 0x0c, 0x00, 0x04, 0xe3, 0x0f, 0x7c, 0x00, 0xc1, 0x20,
+ 0x64, 0x03, 0xef, 0xfb,
+ 0x50, 0x46, 0x13, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xf1, 0xf1, 0xf0,
+ 0x0c, 0x7b, 0x2f, 0xe1,
+ 0xc1, 0xf0, 0x00, 0x00, 0x2b, 0x3e, 0x11, 0x23, 0x53, 0x15, 0x01, 0x50,
+ 0x2f, 0xec, 0xc0, 0x03,
+ 0x0f, 0x0d, 0x32, 0x41, 0xed, 0x84, 0xf5, 0x1d, 0x1b, 0x13, 0x16, 0x00,
+ 0xff, 0xe0, 0xe0, 0x00,
+ 0x5e, 0x1f, 0xf2, 0xef, 0x09, 0x2e, 0x40, 0x00, 0xf0, 0x20, 0x0e, 0x0e,
+ 0x40, 0x20, 0xcf, 0x80,
+ 0xf0, 0x08, 0x5e, 0x30, 0x00, 0xfd, 0x00, 0x05, 0xd0, 0xfe, 0x2f, 0x41,
+ 0x44, 0x24, 0xe2, 0xa0,
+ 0x0f, 0x33, 0x26, 0xd0, 0xb0, 0x10, 0x30, 0x0f, 0xfe, 0xff, 0xe0, 0xe4,
+ 0x04, 0x20, 0x0f, 0xd3,
+ 0x02, 0x68, 0x1d, 0x00, 0x01, 0xd0, 0xbd, 0x2f, 0x4f, 0x00, 0xf3, 0x01,
+ 0x09, 0xfd, 0x00, 0x43,
+ 0x13, 0x00, 0xbd, 0xbd, 0x1d, 0x5f, 0x11, 0xf4, 0xd1, 0xed, 0x10, 0x57,
+ 0x00, 0xd0, 0xe2, 0x00,
+ 0x0b, 0x2c, 0x30, 0x01, 0xdd, 0xea, 0xd0, 0xa1, 0xff, 0x4e, 0x5e, 0x14,
+ 0xf5, 0xe0, 0xef, 0x11,
+ 0x50, 0x3f, 0x16, 0xf3, 0xcf, 0xbf, 0xf3, 0x31, 0x3d, 0x01, 0xf6, 0xf4,
+ 0xe1, 0xcf, 0x0e, 0x21,
+ 0x11, 0xf0, 0x03, 0x32, 0x0b, 0xbd, 0xdd, 0x0b, 0x40, 0x12, 0xff, 0xfb,
+ 0x0e, 0xd0, 0xef, 0x4f,
+ 0x31, 0x04, 0x16, 0x22, 0xbf, 0x9c, 0x0e, 0x50, 0x24, 0x01, 0x0f, 0x10,
+ 0x01, 0xdf, 0xce, 0x0f,
+ 0x3e, 0x6e, 0x03, 0xe7, 0xf0, 0x2a, 0x1d, 0xf0, 0xd2, 0x30, 0x70, 0x02,
+ 0xe0, 0xec, 0x0c, 0x00,
+ 0x03, 0xf4, 0xf1, 0x00, 0xfe, 0xdd, 0xe0, 0x21, 0x33, 0xa3, 0x90, 0xfd,
+ 0x08, 0xfe, 0xe3, 0xe6,
+ 0xf1, 0x00, 0x10, 0x20, 0x00, 0xb2, 0xb3, 0xf3, 0x00, 0xff, 0xf1, 0xd1,
+ 0xcf, 0x0e, 0x1e, 0x00,
+ 0xd7, 0xd2, 0x3d, 0x3e, 0xe0, 0xfd, 0x0d, 0x41, 0x76, 0x11, 0xe0, 0xdf,
+ 0x1c, 0x0a, 0xcf, 0x32,
+ 0x50, 0x0e, 0x01, 0xd5, 0x90, 0x0e, 0x4f, 0x20, 0x01, 0xe0, 0x2c, 0x4c,
+ 0x0e, 0x00, 0x01, 0xc1,
+ 0xb4, 0x05, 0x5f, 0x28, 0x1f, 0x02, 0xe3, 0x01, 0x20, 0x00, 0x02, 0x02,
+ 0x2a, 0x00, 0x50, 0x00,
+ 0x76, 0x00, 0x3a, 0xfd, 0xaa, 0xff, 0xf4, 0xfe, 0x6b, 0x22, 0x02, 0xd1,
+ 0xb3, 0xf1, 0x38, 0x4e,
+ 0x22, 0x13, 0x00, 0xe0, 0x01, 0x72, 0x10, 0xf1, 0x35, 0x60, 0x09, 0xde,
+ 0xe2, 0x01, 0x0f, 0x00,
+ 0xf0, 0xff, 0x0b, 0xfd, 0x0e, 0x6f, 0x20, 0xf2, 0x92, 0xee, 0x0a, 0x0c,
+ 0x1e, 0x51, 0x03, 0xd0,
+ 0xfe, 0x02, 0xe2, 0xf0, 0x60, 0x3d, 0x1a, 0x00, 0x04, 0x22, 0xf0, 0xdf,
+ 0x2e, 0x21, 0xf4, 0x12,
+ 0x61, 0x10, 0xe0, 0xf2, 0x23, 0x1e, 0xfb, 0xee, 0x03, 0x07, 0xf2, 0x9f,
+ 0x0d, 0x50, 0x06, 0xe2,
+ 0x00, 0x01, 0xd3, 0x02, 0x7f, 0x4e, 0x03, 0xa7, 0xe0, 0x1d, 0x2e, 0x01,
+ 0x00, 0x00, 0xf2, 0x00,
+ 0x0e, 0x10, 0x00, 0x0a, 0xfe, 0x22, 0x73, 0x1d, 0x08, 0x10, 0x14, 0x01,
+ 0x00, 0x1f, 0x50, 0x1f,
+ 0xdd, 0xe0, 0x23, 0x02, 0xef, 0x2b, 0x5e, 0x00, 0x12, 0x71, 0x1a, 0xdd,
+ 0xe3, 0x17, 0x10, 0xe0,
+ 0xd0, 0xff, 0x2f, 0x51, 0x22, 0xe2, 0xa3, 0xe2, 0xe0, 0x0e, 0x50, 0x12,
+ 0xe0, 0xe0, 0x07, 0xd2,
+ 0xae, 0x0b, 0x0f, 0x00, 0x13, 0xf5, 0xc0, 0x00, 0x31, 0x0e, 0xda, 0xef,
+ 0x23, 0x74, 0x00, 0xce,
+ 0xd0, 0x02, 0x10, 0x0f, 0x0e, 0x01, 0x04, 0xff, 0x08, 0x7e, 0x00, 0xc3,
+ 0xf2, 0x3f, 0x2b, 0xe0,
+ 0xf3, 0x03, 0xe0, 0xed, 0x0b, 0xf0, 0x11, 0x71, 0x00, 0xff, 0x6d, 0x2e,
+ 0xfd, 0x0c, 0x3d, 0x1f,
+ 0x03, 0x15, 0x30, 0x09, 0x2e, 0x70, 0x60, 0x00, 0x02, 0x10, 0x28, 0x0e,
+ 0x01, 0x41, 0x40, 0x10,
+ 0x00, 0x10, 0x31, 0x31, 0x30, 0x30, 0xfb, 0xcf, 0x03, 0x73, 0x20, 0x00,
+ 0xe0, 0xec, 0x0e, 0x21,
+ 0x2f, 0x1d, 0x04, 0x07, 0x01, 0xef, 0xcd, 0xc0, 0xe2, 0x2f, 0x1b, 0x0d,
+ 0x20, 0x35, 0xb3, 0xa0,
+ 0x0f, 0x0e, 0xde, 0xcc, 0x30, 0x22, 0x93, 0xd2, 0x01, 0x0c, 0x00, 0x07,
+ 0x02, 0xf0, 0xc0, 0xe2,
+ 0xf0, 0xed, 0x1e, 0x72, 0x22, 0x0f, 0xdf, 0xdf, 0xff, 0x00, 0xf0, 0xf9,
+ 0x0e, 0xf0, 0xa0, 0xd0,
+ 0xd4, 0xe5, 0xf2, 0xc1, 0xe0, 0x3f, 0x22, 0xa7, 0xc3, 0xe0, 0xde, 0xcf,
+ 0xe2, 0x17, 0x23, 0x00,
+ 0xdd, 0xde, 0xee, 0x9d, 0xec, 0x00, 0x04, 0xe3, 0xe2, 0xe0, 0x3d, 0x7a,
+ 0x1f, 0xe2, 0xe4, 0x00,
+ 0x1e, 0x00, 0x01, 0x2f, 0x5d, 0x21, 0xf0, 0xfa, 0x2f, 0x40, 0x70, 0x01,
+ 0xc1, 0xe0, 0x0f, 0x0f,
+ 0xf0, 0x10, 0x2f, 0x02, 0xb7, 0xc5, 0x10, 0x5c, 0x1e, 0x01, 0x04, 0x02,
+ 0x00, 0x0e, 0x3b, 0x2e,
+ 0x12, 0x03, 0xb0, 0xdd, 0x1f, 0x12, 0x1f, 0x4d, 0x2e, 0x1f, 0xe4, 0x84,
+ 0xd0, 0x0e, 0x40, 0x23,
+ 0x01, 0xef, 0xee, 0xea, 0x1e, 0x41, 0x03, 0xae, 0xf2, 0x07, 0xfe, 0xeb,
+ 0xf2, 0xf3, 0xce, 0xcf,
+ 0xe0, 0xe0, 0x01, 0x5e, 0x1d, 0xd7, 0xb4, 0x00, 0x4f, 0x1e, 0x01, 0x02,
+ 0x0d, 0x0c, 0x31, 0x40,
+ 0x0d, 0xe4, 0x01, 0x18, 0x0c, 0x00, 0xff, 0xf0, 0x52, 0x41, 0x00, 0xd0,
+ 0xfd, 0x10, 0x37, 0x33,
+ 0x01, 0x4e, 0x4d, 0x0e, 0x11, 0x77, 0x41, 0x0f, 0xd0, 0xe0, 0x10, 0x6d,
+ 0x3a, 0x3f, 0x11, 0x0e,
+ 0xfb, 0xc0, 0xc2, 0x10, 0x7f, 0x10, 0xf2, 0x0f, 0x1c, 0x00, 0xf5, 0x23,
+ 0x2f, 0x0c, 0x13, 0x25,
+ 0xf0, 0xa0, 0xe1, 0x1e, 0x1d, 0x01, 0x02, 0x12, 0x14, 0x01, 0xad, 0xd0,
+ 0x04, 0x3d, 0x09, 0xf0,
+ 0x02, 0xd0, 0x8e, 0xfe, 0x21, 0x04, 0xe0, 0xde, 0xc0, 0xf0, 0x0c, 0x01,
+ 0x17, 0x42, 0x10, 0xaf,
+ 0xc0, 0xe1, 0x01, 0x40, 0x30, 0x00, 0xc2, 0xe4, 0x20, 0x4b, 0x1e, 0x00,
+ 0xf3, 0xf6, 0xc4, 0xe0,
+ 0x3e, 0x1e, 0xb0, 0xf4, 0x24, 0x10, 0x0e, 0x2e, 0x30, 0x00, 0xcd, 0xce,
+ 0x00, 0x2d, 0x28, 0x6e,
+ 0x22, 0xe1, 0xdd, 0x0f, 0x03, 0x01, 0x00, 0x1f, 0x08, 0xb0, 0xe3, 0x40,
+ 0x4b, 0x0e, 0x00, 0x01,
+ 0xde, 0xbb, 0x1f, 0x40, 0x20, 0x00, 0x00, 0xdd, 0x0e, 0x73, 0x26, 0x01,
+ 0xf0, 0xff, 0x2f, 0x20,
+ 0x1f, 0x13, 0x13, 0x3c, 0x2a, 0xb1, 0x83, 0xf0, 0x0d, 0x0e, 0x02, 0x15,
+ 0xe0, 0x0f, 0x6f, 0x2c,
+ 0x00, 0xe6, 0xe1, 0x0f, 0x01, 0x14, 0xf0, 0xef, 0x10, 0xf1, 0xb0, 0x00,
+ 0x12, 0x00, 0xdf, 0xbe,
+ 0xeb, 0xee, 0xc0, 0xe0, 0x0d, 0xf9, 0xe0, 0x03, 0xe3, 0xe0, 0xe0, 0xa4,
+ 0xe2, 0x11, 0x52, 0x14,
+ 0x10, 0x68, 0x2e, 0xd0, 0xb2, 0xe1, 0x00, 0x01, 0x23, 0x40, 0x1f, 0xe2,
+ 0xe2, 0x0e, 0x1b, 0x31,
+ 0x12, 0xfb, 0x0d, 0x00, 0xe0, 0xb0, 0xf0, 0x2d, 0x7d, 0x31, 0x17, 0x01,
+ 0x1e, 0x39, 0x10, 0x35,
+ 0x11, 0xdf, 0x2f, 0x70, 0x60, 0x20, 0xf0, 0xd1, 0x03, 0x01, 0xf0, 0xf0,
+ 0x54, 0x43, 0x01, 0xb1,
+ 0xe2, 0x03, 0x1f, 0x2c, 0x1e, 0xf5, 0xf6, 0x02, 0x21, 0x70, 0x10, 0x0f,
+ 0x00, 0x15, 0xe1, 0xbe,
+ 0xfd, 0x10, 0x33, 0x22, 0x03, 0xd0, 0xcf, 0x02, 0x25, 0x00, 0xbd, 0xd0,
+ 0xf4, 0x11, 0x2f, 0x16,
+ 0xf4, 0xc1, 0x01, 0x40, 0xf0, 0xce, 0x0b, 0x0d, 0xcc, 0x10, 0x21, 0xda,
+ 0xfd, 0x41, 0x33, 0xf1,
+ 0xbf, 0xee, 0x30, 0x73, 0x16, 0xe3, 0xb0, 0xff, 0x10, 0x14, 0x15, 0x30,
+ 0x0e, 0xc0, 0x15, 0x62,
+ 0x1f, 0xfd, 0x0f, 0x31, 0x21, 0xe3, 0xf2, 0x3d, 0x58, 0x3e, 0x30, 0x01,
+ 0xc1, 0xf0, 0x30, 0x72,
+ 0x20, 0x08, 0x0f, 0x21, 0x31, 0x0f, 0xee, 0x21, 0x31, 0x0f, 0x20, 0x3d,
+ 0xca, 0xde, 0x5e, 0x3c,
+ 0xfe, 0x00, 0x30, 0xf2, 0x91, 0xcc, 0xff, 0x35, 0x41, 0x1f, 0xf0, 0xcc,
+ 0xee, 0x01, 0x00, 0xe0,
+ 0xc0, 0x0d, 0x1c, 0xee, 0xab, 0xef, 0xe0, 0x0e, 0x2d, 0x1d, 0xf0, 0x05,
+ 0x00, 0xed, 0x20, 0xe5,
+ 0x8f, 0x18, 0x0f, 0x91, 0x02, 0x11, 0x00, 0xf0, 0x01, 0x00, 0xe0, 0xc0,
+ 0xde, 0x0d, 0x10, 0xf1,
+ 0xb1, 0xf7, 0x24, 0x0e, 0xed, 0x03, 0x33, 0x3f, 0x01, 0xe6, 0xf4, 0x10,
+ 0xfc, 0x5e, 0x73, 0x05,
+ 0xf0, 0x00, 0x20, 0x2f, 0x30, 0x21, 0x20, 0x4f, 0x1d, 0xba, 0xef, 0x52,
+ 0x43, 0x02, 0xf0, 0xeb,
+ 0xec, 0x10, 0x43, 0x22, 0x00, 0x2f, 0x30, 0x01, 0xf0, 0xfb, 0xcc, 0x21,
+ 0x75, 0x20, 0x2e, 0x4e,
+ 0xee, 0x91, 0xf5, 0x10, 0x1e, 0x0d, 0xff, 0xf2, 0x17, 0x12, 0xc0, 0xde,
+ 0x00, 0x22, 0x31, 0x1f,
+ 0xde, 0xcc, 0x0d, 0x32, 0x26, 0x00, 0xfd, 0xaf, 0xd3, 0xf0, 0x1b, 0x2e,
+ 0x00, 0xd0, 0x0e, 0x01,
+ 0x82, 0x0e, 0x59, 0x30, 0xf2, 0x91, 0xe0, 0x00, 0x14, 0x03, 0xff, 0x3c,
+ 0x40, 0x04, 0xc0, 0xed,
+ 0x0d, 0x1e, 0x20, 0x20, 0x1f, 0xea, 0xef, 0x02, 0xe4, 0xa1, 0xff, 0x1e,
+ 0x11, 0x03, 0x00, 0x0f,
+ 0xb4, 0xb7, 0x01, 0x20, 0x1f, 0xfc, 0xf0, 0x05, 0x11, 0x3e, 0x3c, 0x2f,
+ 0x10, 0x23, 0x13, 0xdf,
+ 0x0d, 0x3f, 0xc0, 0xb4, 0x04, 0x50, 0x20, 0xf2, 0xe0, 0x20, 0x44, 0x5e,
+ 0x49, 0x00, 0xc2, 0xf1,
+ 0x1f, 0xee, 0xbf, 0xf2, 0x05, 0xf0, 0xdb, 0x3c, 0x71, 0x15, 0xf1, 0xf0,
+ 0xef, 0xdf, 0x01, 0x71,
+ 0x20, 0x00, 0xf2, 0xf1, 0xfe, 0xef, 0x05, 0x42, 0x1f, 0xd0, 0x90, 0xdc,
+ 0x1e, 0x53, 0x03, 0xf5,
+ 0xf5, 0xe0, 0x0e, 0x20, 0x05, 0xf2, 0x00, 0x20, 0x20, 0x20, 0x30, 0x13,
+ 0x06, 0x12, 0x11, 0x02,
+ 0x41, 0x7f, 0x7c, 0x1e, 0x02, 0xe5, 0xf1, 0x3f, 0x4b, 0x0d, 0xd0, 0xf0,
+ 0x00, 0xc3, 0xb0, 0x0c,
+ 0x4f, 0x23, 0x02, 0xec, 0xdd, 0xf2, 0x2e, 0x2b, 0xf0, 0xdf, 0xdb, 0x2e,
+ 0x3f, 0x00, 0x10, 0x10,
+ 0xb2, 0xe2, 0x4c, 0x4d, 0x00, 0xfe, 0xda, 0xf0, 0x70, 0x30, 0x01, 0x0f,
+ 0x18, 0x70, 0x31, 0x00,
+ 0xd0, 0x00, 0x41, 0x40, 0x2b, 0x0c, 0xce, 0xf0, 0x41, 0x00, 0xc0, 0xd0,
+ 0xfd, 0x1c, 0x20, 0x21,
+ 0x10, 0x19, 0xdb, 0x80, 0xe3, 0x01, 0x0f, 0x0f, 0x20, 0x00, 0xbd, 0xec,
+ 0x11, 0x13, 0xee, 0xde,
+ 0x01, 0x01, 0xc0, 0x91, 0x0f, 0x3f, 0x17, 0xf2, 0x0b, 0x2e, 0xf2, 0xe5,
+ 0xe2, 0xd0, 0xbe, 0xe0,
+ 0x24, 0x31, 0xd0, 0x80, 0x00, 0x14, 0xd4, 0xc1, 0x0d, 0x1c, 0xff, 0xee,
+ 0x00, 0x02, 0xff, 0xd0,
+ 0x3e, 0x78, 0x00, 0xe6, 0xf1, 0x3f, 0x3f, 0x21, 0x41, 0x30, 0xf0, 0x8e,
+ 0xf0, 0x00, 0x1d, 0x00,
+ 0xe3, 0xef, 0x19, 0x1e, 0x10, 0x41, 0x40, 0x0d, 0xe1, 0xc7, 0x00, 0x2f,
+ 0x2e, 0x00, 0x35, 0x52,
+ 0x10, 0x0e, 0x1f, 0x11, 0xf0, 0x40, 0x63, 0xe0, 0x99, 0xfe, 0x21, 0x1f,
+ 0x09, 0x1f, 0x02, 0xf1,
+ 0x00, 0x3e, 0x3f, 0x10, 0xf1, 0xf2, 0x32, 0x61, 0x30, 0x2f, 0x04, 0xe1,
+ 0xfc, 0xfe, 0x55, 0x67,
+ 0x02, 0xe0, 0x0f, 0x0f, 0xef, 0x00, 0x32, 0x02, 0xdf, 0x2e, 0x40, 0xe5,
+ 0xd2, 0x2e, 0x6c, 0x10,
+ 0x01, 0x02, 0x15, 0xf2, 0xae, 0xec, 0x0f, 0x21, 0x10, 0x2e, 0x1d, 0xaf,
+ 0xbe, 0xfd, 0x00, 0x00,
+ 0xe3, 0xe2, 0xeb, 0x0c, 0x21, 0xf0, 0x88, 0xef, 0x12, 0x31, 0x1e, 0x0c,
+ 0x00, 0xd4, 0xd2, 0x00,
+ 0x2e, 0x4c, 0x2e, 0xe1, 0xd2, 0x0f, 0x0c, 0xff, 0xe2, 0x90, 0x0d, 0x2e,
+ 0xe4, 0xe7, 0x12, 0x81,
+ 0xd0, 0x0e, 0xfb, 0x01, 0x50, 0x1b, 0xe0, 0x05, 0x31, 0x20, 0x00, 0x00,
+ 0x0e, 0x2f, 0x5f, 0x0f,
+ 0xc5, 0xf2, 0x4e, 0x4d, 0x03, 0x06, 0xe0, 0xef, 0x10, 0x60, 0x10, 0xe0,
+ 0xb3, 0x03, 0x20, 0x10,
+ 0x07, 0xf3, 0xf0, 0xde, 0xd0, 0x20, 0x60, 0x00, 0xe7, 0x04, 0x11, 0xcf,
+ 0xbd, 0x00, 0x23, 0x12,
+ 0xf0, 0xff, 0xf0, 0xc6, 0xc1, 0x1f, 0x4e, 0x0e, 0xc3, 0xe5, 0x1f, 0x1d,
+ 0xdf, 0xdf, 0x21, 0x07,
+ 0xd2, 0x00, 0x1f, 0x00, 0x10, 0xdd, 0x88, 0xf0, 0x11, 0x10, 0x10, 0x00,
+ 0xb0, 0xf2, 0x15, 0x01,
+ 0xef, 0x30, 0x71, 0x10, 0xe0, 0xd4, 0x02, 0x00, 0x00, 0x20, 0x0e, 0xbd,
+ 0xf1, 0x01, 0x0e, 0x50,
+ 0x50, 0x1d, 0x0b, 0x18, 0x2e, 0x03, 0x03, 0x3c, 0x19, 0xf0, 0x11, 0x70,
+ 0x20, 0x00, 0xdf, 0x20,
+ 0x60, 0x0d, 0xeb, 0x00, 0x01, 0x00, 0x20, 0xef, 0xde, 0x30, 0x61, 0x22,
+ 0x32, 0x10, 0x36, 0x63,
+ 0x1e, 0x1c, 0x31, 0x13, 0x0f, 0x04, 0x07, 0x00, 0x4f, 0x2f, 0x0f, 0x8d,
+ 0xee, 0x23, 0x27, 0x00,
+ 0xe0, 0xd0, 0xe1, 0x01, 0x20, 0x1d, 0x01, 0x44, 0x10, 0xcf, 0xf4, 0x02,
+ 0xdb, 0x2f, 0x73, 0x1f,
+ 0x0c, 0xf2, 0xb5, 0xf0, 0x3f, 0x20, 0x00, 0x00, 0xd0, 0xc5, 0x01, 0xdc,
+ 0xae, 0x03, 0x03, 0xf0,
+ 0x00, 0xe0, 0xad, 0xf1, 0x06, 0x00, 0x1f, 0x0d, 0x18, 0x50, 0x02, 0xd1,
+ 0xef, 0xef, 0xde, 0x1f,
+ 0x4e, 0x1c, 0xff, 0xa1, 0xe0, 0x0e, 0x0b, 0x0e, 0x40, 0x30, 0x1f, 0xf0,
+ 0xc1, 0x3c, 0x7a, 0x3e,
+ 0x0f, 0x00, 0xd2, 0x01, 0x60, 0x30, 0x2d, 0x1d, 0x04, 0xc1, 0xeb, 0x0e,
+ 0x00, 0x24, 0x45, 0x01,
+ 0xad, 0xcd, 0xf2, 0x21, 0x4f, 0x1c, 0xfe, 0xd4, 0xd3, 0xdf, 0x00, 0x30,
+ 0x6b, 0x1f, 0xf4, 0xe1,
+ 0xfe, 0x0e, 0xe0, 0x01, 0x32, 0x02, 0x03, 0x1d, 0x08, 0x00, 0xf4, 0xd1,
+ 0x5e, 0x70, 0x15, 0xf2,
+ 0xd0, 0xdf, 0xed, 0x0f, 0x12, 0x01, 0x00, 0xf0, 0x8d, 0xdb, 0x0e, 0x2e,
+ 0x0e, 0xed, 0x0e, 0x40,
+ 0x02, 0xa1, 0xe9, 0x3d, 0x50, 0x02, 0x02, 0x02, 0x10, 0x1e, 0x0c, 0xcd,
+ 0x0f, 0x68, 0x00, 0xd6,
+ 0xc1, 0x0d, 0x0f, 0xf1, 0xf0, 0xf0, 0xe3, 0xe4, 0x02, 0x00, 0xcf, 0xf1,
+ 0x17, 0x41, 0x4f, 0x10,
+ 0x10, 0x5f, 0x00, 0xdf, 0x22, 0x57, 0xf3, 0x00, 0x3c, 0x0e, 0xd2, 0xd2,
+ 0x51, 0x42, 0xf0, 0xed,
+ 0x1e, 0x01, 0xb0, 0x2e, 0x7e, 0x11, 0xf7, 0xe2, 0x12, 0x46, 0x21, 0x00,
+ 0xe3, 0xe0, 0x0e, 0x13,
+ 0x00, 0xe9, 0xef, 0x22, 0x43, 0x03, 0x04, 0x01, 0xd0, 0xd2, 0xc2, 0xd1,
+ 0xb3, 0xd4, 0xe6, 0x63,
+ 0x71, 0x1f, 0xff, 0xef, 0x01, 0x07, 0x02, 0x00, 0x10, 0x30, 0x14, 0x02,
+ 0x00, 0xe0, 0x0f, 0x30,
+ 0x1f, 0xb1, 0xe7, 0xf1, 0xcd, 0xfb, 0x4e, 0x00, 0xe2, 0x02, 0xf0, 0x90,
+ 0xef, 0x5f, 0x5c, 0x0c,
+ 0xee, 0xee, 0x11, 0x13, 0x0d, 0x0c, 0x12, 0x00, 0xe8, 0xf0, 0x01, 0x4e,
+ 0x2c, 0x31, 0x34, 0xe1,
+ 0xf0, 0x20, 0xde, 0x9c, 0xb0, 0xc1, 0x00, 0x32, 0x40, 0x18, 0xdd, 0x8c,
+ 0x0e, 0x11, 0x13, 0x0f,
+ 0xfa, 0xfd, 0x0f, 0x1f, 0x0f, 0xe1, 0x02, 0x0d, 0x09, 0x00, 0x01, 0x2f,
+ 0x7e, 0x30, 0x03, 0xf5,
+ 0xe0, 0x0c, 0x00, 0x02, 0x7f, 0x1e, 0xd0, 0xb3, 0x03, 0x10, 0x0f, 0x0f,
+ 0x0e, 0x2d, 0x0f, 0xd7,
+ 0xe4, 0x10, 0x1d, 0x0e, 0x03, 0x07, 0x02, 0x3f, 0x7d, 0x30, 0xb1, 0xb0,
+ 0x00, 0x2e, 0x0f, 0x02,
+ 0x0e, 0x08, 0x0f, 0xc0, 0xb0, 0x00, 0x5f, 0x1e, 0x00, 0xef, 0xc8, 0xff,
+ 0x13, 0x33, 0x2f, 0x0f,
+ 0xe1, 0xf0, 0xec, 0x0d, 0x30, 0x03, 0xa2, 0x0e, 0x4b, 0x0e, 0xe0, 0xc0,
+ 0xed, 0x1c, 0x1e, 0x00,
+ 0x0e, 0x4e, 0x4f, 0x10, 0xf1, 0xd6, 0x05, 0x00, 0x2e, 0x7f, 0x51, 0x07,
+ 0xe2, 0x00, 0x10, 0x20,
+ 0x2d, 0x0b, 0xf0, 0x11, 0x00, 0xe3, 0x12, 0x2d, 0x9b, 0xce, 0x10, 0x32,
+ 0x12, 0x35, 0x43, 0xf0,
+ 0xcc, 0x0e, 0x00, 0xe0, 0x03, 0x34, 0x20, 0x20, 0xe2, 0x81, 0xfc, 0x1b,
+ 0x0f, 0xe1, 0x02, 0x20,
+ 0x22, 0x06, 0xb1, 0xbf, 0xf1, 0xf3, 0xff, 0x00, 0x07, 0x30, 0x2d, 0xbf,
+ 0xe6, 0x13, 0x11, 0xf0,
+ 0xe0, 0x00, 0x1e, 0xed, 0xe0, 0x05, 0x22, 0x20, 0x10, 0xb0, 0xa0, 0xfe,
+ 0x3d, 0x44, 0x16, 0x30,
+ 0xf0, 0x80, 0xd0, 0xe0, 0xf5, 0x01, 0x1f, 0x51, 0x14, 0xc0, 0xeb, 0x0e,
+ 0x20, 0x10, 0x00, 0x10,
+ 0xf1, 0xc2, 0x00, 0x0c, 0xba, 0xc0, 0xf0, 0x0f, 0x22, 0x47, 0x00, 0xfe,
+ 0xcf, 0xb1, 0xf0, 0x30,
+ 0x20, 0xee, 0x1d, 0x71, 0x13, 0xef, 0xf0, 0x24, 0x13, 0x2e, 0x68, 0x20,
+ 0x03, 0x03, 0x11, 0x30,
+ 0x2b, 0x0d, 0x00, 0x03, 0x63, 0x22, 0x0f, 0x0d, 0x00, 0xf0, 0xfd, 0x30,
+ 0x44, 0x10, 0x22, 0x04,
+ 0x90, 0xeb, 0x1a, 0x1e, 0x01, 0x03, 0x10, 0x4e, 0x01, 0xc0, 0xf8, 0x6f,
+ 0x12, 0xf2, 0xe1, 0x01,
+ 0x30, 0x2d, 0xec, 0xe1, 0x26, 0x03, 0x82, 0xf1, 0xf0, 0xed, 0xec, 0xc0,
+ 0xe4, 0x33, 0x31, 0xc0,
+ 0xbd, 0x0f, 0x01, 0x2f, 0x21, 0xf7, 0x00, 0x3c, 0x00, 0xe4, 0xd0, 0xce,
+ 0x50, 0x42, 0x01, 0x00,
+ 0x0c, 0xdc, 0xa1, 0xf2, 0x0e, 0x2d, 0x1e, 0xdd, 0xad, 0xf3, 0x17, 0x31,
+ 0x3e, 0x0c, 0xfe, 0x22,
+ 0x36, 0xf0, 0x0e, 0xff, 0x81, 0xf0, 0x4b, 0x4e, 0x01, 0xe2, 0xef, 0x0e,
+ 0x00, 0xf2, 0x0f, 0x2d,
+ 0x42, 0x11, 0xfd, 0xff, 0xe4, 0x03, 0x70, 0x39, 0x0e, 0xc1, 0xcf, 0x0e,
+ 0x40, 0x2e, 0x09, 0xfd,
+ 0xdd, 0xc0, 0x07, 0xe1, 0xbe, 0xed, 0xf1, 0x12, 0x3c, 0xea, 0xa0, 0xf2,
+ 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0xf1, 0xf2, 0x00, 0xfe, 0xda, 0x0f, 0x14, 0x44, 0x60, 0xff, 0xbf,
+ 0xf0, 0x10, 0x23, 0x25,
+ 0x00, 0x9d, 0x01, 0x23, 0x00, 0xff, 0x01, 0x01, 0x0f, 0x2d, 0x2e, 0x05,
+ 0xa3, 0xbf, 0xf0, 0x23,
+ 0x2f, 0xee, 0xdd, 0x08, 0x2c, 0x30, 0x1f, 0xfe, 0x04, 0xf5, 0x90, 0xff,
+ 0x11, 0x12, 0x3e, 0x6e,
+ 0x04, 0x03, 0x00, 0x00, 0x1c, 0x69, 0x1f, 0xf3, 0xd5, 0xe1, 0x00, 0x0e,
+ 0xfd, 0xd1, 0x14, 0x23,
+ 0x00, 0x0c, 0x4b, 0x30, 0xe0, 0x20, 0x70, 0x50, 0x0b, 0xeb, 0x00, 0x01,
+ 0x01, 0x30, 0x70, 0x10,
+ 0xd0, 0xc0, 0x10, 0x20, 0x10, 0x31, 0x02, 0xac, 0xfc, 0x01, 0x00, 0x04,
+ 0x38, 0x00, 0x7e, 0x00,
+ 0x41, 0x00, 0x04, 0x01, 0xf6, 0x00, 0x6c, 0x00, 0xb2, 0xdd, 0x0a, 0x60,
+ 0x01, 0xe0, 0x10, 0x61,
+ 0x00, 0xe1, 0xf3, 0x00, 0x1c, 0x7d, 0x01, 0xc2, 0x0c, 0x1e, 0x20, 0xe6,
+ 0xe2, 0x02, 0x31, 0x0b,
+ 0xfb, 0x10, 0x02, 0xc0, 0x00, 0xf1, 0x20, 0x70, 0x01, 0x00, 0xf0, 0xb0,
+ 0x2e, 0x33, 0xd2, 0xcc,
+ 0x1f, 0x4c, 0x0b, 0xe4, 0xf5, 0xef, 0x1e, 0x11, 0x00, 0x4f, 0x0e, 0xc4,
+ 0x31, 0x2c, 0xaf, 0x01,
+ 0x34, 0x24, 0xef, 0xdb, 0x0f, 0x30, 0x02, 0xd3, 0xe0, 0x0a, 0x51, 0xe4,
+ 0xbf, 0x0d, 0x2f, 0x2f,
+ 0x51, 0xf4, 0x90, 0x0f, 0x30, 0x02, 0xe0, 0x1b, 0x0f, 0xd0, 0x52, 0x23,
+ 0xe0, 0xcf, 0x25, 0x10,
+ 0xca, 0x0f, 0x31, 0x11, 0xf1, 0xf0, 0xee, 0xc0, 0xf5, 0x7f, 0x3b, 0xf1,
+ 0xb0, 0x0e, 0x31, 0x06,
+ 0xc0, 0xff, 0x20, 0x31, 0x00, 0xfe, 0x0d, 0x01, 0xe4, 0xd2, 0x20, 0x6d,
+ 0xef, 0xd0, 0x2b, 0x40,
+ 0xf7, 0xf0, 0xed, 0xd2, 0x46, 0x6f, 0x0d, 0xf0, 0xe0, 0x10, 0x33, 0x02,
+ 0xdf, 0xeb, 0x0f, 0x12,
+ 0x22, 0x3f, 0x30, 0xdf, 0x8e, 0xc3, 0x24, 0x4e, 0x1e, 0x0f, 0xdf, 0xe1,
+ 0xf2, 0x1c, 0x1f, 0x16,
+ 0x11, 0x00, 0x00, 0x1f, 0x38, 0x3f, 0x82, 0xf3, 0x20, 0x0d, 0xf0, 0x03,
+ 0xee, 0x2c, 0x71, 0xe0,
+ 0xef, 0x32, 0xe2, 0x94, 0x33, 0x4a, 0xec, 0xe0, 0x01, 0x22, 0xf0, 0xb4,
+ 0xf1, 0x2d, 0x6b, 0x01,
+ 0xe4, 0xff, 0x0d, 0x01, 0x05, 0x00, 0x0e, 0x0f, 0xe0, 0xf0, 0x7f, 0x25,
+ 0xc0, 0xea, 0x20, 0x24,
+ 0xf1, 0x0e, 0x1e, 0xde, 0xf1, 0x75, 0x01, 0xf0, 0xef, 0xfd, 0x1f, 0x32,
+ 0x21, 0x0e, 0xc0, 0xe2,
+ 0x00, 0x42, 0x10, 0xf8, 0xcf, 0x02, 0xf2, 0xd1, 0x70, 0x3e, 0xe0, 0x01,
+ 0xfe, 0xdf, 0xf6, 0x2f,
+ 0x3e, 0xd3, 0x21, 0x69, 0xe0, 0xe1, 0x40, 0x00, 0xc2, 0xe0, 0x2e, 0x1f,
+ 0xdd, 0x60, 0x41, 0xe0,
+ 0xd2, 0x0f, 0xe0, 0x04, 0x2f, 0x3a, 0xde, 0xe3, 0x76, 0x00, 0x00, 0x00,
+ 0xeb, 0xc0, 0x03, 0x40,
+ 0x0d, 0xb0, 0x02, 0x0f, 0x0c, 0x5f, 0x17, 0xd2, 0xfe, 0x2d, 0x23, 0x02,
+ 0x0d, 0xed, 0xe0, 0x04,
+ 0x75, 0x0f, 0xbc, 0x02, 0x21, 0x2c, 0x00, 0x03, 0xb0, 0xdf, 0x30, 0x54,
+ 0x1f, 0xfd, 0xed, 0xe0,
+ 0x24, 0x23, 0xdf, 0x0d, 0x12, 0x01, 0xe8, 0xff, 0x75, 0x12, 0xdd, 0xbc,
+ 0x01, 0x23, 0x23, 0x13,
+ 0xfc, 0xeb, 0x10, 0x41, 0xc0, 0x91, 0x12, 0x5e, 0x0d, 0xf0, 0xf2, 0x03,
+ 0x2f, 0x0c, 0xd0, 0x03,
+ 0x2a, 0x00, 0xf4, 0x00, 0x1d, 0x00, 0xa1, 0x00, 0x33, 0x2f, 0xf8, 0xdd,
+ 0x01, 0x26, 0x10, 0xcf,
+ 0x20, 0x30, 0xef, 0xd0, 0x42, 0x2d, 0x0e, 0x40, 0xef, 0x87, 0xe5, 0x3f,
+ 0x2d, 0xef, 0x00, 0x22,
+ 0xe2, 0x0e, 0x3f, 0xc1, 0xbd, 0x4e, 0x47, 0xe1, 0xed, 0x12, 0xe4, 0xbf,
+ 0x2b, 0x50, 0x04, 0xd0,
+ 0x0e, 0x1f, 0x30, 0x13, 0xd1, 0xe0, 0x0e, 0x5c, 0x30, 0xb2, 0xf4, 0x10,
+ 0x2f, 0x00, 0xfe, 0xed,
+ 0x03, 0x37, 0x1e, 0xed, 0xb0, 0x03, 0xf1, 0x0f, 0x3b, 0xf2, 0xc7, 0x20,
+ 0x1e, 0xcf, 0x01, 0x73,
+ 0x20, 0xf0, 0xb0, 0xe8, 0x1e, 0x42, 0x07, 0xd0, 0x0f, 0x5f, 0x0f, 0xe0,
+ 0xf1, 0x02, 0x1f, 0x0f,
+ 0xff, 0xf0, 0x30, 0x10, 0xc1, 0xe1, 0xfd, 0x38, 0x71, 0x06, 0xd0, 0x2e,
+ 0x3f, 0xe0, 0x82, 0x00,
+ 0x2f, 0x3f, 0xff, 0xc2, 0x03, 0x0e, 0x0c, 0x00, 0x30, 0x02, 0xc2, 0xe0,
+ 0x4c, 0x4d, 0xc1, 0xc7,
+ 0x20, 0x4e, 0xef, 0xff, 0x43, 0x05, 0xd0, 0xdc, 0x0f, 0x22, 0x20, 0x4e,
+ 0x3e, 0xb0, 0xa3, 0x17,
+ 0x40, 0xfe, 0xfe, 0xf0, 0x0f, 0x10, 0x05, 0xf1, 0x2d, 0x4d, 0x04, 0xc2,
+ 0x0e, 0x1f, 0xd0, 0x04,
+ 0x72, 0x0d, 0xe8, 0xc0, 0x02, 0x30, 0x3f, 0x01, 0xf1, 0x0e, 0xde, 0xd1,
+ 0x12, 0x20, 0x50, 0x00,
+ 0xd2, 0x01, 0x63, 0x01, 0xfc, 0xf9, 0x00, 0xd2, 0xcf, 0x40, 0x63, 0x0f,
+ 0xec, 0xf2, 0x01, 0x1f,
+ 0x1d, 0xeb, 0xdf, 0x05, 0x54, 0x10, 0x0d, 0x01, 0xd3, 0xe0, 0x48, 0x1f,
+ 0xe1, 0x33, 0x20, 0xe0,
+ 0xe1, 0xf0, 0xac, 0xde, 0x52, 0x43, 0x0f, 0xdc, 0xf0, 0x02, 0x22, 0x23,
+ 0xbf, 0xbc, 0x2d, 0x69,
+ 0x00, 0xf3, 0xe2, 0x0e, 0x00, 0x11, 0x01, 0x00, 0x0c, 0xed, 0xf2, 0x17,
+ 0x50, 0x0c, 0xed, 0xf4,
+ 0x33, 0x3f, 0x80, 0x01, 0x2c, 0x0f, 0xe7, 0x11, 0x0e, 0x0e, 0x2d, 0xe2,
+ 0xb3, 0x24, 0x41, 0x00,
+ 0xda, 0xf0, 0x12, 0x10, 0x0d, 0x00, 0x02, 0x02, 0xc1, 0xbf, 0x2a, 0x60,
+ 0x02, 0xe0, 0x0f, 0x1c,
+ 0x00, 0xf4, 0x03, 0xef, 0xfd, 0x20, 0x10, 0x3d, 0x50, 0xd6, 0xa2, 0x0c,
+ 0x1c, 0x05, 0xf3, 0x2e,
+ 0x4d, 0x10, 0xe0, 0xe0, 0x00, 0xf0, 0x03, 0x30, 0x8b, 0xdf, 0x50, 0x31,
+ 0xe2, 0xe2, 0x01, 0xf0,
+ 0x0b, 0x3d, 0x04, 0xc2, 0xfe, 0x11, 0x14, 0x1e, 0x3e, 0x04, 0xd1, 0x09,
+ 0x1d, 0x03, 0x94, 0x1e,
+ 0x7d, 0x04, 0xe2, 0xfe, 0x0b, 0x20, 0xe0, 0x04, 0x71, 0x0f, 0xc0, 0xf0,
+ 0x1d, 0x2f, 0x05, 0x11,
+ 0x10, 0xe0, 0xff, 0x1c, 0xe2, 0xf3, 0x0e, 0x1e, 0x00, 0x24, 0x70, 0xfb,
+ 0x90, 0xe5, 0x20, 0x3f,
+ 0x00, 0xf0, 0xfd, 0xf0, 0x24, 0x60, 0xf0, 0xb0, 0x00, 0x20, 0x10, 0x0a,
+ 0xf0, 0xf7, 0x4f, 0x2e,
+ 0xa1, 0xf0, 0x1f, 0x1f, 0x01, 0x03, 0x20, 0x0c, 0xdf, 0xe1, 0x13, 0x12,
+ 0x02, 0x0d, 0x48, 0x51,
+ 0xe4, 0xaf, 0x0d, 0x10, 0x22, 0x01, 0x2f, 0x0e, 0xc0, 0xe4, 0x11, 0x2f,
+ 0xd0, 0xf0, 0x7d, 0x19,
+ 0xd3, 0xe4, 0x1e, 0x3f, 0x0e, 0x10, 0xe7, 0xe0, 0x3e, 0x0f, 0xc1, 0x22,
+ 0xfb, 0x80, 0x13, 0x51,
+ 0x0d, 0xdd, 0xf4, 0x33, 0x1c, 0x0d, 0xf2, 0x04, 0x0e, 0x3c, 0x12, 0x92,
+ 0xf0, 0x2f, 0x2c, 0x0e,
+ 0xf4, 0xf6, 0x00, 0x1c, 0x0f, 0xf2, 0x00, 0xff, 0xb0, 0xc1, 0x20, 0x5e,
+ 0xff, 0xf2, 0x02, 0x0e,
+ 0x1f, 0x14, 0xef, 0xc8, 0x01, 0x23, 0x3f, 0x0c, 0xd0, 0x01, 0x62, 0x00,
+ 0xbd, 0xfc, 0x23, 0x27,
+ 0x10, 0x0e, 0x90, 0x01, 0x40, 0x0f, 0xf0, 0xe1, 0x00, 0x3e, 0x2b, 0xd4,
+ 0xe6, 0x00, 0x2d, 0xde,
+ 0x00, 0x63, 0xf1, 0x10, 0x3e, 0x8f, 0xef, 0x20, 0x23, 0xe5, 0x1d, 0x7e,
+ 0x00, 0xc2, 0x00, 0x1d,
+ 0xe7, 0xf2, 0x4d, 0x2e, 0xd2, 0xf3, 0x1f, 0x1e, 0x0f, 0xf0, 0xe1, 0x1e,
+ 0xf2, 0xc4, 0x69, 0x1f,
+ 0xe4, 0x00, 0x2a, 0xf0, 0xe3, 0xf1, 0x21, 0x3f, 0xbc, 0x00, 0x20, 0xea,
+ 0xb0, 0x36, 0x71, 0x0f,
+ 0xef, 0xff, 0x00, 0xf0, 0x02, 0x74, 0x20, 0xfe, 0xcd, 0xf1, 0x1f, 0x2e,
+ 0xf5, 0xe0, 0x10, 0x10,
+ 0x01, 0x0f, 0xfc, 0x10, 0x21, 0xe1, 0xfd, 0x00, 0x77, 0x63, 0xee, 0xcb,
+ 0x00, 0x31, 0x01, 0xce,
+ 0x00, 0x34, 0x00, 0x0d, 0x02, 0xe4, 0xcd, 0xfc, 0x5f, 0x31, 0xd1, 0xe0,
+ 0x21, 0x05, 0xf0, 0x1d,
+ 0x3d, 0xf1, 0xe3, 0x41, 0x76, 0x02, 0xbe, 0xd9, 0x0f, 0x31, 0x21, 0x12,
+ 0xf0, 0x0e, 0x00, 0xe3,
+ 0xe0, 0xdc, 0xfe, 0x20, 0x50, 0x21, 0x02, 0xee, 0x00, 0x06, 0xe0, 0x2f,
+ 0x2f, 0x80, 0x0c, 0x4f,
+ 0x15, 0xe3, 0xce, 0xdc, 0x3f, 0x70, 0x02, 0xf1, 0xeb, 0xff, 0x05, 0x31,
+ 0x40, 0x00, 0xaf, 0xfd,
+ 0x0e, 0x40, 0x07, 0xf1, 0xff, 0x00, 0x00, 0x0d, 0xfc, 0x01, 0xf3, 0x04,
+ 0x73, 0x2b, 0xec, 0xc0,
+ 0xf2, 0x32, 0x30, 0xdf, 0x0c, 0x10, 0x04, 0xf0, 0x0f, 0xff, 0xd1, 0x82,
+ 0xeb, 0x7f, 0x35, 0xe0,
+ 0xce, 0x11, 0x20, 0xfe, 0xd0, 0x1f, 0x41, 0x05, 0xf0, 0x0b, 0xef, 0xc2,
+ 0x21, 0x4e, 0xee, 0xde,
+ 0x45, 0x54, 0x00, 0xec, 0xe0, 0x04, 0x11, 0x0e, 0xef, 0x10, 0x50, 0xfe,
+ 0xe3, 0x24, 0x1e, 0xbc,
+ 0x01, 0x20, 0x0e, 0x12, 0xf1, 0xd1, 0x25, 0x5f, 0xb9, 0xe0, 0x31, 0x10,
+ 0x01, 0x01, 0x0f, 0x00,
+ 0x00, 0xae, 0x1f, 0x21, 0x00, 0x02, 0x37, 0x00, 0xcd, 0x00, 0xf0, 0xd0,
+ 0x50, 0x4d, 0xf3, 0xf7,
+ 0x04, 0xca, 0x0f, 0x31, 0x02, 0xb0, 0x20, 0x60, 0xff, 0xd1, 0x00, 0x2f,
+ 0x0f, 0xf2, 0x67, 0x00,
+ 0xcc, 0xff, 0x34, 0x10, 0xff, 0x00, 0x00, 0x00, 0xf0, 0xd0, 0x00, 0x51,
+ 0x0f, 0xfc, 0xf2, 0x16,
+ 0xff, 0xdd, 0x22, 0x60, 0xfe, 0xbe, 0x12, 0x36, 0xee, 0xfd, 0x23, 0xf3,
+ 0xcc, 0x1e, 0x76, 0x01,
+ 0xed, 0xdb, 0x11, 0x43, 0xf0, 0x00, 0x1f, 0x0b, 0xff, 0xe1, 0xf4, 0x13,
+ 0x00, 0xec, 0x2d, 0x10,
+ 0xc4, 0x22, 0x4d, 0x9e, 0xf2, 0x41, 0x01, 0xe0, 0x0e, 0x4e, 0x03, 0xf4,
+ 0x0c, 0xcd, 0xf2, 0x03,
+ 0x4e, 0x29, 0xf1, 0xe5, 0xef, 0xeb, 0x00, 0xf2, 0x73, 0x02, 0xad, 0xdc,
+ 0x63, 0x46, 0x00, 0xff,
+ 0xef, 0x00, 0x13, 0xdd, 0xc9, 0x0f, 0x20, 0x22, 0x23, 0x01, 0x73, 0x33,
+ 0x0e, 0xb8, 0xee, 0x00,
+ 0x22, 0x32, 0x12, 0xef, 0x88, 0xdd, 0x0f, 0x54, 0x34, 0x00, 0xff, 0xf0,
+ 0xee, 0xfe, 0x00, 0x01,
+ 0x03, 0x12, 0x00, 0x1f, 0x20, 0x20, 0x0e, 0xca, 0x8c, 0xcb, 0x20, 0x75,
+ 0x00, 0xee, 0x00, 0x01,
+ 0x00, 0x1f, 0x01, 0x02, 0xff, 0x00, 0x16, 0x11, 0xef, 0xbe, 0xf0, 0x02,
+ 0x02, 0xf0, 0x00, 0xfc,
+ 0x2f, 0x42, 0x04, 0xc0, 0xdc, 0x0e, 0x75, 0x35, 0x00, 0xff, 0xff, 0x00,
+ 0x20, 0x0f, 0xdd, 0xfe,
+ 0x75, 0x74, 0x00, 0xfe, 0xfe, 0xff, 0x00, 0xf1, 0x00, 0x00, 0x11, 0x01,
+ 0x01, 0x23, 0x14, 0x0f,
+ 0xb9, 0x00, 0x34, 0x10, 0xcc, 0xef, 0x00, 0x00, 0x31, 0x13, 0xcd, 0xca,
+ 0x0f, 0x20, 0x21, 0x00,
+ 0xff, 0xdd, 0x8b, 0x00, 0x21, 0xf0, 0xf1, 0x14, 0x11, 0x10, 0x0d, 0xea,
+ 0x10, 0x75, 0x21, 0xf0,
+ 0xe1, 0xc0, 0xee, 0x00, 0xf0, 0xbf, 0x02, 0x32, 0x1e, 0x13, 0x24, 0x00,
+ 0xcd, 0xa8, 0xee, 0x53,
+ 0x22, 0x0e, 0x0f, 0x23, 0x10, 0xe9, 0xcd, 0x1e, 0x51, 0x23, 0x01, 0xef,
+ 0xf0, 0x00, 0x43, 0x24,
+ 0xde, 0xba, 0x00, 0x17, 0x01, 0xcf, 0xe0, 0x11, 0x01, 0x02, 0xe1, 0xe0,
+ 0x00, 0x10, 0x60, 0x22,
+ 0x00, 0x12, 0x44, 0xfc, 0x0f, 0x33, 0xfd, 0xdb, 0x74, 0x53, 0x0f, 0xff,
+ 0xd9, 0x00, 0x31, 0x00,
+ 0x20, 0x23, 0xce, 0xdd, 0x20, 0x30, 0xd9, 0x00, 0x22, 0x01, 0x22, 0x40,
+ 0xee, 0xbe, 0xbc, 0xcb,
+ 0x10, 0x44, 0xf0, 0xee, 0x0e, 0x0f, 0x0e, 0xfe, 0xf0, 0xdd, 0xee, 0x12,
+ 0xf2, 0x8a, 0xc9, 0x20,
+ 0x76, 0x00, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x20, 0x11, 0x02, 0xf0, 0xd0,
+ 0x01, 0x02, 0xe0, 0xff,
+ 0x75, 0x13, 0xcf, 0xef, 0x01, 0x34, 0xfe, 0xff, 0x45, 0x01, 0xe0, 0x02,
+ 0x22, 0xfc, 0x99, 0x10,
+ 0x63, 0x01, 0xfd, 0x0f, 0x21, 0x10, 0x1f, 0x10, 0xfe, 0x00, 0x47, 0x01,
+ 0x00, 0x01, 0xcf, 0xce,
+ 0x03, 0x15, 0xf0, 0xd0, 0xd0, 0x00, 0x32, 0x41, 0x0f, 0x0e, 0x11, 0x02,
+ 0x31, 0x1d, 0x09, 0x60,
+ 0x00, 0xdf, 0x0f, 0x1e, 0x1e, 0x32, 0x30, 0xca, 0x89, 0xf0, 0x00, 0x00,
+ 0x1e, 0x0f, 0x10, 0x20,
+ 0xfd, 0xca, 0x51, 0x44, 0xff, 0xee, 0x00, 0x00, 0x21, 0x0f, 0xbc, 0xff,
+ 0x00, 0x01, 0x0f, 0x0f,
+ 0x0f, 0xfd, 0x0f, 0xbe, 0xaa, 0xff, 0x00, 0x20, 0xfd, 0xdd, 0x02, 0xf5,
+ 0x00, 0x0d, 0x1d, 0x71,
+ 0x24, 0x00, 0xdf, 0xf0, 0x27, 0x76, 0x00, 0xde, 0x01, 0x02, 0xf1, 0xf1,
+ 0x12, 0x00, 0xdf, 0xce,
+ 0x16, 0x23, 0xc0, 0xe0, 0x64, 0x23, 0xee, 0xee, 0x13, 0x23, 0x0f, 0xca,
+ 0x10, 0x74, 0x10, 0x0d,
+ 0x10, 0x10, 0x10, 0x55, 0x31, 0x0e, 0x0e, 0x00, 0x06, 0x01, 0xe0, 0xd0,
+ 0x03, 0xd1, 0xc0, 0xc0,
+ 0xf1, 0x25, 0x10, 0x0f, 0x10, 0x20, 0x74, 0x22, 0x0f, 0x10, 0x33, 0x0d,
+ 0x0d, 0x52, 0x0e, 0xe8,
+ 0x11, 0x31, 0xe0, 0xdd, 0x2f, 0x72, 0x0e, 0xa8, 0xfe, 0x0f, 0x21, 0x10,
+ 0xec, 0x00, 0x62, 0x12,
+ 0x0d, 0xed, 0x00, 0x00, 0x0f, 0x0e, 0x1d, 0x0d, 0xff, 0xd0, 0x06, 0x13,
+ 0x99, 0xdc, 0x00, 0x00,
+ 0xf1, 0xd1, 0xb0, 0xef, 0xdc, 0xfe, 0x30, 0x00, 0xe0, 0xdf, 0xdd, 0x0d,
+ 0x60, 0x20, 0x0e, 0x07,
+ 0xf4, 0x9f, 0x00, 0x01, 0xdf, 0x01, 0x24, 0xef, 0xd0, 0xf5, 0xc0, 0x12,
+ 0x23, 0xce, 0x01, 0x47,
+ 0x14, 0xe0, 0xd0, 0xe0, 0x41, 0x31, 0x01, 0x33, 0xdf, 0x8a, 0x10, 0x74,
+ 0x0f, 0x0d, 0x30, 0x21,
+ 0x0f, 0x21, 0x37, 0x10, 0xd0, 0xde, 0x01, 0x14, 0xe0, 0x8f, 0xf0, 0x02,
+ 0xfe, 0xec, 0x67, 0x23,
+ 0x0f, 0xde, 0xff, 0x34, 0x21, 0xce, 0x10, 0x31, 0x00, 0xed, 0x00, 0x01,
+ 0x00, 0xba, 0x0e, 0x61,
+ 0x00, 0xc9, 0xfe, 0x11, 0x32, 0x0e, 0xfd, 0x20, 0x0f, 0xff, 0x00, 0x41,
+ 0xd9, 0x0f, 0x72, 0x10,
+ 0xec, 0x00, 0x01, 0x00, 0x0e, 0x20, 0x00, 0xbd, 0xed, 0xfc, 0xee, 0x35,
+ 0x32, 0x8c, 0xed, 0x01,
+ 0x0f, 0xcc, 0x10, 0x23, 0x0f, 0x0e, 0x0b, 0xdd, 0x10, 0x66, 0x0f, 0xff,
+ 0x34, 0x12, 0xbd, 0xed,
+ 0x11, 0x14, 0xef, 0xf0, 0x02, 0x01, 0xd0, 0xf2, 0x57, 0x22, 0xcf, 0xde,
+ 0x01, 0x01, 0x15, 0x42,
+ 0xbe, 0xee, 0x22, 0x44, 0x00, 0xcd, 0xed, 0x0f, 0x77, 0x32, 0x0f, 0x0e,
+ 0x00, 0x24, 0x00, 0x0f,
+ 0x22, 0x22, 0xe0, 0xf1, 0xf0, 0xe0, 0x11, 0x01, 0xce, 0x01, 0x57, 0x02,
+ 0xee, 0x31, 0x31, 0x13,
+ 0x57, 0x00, 0xdf, 0x20, 0x41, 0x0f, 0x00, 0x44, 0xf0, 0xdf, 0xdd, 0x0e,
+ 0x2d, 0xd9, 0xbf, 0x21,
+ 0x00, 0xed, 0x2f, 0x1d, 0xfb, 0x10, 0x71, 0x10, 0x20, 0x30, 0xdd, 0x0f,
+ 0x0d, 0xdb, 0x31, 0x52,
+ 0xed, 0xeb, 0x74, 0x74, 0xfe, 0xc9, 0xff, 0x22, 0x12, 0xef, 0xdd, 0x00,
+ 0x00, 0x01, 0x11, 0xdc,
+ 0xcd, 0x31, 0x63, 0x0f, 0xeb, 0x11, 0x34, 0x00, 0xf0, 0xf0, 0x00, 0x02,
+ 0xad, 0xee, 0x06, 0x33,
+ 0xd0, 0xef, 0x02, 0xf2, 0xe3, 0x04, 0x02, 0x02, 0xf2, 0x80, 0xde, 0x17,
+ 0x24, 0xbf, 0xce, 0x00,
+ 0x24, 0x01, 0xed, 0xff, 0x31, 0x30, 0xfc, 0x10, 0x30, 0x22, 0x75, 0x12,
+ 0x10, 0x00, 0x00, 0xcc,
+ 0xe0, 0xe1, 0x03, 0xf0, 0xcb, 0x11, 0x36, 0x02, 0x00, 0xae, 0xdc, 0x52,
+ 0x34, 0x00, 0x11, 0x55,
+ 0xfe, 0xdd, 0x11, 0x44, 0xff, 0xcc, 0x00, 0x0f, 0xfd, 0x10, 0x20, 0xdb,
+ 0xff, 0x41, 0x10, 0xfb,
+ 0xfe, 0x60, 0x53, 0x00, 0xeb, 0x00, 0x00, 0xfe, 0x0f, 0x40, 0x32, 0x43,
+ 0xfe, 0xdb, 0x10, 0x30,
+ 0x10, 0x0f, 0x33, 0xe0, 0x9c, 0xe0, 0xf0, 0x0e, 0xeb, 0x00, 0x31, 0xdd,
+ 0xab, 0x00, 0x43, 0x30,
+ 0x10, 0x11, 0x00, 0xcc, 0x01, 0x37, 0x00, 0xac, 0x01, 0x23, 0xf0, 0xd0,
+ 0xf1, 0xf2, 0xd0, 0xf0,
+ 0x36, 0x01, 0xe0, 0xd0, 0xe2, 0x26, 0xf1, 0x8f, 0xe1, 0x03, 0xe0, 0x01,
+ 0x11, 0x8b, 0xdc, 0x11,
+ 0x44, 0x0f, 0x2f, 0x20, 0x00, 0x00, 0x0f, 0x00, 0x44, 0x00, 0xba, 0x00,
+ 0x33, 0xf0, 0xaf, 0x01,
+ 0x35, 0x00, 0xed, 0xde, 0x01, 0x45, 0x43, 0x00, 0xfe, 0x0e, 0x42, 0xf0,
+ 0x00, 0x24, 0x00, 0xff,
+ 0xfd, 0x0d, 0x30, 0xfd, 0x9a, 0x00, 0x10, 0xfb, 0x0e, 0x72, 0x33, 0xea,
+ 0xdd, 0xed, 0x32, 0x53,
+ 0x0f, 0xec, 0xfe, 0x20, 0x31, 0x43, 0x00, 0x0d, 0x20, 0x0e, 0x0d, 0x35,
+ 0x01, 0xac, 0xff, 0x00,
+ 0x14, 0x03, 0x9b, 0xdc, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0xff, 0xfe, 0x31,
+ 0x65, 0x00, 0x00, 0x0f,
+ 0xdb, 0xf0, 0x66, 0xff, 0xab, 0x11, 0x24, 0xf0, 0xce, 0x00, 0x04, 0x04,
+ 0x1a, 0x03, 0x68, 0x01,
+ 0x1e, 0x09, 0x3e, 0x16, 0xb1, 0xef, 0xaf, 0xfd, 0x17, 0xc0, 0xaf, 0xcd,
+ 0xf5, 0x47, 0x14, 0xdf,
+ 0x00, 0x01, 0xc0, 0xbe, 0x00, 0x12, 0x0f, 0x00, 0x00, 0xfe, 0x46, 0x11,
+ 0xfe, 0x00, 0x74, 0x00,
+ 0xec, 0xfe, 0x02, 0x13, 0x01, 0x23, 0xf0, 0xbc, 0xee, 0x00, 0x37, 0x11,
+ 0xef, 0xe0, 0xf0, 0x12,
+ 0x75, 0x11, 0x00, 0xfe, 0x00, 0x34, 0x00, 0xcc, 0x11, 0x22, 0xdd, 0x0e,
+ 0x54, 0xec, 0xcd, 0x0f,
+ 0x0e, 0x1e, 0x40, 0x1f, 0xfa, 0x0f, 0x32, 0x32, 0xdd, 0x88, 0xee, 0x41,
+ 0x32, 0x31, 0x00, 0xfd,
+ 0xdd, 0x10, 0x50, 0x22, 0x22, 0x01, 0x01, 0xed, 0xdb, 0xcd, 0x00, 0x01,
+ 0xfe, 0x98, 0xfe, 0x21,
+ 0x00, 0x00, 0x21, 0x20, 0x0e, 0xec, 0x20, 0x72, 0x13, 0x0f, 0xff, 0x0f,
+ 0xdc, 0xfe, 0x33, 0x27,
+ 0xd0, 0xbf, 0x00, 0x22, 0xf0, 0x13, 0x47, 0xb0, 0xd0, 0x04, 0x23, 0xf0,
+ 0xb0, 0x01, 0xd0, 0xad,
+ 0xdc, 0x03, 0x46, 0x00, 0x00, 0x31, 0xee, 0xdd, 0x00, 0x10, 0x53, 0x47,
+ 0x00, 0xdd, 0xdf, 0xe0,
+ 0x01, 0x23, 0x23, 0xe0, 0xbe, 0xfe, 0xe0, 0xf4, 0xf3, 0xef, 0x12, 0x77,
+ 0x23, 0xfe, 0xdc, 0x12,
+ 0x45, 0x21, 0x21, 0x00, 0xcd, 0xde, 0xdd, 0x24, 0x75, 0x0e, 0xed, 0x0f,
+ 0x32, 0x00, 0xc8, 0xef,
+ 0x0f, 0x40, 0x00, 0xd0, 0x00, 0x30, 0x74, 0x20, 0xfb, 0xef, 0x0f, 0x31,
+ 0x30, 0x51, 0x21, 0x00,
+ 0x10, 0x0e, 0xf0, 0x14, 0xfe, 0xcc, 0x11, 0x0f, 0x88, 0xef, 0x22, 0x32,
+ 0xed, 0xfe, 0x0e, 0x42,
+ 0x56, 0x0f, 0xdd, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0xef, 0x00, 0x01,
+ 0xdf, 0x9a, 0x00, 0x57,
+ 0x22, 0x00, 0xe0, 0xe0, 0x12, 0x35, 0xf0, 0xb0, 0xef, 0xd0, 0xf0, 0x13,
+ 0x12, 0xcf, 0xef, 0xff,
+ 0x31, 0x42, 0xfd, 0x10, 0x32, 0xfe, 0xcc, 0x11, 0x33, 0x45, 0x00, 0xc0,
+ 0xe0, 0x03, 0xbe, 0xb9,
+ 0x02, 0x23, 0x01, 0xf0, 0xdf, 0xf3, 0x37, 0x42, 0x20, 0x10, 0xfe, 0xf1,
+ 0x57, 0x11, 0xcf, 0xde,
+ 0x20, 0x00, 0xce, 0x00, 0x24, 0x41, 0x0f, 0x98, 0xed, 0x10, 0x20, 0x31,
+ 0x11, 0x00, 0xfd, 0xbb,
+ 0xff, 0x10, 0x10, 0x0d, 0x60, 0x22, 0xfc, 0xfe, 0x20, 0x10, 0x0c, 0x20,
+ 0x76, 0x10, 0xee, 0xff,
+ 0xff, 0xff, 0x00, 0xcc, 0xff, 0x00, 0xcf, 0x0f, 0x00, 0x2e, 0x0b, 0x2f,
+ 0x31, 0x01, 0xfe, 0xaa,
+ 0x00, 0x76, 0x10, 0xed, 0xee, 0x01, 0x00, 0xee, 0x01, 0x22, 0x01, 0x01,
+ 0x03, 0x06, 0x76, 0x01,
+ 0xd0, 0xef, 0xe0, 0xf2, 0xe0, 0xf3, 0xe2, 0x90, 0x02, 0x02, 0xed, 0xec,
+ 0x46, 0x22, 0xff, 0xee,
+ 0x30, 0x52, 0x00, 0xff, 0x23, 0x47, 0xf0, 0xac, 0x00, 0x21, 0x00, 0xbe,
+ 0x01, 0x02, 0x00, 0xf0,
+ 0x00, 0x17, 0x63, 0x00, 0xfe, 0x0f, 0x33, 0x25, 0x00, 0x00, 0xf1, 0xf0,
+ 0x00, 0x21, 0x00, 0x00,
+ 0xfc, 0xce, 0x30, 0x2e, 0x4e, 0x40, 0xd8, 0xcd, 0x00, 0x00, 0x11, 0x72,
+ 0x0e, 0xfa, 0x0f, 0xfe,
+ 0x0d, 0x72, 0x21, 0x0e, 0x33, 0x44, 0xfc, 0xea, 0x00, 0x41, 0x01, 0xff,
+ 0x0f, 0xde, 0xce, 0xfe,
+ 0xef, 0xf0, 0x02, 0xfd, 0xb9, 0xdd, 0x52, 0x44, 0xec, 0xee, 0x13, 0x22,
+ 0x00, 0x0e, 0xfd, 0xfe,
+ 0x21, 0xf0, 0x88, 0xee, 0x02, 0x56, 0x21, 0xff, 0xff, 0x02, 0x01, 0xb0,
+ 0x14, 0x23, 0x00, 0x01,
+ 0xd0, 0xc0, 0x03, 0x06, 0xe0, 0xd0, 0x00, 0x30, 0x40, 0x23, 0x02, 0x00,
+ 0x1f, 0x0e, 0x63, 0x45,
+ 0x0d, 0xff, 0x13, 0x02, 0x0f, 0xfe, 0xde, 0xb9, 0x00, 0x47, 0x21, 0xe0,
+ 0xbe, 0xf0, 0x31, 0x31,
+ 0x32, 0x55, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x55, 0x22, 0xff, 0xdc,
+ 0x00, 0x41, 0xcc, 0xdc,
+ 0x40, 0x53, 0x00, 0xec, 0xcd, 0xfd, 0x11, 0x20, 0xfb, 0x00, 0x20, 0x00,
+ 0x0f, 0x30, 0x0d, 0x0a,
+ 0x70, 0x43, 0x0e, 0x0e, 0x0f, 0xee, 0x11, 0x20, 0xc8, 0xef, 0x21, 0xe0,
+ 0x8d, 0xfe, 0xee, 0x00,
+ 0x20, 0x1e, 0x01, 0x00, 0xde, 0xda, 0x0f, 0x42, 0x32, 0x0f, 0xdc, 0xac,
+ 0xff, 0x00, 0x21, 0x55,
+ 0xff, 0xcd, 0x00, 0x04, 0x01, 0x13, 0x24, 0xf0, 0x03, 0xf6, 0x80, 0xf0,
+ 0xf1, 0x03, 0x03, 0xf2,
+ 0xcf, 0xde, 0xf0, 0x37, 0x42, 0x00, 0xdf, 0xff, 0x00, 0x43, 0x42, 0x22,
+ 0xfe, 0xd9, 0xf0, 0x23,
+ 0x64, 0x10, 0xdd, 0xbc, 0xef, 0xe0, 0x02, 0x57, 0x22, 0xff, 0x0f, 0x01,
+ 0x32, 0xff, 0xef, 0x45,
+ 0x54, 0x00, 0xf0, 0xff, 0xf0, 0x00, 0x43, 0x10, 0xfd, 0xfd, 0x00, 0x0f,
+ 0x0d, 0x52, 0x13, 0xfd,
+ 0xca, 0xda, 0xcc, 0x10, 0x32, 0xee, 0x0e, 0x40, 0x0f, 0xdb, 0x41, 0x61,
+ 0x0e, 0x10, 0x30, 0x0f,
+ 0x0d, 0xed, 0xcc, 0x00, 0x67, 0x00, 0xed, 0xed, 0xcc, 0x00, 0x02, 0x00,
+ 0x10, 0x1f, 0xea, 0xef,
+ 0x11, 0x22, 0x00, 0xcd, 0x0e, 0x20, 0x0e, 0x8a, 0xee, 0x12, 0x00, 0xfd,
+ 0x32, 0x75, 0x0f, 0xef,
+ 0x13, 0x16, 0x01, 0x01, 0xf0, 0xdf, 0x14, 0x45, 0xc0, 0xaf, 0x01, 0x13,
+ 0x00, 0xdf, 0xe0, 0x00,
+ 0x11, 0x34, 0x11, 0x00, 0x11, 0x63, 0x0d, 0xd8, 0x00, 0x74, 0x00, 0x00,
+ 0x00, 0xf0, 0xef, 0x00,
+ 0xe0, 0xf0, 0x25, 0x11, 0x0f, 0x10, 0x20, 0xce, 0xef, 0x77, 0x43, 0x00,
+ 0xf1, 0x01, 0x00, 0x22,
+ 0xff, 0xdc, 0x43, 0x56, 0x0f, 0x00, 0x00, 0x0e, 0x0e, 0xf0, 0x00, 0x00,
+ 0xdd, 0xda, 0xdd, 0x00,
+ 0x30, 0xd0, 0xff, 0xbc, 0x0d, 0x70, 0x2d, 0x0b, 0x20, 0x00, 0x0e, 0x74,
+ 0x20, 0xfc, 0xfe, 0xef,
+ 0xfe, 0x00, 0xf0, 0xdc, 0xdd, 0xcc, 0xcc, 0x00, 0x11, 0x11, 0x00, 0x0d,
+ 0xea, 0x9d, 0xef, 0x23,
+ 0x42, 0xea, 0xdd, 0x00, 0xff, 0x00, 0x43, 0xfe, 0xdc, 0x62, 0x23, 0xdb,
+ 0xf0, 0x46, 0x12, 0xf0,
+ 0x13, 0x01, 0xb0, 0xcf, 0xe1, 0x27, 0x02, 0x9e, 0xf0, 0x12, 0x02, 0xdd,
+ 0x00, 0x26, 0x00, 0x00,
+ 0x21, 0x0f, 0x40, 0x63, 0x00, 0xdc, 0x02, 0x11, 0x00, 0xff, 0xf0, 0xf0,
+ 0x01, 0xf1, 0x02, 0x12,
+ 0x43, 0x00, 0x20, 0x77, 0x37, 0xd0, 0x00, 0x23, 0x11, 0x32, 0x42, 0x11,
+ 0x00, 0x10, 0x54, 0x44,
+ 0xff, 0xec, 0x10, 0x50, 0x31, 0x00, 0x00, 0xce, 0xa8, 0xec, 0x21, 0x20,
+ 0x0f, 0xee, 0xee, 0x00,
+ 0x43, 0xfb, 0xfc, 0x70, 0x32, 0x00, 0x00, 0x00, 0xed, 0x0e, 0x31, 0x31,
+ 0xda, 0xbd, 0xf0, 0xef,
+ 0xdd, 0x0f, 0x00, 0x2e, 0x1f, 0xed, 0xf0, 0x03, 0x0d, 0xc8, 0x1f, 0x40,
+ 0xce, 0xcc, 0x00, 0x11,
+ 0xdc, 0x0e, 0x72, 0x00, 0xfc, 0x10, 0x43, 0xee, 0xef, 0x27, 0x23, 0xd0,
+ 0xf1, 0x26, 0x80, 0xde,
+ 0x03, 0xf3, 0xe1, 0x04, 0x01, 0x01, 0xb0, 0xcf, 0xf1, 0x37, 0x42, 0x00,
+ 0xee, 0xdd, 0x0f, 0x21,
+ 0x43, 0x45, 0x12, 0xee, 0xbd, 0xff, 0xff, 0xf0, 0x03, 0x23, 0x00, 0x11,
+ 0xfb, 0xaa, 0x11, 0x46,
+ 0x11, 0x00, 0x21, 0x01, 0x00, 0x21, 0x52, 0xf0, 0xe0, 0x23, 0x52, 0x21,
+ 0x01, 0x0e, 0xfc, 0x23,
+ 0x22, 0xd9, 0x0f, 0x0f, 0x8d, 0xf0, 0x11, 0x21, 0x0d, 0xb8, 0xfe, 0x1f,
+ 0x20, 0x20, 0x20, 0x1e,
+ 0x3f, 0x60, 0x21, 0xfd, 0xfd, 0x35, 0x20, 0x0d, 0x1f, 0xec, 0x9c, 0xfe,
+ 0xf0, 0x00, 0x20, 0x1e,
+ 0x2f, 0x10, 0xeb, 0xac, 0x01, 0x21, 0x0c, 0x10, 0x43, 0xff, 0xca, 0xdd,
+ 0xdc, 0x31, 0x75, 0x1f,
+ 0x0e, 0x00, 0x0f, 0x00, 0x23, 0xf0, 0xe0, 0x46, 0x43, 0xf0, 0xa0, 0xe0,
+ 0x01, 0x04, 0xe1, 0xf2,
+ 0x04, 0xf1, 0xb0, 0x02, 0x14, 0x00, 0xf1, 0x22, 0x31, 0x20, 0x0e, 0xff,
+ 0x47, 0x22, 0xae, 0xee,
+ 0x23, 0x23, 0xdc, 0xfe, 0xe0, 0xbd, 0x03, 0x37, 0x10, 0x00, 0x0e, 0x22,
+ 0x67, 0x02, 0x9e, 0xff,
+ 0x23, 0x34, 0x10, 0x02, 0xef, 0xf0, 0x57, 0x10, 0x00, 0x10, 0x0f, 0x00,
+ 0x11, 0xce, 0xdd, 0x21,
+ 0x0f, 0xb8, 0xf0, 0x00, 0x00, 0xee, 0x0f, 0x0f, 0x70, 0x0e, 0x0b, 0x10,
+ 0x30, 0x32, 0x32, 0x0e,
+ 0xc9, 0x0f, 0x51, 0x00, 0xef, 0xfe, 0xde, 0x00, 0x00, 0x2f, 0x31, 0x0f,
+ 0xaa, 0xce, 0x10, 0x32,
+ 0xf0, 0xfe, 0xfe, 0xda, 0xce, 0xff, 0x52, 0x11, 0xdc, 0xdc, 0x30, 0x60,
+ 0x0e, 0x0e, 0x02, 0x02,
+ 0x15, 0x53, 0x00, 0xff, 0x01, 0x05, 0xd0, 0x90, 0xe0, 0x06, 0x23, 0x02,
+ 0xae, 0xde, 0x05, 0x03,
+ 0xff, 0x01, 0x32, 0x00, 0x10, 0xf0, 0xdd, 0x34, 0x77, 0x00, 0xef, 0xee,
+ 0x00, 0xd0, 0xbd, 0x00,
+ 0x23, 0x00, 0x00, 0x24, 0xef, 0x99, 0x00, 0x23, 0x23, 0x01, 0xe0, 0xf0,
+ 0x02, 0x43, 0x23, 0x00,
+ 0xf0, 0x36, 0x33, 0x10, 0x31, 0x20, 0x50, 0x43, 0xfe, 0xba, 0xf0, 0x00,
+ 0xec, 0x20, 0x22, 0xee,
+ 0xba, 0xee, 0xfe, 0x0e, 0x1e, 0x60, 0x41, 0x10, 0x0e, 0x1f, 0x1f, 0x0c,
+ 0x2f, 0x0d, 0xe8, 0x10,
+ 0x51, 0xde, 0xbb, 0x21, 0x22, 0x0e, 0xee, 0xee, 0x00, 0x51, 0x0f, 0xdb,
+ 0xee, 0x11, 0x21, 0xff,
+ 0xee, 0x0e, 0xbb, 0xec, 0x20, 0x61, 0x0d, 0xfd, 0x0f, 0x0e, 0x20, 0x36,
+ 0x33, 0x32, 0xef, 0xef,
+ 0x11, 0xe0, 0xb0, 0x07, 0xc3, 0xc3, 0x04, 0xc0, 0xf1, 0x03, 0x9f, 0xdc,
+ 0x06, 0x44, 0x00, 0xfe,
+ 0x30, 0x33, 0xe0, 0xdf, 0x23, 0x12, 0xff, 0xee, 0x10, 0x00, 0x8a, 0x00,
+ 0x03, 0xf0, 0xfd, 0x1f,
+ 0x56, 0x01, 0xe0, 0xe0, 0xf0, 0x01, 0x23, 0x13, 0x34, 0x01, 0x01, 0x77,
+ 0x32, 0xe0, 0xee, 0x1f,
+ 0x61, 0x35, 0x21, 0xf0, 0xf0, 0x00, 0xf0, 0xab, 0xed, 0x02, 0x00, 0xfe,
+ 0x0f, 0xed, 0xcb, 0x1f,
+ 0x2f, 0x3e, 0x71, 0x20, 0x0e, 0x0d, 0x0d, 0x0c, 0x20, 0x1c, 0x0c, 0x74,
+ 0x13, 0xb8, 0xdd, 0x00,
+ 0x42, 0x11, 0xfe, 0x0f, 0xfe, 0xff, 0x02, 0x00, 0xeb, 0x00, 0x10, 0xde,
+ 0xcd, 0x22, 0x54, 0xfb,
+ 0xbb, 0x20, 0x31, 0xcd, 0xee, 0x33, 0x53, 0x0f, 0x0f, 0x0f, 0xff, 0x02,
+ 0x12, 0xf0, 0x06, 0xf3,
+ 0xe2, 0xc2, 0xc1, 0xb0, 0xf0, 0x17, 0x02, 0xf1, 0xe1, 0x00, 0x11, 0xfe,
+ 0x11, 0x77, 0x02, 0xef,
+ 0xf0, 0x44, 0x00, 0xbd, 0x0f, 0x12, 0x00, 0xdc, 0x01, 0x33, 0xee, 0xee,
+ 0x55, 0x11, 0xef, 0xf1,
+ 0x04, 0x01, 0xf0, 0xf1, 0x11, 0x76, 0x12, 0x02, 0x45, 0x00, 0xee, 0xff,
+ 0x76, 0x32, 0xff, 0xff,
+ 0x01, 0x12, 0x00, 0xfe, 0xed, 0xee, 0xef, 0x00, 0xbc, 0xb8, 0x0f, 0x51,
+ 0x11, 0x10, 0xfe, 0x0d,
+ 0x20, 0x52, 0x11, 0xfb, 0xec, 0x00, 0x21, 0x20, 0x00, 0xfd, 0xdc, 0x10,
+ 0x10, 0xdc, 0x40, 0x40,
+ 0x0f, 0x00, 0xbe, 0xdd, 0x00, 0x1e, 0x42, 0x47, 0xcc, 0xba, 0xf0, 0x00,
+ 0x20, 0x20, 0x1f, 0x0e,
+ 0xdd, 0x00, 0x32, 0x0e, 0x20, 0x41, 0xfd, 0x11, 0x26, 0xd1, 0xe4, 0x02,
+ 0xf2, 0xc2, 0x80, 0xce,
+ 0xe1, 0xf4, 0x03, 0x17, 0x12, 0xe0, 0x00, 0x32, 0x01, 0xbe, 0x02, 0x47,
+ 0x12, 0xdf, 0xde, 0x62,
+ 0x12, 0xf0, 0xff, 0xe0, 0x00, 0x00, 0xdc, 0x00, 0x55, 0xf0, 0xf0, 0x14,
+ 0xf0, 0xa0, 0x00, 0x35,
+ 0x33, 0xe0, 0xdf, 0x13, 0x77, 0x21, 0x10, 0x21, 0x10, 0x00, 0x12, 0x02,
+ 0x10, 0x21, 0x10, 0xac,
+ 0xdb, 0x00, 0xf0, 0xbe, 0x0f, 0x0d, 0x0c, 0x51, 0x1f, 0xc8, 0x0e, 0x54,
+ 0x21, 0x0f, 0x0e, 0x0d,
+ 0x0e, 0x21, 0x00, 0xed, 0xee, 0xed, 0x50, 0x45, 0x10, 0xea, 0xce, 0x0f,
+ 0x00, 0x11, 0x00, 0xfe,
+ 0xde, 0xee, 0xff, 0x10, 0x20, 0xcb, 0xac, 0x0e, 0x00, 0x0e, 0x0f, 0x0f,
+ 0x0c, 0x1e, 0x73, 0x31,
+ 0xfb, 0x00, 0x21, 0xdc, 0xce, 0x57, 0x14, 0xd0, 0xdf, 0xf1, 0xf1, 0xc0,
+ 0xf2, 0xe1, 0xc0, 0x02,
+ 0x15, 0x01, 0x00, 0x01, 0x02, 0xd0, 0xf2, 0x77, 0x42, 0xef, 0xde, 0x00,
+ 0x01, 0xf0, 0x01, 0x01,
+ 0x0f, 0xdd, 0x32, 0xf0, 0x89, 0xd0, 0x35, 0x52, 0xef, 0xde, 0x03, 0x45,
+ 0x00, 0x00, 0x32, 0x00,
+ 0xf0, 0x00, 0x53, 0x33, 0x35, 0x32, 0x20, 0x11, 0x21, 0xe0, 0x8c, 0x0f,
+ 0x11, 0x0f, 0xed, 0xed,
+ 0xc9, 0xef, 0x20, 0x30, 0x2c, 0x1e, 0x0d, 0x30, 0x74, 0x0d, 0x0d, 0x30,
+ 0x20, 0xfd, 0xc8, 0x00,
+ 0x61, 0x0f, 0xfb, 0x0f, 0x0f, 0x10, 0x0f, 0xf0, 0x10, 0x20, 0xff, 0xdd,
+ 0x0e, 0x31, 0x00, 0x89,
+ 0xce, 0x0f, 0x21, 0x0f, 0xeb, 0xed, 0x10, 0x20, 0x0e, 0x0e, 0x1d, 0x5c,
+ 0x73, 0x34, 0x0f, 0xf0,
+ 0x02, 0xe0, 0xd1, 0x07, 0x01, 0xc0, 0xf4, 0xd1, 0x90, 0xf2, 0x05, 0x12,
+ 0x13, 0x01, 0xcf, 0x00,
+ 0x26, 0x22, 0xf0, 0xc0, 0xf2, 0x34, 0x21, 0xff, 0xbe, 0xf0, 0x24, 0x23,
+ 0xef, 0xfe, 0x50, 0x0f,
+ 0xca, 0xe1, 0x04, 0x13, 0x01, 0xe0, 0x0f, 0x00, 0xf1, 0xb0, 0x25, 0x77,
+ 0x30, 0x10, 0x42, 0x00,
+ 0xf0, 0x11, 0x65, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0xdf, 0xcc,
+ 0xed, 0x30, 0x3f, 0x0b,
+ 0x40, 0x40, 0x1f, 0x2f, 0x2f, 0x1f, 0xeb, 0x0e, 0x70, 0x30, 0x0d, 0x0f,
+ 0x0c, 0xeb, 0x0e, 0x3f,
+ 0x4f, 0xea, 0xdf, 0x31, 0x30, 0xdf, 0x20, 0x1f, 0x8c, 0xde, 0x0f, 0x32,
+ 0x0f, 0xba, 0xee, 0xac,
+ 0x0f, 0x22, 0x0f, 0xea, 0x00, 0x30, 0x0e, 0x4f, 0x20, 0x0e, 0x00, 0x01,
+ 0x34, 0x13, 0xd0, 0x90,
+ 0xf1, 0xe2, 0xb0, 0xe1, 0xe6, 0xd2, 0x02, 0x16, 0x02, 0xe0, 0xe0, 0xf1,
+ 0xe2, 0xc2, 0x04, 0x02,
+ 0xe0, 0xd0, 0xf0, 0x34, 0x54, 0xdf, 0xad, 0xf0, 0x00, 0x00, 0xff, 0xcd,
+ 0xdf, 0x27, 0x01, 0xa1,
+ 0x15, 0x00, 0xbd, 0xff, 0x14, 0x13, 0x01, 0x01, 0x45, 0x31, 0x0f, 0x63,
+ 0x47, 0x11, 0xf0, 0x00,
+ 0x21, 0x00, 0xf0, 0xef, 0xef, 0x01, 0x13, 0xad, 0xd9, 0x1f, 0x3f, 0x1e,
+ 0x1f, 0x00, 0x00, 0x2f,
+ 0x50, 0x2d, 0x4d, 0x30, 0xfc, 0x0d, 0x1f, 0xe8, 0x0e, 0x70, 0x2e, 0xfc,
+ 0x32, 0x10, 0xdd, 0xfe,
+ 0x20, 0xdb, 0x30, 0x72, 0xec, 0xcd, 0x00, 0x01, 0xff, 0xdd, 0xcb, 0xff,
+ 0x0e, 0xfc, 0x1f, 0x0d,
+ 0xfc, 0x1f, 0x70, 0x40, 0x2e, 0x2e, 0x0c, 0xfe, 0x04, 0xf4, 0xa0, 0x01,
+ 0x03, 0xe0, 0xbe, 0xd0,
+ 0xc4, 0xf6, 0x03, 0x35, 0x01, 0xcf, 0xd0, 0xf3, 0x03, 0xf2, 0x15, 0x42,
+ 0xf0, 0xf1, 0xf1, 0xe0,
+ 0x03, 0x01, 0xac, 0x0f, 0x42, 0x00, 0xff, 0x02, 0xde, 0xd0, 0x06, 0x02,
+ 0x8f, 0xff, 0x14, 0x11,
+ 0xf0, 0xd0, 0xd0, 0x17, 0x77, 0x42, 0x20, 0x01, 0x10, 0x21, 0x32, 0x00,
+ 0x03, 0x34, 0xff, 0xbf,
+ 0x01, 0x02, 0xeb, 0xde, 0x0e, 0xfe, 0x30, 0x60, 0x0c, 0x0d, 0x42, 0x10,
+ 0xfb, 0x00, 0x50, 0x31,
+ 0x0b, 0xeb, 0x0f, 0x20, 0x10, 0x2e, 0x6e, 0x20, 0x0e, 0xdc, 0x0e, 0x00,
+ 0x10, 0x71, 0x0d, 0x08,
+ 0x01, 0x32, 0xbf, 0xbc, 0x00, 0x10, 0x0f, 0xfd, 0xee, 0xec, 0x0e, 0x20,
+ 0x1d, 0x1c, 0x60, 0x0d,
+ 0x0d, 0x43, 0x11, 0x0f, 0x0f, 0xef, 0x04, 0xe3, 0xad, 0xf0, 0x17, 0x03,
+ 0x8d, 0x05, 0x07, 0x00,
+ 0xe0, 0x00, 0x12, 0x02, 0xd0, 0x03, 0x15, 0x00, 0xd0, 0x11, 0x00, 0xf0,
+ 0xe1, 0xc0, 0xf0, 0x62,
+ 0x00, 0xea, 0x00, 0x02, 0xd0, 0x02, 0x65, 0xee, 0xcd, 0xff, 0xf0, 0x05,
+ 0x03, 0xe1, 0xf0, 0x21,
+ 0x40, 0x10, 0x77, 0x23, 0x01, 0x11, 0x22, 0x11, 0x00, 0x01, 0xde, 0x25,
+ 0x75, 0xef, 0xcc, 0x00,
+ 0x0f, 0x0e, 0x31, 0x32, 0xff, 0x0f, 0xee, 0x1e, 0x61, 0x1f, 0x0b, 0x1f,
+ 0x2e, 0x1d, 0x0c, 0x20,
+ 0x0d, 0xeb, 0x30, 0x70, 0x40, 0x0d, 0xc8, 0x00, 0x52, 0x20, 0x05, 0x05,
+ 0xc8, 0x00, 0xbc, 0x00,
+ 0xe3, 0x1f, 0x54, 0xd6, 0xf5, 0x23, 0x16, 0xd8, 0x56, 0xef, 0xee, 0xef,
+ 0xef, 0x01, 0x72, 0x09,
+ 0xdb, 0xe0, 0x74, 0x0d, 0xee, 0x76, 0x00, 0xfc, 0x01, 0x11, 0xce, 0x11,
+ 0x45, 0xff, 0xdd, 0x01,
+ 0x01, 0x00, 0x01, 0x00, 0xcb, 0x12, 0x54, 0xff, 0xee, 0x00, 0x14, 0xff,
+ 0xee, 0x32, 0x76, 0xef,
+ 0xcd, 0x11, 0x10, 0x10, 0x12, 0xf0, 0xee, 0xde, 0x34, 0x52, 0xed, 0x00,
+ 0x02, 0xce, 0x22, 0x02,
+ 0xfc, 0xff, 0x00, 0xd3, 0x05, 0x52, 0x10, 0x0d, 0x22, 0x63, 0x00, 0xd0,
+ 0xf0, 0x07, 0x34, 0xfe,
+ 0x31, 0x12, 0x9a, 0xff, 0xf1, 0x13, 0x2e, 0xda, 0x31, 0x74, 0xef, 0xdd,
+ 0x11, 0x43, 0xec, 0x00,
+ 0x54, 0xff, 0xda, 0x22, 0x10, 0x00, 0x0f, 0x0f, 0xcf, 0x42, 0x12, 0xfe,
+ 0x0e, 0x30, 0xce, 0xed,
+ 0x67, 0x12, 0x0e, 0xde, 0x00, 0x00, 0x01, 0xff, 0xed, 0x10, 0x22, 0x0f,
+ 0xc8, 0xef, 0x51, 0x32,
+ 0x0f, 0x0d, 0x30, 0x31, 0xbf, 0xdb, 0x13, 0x43, 0x00, 0xef, 0xb9, 0x11,
+ 0x12, 0xf0, 0xf0, 0xe0,
+ 0xdd, 0x55, 0x10, 0xbd, 0x11, 0x47, 0xd0, 0xdd, 0x23, 0x21, 0x0f, 0x00,
+ 0x0f, 0xe0, 0x22, 0xc0,
+ 0xde, 0x00, 0x71, 0x01, 0x00, 0x00, 0xe4, 0x11, 0xf9, 0xbf, 0x12, 0x01,
+ 0xae, 0x14, 0x46, 0xed,
+ 0xfe, 0x24, 0x00, 0xce, 0x30, 0x67, 0x00, 0xde, 0x00, 0x12, 0x21, 0xdf,
+ 0xf0, 0x20, 0x10, 0xff,
+ 0xe0, 0x01, 0xdf, 0x0d, 0x72, 0x33, 0xdd, 0xce, 0xfe, 0x37, 0x55, 0xfc,
+ 0xef, 0x00, 0x1f, 0x31,
+ 0x02, 0xac, 0x01, 0x42, 0xfb, 0x00, 0x00, 0xfe, 0x01, 0x34, 0x0d, 0x10,
+ 0xfe, 0xce, 0x67, 0x02,
+ 0xba, 0x00, 0x21, 0x01, 0xff, 0xdd, 0x01, 0x41, 0x00, 0xff, 0xeb, 0x41,
+ 0x44, 0xcd, 0x0e, 0x33,
+ 0x00, 0xcb, 0x11, 0x32, 0xf0, 0xd0, 0x10, 0x0f, 0xde, 0x22, 0xc0, 0xfe,
+ 0x66, 0x0f, 0xcf, 0x13,
+ 0x00, 0x0e, 0x03, 0x05, 0x00, 0xfd, 0x0e, 0x44, 0xf0, 0x9f, 0x0f, 0x15,
+ 0x21, 0x0f, 0x0f, 0x10,
+ 0xde, 0xdd, 0x57, 0x12, 0xce, 0x00, 0x0f, 0x0e, 0x02, 0xe3, 0xe0, 0x10,
+ 0x00, 0x0e, 0x74, 0x43,
+ 0xed, 0xf1, 0x17, 0x15, 0xff, 0x0f, 0x0f, 0x00, 0x23, 0x22, 0xbc, 0xfe,
+ 0x44, 0xf0, 0xbe, 0x10,
+ 0x30, 0xf0, 0xf1, 0x04, 0xfc, 0x0e, 0x74, 0x00, 0x0f, 0x00, 0xc9, 0x00,
+ 0x54, 0x00, 0xfd, 0xf0,
+ 0x11, 0x2e, 0xfd, 0x01, 0x14, 0xee, 0x0d, 0x72, 0x31, 0xf2, 0xde, 0xc8,
+ 0x10, 0x12, 0x10, 0xe1,
+ 0xff, 0x0c, 0xee, 0x22, 0x23, 0x9a, 0x00, 0x40, 0x3f, 0x1f, 0xef, 0xf0,
+ 0xe2, 0xfe, 0x3f, 0x54,
+ 0xff, 0xee, 0xf0, 0xcf, 0x20, 0x31, 0xbb, 0xe1, 0x16, 0x00, 0xf0, 0xe0,
+ 0x42, 0x02, 0xcc, 0x22,
+ 0x13, 0x8c, 0x01, 0x17, 0x1f, 0xed, 0x23, 0x25, 0xbd, 0xfe, 0x21, 0x22,
+ 0x00, 0xe0, 0x00, 0x01,
+ 0xcf, 0xef, 0x23, 0x00, 0xcb, 0xf0, 0xf2, 0x33, 0x20, 0xf0, 0x10, 0xeb,
+ 0x43, 0x77, 0x26, 0xad,
+ 0x00, 0x20, 0xf0, 0x22, 0x23, 0xbe, 0xfd, 0x11, 0x22, 0xfe, 0xfd, 0x02,
+ 0x15, 0xee, 0xce, 0x54,
+ 0x31, 0xdc, 0x00, 0x31, 0xf0, 0xcd, 0x10, 0x67, 0x00, 0xeb, 0xf0, 0x52,
+ 0xff, 0xed, 0x22, 0x11,
+ 0xdb, 0x52, 0x32, 0xfe, 0xcd, 0x02, 0x34, 0x0f, 0xdc, 0x00, 0xf0, 0x00,
+ 0x00, 0x01, 0xfe, 0xfe,
+ 0x20, 0x30, 0xeb, 0x2f, 0x73, 0x2b, 0xac, 0x34, 0x21, 0xbe, 0x00, 0x22,
+ 0x1e, 0xfc, 0x01, 0x03,
+ 0xee, 0xbb, 0x03, 0x53, 0xfd, 0xda, 0x34, 0x12, 0xbe, 0x10, 0x12, 0xed,
+ 0x0f, 0x24, 0xf0, 0xe1,
+ 0x01, 0xff, 0x23, 0x0e, 0xfc, 0x20, 0x24, 0xe0, 0xf0, 0xee, 0xbf, 0xe0,
+ 0x47, 0xe0, 0x8d, 0x00,
+ 0x13, 0x00, 0x0d, 0xd0, 0xe0, 0x45, 0x20, 0x20, 0x33, 0xe1, 0x90, 0x15,
+ 0x13, 0x0d, 0xfc, 0x23,
+ 0x22, 0xf1, 0xef, 0xd0, 0x01, 0x01, 0xcb, 0x10, 0x75, 0x10, 0xcc, 0xff,
+ 0x00, 0xf1, 0x62, 0x24,
+ 0xfc, 0xdf, 0x01, 0x00, 0x1d, 0x23, 0x0f, 0xc8, 0x1f, 0x30, 0x01, 0xf0,
+ 0x1f, 0x50, 0x11, 0x0e,
+ 0xfe, 0xf0, 0xf0, 0xdc, 0x00, 0x77, 0xe0, 0xcd, 0x01, 0x30, 0x0d, 0xec,
+ 0x00, 0xfe, 0xfe, 0x70,
+ 0x00, 0x12, 0x13, 0x08, 0xdb, 0x32, 0x21, 0x01, 0x2f, 0xee, 0x8e, 0xee,
+ 0x22, 0x35, 0xf1, 0x00,
+ 0xcd, 0xec, 0x03, 0x24, 0x10, 0xbd, 0x14, 0x34, 0xde, 0xcd, 0xf2, 0x02,
+ 0x31, 0x46, 0xbf, 0xed,
+ 0x30, 0x41, 0xf0, 0xd0, 0x26, 0x10, 0xf0, 0xcf, 0xcc, 0x00, 0x35, 0xe0,
+ 0x9d, 0x12, 0x12, 0x0f,
+ 0xfd, 0x52, 0x02, 0xc0, 0x14, 0x24, 0x0f, 0x10, 0x0f, 0xf0, 0x04, 0x23,
+ 0x00, 0x00, 0x1f, 0x21,
+ 0x8b, 0xff, 0x16, 0x0f, 0x00, 0x42, 0xff, 0xaa, 0x00, 0x44, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0xcb,
+ 0x11, 0x53, 0x0e, 0xec, 0x20, 0x02, 0x0e, 0xe0, 0x11, 0x30, 0x3d, 0x61,
+ 0x00, 0xbb, 0x00, 0x04,
+ 0x02, 0xfa, 0x11, 0x21, 0xce, 0xfd, 0x00, 0x34, 0x0e, 0xab, 0x20, 0x31,
+ 0x00, 0xf1, 0x00, 0xec,
+ 0x20, 0x53, 0xfd, 0x0f, 0x00, 0xdc, 0x0f, 0x55, 0xe0, 0xfe, 0x02, 0xde,
+ 0x30, 0x76, 0xfe, 0xce,
+ 0x01, 0x04, 0x00, 0x00, 0x22, 0x00, 0xcf, 0x02, 0x04, 0xec, 0x10, 0x61,
+ 0x03, 0x12, 0x0d, 0xd0,
+ 0xf1, 0xf3, 0x35, 0x0f, 0xac, 0x00, 0x0f, 0xfe, 0x03, 0xf2, 0x00, 0x15,
+ 0x00, 0xcd, 0x51, 0x24,
+ 0xf3, 0xf7, 0x02, 0xdd, 0x10, 0x75, 0x20, 0xee, 0x03, 0x26, 0xff, 0xbd,
+ 0x01, 0x22, 0x0f, 0xee,
+ 0x01, 0x13, 0x0f, 0x1f, 0x40, 0x01, 0xdf, 0x00, 0x15, 0xfe, 0x3e, 0x5f,
+ 0xeb, 0xb0, 0x04, 0x31,
+ 0x1c, 0xfb, 0x20, 0x71, 0x00, 0x20, 0x10, 0xdc, 0xf0, 0x51, 0x00, 0xe0,
+ 0x02, 0x37, 0xee, 0x8a,
+ 0x00, 0x10, 0x00, 0xd0, 0x20, 0x30, 0xfd, 0x20, 0x42, 0xbd, 0x0d, 0x13,
+ 0x1e, 0x2e, 0x33, 0xfd,
+ 0xa8, 0x00, 0x24, 0xfe, 0xdd, 0x41, 0x02, 0xfe, 0x00, 0x15, 0xf0, 0xaf,
+ 0x0e, 0x36, 0x10, 0xbd,
+ 0x02, 0xe3, 0x0f, 0x12, 0x32, 0xbb, 0x11, 0x44, 0x0f, 0xe0, 0x00, 0xf0,
+ 0x02, 0x11, 0x10, 0xdf,
+ 0xbc, 0x01, 0x11, 0xee, 0x05, 0xf0, 0xca, 0x00, 0x55, 0x00, 0xff, 0x22,
+ 0x00, 0xc0, 0xf0, 0x55,
+ 0x20, 0x2f, 0xf0, 0xd2, 0xdf, 0x23, 0x76, 0xff, 0xdd, 0x0f, 0x01, 0x22,
+ 0x00, 0xdf, 0x00, 0x12,
+ 0x41, 0x2e, 0x10, 0x01, 0xae, 0xfe, 0x17, 0x31, 0xcc, 0xcc, 0x40, 0x30,
+ 0x15, 0x10, 0xbc, 0xfc,
+ 0x31, 0x10, 0x10, 0x73, 0x03, 0xc8, 0x00, 0x01, 0x21, 0x00, 0x1f, 0xde,
+ 0xde, 0xf0, 0x42, 0x20,
+ 0xbb, 0x10, 0x33, 0xee, 0xfd, 0x31, 0x30, 0xfe, 0xdc, 0x11, 0x33, 0x0f,
+ 0xea, 0x60, 0xf0, 0xf1,
+ 0xf0, 0xdc, 0x20, 0x31, 0x00, 0x31, 0x00, 0x93, 0xe2, 0xe0, 0x0e, 0x31,
+ 0xf2, 0x90, 0xf0, 0x07,
+ 0x25, 0x0f, 0x40, 0x0d, 0xd0, 0x37, 0x13, 0xdf, 0xef, 0x2f, 0xfe, 0xb1,
+ 0xf2, 0xc0, 0xff, 0x00,
+ 0x0f, 0xff, 0xfe, 0xe4, 0xc1, 0x00, 0x77, 0xf0, 0xc0, 0x74, 0x01, 0x0e,
+ 0x02, 0x07, 0x24, 0xdd,
+ 0xff, 0x10, 0x12, 0xf2, 0xf0, 0x0e, 0x0e, 0x01, 0xe5, 0xf0, 0x50, 0x30,
+ 0xfe, 0x1f, 0x33, 0x80,
+ 0xff, 0x13, 0xf8, 0xf0, 0x43, 0x0e, 0xdd, 0x10, 0x21, 0x1c, 0x2f, 0x1f,
+ 0x5e, 0x4f, 0x00, 0xd1,
+ 0xec, 0x24, 0x54, 0xec, 0xee, 0x00, 0x20, 0xef, 0x8a, 0x00, 0x22, 0xff,
+ 0xef, 0x0b, 0x60, 0x10,
+ 0xff, 0xed, 0x00, 0x21, 0x3e, 0x30, 0xfe, 0x98, 0x0f, 0x12, 0x10, 0xec,
+ 0xff, 0x53, 0x00, 0xfb,
+ 0x01, 0x03, 0x00, 0xde, 0x00, 0x14, 0xa0, 0xf0, 0x14, 0x2f, 0xdb, 0xe1,
+ 0x34, 0x10, 0x01, 0x02,
+ 0x10, 0x0e, 0x60, 0x17, 0xd1, 0x8f, 0x00, 0x1e, 0x0f, 0x00, 0x02, 0xd0,
+ 0xce, 0x17, 0x2f, 0xfb,
+ 0x01, 0x03, 0xce, 0x21, 0x12, 0x01, 0x12, 0x70, 0x02, 0x02, 0xb0, 0x11,
+ 0x26, 0x0e, 0xed, 0x13,
+ 0x06, 0xef, 0xee, 0x11, 0x31, 0x11, 0x20, 0xd0, 0xfe, 0x41, 0x30, 0x9b,
+ 0xd0, 0x37, 0x12, 0xac,
+ 0x10, 0x40, 0xef, 0xfe, 0x20, 0x00, 0xff, 0x30, 0x40, 0x0e, 0x00, 0x30,
+ 0x02, 0xce, 0xfe, 0x3f,
+ 0x22, 0xd0, 0xcb, 0x0e, 0x0d, 0xdd, 0xae, 0x00, 0x57, 0x0d, 0x08, 0x00,
+ 0x00, 0x1f, 0x1f, 0x20,
+ 0x01, 0x30, 0x30, 0x9b, 0xdb, 0x11, 0x62, 0xf0, 0x0e, 0x0e, 0x0f, 0x21,
+ 0xf2, 0xe2, 0xee, 0x0e,
+ 0x11, 0xf2, 0x9f, 0xfd, 0x06, 0x06, 0xf0, 0xef, 0x3e, 0x73, 0x03, 0xf0,
+ 0xe0, 0x04, 0x11, 0x0f,
+ 0x00, 0xf0, 0x00, 0x23, 0xdf, 0x8a, 0xf0, 0x02, 0x00, 0xf0, 0xde, 0xfa,
+ 0x54, 0x23, 0xed, 0xcf,
+ 0x17, 0x11, 0x10, 0x40, 0x10, 0x11, 0x00, 0xc5, 0x11, 0xef, 0xff, 0x23,
+ 0xd0, 0x1d, 0x74, 0x10,
+ 0xae, 0x03, 0x34, 0x1e, 0x0b, 0x00, 0xf4, 0xf0, 0xdf, 0xe0, 0x34, 0x40,
+ 0x0b, 0xe0, 0xbf, 0x0d,
+ 0x50, 0x33, 0x00, 0xdc, 0x1e, 0x41, 0x01, 0x1f, 0x00, 0x4f, 0x00, 0xdb,
+ 0xdf, 0x55, 0x00, 0xcb,
+ 0xff, 0x22, 0xf0, 0xff, 0x0f, 0x3e, 0x3d, 0x0e, 0x42, 0x00, 0x8c, 0x00,
+ 0x13, 0x3b, 0x0c, 0x1f,
+ 0x00, 0xdc, 0xd2, 0x42, 0x4f, 0x08, 0xfe, 0x32, 0x02, 0xf1, 0xe1, 0xc0,
+ 0xdc, 0x00, 0xa1, 0xf0,
+ 0x00, 0x35, 0xe0, 0x00, 0x10, 0x02, 0x13, 0x21, 0xb0, 0x00, 0x77, 0x01,
+ 0x01, 0xdf, 0xdb, 0xf0,
+ 0x34, 0x02, 0xaf, 0x0f, 0x0e, 0xba, 0x00, 0x34, 0xe0, 0xb0, 0x10, 0x23,
+ 0x1e, 0x30, 0x02, 0xd0,
+ 0x03, 0x02, 0x23, 0x01, 0xef, 0xee, 0x02, 0x47, 0x16, 0xdf, 0xdd, 0x00,
+ 0x73, 0x10, 0xdd, 0x74,
+ 0x32, 0xbd, 0x00, 0x03, 0xe0, 0xfe, 0x22, 0x33, 0xd8, 0x0f, 0x50, 0xe0,
+ 0xbd, 0x22, 0x32, 0x1a,
+ 0x10, 0x30, 0xef, 0xff, 0x03, 0x00, 0x2e, 0x50, 0x11, 0xde, 0xcb, 0xf0,
+ 0x02, 0x10, 0x1b, 0xf0,
+ 0x00, 0x3d, 0x20, 0x1f, 0xbc, 0x0e, 0x32, 0x72, 0x2c, 0xcd, 0xee, 0x0d,
+ 0x3f, 0x19, 0x0f, 0x43,
+ 0x0f, 0xd8, 0x30, 0x62, 0x01, 0xbe, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x0e,
+ 0x01, 0xc4, 0x02, 0x15,
+ 0x30, 0xdd, 0x21, 0x43, 0x26, 0xf2, 0x8d, 0x0e, 0x02, 0x14, 0x22, 0xf0,
+ 0xcc, 0xe0, 0x01, 0x01,
+ 0xee, 0x00, 0xdf, 0xaa, 0x34, 0x02, 0xdc, 0x32, 0x54, 0xde, 0x00, 0x13,
+ 0x2f, 0x10, 0xf5, 0xc1,
+ 0xf1, 0xf3, 0x20, 0x1f, 0xed, 0x34, 0x74, 0xfc, 0xde, 0x01, 0x04, 0x34,
+ 0x61, 0xee, 0xcd, 0x11,
+ 0x10, 0xe0, 0x02, 0x07, 0xf0, 0xdb, 0x5f, 0x1f, 0x00, 0x20, 0x02, 0xf0,
+ 0x0d, 0x7e, 0x61, 0xfe,
+ 0xee, 0x16, 0x10, 0xfd, 0x01, 0x00, 0x0f, 0x0e, 0xde, 0x0f, 0x00, 0xf3,
+ 0x4d, 0x08, 0x1d, 0x22,
+ 0x11, 0x00, 0xcf, 0xca, 0x3f, 0x70, 0xf1, 0xee, 0x30, 0x2d, 0xfc, 0x0f,
+ 0x4f, 0x30, 0xf0, 0xd0,
+ 0xf3, 0xe0, 0xcd, 0x3e, 0x08, 0x8e, 0xe1, 0x37, 0xf0, 0xce, 0x03, 0x52,
+ 0x00, 0xab, 0x12, 0x23,
+ 0x0d, 0xe0, 0x25, 0x13, 0x00, 0xbd, 0x0f, 0x33, 0xf1, 0xee, 0xf0, 0xdf,
+ 0x0b, 0x10, 0x04, 0xb0,
+ 0x00, 0x03, 0x0f, 0x0d, 0x02, 0x63, 0x12, 0x00, 0xe7, 0x04, 0xdf, 0x00,
+ 0x25, 0x10, 0x0f, 0x20,
+ 0x02, 0xb0, 0xfd, 0x11, 0x44, 0x43, 0x10, 0xfc, 0xd2, 0xd4, 0xd0, 0x10,
+ 0x54, 0x0f, 0xee, 0x0e,
+ 0xcd, 0xef, 0x31, 0x56, 0xec, 0xdf, 0x50, 0x3f, 0x6f, 0x0e, 0xea, 0x00,
+ 0x13, 0x32, 0x00, 0xfe,
+ 0xec, 0x1f, 0xfe, 0xd0, 0x06, 0x00, 0x0d, 0x2e, 0x0d, 0x0f, 0x70, 0x00,
+ 0xdf, 0x2f, 0xe0, 0xce,
+ 0x0c, 0x7b, 0x2d, 0x0e, 0xfe, 0x0e, 0x1f, 0x30, 0x42, 0x1d, 0x09, 0x00,
+ 0x2c, 0xcf, 0xd3, 0xf4,
+ 0xcd, 0xda, 0xd0, 0x42, 0x45, 0xb0, 0xbc, 0x01, 0x41, 0x10, 0x01, 0xe3,
+ 0xe0, 0x02, 0x36, 0x3f,
+ 0x0f, 0xf0, 0x03, 0xd1, 0x8e, 0x0e, 0x01, 0x00, 0xbf, 0x00, 0xf3, 0x00,
+ 0xfd, 0x1e, 0x31, 0xd0,
+ 0xd4, 0x37, 0x57, 0x0e, 0xf0, 0x04, 0x01, 0xe0, 0xb0, 0x01, 0x20, 0x10,
+ 0x23, 0x31, 0xce, 0xdf,
+ 0x05, 0x63, 0x00, 0x1e, 0x01, 0x06, 0xdf, 0xef, 0x35, 0x31, 0xb0, 0xbc,
+ 0xf0, 0x1f, 0x30, 0x1e,
+ 0x10, 0xef, 0x10, 0x75, 0x2d, 0xec, 0x22, 0x50, 0x00, 0x20, 0x00, 0xea,
+ 0xe0, 0xd3, 0xff, 0x3f,
+ 0x60, 0xed, 0x09, 0x00, 0x20, 0xf0, 0xd1, 0x12, 0x40, 0xdb, 0xee, 0x70,
+ 0x10, 0xcb, 0x11, 0x41,
+ 0x0d, 0xfe, 0x10, 0x1d, 0x22, 0x43, 0x0f, 0xe9, 0x0f, 0xf0, 0xa0, 0x0f,
+ 0x00, 0x22, 0x00, 0xee,
+ 0xf4, 0xf0, 0xcf, 0xfd, 0xde, 0x03, 0x77, 0x47, 0xff, 0xd0, 0x02, 0x11,
+ 0x20, 0x20, 0x00, 0xcf,
+ 0xc0, 0xc0, 0x03, 0x52, 0xeb, 0xcf, 0x03, 0x00, 0xee, 0x23, 0x0b, 0x1d,
+ 0x24, 0x05, 0xe0, 0xf0,
+ 0xe1, 0xe4, 0x01, 0x2f, 0x50, 0x21, 0xf2, 0xc0, 0xe0, 0xf3, 0x01, 0x4e,
+ 0x20, 0x37, 0x13, 0x01,
+ 0xef, 0xff, 0xc3, 0xf2, 0xf1, 0x01, 0x8c, 0xef, 0x56, 0xfe, 0xcb, 0x01,
+ 0x01, 0x20, 0x7f, 0x08,
+ 0x00, 0x40, 0x01, 0xf0, 0x02, 0xf0, 0x0e, 0x4f, 0x0d, 0xfe, 0xd0, 0x02,
+ 0x34, 0x0d, 0xda, 0x30,
+ 0x50, 0x0f, 0xd0, 0xd1, 0x23, 0x4e, 0xe8, 0x8e, 0x20, 0x20, 0xee, 0x02,
+ 0x61, 0x0c, 0x1d, 0x12,
+ 0xff, 0xd9, 0x10, 0x43, 0x0f, 0xed, 0x00, 0x01, 0xf1, 0xf0, 0xf0, 0xdd,
+ 0xbb, 0x00, 0x43, 0xf1,
+ 0xa0, 0x12, 0x37, 0x01, 0xfe, 0xff, 0x11, 0x26, 0x00, 0xf0, 0x10, 0x00,
+ 0xa0, 0xff, 0xf3, 0xc0,
+ 0xed, 0x01, 0xf0, 0xde, 0x10, 0x0c, 0xf2, 0x03, 0x66, 0x31, 0xc0, 0xe0,
+ 0x04, 0xf1, 0xf2, 0x33,
+ 0x74, 0xff, 0xbb, 0x04, 0x32, 0xfc, 0xf0, 0x24, 0x12, 0x01, 0x00, 0xde,
+ 0xd0, 0x20, 0x76, 0x21,
+ 0xd1, 0xe1, 0x00, 0xde, 0xdd, 0xf1, 0xef, 0x6f, 0x2e, 0x0d, 0x00, 0x30,
+ 0x4f, 0x20, 0x09, 0x20,
+ 0x10, 0x00, 0xdd, 0x03, 0x71, 0xf8, 0xdd, 0x20, 0x30, 0xcc, 0x00, 0x65,
+ 0xf0, 0xee, 0x20, 0x00,
+ 0x9a, 0x00, 0x0f, 0x3f, 0x00, 0x0d, 0xf0, 0x04, 0xff, 0x1b, 0x7f, 0x5f,
+ 0x0c, 0xdf, 0xf0, 0x05,
+ 0x11, 0x0e, 0x1c, 0x10, 0x0f, 0xe0, 0xf1, 0xd2, 0xdf, 0xef, 0xee, 0x00,
+ 0x71, 0x36, 0xa0, 0x03,
+ 0x03, 0x2e, 0x2d, 0x03, 0x17, 0xf1, 0xef, 0xe1, 0xe2, 0x01, 0xde, 0xef,
+ 0xc0, 0xf1, 0x00, 0xce,
+ 0xa9, 0x31, 0x32, 0xc0, 0x04, 0x24, 0xfe, 0xee, 0xd1, 0x07, 0x71, 0x00,
+ 0x00, 0xe2, 0xe0, 0x1f,
+ 0x40, 0x04, 0xc0, 0x25, 0x20, 0xec, 0x00, 0x73, 0x03, 0xf1, 0x02, 0x22,
+ 0xfe, 0xbc, 0x00, 0xe0,
+ 0xd3, 0x37, 0x30, 0xca, 0x10, 0x50, 0x10, 0xee, 0x00, 0x54, 0x00, 0x0f,
+ 0x30, 0x3f, 0xcc, 0xff,
+ 0x01, 0x00, 0x21, 0x41, 0xff, 0xbb, 0x01, 0x30, 0x0e, 0xfd, 0x04, 0xf0,
+ 0xcd, 0x00, 0x2d, 0x0d,
+ 0xfc, 0x31, 0x52, 0x4f, 0x08, 0xbb, 0x00, 0x42, 0x20, 0x0e, 0x0e, 0x01,
+ 0xe0, 0x00, 0x10, 0x4f,
+ 0xfa, 0xcf, 0xf0, 0xf2, 0xf1, 0xdd, 0x10, 0xf2, 0xd0, 0x63, 0xe1, 0xcf,
+ 0x43, 0x46, 0x03, 0x14,
+ 0x00, 0x0d, 0xa0, 0x07, 0x02, 0xc0, 0x0e, 0x20, 0x1f, 0xe0, 0xb1, 0xf0,
+ 0xfe, 0x0e, 0x2d, 0x30,
+ 0xe7, 0xd6, 0x21, 0x00, 0xbf, 0xf0, 0x20, 0x41, 0x12, 0xe5, 0xa1, 0x0f,
+ 0x0e, 0x2f, 0x01, 0x27,
+ 0x14, 0xde, 0x00, 0x70, 0x20, 0x0f, 0xd3, 0xe5, 0x00, 0xf0, 0x05, 0x05,
+ 0x4a, 0x00, 0x3c, 0x00,
+ 0xc0, 0xff, 0x31, 0x30, 0xc1, 0x01, 0x88, 0x33, 0x26, 0x92, 0xff, 0xfb,
+ 0x3e, 0x6e, 0x0d, 0x02,
+ 0x46, 0x00, 0x20, 0x22, 0xf8, 0x00, 0x3e, 0xe0, 0xe1, 0x12, 0x3f, 0x4c,
+ 0x70, 0x31, 0xdd, 0xb0,
+ 0x03, 0x0e, 0xf9, 0x00, 0x21, 0xe0, 0xef, 0x1e, 0x60, 0xf0, 0xe9, 0x00,
+ 0x60, 0x3f, 0x0e, 0xed,
+ 0x00, 0x01, 0x01, 0x30, 0x60, 0x09, 0xdd, 0x00, 0x31, 0xf0, 0xde, 0xe3,
+ 0xb0, 0xe0, 0x0c, 0x1e,
+ 0x2e, 0x04, 0x03, 0xe0, 0x14, 0x57, 0x11, 0x1f, 0x30, 0x12, 0xc0, 0xc0,
+ 0xf3, 0xe5, 0xd0, 0xce,
+ 0xfe, 0xe0, 0xbe, 0xde, 0xf2, 0x35, 0xf0, 0x2f, 0x73, 0xe1, 0xb0, 0x00,
+ 0x06, 0x33, 0x00, 0x00,
+ 0xf0, 0xe1, 0xd5, 0xb1, 0x01, 0x73, 0x0c, 0xf0, 0x03, 0x37, 0x21, 0xf0,
+ 0xe3, 0x01, 0xfe, 0x00,
+ 0x27, 0xc1, 0xd0, 0x20, 0xbe, 0xbc, 0x21, 0x32, 0xcc, 0x01, 0x52, 0x0e,
+ 0x2e, 0x12, 0x01, 0xf0,
+ 0xff, 0x08, 0x2e, 0x30, 0x00, 0x12, 0x31, 0xe0, 0xff, 0x4c, 0x6d, 0xee,
+ 0xbc, 0x04, 0x03, 0xff,
+ 0xee, 0x1e, 0x5c, 0x1f, 0x00, 0xcb, 0x0f, 0x0f, 0x1b, 0x4f, 0x62, 0x03,
+ 0xfc, 0xec, 0x0e, 0x00,
+ 0x42, 0x3f, 0x0e, 0xcf, 0x00, 0x0f, 0xd8, 0xde, 0x11, 0x12, 0xff, 0x00,
+ 0xc4, 0xce, 0x30, 0x52,
+ 0xfb, 0x01, 0x67, 0xf1, 0xd0, 0x0f, 0x11, 0x13, 0xff, 0xe0, 0xf0, 0xdf,
+ 0xf0, 0x0f, 0xf0, 0xb0,
+ 0xf1, 0x01, 0xdf, 0xec, 0x13, 0x23, 0x02, 0x37, 0x22, 0xa0, 0xef, 0x01,
+ 0xe3, 0xb6, 0x00, 0x21,
+ 0x2f, 0xe0, 0x11, 0x51, 0x00, 0x05, 0x52, 0x23, 0x04, 0xd1, 0x55, 0x00,
+ 0x9e, 0xf0, 0x03, 0x0d,
+ 0xdc, 0x23, 0x13, 0x01, 0x20, 0xed, 0x0e, 0x5e, 0x08, 0x0f, 0x53, 0x11,
+ 0xea, 0xe0, 0x22, 0x60,
+ 0x0f, 0x0e, 0x2e, 0x0c, 0xce, 0x02, 0x67, 0x00, 0xed, 0xff, 0xff, 0x00,
+ 0x00, 0x02, 0x4f, 0xda,
+ 0xed, 0x2f, 0x33, 0x00, 0x0d, 0x0e, 0x0e, 0x50, 0x4f, 0x1c, 0x0f, 0xef,
+ 0xec, 0x50, 0x40, 0xf8,
+ 0xee, 0xf1, 0xc2, 0xee, 0x0f, 0x0e, 0x1f, 0xee, 0x00, 0x17, 0xc0, 0xf0,
+ 0x21, 0x71, 0x12, 0x23,
+ 0xe0, 0xd0, 0xc3, 0xf5, 0x23, 0x4f, 0xff, 0xc1, 0xd1, 0xbb, 0xfc, 0xf0,
+ 0x20, 0x04, 0x03, 0x03,
+ 0xdc, 0xed, 0x20, 0x35, 0x13, 0x83, 0xe0, 0xf0, 0xde, 0x40, 0x34, 0xdf,
+ 0xd4, 0x25, 0x0d, 0x0f,
+ 0x75, 0x31, 0xf1, 0x34, 0x00, 0xc0, 0xe0, 0x23, 0x12, 0xc0, 0xbf, 0xf1,
+ 0x00, 0x11, 0x1e, 0x0d,
+ 0x20, 0x37, 0xf0, 0xee, 0x3f, 0x50, 0xef, 0x0e, 0x30, 0x7f, 0x1b, 0x1e,
+ 0x0d, 0x00, 0x36, 0x2d,
+ 0xf8, 0x01, 0x30, 0xf2, 0xaf, 0xdf, 0x00, 0x30, 0x2c, 0x00, 0xcf, 0x0c,
+ 0x30, 0xb0, 0x0e, 0x40,
+ 0x10, 0x2d, 0x3f, 0xc8, 0x30, 0x72, 0x5e, 0xea, 0x00, 0x02, 0xef, 0x1f,
+ 0x3e, 0xee, 0xef, 0xf2,
+ 0xdf, 0xde, 0x01, 0x00, 0x2a, 0x1e, 0x72, 0x17, 0xd0, 0xe0, 0x10, 0x53,
+ 0x10, 0xd0, 0xd0, 0x14,
+ 0x32, 0xf0, 0x9f, 0x00, 0x00, 0xbc, 0xe0, 0x03, 0x21, 0x12, 0x20, 0xeb,
+ 0xae, 0x00, 0x06, 0x04,
+ 0x20, 0xf0, 0x00, 0xe3, 0xaf, 0xfe, 0x02, 0x21, 0x00, 0x11, 0x17, 0x14,
+ 0x0f, 0x30, 0x22, 0x21,
+ 0x61, 0xf3, 0xa0, 0x02, 0x05, 0x00, 0xdf, 0x00, 0x05, 0x01, 0x00, 0x10,
+ 0xfb, 0xfe, 0x00, 0x74,
+ 0x52, 0xf0, 0xdb, 0x00, 0x40, 0x20, 0x0e, 0x0f, 0x30, 0xff, 0xeb, 0x52,
+ 0x24, 0x0f, 0xec, 0x00,
+ 0xff, 0x00, 0x10, 0x10, 0x10, 0x40, 0xee, 0x88, 0xfe, 0x10, 0x00, 0x00,
+ 0x71, 0x1d, 0xfc, 0xff,
+ 0xf0, 0x1f, 0x5b, 0x20, 0x12, 0xff, 0xdb, 0x0f, 0x1e, 0x00, 0xe2, 0xac,
+ 0x0f, 0x30, 0xfc, 0xdc,
+ 0x22, 0x02, 0x10, 0x00, 0xd1, 0x01, 0x67, 0x11, 0x00, 0x01, 0x03, 0xb0,
+ 0xf0, 0x02, 0x01, 0x00,
+ 0xef, 0xd0, 0x00, 0xf2, 0xbc, 0xdc, 0x03, 0x22, 0x41, 0x03, 0xd0, 0xe5,
+ 0x17, 0x95, 0xdf, 0x0e,
+ 0x10, 0x01, 0xdf, 0x12, 0x04, 0xf0, 0x72, 0x30, 0x10, 0x05, 0xf2, 0xe2,
+ 0xf1, 0x4f, 0x31, 0xa3,
+ 0xd6, 0xf2, 0x13, 0x20, 0x0c, 0xe0, 0xdf, 0xcc, 0x42, 0x57, 0xe0, 0xdf,
+ 0x0f, 0x6f, 0x20, 0x00,
+ 0xde, 0x0f, 0x52, 0x20, 0x0a, 0x10, 0xf0, 0xcd, 0x2f, 0x55, 0x00, 0xe0,
+ 0x0f, 0xfe, 0x0b, 0x00,
+ 0x13, 0xee, 0x1d, 0x40, 0xbb, 0xde, 0x34, 0x50, 0xec, 0xfd, 0x33, 0x40,
+ 0xfb, 0xed, 0x32, 0x42,
+ 0x0e, 0x1d, 0xfe, 0xd0, 0xe0, 0x0c, 0x0d, 0x0e, 0xe0, 0xf1, 0xb8, 0x0f,
+ 0x0e, 0xc0, 0x33, 0x77,
+ 0x00, 0xff, 0x0f, 0x00, 0x01, 0xf2, 0x15, 0x00, 0xf0, 0xf0, 0xe2, 0xe0,
+ 0x8c, 0xb0, 0x25, 0x1f,
+ 0xfd, 0x00, 0xe2, 0x01, 0xef, 0x00, 0x36, 0xf1, 0x8f, 0x0f, 0x00, 0x02,
+ 0xf5, 0xce, 0xfd, 0x12,
+ 0x74, 0x01, 0xe0, 0x14, 0x20, 0x0e, 0xfd, 0xf1, 0x07, 0x23, 0x10, 0x01,
+ 0xc0, 0xe0, 0xcf, 0xf0,
+ 0x35, 0x40, 0xe0, 0xfd, 0x10, 0xf4, 0xb1, 0xfe, 0x0f, 0x40, 0x52, 0x10,
+ 0xff, 0xfb, 0xfe, 0x0d,
+ 0x2c, 0x74, 0x13, 0x0e, 0xff, 0x00, 0xd8, 0x00, 0x61, 0x00, 0xfe, 0xf1,
+ 0x02, 0x0e, 0xfc, 0xff,
+ 0x00, 0x0e, 0xfe, 0x03, 0x00, 0x38, 0x7e, 0x30, 0x10, 0x0e, 0x10, 0x22,
+ 0xfc, 0xfe, 0x20, 0x0f,
+ 0xbd, 0x0b, 0x3f, 0xe0, 0xaf, 0x0e, 0x0b, 0x0f, 0x00, 0x13, 0xd0, 0x23,
+ 0x73, 0xf8, 0xce, 0x33,
+ 0x24, 0xf1, 0xd1, 0x13, 0x20, 0xfe, 0x00, 0xf2, 0x8d, 0xdf, 0x04, 0x22,
+ 0x0c, 0xba, 0x01, 0x44,
+ 0x01, 0xf2, 0xff, 0xcd, 0xff, 0x14, 0x23, 0xd0, 0x92, 0x02, 0x0d, 0x1f,
+ 0x1c, 0x36, 0x13, 0x0e,
+ 0xd0, 0x02, 0x77, 0x01, 0xef, 0x00, 0x21, 0x04, 0xe1, 0xd0, 0x1f, 0x0f,
+ 0x22, 0x35, 0x80, 0x0e,
+ 0x00, 0x01, 0xef, 0x12, 0x42, 0xeb, 0xff, 0x62, 0x10, 0x0f, 0xfe, 0x0e,
+ 0x2e, 0x3f, 0x31, 0x45,
+ 0x0d, 0xca, 0xfe, 0xf0, 0x37, 0x71, 0x0e, 0xdd, 0x0e, 0x00, 0x01, 0x03,
+ 0xee, 0xac, 0x10, 0x31,
+ 0x2d, 0xeb, 0x0f, 0x1f, 0x60, 0x20, 0x00, 0x11, 0x00, 0xe8, 0x00, 0x1e,
+ 0x1f, 0x20, 0xdf, 0xbd,
+ 0x0e, 0x1d, 0x00, 0xb0, 0xfe, 0x1d, 0x72, 0x04, 0xee, 0xe0, 0x16, 0x33,
+ 0x10, 0x11, 0xf7, 0xd2,
+ 0xe1, 0xde, 0x2f, 0x11, 0x80, 0xcd, 0x13, 0x35, 0x0e, 0x13, 0x00, 0xdb,
+ 0xf2, 0xf6, 0xc0, 0xcf,
+ 0xf0, 0x10, 0x12, 0xc0, 0xc0, 0xe3, 0xf0, 0x1f, 0x70, 0x37, 0xf2, 0xcd,
+ 0x11, 0x23, 0x01, 0xd3,
+ 0x05, 0x32, 0x02, 0xf0, 0x00, 0x04, 0xe0, 0xc0, 0x00, 0x30, 0x37, 0x82,
+ 0xf0, 0x0d, 0x11, 0xdf,
+ 0xf1, 0x57, 0x1e, 0x0f, 0x30, 0xf0, 0xd9, 0x20, 0x72, 0x30, 0xf0, 0xf0,
+ 0x00, 0x3e, 0x1d, 0x30,
+ 0x22, 0xc0, 0xce, 0x0f, 0x1f, 0x1f, 0xfe, 0x8a, 0x00, 0x22, 0xfc, 0xd9,
+ 0x70, 0x12, 0x0d, 0xef,
+ 0x20, 0x20, 0x00, 0x2d, 0x1e, 0x0f, 0x0e, 0x0f, 0xec, 0xd8, 0x40, 0x1f,
+ 0xd0, 0xe0, 0x0b, 0xef,
+ 0x9f, 0xf1, 0x51, 0x30, 0xfd, 0xd1, 0x06, 0x30, 0x11, 0xe1, 0xf2, 0x00,
+ 0x0e, 0xbf, 0x16, 0xe0,
+ 0x9f, 0x0f, 0x10, 0x12, 0xf3, 0x00, 0xfd, 0xde, 0x10, 0x46, 0xf2, 0x80,
+ 0xce, 0x15, 0x12, 0xff,
+ 0xed, 0xf0, 0x00, 0x21, 0x33, 0x26, 0xdf, 0xf0, 0x04, 0x02, 0xe0, 0x60,
+ 0x25, 0x02, 0x00, 0xd0,
+ 0xd2, 0xf6, 0xd0, 0x0e, 0x71, 0x35, 0xe0, 0x8f, 0x0f, 0xf1, 0x04, 0x10,
+ 0x1e, 0x1f, 0x20, 0x00,
+ 0xe0, 0x00, 0x2e, 0x1f, 0x1e, 0x74, 0x10, 0xf8, 0x0f, 0x20, 0x32, 0x21,
+ 0xfe, 0xeb, 0x20, 0x01,
+ 0xb0, 0x10, 0x00, 0xae, 0xfc, 0x0f, 0x2e, 0x00, 0xec, 0x3e, 0x7c, 0x2c,
+ 0x14, 0x26, 0xe0, 0xeb,
+ 0x2f, 0x70, 0x0f, 0xf0, 0x11, 0xff, 0xde, 0x00, 0x2f, 0xfd, 0xed, 0xdd,
+ 0x00, 0x32, 0xed, 0x1d,
+ 0x75, 0x23, 0x00, 0x04, 0xf2, 0xbe, 0x0e, 0x02, 0xf2, 0x06, 0xe1, 0xb0,
+ 0xfe, 0xdd, 0x44, 0x54,
+ 0x00, 0xdd, 0x00, 0x03, 0xe1, 0xd3, 0xe4, 0xcf, 0xe1, 0xe3, 0x80, 0xf0,
+ 0x03, 0x36, 0x1e, 0xca,
+ 0x03, 0x57, 0xf0, 0xce, 0x11, 0x43, 0x01, 0xef, 0xe0, 0x15, 0x31, 0x12,
+ 0x11, 0xc0, 0xf0, 0xf0,
+ 0x21, 0x16, 0xe2, 0xa0, 0xff, 0x0d, 0x01, 0x36, 0x11, 0x0f, 0x1f, 0x0f,
+ 0xdd, 0x00, 0x61, 0x10,
+ 0x22, 0x35, 0x2f, 0x3b, 0x1f, 0xed, 0x21, 0x72, 0x43, 0x00, 0xec, 0xff,
+ 0xee, 0xee, 0x03, 0xf0,
+ 0x98, 0x10, 0x30, 0x0f, 0xec, 0xff, 0x30, 0x72, 0x3f, 0x2f, 0x0d, 0xdc,
+ 0x00, 0x2f, 0x4d, 0x21,
+ 0x45, 0xd9, 0xbc, 0x00, 0x11, 0xe0, 0xfe, 0x1c, 0xef, 0x00, 0x71, 0x01,
+ 0x1f, 0x0f, 0xf0, 0x04,
+ 0x11, 0x02, 0x03, 0xb0, 0xf0, 0x1e, 0xfc, 0xe4, 0x37, 0xb0, 0xff, 0x70,
+ 0x0f, 0xdd, 0x24, 0x04,
+ 0xef, 0xff, 0xf3, 0xc0, 0xd0, 0x0e, 0x02, 0x07, 0xc0, 0x9d, 0x0f, 0x42,
+ 0x04, 0x01, 0xff, 0xff,
+ 0x04, 0x13, 0xf0, 0x30, 0x32, 0xf6, 0xe0, 0x00, 0x01, 0xd0, 0x03, 0x15,
+ 0x32, 0xb0, 0x8e, 0x02,
+ 0x07, 0x31, 0xde, 0xf0, 0x0f, 0x0e, 0x41, 0x12, 0x02, 0xf1, 0xb0, 0x08,
+ 0x50, 0x2f, 0x10, 0x33,
+ 0x4f, 0x0e, 0xee, 0xfe, 0x22, 0x03, 0xee, 0x20, 0x70, 0xfc, 0x98, 0x00,
+ 0x0f, 0x0e, 0x01, 0x43,
+ 0xfc, 0xec, 0x11, 0x20, 0x0e, 0x20, 0x50, 0xfb, 0x0d, 0x11, 0x23, 0x00,
+ 0xff, 0x0e, 0xc8, 0xfb,
+ 0x30, 0xf1, 0xaf, 0x1f, 0x2f, 0xfe, 0xf0, 0x32, 0x62, 0x0f, 0xde, 0x0f,
+ 0x01, 0x14, 0x02, 0xc2,
+ 0x06, 0x00, 0x0f, 0xce, 0x0e, 0x31, 0x01, 0xd1, 0x27, 0x62, 0xcd, 0xfe,
+ 0x22, 0xd3, 0xbf, 0x00,
+ 0x16, 0xc0, 0xdd, 0x00, 0x22, 0xf5, 0xcf, 0x0f, 0x30, 0x23, 0xc0, 0xd0,
+ 0x00, 0x15, 0x45, 0x10,
+ 0x00, 0x1e, 0x41, 0x04, 0xb1, 0xe2, 0xd1, 0x0f, 0x72, 0x26, 0xc0, 0xd1,
+ 0x01, 0x21, 0x2f, 0x01,
+ 0x02, 0xaf, 0xfe, 0x13, 0x33, 0xfb, 0xff, 0x22, 0x51, 0x0c, 0x0c, 0x1e,
+ 0x2e, 0x20, 0x47, 0x20,
+ 0x0c, 0xe1, 0x15, 0xff, 0xbd, 0x0f, 0x0f, 0xef, 0xe0, 0x10, 0x30, 0xf0,
+ 0xce, 0x0c, 0x3b, 0x7f,
+ 0x40, 0x00, 0x31, 0x30, 0x0f, 0x10, 0x08, 0x1e, 0x10, 0x00, 0x02, 0xcd,
+ 0x89, 0xef, 0x3f, 0x1e,
+ 0xf0, 0x42, 0x1f, 0xdc, 0x00, 0x60, 0x00, 0xf3, 0x04, 0x01, 0xdf, 0xfb,
+ 0x00, 0x03, 0xb2, 0x02,
+ 0x30, 0x0b, 0xf1, 0x22, 0x2f, 0xde, 0xb1, 0xf5, 0x03, 0xf2, 0x8d, 0xec,
+ 0xe0, 0x03, 0x14, 0xd0,
+ 0xee, 0x00, 0x31, 0x01, 0x80, 0xf5, 0x05, 0x2f, 0x1d, 0x01, 0xf6, 0x01,
+ 0x30, 0x1f, 0x10, 0x01,
+ 0xc7, 0xd1, 0xe0, 0xe0, 0x31, 0x41, 0xd0, 0xed, 0xa1, 0x06, 0x33, 0xde,
+ 0x9d, 0x10, 0x33, 0x01,
+ 0xa0, 0x00, 0x0e, 0x2a, 0x41, 0x21, 0x11, 0x1f, 0xff, 0xf1, 0x51, 0x5d,
+ 0x0d, 0xfe, 0xd1, 0x10,
+ 0x11, 0x03, 0xfd, 0xd8, 0xfe, 0xfd, 0xef, 0x0e, 0x11, 0x4e, 0xf8, 0x50,
+ 0x61, 0x00, 0x0d, 0x20,
+ 0x00, 0x00, 0x73, 0x0b, 0xfa, 0xf0, 0xff, 0x0e, 0xfe, 0xf0, 0x0e, 0x0c,
+ 0x2f, 0x2f, 0x0e, 0x30,
+ 0x0f, 0xf0, 0xdd, 0x65, 0x23, 0x90, 0xe3, 0x01, 0x2f, 0x2f, 0xdf, 0xc0,
+ 0x24, 0x00, 0x50, 0x17,
+ 0xf6, 0xcf, 0x00, 0x0f, 0x0f, 0x03, 0xd4, 0xaf, 0x0f, 0x01, 0xe0, 0xdf,
+ 0x14, 0x33, 0xce, 0xcc,
+ 0x02, 0x20, 0xf4, 0x07, 0x13, 0x30, 0x1c, 0x20, 0x00, 0xc3, 0xd3, 0x05,
+ 0x30, 0xf0, 0x01, 0x34,
+ 0x80, 0xee, 0x33, 0x43, 0xc0, 0xcf, 0x14, 0x35, 0xc0, 0xee, 0x11, 0x00,
+ 0xd0, 0xdf, 0x0f, 0x7f,
+ 0x53, 0x27, 0x0d, 0x0d, 0x0e, 0x03, 0x35, 0x2f, 0x4b, 0x00, 0x00, 0x01,
+ 0xdf, 0x00, 0xf2, 0xb0,
+ 0x08, 0x00, 0x0e, 0xf0, 0xc0, 0xf0, 0x4f, 0x7f, 0x31, 0xff, 0x0c, 0x31,
+ 0x50, 0xee, 0x00, 0x00,
+ 0x0a, 0x1d, 0x20, 0xcc, 0xdf, 0xff, 0x0b, 0x4f, 0x6f, 0x00, 0xdc, 0x0d,
+ 0x21, 0x22, 0x23, 0x03,
+ 0xba, 0xee, 0x01, 0x14, 0x00, 0xc0, 0x10, 0x01, 0x0d, 0x21, 0x54, 0x03,
+ 0xe0, 0x0d, 0xdf, 0xd4,
+ 0xd5, 0x02, 0x0f, 0x0e, 0xe0, 0x8e, 0xb0, 0x06, 0xf1, 0xf0, 0x13, 0x11,
+ 0xff, 0xb0, 0xff, 0x10,
+ 0x37, 0x06, 0x0e, 0x4e, 0x12, 0xd3, 0xc2, 0x01, 0x02, 0x00, 0x02, 0x00,
+ 0x2f, 0x45, 0xf4, 0xb1,
+ 0xf2, 0xe2, 0x02, 0x00, 0xce, 0x00, 0xe0, 0x00, 0xc1, 0xf4, 0x77, 0x2e,
+ 0xda, 0x30, 0x73, 0x00,
+ 0x0c, 0x20, 0x20, 0x11, 0x02, 0x11, 0x0d, 0xda, 0x41, 0x42, 0xbe, 0xdd,
+ 0x02, 0x0f, 0x0a, 0x20,
+ 0xf0, 0xb0, 0x0c, 0x51, 0x22, 0x30, 0x0f, 0xeb, 0x20, 0x40, 0x00, 0x00,
+ 0xef, 0xed, 0x0c, 0x1d,
+ 0x3e, 0xdc, 0xae, 0x0f, 0x2e, 0x7d, 0x1b, 0xfc, 0xef, 0x04, 0x33, 0xff,
+ 0xde, 0x00, 0x10, 0xe1,
+ 0xc6, 0x00, 0x0e, 0x7e, 0x21, 0xe2, 0xd1, 0x13, 0x23, 0xf0, 0xee, 0x03,
+ 0xd1, 0xd3, 0x17, 0x20,
+ 0xd0, 0x83, 0xe0, 0xcc, 0xe0, 0xc7, 0x03, 0x1e, 0x3f, 0xf2, 0x90, 0x00,
+ 0x34, 0x01, 0xf4, 0x33,
+ 0x0d, 0xcf, 0x07, 0x05, 0x00, 0x0f, 0x00, 0x53, 0x23, 0xd0, 0xc0, 0xe4,
+ 0x04, 0x41, 0x11, 0xdf,
+ 0xbe, 0x02, 0xf0, 0xbb, 0x25, 0x44, 0xee, 0x0f, 0x30, 0x0e, 0xf0, 0x30,
+ 0x3f, 0x0e, 0x75, 0x74,
+ 0xfc, 0xdd, 0x01, 0x23, 0x10, 0x0e, 0x0f, 0x0e, 0xcb, 0xf0, 0x00, 0xe0,
+ 0x1d, 0x3f, 0x20, 0x00,
+ 0x3f, 0x4d, 0x1b, 0x2f, 0x22, 0x35, 0x0f, 0xca, 0x2f, 0x0f, 0xe0, 0xde,
+ 0xdd, 0xbd, 0xff, 0x7e,
+ 0x4b, 0x0d, 0x0f, 0x11, 0xed, 0xdb, 0x23, 0x15, 0xdf, 0xcd, 0x2f, 0x10,
+ 0xf2, 0x02, 0x31, 0xb0,
+ 0xef, 0x30, 0x2d, 0xe0, 0x04, 0x56, 0x04, 0xc1, 0x0f, 0xec, 0xf1, 0x81,
+ 0xf0, 0x0e, 0xe6, 0xc2,
+ 0xe0, 0xee, 0xf0, 0xf1, 0x00, 0x20, 0xc3, 0xe1, 0x42, 0x01, 0x02, 0xe7,
+ 0x11, 0x1f, 0x60, 0x27,
+ 0xd1, 0xb0, 0x0f, 0x23, 0x01, 0x35, 0x41, 0x90, 0x01, 0x03, 0xee, 0x01,
+ 0xf4, 0xdf, 0xf0, 0x27,
+ 0xf0, 0xde, 0x10, 0x30, 0x7f, 0x41, 0x0f, 0xdd, 0x34, 0x53, 0x0f, 0xfa,
+ 0x20, 0x42, 0x00, 0xee,
+ 0x11, 0x00, 0xde, 0xeb, 0x00, 0x0f, 0xcc, 0xe0, 0x0f, 0x0d, 0x6e, 0x32,
+ 0x20, 0x1e, 0x6f, 0x1e,
+ 0x0a, 0xf0, 0x35, 0x00, 0xdd, 0xac, 0x1e, 0x4f, 0x0b, 0xec, 0x10, 0x2f,
+ 0x0d, 0x1f, 0x20, 0xd9,
+ 0x0f, 0x10, 0x10, 0xd3, 0xdf, 0x30, 0xa0, 0xc0, 0x3e, 0x3d, 0x00, 0xe6,
+ 0x00, 0x01, 0x75, 0x00,
+ 0xac, 0x00, 0x11, 0x11, 0x12, 0x03, 0xfd, 0xad, 0xf1, 0x06, 0xe2, 0xf1,
+ 0xe0, 0xff, 0x10, 0x00,
+ 0xbc, 0xbf, 0x04, 0x37, 0x23, 0x0f, 0xfd, 0xde, 0x0f, 0x25, 0x02, 0xd2,
+ 0x20, 0x71, 0x00, 0x00,
+ 0xe3, 0xf2, 0x01, 0x47, 0x01, 0xa0, 0x00, 0x00, 0xf2, 0xd2, 0xf0, 0xe1,
+ 0x00, 0x70, 0x04, 0x0e,
+ 0x2e, 0xfd, 0xfe, 0x12, 0x57, 0x12, 0x4d, 0x0b, 0x20, 0x00, 0x16, 0x00,
+ 0x0d, 0xed, 0xd2, 0xc5,
+ 0xbe, 0x0c, 0x3f, 0x01, 0xd1, 0xbf, 0x1c, 0x70, 0x62, 0x01, 0xd0, 0x0d,
+ 0xfc, 0x15, 0x34, 0x1e,
+ 0x0b, 0xdf, 0xef, 0x02, 0x11, 0x4e, 0x0b, 0x00, 0xd0, 0x1f, 0x4e, 0x20,
+ 0xdf, 0xb2, 0x21, 0x3b,
+ 0xf0, 0xa0, 0xf2, 0x10, 0x7c, 0x0e, 0xef, 0xe7, 0x06, 0x4f, 0x1e, 0xe0,
+ 0xee, 0x00, 0x40, 0x23,
+ 0xe3, 0xcb, 0x0e, 0x11, 0x01, 0xf2, 0xb0, 0x00, 0x0f, 0x1f, 0x05, 0x05,
+ 0x88, 0x00, 0xa4, 0x00,
+ 0x6a, 0xec, 0xb1, 0x07, 0x5a, 0xef, 0xc1, 0x01, 0xd2, 0x6a, 0x1e, 0xff,
+ 0xc5, 0xf3, 0x22, 0x6f,
+ 0x0b, 0xf0, 0xe1, 0x01, 0x02, 0xf2, 0xa0, 0xde, 0x00, 0x25, 0x20, 0x02,
+ 0x00, 0x44, 0x72, 0x0e,
+ 0x1e, 0x03, 0xb4, 0x00, 0x0d, 0x1f, 0x0f, 0xe5, 0x02, 0x0d, 0x0d, 0xfe,
+ 0xff, 0x61, 0x37, 0x26,
+ 0x0e, 0x0e, 0x0f, 0x40, 0x11, 0xe3, 0xe0, 0x0c, 0xfe, 0x10, 0x21, 0x9f,
+ 0xdd, 0x20, 0x2f, 0x28,
+ 0x10, 0xcf, 0xf0, 0x14, 0x40, 0x0b, 0xd0, 0x02, 0xf0, 0x2f, 0x2b, 0x50,
+ 0x1f, 0xd0, 0xc0, 0x10,
+ 0x4e, 0x2c, 0xff, 0x91, 0xf7, 0xe0, 0xfc, 0x00, 0x40, 0x21, 0x00, 0xe3,
+ 0x0f, 0xec, 0x0f, 0x00,
+ 0x02, 0xd1, 0xc1, 0xc0, 0x2d, 0x40, 0x7f, 0x23, 0xf1, 0xc2, 0xb6, 0x00,
+ 0x10, 0x30, 0x21, 0xd2,
+ 0xe2, 0x04, 0xe0, 0xcb, 0xe0, 0xe3, 0xd1, 0xff, 0x30, 0x74, 0x11, 0x24,
+ 0x33, 0x00, 0x00, 0x07,
+ 0xf6, 0x02, 0x20, 0x0f, 0x1f, 0x21, 0xf2, 0x90, 0xb0, 0xe5, 0x03, 0x00,
+ 0x4b, 0xff, 0xdf, 0xf0,
+ 0x02, 0x20, 0x5d, 0x12, 0x07, 0x00, 0xdd, 0x0d, 0x70, 0x10, 0x12, 0x13,
+ 0x1e, 0x38, 0x10, 0xff,
+ 0xd0, 0xe2, 0xe1, 0x0e, 0x29, 0x2f, 0xe0, 0xb0, 0xe0, 0xe1, 0x0f, 0x7b,
+ 0x20, 0x1f, 0x50, 0x22,
+ 0x03, 0x8e, 0xfd, 0x00, 0x00, 0x04, 0x02, 0xe0, 0x0e, 0x2c, 0x5b, 0x00,
+ 0xde, 0x00, 0xe1, 0x05,
+ 0x00, 0x0f, 0x2d, 0x3e, 0x00, 0xe2, 0xc4, 0xc6, 0xf2, 0xff, 0x1c, 0x2f,
+ 0x53, 0x33, 0xf3, 0xe1,
+ 0xd0, 0x00, 0x00, 0xc1, 0x82, 0xe2, 0x07, 0x02, 0x10, 0x7e, 0x00, 0xff,
+ 0xe2, 0xf6, 0x22, 0x41,
+ 0x32, 0x02, 0xf0, 0xd0, 0xdc, 0x00, 0x04, 0x34, 0x33, 0x4d, 0x0a, 0x9f,
+ 0x00, 0x00, 0x50, 0x33,
+ 0x0f, 0x0b, 0xe0, 0xf3, 0x02, 0xf1, 0x0f, 0x1a, 0xff, 0x10, 0x3f, 0x10,
+ 0x23, 0xb0, 0xb8, 0x0f,
+ 0x70, 0x20, 0x0e, 0xf0, 0xe1, 0x00, 0x0c, 0x0f, 0x2f, 0x30, 0x2d, 0x00,
+ 0x0f, 0x4c, 0xcc, 0xdc,
+ 0xee, 0xc0, 0xc1, 0xf6, 0xe0, 0x50, 0x4c, 0xef, 0xff, 0x02, 0xe0, 0xe0,
+ 0x02, 0x12, 0x1f, 0xfb,
+ 0xfe, 0x50, 0x14, 0x01, 0xe3, 0xbd, 0xdb, 0xe0, 0xd1, 0x21, 0x52, 0x30,
+ 0x0e, 0x00, 0xb2, 0xd5,
+ 0xe0, 0xd0, 0xd0, 0xd6, 0x01, 0xe3, 0x00, 0x19, 0xd0, 0x2e, 0x73, 0x67,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x23, 0x22, 0x00, 0xf1, 0xd0, 0x01, 0xf0, 0xf0, 0xe0, 0xf3, 0x00,
+ 0x79, 0x7f, 0x20, 0x00,
+ 0xb2, 0xf0, 0x03, 0x02, 0x1a, 0x1d, 0x20, 0x03, 0xe1, 0xd0, 0x0e, 0x20,
+ 0x3c, 0x7f, 0x10, 0x03,
+ 0x27, 0x10, 0x0f, 0xee, 0xff, 0xc1, 0xd1, 0xd1, 0x20, 0x7f, 0x0b, 0x2c,
+ 0x0c, 0xee, 0xf0, 0xf1,
+ 0xe7, 0x10, 0x2f, 0x4d, 0x4f, 0x22, 0xc4, 0xe1, 0xf0, 0xed, 0xee, 0xf0,
+ 0xe0, 0xe0, 0x2e, 0x7f,
+ 0x6f, 0x01, 0x03, 0xd9, 0xde, 0x00, 0x05, 0x23, 0x73, 0x1f, 0x18, 0xf0,
+ 0xf0, 0xf0, 0x05, 0x01,
+ 0xe0, 0xef, 0xfd, 0xd0, 0xb0, 0xe1, 0xf1, 0x00, 0x4d, 0x4f, 0x00, 0xd0,
+ 0xb1, 0xe7, 0x41, 0x51,
+ 0x2e, 0x0e, 0x03, 0xd7, 0xe2, 0xf0, 0xff, 0x2e, 0x40, 0x50, 0x00, 0x02,
+ 0xf1, 0xf0, 0x2b, 0x50,
+ 0x10, 0xf1, 0xd0, 0x03, 0x1f, 0x1a, 0x0f, 0xe0, 0x90, 0xf0, 0xe0, 0x20,
+ 0x40, 0x5e, 0x0a, 0x0d,
+ 0xff, 0xc2, 0x04, 0x02, 0x12, 0x4c, 0x3c, 0xfd, 0xb0, 0x13, 0x00, 0x2b,
+ 0x1e, 0x0f, 0xd1, 0xf3,
+ 0x03, 0xeb, 0x0f, 0x41, 0x25, 0xe2, 0x8e, 0xed, 0xff, 0x00, 0x15, 0x60,
+ 0x23, 0x00, 0x00, 0x0d,
+ 0xd0, 0x12, 0x12, 0x07, 0x06, 0xff, 0x0e, 0x0f, 0x40, 0x00, 0x01, 0x03,
+ 0xe0, 0xf1, 0x2f, 0xf0,
+ 0x80, 0xa4, 0x02, 0x0f, 0x0f, 0x00, 0x00, 0xe4, 0xe2, 0xee, 0x00, 0x2f,
+ 0x70, 0x1f, 0x30, 0x05,
+ 0x07, 0xd4, 0xef, 0x0f, 0x01, 0x00, 0x0e, 0x10, 0x1e, 0x00, 0xf0, 0x11,
+ 0x5c, 0x28, 0x3d, 0x7f,
+ 0x44, 0x01, 0x0c, 0x0d, 0xdf, 0x00, 0xc3, 0x03, 0x0e, 0x39, 0x7f, 0x1f,
+ 0x0e, 0x00, 0xff, 0xf0,
+ 0x03, 0x02, 0xfe, 0xfb, 0x2e, 0x5e, 0x11, 0xe1, 0xd3, 0xe0, 0x08, 0xcc,
+ 0xcd, 0xf1, 0x13, 0x11,
+ 0x10, 0x4f, 0x0b, 0x9f, 0xde, 0xf4, 0xe5, 0xd1, 0x0f, 0x7f, 0x3f, 0xff,
+ 0xb2, 0xe3, 0x07, 0xe0,
+ 0xff, 0x00, 0x0f, 0xe1, 0xd1, 0xd2, 0x21, 0x71, 0x5f, 0x1f, 0x04, 0xf7,
+ 0xc2, 0xff, 0x0e, 0x01,
+ 0x21, 0xf0, 0xc1, 0xe2, 0xc1, 0xf0, 0xff, 0xfd, 0x0e, 0x2d, 0x10, 0xf5,
+ 0x12, 0x52, 0x32, 0x00,
+ 0xf2, 0xc2, 0xf7, 0xf7, 0xf0, 0x4f, 0x5e, 0x00, 0xc0, 0xe1, 0x00, 0x00,
+ 0x4b, 0x6e, 0x1d, 0x1f,
+ 0xff, 0xed, 0x0e, 0x00, 0x10, 0x1f, 0x0a, 0xfe, 0x0d, 0x0d, 0x3c, 0x70,
+ 0x60, 0x01, 0xdb, 0xfd,
+ 0x0f, 0x20, 0x13, 0x34, 0x2f, 0x3d, 0x0e, 0xc9, 0xf0, 0x0f, 0x0e, 0x30,
+ 0x31, 0x3d, 0x0d, 0xad,
+ 0xff, 0xf1, 0x04, 0x00, 0xed, 0xf1, 0x05, 0xff, 0x0c, 0x20, 0x23, 0x60,
+ 0x23, 0x14, 0xc4, 0xb5,
+ 0xf0, 0x0f, 0x2e, 0x42, 0x37, 0x14, 0x01, 0x10, 0x20, 0xf2, 0xa4, 0xe2,
+ 0xb0, 0x0f, 0x01, 0x06,
+ 0x01, 0xa2, 0xf0, 0xdf, 0xf0, 0xe0, 0xf2, 0x14, 0x20, 0x20, 0x0e, 0xf0,
+ 0xd5, 0x02, 0x10, 0x40,
+ 0x32, 0xe6, 0xc1, 0xf0, 0xde, 0x8e, 0xf2, 0xe7, 0x03, 0xf0, 0x0c, 0x1f,
+ 0x4f, 0x3f, 0x3f, 0x20,
+ 0x02, 0xa1, 0xee, 0x08, 0x0f, 0x20, 0x10, 0x20, 0x2e, 0x6d, 0x3d, 0x2c,
+ 0xfd, 0xaf, 0xf0, 0x02,
+ 0x1f, 0x5b, 0x3f, 0x4f, 0xff, 0xd0, 0xff, 0x1b, 0x4e, 0x5e, 0x2e, 0x2f,
+ 0xff, 0xe0, 0x00, 0x1d,
+ 0x3d, 0x10, 0x04, 0xf0, 0xcf, 0xed, 0x10, 0x6e, 0x30, 0x30, 0x07, 0xb7,
+ 0xd0, 0xe2, 0xf1, 0xfe,
+ 0x0d, 0x41, 0x15, 0xf5, 0xd2, 0x00, 0x40, 0x50, 0x01, 0x02, 0xf3, 0x04,
+ 0x54, 0x10, 0x32, 0x04,
+ 0xa2, 0xf5, 0xc1, 0xd2, 0xe1, 0x01, 0x10, 0x10, 0xe0, 0x8e, 0xf0, 0x07,
+ 0x32, 0x22, 0x0e, 0x1e,
+ 0xf1, 0x04, 0xe7, 0xf2, 0x03, 0xe0, 0xf0, 0xef, 0xc0, 0x03, 0x00, 0x7d,
+ 0x2e, 0x0e, 0x0d, 0xdd,
+ 0xce, 0xff, 0xfc, 0x0f, 0x42, 0x3d, 0x18, 0x0d, 0xe0, 0xe0, 0xfc, 0x1d,
+ 0x2c, 0x70, 0x21, 0x02,
+ 0xd9, 0x0d, 0x5f, 0x3f, 0x30, 0x02, 0xfd, 0x08, 0x3f, 0x3d, 0x60, 0x2f,
+ 0x1f, 0x0e, 0x0f, 0x00,
+ 0xdf, 0xfe, 0x0a, 0x1f, 0x1d, 0x30, 0x72, 0x41, 0x20, 0xee, 0xfc, 0xd1,
+ 0xa2, 0xe1, 0xff, 0x00,
+ 0x20, 0x45, 0x00, 0xb0, 0xe2, 0xe2, 0x03, 0x33, 0x43, 0x31, 0xf0, 0xc2,
+ 0xf3, 0x05, 0x07, 0xe7,
+ 0x82, 0xd1, 0xde, 0xee, 0x00, 0x00, 0xe4, 0xb1, 0xf2, 0x02, 0x4f, 0x1f,
+ 0x20, 0x03, 0x07, 0x03,
+ 0xf4, 0xb1, 0xd0, 0xe2, 0xd4, 0xe3, 0xf4, 0xd0, 0x00, 0x71, 0x31, 0x2f,
+ 0xf0, 0xd2, 0xb0, 0x00,
+ 0x13, 0x26, 0x61, 0x0d, 0x0d, 0xfc, 0xe0, 0x10, 0x21, 0x0c, 0x5b, 0x2e,
+ 0xfd, 0xef, 0xef, 0x10,
+ 0x50, 0x2b, 0x30, 0x04, 0xc0, 0x0d, 0x09, 0x40, 0x4d, 0x5f, 0x00, 0x03,
+ 0x00, 0x0a, 0x0f, 0x2e,
+ 0x0f, 0x1e, 0x0f, 0x0e, 0x2f, 0x50, 0x2e, 0x0b, 0xee, 0xdf, 0xf1, 0xe3,
+ 0xe0, 0x0b, 0x1d, 0x4f,
+ 0xdf, 0xa0, 0xc6, 0xd2, 0x01, 0x2f, 0x7d, 0x3f, 0x00, 0xf0, 0xf6, 0xf4,
+ 0x03, 0x30, 0xff, 0xbe,
+ 0xe1, 0xa3, 0xf4, 0xd3, 0x00, 0xef, 0xee, 0xc2, 0xe5, 0xf2, 0xfe, 0x0c,
+ 0x7f, 0x12, 0x16, 0xe2,
+ 0xd1, 0xd1, 0x00, 0x05, 0x05, 0x62, 0x11, 0x10, 0xef, 0xf0, 0x03, 0x03,
+ 0x12, 0xf0, 0xe1, 0xe0,
+ 0xd0, 0x00, 0xfe, 0x3f, 0x7e, 0x14, 0x13, 0x0e, 0x08, 0x1e, 0x5e, 0x30,
+ 0x20, 0x00, 0x00, 0x05,
+ 0x30, 0x5f, 0x29, 0x1f, 0xf0, 0xd0, 0x3e, 0x7e, 0x7d, 0x3f, 0x0f, 0xd0,
+ 0xff, 0x0c, 0x1e, 0x20,
+ 0x3c, 0x0c, 0x1d, 0x0d, 0x00, 0x21, 0x04, 0x32, 0x4d, 0x18, 0xfe, 0xdf,
+ 0x0e, 0x20, 0x0e, 0xa0,
+ 0xc5, 0xa0, 0xdd, 0x0d, 0x1d, 0x50, 0x11, 0xf5, 0xf0, 0x0f, 0x3e, 0x02,
+ 0x17, 0x00, 0xd0, 0xde,
+ 0xc2, 0xd5, 0xd2, 0x90, 0xdd, 0xc0, 0xe3, 0xe2, 0xe2, 0x10, 0x60, 0x2c,
+ 0x0e, 0xc0, 0xe4, 0xe7,
+ 0x02, 0xd0, 0x11, 0x13, 0x22, 0xd3, 0x91, 0xf0, 0x01, 0x07, 0x31, 0x01,
+ 0x9e, 0x0f, 0x01, 0x01,
+ 0x10, 0x41, 0x03, 0x01, 0x04, 0xe0, 0x0e, 0x0a, 0x0e, 0x20, 0x20, 0x02,
+ 0x10, 0xe0, 0xec, 0x0f,
+ 0x2f, 0x01, 0x00, 0x2e, 0x70, 0x70, 0x5a, 0x10, 0x0f, 0x0b, 0x02, 0x07,
+ 0x11, 0x1e, 0x2b, 0x2e,
+ 0x3e, 0x3f, 0xf0, 0xc2, 0x00, 0x3c, 0x6e, 0x2e, 0x30, 0x00, 0xce, 0xff,
+ 0x00, 0x24, 0x01, 0xc0,
+ 0xde, 0xaf, 0xfe, 0x0d, 0x20, 0x74, 0x11, 0x0c, 0xfe, 0xf3, 0x02, 0x30,
+ 0x2e, 0x23, 0x06, 0xd0,
+ 0xc0, 0xde, 0x84, 0xf1, 0xe0, 0x07, 0x01, 0x0f, 0xfe, 0xfd, 0x08, 0x0e,
+ 0x2f, 0x22, 0xc7, 0xd1,
+ 0xe2, 0x20, 0x3e, 0x40, 0x03, 0xa6, 0x03, 0xf2, 0x0f, 0x1e, 0x00, 0x02,
+ 0xb0, 0xff, 0xe2, 0x05,
+ 0x41, 0x20, 0xee, 0xbe, 0xfe, 0xcd, 0x0e, 0x1e, 0x6c, 0x3b, 0x0f, 0xee,
+ 0xe0, 0x0f, 0x13, 0x24,
+ 0x2f, 0x1b, 0x0d, 0x10, 0x23, 0x12, 0x02, 0xf0, 0x2d, 0x3b, 0x0f, 0xd4,
+ 0x01, 0x7a, 0x7e, 0x1e,
+ 0x00, 0xe3, 0x06, 0x20, 0x3e, 0x4e, 0x30, 0x20, 0x01, 0x01, 0xf1, 0x01,
+ 0x0e, 0xcc, 0xb0, 0xd5,
+ 0xd2, 0xf0, 0xfa, 0x00, 0x5f, 0x01, 0xb0, 0x03, 0x03, 0x74, 0x30, 0x00,
+ 0x11, 0x04, 0xe1, 0xf0,
+ 0xc1, 0xd7, 0xe5, 0x00, 0xd0, 0xef, 0x0f, 0xc0, 0xef, 0x0d, 0x20, 0x2f,
+ 0x0f, 0xa0, 0xc0, 0x00,
+ 0x02, 0x10, 0x20, 0x27, 0x26, 0xd0, 0xa2, 0xe0, 0x1d, 0x1f, 0x11, 0x53,
+ 0x04, 0xf1, 0xe1, 0x00,
+ 0x21, 0x00, 0xcf, 0xef, 0x0b, 0x2e, 0x6a, 0x3e, 0x4e, 0x00, 0xd2, 0xc0,
+ 0xeb, 0xed, 0x00, 0x2e,
+ 0x5c, 0x0d, 0xdb, 0xf0, 0x02, 0x51, 0x30, 0x3b, 0x2e, 0x0e, 0x0f, 0x00,
+ 0x43, 0x41, 0x2f, 0xf9,
+ 0xf0, 0xd0, 0x93, 0xf0, 0x1d, 0x6e, 0x3f, 0x0f, 0xe0, 0xd4, 0xf2, 0x0d,
+ 0x3f, 0x37, 0xf4, 0xa0,
+ 0xe0, 0xc0, 0x0f, 0x0f, 0x11, 0x06, 0x03, 0x12, 0x3e, 0x2c, 0x70, 0x11,
+ 0x12, 0x01, 0xc4, 0xf4,
+ 0xe3, 0xd0, 0xe0, 0xf4, 0xc1, 0xd0, 0xc0, 0xe1, 0x15, 0x41, 0xf0, 0xde,
+ 0xeb, 0xdf, 0x00, 0x53,
+ 0x27, 0x30, 0x10, 0x0e, 0xa0, 0xf4, 0xf3, 0x1f, 0x3c, 0x6f, 0x00, 0x03,
+ 0xd2, 0xf0, 0x0f, 0x0f,
+ 0x0f, 0x00, 0x00, 0x5a, 0x2d, 0x0b, 0x3e, 0x5f, 0x20, 0x12, 0xd2, 0x0c,
+ 0x0a, 0x3f, 0x4d, 0x1f,
+ 0x1f, 0x11, 0x12, 0x50, 0x2d, 0x0e, 0x0c, 0x2d, 0x20, 0x60, 0x0f, 0xfc,
+ 0xff, 0xcd, 0x09, 0xfe,
+ 0xff, 0x11, 0x50, 0x7e, 0x3a, 0x3f, 0x00, 0xf0, 0xe0, 0xf6, 0x51, 0x11,
+ 0x0f, 0x0f, 0xe0, 0xa0,
+ 0xd3, 0xc3, 0xe1, 0x01, 0x14, 0x31, 0x10, 0xfd, 0xd3, 0x67, 0x33, 0x44,
+ 0x02, 0xf3, 0xd2, 0xf1,
+ 0xe3, 0xc4, 0x07, 0x03, 0xe1, 0xd0, 0xbe, 0xf0, 0xe0, 0x01, 0xef, 0x0f,
+ 0xe0, 0xf0, 0xf1, 0x27,
+ 0x46, 0xd0, 0x90, 0xff, 0x01, 0xf4, 0x11, 0x61, 0x30, 0x0f, 0xf0, 0xd2,
+ 0xd7, 0x12, 0x00, 0x0c,
+ 0x6f, 0x20, 0xf0, 0xde, 0x0f, 0x3f, 0x70, 0x1e, 0xfc, 0xee, 0xfb, 0x0e,
+ 0x3e, 0x1d, 0x5e, 0x1e,
+ 0x00, 0xdf, 0x0c, 0x0c, 0x5f, 0x30, 0x50, 0x0d, 0x0e, 0xfd, 0x0a, 0x0e,
+ 0x1e, 0x20, 0x15, 0x0f,
+ 0x0c, 0x2e, 0x4f, 0x1e, 0xff, 0x0f, 0xff, 0xf1, 0xf0, 0x60, 0x5c, 0x09,
+ 0xef, 0xee, 0xf4, 0xc4,
+ 0xd0, 0xb0, 0x0c, 0xe0, 0x00, 0x15, 0x41, 0x32, 0x10, 0x2e, 0x30, 0xf2,
+ 0xd5, 0xa1, 0xf3, 0xb2,
+ 0xf2, 0xf1, 0x04, 0x06, 0xd1, 0x92, 0xd0, 0xf0, 0x01, 0x0f, 0x10, 0xf3,
+ 0xd2, 0x02, 0xd2, 0xe3,
+ 0xe7, 0xe0, 0xe0, 0x10, 0x40, 0x23, 0x00, 0xf1, 0xf0, 0x37, 0xe3, 0x82,
+ 0xb2, 0xf0, 0x0f, 0x2f,
+ 0x40, 0x11, 0xe1, 0xf4, 0x10, 0x3b, 0x4c, 0x0c, 0x2f, 0x0e, 0x20, 0x1f,
+ 0x2b, 0x6b, 0x2d, 0x1e,
+ 0xf0, 0xf0, 0xf0, 0x0c, 0x7c, 0x7f, 0x2e, 0x0c, 0xce, 0x0e, 0x00, 0x21,
+ 0x10, 0x5a, 0x1e, 0xed,
+ 0xed, 0x0f, 0x00, 0x56, 0x3e, 0x1c, 0xff, 0x0f, 0x10, 0x31, 0x51, 0x10,
+ 0x0f, 0xde, 0xe0, 0xa3,
+ 0xe3, 0xe0, 0xfd, 0xfc, 0x00, 0x11, 0x02, 0x03, 0xfe, 0x48, 0x5f, 0x1f,
+ 0xf2, 0xe7, 0x03, 0x12,
+ 0x30, 0x03, 0xc4, 0xa4, 0xd1, 0xd2, 0xe0, 0x00, 0xff, 0xf0, 0xc2, 0xd4,
+ 0xc1, 0xf5, 0xf1, 0xf4,
+ 0xe1, 0x00, 0x00, 0x02, 0x37, 0x42, 0x21, 0xe2, 0xe2, 0xa2, 0xd1, 0xf0,
+ 0xe1, 0x34, 0x61, 0x11,
+ 0x01, 0xf1, 0xe0, 0x0e, 0x0d, 0x0f, 0x5e, 0x3f, 0x30, 0x0b, 0x0a, 0xfd,
+ 0xdb, 0x2f, 0x10, 0x70,
+ 0x30, 0x4e, 0x0a, 0x0e, 0x2d, 0x5f, 0x30, 0x11, 0x00, 0x0a, 0x4d, 0x3e,
+ 0x3d, 0x0f, 0xee, 0xce,
+ 0xfc, 0x4c, 0x5e, 0x1d, 0x1e, 0x0d, 0x4c, 0x7d, 0x2d, 0x10, 0x21, 0x0e,
+ 0xe8, 0xe0, 0xe0, 0xc1,
+ 0xd0, 0xe0, 0x0e, 0x50, 0x20, 0x0f, 0xb3, 0x05, 0x3f, 0x2d, 0x3f, 0x00,
+ 0xf4, 0xc7, 0xf3, 0xf3,
+ 0xf1, 0xe1, 0xc0, 0xc3, 0xb5, 0xf1, 0xef, 0x0f, 0x20, 0x14, 0xd3, 0x95,
+ 0xf2, 0xf0, 0x01, 0x00,
+ 0xf4, 0xf3, 0xf3, 0xe3, 0xf5, 0x13, 0x31, 0x00, 0x84, 0xe3, 0xd5, 0x01,
+ 0x14, 0x53, 0x20, 0xef,
+ 0xc0, 0xf6, 0x03, 0x02, 0x5f, 0x3e, 0x0f, 0xef, 0xf1, 0x01, 0x0f, 0x2d,
+ 0x1d, 0x39, 0x4e, 0x0e,
+ 0xc0, 0xf0, 0x2d, 0x4c, 0x60, 0x1f, 0x0f, 0xef, 0x1f, 0x2d, 0x58, 0x1f,
+ 0x1e, 0xef, 0xf1, 0x00,
+ 0x0a, 0x3d, 0x2f, 0x7e, 0x3f, 0x0e, 0x4e, 0x3c, 0x2e, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0xee, 0xbe, 0xfe,
+ 0xe0, 0xfb, 0xf0, 0xf0, 0x00, 0xfd, 0x0c, 0x1e, 0x7d, 0x4b, 0x2d, 0x1f,
+ 0x03, 0xf7, 0x06, 0x00,
+ 0x00, 0x10, 0x00, 0xa1, 0xe1, 0xc2, 0xf2, 0xd0, 0xe0, 0xa1, 0xd3, 0xc2,
+ 0xc0, 0xe0, 0xd1, 0x21,
+ 0x41, 0x12, 0xc5, 0xe1, 0xe3, 0x07, 0x56, 0x01, 0x01, 0x01, 0xe1, 0x00,
+ 0xf3, 0x05, 0xc2, 0xe2,
+ 0xf1, 0x02, 0xe1, 0x01, 0x31, 0x21, 0x20, 0x01, 0xe4, 0xc3, 0x00, 0x0d,
+ 0x7c, 0x5d, 0x0f, 0xe0,
+ 0x04, 0x00, 0x50, 0x3e, 0x28, 0xfd, 0xff, 0x10, 0x42, 0x40, 0x3b, 0x2b,
+ 0x0f, 0xd0, 0xe0, 0xad,
+ 0x0e, 0x1d, 0x6e, 0x3e, 0x2e, 0x00, 0x1a, 0x3d, 0x3d, 0x3e, 0x30, 0xff,
+ 0xff, 0x0b, 0xce, 0x00,
+ 0x30, 0x3f, 0xcf, 0x9f, 0xec, 0x0b, 0x1d, 0x38, 0x6e, 0x0f, 0x0f, 0x01,
+ 0x04, 0x20, 0x2f, 0x0e,
+ 0xe0, 0xe3, 0xe2, 0xf5, 0x01, 0x30, 0xdc, 0x8f, 0xe0, 0xd2, 0xb6, 0xf1,
+ 0xf0, 0x2e, 0x3f, 0xf0,
+ 0xb0, 0xd7, 0xe3, 0x01, 0x0f, 0x2f, 0x00, 0xe5, 0x80, 0xe2, 0x00, 0xf0,
+ 0x00, 0x05, 0x02, 0xf1,
+ 0xe0, 0xf0, 0x22, 0x62, 0x13, 0x02, 0x00, 0xf2, 0xf1, 0x00, 0x0e, 0x0f,
+ 0x0d, 0x2e, 0xf0, 0xdf,
+ 0xdc, 0xee, 0xff, 0x7f, 0x5e, 0x3f, 0x07, 0x24, 0x21, 0x4f, 0x1c, 0x00,
+ 0xd0, 0xec, 0xaf, 0x10,
+ 0x1d, 0x48, 0x5c, 0x2f, 0x30, 0x00, 0x0c, 0x2e, 0x4d, 0x4b, 0x4d, 0x0e,
+ 0xf0, 0xe0, 0xe7, 0xf0,
+ 0x02, 0x1e, 0xec, 0x8f, 0xef, 0x00, 0x2e, 0x6e, 0x10, 0x1f, 0x0b, 0xf0,
+ 0xf0, 0x06, 0x21, 0x10,
+ 0x30, 0x1c, 0x00, 0xd2, 0xc1, 0xc1, 0xe0, 0xf0, 0xee, 0xde, 0x01, 0x01,
+ 0x2d, 0x00, 0x1b, 0x00,
+ 0x04, 0xea, 0x04, 0xfa, 0xb3, 0xf2, 0xa8, 0xf9, 0x20, 0x69, 0x2d, 0x41,
+ 0x04, 0xf7, 0x36, 0x7e,
+ 0x7d, 0x3f, 0xf1, 0x04, 0xe3, 0x01, 0x0e, 0x2f, 0x2e, 0xc2, 0xd7, 0xe1,
+ 0xe0, 0x2d, 0x3d, 0x3e,
+ 0xf0, 0xa0, 0xef, 0x1b, 0x1e, 0x4e, 0x7f, 0x2f, 0xfd, 0xd0, 0xf0, 0x01,
+ 0x01, 0x42, 0x22, 0x12,
+ 0xd7, 0xe1, 0x21, 0x70, 0x0e, 0xc0, 0xe2, 0xf5, 0xe2, 0x0e, 0xeb, 0x0f,
+ 0x1f, 0x23, 0x76, 0x14,
+ 0x20, 0x00, 0xf9, 0x0f, 0x40, 0x20, 0x02, 0xd3, 0x91, 0x00, 0xfd, 0xdf,
+ 0xe0, 0xc5, 0xf1, 0x0f,
+ 0x1c, 0x4d, 0x6f, 0x0f, 0xf1, 0xe3, 0xf6, 0x12, 0x30, 0x20, 0x3f, 0x01,
+ 0xf3, 0xb1, 0x03, 0xd2,
+ 0x0f, 0x2f, 0x0d, 0x0b, 0xdd, 0xbf, 0xdc, 0xe0, 0x01, 0x3e, 0x59, 0x0d,
+ 0xff, 0xc0, 0x16, 0x52,
+ 0x4d, 0x3d, 0x01, 0xc5, 0xf2, 0xf0, 0x00, 0x1f, 0x3f, 0x11, 0x26, 0xf1,
+ 0xc1, 0x00, 0x2b, 0x7f,
+ 0x20, 0x00, 0xd0, 0xd2, 0x10, 0x3d, 0x4e, 0x0c, 0x8d, 0xfd, 0xe0, 0xf0,
+ 0x10, 0x2c, 0x2d, 0x1c,
+ 0x01, 0x04, 0x05, 0x24, 0x51, 0x0d, 0x0c, 0xe1, 0xc2, 0xd2, 0xe3, 0x07,
+ 0x31, 0x6f, 0x0b, 0xf0,
+ 0xe1, 0x00, 0x20, 0x70, 0x3e, 0x1e, 0xd0, 0xb7, 0xe3, 0xe2, 0x0f, 0xfe,
+ 0x00, 0xf1, 0xf2, 0x0d,
+ 0x0d, 0x1f, 0x4f, 0x2f, 0xf4, 0x01, 0x2c, 0x6c, 0x1f, 0x11, 0x03, 0x17,
+ 0xf1, 0xd0, 0xf0, 0x10,
+ 0x0f, 0x90, 0xef, 0xf0, 0xde, 0xcd, 0x00, 0x00, 0xf0, 0x0d, 0xdf, 0x20,
+ 0x7e, 0x7b, 0x0c, 0x10,
+ 0x03, 0x04, 0x00, 0xe0, 0x0e, 0x18, 0x00, 0x00, 0x16, 0x61, 0x00, 0xcf,
+ 0x0d, 0x0f, 0x01, 0x14,
+ 0x44, 0x0f, 0xfc, 0x0d, 0x0b, 0x30, 0x00, 0xf1, 0xb0, 0xfd, 0xfa, 0x1f,
+ 0x61, 0x24, 0x10, 0x04,
+ 0x01, 0xfe, 0xff, 0xf0, 0xc3, 0xe0, 0xcf, 0xde, 0xb0, 0xf0, 0xe2, 0x06,
+ 0x00, 0x5f, 0x1d, 0x1c,
+ 0x20, 0x73, 0x44, 0x1e, 0x29, 0xd0, 0xc5, 0xd3, 0x01, 0x01, 0xfe, 0xfd,
+ 0xd0, 0xe0, 0xd6, 0xe0,
+ 0x0e, 0x4e, 0x1e, 0x32, 0xe1, 0xd2, 0x31, 0x40, 0x70, 0x4f, 0x23, 0xf6,
+ 0xc2, 0xf1, 0x00, 0x10,
+ 0x4b, 0x2e, 0xde, 0x91, 0xf2, 0xdf, 0x18, 0x2f, 0x1e, 0x00, 0xd0, 0x01,
+ 0x22, 0x33, 0x2e, 0x09,
+ 0x1f, 0x00, 0x10, 0x13, 0x23, 0x51, 0x50, 0x2b, 0xe0, 0xe0, 0xc5, 0x02,
+ 0x10, 0x3f, 0x5a, 0x20,
+ 0x00, 0xb0, 0x01, 0x00, 0x4f, 0x1c, 0xfd, 0xce, 0xd0, 0x00, 0xd0, 0x0f,
+ 0x51, 0x44, 0x11, 0x00,
+ 0xfd, 0xde, 0x00, 0x13, 0x66, 0x22, 0x00, 0xb0, 0xe0, 0xf7, 0xe5, 0x01,
+ 0x0f, 0x1f, 0x1e, 0x30,
+ 0x21, 0x2f, 0x2f, 0x00, 0xe2, 0xa0, 0xd1, 0x00, 0xe0, 0xe6, 0xe1, 0x01,
+ 0x00, 0xe2, 0xe2, 0xb2,
+ 0xe0, 0x0e, 0x2a, 0x7f, 0x00, 0xe0, 0x01, 0x40, 0x43, 0x37, 0x05, 0xe0,
+ 0xee, 0xff, 0x21, 0x64,
+ 0x11, 0xd2, 0xc0, 0xda, 0xbf, 0xf0, 0xf0, 0x33, 0x10, 0x1b, 0x0e, 0xff,
+ 0x0f, 0x2f, 0x3f, 0x5f,
+ 0x00, 0x3b, 0x4f, 0x0e, 0x40, 0x15, 0x02, 0xf1, 0xeb, 0xd0, 0xb0, 0xf2,
+ 0x03, 0x50, 0x4b, 0x10,
+ 0x25, 0x11, 0x40, 0x0b, 0xfe, 0xbf, 0xef, 0xe0, 0xf2, 0xf0, 0x3e, 0x5b,
+ 0x20, 0xff, 0xd1, 0xf2,
+ 0x00, 0x7e, 0x3f, 0x4d, 0xf0, 0xb0, 0xd5, 0xe7, 0xe2, 0xf0, 0x0f, 0x0f,
+ 0x1f, 0x00, 0x00, 0x42,
+ 0x70, 0x3f, 0x10, 0x01, 0xe2, 0xe5, 0x03, 0x16, 0x00, 0xd2, 0xe1, 0xb2,
+ 0xe3, 0xb0, 0xee, 0xda,
+ 0x00, 0x0d, 0x00, 0x10, 0x00, 0x11, 0x20, 0x6f, 0x38, 0x30, 0x32, 0xf7,
+ 0xf4, 0x0e, 0x5f, 0x3f,
+ 0x00, 0xa0, 0xd4, 0xf0, 0xdf, 0x0c, 0x10, 0x00, 0x00, 0xa1, 0xf0, 0xfe,
+ 0x00, 0x40, 0x3f, 0x1f,
+ 0x20, 0xfd, 0x00, 0x15, 0x73, 0x33, 0x0d, 0xf8, 0xcf, 0xff, 0xf0, 0xf3,
+ 0x23, 0x71, 0x4e, 0x0c,
+ 0xee, 0xf0, 0x00, 0x0f, 0xfc, 0x0c, 0x0d, 0x1e, 0xf0, 0xb1, 0xf0, 0x0f,
+ 0x1e, 0x60, 0x10, 0x0e,
+ 0x1c, 0x1e, 0x2d, 0x20, 0x02, 0x97, 0xe7, 0xe4, 0xf0, 0xfd, 0x0f, 0x10,
+ 0x0f, 0x00, 0x01, 0x32,
+ 0x30, 0x50, 0x0d, 0x00, 0xdd, 0x00, 0x17, 0x16, 0xe2, 0xd1, 0xb0, 0xd0,
+ 0xdf, 0xc1, 0xe5, 0x02,
+ 0x01, 0x3d, 0x2d, 0xd1, 0x86, 0xd0, 0x00, 0x51, 0x10, 0x30, 0xf0, 0xd6,
+ 0xf1, 0x01, 0x4d, 0x0f,
+ 0x1f, 0xf3, 0xe4, 0xde, 0xeb, 0x0f, 0xe0, 0xf2, 0xb6, 0xe0, 0xec, 0x00,
+ 0x0e, 0x10, 0x6f, 0x41,
+ 0x43, 0x31, 0x3c, 0x2e, 0x4f, 0xdf, 0x90, 0xe3, 0xf4, 0x00, 0x3e, 0x50,
+ 0x26, 0x13, 0x01, 0x11,
+ 0x1f, 0x1e, 0x3a, 0x2d, 0x3d, 0xee, 0x9f, 0xe0, 0xee, 0xdb, 0x0e, 0x70,
+ 0x2e, 0x0d, 0x0d, 0x0e,
+ 0x0e, 0x4e, 0x2a, 0x01, 0xe4, 0xb6, 0xe2, 0xcf, 0xec, 0x00, 0x31, 0x14,
+ 0xe2, 0xc1, 0x0e, 0x4c,
+ 0x7f, 0x00, 0x20, 0xf3, 0xe1, 0x0f, 0x4f, 0x00, 0xf5, 0xd2, 0xd3, 0xf1,
+ 0xe0, 0xf2, 0xd2, 0xe1,
+ 0xff, 0xab, 0xce, 0xdf, 0xf2, 0x21, 0x6e, 0x2a, 0x31, 0xe3, 0xf7, 0x27,
+ 0x40, 0x31, 0x2e, 0x00,
+ 0xc1, 0xd2, 0xe3, 0xf2, 0xde, 0xfd, 0xdf, 0xde, 0x80, 0xbe, 0x0c, 0xe0,
+ 0x2d, 0x3f, 0x4d, 0x10,
+ 0x00, 0x05, 0x03, 0x1f, 0x18, 0x4f, 0x0f, 0x00, 0xb1, 0x07, 0x21, 0x30,
+ 0x4f, 0x01, 0xd2, 0xf0,
+ 0x0c, 0x3f, 0x4d, 0x1f, 0xf0, 0xd0, 0xf0, 0xd0, 0xb2, 0xd4, 0x1a, 0x5b,
+ 0x3e, 0x30, 0x01, 0x20,
+ 0x40, 0x4d, 0x2e, 0x0f, 0xb0, 0xc4, 0xf3, 0x00, 0x0c, 0x0d, 0xd1, 0xd5,
+ 0xf0, 0xde, 0x0e, 0x00,
+ 0x72, 0x60, 0x1e, 0x10, 0x02, 0xdf, 0x0f, 0x05, 0x17, 0x37, 0x01, 0xc0,
+ 0xde, 0xc0, 0xef, 0xe1,
+ 0xe4, 0x00, 0xdd, 0xfc, 0x00, 0x10, 0x10, 0x02, 0x13, 0x70, 0x41, 0x10,
+ 0x00, 0xd5, 0x01, 0x02,
+ 0x33, 0x34, 0x0f, 0xcd, 0x10, 0xf0, 0x80, 0xd0, 0xce, 0x03, 0xf3, 0x1c,
+ 0x40, 0x37, 0x11, 0xd0,
+ 0xa1, 0x0c, 0x0d, 0x2e, 0x0f, 0xeb, 0x0e, 0xff, 0x1e, 0x11, 0x44, 0x47,
+ 0x16, 0x01, 0xff, 0x7c,
+ 0x5e, 0x20, 0x12, 0x02, 0xd0, 0xc0, 0x0d, 0xee, 0x0e, 0x00, 0x10, 0x0a,
+ 0x1e, 0x4e, 0x20, 0x5f,
+ 0x30, 0x0d, 0xcf, 0xf1, 0x06, 0x03, 0x22, 0xdf, 0xdc, 0xbf, 0xe3, 0xe6,
+ 0x01, 0x0f, 0x3a, 0x70,
+ 0x5f, 0x00, 0xef, 0x01, 0x01, 0x10, 0x4e, 0x20, 0xf0, 0xc3, 0xd7, 0xf3,
+ 0xe1, 0x0e, 0x0e, 0x0e,
+ 0xa0, 0xf2, 0xc2, 0xf0, 0x00, 0x3f, 0x5f, 0x02, 0xe4, 0xe1, 0x0e, 0x2e,
+ 0x55, 0x23, 0x24, 0x03,
+ 0x04, 0x02, 0xf0, 0xa1, 0xf0, 0xf8, 0xfe, 0xd0, 0xc0, 0xe4, 0xf0, 0x0d,
+ 0x4a, 0x10, 0x22, 0xe2,
+ 0xe2, 0x2e, 0x78, 0x30, 0x3f, 0x00, 0xd0, 0xc4, 0xf4, 0x10, 0x1f, 0x20,
+ 0x12, 0x00, 0x0e, 0x00,
+ 0x10, 0x7f, 0x40, 0xf3, 0xcd, 0xcd, 0x0d, 0xed, 0x0e, 0x3f, 0x3f, 0x49,
+ 0x0b, 0xfc, 0x00, 0x42,
+ 0x50, 0x30, 0x1e, 0xff, 0xdf, 0xde, 0xd2, 0xf6, 0xb4, 0x00, 0x00, 0xdc,
+ 0xff, 0x01, 0x03, 0x20,
+ 0x5e, 0x3f, 0x5e, 0x01, 0xe4, 0x02, 0x11, 0x70, 0x20, 0x07, 0xc2, 0x00,
+ 0x00, 0xf0, 0xfe, 0xb1,
+ 0xe3, 0xef, 0x08, 0x0e, 0x0e, 0x10, 0xf2, 0xb1, 0x0e, 0x0d, 0x30, 0x67,
+ 0x23, 0x05, 0x00, 0x20,
+ 0x0e, 0x02, 0xd6, 0xe1, 0x00, 0xce, 0xce, 0x0f, 0xdf, 0xff, 0x0f, 0x14,
+ 0x03, 0xd0, 0x0f, 0x6e,
+ 0x3b, 0x0c, 0xfc, 0xee, 0x02, 0x24, 0xd2, 0x80, 0xeb, 0x0f, 0x01, 0x64,
+ 0x11, 0x52, 0x10, 0x10,
+ 0x30, 0xfd, 0xe0, 0xf7, 0xe3, 0x00, 0x00, 0x0d, 0xdd, 0xec, 0xc0, 0xd0,
+ 0x01, 0x1e, 0x78, 0x7f,
+ 0x2e, 0xf0, 0xdf, 0xf1, 0x02, 0x10, 0x21, 0x00, 0x00, 0xd3, 0xd2, 0xf2,
+ 0x05, 0x0e, 0x3d, 0x4c,
+ 0x2e, 0xfe, 0x80, 0x00, 0x14, 0x50, 0x2e, 0x10, 0x07, 0xe6, 0xe2, 0xf1,
+ 0xf0, 0xfc, 0xb0, 0xf3,
+ 0xe1, 0x03, 0x0d, 0xfd, 0xee, 0x01, 0xef, 0xee, 0xef, 0x01, 0x70, 0x7b,
+ 0x20, 0x04, 0x07, 0xe1,
+ 0xf1, 0x01, 0x0f, 0x2d, 0x0d, 0xee, 0xbd, 0xe2, 0xe7, 0xf5, 0x01, 0x1f,
+ 0x1d, 0xff, 0xbf, 0xf0,
+ 0x21, 0x7f, 0x4d, 0x0a, 0xce, 0xf0, 0xf5, 0x02, 0x00, 0x1d, 0x40, 0x30,
+ 0x11, 0xf3, 0xe3, 0xf2,
+ 0x30, 0x4b, 0x2d, 0x00, 0x81, 0xf4, 0xe0, 0x0d, 0x1e, 0x1c, 0x1f, 0x2f,
+ 0x4e, 0x2c, 0x3c, 0x2f,
+ 0xf2, 0xe5, 0xff, 0x0c, 0x00, 0xf0, 0xf4, 0x86, 0xe1, 0xef, 0x0e, 0xd0,
+ 0x0f, 0xd0, 0x0d, 0x00,
+ 0xee, 0x0f, 0x50, 0x73, 0x64, 0x0f, 0x00, 0xf0, 0x17, 0x07, 0x00, 0xe1,
+ 0xff, 0x0f, 0xe0, 0x02,
+ 0x01, 0xe2, 0xde, 0xac, 0xe0, 0xe0, 0xf1, 0x00, 0x2e, 0x20, 0x10, 0x57,
+ 0x26, 0x12, 0x30, 0x10,
+ 0x1e, 0x00, 0x0e, 0x10, 0x40, 0xc2, 0xb2, 0xd0, 0xef, 0xcd, 0xd3, 0xf0,
+ 0xf0, 0x3a, 0x5b, 0x2d,
+ 0x1d, 0x0f, 0xef, 0xde, 0x0f, 0xf2, 0xe4, 0x00, 0x1e, 0x73, 0x21, 0x10,
+ 0x12, 0x37, 0x77, 0x50,
+ 0x1d, 0x1e, 0xe0, 0xd4, 0x05, 0x00, 0x0d, 0xfc, 0xe0, 0x00, 0xf0, 0xf0,
+ 0x00, 0x5b, 0x4d, 0x4d,
+ 0x1f, 0xf0, 0xb3, 0xfc, 0x1e, 0x6f, 0x22, 0x07, 0x03, 0xc1, 0xf0, 0x0d,
+ 0xf0, 0xe3, 0xf2, 0xde,
+ 0x0e, 0xf0, 0x14, 0x71, 0x4e, 0x0d, 0x0b, 0xe0, 0xe4, 0x07, 0x01, 0x60,
+ 0x0e, 0xfe, 0xe3, 0x05,
+ 0xe2, 0xf0, 0xc0, 0xee, 0xfb, 0xc0, 0x0f, 0x00, 0xe3, 0x12, 0x71, 0x3f,
+ 0x0b, 0x01, 0xd7, 0x11,
+ 0x50, 0x3f, 0x2d, 0x00, 0xa0, 0xd6, 0xe1, 0xf1, 0x00, 0x0e, 0x00, 0x01,
+ 0x20, 0x2e, 0x1d, 0x00,
+ 0x30, 0x10, 0xfd, 0xab, 0xfd, 0xed, 0xe1, 0xd4, 0xf2, 0x2f, 0x6a, 0x50,
+ 0x30, 0x22, 0x02, 0x00,
+ 0x0c, 0x10, 0x35, 0x01, 0xc2, 0xf0, 0xeb, 0xc0, 0x00, 0xe0, 0x0e, 0x50,
+ 0x5f, 0x1b, 0x2d, 0x3f,
+ 0x1e, 0x20, 0xee, 0x01, 0x00, 0x31, 0x30, 0x10, 0x97, 0xa3, 0xdf, 0xdc,
+ 0xd0, 0xf1, 0x00, 0x5a,
+ 0x10, 0x1f, 0x20, 0x10, 0x42, 0x31, 0x04, 0x13, 0x2d, 0x0d, 0x07, 0xf6,
+ 0xe3, 0x00, 0xde, 0x80,
+ 0xd0, 0xa0, 0xe0, 0xe0, 0xfc, 0x0e, 0x00, 0xe2, 0xf3, 0x0f, 0x0e, 0x75,
+ 0x23, 0x22, 0x22, 0x10,
+ 0x3c, 0x0d, 0x00, 0xa3, 0xf5, 0xe5, 0xe1, 0x0e, 0x1d, 0x00, 0x03, 0xb2,
+ 0x01, 0xfc, 0x1d, 0x3e,
+ 0x3f, 0x1e, 0xb0, 0xd2, 0xb1, 0x0d, 0x0c, 0x10, 0x34, 0x1f, 0x3c, 0x30,
+ 0x32, 0x72, 0x48, 0x0f,
+ 0xf0, 0xf5, 0xf2, 0xf0, 0xfd, 0x0c, 0xef, 0xde, 0xf3, 0x26, 0x6f, 0x4c,
+ 0x2d, 0xfd, 0xee, 0x0f,
+ 0x20, 0x3f, 0x4d, 0x60, 0x20, 0x0d, 0xdb, 0xd1, 0xe7, 0xe7, 0xff, 0xce,
+ 0xff, 0x00, 0x00, 0x20,
+ 0x03, 0x10, 0x4d, 0xf0, 0xbf, 0xd0, 0x0e, 0x30, 0x60, 0x41, 0x47, 0x03,
+ 0x03, 0xcf, 0x0d, 0xc1,
+ 0x04, 0x02, 0xf0, 0xee, 0xef, 0xee, 0xb1, 0xd5, 0xd7, 0x02, 0x1e, 0x6f,
+ 0x20, 0x23, 0xf1, 0xe2,
+ 0x1d, 0x1d, 0x30, 0x22, 0xb7, 0xc3, 0xdf, 0x0f, 0x00, 0x02, 0x12, 0x04,
+ 0x10, 0x0e, 0x6b, 0x2e,
+ 0x0d, 0xac, 0xf0, 0xf0, 0xe4, 0xc0, 0x0b, 0x20, 0x4e, 0x10, 0x11, 0xf2,
+ 0x03, 0x70, 0x33, 0x32,
+ 0xe4, 0xde, 0xdb, 0x1e, 0x35, 0x25, 0x21, 0x0f, 0xeb, 0xe0, 0xde, 0x02,
+ 0xe0, 0x3c, 0x7d, 0x7d,
+ 0x1d, 0xff, 0x00, 0x4f, 0x20, 0x00, 0x01, 0x04, 0xaf, 0xfd, 0xe0, 0xff,
+ 0x01, 0x25, 0xf3, 0xe2,
+ 0xee, 0x09, 0xce, 0xfe, 0x3d, 0x71, 0x60, 0x00, 0x1f, 0x14, 0x07, 0xf6,
+ 0xe2, 0x00, 0xff, 0x0e,
+ 0xff, 0xc0, 0xe2, 0xb0, 0xd0, 0xdd, 0xee, 0x02, 0x21, 0x32, 0x20, 0x42,
+ 0x17, 0x21, 0x30, 0x71,
+ 0x13, 0x00, 0xf3, 0xd6, 0xf3, 0x03, 0xc0, 0xcf, 0xd0, 0x04, 0x24, 0x02,
+ 0x0d, 0xf9, 0x20, 0x0e,
+ 0xc0, 0xe0, 0xe2, 0xf0, 0xcc, 0xdc, 0x0f, 0xe0, 0x03, 0x76, 0x4f, 0x7d,
+ 0x1f, 0x10, 0x00, 0xf3,
+ 0xf3, 0x10, 0x40, 0x1b, 0xf1, 0xe6, 0xf2, 0xf0, 0xe0, 0xfd, 0x0e, 0x0f,
+ 0xfd, 0x0d, 0x4f, 0x7a,
+ 0x7f, 0x2f, 0x00, 0x00, 0x1c, 0x0d, 0xef, 0xe3, 0xf7, 0xf0, 0x0e, 0x1b,
+ 0x20, 0xd1, 0x93, 0xe0,
+ 0xed, 0x0c, 0x3e, 0x2d, 0x50, 0x1e, 0x12, 0x05, 0x01, 0x14, 0x52, 0x20,
+ 0x01, 0xc2, 0xf0, 0xe0,
+ 0x0f, 0x3f, 0xce, 0xc0, 0xd6, 0xb1, 0xfe, 0xf0, 0x24, 0x00, 0xd0, 0xe1,
+ 0x03, 0x72, 0x2f, 0x1b,
+ 0x00, 0x0f, 0x0e, 0xa1, 0x07, 0xf7, 0x01, 0x10, 0x2f, 0x1f, 0x01, 0xc5,
+ 0x03, 0x30, 0x4f, 0x0c,
+ 0xdf, 0xb0, 0xf1, 0xb3, 0xe0, 0xfe, 0x1b, 0x1e, 0x00, 0x00, 0x02, 0x20,
+ 0x7d, 0x0f, 0x23, 0x16,
+ 0x0f, 0x0f, 0xf1, 0x14, 0x62, 0x16, 0xf2, 0xcf, 0x0c, 0x0e, 0xde, 0x00,
+ 0x10, 0x6f, 0x2a, 0x1e,
+ 0x1f, 0x00, 0x0f, 0x0f, 0x0e, 0x0f, 0x40, 0x12, 0x00, 0xf1, 0xc4, 0xe4,
+ 0xf3, 0xfe, 0xed, 0xf0,
+ 0xfd, 0xc9, 0xfd, 0x3d, 0x7c, 0x1d, 0x31, 0x04, 0x02, 0x01, 0x73, 0x62,
+ 0x01, 0x03, 0x0f, 0xcc,
+ 0x0f, 0x02, 0xf7, 0xd4, 0xed, 0xef, 0xce, 0xd0, 0xd7, 0x12, 0x31, 0x5f,
+ 0x3c, 0x1f, 0x1e, 0x12,
+ 0x25, 0x21, 0x02, 0xcf, 0xdf, 0xc1, 0xe5, 0xe3, 0xf3, 0x10, 0x0f, 0xd0,
+ 0x11, 0x1d, 0xfb, 0x9f,
+ 0xf0, 0xc0, 0xe1, 0xdb, 0xed, 0x00, 0x30, 0x30, 0x35, 0x74, 0x3f, 0x0c,
+ 0x1f, 0x00, 0x01, 0xf4,
+ 0x27, 0x70, 0x40, 0x1e, 0x01, 0xf4, 0xa1, 0xd0, 0xc1, 0x0c, 0x1d, 0x5f,
+ 0x30, 0x10, 0xd0, 0xed,
+ 0x0c, 0x6d, 0x3c, 0x1d, 0x0d, 0x0f, 0xff, 0x32, 0x14, 0xf3, 0xd1, 0xee,
+ 0xd2, 0xb7, 0xd1, 0xfd,
+ 0x1b, 0x0d, 0xeb, 0xd0, 0x01, 0x20, 0x72, 0x73, 0x32, 0x0e, 0x0d, 0xf5,
+ 0x06, 0x42, 0x10, 0x0c,
+ 0x00, 0xcf, 0xd0, 0xd2, 0x92, 0xff, 0xeb, 0x00, 0x20, 0x00, 0x04, 0xe0,
+ 0x2e, 0x6e, 0x20, 0x02,
+ 0x04, 0xc0, 0xff, 0x0f, 0x00, 0x07, 0xf3, 0x1f, 0x0f, 0x30, 0x17, 0x00,
+ 0x11, 0x20, 0xed, 0xc0,
+ 0xa0, 0xe2, 0xb0, 0xf0, 0xeb, 0x0e, 0x00, 0x22, 0x00, 0xdc, 0xde, 0x0f,
+ 0x3b, 0x6e, 0x60, 0x31,
+ 0x25, 0x02, 0xe3, 0x02, 0x04, 0x10, 0x0f, 0xf1, 0xf4, 0xd0, 0xfb, 0x00,
+ 0xf1, 0x04, 0x1d, 0x0a,
+ 0xff, 0x5e, 0x70, 0x70, 0x2e, 0x0d, 0xee, 0xe1, 0x05, 0x04, 0x23, 0x20,
+ 0x0d, 0xb9, 0xd0, 0xe0,
+ 0xe0, 0x11, 0x0f, 0x3d, 0x4e, 0x00, 0xf0, 0xe4, 0x20, 0x71, 0x62, 0x13,
+ 0x02, 0x0e, 0x0f, 0x10,
+ 0xf3, 0xc7, 0x03, 0xdf, 0xcd, 0xcf, 0xf0, 0x02, 0x05, 0x05, 0x00, 0x2e,
+ 0x6c, 0x0f, 0x20, 0xf0,
+ 0xd0, 0xe2, 0xe1, 0x1f, 0x2d, 0x42, 0xf3, 0xd7, 0x15, 0x50, 0x41, 0x0e,
+ 0xff, 0xa0, 0xe4, 0xf0,
+ 0xec, 0xff, 0x01, 0x0f, 0x4e, 0x01, 0xc1, 0xee, 0x0e, 0x0d, 0x2a, 0x4e,
+ 0x2e, 0x41, 0x26, 0x11,
+ 0x01, 0x22, 0xd0, 0xbd, 0xee, 0x05, 0x34, 0x12, 0x00, 0xba, 0xfe, 0x00,
+ 0x03, 0x21, 0x22, 0x7b,
+ 0x7c, 0x1e, 0x1f, 0x00, 0xf2, 0xf2, 0x00, 0x5f, 0x0f, 0x01, 0xe7, 0xd0,
+ 0xfe, 0xd0, 0xef, 0x00,
+ 0x21, 0x0d, 0xd9, 0xbf, 0xe0, 0xf1, 0x23, 0x70, 0x30, 0x2c, 0x21, 0x03,
+ 0x42, 0x21, 0x21, 0x0f,
+ 0xf1, 0xa2, 0xde, 0xd1, 0xd5, 0xc1, 0xf1, 0x0e, 0x00, 0x15, 0xf2, 0x00,
+ 0x30, 0x40, 0x1d, 0x11,
+ 0x10, 0xd7, 0x96, 0x00, 0xef, 0x30, 0x73, 0x15, 0x01, 0xf0, 0xef, 0xed,
+ 0x03, 0x12, 0xeb, 0x00,
+ 0x0e, 0xf0, 0xf1, 0xe4, 0x02, 0x9c, 0xcb, 0xde, 0xed, 0x00, 0x05, 0x05,
+ 0x38, 0x00, 0x11, 0x00,
+ 0x94, 0xe1, 0xd3, 0x1a, 0x10, 0xe6, 0x3b, 0x1a, 0xe8, 0x0f, 0x8f, 0xc1,
+ 0x07, 0x05, 0x00, 0x10,
+ 0x11, 0x03, 0xb7, 0xd2, 0xc2, 0xe1, 0xe4, 0xf1, 0xe2, 0xc1, 0xc0, 0xe1,
+ 0xdf, 0xf0, 0x3e, 0x30,
+ 0x0e, 0x0c, 0xff, 0x4d, 0x20, 0x47, 0x23, 0x00, 0x20, 0x2d, 0x4c, 0x1c,
+ 0x0f, 0xc1, 0x92, 0xfe,
+ 0xd8, 0xfd, 0xfe, 0x2f, 0x50, 0x5e, 0x2e, 0x3d, 0x6d, 0x2e, 0x4d, 0x1d,
+ 0x0d, 0x00, 0x2c, 0x0b,
+ 0xdd, 0x0f, 0xf0, 0x0c, 0x0c, 0x5e, 0x4f, 0x3c, 0x0d, 0x0d, 0x0b, 0xce,
+ 0x1d, 0x11, 0x00, 0x08,
+ 0x0f, 0x7f, 0x22, 0x04, 0xf0, 0xe0, 0xfd, 0x51, 0x23, 0x03, 0x06, 0x00,
+ 0x00, 0x02, 0x03, 0xc5,
+ 0xa1, 0xd1, 0xc0, 0xe0, 0xd0, 0x02, 0xe2, 0xd0, 0xd0, 0xe2, 0x25, 0x10,
+ 0x0f, 0xe1, 0xa7, 0xf3,
+ 0xb1, 0xe4, 0xe2, 0x04, 0xc2, 0xc2, 0xd2, 0xe2, 0xe4, 0xc4, 0xf0, 0x01,
+ 0xe0, 0x2f, 0x30, 0x3e,
+ 0x31, 0xd5, 0x03, 0x42, 0x5f, 0x30, 0x16, 0xd0, 0xf0, 0x00, 0x2d, 0x0e,
+ 0xed, 0xcf, 0x88, 0xae,
+ 0xfd, 0x0e, 0x0f, 0x4d, 0x4e, 0x0e, 0x2c, 0x3c, 0x4d, 0x5e, 0x20, 0x3d,
+ 0xeb, 0x0e, 0x1f, 0x0e,
+ 0x0c, 0x0e, 0x0e, 0x3d, 0x1b, 0x40, 0x3f, 0x0d, 0xdb, 0x1e, 0x2e, 0xfd,
+ 0xfe, 0x60, 0x3f, 0x3a,
+ 0x3d, 0x2f, 0x00, 0xf3, 0xd3, 0x20, 0x4a, 0x7e, 0x7f, 0x01, 0xf6, 0xe1,
+ 0x02, 0x10, 0xf1, 0xf1,
+ 0xd2, 0xd0, 0xc2, 0xb2, 0x02, 0xd1, 0xf2, 0x07, 0xf3, 0xf0, 0xd0, 0xe2,
+ 0xf2, 0xf4, 0xc3, 0xd6,
+ 0xf1, 0xb3, 0x06, 0xe3, 0xb1, 0xd1, 0xf4, 0xd2, 0xb2, 0xd2, 0xf3, 0xd3,
+ 0xf0, 0xef, 0xf0, 0x21,
+ 0x34, 0xd2, 0xa1, 0x14, 0x33, 0x2f, 0x40, 0x47, 0x01, 0x20, 0x00, 0x00,
+ 0x1c, 0x00, 0x90, 0xce,
+ 0xfc, 0x0e, 0xfe, 0x00, 0x1d, 0x48, 0x5b, 0x4f, 0x4e, 0x10, 0x3f, 0x1f,
+ 0x0c, 0x0d, 0x1d, 0x20,
+ 0x4d, 0x3d, 0x10, 0x6e, 0x1c, 0x0d, 0x1c, 0x1f, 0x0c, 0xdd, 0x2b, 0x5d,
+ 0x4e, 0x1f, 0x0d, 0xee,
+ 0x00, 0x0c, 0x2f, 0x31, 0x0d, 0x0d, 0x2b, 0x60, 0x22, 0x15, 0xf2, 0x02,
+ 0x1f, 0x30, 0x0f, 0xa3,
+ 0xe7, 0xd1, 0xc0, 0xc0, 0xc0, 0xe2, 0xe0, 0xe2, 0xf2, 0xc0, 0xc0, 0xef,
+ 0xf1, 0x16, 0x02, 0xe6,
+ 0xf5, 0xc2, 0xd2, 0xd3, 0xd5, 0xa4, 0xb1, 0xf1, 0xc3, 0xf1, 0xd3, 0x02,
+ 0x01, 0xe0, 0xc1, 0xf2,
+ 0x04, 0x34, 0x10, 0x12, 0x21, 0x24, 0x15, 0x13, 0x41, 0x2e, 0x1e, 0x0f,
+ 0x92, 0xd3, 0xa2, 0xed,
+ 0xe8, 0xfe, 0xef, 0x10, 0x50, 0x4e, 0x3e, 0x5c, 0x2f, 0x2e, 0x1d, 0x0c,
+ 0x0f, 0x3e, 0x4c, 0x2e,
+ 0x2c, 0x1e, 0x1c, 0x0f, 0x0e, 0x0b, 0xfd, 0x3d, 0x7c, 0x2a, 0x2e, 0x1f,
+ 0x2e, 0x2e, 0x5f, 0x1f,
+ 0x2d, 0x1c, 0x2d, 0x3f, 0x3e, 0x4e, 0x41, 0x10, 0x20, 0x3c, 0x40, 0x13,
+ 0x13, 0x0f, 0xdd, 0xd1,
+ 0xa7, 0xe6, 0xe1, 0x90, 0xee, 0xff, 0xe0, 0x01, 0xe4, 0xc0, 0xce, 0x0e,
+ 0x2f, 0x11, 0xe4, 0xc2,
+ 0xf4, 0xd4, 0xd5, 0xe5, 0xc3, 0xb1, 0xc2, 0xd1, 0xd3, 0xe3, 0xd3, 0x03,
+ 0xf3, 0x81, 0xf3, 0x04,
+ 0xf4, 0x03, 0x07, 0x04, 0xf0, 0x1f, 0x32, 0x24, 0x11, 0x12, 0x00, 0x30,
+ 0xcf, 0x91, 0xc2, 0xb1,
+ 0xff, 0x0e, 0x0d, 0x20, 0x3e, 0x1d, 0x0b, 0x0d, 0x1c, 0x5e, 0x1b, 0x40,
+ 0x3d, 0x19, 0x3f, 0x1f,
+ 0x2f, 0x2e, 0x31, 0x51, 0x0d, 0x08, 0x1f, 0x5f, 0x3f, 0x1e, 0x1e, 0x10,
+ 0x1b, 0x1f, 0x2e, 0x0f,
+ 0x0c, 0x0e, 0x0d, 0x4e, 0x7f, 0x4e, 0x3e, 0x1d, 0x1d, 0x42, 0x22, 0x2f,
+ 0x2b, 0x10, 0x00, 0x01,
+ 0xe5, 0xd2, 0xa0, 0xff, 0xfd, 0xee, 0xb3, 0xd6, 0xa0, 0xfd, 0xfd, 0xfd,
+ 0x1e, 0x21, 0xe2, 0xa7,
+ 0x06, 0xf0, 0xf1, 0xe2, 0xf5, 0xd2, 0xd3, 0xc1, 0xf1, 0xf3, 0xd1, 0x83,
+ 0xf3, 0xe1, 0xe2, 0x02,
+ 0xe3, 0x01, 0xd5, 0xe5, 0x12, 0x53, 0x44, 0x32, 0x20, 0x01, 0xd5, 0xa1,
+ 0xf1, 0xc1, 0xf3, 0xf2,
+ 0xe0, 0x0d, 0x10, 0x00, 0xf0, 0x14, 0x3e, 0x39, 0x5c, 0x3f, 0x50, 0x20,
+ 0x1f, 0x2c, 0x2f, 0x2e,
+ 0x2e, 0x51, 0x01, 0x00, 0x09, 0x2d, 0x2d, 0x3e, 0x1d, 0x1e, 0x5c, 0x2b,
+ 0x5f, 0x2d, 0x1e, 0x0b,
+ 0x0e, 0x0f, 0x4d, 0x60, 0x3d, 0x2e, 0x10, 0x1d, 0x2d, 0x2f, 0x10, 0x22,
+ 0x00, 0x08, 0x2d, 0x0e,
+ 0xf2, 0x07, 0xc0, 0x80, 0xcc, 0x00, 0x00, 0xd1, 0xd1, 0xe0, 0xea, 0x2f,
+ 0x6f, 0x0e, 0xc0, 0xe0,
+ 0xf5, 0xf1, 0x03, 0xd2, 0xc2, 0xe4, 0xb3, 0xc4, 0xe1, 0xf3, 0xe3, 0xe1,
+ 0xd2, 0xc2, 0xa4, 0xd3,
+ 0xe2, 0x01, 0x27, 0x55, 0x10, 0x00, 0x20, 0x13, 0x13, 0xf4, 0xbf, 0xef,
+ 0xde, 0xf1, 0xf4, 0xe1,
+ 0xef, 0xe0, 0xef, 0x01, 0x03, 0x52, 0x09, 0x0d, 0x70, 0x20, 0x1d, 0x1d,
+ 0x20, 0x1e, 0x1b, 0x30,
+ 0x32, 0x5f, 0x1e, 0x2c, 0x2f, 0x2d, 0x40, 0x51, 0x0b, 0x1e, 0x1b, 0x5f,
+ 0x0b, 0x10, 0x0f, 0xf0,
+ 0xfb, 0xfd, 0x5e, 0x19, 0x40, 0x0f, 0x01, 0x20, 0xf9, 0x10, 0x4f, 0x50,
+ 0x01, 0x30, 0x42, 0x01,
+ 0xdf, 0x0f, 0xd0, 0xa1, 0xee, 0xee, 0xe1, 0xe0, 0x0e, 0xda, 0x0f, 0x00,
+ 0x00, 0xaa, 0x0f, 0x42,
+ 0x13, 0xcf, 0xcb, 0x03, 0x07, 0xf0, 0x02, 0x11, 0x20, 0xf0, 0xa0, 0xc1,
+ 0xd0, 0xd3, 0xe2, 0xd0,
+ 0x00, 0x00, 0x34, 0x45, 0x01, 0x00, 0x43, 0x33, 0x12, 0xd0, 0xc0, 0xf2,
+ 0xd2, 0xdf, 0xdd, 0x06,
+ 0x13, 0xa1, 0xe0, 0x26, 0x31, 0x0e, 0xec, 0x3d, 0x7f, 0x1c, 0x0e, 0x32,
+ 0x73, 0x1f, 0x49, 0x10,
+ 0x2f, 0x10, 0x15, 0x00, 0x0c, 0x20, 0x60, 0x1f, 0x1f, 0x00, 0x34, 0x0f,
+ 0x1c, 0x0f, 0x1e, 0x10,
+ 0x40, 0x0e, 0xfb, 0x3f, 0x72, 0x7d, 0xd8, 0x11, 0x23, 0x10, 0x0d, 0x1f,
+ 0x63, 0x02, 0xfc, 0xde,
+ 0x03, 0x23, 0xf0, 0xf0, 0x04, 0xe0, 0xde, 0xe0, 0xf2, 0xde, 0x1e, 0x3b,
+ 0xcc, 0xac, 0x01, 0xd1,
+ 0xe2, 0xf5, 0xd0, 0xe2, 0x03, 0x00, 0x8e, 0xff, 0x04, 0xe5, 0x90, 0xed,
+ 0xe1, 0xf6, 0xef, 0xdd,
+ 0xe0, 0x54, 0x11, 0xfe, 0xd0, 0x23, 0x64, 0x0f, 0xfe, 0x04, 0xf0, 0xfe,
+ 0xff, 0x01, 0xf4, 0xd2,
+ 0xd1, 0xcc, 0x2e, 0x47, 0xf0, 0xef, 0x10, 0x30, 0x60, 0x32, 0x2f, 0x1d,
+ 0x40, 0x11, 0x20, 0x0e,
+ 0x3e, 0x19, 0xfd, 0xeb, 0x50, 0x74, 0x0e, 0xe8, 0x00, 0x62, 0x0f, 0xdc,
+ 0x00, 0x31, 0x00, 0xed,
+ 0x10, 0x32, 0x0f, 0xfc, 0x00, 0x10, 0x00, 0x40, 0x72, 0x0f, 0xe8, 0x10,
+ 0x62, 0x02, 0xfd, 0x02,
+ 0x34, 0xff, 0xef, 0x04, 0x03, 0xad, 0xec, 0x12, 0x45, 0xff, 0xbc, 0x00,
+ 0x22, 0x00, 0xcd, 0x01,
+ 0x03, 0x00, 0x12, 0x11, 0x01, 0x16, 0x01, 0xd0, 0x04, 0x02, 0xc0, 0x9f,
+ 0x04, 0xe2, 0xef, 0xff,
+ 0x12, 0x13, 0xff, 0xf4, 0x46, 0x10, 0x0f, 0x0f, 0x20, 0x45, 0x01, 0xe1,
+ 0xf0, 0x21, 0x00, 0xde,
+ 0xf0, 0x04, 0x8e, 0xdd, 0x67, 0x00, 0xfb, 0x00, 0x41, 0x22, 0xfe, 0xca,
+ 0x20, 0x72, 0x00, 0xdd,
+ 0x0f, 0x30, 0x22, 0x20, 0x0f, 0x2f, 0x0d, 0xdc, 0x65, 0x21, 0xed, 0xfd,
+ 0x21, 0x54, 0xfe, 0xd8,
+ 0xf0, 0x40, 0x12, 0xec, 0xff, 0x30, 0x32, 0xef, 0xdc, 0x61, 0x22, 0x0e,
+ 0x10, 0x42, 0x02, 0xdf,
+ 0xfe, 0x02, 0x05, 0xc0, 0xe0, 0x00, 0xee, 0x21, 0x12, 0xce, 0xe0, 0xd0,
+ 0xdd, 0xd0, 0xe3, 0xd2,
+ 0xae, 0x02, 0x47, 0xf0, 0xd3, 0x17, 0x04, 0x8f, 0xbe, 0xff, 0x03, 0x06,
+ 0xee, 0xae, 0x04, 0x12,
+ 0xef, 0x00, 0x22, 0x00, 0x02, 0xf1, 0x14, 0x22, 0xfe, 0xef, 0x14, 0x00,
+ 0xe0, 0xf1, 0xd0, 0xb0,
+ 0xe0, 0x02, 0x88, 0xe9, 0x11, 0x00, 0x0f, 0x30, 0x21, 0xaa, 0xff, 0x30,
+ 0x53, 0xfe, 0xec, 0x10,
+ 0x30, 0x20, 0x0e, 0xfd, 0x10, 0x55, 0xfd, 0xdb, 0x20, 0x42, 0x0f, 0xed,
+ 0x11, 0x30, 0xec, 0xef,
+ 0xff, 0x4f, 0x71, 0x0d, 0xdc, 0x0f, 0x0f, 0x10, 0x2f, 0x4e, 0x1a, 0x0e,
+ 0x20, 0x34, 0xd0, 0xbc,
+ 0xff, 0x33, 0x36, 0xe0, 0x8d, 0x00, 0x00, 0x11, 0x35, 0xad, 0xed, 0x05,
+ 0x00, 0xee, 0xef, 0x43,
+ 0x01, 0xdd, 0xf0, 0x47, 0x33, 0xcf, 0xdc, 0x23, 0x02, 0xe0, 0xe1, 0xe2,
+ 0x8e, 0x01, 0x07, 0x00,
+ 0xd0, 0x00, 0x01, 0x13, 0xee, 0xf0, 0x42, 0x23, 0x00, 0xbd, 0x26, 0x64,
+ 0xff, 0xcd, 0x11, 0x36,
+ 0xf0, 0xd0, 0xff, 0x21, 0x00, 0xab, 0x32, 0x67, 0xef, 0xcc, 0x21, 0x32,
+ 0x0f, 0xce, 0x00, 0x63,
+ 0x00, 0xfc, 0xff, 0x12, 0x33, 0xfc, 0xed, 0x34, 0x32, 0xdc, 0xdd, 0x54,
+ 0x32, 0xfd, 0xdd, 0x22,
+ 0x21, 0x00, 0x0d, 0x00, 0x24, 0xfd, 0xbb, 0x31, 0x75, 0x0e, 0xed, 0x21,
+ 0x22, 0xde, 0x11, 0x67,
+ 0xee, 0xff, 0x21, 0x01, 0x00, 0x00, 0x00, 0x02, 0x22, 0xdd, 0xde, 0x23,
+ 0x11, 0xcc, 0xef, 0x43,
+ 0x35, 0xdf, 0xde, 0x12, 0x77, 0x00, 0xce, 0x01, 0x34, 0xdf, 0xcf, 0x04,
+ 0x22, 0xbd, 0xdf, 0x57,
+ 0x01, 0xde, 0x00, 0x12, 0x23, 0xff, 0xdd, 0x22, 0x64, 0xf0, 0xf0, 0xf1,
+ 0x01, 0x12, 0xee, 0x01,
+ 0x16, 0xdf, 0xdf, 0x32, 0x75, 0x0f, 0xbb, 0xf0, 0x32, 0x56, 0xdd, 0xed,
+ 0x23, 0x30, 0xe0, 0x0f,
+ 0x21, 0xed, 0x0e, 0x76, 0x20, 0xcd, 0xfe, 0x33, 0x12, 0x0d, 0xed, 0x0f,
+ 0x43, 0x10, 0xfa, 0xef,
+ 0x00, 0x42, 0xee, 0xec, 0x43, 0x0e, 0xc8, 0x30, 0x73, 0x0f, 0xec, 0xf0,
+ 0x10, 0x32, 0x00, 0xbc,
+ 0x0f, 0x34, 0x21, 0xee, 0xce, 0x22, 0x22, 0xfe, 0xcc, 0x23, 0x00, 0xbb,
+ 0x01, 0x21, 0xde, 0xdd,
+ 0x54, 0x02, 0x0e, 0xdd, 0xfe, 0x24, 0x12, 0xf0, 0x03, 0x89, 0xee, 0x24,
+ 0x22, 0xce, 0xef, 0xf0,
+ 0x01, 0x25, 0xf0, 0xce, 0xfe, 0x22, 0x35, 0xcf, 0xfe, 0x23, 0x12, 0xbd,
+ 0xfe, 0x02, 0x01, 0x02,
+ 0x01, 0xce, 0x25, 0x22, 0x88, 0xff, 0x24, 0x10, 0xdd, 0xf0, 0x23, 0xed,
+ 0xff, 0x32, 0xfe, 0xbb,
+ 0x10, 0x75, 0x00, 0xfd, 0xde, 0x33, 0x00, 0x0c, 0x12, 0x10, 0x0c, 0x43,
+ 0x00, 0xbb, 0x00, 0x22,
+ 0x0f, 0xed, 0x11, 0xff, 0xee, 0x40, 0x10, 0x2f, 0x1e, 0xb9, 0x0f, 0x43,
+ 0x32, 0xda, 0x9d, 0x00,
+ 0x77, 0x00, 0xed, 0xf0, 0x21, 0x24, 0xfe, 0xdd, 0x00, 0x12, 0x10, 0x01,
+ 0xcd, 0xfe, 0x12, 0x34,
+ 0xec, 0xcf, 0x21, 0x22, 0x01, 0xee, 0xee, 0x34, 0xf0, 0xae, 0x00, 0x27,
+ 0x02, 0xac, 0xf0, 0x03,
+ 0x32, 0xcd, 0xee, 0x12, 0x24, 0x11, 0xf0, 0xdd, 0x00, 0x57, 0x22, 0xbd,
+ 0x00, 0x24, 0xff, 0xf0,
+ 0x01, 0x00, 0xf2, 0x12, 0xcc, 0x00, 0x77, 0x00, 0xce, 0x00, 0x21, 0x01,
+ 0x00, 0x10, 0x20, 0x22,
+ 0xed, 0xef, 0x44, 0xf0, 0x20, 0x00, 0xea, 0x73, 0x43, 0xec, 0xb8, 0x32,
+ 0x33, 0xdd, 0xee, 0x42,
+ 0x24, 0xdc, 0xef, 0x52, 0x00, 0x0f, 0x11, 0x00, 0x0d, 0x10, 0x21, 0x10,
+ 0xfe, 0xed, 0x42, 0x47,
+ 0xee, 0xcc, 0x32, 0x75, 0x00, 0xdb, 0x01, 0x42, 0xf0, 0xde, 0x0f, 0x33,
+ 0x0f, 0xbd, 0x11, 0x44,
+ 0xfe, 0xde, 0x22, 0x24, 0x0e, 0xcc, 0x01, 0x33, 0x01, 0xdf, 0x33, 0xf1,
+ 0x8a, 0x01, 0x25, 0x00,
+ 0xbd, 0x00, 0x35, 0x00, 0xef, 0xef, 0x21, 0x13, 0x00, 0x20, 0xf0, 0xef,
+ 0x02, 0x46, 0x00, 0xad,
+ 0x00, 0x35, 0x00, 0xde, 0x00, 0x34, 0x00, 0x8c, 0xf1, 0x55, 0xff, 0xed,
+ 0x21, 0x34, 0xce, 0xfd,
+ 0x13, 0x44, 0xfe, 0xdc, 0x10, 0x66, 0x00, 0xed, 0x00, 0x32, 0x00, 0x00,
+ 0xee, 0x11, 0x22, 0x00,
+ 0xfd, 0xff, 0x22, 0x43, 0xdc, 0xcc, 0x52, 0x23, 0x0d, 0xdb, 0x00, 0x75,
+ 0x0f, 0xdc, 0x11, 0x42,
+ 0x00, 0xee, 0x11, 0x55, 0xfe, 0xef, 0x0f, 0x01, 0x24, 0x0f, 0xcc, 0x00,
+ 0x23, 0xfe, 0xf0, 0x21,
+ 0xcd, 0x10, 0x45, 0xdd, 0x00, 0x32, 0xf0, 0xff, 0xde, 0xf0, 0x57, 0xf0,
+ 0xbd, 0x00, 0x02, 0x03,
+ 0xe0, 0xef, 0x00, 0xce, 0x0f, 0x47, 0x22, 0xdf, 0xcc, 0xef, 0x34, 0x75,
+ 0xf0, 0xaa, 0x00, 0x44,
+ 0x0f, 0xdf, 0x00, 0x22, 0xef, 0xe0, 0x00, 0x1f, 0x10, 0x02, 0xde, 0x0f,
+ 0x10, 0xff, 0x01, 0x33,
+ 0xbb, 0xdc, 0x53, 0x12, 0x0d, 0xdc, 0x31, 0x55, 0xee, 0xcb, 0x21, 0x54,
+ 0xff, 0xdc, 0x00, 0x11,
+ 0x32, 0xbd, 0x10, 0x11, 0x0e, 0xfe, 0x11, 0x11, 0xfd, 0x0f, 0xed, 0xdb,
+ 0x42, 0x42, 0xfe, 0x0d,
+ 0xe0, 0x42, 0x01, 0xe9, 0x00, 0x64, 0x00, 0xbb, 0x00, 0x23, 0x00, 0xba,
+ 0x00, 0x01, 0x10, 0x12,
+ 0x0f, 0xaa, 0x00, 0x33, 0x00, 0xdd, 0x00, 0x23, 0x0f, 0xce, 0x00, 0x01,
+ 0x01, 0xcf, 0xef, 0xf1,
+ 0x04, 0xff, 0xb9, 0x00, 0x43, 0x01, 0xad, 0x00, 0x13, 0x10, 0xec, 0xff,
+ 0x13, 0x33, 0xef, 0xb8,
+ 0x12, 0x22, 0xee, 0xcf, 0x01, 0x22, 0xff, 0xba, 0x32, 0x11, 0xdf, 0xfe,
+ 0x00, 0x01, 0xef, 0x00,
+ 0x41, 0xcb, 0x00, 0x52, 0xec, 0x00, 0x32, 0x10, 0xfb, 0x00, 0x10, 0x0f,
+ 0xcd, 0x00, 0x77, 0x00,
+ 0xca, 0x00, 0x53, 0x00, 0xfd, 0xff, 0x01, 0x10, 0x00, 0x0e, 0xff, 0x0f,
+ 0x10, 0x40, 0x10, 0xff,
+ 0x0e, 0x46, 0x10, 0xdd, 0x20, 0x77, 0x0f, 0xbd, 0x12, 0x23, 0xee, 0xff,
+ 0x01, 0xff, 0xed, 0x11,
+ 0x56, 0x00, 0xde, 0xdc, 0x33, 0x73, 0xff, 0xfd, 0x01, 0x02, 0x04, 0x00,
+ 0xce, 0x01, 0x14, 0x01,
+ 0xdf, 0xf0, 0x01, 0x37, 0x24, 0x8d, 0xff, 0x01, 0x03, 0x20, 0x02, 0x10,
+ 0x00, 0x01, 0xf3, 0x02,
+ 0x14, 0x01, 0xde, 0x47, 0x73, 0xbb, 0x00, 0x25, 0x30, 0xbe, 0x0f, 0x02,
+ 0x12, 0x10, 0xfc, 0xf0,
+ 0x13, 0x42, 0xff, 0xfa, 0x11, 0x63, 0x0f, 0x1f, 0x21, 0xef, 0xeb, 0x33,
+ 0x65, 0x0f, 0xfd, 0xf0,
+ 0x00, 0x76, 0x00, 0xfd, 0x00, 0x00, 0x11, 0x00, 0x20, 0x0f, 0xfe, 0x10,
+ 0x41, 0x0f, 0x0f, 0x25,
+ 0x42, 0x00, 0x1d, 0x00, 0x23, 0x45, 0x11, 0xd0, 0x0f, 0x23, 0x41, 0xf0,
+ 0xcc, 0x13, 0x27, 0xf0,
+ 0xf0, 0x0e, 0x73, 0x22, 0x00, 0xf0, 0x12, 0x00, 0x03, 0x07, 0xd0, 0xf1,
+ 0x01, 0x9f, 0xf0, 0x37,
+ 0x43, 0xcf, 0xe0, 0xe0, 0xd0, 0x77, 0x12, 0xcd, 0x00, 0x54, 0x00, 0xe0,
+ 0x00, 0x35, 0x00, 0xd0,
+ 0xff, 0x21, 0x24, 0xff, 0xc0, 0x11, 0x23, 0xfd, 0xdf, 0x43, 0x36, 0xbe,
+ 0xed, 0x44, 0x11, 0xde,
+ 0xfe, 0x33, 0x73, 0xfc, 0x0f, 0x21, 0x11, 0xfd, 0x00, 0x31, 0xfd, 0x0c,
+ 0x31, 0x02, 0x64, 0x0e,
+ 0x0b, 0x10, 0x22, 0xff, 0x0f, 0x1d, 0x0c, 0x51, 0x00, 0xc8, 0x0f, 0x61,
+ 0x00, 0x0c, 0x20, 0x11,
+ 0x0e, 0x20, 0x23, 0x0e, 0xec, 0x21, 0x75, 0x0f, 0xdc, 0x11, 0x13, 0xed,
+ 0xce, 0x13, 0x03, 0xcb,
+ 0xde, 0x52, 0x43, 0xec, 0xd9, 0x02, 0x63, 0xf0, 0xcc, 0x00, 0x21, 0x14,
+ 0xde, 0xee, 0xf1, 0x14,
+ 0x01, 0x8e, 0x00, 0x01, 0xf2, 0xf0, 0xfd, 0x02, 0x15, 0x00, 0xde, 0x00,
+ 0x13, 0x15, 0xff, 0xbe,
+ 0x00, 0xf1, 0x03, 0xf2, 0x01, 0xff, 0xb9, 0x13, 0x22, 0xee, 0xab, 0x00,
+ 0xe2, 0x0f, 0xdc, 0x00,
+ 0x23, 0xee, 0x2d, 0x20, 0xda, 0xee, 0x61, 0x01, 0xdb, 0x0d, 0x40, 0x51,
+ 0xee, 0xfe, 0x00, 0x41,
+ 0x0f, 0xf8, 0x0f, 0x00, 0x0f, 0x0e, 0xde, 0xcd, 0xff, 0x4f, 0x1d, 0xea,
+ 0x0e, 0x1e, 0x40, 0x10,
+ 0x0b, 0x20, 0x10, 0xff, 0x6e, 0x30, 0x0e, 0x02, 0xcf, 0x98, 0x00, 0xe0,
+ 0xe0, 0xff, 0xef, 0xdd,
+ 0x2f, 0x40, 0xed, 0xdf, 0x01, 0xd0, 0x88, 0x00, 0x11, 0xdf, 0x01, 0x01,
+ 0x69, 0x00, 0x46, 0x00,
+ 0x14, 0xd0, 0xa9, 0xce, 0x1b, 0xd2, 0x80, 0xcb, 0x24, 0xcb, 0xbf, 0x02,
+ 0x02, 0x00, 0x03, 0x0d,
+ 0xe8, 0x1f, 0x76, 0x60, 0xfe, 0x0f, 0x22, 0x00, 0xef, 0x0e, 0x02, 0x11,
+ 0x0d, 0x10, 0x00, 0xff,
+ 0x10, 0x77, 0x0e, 0xcb, 0xff, 0x00, 0x03, 0xe0, 0xda, 0x51, 0x52, 0x00,
+ 0xdd, 0x0f, 0x52, 0x03,
+ 0xfd, 0xfb, 0x10, 0x32, 0x01, 0xbd, 0x00, 0x02, 0x43, 0x01, 0xee, 0xff,
+ 0x03, 0x02, 0x1e, 0xdb,
+ 0x04, 0x03, 0x0c, 0x9b, 0x00, 0x33, 0x0f, 0xfd, 0xf0, 0x14, 0x00, 0x02,
+ 0x03, 0x6f, 0x1f, 0x17,
+ 0xf3, 0xce, 0xf0, 0xf4, 0xf2, 0x8d, 0xfd, 0x15, 0x10, 0xee, 0x0e, 0x11,
+ 0x22, 0xff, 0x01, 0xf0,
+ 0xfb, 0x21, 0x42, 0xfd, 0x0d, 0x13, 0x04, 0xf4, 0x0f, 0xd9, 0xb0, 0xf3,
+ 0xe4, 0xce, 0xce, 0x00,
+ 0x60, 0x02, 0x0f, 0x40, 0x13, 0x1f, 0x3d, 0x0b, 0x00, 0x14, 0x32, 0xbd,
+ 0x0d, 0x74, 0x21, 0x2f,
+ 0xcb, 0xef, 0x01, 0x12, 0xf8, 0xb0, 0x00, 0x10, 0x20, 0xdd, 0xe0, 0x20,
+ 0x71, 0x0f, 0x0e, 0x0f,
+ 0x0b, 0x2e, 0x32, 0x01, 0xae, 0x0f, 0x34, 0x22, 0x0f, 0xf0, 0x27, 0x03,
+ 0xad, 0xff, 0xf1, 0x03,
+ 0x0f, 0xde, 0x0c, 0x0b, 0xf0, 0xe1, 0xff, 0x0d, 0x20, 0xf5, 0x33, 0x5e,
+ 0x3b, 0x75, 0x75, 0xff,
+ 0xcd, 0x01, 0x04, 0x01, 0xf0, 0xee, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0x03,
+ 0x20, 0xf9, 0x10, 0x44,
+ 0xcf, 0xff, 0x30, 0x50, 0xfe, 0xe0, 0x26, 0x00, 0xc0, 0xf0, 0xff, 0x00,
+ 0xf2, 0xb2, 0xef, 0xfc,
+ 0x20, 0x75, 0x30, 0x0c, 0xf0, 0xf1, 0x01, 0x00, 0x0c, 0x41, 0x33, 0x20,
+ 0x0c, 0x00, 0x24, 0x10,
+ 0x00, 0xca, 0xd0, 0xff, 0x00, 0x9e, 0xfe, 0x24, 0x02, 0xe0, 0x2d, 0x70,
+ 0x0a, 0x20, 0x31, 0xd0,
+ 0xcc, 0xff, 0x00, 0x71, 0x12, 0xf9, 0xf0, 0x61, 0x05, 0x0e, 0xc0, 0x12,
+ 0x01, 0x0e, 0x0d, 0x02,
+ 0x03, 0x10, 0xef, 0xcc, 0xee, 0x00, 0x01, 0xdf, 0x0e, 0x54, 0x6f, 0x0f,
+ 0x05, 0x02, 0xf0, 0x00,
+ 0x04, 0x05, 0xd0, 0xd0, 0xff, 0x04, 0xcf, 0xfd, 0x10, 0x12, 0xe3, 0xb0,
+ 0xfb, 0x00, 0x30, 0x0e,
+ 0x50, 0x03, 0xff, 0xed, 0x71, 0x12, 0x00, 0xc6, 0xef, 0xf0, 0x04, 0xe0,
+ 0xe3, 0xf3, 0x06, 0x50,
+ 0x0c, 0x00, 0x65, 0x00, 0xdb, 0x00, 0x22, 0xfe, 0x0f, 0x74, 0x61, 0xfe,
+ 0xed, 0x03, 0x34, 0x09,
+ 0xef, 0x10, 0x12, 0xdd, 0xee, 0x03, 0xf3, 0x00, 0x0c, 0x0c, 0x00, 0x53,
+ 0x0f, 0xfb, 0x00, 0x22,
+ 0x0d, 0x0d, 0x70, 0x23, 0x10, 0x2c, 0x30, 0x02, 0xb0, 0xe1, 0x07, 0x57,
+ 0xf0, 0xda, 0x41, 0x11,
+ 0xd0, 0xb0, 0xff, 0xf0, 0x0f, 0xe0, 0xdd, 0x21, 0x53, 0x0e, 0x10, 0x40,
+ 0x10, 0x21, 0xe6, 0xe3,
+ 0x00, 0xff, 0x0e, 0x34, 0xe3, 0x9f, 0xdb, 0xe0, 0x13, 0x12, 0xef, 0x9e,
+ 0x00, 0xf0, 0xfc, 0x0f,
+ 0x51, 0x14, 0x20, 0x0f, 0x0f, 0x2f, 0xed, 0xd3, 0xe7, 0xf0, 0xbf, 0xef,
+ 0x14, 0x43, 0x20, 0xd0,
+ 0xee, 0x01, 0x1f, 0x0a, 0x01, 0xe1, 0x20, 0x7f, 0x33, 0x05, 0x30, 0x71,
+ 0x20, 0x0a, 0x0f, 0x00,
+ 0xff, 0xc0, 0x12, 0x23, 0xca, 0xce, 0x00, 0x31, 0x11, 0x0c, 0xed, 0xf0,
+ 0x23, 0x10, 0xcb, 0x0f,
+ 0x6e, 0x3c, 0x1d, 0x21, 0x04, 0x00, 0xdb, 0x30, 0x55, 0x11, 0x00, 0x31,
+ 0x11, 0x00, 0xbe, 0x1f,
+ 0x23, 0x84, 0xcd, 0xdb, 0x11, 0x20, 0x0f, 0xfb, 0x01, 0x10, 0x20, 0x51,
+ 0x11, 0x13, 0xe0, 0xf1,
+ 0xf3, 0xe1, 0x02, 0x21, 0xd0, 0xe7, 0x07, 0x90, 0xcb, 0xf0, 0xf3, 0xe0,
+ 0xd0, 0xff, 0x31, 0x5f,
+ 0x5d, 0x42, 0x02, 0xed, 0xcf, 0x04, 0xf1, 0xfa, 0xee, 0x24, 0x01, 0xaf,
+ 0x00, 0x07, 0x31, 0xff,
+ 0xed, 0x20, 0x00, 0xe0, 0xf1, 0x23, 0x3f, 0x0e, 0x7e, 0x75, 0x23, 0x0f,
+ 0x0b, 0x30, 0x00, 0xc0,
+ 0xfd, 0x12, 0xf1, 0xdd, 0x1f, 0x50, 0x13, 0x00, 0xc0, 0xe0, 0xef, 0x08,
+ 0x1d, 0x20, 0x02, 0x3d,
+ 0x7c, 0x0d, 0x0b, 0x00, 0x2d, 0x0e, 0xd0, 0x44, 0x53, 0x12, 0x47, 0x20,
+ 0xfd, 0xc0, 0xe3, 0xe3,
+ 0xf1, 0xdd, 0xa0, 0x01, 0xec, 0xf8, 0x0e, 0x30, 0xf2, 0x00, 0x70, 0x41,
+ 0xf0, 0xef, 0x15, 0x14,
+ 0x00, 0xe1, 0x03, 0x61, 0x0f, 0xd0, 0xe6, 0xe1, 0xef, 0xbb, 0xf1, 0x03,
+ 0x01, 0x0d, 0x0f, 0x20,
+ 0x4f, 0x1e, 0xff, 0x02, 0x00, 0x1b, 0x0e, 0xe1, 0x06, 0x00, 0xe3, 0xd0,
+ 0xb1, 0x02, 0x02, 0x0f,
+ 0xa9, 0xef, 0xf0, 0xe2, 0x91, 0x02, 0xf0, 0x3b, 0x70, 0x62, 0x0f, 0x0e,
+ 0xf5, 0x00, 0x0c, 0x2f,
+ 0x03, 0x21, 0xea, 0xee, 0x10, 0x33, 0xee, 0xdd, 0x06, 0xe2, 0xbe, 0x0b,
+ 0x0f, 0x31, 0x72, 0x0e,
+ 0xfc, 0xe0, 0x00, 0x1f, 0x3d, 0x00, 0x13, 0x55, 0x1f, 0x1d, 0x31, 0x77,
+ 0xf1, 0xcf, 0x0f, 0x02,
+ 0xf1, 0xf0, 0xeb, 0xc0, 0xfe, 0xe0, 0x10, 0x4f, 0x31, 0x10, 0xec, 0xc0,
+ 0x02, 0x16, 0x20, 0x0e,
+ 0x41, 0x74, 0x00, 0xe1, 0xe3, 0x03, 0xc0, 0x00, 0xfe, 0xdf, 0xe1, 0xf4,
+ 0xe5, 0x01, 0x70, 0x1e,
+ 0x0b, 0x00, 0x10, 0x01, 0xcd, 0x0b, 0x11, 0xf2, 0xd2, 0xf3, 0xf0, 0x0e,
+ 0x00, 0x6e, 0x01, 0xe5,
+ 0xa0, 0xdb, 0x00, 0x11, 0x03, 0x23, 0x4e, 0x59, 0x21, 0x12, 0x01, 0x10,
+ 0x11, 0x10, 0x3d, 0x0b,
+ 0xfc, 0x32, 0x30, 0xc0, 0xde, 0xdc, 0xe0, 0xc3, 0xe5, 0xe0, 0x0f, 0x39,
+ 0x7f, 0x7f, 0x10, 0xe0,
+ 0xcf, 0x0d, 0x3b, 0x00, 0xff, 0x5e, 0x30, 0x00, 0xe2, 0x21, 0x72, 0x27,
+ 0x04, 0xfe, 0xcf, 0xf2,
+ 0xe5, 0xff, 0xcd, 0x00, 0x21, 0x0e, 0x0d, 0xd0, 0x00, 0xf0, 0x0f, 0x0c,
+ 0x1c, 0x42, 0x74, 0x14,
+ 0x31, 0x10, 0xf6, 0xf1, 0xe1, 0xa1, 0xe2, 0xdf, 0xdc, 0x02, 0x17, 0xb0,
+ 0xe0, 0x00, 0x20, 0x61,
+ 0x0c, 0x0f, 0xe1, 0x00, 0xee, 0x00, 0x13, 0x30, 0x13, 0x05, 0x00, 0x0c,
+ 0x10, 0xd3, 0x80, 0xcf,
+ 0xf3, 0xe3, 0xd9, 0x0e, 0x50, 0x12, 0x03, 0x30, 0x0e, 0x0c, 0x43, 0x13,
+ 0x40, 0x4d, 0x1b, 0x3e,
+ 0x51, 0x11, 0xfe, 0xba, 0xf0, 0x03, 0x11, 0xf0, 0xe0, 0x30, 0x08, 0xff,
+ 0xef, 0xf0, 0xeb, 0x10,
+ 0x33, 0xbd, 0xb8, 0x1f, 0x70, 0x00, 0x10, 0x2f, 0x40, 0x34, 0x0f, 0x00,
+ 0x04, 0xe1, 0xcf, 0xdf,
+ 0x10, 0x14, 0x00, 0xac, 0x0e, 0xe0, 0xf2, 0x00, 0xed, 0xfc, 0x21, 0x02,
+ 0x40, 0x51, 0x22, 0x06,
+ 0x12, 0x11, 0x00, 0xc0, 0x15, 0xf1, 0x8e, 0xef, 0xf7, 0x03, 0xde, 0xff,
+ 0x01, 0x21, 0x0f, 0x1c,
+ 0x10, 0xe0, 0xcf, 0x02, 0x01, 0xdb, 0x10, 0x71, 0x32, 0x14, 0xf2, 0xb0,
+ 0xeb, 0xf0, 0x02, 0xe4,
+ 0x80, 0x00, 0x0d, 0x0f, 0x01, 0x37, 0x11, 0x00, 0xc0, 0x20, 0x60, 0x10,
+ 0x10, 0x3d, 0x3d, 0xdd,
+ 0xe0, 0x00, 0x0d, 0x24, 0x10, 0xe8, 0xbf, 0x0f, 0x32, 0xe5, 0xde, 0x5c,
+ 0x70, 0xfe, 0xef, 0x0f,
+ 0xfe, 0xfc, 0xec, 0x2e, 0x4d, 0x0e, 0x3f, 0x40, 0x40, 0x22, 0x0e, 0xc3,
+ 0x07, 0x17, 0xf0, 0xee,
+ 0x10, 0x22, 0x01, 0xa0, 0xf0, 0xee, 0xd8, 0xde, 0x11, 0x01, 0xef, 0x2f,
+ 0x30, 0x34, 0x50, 0x4f,
+ 0x50, 0x66, 0xf0, 0xde, 0xe0, 0x05, 0xf3, 0xd0, 0xd0, 0x00, 0x00, 0x23,
+ 0x02, 0xc2, 0xdd, 0x0c,
+ 0x31, 0xdf, 0x8b, 0x01, 0x04, 0x20, 0x1c, 0x60, 0x10, 0xf1, 0xc2, 0x07,
+ 0xf0, 0xed, 0xf0, 0x04,
+ 0x00, 0xdd, 0xe0, 0xf1, 0xe2, 0xb2, 0x23, 0x32, 0x3e, 0x19, 0x50, 0x73,
+ 0x11, 0x1e, 0x0e, 0x0f,
+ 0x21, 0x20, 0xeb, 0x00, 0x03, 0xc0, 0xf2, 0x2d, 0x3e, 0x31, 0x02, 0xfb,
+ 0xcc, 0xde, 0xe1, 0xae,
+ 0xd8, 0xfc, 0xff, 0x2d, 0x5c, 0x70, 0x31, 0x01, 0x11, 0x0f, 0x2c, 0x10,
+ 0x27, 0x02, 0xf0, 0x0e,
+ 0x23, 0xb2, 0xe0, 0xeb, 0xe0, 0xc0, 0xbc, 0xfe, 0xe0, 0x00, 0xe1, 0x32,
+ 0x3f, 0x6c, 0x30, 0x34,
+ 0x20, 0x01, 0xef, 0xc0, 0xf6, 0xf3, 0x02, 0x90, 0xf0, 0xf2, 0x03, 0x00,
+ 0x21, 0xe5, 0xa0, 0xee,
+ 0xed, 0x01, 0x02, 0x10, 0x35, 0x40, 0x2b, 0xf0, 0xcf, 0x07, 0xe2, 0xe0,
+ 0x1f, 0x0d, 0xdf, 0xe2,
+ 0xb2, 0x80, 0xf3, 0x02, 0x10, 0x02, 0xf3, 0x00, 0x03, 0x36, 0x4d, 0x6b,
+ 0x31, 0x03, 0x00, 0x0c,
+ 0x1a, 0x0f, 0xf2, 0x03, 0xe0, 0x4b, 0x30, 0x30, 0x24, 0x2f, 0x00, 0xe2,
+ 0x81, 0xc9, 0xff, 0xdf,
+ 0x10, 0x2d, 0x3e, 0x0c, 0x0e, 0x7f, 0x02, 0x20, 0x08, 0x30, 0x50, 0x00,
+ 0x01, 0xf4, 0x04, 0x10,
+ 0x6e, 0x1d, 0xf0, 0xc3, 0xef, 0xed, 0xfe, 0xe0, 0xeb, 0x0f, 0x02, 0x30,
+ 0x2f, 0x7d, 0x43, 0x10,
+ 0x0d, 0xfe, 0xd7, 0xc4, 0x00, 0xf2, 0x04, 0x34, 0x10, 0x0f, 0x80, 0xf3,
+ 0xe4, 0xf0, 0xe0, 0xe0,
+ 0x0b, 0x00, 0x5f, 0x00, 0x00, 0xe0, 0x37, 0x30, 0xed, 0xf0, 0x14, 0x02,
+ 0xaf, 0xea, 0x00, 0x13,
+ 0xc0, 0x92, 0x02, 0xe0, 0xfd, 0xe0, 0x07, 0x32, 0x00, 0x0c, 0x50, 0x70,
+ 0x13, 0x1d, 0x0c, 0xf2,
+ 0xf2, 0x0e, 0x0d, 0x31, 0x23, 0x2f, 0x2f, 0x01, 0xf7, 0xf1, 0xcf, 0xef,
+ 0xff, 0xc8, 0xdf, 0xe0,
+ 0xf0, 0xcf, 0x3d, 0x7e, 0x0d, 0x1e, 0x60, 0x0d, 0x1d, 0x1f, 0x20, 0x27,
+ 0x33, 0x14, 0x21, 0x22,
+ 0x20, 0x0b, 0x8e, 0xef, 0xe3, 0xe2, 0xbb, 0xee, 0xf0, 0x00, 0x10, 0x2d,
+ 0x7e, 0x2d, 0xf8, 0xf0,
+ 0x13, 0x02, 0xfe, 0x00, 0x16, 0x61, 0x00, 0x12, 0xd4, 0xa0, 0xfd, 0x14,
+ 0x02, 0xd0, 0xfc, 0x00,
+ 0xf1, 0xe0, 0x0e, 0x21, 0x24, 0xfd, 0xfb, 0x32, 0x65, 0xf0, 0xde, 0x0f,
+ 0x52, 0xf0, 0xde, 0xe0,
+ 0xe5, 0xf0, 0x9e, 0x01, 0xe2, 0xe2, 0x12, 0x12, 0x21, 0x20, 0x7c, 0x31,
+ 0xf3, 0xf3, 0xdf, 0x00,
+ 0x5a, 0x09, 0x10, 0x00, 0x42, 0x04, 0x01, 0x00, 0x0e, 0x41, 0x10, 0xee,
+ 0x90, 0xff, 0x08, 0xfe,
+ 0x00, 0x11, 0x0d, 0x0a, 0x0d, 0x0e, 0x40, 0x2f, 0x0d, 0x2e, 0x71, 0x15,
+ 0x12, 0x22, 0x51, 0x22,
+ 0x10, 0xdc, 0xd0, 0xc1, 0xe5, 0xc0, 0xd1, 0x0e, 0x3b, 0x3f, 0x40, 0xf0,
+ 0xd0, 0xfa, 0x2f, 0x4f,
+ 0x11, 0xf3, 0xf0, 0x20, 0x1f, 0x32, 0xe6, 0x02, 0xb2, 0xa3, 0xf3, 0x03,
+ 0xbf, 0xfc, 0x12, 0x33,
+ 0xad, 0xc9, 0x00, 0x44, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x11, 0x01, 0x3d,
+ 0x0c, 0x0f, 0xb2, 0xf0,
+ 0xc0, 0xc0, 0xc7, 0xf1, 0x13, 0x01, 0x0f, 0x16, 0x54, 0x00, 0x0e, 0x1e,
+ 0x21, 0x03, 0x0c, 0x0d,
+ 0x3f, 0x1c, 0x5f, 0x5f, 0x24, 0x07, 0x02, 0x1f, 0x1c, 0x01, 0xc4, 0xe0,
+ 0xef, 0xc0, 0xf0, 0xed,
+ 0x0e, 0x1e, 0x19, 0xfe, 0x0b, 0xdf, 0x7f, 0x3e, 0x00, 0x13, 0x70, 0x51,
+ 0x31, 0x50, 0x00, 0x02,
+ 0xd5, 0xef, 0xf0, 0xf4, 0xef, 0xeb, 0x00, 0x0f, 0xfd, 0x00, 0x02, 0xf1,
+ 0x0d, 0x58, 0x30, 0x0f,
+ 0x0f, 0x00, 0x77, 0x10, 0x2f, 0x0f, 0x04, 0x04, 0xc1, 0xdf, 0xdf, 0xd0,
+ 0xb3, 0xd0, 0xe2, 0xe1,
+ 0xfd, 0xcb, 0x0f, 0x63, 0xd2, 0xe2, 0x00, 0x0f, 0x6e, 0x4e, 0x2f, 0x33,
+ 0xd4, 0xaf, 0xfe, 0xf2,
+ 0xf6, 0xdf, 0xec, 0x00, 0xe2, 0x03, 0xf7, 0x24, 0x21, 0x0f, 0x3e, 0x4e,
+ 0xff, 0xdf, 0x52, 0x11,
+ 0x3a, 0x2f, 0x70, 0x65, 0x01, 0x0f, 0xfc, 0x00, 0x23, 0x10, 0xf0, 0xd2,
+ 0x03, 0xe1, 0xf8, 0x0f,
+ 0x3e, 0x0f, 0xdd, 0xcd, 0xce, 0xdb, 0xf0, 0x3f, 0x51, 0x60, 0x4d, 0x11,
+ 0x24, 0x30, 0x2e, 0x06,
+ 0xc1, 0xef, 0xee, 0x22, 0x03, 0xde, 0xff, 0xde, 0xdd, 0xde, 0x03, 0x07,
+ 0x2f, 0xb8, 0x1c, 0x70,
+ 0x10, 0x31, 0xf2, 0x01, 0x2f, 0x70, 0x02, 0xf2, 0xb7, 0xf4, 0x00, 0x0e,
+ 0x00, 0xe1, 0xe2, 0xe0,
+ 0xe0, 0xc1, 0xf1, 0xdf, 0x00, 0x03, 0x3f, 0x6c, 0x40, 0x12, 0x02, 0xf5,
+ 0xd1, 0x9d, 0x09, 0xdf,
+ 0xc0, 0xf0, 0xf0, 0xf5, 0xf4, 0x10, 0x00, 0x2e, 0x23, 0xf3, 0x10, 0x0a,
+ 0x50, 0x31, 0x01, 0xd1,
+ 0x0e, 0x7e, 0x60, 0x1f, 0x4d, 0x10, 0x00, 0xf0, 0xe7, 0x01, 0x06, 0x02,
+ 0x00, 0x3d, 0x4b, 0xef,
+ 0xc0, 0xf0, 0xbb, 0xee, 0xbc, 0x0f, 0x20, 0x30, 0x30, 0x5c, 0x2f, 0x1f,
+ 0x30, 0x35, 0x21, 0x00,
+ 0xf1, 0xd0, 0xd0, 0xf0, 0x00, 0xc2, 0x85, 0xff, 0x0d, 0x0e, 0x0f, 0xe0,
+ 0x02, 0xd9, 0x0d, 0x4e,
+ 0x70, 0x2e, 0x0e, 0x16, 0x25, 0xe0, 0xdd, 0xf3, 0xf6, 0x01, 0x3f, 0x0e,
+ 0xc1, 0xb3, 0xd2, 0xe0,
+ 0x80, 0xff, 0xfe, 0x00, 0x14, 0x01, 0x10, 0x31, 0x40, 0x11, 0x00, 0x23,
+ 0xe5, 0x8c, 0xfd, 0x0e,
+ 0xd0, 0x01, 0x02, 0xe7, 0xd6, 0xd0, 0x10, 0x30, 0x10, 0xf0, 0xef, 0xd0,
+ 0xb4, 0xd4, 0x11, 0x7d,
+ 0x7a, 0x1f, 0x2f, 0x00, 0x0f, 0x11, 0x05, 0x00, 0xff, 0x01, 0x36, 0x30,
+ 0xf1, 0x0e, 0x0e, 0xcd,
+ 0xae, 0xe0, 0xd1, 0x0c, 0xe9, 0x0f, 0x5d, 0x20, 0x10, 0x20, 0x1f, 0x50,
+ 0x61, 0x10, 0x10, 0x0e,
+ 0xe4, 0xf2, 0xfd, 0x1f, 0x41, 0x07, 0xf0, 0xcf, 0xf0, 0xf0, 0xdf, 0xd8,
+ 0x10, 0x40, 0x11, 0x1c,
+ 0x1e, 0x10, 0xf3, 0xe2, 0x20, 0x70, 0x23, 0xf1, 0x05, 0xf3, 0xf2, 0xf1,
+ 0x01, 0xb0, 0xa5, 0xf4,
+ 0xc0, 0xcc, 0xff, 0x02, 0x24, 0x2f, 0x20, 0x13, 0x20, 0x0e, 0x1c, 0xf1,
+ 0xd3, 0xcc, 0xbb, 0xbf,
+ 0xf1, 0xf5, 0xe3, 0x01, 0xff, 0x1e, 0x31, 0xf5, 0xd2, 0xb2, 0xd2, 0xc0,
+ 0x1d, 0x1f, 0x62, 0x23,
+ 0x3a, 0x5d, 0x0e, 0x0a, 0xf0, 0xf5, 0x22, 0x00, 0x2e, 0x70, 0x22, 0x22,
+ 0xf2, 0xe1, 0xdf, 0xf9,
+ 0x0e, 0xe0, 0xee, 0xcc, 0xce, 0x0d, 0x0e, 0x0e, 0x6f, 0x60, 0x2f, 0x0a,
+ 0x0e, 0x10, 0x43, 0xf2,
+ 0x00, 0x1d, 0x40, 0x02, 0x03, 0xf1, 0xc4, 0xc7, 0xf2, 0xf8, 0x0f, 0x30,
+ 0x0e, 0xdf, 0xfe, 0x00,
+ 0x12, 0x7f, 0x2b, 0x01, 0xe3, 0xf0, 0x20, 0x40, 0x56, 0x22, 0xf0, 0xc1,
+ 0xc2, 0xe4, 0xe1, 0xd0,
+ 0xec, 0xd0, 0xf2, 0xe2, 0x03, 0x72, 0x32, 0x2f, 0xfc, 0x0e, 0x31, 0xc3,
+ 0xcf, 0xdb, 0x00, 0xf2,
+ 0xe0, 0x00, 0xf3, 0xd7, 0xc4, 0x0d, 0xed, 0xd2, 0x87, 0xd3, 0x01, 0xd0,
+ 0x0f, 0x5d, 0x50, 0x2f,
+ 0xf1, 0xee, 0x1f, 0x3f, 0x3e, 0x20, 0x47, 0x27, 0x10, 0x3f, 0x11, 0x15,
+ 0x00, 0xf0, 0xec, 0x90,
+ 0xdf, 0x9f, 0xff, 0x0e, 0xdd, 0x0c, 0x3d, 0x3f, 0x3e, 0x50, 0x0e, 0x0f,
+ 0x0c, 0x4d, 0x70, 0x11,
+ 0x03, 0x02, 0x04, 0x02, 0x00, 0xf1, 0xf4, 0xe0, 0xdb, 0xe0, 0x00, 0x18,
+ 0x1b, 0x21, 0xd0, 0xce,
+ 0xff, 0xe0, 0x52, 0x60, 0x2c, 0x0e, 0x03, 0x57, 0x13, 0x00, 0xf0, 0xde,
+ 0xef, 0xe2, 0xe6, 0xaf,
+ 0xd0, 0xd1, 0x03, 0x2f, 0xf0, 0x04, 0x71, 0x20, 0xfd, 0xff, 0xf0, 0xc5,
+ 0xe0, 0xf0, 0xf0, 0x00,
+ 0x2f, 0x2e, 0x1d, 0xb2, 0xb6, 0xe2, 0xe5, 0xf3, 0xe0, 0xe2, 0xe3, 0x02,
+ 0x2f, 0x38, 0x2e, 0x41,
+ 0xf3, 0x0e, 0x4d, 0x6d, 0x2f, 0x00, 0x15, 0x77, 0x20, 0x20, 0x20, 0x30,
+ 0x03, 0xe2, 0x81, 0xf0,
+ 0x0a, 0x0f, 0xed, 0x1d, 0x1e, 0xe0, 0xd1, 0x0e, 0x6b, 0x00, 0x2e, 0x1d,
+ 0x28, 0x0f, 0x41, 0x44,
+ 0x4f, 0x0e, 0xe0, 0xf2, 0x01, 0x01, 0x03, 0x0f, 0x59, 0xe0, 0xd0, 0x21,
+ 0x0f, 0xde, 0x8f, 0x0e,
+ 0x0f, 0x0d, 0x20, 0x20, 0x42, 0x0f, 0xfd, 0x26, 0x52, 0x03, 0xf3, 0xf1,
+ 0xb0, 0xfe, 0xf0, 0xe5,
+ 0xb7, 0xe2, 0x02, 0x0f, 0x30, 0x42, 0x10, 0xfd, 0xc0, 0xf1, 0xe6, 0x02,
+ 0x42, 0x00, 0x28, 0x0f,
+ 0x0d, 0xc2, 0xb3, 0xe2, 0xe2, 0xdf, 0xef, 0xd1, 0xf6, 0xf3, 0x01, 0x01,
+ 0x1b, 0x00, 0x22, 0x00,
+ 0x6e, 0x0e, 0x5d, 0xee, 0x9a, 0x13, 0x00, 0xeb, 0x3d, 0x78, 0x2f, 0xf1,
+ 0x10, 0x0f, 0xfe, 0xc2,
+ 0x52, 0x4e, 0x6c, 0x24, 0x04, 0x13, 0x00, 0x03, 0x03, 0x2d, 0xed, 0xba,
+ 0x0f, 0xff, 0xde, 0xff,
+ 0x0e, 0x0d, 0x0b, 0xde, 0xfe, 0x0d, 0x7c, 0x6e, 0x1b, 0x4e, 0x0f, 0x04,
+ 0x34, 0x02, 0xfd, 0x0d,
+ 0x01, 0x11, 0x04, 0xc4, 0x01, 0x0c, 0x2c, 0xf0, 0x81, 0xe0, 0x0c, 0xfc,
+ 0x1e, 0x1f, 0x0d, 0x21,
+ 0x25, 0x51, 0x3f, 0x5e, 0x10, 0x15, 0xf2, 0xc0, 0xcf, 0xe1, 0xe2, 0xc3,
+ 0x07, 0x34, 0x0e, 0x2d,
+ 0x20, 0xc0, 0xc2, 0xe2, 0x03, 0x33, 0x0d, 0x3c, 0x12, 0x15, 0xa0, 0xfb,
+ 0xf0, 0xfe, 0x00, 0xe0,
+ 0xc3, 0xa2, 0xc5, 0x01, 0x01, 0x15, 0x10, 0xf0, 0xf0, 0xf5, 0xff, 0xdd,
+ 0x00, 0xe0, 0x0f, 0x2d,
+ 0x7f, 0x71, 0x25, 0x15, 0x02, 0x30, 0x01, 0x02, 0x03, 0x03, 0x0e, 0x08,
+ 0xcd, 0xf0, 0xf2, 0x00,
+ 0xc0, 0xdf, 0xb9, 0xff, 0x0e, 0x6f, 0x0c, 0x2f, 0x30, 0x41, 0x1f, 0x2c,
+ 0x01, 0x03, 0x21, 0x1e,
+ 0x3f, 0x60, 0x07, 0x03, 0xff, 0xdc, 0x00, 0x0f, 0xd0, 0x02, 0xcd, 0x9a,
+ 0xdd, 0x0f, 0x12, 0x53,
+ 0x20, 0x5e, 0x1e, 0x2f, 0x01, 0xc5, 0xe2, 0xe0, 0x01, 0x03, 0xef, 0x11,
+ 0x34, 0x07, 0xb1, 0xd1,
+ 0x02, 0x00, 0x4f, 0xf0, 0xc4, 0xd5, 0x01, 0x00, 0x5f, 0x3e, 0x1f, 0xdc,
+ 0xaa, 0xf0, 0xf0, 0x02,
+ 0xb0, 0xe3, 0x02, 0x02, 0xf7, 0xf4, 0x01, 0xd0, 0xed, 0x01, 0x0f, 0xfd,
+ 0x80, 0xee, 0x20, 0x68,
+ 0x10, 0x20, 0x24, 0x23, 0x00, 0x03, 0x11, 0x4f, 0x20, 0x05, 0xf1, 0xde,
+ 0xd0, 0x20, 0xe0, 0x8d,
+ 0xed, 0xfd, 0x08, 0x1d, 0xde, 0x1e, 0x7e, 0x3e, 0xfd, 0x0c, 0x1e, 0x4e,
+ 0x10, 0x24, 0x4e, 0x00,
+ 0x03, 0xe7, 0x23, 0x21, 0x0f, 0x0b, 0xed, 0xce, 0xbf, 0xcf, 0xbe, 0xff,
+ 0x0e, 0x1b, 0x4f, 0x6e,
+ 0x1d, 0x02, 0xf7, 0x02, 0x3e, 0xfb, 0x01, 0x04, 0xc3, 0xe0, 0xf0, 0x02,
+ 0x04, 0xf1, 0xff, 0xdd,
+ 0xc2, 0xd7, 0xf5, 0xf0, 0x21, 0x1f, 0x5e, 0x70, 0x01, 0x00, 0x0f, 0xe0,
+ 0xed, 0xee, 0xf1, 0xdf,
+ 0xc0, 0xd7, 0xe5, 0xf0, 0xff, 0xf2, 0xd7, 0x92, 0xc0, 0xcd, 0xfd, 0x0f,
+ 0xe0, 0x10, 0x50, 0x00,
+ 0x0c, 0x63, 0x47, 0x01, 0xe0, 0x2f, 0x3f, 0x41, 0x13, 0x22, 0xf1, 0xe2,
+ 0xd0, 0x0d, 0x0f, 0xcc,
+ 0xca, 0x0e, 0xef, 0xff, 0xea, 0x0e, 0x40, 0x30, 0x2d, 0x29, 0x70, 0x30,
+ 0x30, 0xf0, 0x00, 0xf3,
+ 0x33, 0x7e, 0x7f, 0x11, 0x03, 0xde, 0xee, 0x00, 0xfb, 0xce, 0xef, 0x1c,
+ 0x2e, 0x0a, 0x0f, 0x4f,
+ 0x3f, 0x11, 0x10, 0x1b, 0x0e, 0xd2, 0xf7, 0xc2, 0x00, 0x0e, 0x10, 0x71,
+ 0x03, 0xd5, 0xb0, 0xf0,
+ 0xf0, 0xf4, 0x03, 0x02, 0x05, 0x1f, 0x5e, 0x10, 0x11, 0xf0, 0xde, 0xe1,
+ 0xb0, 0xda, 0xbc, 0x0f,
+ 0x03, 0x33, 0xdf, 0xd5, 0x05, 0x02, 0xb0, 0xd0, 0xd0, 0xcf, 0xfb, 0x00,
+ 0xe0, 0xd2, 0x01, 0x5e,
+ 0x1e, 0x40, 0x41, 0x57, 0x10, 0x2f, 0x30, 0x52, 0x14, 0x02, 0x03, 0xe1,
+ 0xf0, 0xfa, 0xee, 0x0f,
+ 0x0e, 0x80, 0xe0, 0xf1, 0x0d, 0x58, 0x0b, 0x10, 0x1f, 0xf0, 0xfd, 0x1f,
+ 0x41, 0x11, 0x72, 0x21,
+ 0x0f, 0x1f, 0x23, 0x03, 0x00, 0xd0, 0xcb, 0xff, 0xcf, 0x00, 0xe1, 0xef,
+ 0x18, 0x3d, 0x7d, 0x20,
+ 0xf1, 0x04, 0x0d, 0x2c, 0x00, 0x05, 0x22, 0x00, 0xb0, 0x1e, 0x50, 0x0f,
+ 0xc0, 0xe6, 0xd1, 0xf5,
+ 0xf1, 0xd1, 0xe0, 0x00, 0x51, 0x33, 0x12, 0x04, 0x02, 0x0e, 0xda, 0xd0,
+ 0xe0, 0x0d, 0xac, 0x0f,
+ 0x35, 0x25, 0xa1, 0xb0, 0x02, 0xe1, 0xe0, 0xd0, 0xc2, 0x00, 0xf8, 0xd0,
+ 0xf0, 0x02, 0xf0, 0x0e,
+ 0x50, 0x30, 0x60, 0x4f, 0x11, 0x07, 0xf2, 0x50, 0x31, 0x11, 0x11, 0xf0,
+ 0xdf, 0xfc, 0x00, 0xf4,
+ 0x81, 0x0c, 0x0b, 0x0f, 0x0e, 0x10, 0x10, 0x09, 0xef, 0xee, 0x00, 0x3f,
+ 0x6e, 0x21, 0x73, 0x01,
+ 0x20, 0x0d, 0x4f, 0x00, 0xf4, 0xd6, 0xd0, 0x0d, 0x0c, 0xe0, 0xdf, 0x10,
+ 0x20, 0x10, 0x3d, 0x1d,
+ 0x3d, 0x3f, 0xb2, 0xe3, 0x22, 0x7c, 0x2e, 0x13, 0x16, 0x10, 0x0c, 0xa0,
+ 0xe2, 0xf7, 0xf3, 0xbf,
+ 0xef, 0x00, 0x44, 0x03, 0x07, 0x01, 0x10, 0x0f, 0xde, 0xcf, 0xe0, 0x10,
+ 0x1f, 0xbd, 0x1d, 0x50,
+ 0xf5, 0xb3, 0xf5, 0xf1, 0x00, 0xf0, 0xf0, 0x01, 0xf2, 0xa4, 0xd1, 0xd1,
+ 0x1c, 0x3f, 0xe0, 0xef,
+ 0x09, 0x2f, 0x14, 0x04, 0x51, 0x7f, 0x5f, 0x00, 0x11, 0x03, 0x06, 0xf0,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0x02, 0x12, 0x1e, 0xd9, 0xec, 0x0f, 0x0e, 0xcd, 0xcf, 0xde, 0x0b, 0x70,
+ 0x3f, 0x6f, 0x20, 0x01,
+ 0x32, 0x20, 0xfe, 0x0d, 0x01, 0x17, 0xb7, 0xcf, 0x0c, 0x00, 0x20, 0x00,
+ 0x0d, 0x0f, 0x0f, 0x00,
+ 0x00, 0x10, 0x5e, 0x00, 0x2f, 0x30, 0x2f, 0x12, 0x34, 0x00, 0xdf, 0x8b,
+ 0xc3, 0xf6, 0xe1, 0xd0,
+ 0x00, 0xf7, 0x31, 0x74, 0xf0, 0xd2, 0xe0, 0xf0, 0x10, 0x4d, 0x00, 0x0c,
+ 0xee, 0xf0, 0x04, 0xc2,
+ 0x00, 0x01, 0xf2, 0x84, 0xd0, 0x0f, 0xf1, 0xc7, 0xa7, 0xe0, 0x0e, 0xfe,
+ 0xff, 0xe0, 0x02, 0x00,
+ 0x00, 0x0d, 0x31, 0x64, 0x54, 0x30, 0x10, 0x12, 0x00, 0x22, 0x25, 0x02,
+ 0xc4, 0x00, 0xff, 0x0d,
+ 0x01, 0x06, 0x2f, 0xbb, 0xde, 0xee, 0xf0, 0xce, 0xbd, 0x0a, 0x2f, 0x30,
+ 0x40, 0x70, 0x7c, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xef, 0x0a, 0x0e, 0x20, 0x0f,
+ 0xe0, 0xfe, 0xfe, 0xe0,
+ 0x1e, 0x5d, 0x00, 0x02, 0x2e, 0x78, 0x40, 0x01, 0xd2, 0xed, 0x00, 0xe3,
+ 0x0c, 0x1d, 0x00, 0xf5,
+ 0x05, 0xe2, 0xe5, 0xe2, 0xf1, 0x00, 0x00, 0xde, 0xef, 0x00, 0xc3, 0xc1,
+ 0xd0, 0x4b, 0x5f, 0x10,
+ 0xc2, 0xc2, 0xf5, 0xd2, 0xf0, 0xd0, 0xd6, 0xe5, 0xd2, 0x9e, 0xce, 0xde,
+ 0xe0, 0xe0, 0xe0, 0xb3,
+ 0xde, 0xfe, 0x3f, 0x72, 0x74, 0x03, 0x04, 0x0f, 0x0e, 0x13, 0x07, 0x27,
+ 0x10, 0x0f, 0x0f, 0x03,
+ 0x02, 0x31, 0x0c, 0xee, 0xcd, 0xde, 0xb0, 0xee, 0xdf, 0xe8, 0x2f, 0x5f,
+ 0x5f, 0x4e, 0x1e, 0x01,
+ 0x32, 0x00, 0x1e, 0x0c, 0x02, 0xe4, 0x01, 0x3e, 0x1b, 0xef, 0x10, 0x70,
+ 0xe0, 0x9e, 0xf0, 0x0c,
+ 0x3a, 0x0f, 0x3e, 0x3f, 0x2f, 0xe2, 0xf6, 0x00, 0x0e, 0xef, 0xed, 0x1b,
+ 0x4f, 0xb1, 0xd7, 0xf2,
+ 0x00, 0x31, 0x00, 0x03, 0xa2, 0xd0, 0xdf, 0x01, 0x20, 0x40, 0x1d, 0x00,
+ 0xe5, 0x00, 0x3c, 0xae,
+ 0xf0, 0x10, 0xf1, 0x87, 0xe7, 0x01, 0x20, 0xee, 0xb0, 0xd3, 0xd0, 0xb0,
+ 0xff, 0xe0, 0xd2, 0x03,
+ 0x1e, 0x1c, 0x20, 0x72, 0x43, 0x01, 0xf6, 0x00, 0x2c, 0x21, 0x06, 0x03,
+ 0x23, 0x41, 0x20, 0x1c,
+ 0x3f, 0xed, 0x81, 0xf6, 0xff, 0xdc, 0xfd, 0xe0, 0xef, 0x0f, 0x2c, 0x3e,
+ 0x7e, 0x70, 0x0e, 0x0f,
+ 0x10, 0x11, 0x01, 0xe1, 0x13, 0x44, 0x0e, 0xf8, 0x00, 0xf0, 0xe1, 0xd1,
+ 0x0d, 0xfb, 0xfd, 0x3c,
+ 0x5f, 0x01, 0x27, 0x20, 0x40, 0xfc, 0x00, 0x50, 0x1f, 0x0e, 0xde, 0xb0,
+ 0x03, 0x00, 0x41, 0x14,
+ 0x05, 0xc2, 0xe0, 0xc1, 0x04, 0x11, 0x00, 0xd0, 0x04, 0x2f, 0x2e, 0xe0,
+ 0xed, 0x3d, 0x0e, 0xc0,
+ 0xb0, 0x03, 0x35, 0x05, 0xa1, 0x0f, 0x0e, 0xd2, 0x87, 0xd3, 0xd0, 0xeb,
+ 0xe0, 0xe0, 0xc0, 0xe1,
+ 0x04, 0x11, 0x6e, 0x3c, 0x10, 0x00, 0x02, 0xd3, 0x26, 0x30, 0x60, 0x31,
+ 0x44, 0x02, 0x00, 0x00,
+ 0x30, 0x13, 0xe0, 0x8a, 0x00, 0xd0, 0xfd, 0xcd, 0x0d, 0x1c, 0x5d, 0x1a,
+ 0x10, 0x00, 0x0d, 0x0f,
+ 0x21, 0x40, 0x4d, 0x0f, 0x20, 0x0f, 0x06, 0x03, 0xf0, 0xdc, 0x19, 0x20,
+ 0xc0, 0x90, 0xff, 0x1e,
+ 0x30, 0x23, 0x21, 0xf2, 0x0e, 0x2a, 0x4f, 0x0b, 0xef, 0x0f, 0x00, 0xee,
+ 0x0f, 0x72, 0x07, 0x21,
+ 0x0f, 0xb1, 0xc3, 0xd2, 0x13, 0x36, 0x01, 0xe0, 0x0d, 0x2e, 0x00, 0xb0,
+ 0xe1, 0xf1, 0x00, 0x0b,
+ 0x2f, 0xb2, 0x05, 0x01, 0x61, 0x02, 0xe5, 0x90, 0xed, 0xd0, 0xb5, 0xd0,
+ 0xef, 0xf0, 0x01, 0x10,
+ 0x2e, 0xe1, 0xf1, 0x0b, 0x7c, 0x1f, 0x05, 0xf4, 0x01, 0x31, 0x4f, 0x51,
+ 0x24, 0x14, 0x31, 0x00,
+ 0x0d, 0xc2, 0xe6, 0xb0, 0xde, 0xff, 0x0c, 0x0e, 0x10, 0x20, 0x0b, 0xff,
+ 0x0e, 0x20, 0x7e, 0x7f,
+ 0x1e, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x25, 0x03, 0xdc, 0xd8, 0xf0, 0x00,
+ 0xff, 0xbe, 0x00, 0x0f,
+ 0x51, 0x23, 0x13, 0x2d, 0x08, 0x0f, 0x20, 0x3e, 0x0f, 0x10, 0x20, 0x22,
+ 0x0d, 0xdc, 0x32, 0x04,
+ 0x83, 0xd7, 0xf0, 0x00, 0x10, 0x13, 0x06, 0xd0, 0x8e, 0x00, 0x10, 0x40,
+ 0xe0, 0xdb, 0xf0, 0xf3,
+ 0x01, 0x61, 0x30, 0x20, 0xf0, 0xd1, 0xa4, 0xe0, 0xe2, 0xd4, 0xc1, 0x0f,
+ 0xdc, 0xc0, 0xf3, 0x00,
+ 0x00, 0x0d, 0x3d, 0x00, 0xcb, 0xf0, 0xc7, 0x04, 0x30, 0x7d, 0x50, 0x20,
+ 0x35, 0x03, 0x11, 0xe1,
+ 0xe1, 0x0f, 0x3f, 0x01, 0x80, 0xf9, 0x00, 0xff, 0x00, 0x0d, 0x0e, 0x0e,
+ 0x0e, 0x0c, 0x1b, 0x5f,
+ 0x3f, 0x3f, 0x12, 0x25, 0x30, 0x40, 0x0e, 0xef, 0xeb, 0x0f, 0xd0, 0xb0,
+ 0x01, 0x1e, 0x10, 0x23,
+ 0x6e, 0x0e, 0xdd, 0xf0, 0xf0, 0x4b, 0x3d, 0x3c, 0x1c, 0x4e, 0xf0, 0xc0,
+ 0x0e, 0x3b, 0x6e, 0x02,
+ 0xc7, 0xe3, 0xe3, 0xf3, 0x41, 0x33, 0x02, 0x02, 0x9e, 0xeb, 0xe0, 0x01,
+ 0xf1, 0xfe, 0x30, 0x43,
+ 0x10, 0x1b, 0x20, 0x15, 0xc4, 0xcf, 0xc0, 0xe1, 0xc6, 0x90, 0xe0, 0xf3,
+ 0xe0, 0x0f, 0x2d, 0x1f,
+ 0xef, 0xc0, 0xf1, 0xe3, 0xc1, 0xde, 0x1e, 0x5f, 0x40, 0x30, 0x37, 0x36,
+ 0x22, 0x30, 0x01, 0xe0,
+ 0x00, 0x1f, 0x21, 0xe3, 0xa2, 0xdb, 0xed, 0xdf, 0xd0, 0xed, 0xf9, 0xdf,
+ 0x0e, 0x1d, 0x7c, 0x70,
+ 0x15, 0x31, 0x30, 0x0b, 0x20, 0x01, 0x00, 0x1e, 0xdf, 0xe0, 0xe0, 0x50,
+ 0x10, 0xb1, 0xf0, 0x1d,
+ 0x11, 0x03, 0x0d, 0x0c, 0x70, 0x10, 0xfa, 0x0b, 0x20, 0x40, 0x10, 0x0c,
+ 0xde, 0xec, 0xf0, 0xf1,
+ 0xd7, 0xf3, 0xf0, 0x00, 0x70, 0x10, 0xe0, 0x95, 0xe2, 0x0f, 0x1c, 0x01,
+ 0xf3, 0x20, 0x4e, 0x00,
+ 0x00, 0x44, 0x60, 0x00, 0xf0, 0xb3, 0xd7, 0xe2, 0x00, 0xd0, 0x00, 0xe0,
+ 0xf0, 0x00, 0xe1, 0xe0,
+ 0xa0, 0xe4, 0xff, 0xcc, 0x00, 0xfc, 0x00, 0x11, 0x63, 0x47, 0x20, 0x21,
+ 0x15, 0x03, 0x02, 0x4f,
+ 0x3d, 0x00, 0xf5, 0xc3, 0x03, 0x01, 0xcd, 0xfa, 0xeb, 0xd0, 0xd0, 0xfe,
+ 0x0e, 0xee, 0x5e, 0x70,
+ 0x72, 0x0e, 0x0f, 0x00, 0x0b, 0x1f, 0x2d, 0x1f, 0x00, 0xc1, 0x0c, 0x1c,
+ 0x00, 0x07, 0x20, 0x0e,
+ 0xff, 0xd0, 0x00, 0x00, 0x10, 0x70, 0x40, 0x08, 0x1d, 0x1c, 0xff, 0xdf,
+ 0xe0, 0x01, 0x3e, 0x50,
+ 0x07, 0x03, 0xf4, 0x00, 0x0f, 0x20, 0xf1, 0x84, 0xb1, 0xf0, 0x0f, 0xed,
+ 0xf2, 0x02, 0x6f, 0x2b,
+ 0x20, 0x12, 0xff, 0xd1, 0xf7, 0xc4, 0xcf, 0x0d, 0x02, 0x03, 0xf3, 0xe0,
+ 0x00, 0xb1, 0xc1, 0xd0,
+ 0x01, 0xb5, 0xdf, 0xeb, 0xf0, 0x0e, 0x00, 0x25, 0x33, 0x60, 0x41, 0x10,
+ 0x23, 0x10, 0x02, 0x17,
+ 0x36, 0x30, 0x30, 0x01, 0xc4, 0xdf, 0xad, 0xec, 0xe0, 0xf0, 0xf0, 0xed,
+ 0x0e, 0x4c, 0x2f, 0x5f,
+ 0x3e, 0x33, 0x33, 0x6a, 0x0c, 0x0e, 0x10, 0x01, 0xf0, 0x0d, 0x12, 0x4f,
+ 0x2a, 0x00, 0xa0, 0xf3,
+ 0xee, 0xfe, 0x12, 0x52, 0x5c, 0x1b, 0xf0, 0xfc, 0x0d, 0x3a, 0x1e, 0x0f,
+ 0x1e, 0xf1, 0xb3, 0x00,
+ 0x30, 0x46, 0x02, 0xf0, 0x01, 0xf1, 0xa3, 0xc5, 0xe3, 0xde, 0xfc, 0x00,
+ 0x32, 0x74, 0x40, 0x0e,
+ 0x0e, 0x00, 0xf3, 0xd7, 0xd2, 0x00, 0x00, 0xef, 0xb0, 0x12, 0x03, 0xf7,
+ 0x92, 0xe0, 0xfc, 0xe0,
+ 0xd0, 0xee, 0xde, 0xd0, 0xe1, 0x03, 0x42, 0x54, 0x22, 0x00, 0x01, 0x0e,
+ 0x31, 0x77, 0x57, 0x00,
+ 0x11, 0x00, 0x02, 0x01, 0xd2, 0x0f, 0xee, 0xdd, 0xfd, 0xfd, 0xee, 0x91,
+ 0x03, 0x1a, 0x4c, 0x3e,
+ 0x2f, 0x20, 0xed, 0xef, 0x2d, 0x7e, 0x5d, 0x0c, 0x1d, 0x00, 0xde, 0x0e,
+ 0x11, 0x00, 0xfe, 0xff,
+ 0x03, 0x05, 0xf2, 0x0e, 0x7c, 0x3d, 0x0d, 0xfa, 0x0e, 0x0b, 0x0f, 0x0d,
+ 0xf0, 0x0d, 0x5e, 0x30,
+ 0x41, 0x27, 0x53, 0x00, 0xc0, 0xb0, 0xe3, 0xf7, 0xd3, 0xdc, 0x1f, 0x60,
+ 0x21, 0x11, 0x02, 0x00,
+ 0xf1, 0xf0, 0x12, 0x1a, 0xe0, 0xc4, 0xc0, 0x31, 0xfd, 0x17, 0xc0, 0x13,
+ 0xd0, 0x80, 0x06, 0x88,
+ 0x00, 0x16, 0xbd, 0xee, 0x45, 0x20, 0xbf, 0xfd, 0x02, 0x33, 0x10, 0x0d,
+ 0xef, 0x21, 0x34, 0x00,
+ 0xfe, 0xf0, 0x33, 0x00, 0x0f, 0xf0, 0xf0, 0xcf, 0x00, 0xf3, 0xfd, 0xfe,
+ 0x0e, 0x10, 0x23, 0x0f,
+ 0x3b, 0x73, 0x30, 0xb8, 0x0e, 0x63, 0x22, 0xfd, 0xee, 0x00, 0x11, 0x10,
+ 0x0c, 0xf0, 0x04, 0x02,
+ 0xdf, 0x00, 0x40, 0x3c, 0x4e, 0x32, 0xf3, 0xab, 0x0d, 0x00, 0xfc, 0x10,
+ 0x40, 0xed, 0x2f, 0x77,
+ 0x1f, 0xdd, 0x13, 0x16, 0xcf, 0xbe, 0x12, 0x03, 0x0e, 0xec, 0x00, 0x34,
+ 0x31, 0x0f, 0x00, 0x23,
+ 0x0d, 0xbd, 0xfd, 0x14, 0x34, 0xe0, 0x00, 0x12, 0x10, 0x00, 0xd4, 0x80,
+ 0xaf, 0x0f, 0xe3, 0x01,
+ 0xff, 0xde, 0xe3, 0xd6, 0xbd, 0x00, 0x02, 0x20, 0x0e, 0x0a, 0x00, 0x44,
+ 0x32, 0x45, 0x20, 0x42,
+ 0x47, 0x02, 0xdd, 0xe0, 0x02, 0x20, 0xf0, 0xb0, 0xfe, 0xef, 0x0d, 0x02,
+ 0x02, 0xe9, 0x1e, 0x70,
+ 0x1e, 0xf1, 0x00, 0x62, 0x2e, 0x1a, 0x0d, 0x3f, 0x30, 0xff, 0xcc, 0x00,
+ 0x00, 0x11, 0xd6, 0xf0,
+ 0xf0, 0x30, 0x7e, 0x5d, 0x10, 0x04, 0xd0, 0xdd, 0x08, 0x1e, 0x20, 0x4f,
+ 0x6c, 0x3d, 0x01, 0x13,
+ 0x00, 0x0b, 0xf1, 0xf7, 0xa0, 0xdf, 0x00, 0xe0, 0x04, 0xcf, 0x11, 0x5f,
+ 0x2f, 0x13, 0xf0, 0xac,
+ 0x10, 0x10, 0xf0, 0x0e, 0x46, 0x00, 0xf0, 0x03, 0x26, 0xee, 0x8d, 0x01,
+ 0x05, 0x00, 0xbd, 0x00,
+ 0xf6, 0xe0, 0xdf, 0xce, 0x02, 0x11, 0xde, 0xde, 0x00, 0x10, 0x11, 0x21,
+ 0x61, 0x54, 0x24, 0x02,
+ 0xf0, 0x03, 0x32, 0x03, 0x0f, 0xf0, 0x17, 0xf1, 0x9d, 0x0d, 0x0d, 0xfe,
+ 0xf5, 0x14, 0xda, 0xff,
+ 0x21, 0x30, 0x2f, 0x30, 0x4f, 0x7d, 0x5e, 0x0e, 0x00, 0x00, 0xea, 0x00,
+ 0x01, 0x04, 0x0c, 0x00,
+ 0x73, 0x2e, 0x0f, 0x03, 0x05, 0xbc, 0xfe, 0xf0, 0x10, 0x1d, 0x19, 0x20,
+ 0x5f, 0x10, 0x41, 0x01,
+ 0x0e, 0xfd, 0xe0, 0xd7, 0xc2, 0xe0, 0xfd, 0x1f, 0x23, 0x76, 0x00, 0xde,
+ 0xf0, 0x01, 0x30, 0x0e,
+ 0x20, 0x00, 0xf1, 0x00, 0x10, 0x63, 0x06, 0xe0, 0x30, 0xfd, 0xd5, 0xa4,
+ 0xbd, 0xff, 0xf1, 0xe2,
+ 0xa0, 0x17, 0xbf, 0xc8, 0x24, 0x00, 0xbd, 0xed, 0x34, 0x13, 0xfc, 0xff,
+ 0x32, 0x52, 0x00, 0x0e,
+ 0x11, 0x02, 0x00, 0x01, 0x21, 0x01, 0x02, 0xee, 0x9b, 0x01, 0x24, 0xfe,
+ 0xec, 0x01, 0x01, 0x0f,
+ 0xbe, 0x33, 0x65, 0x1d, 0x1d, 0x0f, 0x0e, 0xfe, 0x13, 0x01, 0xe8, 0x11,
+ 0x42, 0xdd, 0x2f, 0x50,
+ 0x06, 0x00, 0xfe, 0x00, 0x01, 0xdf, 0xee, 0xd0, 0x0e, 0x70, 0x3e, 0x3a,
+ 0x41, 0x42, 0xde, 0xda,
+ 0x21, 0x22, 0xe0, 0xce, 0x00, 0x23, 0xc0, 0xd3, 0x02, 0x3f, 0xf1, 0xc2,
+ 0xff, 0x18, 0x60, 0x25,
+ 0x00, 0xcd, 0x00, 0x30, 0x42, 0x00, 0xf0, 0xf0, 0x55, 0x00, 0xce, 0x0f,
+ 0xd2, 0xd2, 0xd2, 0x07,
+ 0xd0, 0x8f, 0x8c, 0x00, 0x03, 0xd0, 0xfd, 0x00, 0x0e, 0x0f, 0x00, 0x03,
+ 0xad, 0x00, 0x27, 0x00,
+ 0x36, 0x08, 0xc3, 0xe9, 0x49, 0x0c, 0x28, 0xea, 0xbe, 0xe4, 0xe5, 0xe1,
+ 0xe7, 0xf4, 0xd4, 0xe4,
+ 0xe3, 0xe4, 0xe3, 0xf4, 0xe3, 0xc3, 0xc2, 0xd4, 0xb5, 0xc2, 0xc2, 0xd3,
+ 0xe3, 0xd2, 0xd1, 0x02,
+ 0xf4, 0xe2, 0xd1, 0xf1, 0x01, 0x00, 0xd0, 0xe0, 0x1f, 0x5f, 0x4f, 0x4e,
+ 0x40, 0x47, 0x22, 0x00,
+ 0x10, 0x10, 0x00, 0x0e, 0x0d, 0x09, 0x3c, 0x7d, 0x5d, 0x2b, 0x2c, 0x4d,
+ 0x2b, 0x4e, 0x3d, 0x4d,
+ 0x1d, 0x2d, 0x3d, 0x4e, 0x2c, 0x2e, 0x3e, 0x3d, 0x3d, 0x4e, 0x2c, 0x4b,
+ 0x4e, 0x3f, 0x3e, 0x3e,
+ 0x5e, 0x3e, 0x4d, 0x3e, 0x4d, 0x2d, 0x2c, 0x3e, 0x40, 0x36, 0x43, 0x00,
+ 0x00, 0x02, 0x03, 0xc4,
+ 0xc1, 0xc1, 0xc1, 0xc2, 0xd0, 0xbf, 0xe0, 0xd3, 0xe6, 0xe0, 0xe0, 0xd4,
+ 0xe7, 0xd3, 0xd4, 0xf4,
+ 0xf4, 0xf2, 0xf3, 0xe3, 0xd4, 0xc4, 0xb3, 0xd4, 0xd3, 0xa3, 0xd3, 0xd3,
+ 0xe3, 0xe3, 0xe3, 0xf4,
+ 0xe3, 0xe3, 0xe2, 0xd1, 0xf2, 0xd0, 0xdf, 0xfd, 0x3f, 0x72, 0x30, 0x1b,
+ 0x40, 0x23, 0x12, 0x23,
+ 0x25, 0x10, 0xfe, 0x0e, 0x30, 0x60, 0x5b, 0x5a, 0x3c, 0x2e, 0x4c, 0x2c,
+ 0x4c, 0x2d, 0x3c, 0x4d,
+ 0x3e, 0x3e, 0x2d, 0x3b, 0x3e, 0x6e, 0x1e, 0x1e, 0x2e, 0x1d, 0x2b, 0x3e,
+ 0x5f, 0x2f, 0x2d, 0x3d,
+ 0x4e, 0x4e, 0x2c, 0x3c, 0x5e, 0x3f, 0x3e, 0x2e, 0x30, 0x42, 0x33, 0x21,
+ 0x1f, 0x13, 0x06, 0xd1,
+ 0xa2, 0xd3, 0xb3, 0xd3, 0xc0, 0xcf, 0xe0, 0xd0, 0xd0, 0xd0, 0xc6, 0xd7,
+ 0xe2, 0xd2, 0xe4, 0x07,
+ 0x02, 0xd0, 0xe2, 0x07, 0x03, 0xa0, 0xd1, 0xd3, 0xc3, 0xc2, 0xe3, 0xe5,
+ 0xd2, 0xd2, 0xd2, 0xe2,
+ 0xe4, 0xc2, 0xd2, 0xc1, 0xe0, 0x01, 0x01, 0x00, 0x31, 0x10, 0x40, 0x62,
+ 0x10, 0x0f, 0x1f, 0x00,
+ 0x10, 0x1f, 0x23, 0x10, 0xf8, 0x0c, 0x7f, 0x50, 0x1b, 0x2b, 0x3d, 0x4d,
+ 0x3b, 0x2d, 0x4c, 0x5e,
+ 0x3f, 0x2c, 0x2d, 0x3e, 0x3e, 0x1c, 0x4f, 0x3f, 0x3e, 0x4d, 0x3e, 0x3e,
+ 0x2e, 0x3c, 0x2c, 0x4e,
+ 0x5e, 0x3c, 0x3d, 0x4e, 0x4d, 0x3e, 0x4f, 0x4f, 0x3e, 0x4e, 0x20, 0x23,
+ 0x12, 0x24, 0x02, 0xd1,
+ 0xe5, 0xb2, 0xce, 0xde, 0xcf, 0xcc, 0xcc, 0xef, 0xc0, 0xe0, 0xcd, 0xef,
+ 0xe7, 0xf7, 0xe2, 0xe1,
+ 0xf2, 0x04, 0xf5, 0xd2, 0xc2, 0xd3, 0xc3, 0xd4, 0xd3, 0xd4, 0xc4, 0xe3,
+ 0xc3, 0xd2, 0xe3, 0xe5,
+ 0xd2, 0xa2, 0xe1, 0xe3, 0xf2, 0xe0, 0x0f, 0x12, 0x23, 0x11, 0x10, 0x20,
+ 0x33, 0x33, 0x20, 0x03,
+ 0xf3, 0xc0, 0x14, 0x67, 0x11, 0x2e, 0x4e, 0x4d, 0x4c, 0x4a, 0x4d, 0x4b,
+ 0x3d, 0x3d, 0x4c, 0x3d,
+ 0x4d, 0x2c, 0x3d, 0x3e, 0x4d, 0x2a, 0x2e, 0x3e, 0x3f, 0x3e, 0x2d, 0x6d,
+ 0x2e, 0x3d, 0x2d, 0x3b,
+ 0x4e, 0x4f, 0x4f, 0x3e, 0x4c, 0x2d, 0x5e, 0x3f, 0x2d, 0x3f, 0x30, 0x32,
+ 0x24, 0x01, 0x00, 0x02,
+ 0xf2, 0xa0, 0xe0, 0xd1, 0xb0, 0xdd, 0xb8, 0xdc, 0xdf, 0xc0, 0xd0, 0xe1,
+ 0xe5, 0xf3, 0xe1, 0xf4,
+ 0xe6, 0xe3, 0xe4, 0xd3, 0xc3, 0xc4, 0xd4, 0xb1, 0xd2, 0x06, 0xd3, 0xc1,
+ 0xe3, 0xd4, 0xc2, 0xc1,
+ 0x06, 0x03, 0x90, 0xee, 0x01, 0x04, 0x00, 0xef, 0x00, 0x22, 0x11, 0x0f,
+ 0x00, 0x10, 0x22, 0x00,
+ 0x02, 0x03, 0x02, 0x10, 0x20, 0x20, 0x0e, 0x4b, 0x6b, 0x4d, 0x2c, 0x5e,
+ 0x2c, 0x3d, 0x3c, 0x3c,
+ 0x5d, 0x3c, 0x4e, 0x3e, 0x2c, 0x1d, 0x3d, 0x5f, 0x2e, 0x2a, 0x3e, 0x4f,
+ 0x2f, 0x1e, 0x2d, 0x2d,
+ 0x1c, 0x5f, 0x74, 0x0c, 0xd8, 0x70, 0x46, 0xed, 0xfd, 0x42, 0x24, 0xee,
+ 0xec, 0x42, 0x23, 0xef,
+ 0xfd, 0x00, 0x01, 0x00, 0xd0, 0xdf, 0xe0, 0xd0, 0xd0, 0xc0, 0xc0, 0xef,
+ 0xf1, 0xe0, 0xdf, 0xf2,
+ 0xe4, 0xd1, 0xd2, 0xe6, 0xc2, 0xc1, 0xd1, 0xe3, 0x07, 0xb1, 0xf3, 0xd2,
+ 0x90, 0x05, 0x14, 0xc0,
+ 0xdf, 0x03, 0x04, 0xd0, 0xe0, 0x02, 0x02, 0xf0, 0xef, 0x11, 0x43, 0xf0,
+ 0xee, 0x00, 0x23, 0x24,
+ 0xd0, 0x11, 0x13, 0xbf, 0x00, 0x21, 0x42, 0x30, 0x09, 0x2d, 0x70, 0x5f,
+ 0x2d, 0x1b, 0x3c, 0x2d,
+ 0x3c, 0x6e, 0x1e, 0x1a, 0x1d, 0x40, 0x30, 0x1d, 0x2e, 0x2d, 0x3d, 0x2d,
+ 0x2b, 0x3e, 0x40, 0x3f,
+ 0x2d, 0x3b, 0x6e, 0x5f, 0x2e, 0x2a, 0x4e, 0x40, 0x20, 0x0d, 0x3f, 0x41,
+ 0x10, 0x1e, 0x1f, 0x32,
+ 0x10, 0x0d, 0xf1, 0xf7, 0x90, 0xcb, 0xde, 0xf1, 0xd1, 0xcf, 0xde, 0xee,
+ 0xf3, 0xd3, 0xd2, 0xf5,
+ 0xc2, 0xc0, 0xe1, 0xe6, 0xd2, 0xb0, 0xf4, 0xe4, 0xe2, 0xf4, 0xe3, 0xb1,
+ 0xe4, 0xe3, 0xd4, 0xc2,
+ 0xd2, 0xe5, 0xc1, 0xc0, 0xf2, 0x03, 0xf1, 0xf0, 0x01, 0x01, 0x02, 0x11,
+ 0x00, 0x14, 0xf1, 0xf1,
+ 0x05, 0x22, 0x12, 0xb0, 0xd0, 0x34, 0x53, 0x0e, 0x1d, 0x4d, 0x7e, 0x30,
+ 0x08, 0x2c, 0x4e, 0x3d,
+ 0x3d, 0x3d, 0x3b, 0x2d, 0x1c, 0x5e, 0x50, 0x3e, 0x1c, 0x2d, 0x40, 0x1f,
+ 0x1c, 0x1e, 0x2f, 0xfa,
+ 0x0e, 0x7f, 0x3f, 0x1c, 0x3e, 0x6f, 0x2f, 0x1c, 0x2e, 0x40, 0x30, 0x3f,
+ 0x2d, 0x3e, 0x40, 0x20,
+ 0x22, 0x00, 0x10, 0xf6, 0xc0, 0x88, 0xcb, 0x25, 0x01, 0xad, 0xff, 0x01,
+ 0x01, 0xef, 0xef, 0x01,
+ 0x02, 0xe0, 0xdf, 0xf0, 0x04, 0x02, 0xe1, 0xe1, 0xf4, 0xf4, 0xd1, 0xa1,
+ 0xf3, 0xf5, 0xd1, 0xc1,
+ 0xe4, 0xd2, 0xd2, 0xd2, 0xd1, 0x03, 0xf1, 0xb0, 0xf0, 0x00, 0x03, 0x04,
+ 0xff, 0x11, 0x46, 0xf1,
+ 0xf1, 0xe0, 0x02, 0x55, 0xf0, 0xdf, 0x10, 0x31, 0x30, 0x40, 0x1d, 0x19,
+ 0x7f, 0x50, 0x0c, 0x2f,
+ 0x40, 0x1e, 0x1b, 0x2d, 0x4f, 0x3f, 0x0a, 0x4f, 0x50, 0x20, 0x1f, 0x1e,
+ 0x1e, 0x0d, 0x1e, 0x40,
+ 0x30, 0x4e, 0x2b, 0x2d, 0x4e, 0x2e, 0x3e, 0x5e, 0x3e, 0x4d, 0x4f, 0x3f,
+ 0x3f, 0x30, 0x32, 0x36,
+ 0x21, 0x10, 0x01, 0xf0, 0xd0, 0xc2, 0xbf, 0xc9, 0xe1, 0xe3, 0xbe, 0xed,
+ 0xe0, 0xd0, 0xde, 0xd1,
+ 0xd2, 0xbe, 0xf1, 0xe7, 0xe6, 0xc0, 0xf3, 0xf7, 0xd1, 0xd1, 0xe3, 0xe4,
+ 0xa2, 0xd2, 0xe5, 0xc3,
+ 0xd2, 0xd2, 0xd3, 0xe4, 0xc2, 0xd0, 0xf1, 0xe1, 0x01, 0x03, 0x05, 0x01,
+ 0xe1, 0x02, 0xd0, 0xb0,
+ 0x03, 0x03, 0xb0, 0xe0, 0xf3, 0x06, 0x01, 0x11, 0x30, 0x3d, 0x7e, 0x3e,
+ 0x3b, 0x5f, 0x2d, 0x08,
+ 0x4e, 0x4e, 0x3d, 0x6f, 0x1d, 0x2a, 0x3f, 0x3e, 0x2e, 0x3e, 0x2f, 0x0d,
+ 0x1d, 0x3f, 0x5f, 0x3c,
+ 0x2c, 0x3d, 0x2d, 0x1b, 0x6e, 0x3f, 0x3e, 0x6d, 0x3e, 0x3e, 0x4e, 0x3d,
+ 0x52, 0x36, 0x20, 0x1f,
+ 0x20, 0x22, 0x02, 0xfe, 0xeb, 0xef, 0xd0, 0xc0, 0xce, 0xd0, 0xc0, 0xce,
+ 0xe0, 0xd0, 0xc0, 0xe0,
+ 0xd1, 0xc7, 0xe4, 0xc1, 0xf1, 0xf6, 0x04, 0xe2, 0xd2, 0xd3, 0xb3, 0xe4,
+ 0xe7, 0xd3, 0xc3, 0xc2,
+ 0xd4, 0xd3, 0xb2, 0xe3, 0xf3, 0xc1, 0xf1, 0x04, 0x03, 0xe0, 0xcd, 0x00,
+ 0x27, 0x01, 0xf0, 0xd0,
+ 0xf0, 0x15, 0x01, 0xc0, 0xf0, 0x01, 0x01, 0x30, 0x30, 0x00, 0x6e, 0x4f,
+ 0x30, 0x1e, 0x0a, 0x3d,
+ 0x7d, 0x3c, 0x3c, 0x4c, 0x4e, 0x2d, 0x2c, 0x3e, 0x2d, 0x4e, 0x2e, 0x1c,
+ 0x3c, 0x4d, 0x0c, 0x2d,
+ 0x6f, 0x20, 0x1d, 0x1b, 0x2e, 0x60, 0x41, 0xf8, 0x0b, 0x72, 0x43, 0x0c,
+ 0x0d, 0x44, 0x11, 0xfe,
+ 0x0d, 0x33, 0x23, 0xee, 0xfd, 0x00, 0x01, 0xe0, 0xdf, 0xe0, 0xcf, 0xdf,
+ 0x02, 0xd3, 0x9e, 0xee,
+ 0xe0, 0xe0, 0xf4, 0xd1, 0xdf, 0xe2, 0xe2, 0xd4, 0xe7, 0xb0, 0xd0, 0x07,
+ 0xe5, 0x8f, 0xe0, 0x06,
+ 0xe1, 0xc0, 0xf0, 0x02, 0xe1, 0xc0, 0x00, 0x02, 0x01, 0xe0, 0xf0, 0x02,
+ 0x11, 0x00, 0xe2, 0xf2,
+ 0xd0, 0xe0, 0xd4, 0xc1, 0x00, 0x32, 0x02, 0x02, 0x00, 0x70, 0x11, 0x00,
+ 0x0c, 0x3b, 0x5f, 0x19,
+ 0x70, 0x41, 0x0a, 0x0d, 0x30, 0x2f, 0x2d, 0x0c, 0x4f, 0x20, 0x1d, 0x2d,
+ 0x50, 0x2f, 0x0a, 0x2e,
+ 0x30, 0x20, 0x0d, 0x2d, 0x5e, 0x0a, 0x60, 0x52, 0x1e, 0x1a, 0x30, 0x31,
+ 0x2f, 0x3f, 0x30, 0x30,
+ 0x20, 0x1d, 0x41, 0x35, 0xef, 0xff, 0x00, 0xdf, 0xe0, 0xc1, 0x9b, 0xdd,
+ 0xef, 0xe1, 0xe2, 0xae,
+ 0xef, 0xf4, 0xe1, 0xef, 0xf2, 0xe3, 0xd1, 0xf5, 0xd3, 0xd5, 0x07, 0xd2,
+ 0x90, 0xd1, 0xe4, 0x05,
+ 0xb1, 0xc0, 0x03, 0xf4, 0xd1, 0xc0, 0x02, 0x04, 0xf0, 0x01, 0x01, 0xe0,
+ 0xdf, 0x12, 0x03, 0xbf,
+ 0xef, 0x03, 0x02, 0x01, 0x03, 0x14, 0x34, 0xe0, 0xbd, 0x00, 0x34, 0x00,
+ 0x00, 0x2d, 0x7d, 0x29,
+ 0x4f, 0x60, 0x1e, 0x09, 0x2f, 0x40, 0x1f, 0x2d, 0x2d, 0x4e, 0x30, 0x1c,
+ 0x30, 0x30, 0x08, 0x1f,
+ 0x50, 0xfe, 0xfd, 0x20, 0xfb, 0xfc, 0x70, 0x40, 0x1f, 0x0c, 0x60, 0x32,
+ 0x1f, 0x1d, 0x2f, 0x20,
+ 0x2f, 0x1f, 0x20, 0x1f, 0x10, 0x21, 0x0e, 0xed, 0xff, 0xe0, 0xb0, 0xdf,
+ 0xbe, 0xd9, 0xd1, 0xe4,
+ 0x9c, 0xef, 0xf1, 0xee, 0xef, 0xf1, 0xd0, 0xdf, 0xd2, 0xe7, 0xd2, 0x90,
+ 0x05, 0xe4, 0xc1, 0xd0,
+ 0xe3, 0xe7, 0xc1, 0xd1, 0xd2, 0xe2, 0xd2, 0xd0, 0x01, 0x24, 0xe1, 0xd2,
+ 0xc1, 0xf1, 0x04, 0xc1,
+ 0xd0, 0x02, 0xf4, 0xf3, 0xe2, 0xe1, 0x02, 0x03, 0xe1, 0x01, 0x33, 0xbe,
+ 0x0c, 0x70, 0x7c, 0x1a,
+ 0x1d, 0x1c, 0x2e, 0x3f, 0x1a, 0x1d, 0x3c, 0x7f, 0x20, 0x2e, 0x3e, 0x3e,
+ 0x1c, 0x2e, 0x2e, 0x3e,
+ 0x1c, 0x1d, 0x2d, 0x0a, 0x0d, 0x7e, 0x4f, 0x3e, 0x5d, 0x2c, 0x4c, 0x4f,
+ 0x30, 0x40, 0x2f, 0x2f,
+ 0x30, 0x20, 0x2f, 0x30, 0x30, 0x0d, 0x0c, 0x0f, 0x00, 0xf0, 0xbd, 0xdf,
+ 0xc2, 0xc1, 0xc0, 0xdf,
+ 0xdd, 0xe7, 0xe7, 0xb0, 0xdd, 0xf0, 0x06, 0xc1, 0xe1, 0xe3, 0xe3, 0xd2,
+ 0xd6, 0xc4, 0xc4, 0xb3,
+ 0xd2, 0xc2, 0xf4, 0xe4, 0xb0, 0xf2, 0x05, 0x02, 0xd0, 0xe0, 0x02, 0xe1,
+ 0xd2, 0x02, 0xd1, 0xd0,
+ 0x03, 0x35, 0x02, 0xc1, 0x03, 0xf2, 0xa0, 0xd0, 0x03, 0x15, 0xef, 0xff,
+ 0x32, 0x77, 0x74, 0x0f,
+ 0xfc, 0x0f, 0x41, 0x10, 0x0c, 0x1f, 0x3f, 0x3f, 0x2e, 0x3e, 0x4e, 0x2d,
+ 0x2d, 0x4e, 0x2d, 0x2d,
+ 0x2c, 0x0b, 0x0d, 0x0b, 0x2f, 0x70, 0x3f, 0x2c, 0x3d, 0x6e, 0x2d, 0x3d,
+ 0x50, 0x30, 0x2d, 0x3f,
+ 0x32, 0x41, 0x2d, 0x2d, 0x2e, 0x32, 0x20, 0x08, 0x0e, 0xf0, 0xf3, 0xd0,
+ 0xbe, 0xbb, 0xef, 0xd0,
+ 0xdf, 0xd0, 0xbe, 0x07, 0xf4, 0xbe, 0xa8, 0x11, 0x47, 0xce, 0xfe, 0x13,
+ 0x02, 0xdf, 0xde, 0x03,
+ 0x05, 0xd0, 0xdf, 0x01, 0xf2, 0xf2, 0xd1, 0xd0, 0xe1, 0xf2, 0xf2, 0xd1,
+ 0xb0, 0xdf, 0xf0, 0x14,
+ 0x24, 0xaf, 0xcc, 0x25, 0x14, 0xbe, 0xff, 0x23, 0x02, 0xce, 0xee, 0x35,
+ 0x32, 0xce, 0x0e, 0x10,
+ 0x22, 0x0f, 0xfb, 0x2f, 0x70, 0x0f, 0x1d, 0x1d, 0x3e, 0x2f, 0x2d, 0x3e,
+ 0x50, 0x08, 0x0d, 0x53,
+ 0x00, 0xfb, 0x0f, 0x20, 0x2f, 0xfb, 0x3f, 0x50, 0x2e, 0x3e, 0x2e, 0x5e,
+ 0x3e, 0x2d, 0x1d, 0x61,
+ 0x22, 0x2e, 0x2c, 0x2e, 0x2f, 0x42, 0x12, 0xf8, 0x0e, 0x21, 0x01, 0xdd,
+ 0xcd, 0x03, 0xf0, 0x8a,
+ 0xef, 0x01, 0xf1, 0xcd, 0xeb, 0x00, 0x02, 0xdf, 0xdc, 0xe0, 0xf2, 0xd1,
+ 0xa1, 0xf4, 0xe5, 0xc1,
+ 0xd1, 0xd2, 0x07, 0xf3, 0x90, 0xe0, 0x03, 0x02, 0xd0, 0xf0, 0x06, 0xf1,
+ 0xcf, 0xf0, 0x02, 0x13,
+ 0xf0, 0xd0, 0xd1, 0xf3, 0x03, 0xe2, 0xc2, 0xf4, 0x02, 0x03, 0x07, 0x01,
+ 0xc0, 0xde, 0x72, 0x00,
+ 0xfd, 0x10, 0x3f, 0xb8, 0xea, 0x72, 0x51, 0xfd, 0x0d, 0x21, 0x32, 0xfc,
+ 0x0e, 0x41, 0x00, 0x0d,
+ 0x0d, 0x0f, 0x0f, 0x0d, 0xe9, 0x1f, 0x50, 0x1e, 0x1d, 0x3f, 0x6f, 0x0c,
+ 0x1d, 0x51, 0x32, 0x1c,
+ 0x1b, 0x40, 0x31, 0x1e, 0x1e, 0x40, 0x10, 0x0e, 0x1d, 0x10, 0x11, 0xff,
+ 0xed, 0xcc, 0xf0, 0xbf,
+ 0xdc, 0xde, 0xef, 0xe1, 0xcc, 0xfc, 0x25, 0x00, 0xae, 0xf0, 0xf5, 0xf2,
+ 0xe2, 0xd4, 0xd4, 0xc2,
+ 0xd3, 0xd5, 0xd3, 0xd3, 0xc3, 0xb3, 0xe3, 0xe4, 0xd2, 0xd2, 0xe2, 0xf3,
+ 0x04, 0xe2, 0xc2, 0x06,
+ 0x24, 0xc1, 0xb0, 0x01, 0x03, 0xe2, 0xb0, 0x04, 0x15, 0xe0, 0x00, 0x34,
+ 0x12, 0xdf, 0x0f, 0x30,
+ 0x41, 0x00, 0x20, 0x4f, 0x2d, 0x7e, 0x3f, 0x74, 0x20, 0x08, 0x30, 0x73,
+ 0x0e, 0xfa, 0x10, 0x21,
+ 0x10, 0xff, 0x0d, 0x20, 0x20, 0x0c, 0x1e, 0x30, 0x3f, 0x4c, 0x2d, 0x5f,
+ 0x3f, 0x5e, 0x2e, 0x41,
+ 0x32, 0x30, 0x45, 0x22, 0x1d, 0x3e, 0x30, 0x32, 0x0b, 0x1c, 0x30, 0x22,
+ 0x00, 0xa0, 0xef, 0xdf,
+ 0xef, 0xee, 0xcb, 0xff, 0xee, 0xcb, 0xff, 0xfe, 0xe0, 0xc0, 0xc0, 0xd0,
+ 0xbf, 0xe7, 0xf5, 0xc0,
+ 0xd0, 0xc3, 0xe5, 0xf4, 0xd2, 0xb1, 0xe1, 0xe3, 0xf3, 0xe3, 0xe2, 0xe2,
+ 0xf3, 0xf4, 0xe2, 0xe2,
+ 0xd4, 0xb1, 0xdf, 0xbf, 0x04, 0xf7, 0xd0, 0xe0, 0xe1, 0x04, 0x14, 0x01,
+ 0xe0, 0xc0, 0x11, 0x32,
+ 0xe0, 0x20, 0x61, 0x0e, 0x1b, 0x6f, 0x40, 0x2e, 0x2c, 0x4d, 0x2e, 0x2b,
+ 0x0d, 0x20, 0x3f, 0xf9,
+ 0xfd, 0x0e, 0x2f, 0xfd, 0xba, 0x1f, 0x60, 0x0e, 0xfb, 0x1e, 0x40, 0x4f,
+ 0x2d, 0x2d, 0x5e, 0x3f,
+ 0x3f, 0x4e, 0x50, 0x20, 0x30, 0x3f, 0x2b, 0x1c, 0x30, 0x30, 0x0f, 0x0f,
+ 0xf0, 0xdf, 0xbe, 0xde,
+ 0xcb, 0xde, 0xff, 0xef, 0xee, 0xef, 0xba, 0xde, 0xf1, 0xf2, 0xc0, 0xce,
+ 0xe2, 0xd2, 0xb1, 0xd2,
+ 0xe7, 0xd6, 0xb2, 0xd1, 0xd2, 0xe4, 0xf3, 0xe4, 0xc2, 0xe3, 0xd1, 0x06,
+ 0x23, 0xe1, 0x88, 0xc0,
+ 0x77, 0xef, 0xce, 0x22, 0x22, 0xef, 0xde, 0x11, 0x33, 0xe0, 0xef, 0x00,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x01, 0x01, 0x00, 0xff, 0x1f, 0x1e, 0x3e, 0x6f, 0x30, 0x3e, 0x09, 0x1f,
+ 0x40, 0x1f, 0xfb, 0x2f,
+ 0x30, 0x0e, 0x4f, 0x98, 0x30, 0x63, 0xdd, 0xfb, 0x20, 0x31, 0x0f, 0x0e,
+ 0x50, 0x21, 0x0e, 0x1d,
+ 0x40, 0x43, 0x1f, 0x0a, 0x40, 0x41, 0x20, 0x10, 0x1e, 0x10, 0x21, 0x10,
+ 0x00, 0x01, 0x03, 0xcc,
+ 0x01, 0x37, 0xe0, 0xe0, 0xce, 0xdf, 0x01, 0xce, 0x01, 0x04, 0xbe, 0xcd,
+ 0xf2, 0x17, 0x03, 0x90,
+ 0xf1, 0x06, 0xf2, 0xd0, 0xd1, 0x03, 0xf4, 0xd1, 0xe1, 0x04, 0x03, 0xe1,
+ 0xc0, 0xf1, 0x02, 0xf2,
+ 0xc1, 0xe2, 0xf2, 0xaf, 0xd0, 0x17, 0x17, 0xe1, 0xcf, 0xe0, 0x42, 0x03,
+ 0xd1, 0x00, 0x00, 0xd0,
+ 0xb2, 0xf4, 0xff, 0xdc, 0x20, 0x32, 0x3f, 0x7c, 0xed, 0xcd, 0x0f, 0x70,
+ 0x5e, 0x0f, 0x03, 0x00,
+ 0x09, 0xfc, 0x0f, 0x22, 0x22, 0xfe, 0xe9, 0x1e, 0x7f, 0x2e, 0x0e, 0x0f,
+ 0x0c, 0x20, 0x30, 0x2b,
+ 0x2c, 0x5e, 0x3f, 0x40, 0x32, 0x61, 0x4f, 0x2d, 0x0f, 0x0e, 0x0d, 0x0d,
+ 0x0e, 0x00, 0xee, 0xfe,
+ 0xfe, 0x3b, 0x1e, 0xfe, 0xdd, 0xed, 0xdc, 0x89, 0xdb, 0xef, 0xd2, 0xb5,
+ 0x03, 0x22, 0x30, 0xfe,
+ 0xac, 0xdd, 0xf0, 0xe2, 0xe1, 0xec, 0xc9, 0xcf, 0xc1, 0xf5, 0x02, 0x30,
+ 0x30, 0x13, 0xe5, 0xb1,
+ 0xd0, 0xd1, 0xf2, 0xd2, 0xa0, 0xc0, 0xe4, 0xf4, 0x00, 0x0f, 0x0f, 0x2e,
+ 0x32, 0x07, 0xd1, 0xd0,
+ 0x00, 0x70, 0x10, 0x00, 0x30, 0x40, 0x51, 0x1f, 0x0c, 0x0d, 0x6e, 0x3f,
+ 0x30, 0x00, 0xfd, 0x0d,
+ 0x0d, 0xec, 0xde, 0x0d, 0x5f, 0x25, 0x01, 0x0d, 0x09, 0x1d, 0x0f, 0xfe,
+ 0x0d, 0x2e, 0x3f, 0x08,
+ 0xdd, 0x3e, 0x30, 0x40, 0x33, 0x0f, 0x38, 0x7e, 0x7f, 0x01, 0x0f, 0xdb,
+ 0xde, 0xe1, 0xe3, 0xd0,
+ 0x9d, 0xff, 0x25, 0x04, 0x00, 0x7e, 0x30, 0x11, 0xd0, 0xd0, 0x05, 0x05,
+ 0x5d, 0x01, 0x0f, 0x03,
+ 0x10, 0x01, 0x70, 0xeb, 0xf3, 0x06, 0x1e, 0xdd, 0x41, 0x1c, 0xbb, 0xb0,
+ 0x02, 0x03, 0x40, 0x0b,
+ 0xf0, 0xd3, 0x00, 0x1d, 0x00, 0xd2, 0x31, 0x70, 0x1c, 0xc0, 0xe0, 0x04,
+ 0x3d, 0x3b, 0x00, 0xc4,
+ 0xf4, 0x30, 0x0e, 0xad, 0x0e, 0x22, 0x55, 0x02, 0xcf, 0xfe, 0x0f, 0xf1,
+ 0x02, 0xf0, 0xf0, 0x00,
+ 0x31, 0x03, 0xd6, 0xd0, 0x5d, 0x5d, 0x00, 0xf5, 0xf3, 0x11, 0x2e, 0xfb,
+ 0xd0, 0x00, 0x40, 0x11,
+ 0xe0, 0x80, 0xf1, 0x1f, 0x3c, 0x0e, 0x00, 0x05, 0x63, 0x2e, 0x0a, 0xf0,
+ 0xe0, 0x00, 0x4e, 0x02,
+ 0xf7, 0x01, 0x2d, 0x0b, 0xb0, 0xf0, 0x01, 0x21, 0x51, 0x10, 0xfc, 0x0e,
+ 0x2f, 0xf0, 0xe3, 0x02,
+ 0x0f, 0x0a, 0x00, 0xd0, 0xd0, 0x00, 0x7f, 0x20, 0xf0, 0xa0, 0x00, 0x0d,
+ 0x0f, 0x1e, 0x35, 0xc6,
+ 0xf1, 0x0e, 0x1e, 0x00, 0x90, 0x04, 0x00, 0x30, 0xff, 0xc1, 0xd7, 0xf0,
+ 0xef, 0x0d, 0x50, 0x35,
+ 0xf4, 0xd1, 0x00, 0x0a, 0xf0, 0x0f, 0x00, 0xf1, 0xc2, 0x01, 0x0f, 0x7e,
+ 0x7f, 0x00, 0xef, 0xf7,
+ 0xf4, 0x0c, 0x40, 0x12, 0xe0, 0xdf, 0xf0, 0x11, 0x03, 0xa0, 0xff, 0xfe,
+ 0x0f, 0x2f, 0x52, 0x02,
+ 0x22, 0x12, 0x00, 0xf8, 0xe0, 0x02, 0x01, 0x00, 0x22, 0x40, 0x1b, 0xce,
+ 0x9f, 0x03, 0x00, 0x1f,
+ 0x2d, 0x10, 0x00, 0xd8, 0x1f, 0x40, 0x31, 0x15, 0xf0, 0xef, 0x0c, 0x2f,
+ 0x01, 0xf2, 0x22, 0x4c,
+ 0x0c, 0x00, 0xa0, 0x03, 0x01, 0x1c, 0x1d, 0x3f, 0x0f, 0xb0, 0xb4, 0xf0,
+ 0xff, 0x0b, 0x2f, 0x30,
+ 0x00, 0xc1, 0xc5, 0xde, 0x0e, 0x50, 0x10, 0x04, 0x94, 0x01, 0x20, 0x2d,
+ 0x0e, 0xb0, 0x00, 0x05,
+ 0xf3, 0xf1, 0x0e, 0x0c, 0x20, 0x01, 0xd1, 0xc7, 0x03, 0x00, 0xec, 0x00,
+ 0x31, 0x12, 0xd0, 0xf1,
+ 0xf1, 0xd0, 0x0f, 0xa0, 0xf0, 0x11, 0x23, 0x7f, 0x2f, 0x0e, 0x15, 0x0f,
+ 0x10, 0x07, 0x23, 0x21,
+ 0x31, 0xe1, 0x8e, 0xee, 0xf0, 0x07, 0x11, 0x30, 0x2e, 0xe9, 0xe0, 0x73,
+ 0x31, 0x1e, 0x1f, 0x1f,
+ 0xef, 0xf1, 0x12, 0x00, 0x0f, 0x7f, 0x1d, 0xfd, 0xdb, 0x11, 0x01, 0x1f,
+ 0x2e, 0x5b, 0x2f, 0xeb,
+ 0xf1, 0x01, 0x20, 0x10, 0x2f, 0x1c, 0x50, 0x51, 0x10, 0xd9, 0xde, 0x21,
+ 0x50, 0x00, 0xbe, 0xe2,
+ 0x07, 0x50, 0x0d, 0xed, 0x00, 0xe1, 0x02, 0xe2, 0xe0, 0xdc, 0x2f, 0x6e,
+ 0x30, 0x14, 0x04, 0xbd,
+ 0xec, 0x00, 0x15, 0x10, 0xde, 0x00, 0x65, 0x00, 0xf2, 0xf1, 0xcf, 0xdf,
+ 0xef, 0xf0, 0x25, 0x24,
+ 0xe0, 0xec, 0xde, 0x11, 0x77, 0x31, 0xe0, 0xf0, 0xff, 0xe0, 0xc0, 0x0f,
+ 0x52, 0x46, 0xf0, 0xce,
+ 0x00, 0x00, 0x00, 0x31, 0x52, 0x0c, 0x20, 0x11, 0x00, 0xf4, 0xe0, 0xdf,
+ 0x0e, 0xfe, 0x0f, 0x77,
+ 0x21, 0xac, 0x00, 0x13, 0x20, 0xfb, 0xff, 0x11, 0x44, 0x00, 0x0f, 0xce,
+ 0x00, 0x13, 0x10, 0x0e,
+ 0xcc, 0xfe, 0x20, 0x5f, 0x20, 0xbd, 0xff, 0x05, 0x0e, 0x0d, 0x10, 0x1e,
+ 0x00, 0x00, 0xd3, 0x01,
+ 0xba, 0x00, 0x20, 0xeb, 0x20, 0x73, 0x0c, 0xdf, 0x16, 0x00, 0xdc, 0xf0,
+ 0xef, 0x21, 0x76, 0x3e,
+ 0xdf, 0xf0, 0xc1, 0xe0, 0x00, 0x01, 0xdf, 0x11, 0x32, 0xc0, 0x01, 0x30,
+ 0x0f, 0x40, 0x00, 0xdd,
+ 0x37, 0x67, 0xf0, 0xde, 0x30, 0x50, 0xe2, 0xd0, 0xe0, 0xd0, 0x00, 0x61,
+ 0x02, 0xfc, 0xcc, 0x24,
+ 0x77, 0xef, 0xdc, 0x01, 0x31, 0xe0, 0x00, 0x12, 0x10, 0x0e, 0xcf, 0xde,
+ 0x33, 0x43, 0x0e, 0x0b,
+ 0x73, 0x41, 0xdc, 0xee, 0x04, 0x24, 0x0f, 0x0d, 0x31, 0xf0, 0xbf, 0x10,
+ 0x23, 0x0c, 0xca, 0x10,
+ 0x67, 0x00, 0xde, 0x0f, 0x51, 0x02, 0xff, 0xf0, 0x00, 0x00, 0x03, 0x10,
+ 0x0d, 0x43, 0xf0, 0xcd,
+ 0x02, 0x22, 0x0d, 0x00, 0x01, 0xf0, 0x26, 0x40, 0xfb, 0xef, 0x43, 0x21,
+ 0xd0, 0x0d, 0xf1, 0x57,
+ 0x01, 0xac, 0x00, 0x30, 0x02, 0xf0, 0x13, 0x0e, 0xa8, 0x11, 0x22, 0x0f,
+ 0x10, 0x10, 0x02, 0xf2,
+ 0xcd, 0xee, 0x23, 0x45, 0xbc, 0xee, 0x52, 0x12, 0x00, 0xf0, 0x0d, 0x0f,
+ 0x12, 0x12, 0x10, 0x10,
+ 0x0c, 0xce, 0x15, 0xe0, 0x8c, 0x00, 0x34, 0x0f, 0x08, 0xe0, 0x32, 0x01,
+ 0xcf, 0xfd, 0x12, 0x65,
+ 0xff, 0xec, 0x01, 0x02, 0x11, 0x0f, 0xfe, 0xee, 0xf0, 0xf0, 0xee, 0x70,
+ 0x23, 0x0e, 0xeb, 0xf0,
+ 0x02, 0x03, 0xbe, 0x00, 0x20, 0x1f, 0xda, 0x01, 0xd1, 0xd1, 0x11, 0xfb,
+ 0x00, 0x76, 0xdf, 0xad,
+ 0x10, 0x32, 0x00, 0x42, 0x03, 0xca, 0xe0, 0x01, 0x23, 0xfe, 0xdc, 0x00,
+ 0x24, 0xd0, 0xac, 0x00,
+ 0x02, 0xf0, 0xeb, 0x00, 0x40, 0xe0, 0x32, 0x52, 0xcb, 0xff, 0x11, 0x02,
+ 0xc0, 0x00, 0x2d, 0x3d,
+ 0x56, 0xe1, 0xce, 0x00, 0x00, 0x51, 0x0d, 0x0b, 0x01, 0xf1, 0xe0, 0x01,
+ 0xde, 0xec, 0x30, 0x74,
+ 0x0e, 0xc8, 0x00, 0x21, 0x63, 0x00, 0xc9, 0x00, 0x11, 0x11, 0x00, 0x10,
+ 0xff, 0xfd, 0x00, 0x13,
+ 0x00, 0xe0, 0x0e, 0x0f, 0x30, 0x0f, 0xef, 0xf0, 0x02, 0x11, 0xde, 0xaf,
+ 0x17, 0x31, 0xac, 0x00,
+ 0x34, 0xdd, 0xfe, 0x23, 0x02, 0xad, 0x0e, 0x01, 0x53, 0x24, 0xfe, 0xe0,
+ 0x26, 0x00, 0xee, 0x00,
+ 0x27, 0x20, 0xbe, 0xef, 0x13, 0x35, 0xce, 0xff, 0xf0, 0xde, 0xd1, 0x44,
+ 0x21, 0x0e, 0x1f, 0x00,
+ 0x02, 0x33, 0x01, 0x01, 0xe0, 0x8d, 0x23, 0x67, 0xf0, 0xdc, 0xf0, 0x03,
+ 0x01, 0x10, 0x41, 0x10,
+ 0xfc, 0xdb, 0x00, 0x45, 0x01, 0xdf, 0x0d, 0x51, 0x02, 0x00, 0x10, 0x10,
+ 0x20, 0x1d, 0x41, 0x03,
+ 0xdc, 0x10, 0x77, 0x12, 0x10, 0x2e, 0xcc, 0x02, 0x26, 0x0f, 0xcd, 0x30,
+ 0x70, 0x01, 0x23, 0xec,
+ 0xfd, 0x35, 0x51, 0xf0, 0xed, 0x00, 0x35, 0x00, 0xcd, 0x41, 0x31, 0x12,
+ 0xe2, 0xd0, 0xd0, 0x00,
+ 0x5e, 0x0d, 0x67, 0x06, 0xef, 0xff, 0x10, 0x22, 0x10, 0x00, 0xe0, 0x00,
+ 0x77, 0xff, 0xdd, 0x10,
+ 0x45, 0xf0, 0xcf, 0x00, 0x10, 0x41, 0x01, 0xef, 0xff, 0x01, 0x11, 0x00,
+ 0x0f, 0x21, 0x22, 0x23,
+ 0xbd, 0xdf, 0x17, 0x33, 0xdd, 0xdd, 0x03, 0x34, 0x31, 0x30, 0x00, 0x00,
+ 0xef, 0xd0, 0x80, 0xef,
+ 0x23, 0x46, 0xfd, 0xdc, 0x0f, 0x20, 0xd0, 0xbc, 0x10, 0x30, 0x31, 0x00,
+ 0x88, 0x0d, 0x32, 0x22,
+ 0xf1, 0xf1, 0xfe, 0x0a, 0x1e, 0x10, 0x73, 0x10, 0xec, 0xfd, 0x01, 0x22,
+ 0xdd, 0xdd, 0x0f, 0x21,
+ 0x11, 0xba, 0x0e, 0x41, 0x00, 0xba, 0x01, 0x33, 0x0e, 0xbc, 0x01, 0x42,
+ 0x0e, 0xdb, 0x12, 0x11,
+ 0xff, 0x0d, 0x32, 0x41, 0xee, 0xcb, 0x00, 0x32, 0x21, 0xc0, 0xd1, 0xc0,
+ 0xb8, 0x10, 0x64, 0xf0,
+ 0xba, 0x01, 0x13, 0x00, 0xfe, 0xff, 0x21, 0x11, 0xe0, 0xde, 0x24, 0xf0,
+ 0xce, 0x00, 0x54, 0x02,
+ 0xed, 0xed, 0x11, 0x13, 0x20, 0x11, 0xde, 0x9a, 0x01, 0x04, 0x00, 0x1d,
+ 0x1e, 0x01, 0xe3, 0xe0,
+ 0xfc, 0x0f, 0x0f, 0x00, 0x15, 0x01, 0x8b, 0x10, 0x62, 0x02, 0xe0, 0x00,
+ 0x0f, 0x0c, 0xff, 0x2f,
+ 0x75, 0x01, 0xed, 0xec, 0x00, 0x11, 0x0e, 0x10, 0x23, 0xa8, 0xec, 0x41,
+ 0x36, 0xf0, 0xcd, 0x10,
+ 0x11, 0x00, 0x00, 0x0e, 0x01, 0x20, 0xed, 0xe0, 0x02, 0x36, 0x1f, 0xcd,
+ 0x20, 0x72, 0x23, 0xdc,
+ 0xcd, 0x01, 0x67, 0x0f, 0xce, 0x00, 0x10, 0x02, 0xfe, 0x00, 0xff, 0x13,
+ 0x01, 0xca, 0x00, 0x51,
+ 0x00, 0x1f, 0x00, 0x15, 0xf0, 0xcc, 0x00, 0x14, 0x20, 0x00, 0x43, 0xef,
+ 0xce, 0x46, 0xf0, 0x0f,
+ 0x01, 0xf0, 0xe0, 0xff, 0x00, 0x63, 0x00, 0x0d, 0x04, 0x21, 0xf0, 0x1e,
+ 0x50, 0x00, 0xfa, 0x01,
+ 0x24, 0x23, 0xfe, 0xcc, 0x00, 0x33, 0x77, 0xff, 0xdd, 0x40, 0x63, 0x00,
+ 0xfe, 0xdd, 0x13, 0x37,
+ 0x00, 0x0e, 0x40, 0x0f, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x40, 0x00, 0xf0,
+ 0x00, 0xe0, 0x12, 0x36,
+ 0xd0, 0x8d, 0xfe, 0xed, 0x00, 0x73, 0x27, 0x12, 0xca, 0xef, 0x32, 0x21,
+ 0x10, 0x20, 0x00, 0xdf,
+ 0xf1, 0x13, 0x1d, 0xef, 0xf1, 0xf3, 0x9d, 0xfc, 0x01, 0x75, 0x0f, 0xf9,
+ 0xd0, 0x10, 0x12, 0x11,
+ 0x11, 0x00, 0x0e, 0xde, 0x77, 0x11, 0xdd, 0x00, 0x13, 0x00, 0x00, 0x02,
+ 0xec, 0xbc, 0x33, 0x43,
+ 0x00, 0xf0, 0xcb, 0x00, 0x00, 0x40, 0x02, 0x32, 0xe1, 0xbd, 0x0f, 0x25,
+ 0x21, 0xbd, 0xf0, 0x05,
+ 0x11, 0x0e, 0x0f, 0x30, 0x0d, 0x47, 0x12, 0xaf, 0x0f, 0x0e, 0x1f, 0x63,
+ 0x15, 0xfe, 0xdd, 0xf0,
+ 0x13, 0x77, 0x0f, 0xec, 0x03, 0x20, 0xef, 0xff, 0x14, 0x11, 0xef, 0x00,
+ 0x01, 0xcf, 0x32, 0x63,
+ 0x0d, 0x01, 0x07, 0x00, 0x0f, 0x10, 0x41, 0x00, 0x11, 0x15, 0xf0, 0x8c,
+ 0xf0, 0x00, 0x24, 0x00,
+ 0xda, 0x01, 0x01, 0x00, 0x20, 0x1f, 0x0e, 0xe0, 0xe0, 0x46, 0x2f, 0x0b,
+ 0x52, 0x42, 0xd0, 0x0e,
+ 0x12, 0x0e, 0xee, 0x11, 0x42, 0xcf, 0xfe, 0x03, 0x1f, 0x0c, 0x20, 0x14,
+ 0xc0, 0x88, 0xde, 0x73,
+ 0x33, 0x0f, 0xec, 0xef, 0xf0, 0x10, 0x13, 0x0f, 0x1d, 0x10, 0x10, 0xcc,
+ 0xfe, 0x23, 0x23, 0x14,
+ 0xdb, 0xbe, 0x11, 0x44, 0x00, 0x0e, 0x05, 0xd0, 0xaa, 0x00, 0x11, 0x20,
+ 0x00, 0x00, 0x02, 0xf0,
+ 0xdc, 0x0f, 0x73, 0x02, 0xde, 0xbd, 0x03, 0x20, 0x00, 0x10, 0x00, 0xbf,
+ 0xfd, 0x01, 0x44, 0x0e,
+ 0x0d, 0x00, 0xf0, 0xf0, 0xdd, 0xd3, 0x07, 0x17, 0x20, 0xfe, 0x8c, 0xff,
+ 0x14, 0x20, 0xff, 0x00,
+ 0x00, 0xac, 0x00, 0x00, 0x20, 0x02, 0x12, 0x00, 0xc8, 0xfe, 0x02, 0x30,
+ 0xef, 0xdd, 0x23, 0x00,
+ 0xfd, 0xba, 0xde, 0x20, 0x65, 0xf0, 0xef, 0xdb, 0x0f, 0x60, 0x10, 0x21,
+ 0xe0, 0xde, 0xed, 0xe0,
+ 0x21, 0x1f, 0xd8, 0x0f, 0x41, 0x01, 0xa0, 0x0e, 0x0f, 0x1e, 0x70, 0x00,
+ 0xdf, 0x0f, 0x00, 0xfc,
+ 0x20, 0x32, 0xed, 0xa9, 0x10, 0x11, 0x0d, 0x20, 0x00, 0xc0, 0x01, 0xfe,
+ 0xfc, 0x25, 0x14, 0xd0,
+ 0x8c, 0xf0, 0x0e, 0xe1, 0x07, 0x00, 0xdd, 0x00, 0x21, 0x42, 0x00, 0xf0,
+ 0xdf, 0xf1, 0xe3, 0xd0,
+ 0xd0, 0xef, 0xbd, 0x16, 0x54, 0xdd, 0xde, 0x01, 0x00, 0x02, 0x01, 0x8b,
+ 0xff, 0x01, 0x03, 0x53,
+ 0x00, 0xdd, 0x02, 0x07, 0x10, 0x30, 0x0c, 0x21, 0x33, 0xe1, 0xe3, 0xff,
+ 0xef, 0x12, 0x02, 0x9b,
+ 0x0e, 0x31, 0x0e, 0xca, 0x51, 0x24, 0xfe, 0xce, 0x0d, 0x21, 0x32, 0x0e,
+ 0xfd, 0xff, 0x0f, 0xfb,
+ 0x53, 0x33, 0xda, 0xee, 0x72, 0x32, 0xee, 0xee, 0x02, 0x30, 0x2f, 0xcb,
+ 0xbe, 0x12, 0x57, 0x1f,
+ 0x0d, 0xef, 0x00, 0xf1, 0x00, 0x24, 0x1f, 0x2e, 0x31, 0xd3, 0x8d, 0x01,
+ 0x05, 0x0e, 0x0f, 0x30,
+ 0x35, 0xdf, 0xdd, 0x43, 0x21, 0x30, 0x35, 0x00, 0xf0, 0xd1, 0xe3, 0x06,
+ 0x31, 0x00, 0x40, 0xe1,
+ 0xa2, 0x04, 0xe1, 0xbd, 0x12, 0x77, 0x00, 0xc0, 0x10, 0x23, 0x13, 0x0f,
+ 0xf3, 0x25, 0x10, 0x20,
+ 0x63, 0x12, 0x02, 0x03, 0xf0, 0xe0, 0x14, 0x33, 0x11, 0x43, 0x05, 0xf0,
+ 0x01, 0x55, 0x1f, 0x1f,
+ 0x54, 0x03, 0x0f, 0x0e, 0x23, 0x54, 0x03, 0x00, 0x22, 0x11, 0x00, 0x0f,
+ 0x23, 0x77, 0x00, 0x01,
+ 0x13, 0x0f, 0x0e, 0x12, 0x15, 0x12, 0x22, 0x0c, 0xda, 0x20, 0x73, 0x31,
+ 0xe0, 0x01, 0x51, 0x0c,
+ 0x3e, 0x23, 0x05, 0xe0, 0xef, 0x02, 0x24, 0x0e, 0xad, 0x03, 0x00, 0xdd,
+ 0x54, 0x53, 0x0d, 0xff,
+ 0x02, 0xf1, 0xf5, 0x01, 0xfe, 0x67, 0x13, 0xdd, 0x03, 0x03, 0xc9, 0xde,
+ 0x10, 0x52, 0xf1, 0xee,
+ 0x00, 0x00, 0x00, 0x03, 0xf0, 0x0f, 0x02, 0x04, 0xe1, 0xfe, 0x43, 0x66,
+ 0xcc, 0xdf, 0x27, 0x01,
+ 0xe0, 0x0e, 0x1e, 0x31, 0x04, 0xe0, 0x8e, 0xfd, 0x23, 0x74, 0x0f, 0xe8,
+ 0xf0, 0x10, 0x10, 0xee,
+ 0x22, 0x10, 0xcd, 0x01, 0x00, 0xdb, 0x62, 0x21, 0xed, 0xce, 0x0f, 0x21,
+ 0x23, 0x31, 0x0c, 0xbb,
+ 0x00, 0x13, 0x00, 0x01, 0x2b, 0x0e, 0x20, 0xe0, 0xff, 0x00, 0x04, 0x0f,
+ 0x3d, 0x10, 0xc0, 0x8f,
+ 0x99, 0x00, 0x00, 0x01, 0x00, 0x10, 0xfc, 0xde, 0x00, 0x1d, 0x0f, 0x02,
+ 0x15, 0x1f, 0x0b, 0xcf,
+ 0x02, 0xe4, 0x8c, 0xee, 0x01, 0x20, 0xfd, 0xcc, 0xee, 0xe0, 0x00, 0x00,
+ 0xcc, 0x00, 0x02, 0xef,
+ 0xfe, 0x00, 0xeb, 0xaa, 0x10, 0x12, 0xe0, 0xcb, 0xe0, 0xff, 0x01, 0x10,
+ 0xab, 0x00, 0x32, 0xf0,
+ 0x9b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xee, 0xde, 0xdd, 0xe0, 0x01,
+ 0x10, 0x0c, 0xda, 0x8d,
+ 0x00, 0x01, 0x13, 0x22, 0xea, 0xbd, 0x1f, 0x20, 0xf0, 0xef, 0x00, 0xfd,
+ 0xfe, 0x00, 0xca, 0xe0,
+ 0x0f, 0x20, 0x50, 0xf0, 0xcb, 0xff, 0x00, 0x11, 0x04, 0xa0, 0xd0, 0xcd,
+ 0x1f, 0x21, 0x20, 0xf2,
+ 0xbf, 0xed, 0x11, 0x44, 0x46, 0x00, 0xed, 0xcd, 0x01, 0x04, 0x03, 0x37,
+ 0xe0, 0x8a, 0xe0, 0x12,
+ 0x0f, 0xfe, 0xdd, 0x14, 0x13, 0xee, 0xcc, 0x00, 0x1f, 0x31, 0x23, 0xf0,
+ 0xac, 0x01, 0x23, 0x0e,
+ 0xfc, 0xf0, 0xf2, 0xf0, 0xef, 0xdb, 0xff, 0x63, 0x06, 0xce, 0x10, 0x71,
+ 0x0e, 0xeb, 0x11, 0x13,
+ 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x0e, 0x01, 0x47, 0x1f, 0x1b, 0x70,
+ 0x01, 0xf2, 0x00, 0xee,
+ 0x30, 0x30, 0xde, 0xe0, 0x33, 0x01, 0xcd, 0xaa, 0x00, 0x43, 0x10, 0x0c,
+ 0xf0, 0x63, 0x00, 0xfb,
+ 0x12, 0x24, 0xfd, 0xdd, 0x34, 0x11, 0xe1, 0xd0, 0xcf, 0xee, 0x22, 0x56,
+ 0xce, 0x0c, 0x51, 0x23,
+ 0xe0, 0xcf, 0x24, 0x21, 0x31, 0x03, 0xe0, 0xbf, 0x02, 0x35, 0xfe, 0xce,
+ 0x34, 0x37, 0xdf, 0xaf,
+ 0x00, 0x12, 0x10, 0x40, 0x01, 0xf0, 0x02, 0xe1, 0x0e, 0x00, 0x12, 0x00,
+ 0x0c, 0x56, 0x01, 0xef,
+ 0xf0, 0x13, 0x1f, 0x60, 0x11, 0x0f, 0x37, 0x42, 0xee, 0x0f, 0x32, 0xff,
+ 0x0d, 0x00, 0x52, 0x02,
+ 0xfd, 0x0e, 0x00, 0x62, 0x57, 0x0f, 0x1f, 0x00, 0xf0, 0x47, 0x10, 0x2d,
+ 0x20, 0x00, 0xe1, 0x26,
+ 0x1f, 0x0d, 0x10, 0x71, 0x51, 0x02, 0x20, 0x0d, 0x10, 0x14, 0x12, 0x12,
+ 0x54, 0x00, 0xe0, 0x02,
+ 0xe1, 0xf3, 0xd7, 0x05, 0x20, 0xee, 0x2f, 0x73, 0x21, 0xe2, 0x17, 0x30,
+ 0x00, 0x61, 0x12, 0xdf,
+ 0x01, 0x37, 0x33, 0xf0, 0xee, 0xf0, 0xa0, 0xf0, 0xe2, 0x05, 0x40, 0xee,
+ 0x10, 0x54, 0xf3, 0xcf,
+ 0x00, 0x54, 0x00, 0x00, 0x13, 0x00, 0xf3, 0x07, 0x00, 0xee, 0x12, 0x34,
+ 0xe0, 0x00, 0x01, 0x31,
+ 0x41, 0xf0, 0x00, 0x04, 0x00, 0xdf, 0xfd, 0x74, 0x40, 0xa8, 0x0f, 0x10,
+ 0x22, 0x00, 0x1f, 0x2e,
+ 0x4f, 0x11, 0x25, 0x10, 0x0f, 0x0b, 0x00, 0x10, 0x01, 0xdf, 0xbd, 0x00,
+ 0xec, 0x1f, 0x72, 0x71,
+ 0x0c, 0xf0, 0x00, 0x10, 0x30, 0xf8, 0xf0, 0x00, 0x22, 0xf0, 0xd0, 0xff,
+ 0xcd, 0xec, 0x21, 0x42,
+ 0xfc, 0x0e, 0x72, 0x00, 0xfe, 0x13, 0x04, 0x01, 0x20, 0x30, 0x32, 0x04,
+ 0x90, 0xe0, 0xf4, 0xf7,
+ 0xd0, 0xff, 0x02, 0xe2, 0xbf, 0xff, 0x17, 0x21, 0xf0, 0x00, 0x12, 0xc0,
+ 0x00, 0x26, 0x10, 0x90,
+ 0xf0, 0x24, 0xee, 0xcc, 0x45, 0xf1, 0xd1, 0x11, 0x30, 0x20, 0x00, 0xb0,
+ 0x03, 0x13, 0x11, 0xdd,
+ 0xbc, 0x00, 0x10, 0x53, 0x04, 0x02, 0xf0, 0xe8, 0x0f, 0x60, 0x22, 0x00,
+ 0x20, 0x12, 0x0f, 0xdd,
+ 0xdc, 0xce, 0x24, 0x32, 0xbc, 0xec, 0x00, 0x0e, 0x0f, 0x73, 0x15, 0x1a,
+ 0x0e, 0x4f, 0x20, 0x02,
+ 0x00, 0x0d, 0xfd, 0x10, 0x00, 0x9d, 0xf0, 0xf0, 0xeb, 0x0f, 0x05, 0x05,
+ 0xfe, 0x00, 0xde, 0x00,
+ 0xc0, 0x0a, 0x83, 0xb6, 0x9b, 0x09, 0x42, 0xb5, 0xbb, 0xcc, 0x01, 0x13,
+ 0x20, 0x0e, 0x3f, 0xf0,
+ 0xf0, 0x02, 0x01, 0xbb, 0xed, 0x13, 0x2f, 0xda, 0xe0, 0xd0, 0x80, 0x00,
+ 0xf1, 0x1f, 0x2e, 0xef,
+ 0xc0, 0xf1, 0xee, 0xec, 0x05, 0x03, 0xae, 0x01, 0xe4, 0xec, 0xbd, 0x00,
+ 0x10, 0x26, 0x14, 0xdf,
+ 0xce, 0x40, 0x01, 0xf0, 0xe2, 0xdf, 0xed, 0x55, 0x22, 0xbc, 0xdb, 0xef,
+ 0x00, 0x11, 0x10, 0x1e,
+ 0x3e, 0xed, 0xee, 0x31, 0x03, 0x0d, 0x0b, 0x3f, 0x0d, 0x8d, 0xd0, 0xf0,
+ 0x67, 0x10, 0xf8, 0x00,
+ 0x20, 0x20, 0x0f, 0x7e, 0x20, 0x00, 0x0f, 0xf1, 0xe0, 0xea, 0xcf, 0x00,
+ 0x30, 0xd0, 0x8b, 0xee,
+ 0x32, 0x22, 0x0d, 0xe0, 0xed, 0x0e, 0x53, 0x0f, 0xeb, 0x13, 0x0e, 0xee,
+ 0x34, 0xcb, 0xdf, 0x31,
+ 0x00, 0x8c, 0x00, 0x03, 0x0e, 0x0c, 0xe0, 0xf0, 0xf1, 0xe0, 0xec, 0x10,
+ 0x32, 0x11, 0xef, 0x8b,
+ 0xdc, 0x01, 0x25, 0x0f, 0xee, 0x01, 0x11, 0xf1, 0xe1, 0xdd, 0x30, 0x11,
+ 0xe0, 0xb3, 0x17, 0x34,
+ 0xbe, 0xee, 0xe2, 0xaf, 0xed, 0xe0, 0x24, 0x10, 0xb9, 0x00, 0x22, 0x43,
+ 0x0e, 0xfd, 0x02, 0x00,
+ 0x03, 0x31, 0xfd, 0xbc, 0x01, 0x14, 0xde, 0xcd, 0x00, 0x32, 0x74, 0x10,
+ 0x08, 0xfd, 0x53, 0x12,
+ 0xdd, 0x04, 0x14, 0x20, 0x1e, 0x00, 0x0f, 0x02, 0x67, 0xf0, 0xed, 0x00,
+ 0x73, 0x10, 0xfc, 0x11,
+ 0x15, 0x00, 0x20, 0x33, 0xfe, 0xad, 0x12, 0x25, 0x10, 0x00, 0xd0, 0x10,
+ 0x23, 0x10, 0x10, 0xf0,
+ 0xd0, 0x32, 0x01, 0xf0, 0x05, 0x33, 0x30, 0x40, 0x9f, 0xcb, 0x03, 0x26,
+ 0x00, 0x60, 0x10, 0xf0,
+ 0xef, 0xe1, 0x07, 0x22, 0x11, 0x50, 0x32, 0x00, 0xc0, 0x01, 0x02, 0x10,
+ 0x32, 0x11, 0xcb, 0x22,
+ 0x56, 0xfd, 0x0e, 0x73, 0x26, 0x0f, 0xde, 0x10, 0x32, 0x32, 0x10, 0xf0,
+ 0xf3, 0xf2, 0xe1, 0xaf,
+ 0xff, 0x13, 0xfe, 0x0a, 0x75, 0x10, 0x0f, 0x2f, 0x20, 0x00, 0x21, 0x26,
+ 0x11, 0x10, 0xfe, 0xd0,
+ 0x31, 0x00, 0x01, 0x24, 0xef, 0xdb, 0x61, 0x00, 0x0e, 0x01, 0xcd, 0xdb,
+ 0x75, 0x74, 0x00, 0xed,
+ 0x00, 0x24, 0xf0, 0x0f, 0x44, 0x10, 0xff, 0xef, 0x11, 0x11, 0xf0, 0x05,
+ 0x32, 0xde, 0xbc, 0x01,
+ 0x04, 0xef, 0xbe, 0x0f, 0x10, 0x3f, 0xf0, 0xf2, 0x11, 0x3e, 0x2d, 0x55,
+ 0x03, 0x8b, 0x0e, 0x01,
+ 0x24, 0x22, 0x02, 0xcf, 0xfd, 0x1f, 0x1f, 0xeb, 0xde, 0x43, 0x31, 0xfd,
+ 0x0f, 0xdb, 0xe0, 0x22,
+ 0x1f, 0x19, 0x70, 0x30, 0x0e, 0xdf, 0xd0, 0xe0, 0x24, 0x1e, 0x0b, 0x72,
+ 0x41, 0xba, 0xfe, 0x20,
+ 0x74, 0x00, 0x0b, 0x0f, 0x00, 0x11, 0x02, 0x00, 0xfe, 0x00, 0x12, 0x0f,
+ 0xcd, 0x13, 0x13, 0xea,
+ 0xce, 0x32, 0x55, 0xee, 0xce, 0x43, 0x10, 0xef, 0x0f, 0xf2, 0xf3, 0x13,
+ 0x4f, 0x1c, 0x01, 0xe2,
+ 0xd3, 0xf4, 0xf0, 0x09, 0x1f, 0x73, 0xf1, 0xa1, 0x00, 0xe1, 0x0f, 0x0d,
+ 0x31, 0x17, 0xd1, 0xac,
+ 0x02, 0x46, 0x00, 0xed, 0x00, 0x03, 0x00, 0xe0, 0x02, 0x23, 0xfe, 0xde,
+ 0x36, 0xf0, 0x8f, 0x00,
+ 0x02, 0xff, 0x0e, 0x10, 0xf0, 0x0f, 0x0f, 0x0f, 0x21, 0x0d, 0x88, 0x0d,
+ 0x45, 0x10, 0xdc, 0x0e,
+ 0x12, 0x00, 0xee, 0xed, 0xf0, 0x10, 0x20, 0x1f, 0xfc, 0x8a, 0x10, 0x63,
+ 0x00, 0xec, 0xfd, 0xfc,
+ 0x22, 0x24, 0x00, 0xed, 0xcd, 0x1f, 0x42, 0xf0, 0xee, 0xfd, 0xfb, 0x41,
+ 0x10, 0xcb, 0x00, 0x20,
+ 0x00, 0x11, 0xef, 0xef, 0x25, 0x0f, 0x30, 0x64, 0xbd, 0xed, 0x15, 0x33,
+ 0x00, 0x0e, 0xd0, 0xf0,
+ 0xb0, 0x05, 0x03, 0xdd, 0xf0, 0x22, 0xe0, 0x12, 0x06, 0xd0, 0x10, 0x31,
+ 0x22, 0xb1, 0x9e, 0xed,
+ 0x15, 0x56, 0x00, 0x03, 0xf2, 0xc0, 0x00, 0x14, 0x20, 0xef, 0x21, 0x67,
+ 0x01, 0xd0, 0x0f, 0x42,
+ 0x32, 0xf0, 0x00, 0x30, 0x02, 0x02, 0x0d, 0x3d, 0x77, 0x01, 0xd0, 0x01,
+ 0xc1, 0xed, 0x0e, 0x75,
+ 0x11, 0xff, 0xef, 0x11, 0x53, 0x0e, 0x0c, 0x21, 0x11, 0x0d, 0x2f, 0x10,
+ 0x1e, 0x10, 0x10, 0xfa,
+ 0x00, 0x54, 0x1f, 0xd8, 0x10, 0x01, 0xce, 0x00, 0x00, 0x9c, 0x0f, 0x77,
+ 0x10, 0xed, 0x00, 0xe0,
+ 0x01, 0x62, 0x0e, 0x0d, 0x00, 0xff, 0x13, 0x35, 0x0f, 0xfc, 0xfe, 0xf1,
+ 0x03, 0x00, 0xe0, 0xce,
+ 0xff, 0x01, 0x01, 0x22, 0x00, 0xac, 0xec, 0x00, 0x31, 0x00, 0xef, 0xf1,
+ 0xe0, 0x07, 0x57, 0xf1,
+ 0x8e, 0x00, 0x23, 0x0e, 0xed, 0x37, 0x01, 0xbe, 0xfe, 0x01, 0x01, 0xef,
+ 0x0e, 0x00, 0x0d, 0x02,
+ 0x33, 0xfe, 0xfb, 0x0f, 0xef, 0x9e, 0x02, 0x27, 0x22, 0xcb, 0x00, 0x40,
+ 0x02, 0x0f, 0x0e, 0x30,
+ 0x4f, 0x0e, 0x23, 0x0f, 0xa8, 0x00, 0x61, 0x22, 0xfe, 0xcb, 0x21, 0x23,
+ 0xfd, 0x00, 0x10, 0xe0,
+ 0xcf, 0x00, 0x1f, 0xff, 0xf0, 0xee, 0xeb, 0xee, 0x21, 0x00, 0xdb, 0x70,
+ 0x53, 0x0e, 0xed, 0x02,
+ 0xf0, 0xfe, 0x12, 0x0e, 0xdb, 0xe0, 0xae, 0x01, 0x07, 0xdc, 0xce, 0x11,
+ 0x12, 0xcf, 0xa8, 0x00,
+ 0x51, 0x0f, 0xed, 0xf0, 0x02, 0x00, 0x1d, 0x00, 0xf5, 0xf1, 0xef, 0xcd,
+ 0x00, 0x13, 0x01, 0xcf,
+ 0xde, 0xee, 0xc4, 0xc0, 0xcd, 0xfa, 0x01, 0x44, 0xfe, 0xce, 0xfe, 0x00,
+ 0x41, 0x12, 0xd8, 0xe0,
+ 0x10, 0xe0, 0xce, 0x00, 0x01, 0xbe, 0x00, 0xf0, 0xc9, 0xf0, 0x01, 0x00,
+ 0x00, 0xcf, 0xbb, 0x00,
+ 0x61, 0x11, 0xff, 0xed, 0x03, 0x26, 0x20, 0x0d, 0x00, 0xff, 0x02, 0x03,
+ 0xcd, 0xff, 0x21, 0x00,
+ 0xaa, 0x00, 0x04, 0xf0, 0xfe, 0x0d, 0x40, 0x41, 0x10, 0x00, 0x05, 0x35,
+ 0xbf, 0xfd, 0x00, 0x00,
+ 0xbd, 0x03, 0x37, 0xf0, 0xdc, 0x00, 0xd0, 0xe2, 0x00, 0x30, 0x1c, 0xad,
+ 0xe0, 0x35, 0x00, 0xaf,
+ 0x00, 0x10, 0x00, 0xf0, 0xe0, 0xf2, 0x00, 0x3e, 0x71, 0x30, 0xde, 0xef,
+ 0xef, 0xfe, 0x01, 0x47,
+ 0x40, 0xf8, 0xe0, 0x30, 0x12, 0x0e, 0x21, 0x20, 0xcb, 0x00, 0x33, 0x51,
+ 0xf0, 0x8b, 0x00, 0xe0,
+ 0x02, 0x24, 0xfe, 0xbb, 0x01, 0x42, 0x0f, 0x00, 0x02, 0x10, 0x1b, 0x30,
+ 0x33, 0x10, 0xe0, 0xf0,
+ 0x10, 0x32, 0xdc, 0xef, 0x01, 0xc1, 0x00, 0x30, 0x0d, 0x8d, 0xf0, 0xd2,
+ 0x00, 0xdf, 0x23, 0x77,
+ 0x36, 0x00, 0x1e, 0x32, 0x14, 0x01, 0xe0, 0x23, 0x15, 0x10, 0xee, 0xc0,
+ 0xe0, 0x56, 0xe0, 0xaf,
+ 0x11, 0x20, 0xeb, 0x10, 0x61, 0x03, 0x0f, 0xee, 0x12, 0x00, 0xc9, 0x10,
+ 0x74, 0x00, 0x0e, 0x02,
+ 0x32, 0x1e, 0x1e, 0x01, 0x11, 0x04, 0x32, 0xcd, 0xed, 0x23, 0x31, 0x0e,
+ 0xf0, 0x11, 0x40, 0x4e,
+ 0x1f, 0x18, 0x20, 0x50, 0x00, 0x20, 0x52, 0xfc, 0x00, 0x74, 0x0d, 0x0a,
+ 0x14, 0x33, 0xfb, 0x00,
+ 0x31, 0x00, 0x32, 0x42, 0x0d, 0x2c, 0x74, 0x42, 0xe2, 0xf0, 0x00, 0x20,
+ 0x20, 0x10, 0x37, 0x01,
+ 0xc0, 0x00, 0xf2, 0x11, 0x10, 0x11, 0xf0, 0xe0, 0x51, 0x16, 0xf0, 0x33,
+ 0x67, 0x00, 0x0f, 0x00,
+ 0x03, 0x00, 0x22, 0x42, 0xe0, 0x9f, 0x03, 0x17, 0x12, 0xff, 0x01, 0x13,
+ 0xe0, 0x01, 0x22, 0x40,
+ 0x14, 0x03, 0x8f, 0xe0, 0x07, 0x03, 0x00, 0x20, 0x10, 0x10, 0x15, 0xf0,
+ 0xd0, 0x40, 0x77, 0x00,
+ 0xe0, 0xef, 0xef, 0x02, 0x34, 0x10, 0xef, 0x0f, 0x0d, 0x60, 0x31, 0xef,
+ 0xf0, 0x40, 0x08, 0xde,
+ 0x30, 0x41, 0xef, 0xfd, 0x00, 0x0f, 0x00, 0x21, 0xbb, 0xed, 0x21, 0xde,
+ 0x9a, 0x10, 0x42, 0x10,
+ 0x0b, 0xfe, 0x00, 0x21, 0x01, 0x4f, 0x4d, 0x1e, 0xf0, 0xdc, 0xff, 0xe0,
+ 0x01, 0x35, 0xdc, 0x8d,
+ 0x01, 0x33, 0xbb, 0xed, 0x34, 0x64, 0xf0, 0xec, 0xf1, 0x00, 0xf1, 0x23,
+ 0x00, 0xf0, 0x04, 0xd0,
+ 0xdf, 0x32, 0x02, 0x80, 0x02, 0xf4, 0x13, 0x22, 0xec, 0xf0, 0x24, 0xd0,
+ 0x8c, 0xe6, 0x05, 0x0f,
+ 0xde, 0x00, 0x23, 0xe2, 0xb0, 0x01, 0x32, 0x20, 0x00, 0x43, 0x06, 0xe0,
+ 0x03, 0xf1, 0x01, 0x55,
+ 0x00, 0xdd, 0x01, 0x31, 0x0f, 0x50, 0x24, 0xdc, 0xbc, 0x10, 0x31, 0x42,
+ 0x02, 0xe0, 0xee, 0xf0,
+ 0xfe, 0xee, 0x35, 0x62, 0xeb, 0x0d, 0x0f, 0x3f, 0x0d, 0x30, 0x0a, 0x70,
+ 0x43, 0xfd, 0xdb, 0x50,
+ 0x00, 0x1f, 0x31, 0x12, 0xdd, 0xfd, 0xee, 0xfd, 0x00, 0xcd, 0xd8, 0x0f,
+ 0x10, 0x30, 0x0f, 0x0e,
+ 0xde, 0xaf, 0x21, 0x71, 0x3c, 0x0e, 0xfb, 0xd1, 0x27, 0x00, 0xad, 0x00,
+ 0xf2, 0x00, 0xf0, 0xfd,
+ 0xe0, 0x01, 0x01, 0xdf, 0xcb, 0xe0, 0x03, 0xb0, 0xc9, 0x22, 0x01, 0xad,
+ 0x00, 0x10, 0xff, 0xf1,
+ 0x47, 0x01, 0xcd, 0x00, 0x03, 0x01, 0x01, 0x0e, 0xcc, 0x02, 0x04, 0xf0,
+ 0xcd, 0xf0, 0x0f, 0xfc,
+ 0xdb, 0x10, 0x74, 0x10, 0xec, 0x10, 0x51, 0x00, 0x01, 0xf0, 0xe0, 0xec,
+ 0x0f, 0x40, 0x0d, 0x0d,
+ 0x0d, 0xea, 0x20, 0x70, 0x0d, 0x1c, 0x0e, 0x1e, 0x1f, 0x21, 0x33, 0x4e,
+ 0x3e, 0x2f, 0xfb, 0xde,
+ 0xcc, 0xf0, 0x0e, 0x0e, 0x1f, 0x0d, 0x88, 0xed, 0x00, 0x01, 0x12, 0x0d,
+ 0x20, 0x74, 0x1e, 0xe8,
+ 0x00, 0x11, 0xe0, 0xbe, 0x02, 0xe0, 0xdb, 0x11, 0x03, 0x9e, 0x0e, 0x00,
+ 0x0e, 0x02, 0x22, 0xdd,
+ 0xeb, 0x00, 0xe0, 0xbe, 0x06, 0x02, 0x0d, 0xdc, 0x00, 0x00, 0xc1, 0xc1,
+ 0xe1, 0xe5, 0xe1, 0xe2,
+ 0xbf, 0xce, 0x04, 0xd2, 0xd0, 0xe1, 0x01, 0x32, 0xcc, 0xcc, 0x02, 0x24,
+ 0x00, 0xfd, 0xeb, 0x70,
+ 0x40, 0xf2, 0xe3, 0xe1, 0xee, 0x0f, 0x0e, 0x88, 0x00, 0x03, 0xfe, 0xdc,
+ 0x00, 0x21, 0xee, 0x0f,
+ 0x4e, 0x31, 0x67, 0x00, 0x00, 0x21, 0x02, 0x10, 0x0f, 0x20, 0x23, 0x33,
+ 0xeb, 0xde, 0x20, 0xe1,
+ 0x8e, 0x03, 0x37, 0x0f, 0xdd, 0x64, 0x13, 0xed, 0x0f, 0x73, 0x21, 0x00,
+ 0xf0, 0x05, 0x02, 0xfe,
+ 0xff, 0x13, 0x13, 0x11, 0xf3, 0x05, 0xf0, 0xfe, 0x42, 0x56, 0xe1, 0xc0,
+ 0xe0, 0x04, 0x32, 0xe0,
+ 0xad, 0x00, 0xf0, 0x05, 0x23, 0xfc, 0xf0, 0x33, 0x0e, 0x0f, 0x46, 0xf3,
+ 0x13, 0x72, 0x0e, 0x00,
+ 0xf4, 0xe0, 0x27, 0x40, 0xde, 0x0e, 0x30, 0x33, 0xd1, 0x00, 0x74, 0x42,
+ 0x00, 0xde, 0xfe, 0x10,
+ 0x57, 0xf1, 0xef, 0x33, 0x10, 0xc9, 0x00, 0x11, 0xf0, 0xf1, 0x71, 0x3e,
+ 0x0c, 0x42, 0x00, 0x01,
+ 0x04, 0x3f, 0x0b, 0x21, 0x21, 0x0f, 0xed, 0xde, 0xc0, 0xee, 0x0e, 0x42,
+ 0x10, 0xfc, 0xe0, 0x36,
+ 0x62, 0x10, 0x40, 0x52, 0x0e, 0xec, 0x13, 0x37, 0xe0, 0xde, 0x00, 0xf1,
+ 0xf1, 0xf2, 0xd0, 0x0f,
+ 0x0e, 0xcf, 0x54, 0x13, 0xd0, 0xdc, 0x01, 0x00, 0xe0, 0xc0, 0x0e, 0x0b,
+ 0x50, 0x51, 0x0b, 0xdd,
+ 0xf2, 0xd5, 0xd0, 0x2f, 0x7e, 0x10, 0x22, 0x03, 0x90, 0xfe, 0xf7, 0x02,
+ 0xed, 0xfd, 0xda, 0x0e,
+ 0x50, 0x01, 0xef, 0x0d, 0x2f, 0x2b, 0x0e, 0x41, 0x25, 0x0f, 0xfc, 0x50,
+ 0x30, 0x00, 0xd0, 0xab,
+ 0x00, 0x0f, 0x1f, 0x1f, 0x2f, 0x5e, 0xfe, 0x20, 0x65, 0x1f, 0x1f, 0x10,
+ 0x12, 0x20, 0x0a, 0x00,
+ 0x01, 0xfd, 0xce, 0x00, 0xd0, 0xfe, 0xff, 0xf0, 0x50, 0x44, 0xfe, 0xc0,
+ 0x22, 0x0e, 0x1b, 0x0e,
+ 0x20, 0x04, 0x9f, 0x01, 0x05, 0xee, 0xe0, 0x37, 0x42, 0xbe, 0x04, 0x15,
+ 0xef, 0xde, 0x03, 0xf3,
+ 0xc0, 0xf0, 0x00, 0x02, 0xb0, 0xee, 0xf2, 0xf3, 0xed, 0xef, 0xd0, 0x06,
+ 0xd1, 0xb0, 0x05, 0x11,
+ 0x04, 0x16, 0xe1, 0x8f, 0xcf, 0x0f, 0xf0, 0xf0, 0x05, 0xef, 0xcc, 0x20,
+ 0x11, 0xfd, 0xee, 0x10,
+ 0x20, 0x0e, 0x0f, 0x62, 0x21, 0xc9, 0xe0, 0xf2, 0xcf, 0xdc, 0xef, 0x0f,
+ 0xfe, 0x9c, 0xfe, 0x11,
+ 0x1f, 0x0b, 0x31, 0x10, 0xdc, 0x40, 0x73, 0x0c, 0x0d, 0x10, 0x11, 0x0f,
+ 0xfa, 0xef, 0xff, 0xd0,
+ 0x00, 0xe0, 0xe0, 0xfc, 0x00, 0x20, 0xdd, 0xff, 0x74, 0xfe, 0xcb, 0x01,
+ 0x32, 0xcf, 0xce, 0x13,
+ 0x40, 0x1e, 0x34, 0x05, 0xe0, 0xcf, 0xf0, 0x05, 0xd1, 0x8e, 0x01, 0x05,
+ 0xce, 0xf0, 0x02, 0xc0,
+ 0xe0, 0x05, 0x00, 0x00, 0x00, 0xf2, 0x05, 0x03, 0xf0, 0x34, 0x74, 0x02,
+ 0xf2, 0xe0, 0xd0, 0x03,
+ 0xf6, 0x11, 0xd0, 0x00, 0x62, 0xf1, 0xd0, 0x00, 0xe2, 0x02, 0x61, 0x20,
+ 0x35, 0x00, 0x00, 0xf2,
+ 0x03, 0xe0, 0xcf, 0x00, 0x22, 0x0f, 0x0d, 0x00, 0x1e, 0x3d, 0x08, 0x7e,
+ 0x72, 0x40, 0x0d, 0x0f,
+ 0x07, 0x13, 0x3f, 0x4c, 0x1d, 0x0e, 0x00, 0xfe, 0xf9, 0x00, 0x00, 0x0d,
+ 0x0e, 0x33, 0x6f, 0x4b,
+ 0x20, 0x3f, 0x10, 0x10, 0x0b, 0xf0, 0x30, 0x00, 0x30, 0x30, 0x2f, 0x10,
+ 0x62, 0x43, 0x21, 0x0e,
+ 0x02, 0xd5, 0xe0, 0x12, 0xc2, 0xa1, 0xf7, 0xff, 0xce, 0xf1, 0xf6, 0xd0,
+ 0x00, 0x00, 0x1e, 0x2f,
+ 0x32, 0x47, 0x04, 0x00, 0xcf, 0x9f, 0xf2, 0xe3, 0xe2, 0xc0, 0xf1, 0x07,
+ 0x01, 0xa0, 0xff, 0xe1,
+ 0x03, 0x32, 0x00, 0xce, 0x40, 0x43, 0x01, 0xf2, 0x07, 0x16, 0x10, 0x0e,
+ 0xef, 0xe0, 0x10, 0xf2,
+ 0x8f, 0x0e, 0x0e, 0x1d, 0x1c, 0x61, 0x22, 0x1d, 0x20, 0x31, 0x00, 0x41,
+ 0x1d, 0x19, 0x31, 0x51,
+ 0x00, 0x0f, 0x1c, 0x0d, 0xec, 0x0e, 0x44, 0x62, 0x2d, 0x4d, 0x0d, 0xf9,
+ 0xf0, 0x04, 0x31, 0xef,
+ 0x0e, 0xfe, 0x0e, 0xed, 0xe1, 0x47, 0x30, 0x30, 0x7f, 0x10, 0xf0, 0xee,
+ 0x01, 0x00, 0x50, 0x45,
+ 0x10, 0xde, 0xce, 0xf2, 0xd2, 0xeb, 0xf0, 0x24, 0xee, 0xff, 0x14, 0x07,
+ 0xb0, 0xbe, 0x01, 0xf5,
+ 0xe1, 0xc2, 0xf2, 0xb0, 0x00, 0xf3, 0xc0, 0xf2, 0xf5, 0xe0, 0x0f, 0x71,
+ 0x01, 0xe0, 0x03, 0xe2,
+ 0x02, 0x21, 0x0f, 0xfe, 0xc3, 0xd4, 0xcf, 0xd1, 0xf5, 0xef, 0xca, 0xf0,
+ 0xee, 0xdd, 0xf2, 0x05,
+ 0x21, 0x10, 0x4e, 0x10, 0x14, 0x33, 0x71, 0x4e, 0xe9, 0x00, 0xf0, 0x00,
+ 0x02, 0xc1, 0x00, 0x10,
+ 0x30, 0x0b, 0x5f, 0x2f, 0x00, 0x30, 0x22, 0xec, 0xdf, 0x44, 0x1e, 0xea,
+ 0x50, 0x73, 0x10, 0x0b,
+ 0x20, 0x41, 0x00, 0x0e, 0x13, 0x12, 0x10, 0xff, 0x00, 0xe6, 0xd0, 0x80,
+ 0xe0, 0xdf, 0xcd, 0xfc,
+ 0xef, 0xfd, 0xff, 0x40, 0x3b, 0xea, 0xc0, 0x00, 0x04, 0x20, 0x40, 0xe0,
+ 0xb1, 0x02, 0xe1, 0xdf,
+ 0xe2, 0x07, 0x10, 0xae, 0x0e, 0x33, 0x02, 0xd1, 0x03, 0x20, 0xfb, 0x1f,
+ 0x46, 0xb1, 0xc0, 0x01,
+ 0xe1, 0xd0, 0x00, 0x14, 0xef, 0xf0, 0xf0, 0xa1, 0xff, 0x0f, 0x2f, 0xd0,
+ 0x03, 0x44, 0x2d, 0xe8,
+ 0x0d, 0x70, 0x20, 0xdd, 0xdd, 0x01, 0xf2, 0xf0, 0x0c, 0xd8, 0xc0, 0x40,
+ 0x53, 0x11, 0x50, 0x0e,
+ 0x0e, 0xfe, 0xe0, 0xff, 0xef, 0x00, 0x2b, 0x2e, 0x61, 0x13, 0xee, 0xea,
+ 0x20, 0x4e, 0x2e, 0x53,
+ 0x15, 0xee, 0xec, 0x02, 0x01, 0xee, 0xcf, 0xff, 0xda, 0x0d, 0x60, 0x10,
+ 0x09, 0xef, 0x20, 0x3f,
+ 0x0f, 0x0f, 0x3e, 0x00, 0xf0, 0xc2, 0xe1, 0x12, 0xe0, 0x8d, 0xf0, 0xe1,
+ 0xe1, 0xba, 0x0f, 0x0f,
+ 0x30, 0x20, 0x08, 0xec, 0x00, 0x10, 0x00, 0x73, 0x72, 0xec, 0xed, 0x01,
+ 0x13, 0x10, 0x21, 0x0c,
+ 0xed, 0x00, 0x02, 0x11, 0xda, 0x12, 0x76, 0x1e, 0x0e, 0x20, 0x61, 0x00,
+ 0x00, 0x01, 0x22, 0x0f,
+ 0xfe, 0x02, 0x23, 0x00, 0x0f, 0x0b, 0x41, 0x45, 0xe0, 0xef, 0x0c, 0xfe,
+ 0xc0, 0xe1, 0xff, 0x2e,
+ 0x5f, 0x2e, 0xff, 0xe2, 0xf7, 0xe4, 0x60, 0x62, 0x20, 0x22, 0x17, 0x01,
+ 0xd1, 0x01, 0x11, 0xf3,
+ 0xc1, 0xe1, 0xc0, 0xe1, 0xf0, 0x02, 0x0c, 0xdc, 0xee, 0x1e, 0x05, 0x05,
+ 0x5e, 0x00, 0x48, 0x00,
+ 0xf1, 0xe8, 0x7d, 0x19, 0xc1, 0xe9, 0x43, 0x1d, 0x80, 0xf7, 0xf1, 0xfe,
+ 0xf6, 0x04, 0x00, 0x80,
+ 0xfe, 0xf0, 0xe3, 0xd0, 0x00, 0x00, 0x19, 0x2f, 0x10, 0xff, 0xdf, 0x2f,
+ 0x1d, 0x0e, 0xd2, 0x91,
+ 0xf3, 0xe0, 0xd8, 0xcb, 0x00, 0xd0, 0x9d, 0xef, 0xee, 0xce, 0xfd, 0xdd,
+ 0x0f, 0x0e, 0x3e, 0x0a,
+ 0x3e, 0x4e, 0x20, 0x0d, 0xec, 0x0f, 0xed, 0x1d, 0xfd, 0x0e, 0x40, 0xd0,
+ 0xaa, 0xde, 0xbd, 0xff,
+ 0xce, 0xdc, 0xde, 0x1f, 0x2d, 0x20, 0x02, 0x9f, 0x0a, 0x10, 0x2f, 0x0a,
+ 0x00, 0x50, 0x10, 0x0e,
+ 0xd2, 0x17, 0x01, 0xe0, 0xed, 0xc1, 0x93, 0xe1, 0xe1, 0xe0, 0xed, 0xe0,
+ 0xf4, 0x02, 0xe0, 0xe3,
+ 0x00, 0xfc, 0x51, 0x37, 0x04, 0x83, 0x03, 0x03, 0x03, 0x03, 0x06, 0xd0,
+ 0xc1, 0x04, 0x00, 0xf1,
+ 0x02, 0x51, 0xff, 0xee, 0x05, 0x04, 0x02, 0x10, 0x1e, 0x02, 0xf3, 0x24,
+ 0x70, 0x1e, 0x1c, 0x10,
+ 0xf2, 0xd2, 0xce, 0xfd, 0xfc, 0x1f, 0x41, 0xe3, 0x02, 0x52, 0x62, 0x18,
+ 0x1c, 0x20, 0x01, 0xdc,
+ 0x0e, 0x71, 0x1c, 0x1d, 0x40, 0x00, 0xdc, 0x00, 0x11, 0x2e, 0x0d, 0x0b,
+ 0x1e, 0x2f, 0x0e, 0x3f,
+ 0x50, 0x0b, 0x1b, 0x30, 0x60, 0x0f, 0x0d, 0x01, 0x44, 0x30, 0x0e, 0x01,
+ 0x03, 0x01, 0xd2, 0x05,
+ 0x02, 0x12, 0x14, 0xb0, 0xbb, 0x10, 0x42, 0x01, 0x01, 0xfd, 0xda, 0x10,
+ 0x53, 0x00, 0x00, 0x0f,
+ 0x1c, 0x30, 0xd2, 0xa3, 0x07, 0x03, 0xa0, 0xf0, 0xf0, 0x01, 0x03, 0xef,
+ 0xf0, 0x23, 0x11, 0x03,
+ 0xe7, 0xe7, 0xf0, 0x71, 0x40, 0x10, 0x10, 0x10, 0x00, 0x01, 0x00, 0xfd,
+ 0xff, 0xd0, 0xce, 0xab,
+ 0xf0, 0xf1, 0x12, 0x7d, 0x2b, 0x00, 0x0f, 0xf0, 0x10, 0x4c, 0x5f, 0x31,
+ 0x2c, 0x2b, 0x30, 0x22,
+ 0xee, 0x0f, 0x41, 0x0d, 0x2d, 0x20, 0x02, 0xef, 0xb8, 0xff, 0x00, 0x00,
+ 0xfc, 0x00, 0xfd, 0x3c,
+ 0x70, 0x1f, 0x0e, 0xed, 0xed, 0x22, 0x43, 0x2c, 0x6b, 0x2e, 0x00, 0xf3,
+ 0xc4, 0x25, 0x30, 0x0a,
+ 0x0f, 0x00, 0xe0, 0xa1, 0xe0, 0xe1, 0xef, 0x0a, 0x11, 0x32, 0xa0, 0xd1,
+ 0x02, 0x35, 0x20, 0xe2,
+ 0xd1, 0xb1, 0xf3, 0x02, 0x23, 0x02, 0xd0, 0xe3, 0xf7, 0xd0, 0xd2, 0xd0,
+ 0xde, 0x20, 0xc0, 0x03,
+ 0x77, 0x72, 0x4f, 0xfe, 0xd0, 0xe1, 0xe0, 0xd4, 0xd1, 0xf1, 0x12, 0x02,
+ 0xf7, 0xd1, 0x80, 0x00,
+ 0x33, 0x43, 0x10, 0x20, 0x10, 0xf0, 0x01, 0x57, 0x27, 0xff, 0x00, 0x11,
+ 0xf0, 0x0f, 0x21, 0x43,
+ 0x11, 0x30, 0x20, 0x00, 0x40, 0x32, 0x60, 0x22, 0x30, 0x2e, 0x2d, 0x5d,
+ 0x46, 0x12, 0x10, 0x67,
+ 0x23, 0xf0, 0x02, 0x06, 0x00, 0x00, 0x12, 0x53, 0x00, 0xe0, 0x10, 0x01,
+ 0xc0, 0xf3, 0xf3, 0x0d,
+ 0x0a, 0x40, 0x20, 0x0e, 0x02, 0x00, 0x22, 0x77, 0x47, 0x10, 0x01, 0x10,
+ 0x20, 0x12, 0x21, 0x00,
+ 0xe2, 0x04, 0xe0, 0xe0, 0xcf, 0xd1, 0x04, 0x52, 0x74, 0x22, 0x33, 0x20,
+ 0x23, 0x13, 0xf4, 0xf4,
+ 0x02, 0xe1, 0x12, 0x74, 0x00, 0xce, 0xe1, 0x07, 0x01, 0x00, 0x0f, 0x3e,
+ 0x30, 0x21, 0x01, 0x50,
+ 0x2d, 0x2f, 0x4f, 0x1f, 0x07, 0x47, 0x00, 0x20, 0x6f, 0x12, 0x02, 0x01,
+ 0x00, 0x00, 0x30, 0x30,
+ 0xe0, 0xe6, 0xdf, 0xce, 0x60, 0x43, 0x0b, 0x2f, 0x23, 0xe1, 0xef, 0xf1,
+ 0x33, 0x50, 0x10, 0x20,
+ 0x00, 0x04, 0xf0, 0x0c, 0xfd, 0x21, 0x33, 0xb8, 0xdd, 0xe0, 0xfe, 0xfe,
+ 0x3f, 0xfb, 0x8e, 0x1e,
+ 0x30, 0x00, 0x02, 0x05, 0xf0, 0x0c, 0x6f, 0x2d, 0x1e, 0x00, 0xa3, 0xde,
+ 0xa8, 0xfd, 0xee, 0x0d,
+ 0xfe, 0x31, 0x63, 0x0e, 0x08, 0x10, 0x2f, 0x1f, 0xfe, 0xfd, 0x0f, 0x00,
+ 0x00, 0xde, 0x00, 0x0d,
+ 0xfa, 0xcf, 0xdf, 0xcf, 0x2c, 0x70, 0x10, 0x1d, 0x30, 0x20, 0x40, 0x0d,
+ 0x1d, 0x3e, 0x1d, 0x0d,
+ 0x0f, 0xdf, 0xdc, 0x08, 0xfd, 0xcd, 0xf0, 0xdf, 0x98, 0xed, 0x01, 0x01,
+ 0xdf, 0x8d, 0x21, 0x33,
+ 0x1e, 0xeb, 0x03, 0xe4, 0xd0, 0xcd, 0x00, 0x75, 0x10, 0xfd, 0xe2, 0xf1,
+ 0xf2, 0x03, 0x03, 0xb0,
+ 0xef, 0xe0, 0xdf, 0xbc, 0xf0, 0xf1, 0xf0, 0xea, 0xe0, 0xc3, 0xc0, 0xcc,
+ 0xde, 0xf0, 0x02, 0x00,
+ 0x20, 0x05, 0xed, 0xcc, 0xb0, 0xe4, 0xe1, 0xdb, 0xde, 0x00, 0x00, 0x3f,
+ 0xfe, 0xbf, 0x09, 0xfe,
+ 0xfe, 0x00, 0xef, 0xcf, 0xbb, 0xce, 0xde, 0xdd, 0xdd, 0xdc, 0xbc, 0xfb,
+ 0xff, 0x0e, 0x1e, 0xdd,
+ 0xfa, 0x5f, 0x3d, 0x1e, 0xff, 0x00, 0xcf, 0x0f, 0xdb, 0xdf, 0x0f, 0xee,
+ 0xcd, 0xff, 0xdf, 0x8d,
+ 0xfe, 0xfa, 0xfe, 0x00, 0x0f, 0xe1, 0xef, 0x1e, 0x4d, 0x0a, 0xff, 0x00,
+ 0xce, 0xdf, 0x00, 0xf0,
+ 0xce, 0xdb, 0xef, 0x00, 0x02, 0xb0, 0xbf, 0xe3, 0xe7, 0xb0, 0xd2, 0xb2,
+ 0xde, 0xe1, 0x07, 0x32,
+ 0x0e, 0xa0, 0xf1, 0xe4, 0xe0, 0xf0, 0x04, 0x02, 0x03, 0x36, 0x03, 0x03,
+ 0xcf, 0xe0, 0x03, 0xa4,
+ 0xb0, 0xf5, 0x03, 0xf0, 0x0f, 0x01, 0x33, 0xf2, 0xe1, 0x52, 0x73, 0x11,
+ 0x11, 0x13, 0x15, 0xf3,
+ 0x15, 0x21, 0x10, 0x31, 0x00, 0x03, 0xbd, 0x0c, 0x21, 0x43, 0x31, 0x1b,
+ 0x1c, 0x20, 0x62, 0x1e,
+ 0x3c, 0x0e, 0x00, 0x55, 0x1f, 0x1e, 0x50, 0x2f, 0x09, 0x10, 0x2f, 0x0f,
+ 0x2f, 0x2e, 0x3e, 0x5e,
+ 0x10, 0x12, 0x1d, 0x1c, 0x20, 0x32, 0x3e, 0x51, 0x16, 0xfd, 0xfc, 0x21,
+ 0x73, 0x34, 0x14, 0x23,
+ 0x00, 0x03, 0x17, 0x03, 0xf3, 0x12, 0x22, 0x20, 0x40, 0x15, 0xa0, 0xe1,
+ 0x0e, 0xfc, 0x1f, 0x01,
+ 0x03, 0x21, 0x41, 0x14, 0x01, 0xd3, 0x07, 0x13, 0x82, 0xb2, 0xf1, 0xd2,
+ 0xf4, 0x03, 0x02, 0x17,
+ 0x21, 0xd0, 0x20, 0x73, 0x02, 0x00, 0x01, 0x45, 0x00, 0x41, 0x20, 0x0f,
+ 0x12, 0x04, 0x01, 0xc0,
+ 0xfe, 0xfe, 0x00, 0x00, 0x2c, 0x18, 0x6f, 0x4f, 0x5e, 0x20, 0x1f, 0x30,
+ 0x2e, 0x5f, 0x4f, 0x2f,
+ 0x39, 0x1e, 0x00, 0x30, 0x20, 0x20, 0x00, 0x0d, 0x3f, 0x1a, 0xdf, 0xc0,
+ 0x00, 0xf1, 0x3e, 0x18,
+ 0xff, 0x40, 0xf0, 0xef, 0x7d, 0x7f, 0x3c, 0x1f, 0x10, 0x01, 0x12, 0x00,
+ 0x15, 0x02, 0xe1, 0xf0,
+ 0x10, 0x40, 0x00, 0xe0, 0xbf, 0xe1, 0xb6, 0xcf, 0xef, 0x00, 0xf1, 0x05,
+ 0x33, 0xf2, 0xb4, 0x06,
+ 0x03, 0x00, 0xe3, 0xf3, 0xa0, 0xd0, 0xe5, 0xc3, 0xf1, 0xd3, 0xf0, 0xb0,
+ 0xec, 0x12, 0x03, 0x00,
+ 0xbd, 0x02, 0x17, 0x01, 0xee, 0xee, 0x01, 0xd5, 0xe1, 0xc0, 0xe1, 0xe0,
+ 0xcf, 0xfd, 0xf2, 0xd0,
+ 0xbf, 0xfe, 0xdf, 0xf1, 0x22, 0x0e, 0x0e, 0x1b, 0xfd, 0x40, 0x2b, 0x10,
+ 0x40, 0xe9, 0xdc, 0x1e,
+ 0x7f, 0x0f, 0xca, 0x2f, 0x70, 0x0d, 0x0d, 0x21, 0x03, 0xfd, 0xe8, 0x1f,
+ 0x40, 0x2e, 0x7f, 0x2f,
+ 0x00, 0x1e, 0x10, 0xff, 0xfe, 0xe0, 0xe2, 0xf3, 0xf0, 0xbc, 0xf2, 0x02,
+ 0xfe, 0xe9, 0xcd, 0xb0,
+ 0xee, 0xca, 0xfe, 0x0e, 0x10, 0x20, 0x02, 0x02, 0xfe, 0xdd, 0x12, 0x36,
+ 0xcf, 0xad, 0xf1, 0xc3,
+ 0xbf, 0xef, 0xd1, 0xf1, 0xef, 0xed, 0xf5, 0x27, 0xd1, 0xc0, 0x20, 0x66,
+ 0x10, 0x01, 0x02, 0xe4,
+ 0xf1, 0xd0, 0xef, 0xd2, 0xb2, 0xf0, 0xe0, 0xff, 0xcd, 0xde, 0xb1, 0x0d,
+ 0xf9, 0x20, 0x0f, 0x21,
+ 0x12, 0x1d, 0x4b, 0x70, 0x32, 0x11, 0x0f, 0x00, 0x00, 0xfd, 0x1c, 0x0b,
+ 0x0e, 0x20, 0x41, 0x2c,
+ 0x0b, 0x01, 0x34, 0xbf, 0xef, 0xf0, 0x2d, 0x1b, 0x4e, 0x7e, 0x3e, 0x0b,
+ 0xee, 0x00, 0x1f, 0x30,
+ 0x30, 0x2d, 0x10, 0x51, 0x12, 0x0c, 0x08, 0x00, 0xe0, 0xcf, 0xdd, 0x0d,
+ 0x1e, 0x0b, 0x5e, 0x20,
+ 0xf0, 0x36, 0x30, 0x0e, 0x0e, 0x71, 0xf1, 0xa0, 0xef, 0xf0, 0xf0, 0xec,
+ 0xff, 0xe0, 0xab, 0xd0,
+ 0x00, 0xd0, 0x00, 0x70, 0x1f, 0x0d, 0x02, 0x01, 0x1f, 0x0e, 0x34, 0x00,
+ 0xcd, 0xff, 0xf0, 0xf6,
+ 0x0f, 0xfd, 0x00, 0x27, 0x33, 0x9e, 0x02, 0x57, 0x22, 0x1f, 0x2f, 0x43,
+ 0x02, 0x1e, 0x50, 0x53,
+ 0x0f, 0x19, 0x00, 0x10, 0x10, 0x0c, 0x30, 0x31, 0x32, 0x22, 0xe0, 0xcb,
+ 0x10, 0x32, 0x01, 0x21,
+ 0x21, 0x4d, 0x6d, 0x20, 0x10, 0x00, 0x0a, 0x50, 0x30, 0x57, 0x16, 0x40,
+ 0x30, 0x13, 0x10, 0x14,
+ 0xf0, 0xf1, 0xf2, 0xf0, 0xa0, 0xdf, 0xcf, 0xe0, 0x04, 0x03, 0x04, 0x00,
+ 0x2e, 0x0e, 0xf1, 0x07,
+ 0x34, 0xd0, 0x12, 0x50, 0x0e, 0xcf, 0xe3, 0xb3, 0xd2, 0xbf, 0xf0, 0x01,
+ 0x06, 0x03, 0xd3, 0xc1,
+ 0xff, 0xfe, 0x1f, 0x32, 0x06, 0x8e, 0xdf, 0x0e, 0xfc, 0xee, 0x0e, 0xde,
+ 0xf0, 0xd0, 0xfc, 0x0d,
+ 0xfe, 0xdc, 0xbb, 0xde, 0x11, 0x21, 0x0a, 0x1e, 0xce, 0xaf, 0xff, 0xdf,
+ 0x00, 0x00, 0x3a, 0x7f,
+ 0x6f, 0x01, 0x02, 0xef, 0x0e, 0x02, 0x1e, 0x0e, 0x15, 0x00, 0x0c, 0x2e,
+ 0x6d, 0x0d, 0x0d, 0xda,
+ 0xfe, 0xfd, 0x0d, 0x1c, 0x60, 0x20, 0x12, 0x02, 0x17, 0x22, 0x02, 0x10,
+ 0x00, 0xe0, 0x82, 0xc0,
+ 0xf2, 0xe4, 0x03, 0x13, 0x21, 0x03, 0xe7, 0x05, 0x12, 0x42, 0x21, 0x33,
+ 0x04, 0xa2, 0xe3, 0xd1,
+ 0xf3, 0xe4, 0xd5, 0xd2, 0xe2, 0xe3, 0x01, 0x13, 0x43, 0x63, 0x13, 0x04,
+ 0x07, 0x32, 0x52, 0x10,
+ 0x0f, 0x01, 0x00, 0x12, 0x45, 0x01, 0x12, 0x53, 0xe0, 0x9d, 0xf2, 0xf7,
+ 0x00, 0x0e, 0x30, 0x4f,
+ 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x2d, 0x3d, 0x6c, 0x2e, 0x3d, 0x3f, 0x4b,
+ 0x3f, 0x4c, 0x3e, 0x3f,
+ 0x0b, 0x30, 0x31, 0x30, 0x0b, 0xfd, 0x1e, 0x6c, 0x1e, 0x0d, 0xfc, 0x0f,
+ 0x1c, 0x4e, 0x73, 0x47,
+ 0x33, 0x10, 0x2e, 0x20, 0x33, 0x13, 0x00, 0xee, 0xb0, 0xfc, 0x0e, 0xcc,
+ 0xee, 0x00, 0xee, 0xee,
+ 0x12, 0x71, 0x0f, 0x2c, 0xfe, 0xdd, 0x07, 0x07, 0xe0, 0xdf, 0xb0, 0xd2,
+ 0xb1, 0xe2, 0xd0, 0xc0,
+ 0xf1, 0x02, 0x55, 0x02, 0xf3, 0x02, 0x11, 0x01, 0x03, 0xe4, 0xc3, 0xf3,
+ 0xf3, 0xf0, 0xdc, 0xdf,
+ 0xb0, 0xc0, 0xde, 0xdc, 0x12, 0x1c, 0x2a, 0x30, 0x2f, 0x0b, 0x4f, 0x4f,
+ 0x10, 0x0b, 0xec, 0x70,
+ 0x2f, 0x2f, 0x40, 0x3d, 0x2c, 0x10, 0x30, 0xe0, 0xf3, 0x0e, 0xe8, 0x2e,
+ 0x4f, 0xf0, 0xee, 0x30,
+ 0x0d, 0xfb, 0x0d, 0x7c, 0x0e, 0xdf, 0x2c, 0x7e, 0x6e, 0x2f, 0x40, 0x33,
+ 0x0f, 0x0a, 0xdf, 0x1f,
+ 0x00, 0x1f, 0x0e, 0x9d, 0xeb, 0xfe, 0xd0, 0x0f, 0xef, 0xff, 0xf0, 0x12,
+ 0x40, 0x11, 0x2f, 0xd0,
+ 0x07, 0x24, 0xd0, 0xb3, 0xe0, 0x80, 0xd0, 0xd3, 0xc0, 0xcd, 0x00, 0x00,
+ 0x02, 0x11, 0xe7, 0xf7,
+ 0xf0, 0xf0, 0x00, 0xe0, 0x02, 0xf2, 0xc0, 0xe0, 0xf2, 0xf3, 0x9e, 0xd2,
+ 0xe7, 0xe5, 0xef, 0x00,
+ 0x21, 0xf3, 0xd3, 0xc2, 0xd0, 0xb2, 0xd2, 0xf0, 0xe2, 0xcf, 0xfd, 0x00,
+ 0x52, 0x2f, 0x2a, 0x10,
+ 0x00, 0xbf, 0x0e, 0x25, 0x34, 0x1f, 0x0e, 0x70, 0x21, 0x2e, 0x1a, 0x40,
+ 0x30, 0x0f, 0x0d, 0x2b,
+ 0x2f, 0x3e, 0x6f, 0x2f, 0x54, 0x23, 0x11, 0x13, 0x33, 0x1e, 0x0e, 0x02,
+ 0xf3, 0x0e, 0x2b, 0x20,
+ 0x0f, 0x0a, 0x0f, 0x70, 0x4e, 0x1d, 0x10, 0x10, 0x00, 0x47, 0x13, 0x2d,
+ 0x0c, 0x00, 0x03, 0xbe,
+ 0xdc, 0xc1, 0xe6, 0xe2, 0x04, 0x01, 0x31, 0x34, 0x13, 0x27, 0x01, 0xd1,
+ 0x12, 0x73, 0x73, 0x03,
+ 0x12, 0xf1, 0xd0, 0xd4, 0xc5, 0xd1, 0xd1, 0xe1, 0x12, 0x31, 0x00, 0x14,
+ 0xc5, 0xe1, 0xd0, 0xd0,
+ 0x11, 0x00, 0x90, 0xf0, 0x26, 0x41, 0x1f, 0x60, 0x20, 0x1f, 0xff, 0x01,
+ 0x15, 0x50, 0x03, 0x13,
+ 0x12, 0x13, 0x04, 0x13, 0x1e, 0xd9, 0xe0, 0xdf, 0xfe, 0xff, 0x2c, 0x7e,
+ 0x5e, 0x1b, 0x10, 0x40,
+ 0x20, 0x40, 0x2a, 0x7f, 0x10, 0x1f, 0x00, 0xf0, 0x0f, 0x1c, 0x1e, 0x1e,
+ 0x0c, 0xcd, 0x0f, 0x1e,
+ 0x4b, 0x4d, 0x3f, 0x20, 0x0c, 0x0e, 0x10, 0xfc, 0xcd, 0xfe, 0xec, 0x0d,
+ 0xee, 0xdf, 0xbd, 0xf9,
+ 0x0e, 0xfe, 0x8f, 0xee, 0xcd, 0xfd, 0x0a, 0x3f, 0x3e, 0x00, 0xdf, 0xcf,
+ 0xee, 0xee, 0x0d, 0xd0,
+ 0xfe, 0x00, 0xe3, 0x80, 0xf1, 0x03, 0x10, 0x1e, 0xe7, 0xb7, 0xd0, 0xec,
+ 0xe0, 0x22, 0x10, 0x1e,
+ 0x3d, 0x2e, 0x3b, 0xfd, 0xed, 0x2f, 0x5e, 0xee, 0xb0, 0xf2, 0x03, 0x2d,
+ 0xfe, 0x93, 0xc0, 0xc8,
+ 0x0f, 0x00, 0x0c, 0x28, 0x0f, 0xff, 0x1e, 0x4f, 0x30, 0x20, 0x40, 0x30,
+ 0x32, 0x22, 0x0f, 0x0f,
+ 0x36, 0xe2, 0x8f, 0xfe, 0xe0, 0xc0, 0xc0, 0xd2, 0xef, 0xa8, 0xfc, 0x00,
+ 0x52, 0x10, 0x0b, 0xef,
+ 0x00, 0x0e, 0xfd, 0xe0, 0x03, 0xf1, 0xfe, 0x0e, 0x00, 0xbd, 0xbc, 0xd0,
+ 0xd3, 0xe0, 0xde, 0x00,
+ 0xec, 0xdc, 0xf0, 0xd3, 0xb0, 0xf9, 0x0f, 0x2d, 0x0a, 0xbe, 0xde, 0xee,
+ 0xf0, 0x00, 0x0f, 0x0d,
+ 0x8e, 0xba, 0xee, 0xe0, 0xfd, 0xcc, 0xff, 0xf0, 0xee, 0xfd, 0xf9, 0x1f,
+ 0x0d, 0x0e, 0xcf, 0xf0,
+ 0x00, 0xe0, 0x02, 0x20, 0x32, 0xe2, 0x91, 0xe3, 0xed, 0xda, 0xfd, 0xca,
+ 0xbd, 0xde, 0xfd, 0xf9,
+ 0xfd, 0x1e, 0x3f, 0x0d, 0x00, 0xe3, 0xcf, 0xfc, 0x0f, 0x22, 0x12, 0xa0,
+ 0xe0, 0xe3, 0xff, 0xea,
+ 0xc0, 0xe3, 0xd4, 0xdf, 0xff, 0x63, 0x34, 0x00, 0xd2, 0xb4, 0xd3, 0xd0,
+ 0xf2, 0x23, 0x54, 0x24,
+ 0xf3, 0xb4, 0x03, 0x04, 0xe4, 0xc1, 0xd3, 0x01, 0x02, 0x13, 0x14, 0x12,
+ 0x53, 0x24, 0x55, 0x14,
+ 0x34, 0x01, 0x30, 0x31, 0x53, 0x34, 0x22, 0x41, 0x22, 0x00, 0xe2, 0xb0,
+ 0xf4, 0xd5, 0xe2, 0xe1,
+ 0x02, 0x00, 0x0f, 0x7e, 0x52, 0x26, 0x1f, 0x0e, 0x40, 0x33, 0x1d, 0x2a,
+ 0x61, 0x23, 0x11, 0x25,
+ 0x00, 0x20, 0x00, 0x20, 0x0f, 0x00, 0x0e, 0xff, 0x0b, 0x50, 0x52, 0x30,
+ 0x20, 0x27, 0x12, 0x03,
+ 0x11, 0x62, 0x24, 0x32, 0x10, 0x22, 0x46, 0x01, 0xf3, 0x00, 0x00, 0x01,
+ 0x3e, 0x2d, 0x51, 0x55,
+ 0x00, 0xdf, 0x02, 0xe7, 0x00, 0x0f, 0x61, 0x22, 0x10, 0x21, 0x35, 0x01,
+ 0x00, 0xd0, 0x16, 0x23,
+ 0xd0, 0xb1, 0xf1, 0x04, 0x12, 0x33, 0x33, 0x12, 0xc1, 0x04, 0x42, 0x12,
+ 0xe6, 0xd1, 0x01, 0x70,
+ 0x50, 0x32, 0x11, 0x0f, 0xfc, 0xd0, 0x20, 0x01, 0xec, 0xfd, 0x61, 0x23,
+ 0x30, 0x70, 0x2b, 0x1c,
+ 0x3d, 0x2f, 0x20, 0x2e, 0x3f, 0x1c, 0x1e, 0x0e, 0x00, 0x61, 0x17, 0x20,
+ 0x0e, 0x20, 0x4e, 0x0e,
+ 0x0e, 0x50, 0x2b, 0x6c, 0x2e, 0x1a, 0x0e, 0x0e, 0x0f, 0x3f, 0x3f, 0x4c,
+ 0x4d, 0x20, 0x3e, 0x1f,
+ 0x01, 0xe3, 0xdc, 0xfc, 0x00, 0x00, 0x0b, 0x40, 0x47, 0x02, 0xdf, 0xef,
+ 0xf1, 0x15, 0xe1, 0x81,
+ 0xe2, 0x11, 0x11, 0x35, 0xd1, 0x91, 0x02, 0x01, 0xd2, 0xd1, 0xc3, 0xd2,
+ 0xb5, 0xe3, 0xf2, 0xf1,
+ 0x01, 0xd0, 0xc0, 0xc3, 0xc4, 0x03, 0x33, 0x35, 0x02, 0xf2, 0xd3, 0x15,
+ 0x26, 0xb0, 0xde, 0xf3,
+ 0xd2, 0x81, 0xe3, 0xd3, 0xe0, 0xf1, 0xdf, 0xc0, 0xe5, 0xc2, 0xef, 0xe9,
+ 0x0f, 0xfd, 0xef, 0xde,
+ 0x0a, 0x5f, 0x20, 0x11, 0x14, 0x00, 0xfe, 0xfe, 0x30, 0x71, 0x71, 0x0d,
+ 0x18, 0x00, 0x1f, 0xff,
+ 0xde, 0x0d, 0x20, 0x1e, 0xfa, 0x10, 0x70, 0x12, 0x0f, 0x0d, 0x0f, 0x1e,
+ 0x10, 0x35, 0x01, 0x0b,
+ 0x0e, 0x1f, 0x10, 0xe0, 0x90, 0xc0, 0xdd, 0xe0, 0xfe, 0xa8, 0xfd, 0x00,
+ 0x00, 0x00, 0x0e, 0x0e,
+ 0xff, 0xee, 0xcf, 0xf3, 0x04, 0x01, 0xe1, 0xf3, 0xd5, 0xc3, 0xb3, 0xd5,
+ 0xa0, 0xe1, 0xf2, 0x04,
+ 0x04, 0x34, 0x11, 0x00, 0x00, 0x11, 0x16, 0xc0, 0xae, 0xe0, 0x05, 0x01,
+ 0x61, 0x00, 0x46, 0x00,
+ 0xf0, 0xd8, 0x63, 0x30, 0xd6, 0xda, 0xd1, 0x30, 0xc1, 0xe6, 0xad, 0x0c,
+ 0x00, 0x04, 0x11, 0xfd,
+ 0xec, 0xdd, 0xcc, 0xf1, 0xd1, 0x33, 0x74, 0x6f, 0x0f, 0x01, 0x07, 0x02,
+ 0xe2, 0x00, 0x3e, 0x40,
+ 0x10, 0xeb, 0xd0, 0xf0, 0x0e, 0xea, 0xe0, 0x10, 0x02, 0xe0, 0x4d, 0x71,
+ 0x51, 0x00, 0x00, 0x10,
+ 0x02, 0xf0, 0x20, 0x5f, 0x14, 0x23, 0x00, 0xf4, 0x05, 0x40, 0xfc, 0xee,
+ 0xf0, 0x04, 0x02, 0xd1,
+ 0xe2, 0x73, 0x38, 0x0d, 0x0f, 0x00, 0xe2, 0xd1, 0xef, 0x1f, 0x22, 0xe6,
+ 0xb2, 0xf0, 0x0e, 0xef,
+ 0x00, 0xe1, 0xb0, 0x9c, 0xef, 0x00, 0x27, 0x01, 0x10, 0x20, 0x40, 0x20,
+ 0x14, 0x35, 0xe1, 0xc0,
+ 0x0c, 0x00, 0xf3, 0xe4, 0x11, 0x3f, 0x7b, 0x4f, 0x1e, 0x10, 0xfd, 0xee,
+ 0x20, 0x71, 0x1d, 0x1e,
+ 0x11, 0x0f, 0xff, 0x05, 0x05, 0x01, 0x10, 0x70, 0x5f, 0x00, 0x22, 0x00,
+ 0xfd, 0x00, 0x14, 0x1b,
+ 0x0c, 0x11, 0x52, 0x4b, 0x3d, 0x20, 0x22, 0x57, 0x13, 0x0f, 0x10, 0x22,
+ 0x20, 0x0f, 0x31, 0x14,
+ 0x00, 0xee, 0x0d, 0xfa, 0x90, 0x00, 0xee, 0xfd, 0x00, 0x10, 0x70, 0x6f,
+ 0x0e, 0xf0, 0xff, 0xfd,
+ 0x06, 0x22, 0xf2, 0xe0, 0xdc, 0xc2, 0xe5, 0xf2, 0xb0, 0xee, 0xdc, 0xe0,
+ 0xc0, 0xda, 0xf0, 0xf0,
+ 0x00, 0x02, 0x24, 0x53, 0x2f, 0x3b, 0x1f, 0xfe, 0xd2, 0xc5, 0xcd, 0xcc,
+ 0xd0, 0x0e, 0xd0, 0xef,
+ 0xa0, 0xe3, 0xd2, 0xef, 0xdd, 0xd0, 0x02, 0xf3, 0xe1, 0xd5, 0x03, 0xf6,
+ 0x91, 0xf0, 0xe5, 0x24,
+ 0x61, 0x0f, 0x2f, 0x21, 0x00, 0x01, 0xcf, 0xed, 0xfc, 0xa8, 0xed, 0xd0,
+ 0x02, 0x0f, 0xef, 0x10,
+ 0x60, 0x0f, 0x32, 0xf7, 0xe0, 0x12, 0x21, 0x31, 0x22, 0x00, 0xf4, 0x00,
+ 0xed, 0xbe, 0xd6, 0xe3,
+ 0xb2, 0xee, 0xdf, 0x00, 0x70, 0x31, 0x01, 0xf1, 0xf0, 0xf8, 0xef, 0x00,
+ 0xce, 0xc0, 0xe0, 0xd0,
+ 0xe0, 0xa1, 0xdc, 0xfa, 0xff, 0x00, 0xe1, 0x00, 0xd0, 0x01, 0x33, 0x70,
+ 0x49, 0x1e, 0x20, 0x03,
+ 0x0e, 0x0d, 0xf0, 0xe0, 0xe0, 0xfb, 0x10, 0x64, 0x00, 0x02, 0xb2, 0xdb,
+ 0xed, 0xc0, 0x11, 0x45,
+ 0x4f, 0x19, 0x0f, 0x0f, 0x00, 0x2f, 0x00, 0x60, 0x30, 0x20, 0x20, 0x22,
+ 0x53, 0x22, 0x22, 0x54,
+ 0x00, 0xe0, 0x00, 0x07, 0x00, 0x00, 0xf1, 0x20, 0x12, 0x32, 0x20, 0x53,
+ 0x24, 0x12, 0x3f, 0x5d,
+ 0x54, 0x30, 0x3c, 0x11, 0x07, 0xf0, 0xdd, 0xf0, 0xe0, 0xe0, 0xcf, 0xd0,
+ 0x00, 0xfa, 0x40, 0x63,
+ 0x05, 0xf0, 0xe9, 0xf0, 0x0f, 0x00, 0xf1, 0xe2, 0xd1, 0xe0, 0x21, 0x20,
+ 0xdd, 0xa2, 0xd6, 0xb1,
+ 0xa0, 0xd0, 0xe0, 0xf0, 0xdf, 0xdf, 0xc0, 0xf0, 0xe3, 0xfe, 0xc8, 0xdc,
+ 0xcd, 0xfe, 0x01, 0x42,
+ 0x0c, 0x1c, 0x20, 0x14, 0xf3, 0xcf, 0xfd, 0x2d, 0x71, 0x74, 0xf1, 0xf0,
+ 0xfd, 0x0d, 0xf0, 0x00,
+ 0x0e, 0x0d, 0xf0, 0x00, 0x60, 0x21, 0x26, 0x37, 0x14, 0x0e, 0x0e, 0x02,
+ 0x32, 0x31, 0x32, 0x0e,
+ 0x0b, 0x0e, 0x05, 0x62, 0x0d, 0xeb, 0x0f, 0x00, 0x11, 0x51, 0x64, 0x31,
+ 0x30, 0x0e, 0x12, 0x02,
+ 0xd0, 0x05, 0x03, 0xe3, 0x0f, 0xb0, 0xf1, 0xc2, 0x00, 0x07, 0x41, 0x1f,
+ 0xde, 0xcf, 0xd0, 0xf1,
+ 0xe2, 0xe2, 0xba, 0xed, 0x00, 0xf0, 0xe0, 0xce, 0x9c, 0xcd, 0xdd, 0xff,
+ 0xd4, 0x04, 0xd0, 0x0e,
+ 0x00, 0xdc, 0xa1, 0xf4, 0xf0, 0x0f, 0x1d, 0x10, 0x15, 0xf1, 0xb0, 0xea,
+ 0xe0, 0x00, 0xe2, 0xd4,
+ 0xb0, 0xf0, 0xef, 0xdc, 0xce, 0xb0, 0xef, 0xdc, 0xeb, 0xde, 0xde, 0xd1,
+ 0x33, 0x7f, 0x2a, 0x30,
+ 0x22, 0x34, 0x10, 0x10, 0x20, 0x2e, 0x2f, 0x41, 0x15, 0x01, 0x20, 0x2f,
+ 0x3c, 0x3f, 0x2d, 0x20,
+ 0x32, 0x50, 0x7f, 0x70, 0x46, 0x27, 0x20, 0x01, 0x1f, 0x31, 0x11, 0x31,
+ 0x10, 0x00, 0x02, 0xf1,
+ 0xfe, 0x1e, 0x1d, 0x3b, 0x2f, 0x3e, 0x1f, 0x21, 0x64, 0x20, 0x20, 0x62,
+ 0x27, 0x23, 0x11, 0x12,
+ 0x0d, 0xdf, 0xd4, 0xc0, 0xcf, 0xeb, 0x24, 0x54, 0x01, 0xdf, 0xe0, 0xe1,
+ 0xff, 0xff, 0x00, 0x31,
+ 0x18, 0x0e, 0xde, 0xcf, 0xf0, 0x14, 0xd0, 0x9e, 0xfc, 0xe0, 0xf2, 0xb1,
+ 0xee, 0xfe, 0x10, 0x40,
+ 0xf3, 0xc0, 0xb8, 0xfc, 0xfe, 0xfe, 0x30, 0x74, 0x30, 0x20, 0x4f, 0x30,
+ 0x23, 0x13, 0x26, 0x11,
+ 0x51, 0x3f, 0x0c, 0x2f, 0x32, 0x10, 0xd8, 0xdf, 0x0f, 0x70, 0x10, 0x2e,
+ 0x40, 0x31, 0x40, 0x50,
+ 0x31, 0x25, 0x40, 0x30, 0x11, 0x23, 0x21, 0x10, 0x20, 0x1f, 0x20, 0x11,
+ 0x23, 0x00, 0x1e, 0x61,
+ 0x07, 0x04, 0x11, 0x4f, 0x7f, 0x20, 0x23, 0x22, 0x12, 0x19, 0x0d, 0xf0,
+ 0x04, 0xef, 0xdc, 0xf0,
+ 0xe0, 0xbf, 0xc0, 0x07, 0xc5, 0xdf, 0xdf, 0xf1, 0xe1, 0x02, 0x02, 0xf0,
+ 0x0f, 0x0f, 0x9c, 0xe0,
+ 0xf4, 0xdf, 0xdc, 0x12, 0x77, 0x02, 0x0f, 0xed, 0x00, 0xdf, 0xef, 0xcf,
+ 0xbd, 0xbc, 0xff, 0xe0,
+ 0x0f, 0xfd, 0xdb, 0x11, 0x22, 0x00, 0x00, 0x03, 0x03, 0x42, 0x43, 0x35,
+ 0x4e, 0xf8, 0x0e, 0xf1,
+ 0xf0, 0x00, 0x1d, 0x70, 0x23, 0x01, 0x01, 0x12, 0x61, 0x23, 0x32, 0x30,
+ 0x1a, 0x0e, 0xf0, 0xf2,
+ 0xe0, 0xe4, 0x73, 0x5a, 0x2f, 0x12, 0xe1, 0xed, 0x0e, 0xe0, 0x05, 0x01,
+ 0x00, 0x02, 0x71, 0x10,
+ 0x1c, 0xe0, 0xd2, 0xb2, 0x0d, 0xfc, 0xdd, 0xb8, 0xf0, 0xc0, 0xc2, 0xe0,
+ 0xe2, 0xf7, 0xe3, 0xd0,
+ 0xe0, 0xef, 0x00, 0x00, 0xf5, 0x02, 0x9a, 0xed, 0xf0, 0xef, 0xe0, 0xc0,
+ 0xcd, 0xdf, 0xf0, 0x05,
+ 0x02, 0xbf, 0xbe, 0xe1, 0xd4, 0xc2, 0xd0, 0xce, 0x0f, 0xec, 0xdf, 0xff,
+ 0xe3, 0xd2, 0xef, 0xd0,
+ 0xe0, 0xd0, 0xd7, 0xc7, 0x00, 0xff, 0x0e, 0x0f, 0x00, 0x81, 0xe0, 0xee,
+ 0xeb, 0xcf, 0xed, 0xc0,
+ 0xd0, 0xef, 0x0c, 0x50, 0x32, 0xf0, 0xd0, 0x05, 0xf5, 0x11, 0x30, 0x02,
+ 0x22, 0x51, 0x02, 0x24,
+ 0x12, 0xe0, 0xda, 0x9f, 0xf0, 0x02, 0xf2, 0x00, 0x03, 0xd0, 0x10, 0x0f,
+ 0xe1, 0x91, 0xed, 0xe8,
+ 0x0f, 0xdc, 0xdf, 0xe1, 0xf5, 0xd0, 0x9d, 0x11, 0x26, 0xf0, 0xdf, 0xe1,
+ 0x13, 0x70, 0x40, 0x1d,
+ 0x0e, 0xce, 0xee, 0xf0, 0xf0, 0x0e, 0xf5, 0xf2, 0x2c, 0x7e, 0x23, 0x06,
+ 0x01, 0xf0, 0x0e, 0x2f,
+ 0x2e, 0xed, 0xbe, 0x0a, 0x1d, 0x4c, 0x1f, 0x0c, 0xee, 0x1e, 0x20, 0x50,
+ 0x52, 0x27, 0x24, 0x11,
+ 0x40, 0x4e, 0x31, 0x42, 0x00, 0xf2, 0xf0, 0x0c, 0x00, 0x44, 0x44, 0x3d,
+ 0x5b, 0x21, 0x10, 0x32,
+ 0x51, 0x21, 0x20, 0x2e, 0x50, 0x20, 0x34, 0x10, 0x1e, 0x3c, 0x0d, 0x1e,
+ 0x01, 0x37, 0x00, 0x2d,
+ 0x3f, 0x7f, 0x52, 0x15, 0x30, 0x2f, 0x1e, 0x10, 0x43, 0x32, 0x20, 0x33,
+ 0x10, 0x4e, 0x06, 0xf3,
+ 0xbf, 0xe0, 0xc6, 0xf4, 0xf1, 0xe0, 0x0d, 0x0d, 0x2e, 0x00, 0xe2, 0xd3,
+ 0xd8, 0xed, 0x2d, 0x2f,
+ 0x7f, 0x51, 0x20, 0x21, 0x34, 0x51, 0x02, 0x0b, 0xff, 0x02, 0x01, 0x0f,
+ 0xfe, 0xeb, 0xfb, 0xef,
+ 0x0e, 0xde, 0xee, 0x50, 0x71, 0x11, 0x00, 0x27, 0x36, 0x51, 0x20, 0x40,
+ 0x31, 0xf0, 0xe0, 0xfe,
+ 0xef, 0xff, 0x20, 0x70, 0x1f, 0x3e, 0x0e, 0x1e, 0x4d, 0x1e, 0x13, 0x26,
+ 0x41, 0x30, 0x71, 0x11,
+ 0x12, 0x26, 0x14, 0x23, 0x02, 0x00, 0x10, 0x43, 0x21, 0x1d, 0xfb, 0x05,
+ 0x37, 0x61, 0x00, 0x0c,
+ 0x1f, 0x20, 0x10, 0x11, 0x10, 0x0d, 0xd0, 0xe0, 0xbf, 0xcf, 0xbf, 0xd2,
+ 0xc0, 0xf1, 0xf5, 0xe0,
+ 0xfe, 0xe1, 0x03, 0x00, 0x20, 0x34, 0xbc, 0xba, 0x00, 0x1f, 0x10, 0xd4,
+ 0xc6, 0xf0, 0xe0, 0xde,
+ 0xe0, 0xc0, 0xb2, 0xc0, 0xcd, 0xcd, 0xe0, 0xe9, 0xed, 0xed, 0xc0, 0xed,
+ 0xff, 0xfe, 0xef, 0xe0,
+ 0xe3, 0x04, 0x10, 0x51, 0x25, 0x00, 0x9e, 0x0e, 0xe1, 0x0e, 0xc0, 0xe0,
+ 0xf0, 0x00, 0x0d, 0x20,
+ 0x21, 0xed, 0x0b, 0x04, 0x37, 0x45, 0x41, 0x2e, 0x40, 0x51, 0x11, 0x14,
+ 0xf1, 0x00, 0x00, 0x0d,
+ 0x04, 0x42, 0xf0, 0xfd, 0xfd, 0x1b, 0x1f, 0x01, 0xf6, 0x13, 0xff, 0xbf,
+ 0x20, 0x71, 0x22, 0x23,
+ 0x43, 0x0d, 0xa9, 0xf2, 0xe7, 0xe1, 0xff, 0xfe, 0xf3, 0xf6, 0xf0, 0xa0,
+ 0xed, 0xcf, 0xe0, 0xd1,
+ 0xd2, 0xe0, 0xfd, 0x00, 0x0e, 0xfd, 0xcf, 0x05, 0xe4, 0xef, 0x00, 0xef,
+ 0x9e, 0xc0, 0xc1, 0xe3,
+ 0xcf, 0xfc, 0xfc, 0xec, 0xdd, 0xcc, 0xee, 0xcf, 0xe0, 0x27, 0x74, 0x1f,
+ 0x0a, 0x10, 0x00, 0x02,
+ 0xe1, 0xe0, 0x01, 0xed, 0xbe, 0xde, 0xff, 0xe0, 0xee, 0xde, 0x00, 0x4f,
+ 0x2a, 0x1e, 0x00, 0x01,
+ 0x14, 0x20, 0x2f, 0x2d, 0x60, 0x47, 0x12, 0xf0, 0xfe, 0x20, 0x51, 0x21,
+ 0x10, 0x22, 0x07, 0x02,
+ 0xe0, 0x3f, 0x42, 0xf0, 0x32, 0x70, 0x7a, 0x5f, 0x10, 0x03, 0x1e, 0x0a,
+ 0x0f, 0x10, 0x0e, 0xe0,
+ 0xf2, 0xe2, 0xf0, 0x03, 0xe7, 0xc5, 0xd0, 0xde, 0x01, 0xe1, 0xb1, 0xb0,
+ 0xe1, 0xf1, 0x0f, 0x0e,
+ 0x30, 0x51, 0x14, 0x20, 0x12, 0x03, 0x00, 0xf7, 0x13, 0xff, 0xbc, 0xd0,
+ 0xde, 0xe0, 0xed, 0x8f,
+ 0xdc, 0xd0, 0xdc, 0x0e, 0x1f, 0x6e, 0x0a, 0x2f, 0x14, 0x33, 0x00, 0x0f,
+ 0x00, 0x0d, 0x10, 0x54,
+ 0x14, 0x1f, 0x1b, 0x40, 0x03, 0x0f, 0xce, 0x0e, 0x3d, 0x70, 0x0d, 0x20,
+ 0x14, 0x1f, 0x29, 0x0e,
+ 0x1d, 0x02, 0x25, 0x21, 0x7f, 0x5f, 0x2f, 0x2f, 0x30, 0x02, 0x11, 0x05,
+ 0x37, 0x21, 0x10, 0x2e,
+ 0x1d, 0x4f, 0x20, 0x00, 0xef, 0xce, 0x0d, 0x00, 0x0b, 0xf0, 0x26, 0x53,
+ 0x02, 0x50, 0x1f, 0xd0,
+ 0xa1, 0x01, 0xe2, 0xd0, 0xee, 0xec, 0xdc, 0xdd, 0x0d, 0x7f, 0x20, 0xfc,
+ 0x0d, 0x02, 0x07, 0xe3,
+ 0xa2, 0xf2, 0x03, 0xf1, 0xff, 0xdb, 0xa0, 0xc2, 0xb1, 0xe1, 0xe0, 0xeb,
+ 0xfd, 0xf1, 0x07, 0x05,
+ 0xb0, 0x0e, 0xff, 0x00, 0x00, 0xd1, 0x02, 0xe0, 0x10, 0x10, 0xf9, 0xd0,
+ 0xee, 0x80, 0xef, 0xef,
+ 0xe1, 0xe1, 0x0d, 0xf9, 0x00, 0xf0, 0x01, 0x24, 0x00, 0x0d, 0xef, 0x30,
+ 0x54, 0x32, 0x71, 0x2f,
+ 0x2f, 0x53, 0x17, 0xf0, 0xf2, 0x01, 0xe0, 0xfe, 0xe0, 0x14, 0xf1, 0x8d,
+ 0xff, 0x00, 0x1f, 0x3a,
+ 0x0f, 0x30, 0x1e, 0x3c, 0x63, 0x23, 0x20, 0x4e, 0x23, 0x14, 0x13, 0xe0,
+ 0xac, 0xea, 0xf0, 0xe1,
+ 0x00, 0x20, 0x1c, 0x6e, 0x00, 0x31, 0x14, 0xf0, 0x04, 0x10, 0x60, 0x21,
+ 0x14, 0x22, 0x00, 0xfb,
+ 0xff, 0x00, 0xe0, 0xca, 0xda, 0xfe, 0x10, 0x0f, 0x60, 0x40, 0x00, 0x10,
+ 0x10, 0x10, 0x01, 0x05,
+ 0x11, 0xf1, 0x02, 0x62, 0x51, 0x32, 0x00, 0xe4, 0x00, 0x28, 0x30, 0x31,
+ 0x25, 0x4f, 0x4d, 0x4f,
+ 0x11, 0x01, 0xf1, 0x00, 0x1f, 0x5e, 0x40, 0x21, 0x21, 0x3e, 0x0e, 0xbd,
+ 0x0d, 0x00, 0x04, 0x0e,
+ 0x0a, 0x20, 0x75, 0x22, 0x11, 0x1f, 0x6e, 0x11, 0x11, 0x12, 0x01, 0x00,
+ 0x40, 0x10, 0x00, 0x05,
+ 0x07, 0xd1, 0x04, 0x00, 0xff, 0x80, 0xd3, 0xdf, 0xcc, 0xdd, 0x00, 0x01,
+ 0x08, 0x0d, 0x1f, 0x20,
+ 0x1e, 0x20, 0x32, 0x75, 0x20, 0x21, 0x44, 0x00, 0x0e, 0xef, 0xfd, 0xec,
+ 0xff, 0xef, 0xb0, 0xdd,
+ 0xcc, 0x0f, 0x19, 0x50, 0x00, 0x15, 0x00, 0xef, 0x00, 0x54, 0x42, 0x02,
+ 0x1f, 0x1f, 0x02, 0x14,
+ 0xe1, 0x0f, 0x1c, 0x3d, 0x21, 0x10, 0x6f, 0x0d, 0xfb, 0xdd, 0x2f, 0x10,
+ 0xe4, 0xa3, 0x03, 0x51,
+ 0x40, 0x30, 0x47, 0x21, 0x01, 0xf0, 0x0f, 0x43, 0x33, 0xf3, 0xc2, 0xe1,
+ 0x00, 0x07, 0x37, 0x01,
+ 0xfe, 0xde, 0x0f, 0xe0, 0x80, 0xcd, 0xee, 0xf0, 0x0d, 0x0d, 0xff, 0xfe,
+ 0xa0, 0xf7, 0x07, 0xd1,
+ 0xc0, 0xc0, 0xfe, 0x00, 0xe1, 0xf0, 0xde, 0xef, 0xf0, 0xdf, 0xdf, 0xe0,
+ 0x0e, 0xc0, 0x07, 0x07,
+ 0xf0, 0xb0, 0xef, 0x00, 0x80, 0xde, 0xd0, 0xdd, 0xce, 0x0e, 0x00, 0xfd,
+ 0xaa, 0xee, 0xee, 0xe0,
+ 0xc0, 0xdf, 0xfe, 0x02, 0x45, 0x10, 0x0d, 0xd2, 0x04, 0x00, 0x0e, 0x0e,
+ 0xee, 0x03, 0x45, 0x30,
+ 0x3b, 0xf0, 0x07, 0x20, 0x11, 0x30, 0x70, 0x74, 0x21, 0x2f, 0x5c, 0x2f,
+ 0x20, 0x30, 0x33, 0x20,
+ 0x3a, 0x3f, 0x40, 0x20, 0xf2, 0x03, 0x23, 0x70, 0x1f, 0x45, 0x12, 0x1d,
+ 0x0e, 0x42, 0x20, 0x3c,
+ 0x0f, 0x10, 0x10, 0x50, 0x10, 0x02, 0x02, 0xf2, 0xe6, 0xd4, 0xd4, 0x03,
+ 0x12, 0xff, 0x2e, 0x30,
+ 0xd0, 0x8a, 0xbd, 0x1f, 0x1f, 0xfa, 0xf0, 0x01, 0xf4, 0x00, 0xe0, 0x3f,
+ 0x5f, 0x0f, 0xe3, 0xd4,
+ 0xe0, 0xdd, 0x4a, 0x70, 0x5e, 0xfb, 0x0e, 0x00, 0x00, 0x11, 0x02, 0x14,
+ 0xfe, 0xcc, 0xe1, 0xf0,
+ 0xff, 0x2d, 0x4f, 0x40, 0x0e, 0xde, 0x2d, 0x74, 0x45, 0x2c, 0x0f, 0x20,
+ 0x03, 0x00, 0xdc, 0xfb,
+ 0x0f, 0x0e, 0x00, 0x41, 0x24, 0x5d, 0x6e, 0x42, 0x12, 0x1f, 0x02, 0x07,
+ 0x04, 0x01, 0x11, 0x35,
+ 0x40, 0x3d, 0x6e, 0x21, 0x13, 0x30, 0x2e, 0x2d, 0x44, 0x22, 0x5d, 0x2a,
+ 0x2c, 0x0d, 0x0f, 0x11,
+ 0x05, 0xd0, 0xc3, 0xf4, 0x01, 0xc0, 0xd3, 0xf5, 0xe0, 0xee, 0x0f, 0xe0,
+ 0x83, 0xf0, 0xdd, 0xfb,
+ 0x00, 0x32, 0x53, 0x05, 0x01, 0xf0, 0xf5, 0x02, 0xf1, 0xd0, 0xe0, 0xcd,
+ 0xfc, 0x00, 0x00, 0x90,
+ 0xcc, 0xbe, 0xfc, 0xea, 0x0e, 0x00, 0xe1, 0xf1, 0x0e, 0x0e, 0x11, 0x26,
+ 0x12, 0xff, 0xee, 0x60,
+ 0x64, 0x13, 0x0f, 0xfc, 0xe0, 0xf2, 0xd0, 0xdd, 0xba, 0xff, 0xee, 0xe0,
+ 0xf0, 0x04, 0x5f, 0x3f,
+ 0x40, 0x20, 0x1f, 0x13, 0x06, 0x10, 0x3c, 0x50, 0x00, 0xf3, 0xf1, 0x10,
+ 0x30, 0x30, 0x0f, 0x03,
+ 0xa7, 0xe0, 0xfc, 0x20, 0x53, 0x2f, 0x0e, 0x0c, 0xff, 0xd0, 0xd2, 0xc1,
+ 0x83, 0xe1, 0xe3, 0xd7,
+ 0xe4, 0xe1, 0xef, 0x1c, 0xff, 0xaf, 0xef, 0xdf, 0xec, 0xd8, 0xde, 0x00,
+ 0x11, 0xc0, 0x91, 0xf2,
+ 0xe2, 0x02, 0x00, 0x02, 0xe5, 0xc4, 0xe2, 0xb0, 0xfd, 0xd0, 0xb1, 0xe1,
+ 0xc0, 0xeb, 0xef, 0xdf,
+ 0xf0, 0xe0, 0xfc, 0xef, 0xef, 0xf4, 0xf4, 0x00, 0xdf, 0xbd, 0xe0, 0xd0,
+ 0xe2, 0xce, 0xb9, 0xdf,
+ 0xcc, 0xdf, 0xbe, 0xe0, 0xd3, 0xee, 0xdb, 0x00, 0x60, 0x11, 0x20, 0x0f,
+ 0x00, 0x01, 0x07, 0xd7,
+ 0x00, 0x00, 0xc1, 0xf0, 0xc1, 0xf3, 0xb2, 0xff, 0xec, 0xe3, 0xf6, 0xf1,
+ 0x1e, 0x2d, 0x3f, 0x61,
+ 0x11, 0x0f, 0xef, 0xfa, 0xf0, 0x41, 0x42, 0x0e, 0xef, 0x01, 0x04, 0x02,
+ 0xf1, 0xc0, 0xdf, 0xbf,
+ 0xde, 0xec, 0xf0, 0x0b, 0xf0, 0xf1, 0xf1, 0xe5, 0xd2, 0xef, 0x0f, 0x20,
+ 0x73, 0x77, 0x41, 0x00,
+ 0x1f, 0x1d, 0x1a, 0x00, 0xf3, 0x5f, 0x08, 0xbf, 0x00, 0x30, 0x0e, 0xb0,
+ 0x00, 0x12, 0x10, 0x0e,
+ 0x10, 0x50, 0x12, 0x13, 0x24, 0x30, 0x41, 0x30, 0x33, 0x23, 0x1d, 0x1c,
+ 0x27, 0x02, 0xf0, 0x0d,
+ 0x41, 0x11, 0x0d, 0x5f, 0x40, 0x32, 0x3b, 0x5b, 0x1f, 0x20, 0x1f, 0x2f,
+ 0x2f, 0x6f, 0x00, 0x15,
+ 0x11, 0x30, 0x0f, 0x60, 0x37, 0x33, 0x30, 0x3e, 0x40, 0x60, 0x13, 0x24,
+ 0x11, 0x0f, 0x2e, 0x12,
+ 0x02, 0x19, 0x1f, 0x20, 0x20, 0x06, 0x0f, 0xfd, 0x02, 0x02, 0xfe, 0xcd,
+ 0xff, 0xf0, 0x20, 0x11,
+ 0x1c, 0x2a, 0x52, 0x36, 0x5e, 0x2e, 0x30, 0x40, 0x4f, 0x20, 0x25, 0x40,
+ 0x1a, 0x1f, 0x30, 0xf1,
+ 0xef, 0xee, 0x21, 0x52, 0x0f, 0xde, 0x12, 0x20, 0x0f, 0x7e, 0x61, 0x14,
+ 0x23, 0x27, 0x52, 0x4f,
+ 0x3d, 0x3f, 0x2f, 0x02, 0x11, 0x00, 0xf0, 0x0f, 0x1e, 0x6f, 0x01, 0x01,
+ 0x15, 0x00, 0x22, 0x00,
+ 0x6c, 0x3a, 0xd7, 0xea, 0x3f, 0x3a, 0x54, 0xee, 0x4d, 0xbc, 0xf4, 0x74,
+ 0x30, 0x30, 0x04, 0x17,
+ 0x23, 0xe0, 0x2b, 0x60, 0x12, 0xc4, 0x80, 0xe1, 0xe1, 0x00, 0x00, 0xd0,
+ 0x07, 0x02, 0x00, 0x4d,
+ 0x3f, 0xf1, 0xd1, 0xc0, 0x0e, 0xe0, 0x11, 0x5e, 0x3e, 0x10, 0xbc, 0xed,
+ 0x05, 0x04, 0x10, 0x40,
+ 0x42, 0x10, 0xfe, 0xc5, 0xf3, 0xf0, 0xc9, 0xe0, 0xfe, 0x0f, 0x3e, 0x4c,
+ 0x6f, 0x10, 0x15, 0x03,
+ 0x00, 0xf0, 0xfb, 0x00, 0x00, 0xe1, 0xd1, 0xcf, 0xde, 0x0b, 0x0e, 0x40,
+ 0x4e, 0xfb, 0xbd, 0xed,
+ 0x12, 0x3f, 0x0e, 0x70, 0x55, 0x1f, 0x1d, 0x30, 0x03, 0xf7, 0x02, 0x10,
+ 0xff, 0xef, 0xfe, 0x00,
+ 0x45, 0x01, 0x7e, 0x4f, 0xee, 0xb0, 0x00, 0x10, 0x01, 0xef, 0x04, 0x52,
+ 0x0d, 0x0b, 0xf1, 0xf6,
+ 0xf0, 0xdf, 0xf0, 0x03, 0x20, 0x04, 0xd5, 0xe3, 0xf2, 0xdd, 0xde, 0x01,
+ 0x54, 0xf4, 0xae, 0xfa,
+ 0x0f, 0x10, 0x31, 0x05, 0x00, 0xf2, 0xd0, 0xf2, 0xf1, 0x51, 0x00, 0x80,
+ 0xd1, 0xf0, 0x08, 0xff,
+ 0xef, 0x01, 0xd0, 0xff, 0x1d, 0x50, 0x30, 0x63, 0x31, 0x30, 0x20, 0x2d,
+ 0x23, 0x07, 0xe0, 0xc0,
+ 0x10, 0xf1, 0x90, 0x0b, 0x1e, 0x1f, 0xe0, 0xbf, 0xda, 0xf0, 0x00, 0x2d,
+ 0x4b, 0x40, 0x55, 0x00,
+ 0x20, 0x2f, 0x0e, 0x1f, 0x00, 0x00, 0xaf, 0x0e, 0xf0, 0xef, 0x0b, 0x2f,
+ 0x0f, 0xdd, 0xda, 0x00,
+ 0x12, 0x13, 0x1e, 0x5d, 0x20, 0x03, 0xd5, 0x02, 0x2f, 0x09, 0x10, 0x23,
+ 0x74, 0x40, 0x10, 0x1f,
+ 0x0f, 0xd0, 0xf1, 0x81, 0xfe, 0xfd, 0x02, 0x04, 0x00, 0x2b, 0x0e, 0xd0,
+ 0xf2, 0xe7, 0x02, 0xb0,
+ 0xce, 0xd0, 0xc2, 0xd1, 0x15, 0x02, 0xa0, 0xff, 0x00, 0x20, 0x32, 0x27,
+ 0x21, 0xd0, 0x0f, 0x72,
+ 0x30, 0x2f, 0xe0, 0x01, 0x14, 0x00, 0x14, 0x02, 0x01, 0xdb, 0xc0, 0xf2,
+ 0x01, 0x1f, 0xdb, 0x00,
+ 0x1f, 0xfd, 0xf9, 0xcf, 0x40, 0x70, 0x71, 0x10, 0x2f, 0x40, 0x00, 0x0f,
+ 0x01, 0x05, 0xe3, 0xd2,
+ 0xff, 0xec, 0x0b, 0x5f, 0x0e, 0x00, 0xb0, 0xe2, 0xee, 0x0e, 0x40, 0x2e,
+ 0x2c, 0x4e, 0x4e, 0x2c,
+ 0x30, 0x22, 0x00, 0xd9, 0xd1, 0xd2, 0xcf, 0x0a, 0x20, 0x41, 0xb0, 0xb0,
+ 0xf2, 0xe6, 0xe0, 0x0f,
+ 0x0e, 0x00, 0x00, 0xd0, 0xe1, 0x04, 0x03, 0x1f, 0x2e, 0xa5, 0xe3, 0xcd,
+ 0xfe, 0xc0, 0xd0, 0xf6,
+ 0x16, 0xf0, 0xdd, 0xee, 0x20, 0x60, 0x0f, 0x3e, 0x2d, 0x1f, 0x40, 0x20,
+ 0x30, 0xe4, 0xc5, 0x01,
+ 0x07, 0xf2, 0x12, 0x20, 0x00, 0x21, 0x73, 0x30, 0x0d, 0xee, 0x9b, 0xf0,
+ 0xc0, 0xb2, 0xfe, 0xfd,
+ 0x40, 0x30, 0x2c, 0x2f, 0xf3, 0xf6, 0x00, 0x1c, 0x3f, 0xe1, 0xd0, 0x2a,
+ 0x60, 0x3e, 0x40, 0x40,
+ 0x10, 0x3e, 0x1a, 0x1f, 0x7f, 0x40, 0x05, 0xa0, 0x02, 0x3f, 0x00, 0xc1,
+ 0x00, 0x3d, 0xef, 0xf3,
+ 0x03, 0x2c, 0x0f, 0xd6, 0x03, 0xf0, 0xd0, 0xe3, 0x13, 0x74, 0x10, 0x0e,
+ 0x0c, 0x21, 0x02, 0xec,
+ 0xfa, 0x2e, 0x2f, 0xf1, 0xe2, 0xe3, 0xde, 0x0e, 0xa3, 0xa7, 0xf2, 0xcf,
+ 0xbe, 0xf0, 0xe3, 0x0f,
+ 0xe0, 0xf5, 0x11, 0x50, 0x2c, 0x32, 0x31, 0x0f, 0xf2, 0x03, 0x05, 0x03,
+ 0x44, 0x30, 0x2b, 0xfc,
+ 0xf0, 0x00, 0xf0, 0xb0, 0xcc, 0xbd, 0xeb, 0xbe, 0xfe, 0xf0, 0x20, 0x50,
+ 0x28, 0x10, 0x00, 0xf0,
+ 0x24, 0x21, 0x20, 0x12, 0x42, 0xf0, 0xae, 0x0c, 0xf0, 0x01, 0xe4, 0xe2,
+ 0xf2, 0x0e, 0xfc, 0x41,
+ 0x51, 0xf0, 0xdd, 0x1d, 0xfe, 0xee, 0x08, 0x1d, 0xfe, 0x5f, 0x6f, 0x1c,
+ 0x10, 0x33, 0x27, 0x03,
+ 0x0f, 0x0f, 0x43, 0x02, 0x04, 0xc2, 0xef, 0x0e, 0x20, 0xff, 0xae, 0xea,
+ 0xdf, 0x00, 0xc2, 0xe1,
+ 0xd2, 0xf2, 0x01, 0x20, 0xc1, 0xa4, 0xf1, 0xcf, 0xee, 0x02, 0x3e, 0x18,
+ 0x01, 0x03, 0x7d, 0x3f,
+ 0x00, 0xeb, 0xee, 0x0e, 0x00, 0x33, 0x30, 0x21, 0x57, 0x13, 0x2f, 0xec,
+ 0xe0, 0x0f, 0xdf, 0x1d,
+ 0x3e, 0xe3, 0xc1, 0xdf, 0xc4, 0x50, 0x6e, 0x10, 0x17, 0x14, 0xcb, 0xcd,
+ 0x10, 0x40, 0x11, 0x00,
+ 0xef, 0xf0, 0xed, 0xeb, 0xfe, 0x02, 0xf7, 0x03, 0x6f, 0x3e, 0x10, 0x02,
+ 0x01, 0x23, 0x4c, 0x3d,
+ 0x0d, 0x31, 0x02, 0x9e, 0xcb, 0xf3, 0x17, 0x03, 0xf1, 0x0f, 0x00, 0x02,
+ 0xc4, 0xe1, 0x01, 0x12,
+ 0xfd, 0xba, 0xef, 0xef, 0x1d, 0x7f, 0x21, 0x00, 0xd0, 0x10, 0x42, 0x37,
+ 0x12, 0x40, 0x11, 0xc0,
+ 0xc1, 0xd1, 0xd1, 0xa2, 0xfe, 0xfb, 0xff, 0xed, 0x0d, 0x3e, 0x1d, 0x3f,
+ 0x4f, 0x17, 0x07, 0x20,
+ 0x2f, 0x71, 0x36, 0x00, 0x10, 0x0d, 0xe1, 0xc1, 0xd1, 0xb0, 0xfd, 0xdd,
+ 0xfd, 0x2e, 0x6d, 0xfc,
+ 0xdb, 0x0f, 0x10, 0x53, 0x1f, 0x2b, 0x41, 0x20, 0x20, 0x00, 0x02, 0x05,
+ 0xf0, 0xef, 0x0c, 0x90,
+ 0x00, 0xf3, 0x00, 0x0c, 0x53, 0x23, 0x0f, 0x0d, 0x0e, 0x2f, 0x3f, 0x10,
+ 0x36, 0x00, 0xe8, 0x00,
+ 0x2f, 0x0f, 0xb0, 0xc4, 0xe4, 0xd3, 0xe0, 0xbd, 0x01, 0xf3, 0xe3, 0x03,
+ 0xde, 0xca, 0x0d, 0x5e,
+ 0x53, 0x33, 0x1d, 0x0c, 0x04, 0x46, 0x00, 0xb0, 0xce, 0xe2, 0xe7, 0xb2,
+ 0xcf, 0xfe, 0x0f, 0xef,
+ 0xee, 0x00, 0x22, 0x00, 0xed, 0x2d, 0x3e, 0x20, 0x42, 0x60, 0x53, 0x27,
+ 0x33, 0x03, 0x02, 0x02,
+ 0xd0, 0xde, 0xef, 0xbf, 0xce, 0xec, 0xf1, 0x04, 0xfd, 0x1a, 0x20, 0x2e,
+ 0x7b, 0x2f, 0x30, 0x20,
+ 0x1e, 0x1c, 0xf0, 0xef, 0x20, 0x3d, 0x0b, 0x0c, 0xbc, 0xff, 0xff, 0xb1,
+ 0xd4, 0x02, 0x10, 0x10,
+ 0x0f, 0xee, 0xf1, 0xf3, 0xae, 0x00, 0x60, 0x08, 0x08, 0x0f, 0x30, 0x32,
+ 0x2f, 0x20, 0x32, 0x13,
+ 0x20, 0x01, 0x10, 0x02, 0xf0, 0xe1, 0xa2, 0xc1, 0xca, 0xcd, 0xfe, 0xcf,
+ 0xff, 0x10, 0x52, 0x20,
+ 0x13, 0x07, 0xf6, 0xc0, 0xf2, 0xe2, 0xf2, 0x80, 0x0d, 0xf3, 0xf0, 0x00,
+ 0x0d, 0x00, 0x01, 0x0f,
+ 0xc0, 0xe1, 0xf1, 0x47, 0x57, 0xc1, 0x30, 0x41, 0x00, 0xc1, 0x02, 0x2e,
+ 0x1b, 0xf0, 0xe1, 0x01,
+ 0xfd, 0xea, 0x00, 0xf0, 0x44, 0x31, 0x3f, 0x0e, 0x40, 0x20, 0x04, 0x0e,
+ 0x2e, 0xf0, 0xe1, 0x71,
+ 0x0f, 0x98, 0x00, 0x3f, 0xf0, 0xe0, 0x10, 0x40, 0x02, 0xd0, 0x2f, 0x40,
+ 0x00, 0xff, 0x01, 0x4c,
+ 0x4a, 0x0c, 0xdb, 0x0f, 0xff, 0x0d, 0x3d, 0x40, 0x24, 0xd1, 0xd0, 0x34,
+ 0x02, 0x00, 0x10, 0x82,
+ 0xa0, 0xf0, 0xe6, 0x03, 0xff, 0xec, 0x11, 0x15, 0x20, 0xf0, 0x21, 0x42,
+ 0xff, 0xdf, 0xff, 0x02,
+ 0x14, 0x1d, 0xe8, 0xaf, 0x00, 0x01, 0x8f, 0xef, 0xff, 0x10, 0x00, 0x12,
+ 0x0f, 0x0e, 0x36, 0x23,
+ 0x20, 0x30, 0x05, 0x02, 0x00, 0x61, 0x40, 0x12, 0x02, 0xd4, 0xe5, 0xe0,
+ 0xeb, 0xbe, 0x01, 0xd3,
+ 0x80, 0xbc, 0x02, 0x13, 0x01, 0x2f, 0x1c, 0xfd, 0xfe, 0x2e, 0x40, 0x0d,
+ 0x1d, 0x4f, 0x2f, 0x38,
+ 0x2e, 0x41, 0x27, 0x10, 0x00, 0x30, 0x00, 0xcf, 0xe0, 0x00, 0x2f, 0xef,
+ 0xce, 0x0d, 0xfe, 0x8a,
+ 0x0f, 0x3f, 0xe0, 0x85, 0x04, 0x43, 0x00, 0x0e, 0x11, 0x02, 0xf0, 0x0c,
+ 0x01, 0x01, 0x10, 0x29,
+ 0x2f, 0x71, 0x21, 0x00, 0xfe, 0xed, 0xc0, 0xf3, 0xe7, 0xe1, 0xe0, 0x01,
+ 0x02, 0x50, 0xff, 0xdf,
+ 0xbf, 0x00, 0xf7, 0x05, 0xfe, 0x0d, 0x20, 0x41, 0x15, 0x10, 0x20, 0x2e,
+ 0x40, 0x13, 0x00, 0xe0,
+ 0xd0, 0xce, 0x00, 0x06, 0xa0, 0xfd, 0xfc, 0xfe, 0xfe, 0x0e, 0x30, 0x21,
+ 0xe0, 0x0e, 0x70, 0x46,
+ 0xf0, 0x00, 0xfe, 0x01, 0x03, 0x71, 0x14, 0x07, 0xe2, 0xd1, 0x0f, 0x50,
+ 0x14, 0xc2, 0xc0, 0xdd,
+ 0xdd, 0xd0, 0xe0, 0x0d, 0x08, 0xdd, 0x2d, 0x7e, 0x4c, 0x2f, 0x20, 0x20,
+ 0x52, 0x4f, 0x34, 0x16,
+ 0x10, 0x0e, 0xe1, 0x04, 0xbf, 0xdc, 0xf1, 0x05, 0xf0, 0xe0, 0x3b, 0x60,
+ 0x00, 0xb0, 0x0e, 0x0f,
+ 0xe0, 0x00, 0x04, 0x10, 0xd1, 0xd2, 0x05, 0xe1, 0xd1, 0x02, 0x20, 0xa8,
+ 0xcf, 0xe0, 0xd0, 0xa0,
+ 0x0d, 0x00, 0x20, 0x2d, 0x2f, 0x30, 0x30, 0x22, 0x35, 0x31, 0x70, 0x20,
+ 0x10, 0x00, 0x00, 0x03,
+ 0x17, 0xc0, 0xde, 0x0c, 0x10, 0xf1, 0x82, 0xde, 0xff, 0x0b, 0x00, 0x22,
+ 0x00, 0x0d, 0x0d, 0x44,
+ 0x23, 0x2f, 0x1d, 0x4e, 0xf4, 0xe2, 0xf0, 0xe1, 0xb5, 0xa0, 0x04, 0x16,
+ 0x43, 0x10, 0x2f, 0x4e,
+ 0x20, 0x10, 0xe9, 0xdf, 0x01, 0xf2, 0x10, 0x30, 0x32, 0x11, 0xef, 0xb0,
+ 0xb0, 0xd0, 0xb5, 0xa4,
+ 0xe0, 0xe0, 0x0b, 0x2f, 0x3d, 0x50, 0x10, 0x00, 0x20, 0x00, 0x27, 0x03,
+ 0xc0, 0x0f, 0x00, 0x37,
+ 0x11, 0xe0, 0x9e, 0xef, 0xef, 0xfe, 0xf0, 0x00, 0x00, 0xdf, 0x11, 0x76,
+ 0xde, 0xee, 0x12, 0x23,
+ 0x3f, 0x1b, 0x2e, 0x30, 0x0f, 0xf2, 0x17, 0x70, 0x40, 0xdc, 0xe0, 0xf0,
+ 0xfc, 0xcc, 0xff, 0xf0,
+ 0x03, 0x01, 0xe0, 0xfa, 0x2e, 0x1f, 0xdf, 0x80, 0x0f, 0x02, 0x41, 0x3e,
+ 0x58, 0x20, 0x31, 0xe0,
+ 0xcd, 0x32, 0x34, 0x02, 0xe0, 0xe2, 0xe0, 0x30, 0x3f, 0x7e, 0x00, 0x7e,
+ 0x6f, 0xcd, 0x01, 0x43,
+ 0x0c, 0xed, 0xf4, 0x27, 0x06, 0xd1, 0xe1, 0x00, 0xf3, 0xf3, 0x00, 0x0a,
+ 0x2f, 0x70, 0x30, 0x02,
+ 0x04, 0x02, 0x01, 0x00, 0xf3, 0xd1, 0xa0, 0xf1, 0xd7, 0xd0, 0xdf, 0x10,
+ 0x0f, 0xe0, 0xfd, 0xdf,
+ 0x70, 0x1d, 0xfb, 0x00, 0x02, 0xfd, 0xda, 0x1f, 0x73, 0x03, 0x0c, 0xfe,
+ 0x11, 0x24, 0xe3, 0x07,
+ 0x52, 0x11, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x3b, 0xff, 0xf0,
+ 0x50, 0x0a, 0xff, 0x71,
+ 0x10, 0x00, 0x2f, 0x1d, 0x7f, 0x1e, 0x0b, 0xd0, 0x1e, 0x2e, 0xef, 0xbe,
+ 0xf0, 0xe1, 0xd2, 0xe1,
+ 0xdd, 0x0c, 0xd0, 0x00, 0xe0, 0xd0, 0x1b, 0x50, 0x64, 0x52, 0x2b, 0x3e,
+ 0x1f, 0x02, 0xf2, 0xf1,
+ 0xad, 0x00, 0x02, 0xf3, 0x07, 0xf3, 0x1a, 0x10, 0x41, 0x20, 0x20, 0x02,
+ 0xf0, 0xfe, 0x00, 0x40,
+ 0x0c, 0xac, 0xe5, 0xd5, 0xe1, 0xd2, 0x04, 0x02, 0xdf, 0xf0, 0x50, 0x10,
+ 0xd0, 0xd7, 0x05, 0x8f,
+ 0xdc, 0xd0, 0xc1, 0xe0, 0xf0, 0xf2, 0x11, 0x52, 0x10, 0x40, 0x31, 0x00,
+ 0x00, 0x40, 0x11, 0x11,
+ 0x37, 0x17, 0xd0, 0xcc, 0x3f, 0x11, 0x11, 0x03, 0x00, 0xe0, 0x1c, 0x4f,
+ 0x40, 0x72, 0x01, 0x0c,
+ 0x0e, 0xfe, 0x0d, 0xec, 0xe0, 0xb0, 0xe7, 0x04, 0x20, 0x7f, 0xfe, 0xff,
+ 0x20, 0x13, 0x0d, 0xcc,
+ 0x1f, 0x4d, 0x2d, 0x4c, 0x2b, 0x0d, 0xed, 0x20, 0x30, 0x02, 0xf0, 0x93,
+ 0xf4, 0xe0, 0xc2, 0xe6,
+ 0xf3, 0x00, 0xf0, 0x03, 0x30, 0x0e, 0xdf, 0x02, 0x26, 0x6f, 0x1e, 0x2f,
+ 0x13, 0x05, 0xaf, 0xf9,
+ 0x00, 0x00, 0xa0, 0xe0, 0x00, 0xd0, 0xec, 0xe1, 0x01, 0xaf, 0xdd, 0xe0,
+ 0xe1, 0xf2, 0x12, 0x0f,
+ 0x0f, 0x5f, 0x23, 0x66, 0x13, 0x15, 0x20, 0x31, 0x17, 0x22, 0xe0, 0xd3,
+ 0x07, 0x10, 0x80, 0xce,
+ 0x01, 0xd1, 0xf0, 0xcc, 0x0f, 0x0e, 0x01, 0x43, 0x3e, 0x6a, 0x1f, 0x1f,
+ 0x0e, 0x1f, 0x10, 0x20,
+ 0x2f, 0x2f, 0x25, 0x22, 0x01, 0xf0, 0xef, 0xdf, 0xc1, 0x00, 0xde, 0xab,
+ 0xea, 0x00, 0x6f, 0x1f,
+ 0x40, 0x1f, 0xef, 0xed, 0xe3, 0x06, 0x00, 0x2e, 0x20, 0x13, 0x25, 0x31,
+ 0xf3, 0x9f, 0x0b, 0x3f,
+ 0x7f, 0x10, 0x0f, 0xcf, 0x01, 0xf4, 0x02, 0xef, 0x00, 0x44, 0x10, 0x22,
+ 0x21, 0x00, 0xe0, 0x04,
+ 0xd5, 0xb0, 0xdd, 0xd0, 0xd0, 0x83, 0xe7, 0xd0, 0xfe, 0x06, 0x01, 0xe0,
+ 0x2e, 0x50, 0x21, 0x1f,
+ 0x10, 0x00, 0x2e, 0x0a, 0x12, 0x01, 0x0e, 0x0d, 0x0b, 0xce, 0xb0, 0xd0,
+ 0xc3, 0xf0, 0xf0, 0x2f,
+ 0x60, 0x70, 0x1c, 0x11, 0x27, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xc7,
+ 0xf4, 0xc0, 0xcc, 0xff,
+ 0xfe, 0xef, 0xdd, 0xeb, 0x01, 0x23, 0x7e, 0x1d, 0x3c, 0x4e, 0x2e, 0x20,
+ 0x2c, 0x0e, 0x0f, 0x02,
+ 0x57, 0x17, 0x0f, 0xde, 0x00, 0x00, 0xf1, 0xd1, 0xce, 0xdf, 0xef, 0x02,
+ 0x22, 0x6d, 0x11, 0x37,
+ 0x22, 0x2f, 0x40, 0x04, 0xe2, 0x82, 0x00, 0xdf, 0x0c, 0xf0, 0xc0, 0xf1,
+ 0xe0, 0xec, 0xae, 0x00,
+ 0xfe, 0x8f, 0xfd, 0x0f, 0x01, 0x1e, 0x08, 0x4c, 0x10, 0x00, 0x04, 0x32,
+ 0x01, 0x10, 0x50, 0x2e,
+ 0x02, 0xd1, 0xef, 0xf4, 0xe7, 0x02, 0xed, 0xdd, 0x02, 0x32, 0x50, 0x0d,
+ 0x0f, 0x37, 0x0f, 0xab,
+ 0x0e, 0x00, 0x0f, 0xe0, 0xf0, 0x60, 0x20, 0x4f, 0x22, 0x06, 0xe1, 0xf1,
+ 0xf2, 0x21, 0x43, 0x2e,
+ 0x2f, 0x13, 0xd3, 0xa0, 0xd5, 0xf0, 0x0c, 0x08, 0x1f, 0x30, 0x01, 0x80,
+ 0xe1, 0x00, 0x0e, 0x30,
+ 0xf3, 0xe5, 0xf0, 0xfd, 0xfe, 0x10, 0x01, 0x07, 0xf2, 0xb0, 0x0f, 0x2c,
+ 0x70, 0x04, 0x01, 0x41,
+ 0x11, 0x11, 0x30, 0x10, 0x17, 0xf4, 0x80, 0xdc, 0xfe, 0xe0, 0xe1, 0xd0,
+ 0xff, 0xe0, 0x00, 0x40,
+ 0x0d, 0xdf, 0x00, 0xd5, 0x53, 0x74, 0x0e, 0x1b, 0x00, 0x00, 0x1f, 0xde,
+ 0xfe, 0x00, 0x1f, 0x00,
+ 0x1e, 0xc0, 0x02, 0x57, 0x47, 0x0f, 0xed, 0x0f, 0xf0, 0xae, 0xdd, 0x0f,
+ 0x10, 0xff, 0x1d, 0x4c,
+ 0x4e, 0x7e, 0x20, 0x37, 0x02, 0x02, 0x10, 0x31, 0x44, 0x32, 0x0e, 0xcc,
+ 0xde, 0x00, 0xe5, 0xf0,
+ 0xed, 0xcd, 0xe1, 0x02, 0x4e, 0x1a, 0x30, 0x60, 0x20, 0x40, 0x32, 0x37,
+ 0x34, 0xe2, 0x90, 0xdb,
+ 0x00, 0x00, 0xe1, 0xb2, 0xd0, 0xcd, 0x01, 0x02, 0x15, 0x41, 0x02, 0xf1,
+ 0x10, 0x2d, 0x20, 0xcd,
+ 0xcf, 0xdc, 0xbf, 0x0f, 0xfd, 0x00, 0x0f, 0xdc, 0xcc, 0xff, 0x15, 0x57,
+ 0x02, 0x02, 0xde, 0xf0,
+ 0x17, 0x41, 0xff, 0xec, 0x00, 0x51, 0x12, 0x01, 0xf0, 0x00, 0xf0, 0x40,
+ 0x7f, 0x70, 0x32, 0xee,
+ 0xda, 0xf2, 0x01, 0x2d, 0x08, 0xff, 0xfe, 0x0e, 0x20, 0x20, 0x20, 0xae,
+ 0xfe, 0x00, 0x01, 0xf0,
+ 0x0c, 0x14, 0xc5, 0xe0, 0x0f, 0x31, 0x34, 0x5f, 0x1e, 0xee, 0x0d, 0x4b,
+ 0x7f, 0x20, 0xe1, 0xcd,
+ 0x0e, 0x00, 0x01, 0x3f, 0x2e, 0xfe, 0xec, 0xf2, 0xc4, 0xfb, 0x2b, 0x40,
+ 0x35, 0x20, 0xe0, 0xbd,
+ 0xd1, 0xe0, 0xe1, 0x22, 0x77, 0x64, 0x01, 0x00, 0x0e, 0x00, 0x04, 0xd5,
+ 0xe2, 0xf0, 0xee, 0x9e,
+ 0xf0, 0xd1, 0x00, 0xed, 0xc0, 0xe0, 0x03, 0xee, 0x09, 0x0f, 0x40, 0x43,
+ 0x45, 0x40, 0x1f, 0x01,
+ 0xf1, 0x01, 0xfe, 0x1e, 0x21, 0x17, 0x07, 0xaf, 0xfe, 0xff, 0x10, 0x32,
+ 0x20, 0x0f, 0xdf, 0x0f,
+ 0x1e, 0x1f, 0x2e, 0x00, 0x10, 0x17, 0xf0, 0x9f, 0xdb, 0xe0, 0xd2, 0x14,
+ 0x60, 0x1f, 0x4f, 0x30,
+ 0x2e, 0x5b, 0x00, 0x0d, 0xf0, 0x00, 0x3f, 0x3d, 0x6d, 0x0f, 0xe1, 0xe4,
+ 0x13, 0x43, 0x01, 0xdf,
+ 0xdd, 0xf2, 0x27, 0x37, 0x10, 0x02, 0xb0, 0xde, 0x0d, 0x10, 0x40, 0x1e,
+ 0xce, 0x10, 0x74, 0x41,
+ 0x0f, 0x1c, 0xfe, 0xb0, 0xe0, 0xe7, 0x01, 0xd0, 0xc0, 0xbd, 0xcf, 0xf0,
+ 0xdf, 0x0e, 0x0d, 0x0c,
+ 0x00, 0x57, 0x31, 0x02, 0x13, 0x34, 0x32, 0x43, 0x32, 0x02, 0xd0, 0xb0,
+ 0xe6, 0xe2, 0xf1, 0x00,
+ 0x02, 0xb0, 0xdc, 0xcf, 0x0f, 0x2c, 0x1d, 0x0f, 0x11, 0xff, 0x09, 0x3f,
+ 0x7f, 0x7e, 0x0f, 0xe0,
+ 0xf2, 0x10, 0x2e, 0x2b, 0x00, 0xd6, 0x03, 0x02, 0x00, 0x2b, 0x6f, 0x0f,
+ 0xed, 0x0d, 0x4f, 0x34,
+ 0xf2, 0xd1, 0x01, 0x30, 0x29, 0x0f, 0xde, 0xff, 0x00, 0x54, 0x02, 0x50,
+ 0x2b, 0xf0, 0xd0, 0x02,
+ 0x0f, 0x0d, 0x00, 0x0f, 0xde, 0x0e, 0x72, 0x75, 0x23, 0x20, 0x01, 0x01,
+ 0x17, 0x00, 0x32, 0x00,
+ 0x5d, 0xe9, 0xf2, 0xcd, 0xe9, 0xe0, 0x9c, 0xd0, 0x64, 0x00, 0xd7, 0x83,
+ 0xa0, 0x01, 0x03, 0x01,
+ 0x0e, 0xdc, 0xcf, 0xd0, 0xd0, 0xf2, 0x00, 0xdf, 0xd6, 0x14, 0x30, 0x00,
+ 0x00, 0x00, 0x1c, 0x3b,
+ 0x4e, 0x4f, 0x21, 0xf2, 0xd0, 0x3f, 0x70, 0x20, 0x40, 0x22, 0xf0, 0xcd,
+ 0xf3, 0x37, 0x77, 0x77,
+ 0x01, 0xe0, 0x0e, 0xff, 0x0f, 0x00, 0xf0, 0xd1, 0xfe, 0xed, 0xf2, 0xf1,
+ 0xcf, 0xed, 0x20, 0x2f,
+ 0x10, 0x41, 0x23, 0x2d, 0x2e, 0x64, 0x33, 0x2c, 0xf8, 0xff, 0xe0, 0xc0,
+ 0xfb, 0xfe, 0xe0, 0x0e,
+ 0x30, 0x42, 0x4d, 0x3d, 0x01, 0x02, 0xf1, 0xe1, 0x07, 0x42, 0xff, 0xcc,
+ 0x71, 0x30, 0x2f, 0xde,
+ 0xe7, 0x06, 0x00, 0x11, 0x60, 0x40, 0x4e, 0x10, 0x00, 0xc2, 0xff, 0xdd,
+ 0x8d, 0xcb, 0xef, 0xe0,
+ 0x00, 0x0c, 0x0e, 0x20, 0x11, 0x02, 0x12, 0x35, 0x51, 0x1f, 0x0d, 0xfd,
+ 0xd0, 0xf0, 0xf5, 0xf6,
+ 0xc0, 0xd1, 0xd0, 0x10, 0x70, 0x0e, 0x10, 0xf3, 0xf6, 0x01, 0x00, 0x2d,
+ 0x09, 0xdf, 0x3e, 0x70,
+ 0x30, 0x10, 0x03, 0xd1, 0xb1, 0x0d, 0x0e, 0x12, 0xe7, 0xc3, 0x02, 0x21,
+ 0x50, 0x33, 0x30, 0xfc,
+ 0xeb, 0x30, 0x70, 0x12, 0xf0, 0xce, 0xef, 0xe0, 0xf0, 0x1f, 0x31, 0x0f,
+ 0xdf, 0xe2, 0x14, 0x72,
+ 0x00, 0xe0, 0xd7, 0x02, 0x0d, 0x79, 0x40, 0x2e, 0x0e, 0xef, 0x13, 0x32,
+ 0x0f, 0x0f, 0x50, 0x22,
+ 0x30, 0x00, 0x27, 0x06, 0xa0, 0xd1, 0xc0, 0xdf, 0xfe, 0xee, 0xe0, 0xed,
+ 0xef, 0xf3, 0xf5, 0x0d,
+ 0x5d, 0x20, 0x06, 0xf4, 0x02, 0x70, 0x20, 0x1c, 0xf1, 0xe2, 0xef, 0x0c,
+ 0xf0, 0xe7, 0xd0, 0xce,
+ 0xfe, 0x00, 0xc2, 0xe0, 0x00, 0x1d, 0x3d, 0x0d, 0xa0, 0x00, 0x1d, 0x0c,
+ 0x4d, 0x70, 0x3d, 0x00,
+ 0xd1, 0xd7, 0x07, 0x03, 0x1e, 0x0d, 0xef, 0x03, 0x72, 0x3f, 0x5f, 0x0f,
+ 0xfe, 0xdd, 0x0a, 0x4f,
+ 0x4d, 0x0f, 0xc0, 0x01, 0x1e, 0x3d, 0x21, 0x35, 0x15, 0x02, 0xd4, 0xc2,
+ 0xd1, 0xf0, 0xf0, 0xce,
+ 0x00, 0x00, 0xcd, 0xaf, 0xfd, 0xdf, 0x10, 0x57, 0x57, 0x30, 0x2c, 0x22,
+ 0x23, 0x12, 0x00, 0xbf,
+ 0xe0, 0xd4, 0xe0, 0xcd, 0xc9, 0xcf, 0xff, 0xef, 0xf1, 0x02, 0x23, 0x1f,
+ 0xfe, 0xef, 0x24, 0x75,
+ 0x30, 0xff, 0x00, 0x1f, 0x3f, 0x5c, 0x31, 0x11, 0xee, 0xbe, 0x07, 0x27,
+ 0x00, 0xc0, 0x0f, 0x30,
+ 0x00, 0x10, 0xff, 0xfc, 0xee, 0xee, 0xf0, 0x44, 0x20, 0x0e, 0x00, 0x0e,
+ 0x1f, 0x40, 0x43, 0x67,
+ 0x00, 0xf1, 0x9e, 0xfe, 0xfd, 0x0e, 0x61, 0x01, 0x0f, 0x0f, 0xf2, 0x0b,
+ 0x0b, 0x6f, 0x00, 0x0e,
+ 0x00, 0x15, 0x01, 0xcd, 0xfd, 0xfd, 0x0d, 0x00, 0xd3, 0xf4, 0xdd, 0x0e,
+ 0xee, 0xfa, 0x20, 0x73,
+ 0x77, 0x06, 0x11, 0x20, 0x32, 0x30, 0x00, 0x01, 0xc3, 0xe0, 0xfe, 0x0e,
+ 0xd0, 0x8e, 0xcd, 0xff,
+ 0xf0, 0x04, 0x0f, 0x0e, 0x00, 0x2d, 0x09, 0x00, 0x30, 0x04, 0xe4, 0x03,
+ 0x0f, 0x1a, 0x1f, 0x21,
+ 0x03, 0xe0, 0xfe, 0x70, 0x64, 0x03, 0x02, 0xc1, 0x0f, 0xfe, 0x00, 0x10,
+ 0x0e, 0xff, 0xfe, 0x1f,
+ 0x2b, 0x1f, 0xf3, 0xf7, 0x17, 0x3f, 0x50, 0x3e, 0x0e, 0x80, 0x03, 0x10,
+ 0x2e, 0x10, 0x2f, 0x4c,
+ 0x3c, 0x0c, 0x2e, 0x00, 0x00, 0x01, 0x30, 0x30, 0xe6, 0xc2, 0xd1, 0x90,
+ 0xdc, 0xcd, 0x0d, 0x12,
+ 0x52, 0x00, 0xd3, 0x47, 0x10, 0x2a, 0x1f, 0x10, 0x20, 0x7f, 0x20, 0x31,
+ 0xfe, 0xae, 0x0f, 0xe2,
+ 0x06, 0xf0, 0xfe, 0xd1, 0xd1, 0xbb, 0xfd, 0xed, 0x10, 0x20, 0x23, 0x03,
+ 0xce, 0x10, 0x74, 0x04,
+ 0x01, 0x05, 0xd5, 0xd2, 0x02, 0xd3, 0x12, 0x21, 0x23, 0x14, 0xb1, 0x9e,
+ 0xef, 0x00, 0x1f, 0x31,
+ 0x13, 0x00, 0xfb, 0xe0, 0x3f, 0x5c, 0x2c, 0x00, 0xb4, 0xf2, 0xf0, 0xff,
+ 0x0a, 0x0f, 0xfe, 0xf1,
+ 0x04, 0xde, 0xed, 0x4f, 0x60, 0x10, 0x3d, 0x76, 0x14, 0x00, 0xeb, 0x00,
+ 0x0d, 0x0e, 0x40, 0x31,
+ 0x32, 0x0d, 0xb0, 0x07, 0x21, 0xec, 0xfc, 0x00, 0x01, 0x00, 0x0e, 0x1c,
+ 0xdd, 0xcc, 0xef, 0x11,
+ 0x14, 0x20, 0x3e, 0x2c, 0x7e, 0x7f, 0x41, 0x27, 0x02, 0x01, 0x00, 0x10,
+ 0x31, 0x21, 0xd3, 0xc3,
+ 0xa0, 0xf0, 0x05, 0x02, 0x01, 0xc0, 0xff, 0xe0, 0xf4, 0xa0, 0xe1, 0xfe,
+ 0xe9, 0xd0, 0xde, 0x00,
+ 0x0c, 0x0d, 0xed, 0xfb, 0x7f, 0x60, 0x20, 0x22, 0x17, 0x01, 0x00, 0x20,
+ 0x32, 0x00, 0xf5, 0xb4,
+ 0xe2, 0xc0, 0xff, 0xff, 0x0d, 0xdd, 0xde, 0x0d, 0x03, 0x07, 0xf0, 0x31,
+ 0x7f, 0x00, 0x1f, 0x12,
+ 0x02, 0xd0, 0xd4, 0xe1, 0x8d, 0x09, 0x0f, 0x1e, 0x0e, 0x30, 0x71, 0x20,
+ 0x0c, 0x1e, 0x10, 0x10,
+ 0x4e, 0x30, 0x2f, 0x0d, 0xc0, 0xcd, 0xf9, 0x0e, 0xcf, 0xd0, 0xbc, 0xf0,
+ 0x07, 0x31, 0x31, 0x73,
+ 0x31, 0x01, 0x12, 0x01, 0x23, 0x0e, 0xce, 0xe3, 0x07, 0xe1, 0xbe, 0x0d,
+ 0xe1, 0xf0, 0xfa, 0x0e,
+ 0x6d, 0x10, 0xf3, 0xe4, 0x00, 0x2d, 0x1a, 0xff, 0xc0, 0xfe, 0xcb, 0x00,
+ 0x00, 0xf1, 0xe0, 0xff,
+ 0x34, 0x56, 0x30, 0x11, 0x2f, 0x00, 0xd3, 0xe1, 0xc3, 0xe1, 0xee, 0xf9,
+ 0xff, 0xfd, 0x7f, 0x5c,
+ 0x1f, 0x00, 0xc0, 0xe4, 0x00, 0xf1, 0x00, 0x64, 0x22, 0x23, 0xe3, 0xe1,
+ 0xf0, 0xfd, 0x01, 0xe7,
+ 0x04, 0x22, 0x0e, 0xee, 0x21, 0x72, 0x1e, 0x4d, 0x23, 0x02, 0x8c, 0xf1,
+ 0x07, 0xf3, 0x00, 0xe0,
+ 0x00, 0xf0, 0xdb, 0x0e, 0x0f, 0x0a, 0x1f, 0x70, 0x50, 0x22, 0x1f, 0x3d,
+ 0x3f, 0x0f, 0xf0, 0x03,
+ 0x27, 0x26, 0xcf, 0xee, 0xf0, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x2f, 0xc0,
+ 0xbd, 0xe0, 0xde, 0xb0,
+ 0xd0, 0xf2, 0x37, 0x00, 0xca, 0xb0, 0xe1, 0x03, 0x23, 0x12, 0x33, 0x72,
+ 0x1e, 0x1a, 0x0f, 0x10,
+ 0x05, 0xd2, 0xcf, 0x0d, 0xfd, 0xe0, 0x0e, 0x0f, 0xfe, 0xf0, 0x11, 0x5c,
+ 0x4f, 0x1f, 0xd0, 0xf1,
+ 0x36, 0x76, 0x70, 0x00, 0xee, 0xf0, 0x00, 0x0f, 0xff, 0x00, 0x04, 0xcd,
+ 0xfb, 0x0f, 0x0e, 0x01,
+ 0x45, 0x40, 0x3c, 0x5f, 0x50, 0x15, 0x10, 0x03, 0xc3, 0x02, 0xe2, 0xfc,
+ 0xcc, 0xee, 0xd0, 0xbf,
+ 0xee, 0x02, 0x2f, 0x2d, 0x31, 0x77, 0x12, 0x12, 0x00, 0x31, 0x14, 0x2e,
+ 0x19, 0x0f, 0xe0, 0xc1,
+ 0x04, 0x00, 0xd0, 0xde, 0xdf, 0xbe, 0xc0, 0xef, 0xd0, 0xf5, 0xa0, 0xf1,
+ 0xd1, 0xef, 0xec, 0xec,
+ 0x30, 0x53, 0x22, 0x3e, 0x4a, 0x20, 0x5f, 0x0e, 0x11, 0xe6, 0xd1, 0x01,
+ 0x20, 0x0f, 0xef, 0xf0,
+ 0x12, 0x34, 0xe0, 0xbf, 0x00, 0x0c, 0x3b, 0x7f, 0x3e, 0x0d, 0x0f, 0x16,
+ 0x36, 0xf0, 0x0e, 0x00,
+ 0xa0, 0xe0, 0xd0, 0xff, 0x00, 0xcc, 0xdf, 0x20, 0x50, 0x01, 0x73, 0x30,
+ 0x28, 0x0e, 0x0f, 0x22,
+ 0x41, 0x1f, 0xfc, 0xdf, 0xbf, 0xce, 0xcd, 0xdd, 0xe1, 0xc0, 0x00, 0x0f,
+ 0x0a, 0x50, 0x22, 0x35,
+ 0x23, 0x57, 0x32, 0x21, 0x0f, 0x00, 0x02, 0xe1, 0xf2, 0xe6, 0xc0, 0xd0,
+ 0xdd, 0xe0, 0x03, 0x10,
+ 0x2f, 0x0c, 0xaf, 0xf0, 0xe4, 0x10, 0xff, 0xcf, 0xc0, 0xc3, 0xdb, 0xcd,
+ 0x0e, 0x2f, 0x51, 0x20,
+ 0x10, 0x03, 0xe7, 0x05, 0xfd, 0x0f, 0x10, 0x12, 0x20, 0x20, 0xe1, 0xa0,
+ 0x0d, 0x20, 0x37, 0x03,
+ 0xf0, 0xde, 0x0f, 0x0c, 0xed, 0xef, 0x0f, 0x72, 0x75, 0x23, 0x10, 0x0c,
+ 0xef, 0x0f, 0xe0, 0x02,
+ 0x42, 0x7e, 0x18, 0xec, 0xd0, 0x0e, 0x2f, 0x1f, 0x60, 0x35, 0xf0, 0xb0,
+ 0x0e, 0x00, 0x13, 0xe0,
+ 0xf3, 0x06, 0x2f, 0x0b, 0x20, 0x1f, 0xff, 0xb0, 0x02, 0x42, 0x60, 0x0f,
+ 0xf0, 0xe7, 0xf0, 0x12,
+ 0x30, 0xdf, 0xae, 0x00, 0x23, 0x2e, 0x2c, 0x1f, 0x2f, 0x0a, 0xeb, 0x4f,
+ 0x4e, 0x10, 0x02, 0xa5,
+ 0xd2, 0xc4, 0xc0, 0xd0, 0xf0, 0x02, 0xe2, 0x04, 0x11, 0xe0, 0xde, 0x0f,
+ 0x02, 0x12, 0x21, 0x11,
+ 0x72, 0x42, 0x42, 0x03, 0x01, 0xe4, 0xc0, 0xe1, 0xf4, 0xf0, 0x0e, 0x28,
+ 0xc8, 0xdf, 0xc0, 0x12,
+ 0x60, 0x5f, 0x40, 0x0c, 0x00, 0xff, 0x02, 0x14, 0x23, 0x00, 0xed, 0xed,
+ 0xfd, 0xfd, 0x00, 0x0e,
+ 0x51, 0x17, 0x16, 0x1e, 0x4d, 0x20, 0x21, 0x0f, 0x4e, 0x0d, 0x2d, 0x00,
+ 0xaf, 0xcf, 0xdf, 0xc8,
+ 0xdb, 0xe0, 0xff, 0x00, 0x0e, 0x40, 0x73, 0x10, 0x20, 0x21, 0x43, 0x47,
+ 0x32, 0x00, 0xef, 0xf0,
+ 0xe3, 0x05, 0x22, 0x10, 0x31, 0xf2, 0x91, 0xe0, 0xe2, 0xc0, 0xdf, 0x9f,
+ 0xf0, 0xf1, 0xfb, 0xeb,
+ 0xfc, 0x30, 0x3f, 0x0a, 0x3f, 0x40, 0x31, 0x10, 0x0e, 0x12, 0x27, 0xe2,
+ 0xf1, 0xe0, 0xd0, 0xb0,
+ 0x01, 0xf1, 0xd2, 0xd0, 0xc1, 0xb3, 0x00, 0x71, 0x45, 0x00, 0xfc, 0xdf,
+ 0x00, 0x3f, 0x0d, 0x00,
+ 0x07, 0xb5, 0x00, 0x02, 0x00, 0x1d, 0xff, 0xfe, 0x3f, 0x5d, 0x0f, 0xce,
+ 0x0d, 0x2c, 0x7e, 0x3d,
+ 0x2d, 0x0a, 0x0c, 0xde, 0x0f, 0x02, 0x45, 0x02, 0xbe, 0xfd, 0xfd, 0xec,
+ 0x0f, 0x3d, 0x42, 0xd2,
+ 0xa0, 0x03, 0x04, 0x30, 0x0b, 0x03, 0x17, 0x05, 0x0e, 0x0e, 0x41, 0x22,
+ 0x00, 0x00, 0xf0, 0x20,
+ 0x73, 0x21, 0xe0, 0x99, 0xff, 0x0e, 0x0e, 0xee, 0xf0, 0xe0, 0xf5, 0xb0,
+ 0xfd, 0xe0, 0x03, 0x12,
+ 0x0d, 0x0f, 0x20, 0x00, 0xd9, 0x41, 0x64, 0x23, 0x11, 0xdf, 0xad, 0xdd,
+ 0x0f, 0x13, 0x10, 0x1f,
+ 0x00, 0xef, 0x0b, 0x0d, 0x1c, 0x0e, 0xf0, 0x01, 0x14, 0x25, 0x54, 0x02,
+ 0xe1, 0x44, 0x73, 0x22,
+ 0x21, 0x2c, 0xfc, 0xbd, 0xfe, 0xf2, 0x07, 0xc1, 0xd1, 0x11, 0x12, 0x1f,
+ 0x1d, 0x71, 0x07, 0xf1,
+ 0xd0, 0x01, 0x6f, 0x0c, 0x0e, 0xfe, 0xee, 0x0e, 0x0d, 0x0d, 0x5e, 0x1c,
+ 0x1e, 0x02, 0x27, 0x37,
+ 0x23, 0x20, 0xfd, 0xd0, 0x00, 0x70, 0x6f, 0x1f, 0x20, 0x0e, 0x0d, 0xeb,
+ 0xe0, 0xdf, 0xcf, 0x03,
+ 0x05, 0xf0, 0xd1, 0xf0, 0xd5, 0xc1, 0xb1, 0xf0, 0x12, 0xf0, 0xa0, 0xc0,
+ 0x0b, 0x10, 0x3e, 0x50,
+ 0x20, 0x00, 0x05, 0xf3, 0xdd, 0xec, 0xff, 0xfd, 0xa0, 0x01, 0x02, 0x10,
+ 0xfc, 0x0d, 0x16, 0x42,
+ 0x0e, 0xdc, 0x00, 0x33, 0x00, 0xac, 0x01, 0xe0, 0xda, 0xff, 0x0f, 0x20,
+ 0x00, 0x34, 0x20, 0x7e,
+ 0x7e, 0x70, 0x00, 0x17, 0x00, 0xf0, 0xf1, 0x02, 0x0f, 0x0e, 0x0f, 0xd0,
+ 0xe1, 0xe0, 0xf1, 0x01,
+ 0xe0, 0xde, 0xd2, 0x03, 0x5c, 0x7a, 0x3e, 0x1f, 0x10, 0x07, 0x22, 0x11,
+ 0xf3, 0x00, 0x30, 0x3f,
+ 0x0b, 0x31, 0x03, 0x8e, 0xc9, 0xf0, 0xf4, 0x02, 0xd2, 0xe1, 0xd2, 0xd0,
+ 0xc0, 0x00, 0x2f, 0x0c,
+ 0xee, 0xce, 0x0d, 0x1f, 0x7e, 0x3f, 0x2e, 0x07, 0xe6, 0xff, 0x0d, 0x10,
+ 0x0e, 0xe0, 0xb7, 0xd1,
+ 0xf0, 0x40, 0x60, 0x1f, 0x21, 0x23, 0x00, 0x2b, 0x31, 0xe4, 0x80, 0x0d,
+ 0xeb, 0x00, 0xdf, 0xff,
+ 0x01, 0xf4, 0xf1, 0x00, 0x20, 0x3e, 0xf4, 0x57, 0x70, 0x4f, 0x09, 0x00,
+ 0xff, 0x1e, 0x00, 0x1f,
+ 0x10, 0xf0, 0xd3, 0xef, 0xfd, 0x0d, 0x30, 0x03, 0x8e, 0xda, 0xf0, 0x10,
+ 0x0e, 0x3e, 0x70, 0x14,
+ 0x0f, 0x0e, 0x12, 0x04, 0xe0, 0xdd, 0x32, 0x67, 0x07, 0x02, 0xfe, 0x00,
+ 0x20, 0x20, 0x33, 0x10,
+ 0xe2, 0xc0, 0xa0, 0xff, 0xed, 0xff, 0x01, 0x05, 0xa0, 0xdc, 0xef, 0x00,
+ 0xc1, 0xfe, 0xfe, 0x13,
+ 0x61, 0x0d, 0x3b, 0x00, 0xcf, 0xf2, 0x06, 0x27, 0x02, 0x01, 0x00, 0xe0,
+ 0xe0, 0x10, 0x23, 0x01,
+ 0x00, 0x42, 0x2f, 0xf9, 0xe0, 0x1f, 0x01, 0x94, 0x1d, 0x7d, 0x5c, 0x00,
+ 0xef, 0x01, 0x15, 0x32,
+ 0xf1, 0xe0, 0x0e, 0xdb, 0xed, 0x1c, 0x4f, 0x30, 0xe1, 0xa2, 0x03, 0x00,
+ 0x30, 0x7d, 0x1d, 0x1c,
+ 0x00, 0x06, 0x26, 0x0f, 0x1e, 0x3e, 0x10, 0x21, 0x01, 0x80, 0xcf, 0xd1,
+ 0xf3, 0xe0, 0xee, 0x0c,
+ 0x00, 0x0f, 0x5c, 0x71, 0x20, 0x1d, 0x18, 0x1b, 0x10, 0x2d, 0x1f, 0x10,
+ 0x00, 0x03, 0xf1, 0xc1,
+ 0xc6, 0xd3, 0x92, 0xd0, 0xde, 0xd0, 0xe2, 0xf1, 0x00, 0x00, 0x52, 0x17,
+ 0x04, 0xf0, 0x3d, 0x61,
+ 0x04, 0x13, 0x03, 0xd2, 0xf3, 0xbf, 0xe2, 0xf7, 0x00, 0x21, 0x00, 0xf1,
+ 0x00, 0x09, 0x3f, 0x61,
+ 0x10, 0x0f, 0x0e, 0x0b, 0x2f, 0x1f, 0x21, 0xf2, 0xa0, 0xf0, 0x00, 0x02,
+ 0x1f, 0x3d, 0x07, 0x15,
+ 0x00, 0xe0, 0x7d, 0x3f, 0x3f, 0x2d, 0x00, 0x1f, 0x0e, 0xfe, 0x90, 0x02,
+ 0xda, 0xec, 0xec, 0x0d,
+ 0xff, 0x0d, 0xfe, 0x1f, 0x60, 0x50, 0x1d, 0x0d, 0x0f, 0x10, 0x42, 0x1a,
+ 0x2e, 0x32, 0x77, 0x47,
+ 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x12, 0xe1, 0x80, 0xc1, 0xe1,
+ 0xe0, 0xe0, 0xff, 0x0d,
+ 0xfe, 0x0e, 0x0c, 0x1f, 0x1b, 0x2e, 0x70, 0x01, 0x1e, 0x00, 0xd3, 0xd1,
+ 0xf0, 0xf0, 0xd6, 0xd2,
+ 0xc5, 0x04, 0xc2, 0x02, 0x32, 0x53, 0x3f, 0x1c, 0xde, 0xbe, 0x10, 0x64,
+ 0x17, 0x01, 0xc2, 0x01,
+ 0xe4, 0xe0, 0x0c, 0xdc, 0x00, 0x22, 0xf2, 0x02, 0x02, 0x20, 0xed, 0xca,
+ 0x1d, 0x7e, 0x50, 0x20,
+ 0x1b, 0x0c, 0x1f, 0x21, 0x53, 0x01, 0x0e, 0x00, 0x01, 0xea, 0x0d, 0x2f,
+ 0x1c, 0xdf, 0xdf, 0x00,
+ 0xee, 0xde, 0xbe, 0xf0, 0xd4, 0xb0, 0x02, 0x27, 0x34, 0x10, 0x22, 0x70,
+ 0x72, 0x4f, 0x21, 0x11,
+ 0x1f, 0xfe, 0xcf, 0x02, 0xf0, 0xe8, 0x0d, 0xf2, 0xe7, 0xf0, 0xce, 0x0c,
+ 0xdf, 0x00, 0x0f, 0x70,
+ 0x02, 0x03, 0xf1, 0xc0, 0x0e, 0xed, 0x11, 0xdc, 0xc0, 0xbf, 0x00, 0xf1,
+ 0x16, 0x35, 0xad, 0x00,
+ 0xe0, 0x12, 0x21, 0x55, 0x00, 0xfc, 0xf1, 0x01, 0x34, 0x0e, 0x10, 0x03,
+ 0x03, 0xdc, 0x41, 0x53,
+ 0x0f, 0xe0, 0xf5, 0x06, 0xce, 0x0f, 0x00, 0x45, 0xd0, 0xce, 0x00, 0x22,
+ 0x00, 0xbf, 0x31, 0x00,
+ 0x13, 0xfd, 0x02, 0x8c, 0x10, 0x30, 0x2d, 0x3d, 0xf8, 0xd0, 0xad, 0x14,
+ 0xe0, 0xf2, 0xcf, 0x25,
+ 0x00, 0x1f, 0x10, 0x5e, 0x30, 0x08, 0x4f, 0x2d, 0x72, 0x30, 0x00, 0x0d,
+ 0x10, 0xf0, 0xcd, 0x27,
+ 0xf2, 0xf0, 0x8c, 0x14, 0x01, 0xde, 0xf0, 0x02, 0x57, 0xfe, 0xcd, 0x10,
+ 0x43, 0x00, 0xda, 0x00,
+ 0x23, 0x00, 0x0f, 0x00, 0x20, 0xe1, 0xb0, 0x14, 0x23, 0xdd, 0xda, 0x02,
+ 0x53, 0xf0, 0xcd, 0x0f,
+ 0x43, 0x00, 0xc8, 0xf0, 0x00, 0x31, 0x00, 0xff, 0x32, 0x43, 0xbc, 0x10,
+ 0x24, 0x10, 0xfd, 0xed,
+ 0x33, 0x55, 0xf0, 0xfd, 0x00, 0x0e, 0x11, 0x21, 0xc0, 0xe1, 0xf2, 0xd0,
+ 0x00, 0x14, 0x45, 0xee,
+ 0xef, 0x30, 0x0e, 0x0b, 0x71, 0x63, 0xed, 0xdc, 0xef, 0x24, 0x54, 0xfb,
+ 0xbe, 0x21, 0x01, 0x1f,
+ 0x3f, 0x02, 0x01, 0x0d, 0xf0, 0x30, 0x30, 0xfe, 0xd0, 0x07, 0xd3, 0xdf,
+ 0x04, 0xa0, 0xb1, 0x02,
+ 0xf5, 0x0d, 0x0c, 0x62, 0x0e, 0xeb, 0x01, 0x10, 0xec, 0xdd, 0x41, 0x24,
+ 0xcd, 0xdd, 0x12, 0x45,
+ 0x31, 0xf0, 0xfe, 0x32, 0x75, 0x0f, 0xbc, 0x02, 0x04, 0x0e, 0xfd, 0xe0,
+ 0xf0, 0xef, 0x0f, 0x0e,
+ 0x36, 0x75, 0x10, 0xfe, 0xf0, 0xff, 0x11, 0x13, 0x00, 0xfe, 0xde, 0x41,
+ 0x44, 0x1e, 0xda, 0xef,
+ 0x22, 0x23, 0xed, 0x8c, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xe9, 0x42, 0x20,
+ 0xfe, 0xfe, 0x30, 0x00,
+ 0xac, 0x00, 0x14, 0x14, 0xde, 0xbc, 0x02, 0x33, 0xff, 0x0f, 0x03, 0x0e,
+ 0x01, 0x67, 0x00, 0x0e,
+ 0xff, 0x11, 0x32, 0xce, 0xf0, 0x23, 0x33, 0xff, 0xb9, 0x22, 0x45, 0xee,
+ 0xad, 0x01, 0x22, 0x00,
+ 0xfc, 0xef, 0x20, 0xf0, 0xa9, 0x33, 0x55, 0xee, 0xbc, 0x13, 0x05, 0x05,
+ 0x06, 0x01, 0xf3, 0x00,
+ 0xa3, 0x29, 0x0d, 0xe2, 0x79, 0x2c, 0xf0, 0xe1, 0xec, 0x00, 0x76, 0x20,
+ 0xef, 0xee, 0x21, 0x22,
+ 0xef, 0xcc, 0x22, 0x33, 0xbc, 0xdd, 0x33, 0x35, 0xee, 0xcc, 0x22, 0x22,
+ 0xef, 0xee, 0xf0, 0x01,
+ 0x0f, 0x8b, 0x00, 0x22, 0xf0, 0xdb, 0x01, 0x10, 0xbd, 0x00, 0x34, 0xfe,
+ 0xdc, 0x22, 0x10, 0xff,
+ 0xef, 0xef, 0x21, 0x63, 0xda, 0xce, 0x11, 0x12, 0xce, 0xdd, 0x01, 0x12,
+ 0xbb, 0xee, 0x0f, 0x01,
+ 0x10, 0xb8, 0x10, 0x40, 0x0f, 0x0c, 0x20, 0x40, 0xdc, 0xfd, 0x53, 0x10,
+ 0xdb, 0xff, 0x00, 0x20,
+ 0xfd, 0xcc, 0x00, 0x30, 0x0f, 0xff, 0xfe, 0xfc, 0x1e, 0xea, 0x00, 0x2e,
+ 0x9f, 0xef, 0x1f, 0x32,
+ 0xff, 0x8b, 0xee, 0x22, 0x77, 0xde, 0xdc, 0x21, 0x12, 0xf0, 0xff, 0xf0,
+ 0xcf, 0xed, 0x44, 0x00,
+ 0xba, 0xff, 0x12, 0x11, 0xf0, 0xcf, 0xff, 0x12, 0x12, 0xe0, 0xdf, 0x11,
+ 0x34, 0xbf, 0xee, 0x05,
+ 0x00, 0x8c, 0x00, 0x17, 0x00, 0xcf, 0xff, 0x01, 0x24, 0xf0, 0xbd, 0x00,
+ 0x13, 0x23, 0xcc, 0xee,
+ 0x00, 0x13, 0xee, 0xba, 0x11, 0x00, 0xdd, 0x00, 0x22, 0xde, 0xdc, 0x43,
+ 0x31, 0xec, 0xdd, 0xed,
+ 0x41, 0x10, 0x00, 0x12, 0xa9, 0xde, 0x33, 0x42, 0xcb, 0xee, 0x00, 0x00,
+ 0x44, 0x00, 0xfe, 0xed,
+ 0x31, 0x52, 0xec, 0xfd, 0x01, 0x30, 0xb9, 0xff, 0x00, 0x0f, 0xf0, 0x00,
+ 0xfe, 0x22, 0x65, 0xba,
+ 0x00, 0x42, 0x00, 0xce, 0x00, 0x31, 0xf0, 0x0f, 0x13, 0x0e, 0xeb, 0x01,
+ 0x67, 0x00, 0xd0, 0xfe,
+ 0x13, 0x11, 0xd0, 0x21, 0x02, 0xcf, 0x23, 0x02, 0xdf, 0x00, 0x37, 0x01,
+ 0xc0, 0x35, 0xd0, 0xe0,
+ 0x33, 0x41, 0x42, 0x11, 0xd0, 0x00, 0x77, 0x62, 0xe0, 0xcc, 0x00, 0x67,
+ 0x00, 0xff, 0xef, 0x11,
+ 0x44, 0xe0, 0xfd, 0x01, 0x02, 0x33, 0x10, 0xff, 0xee, 0x43, 0x46, 0xef,
+ 0xee, 0x22, 0x43, 0x10,
+ 0x0f, 0x00, 0x33, 0x22, 0x00, 0x10, 0x77, 0x41, 0xee, 0x00, 0x43, 0x22,
+ 0xfe, 0x0e, 0x01, 0x43,
+ 0x11, 0x0f, 0xfa, 0x0f, 0x54, 0x21, 0xec, 0x0f, 0x64, 0x00, 0x0f, 0x01,
+ 0x1f, 0x10, 0x20, 0xea,
+ 0xf0, 0x63, 0x01, 0xfa, 0x00, 0x20, 0x21, 0x00, 0x0e, 0x10, 0x41, 0x0e,
+ 0x0e, 0x21, 0x20, 0x20,
+ 0x20, 0xda, 0x72, 0x57, 0xee, 0xbc, 0x22, 0x33, 0xdd, 0xed, 0x24, 0x53,
+ 0xdb, 0xef, 0x41, 0x01,
+ 0xf0, 0x20, 0x0f, 0xf0, 0x00, 0x15, 0x00, 0xfe, 0xd0, 0x03, 0x25, 0x9e,
+ 0xdd, 0x01, 0x47, 0x00,
+ 0x9e, 0x00, 0x41, 0x01, 0xef, 0x0f, 0x32, 0x00, 0xeb, 0x10, 0x54, 0xff,
+ 0xed, 0x13, 0x33, 0x0e,
+ 0xde, 0x00, 0x45, 0x10, 0xfe, 0x23, 0x32, 0xcc, 0x0f, 0x77, 0x10, 0xcd,
+ 0x00, 0x43, 0x11, 0xec,
+ 0x0e, 0x12, 0x33, 0x01, 0x10, 0x01, 0x0e, 0x02, 0x47, 0x00, 0xdd, 0xf0,
+ 0x44, 0x01, 0xad, 0x00,
+ 0x24, 0x00, 0xb9, 0x00, 0x64, 0x00, 0xdc, 0x12, 0x42, 0xff, 0xdc, 0x22,
+ 0x34, 0xff, 0xcc, 0x00,
+ 0x53, 0x01, 0xdc, 0xe0, 0x21, 0x02, 0xff, 0xfe, 0x01, 0x23, 0xf0, 0xcc,
+ 0x00, 0x43, 0x24, 0xdd,
+ 0xac, 0x13, 0x23, 0xfe, 0xcd, 0x01, 0x17, 0x00, 0xac, 0x00, 0x31, 0x01,
+ 0xcd, 0x10, 0x35, 0xef,
+ 0xfd, 0xf0, 0x00, 0x52, 0xf0, 0xcd, 0x11, 0x27, 0xef, 0x00, 0x22, 0xce,
+ 0x01, 0x45, 0xef, 0x00,
+ 0x22, 0xe0, 0xf0, 0xee, 0xe0, 0x15, 0x00, 0xac, 0x00, 0x00, 0x21, 0x01,
+ 0x00, 0x02, 0xbd, 0xfe,
+ 0x24, 0x33, 0xcd, 0xcb, 0xee, 0x02, 0x67, 0xf0, 0xac, 0x00, 0x24, 0x00,
+ 0xcc, 0x12, 0x11, 0xff,
+ 0xdf, 0x10, 0x22, 0x00, 0x11, 0xdf, 0x00, 0xf3, 0xdf, 0x00, 0x25, 0xae,
+ 0xcb, 0x14, 0x31, 0xc0,
+ 0xdc, 0x12, 0x55, 0xdf, 0xdc, 0x10, 0x75, 0x0f, 0xcd, 0x00, 0x41, 0x01,
+ 0xfd, 0xf0, 0x10, 0x00,
+ 0xfd, 0x00, 0xf0, 0xfc, 0xf0, 0xff, 0xca, 0x01, 0x41, 0xdd, 0xf0, 0xef,
+ 0x10, 0x20, 0xdb, 0x00,
+ 0x61, 0x10, 0xc9, 0x0f, 0x53, 0x00, 0xdd, 0x0e, 0x10, 0x40, 0x12, 0x0f,
+ 0x98, 0x0f, 0x33, 0x00,
+ 0xec, 0x00, 0x10, 0x00, 0xdd, 0x00, 0x30, 0x1f, 0xec, 0x00, 0x1f, 0x52,
+ 0xf0, 0xcb, 0x00, 0x24,
+ 0x00, 0xac, 0xf0, 0x12, 0x00, 0xfd, 0xbe, 0x02, 0x23, 0xfd, 0xc9, 0x11,
+ 0x54, 0xed, 0xfe, 0x01,
+ 0x12, 0x0f, 0xba, 0x11, 0x33, 0xdd, 0xef, 0x00, 0x10, 0xfd, 0x00, 0x43,
+ 0xdb, 0x0f, 0x62, 0xed,
+ 0x00, 0x22, 0x10, 0xfc, 0x00, 0x14, 0x0e, 0xab, 0x00, 0x17, 0x10, 0x8c,
+ 0x00, 0x12, 0x00, 0xed,
+ 0x0e, 0x01, 0x20, 0x00, 0x0f, 0x2f, 0x1e, 0x1e, 0x3f, 0x1f, 0xfb, 0xff,
+ 0x51, 0x20, 0xb9, 0x1f,
+ 0x52, 0xfd, 0xeb, 0x22, 0x42, 0xec, 0x0f, 0x10, 0x0f, 0x0c, 0x00, 0x71,
+ 0x11, 0xfc, 0xdd, 0x20,
+ 0x42, 0xff, 0xec, 0x00, 0x20, 0x25, 0xf0, 0xbe, 0x00, 0x24, 0x00, 0xbc,
+ 0x0f, 0xe0, 0x23, 0x13,
+ 0x98, 0xf0, 0x00, 0x12, 0x00, 0x02, 0x00, 0xef, 0x00, 0xf3, 0x01, 0x12,
+ 0xf1, 0xb0, 0x07, 0x55,
+ 0xbe, 0xff, 0x26, 0x10, 0xb0, 0xff, 0x02, 0x11, 0x01, 0xd0, 0xff, 0x02,
+ 0x23, 0xe0, 0xcf, 0x01,
+ 0x05, 0x00, 0xdf, 0x42, 0xdf, 0x99, 0x22, 0x42, 0xf0, 0xec, 0xde, 0x00,
+ 0x43, 0x00, 0xb9, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0xfe, 0xef, 0x00, 0x20, 0x10, 0x0d, 0x33, 0x54,
+ 0x0f, 0x0d, 0xfd, 0x21,
+ 0x73, 0x00, 0x0b, 0x0f, 0x15, 0x10, 0xf0, 0xaa, 0x10, 0x12, 0x1f, 0xfe,
+ 0x0d, 0x31, 0x22, 0x0f,
+ 0x0e, 0x30, 0x0d, 0x11, 0x77, 0x00, 0x00, 0x22, 0xef, 0xcf, 0x34, 0x34,
+ 0xdd, 0xd0, 0xbf, 0xdd,
+ 0x67, 0x05, 0xad, 0x00, 0x04, 0x10, 0xe0, 0x00, 0x34, 0x01, 0xd0, 0xe2,
+ 0x03, 0x14, 0xd0, 0xa0,
+ 0x03, 0x02, 0xe1, 0xc1, 0x17, 0x45, 0xef, 0xbe, 0x23, 0x22, 0xef, 0xef,
+ 0x32, 0x53, 0x0f, 0xed,
+ 0x12, 0x13, 0xef, 0xf0, 0x16, 0xfe, 0xd0, 0x02, 0xf0, 0xf1, 0x01, 0xae,
+ 0x01, 0x12, 0x00, 0x30,
+ 0x10, 0x3c, 0x72, 0x44, 0xf9, 0x10, 0x74, 0x00, 0x0e, 0x12, 0x12, 0x1f,
+ 0x12, 0x15, 0x1f, 0x0c,
+ 0x2f, 0x53, 0x10, 0x0a, 0x10, 0x40, 0x0d, 0x0c, 0x20, 0x60, 0x0f, 0x0c,
+ 0x42, 0x32, 0xec, 0xdb,
+ 0x11, 0x65, 0x0f, 0xcc, 0x0f, 0x20, 0x32, 0xee, 0xee, 0x2f, 0x42, 0x12,
+ 0xdb, 0x00, 0x30, 0x20,
+ 0xee, 0xef, 0x00, 0x60, 0x00, 0xed, 0xff, 0x0f, 0x31, 0xfe, 0xdb, 0x20,
+ 0x70, 0x02, 0x0f, 0x0f,
+ 0xeb, 0xcd, 0x03, 0x17, 0xdf, 0xce, 0xe1, 0x24, 0x10, 0xd0, 0xe1, 0xe6,
+ 0x80, 0xf2, 0xf1, 0xcf,
+ 0xe0, 0x11, 0x13, 0xfe, 0xeb, 0x10, 0x53, 0xdf, 0xdb, 0x00, 0x61, 0x01,
+ 0xdc, 0x0f, 0x31, 0x10,
+ 0x10, 0x0f, 0x00, 0x30, 0x33, 0x13, 0xcd, 0x0c, 0x0d, 0x5f, 0x4c, 0x49,
+ 0x40, 0x20, 0x1d, 0x3f,
+ 0x22, 0x22, 0x53, 0x1b, 0x0b, 0x22, 0x21, 0x00, 0x01, 0x01, 0xcd, 0xf3,
+ 0x03, 0xfb, 0xcd, 0x42,
+ 0x03, 0xab, 0x30, 0x64, 0x0f, 0xe0, 0x14, 0x32, 0xfe, 0xf0, 0x12, 0x31,
+ 0x11, 0x13, 0x10, 0xdf,
+ 0x01, 0x77, 0x17, 0x0f, 0xf0, 0x31, 0x04, 0xbe, 0xf0, 0x01, 0x06, 0xd1,
+ 0xf1, 0xf1, 0xd0, 0xf4,
+ 0x74, 0x00, 0xe1, 0xf2, 0x14, 0x53, 0xe0, 0xee, 0x32, 0x75, 0x00, 0xf0,
+ 0xfe, 0x11, 0x23, 0xff,
+ 0xed, 0x0e, 0x55, 0x02, 0x00, 0x15, 0x43, 0x13, 0x31, 0x21, 0x23, 0x54,
+ 0x44, 0x11, 0xf2, 0x15,
+ 0x64, 0x00, 0x02, 0x01, 0x05, 0x10, 0x00, 0x30, 0x61, 0x12, 0x10, 0x33,
+ 0x10, 0x20, 0x03, 0x02,
+ 0xff, 0x00, 0x54, 0x34, 0xe0, 0x03, 0x37, 0x23, 0xbd, 0xf0, 0x15, 0x61,
+ 0x11, 0x12, 0x21, 0x01,
+ 0x21, 0x53, 0x00, 0x12, 0x27, 0x03, 0x12, 0x03, 0x00, 0xa1, 0xf5, 0xf2,
+ 0xe0, 0xd0, 0x05, 0x24,
+ 0x01, 0xa1, 0xf3, 0xf2, 0xf3, 0xf0, 0x00, 0x31, 0x74, 0x51, 0x00, 0x0f,
+ 0x22, 0x20, 0x0e, 0x0d,
+ 0xec, 0x33, 0x25, 0xce, 0xc0, 0xf6, 0xe0, 0xef, 0xaf, 0xfe, 0x01, 0x21,
+ 0xfd, 0xeb, 0x0f, 0x0c,
+ 0x4d, 0x30, 0x40, 0x0b, 0x3f, 0x70, 0x10, 0x0c, 0x01, 0x24, 0x20, 0x0e,
+ 0xed, 0x00, 0x42, 0x3c,
+ 0x0a, 0x3d, 0x4d, 0x5d, 0x20, 0x39, 0x3e, 0x3e, 0x30, 0x4f, 0x1d, 0x0d,
+ 0x44, 0x44, 0xee, 0xa9,
+ 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xe1, 0x00, 0xf2, 0x0f, 0xdc, 0x10, 0x1f,
+ 0xae, 0xf0, 0x11, 0xac,
+ 0xec, 0xe0, 0x0f, 0xaa, 0xfe, 0x00, 0x1f, 0xec, 0xff, 0x0f, 0x0f, 0x00,
+ 0xde, 0xef, 0xca, 0xfe,
+ 0xff, 0xad, 0xca, 0xee, 0xd0, 0xe0, 0xbd, 0xdb, 0xce, 0xf0, 0xee, 0xde,
+ 0xee, 0x00, 0xcf, 0xed,
+ 0xdd, 0xcc, 0x0e, 0xec, 0xda, 0x8d, 0x0e, 0xed, 0xda, 0xff, 0xfd, 0xfc,
+ 0xff, 0x0e, 0xff, 0xdc,
+ 0xed, 0xfd, 0x2e, 0x1e, 0x89, 0xee, 0x0f, 0xfe, 0xed, 0xec, 0x30, 0x2f,
+ 0xfc, 0xdd, 0x0e, 0x0c,
+ 0xdd, 0xfe, 0xcd, 0xcc, 0x2f, 0x1d, 0x8b, 0xae, 0xff, 0xff, 0xdb, 0xff,
+ 0xef, 0xde, 0xce, 0xfd,
+ 0xde, 0xde, 0xcd, 0xef, 0xff, 0xcf, 0xbd, 0xfd, 0xf0, 0xd3, 0xee, 0xef,
+ 0xf2, 0xcb, 0xec, 0x0f,
+ 0x00, 0xc2, 0xd6, 0xe3, 0xd2, 0x80, 0xd0, 0xd1, 0xe4, 0xb1, 0xe0, 0xd0,
+ 0xd6, 0xf2, 0xe1, 0xd0,
+ 0xd2, 0xe7, 0xd1, 0xd1, 0xf1, 0xd2, 0x8e, 0xff, 0x10, 0x1c, 0xfa, 0xd0,
+ 0xdf, 0xd0, 0x8b, 0xde,
+ 0xe0, 0xef, 0xcb, 0xef, 0x0e, 0xfe, 0x0f, 0x1c, 0x1e, 0x20, 0x30, 0x0f,
+ 0xfd, 0x0f, 0x2f, 0x0c,
+ 0x0e, 0x13, 0x04, 0xaf, 0xec, 0xee, 0x00, 0xdd, 0xfb, 0x70, 0x71, 0x1b,
+ 0x0c, 0x20, 0x20, 0x10,
+ 0x0c, 0x1f, 0x21, 0x31, 0x0d, 0x1d, 0x61, 0x21, 0xfe, 0xff, 0xf3, 0x0f,
+ 0x0c, 0x01, 0x07, 0x11,
+ 0x10, 0x11, 0x64, 0x04, 0x01, 0x01, 0xf4, 0x56, 0x62, 0x03, 0xf3, 0x04,
+ 0x04, 0x03, 0xf2, 0xf4,
+ 0xe4, 0xd3, 0xe4, 0xf3, 0x05, 0x01, 0xf3, 0x72, 0x73, 0x31, 0x14, 0x33,
+ 0x23, 0x24, 0x21, 0x03,
+ 0x43, 0x34, 0x22, 0x13, 0x34, 0x34, 0x22, 0x35, 0xf1, 0xe1, 0x12, 0x33,
+ 0x32, 0x52, 0x42, 0x31,
+ 0x71, 0x63, 0x24, 0x33, 0x23, 0x37, 0x43, 0x32, 0x42, 0x13, 0x43, 0x45,
+ 0x23, 0x12, 0x21, 0x44,
+ 0x11, 0x32, 0x30, 0x72, 0x32, 0x31, 0x20, 0x30, 0x41, 0x13, 0x31, 0x43,
+ 0x21, 0x31, 0x20, 0x37,
+ 0x35, 0x1e, 0x2e, 0x51, 0x33, 0x20, 0x2d, 0x63, 0x12, 0x2f, 0x24, 0x10,
+ 0x2f, 0x0b, 0x20, 0x20,
+ 0x31, 0x32, 0x45, 0x54, 0x11, 0x56, 0x00, 0x2b, 0x1f, 0x30, 0x41, 0x00,
+ 0x10, 0x0f, 0x20, 0x00,
+ 0x20, 0x10, 0x11, 0x01, 0x07, 0x13, 0x00, 0x00, 0x07, 0xf2, 0xc3, 0xf3,
+ 0x13, 0x33, 0xe2, 0xc1,
+ 0x43, 0x16, 0xc1, 0xa1, 0x03, 0xd2, 0xa0, 0xd0, 0xe2, 0xe7, 0xf0, 0xcf,
+ 0xe0, 0xf0, 0xd0, 0x00,
+ 0x61, 0x21, 0x0e, 0x00, 0xf2, 0xf3, 0xdc, 0x0e, 0x22, 0x57, 0x61, 0x4e,
+ 0x3f, 0x3f, 0x3f, 0x7e,
+ 0x10, 0x2f, 0x20, 0x10, 0x24, 0x12, 0x08, 0x2d, 0x0f, 0x24, 0x10, 0x1c,
+ 0x40, 0x22, 0x50, 0x2b,
+ 0x1c, 0x1e, 0x2f, 0x00, 0xfd, 0x00, 0x42, 0xdc, 0xee, 0x4d, 0x7d, 0x1c,
+ 0x0b, 0x00, 0x02, 0x4e,
+ 0x2c, 0x0c, 0x0c, 0xfd, 0xed, 0xde, 0xdc, 0xbc, 0xbe, 0xe2, 0xd7, 0xb3,
+ 0xc0, 0xd1, 0xd2, 0xe2,
+ 0xd1, 0xd3, 0x05, 0x01, 0x00, 0x0f, 0xb0, 0x04, 0x02, 0xf0, 0xcc, 0xcd,
+ 0xef, 0xc0, 0xc0, 0xde,
+ 0xca, 0xde, 0xf0, 0xd1, 0xb2, 0xed, 0xdc, 0xff, 0xdf, 0xdb, 0xee, 0xe1,
+ 0xd1, 0xb0, 0xd6, 0xf4,
+ 0xb3, 0xd0, 0xb2, 0x06, 0xf1, 0xef, 0xf0, 0x01, 0xe1, 0xd0, 0xec, 0xe0,
+ 0x00, 0xe0, 0x0d, 0xdc,
+ 0x8c, 0xbd, 0x0f, 0xdf, 0xef, 0xb0, 0x0f, 0xd8, 0x0d, 0x40, 0x20, 0x0d,
+ 0xca, 0x00, 0x10, 0xfc,
+ 0xfe, 0xde, 0xdf, 0xaf, 0xee, 0xfe, 0xfe, 0xdc, 0xdd, 0xdd, 0xad, 0xe0,
+ 0xee, 0xcb, 0xbc, 0xef,
+ 0xf0, 0xde, 0xee, 0xe0, 0xf0, 0xde, 0xe1, 0xef, 0xfa, 0x0f, 0xfa, 0xbe,
+ 0xff, 0xff, 0xda, 0xbd,
+ 0xee, 0xfe, 0xe0, 0xbe, 0xcb, 0xef, 0xe0, 0xdf, 0xce, 0xed, 0xbc, 0xee,
+ 0xed, 0xfe, 0xbb, 0xeb,
+ 0xfe, 0xdc, 0xed, 0xec, 0xff, 0xdc, 0xce, 0xc0, 0xef, 0xce, 0xcc, 0xef,
+ 0xe0, 0xfe, 0xfc, 0x0b,
+ 0x1e, 0x1f, 0x0e, 0x0d, 0x0d, 0xeb, 0x0e, 0x2d, 0x3c, 0x0d, 0xbd, 0xee,
+ 0xcd, 0xdf, 0xcd, 0xdd,
+ 0x2c, 0x2e, 0x8d, 0xee, 0xed, 0x1a, 0x0e, 0xed, 0xde, 0xcb, 0xcd, 0xbe,
+ 0xbd, 0xdb, 0xd0, 0xef,
+ 0xdc, 0xdc, 0xff, 0x4e, 0x0e, 0x2f, 0x30, 0x1d, 0x1d, 0x4d, 0x0b, 0xfd,
+ 0xdb, 0xee, 0xfc, 0xae,
+ 0xdc, 0xd0, 0xcf, 0xbe, 0xdc, 0xde, 0xdd, 0xee, 0x0f, 0x10, 0x3e, 0x0c,
+ 0x00, 0xe1, 0xde, 0x89,
+ 0xe0, 0x00, 0x00, 0xee, 0xc1, 0x03, 0xef, 0xcc, 0xde, 0xec, 0x0f, 0xfd,
+ 0x3c, 0x0d, 0xca, 0x0e,
+ 0xee, 0xbe, 0xee, 0x00, 0xdf, 0xed, 0x0e, 0xfb, 0x4e, 0x70, 0x7e, 0x3c,
+ 0x3e, 0x2d, 0x0b, 0x60,
+ 0x1e, 0x1e, 0x0b, 0x1f, 0x0e, 0x20, 0xfd, 0xfa, 0x30, 0x5e, 0x00, 0x13,
+ 0x10, 0x09, 0x2f, 0x20,
+ 0x1e, 0x0f, 0x0d, 0x32, 0x33, 0xd0, 0xaf, 0x14, 0x16, 0xd0, 0x13, 0x74,
+ 0x72, 0x21, 0x13, 0x33,
+ 0x44, 0x23, 0x00, 0x01, 0x13, 0x16, 0xf3, 0xb0, 0xe2, 0xe5, 0xe5, 0xe1,
+ 0xd3, 0xc2, 0xe4, 0xf1,
+ 0x24, 0x72, 0x23, 0x34, 0x31, 0x01, 0xf2, 0x31, 0x34, 0x00, 0xf4, 0x13,
+ 0x04, 0x90, 0xd1, 0xe0,
+ 0xb1, 0x00, 0x00, 0x40, 0x2f, 0x40, 0x4f, 0x20, 0x20, 0x20, 0x20, 0x02,
+ 0x0b, 0x2f, 0x05, 0xf7,
+ 0xe1, 0x53, 0x12, 0x12, 0x33, 0x71, 0x71, 0x01, 0x20, 0x32, 0x34, 0x33,
+ 0x45, 0x20, 0x23, 0x34,
+ 0x31, 0x42, 0x33, 0x25, 0x11, 0x23, 0x65, 0x11, 0x30, 0x12, 0x52, 0x21,
+ 0x20, 0x21, 0x24, 0x31,
+ 0x10, 0x45, 0x03, 0x36, 0x12, 0x12, 0x64, 0x21, 0x22, 0x23, 0x04, 0x24,
+ 0x34, 0x02, 0x04, 0xf4,
+ 0xf5, 0xe1, 0xc2, 0xf3, 0xd3, 0x81, 0xf2, 0x03, 0x05, 0x51, 0x34, 0x42,
+ 0x32, 0x52, 0x13, 0x03,
+ 0x24, 0x22, 0xf2, 0x04, 0x14, 0x02, 0xb3, 0xd0, 0xf4, 0xe2, 0xf2, 0x00,
+ 0x01, 0x50, 0x30, 0x53,
+ 0x21, 0x11, 0x25, 0x36, 0x00, 0x21, 0x21, 0x62, 0x03, 0x03, 0x06, 0xf1,
+ 0xe0, 0x11, 0x73, 0x32,
+ 0x30, 0x52, 0x31, 0x42, 0x30, 0x5f, 0x11, 0x30, 0x2e, 0x30, 0x35, 0x32,
+ 0x2f, 0x2d, 0x2b, 0x5e,
+ 0x3a, 0x3d, 0x5f, 0x21, 0x12, 0x2c, 0x2e, 0x4e, 0x0c, 0x10, 0x0f, 0x0e,
+ 0xfe, 0xfd, 0xde, 0x1e,
+ 0x2d, 0x7c, 0x5e, 0x0d, 0x2e, 0x28, 0x2d, 0x2d, 0x2e, 0x3a, 0x5e, 0x1e,
+ 0x1d, 0x0a, 0x0f, 0x0e,
+ 0x0e, 0xcc, 0x00, 0x03, 0x30, 0xfb, 0xdf, 0xf0, 0xc0, 0x01, 0x73, 0x50,
+ 0x0e, 0x02, 0x07, 0xb0,
+ 0xf0, 0xe0, 0xd3, 0xe4, 0xd1, 0xe0, 0xf0, 0xf5, 0xf1, 0x00, 0xb0, 0xdf,
+ 0xb0, 0xe0, 0xcd, 0xcc,
+ 0xef, 0xcc, 0xee, 0xf0, 0xed, 0xea, 0x0d, 0xfe, 0x0d, 0x2f, 0x0f, 0x42,
+ 0x01, 0x18, 0x40, 0x3d,
+ 0x0c, 0x1f, 0x3f, 0x00, 0x00, 0x1c, 0x4d, 0x0f, 0x0f, 0x1d, 0x19, 0x1e,
+ 0x0c, 0x4f, 0x7c, 0x0d,
+ 0x1c, 0x2f, 0xd0, 0x80, 0xd0, 0xef, 0xff, 0xd0, 0xb8, 0xff, 0xfe, 0x21,
+ 0x30, 0xfb, 0x2f, 0x2d,
+ 0x6f, 0x3d, 0x4d, 0x3c, 0x0d, 0xee, 0xcf, 0xc0, 0xc0, 0xe1, 0x01, 0x01,
+ 0x10, 0x00, 0x1b, 0x00,
+ 0x33, 0xfa, 0x58, 0xdb, 0x6d, 0xfd, 0xc6, 0xd8, 0xe0, 0xe7, 0x23, 0x30,
+ 0x2e, 0x73, 0x70, 0x2b,
+ 0x1e, 0x31, 0x32, 0x1a, 0x2d, 0x00, 0xf0, 0xe0, 0x00, 0xef, 0xda, 0xaf,
+ 0xee, 0x02, 0xff, 0x4a,
+ 0x2f, 0x0e, 0x00, 0xf1, 0x82, 0xd2, 0xe2, 0xf6, 0x01, 0x01, 0x31, 0x00,
+ 0x51, 0x77, 0x21, 0x0f,
+ 0x0e, 0x11, 0x41, 0x0e, 0xfd, 0xef, 0x0f, 0xf0, 0xc0, 0xf1, 0xe0, 0xcd,
+ 0xc8, 0x00, 0x40, 0xeb,
+ 0xed, 0x60, 0x4f, 0x3d, 0x0b, 0x20, 0x02, 0x13, 0xd0, 0xd0, 0xe0, 0x04,
+ 0xa0, 0x0f, 0xf0, 0xe1,
+ 0xcf, 0xdc, 0xd0, 0xdf, 0xf1, 0xdf, 0x02, 0x37, 0x61, 0x2d, 0x01, 0x07,
+ 0x06, 0x00, 0x40, 0x00,
+ 0xbf, 0x10, 0x13, 0x0d, 0x0d, 0x2e, 0x70, 0x42, 0x10, 0x2c, 0x2f, 0x04,
+ 0xf5, 0xdf, 0xed, 0x24,
+ 0x52, 0xe0, 0xed, 0xdf, 0xdc, 0x10, 0xf0, 0xfd, 0xee, 0x88, 0xde, 0x3f,
+ 0x50, 0xff, 0xe1, 0xf7,
+ 0xf1, 0xc0, 0x02, 0xf2, 0x8c, 0xff, 0x12, 0x22, 0x1f, 0x0a, 0x30, 0x52,
+ 0x00, 0x0d, 0x72, 0x00,
+ 0x1a, 0x1f, 0x13, 0x14, 0x00, 0xe0, 0x00, 0x35, 0x00, 0xc0, 0x00, 0x23,
+ 0x00, 0xcc, 0xf1, 0xf2,
+ 0xc0, 0xd0, 0xbe, 0xde, 0xcf, 0xfe, 0xdd, 0xeb, 0xe0, 0xd1, 0xe0, 0x33,
+ 0x52, 0x24, 0x60, 0x30,
+ 0x27, 0x13, 0x1d, 0x0a, 0xff, 0x0d, 0x11, 0x00, 0xff, 0xea, 0xef, 0xd0,
+ 0xb1, 0xc0, 0xdc, 0xde,
+ 0x0d, 0x10, 0x20, 0x1f, 0xf0, 0x47, 0x77, 0x41, 0xd0, 0xe0, 0x00, 0x61,
+ 0x01, 0x20, 0x11, 0x02,
+ 0x12, 0x10, 0xfc, 0xfe, 0xe0, 0xf0, 0xfe, 0xea, 0xcd, 0xbc, 0xef, 0xf0,
+ 0xe1, 0xef, 0x3e, 0x61,
+ 0xf7, 0xd1, 0x00, 0x50, 0x60, 0x3e, 0x20, 0x01, 0xef, 0x42, 0x57, 0x02,
+ 0xcf, 0x0f, 0x0f, 0x01,
+ 0xc0, 0x02, 0xf0, 0x20, 0x34, 0x33, 0x40, 0xfd, 0xc0, 0xfc, 0xed, 0xe9,
+ 0xbd, 0xde, 0xe2, 0x17,
+ 0x07, 0xb1, 0xf1, 0x02, 0x00, 0x10, 0x7f, 0x2f, 0x10, 0x0d, 0x12, 0x02,
+ 0xf0, 0xcc, 0x11, 0x26,
+ 0xe0, 0xcc, 0x1f, 0x10, 0xd0, 0xc4, 0xd0, 0xd0, 0xee, 0x32, 0x40, 0x0e,
+ 0x20, 0x51, 0x47, 0x00,
+ 0x00, 0x00, 0x4d, 0x10, 0x0e, 0x10, 0x3f, 0x78, 0x30, 0x3e, 0x0e, 0xcc,
+ 0x20, 0x2e, 0x1d, 0x0c,
+ 0x1e, 0x0e, 0x0c, 0xfc, 0x90, 0xf2, 0xc0, 0xdf, 0x02, 0xf7, 0x03, 0x00,
+ 0xef, 0x01, 0xf4, 0xf0,
+ 0x00, 0x00, 0x30, 0x73, 0x53, 0x24, 0x14, 0x13, 0x00, 0x03, 0x01, 0x52,
+ 0x0e, 0x0a, 0x12, 0xd2,
+ 0x81, 0x0b, 0xfc, 0x00, 0x00, 0x6f, 0x2d, 0xfe, 0xe2, 0xe3, 0xff, 0xee,
+ 0xe1, 0xe3, 0xf4, 0x13,
+ 0x30, 0x40, 0x10, 0xb7, 0xe7, 0xc3, 0xf0, 0xc0, 0xd2, 0xc0, 0xe0, 0xe2,
+ 0xd1, 0x0e, 0x5f, 0x52,
+ 0x11, 0x1f, 0x15, 0x37, 0x44, 0x1e, 0x3d, 0x22, 0x03, 0xde, 0xca, 0x00,
+ 0xde, 0x0f, 0x0e, 0x0d,
+ 0x0e, 0xfb, 0x0f, 0x70, 0x7c, 0x2e, 0x0d, 0xd0, 0xfe, 0x1c, 0x70, 0x12,
+ 0x00, 0x1d, 0x03, 0xf4,
+ 0xce, 0xfd, 0xee, 0xd2, 0xf0, 0xb9, 0xe1, 0x07, 0xf2, 0x0e, 0x20, 0x70,
+ 0x3d, 0x3f, 0x31, 0x00,
+ 0x1f, 0x0d, 0x1d, 0x3f, 0x2d, 0x23, 0x07, 0x05, 0xa0, 0x0d, 0xe0, 0xdf,
+ 0xd2, 0xe3, 0xf1, 0xec,
+ 0xee, 0xab, 0xcf, 0xc0, 0xd2, 0xd2, 0xc1, 0xe7, 0xb3, 0x03, 0xf0, 0xfe,
+ 0x00, 0x15, 0x30, 0x42,
+ 0x10, 0xf1, 0xde, 0xeb, 0x0c, 0x5f, 0x0f, 0xde, 0x61, 0x21, 0x0b, 0xee,
+ 0x31, 0x17, 0x01, 0xf0,
+ 0xf1, 0x92, 0xd3, 0xb3, 0x00, 0x0d, 0xba, 0x10, 0x14, 0x03, 0xe0, 0x00,
+ 0x25, 0x75, 0x20, 0x00,
+ 0x00, 0x11, 0x10, 0x0d, 0x0f, 0xc0, 0xee, 0xc0, 0xfd, 0xd8, 0xee, 0x0d,
+ 0x50, 0x10, 0x2d, 0x40,
+ 0xff, 0xdf, 0x20, 0x70, 0x60, 0x0d, 0x2e, 0x01, 0x22, 0x0d, 0x1a, 0x20,
+ 0x00, 0xd3, 0x05, 0x11,
+ 0x00, 0x0f, 0x04, 0x04, 0x21, 0x30, 0x13, 0x01, 0xbb, 0xca, 0xaf, 0xe1,
+ 0xe5, 0xe0, 0xe0, 0xd0,
+ 0xc1, 0xd0, 0xd1, 0x13, 0x30, 0x1e, 0x74, 0x23, 0x2e, 0x08, 0x2b, 0x41,
+ 0x11, 0xf0, 0x00, 0xe0,
+ 0x81, 0xe1, 0xd1, 0xd2, 0xe0, 0xee, 0xe3, 0xe6, 0xa1, 0xe3, 0x04, 0x00,
+ 0xff, 0x0f, 0x24, 0x10,
+ 0x20, 0x71, 0x3e, 0x2a, 0x2f, 0x32, 0x15, 0xff, 0xed, 0x2d, 0x30, 0x0d,
+ 0x3e, 0x7f, 0xec, 0xbc,
+ 0xe0, 0xf0, 0xf0, 0x1b, 0x7e, 0x2e, 0x1f, 0x00, 0xff, 0x02, 0x03, 0x17,
+ 0x57, 0x01, 0x00, 0x20,
+ 0x12, 0xd2, 0x90, 0x0d, 0xf0, 0x00, 0x0c, 0xe0, 0x00, 0xff, 0xca, 0x20,
+ 0x50, 0x00, 0x3c, 0x3e,
+ 0x73, 0x24, 0x1f, 0x2d, 0x20, 0x04, 0xd0, 0xed, 0xec, 0xbd, 0xee, 0xcb,
+ 0x0e, 0xf0, 0xe0, 0x00,
+ 0xd2, 0x23, 0x23, 0x24, 0x14, 0x03, 0xb1, 0xe2, 0xf3, 0xb2, 0xc0, 0xf0,
+ 0xe5, 0xd2, 0xb1, 0x05,
+ 0x21, 0x2e, 0x2b, 0x0e, 0x13, 0x67, 0x35, 0x30, 0x3e, 0xf2, 0xd2, 0xe0,
+ 0x0c, 0x1e, 0xbe, 0xe0,
+ 0x01, 0x1f, 0x2c, 0x70, 0x70, 0x10, 0x05, 0xd1, 0xf0, 0xfb, 0x0f, 0x2f,
+ 0x30, 0xf1, 0xdf, 0xe1,
+ 0xf3, 0xbd, 0xb8, 0xef, 0xf0, 0xe1, 0xf0, 0xdd, 0x01, 0x26, 0x30, 0x2d,
+ 0x70, 0x7d, 0x1f, 0x2c,
+ 0x1e, 0x10, 0x23, 0x07, 0x01, 0x22, 0x33, 0x21, 0x01, 0x02, 0x55, 0x20,
+ 0x1b, 0x10, 0x02, 0xa0,
+ 0xcc, 0xce, 0xef, 0xd0, 0xd1, 0xf0, 0xff, 0xdd, 0xf1, 0xe2, 0x02, 0x07,
+ 0x75, 0x11, 0x14, 0x00,
+ 0x1e, 0x40, 0xf0, 0xde, 0x20, 0x51, 0x00, 0xf9, 0x3f, 0x40, 0x01, 0x0e,
+ 0xde, 0xef, 0xcf, 0x10,
+ 0x10, 0xdd, 0x9a, 0x00, 0x01, 0x25, 0x00, 0xb0, 0x01, 0xf2, 0x22, 0x10,
+ 0x32, 0x57, 0x02, 0x01,
+ 0xd2, 0x01, 0x10, 0x2e, 0x1e, 0x20, 0xde, 0x8d, 0xcf, 0xf0, 0xf1, 0xfc,
+ 0x0c, 0x30, 0x21, 0x00,
+ 0x4b, 0x3c, 0x1c, 0x0f, 0x1b, 0xee, 0xdf, 0x02, 0x74, 0x31, 0x20, 0x1d,
+ 0xe0, 0x04, 0xe4, 0xf1,
+ 0x2e, 0x5d, 0x10, 0x77, 0x51, 0x0a, 0x2d, 0x0f, 0x02, 0xc1, 0xfe, 0xfe,
+ 0xe0, 0xc5, 0x02, 0xf2,
+ 0xd1, 0xc0, 0xd0, 0xf0, 0xe4, 0xf1, 0x04, 0x06, 0x63, 0x32, 0x2d, 0x20,
+ 0x21, 0x11, 0x1f, 0xcc,
+ 0x8e, 0x00, 0x0e, 0xf1, 0xc2, 0x00, 0x01, 0xf0, 0xf0, 0x06, 0x34, 0x00,
+ 0x0e, 0x91, 0xe7, 0xe5,
+ 0xe0, 0x00, 0x30, 0x7f, 0x1d, 0x3f, 0x00, 0x0e, 0xec, 0xfc, 0x1e, 0x5d,
+ 0x3c, 0x3e, 0x30, 0xf0,
+ 0xfb, 0x0f, 0x6f, 0x0c, 0xdc, 0xe0, 0x0f, 0xfd, 0xde, 0xdf, 0xec, 0xff,
+ 0xd0, 0x04, 0x03, 0xce,
+ 0x00, 0x77, 0x57, 0x00, 0x00, 0x03, 0xf0, 0xe0, 0xe0, 0xd0, 0x03, 0x7f,
+ 0x1f, 0x53, 0x22, 0x10,
+ 0x1f, 0x22, 0x24, 0x2c, 0xfd, 0xdf, 0x0f, 0x0d, 0x5b, 0xfe, 0xfd, 0x0f,
+ 0xff, 0x12, 0x64, 0x0f,
+ 0xed, 0xc1, 0xb4, 0xe2, 0xf6, 0x83, 0xe2, 0xe5, 0xd1, 0x04, 0xe1, 0xff,
+ 0x01, 0x16, 0x10, 0x23,
+ 0x62, 0x12, 0x42, 0x10, 0x10, 0x01, 0xf4, 0xe5, 0xd0, 0xcf, 0xbd, 0xf2,
+ 0x03, 0xec, 0x08, 0xec,
+ 0x1f, 0x6e, 0x20, 0x3d, 0x6e, 0x10, 0x23, 0x1e, 0x29, 0x00, 0x0e, 0x0e,
+ 0xe0, 0x0f, 0xe2, 0xe2,
+ 0xd3, 0xc1, 0xce, 0xbd, 0xef, 0xef, 0xe1, 0x05, 0x6e, 0x18, 0x2e, 0x2f,
+ 0xf0, 0xf0, 0x0f, 0x40,
+ 0x22, 0x1c, 0x30, 0x30, 0x2e, 0x5e, 0x56, 0x34, 0x1f, 0x20, 0x13, 0x04,
+ 0xc0, 0xdc, 0x00, 0x12,
+ 0x00, 0xce, 0xdf, 0xef, 0xd0, 0xd0, 0xe7, 0xd7, 0x80, 0xee, 0xff, 0xcf,
+ 0xc0, 0xe1, 0xc3, 0xd0,
+ 0x02, 0x01, 0x1f, 0xee, 0xe0, 0x37, 0x51, 0x1f, 0x4d, 0x4e, 0x3e, 0x32,
+ 0x44, 0xef, 0xc8, 0xde,
+ 0xd2, 0x04, 0xb0, 0xdd, 0xf0, 0xd5, 0xc1, 0x05, 0x10, 0x20, 0x33, 0x51,
+ 0x61, 0x20, 0x1f, 0x01,
+ 0xe4, 0xf1, 0xd1, 0xf0, 0xf3, 0xb1, 0xd0, 0xeb, 0xbe, 0x0f, 0x00, 0x0c,
+ 0x1e, 0x6e, 0x00, 0x2b,
+ 0x1b, 0x2d, 0x2d, 0x1c, 0x2c, 0x2d, 0xff, 0x00, 0x00, 0x44, 0xe1, 0xd2,
+ 0x2f, 0x7c, 0x51, 0x44,
+ 0x20, 0x29, 0x1f, 0x2f, 0x31, 0x22, 0xf0, 0xd0, 0x01, 0x04, 0x80, 0xf0,
+ 0xb0, 0xf1, 0xf7, 0xf3,
+ 0x00, 0x30, 0x50, 0x1c, 0x0f, 0x20, 0xff, 0xea, 0x0e, 0x10, 0x12, 0x01,
+ 0xd2, 0xc0, 0xf2, 0xc6,
+ 0xf1, 0xd0, 0xcf, 0xfe, 0xef, 0xd1, 0xd3, 0xc4, 0xc7, 0xd1, 0xc0, 0xe0,
+ 0xb0, 0xd0, 0xe1, 0xf0,
+ 0x23, 0x67, 0x32, 0x42, 0x20, 0x0f, 0x2f, 0x1f, 0x0d, 0xff, 0xf1, 0xa0,
+ 0xff, 0xfe, 0x10, 0xfe,
+ 0xe0, 0x5c, 0x5a, 0x2e, 0x20, 0x3f, 0x3e, 0x50, 0x23, 0x34, 0x0e, 0xf9,
+ 0xc1, 0x05, 0xe4, 0xb0,
+ 0xc0, 0xef, 0xcd, 0xce, 0xe1, 0xd2, 0x00, 0x2d, 0x2b, 0x4e, 0x50, 0x10,
+ 0x29, 0x2e, 0x10, 0x30,
+ 0x41, 0x1e, 0x04, 0xa4, 0x00, 0x00, 0x0e, 0x08, 0xff, 0x4e, 0x3e, 0x1f,
+ 0x1f, 0x20, 0x43, 0x00,
+ 0x1a, 0x0f, 0xdd, 0x90, 0xe1, 0xe4, 0xc2, 0xc0, 0xd1, 0xce, 0x00, 0xff,
+ 0x0e, 0x30, 0x71, 0x07,
+ 0x13, 0x24, 0xf1, 0xe5, 0xe0, 0x0e, 0xf0, 0xc2, 0xe5, 0xe1, 0xe0, 0xfd,
+ 0xe0, 0x15, 0x20, 0x00,
+ 0x70, 0x50, 0x32, 0x11, 0x1c, 0x1c, 0x00, 0x00, 0x0f, 0xdd, 0x14, 0x03,
+ 0xe7, 0xf7, 0xe0, 0x0e,
+ 0xe0, 0x8f, 0xb0, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0xfd, 0xdf, 0xbc, 0xed,
+ 0xdf, 0x0e, 0xfb, 0x1d,
+ 0x60, 0x44, 0x43, 0x21, 0x34, 0x53, 0x21, 0x45, 0x10, 0x2e, 0xef, 0xe2,
+ 0x04, 0xe0, 0x0e, 0xed,
+ 0xcf, 0x0c, 0xff, 0x1e, 0x2e, 0xfd, 0xae, 0xff, 0xf1, 0xf7, 0x03, 0xe3,
+ 0xf0, 0x07, 0xe5, 0x90,
+ 0xd0, 0xf0, 0xe1, 0xd0, 0xec, 0x7f, 0x70, 0x10, 0x00, 0x0f, 0x09, 0x0d,
+ 0x0c, 0x1f, 0x00, 0x00,
+ 0xbe, 0xf0, 0xe0, 0xf2, 0xf4, 0xe0, 0xf0, 0xf1, 0x14, 0x20, 0x4d, 0x40,
+ 0x14, 0x00, 0x01, 0x03,
+ 0xa2, 0xe6, 0xe3, 0xd6, 0xd1, 0xb1, 0xf5, 0x01, 0x10, 0x4e, 0x30, 0x20,
+ 0x5f, 0x2d, 0x6e, 0x30,
+ 0x0e, 0xea, 0xe0, 0xe0, 0xe0, 0xce, 0xcc, 0xe0, 0xe1, 0x0e, 0x0e, 0xf6,
+ 0x14, 0x71, 0x4f, 0x2d,
+ 0x20, 0x31, 0x21, 0x0a, 0xfd, 0x0f, 0x03, 0xf1, 0xd0, 0xc0, 0xf0, 0xef,
+ 0xc0, 0xfe, 0x02, 0x43,
+ 0x02, 0x25, 0x73, 0x11, 0x1f, 0x07, 0x15, 0x01, 0xb0, 0xde, 0xde, 0xf0,
+ 0xe7, 0x01, 0xff, 0x0d,
+ 0x41, 0x20, 0x1f, 0x3d, 0x6f, 0x1e, 0x10, 0xe0, 0xe7, 0xe6, 0xb0, 0xc3,
+ 0xe0, 0xf2, 0xaf, 0xe0,
+ 0xe0, 0x0c, 0x0e, 0x5e, 0x41, 0x43, 0x13, 0x03, 0xff, 0xf0, 0xf0, 0x05,
+ 0xd3, 0xfc, 0x2a, 0x5f,
+ 0x0d, 0xfb, 0x0e, 0x0c, 0x5d, 0x1e, 0x6e, 0x1d, 0x0c, 0x0f, 0x11, 0xf5,
+ 0xe1, 0x00, 0xe1, 0xe3,
+ 0xd3, 0xc2, 0xb0, 0xe4, 0xbe, 0xe0, 0x02, 0x06, 0x40, 0x1e, 0x3f, 0x24,
+ 0x06, 0x20, 0xff, 0x01,
+ 0x05, 0x00, 0x0e, 0x21, 0x33, 0x70, 0x70, 0x4c, 0x0f, 0x2d, 0x1d, 0x4d,
+ 0x1e, 0x2e, 0x00, 0xb5,
+ 0xe1, 0xdf, 0xf0, 0xc0, 0xb0, 0xf3, 0xe3, 0x00, 0xfb, 0x0e, 0x0e, 0x46,
+ 0x25, 0x14, 0x32, 0x01,
+ 0x11, 0x41, 0x00, 0x04, 0xc6, 0xd2, 0xe0, 0xb1, 0xc0, 0xe2, 0xc1, 0xf0,
+ 0x09, 0x0e, 0x4f, 0x4f,
+ 0x3e, 0x2e, 0x3f, 0x3e, 0x4f, 0x3d, 0x10, 0x11, 0xea, 0xbe, 0xfe, 0xee,
+ 0xe0, 0x00, 0xf3, 0x22,
+ 0x31, 0x0c, 0x8d, 0xe0, 0x07, 0x01, 0x00, 0x0f, 0xcf, 0xff, 0x00, 0xea,
+ 0xdf, 0xec, 0x3d, 0x6e,
+ 0x1a, 0xff, 0x2e, 0x5f, 0x22, 0x33, 0x36, 0x32, 0x00, 0x01, 0x0f, 0x6c,
+ 0x40, 0x22, 0x34, 0x20,
+ 0xe0, 0xdf, 0xf0, 0x3e, 0x70, 0x4f, 0xed, 0xbd, 0xec, 0xdc, 0xd0, 0xd3,
+ 0xb7, 0xf7, 0xd1, 0xf0,
+ 0xee, 0xd0, 0xf0, 0x1e, 0x30, 0x50, 0x39, 0x1f, 0x00, 0x3f, 0x20, 0x60,
+ 0x10, 0x00, 0xad, 0xf5,
+ 0x02, 0xc0, 0xf2, 0x04, 0x26, 0x30, 0x1e, 0x2e, 0x10, 0x00, 0xef, 0x1f,
+ 0x40, 0xf3, 0x06, 0xf6,
+ 0xd0, 0x92, 0xb1, 0xe2, 0xf1, 0xe0, 0x01, 0x00, 0xff, 0xfd, 0xe0, 0x12,
+ 0x3f, 0x6c, 0x40, 0x2e,
+ 0x1a, 0x0d, 0xfd, 0xf0, 0xf0, 0xf0, 0xe0, 0xef, 0xef, 0x39, 0x7c, 0x4b,
+ 0x7f, 0x2f, 0x10, 0x1d,
+ 0x10, 0x11, 0x24, 0xf4, 0x01, 0x30, 0x01, 0xc2, 0xe2, 0x13, 0x01, 0xbf,
+ 0xfc, 0x0c, 0x70, 0x20,
+ 0x08, 0x00, 0x32, 0x12, 0x1f, 0x1e, 0x00, 0xd5, 0x03, 0x72, 0x00, 0xbb,
+ 0x00, 0xf0, 0xc0, 0xef,
+ 0xef, 0xd0, 0xdc, 0xef, 0x0e, 0x22, 0x01, 0x12, 0xf7, 0xd6, 0xc0, 0xa0,
+ 0x01, 0x11, 0xf0, 0xce,
+ 0x10, 0x14, 0xe0, 0xc0, 0xf0, 0xe2, 0x81, 0xf1, 0xf3, 0xe0, 0xff, 0xe0,
+ 0x00, 0x03, 0x70, 0x38,
+ 0x6e, 0x2c, 0x1d, 0x2d, 0x1c, 0x30, 0x11, 0x13, 0x0c, 0x0f, 0x01, 0xd7,
+ 0x07, 0xd0, 0xa0, 0xef,
+ 0xb0, 0xef, 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0xee, 0xf0, 0x20, 0x00, 0xf0,
+ 0x45, 0x21, 0x12, 0xf3,
+ 0x12, 0x53, 0x11, 0x50, 0x5c, 0x2d, 0x3e, 0x40, 0x30, 0x48, 0x4f, 0x3f,
+ 0x10, 0x1f, 0x0d, 0xcd,
+ 0xfb, 0xde, 0x00, 0xee, 0xef, 0xce, 0xdf, 0x92, 0xb5, 0xe0, 0x00, 0x0e,
+ 0x2c, 0x3f, 0x4f, 0x03,
+ 0xb6, 0xf3, 0xe4, 0x00, 0xf0, 0xc2, 0x07, 0xf3, 0xd1, 0x00, 0xf0, 0x07,
+ 0x20, 0x5e, 0x2f, 0x20,
+ 0x00, 0x00, 0x2f, 0x41, 0xf3, 0x00, 0x50, 0x3d, 0x2f, 0x20, 0x47, 0x24,
+ 0xf2, 0xc0, 0x20, 0x2c,
+ 0xe1, 0xc4, 0xed, 0xfe, 0x91, 0xe1, 0xbc, 0xea, 0xce, 0xde, 0x0c, 0x0c,
+ 0x00, 0x24, 0x1f, 0x1c,
+ 0x5f, 0x20, 0x21, 0x32, 0x33, 0x43, 0x25, 0x31, 0x10, 0x60, 0x11, 0x10,
+ 0x00, 0xdd, 0x0d, 0x4e,
+ 0x7e, 0x3e, 0x1c, 0x1d, 0x3d, 0xfe, 0xd0, 0xc7, 0xd2, 0xcf, 0xdf, 0xf2,
+ 0x17, 0x05, 0x02, 0xd3,
+ 0xb2, 0xc0, 0xee, 0x0e, 0x0e, 0x0d, 0x1f, 0x3c, 0x0b, 0xde, 0xdf, 0x40,
+ 0x72, 0x32, 0xfe, 0x0f,
+ 0x23, 0xf2, 0x0d, 0x68, 0x3f, 0x0e, 0xed, 0x0d, 0x4d, 0xde, 0x8f, 0xff,
+ 0xed, 0xdc, 0xbe, 0x05,
+ 0x07, 0x05, 0x02, 0xf2, 0x13, 0x31, 0x30, 0x2f, 0x21, 0x34, 0x61, 0x42,
+ 0x00, 0xee, 0xff, 0xef,
+ 0xe0, 0xad, 0xfe, 0x0e, 0xfd, 0xd1, 0x26, 0x50, 0x1f, 0x1f, 0x03, 0xf2,
+ 0x08, 0x0e, 0x0f, 0xde,
+ 0xfe, 0x3b, 0x3e, 0x4f, 0x30, 0x10, 0xbf, 0xe0, 0x61, 0x30, 0x03, 0xe2,
+ 0x00, 0x0d, 0xd0, 0x00,
+ 0x52, 0x75, 0x37, 0x02, 0x00, 0x31, 0x00, 0xdf, 0xb1, 0xe4, 0xe1, 0x00,
+ 0x20, 0x0e, 0xee, 0x10,
+ 0x31, 0xcd, 0xc9, 0xf0, 0x00, 0x34, 0xf3, 0x80, 0xbe, 0x02, 0x20, 0xfb,
+ 0xed, 0xff, 0x06, 0x01,
+ 0x51, 0x04, 0x04, 0xd2, 0xe1, 0xe0, 0x81, 0xf0, 0xe1, 0x13, 0x0f, 0x0b,
+ 0x1e, 0x09, 0xfd, 0x20,
+ 0x72, 0x4e, 0x09, 0x0e, 0x3d, 0x3c, 0x1d, 0x10, 0x30, 0x30, 0x00, 0xe0,
+ 0x03, 0xf1, 0xff, 0xff,
+ 0x10, 0xf0, 0x8b, 0x0c, 0x01, 0xc1, 0xd1, 0xd0, 0xd6, 0xb3, 0xf0, 0xf0,
+ 0xe0, 0xc2, 0xc0, 0x03,
+ 0x04, 0x22, 0x67, 0x47, 0x30, 0x20, 0x00, 0x0e, 0x70, 0x10, 0x00, 0x2f,
+ 0x2f, 0x0f, 0x1f, 0x0e,
+ 0xe0, 0xef, 0xbd, 0xfd, 0xe0, 0xb0, 0x02, 0xfd, 0x03, 0x07, 0x56, 0x20,
+ 0x00, 0x01, 0x21, 0x00,
+ 0xa1, 0xf1, 0xe7, 0xe1, 0xd2, 0xd1, 0xa2, 0xf3, 0x06, 0xf0, 0x0e, 0x1f,
+ 0x02, 0x13, 0x2f, 0x0c,
+ 0x2c, 0x5e, 0x1d, 0x0d, 0x0c, 0xfe, 0x20, 0x0e, 0x1d, 0x1a, 0x0f, 0x0f,
+ 0x51, 0x76, 0x62, 0x00,
+ 0xef, 0x0f, 0x31, 0xef, 0xfb, 0x00, 0x02, 0x00, 0xfc, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x50, 0xf3, 0x53, 0x45, 0x90, 0xf3, 0xf8, 0x46, 0xf8, 0x40, 0x10, 0xdb,
+ 0x90, 0x0f, 0x00, 0x1d,
+ 0x3f, 0x3f, 0x00, 0xde, 0xee, 0x21, 0x77, 0x72, 0x42, 0x05, 0x21, 0x01,
+ 0x02, 0x21, 0x20, 0x1e,
+ 0x23, 0x13, 0xe9, 0xaf, 0xf1, 0xf5, 0xe1, 0xc0, 0xe0, 0xc2, 0xd0, 0xf0,
+ 0xd1, 0xe1, 0xc0, 0x00,
+ 0xf4, 0x0e, 0x7b, 0x0d, 0x00, 0x00, 0x0b, 0xcd, 0x01, 0xf3, 0xf1, 0xcd,
+ 0x0d, 0x13, 0x56, 0x31,
+ 0x43, 0x07, 0x02, 0x1f, 0x5c, 0x0f, 0x0e, 0x00, 0xe1, 0xf3, 0xc0, 0xc2,
+ 0xc6, 0xe3, 0xd0, 0xb0,
+ 0xf2, 0xf6, 0x02, 0x04, 0x30, 0x22, 0x40, 0xf0, 0xd0, 0x02, 0xe0, 0x0e,
+ 0x19, 0x00, 0x1e, 0x7f,
+ 0x3d, 0x0d, 0xef, 0x2f, 0x3c, 0x7a, 0x5f, 0x1e, 0x3d, 0x0e, 0x0a, 0xff,
+ 0xf1, 0xe3, 0xe0, 0x0d,
+ 0x1f, 0xfd, 0xd0, 0x03, 0x54, 0x10, 0x10, 0x21, 0x6f, 0x6b, 0x2f, 0x10,
+ 0x14, 0x44, 0x40, 0x2e,
+ 0x0c, 0xf0, 0x01, 0x03, 0xd4, 0xb2, 0xf7, 0xc1, 0xd0, 0x00, 0xf1, 0x01,
+ 0xf0, 0x20, 0x10, 0xee,
+ 0xce, 0x04, 0x06, 0xb0, 0xeb, 0x0f, 0x31, 0xe3, 0xb0, 0x01, 0x15, 0xc3,
+ 0xd2, 0xe3, 0xd1, 0xd1,
+ 0xc6, 0xf3, 0xe2, 0x80, 0xc0, 0xbd, 0xdf, 0xf0, 0x0d, 0xed, 0x18, 0x6b,
+ 0x40, 0x40, 0x20, 0x03,
+ 0x10, 0x12, 0x02, 0xf0, 0x11, 0x42, 0x04, 0x04, 0x20, 0x0f, 0xdb, 0xa0,
+ 0x00, 0xf1, 0xfc, 0x0b,
+ 0xef, 0x0e, 0x30, 0xff, 0xea, 0x0d, 0x00, 0xe0, 0x81, 0xf3, 0xe1, 0xd0,
+ 0xe1, 0xe4, 0xf0, 0x04,
+ 0x43, 0x52, 0x6f, 0x2a, 0x3f, 0x3f, 0x3e, 0x2a, 0x4c, 0x2d, 0x00, 0x1f,
+ 0x00, 0xd1, 0xce, 0xfd,
+ 0xeb, 0xdf, 0xf2, 0x30, 0x3a, 0xe0, 0xd0, 0x11, 0x00, 0x8e, 0xdc, 0xb0,
+ 0xe2, 0xee, 0xee, 0xe3,
+ 0x17, 0x07, 0xf1, 0xf0, 0xd1, 0xe3, 0xa2, 0xe0, 0xe0, 0x00, 0xf0, 0x0f,
+ 0x20, 0x70, 0x30, 0xc0,
+ 0xe2, 0x10, 0x2d, 0x08, 0x00, 0x72, 0x44, 0x04, 0x02, 0x13, 0x23, 0x02,
+ 0x10, 0xfd, 0xdb, 0xfd,
+ 0xbe, 0xbe, 0xdf, 0xbb, 0xed, 0xee, 0x04, 0x11, 0x3e, 0x2d, 0x71, 0x12,
+ 0x1b, 0x08, 0xee, 0x20,
+ 0x02, 0x0f, 0x00, 0x01, 0xb1, 0x00, 0xef, 0x0f, 0x2f, 0x20, 0x50, 0x4d,
+ 0x3a, 0x5d, 0x1a, 0x30,
+ 0x30, 0x53, 0x00, 0x0f, 0x2d, 0x11, 0xe4, 0xc7, 0xe4, 0xe1, 0xc1, 0xc0,
+ 0xdf, 0xd0, 0xe2, 0xf0,
+ 0x00, 0x4d, 0x4c, 0xee, 0xde, 0x20, 0x05, 0x11, 0xff, 0xed, 0x20, 0x35,
+ 0x0f, 0xdb, 0x4f, 0x70,
+ 0x40, 0x2e, 0x0b, 0x10, 0x00, 0x9c, 0xed, 0xcc, 0xff, 0xc0, 0xf0, 0xe5,
+ 0x04, 0x13, 0x02, 0x20,
+ 0x20, 0xf3, 0xc2, 0x10, 0x21, 0x14, 0x24, 0x0f, 0xfd, 0xc1, 0x07, 0x07,
+ 0xe0, 0xce, 0xe0, 0x12,
+ 0x40, 0xe0, 0x3e, 0x50, 0x02, 0xff, 0x7b, 0x3e, 0x3f, 0x50, 0x0f, 0xde,
+ 0xee, 0xd0, 0xe3, 0xcd,
+ 0xbe, 0x00, 0xf0, 0xe8, 0x0f, 0x20, 0x30, 0x5f, 0x50, 0x12, 0x31, 0x42,
+ 0x10, 0x00, 0x15, 0x11,
+ 0x0f, 0xed, 0xf4, 0x57, 0x27, 0x11, 0x3f, 0x2e, 0x01, 0x01, 0xd0, 0x00,
+ 0xe0, 0x8d, 0xcd, 0x0e,
+ 0xcd, 0xdf, 0x00, 0x17, 0x10, 0xdb, 0xc0, 0x01, 0x32, 0x70, 0x30, 0x10,
+ 0x25, 0x16, 0xc1, 0xd2,
+ 0xd1, 0xc2, 0xb1, 0xe3, 0xe1, 0xf0, 0x0f, 0xdc, 0xff, 0x10, 0x30, 0x2e,
+ 0x6b, 0x3b, 0x4e, 0x2e,
+ 0x4d, 0x1c, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x53, 0x0f, 0x2f, 0x0d, 0xfc,
+ 0xeb, 0x0f, 0x21, 0x46,
+ 0x00, 0xdd, 0xcf, 0xd0, 0xad, 0xcc, 0xa0, 0xe0, 0xd4, 0xf2, 0xf1, 0xf6,
+ 0x01, 0xf4, 0x02, 0x41,
+ 0x33, 0x72, 0x31, 0x1f, 0x2e, 0x2f, 0x20, 0x0a, 0x0e, 0x5e, 0x0a, 0x0f,
+ 0x31, 0x12, 0x1d, 0x4d,
+ 0x30, 0x73, 0x11, 0x30, 0x0b, 0xff, 0xf2, 0xd1, 0xbf, 0xfa, 0x0d, 0xb0,
+ 0xe6, 0xe4, 0xd1, 0xd2,
+ 0xe6, 0xe3, 0x02, 0x10, 0x20, 0x60, 0x21, 0x02, 0xe5, 0xd2, 0xf0, 0xda,
+ 0xaf, 0xf0, 0xde, 0xfe,
+ 0xf0, 0x0f, 0x50, 0x4f, 0x20, 0x20, 0x1d, 0x31, 0x32, 0x1b, 0x0d, 0x2e,
+ 0xf3, 0x04, 0x0e, 0xef,
+ 0x02, 0xb1, 0xf5, 0xb5, 0x02, 0x21, 0x3e, 0x7e, 0x3c, 0xf9, 0xff, 0x1f,
+ 0xee, 0xad, 0xfd, 0xbf,
+ 0xec, 0x00, 0xee, 0xff, 0x00, 0x40, 0x20, 0x52, 0x27, 0x13, 0x20, 0x2f,
+ 0x30, 0x11, 0x4d, 0x0d,
+ 0x2a, 0x0d, 0x00, 0xb4, 0xd3, 0xb2, 0x01, 0xd0, 0x11, 0x56, 0x55, 0x00,
+ 0x00, 0xe0, 0xfa, 0xff,
+ 0xce, 0xff, 0x01, 0xb1, 0xfc, 0xed, 0x00, 0xe2, 0xf4, 0x05, 0x01, 0x00,
+ 0x3d, 0x3e, 0x70, 0x3f,
+ 0x3d, 0x42, 0x14, 0x00, 0x0f, 0xdc, 0xde, 0xed, 0xed, 0xc1, 0xf4, 0xd5,
+ 0xd6, 0xc3, 0xdf, 0xd0,
+ 0xc0, 0xd5, 0x93, 0xf2, 0x01, 0xd2, 0xc3, 0xf4, 0xd1, 0xf2, 0x04, 0x43,
+ 0x13, 0x30, 0x2e, 0x5c,
+ 0x5d, 0x3f, 0x6f, 0x1a, 0x0d, 0x20, 0x02, 0xe0, 0xf8, 0xfe, 0xef, 0xde,
+ 0xce, 0xfe, 0x0c, 0x30,
+ 0x1f, 0x42, 0x14, 0x0e, 0xfc, 0x0e, 0x5e, 0x0e, 0x5c, 0x3e, 0x50, 0x10,
+ 0xf1, 0x0e, 0xfe, 0x15,
+ 0x16, 0x01, 0x2f, 0x7f, 0x60, 0x02, 0x13, 0x13, 0x07, 0x04, 0xd0, 0x00,
+ 0x04, 0xdf, 0xcc, 0xf0,
+ 0xd0, 0xed, 0xdb, 0x0f, 0x10, 0x7e, 0x30, 0x2f, 0x43, 0x25, 0x03, 0xb3,
+ 0xf1, 0xa1, 0xf5, 0xf2,
+ 0xc2, 0xe1, 0xe0, 0xef, 0xcb, 0xf0, 0xff, 0x00, 0x2b, 0x0d, 0x0e, 0x73,
+ 0x22, 0x02, 0x15, 0x21,
+ 0x00, 0x1e, 0x15, 0x02, 0x13, 0xf2, 0xe2, 0xe3, 0x0e, 0x0d, 0x72, 0x53,
+ 0x29, 0x1c, 0x0e, 0x1e,
+ 0x1f, 0x10, 0x00, 0xee, 0xca, 0xe0, 0xbf, 0xef, 0xe0, 0xcf, 0xd0, 0xf1,
+ 0xdf, 0xf6, 0xe7, 0x02,
+ 0x50, 0x4d, 0x10, 0x20, 0x0f, 0x2d, 0x1f, 0x10, 0x3c, 0x4e, 0x5c, 0x6c,
+ 0x4f, 0x2f, 0x1e, 0x11,
+ 0x12, 0x00, 0x10, 0x00, 0x0a, 0x10, 0xfd, 0xbe, 0xdb, 0xde, 0xca, 0xef,
+ 0xfc, 0xf0, 0xef, 0x32,
+ 0x76, 0x31, 0xf1, 0xc1, 0x02, 0xf2, 0xc0, 0xfd, 0xd1, 0xe5, 0xc1, 0xd0,
+ 0xd0, 0xd0, 0xd1, 0x04,
+ 0x53, 0x7f, 0x2d, 0x23, 0x24, 0x10, 0x09, 0x20, 0x11, 0xd5, 0xb1, 0xe0,
+ 0xb1, 0xef, 0xc0, 0xf0,
+ 0x02, 0x02, 0x0e, 0x22, 0x77, 0x10, 0x2c, 0x21, 0x21, 0x11, 0x0f, 0xcd,
+ 0xf0, 0xd0, 0xe7, 0xd1,
+ 0xef, 0xfe, 0xdf, 0xdf, 0xca, 0x0f, 0x2e, 0x6f, 0x2f, 0x4f, 0x60, 0x1f,
+ 0x2d, 0x0f, 0x0b, 0x00,
+ 0x01, 0x0f, 0x2c, 0x1e, 0x30, 0x23, 0x00, 0x04, 0x21, 0x2e, 0x00, 0xb7,
+ 0xd1, 0xf0, 0x02, 0x03,
+ 0xb2, 0xee, 0x90, 0xe7, 0xc4, 0x00, 0x00, 0x1f, 0x20, 0x3e, 0x7f, 0x0c,
+ 0x2d, 0x0c, 0x0f, 0x1f,
+ 0x19, 0xee, 0x0f, 0x01, 0xef, 0x0b, 0x3f, 0x20, 0x2f, 0x0f, 0xdd, 0xbb,
+ 0xff, 0xff, 0x00, 0xb0,
+ 0x0f, 0xc4, 0xa7, 0xd3, 0xf3, 0xd4, 0xc3, 0xc2, 0xf2, 0xf2, 0xf0, 0x00,
+ 0x0f, 0x40, 0x77, 0x21,
+ 0x21, 0xf4, 0xf4, 0x02, 0xe0, 0xf0, 0x10, 0x34, 0x32, 0x41, 0x1f, 0xec,
+ 0xae, 0xeb, 0xfc, 0x0f,
+ 0xec, 0x0f, 0x0d, 0x5e, 0x00, 0x0f, 0x9d, 0xff, 0xe4, 0xf6, 0x03, 0x10,
+ 0x20, 0x3f, 0x5d, 0x3a,
+ 0x5f, 0x2f, 0x40, 0x00, 0xf2, 0x16, 0x31, 0x01, 0x14, 0x02, 0xcf, 0xed,
+ 0x01, 0xd0, 0x9e, 0xfd,
+ 0xfc, 0x0d, 0x1a, 0x4d, 0x2d, 0x2e, 0x3f, 0x21, 0x41, 0x10, 0xb1, 0xf7,
+ 0xe7, 0xf1, 0xf2, 0xe0,
+ 0x92, 0xe1, 0xe2, 0xc0, 0xec, 0xc0, 0x00, 0xf3, 0x01, 0x0d, 0x09, 0x10,
+ 0x70, 0x2e, 0x30, 0x01,
+ 0xff, 0xcd, 0xfc, 0x0f, 0xee, 0xfe, 0x3f, 0x74, 0x62, 0x00, 0x2e, 0x00,
+ 0xe0, 0x0f, 0xf1, 0x00,
+ 0xfa, 0x00, 0x00, 0x00, 0x0b, 0xef, 0xdf, 0xf0, 0xbe, 0xde, 0xfe, 0xb2,
+ 0xf3, 0xd4, 0xf5, 0xe6,
+ 0xf2, 0xe5, 0xb0, 0xb1, 0xf0, 0x0f, 0x4f, 0x0d, 0x5f, 0x3e, 0x3d, 0x40,
+ 0x32, 0x3f, 0x2b, 0x20,
+ 0x4f, 0x10, 0x07, 0x00, 0xfe, 0x00, 0xf0, 0x01, 0x30, 0xcd, 0xc0, 0xf2,
+ 0xd4, 0xdf, 0x0c, 0x01,
+ 0x77, 0x04, 0xe3, 0xa2, 0xf4, 0xd2, 0xc3, 0xc2, 0xee, 0x01, 0xf5, 0x00,
+ 0x21, 0x0f, 0x2b, 0x0d,
+ 0x0e, 0x0e, 0xfe, 0xd9, 0xdf, 0x0e, 0x3e, 0x7e, 0x10, 0x00, 0xf5, 0xe3,
+ 0x02, 0x03, 0x00, 0x70,
+ 0x53, 0x0c, 0x4c, 0x1d, 0x20, 0x0d, 0xbd, 0x01, 0x0f, 0x0a, 0x1e, 0xec,
+ 0xbd, 0xeb, 0xe0, 0xf2,
+ 0xf2, 0xfe, 0x0a, 0x0f, 0x5d, 0x2e, 0x50, 0x32, 0x11, 0x0e, 0x01, 0xd6,
+ 0xc0, 0xef, 0xf0, 0x06,
+ 0x34, 0x22, 0x61, 0x32, 0x5e, 0x1b, 0x70, 0x12, 0x10, 0x0e, 0xf0, 0xe0,
+ 0xf0, 0xf0, 0x02, 0x00,
+ 0xc2, 0xd7, 0xd4, 0xe0, 0xb0, 0xdf, 0xf0, 0xfe, 0xfc, 0xce, 0xde, 0x00,
+ 0x1f, 0x3a, 0x4f, 0x70,
+ 0x36, 0x12, 0x50, 0x1d, 0x1f, 0x2d, 0x3c, 0x0c, 0x0f, 0xf0, 0xe1, 0xaf,
+ 0xee, 0xd2, 0xd1, 0xc4,
+ 0xf7, 0xc3, 0xe0, 0xc2, 0xe4, 0xe3, 0xf3, 0x02, 0x13, 0x60, 0x22, 0x30,
+ 0x01, 0x14, 0x11, 0x00,
+ 0x0f, 0xfa, 0xef, 0xe0, 0x07, 0x21, 0x22, 0x30, 0x30, 0xf0, 0xca, 0x2f,
+ 0x7d, 0x70, 0x0e, 0xfe,
+ 0xfd, 0xfc, 0x0e, 0x0e, 0x00, 0xc0, 0xd7, 0x00, 0xe0, 0xe0, 0x0d, 0x7e,
+ 0x4d, 0x0d, 0x1e, 0x3d,
+ 0x3f, 0x5e, 0x1f, 0x22, 0x37, 0x17, 0x03, 0xff, 0xe0, 0xe4, 0xd0, 0xf0,
+ 0xc0, 0xff, 0x00, 0x3e,
+ 0x6f, 0x1d, 0x40, 0x30, 0x20, 0x3c, 0x4f, 0x31, 0xf5, 0x81, 0xe5, 0xd0,
+ 0xf1, 0xd1, 0xa5, 0x02,
+ 0xd0, 0xef, 0xc0, 0xf0, 0xef, 0xed, 0x0c, 0xef, 0x30, 0x34, 0x54, 0x04,
+ 0xe3, 0x00, 0xed, 0xfe,
+ 0x22, 0x77, 0x12, 0x00, 0x15, 0x23, 0x00, 0x00, 0x5d, 0x40, 0x10, 0x20,
+ 0x10, 0x3f, 0x67, 0x20,
+ 0x0b, 0xee, 0x00, 0x0f, 0x00, 0x10, 0x1f, 0xec, 0xb0, 0xe2, 0xd2, 0xa3,
+ 0xd6, 0xc1, 0xcf, 0xcc,
+ 0xf0, 0xe1, 0x0c, 0xec, 0x00, 0x5f, 0x2c, 0x2e, 0x30, 0x57, 0x20, 0x10,
+ 0x30, 0x00, 0x31, 0x00,
+ 0xf9, 0x2f, 0x5f, 0x1f, 0x0e, 0x2e, 0x20, 0x11, 0x42, 0x2c, 0x2b, 0x0d,
+ 0xf0, 0x0d, 0x10, 0xa0,
+ 0x91, 0xe5, 0xd0, 0xcf, 0xe1, 0x03, 0x00, 0xe1, 0x07, 0x04, 0xf1, 0xb1,
+ 0x00, 0x00, 0x76, 0x00,
+ 0x0c, 0x54, 0x12, 0xc8, 0x00, 0x11, 0xf2, 0xad, 0xf0, 0x04, 0x00, 0xfd,
+ 0xf0, 0x12, 0x01, 0x20,
+ 0x0f, 0x20, 0x31, 0x23, 0x22, 0x20, 0x1d, 0x52, 0x13, 0xf0, 0xad, 0x04,
+ 0x01, 0xfb, 0xbe, 0xf1,
+ 0xf1, 0x04, 0x11, 0x1f, 0x1a, 0xfd, 0x00, 0x2b, 0xfc, 0x30, 0x30, 0xbb,
+ 0x00, 0x7f, 0x10, 0x0d,
+ 0x00, 0x31, 0x21, 0xf2, 0xe1, 0xd3, 0x21, 0x3c, 0x0e, 0x70, 0x62, 0x00,
+ 0x09, 0xe1, 0x02, 0x12,
+ 0xe1, 0xe3, 0xf6, 0xf0, 0xef, 0x30, 0x57, 0xf3, 0xb1, 0xff, 0xf0, 0xe0,
+ 0x03, 0x13, 0x21, 0x3d,
+ 0x78, 0x2e, 0x3e, 0x0d, 0xec, 0x0e, 0x4e, 0x0e, 0xed, 0x21, 0x5d, 0x0c,
+ 0x01, 0x17, 0xd1, 0xaf,
+ 0xc0, 0xe0, 0xe4, 0xb0, 0xdd, 0xc0, 0x03, 0xd3, 0xf0, 0x00, 0xff, 0x00,
+ 0x44, 0x02, 0x02, 0x27,
+ 0x67, 0x03, 0x21, 0x22, 0x20, 0x00, 0xf1, 0xd2, 0x0f, 0x0c, 0x30, 0x34,
+ 0x20, 0x4b, 0x2d, 0x2f,
+ 0xcd, 0x0f, 0x23, 0xc0, 0x9c, 0xf0, 0xdf, 0xe0, 0xfa, 0x1f, 0x3f, 0xff,
+ 0xcc, 0x00, 0x20, 0x54,
+ 0x33, 0x20, 0x1f, 0x41, 0x72, 0x67, 0x16, 0x00, 0x0e, 0xd0, 0xf1, 0xd1,
+ 0x12, 0x10, 0x0c, 0x3e,
+ 0x4f, 0x4e, 0x1c, 0x2f, 0x40, 0x31, 0x32, 0x0c, 0xfa, 0x60, 0x22, 0xf1,
+ 0xc2, 0xd4, 0xb4, 0xd3,
+ 0xc3, 0xd5, 0xf2, 0xf1, 0x20, 0x10, 0x64, 0x02, 0xee, 0x0c, 0xfd, 0x0e,
+ 0xf0, 0x01, 0xcc, 0xcb,
+ 0xff, 0xf0, 0x0d, 0x0e, 0xee, 0xc1, 0x02, 0x64, 0x32, 0x63, 0x15, 0x2f,
+ 0x1e, 0x29, 0x1f, 0x0f,
+ 0x0c, 0xed, 0x2f, 0x73, 0x0b, 0xcb, 0x02, 0x43, 0xe1, 0xe0, 0x05, 0x11,
+ 0xe0, 0xd0, 0xb2, 0xe2,
+ 0xdf, 0xcd, 0xed, 0xe0, 0xef, 0x14, 0x1d, 0xe9, 0x10, 0x62, 0x20, 0x63,
+ 0x32, 0x2f, 0x1c, 0x20,
+ 0x20, 0x3f, 0xfb, 0xf0, 0x10, 0x40, 0x2d, 0x29, 0x10, 0x40, 0x00, 0xd1,
+ 0xe1, 0xc0, 0xd0, 0x02,
+ 0x04, 0x30, 0x37, 0xf7, 0xb3, 0xcf, 0xb0, 0xe1, 0xd3, 0xd1, 0xc0, 0xf1,
+ 0x00, 0xfc, 0xff, 0x21,
+ 0x42, 0x0e, 0x1a, 0x6f, 0x0e, 0xef, 0xcd, 0x01, 0x00, 0x91, 0x07, 0xf2,
+ 0xfe, 0xec, 0x11, 0x24,
+ 0x50, 0x6f, 0x1e, 0x2f, 0x0f, 0x10, 0x00, 0xe0, 0xfd, 0xfd, 0xb8, 0xee,
+ 0xde, 0xf0, 0x02, 0x00,
+ 0x1a, 0x30, 0x70, 0x5f, 0x1f, 0x0f, 0x1b, 0x00, 0x00, 0xb1, 0x01, 0x10,
+ 0x0e, 0xc2, 0x07, 0xe3,
+ 0xfe, 0xba, 0x10, 0x30, 0x30, 0x7f, 0x30, 0x12, 0x20, 0x00, 0x21, 0x0f,
+ 0x0c, 0xce, 0xff, 0xec,
+ 0xda, 0xbe, 0xdf, 0xc4, 0xd6, 0xb1, 0xe2, 0xd0, 0x00, 0x01, 0x12, 0x7f,
+ 0x2f, 0x0e, 0x20, 0x10,
+ 0x26, 0x21, 0x00, 0x1d, 0x1c, 0x2d, 0x0d, 0x1b, 0x0c, 0x10, 0xff, 0xcf,
+ 0xf2, 0xc4, 0xc3, 0xf6,
+ 0xd0, 0xb0, 0xd1, 0xa3, 0xd0, 0xf2, 0xe0, 0xc0, 0x00, 0x10, 0x0b, 0x0e,
+ 0x12, 0x17, 0x00, 0xf0,
+ 0x13, 0x25, 0xe3, 0xe2, 0x22, 0x40, 0x00, 0xf0, 0x73, 0x40, 0x2b, 0x2f,
+ 0x10, 0x1f, 0xfb, 0xbf,
+ 0x3f, 0x40, 0x0e, 0x0f, 0x5d, 0xf8, 0xba, 0x00, 0xfe, 0x00, 0xf0, 0xef,
+ 0x0f, 0x0e, 0x70, 0x4e,
+ 0x3d, 0x00, 0x24, 0x03, 0x0c, 0xdc, 0xe0, 0x16, 0x23, 0x00, 0xff, 0xd0,
+ 0x11, 0x11, 0xe1, 0x43,
+ 0x74, 0x72, 0x20, 0x1f, 0x1e, 0x1d, 0x3d, 0x04, 0xf2, 0xcf, 0xd0, 0xc3,
+ 0xe7, 0xc1, 0xd1, 0xde,
+ 0xef, 0xd0, 0xee, 0x10, 0xfc, 0xee, 0x44, 0x44, 0x25, 0x22, 0xe0, 0x90,
+ 0xef, 0xf2, 0xc6, 0xc1,
+ 0xb0, 0xf1, 0xd7, 0xf1, 0x01, 0x00, 0x40, 0x31, 0x40, 0x3b, 0x3e, 0x1f,
+ 0x40, 0x1e, 0x1f, 0xf0,
+ 0xef, 0x13, 0x57, 0x1c, 0x40, 0x66, 0x00, 0xdb, 0x01, 0x04, 0x0f, 0xae,
+ 0x0f, 0x01, 0x00, 0xef,
+ 0xde, 0x00, 0xd0, 0xcf, 0xdc, 0xf1, 0xf1, 0xf3, 0x60, 0x3f, 0x39, 0x0f,
+ 0x00, 0x21, 0x31, 0x41,
+ 0x32, 0x51, 0x1f, 0x3b, 0x2f, 0x2e, 0x5e, 0x21, 0x0d, 0xc8, 0x1c, 0x50,
+ 0xfe, 0x0d, 0x2f, 0x0f,
+ 0xef, 0xcf, 0xf1, 0xe5, 0xc0, 0xd2, 0xd7, 0xe2, 0xd2, 0xdf, 0x1f, 0x71,
+ 0x33, 0x21, 0x0f, 0x1f,
+ 0x1d, 0x1e, 0xf0, 0x91, 0xd2, 0xd2, 0xc7, 0xd3, 0xce, 0xfe, 0xf6, 0x03,
+ 0x03, 0x00, 0xed, 0x30,
+ 0x74, 0x7e, 0x1c, 0x0e, 0x0f, 0x00, 0xfe, 0xe5, 0xf7, 0x04, 0xe2, 0xe1,
+ 0x12, 0x10, 0x20, 0x00,
+ 0x22, 0xfb, 0xff, 0x20, 0x0d, 0x3c, 0x72, 0x50, 0xfb, 0xe0, 0x0f, 0xe0,
+ 0xb2, 0xed, 0x0e, 0x01,
+ 0x0f, 0x3d, 0x6e, 0x18, 0x2f, 0x0e, 0x3e, 0x70, 0x1d, 0x0f, 0x0f, 0x0e,
+ 0x00, 0x02, 0x0e, 0x20,
+ 0x25, 0x02, 0x14, 0xe0, 0xc3, 0xf3, 0x17, 0xf1, 0x80, 0xf1, 0xf5, 0x02,
+ 0x0e, 0xdd, 0x01, 0xe1,
+ 0xf0, 0x1b, 0x70, 0x7f, 0x0a, 0x40, 0x2d, 0x1b, 0x2f, 0x11, 0x00, 0xee,
+ 0xff, 0xd0, 0xb0, 0xf0,
+ 0xe5, 0xe1, 0xd0, 0xbc, 0xde, 0xf4, 0xc2, 0xef, 0x0f, 0x20, 0x42, 0x00,
+ 0x0f, 0x03, 0xd1, 0xe7,
+ 0x07, 0xd2, 0xb2, 0xf2, 0xf4, 0x02, 0x40, 0x1f, 0x12, 0x41, 0xf0, 0x4f,
+ 0x50, 0x0e, 0x3f, 0x54,
+ 0x00, 0xff, 0x01, 0xef, 0xf9, 0xdf, 0xf2, 0xb1, 0xc8, 0xfe, 0x00, 0x30,
+ 0x2e, 0x0f, 0x50, 0x2f,
+ 0xfd, 0xbd, 0xff, 0xff, 0xe1, 0x03, 0x06, 0x02, 0x14, 0xf2, 0x04, 0x04,
+ 0x91, 0x00, 0x44, 0x00,
+ 0x5c, 0xe4, 0x1c, 0x04, 0x9b, 0xe5, 0xbf, 0x02, 0xb4, 0xe3, 0xe4, 0xf1,
+ 0x02, 0x10, 0x30, 0x5d,
+ 0x4d, 0x3b, 0x5b, 0x2c, 0x3d, 0x3b, 0x3d, 0x4c, 0x2d, 0x3d, 0x3e, 0x50,
+ 0x30, 0x42, 0x31, 0x41,
+ 0x32, 0x42, 0x22, 0x32, 0x41, 0x23, 0x34, 0x32, 0x22, 0x13, 0x13, 0x17,
+ 0x06, 0x03, 0x03, 0x05,
+ 0x02, 0x14, 0x13, 0x02, 0x04, 0x02, 0xe3, 0xd2, 0xb1, 0xd1, 0xe1, 0x01,
+ 0x10, 0x71, 0x31, 0x55,
+ 0x55, 0x33, 0x43, 0x44, 0x33, 0x43, 0x33, 0x45, 0x33, 0x24, 0x24, 0x12,
+ 0x03, 0xf4, 0xc2, 0xd4,
+ 0xb2, 0xd3, 0xe3, 0xc4, 0xe3, 0xc2, 0xd3, 0xd2, 0xc3, 0xd3, 0xc5, 0xd3,
+ 0xd2, 0xc2, 0xd2, 0xd2,
+ 0xc4, 0xe3, 0xe3, 0xf4, 0xf2, 0x12, 0x20, 0x4d, 0x3b, 0x5d, 0x3b, 0x3d,
+ 0x4e, 0x3e, 0x3e, 0x30,
+ 0x43, 0x34, 0x35, 0x34, 0x64, 0x35, 0x33, 0x33, 0x44, 0x43, 0x34, 0x33,
+ 0x43, 0x22, 0x32, 0x31,
+ 0x32, 0x22, 0x13, 0x16, 0x13, 0x15, 0x02, 0x13, 0x34, 0x54, 0x32, 0x54,
+ 0x32, 0x24, 0x22, 0x13,
+ 0x03, 0xd4, 0xb3, 0xd3, 0xc3, 0xc3, 0xe4, 0xf3, 0xe2, 0xf4, 0x03, 0x13,
+ 0x22, 0x44, 0x53, 0x33,
+ 0x33, 0x22, 0x23, 0x02, 0xc2, 0xc3, 0xb4, 0xc3, 0xd5, 0xc2, 0xd4, 0xd2,
+ 0xd3, 0xf3, 0xf3, 0x04,
+ 0x03, 0x24, 0x41, 0x52, 0x43, 0x43, 0x33, 0x42, 0x33, 0x34, 0x31, 0x21,
+ 0x20, 0x20, 0x20, 0x10,
+ 0x0d, 0x0b, 0xfc, 0xfd, 0xef, 0xd0, 0xc1, 0xc7, 0xd3, 0xc4, 0xd3, 0xe3,
+ 0x03, 0x21, 0x20, 0x70,
+ 0x70, 0x38, 0x4d, 0x4f, 0x2c, 0x3b, 0x4e, 0x4e, 0x3e, 0x3c, 0x4d, 0x2c,
+ 0x3d, 0x4d, 0x2c, 0x2c,
+ 0x3d, 0x3c, 0x3d, 0x4c, 0x2d, 0x3c, 0x2d, 0x2c, 0x2d, 0x0d, 0x0c, 0xed,
+ 0xee, 0xbd, 0xdd, 0xdd,
+ 0xbd, 0xdc, 0xbd, 0xee, 0xef, 0xdf, 0xde, 0xe0, 0xd1, 0xe1, 0xd0, 0xd0,
+ 0xd2, 0xb5, 0xc2, 0xc3,
+ 0xc5, 0xd3, 0xb3, 0xe6, 0xe3, 0xd1, 0xe2, 0xd1, 0xe0, 0xde, 0xdc, 0xde,
+ 0xcc, 0xcc, 0xdd, 0xcb,
+ 0xcd, 0xcc, 0xdd, 0xcc, 0xdc, 0xdd, 0xcd, 0xec, 0xdd, 0xed, 0xdd, 0xfc,
+ 0xfe, 0x0d, 0x0d, 0x0c,
+ 0x2e, 0x4e, 0x2c, 0x2d, 0x2c, 0x4d, 0x4c, 0x2c, 0x4d, 0x3c, 0x4d, 0x2c,
+ 0x2d, 0x4e, 0x3c, 0x5d,
+ 0x3d, 0x3c, 0x5d, 0x2d, 0x2c, 0x2d, 0x2c, 0x1c, 0x1e, 0x1e, 0x1e, 0x2f,
+ 0x0d, 0x0f, 0x0e, 0x0e,
+ 0xfe, 0xc0, 0xb1, 0xc1, 0xc0, 0xde, 0xce, 0xce, 0xc4, 0xc7, 0xe0, 0x0b,
+ 0x1e, 0xe0, 0xa1, 0xf2,
+ 0x00, 0x20, 0x13, 0x07, 0x25, 0x51, 0x21, 0x12, 0x04, 0x04, 0x02, 0x02,
+ 0x22, 0x04, 0xe3, 0xa3,
+ 0xe3, 0xe3, 0xf5, 0xd2, 0xc3, 0xd4, 0xc3, 0xc3, 0xb4, 0xd4, 0xc3, 0xd5,
+ 0xe2, 0xf3, 0xf3, 0xd4,
+ 0xd2, 0xd3, 0x03, 0x23, 0x24, 0x23, 0x03, 0x32, 0x62, 0x41, 0x20, 0x20,
+ 0x21, 0x32, 0x32, 0x61,
+ 0x3f, 0x3e, 0x3e, 0x4d, 0x40, 0x34, 0x42, 0x3f, 0x4e, 0x20, 0x30, 0x40,
+ 0x31, 0x57, 0x37, 0x22,
+ 0x20, 0x20, 0x30, 0x20, 0x30, 0x40, 0x51, 0x20, 0x2d, 0x2b, 0x1e, 0x2d,
+ 0x2f, 0x3b, 0x2d, 0x2c,
+ 0x10, 0x11, 0x22, 0x32, 0x73, 0x13, 0x14, 0x15, 0x04, 0x25, 0x03, 0x04,
+ 0x03, 0x13, 0x13, 0x04,
+ 0xf5, 0xc3, 0xd3, 0xf5, 0xf2, 0xd2, 0x92, 0xd2, 0xf4, 0xf4, 0xe3, 0xa3,
+ 0xc2, 0xc3, 0xc3, 0xc4,
+ 0xe3, 0xd4, 0xe3, 0xd2, 0xb2, 0xd2, 0xf2, 0x12, 0x41, 0x23, 0x14, 0x11,
+ 0x00, 0x10, 0x10, 0x11,
+ 0x34, 0x12, 0xf0, 0xb0, 0xd0, 0xce, 0xde, 0xb0, 0xd7, 0xc4, 0xdf, 0xdd,
+ 0xee, 0xd0, 0xdf, 0x08,
+ 0x4c, 0x2d, 0x0d, 0x00, 0x40, 0x7d, 0x59, 0x2e, 0x1f, 0x0f, 0x0f, 0x1c,
+ 0x1d, 0x2b, 0x5d, 0x3c,
+ 0x2d, 0x2d, 0x2d, 0x3e, 0x6c, 0x2d, 0x3d, 0x4f, 0x3e, 0x3c, 0x4c, 0x3c,
+ 0x2e, 0x2d, 0x1e, 0x2d,
+ 0x2a, 0x2d, 0x1e, 0xef, 0xbf, 0xde, 0xfc, 0x0c, 0xde, 0xcf, 0xd0, 0x00,
+ 0x2e, 0x2d, 0xde, 0x90,
+ 0xff, 0x1e, 0x3c, 0x0c, 0x9c, 0xfb, 0x0d, 0xde, 0xce, 0xcf, 0xfe, 0xea,
+ 0xed, 0xdd, 0xbc, 0xed,
+ 0xde, 0xde, 0xc0, 0xc0, 0xde, 0xde, 0xcf, 0xd0, 0xd2, 0xe4, 0xd2, 0xa3,
+ 0xd3, 0xc1, 0xd1, 0xc0,
+ 0xc1, 0xd2, 0xce, 0xed, 0xfe, 0x0e, 0x0b, 0xf8, 0xfb, 0xfd, 0xfd, 0x0d,
+ 0x0c, 0x2c, 0x2d, 0x1d,
+ 0xfd, 0xec, 0xfc, 0x3d, 0x3c, 0xad, 0xdc, 0xed, 0x1d, 0x4e, 0xee, 0xdc,
+ 0xdd, 0x2d, 0x5d, 0xfe,
+ 0xbf, 0xcf, 0xce, 0xdc, 0xcc, 0xec, 0xed, 0xfb, 0xee, 0xdd, 0xdc, 0xed,
+ 0xdd, 0xed, 0xfd, 0x0e,
+ 0x0d, 0xdd, 0x9b, 0xff, 0x00, 0x02, 0x12, 0x61, 0x41, 0x1f, 0x0f, 0x14,
+ 0x24, 0x11, 0x10, 0x02,
+ 0xd3, 0x80, 0xc1, 0xe4, 0xc6, 0xd1, 0xc0, 0xde, 0xcf, 0xe1, 0xe3, 0xf0,
+ 0xd3, 0xb7, 0xe5, 0xd1,
+ 0xe1, 0xf0, 0xe2, 0xd3, 0xd0, 0xce, 0xdc, 0xff, 0xd0, 0xdf, 0xea, 0xec,
+ 0xdd, 0xdd, 0xcd, 0xef,
+ 0x00, 0x30, 0x2e, 0xda, 0xad, 0xde, 0xe0, 0xe6, 0xf3, 0x40, 0x40, 0x00,
+ 0x00, 0x02, 0x11, 0x71,
+ 0x50, 0x31, 0x25, 0x24, 0x20, 0x30, 0x21, 0x06, 0x04, 0xf4, 0x02, 0x01,
+ 0x02, 0xe1, 0xf4, 0xe2,
+ 0x04, 0x12, 0x11, 0x12, 0x72, 0x73, 0x35, 0x33, 0x52, 0x41, 0x33, 0x32,
+ 0x53, 0x23, 0x21, 0x21,
+ 0x00, 0x01, 0x03, 0xf4, 0xf5, 0xd3, 0xd2, 0xd2, 0xd4, 0xc7, 0xd3, 0xc5,
+ 0xf3, 0x23, 0x54, 0x23,
+ 0x32, 0x33, 0x55, 0x43, 0x34, 0x54, 0x22, 0x32, 0x42, 0x23, 0x22, 0x32,
+ 0x43, 0x33, 0x44, 0x13,
+ 0x33, 0x22, 0x32, 0x32, 0x22, 0x34, 0x44, 0x74, 0x31, 0x10, 0x00, 0x10,
+ 0x12, 0x31, 0x41, 0x42,
+ 0x23, 0x00, 0x10, 0x1d, 0x2d, 0x3f, 0x4c, 0x4b, 0x5c, 0x3e, 0x40, 0x43,
+ 0x43, 0x30, 0x40, 0x20,
+ 0x3e, 0x2c, 0x2c, 0x2e, 0x11, 0x10, 0x19, 0x1d, 0x1d, 0x1e, 0x2f, 0x2d,
+ 0x1b, 0xfd, 0xdb, 0xbc,
+ 0xec, 0xfd, 0x0e, 0x0e, 0xec, 0xeb, 0xce, 0xee, 0xef, 0xff, 0x3d, 0x0f,
+ 0xdf, 0xde, 0xec, 0x2e,
+ 0x60, 0x34, 0x24, 0x01, 0xf0, 0xc0, 0xb4, 0xb4, 0xc3, 0xd2, 0xe3, 0xe3,
+ 0xe1, 0xde, 0xdc, 0xdc,
+ 0xed, 0xeb, 0xfd, 0xfc, 0xee, 0xc0, 0xc0, 0xc1, 0xc2, 0xb3, 0xc5, 0xd3,
+ 0xd3, 0x02, 0x66, 0x21,
+ 0x00, 0x0f, 0x20, 0x62, 0x20, 0x2f, 0x35, 0x33, 0x03, 0x04, 0x02, 0x21,
+ 0x77, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0x0f, 0xfe, 0x10, 0x43, 0x56, 0x33, 0x21, 0x33, 0x25,
+ 0x10, 0xde, 0xfe, 0x62,
+ 0x46, 0x22, 0x00, 0xef, 0xaa, 0xcd, 0xee, 0x35, 0x43, 0xf0, 0xde, 0xdf,
+ 0xdd, 0xf0, 0x01, 0x01,
+ 0x11, 0x10, 0xee, 0xee, 0x32, 0x76, 0x20, 0xff, 0xcb, 0xcc, 0x22, 0x77,
+ 0x11, 0xee, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xee, 0x00, 0x24, 0x00, 0xbe, 0xee, 0xf0, 0xf0,
+ 0xf0, 0x22, 0x00, 0xcd,
+ 0xf0, 0x27, 0x10, 0xce, 0xce, 0x00, 0x35, 0x42, 0x01, 0xae, 0xdc, 0xdd,
+ 0x00, 0x00, 0xbb, 0xdd,
+ 0x13, 0x66, 0x00, 0xee, 0xff, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
+ 0x13, 0x35, 0x12, 0xef,
+ 0x9b, 0x01, 0x56, 0x00, 0xef, 0x00, 0x11, 0xf0, 0x00, 0x21, 0x0f, 0xed,
+ 0xed, 0x00, 0x74, 0x21,
+ 0x0e, 0xfd, 0xda, 0x00, 0x30, 0x0f, 0xfe, 0x10, 0xee, 0x8a, 0xed, 0xcb,
+ 0x00, 0x53, 0x00, 0x0f,
+ 0xfe, 0xfc, 0x0e, 0x22, 0x21, 0xee, 0x10, 0x10, 0x0e, 0x34, 0x64, 0xf0,
+ 0xde, 0xab, 0xef, 0x25,
+ 0x02, 0xef, 0x01, 0x13, 0xf0, 0xbc, 0xef, 0x00, 0x0f, 0x32, 0x00, 0xe9,
+ 0xdf, 0x10, 0x54, 0xf0,
+ 0xab, 0xdc, 0x00, 0x21, 0x00, 0xef, 0xde, 0x00, 0x0e, 0x10, 0xf0, 0x8c,
+ 0x00, 0xf0, 0x01, 0xf1,
+ 0xef, 0x13, 0x01, 0xb8, 0x00, 0x33, 0xee, 0xdd, 0x76, 0x21, 0xfe, 0xed,
+ 0xcc, 0x00, 0x44, 0x00,
+ 0x10, 0x21, 0xfe, 0xed, 0x21, 0x20, 0xca, 0x20, 0x41, 0x00, 0x10, 0x10,
+ 0xec, 0xde, 0xbc, 0xcd,
+ 0x22, 0x55, 0xfe, 0xde, 0x00, 0x00, 0x00, 0xfd, 0xce, 0xed, 0x02, 0x26,
+ 0x00, 0xbd, 0xa9, 0x11,
+ 0x56, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x10, 0x11, 0x01, 0x32, 0xff, 0xcd,
+ 0x00, 0x23, 0x01, 0xde,
+ 0x13, 0x12, 0x9b, 0xdd, 0x03, 0x47, 0xf0, 0xf0, 0x00, 0xf0, 0xee, 0x01,
+ 0x13, 0xde, 0x89, 0x00,
+ 0x44, 0x11, 0xed, 0xf0, 0x11, 0x21, 0x00, 0x00, 0xed, 0x0f, 0x77, 0x00,
+ 0xfe, 0x00, 0xff, 0xff,
+ 0x21, 0x32, 0x0f, 0x1f, 0x1d, 0x3f, 0x72, 0x23, 0x2f, 0x1d, 0x20, 0x2f,
+ 0x32, 0x0d, 0x1c, 0x77,
+ 0x23, 0xfd, 0xee, 0x00, 0x00, 0x23, 0x47, 0x01, 0xab, 0x0f, 0x01, 0x00,
+ 0x11, 0x00, 0x10, 0x45,
+ 0x0f, 0xba, 0x31, 0x43, 0xee, 0xee, 0x01, 0x34, 0x32, 0x00, 0xef, 0x00,
+ 0x12, 0x02, 0xd0, 0x23,
+ 0x77, 0x11, 0x00, 0xef, 0xde, 0x20, 0x75, 0x11, 0x00, 0x00, 0x02, 0xf0,
+ 0xe0, 0xde, 0xe0, 0x02,
+ 0x01, 0x9c, 0xda, 0xde, 0x00, 0x55, 0x0f, 0xcc, 0x10, 0x20, 0x0e, 0x20,
+ 0x42, 0x10, 0x0c, 0xfc,
+ 0x21, 0x31, 0xff, 0xee, 0x65, 0x22, 0xee, 0xff, 0x12, 0x13, 0xdf, 0x9a,
+ 0x10, 0x55, 0x00, 0xee,
+ 0x00, 0xff, 0x00, 0x35, 0x32, 0xce, 0xdc, 0x00, 0x43, 0x21, 0xac, 0x0f,
+ 0x25, 0x21, 0xff, 0xf0,
+ 0x22, 0x22, 0xce, 0x00, 0x12, 0x12, 0x24, 0x00, 0xcf, 0x11, 0x34, 0x00,
+ 0x10, 0x10, 0xab, 0xee,
+ 0x35, 0x21, 0xcf, 0xff, 0x33, 0x23, 0xbe, 0xcc, 0xf0, 0x03, 0x02, 0x24,
+ 0x01, 0xad, 0x02, 0x47,
+ 0x02, 0xde, 0xef, 0x12, 0x56, 0xf0, 0xab, 0x00, 0x23, 0x11, 0x00, 0x11,
+ 0x01, 0xde, 0xcc, 0x00,
+ 0x67, 0x12, 0xff, 0xee, 0x00, 0x13, 0x00, 0xd0, 0x13, 0x12, 0xde, 0xde,
+ 0x76, 0x34, 0xee, 0xf0,
+ 0x22, 0x00, 0xe0, 0x00, 0x01, 0x02, 0x01, 0xbe, 0x01, 0x24, 0xed, 0x00,
+ 0x44, 0xdd, 0xa9, 0x22,
+ 0x63, 0x00, 0x0b, 0x00, 0x10, 0x12, 0x00, 0x1f, 0x1f, 0x0e, 0x30, 0x53,
+ 0x00, 0x0b, 0x00, 0xfc,
+ 0x0f, 0x21, 0x00, 0xec, 0xce, 0x0e, 0xdd, 0xed, 0x32, 0x0f, 0xdb, 0xfe,
+ 0xbb, 0xfe, 0x71, 0x66,
+ 0x00, 0xec, 0xef, 0x21, 0x21, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0xde, 0xde,
+ 0xd0, 0xdd, 0xff, 0x76,
+ 0x00, 0xbb, 0xff, 0x01, 0x14, 0x00, 0xbd, 0x0f, 0xf0, 0x01, 0x11, 0xed,
+ 0xa8, 0x00, 0x45, 0xf0,
+ 0xde, 0x11, 0x12, 0xef, 0x01, 0x33, 0xef, 0xac, 0x00, 0x12, 0x00, 0x21,
+ 0x34, 0x0f, 0x0e, 0x10,
+ 0xfe, 0xec, 0x73, 0x21, 0xfc, 0x10, 0x0f, 0xa8, 0x0e, 0x42, 0xfe, 0xfd,
+ 0x34, 0x10, 0xec, 0xfd,
+ 0x0f, 0x31, 0x30, 0x0e, 0x1e, 0x30, 0x2e, 0x1e, 0x60, 0x21, 0x0c, 0xe9,
+ 0xff, 0x30, 0x73, 0x0f,
+ 0xb9, 0x00, 0x42, 0x11, 0xfe, 0xcd, 0xff, 0x00, 0x37, 0x42, 0xdf, 0xdd,
+ 0x22, 0x42, 0xfe, 0xdd,
+ 0x00, 0x33, 0x44, 0x10, 0xde, 0xde, 0x22, 0x01, 0x9d, 0x00, 0x27, 0x04,
+ 0xbe, 0xef, 0x01, 0x15,
+ 0x23, 0xf0, 0xce, 0x23, 0xf0, 0x8b, 0x13, 0x25, 0xff, 0xef, 0x01, 0x22,
+ 0xef, 0xff, 0x00, 0x02,
+ 0x00, 0x00, 0x23, 0x00, 0xac, 0x00, 0x37, 0x00, 0x10, 0x31, 0xd0, 0xef,
+ 0xf0, 0xcf, 0xdd, 0x31,
+ 0x21, 0xce, 0x57, 0x44, 0xed, 0xcc, 0x0f, 0x33, 0x45, 0x00, 0xdf, 0xdf,
+ 0x00, 0x76, 0x32, 0xbd,
+ 0xff, 0x35, 0x21, 0xef, 0xee, 0x31, 0x64, 0x00, 0x00, 0xff, 0x00, 0x11,
+ 0xff, 0xee, 0x13, 0x77,
+ 0x01, 0xff, 0xee, 0x00, 0x13, 0x23, 0xf0, 0xef, 0x13, 0xff, 0x99, 0x01,
+ 0x34, 0xf0, 0xdf, 0x01,
+ 0x54, 0x00, 0xef, 0xff, 0x01, 0x23, 0x00, 0xf0, 0xef, 0xde, 0x77, 0x22,
+ 0xff, 0xff, 0x00, 0x00,
+ 0xf1, 0xf0, 0xe0, 0xfe, 0xdc, 0xfe, 0x75, 0x57, 0x00, 0xdc, 0xce, 0x10,
+ 0x32, 0x00, 0x00, 0x21,
+ 0xf0, 0xcd, 0xff, 0x11, 0x12, 0x00, 0xbd, 0xc9, 0x00, 0x45, 0xef, 0xdd,
+ 0x21, 0x53, 0x00, 0xdc,
+ 0x00, 0x30, 0x32, 0x20, 0x10, 0x0e, 0x0f, 0xfe, 0x10, 0xff, 0x00, 0x77,
+ 0x54, 0xfd, 0xed, 0x11,
+ 0x24, 0x0f, 0xfe, 0x41, 0x45, 0x0e, 0xcc, 0x10, 0x41, 0x00, 0x0e, 0xfe,
+ 0xef, 0x00, 0xed, 0x23,
+ 0x44, 0xec, 0xbc, 0x0f, 0x01, 0x00, 0xd9, 0x0f, 0x71, 0x0f, 0xfd, 0x20,
+ 0x21, 0xeb, 0xfe, 0x42,
+ 0x10, 0xeb, 0x0f, 0x10, 0x10, 0x10, 0x1f, 0xfd, 0x0f, 0x22, 0x12, 0xe1,
+ 0x8b, 0x8b, 0x00, 0x13,
+ 0xff, 0xfe, 0x02, 0xfd, 0xc8, 0x00, 0x32, 0xee, 0xcd, 0x10, 0x00, 0xfe,
+ 0xfe, 0xff, 0x00, 0xff,
+ 0xf0, 0x10, 0xee, 0x88, 0xdd, 0x10, 0x76, 0x00, 0xed, 0xed, 0x00, 0x00,
+ 0x1f, 0x00, 0x0e, 0x0f,
+ 0x00, 0xed, 0xdd, 0x01, 0x23, 0xee, 0xcb, 0xde, 0x10, 0x76, 0x0f, 0xee,
+ 0xdd, 0xed, 0x00, 0x42,
+ 0x11, 0xca, 0xab, 0x00, 0x33, 0x21, 0xed, 0xff, 0x00, 0x00, 0x0f, 0x0e,
+ 0x0e, 0xcc, 0xee, 0x57,
+ 0x32, 0xe0, 0xde, 0xce, 0xf0, 0x13, 0x13, 0x03, 0xe0, 0x8d, 0x02, 0x27,
+ 0x15, 0xf0, 0xf0, 0x00,
+ 0xf1, 0xf1, 0x23, 0xcf, 0xac, 0x26, 0x33, 0xe0, 0xcd, 0xcd, 0xf0, 0x36,
+ 0x22, 0xd0, 0x8c, 0xee,
+ 0x01, 0x34, 0x00, 0xf0, 0x01, 0x01, 0xef, 0xee, 0x22, 0x12, 0xff, 0x10,
+ 0x22, 0xed, 0x00, 0x45,
+ 0x00, 0xdd, 0x31, 0x65, 0xee, 0xbc, 0xf0, 0x13, 0x46, 0x00, 0xef, 0x00,
+ 0x11, 0x00, 0x10, 0x20,
+ 0x00, 0x20, 0x0f, 0x52, 0x56, 0x00, 0x0f, 0x0e, 0x10, 0x65, 0x00, 0xec,
+ 0x00, 0x33, 0x01, 0x11,
+ 0x00, 0xcc, 0x00, 0x00, 0xff, 0x00, 0x76, 0x11, 0x0f, 0x00, 0x46, 0x11,
+ 0xef, 0x9a, 0x00, 0x23,
+ 0x44, 0x11, 0xef, 0xef, 0xf0, 0x01, 0x11, 0x23, 0x54, 0x22, 0x01, 0xff,
+ 0x00, 0x22, 0x33, 0x34,
+ 0x11, 0x01, 0x01, 0xf1, 0xd0, 0x57, 0x65, 0xff, 0xdf, 0x00, 0x11, 0x00,
+ 0xf0, 0x33, 0x53, 0xee,
+ 0xba, 0x01, 0x33, 0x10, 0x0f, 0x0f, 0x21, 0x0f, 0xed, 0x41, 0x43, 0x0d,
+ 0xf9, 0x30, 0x73, 0x10,
+ 0x00, 0x20, 0x00, 0x0e, 0x0c, 0x0e, 0x56, 0x33, 0x32, 0x00, 0xeb, 0x0e,
+ 0x1f, 0x0e, 0x52, 0x77,
+ 0x00, 0xeb, 0xff, 0x10, 0x20, 0x20, 0x30, 0x00, 0xee, 0xee, 0x10, 0x10,
+ 0xdd, 0x0f, 0x74, 0x10,
+ 0xed, 0xca, 0xee, 0x10, 0x33, 0x53, 0x22, 0xdb, 0xcc, 0x00, 0x11, 0x11,
+ 0x42, 0x00, 0xde, 0xfe,
+ 0x33, 0x10, 0xbb, 0xdd, 0xff, 0x24, 0x00, 0xd0, 0xf0, 0x22, 0x76, 0x00,
+ 0xef, 0xce, 0xf0, 0x01,
+ 0x00, 0x00, 0x0f, 0xee, 0x24, 0xf0, 0xaf, 0xf0, 0xef, 0xe0, 0x17, 0xf1,
+ 0xae, 0xff, 0x15, 0x02,
+ 0xf0, 0xff, 0xdf, 0x32, 0x77, 0x02, 0xcb, 0x00, 0x32, 0x21, 0x00, 0x00,
+ 0x00, 0x01, 0x01, 0xf0,
+ 0xff, 0x00, 0x01, 0x56, 0x01, 0xd0, 0xcf, 0xcd, 0x13, 0x77, 0x00, 0xce,
+ 0x0f, 0x00, 0x00, 0x21,
+ 0x0f, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0xb9, 0x0f, 0x11, 0x0f, 0xef, 0x01,
+ 0x02, 0x64, 0x00, 0x0c,
+ 0x00, 0x00, 0x0f, 0xcc, 0x12, 0x43, 0x21, 0x1f, 0xc8, 0xff, 0x42, 0x33,
+ 0x00, 0xdc, 0xef, 0x01,
+ 0x75, 0x00, 0xbc, 0xef, 0x13, 0x02, 0xcd, 0xf0, 0x01, 0x15, 0x01, 0xab,
+ 0xee, 0x00, 0x35, 0x21,
+ 0x01, 0x00, 0x00, 0xee, 0xbe, 0x12, 0x25, 0xf0, 0xe0, 0x00, 0xd0, 0xd0,
+ 0xd0, 0xd0, 0xf0, 0x44,
+ 0x74, 0x00, 0xff, 0x12, 0x0f, 0xff, 0x46, 0x11, 0x0f, 0xe0, 0x04, 0x00,
+ 0x4c, 0x02, 0x8b, 0x02,
+ 0x70, 0x07, 0x4e, 0x30, 0x7b, 0xfc, 0xd7, 0x24, 0xdc, 0xcc, 0x31, 0x21,
+ 0xde, 0xde, 0xee, 0x88,
+ 0x00, 0x53, 0x10, 0xca, 0xef, 0x10, 0x10, 0xfe, 0x20, 0x50, 0x0f, 0x0f,
+ 0x2f, 0x10, 0x62, 0x11,
+ 0x0c, 0xfd, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x37, 0xf2, 0x8c, 0xef,
+ 0x12, 0x14, 0xff, 0xff,
+ 0x01, 0xf0, 0xfe, 0x00, 0x0f, 0x02, 0x04, 0xcd, 0xed, 0x00, 0x00, 0xd1,
+ 0xd7, 0x90, 0xe0, 0x03,
+ 0xee, 0x00, 0x77, 0x01, 0xbb, 0xee, 0x00, 0x23, 0x01, 0x00, 0xdd, 0xed,
+ 0x02, 0x16, 0xe0, 0xd0,
+ 0xad, 0xef, 0x02, 0xf0, 0x01, 0x03, 0xa9, 0xcd, 0x00, 0x04, 0x12, 0x11,
+ 0x00, 0xfe, 0x00, 0x0e,
+ 0xec, 0x76, 0x10, 0xfd, 0x45, 0x21, 0xdd, 0xbc, 0x00, 0x22, 0x11, 0x00,
+ 0x01, 0xef, 0xcc, 0xf0,
+ 0x00, 0x10, 0x21, 0x11, 0xee, 0xbb, 0x23, 0x56, 0xdd, 0xce, 0x34, 0x22,
+ 0x10, 0x0f, 0xde, 0x01,
+ 0x35, 0x00, 0xce, 0xcd, 0x11, 0x77, 0x23, 0xde, 0xee, 0x00, 0xdf, 0xce,
+ 0x47, 0x11, 0x00, 0x10,
+ 0xf0, 0xde, 0x21, 0x33, 0x00, 0xbe, 0xef, 0x00, 0x33, 0x45, 0x00, 0xce,
+ 0xef, 0xe0, 0x02, 0x12,
+ 0xed, 0x0f, 0x02, 0xf0, 0xe0, 0xef, 0xbc, 0xba, 0x01, 0x65, 0x11, 0xfe,
+ 0xca, 0x0f, 0x21, 0x21,
+ 0x31, 0x21, 0xee, 0x0f, 0x00, 0x0d, 0xed, 0x22, 0x44, 0x00, 0xde, 0xac,
+ 0x23, 0x33, 0xca, 0xef,
+ 0x43, 0x55, 0x10, 0x00, 0xec, 0xff, 0x32, 0x42, 0xef, 0x00, 0x24, 0x00,
+ 0x01, 0x00, 0xbd, 0xeb,
+ 0x43, 0x45, 0x0e, 0x00, 0x00, 0x10, 0x73, 0x23, 0xf9, 0x00, 0x53, 0x00,
+ 0xfe, 0x00, 0x11, 0x23,
+ 0x10, 0x00, 0x12, 0x00, 0xfe, 0xdd, 0x03, 0x47, 0x12, 0x00, 0xed, 0x9a,
+ 0x00, 0x10, 0x31, 0x43,
+ 0xfd, 0xc9, 0xff, 0x10, 0x10, 0x30, 0x30, 0x0e, 0x62, 0x12, 0xec, 0xff,
+ 0x10, 0x54, 0x22, 0x00,
+ 0xef, 0xcb, 0x00, 0x45, 0x32, 0x00, 0xee, 0xdd, 0x00, 0x20, 0x41, 0x10,
+ 0xed, 0xbb, 0x0f, 0x11,
+ 0x66, 0x00, 0xff, 0xdd, 0xe0, 0xff, 0x11, 0x77, 0x22, 0xee, 0x0f, 0x12,
+ 0x11, 0xdd, 0xcd, 0x24,
+ 0x65, 0x00, 0x0e, 0x0f, 0x00, 0x00, 0x22, 0x31, 0xfd, 0x0d, 0x00, 0xff,
+ 0x00, 0x34, 0x21, 0xf0,
+ 0xce, 0x98, 0xed, 0x33, 0x34, 0xde, 0x00, 0x22, 0xde, 0x99, 0x10, 0x23,
+ 0xff, 0x00, 0x12, 0xff,
+ 0xde, 0xbd, 0xdd, 0x03, 0x67, 0x01, 0xef, 0xff, 0xff, 0x01, 0x24, 0x01,
+ 0x01, 0xf0, 0x9c, 0x01,
+ 0x25, 0x22, 0x00, 0xdf, 0x00, 0x42, 0x02, 0xee, 0xff, 0x57, 0xf0, 0xbd,
+ 0x13, 0x14, 0xdd, 0xde,
+ 0x04, 0x03, 0xf0, 0xd0, 0xbd, 0xca, 0x22, 0x34, 0xee, 0xad, 0x00, 0x33,
+ 0x0e, 0xdb, 0xff, 0xff,
+ 0x20, 0x52, 0x01, 0x0f, 0x00, 0x22, 0xeb, 0xcc, 0x32, 0x75, 0x00, 0x0f,
+ 0x00, 0x0d, 0x0d, 0x00,
+ 0x0d, 0x0e, 0x52, 0x20, 0x0a, 0x0e, 0x0e, 0xeb, 0x0f, 0x72, 0x11, 0x0d,
+ 0x00, 0xff, 0xee, 0x01,
+ 0xff, 0xba, 0x12, 0x24, 0xf0, 0x00, 0x00, 0xee, 0x0f, 0x00, 0x22, 0x43,
+ 0x20, 0x00, 0xda, 0xf0,
+ 0x13, 0xf1, 0xf2, 0x8f, 0xdf, 0x07, 0xf0, 0xbe, 0x00, 0xc0, 0x03, 0x37,
+ 0x02, 0xef, 0xe0, 0xef,
+ 0x00, 0x34, 0x22, 0x01, 0xc0, 0xee, 0xd0, 0x22, 0x77, 0x01, 0x00, 0xf0,
+ 0xae, 0xee, 0xf0, 0x36,
+ 0x21, 0xcd, 0xee, 0x00, 0xef, 0x0f, 0x40, 0xec, 0xba, 0x31, 0x41, 0xec,
+ 0x0f, 0x61, 0x21, 0x10,
+ 0x21, 0x00, 0x0d, 0xfd, 0x0e, 0x77, 0x13, 0xfc, 0xef, 0x32, 0x33, 0xdc,
+ 0xff, 0x12, 0xff, 0x10,
+ 0x30, 0xec, 0x21, 0x74, 0xdd, 0xca, 0x21, 0x21, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x20, 0x52,
+ 0x02, 0xde, 0xf0, 0x77, 0x03, 0xcc, 0xff, 0x11, 0x22, 0x02, 0x12, 0x00,
+ 0x01, 0x00, 0x21, 0x33,
+ 0xdd, 0x9a, 0xf1, 0x15, 0x23, 0x01, 0x00, 0xd0, 0x8c, 0xee, 0x16, 0x11,
+ 0xf0, 0x00, 0x00, 0x22,
+ 0x45, 0xde, 0xbc, 0x11, 0x44, 0x11, 0xf0, 0xef, 0xcc, 0xff, 0x33, 0x22,
+ 0xcd, 0xee, 0x13, 0xef,
+ 0xbc, 0x02, 0x11, 0x00, 0xf0, 0xe0, 0x03, 0x17, 0x00, 0xee, 0x52, 0x34,
+ 0x00, 0xe0, 0x55, 0x31,
+ 0x0f, 0x0f, 0x54, 0x11, 0xfd, 0x0f, 0x31, 0xde, 0xff, 0x56, 0x00, 0xed,
+ 0x10, 0x44, 0xbb, 0xfe,
+ 0x23, 0x00, 0x00, 0x31, 0x31, 0x10, 0xda, 0xad, 0x00, 0x34, 0x33, 0xce,
+ 0xbb, 0xde, 0xff, 0x01,
+ 0x23, 0x34, 0x11, 0xce, 0xbc, 0x00, 0x00, 0xff, 0x22, 0x43, 0x10, 0x1f,
+ 0xe9, 0xcd, 0x20, 0x53,
+ 0x10, 0x1f, 0x10, 0x0e, 0xfc, 0x12, 0x22, 0xbb, 0xdd, 0x00, 0x01, 0x00,
+ 0xf0, 0xcc, 0xdd, 0x24,
+ 0x23, 0xbc, 0x0f, 0x00, 0xbd, 0x01, 0x27, 0x23, 0xde, 0x8a, 0xff, 0x01,
+ 0x00, 0x11, 0x00, 0xe0,
+ 0xff, 0x23, 0x44, 0xee, 0xfd, 0x34, 0x42, 0x10, 0x33, 0x20, 0x00, 0x30,
+ 0x20, 0x63, 0x35, 0x31,
+ 0x52, 0x10, 0x1e, 0xf9, 0x00, 0x41, 0x0f, 0x42, 0x24, 0xef, 0xba, 0xed,
+ 0xdc, 0x30, 0x74, 0x0f,
+ 0xed, 0x0e, 0x0e, 0x0e, 0x30, 0x0d, 0x1d, 0x55, 0x21, 0x0e, 0xeb, 0xff,
+ 0x31, 0x44, 0x21, 0x10,
+ 0x31, 0x00, 0xfe, 0x21, 0x31, 0x0f, 0xdf, 0x13, 0x22, 0xbe, 0xaa, 0xf0,
+ 0x25, 0x00, 0xbc, 0xf0,
+ 0x33, 0x10, 0xcc, 0xf0, 0x00, 0xd0, 0x02, 0x26, 0xe0, 0x8d, 0xee, 0x01,
+ 0x37, 0xf0, 0x9c, 0xfe,
+ 0x01, 0x12, 0x00, 0xff, 0xec, 0xff, 0x33, 0x0f, 0xde, 0x00, 0xcc, 0x00,
+ 0x35, 0xae, 0xef, 0x12,
+ 0x00, 0xde, 0x01, 0x06, 0xe0, 0xe0, 0xe0, 0x11, 0x53, 0xef, 0xcb, 0xf0,
+ 0x11, 0x43, 0x10, 0xde,
+ 0x9a, 0x00, 0x22, 0x00, 0xef, 0xf0, 0xee, 0x00, 0x00, 0xf0, 0x04, 0xd1,
+ 0x9e, 0xee, 0x16, 0x23,
+ 0xe0, 0x02, 0x04, 0xdf, 0xae, 0x02, 0x57, 0x13, 0xef, 0xef, 0x13, 0x12,
+ 0xfe, 0xef, 0xe3, 0xe4,
+ 0x15, 0x22, 0xbf, 0xbf, 0xf0, 0xf1, 0xcf, 0xcc, 0xf0, 0x14, 0x15, 0x00,
+ 0xad, 0xec, 0x03, 0x11,
+ 0xfe, 0x02, 0x13, 0x00, 0xfe, 0xdd, 0xca, 0x11, 0x55, 0xf0, 0xcd, 0xef,
+ 0xf1, 0xdf, 0xcc, 0x11,
+ 0x32, 0x00, 0x00, 0x42, 0xda, 0x9b, 0x00, 0x32, 0x32, 0x0f, 0xde, 0xff,
+ 0x00, 0x00, 0x02, 0xf0,
+ 0xf0, 0x22, 0x22, 0x00, 0x01, 0x00, 0x63, 0x67, 0x00, 0xec, 0x00, 0x1f,
+ 0x0e, 0x45, 0x44, 0x00,
+ 0xfe, 0xed, 0xff, 0xff, 0x0f, 0x34, 0x55, 0x00, 0xe0, 0xf0, 0x00, 0xef,
+ 0x01, 0xf1, 0xad, 0x37,
+ 0x34, 0xef, 0xee, 0x74, 0x53, 0x0f, 0x0f, 0x00, 0x23, 0x34, 0x10, 0x00,
+ 0x10, 0x33, 0x24, 0x00,
+ 0xf0, 0x02, 0xcd, 0xdb, 0x52, 0x33, 0xfd, 0xfc, 0x1f, 0x0b, 0x3f, 0x70,
+ 0x42, 0x21, 0x0b, 0x0d,
+ 0x10, 0x0f, 0x2f, 0x64, 0x11, 0x10, 0x22, 0x0d, 0x1e, 0x20, 0xe8, 0xcc,
+ 0x53, 0x44, 0x0f, 0xfc,
+ 0x20, 0x30, 0x00, 0xff, 0x42, 0x31, 0x1f, 0x1e, 0x40, 0x1f, 0x0a, 0x31,
+ 0x42, 0x0e, 0x0c, 0x60,
+ 0x55, 0x00, 0x0f, 0xfd, 0x0e, 0x30, 0x20, 0x32, 0x20, 0x0b, 0x0e, 0x71,
+ 0x21, 0xea, 0xfd, 0x0f,
+ 0x10, 0x41, 0x12, 0xff, 0xfd, 0x00, 0x00, 0xcb, 0xdf, 0x24, 0x32, 0x31,
+ 0x52, 0xff, 0xdc, 0x0f,
+ 0xf0, 0x21, 0x77, 0x20, 0xff, 0xff, 0xf0, 0xe0, 0x22, 0x00, 0xdf, 0x67,
+ 0x02, 0x8b, 0xed, 0xf0,
+ 0x25, 0x00, 0xd0, 0xe0, 0xef, 0x01, 0x23, 0xf1, 0xd0, 0x01, 0x12, 0xe0,
+ 0xef, 0x77, 0x32, 0xef,
+ 0xce, 0x12, 0x23, 0xba, 0xde, 0x54, 0x12, 0x00, 0xf0, 0xee, 0xef, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0xf0, 0xee, 0xbb, 0xfe, 0x75, 0x12, 0x00, 0x0f, 0x0f, 0xfd, 0xd8,
+ 0x10, 0x74, 0x00, 0xdf,
+ 0x0f, 0x12, 0xf0, 0xbb, 0x00, 0x12, 0x00, 0x0d, 0x00, 0x31, 0x0e, 0x0e,
+ 0x75, 0x10, 0x0e, 0x00,
+ 0x10, 0x0e, 0xfe, 0xff, 0xf0, 0x05, 0x00, 0x00, 0x23, 0xff, 0x88, 0xf0,
+ 0x44, 0x22, 0xde, 0xfe,
+ 0x00, 0x22, 0x00, 0xf0, 0xf0, 0xf0, 0x02, 0xf2, 0xcf, 0x88, 0x00, 0x23,
+ 0x03, 0x01, 0xbd, 0xed,
+ 0x02, 0x26, 0x11, 0xce, 0xcd, 0x02, 0x26, 0x01, 0x00, 0x00, 0xff, 0x21,
+ 0x01, 0xf0, 0x21, 0x42,
+ 0x11, 0x33, 0xdf, 0xcc, 0x01, 0x00, 0x37, 0x53, 0x9d, 0xca, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xfc,
+ 0xdc, 0x00, 0x30, 0xfd, 0x0e, 0x30, 0x0c, 0x70, 0x21, 0x10, 0x20, 0x40,
+ 0x30, 0x30, 0x0b, 0xeb,
+ 0x20, 0x51, 0x10, 0x52, 0x11, 0xfd, 0xfd, 0x20, 0x1e, 0xe8, 0xf0, 0x44,
+ 0x01, 0xae, 0xfe, 0x22,
+ 0x22, 0xf0, 0xef, 0xd0, 0xe0, 0xf1, 0x9c, 0x01, 0x37, 0xf1, 0xf0, 0x01,
+ 0xe0, 0xbe, 0xf0, 0x45,
+ 0x11, 0xef, 0xcd, 0x00, 0x34, 0x00, 0xfe, 0x00, 0xde, 0xcc, 0xe0, 0xf1,
+ 0xe0, 0x10, 0xf2, 0x8c,
+ 0xcd, 0x07, 0xf1, 0xd0, 0x00, 0xef, 0xde, 0x23, 0xe0, 0x88, 0xef, 0x35,
+ 0x21, 0xf0, 0xee, 0xcd,
+ 0xff, 0x32, 0xff, 0xcc, 0xef, 0xef, 0x12, 0x45, 0x00, 0xbf, 0xdc, 0xf0,
+ 0x01, 0x12, 0x12, 0xff,
+ 0xef, 0x0f, 0x00, 0x64, 0x23, 0x0f, 0x0d, 0x0e, 0x00, 0x02, 0x14, 0x12,
+ 0xfd, 0x20, 0x77, 0x11,
+ 0xba, 0xf0, 0x01, 0xcd, 0xdc, 0x55, 0x12, 0xdf, 0xff, 0x00, 0x10, 0x00,
+ 0x11, 0x00, 0xfe, 0x20,
+ 0x43, 0x11, 0x00, 0xf1, 0xd2, 0x9e, 0xf2, 0x27, 0x17, 0xaf, 0xef, 0x00,
+ 0x01, 0xf0, 0x00, 0x02,
+ 0x00, 0xf0, 0x33, 0x00, 0x99, 0x00, 0x23, 0x34, 0xdd, 0xac, 0x13, 0x13,
+ 0xf0, 0x0f, 0x00, 0xde,
+ 0xdd, 0xff, 0x01, 0x10, 0x21, 0x0f, 0xfa, 0xff, 0x10, 0xde, 0xaa, 0x20,
+ 0x43, 0x00, 0xf0, 0x00,
+ 0xde, 0xff, 0x24, 0x12, 0xd0, 0xbe, 0xcd, 0x37, 0x64, 0xfe, 0xef, 0x13,
+ 0x13, 0xff, 0xca, 0x21,
+ 0x74, 0x10, 0x0e, 0x10, 0x30, 0x31, 0x31, 0x21, 0x42, 0x31, 0x10, 0x10,
+ 0x36, 0x76, 0x11, 0x00,
+ 0x0e, 0x00, 0x22, 0x00, 0xff, 0xcc, 0x10, 0x31, 0x10, 0x0d, 0xfa, 0x0e,
+ 0x72, 0x52, 0x0d, 0x0f,
+ 0x22, 0x0f, 0x0b, 0x21, 0x41, 0x01, 0x33, 0x22, 0x0c, 0x00, 0x33, 0x22,
+ 0x55, 0x0f, 0xbb, 0x0f,
+ 0x32, 0x43, 0x0f, 0xfc, 0x01, 0x54, 0x10, 0x0d, 0xed, 0x0f, 0x36, 0x32,
+ 0xdf, 0xcf, 0x12, 0xef,
+ 0xab, 0xf0, 0x01, 0x12, 0x00, 0xef, 0xf0, 0x0f, 0xfe, 0xdb, 0x50, 0x65,
+ 0x0f, 0x0f, 0x00, 0xfe,
+ 0xcb, 0x00, 0x35, 0x10, 0x10, 0x00, 0x00, 0xef, 0x01, 0x33, 0x20, 0xbd,
+ 0xfe, 0x75, 0x20, 0x0f,
+ 0x31, 0x43, 0x10, 0x20, 0x30, 0x10, 0xe8, 0xfd, 0x61, 0x01, 0xee, 0x00,
+ 0xf0, 0xde, 0xac, 0xff,
+ 0x00, 0xdb, 0xef, 0x14, 0x01, 0xff, 0x01, 0x0f, 0xcd, 0xf2, 0x06, 0x64,
+ 0x10, 0x00, 0xf0, 0xde,
+ 0x13, 0x77, 0x11, 0xf0, 0x00, 0x22, 0x00, 0x00, 0x13, 0xd1, 0xc0, 0xf3,
+ 0x07, 0x11, 0xd0, 0xa0,
+ 0x00, 0x00, 0xf0, 0xef, 0xf0, 0xde, 0x11, 0x76, 0x00, 0xf0, 0xee, 0xfd,
+ 0xde, 0xbf, 0xe3, 0xd0,
+ 0xdd, 0xdc, 0xed, 0x03, 0x04, 0xcb, 0xde, 0x10, 0x30, 0x3f, 0x1d, 0xdb,
+ 0x0e, 0x72, 0x60, 0x1e,
+ 0x34, 0x0b, 0xf9, 0x0f, 0x40, 0x41, 0x0e, 0x1f, 0x30, 0x0d, 0xe9, 0x30,
+ 0x72, 0x2f, 0xec, 0x0f,
+ 0x20, 0x00, 0xde, 0xfe, 0x0e, 0x71, 0x21, 0xfd, 0xd9, 0x10, 0x20, 0x1f,
+ 0x10, 0x00, 0xe0, 0xf0,
+ 0xf0, 0xbf, 0xe2, 0x04, 0xe0, 0x03, 0x02, 0x8c, 0x00, 0x37, 0xff, 0xce,
+ 0x35, 0x32, 0xe0, 0xf0,
+ 0x10, 0xf1, 0x35, 0x74, 0xe0, 0xd0, 0x02, 0x02, 0xf1, 0xf2, 0xc0, 0xf1,
+ 0xe0, 0xc1, 0x03, 0xcf,
+ 0xde, 0xf0, 0x00, 0x0e, 0x09, 0xfd, 0xbc, 0x0e, 0x61, 0x10, 0x0d, 0x21,
+ 0x51, 0x0b, 0x0c, 0x0e,
+ 0x0f, 0x10, 0x45, 0x63, 0x00, 0xfc, 0xfe, 0x10, 0x10, 0x0e, 0x32, 0x52,
+ 0x0d, 0x0d, 0xfc, 0xfc,
+ 0x11, 0x12, 0xe9, 0x10, 0x73, 0x0f, 0x0f, 0x00, 0x0e, 0x00, 0x34, 0x00,
+ 0xdc, 0x0e, 0x71, 0x10,
+ 0x0d, 0xfa, 0xee, 0x01, 0x56, 0x10, 0x0f, 0x0f, 0xef, 0x10, 0x21, 0xde,
+ 0x01, 0x35, 0xef, 0x9e,
+ 0x03, 0x03, 0xee, 0xfe, 0xf2, 0xf4, 0x07, 0x22, 0x90, 0x00, 0x23, 0xf0,
+ 0xdd, 0x00, 0x16, 0x01,
+ 0xc0, 0xbe, 0x00, 0x01, 0xe0, 0xe0, 0xf3, 0x07, 0xc0, 0x9f, 0xf0, 0xd0,
+ 0x03, 0x05, 0xf0, 0xbf,
+ 0x04, 0x16, 0xb0, 0xde, 0x00, 0x43, 0x11, 0x00, 0x00, 0xef, 0x01, 0x23,
+ 0x0f, 0xf0, 0x15, 0xcf,
+ 0xbe, 0x04, 0x02, 0xd0, 0xe0, 0xe0, 0x12, 0x01, 0xac, 0x00, 0x76, 0x10,
+ 0xfc, 0x11, 0x44, 0x0e,
+ 0x0c, 0x00, 0x31, 0x10, 0x0e, 0x00, 0x01, 0xdf, 0xcc, 0x10, 0x0e, 0x0d,
+ 0x02, 0xd0, 0xec, 0x61,
+ 0x0f, 0xd8, 0x0f, 0x20, 0x00, 0x51, 0x55, 0xfd, 0xcd, 0x0f, 0x00, 0x35,
+ 0x22, 0x0f, 0xff, 0x0e,
+ 0x0d, 0xec, 0x53, 0x34, 0x0f, 0xee, 0x0f, 0x0f, 0xee, 0xde, 0x9b, 0x43,
+ 0x67, 0x0f, 0xed, 0x00,
+ 0x00, 0x0e, 0x24, 0x12, 0xef, 0xdf, 0xce, 0xf0, 0x03, 0xe0, 0xbf, 0xf0,
+ 0xe0, 0xde, 0xeb, 0x10,
+ 0x0d, 0xda, 0x01, 0x44, 0x32, 0xff, 0x8b, 0x00, 0x77, 0x01, 0x00, 0x00,
+ 0x01, 0x21, 0x00, 0x11,
+ 0x12, 0x21, 0x23, 0x10, 0x0e, 0xfe, 0x10, 0xfc, 0xda, 0x62, 0x10, 0xed,
+ 0x2e, 0x2d, 0xe9, 0x1f,
+ 0x71, 0x50, 0x0f, 0x1e, 0x0d, 0x1d, 0x40, 0x1e, 0x0a, 0x20, 0x31, 0x1f,
+ 0x1e, 0x20, 0x31, 0x10,
+ 0x0c, 0x50, 0x64, 0x00, 0xfc, 0x00, 0x2f, 0x1e, 0x30, 0x21, 0x00, 0xcd,
+ 0x02, 0x25, 0x0f, 0x02,
+ 0xf3, 0xb0, 0xf3, 0x04, 0xf0, 0xfe, 0xdd, 0xc0, 0xd1, 0xf6, 0xe2, 0xe0,
+ 0x11, 0x21, 0x0f, 0xca,
+ 0x8c, 0xe0, 0xf0, 0xdd, 0xf3, 0x02, 0xbc, 0xdb, 0xe0, 0xe2, 0xd0, 0x9d,
+ 0xf0, 0x17, 0x02, 0xce,
+ 0xf0, 0x01, 0xee, 0xf0, 0x27, 0xf0, 0xae, 0x00, 0x01, 0xff, 0xef, 0xee,
+ 0xbd, 0x02, 0x02, 0xde,
+ 0xee, 0xee, 0xb9, 0xde, 0x04, 0x03, 0xd0, 0xcf, 0xd0, 0xf0, 0x11, 0x00,
+ 0x0d, 0x02, 0x37, 0x42,
+ 0xff, 0xee, 0x24, 0x43, 0x00, 0xe0, 0xf4, 0x14, 0x80, 0xbe, 0x03, 0x06,
+ 0xf1, 0xe1, 0xcf, 0xf0,
+ 0x03, 0x02, 0x24, 0x00, 0xe0, 0x03, 0xf0, 0x8b, 0x00, 0x17, 0xd0, 0xce,
+ 0xf1, 0xd2, 0xc0, 0xf1,
+ 0xe0, 0xf0, 0x14, 0xf1, 0xd0, 0xdf, 0xe0, 0xf0, 0xdf, 0xcf, 0x04, 0x04,
+ 0x9e, 0xde, 0xf4, 0xd0,
+ 0xbb, 0x01, 0x47, 0x00, 0xfe, 0x10, 0x00, 0xbd, 0xff, 0x12, 0x02, 0xbc,
+ 0xfd, 0x01, 0x02, 0xef,
+ 0xcf, 0x01, 0x00, 0x0e, 0x10, 0x11, 0xfd, 0xf9, 0x30, 0x74, 0x02, 0x01,
+ 0xf0, 0x16, 0x43, 0x0f,
+ 0xff, 0xff, 0xef, 0x12, 0x13, 0xbb, 0xf0, 0x33, 0x1e, 0x40, 0x30, 0xfb,
+ 0x21, 0x54, 0x20, 0x42,
+ 0x00, 0xfe, 0x57, 0x33, 0xef, 0x0f, 0x65, 0x23, 0x00, 0xff, 0x00, 0x24,
+ 0x12, 0x10, 0xfb, 0x20,
+ 0x73, 0x0f, 0xed, 0x32, 0x30, 0xf9, 0x20, 0x60, 0x0f, 0x10, 0x30, 0x2e,
+ 0x3e, 0x53, 0x0f, 0x1e,
+ 0x53, 0x1e, 0x1c, 0x35, 0x21, 0x0f, 0x10, 0x21, 0x31, 0x0d, 0x39, 0x70,
+ 0x11, 0x0e, 0x0d, 0x20,
+ 0x22, 0x10, 0x11, 0x22, 0xfc, 0xca, 0x31, 0x34, 0xd0, 0xe0, 0x00, 0x2e,
+ 0x60, 0x30, 0x20, 0x51,
+ 0x11, 0x10, 0x67, 0x31, 0x3f, 0x2c, 0x2e, 0x30, 0x20, 0x2f, 0x1b, 0x2e,
+ 0x20, 0x30, 0x0b, 0x0d,
+ 0x71, 0x30, 0x0e, 0x2f, 0x3e, 0x2d, 0x3e, 0x71, 0x1b, 0x1d, 0x05, 0x05,
+ 0xc9, 0x00, 0xee, 0x00,
+ 0x8a, 0x41, 0xd9, 0xef, 0x3b, 0x40, 0x4b, 0xf0, 0xf0, 0xf0, 0x88, 0x0e,
+ 0x75, 0x00, 0x0d, 0xf1,
+ 0x01, 0x0e, 0x0d, 0x02, 0x02, 0x0c, 0xef, 0x00, 0x11, 0x02, 0xbd, 0xd8,
+ 0x40, 0x52, 0x02, 0xd0,
+ 0x0f, 0x2e, 0x0e, 0x25, 0x23, 0xcc, 0xf0, 0x10, 0x31, 0xd1, 0xaf, 0x04,
+ 0x0f, 0xdd, 0x01, 0x54,
+ 0xef, 0xff, 0x02, 0x01, 0x53, 0x20, 0xec, 0xe2, 0x24, 0xed, 0x0f, 0xf0,
+ 0x27, 0xf0, 0x8e, 0x11,
+ 0x03, 0xdc, 0xf0, 0x77, 0x00, 0xcb, 0x12, 0x23, 0xed, 0xed, 0x12, 0x23,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0xfe, 0x55, 0x00, 0xfd, 0x00, 0x0e, 0x32, 0x00, 0xff, 0xf1, 0xac,
+ 0x13, 0x77, 0x02, 0xb9,
+ 0x10, 0x10, 0x00, 0x02, 0x12, 0xfd, 0xec, 0x22, 0x40, 0xef, 0xfe, 0x14,
+ 0x22, 0xfe, 0xbe, 0x34,
+ 0x32, 0xbc, 0x00, 0xf2, 0x0e, 0xde, 0x00, 0x47, 0x00, 0xdb, 0x00, 0x34,
+ 0xff, 0xad, 0x43, 0x00,
+ 0xcd, 0x34, 0x42, 0xee, 0xef, 0x04, 0x24, 0x00, 0x0d, 0xf0, 0xf1, 0x02,
+ 0x03, 0xf1, 0xe0, 0x01,
+ 0x41, 0x02, 0x9a, 0x00, 0x36, 0xce, 0xcf, 0x42, 0x21, 0xcc, 0xf0, 0x12,
+ 0x0f, 0x0e, 0x22, 0x03,
+ 0xee, 0xda, 0x21, 0x74, 0xfe, 0xdc, 0x64, 0x02, 0xec, 0x11, 0x21, 0xcb,
+ 0x10, 0x42, 0xf0, 0xff,
+ 0x0f, 0x00, 0x43, 0x0e, 0xdd, 0x10, 0x11, 0xf0, 0xfc, 0x00, 0x0f, 0xe0,
+ 0x46, 0xe0, 0x8a, 0x00,
+ 0x32, 0x00, 0xf0, 0x00, 0xdf, 0x2f, 0x2e, 0x00, 0x33, 0xf0, 0xa9, 0x01,
+ 0x22, 0xfe, 0xcd, 0x00,
+ 0x20, 0x01, 0xe0, 0xee, 0x01, 0x00, 0xcb, 0x00, 0x76, 0x00, 0xde, 0xfe,
+ 0x00, 0x00, 0x13, 0x52,
+ 0xca, 0xf0, 0x11, 0x0f, 0xed, 0x33, 0xf1, 0x88, 0x00, 0x10, 0x01, 0xee,
+ 0xef, 0x00, 0x01, 0xc0,
+ 0xfd, 0x00, 0x0f, 0xec, 0x00, 0x76, 0xf0, 0xfe, 0x00, 0x1f, 0x1f, 0x0e,
+ 0xe3, 0xf1, 0xed, 0x40,
+ 0x00, 0xb4, 0x05, 0xdc, 0xcd, 0x22, 0x14, 0x10, 0x2f, 0x0f, 0xce, 0xed,
+ 0x50, 0x33, 0xf0, 0x01,
+ 0xd8, 0xcc, 0x22, 0x34, 0x0d, 0x9e, 0x13, 0x11, 0xfe, 0xed, 0x01, 0xee,
+ 0x30, 0x54, 0xdd, 0xca,
+ 0x10, 0x33, 0xef, 0xfd, 0x34, 0x32, 0xf0, 0xda, 0xaf, 0x00, 0x43, 0xff,
+ 0xcc, 0x22, 0x34, 0xce,
+ 0xfd, 0x21, 0x02, 0xcf, 0x12, 0x23, 0x0e, 0x0f, 0xea, 0xaf, 0x12, 0x22,
+ 0x1e, 0x0d, 0x0e, 0x20,
+ 0x89, 0x00, 0x15, 0x0f, 0x1f, 0x43, 0xdf, 0xca, 0x01, 0x12, 0x11, 0xfe,
+ 0x00, 0x23, 0xcd, 0x99,
+ 0x11, 0x23, 0xfe, 0xfd, 0x11, 0x10, 0xe0, 0x0f, 0x12, 0x00, 0x10, 0x74,
+ 0x00, 0xef, 0xe0, 0x26,
+ 0x3f, 0xdc, 0x33, 0x36, 0xae, 0xff, 0x12, 0x41, 0x00, 0xdd, 0x12, 0x65,
+ 0xff, 0x00, 0x00, 0xfc,
+ 0x22, 0x21, 0xf0, 0x0f, 0x30, 0xdc, 0x10, 0x77, 0xff, 0xf0, 0x30, 0xf0,
+ 0x20, 0x52, 0xff, 0xdc,
+ 0x01, 0x13, 0x3d, 0x40, 0x36, 0xef, 0xdf, 0x41, 0x01, 0xed, 0x30, 0x71,
+ 0x13, 0x00, 0xed, 0xee,
+ 0x00, 0x26, 0x63, 0xf0, 0xcb, 0x00, 0x01, 0x01, 0x33, 0x31, 0x01, 0x01,
+ 0xf0, 0xaa, 0x10, 0x40,
+ 0x01, 0x05, 0xf0, 0xcb, 0x00, 0x02, 0x1f, 0xfe, 0x32, 0x56, 0xce, 0xbc,
+ 0x12, 0x22, 0xff, 0x0f,
+ 0x11, 0x01, 0xff, 0xff, 0x11, 0x01, 0x00, 0x10, 0x31, 0x0e, 0x02, 0x61,
+ 0x0e, 0xf0, 0x07, 0x37,
+ 0x0e, 0xcc, 0xf1, 0x02, 0x00, 0x1f, 0x20, 0x8f, 0xcf, 0x20, 0x00, 0xff,
+ 0x21, 0x67, 0xfe, 0xdc,
+ 0x00, 0x54, 0x0f, 0xe0, 0x13, 0x1f, 0xea, 0x01, 0x44, 0xbf, 0xff, 0x13,
+ 0x0f, 0x10, 0x44, 0xf0,
+ 0xce, 0x00, 0x34, 0xff, 0xff, 0x42, 0x01, 0xd0, 0x05, 0x42, 0x00, 0xce,
+ 0x11, 0x66, 0x00, 0xcd,
+ 0x02, 0x03, 0xff, 0x34, 0x12, 0xcc, 0x02, 0x14, 0x00, 0xed, 0x02, 0xe2,
+ 0x13, 0x20, 0x01, 0xb0,
+ 0x0d, 0x03, 0x12, 0x00, 0x57, 0x02, 0xbc, 0x00, 0x44, 0xff, 0x00, 0x14,
+ 0x02, 0xed, 0xf0, 0x13,
+ 0x3d, 0x0d, 0xe3, 0x04, 0x0c, 0x72, 0x46, 0xdd, 0xdb, 0x00, 0x41, 0x21,
+ 0x00, 0x0d, 0x1e, 0x00,
+ 0x11, 0x03, 0x2f, 0x4d, 0xb9, 0xf0, 0x20, 0x32, 0x9b, 0xdc, 0x20, 0x41,
+ 0x01, 0x00, 0xa9, 0x0f,
+ 0x31, 0x00, 0x00, 0x55, 0x0f, 0xbb, 0x00, 0x11, 0x22, 0x00, 0x00, 0xff,
+ 0xee, 0xf1, 0x25, 0x20,
+ 0xcc, 0x12, 0x31, 0xb0, 0xfe, 0x01, 0x31, 0xde, 0xee, 0x01, 0x04, 0xff,
+ 0x0d, 0x42, 0x01, 0xf1,
+ 0xfe, 0xca, 0x11, 0x32, 0x00, 0x00, 0x60, 0x0e, 0xd0, 0x02, 0x0f, 0x60,
+ 0x00, 0xee, 0x1c, 0x41,
+ 0x0d, 0xfc, 0x00, 0x08, 0xfd, 0x45, 0x12, 0xbd, 0x0e, 0x1f, 0x00, 0xe2,
+ 0xe0, 0xef, 0x0e, 0x40,
+ 0x40, 0x01, 0xee, 0xfe, 0xfb, 0x40, 0x73, 0x19, 0xcf, 0x32, 0x0e, 0xd8,
+ 0x00, 0x73, 0x00, 0xeb,
+ 0xff, 0x00, 0x11, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0xd0, 0x3f, 0x2f,
+ 0xc9, 0x32, 0x63, 0xbf,
+ 0x0e, 0x30, 0x0b, 0x00, 0x43, 0xe0, 0xce, 0x00, 0x31, 0x1f, 0xef, 0xce,
+ 0x0d, 0xef, 0xe2, 0xcf,
+ 0xeb, 0x31, 0x34, 0xee, 0xce, 0x16, 0x33, 0x00, 0xfa, 0x51, 0x33, 0xb0,
+ 0xd1, 0xef, 0x21, 0x66,
+ 0xe0, 0xc0, 0x02, 0x32, 0x0f, 0xf1, 0xd1, 0xb0, 0x01, 0x47, 0x00, 0xdf,
+ 0x00, 0x66, 0x00, 0xcf,
+ 0x00, 0x33, 0xf0, 0x00, 0x01, 0x01, 0xcd, 0x00, 0x17, 0x21, 0xfe, 0x01,
+ 0x33, 0xe0, 0xe0, 0x02,
+ 0x02, 0xee, 0x71, 0x57, 0xf0, 0xcf, 0x00, 0x3f, 0x0f, 0x01, 0x26, 0xff,
+ 0xdf, 0x43, 0x0f, 0xfc,
+ 0x24, 0x00, 0xaf, 0x12, 0x22, 0xf0, 0x10, 0x20, 0x00, 0xee, 0xbb, 0x12,
+ 0x34, 0x0c, 0x0d, 0x45,
+ 0x02, 0xef, 0xed, 0x32, 0x21, 0x42, 0x50, 0x02, 0xf1, 0x22, 0x1f, 0x98,
+ 0xdf, 0x25, 0x12, 0xcc,
+ 0x21, 0x21, 0xbe, 0xef, 0x01, 0x00, 0x01, 0x22, 0x1f, 0x0d, 0xf0, 0x02,
+ 0xe1, 0xbf, 0x23, 0x65,
+ 0x02, 0xe0, 0xe0, 0x06, 0x03, 0x20, 0x00, 0xf3, 0x12, 0x0f, 0xdf, 0x03,
+ 0x00, 0x3f, 0x24, 0xb4,
+ 0xa0, 0x26, 0x33, 0xeb, 0xbd, 0x32, 0x53, 0xe0, 0x0d, 0x0d, 0x00, 0x44,
+ 0x00, 0x0b, 0xfe, 0x2f,
+ 0x51, 0x02, 0x0d, 0x28, 0x50, 0x11, 0x00, 0xfd, 0x3d, 0x40, 0x1e, 0xea,
+ 0x00, 0x30, 0x20, 0x1d,
+ 0x0e, 0xdd, 0x3e, 0x72, 0x20, 0xb8, 0x00, 0x40, 0x00, 0xe0, 0xee, 0x0e,
+ 0x54, 0x22, 0xeb, 0xfe,
+ 0x01, 0x00, 0xed, 0x3f, 0x20, 0x0d, 0xef, 0x00, 0xf0, 0xa8, 0x0f, 0x00,
+ 0xbf, 0xfd, 0x31, 0x0f,
+ 0x8a, 0xf3, 0x12, 0x0e, 0xfd, 0x00, 0x00, 0x10, 0xec, 0xef, 0x36, 0x20,
+ 0xef, 0xdf, 0xac, 0x0e,
+ 0x10, 0x00, 0xc0, 0xae, 0xf0, 0xf0, 0x0b, 0xde, 0xf0, 0x3e, 0x1e, 0x9c,
+ 0xef, 0x12, 0x1c, 0xe8,
+ 0xe0, 0x21, 0xf0, 0xef, 0x0f, 0x0f, 0xfe, 0xf0, 0x25, 0x0f, 0x8c, 0xe0,
+ 0x01, 0x30, 0x0e, 0x00,
+ 0x11, 0xbf, 0xf0, 0x01, 0x50, 0xe8, 0xdf, 0x23, 0x12, 0x0d, 0x00, 0x0e,
+ 0x0d, 0x01, 0xe1, 0xcf,
+ 0x00, 0x14, 0xff, 0xcc, 0xc0, 0xd2, 0xd4, 0xe0, 0x9d, 0x10, 0x46, 0x00,
+ 0xd0, 0xee, 0xc9, 0x01,
+ 0x45, 0x00, 0xdf, 0x30, 0x0f, 0x8c, 0x01, 0x26, 0xf0, 0xdf, 0x01, 0x01,
+ 0x0f, 0x0f, 0xf0, 0xc0,
+ 0x01, 0xf3, 0x12, 0xee, 0xbc, 0xfe, 0x01, 0x46, 0x02, 0xcf, 0xfc, 0x00,
+ 0x65, 0xef, 0xef, 0x42,
+ 0x01, 0xcd, 0xff, 0x01, 0xe0, 0x0f, 0x15, 0x00, 0xce, 0xf0, 0x23, 0xd0,
+ 0xbc, 0x34, 0x21, 0xcc,
+ 0x00, 0x62, 0x0f, 0xf1, 0x05, 0x00, 0x10, 0x23, 0x14, 0x00, 0xee, 0x22,
+ 0x65, 0x11, 0xe0, 0xe1,
+ 0x01, 0x20, 0x52, 0x03, 0xf0, 0xc3, 0x24, 0x43, 0x1f, 0x0f, 0xe0, 0x00,
+ 0x25, 0x00, 0xe1, 0x47,
+ 0x21, 0xda, 0x60, 0x54, 0xf1, 0xef, 0x00, 0x22, 0x30, 0x10, 0x32, 0x40,
+ 0x20, 0x03, 0x11, 0x75,
+ 0x0f, 0x0c, 0x10, 0x20, 0x37, 0x01, 0xce, 0x0e, 0x41, 0x24, 0x01, 0xf0,
+ 0xbf, 0x01, 0x26, 0x30,
+ 0x00, 0x32, 0xd0, 0xcf, 0x74, 0x00, 0xfc, 0x21, 0x25, 0x00, 0xf0, 0x21,
+ 0x2e, 0x20, 0x01, 0xf1,
+ 0x14, 0x33, 0x31, 0xec, 0x8d, 0x12, 0x16, 0xed, 0xce, 0x03, 0x04, 0x53,
+ 0x50, 0x0c, 0xed, 0x32,
+ 0x51, 0x00, 0x14, 0x24, 0x0e, 0xfa, 0x0f, 0x2f, 0x10, 0x12, 0x03, 0xae,
+ 0xea, 0x11, 0x70, 0xff,
+ 0xfd, 0x11, 0x1f, 0x0e, 0x00, 0x0f, 0x1d, 0x2d, 0x2e, 0x0f, 0x0f, 0xf3,
+ 0x00, 0xd8, 0x10, 0x62,
+ 0x0f, 0xde, 0xdf, 0xcd, 0x33, 0x57, 0x02, 0xdd, 0x2f, 0x00, 0xb0, 0x00,
+ 0x14, 0x40, 0x00, 0xef,
+ 0x02, 0xf3, 0xf0, 0x2f, 0x1e, 0xec, 0x27, 0x55, 0xbf, 0xe0, 0x03, 0x35,
+ 0xee, 0x8d, 0x03, 0x23,
+ 0xed, 0xf0, 0x37, 0x22, 0xce, 0xbc, 0x00, 0x43, 0x01, 0xe0, 0x02, 0xfd,
+ 0xfe, 0x23, 0x03, 0xe1,
+ 0xf3, 0x16, 0x0e, 0xee, 0xef, 0x00, 0x00, 0xdf, 0x03, 0x14, 0xc9, 0x4f,
+ 0x70, 0x00, 0x00, 0x32,
+ 0x21, 0xee, 0xfe, 0x2f, 0x20, 0x44, 0x10, 0xdd, 0xef, 0x00, 0x1f, 0x61,
+ 0x15, 0xed, 0x0f, 0x00,
+ 0xbb, 0x0f, 0x24, 0x32, 0x98, 0xdf, 0x10, 0x3f, 0x20, 0x0e, 0xae, 0x01,
+ 0x12, 0x41, 0x02, 0xfe,
+ 0xfe, 0x24, 0x14, 0xf3, 0x24, 0x20, 0xdf, 0xf2, 0xe0, 0x13, 0x47, 0xd2,
+ 0x00, 0x40, 0xe5, 0x81,
+ 0xf0, 0x02, 0x13, 0x01, 0x10, 0x00, 0xe2, 0xb6, 0x02, 0xc0, 0xe1, 0x30,
+ 0x20, 0xdf, 0xf1, 0x37,
+ 0xe1, 0x9e, 0x0f, 0x20, 0x76, 0x00, 0xfc, 0xff, 0x32, 0x10, 0xef, 0x00,
+ 0x0d, 0xf0, 0x02, 0x5f,
+ 0xfa, 0xcf, 0x00, 0x24, 0xff, 0xec, 0x62, 0x23, 0xf0, 0xeb, 0x00, 0x10,
+ 0x2f, 0x1f, 0x01, 0x01,
+ 0xdc, 0x1f, 0x70, 0x3e, 0xea, 0x00, 0x03, 0x0d, 0xec, 0xad, 0x00, 0xe0,
+ 0xef, 0x0c, 0xfe, 0xbd,
+ 0xf3, 0x01, 0x1e, 0x3a, 0x0f, 0x51, 0x00, 0xec, 0x63, 0x13, 0x0f, 0xd9,
+ 0xef, 0x10, 0x20, 0x0f,
+ 0x00, 0xa1, 0xcd, 0x04, 0x1f, 0xc8, 0xe0, 0x20, 0xfe, 0xce, 0x00, 0x00,
+ 0xff, 0xe0, 0xdf, 0x1f,
+ 0x00, 0xdd, 0xda, 0xff, 0xd1, 0xb0, 0xbc, 0xf0, 0x27, 0xef, 0x8c, 0x11,
+ 0x12, 0xef, 0xd0, 0x33,
+ 0xf0, 0xbe, 0x01, 0x10, 0x00, 0x06, 0xe1, 0xff, 0x1e, 0x00, 0xaf, 0xf0,
+ 0xfe, 0x11, 0x36, 0xe0,
+ 0xf2, 0x10, 0xee, 0xde, 0xcf, 0xcd, 0x24, 0x74, 0xfc, 0xef, 0xf0, 0x01,
+ 0xee, 0x1d, 0x2b, 0x0d,
+ 0x00, 0xdc, 0x20, 0x74, 0x40, 0xaa, 0x01, 0x23, 0xfc, 0x00, 0x2f, 0xdc,
+ 0xe0, 0x15, 0x00, 0xec,
+ 0xd0, 0x00, 0x00, 0x20, 0x4e, 0x20, 0x11, 0xff, 0xec, 0x00, 0x5f, 0x2d,
+ 0x0c, 0x21, 0x13, 0xd0,
+ 0xde, 0xbc, 0xc0, 0xef, 0x10, 0x01, 0xad, 0xc8, 0x12, 0x22, 0xba, 0xf0,
+ 0x10, 0x01, 0x1f, 0xdc,
+ 0xd0, 0x41, 0x00, 0xd0, 0xe0, 0x01, 0xd0, 0x30, 0x40, 0xdd, 0x9e, 0x04,
+ 0x37, 0x03, 0xbd, 0xff,
+ 0x03, 0x43, 0x0e, 0xc0, 0x05, 0x32, 0x00, 0xbc, 0x01, 0x36, 0x0f, 0xee,
+ 0x33, 0x21, 0xfe, 0xf2,
+ 0x04, 0xce, 0x00, 0x75, 0x50, 0xee, 0x00, 0x10, 0x32, 0x02, 0x00, 0x00,
+ 0x2a, 0x40, 0x50, 0x00,
+ 0xfb, 0x00, 0x46, 0x10, 0x0d, 0x00, 0x1f, 0x01, 0x10, 0x0f, 0x62, 0x45,
+ 0x0e, 0xec, 0x00, 0x00,
+ 0x01, 0x12, 0x23, 0x0f, 0x0e, 0x3d, 0x20, 0x30, 0x44, 0x74, 0x2e, 0x0b,
+ 0x01, 0x10, 0x0f, 0x1e,
+ 0x00, 0xe5, 0x8e, 0xe0, 0x13, 0x0d, 0xfc, 0xe6, 0x12, 0x00, 0xd0, 0xdc,
+ 0xff, 0x4f, 0x72, 0x42,
+ 0xe0, 0xe0, 0x01, 0x1f, 0x0a, 0x12, 0x34, 0x00, 0xe0, 0xbf, 0xf0, 0x00,
+ 0xf0, 0x01, 0xf1, 0xd0,
+ 0x10, 0xef, 0x89, 0xe0, 0x26, 0x61, 0xff, 0x0f, 0x20, 0xfd, 0xde, 0x05,
+ 0x22, 0x00, 0x71, 0x0f,
+ 0xc9, 0x11, 0x11, 0x00, 0x03, 0xe0, 0xee, 0x03, 0x36, 0xef, 0xfe, 0x71,
+ 0x02, 0x00, 0xe0, 0x04,
+ 0x43, 0x0e, 0x0d, 0x1f, 0x11, 0x25, 0xf3, 0xf5, 0x01, 0x00, 0x42, 0x0f,
+ 0xed, 0x66, 0x25, 0xd0,
+ 0xdf, 0x0f, 0x71, 0x01, 0xf1, 0x01, 0x00, 0x00, 0x04, 0x01, 0xdf, 0x62,
+ 0x37, 0xb0, 0xff, 0x12,
+ 0x01, 0x00, 0xff, 0x13, 0x14, 0xdf, 0xf0, 0xe0, 0xc0, 0x00, 0x64, 0x22,
+ 0x00, 0xc0, 0x16, 0x10,
+ 0x0e, 0x41, 0x02, 0xe0, 0xf0, 0x35, 0x00, 0xdd, 0xd5, 0x01, 0x11, 0x00,
+ 0x1f, 0x71, 0x71, 0xcc,
+ 0xef, 0x25, 0x20, 0x0a, 0xdf, 0x01, 0x00, 0x1f, 0x1d, 0x10, 0x03, 0xfe,
+ 0x31, 0x70, 0xfa, 0xee,
+ 0x40, 0x00, 0x0f, 0x32, 0x11, 0xca, 0x00, 0x43, 0x2e, 0x0d, 0xf1, 0x04,
+ 0x11, 0xfd, 0xfd, 0x41,
+ 0x12, 0xbd, 0xcf, 0x02, 0x42, 0xf8, 0xce, 0xf1, 0x12, 0x0d, 0xfd, 0xf2,
+ 0xdf, 0x0e, 0x67, 0x00,
+ 0x0c, 0x00, 0x52, 0x01, 0x0f, 0x08, 0xe0, 0x40, 0x01, 0xee, 0x00, 0x20,
+ 0x5e, 0x00, 0x1f, 0x40,
+ 0x20, 0x2c, 0x10, 0xc0, 0xae, 0x01, 0x11, 0x3b, 0xef, 0xc4, 0x04, 0xff,
+ 0xeb, 0x2f, 0x70, 0x21,
+ 0xf1, 0xe0, 0x10, 0x40, 0xe8, 0xcc, 0x31, 0x31, 0xf0, 0xd0, 0x9e, 0xea,
+ 0x00, 0x30, 0x00, 0xe2,
+ 0xf0, 0x0f, 0x0f, 0x3d, 0x3a, 0x40, 0x03, 0xb1, 0x10, 0x40, 0x0c, 0xfe,
+ 0x01, 0x33, 0x0f, 0xfd,
+ 0xdf, 0xf0, 0xe0, 0xdc, 0x0f, 0x60, 0x00, 0xe0, 0xd8, 0xbd, 0x00, 0x04,
+ 0xf0, 0x1f, 0x0c, 0xbc,
+ 0x40, 0x32, 0xbf, 0x0e, 0x15, 0x2e, 0xdc, 0xff, 0x22, 0x01, 0xaf, 0x0f,
+ 0x03, 0x23, 0xe0, 0xd0,
+ 0x10, 0x20, 0x07, 0x02, 0x90, 0x04, 0x15, 0xf0, 0x0e, 0x02, 0xcf, 0x0e,
+ 0x76, 0x22, 0xc0, 0xf3,
+ 0x01, 0xf0, 0x11, 0x31, 0x10, 0xd2, 0xe5, 0x12, 0x0f, 0x8d, 0x01, 0xf3,
+ 0x00, 0xf6, 0xf1, 0x00,
+ 0x00, 0xf1, 0x15, 0x41, 0x02, 0x12, 0xe0, 0xbe, 0x11, 0x63, 0x27, 0x21,
+ 0xe0, 0xd0, 0x13, 0xf0,
+ 0xcc, 0x23, 0x14, 0x00, 0x1e, 0x10, 0xf0, 0xf1, 0x30, 0x73, 0x3f, 0xc9,
+ 0x01, 0x64, 0x0f, 0x00,
+ 0xe1, 0x13, 0x2f, 0x0c, 0x15, 0x02, 0xcf, 0x20, 0x40, 0xc0, 0xed, 0x03,
+ 0x03, 0x01, 0x0d, 0x0a,
+ 0x51, 0x24, 0xd0, 0xc0, 0x0f, 0x2b, 0x0d, 0x0f, 0x35, 0x02, 0x12, 0x02,
+ 0xef, 0x0d, 0x00, 0xe1,
+ 0xa5, 0xe2, 0x12, 0x51, 0xe0, 0x10, 0x75, 0xf0, 0xf0, 0xf0, 0xe0, 0x01,
+ 0x03, 0x2e, 0x37, 0xe2,
+ 0x8e, 0xeb, 0x01, 0x03, 0x35, 0x10, 0xf0, 0xf3, 0x00, 0x0d, 0x0d, 0xbf,
+ 0x03, 0x77, 0x0f, 0x0e,
+ 0xef, 0x21, 0x40, 0x1c, 0x3f, 0x1f, 0x1f, 0x2f, 0x1c, 0x2c, 0x10, 0x20,
+ 0x40, 0x4d, 0x0d, 0xfc,
+ 0x40, 0x2e, 0xca, 0x00, 0x51, 0x2e, 0x2c, 0x5f, 0x0e, 0x1e, 0x3e, 0x41,
+ 0x00, 0xf8, 0x0f, 0x50,
+ 0xd0, 0xcf, 0x0e, 0x3f, 0x0a, 0xe0, 0xff, 0xae, 0x0f, 0x11, 0x2c, 0xfb,
+ 0x00, 0x42, 0x11, 0x9c,
+ 0xfc, 0x23, 0x20, 0xd9, 0x00, 0x21, 0x10, 0xc0, 0xe0, 0x10, 0x2f, 0x0d,
+ 0xef, 0xce, 0xe0, 0x02,
+ 0xa0, 0xdc, 0x00, 0x00, 0x0f, 0x8a, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0xd9, 0xcd, 0xfe, 0xf0,
+ 0xfe, 0x00, 0x0f, 0x8d, 0xfc, 0xe0, 0xe0, 0x13, 0x0e, 0xfb, 0xd0, 0x01,
+ 0x11, 0xfb, 0x0f, 0x0f,
+ 0xbd, 0x0e, 0x64, 0x02, 0xde, 0x0f, 0x01, 0x31, 0xea, 0x00, 0xf0, 0xd2,
+ 0x02, 0x00, 0xcc, 0xbd,
+ 0x03, 0x00, 0xb8, 0x00, 0x22, 0xff, 0xc0, 0x01, 0xf1, 0x0d, 0x30, 0x12,
+ 0xb3, 0xe1, 0xfd, 0x0d,
+ 0x32, 0xd7, 0xf3, 0x9d, 0xec, 0x01, 0x00, 0x0e, 0x47, 0xa1, 0x05, 0x05,
+ 0x7a, 0x00, 0x88, 0x00,
+ 0xed, 0xd8, 0x1c, 0x02, 0x59, 0xda, 0x8e, 0x02, 0x0e, 0x99, 0x20, 0x45,
+ 0xc0, 0x00, 0x00, 0x0e,
+ 0xe0, 0x02, 0x24, 0x52, 0x00, 0x8a, 0x00, 0x01, 0x03, 0xf0, 0xf0, 0xfd,
+ 0x11, 0x20, 0xef, 0x0e,
+ 0xf0, 0xf3, 0x11, 0x0e, 0x0d, 0x0e, 0x9b, 0xed, 0x03, 0x37, 0x02, 0xcb,
+ 0xf0, 0xf3, 0x00, 0xf0,
+ 0x00, 0x00, 0x44, 0xf0, 0x02, 0x43, 0xff, 0xff, 0x12, 0x77, 0x20, 0x00,
+ 0xf2, 0xf2, 0xe2, 0x12,
+ 0x34, 0xde, 0xad, 0xf3, 0x17, 0x43, 0x1d, 0x30, 0x03, 0xbf, 0xf0, 0x25,
+ 0x1e, 0x0e, 0x56, 0x01,
+ 0xef, 0x0f, 0x74, 0x00, 0x0e, 0x20, 0x43, 0x10, 0x10, 0x21, 0x00, 0x1c,
+ 0x33, 0x20, 0xcc, 0x23,
+ 0x56, 0xf0, 0xfe, 0x00, 0x02, 0x00, 0xe0, 0x24, 0x73, 0x44, 0x11, 0x0e,
+ 0x0d, 0x10, 0x27, 0x23,
+ 0x0e, 0x41, 0x01, 0xef, 0x01, 0x25, 0xfe, 0xcd, 0x23, 0x34, 0xbe, 0xf0,
+ 0x45, 0x0f, 0x0f, 0x63,
+ 0x12, 0x03, 0x01, 0x0e, 0xf0, 0x36, 0x20, 0x01, 0xf2, 0x12, 0x50, 0x31,
+ 0x1f, 0x10, 0x26, 0x32,
+ 0x0f, 0x00, 0xe1, 0xec, 0x74, 0x75, 0xfe, 0xfd, 0x11, 0x10, 0x0f, 0x1d,
+ 0x75, 0x10, 0x0a, 0xfe,
+ 0x2f, 0x30, 0x0d, 0x11, 0x15, 0x0f, 0xed, 0xdd, 0x40, 0x11, 0xf0, 0x02,
+ 0x0e, 0x0b, 0x41, 0x12,
+ 0xad, 0x0d, 0x6f, 0x12, 0x07, 0xf1, 0xf0, 0x2f, 0x30, 0x00, 0x00, 0x05,
+ 0x01, 0x0e, 0xfc, 0xf1,
+ 0xa3, 0x15, 0x20, 0xef, 0xb0, 0x00, 0x20, 0x33, 0x00, 0xd2, 0x16, 0xaf,
+ 0xce, 0x24, 0x54, 0x0e,
+ 0xd0, 0x06, 0x00, 0x10, 0x02, 0xd0, 0xd2, 0x11, 0x74, 0x11, 0xee, 0xef,
+ 0x01, 0xa0, 0xf0, 0x14,
+ 0x20, 0xd9, 0xef, 0x00, 0x43, 0x12, 0xec, 0xff, 0x31, 0x43, 0xf0, 0xdd,
+ 0x00, 0x1d, 0x30, 0xf2,
+ 0xc1, 0x26, 0x72, 0x3f, 0xda, 0xcf, 0xff, 0x30, 0x11, 0xf0, 0x03, 0x32,
+ 0x2c, 0x09, 0x0f, 0x0f,
+ 0xb0, 0xf1, 0x0f, 0x70, 0xfe, 0xcd, 0x01, 0x00, 0xed, 0x37, 0x74, 0x00,
+ 0xee, 0x00, 0x3f, 0x00,
+ 0x03, 0x05, 0x1e, 0x4f, 0x00, 0xd0, 0x00, 0x30, 0x13, 0xb4, 0xd1, 0x04,
+ 0x40, 0x01, 0xe0, 0xc1,
+ 0x02, 0xf6, 0xd4, 0xd4, 0xe3, 0x1f, 0xdd, 0xe3, 0x47, 0x90, 0x01, 0x51,
+ 0x0f, 0x0e, 0x34, 0x32,
+ 0xdd, 0x0e, 0x3f, 0x3f, 0xf0, 0xf2, 0xe3, 0x8b, 0x00, 0xe3, 0xdd, 0xda,
+ 0x01, 0x13, 0x00, 0x3d,
+ 0x70, 0x0f, 0xdb, 0x20, 0x31, 0x64, 0x00, 0x0b, 0x11, 0x0f, 0xfb, 0xf1,
+ 0xd3, 0xc0, 0x2c, 0x3f,
+ 0xcc, 0xe0, 0x03, 0xd0, 0x0c, 0x0f, 0xdb, 0xdf, 0x60, 0x51, 0x00, 0xeb,
+ 0x00, 0xe0, 0xdf, 0x10,
+ 0x70, 0x10, 0xed, 0x0d, 0x20, 0xd0, 0xd0, 0xf0, 0x31, 0x0e, 0xef, 0x06,
+ 0xbd, 0x98, 0x00, 0x00,
+ 0x20, 0xf0, 0xde, 0x00, 0xdd, 0xea, 0xff, 0x10, 0x3f, 0x30, 0xa1, 0xa0,
+ 0xf0, 0x00, 0x0d, 0xef,
+ 0xcc, 0xfe, 0x04, 0xe2, 0xdc, 0xda, 0xff, 0x00, 0xff, 0xe0, 0x54, 0x01,
+ 0xed, 0xef, 0x02, 0x03,
+ 0xd0, 0x0f, 0x01, 0xc5, 0xe5, 0xc0, 0x8e, 0xf0, 0xf3, 0xc0, 0xf0, 0xf3,
+ 0xdc, 0xdd, 0x25, 0x11,
+ 0xdf, 0xee, 0xf1, 0xf2, 0x12, 0x3c, 0x3d, 0xde, 0x80, 0xf0, 0x17, 0x72,
+ 0xed, 0xd8, 0x10, 0x42,
+ 0xf0, 0xde, 0x0e, 0x01, 0xbf, 0x10, 0x40, 0xec, 0xf1, 0x00, 0x0b, 0x3e,
+ 0x1e, 0x10, 0x10, 0xfd,
+ 0xdf, 0x01, 0x33, 0x3f, 0x88, 0x0e, 0x62, 0x14, 0xfe, 0xcc, 0xff, 0x0e,
+ 0x21, 0x02, 0xe0, 0xfb,
+ 0x30, 0x0d, 0xff, 0x0f, 0x0e, 0xdc, 0xdf, 0x00, 0x23, 0xf0, 0x89, 0x8e,
+ 0x0f, 0x00, 0x13, 0x02,
+ 0xff, 0x0e, 0x01, 0x04, 0x02, 0x10, 0x40, 0x00, 0xa8, 0x00, 0x35, 0x00,
+ 0xbf, 0x00, 0x01, 0x02,
+ 0xdf, 0xff, 0x11, 0x00, 0x23, 0x04, 0x9d, 0xec, 0x07, 0x53, 0xff, 0x0f,
+ 0xf0, 0xe0, 0xe0, 0x22,
+ 0x62, 0x12, 0x0f, 0xfd, 0x00, 0x43, 0x3f, 0x1c, 0x00, 0x24, 0x10, 0x2d,
+ 0x30, 0x0e, 0x0c, 0xd2,
+ 0x12, 0x41, 0x30, 0x08, 0xbd, 0x00, 0x75, 0x40, 0x0c, 0x00, 0x11, 0x13,
+ 0x22, 0x23, 0x1d, 0x1a,
+ 0x30, 0x20, 0x1f, 0x40, 0x44, 0xcf, 0xeb, 0x31, 0x50, 0xfd, 0xf0, 0xf0,
+ 0x1f, 0x0f, 0x01, 0x03,
+ 0x00, 0xbf, 0x00, 0x00, 0x47, 0x57, 0xe0, 0xdc, 0x21, 0x40, 0x01, 0xf1,
+ 0x01, 0x0d, 0x60, 0x04,
+ 0xe0, 0xe0, 0x03, 0x35, 0xf0, 0xac, 0x00, 0x13, 0x0f, 0xe1, 0x14, 0xed,
+ 0xbe, 0x11, 0x32, 0x0d,
+ 0xe0, 0x07, 0xbf, 0xec, 0x33, 0x11, 0xce, 0x00, 0x52, 0xf1, 0xe0, 0x03,
+ 0xf0, 0xea, 0x03, 0x36,
+ 0xff, 0xde, 0x40, 0x31, 0xf1, 0xf2, 0x13, 0x2f, 0x1f, 0x52, 0x00, 0x03,
+ 0x07, 0x61, 0x20, 0xfe,
+ 0xf2, 0x17, 0x31, 0x4f, 0x00, 0xe0, 0xb3, 0x42, 0x43, 0xf0, 0xce, 0x10,
+ 0x53, 0x04, 0xf4, 0x17,
+ 0x21, 0xfe, 0x00, 0x65, 0x00, 0xe0, 0x02, 0x33, 0xf0, 0xc1, 0x02, 0x11,
+ 0x10, 0x05, 0x00, 0xb0,
+ 0x0f, 0xf0, 0x15, 0x52, 0x00, 0xcc, 0x01, 0x42, 0x03, 0x27, 0x00, 0x10,
+ 0x0e, 0xe0, 0x23, 0x05,
+ 0xe0, 0xc2, 0xe0, 0x00, 0x73, 0x23, 0xbe, 0xf0, 0x13, 0x12, 0x00, 0x02,
+ 0xee, 0xd8, 0x0f, 0x13,
+ 0xa0, 0xee, 0x0f, 0xdf, 0x20, 0x77, 0xff, 0xdd, 0x22, 0x20, 0x21, 0x24,
+ 0x0e, 0xfb, 0x10, 0x52,
+ 0x10, 0x21, 0xde, 0xab, 0x10, 0x56, 0x20, 0xec, 0xff, 0x10, 0x40, 0x0e,
+ 0xf2, 0x03, 0xed, 0xec,
+ 0x10, 0x40, 0xe0, 0xa0, 0x0f, 0xfd, 0x00, 0x07, 0x22, 0xed, 0xfa, 0x50,
+ 0x21, 0x0f, 0x2e, 0x1f,
+ 0x1f, 0x0f, 0x20, 0x51, 0xea, 0xbc, 0x0f, 0x00, 0x00, 0x12, 0x00, 0xcd,
+ 0xfa, 0x00, 0x61, 0x11,
+ 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x23, 0x20, 0x31, 0x00, 0xfd, 0x13, 0x24,
+ 0xc9, 0xde, 0x30, 0x01,
+ 0x90, 0x0f, 0xed, 0x9c, 0xfd, 0x00, 0x11, 0xde, 0xcd, 0xfd, 0x23, 0x64,
+ 0xfa, 0xcb, 0x00, 0x1e,
+ 0x2e, 0x00, 0x14, 0xee, 0xed, 0x11, 0x61, 0x00, 0x01, 0x07, 0x0f, 0xcd,
+ 0xff, 0x1f, 0x1d, 0x10,
+ 0xf2, 0x91, 0x0d, 0x08, 0x0e, 0x0f, 0x20, 0x0f, 0xec, 0xf1, 0x20, 0x2f,
+ 0x1c, 0x20, 0xdf, 0xf0,
+ 0xdd, 0xbc, 0x00, 0x0d, 0xda, 0xae, 0x2f, 0x51, 0x0f, 0xcd, 0x0f, 0x11,
+ 0x00, 0x0f, 0x32, 0x34,
+ 0xc0, 0xeb, 0x10, 0x27, 0xe6, 0x80, 0x01, 0x30, 0x00, 0x01, 0x02, 0xb0,
+ 0x00, 0x04, 0xe2, 0x02,
+ 0x02, 0x10, 0xe2, 0xd2, 0x01, 0x3f, 0x24, 0x17, 0xe5, 0x8f, 0xff, 0x01,
+ 0x33, 0x02, 0xe3, 0x01,
+ 0x32, 0x90, 0xdf, 0xf3, 0x03, 0xd0, 0x02, 0xf7, 0xd2, 0xf2, 0xcf, 0x1f,
+ 0x74, 0x32, 0xf0, 0x33,
+ 0x46, 0xe0, 0xc0, 0x1f, 0x40, 0xf2, 0x04, 0xf1, 0xfd, 0x11, 0x77, 0x11,
+ 0x00, 0x1e, 0x00, 0x57,
+ 0x00, 0xee, 0x31, 0x00, 0xcd, 0x50, 0x13, 0xee, 0xe0, 0x07, 0xe0, 0xfd,
+ 0x1e, 0x70, 0x13, 0xf0,
+ 0x00, 0x10, 0x00, 0xdd, 0x67, 0x22, 0xdf, 0x00, 0x51, 0x02, 0xe0, 0x00,
+ 0xff, 0x0f, 0x21, 0x17,
+ 0x11, 0xed, 0x1f, 0x20, 0x02, 0xf3, 0x01, 0xfe, 0x8c, 0x0f, 0x27, 0x05,
+ 0x80, 0x00, 0x00, 0x0f,
+ 0x00, 0x26, 0x00, 0x0f, 0x00, 0x42, 0x01, 0xf0, 0x10, 0x22, 0xff, 0xcd,
+ 0x22, 0x10, 0xce, 0x01,
+ 0x17, 0x30, 0xcc, 0xde, 0x00, 0x30, 0xfc, 0xf0, 0x73, 0x71, 0x0c, 0x0f,
+ 0xfe, 0xff, 0x23, 0x75,
+ 0x0d, 0xfd, 0x1f, 0x2e, 0x0e, 0x0e, 0x0c, 0xfb, 0x0d, 0x40, 0x0f, 0xdc,
+ 0xfe, 0x10, 0x01, 0x0f,
+ 0xf8, 0x4f, 0x2f, 0xff, 0xde, 0x40, 0x0d, 0xf8, 0x70, 0x31, 0xd0, 0xdf,
+ 0x0e, 0x3e, 0x20, 0x12,
+ 0xf0, 0xec, 0xdd, 0x1f, 0x7e, 0xef, 0xdc, 0x01, 0x1e, 0xfa, 0x8f, 0xfd,
+ 0xfe, 0x1f, 0x10, 0x00,
+ 0xfd, 0xe2, 0xdf, 0xf9, 0x1f, 0x2e, 0xac, 0xdf, 0x00, 0xe0, 0xcc, 0xbf,
+ 0xdf, 0xff, 0xfc, 0x0d,
+ 0xdd, 0xaf, 0x01, 0x02, 0xe2, 0xfe, 0xe8, 0xf9, 0x00, 0xf3, 0xc0, 0xd0,
+ 0xef, 0xee, 0xdd, 0x62,
+ 0x44, 0xc0, 0xbb, 0x00, 0xf1, 0x00, 0x21, 0xee, 0xe0, 0x00, 0xff, 0xed,
+ 0x0f, 0x02, 0xd1, 0x04,
+ 0x43, 0xbe, 0xde, 0x02, 0x22, 0x00, 0xf2, 0xd7, 0xc2, 0xc0, 0xda, 0xee,
+ 0xff, 0x35, 0x12, 0x8d,
+ 0xfd, 0x00, 0x32, 0x20, 0x0e, 0xbf, 0x00, 0x09, 0x1d, 0x31, 0xd3, 0x9e,
+ 0x0d, 0x10, 0x0f, 0xc1,
+ 0x07, 0x02, 0x0f, 0xed, 0x10, 0x33, 0xdc, 0xde, 0xe0, 0x06, 0x11, 0x8c,
+ 0x0f, 0x0f, 0x0f, 0xf2,
+ 0x04, 0xac, 0xec, 0x10, 0x01, 0x11, 0x12, 0xef, 0xae, 0x02, 0x01, 0xeb,
+ 0x00, 0xf7, 0x90, 0x0e,
+ 0x22, 0x10, 0xf1, 0xf0, 0x01, 0x01, 0x31, 0xef, 0x01, 0x76, 0x12, 0xfe,
+ 0xcf, 0x13, 0x04, 0xef,
+ 0xd1, 0xe7, 0xe1, 0x11, 0xd0, 0xbf, 0x03, 0x13, 0x20, 0x46, 0x00, 0x00,
+ 0x60, 0x20, 0x10, 0x12,
+ 0x00, 0xff, 0x41, 0x20, 0x10, 0x11, 0x05, 0x13, 0x60, 0x1e, 0x00, 0x0e,
+ 0x0e, 0x3a, 0x40, 0x36,
+ 0x00, 0x12, 0x70, 0x40, 0x20, 0x11, 0x14, 0x32, 0x30, 0x1e, 0x35, 0x63,
+ 0x0d, 0x1e, 0x33, 0x01,
+ 0xfc, 0x0f, 0x01, 0xe2, 0x05, 0x72, 0x10, 0x1b, 0x0e, 0x00, 0x02, 0x02,
+ 0x30, 0x7f, 0x43, 0x00,
+ 0x0f, 0x00, 0x0f, 0x37, 0x37, 0xe0, 0x01, 0x74, 0x10, 0xef, 0x01, 0x12,
+ 0xe0, 0xe2, 0x14, 0x41,
+ 0x13, 0xee, 0xcb, 0x10, 0x42, 0x36, 0x01, 0xf0, 0x3c, 0x60, 0x02, 0x01,
+ 0x11, 0x50, 0x03, 0x0f,
+ 0x1c, 0x10, 0x00, 0x11, 0x00, 0x0d, 0x6e, 0x1d, 0xf0, 0xec, 0x0d, 0x71,
+ 0x30, 0xf9, 0x00, 0x03,
+ 0x20, 0x1c, 0x71, 0x06, 0x00, 0x00, 0xfe, 0x00, 0x26, 0x22, 0xde, 0x10,
+ 0x40, 0xe0, 0xff, 0x14,
+ 0x0f, 0xba, 0x10, 0x62, 0x01, 0xff, 0x0f, 0x10, 0x20, 0x1f, 0x03, 0x27,
+ 0x01, 0x0d, 0x00, 0xc3,
+ 0xb0, 0x04, 0xe1, 0x22, 0x00, 0xd1, 0xd2, 0x04, 0x74, 0x40, 0x00, 0x0f,
+ 0xe1, 0x15, 0x00, 0xff,
+ 0x02, 0xe1, 0xed, 0x40, 0x04, 0xa2, 0xc1, 0xf1, 0x03, 0x0d, 0xf1, 0x00,
+ 0x08, 0x60, 0x37, 0x03,
+ 0xcc, 0xff, 0x00, 0x21, 0x20, 0x0c, 0x20, 0xff, 0xad, 0x03, 0xf1, 0xfa,
+ 0x0f, 0x10, 0xf0, 0x04,
+ 0x50, 0xcd, 0xab, 0x13, 0x24, 0xef, 0xfd, 0x00, 0x30, 0x23, 0x12, 0xf0,
+ 0x0e, 0x6f, 0x41, 0x12,
+ 0x12, 0x00, 0x09, 0x00, 0x12, 0x01, 0x8b, 0x00, 0x14, 0x10, 0xdd, 0xe0,
+ 0xe4, 0x02, 0xef, 0x40,
+ 0x57, 0x00, 0xe0, 0x0f, 0x14, 0x42, 0xff, 0x00, 0x14, 0x31, 0x01, 0xce,
+ 0xbe, 0x13, 0x56, 0xef,
+ 0xf0, 0x01, 0x0b, 0x10, 0x41, 0xf2, 0xcf, 0x00, 0x21, 0x12, 0x02, 0x0c,
+ 0x0d, 0x33, 0x13, 0x0d,
+ 0x30, 0x31, 0xee, 0xfc, 0x10, 0x13, 0x34, 0x70, 0xc8, 0xde, 0x15, 0xf0,
+ 0xbe, 0x0f, 0xdf, 0xbc,
+ 0x0f, 0xe0, 0xcd, 0x00, 0x20, 0xf9, 0xf0, 0x3f, 0x0f, 0xde, 0x31, 0x12,
+ 0x10, 0x7d, 0x2f, 0xfe,
+ 0x89, 0xf0, 0x02, 0x00, 0xfc, 0x01, 0x13, 0xdc, 0xbc, 0x00, 0x00, 0x30,
+ 0xfa, 0xd0, 0x30, 0x62,
+ 0xdc, 0xdd, 0x00, 0x01, 0x03, 0x10, 0xeb, 0xaf, 0xee, 0xdf, 0xe0, 0xe3,
+ 0xdf, 0xa9, 0xff, 0x11,
+ 0x10, 0xca, 0xfe, 0x00, 0xf0, 0xf1, 0xdf, 0xeb, 0x00, 0x20, 0x01, 0xe0,
+ 0xc0, 0xd0, 0xc1, 0xd0,
+ 0x1e, 0x32, 0x05, 0x80, 0xad, 0x0f, 0x04, 0x02, 0xd0, 0xfe, 0xff, 0xf0,
+ 0x07, 0x01, 0xd0, 0x00,
+ 0xb1, 0xdf, 0xfe, 0x14, 0x00, 0x80, 0x07, 0xe1, 0xff, 0xfe, 0xe0, 0xe3,
+ 0x00, 0x0c, 0xe0, 0xd3,
+ 0x0e, 0x1e, 0x22, 0xfb, 0xca, 0x00, 0x31, 0xf1, 0xbd, 0x0f, 0xc0, 0xde,
+ 0x3f, 0x2d, 0x0f, 0x04,
+ 0xf1, 0xcb, 0x0c, 0x30, 0x7f, 0x74, 0x10, 0xcd, 0x0f, 0x0f, 0x0d, 0xeb,
+ 0xde, 0x0e, 0x2f, 0x2f,
+ 0xfd, 0xdb, 0xdc, 0xee, 0x4e, 0x30, 0xfe, 0x0f, 0x9f, 0xcb, 0xef, 0xef,
+ 0xff, 0x0f, 0xde, 0xdd,
+ 0xcd, 0x03, 0x76, 0x1e, 0x2e, 0x0e, 0x1e, 0x00, 0x0a, 0x0f, 0x12, 0xe0,
+ 0x10, 0x77, 0x00, 0x8d,
+ 0xff, 0xf2, 0xf4, 0x04, 0xe1, 0xae, 0x0d, 0x13, 0x02, 0x00, 0x00, 0xf5,
+ 0x04, 0x41, 0x00, 0x0d,
+ 0x2f, 0x1f, 0x00, 0x12, 0x41, 0x0f, 0x00, 0x0d, 0xe8, 0x2c, 0x30, 0xf0,
+ 0xf2, 0x51, 0x22, 0xf1,
+ 0x21, 0x4e, 0x09, 0x70, 0x64, 0x11, 0x0d, 0x0f, 0x20, 0x22, 0x30, 0x11,
+ 0x33, 0x41, 0x1f, 0x21,
+ 0x32, 0x0d, 0x3e, 0x77, 0x27, 0x0f, 0xfb, 0x0f, 0x1f, 0x41, 0xe0, 0xd0,
+ 0x1e, 0x4e, 0x2d, 0x20,
+ 0x15, 0x20, 0x1f, 0x60, 0x00, 0x00, 0x00, 0x11, 0x35, 0x12, 0xc0, 0xee,
+ 0x00, 0x44, 0x20, 0x54,
+ 0x00, 0x8d, 0xfe, 0x04, 0x36, 0x10, 0xfe, 0x10, 0x35, 0x00, 0xbf, 0x01,
+ 0x00, 0xff, 0x0e, 0xf6,
+ 0xd0, 0xbf, 0x0f, 0x21, 0x01, 0xf0, 0xdf, 0x0f, 0xcf, 0x10, 0x41, 0xd9,
+ 0xdf, 0x03, 0xe4, 0xd0,
+ 0xf0, 0x01, 0x43, 0x46, 0x32, 0x20, 0xbb, 0x01, 0x06, 0x00, 0x00, 0xe0,
+ 0x40, 0x20, 0xf1, 0xb3,
+ 0xe1, 0x00, 0x72, 0x46, 0x10, 0x1f, 0xff, 0x01, 0x05, 0x41, 0x20, 0x10,
+ 0x01, 0x11, 0x65, 0x02,
+ 0xe1, 0xf1, 0x43, 0x20, 0x14, 0x14, 0xf1, 0xc2, 0x20, 0x73, 0x11, 0x02,
+ 0x02, 0x24, 0x03, 0xd1,
+ 0xe2, 0x32, 0x31, 0xfe, 0xe1, 0x37, 0x67, 0x10, 0x00, 0x0f, 0x11, 0x73,
+ 0x12, 0xf1, 0xf4, 0x15,
+ 0x72, 0x0f, 0x0e, 0xf0, 0x00, 0x04, 0x46, 0x10, 0x0e, 0x10, 0x00, 0xb1,
+ 0x00, 0x02, 0xf0, 0xb2,
+ 0xf1, 0xe0, 0xe0, 0xe7, 0xf2, 0xe0, 0x2f, 0x23, 0x15, 0x20, 0x3f, 0xee,
+ 0x3f, 0x72, 0x74, 0x41,
+ 0xee, 0x0b, 0x20, 0x21, 0x01, 0xcd, 0xff, 0x00, 0x35, 0x10, 0xed, 0xce,
+ 0x00, 0x10, 0xec, 0xe0,
+ 0x57, 0x20, 0x1f, 0x00, 0x01, 0x03, 0x0d, 0x3c, 0x70, 0x52, 0xff, 0xfe,
+ 0xff, 0x1a, 0x3c, 0xfc,
+ 0xbf, 0x00, 0x10, 0x0e, 0x1e, 0x0b, 0x0e, 0x1d, 0x30, 0x00, 0xeb, 0x10,
+ 0x0e, 0xed, 0x3e, 0x70,
+ 0x31, 0x1e, 0x3e, 0x1b, 0x20, 0x75, 0x21, 0x0e, 0x0d, 0x61, 0x02, 0x00,
+ 0xe0, 0x00, 0x10, 0xe8,
+ 0xff, 0xbe, 0xb0, 0x01, 0xf1, 0xf0, 0xd8, 0xdf, 0x20, 0x2f, 0x0f, 0xe0,
+ 0x00, 0x21, 0x10, 0x2d,
+ 0x40, 0xfd, 0xc9, 0x10, 0x13, 0x80, 0xfd, 0x00, 0xde, 0x9b, 0x00, 0x35,
+ 0x0f, 0x0e, 0x1f, 0xcf,
+ 0xdd, 0x00, 0x10, 0x1f, 0x0d, 0xff, 0xc1, 0xd3, 0xf0, 0x08, 0xee, 0x0f,
+ 0x0d, 0xb0, 0xe0, 0xf0,
+ 0xa9, 0xce, 0x0d, 0x30, 0x20, 0xeb, 0xbd, 0x0e, 0x41, 0x43, 0x1e, 0x0a,
+ 0xd0, 0x0e, 0x20, 0x63,
+ 0xf1, 0xef, 0xed, 0xed, 0xf0, 0x07, 0x02, 0xef, 0x00, 0x04, 0xf0, 0x00,
+ 0x21, 0x00, 0x72, 0x14,
+ 0xb4, 0xe2, 0x22, 0x31, 0xe0, 0xc0, 0xe6, 0xc4, 0xf4, 0xe0, 0xd1, 0x21,
+ 0x75, 0x51, 0xe0, 0xd0,
+ 0xf2, 0x14, 0x22, 0x00, 0xe1, 0x04, 0xb0, 0xe0, 0x01, 0x01, 0x02, 0x06,
+ 0xc2, 0x00, 0x32, 0x00,
+ 0x01, 0x01, 0x43, 0x05, 0xb3, 0x02, 0x30, 0x1f, 0x0e, 0x23, 0xf5, 0xd0,
+ 0x0f, 0x73, 0x72, 0x32,
+ 0xff, 0xda, 0x0f, 0x00, 0x20, 0x32, 0x1f, 0xfc, 0x0f, 0x0f, 0x0f, 0xf0,
+ 0xb0, 0x11, 0x47, 0x22,
+ 0xf0, 0x0d, 0x0f, 0x4e, 0x73, 0x37, 0x27, 0xe0, 0x0f, 0x70, 0x00, 0x12,
+ 0x00, 0x01, 0xe2, 0x00,
+ 0x0e, 0x00, 0xd4, 0xde, 0x0d, 0x0f, 0xa1, 0xe7, 0x03, 0x0f, 0x00, 0x15,
+ 0x11, 0x11, 0x50, 0x33,
+ 0x14, 0xff, 0x0f, 0x42, 0x72, 0x13, 0xff, 0xdc, 0xf3, 0x17, 0x05, 0x05,
+ 0x19, 0x00, 0x1e, 0x00,
+ 0xe1, 0x04, 0x24, 0x1d, 0x8e, 0x06, 0x4e, 0x1d, 0xc9, 0xd0, 0xb1, 0x07,
+ 0x03, 0xaf, 0x0e, 0x34,
+ 0x44, 0xae, 0xff, 0x1f, 0x30, 0x30, 0x21, 0x40, 0x10, 0x1f, 0x03, 0x10,
+ 0x09, 0x0e, 0x70, 0x73,
+ 0x00, 0x08, 0xdf, 0x0e, 0x00, 0x0d, 0x2f, 0x2e, 0xfe, 0xfb, 0x1e, 0x7d,
+ 0x1d, 0x0b, 0x10, 0x30,
+ 0x10, 0x1c, 0x7f, 0x0c, 0x0e, 0xee, 0xfe, 0x00, 0x1a, 0x0f, 0x00, 0x00,
+ 0x1d, 0x1c, 0x2e, 0x2e,
+ 0x3e, 0x4e, 0xfc, 0xef, 0xdc, 0x0c, 0x7e, 0x41, 0xef, 0xda, 0x00, 0xd0,
+ 0xdd, 0xcd, 0x0c, 0x00,
+ 0x9c, 0xdd, 0xed, 0xee, 0xdc, 0xdf, 0x0f, 0x1d, 0xcc, 0x8e, 0xef, 0x0c,
+ 0x40, 0xf1, 0xc0, 0xee,
+ 0xda, 0xef, 0xf0, 0x01, 0xf0, 0xb0, 0xd0, 0xcb, 0xf0, 0xf0, 0xf0, 0x0e,
+ 0xdf, 0xcf, 0x0f, 0x5d,
+ 0xf8, 0xdd, 0xfe, 0x14, 0x04, 0xb0, 0xdb, 0xf0, 0xf2, 0xf0, 0xff, 0xa0,
+ 0xc0, 0xe0, 0x10, 0x11,
+ 0x04, 0xc0, 0xde, 0xee, 0x14, 0x24, 0xef, 0xfe, 0xf0, 0xd1, 0xf0, 0x02,
+ 0x46, 0xcc, 0x19, 0x70,
+ 0x30, 0xc3, 0xde, 0x1e, 0x20, 0x2d, 0x10, 0xc0, 0xc0, 0xf1, 0x1f, 0x1e,
+ 0xed, 0xcf, 0x01, 0x02,
+ 0x5a, 0x1c, 0x0d, 0xfe, 0x0e, 0x0b, 0xef, 0xfd, 0xfe, 0xd2, 0xdf, 0x89,
+ 0xae, 0xff, 0xf2, 0xf5,
+ 0xee, 0xff, 0xff, 0x02, 0xd0, 0x0e, 0x2f, 0x3f, 0x00, 0x06, 0xe3, 0x9f,
+ 0x0a, 0x62, 0x32, 0xeb,
+ 0xf1, 0x37, 0xb0, 0xcb, 0x22, 0x22, 0x9e, 0xfe, 0x03, 0x04, 0xff, 0xee,
+ 0x01, 0x03, 0x00, 0x11,
+ 0x00, 0x04, 0xf0, 0x10, 0x10, 0x00, 0xd3, 0x02, 0x01, 0xff, 0x00, 0x63,
+ 0xf3, 0xbe, 0x00, 0x13,
+ 0x26, 0x00, 0xcf, 0x20, 0x42, 0x2f, 0x20, 0xfa, 0x20, 0x77, 0x0f, 0x1e,
+ 0x40, 0x23, 0x1f, 0x2f,
+ 0x64, 0x02, 0x10, 0x00, 0x30, 0x36, 0x10, 0x1f, 0x20, 0xf3, 0x02, 0x2c,
+ 0x4f, 0x31, 0x00, 0x0f,
+ 0x00, 0x10, 0x5e, 0x3b, 0x30, 0x52, 0x10, 0x20, 0x0d, 0x0b, 0x70, 0x23,
+ 0x26, 0x12, 0x20, 0x0e,
+ 0x30, 0x52, 0x11, 0x04, 0x01, 0xf0, 0x00, 0x25, 0x20, 0x10, 0x00, 0xd7,
+ 0x04, 0x71, 0x70, 0x01,
+ 0x13, 0xf0, 0xf1, 0x06, 0x01, 0xf1, 0x21, 0x00, 0xde, 0xd0, 0xf4, 0xf0,
+ 0xef, 0x5f, 0x53, 0x25,
+ 0x10, 0x1f, 0x30, 0x51, 0x2e, 0x2d, 0x1f, 0x10, 0x17, 0x30, 0x30, 0x0e,
+ 0xef, 0x33, 0x66, 0x31,
+ 0x30, 0x40, 0x61, 0x10, 0x1f, 0x01, 0x10, 0x62, 0x34, 0x00, 0x2c, 0x0f,
+ 0x36, 0xf1, 0xdc, 0x3f,
+ 0x70, 0x13, 0xf0, 0xf0, 0x0f, 0x3d, 0x23, 0x27, 0x03, 0xed, 0xdc, 0x41,
+ 0x52, 0x01, 0x0c, 0x0e,
+ 0xe2, 0x05, 0x30, 0x3e, 0x40, 0x73, 0x54, 0x0d, 0xdd, 0x03, 0x27, 0x00,
+ 0x01, 0x00, 0xee, 0x91,
+ 0xf6, 0x01, 0x20, 0x1f, 0xe2, 0xf6, 0x00, 0x20, 0x4f, 0x50, 0x1e, 0x00,
+ 0xf0, 0x00, 0x1d, 0x11,
+ 0x21, 0xaf, 0xdc, 0xee, 0x00, 0xf1, 0xf0, 0xbf, 0xdc, 0xe2, 0x00, 0x10,
+ 0x1e, 0x00, 0x25, 0x1b,
+ 0xca, 0xb0, 0x57, 0x33, 0xcb, 0x0f, 0x72, 0x02, 0xff, 0xde, 0x00, 0x21,
+ 0x01, 0xef, 0x00, 0x20,
+ 0x01, 0xf0, 0xf1, 0xff, 0x1f, 0x00, 0x01, 0x14, 0x62, 0x0e, 0x1d, 0x52,
+ 0x10, 0x04, 0xd5, 0x21,
+ 0x51, 0x20, 0x1e, 0x11, 0xf7, 0xc1, 0x0f, 0x0c, 0xf0, 0x02, 0xf1, 0xaf,
+ 0xfd, 0x01, 0x25, 0x0f,
+ 0x2a, 0x50, 0x00, 0x01, 0x22, 0x43, 0x3e, 0x3f, 0x55, 0x01, 0x11, 0x23,
+ 0x0e, 0x0c, 0x32, 0x05,
+ 0xc2, 0xbf, 0xff, 0x01, 0x3e, 0xde, 0xa4, 0x04, 0xff, 0x2a, 0x30, 0x20,
+ 0xd0, 0x9f, 0xdc, 0xee,
+ 0x0e, 0x11, 0x24, 0xb0, 0xcf, 0x0e, 0x00, 0x0e, 0xfe, 0xbd, 0x02, 0xe7,
+ 0xf0, 0xfc, 0xdc, 0x0f,
+ 0x0f, 0x2f, 0x20, 0x41, 0x23, 0xde, 0xc8, 0xf0, 0xe0, 0x00, 0x00, 0x2c,
+ 0xc0, 0xac, 0xd0, 0xc0,
+ 0xc0, 0xde, 0xef, 0xef, 0xee, 0xd0, 0xfd, 0xfa, 0xbf, 0xff, 0x00, 0xea,
+ 0x9d, 0x0e, 0x20, 0x21,
+ 0xcc, 0xbc, 0xfe, 0xee, 0xf0, 0xc2, 0xfe, 0xfa, 0x0f, 0xed, 0x0d, 0x10,
+ 0x11, 0xf0, 0xce, 0x0c,
+ 0x2e, 0x2f, 0x1e, 0xdd, 0x8f, 0xd6, 0xf4, 0x00, 0xff, 0xd2, 0xc1, 0xc1,
+ 0xe7, 0xd2, 0x33, 0x11,
+ 0x91, 0xe6, 0xe0, 0xbe, 0xf0, 0xf1, 0xf2, 0xe0, 0xd0, 0xc0, 0xf2, 0x00,
+ 0x0e, 0x1e, 0x0c, 0xe3,
+ 0xd7, 0xc0, 0xed, 0xec, 0x20, 0x13, 0x81, 0xaf, 0xf0, 0x0c, 0x00, 0x23,
+ 0xf0, 0xd0, 0x0c, 0x3a,
+ 0x4e, 0x1e, 0x0d, 0xfd, 0x00, 0x2f, 0x0a, 0x1e, 0xce, 0xbd, 0xfe, 0xf8,
+ 0xee, 0xef, 0xcf, 0xcd,
+ 0x0f, 0x0f, 0x9e, 0xec, 0x0e, 0x1d, 0x40, 0x22, 0x00, 0xdc, 0x0c, 0x3c,
+ 0x6d, 0x0d, 0xfd, 0x0d,
+ 0x0b, 0x0c, 0x0e, 0x0e, 0x1f, 0x0c, 0x0e, 0x01, 0x8e, 0xed, 0xe2, 0x07,
+ 0x11, 0xef, 0xdd, 0xe0,
+ 0xf2, 0xa4, 0xf0, 0x00, 0xf0, 0x07, 0x00, 0x1e, 0xfe, 0xff, 0x23, 0x56,
+ 0xf1, 0xd0, 0x0e, 0x70,
+ 0x20, 0xf0, 0xcf, 0x0d, 0xf0, 0xf6, 0x0f, 0x3e, 0x1e, 0x0c, 0xdd, 0x53,
+ 0x45, 0x11, 0x40, 0x2d,
+ 0x10, 0x15, 0x0f, 0xfc, 0x75, 0x73, 0x1d, 0xce, 0x17, 0x12, 0x0d, 0x0e,
+ 0x42, 0x45, 0x0f, 0xee,
+ 0x01, 0x10, 0x30, 0x0f, 0x30, 0x10, 0x0f, 0x00, 0x30, 0x0c, 0x2f, 0x52,
+ 0x24, 0x00, 0x0c, 0x0f,
+ 0x50, 0x21, 0x10, 0x10, 0x00, 0x1e, 0x51, 0x01, 0xc8, 0xfe, 0x77, 0x31,
+ 0xde, 0x0f, 0x20, 0x22,
+ 0xf0, 0x00, 0x10, 0x20, 0x00, 0xf0, 0xf3, 0x0f, 0xde, 0xa1, 0xf2, 0xfe,
+ 0x3e, 0x6f, 0xf8, 0xee,
+ 0x00, 0xe3, 0xfe, 0x0f, 0x53, 0x04, 0xff, 0xee, 0xfe, 0x00, 0xe0, 0xd1,
+ 0x07, 0xe6, 0xad, 0x20,
+ 0x03, 0xb2, 0xf1, 0x2f, 0x60, 0xf0, 0xc3, 0x07, 0x02, 0x2d, 0x00, 0xe3,
+ 0xe7, 0x00, 0x00, 0x60,
+ 0x10, 0x12, 0x06, 0xe0, 0xef, 0x61, 0x33, 0xe0, 0xd0, 0x01, 0xf5, 0x22,
+ 0x2f, 0x30, 0x16, 0x00,
+ 0x30, 0x51, 0xe1, 0x01, 0x73, 0x31, 0x00, 0x21, 0x01, 0x24, 0x13, 0xf0,
+ 0xf2, 0xc4, 0x05, 0x13,
+ 0x11, 0x2f, 0x7e, 0x22, 0x07, 0x12, 0x50, 0x0f, 0x50, 0x20, 0x24, 0x01,
+ 0x2e, 0x71, 0x11, 0x00,
+ 0x1e, 0x02, 0x25, 0xec, 0xfe, 0x10, 0x03, 0x00, 0xd0, 0xf1, 0xcf, 0xe4,
+ 0x37, 0x41, 0xc0, 0xe2,
+ 0x02, 0x31, 0x11, 0xdd, 0x20, 0x72, 0x17, 0xe3, 0x00, 0x20, 0x4d, 0x10,
+ 0x65, 0x01, 0xcf, 0x0f,
+ 0x02, 0xf2, 0xd2, 0xf0, 0x2f, 0x32, 0xc0, 0xd4, 0x27, 0x30, 0x00, 0x41,
+ 0x00, 0x8f, 0x16, 0x20,
+ 0x4c, 0x12, 0x16, 0x00, 0x0f, 0x00, 0x33, 0x0e, 0x0d, 0x30, 0x11, 0xcf,
+ 0xac, 0xff, 0xff, 0xfe,
+ 0x30, 0x2c, 0x0a, 0x50, 0x3e, 0x00, 0xfe, 0x00, 0x1c, 0x4d, 0x70, 0x0e,
+ 0x2d, 0x23, 0x0f, 0x1c,
+ 0x40, 0x2f, 0x18, 0x1f, 0x10, 0xfe, 0xcf, 0xde, 0xff, 0x0d, 0x1b, 0x00,
+ 0xe1, 0xd0, 0xfc, 0x7f,
+ 0x4f, 0x00, 0x00, 0xef, 0x32, 0xad, 0xb8, 0xfe, 0x0f, 0x30, 0xef, 0xaf,
+ 0x0f, 0xfd, 0x1d, 0x31,
+ 0xf2, 0xed, 0x0c, 0x4b, 0x2e, 0x20, 0x00, 0xd8, 0xff, 0x00, 0xef, 0xe0,
+ 0x9e, 0xbe, 0xf2, 0x01,
+ 0x0f, 0xbd, 0xba, 0xfe, 0xef, 0x0f, 0x21, 0x0f, 0xfe, 0xef, 0xdd, 0xfa,
+ 0xdf, 0x01, 0x0f, 0xa8,
+ 0xef, 0x0f, 0xf0, 0x0e, 0x0f, 0xde, 0x00, 0x60, 0x2e, 0x1a, 0x0f, 0x0e,
+ 0x0f, 0xa0, 0xf1, 0x11,
+ 0x40, 0x0d, 0xdc, 0xd0, 0xe2, 0x04, 0x60, 0x2e, 0x20, 0xe6, 0xf2, 0xef,
+ 0xfd, 0x02, 0x47, 0x15,
+ 0xc0, 0xc2, 0xa0, 0xf1, 0x02, 0x14, 0x03, 0xd0, 0x10, 0x32, 0x15, 0x31,
+ 0x0f, 0x0f, 0x01, 0x03,
+ 0xf2, 0x07, 0x12, 0x41, 0x60, 0x22, 0xd3, 0x81, 0xf4, 0xf2, 0xf0, 0xf4,
+ 0x33, 0x43, 0x00, 0xdf,
+ 0x20, 0x12, 0x27, 0x34, 0x72, 0x0f, 0x0e, 0x01, 0x31, 0x11, 0xce, 0xac,
+ 0x02, 0x17, 0x01, 0xfd,
+ 0xce, 0xf0, 0x01, 0x20, 0x34, 0x01, 0x00, 0x00, 0xe0, 0x3e, 0x70, 0x76,
+ 0x12, 0x10, 0x0d, 0x1f,
+ 0x03, 0x13, 0x10, 0x10, 0x35, 0x00, 0xcf, 0xe3, 0xf7, 0xf4, 0x13, 0x40,
+ 0x00, 0xbf, 0xf0, 0x03,
+ 0x27, 0x01, 0x00, 0xf0, 0x21, 0xe3, 0xc3, 0x72, 0x41, 0x30, 0x04, 0xd2,
+ 0xf4, 0xfe, 0x0f, 0x52,
+ 0x02, 0xc9, 0x00, 0x77, 0x00, 0x98, 0x22, 0x22, 0xff, 0xee, 0x22, 0x23,
+ 0x0d, 0xef, 0x10, 0x03,
+ 0x00, 0x00, 0x01, 0x11, 0x22, 0x00, 0xf0, 0x10, 0x13, 0x52, 0x21, 0x20,
+ 0xef, 0xd8, 0x20, 0x56,
+ 0xde, 0xcc, 0x61, 0x11, 0xef, 0xed, 0x01, 0x44, 0x0c, 0x0e, 0x71, 0x00,
+ 0xff, 0xfc, 0xff, 0x11,
+ 0x10, 0xfc, 0xee, 0x0e, 0x10, 0x0e, 0x0a, 0x40, 0x00, 0x0e, 0x73, 0x30,
+ 0xf8, 0x00, 0x20, 0x50,
+ 0xf0, 0xfe, 0xf0, 0xe0, 0xf0, 0xee, 0xfc, 0x2f, 0x1f, 0xad, 0xd0, 0xf0,
+ 0x0e, 0x7b, 0x1d, 0x0e,
+ 0x0d, 0xe0, 0xf8, 0xed, 0x20, 0x01, 0xaf, 0xfd, 0x10, 0xfd, 0xbb, 0xff,
+ 0x01, 0x02, 0xec, 0xdc,
+ 0x00, 0xf2, 0xce, 0xdc, 0xef, 0x00, 0xc3, 0xcd, 0xcd, 0xf0, 0x0d, 0x0e,
+ 0xf0, 0xe2, 0x43, 0x08,
+ 0xff, 0x11, 0xe0, 0x8c, 0xff, 0x14, 0x21, 0xbe, 0xdf, 0xe1, 0xf0, 0xed,
+ 0xfd, 0xf1, 0xf4, 0xb0,
+ 0xe9, 0x0f, 0xff, 0x00, 0x0f, 0xff, 0xee, 0xae, 0xdf, 0xf7, 0x02, 0x0d,
+ 0xe0, 0xf0, 0x90, 0xda,
+ 0x04, 0x13, 0xba, 0xf0, 0x41, 0x32, 0xdc, 0xef, 0x40, 0x21, 0x00, 0xfe,
+ 0x01, 0x10, 0x1d, 0x0c,
+ 0xfd, 0x1f, 0x2f, 0xed, 0xce, 0xa2, 0xbc, 0xe8, 0x0f, 0x0f, 0xcf, 0xef,
+ 0x02, 0x12, 0xbb, 0xff,
+ 0xf0, 0xf0, 0xf0, 0x00, 0x50, 0x2f, 0xfd, 0xbc, 0xee, 0x00, 0x03, 0x0c,
+ 0xf0, 0x0f, 0x00, 0xf2,
+ 0xbd, 0x07, 0x01, 0xec, 0xe0, 0xf4, 0xb2, 0xe0, 0xf0, 0x00, 0x05, 0xd1,
+ 0xd3, 0xd2, 0x01, 0x13,
+ 0x64, 0x12, 0x02, 0xb3, 0xf4, 0x06, 0xf1, 0x01, 0xd0, 0xc0, 0xe2, 0x05,
+ 0xc0, 0x00, 0x20, 0x01,
+ 0x80, 0xed, 0x03, 0x17, 0x1e, 0x4d, 0x41, 0x03, 0x0e, 0x0e, 0x34, 0x54,
+ 0x21, 0x10, 0x4f, 0x10,
+ 0x24, 0x22, 0x42, 0x30, 0xc9, 0x02, 0x36, 0x20, 0x0d, 0x41, 0x73, 0x20,
+ 0x0d, 0xe0, 0x25, 0x51,
+ 0x1f, 0x2f, 0x11, 0x01, 0xf1, 0x00, 0x00, 0x01, 0x20, 0x12, 0x00, 0x1e,
+ 0x0a, 0x70, 0x44, 0x10,
+ 0x20, 0x40, 0x30, 0x2f, 0x30, 0x77, 0x13, 0x1e, 0x00, 0x05, 0x03, 0xf2,
+ 0xf0, 0x12, 0x32, 0xf4,
+ 0xa2, 0x07, 0x01, 0x30, 0x01, 0xe1, 0x04, 0xf2, 0x12, 0x72, 0x2f, 0x1f,
+ 0x03, 0xe5, 0xf4, 0xf0,
+ 0xf0, 0x30, 0x34, 0x23, 0x50, 0x3f, 0x20, 0x00, 0x11, 0x35, 0x22, 0x33,
+ 0x10, 0x3c, 0x50, 0x41,
+ 0x74, 0x30, 0x32, 0x33, 0x04, 0x71, 0x30, 0x3c, 0x1f, 0x35, 0x25, 0x30,
+ 0x10, 0x02, 0x14, 0x00,
+ 0x32, 0x42, 0xf0, 0xd0, 0x00, 0x33, 0x40, 0x1d, 0x73, 0x67, 0x0c, 0x1d,
+ 0x30, 0x41, 0x13, 0xfd,
+ 0x0e, 0x20, 0x2c, 0xed, 0xf3, 0x06, 0xf3, 0xdf, 0xcf, 0x11, 0x75, 0x00,
+ 0x00, 0x44, 0x13, 0x10,
+ 0x01, 0x03, 0x00, 0x31, 0x77, 0x03, 0x0e, 0x1f, 0x32, 0xf1, 0x00, 0xfa,
+ 0xe1, 0xe2, 0xc0, 0xee,
+ 0xef, 0x9f, 0xd2, 0xe7, 0x00, 0x5c, 0x0e, 0xd2, 0x04, 0x00, 0x3c, 0x30,
+ 0x1f, 0x0c, 0x3e, 0xf0,
+ 0x06, 0x0f, 0x6f, 0x2f, 0xd1, 0x81, 0xe0, 0x02, 0x01, 0xd9, 0xbd, 0x67,
+ 0xd4, 0x88, 0x11, 0x22,
+ 0x0f, 0xee, 0x10, 0x33, 0x00, 0xed, 0x01, 0x11, 0x00, 0x10, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x01, 0x52, 0x0c, 0x0e, 0x1e, 0x20, 0xfc, 0xdf, 0x12,
+ 0x1d, 0x71, 0x0c, 0x0d,
+ 0x77, 0x01, 0xca, 0x13, 0x22, 0x00, 0xfd, 0x21, 0x32, 0xdd, 0x0f, 0x14,
+ 0x35, 0xd0, 0xbd, 0x20,
+ 0x71, 0x30, 0xff, 0xef, 0x02, 0x37, 0x20, 0xef, 0xe0, 0x00, 0x00, 0x0f,
+ 0x24, 0xa0, 0xbf, 0xff,
+ 0xee, 0xf3, 0xcf, 0xed, 0x05, 0x0e, 0x1d, 0x41, 0x07, 0xe0, 0xaa, 0xf0,
+ 0x11, 0x31, 0x0f, 0xb0,
+ 0x00, 0xf1, 0xff, 0xf0, 0xe0, 0x00, 0xdb, 0xf0, 0xf1, 0xe3, 0x0c, 0x1b,
+ 0x7f, 0x10, 0xe0, 0xbc,
+ 0xf0, 0xf0, 0xf0, 0x0e, 0xdc, 0x01, 0xdf, 0xac, 0x00, 0xf0, 0x01, 0x1f,
+ 0x00, 0xfb, 0xcc, 0xf0,
+ 0x02, 0x0d, 0x8c, 0xc0, 0xef, 0x0d, 0xfe, 0xea, 0xdd, 0x10, 0x20, 0xeb,
+ 0xff, 0x2e, 0x4d, 0x1d,
+ 0x20, 0x22, 0xde, 0xc0, 0xff, 0x2e, 0x45, 0x8d, 0xdf, 0xe7, 0xe2, 0xd0,
+ 0x12, 0x0e, 0xe0, 0xa1,
+ 0xf3, 0xe5, 0x01, 0x34, 0x10, 0xb0, 0xe0, 0xd2, 0xe3, 0xf1, 0xd0, 0xd0,
+ 0xb3, 0xb7, 0xe1, 0xc0,
+ 0xf0, 0xf2, 0x06, 0x32, 0xb3, 0xe0, 0xd0, 0x02, 0x47, 0x11, 0x0d, 0xfd,
+ 0x0f, 0x03, 0xd0, 0x9b,
+ 0x0d, 0x2e, 0x0e, 0xff, 0x0d, 0xea, 0xde, 0xce, 0xe1, 0x02, 0x00, 0xfc,
+ 0xed, 0xfd, 0xec, 0xce,
+ 0xad, 0xf0, 0xda, 0x0d, 0x1f, 0x2f, 0x0d, 0x1b, 0x70, 0x2d, 0x0e, 0x0b,
+ 0x2f, 0x1f, 0x0d, 0xfd,
+ 0xfb, 0xfc, 0xef, 0xdf, 0xe0, 0x80, 0xba, 0x00, 0x30, 0x1e, 0x0f, 0xe0,
+ 0xbf, 0x00, 0xe0, 0xe0,
+ 0x0b, 0x00, 0x00, 0xc1, 0xd0, 0xf0, 0xf3, 0xef, 0xe1, 0x02, 0xd0, 0x8b,
+ 0x14, 0x13, 0x88, 0x0f,
+ 0x00, 0xe2, 0x00, 0xfe, 0x00, 0x00, 0xf0, 0x21, 0x30, 0x3f, 0x52, 0xfe,
+ 0xdc, 0x03, 0x16, 0x4f,
+ 0x3e, 0x20, 0x01, 0xee, 0x00, 0x04, 0xc2, 0x03, 0x24, 0x00, 0x5f, 0x43,
+ 0x00, 0x12, 0x45, 0x42,
+ 0x62, 0x2f, 0x0d, 0x01, 0x17, 0x15, 0x5f, 0x4f, 0x0c, 0xfe, 0x01, 0x25,
+ 0x30, 0x30, 0x3e, 0x5d,
+ 0x40, 0x0e, 0x1e, 0x4d, 0x61, 0x21, 0x0b, 0xfd, 0x0f, 0x21, 0x24, 0x10,
+ 0x3c, 0x1e, 0x00, 0xe4,
+ 0xef, 0xfb, 0x22, 0x40, 0x2f, 0x0d, 0xae, 0xee, 0x0f, 0x00, 0xfe, 0x00,
+ 0x7e, 0x28, 0x0e, 0x2e,
+ 0x1d, 0x20, 0x02, 0xac, 0xfb, 0xff, 0x01, 0x07, 0x12, 0x0e, 0xce, 0xe2,
+ 0xa4, 0x04, 0x00, 0x0e,
+ 0x0f, 0x00, 0xe1, 0xd2, 0x11, 0x1c, 0x31, 0x47, 0x23, 0xd2, 0x8f, 0x02,
+ 0x45, 0xf1, 0xe4, 0xf3,
+ 0xc3, 0xc0, 0xe2, 0xe3, 0x00, 0x13, 0x03, 0xf3, 0x17, 0x41, 0x12, 0x22,
+ 0xf1, 0x00, 0x44, 0x72,
+ 0x23, 0x01, 0x03, 0x05, 0x02, 0xd2, 0xc3, 0x12, 0x73, 0x35, 0x27, 0x14,
+ 0xf1, 0xc1, 0x00, 0x54,
+ 0x43, 0x21, 0x11, 0x21, 0x31, 0x20, 0x23, 0x02, 0x10, 0x20, 0x50, 0x35,
+ 0x2f, 0x08, 0x50, 0x75,
+ 0x0f, 0xcd, 0x35, 0x1f, 0x0f, 0xff, 0x10, 0x53, 0xfe, 0xee, 0x10, 0x02,
+ 0x00, 0x30, 0x32, 0x2f,
+ 0x0f, 0x03, 0x56, 0x10, 0x03, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xe1, 0x8f,
+ 0xe7, 0x07, 0xd0, 0x00,
+ 0x0f, 0x20, 0xd1, 0xe0, 0x56, 0x00, 0x02, 0x00, 0xf0, 0x00, 0x03, 0x00,
+ 0x50, 0x55, 0x00, 0xe1,
+ 0xc0, 0xf2, 0xf3, 0xe0, 0xf0, 0x1e, 0x33, 0x02, 0xbd, 0x1f, 0x10, 0x00,
+ 0x30, 0x0d, 0xfd, 0x1f,
+ 0x7d, 0x77, 0x05, 0x09, 0xef, 0x0f, 0x00, 0x34, 0x10, 0x1e, 0x4d, 0x20,
+ 0x0b, 0x2f, 0x10, 0x1f,
+ 0x70, 0x4e, 0x2c, 0x1d, 0x0d, 0x00, 0x30, 0x5f, 0x18, 0x0f, 0x0e, 0xe0,
+ 0xd0, 0xcd, 0x0f, 0x0f,
+ 0x1c, 0x0f, 0x30, 0x1e, 0x3d, 0x2b, 0xde, 0x10, 0x9d, 0x1f, 0x71, 0x1f,
+ 0x10, 0xec, 0xdb, 0xd0,
+ 0xfe, 0xe1, 0x43, 0x44, 0x1f, 0x2a, 0x1f, 0x00, 0xe1, 0xe0, 0x1e, 0x7d,
+ 0x1f, 0xfe, 0xed, 0xbb,
+ 0x00, 0xf4, 0xb0, 0xdf, 0xec, 0xfe, 0x00, 0xe1, 0xe0, 0xbd, 0x05, 0x05,
+ 0x2d, 0x00, 0x22, 0x00,
+ 0x80, 0xe6, 0x00, 0xf1, 0x36, 0xe9, 0xc5, 0xef, 0xc3, 0xbc, 0xfb, 0x1f,
+ 0x3d, 0x8d, 0xed, 0xf2,
+ 0xed, 0xfb, 0xfc, 0x0e, 0xd6, 0xd0, 0xdb, 0x1f, 0x2d, 0x00, 0x9f, 0xf0,
+ 0xf2, 0xfe, 0x1b, 0x4d,
+ 0x4f, 0x21, 0x02, 0x0d, 0x1f, 0x00, 0xfe, 0x5c, 0x3e, 0x25, 0x35, 0x0f,
+ 0xce, 0xaf, 0xe5, 0x03,
+ 0x21, 0x0f, 0xf1, 0xd4, 0x11, 0x71, 0x2e, 0x0c, 0x04, 0xf3, 0x06, 0x11,
+ 0x20, 0x31, 0xf2, 0xb1,
+ 0x04, 0x36, 0x01, 0x31, 0x23, 0x31, 0x71, 0x52, 0x12, 0x03, 0x03, 0x03,
+ 0x13, 0x0a, 0x01, 0x11,
+ 0xf1, 0xb2, 0x00, 0x05, 0xdf, 0xf4, 0xd2, 0x9f, 0x02, 0x13, 0xfe, 0x01,
+ 0x05, 0xaf, 0x00, 0x15,
+ 0x3f, 0xdd, 0xd0, 0x03, 0x0f, 0x2f, 0x67, 0x10, 0x0f, 0xdc, 0xc0, 0x04,
+ 0x00, 0x50, 0x0e, 0x11,
+ 0x02, 0x04, 0x34, 0xcd, 0xcd, 0x37, 0x37, 0xa0, 0xe0, 0xf0, 0xf0, 0x01,
+ 0x01, 0xc1, 0xd1, 0x02,
+ 0x04, 0x0f, 0x20, 0x20, 0x61, 0x41, 0x10, 0x11, 0x02, 0x11, 0xfd, 0xec,
+ 0x20, 0x60, 0x14, 0xdc,
+ 0xea, 0x51, 0x41, 0x20, 0x10, 0x1f, 0x2f, 0x20, 0x6e, 0x12, 0x1e, 0x1f,
+ 0x36, 0x00, 0xee, 0x0f,
+ 0x41, 0x24, 0x00, 0x51, 0x2e, 0x10, 0x17, 0x01, 0x0f, 0x0f, 0x73, 0x55,
+ 0xf0, 0xd0, 0xf1, 0xf2,
+ 0xf6, 0xf0, 0xed, 0x00, 0x54, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xf8, 0xff,
+ 0x40, 0x41, 0x00, 0xec,
+ 0xef, 0x2e, 0x3f, 0x00, 0xa1, 0xe2, 0xd0, 0x00, 0x3d, 0x09, 0xe0, 0x90,
+ 0xd2, 0xe0, 0xdf, 0xac,
+ 0xee, 0xfd, 0x20, 0x3f, 0xfc, 0xbb, 0x0e, 0x2f, 0x0d, 0x1c, 0x2d, 0x3c,
+ 0x4e, 0x1d, 0x0d, 0x0d,
+ 0x10, 0x2c, 0xe9, 0xaf, 0x0e, 0xff, 0xbe, 0xde, 0xee, 0xee, 0xdd, 0xee,
+ 0x0d, 0x0a, 0x3f, 0x4f,
+ 0xed, 0x1e, 0x0c, 0xfd, 0xee, 0x6f, 0x5e, 0x01, 0xf1, 0xca, 0xee, 0xdf,
+ 0xaf, 0xe2, 0xc1, 0xfd,
+ 0xed, 0xef, 0xb0, 0xf6, 0xf1, 0x0c, 0x1e, 0x50, 0x00, 0x00, 0xe1, 0xea,
+ 0xfd, 0xff, 0xad, 0xdc,
+ 0xbf, 0xe2, 0xd5, 0xce, 0xdf, 0xe0, 0xe4, 0xe4, 0xe3, 0x04, 0x03, 0xd0,
+ 0x8b, 0x00, 0x02, 0x00,
+ 0x0f, 0x10, 0x12, 0x00, 0x0c, 0x0d, 0x2f, 0x13, 0xc4, 0xfe, 0x0c, 0xde,
+ 0xce, 0xbf, 0xf1, 0xdf,
+ 0xb8, 0xdf, 0xbc, 0xed, 0xfc, 0x0e, 0x2e, 0x2d, 0x0b, 0x0e, 0xfe, 0x10,
+ 0x21, 0x0e, 0x08, 0xff,
+ 0xb0, 0xde, 0xcf, 0xde, 0xff, 0x2f, 0x2f, 0x8b, 0xce, 0xfd, 0x0d, 0x0c,
+ 0x0e, 0xd0, 0xe1, 0x0f,
+ 0x3c, 0x1f, 0x20, 0x20, 0xcf, 0x02, 0x11, 0x43, 0x36, 0xe0, 0xd0, 0x51,
+ 0x62, 0xff, 0xc3, 0xe5,
+ 0xf0, 0xe1, 0xa2, 0xd1, 0xff, 0x00, 0xe5, 0xf6, 0xf3, 0x02, 0xd4, 0xc1,
+ 0xe1, 0xf1, 0x22, 0x33,
+ 0x25, 0x01, 0x90, 0xef, 0xe0, 0xf0, 0x07, 0xe1, 0xc1, 0x20, 0x60, 0x10,
+ 0x15, 0x32, 0x01, 0x11,
+ 0x02, 0x13, 0x14, 0x03, 0xd0, 0x2d, 0x21, 0xb3, 0xb7, 0xf5, 0x20, 0x7f,
+ 0x51, 0x06, 0x01, 0x11,
+ 0x00, 0x3e, 0x30, 0x20, 0xf3, 0x21, 0x50, 0x3f, 0x2c, 0x2c, 0x70, 0x34,
+ 0x14, 0x13, 0x00, 0x2d,
+ 0x4f, 0x4f, 0x46, 0x34, 0x12, 0x40, 0x21, 0x32, 0x20, 0x11, 0x24, 0x53,
+ 0x30, 0x2d, 0x1f, 0x12,
+ 0x17, 0x21, 0x31, 0x10, 0x00, 0xd2, 0xd2, 0xf1, 0x02, 0x47, 0xe7, 0x80,
+ 0xf1, 0x00, 0x02, 0x40,
+ 0x21, 0x02, 0xe0, 0xe0, 0x1d, 0x21, 0x33, 0xd3, 0xe3, 0x73, 0x42, 0x23,
+ 0xf3, 0x07, 0x23, 0x35,
+ 0x50, 0x22, 0x03, 0x22, 0x73, 0x45, 0x00, 0x10, 0x00, 0x03, 0x34, 0x60,
+ 0x34, 0x35, 0x11, 0x10,
+ 0x11, 0x22, 0x22, 0x06, 0xf1, 0xc0, 0x00, 0x0d, 0x0e, 0x53, 0x15, 0x2f,
+ 0x00, 0x00, 0xf2, 0x3f,
+ 0x7d, 0x71, 0x41, 0x0f, 0x01, 0x06, 0x0f, 0x1f, 0x41, 0x12, 0x2f, 0x1f,
+ 0x0c, 0x0b, 0x2f, 0x2f,
+ 0x41, 0x02, 0x0d, 0x0b, 0x20, 0x12, 0xfe, 0xbd, 0x0d, 0x10, 0x66, 0x12,
+ 0x20, 0x0d, 0xf8, 0x10,
+ 0x70, 0x33, 0x0f, 0x0c, 0xf0, 0x1f, 0x1e, 0x2e, 0xf0, 0xe4, 0xf0, 0x0f,
+ 0xd0, 0xd0, 0xa1, 0xef,
+ 0xef, 0xf0, 0xc0, 0xba, 0xec, 0x0f, 0xf1, 0xd3, 0x80, 0xea, 0xf0, 0x0f,
+ 0x30, 0x14, 0xf4, 0xd4,
+ 0xc2, 0xe0, 0xb0, 0xf1, 0xd4, 0xe3, 0xd1, 0x03, 0xf0, 0x0f, 0xed, 0xcc,
+ 0xda, 0x1f, 0x70, 0x21,
+ 0x2e, 0x3d, 0x00, 0x10, 0x3f, 0x3a, 0x1e, 0x2e, 0x3e, 0x2d, 0x3c, 0x10,
+ 0xf0, 0xaa, 0x0f, 0x40,
+ 0x03, 0x1f, 0x4f, 0x74, 0x14, 0x32, 0x60, 0x1e, 0x0e, 0x01, 0x17, 0x33,
+ 0x20, 0x60, 0x11, 0x22,
+ 0x11, 0x27, 0x43, 0x10, 0x20, 0x2f, 0x22, 0x00, 0xde, 0x0c, 0x0e, 0xf1,
+ 0xf2, 0xf6, 0x22, 0x1d,
+ 0x0b, 0x0f, 0x70, 0x41, 0xd5, 0xc1, 0x01, 0x3f, 0x30, 0x03, 0xc2, 0xd0,
+ 0xf0, 0xd0, 0xd6, 0x84,
+ 0xc3, 0xe1, 0xd0, 0xb0, 0xf2, 0xf1, 0x0f, 0xdc, 0xf0, 0xdc, 0xea, 0xee,
+ 0x0e, 0x2e, 0x3d, 0x2d,
+ 0xd0, 0xa5, 0xe0, 0xfd, 0xf0, 0xc1, 0xb3, 0xc1, 0xa0, 0xf0, 0xed, 0x0c,
+ 0x0e, 0xc0, 0xf2, 0xed,
+ 0xe8, 0xe8, 0xff, 0x1e, 0x40, 0x1f, 0xfe, 0xbb, 0xff, 0xff, 0xf0, 0x00,
+ 0xee, 0xec, 0xc0, 0xe0,
+ 0xce, 0xdb, 0xe0, 0xe3, 0xf0, 0x0c, 0x0e, 0x1c, 0xff, 0xee, 0xe0, 0xa0,
+ 0xc0, 0xed, 0x0c, 0x30,
+ 0x41, 0x30, 0xd2, 0xb2, 0xf1, 0xe0, 0x10, 0x13, 0xa4, 0xd5, 0xe4, 0xe4,
+ 0xb2, 0xe3, 0xd1, 0xd1,
+ 0xd6, 0xc2, 0x01, 0x2f, 0x32, 0x02, 0xf0, 0xd1, 0xc0, 0xb9, 0x1e, 0x1f,
+ 0xce, 0xb0, 0xec, 0xf9,
+ 0xfd, 0xdf, 0x1e, 0xe0, 0x80, 0xf0, 0xf0, 0xdb, 0xde, 0xcc, 0x00, 0xfd,
+ 0xbc, 0xed, 0x0d, 0x10,
+ 0x0e, 0xdb, 0xe0, 0xdd, 0x0d, 0x2d, 0x0c, 0xcd, 0x0d, 0x0b, 0x2f, 0x6b,
+ 0x1d, 0x2d, 0xee, 0xce,
+ 0xdb, 0x2e, 0x4e, 0xfc, 0xce, 0xf1, 0xf3, 0x02, 0x60, 0x0b, 0x0f, 0xe0,
+ 0xe1, 0xd5, 0xb0, 0xff,
+ 0x0f, 0x10, 0x30, 0x01, 0x04, 0x01, 0xef, 0x5e, 0x60, 0x00, 0x1b, 0x00,
+ 0xc0, 0x04, 0x00, 0x02,
+ 0xff, 0xc0, 0xf1, 0xf3, 0x5f, 0x29, 0x10, 0x20, 0x10, 0x10, 0x20, 0x73,
+ 0x30, 0x18, 0x3e, 0x40,
+ 0x04, 0xe0, 0x03, 0x34, 0x20, 0xaf, 0xd0, 0x16, 0x01, 0xd1, 0xb0, 0xe1,
+ 0xf2, 0xb0, 0xe0, 0x0f,
+ 0x70, 0x21, 0x0d, 0x0b, 0xee, 0x0d, 0x0e, 0x01, 0x22, 0x2d, 0x4b, 0x2f,
+ 0x10, 0x0e, 0x02, 0x64,
+ 0x1b, 0x1d, 0x31, 0x20, 0x1d, 0x28, 0x3f, 0x50, 0x10, 0x12, 0xfc, 0x0c,
+ 0x3e, 0x3e, 0x2e, 0x00,
+ 0x01, 0x10, 0x28, 0x0d, 0x4e, 0x00, 0xff, 0x0e, 0xde, 0x8e, 0xcd, 0xea,
+ 0xfd, 0xc0, 0xd1, 0x01,
+ 0xfe, 0xcc, 0xbf, 0x1f, 0x73, 0x22, 0x20, 0x0d, 0x0d, 0x43, 0x20, 0x08,
+ 0x1c, 0x20, 0x00, 0xee,
+ 0xff, 0x01, 0x07, 0xd3, 0xb0, 0xe1, 0x06, 0x23, 0xf0, 0xc3, 0x12, 0x02,
+ 0xd5, 0x82, 0xe1, 0xf0,
+ 0x02, 0x02, 0x05, 0x01, 0x21, 0x61, 0x00, 0xf0, 0xc6, 0xe3, 0x03, 0xf0,
+ 0xde, 0x01, 0x03, 0xc2,
+ 0xf3, 0xd4, 0xc1, 0xd5, 0xf2, 0x74, 0x22, 0x00, 0xc1, 0x05, 0x22, 0x72,
+ 0x44, 0x24, 0x11, 0x21,
+ 0x23, 0x13, 0x1e, 0x4d, 0x11, 0x16, 0x01, 0x31, 0x40, 0x10, 0x2f, 0x2e,
+ 0x22, 0xf3, 0xde, 0x4e,
+ 0x77, 0x42, 0x00, 0x0f, 0x70, 0x13, 0x33, 0x16, 0x22, 0x11, 0x31, 0x51,
+ 0x10, 0x11, 0x01, 0x12,
+ 0x04, 0xf5, 0x01, 0x32, 0x20, 0x0f, 0x23, 0x27, 0xe7, 0x00, 0x01, 0x73,
+ 0x11, 0xe2, 0xe0, 0x01,
+ 0x33, 0x03, 0xd3, 0xe4, 0xf5, 0x12, 0x72, 0x22, 0xf5, 0xb3, 0xe3, 0x02,
+ 0xd3, 0xc5, 0xf1, 0x00,
+ 0x01, 0xd2, 0xb2, 0x02, 0x00, 0xef, 0xb1, 0x06, 0x20, 0x0e, 0xcf, 0x14,
+ 0x42, 0x1d, 0x1e, 0x10,
+ 0x05, 0xd1, 0xcf, 0x0e, 0x2d, 0xae, 0xf1, 0x13, 0x6e, 0x2b, 0x3d, 0x0d,
+ 0x0b, 0x0c, 0x1f, 0x4c,
+ 0x5e, 0x3f, 0x3d, 0x08, 0xff, 0x0f, 0x40, 0x2f, 0xfb, 0xef, 0xdf, 0xfd,
+ 0x0d, 0x0f, 0x0d, 0x8e,
+ 0xd9, 0xff, 0x0d, 0x0f, 0xae, 0x00, 0x3f, 0x4c, 0x1f, 0xff, 0xf0, 0x00,
+ 0x1d, 0x7f, 0x4e, 0x2f,
+ 0x0e, 0xff, 0xfd, 0xfa, 0x0e, 0xfc, 0xee, 0x0c, 0x30, 0x41, 0x0f, 0xfd,
+ 0x00, 0xa1, 0xf4, 0x02,
+ 0x0f, 0xdb, 0xdf, 0xdf, 0xb0, 0xbe, 0xc9, 0xde, 0xf0, 0xe3, 0xc5, 0xbf,
+ 0xee, 0xef, 0xff, 0x00,
+ 0x02, 0xf0, 0xcd, 0xf1, 0xc2, 0xca, 0xdc, 0xfe, 0xef, 0x0d, 0xe0, 0xf1,
+ 0xe5, 0xd0, 0xfd, 0x50,
+ 0x50, 0x00, 0xf0, 0xe2, 0x1f, 0x28, 0x2a, 0x50, 0x20, 0x20, 0x2f, 0x2e,
+ 0x1e, 0x4f, 0x1e, 0x40,
+ 0xee, 0xbe, 0xf0, 0xf0, 0xf1, 0xcf, 0xd1, 0xd7, 0x04, 0xff, 0x10, 0x63,
+ 0x25, 0x53, 0x32, 0x54,
+ 0x10, 0x01, 0x23, 0x47, 0x03, 0x1f, 0x00, 0x32, 0x32, 0x70, 0x22, 0x25,
+ 0xf2, 0x02, 0x02, 0x06,
+ 0xf1, 0xe1, 0x00, 0x11, 0x3f, 0xf0, 0x22, 0x26, 0x01, 0x01, 0x13, 0x21,
+ 0xf3, 0xe2, 0x76, 0x42,
+ 0xa3, 0xc2, 0xe1, 0xf4, 0x01, 0xe2, 0xf1, 0xe2, 0xae, 0xdc, 0xd0, 0xf0,
+ 0x11, 0x00, 0x2f, 0x3f,
+ 0x15, 0x15, 0xf3, 0x02, 0x22, 0x71, 0x33, 0x05, 0xf3, 0xe1, 0xa1, 0xd6,
+ 0xc3, 0xd5, 0xe0, 0xc0,
+ 0xf0, 0x03, 0x72, 0x13, 0xf0, 0xe0, 0x0e, 0x21, 0x26, 0x00, 0xf0, 0x2f,
+ 0x60, 0x20, 0xfe, 0xdc,
+ 0x0e, 0xff, 0x0d, 0xfb, 0x10, 0x10, 0xcd, 0xbc, 0x0d, 0x0d, 0x4d, 0x4c,
+ 0x3e, 0x59, 0x2f, 0x21,
+ 0x21, 0x40, 0x20, 0x63, 0x10, 0x2c, 0x0e, 0x1f, 0x11, 0x01, 0x0b, 0x2f,
+ 0x44, 0x07, 0xe1, 0xd1,
+ 0xd0, 0xd0, 0xbf, 0xf0, 0x03, 0xc5, 0xf0, 0x2d, 0x20, 0x1e, 0x2d, 0x2b,
+ 0x10, 0xa0, 0xf0, 0x10,
+ 0x7d, 0x00, 0xe1, 0xe6, 0x01, 0xff, 0xed, 0xd0, 0xe0, 0xa0, 0xeb, 0xfb,
+ 0x0f, 0xef, 0xaf, 0xfe,
+ 0x00, 0x1f, 0x1c, 0xfe, 0x0e, 0x0c, 0xfc, 0xcd, 0xf0, 0xf0, 0x1f, 0x18,
+ 0xfe, 0xdc, 0x0f, 0x4e,
+ 0x2e, 0x0d, 0x0d, 0x1d, 0xbc, 0xcc, 0xfe, 0x1d, 0x2d, 0xab, 0x8d, 0xfd,
+ 0xfd, 0x1c, 0x2e, 0x2e,
+ 0x5f, 0x1e, 0x0b, 0xef, 0xef, 0x0f, 0x2f, 0x20, 0x3f, 0x0c, 0xdf, 0x00,
+ 0x1f, 0x20, 0x00, 0xfc,
+ 0x30, 0x61, 0x00, 0xed, 0x1e, 0x3c, 0x6c, 0x1f, 0x0d, 0xfe, 0x0f, 0xfb,
+ 0x0f, 0x8d, 0xd0, 0x05,
+ 0x12, 0xc3, 0x82, 0xe5, 0x06, 0xf6, 0xe2, 0xc1, 0xe2, 0xe0, 0xe0, 0xd0,
+ 0xe4, 0xe4, 0xae, 0xef,
+ 0x01, 0xe2, 0xe0, 0xd1, 0xf6, 0xb1, 0x00, 0x00, 0xc0, 0xce, 0xdd, 0xd0,
+ 0xff, 0xce, 0xfd, 0x0b,
+ 0x0f, 0xee, 0xdc, 0x09, 0x2e, 0x3f, 0x4f, 0x2e, 0xe0, 0x90, 0xea, 0xfe,
+ 0x1f, 0x3e, 0xfe, 0x8a,
+ 0xfd, 0xff, 0xfd, 0xdb, 0xec, 0xff, 0x0e, 0xed, 0xc0, 0xec, 0xcd, 0xfc,
+ 0xef, 0xed, 0xbd, 0xdd,
+ 0xd0, 0xf2, 0x00, 0xbd, 0xde, 0xed, 0xcd, 0x09, 0x10, 0x30, 0xdf, 0xdf,
+ 0x40, 0x70, 0x3e, 0x0c,
+ 0xd0, 0x00, 0x21, 0x00, 0xfe, 0xb4, 0xd4, 0xd0, 0xde, 0x07, 0xc4, 0xb1,
+ 0xf1, 0xd0, 0xf1, 0x02,
+ 0x16, 0x31, 0x00, 0xb1, 0x02, 0x35, 0x02, 0x01, 0x02, 0x23, 0x01, 0x03,
+ 0x44, 0x01, 0xc2, 0xff,
+ 0x00, 0x65, 0x05, 0xe0, 0xf0, 0xd0, 0xf3, 0xe2, 0xf4, 0xf4, 0xc2, 0xe2,
+ 0x02, 0xd7, 0xb1, 0x11,
+ 0x70, 0x5d, 0x10, 0x44, 0x40, 0x1f, 0x2f, 0x20, 0x34, 0x31, 0x10, 0x1c,
+ 0x20, 0x51, 0x31, 0xe1,
+ 0xde, 0x22, 0x77, 0x60, 0x0e, 0x20, 0x02, 0x40, 0x13, 0x26, 0x20, 0x30,
+ 0x4f, 0x3c, 0x51, 0x27,
+ 0x22, 0x11, 0x10, 0x20, 0x10, 0x15, 0x12, 0x10, 0x04, 0x03, 0xe1, 0xb0,
+ 0x01, 0x23, 0x43, 0x31,
+ 0x74, 0x24, 0x10, 0x31, 0x10, 0x12, 0x06, 0x06, 0x01, 0x01, 0x21, 0x32,
+ 0x03, 0x05, 0xc2, 0x03,
+ 0xe2, 0xd3, 0xe2, 0x05, 0x73, 0x72, 0x30, 0xf3, 0xf3, 0x23, 0x50, 0x12,
+ 0x35, 0x05, 0x11, 0x01,
+ 0x11, 0x03, 0xe5, 0xe1, 0x01, 0x01, 0xe1, 0xa1, 0xe2, 0xe1, 0x05, 0x62,
+ 0x02, 0x10, 0x03, 0x00,
+ 0x40, 0x50, 0x50, 0x12, 0x22, 0x33, 0x05, 0x3f, 0x2f, 0x3f, 0x2e, 0x12,
+ 0x1f, 0x0b, 0xfc, 0xdc,
+ 0xee, 0x0c, 0x1b, 0x1c, 0xde, 0xee, 0x0e, 0x4e, 0x6f, 0xfd, 0xcb, 0x20,
+ 0x7f, 0x7f, 0x2e, 0x0d,
+ 0x0c, 0x2d, 0x2f, 0x3d, 0x09, 0x1c, 0x1f, 0x00, 0xc0, 0x11, 0x2e, 0x1b,
+ 0x0d, 0x2e, 0x70, 0x2e,
+ 0x0d, 0xf0, 0xff, 0x1e, 0x3b, 0x30, 0x13, 0x02, 0xf2, 0xa0, 0xed, 0xbf,
+ 0xd2, 0xf7, 0xe7, 0xe0,
+ 0x00, 0xe3, 0x80, 0xd2, 0xe1, 0xf1, 0x01, 0x22, 0x12, 0xd0, 0xa1, 0xf2,
+ 0xf3, 0xd5, 0xd3, 0xf3,
+ 0x0e, 0x0f, 0x1c, 0xee, 0xce, 0x12, 0x73, 0x2a, 0x2c, 0x00, 0x00, 0x4d,
+ 0x0b, 0xed, 0xef, 0xdd,
+ 0x0c, 0x51, 0x2f, 0x0c, 0x00, 0x5f, 0x51, 0x0e, 0x1d, 0x01, 0x25, 0x00,
+ 0x2f, 0x34, 0x14, 0x01,
+ 0x01, 0x15, 0x51, 0x3f, 0x20, 0x70, 0x33, 0x40, 0x12, 0x1c, 0x09, 0x00,
+ 0x41, 0x16, 0x10, 0x61,
+ 0x20, 0x0f, 0x10, 0x00, 0x0f, 0x41, 0x14, 0x15, 0x02, 0xd1, 0x20, 0x50,
+ 0x25, 0x03, 0xe1, 0x01,
+ 0x04, 0xe1, 0xa0, 0xd1, 0x05, 0xe1, 0xd1, 0xc0, 0xe0, 0xc1, 0xd0, 0xe0,
+ 0xe4, 0xd1, 0x91, 0xe4,
+ 0xf3, 0xf3, 0xc3, 0xc0, 0xed, 0xd5, 0xf4, 0xde, 0xb9, 0xd0, 0x00, 0xf3,
+ 0xd0, 0xcb, 0xdf, 0xb0,
+ 0xef, 0xed, 0xcf, 0xdf, 0xef, 0xe2, 0xf0, 0xf9, 0x0f, 0x02, 0xe4, 0x01,
+ 0x00, 0xec, 0xfa, 0xdf,
+ 0xce, 0xdf, 0xf2, 0xc0, 0x98, 0xed, 0xee, 0xed, 0xff, 0xfd, 0x8d, 0xde,
+ 0xbd, 0x0d, 0x00, 0xf0,
+ 0x1e, 0x2d, 0x3a, 0xfe, 0xbb, 0xe0, 0xf0, 0xff, 0xfb, 0x00, 0x30, 0x01,
+ 0xef, 0xe0, 0xef, 0xf2,
+ 0x12, 0x44, 0x11, 0x00, 0xcc, 0x00, 0x05, 0xa0, 0xde, 0xce, 0xdf, 0xcd,
+ 0xee, 0xce, 0xb0, 0xe1,
+ 0x11, 0x20, 0x0c, 0xf0, 0xfe, 0x00, 0x00, 0x8a, 0xed, 0x00, 0x0a, 0xdd,
+ 0xcd, 0xd0, 0xbd, 0xb8,
+ 0xef, 0xcf, 0xe0, 0xcf, 0xfd, 0xd9, 0x0f, 0x00, 0x10, 0x0f, 0xfd, 0xfb,
+ 0x1f, 0x3f, 0x0e, 0xde,
+ 0x9f, 0xec, 0xeb, 0xde, 0xcf, 0xc0, 0xd0, 0xed, 0x0d, 0x1d, 0x00, 0xd0,
+ 0xce, 0xfc, 0xfc, 0xee,
+ 0xf0, 0xee, 0xac, 0x0e, 0x00, 0x2f, 0xfb, 0xdc, 0x2d, 0x30, 0x11, 0x2d,
+ 0x1d, 0x10, 0xe0, 0xbe,
+ 0xbd, 0xf2, 0x47, 0x20, 0x0b, 0x1e, 0x4d, 0x50, 0x4c, 0x19, 0x4f, 0x7f,
+ 0x2f, 0x31, 0x13, 0x2f,
+ 0x2c, 0x3e, 0x40, 0x01, 0x13, 0x03, 0x06, 0xe2, 0xd4, 0xf1, 0xde, 0x0e,
+ 0xd0, 0x93, 0xe6, 0x01,
+ 0x2f, 0x50, 0x02, 0xf1, 0xe3, 0xf3, 0xe2, 0xe3, 0xe0, 0x0f, 0x04, 0x77,
+ 0x20, 0x41, 0x34, 0x02,
+ 0xf1, 0x02, 0x12, 0x02, 0x30, 0x4f, 0x5f, 0x37, 0x01, 0x2f, 0x72, 0x20,
+ 0x1e, 0x50, 0x27, 0x20,
+ 0x0c, 0x01, 0x22, 0x2f, 0x2d, 0x2e, 0x10, 0x2e, 0x1c, 0x0e, 0x9a, 0xcb,
+ 0xcf, 0xf0, 0xc0, 0xec,
+ 0xfd, 0xfe, 0xdd, 0xdd, 0x2e, 0x5e, 0x09, 0x2e, 0x5e, 0x1e, 0x2b, 0x20,
+ 0x20, 0x0d, 0x4e, 0x4f,
+ 0x1f, 0x0f, 0x0f, 0x2f, 0x10, 0x20, 0x01, 0x27, 0x56, 0x1f, 0x3f, 0x00,
+ 0xd2, 0x00, 0x50, 0x61,
+ 0x43, 0x03, 0x01, 0xe0, 0x13, 0x07, 0xf3, 0xa6, 0xe1, 0xc1, 0xf1, 0x01,
+ 0x23, 0x33, 0x03, 0xc2,
+ 0xf0, 0xd2, 0xd4, 0x06, 0x02, 0x31, 0x62, 0xf6, 0xa1, 0xf1, 0xe3, 0x12,
+ 0x33, 0x23, 0x04, 0xe3,
+ 0xf3, 0x22, 0x32, 0x01, 0xe2, 0xc3, 0xe5, 0xe1, 0xe1, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x8b, 0x00,
+ 0xd0, 0xfd, 0x8e, 0x29, 0xdc, 0xfb, 0x7d, 0x2c, 0x5b, 0x2d, 0x2f, 0x3e,
+ 0x4e, 0x1e, 0x3d, 0x4e,
+ 0x3d, 0x3b, 0x4e, 0x3d, 0x2d, 0x2a, 0x4e, 0x5f, 0x4d, 0x5c, 0x4e, 0x3d,
+ 0x4e, 0x3f, 0x31, 0x31,
+ 0x3f, 0x2e, 0x20, 0x02, 0xf5, 0xd4, 0xb4, 0xd5, 0xc3, 0xd5, 0xb2, 0xe1,
+ 0xe1, 0x02, 0x12, 0x14,
+ 0x02, 0x13, 0x33, 0x14, 0xf4, 0xd3, 0xb5, 0xc2, 0xb2, 0xd2, 0xc2, 0xc2,
+ 0xd1, 0xf1, 0x02, 0x03,
+ 0xf1, 0xe0, 0xff, 0xfe, 0xec, 0xec, 0xce, 0xdd, 0xcd, 0xec, 0xfc, 0xfc,
+ 0x1e, 0x3e, 0x4a, 0x1e,
+ 0x1e, 0x0e, 0x2e, 0x4c, 0x2e, 0x4d, 0x5c, 0x3c, 0x3d, 0x1d, 0x0b, 0xfd,
+ 0x0c, 0x3e, 0x2d, 0x1c,
+ 0x3d, 0x2e, 0x7e, 0x6f, 0x2e, 0x3a, 0x3d, 0x4c, 0x3d, 0x3c, 0x2c, 0x2d,
+ 0x2c, 0x0d, 0xdd, 0x8d,
+ 0xdd, 0xbc, 0xed, 0xee, 0xcd, 0xdd, 0xcd, 0xee, 0xd0, 0xee, 0x0e, 0x1e,
+ 0x1f, 0x2f, 0x1f, 0x10,
+ 0x2f, 0x3c, 0x7f, 0x60, 0x2f, 0x1e, 0x20, 0x25, 0x14, 0x03, 0x07, 0x04,
+ 0xf3, 0xf3, 0x04, 0x14,
+ 0x02, 0xc2, 0xd2, 0xd2, 0xa2, 0xd1, 0xc1, 0xe2, 0xe2, 0xe0, 0xe2, 0xc3,
+ 0xd1, 0xb2, 0xd5, 0xc5,
+ 0xd4, 0xc3, 0xd2, 0xe5, 0xc2, 0xc2, 0xd3, 0xd4, 0xd6, 0xc2, 0xe2, 0xf2,
+ 0x03, 0x22, 0x32, 0x63,
+ 0x22, 0x32, 0x33, 0x41, 0x2f, 0x4d, 0x2e, 0x30, 0x3e, 0x2b, 0x2c, 0x1c,
+ 0x0c, 0x0c, 0x0c, 0xee,
+ 0xef, 0xdf, 0xc1, 0xb3, 0xc1, 0xc1, 0xe2, 0x07, 0x03, 0x23, 0x34, 0x34,
+ 0x53, 0x44, 0x53, 0x24,
+ 0x43, 0x23, 0x23, 0x24, 0x34, 0x32, 0x22, 0x32, 0x32, 0x33, 0x23, 0x02,
+ 0x13, 0x12, 0x22, 0x72,
+ 0x43, 0x41, 0x40, 0x30, 0x35, 0x46, 0x23, 0x12, 0x11, 0x02, 0x02, 0xc2,
+ 0xc1, 0xd0, 0xc1, 0xc1,
+ 0xd0, 0xdb, 0xfc, 0xed, 0xfe, 0xed, 0xc8, 0xce, 0xcd, 0xdd, 0xdf, 0xf0,
+ 0xf1, 0xe0, 0xfe, 0xfe,
+ 0xf1, 0xd4, 0xd4, 0xe4, 0xe2, 0xd4, 0xa4, 0xe4, 0xc2, 0xc2, 0xd3, 0xd5,
+ 0xd3, 0xc1, 0xd1, 0xf3,
+ 0x23, 0x23, 0x31, 0x14, 0x03, 0xf3, 0x25, 0x71, 0x30, 0x3e, 0x4c, 0x4d,
+ 0x2a, 0x2d, 0x2a, 0x1e,
+ 0x1c, 0x1e, 0x0c, 0xfd, 0x0c, 0x0d, 0x7b, 0x7e, 0x5e, 0x3e, 0x3f, 0x4e,
+ 0x2d, 0x2c, 0x2e, 0x2e,
+ 0x2f, 0x3d, 0x3f, 0x2f, 0x1f, 0x1e, 0x0d, 0x2e, 0x40, 0x22, 0x35, 0x03,
+ 0xf1, 0xc0, 0xd2, 0xe3,
+ 0xf3, 0x44, 0x34, 0x03, 0xe2, 0x80, 0xd0, 0xd1, 0xf6, 0xf2, 0xd3, 0xc2,
+ 0xc1, 0xc0, 0xe3, 0xd7,
+ 0xf1, 0x00, 0x2f, 0x2e, 0x2e, 0x30, 0x3e, 0x0a, 0xfd, 0x8d, 0xac, 0xbd,
+ 0xed, 0xde, 0xcd, 0xdc,
+ 0xdd, 0xdd, 0xce, 0xe0, 0xd1, 0xd2, 0xc3, 0xe2, 0xe2, 0xe2, 0xe0, 0xe9,
+ 0xf8, 0xfc, 0xfc, 0xdd,
+ 0xfd, 0x0c, 0x1c, 0x1d, 0x4d, 0x4c, 0x0d, 0x0e, 0x0d, 0xde, 0x9d, 0xed,
+ 0x0e, 0x2f, 0x2f, 0x00,
+ 0x00, 0x31, 0x72, 0x54, 0x44, 0x32, 0x43, 0x44, 0x36, 0x33, 0x24, 0x13,
+ 0x25, 0x23, 0x13, 0x03,
+ 0x03, 0xe3, 0xd2, 0xb3, 0xe3, 0xe2, 0xd1, 0x03, 0x05, 0x02, 0xe2, 0xe2,
+ 0xa1, 0xf3, 0x06, 0x34,
+ 0x23, 0x13, 0x44, 0x44, 0x34, 0x42, 0x33, 0x22, 0x03, 0xc3, 0x94, 0xb3,
+ 0xd4, 0xb3, 0xd1, 0xd3,
+ 0xb2, 0xe0, 0xd0, 0xef, 0xf1, 0xf2, 0xf0, 0x0f, 0x1e, 0x1f, 0x3b, 0x3d,
+ 0x4d, 0x2b, 0x1c, 0x0f,
+ 0x0d, 0xd9, 0xde, 0xed, 0x0e, 0x0c, 0xde, 0xcc, 0xfe, 0x1c, 0x7d, 0x7e,
+ 0x5c, 0x2d, 0x3c, 0x3d,
+ 0x2c, 0x3d, 0x3c, 0x2d, 0x2b, 0x0e, 0x0c, 0xfe, 0xce, 0xce, 0xce, 0xdf,
+ 0xbe, 0xdf, 0xd0, 0xd0,
+ 0xd1, 0xd2, 0xe2, 0xf3, 0xf2, 0xf2, 0x02, 0x23, 0x55, 0x32, 0x31, 0x40,
+ 0x41, 0x34, 0x45, 0x33,
+ 0x24, 0x14, 0x24, 0x23, 0x04, 0x03, 0x04, 0x02, 0xe3, 0xc4, 0xe3, 0xc2,
+ 0xf2, 0x02, 0x34, 0x44,
+ 0x35, 0x72, 0x53, 0x23, 0x25, 0x23, 0x43, 0x34, 0x43, 0x22, 0x12, 0x13,
+ 0x04, 0xf2, 0xd1, 0xc1,
+ 0xe0, 0xd0, 0xbf, 0xd0, 0xe0, 0xf2, 0x02, 0x04, 0x04, 0x01, 0x01, 0x32,
+ 0x32, 0x20, 0x00, 0x12,
+ 0x12, 0x2e, 0x0a, 0x6e, 0x4e, 0x1c, 0x2f, 0x5f, 0x3d, 0x08, 0x1c, 0x2d,
+ 0x5c, 0x5d, 0x3e, 0x5d,
+ 0x2d, 0x3c, 0x4d, 0x4d, 0x3d, 0x4b, 0x3d, 0x5c, 0x3e, 0x4f, 0x30, 0x31,
+ 0x43, 0x23, 0x24, 0x26,
+ 0x23, 0x04, 0x03, 0xf3, 0xd4, 0xf3, 0xe2, 0xf2, 0x02, 0x02, 0x22, 0x01,
+ 0x00, 0x00, 0xfe, 0xee,
+ 0xbf, 0xc1, 0xb7, 0xc7, 0xc2, 0xd3, 0xd3, 0xf4, 0x04, 0x13, 0x03, 0xf4,
+ 0xf3, 0xf4, 0x02, 0x12,
+ 0x12, 0x23, 0x53, 0x23, 0x13, 0x13, 0x03, 0xf5, 0x14, 0x75, 0x53, 0x02,
+ 0x02, 0xd2, 0xa1, 0xc1,
+ 0xc0, 0xe1, 0xe1, 0xe0, 0xee, 0xdc, 0xdd, 0xfd, 0xed, 0xee, 0xef, 0xf0,
+ 0x20, 0x7c, 0x2a, 0x4d,
+ 0x4d, 0x4f, 0x2f, 0x2b, 0x0d, 0x1b, 0x3c, 0x4d, 0x5a, 0x2e, 0x2c, 0x2d,
+ 0x2c, 0x2d, 0x3c, 0x3e,
+ 0x2c, 0x1e, 0x1c, 0x0e, 0xee, 0x8e, 0xbd, 0xde, 0xcd, 0xde, 0xdd, 0xdb,
+ 0xee, 0xfd, 0xdd, 0xed,
+ 0xec, 0xfd, 0x0d, 0x0c, 0x1d, 0x4d, 0x5e, 0x2f, 0x4f, 0x40, 0x3f, 0x3e,
+ 0x3d, 0x3f, 0x20, 0x10,
+ 0x02, 0xb2, 0xd2, 0xc3, 0xc4, 0xd7, 0xc4, 0xd4, 0xc3, 0xd6, 0xe3, 0xd3,
+ 0xc4, 0xe4, 0xc3, 0xc3,
+ 0xc4, 0xc3, 0xd2, 0xc2, 0xd1, 0xe3, 0xc3, 0xe3, 0xc3, 0xd4, 0xd3, 0xd5,
+ 0xd3, 0xd2, 0xe1, 0xd1,
+ 0xd2, 0x02, 0x00, 0x0d, 0x1d, 0x2c, 0x4b, 0x7d, 0x4b, 0x4d, 0x2c, 0x3c,
+ 0x4e, 0x4e, 0x3e, 0x3c,
+ 0x3e, 0x4d, 0x3e, 0x2e, 0x1f, 0x1e, 0x0e, 0xde, 0xce, 0xdd, 0xee, 0xee,
+ 0x2e, 0x4e, 0x3e, 0x3f,
+ 0x50, 0x30, 0x40, 0x32, 0x27, 0x34, 0x25, 0x22, 0x13, 0x03, 0x04, 0x05,
+ 0x23, 0x43, 0x35, 0x53,
+ 0x22, 0x32, 0x32, 0x63, 0x35, 0x12, 0x12, 0x12, 0x00, 0x00, 0x21, 0x40,
+ 0x22, 0x15, 0x04, 0xc2,
+ 0xd2, 0xc3, 0xa3, 0xb2, 0xd2, 0xc4, 0xc2, 0xd2, 0xc7, 0xe4, 0xc2, 0xd1,
+ 0xc1, 0xd1, 0xf3, 0xd3,
+ 0xd0, 0xd0, 0xdb, 0xde, 0xdd, 0xde, 0xd9, 0xdc, 0x0f, 0xff, 0xce, 0xad,
+ 0xdd, 0xe0, 0xf3, 0xe1,
+ 0xbf, 0xdf, 0xe2, 0xe5, 0x15, 0x00, 0xde, 0x54, 0x43, 0x10, 0x2f, 0x73,
+ 0x21, 0x0a, 0x2d, 0x30,
+ 0x41, 0x2d, 0x08, 0x3f, 0x3e, 0x2e, 0x2d, 0x2e, 0xc9, 0xce, 0x00, 0xff,
+ 0xcd, 0xde, 0x0d, 0x30,
+ 0xfc, 0xfd, 0x71, 0x30, 0x00, 0xeb, 0x10, 0x71, 0x10, 0x0e, 0xff, 0x14,
+ 0x12, 0xff, 0xf0, 0x12,
+ 0x00, 0x88, 0x01, 0x67, 0x00, 0xe0, 0x00, 0x22, 0x00, 0xde, 0xff, 0x34,
+ 0x42, 0xef, 0xee, 0x02,
+ 0x45, 0xef, 0xce, 0x12, 0x44, 0xef, 0xba, 0x00, 0x32, 0xf0, 0xbc, 0x00,
+ 0x00, 0xf0, 0xff, 0xff,
+ 0x01, 0xef, 0xac, 0xf0, 0x13, 0xf0, 0xdb, 0x01, 0x22, 0xcd, 0x00, 0x13,
+ 0xfe, 0xdd, 0x00, 0x02,
+ 0x00, 0xff, 0xdc, 0x43, 0x55, 0xfd, 0xec, 0x32, 0x32, 0xee, 0xcd, 0x22,
+ 0x45, 0x0d, 0xdb, 0x1f,
+ 0x72, 0x30, 0x0c, 0x00, 0x40, 0x0e, 0x0b, 0x31, 0x54, 0xff, 0xee, 0x34,
+ 0x43, 0xed, 0xdd, 0x11,
+ 0x66, 0x20, 0x0f, 0x20, 0x42, 0x11, 0x20, 0x20, 0x32, 0x43, 0x10, 0x43,
+ 0x47, 0x10, 0x0f, 0x31,
+ 0x77, 0x22, 0x0f, 0xee, 0x22, 0x67, 0x00, 0xee, 0x00, 0x12, 0x01, 0x01,
+ 0x02, 0xcf, 0xee, 0x17,
+ 0x12, 0xaf, 0xdf, 0x02, 0x14, 0x01, 0xc0, 0xe1, 0x03, 0x24, 0x00, 0xef,
+ 0x00, 0x13, 0xf0, 0xde,
+ 0x45, 0x00, 0xbd, 0x0e, 0x67, 0x11, 0xfe, 0xff, 0x11, 0x44, 0x11, 0xfe,
+ 0xee, 0x43, 0x45, 0x0f,
+ 0xee, 0x00, 0x43, 0x10, 0x0d, 0x20, 0x31, 0xf9, 0x00, 0x40, 0xcd, 0xba,
+ 0x00, 0x00, 0xff, 0xdc,
+ 0xbd, 0x0f, 0xf0, 0x0f, 0x00, 0xdc, 0x9a, 0x10, 0x21, 0x0f, 0xee, 0x0f,
+ 0x0f, 0x21, 0x41, 0x0e,
+ 0xfc, 0x10, 0x62, 0x0f, 0x0e, 0x44, 0x24, 0x0f, 0x0f, 0x00, 0x00, 0x22,
+ 0x02, 0xf0, 0x15, 0x25,
+ 0x8e, 0xdf, 0x27, 0x01, 0xd0, 0xe0, 0x03, 0xd0, 0x01, 0x35, 0xf0, 0x90,
+ 0xf0, 0x35, 0x33, 0xcf,
+ 0xcf, 0x02, 0x01, 0xef, 0x02, 0xe0, 0xc0, 0x16, 0x00, 0xd0, 0xd0, 0x22,
+ 0x01, 0xd0, 0x23, 0xc0,
+ 0xbe, 0x00, 0x01, 0x13, 0x22, 0xec, 0xfd, 0x75, 0x55, 0x00, 0xb8, 0xff,
+ 0x22, 0x31, 0xce, 0xdd,
+ 0x10, 0x53, 0x0e, 0xeb, 0x0e, 0x0f, 0x20, 0x30, 0x1e, 0x0c, 0x40, 0x61,
+ 0x0d, 0x0b, 0x00, 0x20,
+ 0x20, 0x10, 0x0e, 0x30, 0x21, 0xfe, 0x00, 0x46, 0x32, 0xdf, 0xbf, 0x13,
+ 0x24, 0xf0, 0xcd, 0x01,
+ 0x15, 0x12, 0x02, 0xc0, 0xd0, 0x37, 0x53, 0xe0, 0xf0, 0x43, 0x02, 0xe1,
+ 0x02, 0xd0, 0xf0, 0x03,
+ 0x8b, 0xef, 0x27, 0x01, 0xcf, 0xef, 0xf0, 0x01, 0xf1, 0xf0, 0x02, 0x23,
+ 0x00, 0xf0, 0x22, 0x30,
+ 0x53, 0x01, 0xb8, 0x11, 0x55, 0xff, 0x8a, 0x00, 0x23, 0xff, 0xed, 0x11,
+ 0x23, 0xef, 0xdc, 0x10,
+ 0x00, 0xef, 0x00, 0x0f, 0xed, 0xfe, 0x30, 0x30, 0x0c, 0x0b, 0x5f, 0x70,
+ 0x0d, 0xe8, 0x00, 0x50,
+ 0x10, 0xed, 0xfe, 0x30, 0x10, 0xdb, 0xfe, 0x20, 0x0e, 0x8b, 0x00, 0x10,
+ 0x0d, 0xdd, 0x0f, 0x30,
+ 0xff, 0xca, 0xef, 0x1f, 0x10, 0x0e, 0x30, 0x52, 0xed, 0xf0, 0x66, 0x11,
+ 0xdd, 0xfe, 0x34, 0x32,
+ 0xdd, 0xdd, 0x10, 0x21, 0x10, 0x20, 0x00, 0xcc, 0xff, 0x44, 0x13, 0xad,
+ 0xef, 0x04, 0x02, 0xad,
+ 0xf0, 0x17, 0x03, 0xad, 0xfe, 0x17, 0x01, 0xcf, 0x02, 0x25, 0xf0, 0xcf,
+ 0x01, 0x44, 0x01, 0xdf,
+ 0xe0, 0x34, 0x33, 0xcf, 0xdf, 0x11, 0x02, 0xef, 0xee, 0x10, 0x43, 0x22,
+ 0xfd, 0xed, 0x42, 0x57,
+ 0x00, 0xcb, 0x11, 0x32, 0xf0, 0xce, 0xff, 0x56, 0x00, 0xef, 0x00, 0x10,
+ 0x11, 0xdd, 0x00, 0x66,
+ 0x00, 0xff, 0xed, 0x00, 0x64, 0x10, 0x0e, 0x0f, 0x34, 0x00, 0x10, 0x65,
+ 0x0f, 0x00, 0x33, 0x00,
+ 0x10, 0x22, 0x12, 0x10, 0x0f, 0xfd, 0x47, 0x21, 0xff, 0x00, 0x2f, 0x72,
+ 0x11, 0x10, 0x22, 0x0e,
+ 0x0c, 0x32, 0x76, 0x00, 0x0b, 0xdd, 0x00, 0x44, 0x01, 0x9b, 0xff, 0x04,
+ 0x00, 0xcf, 0x01, 0x13,
+ 0xe0, 0xe0, 0xf1, 0xf1, 0x03, 0x02, 0xf0, 0x00, 0x03, 0xe0, 0x03, 0x37,
+ 0xd0, 0x8e, 0x15, 0x14,
+ 0xf0, 0xcf, 0xf1, 0x16, 0xe0, 0x8f, 0xf0, 0x04, 0x01, 0xdf, 0xff, 0x11,
+ 0x23, 0xee, 0x0f, 0x12,
+ 0xfd, 0xfc, 0x50, 0x31, 0x1d, 0x3d, 0x3c, 0x09, 0x4f, 0x60, 0x10, 0x0d,
+ 0x1d, 0x20, 0x20, 0xfa,
+ 0x0f, 0x30, 0x50, 0xda, 0xee, 0x71, 0x00, 0x0d, 0xfc, 0x0f, 0x20, 0x41,
+ 0x00, 0xe9, 0xff, 0x51,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0xcf, 0xff, 0x11, 0x12, 0xf0, 0xee, 0x00,
+ 0x33, 0x22, 0xca, 0x00,
+ 0x72, 0x21, 0xeb, 0x0f, 0x30, 0x21, 0xfd, 0xbb, 0x00, 0x33, 0x00, 0x9c,
+ 0x00, 0x03, 0x00, 0xce,
+ 0x02, 0x07, 0xe0, 0xbf, 0x01, 0xf4, 0xd0, 0xef, 0xe0, 0xe0, 0xef, 0xf0,
+ 0x21, 0xcb, 0xff, 0x20,
+ 0xbd, 0xdd, 0x02, 0x01, 0xcd, 0xed, 0x00, 0xca, 0xbb, 0xee, 0x03, 0x11,
+ 0xb8, 0xff, 0x20, 0x31,
+ 0x0f, 0x0e, 0x20, 0x50, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x13, 0xff,
+ 0xdd, 0x24, 0x13, 0x8c,
+ 0x00, 0x27, 0x00, 0xad, 0x02, 0x37, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00,
+ 0x75, 0x23, 0x00, 0xee,
+ 0x01, 0x45, 0x10, 0x01, 0x20, 0x21, 0x42, 0x22, 0x00, 0xf0, 0x10, 0x11,
+ 0xfd, 0xcd, 0xee, 0x47,
+ 0x24, 0xae, 0xdf, 0xe0, 0x03, 0x03, 0xe2, 0xf4, 0xb0, 0xe0, 0xe0, 0xf0,
+ 0x01, 0xd0, 0xbd, 0x02,
+ 0x26, 0xba, 0xcd, 0x23, 0x13, 0xdb, 0xce, 0x00, 0x23, 0x10, 0xff, 0xfc,
+ 0x20, 0x61, 0x00, 0x0b,
+ 0x10, 0x30, 0x0f, 0x20, 0x63, 0xfd, 0xd8, 0x00, 0x52, 0x10, 0xff, 0xdc,
+ 0xff, 0x23, 0x21, 0xde,
+ 0xef, 0xff, 0xf0, 0x0f, 0x00, 0xf1, 0x9d, 0xf0, 0x02, 0xef, 0xdb, 0x01,
+ 0x45, 0xff, 0xdd, 0xbc,
+ 0xf0, 0x12, 0x10, 0xec, 0x0d, 0x30, 0x64, 0x10, 0xf9, 0x20, 0x50, 0x20,
+ 0x2f, 0x0e, 0x51, 0x22,
+ 0x12, 0x23, 0x36, 0x11, 0x11, 0x23, 0x12, 0x45, 0x34, 0x00, 0xe0, 0x43,
+ 0x45, 0x00, 0x00, 0xe0,
+ 0xdd, 0x74, 0x73, 0xfc, 0xfe, 0x13, 0x02, 0xff, 0xe0, 0x06, 0x02, 0xc0,
+ 0xcf, 0x01, 0x06, 0xf0,
+ 0xd0, 0x01, 0x13, 0x00, 0xdf, 0x23, 0x55, 0x00, 0xcc, 0x21, 0x33, 0xde,
+ 0xbb, 0x00, 0x11, 0xff,
+ 0xde, 0x10, 0x10, 0xdd, 0xf0, 0x53, 0x0e, 0x1e, 0x3f, 0x2e, 0x50, 0x30,
+ 0x3d, 0x40, 0x52, 0x22,
+ 0x22, 0x2c, 0x18, 0x43, 0x23, 0xfb, 0xff, 0x53, 0x10, 0x0e, 0x00, 0x00,
+ 0xfc, 0x00, 0x04, 0xf0,
+ 0xae, 0xe0, 0x07, 0xd2, 0xb0, 0x03, 0x36, 0x11, 0x00, 0x62, 0x45, 0x00,
+ 0x10, 0x43, 0x34, 0x10,
+ 0xff, 0x10, 0x76, 0x11, 0xf0, 0xff, 0x00, 0x04, 0x01, 0xd0, 0xe0, 0x15,
+ 0x02, 0xc0, 0xe1, 0x02,
+ 0x12, 0x00, 0xf0, 0x23, 0x54, 0x12, 0x00, 0xf2, 0x04, 0x15, 0xe0, 0x80,
+ 0xe0, 0xe1, 0xd1, 0xe2,
+ 0xe2, 0xdf, 0xbc, 0x00, 0x05, 0x00, 0xfc, 0xfe, 0x20, 0x4f, 0x0a, 0x4f,
+ 0x3f, 0x1d, 0x4d, 0x5e,
+ 0x1c, 0x1c, 0x40, 0x3e, 0x0c, 0xfb, 0x0f, 0x20, 0xee, 0x9c, 0xee, 0x0f,
+ 0xfd, 0xa9, 0xfe, 0xee,
+ 0xfe, 0x0e, 0xfd, 0xfc, 0x0e, 0x1e, 0x3f, 0x0e, 0x0c, 0x0e, 0x0e, 0x0f,
+ 0x1d, 0x2e, 0x3f, 0xfd,
+ 0x1e, 0x1e, 0xff, 0x73, 0x00, 0xec, 0x40, 0x52, 0x11, 0x26, 0x12, 0x01,
+ 0x13, 0x47, 0x01, 0xd1,
+ 0x03, 0xc2, 0x81, 0x06, 0x02, 0xe2, 0xc1, 0xe4, 0xf3, 0xa1, 0xd1, 0xe3,
+ 0xd2, 0xd2, 0xd4, 0xd2,
+ 0xb0, 0xef, 0x03, 0xf3, 0xde, 0xf0, 0x22, 0x23, 0x1b, 0x2d, 0x71, 0x20,
+ 0x2e, 0x2f, 0x2f, 0x0b,
+ 0x20, 0x55, 0x11, 0x0d, 0x1b, 0x20, 0x32, 0x0f, 0xb8, 0xff, 0x10, 0x1f,
+ 0xfc, 0xec, 0x20, 0x2f,
+ 0xde, 0xbc, 0xfe, 0x20, 0x3f, 0x1e, 0x10, 0x11, 0x24, 0x12, 0x22, 0x32,
+ 0x75, 0x73, 0x21, 0x0f,
+ 0xf0, 0x24, 0x20, 0xee, 0xef, 0x11, 0x11, 0x00, 0x74, 0x47, 0x32, 0x12,
+ 0x22, 0x23, 0x12, 0x56,
+ 0x12, 0x12, 0x11, 0x23, 0x24, 0xe0, 0xb0, 0x05, 0x02, 0xc1, 0xc0, 0xd2,
+ 0xd3, 0xc2, 0xd1, 0xd1,
+ 0xcf, 0xef, 0xd0, 0xad, 0xdb, 0xee, 0xde, 0xee, 0xdd, 0xda, 0xce, 0xef,
+ 0xdf, 0xdc, 0xbb, 0xef,
+ 0x02, 0xf1, 0xf0, 0x01, 0xf3, 0xf4, 0x02, 0xd2, 0xc2, 0xe6, 0xd3, 0x81,
+ 0xd0, 0xe2, 0xf2, 0xf0,
+ 0xde, 0xdb, 0x2f, 0x50, 0x1b, 0x0d, 0x3c, 0x7f, 0x4f, 0x1e, 0x1d, 0x2f,
+ 0x2e, 0x2c, 0x0c, 0x1f,
+ 0x0d, 0x0c, 0x1e, 0x0e, 0xd9, 0xbd, 0x0f, 0x4e, 0x0d, 0xfa, 0x1f, 0x1e,
+ 0x0e, 0x0e, 0x1f, 0x4f,
+ 0x1f, 0x20, 0x1e, 0x1d, 0x0d, 0x0e, 0xed, 0x0d, 0x10, 0x35, 0x42, 0x0f,
+ 0xbc, 0x32, 0x77, 0x65,
+ 0x00, 0xef, 0x00, 0x20, 0x10, 0x2e, 0x4f, 0x4d, 0x3e, 0x0d, 0x09, 0x0f,
+ 0x4e, 0xfe, 0x0f, 0x00,
+ 0xad, 0xdc, 0xde, 0xd0, 0x9d, 0xdc, 0xff, 0xfe, 0xef, 0xe0, 0xd1, 0xd1,
+ 0xd0, 0xe0, 0xc1, 0xc2,
+ 0xc5, 0xf7, 0xd4, 0xd0, 0xef, 0x01, 0x05, 0xc1, 0xc0, 0xc2, 0xe3, 0xe0,
+ 0xf0, 0x00, 0xe2, 0xe1,
+ 0xcd, 0xe8, 0xfe, 0x1e, 0x50, 0x0c, 0xdc, 0x0e, 0x0d, 0xfd, 0x50, 0x7f,
+ 0x1e, 0x2f, 0x61, 0x20,
+ 0x1c, 0x2d, 0x2d, 0x44, 0x37, 0x00, 0x00, 0x34, 0x32, 0x00, 0x01, 0x01,
+ 0x48, 0x00, 0x50, 0x00,
+ 0xe3, 0xe8, 0xdc, 0xd5, 0x51, 0xe6, 0xb7, 0xd4, 0x55, 0xe0, 0xec, 0x00,
+ 0x33, 0x10, 0x00, 0xcc,
+ 0x11, 0x52, 0x0e, 0xc9, 0xd0, 0x21, 0x00, 0x00, 0xf2, 0xb3, 0xef, 0xef,
+ 0x13, 0x03, 0xdf, 0xa8,
+ 0x00, 0x31, 0xe1, 0x00, 0x5f, 0x2f, 0x0d, 0xcf, 0x00, 0xf0, 0xfd, 0xf0,
+ 0x27, 0x61, 0xf0, 0x0f,
+ 0x51, 0x00, 0xd0, 0x04, 0x10, 0x20, 0x02, 0xe0, 0xee, 0x0b, 0x53, 0x2e,
+ 0xfc, 0xd1, 0x03, 0xf9,
+ 0x0d, 0x70, 0x21, 0xcc, 0xff, 0x36, 0x0f, 0xcb, 0xd0, 0x00, 0x23, 0xbf,
+ 0xdb, 0x32, 0x21, 0xef,
+ 0xcd, 0x12, 0x25, 0x10, 0xfc, 0x10, 0x71, 0x44, 0x00, 0xdd, 0x00, 0x13,
+ 0x0e, 0x0f, 0x63, 0x02,
+ 0xde, 0x0d, 0x0e, 0x23, 0xfd, 0xda, 0x75, 0x32, 0xce, 0xed, 0x03, 0x23,
+ 0x04, 0xd0, 0xd1, 0x16,
+ 0x22, 0xce, 0xde, 0x50, 0x43, 0xff, 0xed, 0x03, 0x4f, 0x1b, 0x00, 0xd1,
+ 0x01, 0xec, 0xed, 0xe3,
+ 0x17, 0xf0, 0xad, 0xde, 0x01, 0x33, 0x0f, 0x0f, 0x73, 0x51, 0xf8, 0xff,
+ 0x00, 0x13, 0x0f, 0xfc,
+ 0x32, 0x22, 0xaf, 0xfe, 0x01, 0x0f, 0xdb, 0xce, 0x12, 0x43, 0x0c, 0xfc,
+ 0xf1, 0x22, 0x4e, 0x0a,
+ 0x00, 0x21, 0x3f, 0x5d, 0x31, 0xe0, 0xcb, 0x01, 0x05, 0x00, 0x0d, 0x21,
+ 0x14, 0x01, 0x41, 0x42,
+ 0xcf, 0xef, 0x10, 0x35, 0xf4, 0x90, 0xfb, 0x00, 0x30, 0xd2, 0x80, 0x00,
+ 0x05, 0x00, 0xe1, 0x01,
+ 0x13, 0xf0, 0xeb, 0x40, 0x32, 0xff, 0xcd, 0x20, 0x20, 0x1d, 0xf9, 0x00,
+ 0x60, 0xf2, 0xd0, 0xdd,
+ 0x21, 0x47, 0xdf, 0xef, 0x22, 0x10, 0x20, 0x23, 0xd0, 0xdf, 0xfd, 0x4c,
+ 0x72, 0x01, 0x02, 0x2f,
+ 0x0a, 0x01, 0x63, 0xed, 0x98, 0x0f, 0x22, 0x00, 0xc0, 0x01, 0x10, 0xee,
+ 0xdd, 0x14, 0x01, 0xbe,
+ 0xfd, 0x27, 0x21, 0xec, 0x1f, 0x71, 0x72, 0xfc, 0xfe, 0x21, 0x13, 0x0f,
+ 0xfc, 0x00, 0x00, 0x0d,
+ 0x00, 0x11, 0xe1, 0xce, 0xfc, 0xe1, 0x04, 0xee, 0xf9, 0x21, 0x54, 0xff,
+ 0xff, 0xf3, 0xe0, 0xc0,
+ 0x10, 0x64, 0x12, 0x0e, 0x0f, 0x01, 0xf5, 0x1f, 0x3f, 0x20, 0x01, 0x0e,
+ 0x71, 0x02, 0xbd, 0xfb,
+ 0xff, 0xe3, 0xe2, 0xe0, 0x00, 0x00, 0x35, 0x10, 0x32, 0x67, 0x06, 0x30,
+ 0x40, 0x0d, 0x41, 0x26,
+ 0xd1, 0xae, 0x00, 0xf0, 0xd0, 0xd2, 0x00, 0x10, 0xb2, 0xde, 0x00, 0x2e,
+ 0xe9, 0xe0, 0x40, 0x41,
+ 0x00, 0x2c, 0x63, 0x33, 0x0c, 0xfd, 0x14, 0x45, 0x00, 0xce, 0x0f, 0x01,
+ 0x12, 0xe0, 0xbf, 0x04,
+ 0x10, 0x39, 0xdf, 0xd0, 0x00, 0x0d, 0x21, 0xff, 0xcc, 0x2e, 0x0f, 0xf0,
+ 0x1f, 0x7c, 0x71, 0x41,
+ 0xf1, 0xf6, 0xf2, 0x00, 0x01, 0x04, 0x00, 0xff, 0xde, 0xd0, 0xe0, 0xef,
+ 0x56, 0x33, 0x0c, 0xfe,
+ 0x31, 0x44, 0xde, 0xfd, 0x32, 0x77, 0x0f, 0xfd, 0x00, 0x64, 0x10, 0x0b,
+ 0xc0, 0x00, 0x14, 0x00,
+ 0xdc, 0xb0, 0xf1, 0x02, 0xf0, 0xce, 0x01, 0x46, 0xff, 0xbd, 0x02, 0x32,
+ 0x00, 0x00, 0xf0, 0x02,
+ 0x02, 0x00, 0x0f, 0x2e, 0x0f, 0xff, 0xec, 0xb0, 0x16, 0x46, 0xdf, 0xbc,
+ 0x10, 0x42, 0xf1, 0xaf,
+ 0x0f, 0x00, 0xfe, 0xe0, 0x20, 0x12, 0x20, 0xea, 0xe0, 0x11, 0x60, 0x1d,
+ 0x0e, 0x40, 0x45, 0x30,
+ 0x2d, 0x0d, 0x30, 0xf2, 0xf1, 0x0e, 0x00, 0x01, 0xe9, 0x1e, 0x5c, 0xef,
+ 0xed, 0xfe, 0x3e, 0x1e,
+ 0xbf, 0xf2, 0x03, 0xf0, 0xd7, 0xc6, 0xbe, 0xe0, 0xbf, 0xe2, 0x14, 0xe0,
+ 0x0e, 0x3e, 0x6f, 0x12,
+ 0x03, 0xcf, 0xf1, 0x17, 0x11, 0x2e, 0x1c, 0x00, 0xe0, 0x00, 0x72, 0x35,
+ 0xcd, 0x00, 0x12, 0xc4,
+ 0xe3, 0x2d, 0x70, 0x02, 0xd4, 0xe3, 0x13, 0x26, 0x0f, 0xdb, 0xfe, 0x33,
+ 0x03, 0x9d, 0xe0, 0x14,
+ 0x00, 0xca, 0x00, 0xf3, 0xdf, 0xec, 0x22, 0xe0, 0x9b, 0x00, 0x00, 0x01,
+ 0xde, 0xee, 0x47, 0x11,
+ 0x10, 0x60, 0x0f, 0x1d, 0x2d, 0x73, 0x27, 0xf0, 0xee, 0x00, 0x42, 0x00,
+ 0xfd, 0xee, 0x00, 0x3f,
+ 0xdc, 0x11, 0x43, 0x3b, 0x4f, 0xf0, 0xe0, 0xf0, 0x34, 0x56, 0xdf, 0xfd,
+ 0x33, 0xf1, 0x8e, 0x0d,
+ 0x00, 0x22, 0x07, 0xf3, 0xce, 0x0f, 0xf2, 0x00, 0x13, 0x64, 0x00, 0xb0,
+ 0x15, 0x30, 0x0a, 0xef,
+ 0x1e, 0x71, 0x11, 0xff, 0xfd, 0x13, 0x00, 0xec, 0xf2, 0x04, 0x0f, 0xff,
+ 0x07, 0xe0, 0x9c, 0x00,
+ 0x03, 0x01, 0x8e, 0x0e, 0x02, 0x04, 0xfd, 0xfe, 0x00, 0x2e, 0x1f, 0x00,
+ 0x41, 0x00, 0x10, 0xff,
+ 0xf8, 0x10, 0x32, 0x21, 0xff, 0xde, 0x04, 0x02, 0xab, 0xd0, 0xd0, 0x12,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x74, 0x7f, 0x09, 0x01, 0x36, 0x00, 0x0d, 0x00, 0x54, 0x00, 0xcd, 0x00,
+ 0x01, 0x1f, 0x01, 0xf4,
+ 0xb0, 0xca, 0x00, 0x02, 0x0e, 0xfd, 0x21, 0x00, 0xff, 0xed, 0x21, 0x22,
+ 0xee, 0x60, 0x40, 0x1e,
+ 0x1e, 0x4e, 0x42, 0xe8, 0xec, 0x21, 0x16, 0xd0, 0x9f, 0x10, 0x24, 0x02,
+ 0xe0, 0xf2, 0x00, 0x24,
+ 0x51, 0x0e, 0xeb, 0x30, 0x52, 0xff, 0xee, 0x00, 0x41, 0xd0, 0xd5, 0x01,
+ 0x00, 0xfd, 0x92, 0x06,
+ 0x01, 0xd1, 0xc1, 0x00, 0x11, 0x1d, 0x1e, 0x0a, 0x21, 0x42, 0xcd, 0x0d,
+ 0x01, 0x63, 0x0d, 0xfc,
+ 0x04, 0x01, 0xf9, 0x00, 0x02, 0xe1, 0xd1, 0xf0, 0x03, 0x0f, 0xde, 0x8d,
+ 0xf2, 0x27, 0x12, 0xc8,
+ 0xff, 0x41, 0x40, 0x1e, 0x40, 0x31, 0x22, 0x1f, 0x1d, 0x00, 0x0d, 0xe0,
+ 0x23, 0xc1, 0xbd, 0x10,
+ 0x47, 0xcd, 0xdc, 0x00, 0x30, 0xf0, 0xce, 0x27, 0x00, 0xde, 0x2f, 0x13,
+ 0x04, 0xb0, 0x02, 0x65,
+ 0x10, 0x00, 0x00, 0x51, 0x11, 0x0e, 0xee, 0x11, 0x0f, 0xea, 0x0e, 0xfd,
+ 0x42, 0x00, 0xaa, 0x32,
+ 0x34, 0xb2, 0xd0, 0x0f, 0xef, 0xe2, 0x04, 0x20, 0x2e, 0x3f, 0x22, 0xd3,
+ 0xe0, 0xad, 0x17, 0x32,
+ 0xef, 0xf0, 0x32, 0xf0, 0x8c, 0xdc, 0x0f, 0x13, 0x03, 0xdc, 0x0b, 0xf1,
+ 0xf2, 0x8e, 0xfa, 0x00,
+ 0xf0, 0x10, 0x0f, 0x40, 0x40, 0x3f, 0x0c, 0xf0, 0x02, 0x12, 0x41, 0x32,
+ 0x0d, 0x0a, 0x9c, 0x0e,
+ 0x10, 0x01, 0x0e, 0x49, 0x20, 0x00, 0xed, 0x0d, 0x3f, 0x00, 0xf1, 0x9f,
+ 0xcc, 0xe0, 0xd0, 0xe4,
+ 0x00, 0x1f, 0x6e, 0xf1, 0x07, 0x25, 0x10, 0x1d, 0x31, 0x00, 0xf0, 0x71,
+ 0x20, 0x0f, 0xf2, 0x12,
+ 0x0f, 0x04, 0xc4, 0xd0, 0xd7, 0x44, 0x30, 0x1f, 0x10, 0xe5, 0x02, 0x70,
+ 0x0e, 0x2f, 0x13, 0x82,
+ 0xd0, 0xff, 0x00, 0xf4, 0xc2, 0xea, 0xdd, 0x02, 0x01, 0xbc, 0x00, 0x02,
+ 0x10, 0x00, 0x40, 0x1d,
+ 0x00, 0x15, 0x75, 0x0e, 0x0c, 0x4f, 0x32, 0x24, 0x0f, 0x40, 0x23, 0x21,
+ 0x0f, 0xcc, 0x01, 0xd2,
+ 0xee, 0xdc, 0xf1, 0xb1, 0xc9, 0xfe, 0x12, 0x0f, 0xda, 0xf0, 0x00, 0x20,
+ 0x0c, 0x60, 0x15, 0x10,
+ 0x0f, 0x3e, 0x1f, 0x73, 0x23, 0x99, 0x00, 0x0f, 0x13, 0x40, 0x00, 0x1e,
+ 0xee, 0xe1, 0x16, 0x11,
+ 0xaf, 0xed, 0x32, 0x22, 0x02, 0x03, 0x44, 0x43, 0x0f, 0xba, 0x22, 0x43,
+ 0x11, 0x0d, 0x1f, 0x10,
+ 0xeb, 0xce, 0xf0, 0x06, 0xc0, 0xcd, 0xf1, 0x01, 0xe0, 0x9b, 0xef, 0x00,
+ 0xf4, 0xed, 0x0f, 0x41,
+ 0x01, 0xfe, 0x00, 0x53, 0x11, 0x1d, 0x0e, 0x06, 0x34, 0xed, 0x0e, 0x55,
+ 0x10, 0xf0, 0x00, 0xd0,
+ 0xae, 0xf0, 0x04, 0xf1, 0xbd, 0xee, 0xf1, 0x24, 0xfe, 0xec, 0x03, 0x53,
+ 0x3f, 0x2c, 0x33, 0x13,
+ 0x25, 0x00, 0xd8, 0x10, 0x71, 0x02, 0x21, 0x2f, 0x3d, 0x50, 0xd9, 0x00,
+ 0x61, 0x00, 0x0d, 0xdf,
+ 0x03, 0xd0, 0xba, 0x00, 0x00, 0xce, 0x1c, 0x40, 0x10, 0x00, 0x00, 0x32,
+ 0x15, 0x00, 0xf1, 0x33,
+ 0x11, 0x8a, 0xed, 0x11, 0x26, 0xc0, 0xbd, 0x00, 0x10, 0x11, 0x0f, 0x20,
+ 0x33, 0x00, 0x0d, 0x00,
+ 0x51, 0x2e, 0x5e, 0x00, 0xf0, 0xd1, 0x07, 0x13, 0x10, 0xbd, 0xba, 0x01,
+ 0x02, 0x1f, 0xfe, 0xf2,
+ 0xe1, 0x00, 0x20, 0xf0, 0xc4, 0x07, 0x00, 0x25, 0x02, 0x90, 0x0f, 0x0f,
+ 0x12, 0x36, 0x01, 0x10,
+ 0x00, 0xa0, 0x05, 0x22, 0xfe, 0xb0, 0xf0, 0x01, 0x00, 0xfc, 0x0a, 0x50,
+ 0x00, 0xfc, 0xff, 0x2f,
+ 0x61, 0x01, 0xe0, 0x1f, 0x3d, 0x2c, 0x00, 0x04, 0x71, 0x1f, 0x0b, 0x32,
+ 0x13, 0xee, 0xbc, 0x00,
+ 0x35, 0x00, 0x00, 0xef, 0x00, 0xef, 0x32, 0x56, 0xde, 0xce, 0x34, 0x77,
+ 0xf0, 0xce, 0x20, 0x33,
+ 0x00, 0x0d, 0x01, 0x53, 0xff, 0xed, 0x0f, 0x00, 0x0c, 0x00, 0x12, 0x02,
+ 0xcd, 0xfd, 0xc0, 0x06,
+ 0x45, 0xde, 0xdb, 0x20, 0x41, 0xc0, 0x9e, 0x01, 0xf1, 0xed, 0xfd, 0x02,
+ 0x17, 0x12, 0x40, 0x30,
+ 0x1f, 0x00, 0x04, 0x00, 0x00, 0xf4, 0xf2, 0xfe, 0xfc, 0x0f, 0xff, 0xc3,
+ 0xb5, 0xef, 0x0c, 0x10,
+ 0xc0, 0x9f, 0x0f, 0x0e, 0x00, 0xff, 0xfb, 0x11, 0x24, 0x73, 0x50, 0x09,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0xde, 0xe0, 0x12, 0x46, 0xef, 0xec, 0xf0, 0xed, 0x11, 0x21, 0x12, 0x9f,
+ 0xf8, 0x0f, 0x60, 0x12,
+ 0x0f, 0x0d, 0x2f, 0x51, 0x00, 0x10, 0x14, 0x01, 0x01, 0xf1, 0xe6, 0x01,
+ 0xd0, 0x8f, 0x0f, 0x03,
+ 0x17, 0x00, 0x20, 0x6e, 0x01, 0x04, 0x00, 0x2e, 0x00, 0xb0, 0xf3, 0x15,
+ 0x01, 0xdc, 0x0c, 0x60,
+ 0x03, 0x00, 0xdf, 0x02, 0x03, 0xdf, 0xb8, 0x10, 0x10, 0xf0, 0x1e, 0x22,
+ 0xc0, 0xae, 0x0f, 0x12,
+ 0x20, 0xda, 0x00, 0x73, 0x25, 0xff, 0xde, 0x00, 0x03, 0xed, 0xdc, 0x10,
+ 0x11, 0x12, 0xcd, 0xfc,
+ 0xef, 0xd9, 0x20, 0x20, 0x00, 0xf0, 0xfa, 0x50, 0x71, 0x30, 0x1f, 0x2f,
+ 0x53, 0x11, 0x43, 0x25,
+ 0x00, 0xfe, 0xf0, 0xed, 0xfc, 0x01, 0x27, 0xb1, 0xc2, 0xd0, 0xe2, 0xf2,
+ 0xf2, 0xd1, 0x06, 0xe3,
+ 0x02, 0x3f, 0x0a, 0x1e, 0x4e, 0x02, 0x32, 0xed, 0x00, 0x00, 0x1f, 0x7a,
+ 0x20, 0x0f, 0xc0, 0xf0,
+ 0x25, 0x33, 0xdf, 0x0c, 0x71, 0x02, 0x10, 0x20, 0x11, 0x41, 0x0e, 0xfe,
+ 0x31, 0x31, 0xf8, 0x0e,
+ 0x20, 0x21, 0x31, 0x34, 0x82, 0xe0, 0xfa, 0xb0, 0x00, 0x02, 0xa1, 0xd0,
+ 0xf3, 0xef, 0xfc, 0xdc,
+ 0xfe, 0x2d, 0x31, 0x03, 0x73, 0x4e, 0xf8, 0xef, 0x00, 0x22, 0x32, 0xed,
+ 0x0f, 0x30, 0x1b, 0xde,
+ 0xcf, 0x2e, 0x5f, 0x10, 0x21, 0xdf, 0xde, 0x0d, 0x5e, 0x30, 0xe8, 0x00,
+ 0x42, 0x17, 0xc1, 0x00,
+ 0x61, 0x00, 0xc0, 0xdf, 0x0f, 0x00, 0xef, 0xf0, 0x00, 0xa8, 0xed, 0x11,
+ 0x31, 0xdc, 0xcf, 0x22,
+ 0x15, 0xff, 0xdd, 0x23, 0x76, 0x30, 0x40, 0x30, 0x10, 0x02, 0xe2, 0x01,
+ 0x23, 0x31, 0x21, 0x11,
+ 0x02, 0x04, 0xbf, 0x0d, 0x21, 0x93, 0xd2, 0xf7, 0xfe, 0xfb, 0x0e, 0xce,
+ 0x90, 0xe0, 0x04, 0xf0,
+ 0xcd, 0x0f, 0x50, 0x34, 0x43, 0x02, 0x00, 0x37, 0xe5, 0xe0, 0x02, 0x00,
+ 0x20, 0xd0, 0x0f, 0x4e,
+ 0xf0, 0xf5, 0xe0, 0x8f, 0x0d, 0x0e, 0x2b, 0x0e, 0xee, 0x01, 0x3d, 0x09,
+ 0xaf, 0x00, 0x3d, 0x3f,
+ 0xe0, 0xe3, 0x00, 0xdf, 0xe2, 0xf3, 0x09, 0x0f, 0x02, 0x31, 0x2c, 0x0b,
+ 0x70, 0x31, 0x0f, 0xdd,
+ 0x52, 0x26, 0x00, 0x01, 0x14, 0x24, 0xd0, 0xdc, 0x0f, 0x73, 0x33, 0x0e,
+ 0x2e, 0x33, 0xa0, 0xea,
+ 0x0e, 0x10, 0x00, 0x0e, 0x00, 0xe0, 0xe6, 0x53, 0x20, 0xe0, 0x10, 0x25,
+ 0xe2, 0x80, 0xde, 0xd2,
+ 0xd3, 0xc1, 0xcf, 0x00, 0x45, 0x2f, 0x0c, 0xe1, 0x36, 0x5f, 0x0b, 0x00,
+ 0x0f, 0xe0, 0xf0, 0x05,
+ 0x10, 0xcc, 0x9f, 0xf0, 0xf0, 0xe0, 0xc2, 0xf1, 0xf0, 0xe0, 0xe0, 0xe2,
+ 0x00, 0x30, 0x72, 0x28,
+ 0x3f, 0x60, 0x2f, 0x1d, 0x20, 0x44, 0x30, 0x2b, 0x31, 0x22, 0xfe, 0xec,
+ 0x0f, 0x0f, 0xff, 0xbd,
+ 0xe1, 0xa4, 0xd0, 0xe0, 0xcb, 0x0f, 0x00, 0x00, 0x0b, 0x43, 0x77, 0x00,
+ 0x2e, 0x1d, 0x00, 0xe3,
+ 0xe0, 0x0c, 0xdd, 0xf0, 0xd0, 0xd0, 0xa0, 0xf0, 0xff, 0xfa, 0x00, 0x06,
+ 0x01, 0x31, 0x70, 0x11,
+ 0x03, 0x1f, 0x7d, 0x2f, 0x00, 0x07, 0x32, 0x00, 0x12, 0x34, 0xf0, 0xde,
+ 0xd0, 0xc1, 0xc1, 0xb0,
+ 0xe0, 0xdc, 0xec, 0x9c, 0xfe, 0x0e, 0x1e, 0xf1, 0xe4, 0x01, 0x03, 0x02,
+ 0x10, 0x3f, 0x01, 0x31,
+ 0x62, 0x27, 0x45, 0x00, 0xef, 0xf0, 0x10, 0xff, 0xac, 0x02, 0x12, 0x31,
+ 0xef, 0xce, 0x00, 0x0c,
+ 0x08, 0x0e, 0x70, 0x10, 0x2e, 0x30, 0x2e, 0x0c, 0x00, 0x10, 0x74, 0x23,
+ 0xf0, 0x0d, 0x1f, 0x00,
+ 0xb4, 0xff, 0xe0, 0xd7, 0xd5, 0xc0, 0xf0, 0xff, 0x02, 0x03, 0x32, 0x66,
+ 0x21, 0x20, 0x7e, 0x20,
+ 0x11, 0x0f, 0x2e, 0x0b, 0xff, 0xe2, 0xd3, 0x0f, 0x02, 0xe4, 0x1c, 0x5b,
+ 0x00, 0xa4, 0xf4, 0xdf,
+ 0xed, 0xdf, 0xef, 0x23, 0x0e, 0xfc, 0x10, 0x60, 0x0c, 0xe0, 0x40, 0x0b,
+ 0xff, 0xd3, 0x06, 0x0f,
+ 0x8e, 0xe0, 0xf2, 0x0f, 0xef, 0xde, 0x0e, 0x3d, 0x4b, 0x60, 0x15, 0x00,
+ 0xed, 0x0f, 0x10, 0x03,
+ 0xe2, 0x33, 0x67, 0x07, 0xf0, 0x00, 0x02, 0xe2, 0xf0, 0x4f, 0x42, 0x02,
+ 0xe1, 0x0f, 0x7b, 0x4e,
+ 0xf0, 0xcf, 0x02, 0xfe, 0x0a, 0xde, 0xbe, 0x0e, 0x2e, 0xff, 0xaf, 0xfd,
+ 0x02, 0x12, 0x1c, 0x39,
+ 0x40, 0x24, 0x00, 0x3f, 0x3a, 0x01, 0xb2, 0x00, 0x3b, 0xff, 0xe1, 0x14,
+ 0x5e, 0x7f, 0x10, 0x20,
+ 0x02, 0x00, 0xf4, 0x02, 0x02, 0xff, 0x9d, 0x0f, 0x31, 0xf6, 0xc2, 0xf2,
+ 0x13, 0x02, 0x01, 0xf5,
+ 0xf2, 0xf2, 0xe0, 0x0e, 0x40, 0x3f, 0x1b, 0x0d, 0xeb, 0x2e, 0x6f, 0x0f,
+ 0x9e, 0xf0, 0xd4, 0x00,
+ 0x00, 0xf9, 0xde, 0xf0, 0xc0, 0x07, 0x05, 0x20, 0x4f, 0x6f, 0x00, 0x00,
+ 0x01, 0x04, 0x22, 0x00,
+ 0xfe, 0xec, 0xd0, 0xbe, 0xef, 0x0d, 0x41, 0x44, 0x0d, 0xdf, 0x90, 0xf0,
+ 0x1a, 0x5c, 0x0e, 0x01,
+ 0x41, 0x1c, 0x0d, 0x1f, 0x20, 0x2d, 0xef, 0xc3, 0x06, 0x10, 0xf2, 0x05,
+ 0x52, 0x01, 0xc2, 0xd0,
+ 0x14, 0x64, 0x12, 0x00, 0xce, 0xd8, 0x10, 0x20, 0xf0, 0x00, 0x0f, 0x6f,
+ 0x20, 0x20, 0xfb, 0xe0,
+ 0x40, 0x12, 0xf3, 0xc4, 0x13, 0x10, 0x0d, 0x0f, 0x8f, 0x04, 0x02, 0x03,
+ 0xe7, 0xf2, 0x0e, 0x2c,
+ 0x43, 0x43, 0x01, 0xfe, 0xbf, 0x01, 0x10, 0xee, 0xeb, 0xc0, 0xfd, 0x23,
+ 0x36, 0xc0, 0xa0, 0xee,
+ 0xfd, 0xfe, 0x0c, 0x0e, 0x00, 0x27, 0xf1, 0xcf, 0xdb, 0xc0, 0xee, 0xf0,
+ 0x64, 0x31, 0x0d, 0x2b,
+ 0x5f, 0x40, 0x10, 0x1d, 0x3b, 0x20, 0x30, 0x0f, 0x0e, 0x00, 0xce, 0x9a,
+ 0xf0, 0xf0, 0xb3, 0xf1,
+ 0x0e, 0x0e, 0x1f, 0x00, 0x12, 0x3f, 0x08, 0xd0, 0x11, 0x31, 0x40, 0x2e,
+ 0x0f, 0x10, 0x30, 0x12,
+ 0xd7, 0xc1, 0xd3, 0xb3, 0x05, 0x11, 0xce, 0xb0, 0x03, 0x64, 0x11, 0x00,
+ 0x0e, 0xf0, 0x20, 0x10,
+ 0x20, 0x47, 0x01, 0xd3, 0x00, 0xc0, 0xe4, 0xf3, 0x9d, 0x00, 0xf6, 0xd0,
+ 0xef, 0xcd, 0xfe, 0xde,
+ 0x2f, 0x30, 0x13, 0x2c, 0x7d, 0x60, 0x01, 0x00, 0x00, 0x37, 0x12, 0x20,
+ 0x3f, 0x20, 0xe2, 0xc1,
+ 0xf2, 0x17, 0x07, 0xc0, 0xaf, 0xff, 0xe0, 0xe0, 0xfe, 0x0f, 0x10, 0x31,
+ 0x1c, 0x0e, 0x70, 0x3e,
+ 0xe9, 0xe0, 0x20, 0x70, 0x00, 0x0f, 0xbc, 0x0b, 0x0d, 0xff, 0x0c, 0xed,
+ 0xde, 0xe1, 0x37, 0x60,
+ 0x10, 0x01, 0x32, 0x31, 0x52, 0x17, 0x01, 0x20, 0x00, 0xe1, 0x01, 0xd0,
+ 0xd0, 0x4f, 0x2e, 0xe0,
+ 0xc1, 0x2e, 0x4b, 0xef, 0x90, 0x12, 0x47, 0xe0, 0xac, 0x01, 0x00, 0xd0,
+ 0xef, 0xe0, 0x12, 0x01,
+ 0x00, 0xf3, 0x21, 0x3e, 0x0d, 0x33, 0x77, 0x12, 0x22, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x72, 0x0c, 0xfe, 0x00, 0x64, 0x0b, 0xe3, 0xff, 0x1b, 0xdf, 0xc4, 0xe3,
+ 0x8b, 0xee, 0xd0, 0xc0,
+ 0xeb, 0xcf, 0x10, 0x04, 0xd0, 0xdd, 0x12, 0x46, 0x01, 0x00, 0x0f, 0x30,
+ 0xe1, 0xb6, 0x11, 0x21,
+ 0xf1, 0xc0, 0x3c, 0x70, 0x73, 0x4f, 0x0e, 0x00, 0x01, 0xfa, 0x0c, 0x1e,
+ 0x0d, 0x0d, 0xf0, 0x00,
+ 0x61, 0x0e, 0x10, 0x02, 0x1c, 0x0c, 0xf0, 0xce, 0xdf, 0x30, 0x0d, 0xb8,
+ 0xfe, 0x1d, 0x30, 0xdf,
+ 0xc2, 0x27, 0x52, 0x0e, 0xbb, 0x00, 0x1f, 0x00, 0x00, 0xc1, 0x01, 0x20,
+ 0x0c, 0x0e, 0x10, 0x52,
+ 0x3e, 0x20, 0x06, 0xc3, 0x00, 0x0f, 0x04, 0x32, 0x3e, 0x49, 0x40, 0x03,
+ 0xc0, 0xde, 0xf2, 0xb5,
+ 0xe0, 0xaf, 0x01, 0x25, 0xd0, 0xb1, 0xe5, 0x12, 0x21, 0x0f, 0x1f, 0x40,
+ 0x02, 0xd2, 0x00, 0xf0,
+ 0xed, 0x80, 0x07, 0xf2, 0x0d, 0x0d, 0x21, 0x24, 0xd0, 0xb0, 0x02, 0xdd,
+ 0x0b, 0x0f, 0x24, 0x23,
+ 0xfb, 0x2e, 0x7f, 0x70, 0x20, 0x0c, 0x0e, 0x3e, 0x0c, 0x0f, 0x0f, 0xfc,
+ 0x2f, 0x2e, 0xfb, 0xde,
+ 0x00, 0xf2, 0x00, 0xe0, 0x07, 0x77, 0x20, 0xe0, 0xc0, 0xf2, 0x11, 0x3f,
+ 0x0f, 0xe0, 0x70, 0x41,
+ 0x21, 0x00, 0x03, 0x30, 0xfa, 0x11, 0x31, 0x43, 0x00, 0xbb, 0xcf, 0x0e,
+ 0xfd, 0xdd, 0xae, 0xf0,
+ 0xf0, 0xdb, 0xcc, 0x00, 0x06, 0x21, 0x11, 0x35, 0x32, 0x00, 0x40, 0x01,
+ 0x03, 0x01, 0x73, 0x0e,
+ 0xe9, 0xd0, 0xee, 0x00, 0xb0, 0xff, 0x30, 0xe0, 0x90, 0xf0, 0xe0, 0xf1,
+ 0xd4, 0xc2, 0x11, 0x10,
+ 0xdc, 0xde, 0xdf, 0x06, 0x36, 0x62, 0x40, 0x5e, 0x11, 0x00, 0x10, 0x32,
+ 0x01, 0xfe, 0xca, 0x0e,
+ 0x3e, 0x0d, 0xfe, 0xd0, 0xd1, 0x9f, 0xfa, 0xe2, 0x00, 0x1a, 0x2c, 0x4e,
+ 0x71, 0x1f, 0x0b, 0x00,
+ 0x41, 0x00, 0x0c, 0x00, 0x22, 0x11, 0x00, 0xe3, 0xc4, 0xf1, 0xd0, 0x0f,
+ 0x2f, 0xb4, 0x00, 0x5b,
+ 0x2d, 0xf1, 0x25, 0x7f, 0x0c, 0xf0, 0x07, 0x14, 0x0e, 0x1f, 0x30, 0xf2,
+ 0x82, 0xe0, 0x11, 0x20,
+ 0xf1, 0xd1, 0x0d, 0x0b, 0x1e, 0x00, 0xf2, 0xbf, 0xcc, 0xe1, 0x15, 0x30,
+ 0x01, 0xf0, 0x0d, 0x4e,
+ 0xd0, 0x95, 0x02, 0x12, 0x00, 0xdb, 0xef, 0x1d, 0x1f, 0xe0, 0xc7, 0xe0,
+ 0xdf, 0xae, 0xbf, 0xe0,
+ 0x01, 0x3d, 0x1c, 0xc1, 0x04, 0x20, 0x1e, 0x10, 0x53, 0x40, 0x5c, 0x14,
+ 0x17, 0x32, 0x2e, 0x0d,
+ 0xef, 0xc0, 0x2c, 0x5f, 0x00, 0xd5, 0x11, 0x52, 0xf2, 0xbf, 0x0f, 0xf2,
+ 0xf5, 0x02, 0x01, 0x01,
+ 0x0f, 0xf0, 0xe0, 0x32, 0x5b, 0xfb, 0xc0, 0x00, 0x00, 0x2d, 0x0d, 0x0e,
+ 0x3f, 0x2d, 0xb5, 0x06,
+ 0x30, 0x7d, 0x70, 0x0e, 0x1e, 0x1d, 0x30, 0xf2, 0xd5, 0xf0, 0xf0, 0xff,
+ 0x0e, 0xd0, 0xd7, 0xd5,
+ 0x02, 0x12, 0xd1, 0xc2, 0x01, 0xec, 0x70, 0x61, 0x02, 0xfe, 0xec, 0xf1,
+ 0x33, 0x1d, 0xea, 0xaf,
+ 0x0f, 0xe0, 0xa1, 0xef, 0xeb, 0xee, 0xf0, 0xfd, 0xf8, 0x0c, 0x22, 0x74,
+ 0x10, 0x2f, 0x0e, 0x00,
+ 0x4f, 0x20, 0x03, 0x31, 0x30, 0x0e, 0x10, 0xf3, 0xbc, 0xfd, 0x03, 0xf2,
+ 0xd2, 0xf7, 0xd0, 0xfd,
+ 0xbc, 0xdd, 0xdd, 0x0d, 0x4d, 0x4d, 0xf8, 0xdd, 0x20, 0x30, 0x10, 0x00,
+ 0x01, 0x30, 0x12, 0xe7,
+ 0xd1, 0x41, 0x3f, 0xe2, 0xe5, 0x50, 0x70, 0x00, 0xc2, 0x13, 0x2e, 0x3e,
+ 0x00, 0x20, 0x14, 0x05,
+ 0x35, 0x60, 0x0c, 0x0f, 0x00, 0x13, 0xf0, 0x8f, 0xf4, 0xf3, 0xef, 0xfe,
+ 0xe3, 0x14, 0x1f, 0x0f,
+ 0x01, 0xd3, 0xee, 0xbd, 0xe1, 0xe4, 0x07, 0x27, 0x62, 0x6d, 0x3e, 0x00,
+ 0x02, 0x31, 0x12, 0xf3,
+ 0xd0, 0xff, 0xcd, 0x02, 0xf3, 0xcf, 0xee, 0xd6, 0xc0, 0xdf, 0x20, 0x00,
+ 0x0c, 0x19, 0xe0, 0x90,
+ 0xf0, 0x0d, 0x0c, 0x2e, 0x4d, 0x7a, 0x2d, 0x1f, 0x1f, 0x3e, 0xe1, 0xd5,
+ 0xf0, 0xfd, 0xef, 0x01,
+ 0xd4, 0xa1, 0xe1, 0xd3, 0x00, 0x4c, 0x70, 0x31, 0x00, 0x28, 0x5e, 0x32,
+ 0xf1, 0xf0, 0x22, 0x41,
+ 0xf0, 0xed, 0xf3, 0x07, 0x17, 0xe0, 0xc0, 0xe0, 0xa1, 0xe0, 0xf0, 0xf0,
+ 0xe2, 0x00, 0x31, 0x2f,
+ 0x0c, 0x4f, 0x72, 0x32, 0xe0, 0xd4, 0xf2, 0x00, 0x4c, 0x08, 0xd0, 0xe1,
+ 0xf3, 0xe1, 0x90, 0xd2,
+ 0xc0, 0xc0, 0xfa, 0xff, 0xe0, 0xfe, 0x0f, 0xee, 0x01, 0x44, 0x1d, 0x7c,
+ 0x31, 0x26, 0x00, 0xff,
+ 0x01, 0x35, 0x0f, 0xed, 0xff, 0x81, 0x03, 0x2f, 0x4f, 0xe0, 0xce, 0x2d,
+ 0x30, 0x25, 0x1f, 0x6e,
+ 0x35, 0x14, 0x01, 0x0d, 0xec, 0xc0, 0x0f, 0x1a, 0x3e, 0xd0, 0xbf, 0xff,
+ 0xfd, 0x0e, 0xca, 0xee,
+ 0xff, 0xef, 0xd0, 0xf4, 0x04, 0x0f, 0x0a, 0xf0, 0x00, 0x43, 0x4f, 0x3f,
+ 0x40, 0x5f, 0x20, 0xf6,
+ 0x02, 0x71, 0x40, 0x01, 0x0f, 0x0f, 0x1d, 0x00, 0x01, 0xef, 0xde, 0x02,
+ 0xe3, 0x81, 0xdd, 0x0d,
+ 0x0b, 0xc0, 0xe3, 0xf3, 0x01, 0x21, 0xe5, 0x05, 0x01, 0xef, 0xe0, 0x20,
+ 0x70, 0xf0, 0xc0, 0x17,
+ 0x45, 0x0f, 0xa0, 0xf0, 0xf2, 0x0d, 0xfd, 0x03, 0x04, 0xed, 0xde, 0x20,
+ 0x71, 0x3f, 0x00, 0xf5,
+ 0x01, 0x21, 0x11, 0x30, 0x1e, 0xf0, 0xa6, 0xff, 0x0b, 0x1e, 0x00, 0x0e,
+ 0x00, 0x00, 0x71, 0x6a,
+ 0x1d, 0x00, 0xf2, 0x02, 0x32, 0x01, 0xb2, 0xe5, 0xe1, 0x00, 0x4f, 0x1f,
+ 0x03, 0x36, 0xff, 0xdf,
+ 0x17, 0x73, 0x10, 0xdd, 0xf0, 0x34, 0x70, 0x0f, 0x0d, 0x10, 0x30, 0xec,
+ 0xba, 0xfe, 0x10, 0x1f,
+ 0x11, 0x10, 0x0f, 0xe0, 0xc0, 0xe7, 0x02, 0xe0, 0xc1, 0xd0, 0xee, 0xea,
+ 0x30, 0x70, 0x0d, 0x0e,
+ 0x1f, 0x3c, 0x1e, 0x5e, 0x1e, 0x0f, 0xdd, 0x02, 0x07, 0xe3, 0x80, 0xe4,
+ 0x03, 0x12, 0xc0, 0xd0,
+ 0xe7, 0x25, 0x10, 0xe2, 0x00, 0x03, 0x20, 0x00, 0x00, 0x51, 0x10, 0x03,
+ 0xe1, 0x1a, 0x7f, 0x10,
+ 0xe0, 0xf2, 0xd0, 0xdd, 0xe3, 0xd1, 0xa0, 0xc0, 0xb0, 0xfe, 0x08, 0x4d,
+ 0x30, 0x00, 0x1e, 0x2a,
+ 0x4f, 0x1e, 0x2d, 0x10, 0x4f, 0x70, 0x10, 0x31, 0x1f, 0xfe, 0xdf, 0x0f,
+ 0x1e, 0xff, 0xac, 0xf2,
+ 0xf7, 0x00, 0xce, 0xff, 0x00, 0x43, 0x26, 0x13, 0x27, 0x11, 0x42, 0x31,
+ 0x00, 0x10, 0x00, 0x3e,
+ 0x2c, 0xcf, 0xef, 0xfe, 0x0c, 0x0f, 0x00, 0x8e, 0xde, 0xc2, 0xd3, 0xe0,
+ 0xfe, 0xdf, 0x00, 0x3f,
+ 0x70, 0x41, 0x04, 0x07, 0x25, 0x52, 0x0f, 0x0d, 0xff, 0x02, 0x13, 0x00,
+ 0xa0, 0xf1, 0xf3, 0xcd,
+ 0xee, 0x00, 0x0f, 0xfd, 0xc5, 0xf6, 0xd1, 0xde, 0xec, 0x0e, 0x6d, 0x3f,
+ 0x0f, 0x00, 0x4e, 0x2d,
+ 0x4c, 0x1b, 0x20, 0x25, 0x10, 0x00, 0x20, 0x05, 0xc2, 0x02, 0xcf, 0xfe,
+ 0xf0, 0x14, 0xe0, 0x9d,
+ 0xf0, 0xf2, 0x00, 0x09, 0x1d, 0x1f, 0x60, 0x42, 0x20, 0x1e, 0x24, 0x05,
+ 0xc1, 0xf2, 0xfe, 0x0d,
+ 0x00, 0x46, 0x71, 0x20, 0xfc, 0xe0, 0x00, 0x10, 0xfe, 0xc0, 0xd5, 0x02,
+ 0xe1, 0x10, 0x7f, 0x60,
+ 0x04, 0x01, 0x01, 0x15, 0x02, 0xf2, 0x00, 0x3d, 0xef, 0xd7, 0xf4, 0xd1,
+ 0xe0, 0xad, 0xec, 0xff,
+ 0xdd, 0xdd, 0x8d, 0xf4, 0x03, 0xdc, 0xdd, 0xe0, 0x00, 0x5c, 0x1a, 0xf0,
+ 0xf3, 0x00, 0x6f, 0x11,
+ 0x0b, 0x2b, 0x5f, 0x00, 0x0c, 0x0e, 0xe0, 0x01, 0xc3, 0xfe, 0xcc, 0xff,
+ 0x0f, 0x31, 0x21, 0x20,
+ 0x2e, 0x0c, 0xf0, 0xd0, 0x0f, 0x4e, 0x20, 0x2f, 0x6e, 0x00, 0xc7, 0xe1,
+ 0xe0, 0x01, 0xc2, 0xf1,
+ 0x00, 0x41, 0x37, 0x10, 0x0e, 0x00, 0x01, 0xf0, 0x80, 0x04, 0x00, 0x21,
+ 0x22, 0xe4, 0xc7, 0x02,
+ 0x00, 0xf1, 0x03, 0x50, 0x30, 0x62, 0x10, 0x10, 0x0d, 0xfe, 0x1d, 0x2e,
+ 0x0c, 0x0f, 0xee, 0xf1,
+ 0x90, 0xc1, 0xfd, 0x0b, 0x00, 0xf1, 0xef, 0x1d, 0x42, 0x47, 0x62, 0x11,
+ 0x13, 0x01, 0x01, 0x05,
+ 0x26, 0x02, 0x11, 0x71, 0x1f, 0x0b, 0xc0, 0xf1, 0xf3, 0xc0, 0x0f, 0xdf,
+ 0xdf, 0xed, 0x8c, 0xfd,
+ 0xfb, 0x0f, 0x1f, 0x0c, 0x0d, 0x2d, 0x39, 0x1f, 0x10, 0x4d, 0x40, 0x03,
+ 0xf4, 0xe1, 0x00, 0x0f,
+ 0x03, 0x16, 0x70, 0x4e, 0x13, 0xe2, 0xfe, 0x2d, 0x12, 0xd3, 0x0a, 0x70,
+ 0x33, 0x07, 0xb0, 0xfc,
+ 0x00, 0x01, 0xf0, 0xd0, 0xf1, 0x03, 0x42, 0xe1, 0xaf, 0xfe, 0x00, 0x27,
+ 0x22, 0xf0, 0xee, 0x0f,
+ 0x10, 0x53, 0x00, 0xac, 0x0f, 0x2d, 0x20, 0xd7, 0x03, 0x70, 0x2d, 0x0d,
+ 0x00, 0x00, 0x02, 0x00,
+ 0x0d, 0x11, 0xc0, 0xe9, 0xfe, 0xde, 0xc2, 0xd4, 0xd0, 0xe0, 0xe0, 0xdf,
+ 0x8d, 0xe0, 0xd5, 0xf7,
+ 0x22, 0x13, 0x10, 0x0b, 0x2e, 0x70, 0x20, 0x23, 0x0e, 0x0e, 0x30, 0x11,
+ 0x43, 0x3f, 0x0a, 0x3f,
+ 0x60, 0x04, 0x03, 0xd0, 0xcc, 0xf0, 0x00, 0x7d, 0x1a, 0x0e, 0xfd, 0xfe,
+ 0x32, 0x32, 0xfe, 0xe9,
+ 0xff, 0x00, 0x00, 0xc3, 0xe1, 0xb0, 0x0b, 0xee, 0xdf, 0x0f, 0x4d, 0x2d,
+ 0x10, 0x22, 0xe0, 0xa8,
+ 0xee, 0x00, 0x0f, 0xfe, 0x00, 0x71, 0x32, 0x1e, 0x4a, 0x41, 0x32, 0x04,
+ 0x03, 0x24, 0x43, 0x02,
+ 0xc1, 0xe1, 0xd3, 0xc2, 0xb5, 0x03, 0xf0, 0xd0, 0xd5, 0xf4, 0x00, 0x50,
+ 0x25, 0x13, 0x0e, 0xed,
+ 0xc3, 0x04, 0xed, 0xaa, 0x01, 0x35, 0x00, 0xd0, 0xa0, 0xf2, 0xe2, 0xf0,
+ 0xe0, 0xf0, 0xe0, 0x1f,
+ 0x7e, 0x21, 0x04, 0x11, 0x2f, 0x3a, 0x3f, 0x2d, 0x3c, 0x5d, 0x1b, 0x2f,
+ 0x0d, 0x0b, 0x2e, 0x4f,
+ 0x20, 0x12, 0x00, 0x02, 0xff, 0xe0, 0xd2, 0xc5, 0x05, 0x02, 0x52, 0x2e,
+ 0x0e, 0xf1, 0x67, 0x35,
+ 0x0f, 0x00, 0x00, 0x01, 0xee, 0xee, 0x0f, 0x6f, 0x4f, 0x1f, 0xe0, 0xd0,
+ 0xf8, 0x0e, 0x21, 0x22,
+ 0x23, 0xa0, 0xd0, 0x02, 0x22, 0x21, 0xc1, 0x02, 0x2f, 0x30, 0x05, 0x02,
+ 0x10, 0x20, 0x24, 0x24,
+ 0x0e, 0xdd, 0xe2, 0xb0, 0x0b, 0x20, 0x2e, 0xa8, 0xdf, 0xce, 0xd0, 0xc0,
+ 0xe0, 0xf0, 0xf4, 0x13,
+ 0x24, 0x00, 0xd3, 0x07, 0x11, 0x30, 0x00, 0xb1, 0xf0, 0x00, 0x60, 0x01,
+ 0x01, 0xe1, 0x2f, 0x2e,
+ 0xea, 0xef, 0x2f, 0x70, 0x0e, 0xf0, 0xd7, 0x02, 0xfd, 0x0c, 0x0c, 0x3e,
+ 0x2e, 0x0e, 0xe0, 0xbb,
+ 0x00, 0x40, 0x10, 0xee, 0x3f, 0x72, 0x12, 0x00, 0x04, 0x12, 0x18, 0x0d,
+ 0x7e, 0x10, 0x0d, 0xf0,
+ 0xe0, 0x00, 0xf4, 0xf0, 0xd2, 0xa2, 0xe4, 0xf7, 0x02, 0xe1, 0x11, 0x73,
+ 0x31, 0x00, 0x20, 0x7c,
+ 0x1c, 0x20, 0x05, 0x01, 0x00, 0xdb, 0xaf, 0xff, 0xe0, 0xf0, 0xf1, 0x02,
+ 0x15, 0x23, 0xfe, 0xe0,
+ 0xf0, 0xde, 0x0f, 0x35, 0xc0, 0xe8, 0x20, 0x30, 0x00, 0xfe, 0x2e, 0x7f,
+ 0x10, 0xd1, 0xef, 0xfd,
+ 0xe0, 0xe7, 0xe3, 0xe0, 0xcf, 0x93, 0xd7, 0xe0, 0xc1, 0xf1, 0xde, 0x1c,
+ 0x41, 0x10, 0x3e, 0x70,
+ 0x41, 0x10, 0x4e, 0x2e, 0x08, 0x20, 0x21, 0x23, 0xf2, 0xb4, 0xf4, 0xf0,
+ 0xd0, 0xcc, 0xf0, 0xb1,
+ 0xf0, 0xfc, 0x0e, 0xf0, 0xf0, 0x00, 0x20, 0x65, 0x2f, 0x2f, 0x13, 0x23,
+ 0x0e, 0x2d, 0x30, 0x3f,
+ 0x0c, 0x2c, 0x70, 0x20, 0xee, 0xdc, 0x0c, 0xd0, 0xcf, 0xad, 0x00, 0x00,
+ 0x0e, 0x13, 0x47, 0x34,
+ 0x1d, 0x20, 0x47, 0x03, 0xe1, 0x41, 0x53, 0x20, 0xe0, 0xfe, 0xf0, 0xe4,
+ 0xcf, 0xdd, 0xdf, 0xfc,
+ 0xdf, 0x80, 0xcc, 0xdc, 0xde, 0xe0, 0xe3, 0xf0, 0xef, 0x0a, 0x3e, 0x5e,
+ 0x21, 0x14, 0x00, 0x21,
+ 0x5e, 0x2f, 0x20, 0x30, 0x4e, 0x10, 0x27, 0xf0, 0xe0, 0xa0, 0xdd, 0xf4,
+ 0xf3, 0x8d, 0x0c, 0xf0,
+ 0x0e, 0xf8, 0x1e, 0x40, 0x1e, 0x0d, 0xec, 0x30, 0x00, 0xdc, 0xf0, 0x75,
+ 0x22, 0xf0, 0xed, 0x12,
+ 0x43, 0x00, 0xad, 0x00, 0xf0, 0x0d, 0x1a, 0x0f, 0xdf, 0xfe, 0x1d, 0x41,
+ 0x07, 0xf1, 0x41, 0x74,
+ 0x61, 0x01, 0x01, 0x03, 0x2f, 0x1c, 0xf2, 0xf7, 0xf0, 0xed, 0xf1, 0xb4,
+ 0xee, 0xff, 0x01, 0x14,
+ 0x04, 0xd1, 0xee, 0x0e, 0x0f, 0x50, 0xf1, 0xf0, 0x21, 0x72, 0x27, 0x03,
+ 0xf0, 0xe0, 0x00, 0xf2,
+ 0x03, 0x55, 0x43, 0x44, 0x20, 0x01, 0x04, 0x04, 0x02, 0x82, 0xd1, 0xf0,
+ 0xcf, 0xe8, 0xbe, 0x00,
+ 0x00, 0x11, 0x0f, 0xfc, 0x0e, 0x2e, 0x5f, 0x0e, 0x29, 0x0f, 0x00, 0x0d,
+ 0xfd, 0xef, 0xdf, 0xf8,
+ 0x3c, 0x5f, 0x00, 0xe1, 0xee, 0x10, 0x63, 0x2f, 0x39, 0x6f, 0x00, 0x10,
+ 0x0e, 0x00, 0xd0, 0x07,
+ 0x43, 0x12, 0x20, 0x00, 0x03, 0x11, 0x21, 0x03, 0xe1, 0xf0, 0x00, 0x0e,
+ 0x59, 0x60, 0x00, 0x01,
+ 0xd5, 0x00, 0x0f, 0xd0, 0xa2, 0xf2, 0xff, 0xe1, 0xd4, 0xe0, 0x0e, 0xf1,
+ 0x06, 0x51, 0x20, 0x00,
+ 0x63, 0x64, 0xff, 0xcd, 0x3a, 0x4e, 0xdd, 0xee, 0x00, 0x33, 0xef, 0xbb,
+ 0x11, 0x00, 0xe0, 0xdd,
+ 0xc4, 0x05, 0xff, 0x0e, 0x02, 0x22, 0x1b, 0x2e, 0x74, 0x04, 0x04, 0x13,
+ 0x12, 0x0d, 0x2d, 0x50,
+ 0x2f, 0x10, 0x10, 0x02, 0x00, 0xdb, 0xcd, 0xc0, 0x0a, 0x2d, 0xef, 0xbf,
+ 0x1d, 0x0d, 0xac, 0xef,
+ 0x1c, 0x2a, 0x2e, 0x11, 0x60, 0x11, 0x10, 0x31, 0x10, 0x0e, 0x00, 0x00,
+ 0xdd, 0xde, 0xa1, 0xe0,
+ 0xdf, 0xec, 0xde, 0x00, 0x2f, 0x70, 0x51, 0x03, 0x32, 0x1b, 0x1b, 0x0e,
+ 0xde, 0x0f, 0x41, 0x12,
+ 0xd0, 0xd0, 0x07, 0xd0, 0xb2, 0xd4, 0x04, 0xf1, 0x91, 0x06, 0x01, 0xee,
+ 0xe0, 0xe0, 0x01, 0x53,
+ 0x0f, 0xeb, 0xf0, 0x30, 0x10, 0x40, 0x2f, 0xfc, 0x00, 0x42, 0xe4, 0xc3,
+ 0xd1, 0xe2, 0xf5, 0xb2,
+ 0xd4, 0xd4, 0xe2, 0x81, 0xee, 0x0a, 0xef, 0x01, 0x10, 0x1f, 0x6d, 0x3f,
+ 0x4e, 0x3f, 0x1f, 0x20,
+ 0x10, 0x0e, 0xcd, 0x02, 0x12, 0x0b, 0xfe, 0xe1, 0x05, 0xf1, 0xf0, 0x0e,
+ 0x3d, 0x01, 0xf3, 0xf0,
+ 0xdf, 0xf3, 0x02, 0x3b, 0x6d, 0x2e, 0x50, 0x30, 0x16, 0x23, 0x20, 0x2e,
+ 0x23, 0x04, 0xf0, 0x0e,
+ 0x0c, 0x0c, 0xe0, 0xa2, 0xe1, 0xab, 0x0d, 0x00, 0xd1, 0xfc, 0x0e, 0x12,
+ 0x1f, 0x6d, 0x1f, 0x0b,
+ 0x0b, 0x0d, 0x2f, 0x4f, 0x02, 0xf0, 0xc1, 0xe6, 0xe2, 0x0f, 0xbe, 0xf5,
+ 0x11, 0xf1, 0x00, 0x05,
+ 0x02, 0xd0, 0x01, 0x34, 0xf0, 0xe0, 0x31, 0x47, 0xf2, 0xd0, 0x1e, 0x21,
+ 0x86, 0xd0, 0x02, 0x10,
+ 0xd1, 0x80, 0x02, 0x04, 0xa0, 0x0d, 0x00, 0x03, 0x10, 0x00, 0x3d, 0x3e,
+ 0x08, 0x0c, 0x10, 0x21,
+ 0x00, 0xce, 0x0e, 0x2f, 0x08, 0xee, 0x40, 0x60, 0x2f, 0x2f, 0x0f, 0x2f,
+ 0x0f, 0xfe, 0xeb, 0xff,
+ 0x20, 0x40, 0x07, 0xf1, 0xe0, 0x10, 0x20, 0x02, 0x12, 0x30, 0xf0, 0xf4,
+ 0x03, 0x4f, 0x39, 0x10,
+ 0x30, 0x70, 0x1e, 0x0d, 0xd0, 0xe0, 0xcc, 0xed, 0xed, 0x80, 0xe0, 0x01,
+ 0x47, 0x01, 0xe1, 0x01,
+ 0x23, 0x02, 0x21, 0x01, 0x05, 0x32, 0x44, 0x61, 0x00, 0x1c, 0x4b, 0x00,
+ 0x00, 0xc5, 0xd0, 0xe0,
+ 0xf0, 0xd4, 0x8f, 0xff, 0xd3, 0xe0, 0xe1, 0xe5, 0xc1, 0xdc, 0xff, 0x20,
+ 0x22, 0x00, 0x0c, 0x70,
+ 0x22, 0x00, 0x00, 0x40, 0x33, 0x32, 0x04, 0x25, 0xf0, 0xfc, 0xef, 0x12,
+ 0xf2, 0xdd, 0x58, 0x2f,
+ 0xef, 0xd0, 0xdd, 0xee, 0x10, 0x50, 0x2e, 0x0f, 0xaf, 0x02, 0x17, 0x03,
+ 0xf4, 0xd0, 0x0f, 0x6f,
+ 0x33, 0x41, 0x2c, 0x4d, 0x22, 0x01, 0xd9, 0x0e, 0x0b, 0x0f, 0x00, 0x20,
+ 0x00, 0xed, 0xf2, 0x55,
+ 0x40, 0x0f, 0x13, 0x57, 0x00, 0xc0, 0xe1, 0x02, 0x40, 0x40, 0x01, 0x21,
+ 0xf0, 0xcf, 0x13, 0x01,
+ 0x03, 0xc7, 0xd0, 0xde, 0xdd, 0x9f, 0xc2, 0xee, 0xeb, 0xf1, 0x05, 0xfe,
+ 0x0d, 0x10, 0x2c, 0x1d,
+ 0x7e, 0x1f, 0xfe, 0xcb, 0x0e, 0x0f, 0x0f, 0xbc, 0x00, 0x16, 0x00, 0x03,
+ 0x39, 0x00, 0x3d, 0x00,
+ 0x14, 0x27, 0x36, 0x32, 0x02, 0x28, 0xff, 0x32, 0xdc, 0xbd, 0xdc, 0xcd,
+ 0xdc, 0xcd, 0xcb, 0xdd,
+ 0xcd, 0xdd, 0xcc, 0xdc, 0xec, 0x0e, 0xfd, 0xed, 0xfd, 0xfc, 0x0e, 0x0e,
+ 0x2d, 0x1b, 0x0d, 0xdb,
+ 0xee, 0x8c, 0xcd, 0xbc, 0xee, 0xce, 0xcd, 0xdc, 0xcd, 0xee, 0xdd, 0xde,
+ 0xdf, 0xd0, 0xe0, 0xdf,
+ 0xff, 0xff, 0x11, 0x31, 0x3f, 0x2c, 0x3a, 0x6e, 0x4d, 0x4b, 0x2b, 0x4d,
+ 0x3c, 0x2d, 0x2d, 0x1b,
+ 0x0d, 0x0e, 0xed, 0xdd, 0xdd, 0xcd, 0xcd, 0xed, 0x0e, 0x0d, 0x1e, 0x5f,
+ 0x70, 0x40, 0x41, 0x33,
+ 0x54, 0x35, 0x33, 0x23, 0x36, 0x33, 0x24, 0x13, 0x04, 0xf3, 0xe5, 0xc3,
+ 0xb2, 0xd1, 0xc3, 0xd3,
+ 0xd3, 0xe2, 0xd2, 0xc2, 0xd1, 0xe0, 0xd0, 0xd0, 0xe0, 0xf1, 0xe1, 0x06,
+ 0x02, 0x11, 0x00, 0x03,
+ 0x02, 0x0e, 0xda, 0xdd, 0x8c, 0xda, 0xcc, 0xdc, 0xec, 0xee, 0xdd, 0xbe,
+ 0xcd, 0xde, 0xdf, 0xde,
+ 0xef, 0xdf, 0x0f, 0x30, 0x01, 0xe3, 0x05, 0x03, 0xd3, 0x93, 0x05, 0x12,
+ 0xf3, 0xd5, 0x02, 0x22,
+ 0x02, 0xf1, 0x10, 0x30, 0x21, 0x72, 0x53, 0x34, 0x33, 0x23, 0x33, 0x41,
+ 0x31, 0x45, 0x65, 0x32,
+ 0x41, 0x53, 0x34, 0x42, 0x20, 0x31, 0x33, 0x33, 0x13, 0x02, 0xf2, 0xd0,
+ 0xbd, 0xd0, 0xc7, 0xd6,
+ 0xd2, 0xd3, 0xd4, 0xb4, 0xe3, 0xd5, 0xc2, 0xd2, 0xc3, 0xe5, 0xe3, 0xe2,
+ 0xe3, 0xe4, 0xd4, 0xd3,
+ 0xc4, 0xc5, 0xc2, 0xc2, 0xd2, 0xe2, 0xc2, 0xc2, 0xd1, 0xf3, 0x04, 0x03,
+ 0xe4, 0x03, 0x03, 0x22,
+ 0x22, 0x23, 0x14, 0x12, 0x00, 0xff, 0x8c, 0xca, 0xcc, 0xdd, 0xcb, 0xdd,
+ 0xbc, 0xde, 0xdd, 0xec,
+ 0xed, 0xdc, 0xed, 0x0c, 0x0d, 0xec, 0xfd, 0x1c, 0x2d, 0x1c, 0x3d, 0x6d,
+ 0x5d, 0x3c, 0x5d, 0x3d,
+ 0x3d, 0x5e, 0x3d, 0x5d, 0x2e, 0x1d, 0x2c, 0x1e, 0x1d, 0x1e, 0x0d, 0xdd,
+ 0xdd, 0xdc, 0xde, 0xce,
+ 0xcd, 0xee, 0xef, 0x00, 0xf3, 0xf6, 0xf3, 0x03, 0x12, 0x05, 0x05, 0x23,
+ 0x02, 0x92, 0xc3, 0xc3,
+ 0xc3, 0xc2, 0xc3, 0xc3, 0xe1, 0xd2, 0xd4, 0xd4, 0xc1, 0xe1, 0xd1, 0xc0,
+ 0xee, 0x0d, 0xfe, 0x00,
+ 0x04, 0x03, 0x26, 0x26, 0x24, 0x43, 0x63, 0x44, 0x22, 0x22, 0x21, 0x12,
+ 0x11, 0x00, 0xe1, 0xc0,
+ 0xdf, 0xbd, 0xed, 0xee, 0xee, 0xfd, 0x1e, 0x41, 0x30, 0x2d, 0x38, 0x6d,
+ 0x4d, 0x40, 0x32, 0x40,
+ 0x30, 0x37, 0x47, 0x34, 0x33, 0x32, 0x43, 0x42, 0x32, 0x44, 0x33, 0x31,
+ 0x41, 0x31, 0x41, 0x30,
+ 0x2b, 0x3d, 0x4e, 0x30, 0x3f, 0x3d, 0x4c, 0x2d, 0x2b, 0x3e, 0x4e, 0x2d,
+ 0x2d, 0x1e, 0x20, 0x00,
+ 0x1e, 0x20, 0x55, 0x37, 0x53, 0x25, 0x22, 0x23, 0x34, 0x13, 0x03, 0x14,
+ 0x25, 0x03, 0xe3, 0xc4,
+ 0xf3, 0xe3, 0xb4, 0xb2, 0xd4, 0xd3, 0xc4, 0xb3, 0xe3, 0xd3, 0xc3, 0xd4,
+ 0xc3, 0xd3, 0xb4, 0xe2,
+ 0xc3, 0xe3, 0xf2, 0x03, 0x01, 0x12, 0x23, 0x34, 0x22, 0x20, 0x2f, 0x2f,
+ 0x1f, 0x0d, 0xe9, 0xdc,
+ 0xad, 0xde, 0xdf, 0xce, 0xcd, 0xcc, 0xff, 0x01, 0x03, 0x04, 0x33, 0x13,
+ 0x42, 0x51, 0x4f, 0x3c,
+ 0x3c, 0x5d, 0x3f, 0x30, 0x3f, 0x4e, 0x2d, 0x3e, 0x31, 0x36, 0x44, 0x02,
+ 0xf1, 0xff, 0xfd, 0xfc,
+ 0x0c, 0x0a, 0x6b, 0x2d, 0x4c, 0x5d, 0x4c, 0x4d, 0x3b, 0x3e, 0x4e, 0x3d,
+ 0x2c, 0x1d, 0x0d, 0x0d,
+ 0xfc, 0xee, 0xbd, 0xde, 0xde, 0xdd, 0xdd, 0xde, 0xbf, 0xe0, 0xef, 0xef,
+ 0xff, 0xfe, 0xff, 0xe0,
+ 0xce, 0xc0, 0xe7, 0xc4, 0xc3, 0xc5, 0xc4, 0xd4, 0xc2, 0xd3, 0xe5, 0xf3,
+ 0x03, 0xf3, 0xd4, 0xd3,
+ 0xf3, 0xd3, 0xa4, 0xc2, 0xd2, 0xb3, 0xd4, 0xc2, 0xd3, 0xe4, 0xd3, 0xe4,
+ 0x03, 0xf2, 0xf2, 0xf2,
+ 0x02, 0x03, 0x20, 0x0d, 0x1b, 0x3d, 0x2b, 0x2b, 0x6d, 0x5d, 0x4d, 0x4d,
+ 0x4f, 0x30, 0x32, 0x62,
+ 0x23, 0x24, 0x43, 0x34, 0x34, 0x47, 0x33, 0x43, 0x33, 0x24, 0x44, 0x22,
+ 0x13, 0x12, 0x12, 0x03,
+ 0xf3, 0xf2, 0xf1, 0x02, 0x13, 0x44, 0x32, 0x43, 0x44, 0x24, 0x23, 0x33,
+ 0x04, 0x02, 0x01, 0x11,
+ 0x00, 0x0e, 0x5d, 0x20, 0xf1, 0xe0, 0xe1, 0xd4, 0xd3, 0xb3, 0xe1, 0xee,
+ 0xe9, 0xcb, 0x9c, 0xcb,
+ 0xcd, 0xdc, 0xcd, 0xde, 0xbe, 0xdd, 0xde, 0xde, 0xbd, 0xee, 0xde, 0xdc,
+ 0xdd, 0xec, 0xfe, 0xfc,
+ 0xea, 0xfd, 0xfc, 0xfc, 0xeb, 0xdd, 0xcc, 0xbd, 0xbc, 0xdd, 0xcd, 0xdc,
+ 0xde, 0xee, 0xce, 0xde,
+ 0xee, 0xfe, 0xed, 0xdd, 0xfd, 0x0d, 0x2e, 0x3b, 0x4d, 0x5c, 0x4c, 0x3d,
+ 0x3b, 0x3e, 0x2e, 0x2e,
+ 0x0e, 0xee, 0xbd, 0xcd, 0xde, 0xad, 0xee, 0xdd, 0xdc, 0xee, 0xdf, 0xdf,
+ 0xfe, 0x1e, 0x4f, 0x5f,
+ 0x5e, 0x3f, 0x40, 0x30, 0x32, 0x57, 0x27, 0x25, 0x23, 0x15, 0x23, 0x14,
+ 0x03, 0x04, 0xf4, 0xe2,
+ 0xd3, 0xc3, 0xd3, 0xb4, 0xd2, 0xd2, 0xd3, 0xe2, 0xe2, 0xe2, 0xf1, 0xf1,
+ 0x01, 0x21, 0xf0, 0xfe,
+ 0x0b, 0x0c, 0xdd, 0xaa, 0xed, 0xdc, 0x8c, 0xed, 0xdc, 0xdd, 0xbc, 0xdd,
+ 0xdd, 0xee, 0xfd, 0xed,
+ 0xee, 0x0d, 0x2e, 0x50, 0x30, 0x60, 0x2e, 0x3f, 0x4f, 0x30, 0x3f, 0x2f,
+ 0x2f, 0x22, 0x07, 0x03,
+ 0xe5, 0xc2, 0xd2, 0xd4, 0x92, 0xe4, 0xe5, 0xe4, 0xe2, 0xf2, 0x03, 0x45,
+ 0x53, 0x22, 0x22, 0x32,
+ 0x53, 0x44, 0x34, 0x21, 0x00, 0x21, 0x21, 0x43, 0x33, 0x11, 0xef, 0xef,
+ 0x15, 0x04, 0x13, 0xc0,
+ 0xc0, 0x77, 0x24, 0xf0, 0xe0, 0x11, 0x43, 0x24, 0x11, 0x23, 0x44, 0x01,
+ 0x33, 0x44, 0x24, 0x02,
+ 0xd1, 0xd3, 0xf5, 0xa2, 0xb0, 0xc0, 0xf0, 0xf2, 0xf2, 0x00, 0x00, 0xf0,
+ 0x01, 0x01, 0x1f, 0x21,
+ 0x54, 0x10, 0x20, 0x30, 0x0f, 0x32, 0x77, 0x11, 0x0f, 0x0e, 0xfe, 0x00,
+ 0xed, 0xdb, 0xee, 0xec,
+ 0x0d, 0x0b, 0xed, 0xda, 0xdd, 0x7f, 0x1d, 0xaa, 0x0f, 0x3f, 0x0d, 0xed,
+ 0x0c, 0x3d, 0x7e, 0x1d,
+ 0x0c, 0x1d, 0x2e, 0x1d, 0x2d, 0x0c, 0x0e, 0x3f, 0x3e, 0xeb, 0xee, 0xde,
+ 0x8d, 0xed, 0xde, 0xbb,
+ 0xef, 0xff, 0xde, 0xfe, 0xfe, 0xcd, 0xfe, 0x11, 0x0f, 0x0f, 0x1e, 0x1f,
+ 0x77, 0x88, 0xdb, 0x75,
+ 0x01, 0xef, 0xf0, 0x00, 0xf0, 0x01, 0xe0, 0xbd, 0x00, 0x03, 0xee, 0xff,
+ 0x04, 0x00, 0xce, 0xf0,
+ 0x02, 0x05, 0xf0, 0xe0, 0x02, 0x00, 0xef, 0x22, 0x01, 0x88, 0x00, 0x55,
+ 0xf0, 0xfe, 0xfe, 0xee,
+ 0x11, 0x44, 0xef, 0xfe, 0x12, 0x11, 0xee, 0x00, 0x24, 0x01, 0xef, 0xfe,
+ 0x31, 0x42, 0x0e, 0x0f,
+ 0x74, 0x22, 0x0c, 0x2f, 0x2f, 0x0c, 0x30, 0x75, 0x10, 0x0f, 0xf9, 0xfe,
+ 0x51, 0x01, 0xfd, 0x0e,
+ 0x0e, 0x0e, 0x0d, 0x0d, 0x0e, 0x0f, 0x0d, 0x0d, 0x2c, 0x2b, 0x5d, 0x3d,
+ 0x7f, 0x30, 0x1d, 0x0a,
+ 0x3f, 0x30, 0x51, 0x0f, 0x0e, 0x44, 0x00, 0xfe, 0x12, 0x05, 0x02, 0x04,
+ 0xc0, 0xd1, 0x17, 0xf3,
+ 0x90, 0xf3, 0x05, 0xc1, 0xf2, 0xd3, 0xa1, 0x27, 0x02, 0x8f, 0xff, 0x04,
+ 0x02, 0xf0, 0xe0, 0xef,
+ 0x01, 0x04, 0xd0, 0xf0, 0xf0, 0x01, 0xf1, 0x01, 0x12, 0x11, 0x00, 0x0f,
+ 0x41, 0x32, 0x30, 0x51,
+ 0x2f, 0x20, 0x67, 0x11, 0x0d, 0x20, 0x57, 0x12, 0xed, 0xfe, 0x23, 0x01,
+ 0xec, 0x10, 0x20, 0x0d,
+ 0x1d, 0x1d, 0x0c, 0x2e, 0x1d, 0x0b, 0x3e, 0x4d, 0x5d, 0x2c, 0x3d, 0x3c,
+ 0x5e, 0x40, 0x0d, 0x0b,
+ 0x30, 0x60, 0x00, 0x0d, 0x1e, 0x31, 0x41, 0x1e, 0x4f, 0x0a, 0x3e, 0x62,
+ 0x20, 0x18, 0x2f, 0x40,
+ 0x10, 0x0f, 0x0e, 0x20, 0x11, 0xf0, 0xd0, 0xcf, 0xe1, 0xe6, 0xa1, 0xd0,
+ 0xe2, 0xf6, 0xd2, 0xc1,
+ 0xc1, 0xe3, 0xe3, 0xb1, 0xe2, 0x06, 0x03, 0xf4, 0x01, 0xe0, 0xf2, 0x03,
+ 0x24, 0x11, 0xd0, 0x10,
+ 0x21, 0xbd, 0xfe, 0x01, 0x04, 0x12, 0x9e, 0xe0, 0x37, 0x07, 0xa0, 0xe0,
+ 0xe0, 0x12, 0x12, 0x00,
+ 0x00, 0x01, 0x10, 0x20, 0x30, 0x0f, 0x1e, 0x6f, 0x2f, 0x30, 0x40, 0x2c,
+ 0x4f, 0x2e, 0x3b, 0x5f,
+ 0x1e, 0x0a, 0x4e, 0x71, 0x31, 0x2f, 0x32, 0x44, 0x10, 0x42, 0x24, 0x22,
+ 0x24, 0x35, 0x11, 0x11,
+ 0x45, 0x43, 0x33, 0x23, 0x35, 0x32, 0x21, 0x63, 0x13, 0x23, 0x13, 0x01,
+ 0xca, 0x10, 0x77, 0x34,
+ 0xee, 0xcd, 0x0f, 0x32, 0x12, 0xff, 0xdf, 0xff, 0x10, 0x10, 0xdf, 0xff,
+ 0xf0, 0xc0, 0x9a, 0x00,
+ 0x02, 0xf0, 0xee, 0x0f, 0xff, 0xdd, 0xdf, 0x03, 0xcf, 0x12, 0x77, 0x98,
+ 0x0c, 0x57, 0xf0, 0xee,
+ 0x11, 0x00, 0xdf, 0x31, 0x00, 0xad, 0x11, 0x01, 0xfd, 0xf0, 0x02, 0x13,
+ 0xff, 0xc9, 0xff, 0x00,
+ 0x12, 0x01, 0xbe, 0x00, 0x0f, 0xfc, 0x10, 0x1f, 0x00, 0x00, 0x98, 0x10,
+ 0x52, 0xdb, 0x0e, 0x43,
+ 0xf0, 0xdb, 0xee, 0x20, 0x64, 0x00, 0xcc, 0x00, 0x12, 0x00, 0xff, 0x00,
+ 0x10, 0x11, 0xf0, 0xef,
+ 0x01, 0x01, 0xfe, 0xfd, 0x30, 0x42, 0x0f, 0x61, 0x33, 0x0b, 0x53, 0x12,
+ 0x0b, 0x64, 0x13, 0x0b,
+ 0x12, 0x03, 0xed, 0xfe, 0xf2, 0xf4, 0xe1, 0xbd, 0x0e, 0x24, 0x02, 0xf0,
+ 0xe0, 0xff, 0x00, 0x64,
+ 0x10, 0x0c, 0x0f, 0x01, 0x00, 0xfe, 0x02, 0xcd, 0xd9, 0x10, 0x0e, 0x0d,
+ 0x02, 0x8c, 0xcc, 0xf1,
+ 0xdf, 0xec, 0xfe, 0x00, 0xd0, 0xae, 0xf0, 0x07, 0x13, 0x0e, 0x10, 0x21,
+ 0x00, 0xf0, 0xea, 0x0f,
+ 0x53, 0xf0, 0xfd, 0x34, 0x00, 0xce, 0x14, 0xf1, 0xcf, 0x24, 0x65, 0x01,
+ 0x00, 0xf0, 0x25, 0x23,
+ 0xce, 0xdd, 0x43, 0x47, 0x00, 0xe0, 0xff, 0x30, 0x52, 0x00, 0xff, 0x40,
+ 0x73, 0x20, 0x1f, 0x1f,
+ 0x0e, 0x00, 0x01, 0x37, 0x21, 0x0f, 0x00, 0x01, 0x10, 0x0e, 0x22, 0xe0,
+ 0x8b, 0x00, 0x26, 0x21,
+ 0x00, 0xde, 0xbe, 0x04, 0xf5, 0xbf, 0xfe, 0x00, 0x10, 0xf0, 0xde, 0xdf,
+ 0xf2, 0xf4, 0xb0, 0xef,
+ 0xff, 0xde, 0xef, 0xcf, 0xdd, 0xdd, 0x03, 0x43, 0x2b, 0x1b, 0x2f, 0x00,
+ 0xeb, 0xfd, 0x20, 0x1f,
+ 0xbb, 0xce, 0xdf, 0xdf, 0xee, 0xed, 0xcf, 0xad, 0xde, 0xe1, 0xe4, 0x05,
+ 0x02, 0xdf, 0xfd, 0x0e,
+ 0x3c, 0x7e, 0x32, 0x25, 0x00, 0xdd, 0x0f, 0x74, 0x32, 0x2e, 0x1f, 0x10,
+ 0x20, 0x40, 0x30, 0x2e,
+ 0x37, 0x35, 0x10, 0x1f, 0x30, 0x52, 0x00, 0xed, 0x00, 0x01, 0xca, 0x0f,
+ 0x70, 0x1f, 0x0d, 0x0f,
+ 0xed, 0xcd, 0x03, 0x03, 0xfd, 0x09, 0x0e, 0xed, 0xed, 0x00, 0x2e, 0x60,
+ 0x10, 0xd8, 0xdd, 0x32,
+ 0xd1, 0x8d, 0xed, 0xf0, 0x06, 0xf0, 0xfe, 0x51, 0x30, 0x0f, 0x2f, 0x2f,
+ 0x2f, 0x30, 0x2f, 0x3f,
+ 0x3d, 0x0b, 0x0e, 0xbb, 0xde, 0x9f, 0xdd, 0xdd, 0xe2, 0xd4, 0xa0, 0xe5,
+ 0xe5, 0xd1, 0xd0, 0x02,
+ 0xd0, 0xc0, 0xd5, 0xb2, 0xe3, 0xf6, 0xf1, 0x02, 0x32, 0x12, 0x40, 0x61,
+ 0x22, 0x34, 0x24, 0x10,
+ 0x50, 0x55, 0x21, 0x21, 0x14, 0x01, 0xee, 0xff, 0x34, 0x21, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0xed, 0xfd,
+ 0xec, 0x20, 0x40, 0x3b, 0x4e, 0x2f, 0x0e, 0xde, 0x0e, 0x72, 0x53, 0x1b,
+ 0x1e, 0x1e, 0x00, 0x00,
+ 0xea, 0xbc, 0xf0, 0x02, 0x00, 0x00, 0x12, 0x00, 0x01, 0xcf, 0xdd, 0x36,
+ 0x42, 0x1f, 0x1d, 0x1c,
+ 0x1f, 0x42, 0x20, 0x2c, 0x3d, 0x1f, 0x03, 0x94, 0xc0, 0xc1, 0xf7, 0xe3,
+ 0xd1, 0xd0, 0xe1, 0xe1,
+ 0xf2, 0xc2, 0xa3, 0xe7, 0xc3, 0xd0, 0x05, 0x24, 0x00, 0xf3, 0xc2, 0xe1,
+ 0x26, 0x32, 0x40, 0x72,
+ 0x22, 0x12, 0x32, 0x13, 0x13, 0x03, 0x02, 0x44, 0x43, 0x0f, 0x1e, 0x00,
+ 0x00, 0x1f, 0x41, 0x31,
+ 0x09, 0xec, 0xed, 0xef, 0xdf, 0xac, 0xec, 0x00, 0x1f, 0x4d, 0x4d, 0x4d,
+ 0x2d, 0x1c, 0x08, 0xfe,
+ 0x0d, 0xfc, 0x5e, 0x50, 0x0f, 0x0d, 0xfd, 0x0e, 0x2f, 0x2d, 0x4f, 0x2f,
+ 0x0b, 0x0e, 0x0f, 0x0e,
+ 0xdb, 0xee, 0xdc, 0xbd, 0xf0, 0xe0, 0x9e, 0xde, 0xd1, 0xe4, 0xf2, 0xe0,
+ 0x0f, 0x03, 0xf3, 0xb2,
+ 0xd4, 0xb3, 0xe6, 0xe5, 0xd1, 0xc0, 0xe3, 0xe6, 0xb2, 0xb1, 0xd0, 0xe2,
+ 0x04, 0x22, 0x00, 0x01,
+ 0x13, 0x35, 0x21, 0x32, 0x43, 0x43, 0x12, 0x22, 0x13, 0x02, 0x02, 0x47,
+ 0x76, 0xfe, 0xfd, 0x77,
+ 0x10, 0xee, 0x00, 0x00, 0xf0, 0x21, 0x00, 0xed, 0x30, 0x42, 0x00, 0x1f,
+ 0x0f, 0x30, 0x2f, 0x1b,
+ 0x4f, 0x2f, 0x0d, 0x0d, 0x20, 0x2f, 0xfb, 0xcc, 0x0d, 0x2f, 0x50, 0x10,
+ 0x0e, 0xfd, 0xfc, 0x50,
+ 0x50, 0x09, 0x2d, 0x70, 0x01, 0xfd, 0xee, 0x03, 0x34, 0xff, 0x1e, 0x22,
+ 0xef, 0xf2, 0xd4, 0x9e,
+ 0xef, 0x06, 0x04, 0x03, 0xf0, 0xae, 0xe0, 0x07, 0xe4, 0xb0, 0xf0, 0x01,
+ 0x01, 0x01, 0x02, 0x01,
+ 0x22, 0x42, 0x32, 0x22, 0x22, 0x00, 0x10, 0x32, 0x15, 0x03, 0xc0, 0xdf,
+ 0x00, 0x40, 0x53, 0x17,
+ 0xae, 0xed, 0xf0, 0xff, 0xff, 0x0f, 0x0d, 0x0d, 0xec, 0x1e, 0x61, 0x19,
+ 0xfc, 0x0f, 0x0e, 0x0b,
+ 0xfe, 0x00, 0xff, 0xad, 0xcb, 0xfe, 0x2f, 0x2f, 0xdb, 0xad, 0x00, 0x00,
+ 0xfe, 0xfc, 0x0f, 0x3e,
+ 0x1c, 0x0d, 0x0e, 0xff, 0xbd, 0xff, 0x00, 0xee, 0xff, 0x0f, 0xcd, 0x04,
+ 0xc2, 0xa0, 0x07, 0x12,
+ 0x20, 0x11, 0x02, 0x05, 0xf3, 0xd2, 0xd4, 0x05, 0xc2, 0xa1, 0xf2, 0xe1,
+ 0xe2, 0xe4, 0xa3, 0xf2,
+ 0x14, 0x10, 0x00, 0x31, 0x34, 0xf0, 0xb0, 0x02, 0x13, 0x0e, 0x19, 0x70,
+ 0x32, 0x10, 0x1f, 0xfb,
+ 0xfe, 0x0f, 0x2f, 0x0d, 0x1f, 0x62, 0x00, 0xdd, 0x00, 0x12, 0x31, 0x3e,
+ 0x4d, 0x30, 0x30, 0x51,
+ 0x37, 0x1f, 0x0b, 0x2f, 0x7e, 0x3f, 0x40, 0x10, 0x00, 0xee, 0x04, 0x04,
+ 0xef, 0x0f, 0x00, 0xcf,
+ 0xd0, 0xe0, 0xda, 0xfe, 0xed, 0x0c, 0x30, 0x02, 0x8e, 0xef, 0xd0, 0xc1,
+ 0xc3, 0xf5, 0xef, 0xed,
+ 0xef, 0xde, 0xf3, 0x07, 0x02, 0x12, 0x12, 0x05, 0x03, 0x80, 0xc1, 0xe5,
+ 0xd3, 0xe2, 0x04, 0x42,
+ 0x22, 0x45, 0x44, 0x33, 0x22, 0x00, 0x31, 0x76, 0x22, 0x00, 0x43, 0x23,
+ 0x01, 0x02, 0x01, 0x22,
+ 0x13, 0xde, 0xda, 0x00, 0xe1, 0x8f, 0xfe, 0xfd, 0x0e, 0x2d, 0x09, 0x0e,
+ 0x0f, 0x0e, 0xdd, 0x0e,
+ 0x6f, 0x3d, 0x3c, 0x1c, 0x0e, 0xfd, 0xdc, 0xfe, 0x0e, 0x0f, 0x5f, 0x1d,
+ 0xfa, 0xcd, 0x01, 0x47,
+ 0xd0, 0xae, 0x0e, 0x30, 0x1f, 0x0d, 0x20, 0x10, 0xef, 0xce, 0xff, 0x21,
+ 0x77, 0x10, 0xca, 0x00,
+ 0x02, 0xd0, 0xf0, 0xf0, 0xdf, 0x00, 0x01, 0x8f, 0xef, 0x05, 0xf1, 0xdf,
+ 0xf0, 0x34, 0x32, 0x0e,
+ 0x4e, 0x62, 0x24, 0x00, 0x0f, 0x43, 0x47, 0x23, 0x34, 0x00, 0x00, 0x24,
+ 0x24, 0x01, 0x20, 0x10,
+ 0xde, 0x01, 0x03, 0xb0, 0xef, 0xff, 0xfc, 0x0c, 0x2e, 0x40, 0xf0, 0x8c,
+ 0xdf, 0xf1, 0x00, 0x1d,
+ 0x3e, 0x2e, 0x09, 0x0f, 0xed, 0xde, 0x24, 0x24, 0xae, 0xed, 0x0f, 0xdd,
+ 0xdf, 0x03, 0xe0, 0x89,
+ 0xde, 0x0e, 0x30, 0x4f, 0xfc, 0xdd, 0xff, 0x11, 0x12, 0xbd, 0xd9, 0xd0,
+ 0xc0, 0xc0, 0xe0, 0xef,
+ 0xbc, 0xf0, 0x03, 0x01, 0xf0, 0xd0, 0xe4, 0xd3, 0xb1, 0xd0, 0x04, 0x15,
+ 0xe1, 0xa0, 0xf3, 0xf4,
+ 0x01, 0xef, 0x0c, 0x4f, 0x30, 0x0b, 0x1d, 0x42, 0x14, 0xff, 0x0e, 0x70,
+ 0x40, 0x19, 0x1e, 0x30,
+ 0x12, 0x12, 0x10, 0x0f, 0x60, 0x3f, 0x2b, 0x30, 0xe9, 0xfe, 0x65, 0xf0,
+ 0xee, 0x10, 0xef, 0x00,
+ 0x12, 0x8c, 0xed, 0x02, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x0e, 0x00, 0x24,
+ 0xed, 0x0d, 0x31, 0x47,
+ 0x22, 0xe0, 0xad, 0xf0, 0x00, 0xef, 0xf0, 0x23, 0x01, 0xed, 0x04, 0x04,
+ 0x7e, 0x00, 0xa1, 0x00,
+ 0x09, 0xe4, 0x4c, 0xc8, 0xd5, 0xdd, 0x06, 0xbe, 0x9f, 0xf9, 0x0e, 0x88,
+ 0x10, 0x77, 0xfe, 0xdd,
+ 0x76, 0x22, 0xee, 0xcc, 0x00, 0x23, 0x11, 0xe0, 0xdf, 0xdf, 0x01, 0x34,
+ 0x01, 0xdd, 0xcd, 0x00,
+ 0x56, 0x00, 0xcd, 0xff, 0x01, 0x23, 0x11, 0x10, 0x0f, 0xbc, 0xed, 0x57,
+ 0x34, 0xff, 0x00, 0x21,
+ 0xff, 0xee, 0x11, 0x32, 0x43, 0x00, 0x00, 0x0f, 0xfe, 0xdd, 0x88, 0x9a,
+ 0x00, 0x12, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x56, 0x32, 0x22, 0x01, 0xfe, 0x00, 0x01, 0x00,
+ 0x44, 0x12, 0xef, 0xee,
+ 0xff, 0x00, 0x32, 0x43, 0x00, 0xce, 0xbd, 0x16, 0x47, 0x00, 0xce, 0x0f,
+ 0x00, 0x01, 0xf0, 0xef,
+ 0xef, 0x10, 0x20, 0x00, 0x00, 0x01, 0x01, 0x9d, 0xc9, 0x12, 0x11, 0xdc,
+ 0xed, 0x10, 0x00, 0xcd,
+ 0xdc, 0xef, 0x21, 0x76, 0x63, 0x01, 0x10, 0x00, 0x21, 0x25, 0x11, 0x00,
+ 0x00, 0x34, 0x10, 0xff,
+ 0xe0, 0x00, 0x11, 0xfe, 0x00, 0x11, 0x0f, 0xee, 0xde, 0xbe, 0xdb, 0x12,
+ 0x43, 0xef, 0xf0, 0x45,
+ 0x33, 0x24, 0xff, 0xff, 0x77, 0x20, 0xed, 0x31, 0x64, 0x0e, 0x00, 0x67,
+ 0x21, 0x00, 0xcc, 0x0f,
+ 0x22, 0x10, 0xfe, 0xf0, 0xff, 0xde, 0xcd, 0xdd, 0x00, 0x00, 0xef, 0xdd,
+ 0xdc, 0xef, 0x21, 0x11,
+ 0x00, 0x2f, 0x54, 0x13, 0xf0, 0xd0, 0x88, 0x99, 0xfe, 0xf0, 0x01, 0x12,
+ 0x11, 0x00, 0xf1, 0x14,
+ 0x12, 0x11, 0x01, 0xff, 0xce, 0x12, 0x67, 0x35, 0x21, 0x00, 0x10, 0x22,
+ 0xf0, 0xbd, 0xff, 0x45,
+ 0x22, 0xef, 0xcc, 0xf0, 0x0f, 0x00, 0x23, 0x02, 0xf0, 0xde, 0xbd, 0x01,
+ 0x23, 0x23, 0x11, 0xfe,
+ 0x00, 0x77, 0x12, 0xec, 0x21, 0x77, 0x11, 0x11, 0x00, 0x23, 0x32, 0xff,
+ 0xff, 0x53, 0x00, 0xb8,
+ 0xec, 0x00, 0x00, 0x10, 0x00, 0x0f, 0xff, 0x00, 0xff, 0x00, 0xff, 0xee,
+ 0x54, 0x32, 0xfe, 0xfc,
+ 0x0e, 0x0f, 0xcb, 0xde, 0x10, 0x62, 0x32, 0x23, 0x32, 0xff, 0x88, 0xdc,
+ 0x11, 0x21, 0xdf, 0xdd,
+ 0x00, 0x00, 0xff, 0xdc, 0x22, 0x75, 0x10, 0xff, 0x11, 0x44, 0x01, 0x11,
+ 0x57, 0x31, 0x01, 0x11,
+ 0x00, 0x01, 0x00, 0x10, 0x43, 0x01, 0xff, 0x10, 0x77, 0x00, 0xee, 0x00,
+ 0x32, 0x22, 0x00, 0x00,
+ 0x20, 0x10, 0x21, 0x43, 0x00, 0xed, 0x25, 0x43, 0xef, 0xdd, 0xf0, 0xfe,
+ 0x20, 0x77, 0x00, 0xcc,
+ 0xee, 0x21, 0x42, 0x0f, 0xdb, 0xef, 0x00, 0x21, 0xe0, 0xad, 0x00, 0x26,
+ 0x10, 0xf0, 0xff, 0xbd,
+ 0xee, 0x00, 0x03, 0xef, 0xba, 0xee, 0xf0, 0xf0, 0x02, 0x03, 0xd0, 0x02,
+ 0xf1, 0x88, 0xce, 0x01,
+ 0x01, 0xde, 0xf0, 0x03, 0x12, 0xef, 0xdc, 0x12, 0x67, 0x01, 0xf0, 0xdf,
+ 0x01, 0x12, 0x01, 0xde,
+ 0xde, 0x12, 0x01, 0xcf, 0xf0, 0xf0, 0xad, 0xa8, 0xfc, 0x01, 0x12, 0x10,
+ 0x01, 0xdc, 0x9a, 0xee,
+ 0xfe, 0x10, 0x0f, 0xfd, 0x0f, 0x00, 0xfd, 0x0e, 0x21, 0xfd, 0xb9, 0xff,
+ 0x21, 0x10, 0xff, 0xbb,
+ 0x0e, 0x30, 0x10, 0x0e, 0x40, 0x32, 0x10, 0xee, 0xed, 0x77, 0x65, 0x0f,
+ 0x00, 0x00, 0x0f, 0xcc,
+ 0xfe, 0xed, 0x0f, 0x22, 0x44, 0x10, 0xff, 0xfe, 0x12, 0x46, 0x11, 0xf0,
+ 0x00, 0x23, 0x02, 0xe0,
+ 0xf0, 0x26, 0x01, 0xbf, 0x00, 0x34, 0x11, 0xbf, 0x00, 0x33, 0xef, 0xbb,
+ 0x22, 0x64, 0x00, 0xfe,
+ 0x01, 0x35, 0x01, 0x00, 0x11, 0x11, 0x01, 0x33, 0x34, 0x11, 0x01, 0xf0,
+ 0x12, 0x42, 0x21, 0x30,
+ 0x62, 0x47, 0xff, 0x00, 0x75, 0x10, 0xfd, 0x00, 0x32, 0x0f, 0xcc, 0x00,
+ 0x12, 0x12, 0x00, 0x0f,
+ 0x31, 0x64, 0x36, 0x00, 0xff, 0xde, 0x00, 0x53, 0x11, 0xec, 0xdd, 0x23,
+ 0x34, 0xed, 0x0f, 0x30,
+ 0xfe, 0x0f, 0x74, 0x33, 0xfc, 0xdc, 0xdd, 0xde, 0xef, 0xa9, 0xcc, 0xf0,
+ 0x00, 0xde, 0xac, 0xfe,
+ 0xef, 0x0f, 0x00, 0x00, 0xde, 0x00, 0x26, 0x00, 0xae, 0xff, 0x00, 0xef,
+ 0xaa, 0xff, 0x01, 0x01,
+ 0xf0, 0xee, 0xed, 0x12, 0x33, 0xff, 0xdb, 0xf0, 0x00, 0x00, 0x43, 0x45,
+ 0x00, 0x10, 0x20, 0x73,
+ 0x11, 0x0f, 0x0f, 0x30, 0x64, 0x25, 0x11, 0x0f, 0xfa, 0xdd, 0xef, 0x21,
+ 0x00, 0xab, 0xfe, 0x0f,
+ 0x00, 0x00, 0x1f, 0x42, 0x33, 0x0f, 0xea, 0x00, 0x21, 0x32, 0x55, 0xf0,
+ 0x9b, 0x00, 0x01, 0xfe,
+ 0xde, 0x12, 0x22, 0xde, 0xbc, 0xee, 0xdd, 0xfe, 0x00, 0x0e, 0x0f, 0x01,
+ 0x00, 0xf0, 0x34, 0x77,
+ 0x34, 0x22, 0x00, 0x9c, 0x00, 0x46, 0x00, 0xef, 0x10, 0x21, 0xff, 0xde,
+ 0x11, 0x33, 0xcd, 0xaa,
+ 0x11, 0x45, 0x00, 0x0f, 0x11, 0x54, 0x00, 0xde, 0x00, 0x33, 0x00, 0x00,
+ 0x33, 0x34, 0x00, 0xe0,
+ 0x00, 0x32, 0x21, 0xee, 0x0f, 0x76, 0x22, 0x00, 0xcc, 0x00, 0x00, 0xde,
+ 0x00, 0x33, 0x02, 0xef,
+ 0x10, 0x65, 0x0f, 0xed, 0x00, 0xdd, 0x23, 0x77, 0x01, 0xef, 0x00, 0x01,
+ 0x34, 0xf0, 0xdc, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0xfe, 0xef, 0x01, 0x77, 0x34, 0xe0, 0xd0, 0x46,
+ 0x42, 0xe0, 0xd0, 0x11,
+ 0xf0, 0x9e, 0x02, 0x47, 0x11, 0xf0, 0xff, 0x0f, 0xf0, 0xce, 0x12, 0x77,
+ 0x21, 0xff, 0xfe, 0x21,
+ 0x43, 0x0f, 0x20, 0x20, 0x20, 0x10, 0x41, 0x33, 0x10, 0x21, 0x56, 0x12,
+ 0x00, 0xff, 0x0e, 0xfe,
+ 0x0d, 0x0d, 0x20, 0x74, 0x36, 0x20, 0x31, 0x54, 0x11, 0x10, 0x23, 0x47,
+ 0x01, 0xf0, 0xf0, 0xf0,
+ 0xe0, 0x10, 0x43, 0xef, 0xbb, 0xcc, 0xdd, 0x55, 0x33, 0xdd, 0xab, 0x00,
+ 0x22, 0xfe, 0xee, 0x00,
+ 0x00, 0xff, 0xee, 0x12, 0x01, 0xed, 0xef, 0x02, 0xf1, 0xc0, 0x37, 0x75,
+ 0x11, 0x11, 0x22, 0x02,
+ 0xef, 0xbe, 0xff, 0x00, 0xff, 0xda, 0xbc, 0xee, 0xf0, 0xff, 0x00, 0x44,
+ 0x00, 0xee, 0x00, 0x10,
+ 0x00, 0xdc, 0x9b, 0xee, 0x11, 0x22, 0xcc, 0xbb, 0xf0, 0x21, 0x11, 0x00,
+ 0xdd, 0xed, 0x00, 0x30,
+ 0x00, 0x00, 0x43, 0x32, 0x0e, 0xed, 0x12, 0x77, 0x24, 0xff, 0xf0, 0x00,
+ 0x23, 0x46, 0x21, 0x11,
+ 0x21, 0x00, 0xf0, 0x0e, 0xaa, 0x00, 0x75, 0x00, 0xfe, 0x00, 0x00, 0x33,
+ 0x33, 0xff, 0xee, 0xcd,
+ 0x00, 0x32, 0xfc, 0xaa, 0xff, 0xfe, 0x00, 0x23, 0xef, 0x88, 0xee, 0x10,
+ 0x23, 0x00, 0xff, 0x00,
+ 0xff, 0xff, 0x10, 0x32, 0xfe, 0xaa, 0xdd, 0xed, 0x00, 0xef, 0xce, 0x00,
+ 0x22, 0x00, 0xef, 0xee,
+ 0x03, 0x77, 0x12, 0xfd, 0x0f, 0x24, 0x21, 0x21, 0x53, 0x00, 0xff, 0x10,
+ 0x13, 0x15, 0x23, 0xdf,
+ 0x9b, 0xfe, 0x00, 0x01, 0xdc, 0xcc, 0x0f, 0x10, 0x00, 0x0f, 0xed, 0xcc,
+ 0x13, 0x66, 0x00, 0x0f,
+ 0x0f, 0x00, 0x56, 0x11, 0xf0, 0x11, 0x54, 0x00, 0x0f, 0x23, 0x34, 0x00,
+ 0xf0, 0x01, 0x22, 0x00,
+ 0x10, 0x30, 0x32, 0x23, 0xfe, 0x99, 0x11, 0x53, 0x00, 0x0d, 0x12, 0x00,
+ 0x0f, 0x00, 0xe0, 0xb9,
+ 0xfe, 0x00, 0x34, 0x01, 0xd0, 0xd0, 0xf0, 0x77, 0x11, 0xe0, 0x01, 0x54,
+ 0xf0, 0xcd, 0x13, 0x45,
+ 0x00, 0x00, 0x45, 0x21, 0x00, 0xf0, 0x00, 0x32, 0x33, 0xe0, 0xbd, 0xfe,
+ 0x00, 0x14, 0x12, 0x00,
+ 0x45, 0x42, 0xbc, 0xdb, 0x00, 0x32, 0x00, 0xe0, 0x01, 0xf0, 0x02, 0x32,
+ 0xf0, 0x01, 0x35, 0x63,
+ 0x00, 0x89, 0xff, 0x11, 0x22, 0xfe, 0xfe, 0x00, 0x01, 0xee, 0xed, 0xdd,
+ 0x0d, 0x10, 0x0c, 0x98,
+ 0xff, 0x00, 0x10, 0xff, 0xed, 0x1f, 0x20, 0xec, 0xee, 0x20, 0x00, 0x10,
+ 0x72, 0xec, 0xca, 0x00,
+ 0xee, 0xcd, 0xef, 0x01, 0x22, 0x20, 0xfd, 0x10, 0x77, 0x21, 0xef, 0xf0,
+ 0x45, 0x32, 0xcf, 0xce,
+ 0xee, 0xf0, 0x04, 0x22, 0xf0, 0xde, 0x10, 0x3f, 0x20, 0x54, 0x23, 0x00,
+ 0xf1, 0xf0, 0x8a, 0xed,
+ 0xee, 0x01, 0x67, 0x11, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xca, 0xed, 0x00,
+ 0xef, 0xcc, 0xff, 0x10,
+ 0x10, 0x0f, 0x0e, 0x0e, 0x31, 0x32, 0xdb, 0xab, 0xff, 0x20, 0x10, 0xdc,
+ 0xcd, 0x10, 0x20, 0xcd,
+ 0xbb, 0x0f, 0x00, 0x21, 0x10, 0x0f, 0xfe, 0x20, 0x00, 0x89, 0xff, 0x22,
+ 0x00, 0xcb, 0x00, 0x54,
+ 0x00, 0xee, 0x0f, 0x00, 0xe0, 0xdd, 0xff, 0x11, 0x23, 0xdf, 0xbb, 0xff,
+ 0x00, 0xf0, 0x9b, 0xf0,
+ 0x13, 0x24, 0x11, 0xe0, 0xee, 0x23, 0x67, 0x00, 0x00, 0x02, 0x02, 0x00,
+ 0xe1, 0x02, 0x01, 0xdf,
+ 0xde, 0x22, 0x46, 0x23, 0x43, 0x22, 0x01, 0x44, 0x75, 0x11, 0xff, 0x00,
+ 0x02, 0x01, 0x00, 0xdb,
+ 0xdc, 0x0f, 0x40, 0x20, 0x20, 0x42, 0x31, 0xfc, 0xaa, 0xff, 0x00, 0x10,
+ 0xed, 0xff, 0x00, 0x20,
+ 0x42, 0x20, 0x0f, 0x20, 0x50, 0x12, 0x32, 0x0d, 0xc8, 0x0e, 0x40, 0x10,
+ 0x00, 0x41, 0x11, 0x10,
+ 0x0e, 0xcc, 0x12, 0x56, 0xf0, 0xff, 0x10, 0x00, 0xce, 0xde, 0x00, 0x35,
+ 0x53, 0x00, 0xf0, 0xf0,
+ 0x04, 0x35, 0xf0, 0x00, 0x61, 0x00, 0x10, 0x55, 0x02, 0xef, 0xf0, 0x14,
+ 0x11, 0x11, 0x01, 0xef,
+ 0xbe, 0x03, 0x47, 0x11, 0xde, 0x9b, 0x00, 0x22, 0x00, 0xfe, 0xee, 0xec,
+ 0x00, 0x30, 0xff, 0x99,
+ 0x00, 0x21, 0x10, 0x00, 0x10, 0x0e, 0xed, 0x99, 0xef, 0x00, 0x21, 0x01,
+ 0x10, 0x00, 0xfe, 0x89,
+ 0xee, 0x22, 0x22, 0x00, 0x01, 0x33, 0x0f, 0xa9, 0xff, 0x10, 0x01, 0x00,
+ 0x22, 0x00, 0xbc, 0x00,
+ 0x11, 0xff, 0xdd, 0x00, 0xf0, 0xdf, 0xdf, 0xdf, 0xef, 0xde, 0x99, 0xef,
+ 0x13, 0x25, 0xf0, 0xdf,
+ 0x11, 0x54, 0x01, 0xde, 0xe0, 0x66, 0x12, 0xff, 0xf0, 0x22, 0x11, 0xf0,
+ 0x00, 0x35, 0x73, 0x01,
+ 0xff, 0xee, 0x00, 0x22, 0xfd, 0xeb, 0x0f, 0x52, 0x21, 0xdc, 0xed, 0x32,
+ 0x77, 0x20, 0xf0, 0x00,
+ 0x20, 0xfe, 0xbb, 0x0e, 0x10, 0x0e, 0xec, 0x00, 0x00, 0x30, 0x21, 0xee,
+ 0xab, 0x0f, 0x12, 0x11,
+ 0xcc, 0xde, 0x43, 0x11, 0xaa, 0xdd, 0xff, 0x00, 0x00, 0xff, 0xef, 0x0f,
+ 0x00, 0xdd, 0x34, 0x75,
+ 0xed, 0xba, 0x00, 0x01, 0x11, 0x12, 0xee, 0xdb, 0xff, 0x00, 0x00, 0x43,
+ 0x32, 0xf0, 0xdf, 0x00,
+ 0x01, 0x55, 0x00, 0xce, 0xee, 0x22, 0x34, 0xbc, 0xb9, 0x00, 0x32, 0x00,
+ 0xde, 0xee, 0x10, 0x43,
+ 0x01, 0x00, 0x32, 0x65, 0x01, 0x10, 0x11, 0x22, 0x10, 0x00, 0x31, 0x43,
+ 0x20, 0x0e, 0xe9, 0x00,
+ 0x42, 0x33, 0x0f, 0x0e, 0x20, 0x74, 0x46, 0x0f, 0xdd, 0x10, 0x0d, 0xea,
+ 0x61, 0x43, 0x00, 0x13,
+ 0x11, 0xee, 0xfe, 0x22, 0x23, 0xe0, 0xed, 0x00, 0x35, 0x44, 0xdf, 0x8c,
+ 0xfd, 0xfd, 0xdc, 0xf0,
+ 0xee, 0xf0, 0x25, 0x02, 0xef, 0x00, 0x01, 0xd0, 0x13, 0x77, 0x00, 0xbd,
+ 0xcc, 0xff, 0x24, 0x23,
+ 0xf0, 0xde, 0xdf, 0xcd, 0xee, 0x00, 0x43, 0x45, 0x44, 0x11, 0x0f, 0xfe,
+ 0x34, 0x54, 0xff, 0xcb,
+ 0x00, 0x32, 0x44, 0x11, 0x11, 0x21, 0x32, 0x10, 0xff, 0x00, 0x00, 0x0f,
+ 0x10, 0x54, 0xff, 0xb9,
+ 0x00, 0x42, 0xef, 0xdd, 0x13, 0x13, 0x00, 0x24, 0x00, 0xff, 0x20, 0x43,
+ 0x00, 0x01, 0x00, 0x46,
+ 0x52, 0x00, 0xfd, 0xca, 0xce, 0xdd, 0xee, 0x11, 0x10, 0xec, 0xcb, 0xcd,
+ 0xee, 0xef, 0xf0, 0x44,
+ 0xef, 0x88, 0xdf, 0x10, 0x21, 0x10, 0xf0, 0x0f, 0x42, 0x11, 0xcc, 0xed,
+ 0x00, 0x01, 0x00, 0xd0,
+ 0xdf, 0xce, 0xe0, 0x00, 0xe0, 0xba, 0xcd, 0xee, 0xef, 0xee, 0xee, 0x12,
+ 0x00, 0xed, 0x26, 0x43,
+ 0x55, 0x12, 0xac, 0xdb, 0xff, 0x00, 0x21, 0x54, 0x22, 0xed, 0xdd, 0x22,
+ 0x21, 0xed, 0xcc, 0x32,
+ 0x44, 0x00, 0xed, 0x00, 0x22, 0x12, 0x35, 0x10, 0xce, 0x0f, 0x10, 0xfe,
+ 0xbc, 0x12, 0x65, 0x01,
+ 0x00, 0x00, 0x00, 0x11, 0x13, 0xdf, 0xc0, 0xf3, 0xaa, 0xc9, 0xff, 0x00,
+ 0xce, 0xef, 0x00, 0xed,
+ 0xdb, 0xee, 0xff, 0x10, 0x42, 0x0f, 0xfe, 0x0f, 0xda, 0x0f, 0x72, 0x31,
+ 0x00, 0x00, 0xfe, 0xce,
+ 0xdc, 0x11, 0x44, 0xfe, 0xde, 0x43, 0x45, 0x0f, 0xcb, 0x11, 0x42, 0x00,
+ 0x00, 0x44, 0xf0, 0xdc,
+ 0xf0, 0x01, 0x13, 0x23, 0xff, 0xef, 0x22, 0x12, 0xcd, 0xca, 0x21, 0x64,
+ 0x12, 0x31, 0x21, 0xef,
+ 0xfd, 0x53, 0x11, 0xda, 0xed, 0x52, 0x21, 0xea, 0x00, 0x32, 0x00, 0xed,
+ 0x20, 0x51, 0x0e, 0x0d,
+ 0xf0, 0x26, 0x76, 0x41, 0x00, 0xef, 0x0f, 0x00, 0x10, 0x31, 0x10, 0xed,
+ 0x50, 0x44, 0x0f, 0xec,
+ 0x00, 0x31, 0x33, 0x33, 0x34, 0x53, 0x10, 0xec, 0xdb, 0x00, 0x30, 0x10,
+ 0xe0, 0xf0, 0x00, 0xef,
+ 0xe0, 0xd0, 0xe1, 0x06, 0xa2, 0xf4, 0xf2, 0xd1, 0xc0, 0x9d, 0xef, 0x01,
+ 0x13, 0x14, 0x16, 0x02,
+ 0xf2, 0x03, 0xe2, 0x26, 0x22, 0xf2, 0xa1, 0x02, 0x76, 0x21, 0x00, 0x00,
+ 0x31, 0x00, 0xd0, 0x24,
+ 0x53, 0x00, 0xfe, 0x11, 0x33, 0x00, 0x01, 0x02, 0xad, 0xeb, 0xdd, 0xbb,
+ 0xee, 0x00, 0xed, 0xfd,
+ 0x00, 0xe8, 0xce, 0x10, 0x1f, 0x0f, 0x72, 0x32, 0xec, 0xee, 0x10, 0x0f,
+ 0xdb, 0x20, 0x0e, 0xde,
+ 0x0e, 0x8a, 0xdc, 0x10, 0x42, 0xfe, 0xfd, 0xfd, 0xdb, 0x0f, 0x20, 0x11,
+ 0xef, 0xad, 0x20, 0x32,
+ 0xbc, 0xb9, 0xef, 0x01, 0x11, 0xbe, 0xef, 0x01, 0x11, 0xef, 0xde, 0xf0,
+ 0x03, 0x26, 0x22, 0x00,
+ 0xee, 0xde, 0xf0, 0x02, 0x02, 0x01, 0x53, 0x12, 0xdc, 0xe0, 0x77, 0x67,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x22, 0x00, 0xef, 0x01, 0x55, 0x22, 0x00, 0xf0, 0xef, 0xfe, 0x41, 0x43,
+ 0xfe, 0xeb, 0x10, 0x20,
+ 0xee, 0x00, 0x41, 0x21, 0x00, 0xeb, 0xff, 0x72, 0x45, 0x10, 0x11, 0x42,
+ 0x20, 0x00, 0x32, 0x35,
+ 0x0f, 0xee, 0x73, 0x36, 0xff, 0xee, 0x11, 0x22, 0xff, 0xff, 0x11, 0x21,
+ 0x77, 0x33, 0xff, 0xcc,
+ 0x23, 0x35, 0xf0, 0xbf, 0xef, 0xf0, 0x22, 0x11, 0xd0, 0xe0, 0x36, 0x32,
+ 0xd0, 0xdf, 0x20, 0x42,
+ 0x02, 0xf2, 0x04, 0xd1, 0x80, 0xf0, 0xe0, 0xf0, 0x27, 0x12, 0xd0, 0xe1,
+ 0xe1, 0xe0, 0x44, 0x74,
+ 0xff, 0xde, 0x21, 0x25, 0xff, 0x00, 0x75, 0x00, 0xf0, 0x11, 0x21, 0xef,
+ 0x0f, 0x10, 0x10, 0x52,
+ 0x34, 0x0e, 0x0c, 0x00, 0xdc, 0xcd, 0x31, 0x62, 0x0a, 0xca, 0xfe, 0x41,
+ 0x41, 0x0f, 0xfe, 0x0e,
+ 0x00, 0x1f, 0x0f, 0xee, 0x01, 0x12, 0xed, 0xaa, 0x0e, 0x0d, 0x0f, 0x31,
+ 0x10, 0xfd, 0xcb, 0xbd,
+ 0x00, 0x11, 0xff, 0xa8, 0x00, 0x00, 0xef, 0xee, 0x02, 0x44, 0x11, 0x00,
+ 0xee, 0xef, 0x23, 0x43,
+ 0xf0, 0xde, 0xdd, 0x10, 0x55, 0xee, 0xba, 0x00, 0x43, 0x00, 0xed, 0x00,
+ 0x11, 0x64, 0x23, 0x21,
+ 0x11, 0x00, 0xed, 0xf2, 0x03, 0xec, 0xde, 0x34, 0x22, 0xeb, 0xcd, 0x0e,
+ 0x31, 0x43, 0x0e, 0x0b,
+ 0x40, 0x44, 0x01, 0x11, 0x33, 0xdc, 0x9b, 0xf0, 0x11, 0x23, 0xe0, 0xbb,
+ 0xff, 0x10, 0x10, 0x0e,
+ 0x0e, 0xcd, 0xff, 0x27, 0x11, 0xd0, 0x12, 0x00, 0xbf, 0x20, 0x0e, 0xed,
+ 0x67, 0x01, 0xee, 0xde,
+ 0xee, 0xde, 0xd0, 0x03, 0xf4, 0x80, 0xd1, 0x17, 0x56, 0x00, 0xd0, 0xf0,
+ 0x01, 0x01, 0x00, 0x01,
+ 0xd0, 0xdf, 0x21, 0x11, 0xbe, 0x0f, 0x00, 0x66, 0x34, 0x00, 0xde, 0xdf,
+ 0x44, 0x43, 0xfe, 0x00,
+ 0x23, 0x13, 0x0e, 0x1f, 0x20, 0x21, 0x23, 0x11, 0xfe, 0xca, 0x0f, 0x50,
+ 0x2f, 0x30, 0x42, 0x00,
+ 0x13, 0x47, 0x00, 0xff, 0x51, 0x34, 0x22, 0x01, 0x00, 0x44, 0x77, 0x22,
+ 0xff, 0xde, 0x10, 0x20,
+ 0x00, 0x21, 0x00, 0xff, 0x42, 0x53, 0x09, 0xfd, 0x10, 0x22, 0x00, 0x05,
+ 0xe3, 0x02, 0x74, 0x04,
+ 0x5b, 0x1c, 0x60, 0x02, 0x55, 0x20, 0xb6, 0x00, 0x54, 0x0e, 0xdc, 0xe1,
+ 0x24, 0x10, 0xdd, 0x01,
+ 0xc0, 0xbf, 0x13, 0x43, 0x1e, 0x0c, 0xde, 0xe0, 0xf0, 0xe1, 0xf0, 0x06,
+ 0x61, 0x1f, 0xfd, 0xef,
+ 0xf2, 0x03, 0x32, 0x77, 0x1c, 0xcc, 0xf1, 0x03, 0x00, 0x0f, 0x11, 0x11,
+ 0x20, 0x0f, 0xbb, 0x01,
+ 0x22, 0x22, 0x0e, 0xcc, 0xe0, 0x02, 0x03, 0x12, 0x2e, 0xec, 0xbf, 0x04,
+ 0x64, 0xfb, 0xcd, 0x04,
+ 0x21, 0xef, 0xde, 0xf1, 0xf0, 0x00, 0x0e, 0xfd, 0xf0, 0xe4, 0xe1, 0xce,
+ 0xee, 0x44, 0x10, 0xdc,
+ 0x22, 0x12, 0xae, 0xe0, 0xfe, 0xdd, 0xf2, 0x02, 0xfd, 0xcb, 0xce, 0xf0,
+ 0x57, 0x0c, 0xce, 0x56,
+ 0x41, 0xfd, 0xdd, 0xf0, 0x04, 0x41, 0xed, 0xbb, 0x01, 0x14, 0x30, 0x0f,
+ 0xec, 0xdf, 0x01, 0x12,
+ 0x51, 0x40, 0x1c, 0x0e, 0x01, 0x32, 0xed, 0xee, 0x02, 0x32, 0x2b, 0x1f,
+ 0x71, 0x22, 0x10, 0x1e,
+ 0xfd, 0xf2, 0x27, 0x32, 0x1f, 0x0d, 0xfe, 0xf0, 0x55, 0x21, 0xfe, 0xaa,
+ 0xe0, 0x11, 0x22, 0x0f,
+ 0x10, 0x73, 0x42, 0x0b, 0xdd, 0xf2, 0x14, 0x40, 0x21, 0x10, 0x0e, 0xdd,
+ 0xce, 0xc0, 0xe5, 0x03,
+ 0x0f, 0xfc, 0xae, 0xf1, 0x06, 0x30, 0x41, 0x53, 0x20, 0x09, 0xe0, 0x00,
+ 0x43, 0x00, 0xfd, 0xf0,
+ 0x13, 0x22, 0x0d, 0xce, 0xc0, 0xc0, 0xd0, 0xfe, 0xfd, 0x04, 0x67, 0x11,
+ 0xeb, 0xdf, 0x13, 0x32,
+ 0x0d, 0x51, 0x32, 0x0f, 0xef, 0xe0, 0xe0, 0x11, 0x65, 0x30, 0x0e, 0xfc,
+ 0xe0, 0x01, 0x23, 0x20,
+ 0xfc, 0x01, 0x13, 0xcc, 0x8c, 0xe1, 0x05, 0xf0, 0x0f, 0x21, 0x00, 0xda,
+ 0x00, 0x65, 0x00, 0xfe,
+ 0xf1, 0x33, 0x10, 0xde, 0xe0, 0x02, 0xd0, 0xde, 0x54, 0x20, 0xbb, 0xe0,
+ 0xf2, 0x00, 0xff, 0xfe,
+ 0xe0, 0x05, 0xe0, 0xcc, 0x23, 0x51, 0xec, 0xac, 0x14, 0x32, 0xfc, 0xf0,
+ 0x20, 0x22, 0xfe, 0x9b,
+ 0xef, 0x02, 0x02, 0x0e, 0x0e, 0xee, 0x22, 0x77, 0x20, 0x20, 0x11, 0x1e,
+ 0x10, 0x21, 0x11, 0xfd,
+ 0xc0, 0x05, 0x13, 0xfd, 0xcd, 0x02, 0xf1, 0x00, 0x21, 0x00, 0x31, 0x4f,
+ 0x0e, 0x47, 0x10, 0xfe,
+ 0x43, 0x75, 0x20, 0x21, 0x0d, 0xfc, 0x01, 0x24, 0x53, 0x10, 0xd9, 0xe0,
+ 0xb0, 0xe0, 0x22, 0x10,
+ 0x11, 0x44, 0x1d, 0x1d, 0x10, 0x22, 0x65, 0x10, 0x0f, 0x31, 0x10, 0xba,
+ 0xd0, 0x02, 0xe0, 0xf0,
+ 0xe1, 0xd0, 0xbd, 0xf0, 0xf0, 0xef, 0x27, 0x75, 0x3f, 0x0d, 0xee, 0x10,
+ 0x01, 0xff, 0xf1, 0x02,
+ 0xe0, 0xed, 0xbe, 0x06, 0x76, 0x0e, 0xed, 0xe0, 0xe0, 0xc0, 0xdf, 0x05,
+ 0x21, 0x0f, 0xfe, 0x02,
+ 0x22, 0x10, 0x0e, 0x00, 0x01, 0xc0, 0x11, 0x63, 0x10, 0x11, 0x0c, 0xdb,
+ 0xe1, 0x25, 0x42, 0x10,
+ 0x12, 0xee, 0x8d, 0x06, 0x12, 0xb9, 0xc0, 0x01, 0x23, 0x0e, 0xee, 0xef,
+ 0xf1, 0x67, 0x2f, 0x0f,
+ 0xff, 0xe0, 0x00, 0x53, 0x1f, 0x0d, 0xff, 0x01, 0x00, 0x0e, 0x01, 0x12,
+ 0x0e, 0xed, 0xe0, 0x37,
+ 0x52, 0x0c, 0xff, 0x0e, 0x00, 0xf1, 0x21, 0x72, 0x1d, 0x0a, 0x22, 0x42,
+ 0x0d, 0xed, 0x12, 0x0d,
+ 0xdb, 0x46, 0x71, 0xfe, 0xdd, 0xe1, 0xf3, 0xf0, 0xff, 0xdf, 0xdb, 0x00,
+ 0x33, 0x32, 0xee, 0x9e,
+ 0xf0, 0xfe, 0xdc, 0x03, 0x35, 0xee, 0xad, 0xf3, 0x04, 0x00, 0x0e, 0x63,
+ 0x23, 0x1e, 0x36, 0x10,
+ 0xdb, 0xd0, 0x32, 0x62, 0xfd, 0xff, 0x25, 0x52, 0x0e, 0x0f, 0x31, 0x21,
+ 0x20, 0x0e, 0xfe, 0xf0,
+ 0x13, 0x37, 0x00, 0xed, 0xbf, 0xd0, 0xcf, 0xf0, 0x15, 0xff, 0xff, 0x10,
+ 0x31, 0x76, 0x51, 0x20,
+ 0x0e, 0x0e, 0xbe, 0x06, 0x33, 0x0d, 0xfd, 0x04, 0x12, 0x0e, 0xdd, 0xe0,
+ 0x01, 0xd0, 0xd0, 0x00,
+ 0xd0, 0xd0, 0x67, 0x20, 0x20, 0x20, 0x00, 0xde, 0xe0, 0xe0, 0xd0, 0x80,
+ 0xcd, 0xe3, 0x07, 0x10,
+ 0x0e, 0xd0, 0xe1, 0xd1, 0xd2, 0xc3, 0xbd, 0xba, 0xf4, 0xf1, 0xba, 0xe0,
+ 0x23, 0x10, 0xec, 0xf0,
+ 0x03, 0x12, 0x10, 0x1e, 0xfb, 0x22, 0x44, 0x0e, 0xf0, 0xff, 0xd1, 0xf1,
+ 0x3f, 0x70, 0x20, 0xeb,
+ 0xc0, 0x00, 0x0f, 0xdc, 0x00, 0x42, 0x75, 0x30, 0x0c, 0xdc, 0x12, 0x44,
+ 0x0d, 0xfe, 0x01, 0x54,
+ 0x21, 0x0c, 0xee, 0xf0, 0xf0, 0xf0, 0x00, 0x33, 0x2e, 0x0d, 0x2f, 0x0e,
+ 0xda, 0x21, 0x75, 0x4f,
+ 0x0e, 0xdd, 0xce, 0xd0, 0xe2, 0xe1, 0x00, 0xee, 0xce, 0x06, 0x10, 0xde,
+ 0x10, 0x22, 0xdd, 0xd0,
+ 0x76, 0x60, 0x1e, 0x1e, 0x22, 0x0e, 0xfe, 0x57, 0x47, 0x0f, 0xdc, 0x01,
+ 0x21, 0x10, 0xef, 0x21,
+ 0x31, 0x10, 0x20, 0xfe, 0xb0, 0x01, 0x42, 0x30, 0x1e, 0x0d, 0x01, 0xff,
+ 0xf0, 0x77, 0x00, 0xcb,
+ 0xf0, 0x44, 0x20, 0xf0, 0xee, 0xd0, 0x02, 0x00, 0x0f, 0x32, 0x52, 0xe8,
+ 0xae, 0x02, 0x23, 0x21,
+ 0x0e, 0xbb, 0xd0, 0xf2, 0x13, 0x1e, 0x0c, 0xdf, 0xe0, 0xf1, 0x03, 0xed,
+ 0xdc, 0x11, 0x01, 0xaf,
+ 0x03, 0x41, 0x1d, 0xef, 0xc1, 0xe4, 0xdd, 0x9c, 0x03, 0x06, 0xfd, 0xca,
+ 0x02, 0x21, 0x1f, 0x4f,
+ 0x22, 0x22, 0xfe, 0xdd, 0x00, 0x02, 0xf0, 0x02, 0x52, 0xfa, 0x8a, 0xd0,
+ 0x04, 0x00, 0x0c, 0xe0,
+ 0x00, 0x21, 0x21, 0x20, 0x1f, 0x73, 0x51, 0x0a, 0x10, 0x12, 0x20, 0x1f,
+ 0x1f, 0x20, 0x11, 0x32,
+ 0x10, 0x00, 0x02, 0xfc, 0xef, 0x36, 0x20, 0xae, 0x01, 0x15, 0xff, 0xef,
+ 0x21, 0xce, 0xf0, 0x77,
+ 0x1e, 0x0e, 0x01, 0xf0, 0xe0, 0x02, 0x00, 0xff, 0xd0, 0xc0, 0xf2, 0xdf,
+ 0xb9, 0x02, 0x14, 0x30,
+ 0x1d, 0x2f, 0x21, 0x32, 0x72, 0x00, 0xf8, 0x02, 0x52, 0xee, 0xdd, 0x02,
+ 0x22, 0x20, 0x0e, 0x00,
+ 0xe2, 0xcf, 0xcd, 0x00, 0x01, 0x91, 0x07, 0x35, 0x2e, 0xfc, 0xf0, 0xf0,
+ 0x11, 0x43, 0x0e, 0xed,
+ 0x05, 0xf0, 0xee, 0x63, 0x10, 0x00, 0x55, 0x31, 0x0f, 0x0d, 0x10, 0x32,
+ 0x00, 0xab, 0xcd, 0xf0,
+ 0x37, 0x32, 0xfe, 0xbe, 0xce, 0xe2, 0x15, 0x0f, 0x1f, 0x21, 0x00, 0xdc,
+ 0xe1, 0x14, 0xfe, 0xbe,
+ 0xf1, 0xf2, 0xf0, 0xe1, 0xae, 0xef, 0x02, 0x0f, 0xcc, 0x05, 0x35, 0x3f,
+ 0xfb, 0xd0, 0x10, 0x63,
+ 0x0f, 0x0f, 0x51, 0x33, 0x0f, 0x0e, 0x03, 0x00, 0xee, 0xce, 0xe0, 0xbf,
+ 0x07, 0x22, 0xea, 0xbf,
+ 0xf1, 0x23, 0x2f, 0xfd, 0x01, 0xf1, 0x12, 0x50, 0x0c, 0x0e, 0x34, 0x41,
+ 0x3e, 0x51, 0x10, 0x00,
+ 0x34, 0x43, 0x20, 0x0d, 0xe8, 0x00, 0x76, 0x10, 0x0d, 0x01, 0x34, 0x10,
+ 0x0d, 0x10, 0x53, 0x0f,
+ 0xef, 0xe1, 0xf2, 0xdd, 0xce, 0x03, 0xf1, 0xd0, 0xd1, 0xe5, 0x12, 0x75,
+ 0x0d, 0xdb, 0xc1, 0x03,
+ 0xe1, 0x00, 0x42, 0xfe, 0xcc, 0x02, 0x01, 0xff, 0x12, 0x11, 0xfe, 0xcf,
+ 0xbb, 0xef, 0x37, 0x73,
+ 0x0e, 0xda, 0xe0, 0xf0, 0xd0, 0x00, 0x12, 0x41, 0x42, 0xfa, 0xbe, 0x02,
+ 0x12, 0x0e, 0x00, 0x01,
+ 0xde, 0xf0, 0xf0, 0xf0, 0x30, 0x21, 0xf0, 0xf0, 0x0f, 0xfe, 0xde, 0x00,
+ 0x03, 0x9d, 0xe6, 0x13,
+ 0x30, 0x0d, 0x88, 0xdd, 0x16, 0x10, 0xce, 0xe0, 0x00, 0x10, 0x20, 0x42,
+ 0x20, 0x0e, 0x0d, 0x00,
+ 0x02, 0xd0, 0xd1, 0xde, 0xdd, 0x77, 0x57, 0xfd, 0x00, 0x22, 0xfd, 0xe0,
+ 0x64, 0x31, 0x1d, 0x10,
+ 0x0f, 0x0d, 0x21, 0x63, 0x10, 0x00, 0x02, 0x0d, 0xec, 0xc0, 0xf3, 0x01,
+ 0x09, 0x0f, 0x45, 0x10,
+ 0xbb, 0x00, 0xff, 0x0e, 0x42, 0x31, 0xfc, 0xbe, 0x02, 0x13, 0x0e, 0xfd,
+ 0x12, 0xff, 0x00, 0x00,
+ 0xdd, 0xec, 0x20, 0x43, 0xfe, 0x8c, 0xf6, 0x01, 0xf0, 0xfe, 0xef, 0xee,
+ 0xe0, 0x24, 0x20, 0xfd,
+ 0xf3, 0x05, 0xff, 0x1f, 0x50, 0x43, 0x32, 0xfd, 0xc0, 0x27, 0x47, 0xfd,
+ 0xe0, 0x61, 0x10, 0x00,
+ 0x34, 0x10, 0xb9, 0xf0, 0x23, 0x31, 0x30, 0x0f, 0xcf, 0x31, 0x72, 0x00,
+ 0x0e, 0xf3, 0x00, 0x0f,
+ 0x47, 0x41, 0x20, 0x0d, 0x0f, 0xff, 0x03, 0x21, 0x0d, 0x00, 0x56, 0x30,
+ 0xdd, 0x8d, 0xf1, 0x01,
+ 0x11, 0x12, 0x32, 0x40, 0x2d, 0xfa, 0x02, 0x03, 0x10, 0x0d, 0xcb, 0xde,
+ 0x03, 0x02, 0xf0, 0xfc,
+ 0xde, 0xd2, 0xd3, 0x8a, 0xd0, 0x03, 0xde, 0xac, 0x03, 0xf2, 0xdc, 0xef,
+ 0x00, 0x02, 0x32, 0x0f,
+ 0x0e, 0x03, 0xf0, 0xbc, 0xcf, 0x05, 0x37, 0x33, 0xdc, 0xbf, 0xf2, 0x04,
+ 0xef, 0xf0, 0x42, 0x20,
+ 0x0c, 0x01, 0xd0, 0x90, 0x0f, 0x14, 0x00, 0xee, 0xef, 0x01, 0x26, 0x30,
+ 0x0e, 0x20, 0x3e, 0x5f,
+ 0x60, 0x34, 0x0f, 0xea, 0x00, 0x33, 0x10, 0xfd, 0xff, 0x21, 0x63, 0x0b,
+ 0xde, 0x01, 0x0e, 0x0f,
+ 0x73, 0x20, 0x1d, 0x24, 0x0d, 0x1f, 0x30, 0xd9, 0xb1, 0x07, 0x0f, 0x0e,
+ 0x31, 0xd0, 0xf0, 0x0f,
+ 0x8b, 0xef, 0x13, 0x30, 0xdc, 0x8e, 0x04, 0x13, 0x0f, 0x0c, 0xdf, 0x00,
+ 0x56, 0x00, 0xfd, 0x00,
+ 0x00, 0xf0, 0xdf, 0x12, 0x22, 0xfe, 0xdd, 0xd0, 0xd0, 0x17, 0x1e, 0xff,
+ 0x72, 0x52, 0x0d, 0x04,
+ 0x11, 0xfb, 0xef, 0x02, 0x33, 0x00, 0xda, 0xf0, 0x33, 0x10, 0x0e, 0xff,
+ 0x31, 0x40, 0xcd, 0xbe,
+ 0x03, 0x33, 0x74, 0x3e, 0xf8, 0xdf, 0x00, 0x12, 0x31, 0x00, 0x0f, 0x10,
+ 0x30, 0x0f, 0x0d, 0x0f,
+ 0xbc, 0xe1, 0x03, 0xde, 0xde, 0x22, 0x10, 0x88, 0xee, 0x44, 0x1f, 0xeb,
+ 0x22, 0x72, 0x1f, 0x0e,
+ 0x10, 0x13, 0x13, 0x10, 0x0e, 0xcb, 0xe0, 0xe2, 0xf2, 0xf2, 0x8c, 0xdc,
+ 0x03, 0x02, 0xf0, 0xf0,
+ 0x01, 0xee, 0xdd, 0xe2, 0x05, 0x01, 0xcf, 0xed, 0x01, 0x26, 0xe0, 0x8e,
+ 0xe1, 0x05, 0x0f, 0x00,
+ 0x01, 0x20, 0x20, 0x65, 0x31, 0x2d, 0x1d, 0x31, 0x32, 0x2e, 0x1d, 0x32,
+ 0x10, 0xfe, 0x45, 0x72,
+ 0x1a, 0x00, 0x21, 0x10, 0x3f, 0x72, 0x32, 0x22, 0x10, 0xf8, 0xc0, 0xf1,
+ 0x13, 0x40, 0x0e, 0x10,
+ 0x34, 0x0c, 0xdd, 0x01, 0x52, 0xfa, 0xc0, 0x02, 0xf0, 0xee, 0xce, 0xe2,
+ 0xf3, 0x00, 0xfd, 0x0f,
+ 0x20, 0xf0, 0x06, 0x00, 0xce, 0xb1, 0xf5, 0x10, 0x0e, 0xbf, 0xd0, 0xc0,
+ 0xe1, 0x47, 0x55, 0x0c,
+ 0x0f, 0xf0, 0xd0, 0xf0, 0x24, 0x21, 0xcd, 0x00, 0x43, 0x11, 0xfe, 0xef,
+ 0xf0, 0xc1, 0xaf, 0x05,
+ 0x01, 0xfb, 0xd0, 0x0f, 0xf1, 0xe1, 0xe0, 0x32, 0x72, 0x2e, 0x0e, 0x27,
+ 0x20, 0xfe, 0xf0, 0x01,
+ 0xcc, 0x00, 0x75, 0x10, 0x0d, 0x01, 0x04, 0x10, 0x0c, 0xe0, 0x01, 0x32,
+ 0x20, 0x0f, 0xd0, 0xe2,
+ 0x00, 0x7d, 0x2a, 0x41, 0x56, 0x0f, 0xcb, 0xf2, 0x01, 0xff, 0xcf, 0xf0,
+ 0xf3, 0xf0, 0xfd, 0x00,
+ 0x12, 0x2f, 0x1b, 0x33, 0x01, 0xbd, 0x11, 0x44, 0xab, 0xe0, 0x27, 0x1f,
+ 0xed, 0xe0, 0xb0, 0xf1,
+ 0xf0, 0xef, 0x02, 0x21, 0xfe, 0x00, 0x40, 0x00, 0xe1, 0x00, 0x2e, 0x4f,
+ 0x77, 0x52, 0x1e, 0x1f,
+ 0x11, 0x21, 0x24, 0x00, 0x0b, 0xd0, 0xf0, 0x00, 0x15, 0x30, 0x00, 0xfe,
+ 0xe0, 0x01, 0x03, 0xf2,
+ 0xf0, 0x71, 0x31, 0x1e, 0x2e, 0x1d, 0xca, 0xd0, 0x67, 0x44, 0x00, 0xec,
+ 0xaf, 0xe0, 0x02, 0x36,
+ 0x1f, 0xfe, 0xe0, 0xf1, 0xf0, 0x1f, 0x21, 0xce, 0xdf, 0x26, 0x40, 0x00,
+ 0xed, 0xf0, 0x03, 0x40,
+ 0x30, 0x0f, 0x0e, 0xe0, 0xef, 0x30, 0x2f, 0x8d, 0xe3, 0x27, 0x40, 0x0c,
+ 0xe0, 0xc0, 0xdf, 0x43,
+ 0x22, 0xbb, 0xcf, 0xee, 0xfe, 0x02, 0x04, 0xdc, 0xf0, 0xf0, 0x0e, 0x31,
+ 0x77, 0x30, 0x0f, 0xff,
+ 0xef, 0x00, 0x16, 0x30, 0x1d, 0x00, 0xf0, 0x01, 0x20, 0x10, 0x73, 0x30,
+ 0x2e, 0x77, 0x30, 0x0c,
+ 0xff, 0x01, 0x12, 0xfd, 0x23, 0x76, 0x0f, 0xfd, 0xe0, 0xe0, 0xe2, 0xc0,
+ 0xd1, 0xd2, 0xf0, 0xcd,
+ 0xee, 0xf2, 0x04, 0xde, 0xdd, 0xe3, 0x25, 0x70, 0x0a, 0xde, 0xe1, 0x04,
+ 0x00, 0xf0, 0x0e, 0x10,
+ 0xf0, 0xbd, 0x27, 0x00, 0xdd, 0x62, 0x52, 0x0c, 0xfe, 0xf1, 0x03, 0x1f,
+ 0x0d, 0x0f, 0xcc, 0xbb,
+ 0xe1, 0x15, 0x20, 0xfc, 0xf0, 0x11, 0x23, 0x0f, 0x0e, 0x00, 0x0d, 0x74,
+ 0x44, 0x10, 0x0e, 0x21,
+ 0x34, 0x1f, 0x2f, 0x73, 0x21, 0x0e, 0x1d, 0x25, 0x56, 0x1f, 0x0e, 0x00,
+ 0x00, 0xe2, 0xe2, 0xbd,
+ 0xff, 0x16, 0x00, 0xfe, 0x00, 0xe0, 0x02, 0x65, 0x0f, 0xfe, 0x01, 0xf2,
+ 0xe0, 0xef, 0xee, 0xbd,
+ 0xbd, 0xdd, 0xd0, 0x05, 0x33, 0x1c, 0xfb, 0xf1, 0x04, 0xdd, 0xac, 0x02,
+ 0x12, 0x10, 0x10, 0xfc,
+ 0xef, 0x00, 0x31, 0x30, 0xdc, 0xd0, 0x01, 0x44, 0x30, 0x1c, 0x1e, 0x42,
+ 0xe0, 0x8e, 0xe1, 0x04,
+ 0xeb, 0xe0, 0x05, 0x9e, 0xbb, 0xe0, 0xf1, 0xee, 0xf0, 0x13, 0x20, 0xee,
+ 0xe0, 0x02, 0x0e, 0x61,
+ 0x32, 0x2d, 0x1d, 0x1f, 0x13, 0x11, 0x12, 0x47, 0x33, 0xf8, 0xe0, 0xf2,
+ 0xd0, 0x9f, 0xf0, 0x0f,
+ 0x0c, 0x10, 0x11, 0x45, 0x20, 0x1f, 0x40, 0x42, 0x20, 0x10, 0xe0, 0x9f,
+ 0x03, 0x17, 0x10, 0xca,
+ 0xd0, 0x01, 0x02, 0xee, 0x0f, 0x62, 0x1f, 0x0d, 0x34, 0x1e, 0x0c, 0xf0,
+ 0xf0, 0x10, 0x75, 0x4f,
+ 0x0b, 0x1f, 0x21, 0x20, 0x2f, 0x20, 0x0d, 0xde, 0xf3, 0x05, 0x40, 0x0e,
+ 0xdb, 0x00, 0x51, 0x00,
+ 0x0f, 0x03, 0xe0, 0xfe, 0x32, 0xff, 0xbd, 0x11, 0x0e, 0xac, 0xc0, 0xce,
+ 0xe0, 0x07, 0x02, 0xdf,
+ 0xdf, 0x03, 0x12, 0x40, 0x67, 0x1f, 0xfc, 0xee, 0xf2, 0x02, 0x02, 0x10,
+ 0x10, 0xcd, 0xbf, 0xf0,
+ 0x00, 0x0d, 0xde, 0xff, 0x10, 0x75, 0x46, 0x31, 0x0c, 0x0e, 0x00, 0x13,
+ 0x10, 0x10, 0x20, 0x00,
+ 0x00, 0x0e, 0x0a, 0x52, 0x42, 0x0a, 0x1e, 0x30, 0x11, 0xde, 0x13, 0x74,
+ 0x50, 0x20, 0x0d, 0x0e,
+ 0x05, 0x03, 0x09, 0xf0, 0x00, 0xae, 0xdf, 0xe2, 0xd2, 0xde, 0xe1, 0xe0,
+ 0xbb, 0xc0, 0x03, 0x25,
+ 0x0c, 0xef, 0x12, 0x20, 0xee, 0xf0, 0x06, 0xe0, 0x8e, 0xdf, 0xf1, 0x03,
+ 0xdd, 0xfd, 0x12, 0x36,
+ 0x00, 0xdf, 0xdf, 0xe1, 0xe4, 0x00, 0x60, 0x62, 0x22, 0x32, 0x1f, 0x3d,
+ 0x13, 0x13, 0xf0, 0xef,
+ 0xf1, 0xe1, 0x0e, 0xd8, 0xde, 0x67, 0x64, 0x2f, 0x0d, 0x20, 0x10, 0x20,
+ 0x30, 0x20, 0x10, 0x2f,
+ 0x0d, 0x20, 0x41, 0x53, 0x1d, 0x08, 0x50, 0x13, 0x0d, 0x02, 0x34, 0xed,
+ 0xdf, 0x34, 0x73, 0x1c,
+ 0x0d, 0x01, 0x21, 0x0f, 0x0e, 0xfb, 0xbd, 0xef, 0x07, 0xf1, 0xff, 0xff,
+ 0xbd, 0xd0, 0x07, 0x00,
+ 0xb0, 0xdf, 0xdf, 0xbf, 0xe0, 0xd1, 0xc0, 0xde, 0x02, 0x11, 0x00, 0xe0,
+ 0x00, 0x07, 0xd0, 0xc0,
+ 0xb0, 0xee, 0x02, 0x12, 0xff, 0xf0, 0x26, 0x61, 0x10, 0x30, 0x51, 0x12,
+ 0x23, 0x10, 0x11, 0x46,
+ 0x10, 0x0e, 0x00, 0x44, 0x65, 0x30, 0x3d, 0x1f, 0x12, 0x21, 0x3f, 0x20,
+ 0x25, 0x56, 0x1f, 0xfc,
+ 0xf1, 0x13, 0x30, 0x0f, 0xef, 0xe0, 0xef, 0xe0, 0x12, 0x00, 0x9d, 0xee,
+ 0x24, 0x45, 0x0e, 0x00,
+ 0x12, 0x0d, 0x0d, 0x30, 0x02, 0x8e, 0xce, 0xe5, 0xe2, 0xcd, 0xc0, 0xe3,
+ 0xef, 0xe0, 0xf0, 0xef,
+ 0xf4, 0x17, 0x01, 0x00, 0xff, 0xac, 0xe0, 0x04, 0xf1, 0xcf, 0xcd, 0xe1,
+ 0xe7, 0xe0, 0xce, 0xf2,
+ 0x05, 0xe0, 0xad, 0xe0, 0xf2, 0x01, 0x12, 0x20, 0x20, 0x20, 0x44, 0x0d,
+ 0xeb, 0x14, 0x54, 0x0d,
+ 0xfe, 0x00, 0x01, 0x0f, 0x63, 0x2f, 0x1f, 0x27, 0x30, 0x3f, 0x4e, 0x21,
+ 0x13, 0x01, 0x1f, 0x2c,
+ 0x5f, 0x10, 0xf0, 0x21, 0x74, 0x2e, 0x2e, 0x23, 0x46, 0x1c, 0x0b, 0x00,
+ 0x02, 0xef, 0xbd, 0xde,
+ 0xbf, 0xf1, 0x03, 0x0b, 0xfb, 0xe0, 0xf0, 0xf1, 0xe1, 0xdf, 0x05, 0x05,
+ 0x56, 0x00, 0x8b, 0x00,
+ 0xeb, 0xf5, 0x73, 0xb7, 0x1c, 0xf5, 0xca, 0xb8, 0x0c, 0x8a, 0x00, 0x00,
+ 0x00, 0xbe, 0x0e, 0x0e,
+ 0x5e, 0x10, 0xf0, 0xf0, 0xf9, 0x0e, 0x20, 0x23, 0xe1, 0xc0, 0xeb, 0x0f,
+ 0x11, 0x90, 0xd8, 0x0e,
+ 0x72, 0x03, 0xee, 0x1f, 0x43, 0x00, 0xf0, 0xeb, 0xef, 0x41, 0x01, 0xe0,
+ 0xe0, 0x02, 0xee, 0xe0,
+ 0x0f, 0x0d, 0x23, 0x17, 0xf0, 0xdb, 0x70, 0x40, 0xdd, 0xfd, 0x77, 0x11,
+ 0xdd, 0xe0, 0x22, 0x02,
+ 0xfe, 0xee, 0x23, 0x11, 0xe0, 0x00, 0x77, 0x03, 0xab, 0x00, 0x0f, 0x2f,
+ 0x01, 0x04, 0x00, 0xee,
+ 0xef, 0x11, 0x44, 0x00, 0x01, 0xf0, 0xf1, 0xf1, 0xc0, 0x33, 0x3f, 0x88,
+ 0xf0, 0x16, 0x20, 0xde,
+ 0xf0, 0x10, 0x42, 0x10, 0x02, 0xef, 0x8c, 0x00, 0x26, 0x20, 0xed, 0x0e,
+ 0x12, 0x00, 0xff, 0x00,
+ 0x24, 0x0f, 0x0f, 0x63, 0x12, 0xee, 0x0f, 0x01, 0x13, 0x44, 0x04, 0xf0,
+ 0x0d, 0xfd, 0x0f, 0x53,
+ 0x11, 0x0b, 0x00, 0x43, 0xce, 0xdb, 0x12, 0x00, 0xf2, 0x67, 0x00, 0xee,
+ 0x0f, 0x3f, 0x10, 0x25,
+ 0x00, 0x8b, 0x11, 0x55, 0x00, 0xcd, 0x02, 0x32, 0xed, 0x00, 0x13, 0x02,
+ 0x0f, 0xfd, 0x01, 0x47,
+ 0x32, 0x0d, 0xfe, 0x01, 0xf0, 0xcd, 0xfd, 0x00, 0x67, 0x02, 0xae, 0x1f,
+ 0x22, 0x0f, 0xef, 0x0f,
+ 0xd9, 0xe0, 0x72, 0x14, 0xec, 0xdd, 0x31, 0x33, 0xef, 0xff, 0xf0, 0xdf,
+ 0xee, 0x00, 0x04, 0x00,
+ 0xee, 0xac, 0xe0, 0x32, 0x43, 0x0f, 0xca, 0x2f, 0x21, 0x03, 0xa0, 0x0d,
+ 0x10, 0x17, 0x22, 0x00,
+ 0xed, 0xe0, 0xf0, 0x00, 0x0d, 0xf1, 0x16, 0xff, 0x4f, 0x30, 0x8e, 0xf0,
+ 0xff, 0x0b, 0x02, 0x75,
+ 0x00, 0x00, 0xee, 0x00, 0x10, 0xf0, 0xe0, 0xec, 0x02, 0x03, 0xcf, 0x30,
+ 0x2f, 0xdd, 0xc0, 0xfe,
+ 0x15, 0x57, 0xcf, 0xca, 0x10, 0x41, 0xf0, 0xf0, 0xed, 0xfe, 0xfe, 0x00,
+ 0x5f, 0x33, 0xf3, 0xad,
+ 0x0d, 0x00, 0xfa, 0xff, 0x30, 0x00, 0xef, 0xe0, 0xdc, 0xfe, 0x0f, 0x00,
+ 0x25, 0x1f, 0xc9, 0xf0,
+ 0x1f, 0x00, 0xf0, 0x9f, 0x00, 0x40, 0xef, 0x22, 0x75, 0xdd, 0xbb, 0x01,
+ 0x33, 0x00, 0xe1, 0x24,
+ 0x40, 0xfd, 0xee, 0x0c, 0x00, 0x27, 0x22, 0xbf, 0xfd, 0x10, 0x62, 0x02,
+ 0x00, 0x40, 0x01, 0xe2,
+ 0x15, 0x20, 0x1e, 0x0f, 0x12, 0x32, 0x02, 0xe2, 0xbf, 0xfb, 0x01, 0x14,
+ 0x20, 0x0e, 0xc0, 0xbe,
+ 0x1f, 0x60, 0x01, 0x00, 0x04, 0x30, 0xfb, 0xfe, 0x0f, 0x10, 0x31, 0x47,
+ 0x55, 0xf0, 0xde, 0xed,
+ 0xf0, 0xdf, 0x03, 0x52, 0xf0, 0xbb, 0x00, 0x40, 0x12, 0xfe, 0x01, 0x16,
+ 0xeb, 0xbe, 0x03, 0x54,
+ 0x0f, 0xbc, 0x0f, 0x24, 0x11, 0xed, 0xf0, 0x11, 0x22, 0x00, 0x01, 0xf3,
+ 0xe0, 0x02, 0x00, 0xfb,
+ 0xf0, 0x00, 0x04, 0x12, 0x24, 0x21, 0x9b, 0xde, 0x44, 0x25, 0x00, 0xef,
+ 0xee, 0x01, 0x51, 0x42,
+ 0x00, 0xf2, 0xdf, 0xbd, 0xf0, 0x03, 0x0e, 0x0f, 0x44, 0x01, 0x0f, 0x2e,
+ 0xfc, 0xbe, 0x20, 0x67,
+ 0x00, 0xda, 0x01, 0x02, 0x10, 0x2d, 0xdc, 0x00, 0x22, 0x50, 0x2f, 0x00,
+ 0xef, 0xec, 0x30, 0x2f,
+ 0x30, 0x1d, 0xfe, 0x24, 0xf1, 0x8f, 0x00, 0x37, 0x20, 0x00, 0xac, 0xf0,
+ 0x00, 0x00, 0x02, 0xdd,
+ 0xed, 0x13, 0x16, 0x12, 0x00, 0xad, 0xed, 0x22, 0x11, 0xef, 0xf1, 0x04,
+ 0xee, 0xbe, 0x15, 0x65,
+ 0x33, 0xe0, 0x8c, 0x0f, 0x21, 0x21, 0xf3, 0xf4, 0x0f, 0x0b, 0x10, 0xf2,
+ 0x00, 0xf1, 0x23, 0x13,
+ 0xcd, 0xf9, 0x50, 0x53, 0x00, 0xfc, 0x00, 0x01, 0x32, 0x3f, 0x00, 0xf3,
+ 0xc0, 0x22, 0x33, 0xfd,
+ 0xdf, 0x24, 0x44, 0x0c, 0xfd, 0x41, 0x66, 0x0e, 0xed, 0x10, 0x00, 0x01,
+ 0xff, 0x0c, 0x00, 0xf0,
+ 0xfe, 0x7f, 0x1a, 0xde, 0x13, 0x36, 0xf0, 0xbc, 0xf0, 0x11, 0x21, 0x01,
+ 0xf0, 0x8d, 0xb9, 0x02,
+ 0x32, 0xf0, 0x01, 0x03, 0xfe, 0xff, 0x25, 0x34, 0x00, 0xbe, 0x00, 0x26,
+ 0x11, 0xd0, 0xb0, 0x0f,
+ 0x00, 0xf2, 0x00, 0x02, 0x13, 0xc0, 0xe0, 0x54, 0x2f, 0xeb, 0xe1, 0x55,
+ 0x00, 0xec, 0xe0, 0xe0,
+ 0x41, 0x53, 0x00, 0xfe, 0xfd, 0x0e, 0x01, 0x04, 0x0f, 0x1b, 0x30, 0x44,
+ 0x10, 0x0d, 0x0c, 0x31,
+ 0x0f, 0xac, 0x31, 0x45, 0x0e, 0xed, 0x20, 0x0e, 0xdf, 0x23, 0x70, 0x2a,
+ 0xf0, 0xd0, 0x20, 0x60,
+ 0x0e, 0xdc, 0x1f, 0x20, 0x01, 0x25, 0x1f, 0xcb, 0xff, 0x02, 0x13, 0xdf,
+ 0xac, 0xed, 0x00, 0x12,
+ 0xfd, 0x0d, 0xe0, 0xff, 0x01, 0x45, 0xfe, 0xec, 0x00, 0x65, 0xf3, 0xbf,
+ 0xdb, 0x10, 0x20, 0x01,
+ 0x00, 0x11, 0x0e, 0x8d, 0x13, 0x26, 0x0e, 0x20, 0x22, 0x01, 0xff, 0xd1,
+ 0xf5, 0xe3, 0x0e, 0x1c,
+ 0x72, 0x44, 0xe0, 0xed, 0x00, 0x12, 0xee, 0xd0, 0x67, 0x20, 0xfe, 0xd0,
+ 0x00, 0x33, 0x20, 0x00,
+ 0x10, 0x14, 0xe0, 0xad, 0x01, 0x56, 0xfe, 0xef, 0x20, 0x11, 0x31, 0x24,
+ 0xf0, 0xa8, 0x10, 0x52,
+ 0x02, 0xed, 0xfd, 0x31, 0x33, 0xc0, 0xdd, 0xfd, 0x00, 0x22, 0x01, 0x0e,
+ 0xbf, 0xf2, 0x07, 0x16,
+ 0xfe, 0xe0, 0xde, 0xd0, 0x00, 0x41, 0x10, 0xae, 0xdd, 0xed, 0x00, 0xef,
+ 0xec, 0x35, 0x11, 0xcf,
+ 0xff, 0xaa, 0xef, 0x03, 0x16, 0x00, 0xbd, 0xf0, 0x23, 0x0f, 0xed, 0x00,
+ 0x01, 0x20, 0x9b, 0x01,
+ 0x45, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x40, 0x10, 0xca, 0xce, 0x00, 0x42,
+ 0x00, 0x10, 0x33, 0xcf,
+ 0xda, 0x21, 0x21, 0x01, 0x00, 0xd0, 0xf0, 0x3e, 0x6f, 0x0f, 0xfe, 0xdc,
+ 0x21, 0x07, 0x80, 0xf0,
+ 0x23, 0x22, 0xdb, 0x00, 0x31, 0x00, 0xec, 0x11, 0x20, 0x21, 0x73, 0xec,
+ 0xab, 0x00, 0x03, 0x00,
+ 0xfd, 0xef, 0x22, 0x35, 0xfe, 0xde, 0x1f, 0x51, 0x02, 0xe2, 0x14, 0x3f,
+ 0x0c, 0xf0, 0x22, 0x0f,
+ 0xf1, 0x67, 0x41, 0xfd, 0xff, 0x03, 0x00, 0xca, 0xce, 0x00, 0xc1, 0x00,
+ 0x71, 0x24, 0xff, 0xec,
+ 0x13, 0x12, 0x00, 0xfd, 0x0e, 0x40, 0x32, 0x04, 0xcf, 0xdd, 0x14, 0x0e,
+ 0xea, 0x30, 0x73, 0xd0,
+ 0xe6, 0x23, 0xdc, 0xee, 0x03, 0x40, 0x30, 0x20, 0xf1, 0x9d, 0xfb, 0x00,
+ 0x33, 0x02, 0xde, 0xf1,
+ 0x00, 0x89, 0x0f, 0x03, 0x13, 0x0d, 0x0d, 0x02, 0x13, 0xc9, 0x0e, 0xf0,
+ 0xf1, 0x13, 0x0d, 0x98,
+ 0xf0, 0x11, 0x00, 0xfd, 0xe0, 0x11, 0x0f, 0xab, 0x00, 0x51, 0x0e, 0xef,
+ 0x23, 0x34, 0x0e, 0x0e,
+ 0xef, 0xee, 0x21, 0x74, 0x02, 0xdc, 0xfe, 0x01, 0x03, 0x21, 0x10, 0x2e,
+ 0x0f, 0xb0, 0x03, 0x37,
+ 0x57, 0xde, 0xed, 0x33, 0x20, 0xde, 0x00, 0x04, 0x0f, 0x0e, 0x00, 0x10,
+ 0xf0, 0x02, 0xf1, 0x92,
+ 0x01, 0x42, 0x77, 0x00, 0xea, 0x10, 0x42, 0xf1, 0xef, 0x0f, 0x14, 0x42,
+ 0x0f, 0xf9, 0xf0, 0x01,
+ 0x11, 0xe0, 0x20, 0x70, 0x01, 0xef, 0x0f, 0x10, 0x0f, 0x2e, 0x3f, 0x43,
+ 0x17, 0x02, 0x0f, 0x0e,
+ 0xbe, 0xde, 0xef, 0xf0, 0xe1, 0xfd, 0xde, 0x53, 0x40, 0x0d, 0xce, 0x17,
+ 0x14, 0xef, 0x00, 0x71,
+ 0x2a, 0xfe, 0x00, 0x07, 0x10, 0xd0, 0xbe, 0x00, 0x30, 0x03, 0xaf, 0xee,
+ 0x03, 0x37, 0xf0, 0x10,
+ 0x75, 0x00, 0x01, 0x11, 0x00, 0xee, 0x00, 0xf0, 0x00, 0x32, 0x11, 0xee,
+ 0xd0, 0x15, 0xb0, 0xce,
+ 0x03, 0x45, 0x00, 0x0e, 0x00, 0xe3, 0xf2, 0x20, 0x5f, 0xeb, 0xd0, 0x34,
+ 0x63, 0xee, 0xfb, 0x00,
+ 0x01, 0x00, 0x00, 0x43, 0x62, 0xea, 0xef, 0x41, 0x22, 0x0f, 0x00, 0x13,
+ 0x10, 0x2a, 0xfc, 0xe0,
+ 0x11, 0x76, 0x30, 0xee, 0xcd, 0xf0, 0x12, 0x20, 0x00, 0x0d, 0xee, 0x44,
+ 0x12, 0xde, 0xfa, 0x00,
+ 0x00, 0xf3, 0x52, 0x20, 0xe0, 0xde, 0x0e, 0x5f, 0x52, 0x07, 0xe3, 0xdf,
+ 0xf0, 0x3f, 0x2f, 0x00,
+ 0x32, 0x13, 0x31, 0x13, 0x00, 0x02, 0x50, 0x30, 0x35, 0x77, 0x62, 0xde,
+ 0xd0, 0xf0, 0xfb, 0x20,
+ 0x21, 0xb1, 0x05, 0x41, 0x0e, 0xe0, 0x51, 0x01, 0xfc, 0x22, 0x44, 0x0f,
+ 0xfe, 0xfe, 0xee, 0x04,
+ 0xe1, 0xfd, 0x0d, 0x0f, 0xd0, 0xf7, 0x52, 0x2f, 0x0d, 0xfd, 0x30, 0x01,
+ 0xdf, 0x22, 0x10, 0xea,
+ 0x41, 0x34, 0x8e, 0xec, 0x00, 0x52, 0x01, 0x9d, 0x00, 0x04, 0x04, 0x11,
+ 0xec, 0xda, 0xfe, 0xf0,
+ 0x02, 0x01, 0xfe, 0xce, 0xf0, 0x01, 0xdc, 0xcf, 0x05, 0xf2, 0xdf, 0x50,
+ 0xed, 0x8d, 0x03, 0x23,
+ 0xec, 0xe0, 0x14, 0x0d, 0x1e, 0xfc, 0x0f, 0x00, 0xd0, 0xd2, 0x0f, 0x38,
+ 0x2f, 0x00, 0x00, 0x72,
+ 0x22, 0xbc, 0xca, 0x00, 0x00, 0x00, 0xe0, 0x60, 0x21, 0x00, 0xee, 0x0c,
+ 0x0e, 0x10, 0x03, 0x43,
+ 0x1c, 0x0a, 0x0d, 0xe0, 0xf0, 0xf2, 0x0c, 0x5c, 0x1e, 0x01, 0x56, 0x00,
+ 0xbc, 0xf0, 0x00, 0x00,
+ 0x10, 0x61, 0x01, 0x0d, 0xed, 0xff, 0xf0, 0x0f, 0xcd, 0x03, 0x02, 0xe8,
+ 0xd0, 0x54, 0x22, 0x20,
+ 0xed, 0xe0, 0x02, 0x11, 0xe0, 0x03, 0x55, 0x00, 0x90, 0xfd, 0x00, 0x00,
+ 0x37, 0x54, 0x01, 0xde,
+ 0xee, 0x00, 0x15, 0x62, 0x00, 0xfe, 0xcc, 0x12, 0x67, 0x10, 0xff, 0xee,
+ 0x22, 0x11, 0x21, 0x11,
+ 0x02, 0xe0, 0x0f, 0x21, 0x24, 0x42, 0xfd, 0xcb, 0x11, 0x64, 0x00, 0x0d,
+ 0xf0, 0xf1, 0x01, 0x10,
+ 0x20, 0xf1, 0xe0, 0x33, 0x54, 0xed, 0xf9, 0x20, 0x32, 0x00, 0x00, 0x0d,
+ 0xde, 0x25, 0x21, 0xd0,
+ 0x0e, 0x00, 0xe2, 0x32, 0x41, 0xbf, 0xef, 0xdc, 0x9a, 0xff, 0x10, 0x12,
+ 0x80, 0xdd, 0x01, 0x33,
+ 0xf0, 0xbc, 0x07, 0x04, 0xdf, 0xad, 0x02, 0x25, 0x00, 0xff, 0xf0, 0xf0,
+ 0x00, 0x02, 0xee, 0xdc,
+ 0x00, 0xf1, 0x00, 0x0f, 0xf0, 0x34, 0x63, 0x0d, 0x0b, 0x0f, 0x30, 0x1d,
+ 0x8a, 0xf1, 0x13, 0x10,
+ 0xfd, 0x0e, 0x21, 0x54, 0x13, 0xff, 0xbd, 0xff, 0x24, 0x73, 0x0d, 0x0a,
+ 0xef, 0x01, 0x32, 0x10,
+ 0xfd, 0xe0, 0x00, 0x3e, 0x0f, 0x00, 0xff, 0x0b, 0x10, 0x01, 0x55, 0x31,
+ 0x30, 0x2d, 0xec, 0xae,
+ 0xfd, 0xd0, 0x33, 0x4c, 0xf9, 0x02, 0x04, 0x20, 0xfc, 0x8e, 0xed, 0xfd,
+ 0x40, 0x10, 0xef, 0xe0,
+ 0x14, 0x0e, 0xbc, 0x00, 0x0e, 0x10, 0x15, 0xff, 0xff, 0xf0, 0x1f, 0x2f,
+ 0xc0, 0xc1, 0x06, 0x40,
+ 0x00, 0x15, 0xc0, 0xcf, 0x00, 0x00, 0x22, 0x0c, 0xcc, 0x11, 0x21, 0x1d,
+ 0x0e, 0xff, 0x15, 0x75,
+ 0xfd, 0xab, 0x01, 0x02, 0x01, 0x02, 0x1e, 0xfc, 0xdd, 0xf0, 0x10, 0x42,
+ 0xf3, 0xde, 0x00, 0xe2,
+ 0xd0, 0x61, 0x3d, 0x08, 0xd8, 0x01, 0x01, 0xe0, 0x72, 0x71, 0x0f, 0x0e,
+ 0x00, 0xf3, 0x00, 0x0e,
+ 0x2f, 0x22, 0xf0, 0xce, 0x05, 0x03, 0x10, 0xed, 0x00, 0x2f, 0x42, 0xb3,
+ 0xf3, 0x11, 0x08, 0x0f,
+ 0xe0, 0x17, 0x21, 0x0e, 0xbf, 0x22, 0x01, 0xdf, 0xed, 0x00, 0xf4, 0x80,
+ 0xfe, 0x0d, 0x4f, 0x03,
+ 0xe2, 0xde, 0x0f, 0x15, 0x42, 0xff, 0xe0, 0x25, 0x4f, 0xda, 0xff, 0x65,
+ 0x42, 0x1f, 0x2e, 0x20,
+ 0x01, 0xf2, 0xf4, 0x21, 0x10, 0xe0, 0xd2, 0x22, 0x70, 0x0b, 0xdf, 0x20,
+ 0x00, 0xf0, 0x33, 0x71,
+ 0x0e, 0xd3, 0x07, 0x22, 0x0e, 0x01, 0x24, 0x0e, 0x2b, 0x30, 0x20, 0x04,
+ 0xd2, 0xce, 0x1f, 0x1f,
+ 0xbf, 0x41, 0x75, 0x2e, 0x0a, 0xd0, 0x00, 0x65, 0x20, 0xff, 0xff, 0x0f,
+ 0xee, 0x31, 0x41, 0x9d,
+ 0xfd, 0x05, 0x12, 0x0d, 0x20, 0x23, 0xf0, 0xc8, 0xff, 0x10, 0x45, 0xf0,
+ 0xae, 0xff, 0x00, 0xe0,
+ 0x00, 0x12, 0x32, 0xde, 0xdf, 0x01, 0x40, 0xf0, 0xd0, 0x00, 0x26, 0x50,
+ 0xec, 0xf0, 0x02, 0xd1,
+ 0xc1, 0xe0, 0xf0, 0xdf, 0x01, 0x77, 0x03, 0xda, 0xe0, 0xf0, 0x10, 0x52,
+ 0x30, 0x00, 0xb1, 0x02,
+ 0x00, 0xfe, 0xdb, 0x0f, 0x30, 0x04, 0xf0, 0x01, 0x76, 0x21, 0x00, 0xdd,
+ 0xde, 0x21, 0x13, 0x10,
+ 0x0c, 0x00, 0xdd, 0x40, 0x32, 0x9f, 0xd8, 0x21, 0x00, 0xbf, 0xec, 0x11,
+ 0x65, 0x00, 0xfa, 0x00,
+ 0x2f, 0x00, 0xf0, 0xf0, 0x10, 0x20, 0xfd, 0xa0, 0x13, 0x44, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0xf0, 0x14,
+ 0x5f, 0x2c, 0x21, 0x04, 0x02, 0xe0, 0x9d, 0xff, 0x02, 0x51, 0x22, 0x07,
+ 0xd0, 0xd0, 0x00, 0x40,
+ 0x42, 0xf3, 0xd1, 0x00, 0x05, 0x30, 0xf0, 0xe3, 0x12, 0x55, 0x03, 0xde,
+ 0xdf, 0x13, 0x66, 0x10,
+ 0x1f, 0x01, 0xf5, 0x00, 0x32, 0x1e, 0x0d, 0x61, 0x13, 0x01, 0xe1, 0x01,
+ 0x22, 0x31, 0x00, 0xfb,
+ 0x2f, 0x60, 0x25, 0x44, 0xfd, 0x99, 0x00, 0x22, 0x00, 0xed, 0xe0, 0x00,
+ 0x00, 0xdd, 0xeb, 0x20,
+ 0x71, 0x41, 0xdb, 0xee, 0x10, 0x10, 0x2f, 0x11, 0x0d, 0xdb, 0xf0, 0xf0,
+ 0x12, 0x34, 0x00, 0xe9,
+ 0x30, 0x50, 0xf1, 0x90, 0xfd, 0x01, 0x12, 0x42, 0x22, 0x03, 0xf0, 0x0c,
+ 0xfb, 0xbe, 0x01, 0x16,
+ 0x00, 0x10, 0x1f, 0xc0, 0xd1, 0xd1, 0x03, 0xe0, 0xd1, 0xa0, 0xda, 0x10,
+ 0x40, 0x02, 0xf3, 0x00,
+ 0x0c, 0x8d, 0xde, 0x31, 0x40, 0xfb, 0xcf, 0xf0, 0x03, 0xed, 0x0c, 0x00,
+ 0x3e, 0xfb, 0x30, 0x22,
+ 0xbf, 0x0e, 0x66, 0x22, 0xfe, 0xdb, 0x12, 0x34, 0x0e, 0xcc, 0x00, 0x00,
+ 0x40, 0xf2, 0xff, 0x10,
+ 0x2f, 0x00, 0x3d, 0x50, 0x02, 0xf0, 0xf0, 0xe4, 0xd4, 0xce, 0xaa, 0xee,
+ 0xf0, 0x20, 0x52, 0xec,
+ 0xdf, 0x47, 0x33, 0xd0, 0xcd, 0x20, 0x42, 0x12, 0xf2, 0xff, 0x0d, 0x50,
+ 0x00, 0x0e, 0x0f, 0x14,
+ 0x05, 0x00, 0xde, 0xdf, 0x01, 0x00, 0x55, 0x54, 0x00, 0xfa, 0x10, 0x64,
+ 0x01, 0x01, 0x00, 0x2e,
+ 0x00, 0x12, 0x11, 0xed, 0xed, 0x11, 0x05, 0xe0, 0x2f, 0x7f, 0x20, 0xb2,
+ 0x03, 0x2b, 0xfb, 0xce,
+ 0x03, 0x24, 0x10, 0x1e, 0xff, 0xb0, 0x02, 0x13, 0xfa, 0x2e, 0x61, 0xe3,
+ 0xd0, 0xfe, 0x11, 0x13,
+ 0xd1, 0xae, 0x0c, 0x0e, 0xe9, 0xbf, 0x00, 0x04, 0x1e, 0x0e, 0xe0, 0xe3,
+ 0xf3, 0xbd, 0xfe, 0x25,
+ 0x01, 0xbf, 0xf1, 0xf4, 0xce, 0xdf, 0x02, 0x26, 0x10, 0xdd, 0xd2, 0x37,
+ 0x10, 0xc0, 0xe0, 0x20,
+ 0x23, 0x8e, 0xdc, 0x00, 0x01, 0x02, 0xed, 0xeb, 0x0f, 0x50, 0x25, 0x30,
+ 0x00, 0x40, 0x41, 0x10,
+ 0x10, 0x00, 0x00, 0xfc, 0x30, 0x35, 0x0f, 0x0d, 0x5c, 0x30, 0x10, 0x00,
+ 0xed, 0x0f, 0x77, 0x60,
+ 0xfd, 0x0e, 0x30, 0x10, 0x00, 0x00, 0x30, 0x08, 0xef, 0xe0, 0x42, 0x22,
+ 0xab, 0xe0, 0x00, 0x10,
+ 0x0c, 0xb0, 0x01, 0x11, 0x30, 0x1e, 0x00, 0xd2, 0xae, 0xf0, 0x26, 0x40,
+ 0xeb, 0xdf, 0xe0, 0x00,
+ 0xf1, 0x05, 0xdf, 0xbe, 0x00, 0x34, 0x02, 0xc1, 0xcf, 0xde, 0x00, 0xf0,
+ 0x32, 0x62, 0xfc, 0xee,
+ 0x37, 0x00, 0x8f, 0x0d, 0x01, 0x10, 0x0e, 0x01, 0xf2, 0x00, 0x2f, 0x24,
+ 0x00, 0xec, 0x00, 0x10,
+ 0x04, 0x0e, 0xd9, 0x21, 0x75, 0x70, 0x4b, 0xc0, 0x01, 0x12, 0x11, 0x0f,
+ 0xef, 0x00, 0x01, 0x0f,
+ 0xfe, 0x01, 0x00, 0x10, 0x5f, 0x20, 0x1e, 0x1e, 0x14, 0x24, 0xca, 0xee,
+ 0x20, 0x21, 0xf0, 0xc0,
+ 0xd0, 0xab, 0xfe, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x00, 0x04, 0xf1, 0xcc,
+ 0xda, 0x00, 0xe0, 0xe1,
+ 0x00, 0xcf, 0xc0, 0x05, 0x90, 0xed, 0x04, 0x33, 0xde, 0xde, 0x24, 0x42,
+ 0xeb, 0xef, 0x21, 0x25,
+ 0x00, 0xbe, 0xff, 0x00, 0x01, 0xd0, 0x54, 0x34, 0xef, 0xce, 0x20, 0x40,
+ 0x51, 0xf0, 0xd0, 0x10,
+ 0x61, 0x1d, 0x0c, 0x10, 0x34, 0x31, 0x0e, 0xfa, 0xe0, 0x34, 0x52, 0xfe,
+ 0xce, 0x01, 0xf5, 0xef,
+ 0xec, 0x30, 0x75, 0x60, 0x00, 0x11, 0xf0, 0x00, 0x13, 0x23, 0x05, 0x05,
+ 0x3b, 0x00, 0x55, 0x00,
+ 0x17, 0x33, 0xe1, 0x17, 0x09, 0x31, 0x61, 0x15, 0x45, 0x42, 0x20, 0x4d,
+ 0x00, 0xce, 0xd9, 0x1f,
+ 0x40, 0x57, 0x00, 0xef, 0xbf, 0x02, 0x23, 0x0b, 0xde, 0x11, 0x51, 0x00,
+ 0xeb, 0x00, 0x40, 0x03,
+ 0xc0, 0xdf, 0x00, 0x04, 0x42, 0x12, 0x12, 0x04, 0xd2, 0xd0, 0xed, 0x42,
+ 0x74, 0x00, 0xf1, 0xd4,
+ 0x01, 0x5d, 0x1d, 0x12, 0x05, 0xe0, 0x10, 0x22, 0x17, 0x13, 0xe0, 0xeb,
+ 0x2f, 0x70, 0x71, 0x03,
+ 0x10, 0xfc, 0xe0, 0x06, 0x31, 0x10, 0x0f, 0xbe, 0x0f, 0x32, 0x04, 0x12,
+ 0x00, 0x0f, 0x42, 0x26,
+ 0x00, 0xbb, 0x10, 0x40, 0x11, 0x12, 0x10, 0x10, 0xf0, 0xce, 0xff, 0x00,
+ 0x34, 0x03, 0x00, 0xfe,
+ 0xb9, 0xe0, 0x1f, 0x10, 0x01, 0x80, 0xdf, 0x1c, 0x1d, 0xfc, 0x02, 0x35,
+ 0x10, 0x60, 0xf1, 0x8b,
+ 0xfe, 0x00, 0x05, 0xf0, 0x0e, 0x00, 0xf2, 0xe1, 0x0f, 0x0e, 0x2f, 0x42,
+ 0xd2, 0xde, 0x21, 0x40,
+ 0xf8, 0xff, 0x34, 0x32, 0xbf, 0xdc, 0xd2, 0xd1, 0x01, 0x0f, 0x0f, 0x73,
+ 0x50, 0xe9, 0xf1, 0x24,
+ 0x0f, 0xed, 0xf0, 0x04, 0x10, 0x30, 0xef, 0x90, 0xff, 0x0e, 0x0d, 0x0c,
+ 0xef, 0x30, 0x10, 0xc0,
+ 0xdd, 0x0b, 0x22, 0x31, 0x2f, 0x70, 0x0e, 0x0b, 0x20, 0x30, 0x60, 0x2b,
+ 0x0f, 0x0a, 0xdd, 0x1e,
+ 0x42, 0xd2, 0x9e, 0xee, 0x0d, 0x52, 0x00, 0xfd, 0x0e, 0x0a, 0xee, 0xf0,
+ 0x02, 0x3d, 0x08, 0xef,
+ 0xf0, 0x04, 0xee, 0x8b, 0xdf, 0x01, 0x01, 0xd0, 0xef, 0x3e, 0x30, 0x00,
+ 0xe2, 0xae, 0xeb, 0x1e,
+ 0x1e, 0x01, 0x07, 0x03, 0x0e, 0xcb, 0x01, 0x41, 0x10, 0x00, 0xf3, 0x01,
+ 0xef, 0x01, 0xf1, 0xff,
+ 0xdf, 0x02, 0x67, 0xe0, 0xef, 0x72, 0x54, 0x03, 0xfe, 0xce, 0x01, 0x02,
+ 0x00, 0x04, 0x13, 0xc0,
+ 0xcd, 0x12, 0x22, 0x2e, 0x20, 0x16, 0x45, 0x12, 0xbf, 0xeb, 0x10, 0x72,
+ 0x12, 0xfe, 0xcb, 0x00,
+ 0x02, 0x51, 0x0f, 0x0f, 0xf0, 0x00, 0xfc, 0x00, 0x22, 0x2f, 0x40, 0x21,
+ 0x3e, 0x1e, 0x20, 0x0c,
+ 0xdb, 0xd2, 0xd3, 0x8d, 0xfe, 0x15, 0x33, 0xfe, 0xee, 0x06, 0x12, 0x0f,
+ 0x4f, 0x44, 0xf0, 0xf0,
+ 0x01, 0x37, 0x20, 0x20, 0x5e, 0x0f, 0xc0, 0x03, 0x77, 0x10, 0x00, 0xce,
+ 0xdf, 0xf1, 0x03, 0x20,
+ 0x30, 0x20, 0xe1, 0xcd, 0xe3, 0x07, 0x02, 0x20, 0x0e, 0xdb, 0x20, 0x23,
+ 0xd3, 0x80, 0xfd, 0x2e,
+ 0x70, 0x34, 0x02, 0x03, 0xee, 0xea, 0x00, 0x41, 0x10, 0xec, 0x00, 0x26,
+ 0x30, 0xfd, 0xc0, 0x20,
+ 0x31, 0xef, 0xaa, 0x00, 0x20, 0xc0, 0xbe, 0x0f, 0xe0, 0x0f, 0xff, 0x00,
+ 0x02, 0x00, 0xe0, 0x1f,
+ 0x5f, 0x00, 0xbc, 0xda, 0x0f, 0xf2, 0xd2, 0xdd, 0xc9, 0x00, 0x41, 0x12,
+ 0x00, 0xce, 0xf0, 0x46,
+ 0x21, 0xde, 0x9f, 0x00, 0x20, 0x22, 0x01, 0xdf, 0xef, 0xfe, 0xd1, 0x02,
+ 0x50, 0x00, 0x17, 0xe7,
+ 0xb0, 0xec, 0xf0, 0xe0, 0x0e, 0x70, 0x02, 0x00, 0xed, 0x00, 0xd2, 0xef,
+ 0x1b, 0x1f, 0x00, 0x05,
+ 0x10, 0x10, 0x2c, 0xcf, 0x10, 0x70, 0x01, 0x21, 0x34, 0x00, 0xfa, 0xff,
+ 0x0e, 0x2f, 0x60, 0x21,
+ 0x2e, 0xff, 0x0f, 0x00, 0xcf, 0xd9, 0x30, 0x70, 0xe0, 0xbc, 0x00, 0x01,
+ 0x0e, 0x08, 0xf0, 0x00,
+ 0x64, 0x0f, 0xdf, 0xf0, 0x00, 0x2e, 0xfe, 0xe3, 0x17, 0x00, 0xbc, 0x00,
+ 0x00, 0xe1, 0xf1, 0x0f,
+ 0x40, 0x42, 0x0f, 0x1e, 0x31, 0xe5, 0xe2, 0x22, 0x0e, 0xdd, 0x22, 0x76,
+ 0x70, 0x00, 0xf0, 0x32,
+ 0x22, 0x35, 0x00, 0xfc, 0xf0, 0x24, 0x21, 0x01, 0x00, 0x00, 0x72, 0x33,
+ 0x01, 0xf0, 0xfe, 0x0e,
+ 0x0f, 0x33, 0x44, 0xdc, 0x1e, 0x7f, 0x1e, 0x15, 0x02, 0xdb, 0x0f, 0x11,
+ 0x20, 0x1d, 0x50, 0x01,
+ 0x0f, 0xbe, 0x07, 0x02, 0x0f, 0x5c, 0x30, 0x25, 0xe0, 0xcf, 0x1e, 0x0f,
+ 0xc0, 0x00, 0x31, 0x2f,
+ 0xe8, 0xb0, 0x00, 0x01, 0xd2, 0xd1, 0x00, 0xc1, 0xd0, 0x32, 0x33, 0x80,
+ 0xde, 0xc0, 0xf5, 0xf0,
+ 0xeb, 0x0d, 0xf0, 0xf7, 0x02, 0xd0, 0xef, 0x01, 0x52, 0xf0, 0xdf, 0xf1,
+ 0x02, 0x1e, 0xdb, 0x01,
+ 0x75, 0x00, 0xbb, 0xff, 0x00, 0x23, 0x11, 0xff, 0xcd, 0x00, 0x77, 0x41,
+ 0xff, 0x00, 0x00, 0x0e,
+ 0x2e, 0x20, 0x01, 0xf0, 0x2e, 0x40, 0xf7, 0xc0, 0xbe, 0x0d, 0xf0, 0x20,
+ 0x71, 0x11, 0x0e, 0xd8,
+ 0x00, 0x41, 0x23, 0x0f, 0xfc, 0xf0, 0xfd, 0xe0, 0xee, 0x10, 0x30, 0xee,
+ 0xbd, 0x12, 0x77, 0x10,
+ 0xfd, 0xdf, 0xef, 0x00, 0x11, 0x2e, 0x0d, 0x03, 0x17, 0xd0, 0xed, 0x0e,
+ 0x5f, 0x22, 0x02, 0x01,
+ 0xef, 0xfc, 0xfe, 0x44, 0x27, 0xc1, 0x90, 0xf0, 0xe1, 0xe0, 0x23, 0x41,
+ 0xed, 0xe0, 0x02, 0x74,
+ 0x13, 0x10, 0xfb, 0x0c, 0x11, 0x12, 0x00, 0x30, 0x20, 0x0f, 0xce, 0xc0,
+ 0xc0, 0x00, 0x21, 0x00,
+ 0x07, 0x77, 0x01, 0x00, 0x00, 0x1e, 0x21, 0x34, 0x00, 0xde, 0xee, 0x43,
+ 0x66, 0x20, 0x0f, 0x0e,
+ 0x02, 0x47, 0x01, 0xff, 0xdd, 0xe0, 0xf3, 0xb1, 0xcc, 0xf0, 0x25, 0x32,
+ 0x20, 0x0d, 0xf0, 0xc1,
+ 0xe1, 0xe2, 0xf2, 0xe1, 0x9e, 0xfb, 0x00, 0x27, 0x21, 0xdc, 0x00, 0x40,
+ 0x11, 0x01, 0xc0, 0xd0,
+ 0xb0, 0x00, 0x12, 0x04, 0xd2, 0x20, 0x5d, 0xef, 0xc0, 0xf1, 0x17, 0x40,
+ 0xfe, 0x10, 0x70, 0x0f,
+ 0xec, 0xee, 0x12, 0x57, 0x12, 0xfc, 0xff, 0x0f, 0x0f, 0x1e, 0x20, 0x03,
+ 0x10, 0x2d, 0x1e, 0x12,
+ 0x02, 0x0b, 0x7c, 0x30, 0x0e, 0x00, 0x40, 0x43, 0x0c, 0x0b, 0x20, 0x46,
+ 0x02, 0x00, 0x1b, 0x00,
+ 0x10, 0x74, 0x00, 0xed, 0xd0, 0xf1, 0x0f, 0x0e, 0x10, 0x62, 0x00, 0xdb,
+ 0xd0, 0x1e, 0x20, 0x2c,
+ 0x3f, 0x30, 0xa0, 0xcc, 0xfd, 0x10, 0x05, 0xd0, 0xdf, 0x0f, 0x31, 0xd0,
+ 0xad, 0xfd, 0xcf, 0xf0,
+ 0xf2, 0x10, 0x2c, 0xee, 0xee, 0xd0, 0xf7, 0x01, 0x3e, 0x4d, 0x62, 0x02,
+ 0xb2, 0xd0, 0xe5, 0x06,
+ 0xd0, 0xcb, 0x1e, 0x71, 0x01, 0xe0, 0x0f, 0x11, 0x16, 0x10, 0x00, 0x01,
+ 0x52, 0xfe, 0xfe, 0x02,
+ 0xd2, 0xbe, 0x0e, 0x02, 0x41, 0x0d, 0x00, 0x04, 0xf4, 0xc0, 0x06, 0x34,
+ 0x70, 0x1e, 0x00, 0xf0,
+ 0x15, 0x00, 0xfc, 0xff, 0x01, 0xf0, 0x10, 0x60, 0x0f, 0xd0, 0xf2, 0x0e,
+ 0x0f, 0x0f, 0x00, 0x17,
+ 0x57, 0xf0, 0xcd, 0x0e, 0xff, 0xfe, 0xf0, 0x00, 0x11, 0x2f, 0xfc, 0xbf,
+ 0xe0, 0xd3, 0xe1, 0x30,
+ 0x6d, 0xfb, 0xd0, 0xef, 0x00, 0x10, 0x10, 0xad, 0x98, 0xe0, 0x07, 0x00,
+ 0xe0, 0xcf, 0x00, 0x00,
+ 0x02, 0x31, 0x32, 0x11, 0x51, 0x21, 0x02, 0x27, 0x23, 0xef, 0x9d, 0x02,
+ 0x33, 0xf0, 0x00, 0x42,
+ 0x31, 0x09, 0xf0, 0x03, 0x02, 0xb0, 0xf0, 0x01, 0x01, 0x12, 0x31, 0x00,
+ 0x21, 0x10, 0x0b, 0x64,
+ 0x47, 0x00, 0x6f, 0x2f, 0x23, 0x02, 0xfe, 0xfc, 0x01, 0x01, 0xef, 0xa0,
+ 0xf2, 0xe0, 0x1a, 0x60,
+ 0x0d, 0xfa, 0xee, 0x20, 0x21, 0x31, 0x54, 0x00, 0xea, 0xff, 0x1f, 0xde,
+ 0xc0, 0x21, 0x33, 0x0f,
+ 0xcf, 0x00, 0xee, 0xff, 0xed, 0x50, 0x55, 0x01, 0xc0, 0xff, 0x0b, 0xce,
+ 0xf0, 0xe1, 0x00, 0x1f,
+ 0x1e, 0xe1, 0xe7, 0x01, 0x30, 0x20, 0xf3, 0xc3, 0x0f, 0x0f, 0xe4, 0x83,
+ 0xdf, 0x02, 0x13, 0xfe,
+ 0xb8, 0xf0, 0x06, 0xf1, 0xee, 0xef, 0xe0, 0x01, 0x14, 0x40, 0x00, 0x8c,
+ 0xe0, 0x01, 0x11, 0x10,
+ 0xf0, 0xea, 0x0e, 0x0e, 0xf2, 0xd2, 0xcb, 0xdd, 0x0f, 0x20, 0x7f, 0x0b,
+ 0x2f, 0x0f, 0x0e, 0x60,
+ 0x13, 0x0f, 0xf8, 0x2f, 0x60, 0x00, 0xef, 0x0f, 0xf0, 0xce, 0xec, 0xfd,
+ 0x10, 0x12, 0x22, 0x42,
+ 0x03, 0xfe, 0xf8, 0x0d, 0x10, 0x74, 0x22, 0xf0, 0xdf, 0xcf, 0xff, 0x00,
+ 0x54, 0x33, 0x0d, 0xdc,
+ 0xe0, 0x05, 0xf2, 0xf0, 0xca, 0x1f, 0x71, 0x14, 0xf0, 0xcd, 0x00, 0x30,
+ 0x30, 0x01, 0x00, 0x12,
+ 0x13, 0x0f, 0x0f, 0x44, 0x11, 0x00, 0xf1, 0xd0, 0xe6, 0x13, 0x3f, 0xee,
+ 0xf2, 0x67, 0x43, 0x5e,
+ 0x3d, 0x3e, 0x21, 0x75, 0x10, 0xfd, 0xef, 0x12, 0x02, 0xfe, 0xee, 0x02,
+ 0x42, 0xfc, 0xfa, 0x32,
+ 0x65, 0xf0, 0xae, 0x0f, 0xff, 0x0f, 0x1e, 0x30, 0x23, 0x0e, 0xea, 0xcf,
+ 0x03, 0x23, 0x10, 0x0c,
+ 0xff, 0xe0, 0xf0, 0x12, 0x54, 0x11, 0xf1, 0xed, 0x9d, 0xf3, 0x07, 0x47,
+ 0x20, 0xc0, 0xcf, 0xf1,
+ 0x14, 0x21, 0x00, 0xd1, 0xc0, 0x44, 0x34, 0x01, 0xbf, 0xfe, 0x0f, 0x22,
+ 0x44, 0x13, 0x00, 0xfb,
+ 0xde, 0x00, 0x16, 0x10, 0xf0, 0xae, 0xf1, 0xf2, 0xc0, 0x00, 0xec, 0x0f,
+ 0x11, 0x64, 0x30, 0x3f,
+ 0x00, 0xc0, 0x22, 0x77, 0x10, 0x0c, 0x1f, 0x30, 0x23, 0x10, 0xee, 0xec,
+ 0xef, 0x0f, 0x40, 0x51,
+ 0x02, 0x0e, 0xfc, 0xfe, 0x0f, 0x34, 0x53, 0xed, 0xfc, 0x11, 0x21, 0x20,
+ 0xef, 0xca, 0xf0, 0x12,
+ 0x05, 0xbe, 0xdd, 0x0d, 0x50, 0xe2, 0xd1, 0xd0, 0x13, 0x30, 0x0c, 0x21,
+ 0x17, 0xd1, 0x9d, 0x0e,
+ 0x04, 0x10, 0x0b, 0x40, 0x55, 0x01, 0x00, 0x0e, 0x20, 0x13, 0xf0, 0xd0,
+ 0x00, 0x34, 0xf0, 0xd0,
+ 0x70, 0x3f, 0x2e, 0x01, 0x03, 0xe5, 0xf0, 0x0d, 0x22, 0x01, 0x80, 0xf0,
+ 0x04, 0xde, 0xcd, 0x07,
+ 0x74, 0x1f, 0x2e, 0x01, 0xc0, 0xe0, 0x00, 0x53, 0x03, 0xf1, 0x10, 0x29,
+ 0xfc, 0xd0, 0x00, 0x33,
+ 0x1e, 0xeb, 0xa0, 0x01, 0xf0, 0x0b, 0x5f, 0x20, 0x10, 0xd2, 0x03, 0x04,
+ 0x0f, 0xab, 0xe0, 0xe0,
+ 0xb0, 0xef, 0xfd, 0xff, 0xf2, 0x02, 0x3e, 0xfc, 0x8d, 0xed, 0x0e, 0x24,
+ 0x1e, 0xc8, 0xe1, 0x17,
+ 0x10, 0xee, 0xbf, 0xff, 0xef, 0x20, 0x40, 0x00, 0xee, 0xe0, 0xff, 0xfc,
+ 0x2f, 0x30, 0x12, 0x30,
+ 0x40, 0x0d, 0x10, 0x21, 0x2e, 0xd8, 0x8b, 0xee, 0x20, 0x71, 0x00, 0x0f,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x52, 0x12, 0x0c, 0x0a, 0x2f, 0x3f, 0x0f, 0x00, 0x0f, 0x20,
+ 0x12, 0xac, 0xed, 0x11,
+ 0x10, 0x1e, 0x61, 0x02, 0x08, 0xde, 0xd0, 0xf0, 0x05, 0x20, 0x1e, 0x4d,
+ 0x4f, 0x25, 0x36, 0xf0,
+ 0xa0, 0xe0, 0x0d, 0x10, 0x64, 0x02, 0xdf, 0xff, 0x00, 0x11, 0x14, 0xe1,
+ 0xe2, 0x03, 0x30, 0x47,
+ 0xc0, 0xcf, 0x10, 0x56, 0x00, 0x00, 0xfe, 0xf0, 0x02, 0x46, 0x30, 0xfe,
+ 0xd1, 0x01, 0x40, 0x11,
+ 0x32, 0x33, 0x0d, 0xf0, 0x50, 0x3f, 0xda, 0x00, 0x71, 0x03, 0xe0, 0xc0,
+ 0x03, 0x20, 0x3a, 0x3f,
+ 0x20, 0x01, 0x05, 0x61, 0x42, 0x31, 0x0f, 0x0f, 0x10, 0x76, 0x11, 0xef,
+ 0xdf, 0x10, 0x13, 0x01,
+ 0xe2, 0xf0, 0xc0, 0xdc, 0xe1, 0xde, 0xfb, 0x2f, 0x30, 0xe2, 0x81, 0xee,
+ 0xfe, 0xe3, 0x04, 0xba,
+ 0xee, 0xd0, 0xd0, 0xad, 0x0c, 0xec, 0xfe, 0x02, 0x17, 0x02, 0x00, 0x20,
+ 0x3f, 0x1d, 0x10, 0xd4,
+ 0x81, 0xe1, 0x13, 0x2f, 0x0a, 0xef, 0x20, 0x23, 0xc4, 0xc0, 0xee, 0x20,
+ 0x21, 0xe4, 0xe1, 0x0f,
+ 0xed, 0xa0, 0xd1, 0x1d, 0x7c, 0x10, 0x0e, 0x1f, 0x24, 0x0e, 0x00, 0x37,
+ 0x15, 0xcb, 0xee, 0x20,
+ 0x43, 0xe0, 0xcf, 0x09, 0x10, 0x70, 0x33, 0x2f, 0x1e, 0x10, 0x01, 0xf0,
+ 0xf2, 0x21, 0x5f, 0x3b,
+ 0x51, 0x16, 0xde, 0xdc, 0x1f, 0x50, 0x13, 0x1f, 0x1f, 0x00, 0xdd, 0x00,
+ 0x01, 0xbd, 0xe0, 0x1e,
+ 0x1d, 0x01, 0xf2, 0xf8, 0xdd, 0xef, 0xe1, 0x44, 0x50, 0xba, 0xdf, 0x00,
+ 0x01, 0x00, 0x0f, 0xcf,
+ 0xd0, 0xf0, 0x00, 0x10, 0xaf, 0xdf, 0x00, 0x22, 0x0d, 0xbe, 0xe0, 0xe4,
+ 0xe5, 0x13, 0x22, 0x00,
+ 0xdf, 0xbe, 0x00, 0x32, 0x47, 0x03, 0xf0, 0xb0, 0xe1, 0xff, 0xe2, 0xc7,
+ 0xd0, 0x10, 0x63, 0x07,
+ 0x04, 0xdf, 0xed, 0xfe, 0x50, 0x77, 0x00, 0xf0, 0xff, 0x20, 0x22, 0x00,
+ 0x10, 0x11, 0xff, 0xee,
+ 0x47, 0x33, 0xcf, 0xdc, 0x10, 0x71, 0x12, 0x10, 0x0f, 0x0c, 0xee, 0x20,
+ 0x53, 0x01, 0xed, 0x1c,
+ 0x40, 0x12, 0xfd, 0x0d, 0x10, 0x40, 0xff, 0xec, 0xfb, 0xdb, 0xde, 0x00,
+ 0x43, 0x41, 0xdc, 0xac,
+ 0x00, 0xf1, 0x14, 0x12, 0x10, 0x30, 0x1a, 0xf0, 0xce, 0xc0, 0xff, 0x00,
+ 0xef, 0x12, 0x66, 0x02,
+ 0xc1, 0x00, 0x40, 0x30, 0x25, 0xe3, 0xd1, 0xe1, 0xc0, 0xe0, 0x0d, 0x40,
+ 0x04, 0xd1, 0x20, 0x74,
+ 0x44, 0x00, 0xde, 0x04, 0x04, 0x00, 0x0c, 0xe0, 0x9e, 0xe0, 0x25, 0x60,
+ 0x0d, 0xe0, 0x14, 0x13,
+ 0x0e, 0x0e, 0x00, 0x00, 0x20, 0x1e, 0x0c, 0xfc, 0x00, 0x30, 0x50, 0x6f,
+ 0x08, 0x0e, 0xde, 0xdf,
+ 0xef, 0xf0, 0x22, 0x4f, 0xfa, 0xd1, 0x26, 0x50, 0x00, 0xed, 0xf1, 0x21,
+ 0x10, 0x0f, 0xa0, 0xfe,
+ 0x0e, 0x43, 0x13, 0xed, 0xcc, 0x0e, 0xfd, 0xfb, 0xd0, 0xc6, 0xd1, 0xbd,
+ 0xdd, 0x21, 0x21, 0xbf,
+ 0xdd, 0xf2, 0x07, 0xf4, 0xd0, 0x10, 0x40, 0x00, 0xb0, 0x10, 0x51, 0x02,
+ 0x0d, 0xe0, 0x02, 0x17,
+ 0xd0, 0xc0, 0xd0, 0xe0, 0x00, 0x01, 0xd2, 0x8e, 0x0b, 0x0c, 0x70, 0x27,
+ 0x01, 0xe1, 0x00, 0xfd,
+ 0x11, 0x41, 0x00, 0xfe, 0x01, 0xf0, 0xfe, 0x0a, 0x3e, 0x4d, 0x4e, 0x00,
+ 0x01, 0xe0, 0x1d, 0x3e,
+ 0x02, 0xf1, 0xcb, 0x0f, 0x2e, 0x3b, 0x9a, 0xde, 0x01, 0x64, 0x32, 0x1f,
+ 0x1f, 0x10, 0x02, 0xd2,
+ 0x17, 0x13, 0x0e, 0xdc, 0x00, 0x20, 0x01, 0x42, 0x54, 0x02, 0xdf, 0xef,
+ 0x02, 0x77, 0x31, 0xe0,
+ 0xef, 0xf0, 0xe0, 0x21, 0x63, 0x03, 0xff, 0x10, 0x57, 0x01, 0x01, 0x10,
+ 0x00, 0x03, 0xf2, 0x00,
+ 0x63, 0x14, 0x01, 0xd1, 0x15, 0x30, 0x20, 0x40, 0x1e, 0x20, 0x71, 0x10,
+ 0xf0, 0x05, 0x46, 0x42,
+ 0x00, 0xdd, 0xef, 0x0f, 0xe0, 0xd0, 0x10, 0x63, 0x2b, 0x0d, 0xe0, 0x02,
+ 0x1e, 0xfb, 0xff, 0xfb,
+ 0x00, 0x0f, 0xfd, 0x4c, 0x1c, 0x2f, 0xf0, 0xd2, 0xee, 0xf9, 0x4f, 0x0f,
+ 0x8e, 0xe3, 0x04, 0x10,
+ 0xdf, 0x8d, 0xe2, 0xe2, 0xf4, 0xd0, 0xf1, 0xfd, 0x0c, 0xf1, 0xe2, 0xdd,
+ 0x0b, 0x53, 0xf3, 0x80,
+ 0xee, 0x01, 0xf0, 0xfa, 0x10, 0x11, 0x13, 0x00, 0xef, 0xdb, 0x9d, 0xfe,
+ 0x21, 0x43, 0xed, 0xb8,
+ 0x0e, 0x0f, 0x00, 0x0f, 0x0f, 0x40, 0x13, 0x00, 0xdb, 0x0f, 0x0f, 0xf0,
+ 0x11, 0x60, 0x1f, 0xf8,
+ 0xd0, 0x01, 0x14, 0x6e, 0x2f, 0x0f, 0xf0, 0x10, 0x2d, 0x1f, 0x52, 0x01,
+ 0xe0, 0xfe, 0x1c, 0x7e,
+ 0x1e, 0xdb, 0xe0, 0x07, 0x31, 0x20, 0x11, 0x1e, 0x0c, 0xef, 0xb0, 0xf2,
+ 0x17, 0x32, 0xfd, 0xed,
+ 0x10, 0x01, 0xb0, 0x0d, 0x73, 0x13, 0xef, 0xce, 0x00, 0x02, 0xe0, 0xf0,
+ 0x07, 0xf1, 0x8e, 0xff,
+ 0x04, 0x44, 0x1e, 0x0d, 0x15, 0x23, 0x03, 0x33, 0x20, 0x0b, 0x40, 0x43,
+ 0x06, 0x00, 0xdd, 0x00,
+ 0x21, 0xf2, 0xc0, 0xcf, 0xce, 0x12, 0x76, 0x0f, 0xee, 0xe0, 0x03, 0x12,
+ 0x23, 0x00, 0xea, 0xde,
+ 0x11, 0x44, 0x1f, 0x00, 0x0f, 0x0f, 0x00, 0x44, 0x13, 0x01, 0x21, 0x53,
+ 0x00, 0x03, 0xf7, 0x22,
+ 0xb0, 0xae, 0x00, 0x12, 0x41, 0xf3, 0xf2, 0x0f, 0xfa, 0xff, 0xce, 0xee,
+ 0x26, 0x45, 0x00, 0x0e,
+ 0x00, 0xc0, 0x82, 0xe2, 0xf1, 0x0d, 0xf1, 0xf6, 0xd0, 0xd0, 0x00, 0xe3,
+ 0xc0, 0xed, 0x1d, 0x70,
+ 0x23, 0x00, 0xd8, 0xfa, 0xe0, 0x02, 0x71, 0x00, 0x0e, 0xff, 0xf2, 0x00,
+ 0x3e, 0x1e, 0x11, 0x02,
+ 0x24, 0x12, 0x00, 0xd9, 0x1f, 0x70, 0x35, 0xef, 0x0c, 0x40, 0x10, 0x00,
+ 0x4d, 0x20, 0x13, 0x01,
+ 0xf0, 0xdd, 0xfa, 0xf0, 0xe0, 0x23, 0x74, 0x1e, 0xec, 0xe0, 0x05, 0x05,
+ 0x2a, 0x00, 0x38, 0x00,
+ 0xa0, 0x0f, 0x33, 0xf1, 0x8d, 0x0f, 0xf2, 0xf1, 0x4e, 0x27, 0xb2, 0xea,
+ 0xdd, 0x90, 0xff, 0x1f,
+ 0x4e, 0x1e, 0x2c, 0xee, 0xdd, 0xc1, 0xf1, 0xe9, 0x0e, 0x10, 0xf2, 0x04,
+ 0xd0, 0x8c, 0x9e, 0x00,
+ 0x20, 0x0e, 0x00, 0xb0, 0xe0, 0x0f, 0xfb, 0x0d, 0xee, 0x00, 0x04, 0x04,
+ 0xe0, 0xdb, 0xee, 0xd0,
+ 0x02, 0x32, 0x00, 0xde, 0xe0, 0x15, 0x50, 0x1e, 0x3f, 0xdf, 0x8d, 0x02,
+ 0x44, 0x0e, 0xdb, 0xe3,
+ 0x02, 0x01, 0x00, 0x0e, 0x6c, 0x3d, 0x0b, 0x20, 0x47, 0x11, 0x10, 0xf0,
+ 0xf0, 0x10, 0xee, 0xb0,
+ 0x15, 0x52, 0x00, 0xd0, 0x30, 0x70, 0x10, 0xe0, 0xe0, 0x22, 0x1f, 0x0b,
+ 0xec, 0x0c, 0x00, 0xff,
+ 0xdd, 0xde, 0xe0, 0x80, 0xdc, 0x1f, 0x5c, 0xf9, 0xcf, 0x01, 0x12, 0x0f,
+ 0xfc, 0x21, 0x00, 0x0f,
+ 0x50, 0x14, 0xfc, 0xcd, 0x13, 0x66, 0x10, 0x00, 0xdd, 0xee, 0xff, 0xf2,
+ 0x02, 0x00, 0x00, 0x23,
+ 0x41, 0x00, 0xf0, 0xd7, 0xf5, 0x0f, 0x0e, 0x2e, 0x7e, 0x10, 0x15, 0x14,
+ 0x10, 0x20, 0xdf, 0xd2,
+ 0x33, 0x52, 0x24, 0x01, 0xf2, 0x00, 0xe1, 0x54, 0x74, 0x40, 0x01, 0xf0,
+ 0x01, 0x17, 0x43, 0x0d,
+ 0x0f, 0x01, 0x47, 0x60, 0x22, 0x22, 0x02, 0xf1, 0x32, 0x45, 0x21, 0x10,
+ 0x21, 0x24, 0x12, 0xdf,
+ 0xee, 0x21, 0x70, 0x20, 0x2c, 0x02, 0x00, 0xec, 0xe9, 0x00, 0x31, 0xd0,
+ 0xbc, 0x00, 0x11, 0x52,
+ 0x0f, 0xdc, 0xc0, 0xd0, 0xfb, 0x10, 0x12, 0x11, 0x1f, 0xac, 0xe0, 0x05,
+ 0xe0, 0x0f, 0x20, 0x30,
+ 0x3e, 0x42, 0x04, 0x8f, 0xfd, 0x12, 0x20, 0x1f, 0x12, 0x07, 0xe4, 0xbf,
+ 0x0f, 0x14, 0xd2, 0x90,
+ 0xf0, 0x03, 0xdf, 0xfd, 0x10, 0x11, 0x16, 0x01, 0x10, 0xe1, 0x00, 0x73,
+ 0x42, 0xdf, 0x01, 0x46,
+ 0x11, 0x00, 0xd1, 0xae, 0x0d, 0xe0, 0xde, 0x0e, 0x54, 0x10, 0x08, 0x00,
+ 0x20, 0x02, 0xf0, 0x2f,
+ 0x71, 0x02, 0x0e, 0xfb, 0x0f, 0xef, 0x30, 0x50, 0x0d, 0xfa, 0xff, 0x0f,
+ 0x01, 0xf0, 0xcb, 0x0e,
+ 0x3d, 0x00, 0xd1, 0xf1, 0x67, 0x21, 0xee, 0xed, 0x20, 0x20, 0xfe, 0xdd,
+ 0xfd, 0xf1, 0xe6, 0xe0,
+ 0x90, 0xdd, 0x04, 0x44, 0x00, 0xde, 0xc0, 0x06, 0x51, 0xee, 0xec, 0x20,
+ 0x40, 0x02, 0x02, 0xf1,
+ 0xbc, 0xde, 0xf1, 0x13, 0x10, 0x0a, 0xef, 0x02, 0x04, 0xe0, 0xae, 0x25,
+ 0x62, 0x00, 0x0c, 0xe0,
+ 0xf0, 0x00, 0xdf, 0xfd, 0x61, 0x32, 0x0e, 0x0e, 0xfe, 0x2e, 0x2e, 0x09,
+ 0xfd, 0x2e, 0x7e, 0x0f,
+ 0xfa, 0xed, 0x00, 0x60, 0x0c, 0xef, 0x20, 0x2d, 0xfb, 0xcf, 0xe0, 0xf0,
+ 0x51, 0x2f, 0xe8, 0xae,
+ 0xfd, 0x11, 0x21, 0x30, 0x0e, 0x00, 0xe0, 0xe3, 0x0f, 0x00, 0x22, 0xdc,
+ 0x88, 0xe0, 0xf4, 0xc0,
+ 0xca, 0x10, 0x23, 0xe0, 0xdd, 0x21, 0x23, 0xb0, 0xee, 0x20, 0x33, 0x02,
+ 0xf0, 0x03, 0xf4, 0x9e,
+ 0xeb, 0x04, 0x06, 0x10, 0x00, 0xb1, 0x01, 0xe0, 0x02, 0x52, 0x11, 0x2f,
+ 0x20, 0xf0, 0xee, 0x02,
+ 0x07, 0x31, 0x20, 0x0f, 0x32, 0x73, 0x0f, 0x0e, 0x20, 0x02, 0x33, 0x33,
+ 0xfb, 0xdc, 0x3e, 0x2e,
+ 0x41, 0x75, 0x5e, 0x1b, 0x00, 0x20, 0x00, 0x00, 0x30, 0x0e, 0x0d, 0x50,
+ 0x10, 0xd8, 0xba, 0x00,
+ 0x54, 0x00, 0xff, 0xef, 0xff, 0x10, 0x73, 0x12, 0x0f, 0xdc, 0x00, 0x02,
+ 0x24, 0x0f, 0x2e, 0x0f,
+ 0xdf, 0xd3, 0xc3, 0xef, 0x1d, 0xe1, 0x90, 0x03, 0x27, 0x33, 0xe0, 0xde,
+ 0xc0, 0xe0, 0xf0, 0x05,
+ 0x40, 0x00, 0xed, 0xc0, 0xc0, 0xf2, 0x03, 0x21, 0x0c, 0xfc, 0x04, 0x16,
+ 0xe0, 0xd0, 0x53, 0x72,
+ 0x20, 0x0d, 0x10, 0x05, 0xe3, 0x02, 0x32, 0xe0, 0x99, 0x00, 0x00, 0x34,
+ 0x10, 0xdd, 0x00, 0x03,
+ 0x46, 0x20, 0x1d, 0x3d, 0x0f, 0xce, 0x00, 0x2e, 0xbf, 0xce, 0x00, 0xef,
+ 0xa8, 0x0e, 0x0f, 0x32,
+ 0xf1, 0xed, 0x0c, 0x1f, 0x20, 0x05, 0xb0, 0xdf, 0xed, 0xdf, 0x00, 0x3d,
+ 0x2e, 0x02, 0x11, 0xba,
+ 0xc0, 0xf6, 0xd0, 0xa0, 0xcf, 0xef, 0x0f, 0xc0, 0x32, 0x42, 0xb1, 0xff,
+ 0x3f, 0x03, 0x04, 0x4f,
+ 0x0e, 0xce, 0x32, 0x07, 0x00, 0x10, 0x0b, 0xfd, 0xcd, 0xef, 0x22, 0x21,
+ 0xeb, 0xde, 0xe0, 0x01,
+ 0xfe, 0x1e, 0x6d, 0xe1, 0x37, 0x34, 0xaf, 0x1c, 0x1f, 0xe0, 0x61, 0x30,
+ 0xbe, 0xf0, 0x24, 0x41,
+ 0x20, 0xff, 0xc0, 0x10, 0x23, 0x07, 0xef, 0xed, 0xef, 0x0e, 0x00, 0x0f,
+ 0x4c, 0xff, 0xc0, 0x11,
+ 0x42, 0x3e, 0xeb, 0x02, 0x12, 0xbc, 0x1d, 0x15, 0xf2, 0x1f, 0x0f, 0xe0,
+ 0x74, 0x43, 0xc4, 0x02,
+ 0x00, 0xfa, 0xd0, 0xe0, 0x00, 0x54, 0x0f, 0xfc, 0x03, 0x43, 0x1f, 0x3e,
+ 0x01, 0x36, 0x71, 0x00,
+ 0xed, 0x02, 0x03, 0x27, 0x00, 0x0d, 0xff, 0x01, 0x44, 0xe1, 0x21, 0x40,
+ 0xe0, 0xee, 0x1d, 0x5e,
+ 0x1f, 0x01, 0x06, 0x51, 0x0f, 0xed, 0x40, 0x1c, 0x0e, 0xf0, 0xd3, 0x00,
+ 0x15, 0xf4, 0xd0, 0x2e,
+ 0x8b, 0xf0, 0x0e, 0x01, 0x34, 0x72, 0x20, 0x03, 0x04, 0x1e, 0x30, 0x00,
+ 0xa2, 0xf0, 0x12, 0x00,
+ 0xdf, 0xfe, 0x06, 0x05, 0x00, 0xac, 0xf0, 0x04, 0xe1, 0xbc, 0xed, 0x00,
+ 0x03, 0x03, 0xfc, 0x0a,
+ 0x10, 0xf1, 0xd0, 0xee, 0xd0, 0xc5, 0xd0, 0xbe, 0xf0, 0xff, 0xdb, 0xc0,
+ 0x12, 0x43, 0x0e, 0x4e,
+ 0x04, 0xb1, 0x0f, 0x4f, 0x0d, 0xe9, 0xf0, 0x54, 0x42, 0x0f, 0x1e, 0x10,
+ 0x03, 0x02, 0x30, 0x00,
+ 0x01, 0xc5, 0x10, 0x0d, 0xeb, 0xef, 0x20, 0x5e, 0x00, 0xf0, 0x41, 0x1e,
+ 0x1f, 0x42, 0x20, 0x09,
+ 0xd0, 0xf0, 0x63, 0x1f, 0xd8, 0xb9, 0x00, 0x42, 0x10, 0xe0, 0xe0, 0xef,
+ 0xdf, 0x50, 0x40, 0x00,
+ 0xff, 0xe1, 0x34, 0x2e, 0xfe, 0x23, 0x73, 0x2d, 0xec, 0x02, 0xf2, 0xdf,
+ 0x0e, 0x10, 0xf3, 0xab,
+ 0x0f, 0x40, 0xf4, 0xe6, 0xf0, 0xc0, 0xde, 0xee, 0xfe, 0xe1, 0x05, 0xd1,
+ 0x8f, 0x0b, 0x1f, 0x41,
+ 0x03, 0x30, 0x1f, 0x00, 0x15, 0x02, 0x05, 0x20, 0xee, 0xaf, 0x10, 0x42,
+ 0x02, 0xd2, 0x0e, 0xed,
+ 0x24, 0x57, 0x10, 0x4e, 0x21, 0x26, 0x10, 0x00, 0xf0, 0x43, 0x32, 0x22,
+ 0x20, 0x33, 0x00, 0xe6,
+ 0x22, 0x41, 0x00, 0xe0, 0x11, 0x65, 0x00, 0x00, 0xf0, 0x02, 0x40, 0x2f,
+ 0x9d, 0x00, 0x03, 0x13,
+ 0x00, 0x2c, 0x4d, 0x2c, 0x0f, 0xb0, 0xe0, 0xe5, 0xef, 0x1e, 0x75, 0x02,
+ 0x0f, 0xf9, 0xe0, 0x20,
+ 0x42, 0xdd, 0xbe, 0x01, 0x45, 0xf0, 0xde, 0x0f, 0x2e, 0x00, 0xe3, 0xf1,
+ 0xbc, 0x1f, 0x2f, 0x02,
+ 0xe2, 0xdc, 0xec, 0xf0, 0xe0, 0x73, 0x35, 0xbd, 0xd9, 0x00, 0x53, 0x14,
+ 0xff, 0xec, 0x0f, 0x0f,
+ 0x21, 0x32, 0x10, 0x1f, 0xf0, 0xae, 0x01, 0x64, 0x20, 0xf8, 0xdf, 0x00,
+ 0x20, 0x01, 0x00, 0x0d,
+ 0x12, 0x30, 0x30, 0x3f, 0x0e, 0xec, 0x31, 0x43, 0xed, 0x1c, 0x75, 0x70,
+ 0x2d, 0xfd, 0x0f, 0x0b,
+ 0xec, 0xff, 0x4f, 0x0f, 0xb9, 0x00, 0xf2, 0xef, 0xed, 0xee, 0x00, 0x2d,
+ 0xcc, 0xef, 0x00, 0xe1,
+ 0xc0, 0xd0, 0xee, 0x08, 0xf0, 0xa0, 0xe0, 0xe0, 0xf0, 0x00, 0xe1, 0xef,
+ 0x0b, 0x10, 0x01, 0x31,
+ 0xa1, 0x9f, 0xf0, 0x15, 0x00, 0x0d, 0x20, 0xf2, 0xd3, 0x17, 0x24, 0x30,
+ 0x0e, 0xe0, 0xe0, 0x02,
+ 0x06, 0xb1, 0x8f, 0xdd, 0x01, 0x03, 0x22, 0x01, 0xe4, 0xb1, 0xf3, 0x02,
+ 0x00, 0x00, 0x1e, 0x4c,
+ 0x40, 0x42, 0x26, 0x60, 0x1b, 0x0e, 0xf1, 0x02, 0x11, 0x30, 0x00, 0x09,
+ 0x20, 0x20, 0x30, 0x30,
+ 0x0e, 0x3f, 0x72, 0x22, 0x23, 0xf0, 0xb8, 0x0e, 0x61, 0x01, 0xef, 0xfd,
+ 0x00, 0x1e, 0x00, 0x12,
+ 0x40, 0xd9, 0xb0, 0x04, 0x01, 0xbf, 0xde, 0xe0, 0xfd, 0xaf, 0x06, 0x71,
+ 0xfe, 0xcc, 0x23, 0x07,
+ 0x00, 0x1d, 0x02, 0x04, 0x00, 0x20, 0x01, 0xe2, 0x02, 0x00, 0x20, 0xf0,
+ 0x00, 0x30, 0x06, 0xe2,
+ 0x01, 0xd1, 0xf2, 0x27, 0x71, 0x10, 0xdf, 0xe0, 0xe0, 0x00, 0x12, 0x42,
+ 0xf0, 0xad, 0x0f, 0x70,
+ 0x02, 0x01, 0x17, 0x30, 0x0f, 0x0f, 0x02, 0x11, 0xef, 0x1f, 0x0f, 0xa9,
+ 0x00, 0x30, 0x1e, 0x0b,
+ 0x1f, 0x00, 0x00, 0x7f, 0x2e, 0x0f, 0x02, 0x42, 0x00, 0xe8, 0xcc, 0xf0,
+ 0x10, 0x01, 0x20, 0x1d,
+ 0x1b, 0xde, 0x01, 0x15, 0xf0, 0xaf, 0xcd, 0xc0, 0x00, 0x21, 0x30, 0xec,
+ 0x80, 0x04, 0x20, 0xfe,
+ 0xdf, 0xf0, 0x02, 0xee, 0xb9, 0xf0, 0x00, 0xd3, 0xf0, 0xe1, 0xe0, 0xde,
+ 0xf0, 0xd1, 0xbd, 0xec,
+ 0xe1, 0x03, 0x33, 0x03, 0x88, 0xed, 0x10, 0x26, 0xe1, 0xae, 0x0e, 0x02,
+ 0x01, 0xff, 0xeb, 0xf1,
+ 0xf3, 0x0f, 0x1c, 0x11, 0x02, 0x2e, 0x4e, 0x5e, 0x0e, 0xec, 0x2c, 0x0f,
+ 0xf2, 0x15, 0x2f, 0x0c,
+ 0x0d, 0x0f, 0x60, 0x40, 0x0d, 0xec, 0x00, 0xf0, 0xde, 0xec, 0xdc, 0x70,
+ 0x60, 0xfa, 0x0e, 0x3e,
+ 0x30, 0x01, 0xe0, 0x2e, 0x0c, 0xcf, 0xf0, 0x30, 0x0b, 0x8d, 0xe3, 0x04,
+ 0x01, 0x21, 0x00, 0xee,
+ 0x1e, 0x40, 0x03, 0xf7, 0x03, 0x2d, 0xed, 0x82, 0xe0, 0x0a, 0x2f, 0x40,
+ 0x22, 0x03, 0xff, 0xfe,
+ 0x1e, 0x3e, 0x03, 0xf7, 0xb0, 0xf1, 0x40, 0x32, 0xe0, 0xf0, 0x34, 0x64,
+ 0x01, 0xc3, 0x05, 0x42,
+ 0x2d, 0xfe, 0x21, 0x67, 0x01, 0xf0, 0xf0, 0xf0, 0x71, 0x27, 0xf1, 0x0f,
+ 0x0e, 0x50, 0x10, 0xc0,
+ 0xf2, 0x17, 0x12, 0x0c, 0xdf, 0xf0, 0x24, 0x51, 0xf0, 0xbe, 0x00, 0x34,
+ 0x33, 0xde, 0xdb, 0x21,
+ 0x74, 0x00, 0xec, 0x00, 0x12, 0x05, 0x00, 0xde, 0xcd, 0x02, 0x06, 0x42,
+ 0x0f, 0xdd, 0xe0, 0x11,
+ 0x23, 0xf0, 0xf2, 0x30, 0x72, 0x10, 0xdc, 0xd0, 0x22, 0x55, 0x22, 0xef,
+ 0xdc, 0xff, 0x00, 0x02,
+ 0x03, 0x10, 0x21, 0x41, 0xfe, 0xfc, 0x00, 0x00, 0x0e, 0x50, 0x0c, 0xdc,
+ 0x0f, 0x02, 0x37, 0x0f,
+ 0xbc, 0x40, 0x6f, 0x0f, 0xd1, 0xe4, 0x23, 0x30, 0x7e, 0x10, 0xf0, 0x01,
+ 0x23, 0xec, 0x0e, 0x7f,
+ 0x00, 0x0c, 0xe1, 0xe7, 0x12, 0x30, 0x00, 0xcc, 0xfe, 0xe0, 0x21, 0x65,
+ 0x0e, 0x0a, 0xf0, 0x00,
+ 0x13, 0x10, 0x1d, 0x3f, 0xcf, 0xc0, 0xf2, 0x20, 0x34, 0x41, 0xcc, 0x8f,
+ 0xe2, 0x07, 0x10, 0x2c,
+ 0x00, 0x80, 0x03, 0x00, 0x1a, 0x00, 0x0f, 0x31, 0x06, 0x00, 0xe0, 0x0d,
+ 0x20, 0x00, 0x21, 0x22,
+ 0x15, 0x00, 0xef, 0xdd, 0xe0, 0x14, 0x60, 0x20, 0x2f, 0xd1, 0x94, 0x11,
+ 0x20, 0x5d, 0x10, 0x02,
+ 0xe3, 0xe3, 0x12, 0x32, 0x00, 0x08, 0x0b, 0x20, 0x62, 0xe3, 0xd1, 0x01,
+ 0x20, 0x1d, 0x1f, 0x31,
+ 0xe3, 0xaf, 0xea, 0x1f, 0x20, 0x35, 0xd1, 0xa0, 0xf0, 0x00, 0x3d, 0x0d,
+ 0xd0, 0xf4, 0x04, 0xf0,
+ 0x0c, 0x0d, 0x3e, 0x5f, 0x90, 0xe0, 0xf0, 0x1c, 0x18, 0xce, 0xdf, 0xf4,
+ 0x03, 0x00, 0x0a, 0xc0,
+ 0xdf, 0xe0, 0xe0, 0x40, 0x2e, 0x1e, 0x10, 0xa1, 0xf3, 0x1c, 0xfd, 0x00,
+ 0x74, 0xe1, 0xc0, 0x0d,
+ 0xdd, 0xfd, 0xf2, 0xe3, 0x12, 0x13, 0x31, 0x0c, 0xe8, 0xff, 0x0e, 0x7f,
+ 0x60, 0x05, 0x02, 0x0e,
+ 0x0d, 0x00, 0x13, 0x12, 0x0f, 0xef, 0xed, 0xee, 0x0d, 0xf2, 0x41, 0x70,
+ 0x18, 0xdf, 0x01, 0x31,
+ 0x70, 0x0c, 0xf0, 0x01, 0x00, 0x20, 0x0f, 0x0f, 0x27, 0xe6, 0xf0, 0x00,
+ 0x2b, 0xff, 0x00, 0x23,
+ 0x71, 0x52, 0x00, 0x00, 0xe1, 0xf5, 0xe0, 0x00, 0x02, 0x10, 0x40, 0x20,
+ 0x11, 0xe4, 0xcf, 0x0a,
+ 0x00, 0x03, 0x01, 0x20, 0x2d, 0xb0, 0xd1, 0x01, 0xff, 0x3b, 0x3f, 0x85,
+ 0xe7, 0xe1, 0xdf, 0xfd,
+ 0x0e, 0x20, 0x14, 0xf0, 0x81, 0xef, 0xff, 0xf0, 0x00, 0x5f, 0x2c, 0x20,
+ 0xd5, 0xe2, 0x0f, 0x4b,
+ 0x1f, 0x20, 0x11, 0x00, 0x03, 0xf1, 0xce, 0xe0, 0x30, 0x33, 0xfc, 0xce,
+ 0xf1, 0x21, 0x30, 0x3e,
+ 0xe1, 0x87, 0x06, 0x30, 0x7f, 0x1c, 0xd0, 0xe2, 0x04, 0x00, 0xee, 0x0d,
+ 0x1e, 0x40, 0xf3, 0xc1,
+ 0x1f, 0x1c, 0xff, 0xcd, 0x0c, 0x40, 0x13, 0xf2, 0xd3, 0xfd, 0xdd, 0xff,
+ 0x11, 0x2f, 0xeb, 0x71,
+ 0x31, 0xf4, 0xd1, 0x0e, 0x8e, 0xde, 0xe1, 0x07, 0x71, 0x0c, 0xd2, 0xf7,
+ 0xf1, 0x0f, 0x00, 0x40,
+ 0x11, 0x03, 0xc1, 0xdc, 0x1e, 0x1e, 0x10, 0x1f, 0x01, 0xf0, 0x07, 0x54,
+ 0x5d, 0x1c, 0xff, 0xd1,
+ 0xe4, 0x01, 0x14, 0x41, 0xc0, 0xac, 0xf1, 0xf2, 0x10, 0x0f, 0x0a, 0xe0,
+ 0x10, 0x50, 0x31, 0x20,
+ 0x0f, 0xf0, 0x14, 0x2f, 0x40, 0x5d, 0x1d, 0xfb, 0xce, 0x02, 0x02, 0x1d,
+ 0x28, 0x2f, 0x01, 0x00,
+ 0x0f, 0xed, 0xfc, 0xff, 0x1e, 0x41, 0x70, 0x4f, 0xed, 0xce, 0x0f, 0x1a,
+ 0x1e, 0x1e, 0x00, 0x01,
+ 0x21, 0x0f, 0xe8, 0xdd, 0x50, 0x41, 0x02, 0xc1, 0xd3, 0xc1, 0xf0, 0x0e,
+ 0x50, 0x33, 0xc7, 0xc7,
+ 0x01, 0xf0, 0xef, 0xee, 0x10, 0x61, 0x13, 0xe1, 0xe0, 0xfd, 0x01, 0x23,
+ 0x21, 0x10, 0xe3, 0xa5,
+ 0x03, 0x03, 0x00, 0xc2, 0xf7, 0x02, 0x1f, 0xee, 0xc0, 0xe4, 0xe2, 0x00,
+ 0x1e, 0x0d, 0xd0, 0x3f,
+ 0x70, 0x5f, 0xfe, 0x05, 0x37, 0x04, 0x0e, 0x1d, 0x3e, 0x4f, 0x0f, 0x0f,
+ 0xf0, 0xcf, 0x1c, 0x5e,
+ 0x1e, 0x40, 0x27, 0xf5, 0x0f, 0x0f, 0xed, 0x00, 0x22, 0x70, 0x41, 0x24,
+ 0x00, 0x00, 0x0e, 0xe0,
+ 0x10, 0x02, 0x1d, 0x1a, 0x10, 0x30, 0xd0, 0xa0, 0x0f, 0x0f, 0x0f, 0xf0,
+ 0x94, 0xd0, 0x1d, 0x20,
+ 0x12, 0x27, 0x07, 0xe0, 0x10, 0x30, 0x50, 0xf0, 0xb0, 0xf0, 0x02, 0xde,
+ 0x0d, 0xf0, 0xe3, 0xf7,
+ 0x07, 0x20, 0xbe, 0xce, 0xe1, 0xe2, 0xf3, 0x32, 0x40, 0xcd, 0xbe, 0xe2,
+ 0x12, 0x50, 0x0e, 0x0f,
+ 0x1d, 0x2c, 0x2f, 0xf2, 0xf6, 0x11, 0xf0, 0xd0, 0x00, 0x10, 0xe2, 0x81,
+ 0xbe, 0x0a, 0x0e, 0x0e,
+ 0x41, 0x42, 0x0d, 0x0f, 0xd2, 0xfb, 0x28, 0x3e, 0x3f, 0x20, 0x01, 0xe5,
+ 0xf0, 0x0e, 0x2d, 0x0c,
+ 0xc0, 0xf1, 0xf2, 0xe0, 0xcc, 0x9c, 0x0e, 0x00, 0x50, 0x22, 0xa0, 0xf0,
+ 0x00, 0x0d, 0xfa, 0x0f,
+ 0x20, 0x33, 0x0f, 0xe0, 0x00, 0x0e, 0x0c, 0x0f, 0x11, 0x23, 0xf1, 0xa0,
+ 0xdb, 0xef, 0x03, 0xe4,
+ 0x97, 0x10, 0x2e, 0xd0, 0x02, 0x10, 0x0e, 0x02, 0xa5, 0x01, 0x2b, 0x1f,
+ 0x0e, 0x01, 0xe3, 0xe1,
+ 0xb2, 0x0d, 0x0d, 0x4f, 0x10, 0xe2, 0xf7, 0xd3, 0xdf, 0xd0, 0x00, 0x01,
+ 0x31, 0x05, 0x00, 0x2d,
+ 0x0e, 0x9d, 0x8c, 0x0f, 0x22, 0x42, 0x2f, 0x00, 0x04, 0xf2, 0xed, 0x0b,
+ 0x60, 0x10, 0x30, 0x00,
+ 0xd0, 0x34, 0x12, 0xf0, 0x00, 0x10, 0x00, 0xe0, 0x75, 0x46, 0x32, 0xe5,
+ 0xe3, 0x54, 0x10, 0x0c,
+ 0x11, 0x43, 0x17, 0x11, 0x50, 0x1e, 0x10, 0x01, 0x03, 0x52, 0x21, 0x0e,
+ 0xcf, 0x11, 0x10, 0xfb,
+ 0xff, 0x03, 0x17, 0x32, 0x30, 0x2e, 0xdf, 0xe0, 0x22, 0x40, 0x32, 0x11,
+ 0x00, 0x00, 0xf2, 0xf7,
+ 0x05, 0x80, 0xdf, 0x0f, 0x4f, 0x32, 0xc3, 0xb7, 0xf1, 0xf0, 0xed, 0x00,
+ 0x12, 0x05, 0x00, 0x9f,
+ 0xee, 0xff, 0x1d, 0x50, 0x21, 0x22, 0xff, 0xe0, 0xe2, 0xfe, 0x18, 0x30,
+ 0xb0, 0xc1, 0xd1, 0xd0,
+ 0xe0, 0xef, 0xfd, 0x0d, 0x0d, 0xbf, 0xe1, 0x04, 0xea, 0xfc, 0x0f, 0x4d,
+ 0x30, 0x03, 0xf0, 0xbc,
+ 0xcc, 0xe0, 0x01, 0xf0, 0x0d, 0x0e, 0xfe, 0xad, 0x0a, 0x0e, 0xf0, 0xd3,
+ 0x0f, 0xf8, 0xcf, 0xef,
+ 0x10, 0x70, 0x02, 0xdf, 0xee, 0x0e, 0x71, 0x6f, 0x0d, 0xff, 0x00, 0xff,
+ 0x0c, 0x2e, 0x3c, 0x0c,
+ 0xef, 0xf0, 0x12, 0x02, 0x0c, 0xdb, 0x00, 0xe1, 0xff, 0x64, 0x05, 0x05,
+ 0xfe, 0x00, 0x8f, 0x00,
+ 0xc0, 0x1c, 0x90, 0xe1, 0x8f, 0x1a, 0xb0, 0xdc, 0x98, 0xe0, 0x00, 0x01,
+ 0x22, 0x0f, 0x2e, 0xff,
+ 0xfd, 0x00, 0x4e, 0x0f, 0xe1, 0xf3, 0x36, 0x20, 0x02, 0xa0, 0xee, 0xd2,
+ 0xe9, 0xed, 0x0f, 0xf0,
+ 0xe2, 0x63, 0x2d, 0x0d, 0xd0, 0xd3, 0x00, 0x0a, 0x1f, 0x50, 0x30, 0x30,
+ 0x03, 0x2d, 0x28, 0xce,
+ 0xe0, 0x04, 0x60, 0x0d, 0xee, 0xf0, 0x00, 0x31, 0x17, 0xf4, 0x72, 0x60,
+ 0x0e, 0xe0, 0xe0, 0xf2,
+ 0x04, 0x12, 0x10, 0x2e, 0x53, 0x07, 0x27, 0x10, 0x3e, 0x10, 0x00, 0x00,
+ 0x21, 0x43, 0x11, 0xc1,
+ 0xef, 0xd1, 0x01, 0x70, 0x3f, 0x23, 0x07, 0xd0, 0xf1, 0x11, 0x61, 0x22,
+ 0x11, 0x01, 0x06, 0xf2,
+ 0xd0, 0x0c, 0x2f, 0x10, 0x00, 0x17, 0x02, 0x90, 0xe0, 0xf0, 0xf1, 0xf0,
+ 0xb3, 0xb0, 0xd0, 0xd0,
+ 0xcc, 0x0d, 0x4f, 0x50, 0x00, 0xff, 0xed, 0x11, 0xf0, 0x0d, 0x10, 0x00,
+ 0xee, 0xec, 0x0e, 0x11,
+ 0xf1, 0xcf, 0xce, 0xc8, 0xeb, 0x10, 0x50, 0x3d, 0x0e, 0xae, 0xf0, 0x06,
+ 0x00, 0x3d, 0x4b, 0xff,
+ 0xbf, 0x01, 0x03, 0x20, 0x1a, 0xed, 0x01, 0x10, 0x30, 0x2e, 0x0c, 0x8f,
+ 0xf0, 0xf0, 0x00, 0x1c,
+ 0x10, 0xf3, 0xf0, 0xfc, 0xcd, 0xff, 0x01, 0x50, 0x40, 0x4d, 0x0c, 0x2e,
+ 0xf0, 0x00, 0x0f, 0x0c,
+ 0x2d, 0x00, 0x04, 0xff, 0xe8, 0xcc, 0x03, 0x00, 0x1f, 0xcc, 0xe0, 0x00,
+ 0x12, 0x15, 0x12, 0x9f,
+ 0xa9, 0xdf, 0xe0, 0x0f, 0x3e, 0x31, 0x02, 0xe0, 0xec, 0xdf, 0xb0, 0xe0,
+ 0xd2, 0xf3, 0xfe, 0xf8,
+ 0xdf, 0xd0, 0x80, 0xcf, 0x00, 0x00, 0xfe, 0x0d, 0xf0, 0xf1, 0xba, 0xee,
+ 0x00, 0x01, 0x31, 0x52,
+ 0x11, 0x0f, 0x1d, 0xbe, 0xed, 0x0a, 0x1c, 0x5e, 0x00, 0xe3, 0x05, 0x00,
+ 0x0d, 0x0c, 0x2f, 0x30,
+ 0xd4, 0xf6, 0x32, 0x10, 0xed, 0x00, 0x72, 0x71, 0x23, 0x05, 0x11, 0x10,
+ 0x0e, 0xed, 0x30, 0x55,
+ 0x02, 0x00, 0xee, 0x00, 0x0f, 0x60, 0x22, 0x0e, 0x0d, 0x02, 0xf7, 0x25,
+ 0x50, 0x3d, 0x00, 0x12,
+ 0x02, 0x10, 0x0e, 0x00, 0x30, 0x10, 0x21, 0x17, 0x75, 0x30, 0x20, 0xff,
+ 0x82, 0xf6, 0xf1, 0x01,
+ 0x10, 0x00, 0xe0, 0xe2, 0x13, 0x13, 0x30, 0x0e, 0xc0, 0xe3, 0x26, 0x70,
+ 0x30, 0xd0, 0xe3, 0xf4,
+ 0x02, 0x20, 0x00, 0x23, 0x04, 0x01, 0xa1, 0xf4, 0xe2, 0x01, 0x3f, 0x6f,
+ 0x1f, 0x02, 0xd7, 0x12,
+ 0x1d, 0xfe, 0x00, 0x75, 0x31, 0x21, 0x10, 0x0f, 0xf3, 0x03, 0x1f, 0x0c,
+ 0x2e, 0x10, 0x3f, 0x4e,
+ 0x4e, 0xf9, 0xab, 0xee, 0xf0, 0x00, 0x1e, 0x0d, 0x11, 0x63, 0x10, 0x18,
+ 0x0d, 0xcd, 0x31, 0x56,
+ 0x20, 0x0d, 0x00, 0xfe, 0x0d, 0xee, 0x00, 0x0f, 0xed, 0x0f, 0x61, 0x35,
+ 0x00, 0xb1, 0xf1, 0x05,
+ 0xd0, 0xce, 0x00, 0x21, 0x2f, 0xfb, 0xa0, 0xf4, 0xe1, 0x00, 0x2d, 0x44,
+ 0xe5, 0x92, 0xff, 0x0e,
+ 0xfd, 0x00, 0x01, 0x06, 0x34, 0xd0, 0xbe, 0xff, 0x00, 0xc0, 0xef, 0xfd,
+ 0x04, 0xf4, 0xe0, 0xf0,
+ 0xcc, 0x10, 0x6f, 0x20, 0xf0, 0xd1, 0xe1, 0x0f, 0x0c, 0x1c, 0x1f, 0x30,
+ 0x31, 0x02, 0xdf, 0xf8,
+ 0x3d, 0x6f, 0x1e, 0xdf, 0xd2, 0x14, 0x1f, 0x7c, 0x31, 0x13, 0xf3, 0x0e,
+ 0x68, 0x3f, 0x00, 0xf0,
+ 0xd0, 0x35, 0x70, 0x2c, 0x0f, 0xd0, 0x11, 0xf0, 0xef, 0xfd, 0x0f, 0x0f,
+ 0x32, 0x51, 0x1e, 0xeb,
+ 0xd0, 0xe3, 0x00, 0xdf, 0xbc, 0x0f, 0x1d, 0x4f, 0x10, 0xf3, 0xd5, 0xf3,
+ 0x0d, 0x4f, 0x00, 0xd5,
+ 0xe4, 0xe2, 0x82, 0xdd, 0xd0, 0xa5, 0x02, 0x01, 0x10, 0x0c, 0x8f, 0xf0,
+ 0xf5, 0x0f, 0x1d, 0x10,
+ 0x00, 0x0f, 0x0f, 0x00, 0xe3, 0xbe, 0xeb, 0x02, 0x24, 0x0f, 0xcd, 0x00,
+ 0x00, 0xec, 0xdc, 0xef,
+ 0x00, 0xcf, 0xdb, 0x2f, 0x71, 0x03, 0xd8, 0xed, 0xff, 0x0f, 0x00, 0x23,
+ 0x75, 0x1f, 0x0c, 0x0d,
+ 0xef, 0x0f, 0xee, 0x00, 0x3f, 0x2f, 0x0b, 0xce, 0xc0, 0xc3, 0xc2, 0xda,
+ 0xed, 0x10, 0x4f, 0x40,
+ 0x02, 0xe5, 0x00, 0x0c, 0x1f, 0x20, 0x51, 0x32, 0x0d, 0xdc, 0x00, 0x0e,
+ 0xcc, 0x3f, 0x72, 0x47,
+ 0xf2, 0xd0, 0xf0, 0xf0, 0xfd, 0x0e, 0x31, 0x14, 0x53, 0x03, 0xff, 0xeb,
+ 0x1f, 0x4e, 0x20, 0x01,
+ 0xb4, 0x02, 0xf5, 0x1f, 0x5d, 0x10, 0x05, 0x03, 0x32, 0x3f, 0x1f, 0xcf,
+ 0xd0, 0xe0, 0x03, 0x21,
+ 0x0f, 0xe2, 0xe5, 0x21, 0x71, 0x1e, 0x1d, 0x0f, 0x2f, 0x43, 0x05, 0x21,
+ 0x37, 0x21, 0x5f, 0x7e,
+ 0x2f, 0x0d, 0xfc, 0x1e, 0x31, 0xf2, 0xf0, 0x1c, 0x4d, 0x2f, 0x26, 0xc2,
+ 0xc3, 0x04, 0x10, 0x2e,
+ 0x60, 0x37, 0x42, 0x31, 0x21, 0x22, 0xe0, 0xb0, 0x12, 0x23, 0x20, 0x20,
+ 0x03, 0x15, 0xe2, 0x03,
+ 0x57, 0x42, 0x2f, 0x00, 0x12, 0xf5, 0xe1, 0x00, 0x01, 0x53, 0x30, 0x41,
+ 0x32, 0x13, 0x21, 0x03,
+ 0x17, 0x44, 0x12, 0x2f, 0x30, 0x00, 0x35, 0x63, 0xf1, 0xc1, 0xd0, 0xf2,
+ 0xf3, 0x02, 0x35, 0x54,
+ 0x00, 0xef, 0xce, 0xd0, 0x02, 0x34, 0x02, 0x53, 0x5f, 0x1e, 0x0e, 0xe1,
+ 0xc0, 0xe4, 0xe2, 0xe4,
+ 0x31, 0x2f, 0x2d, 0xe0, 0xa2, 0xec, 0xdb, 0xff, 0x0f, 0x00, 0x3e, 0x4f,
+ 0xa1, 0xd3, 0xd0, 0xe8,
+ 0x0a, 0x5f, 0x30, 0x00, 0x31, 0x00, 0x09, 0xbe, 0xf0, 0x2f, 0x32, 0x00,
+ 0xbc, 0x9e, 0xfd, 0xfe,
+ 0x0b, 0x1e, 0x10, 0x14, 0xe3, 0xfe, 0x1e, 0x2d, 0x0c, 0xef, 0x40, 0x20,
+ 0x0c, 0x0e, 0x30, 0x51,
+ 0x1d, 0x09, 0xf0, 0xe0, 0x11, 0x02, 0xee, 0xaf, 0x0f, 0x02, 0x05, 0x40,
+ 0x10, 0xf0, 0xdf, 0x0f,
+ 0x1f, 0x0e, 0xb0, 0x03, 0xed, 0x0f, 0x37, 0x07, 0x01, 0xe1, 0x40, 0x7d,
+ 0x30, 0xf1, 0x83, 0x00,
+ 0xf1, 0x00, 0x0b, 0x00, 0x00, 0xf1, 0x0f, 0xfe, 0xbd, 0xe0, 0xe1, 0xf3,
+ 0x20, 0x4e, 0x1f, 0xf3,
+ 0xaf, 0xfc, 0xda, 0x0d, 0x18, 0x3f, 0x6f, 0x00, 0x01, 0x1e, 0xcc, 0xec,
+ 0xff, 0xf0, 0x00, 0x0c,
+ 0x0e, 0xcf, 0xcd, 0x04, 0x75, 0x31, 0x0f, 0xfc, 0x01, 0x01, 0x12, 0x00,
+ 0x00, 0xe0, 0x0f, 0xfe,
+ 0x3c, 0x72, 0x47, 0xf1, 0xdf, 0xef, 0x10, 0x13, 0x00, 0x00, 0x22, 0x11,
+ 0x02, 0xee, 0xec, 0xff,
+ 0xe1, 0xf3, 0x70, 0x6e, 0x1f, 0x15, 0x12, 0x0e, 0xbc, 0xf4, 0xd7, 0x17,
+ 0x30, 0x0f, 0xe0, 0xa2,
+ 0xe1, 0xe0, 0xe0, 0xf0, 0xe0, 0x00, 0x00, 0x13, 0xe1, 0x8e, 0xeb, 0xf1,
+ 0x20, 0x40, 0x0e, 0xb0,
+ 0xe4, 0xee, 0xea, 0x0e, 0x0f, 0x01, 0xe1, 0xe1, 0xef, 0xf9, 0xef, 0x0f,
+ 0x2e, 0x11, 0xc3, 0xb4,
+ 0xff, 0xed, 0xdb, 0xec, 0x0f, 0x60, 0x20, 0x10, 0x43, 0x00, 0xdc, 0xed,
+ 0xfc, 0x10, 0x3f, 0xac,
+ 0xdc, 0xee, 0x0f, 0x0e, 0xec, 0x00, 0xff, 0xae, 0xfc, 0x0f, 0xf4, 0xc0,
+ 0xea, 0x30, 0x6f, 0x00,
+ 0x00, 0x00, 0x40, 0x2c, 0x1c, 0x1c, 0x0f, 0x3e, 0x0e, 0x0f, 0xe3, 0xe3,
+ 0x00, 0x20, 0x1c, 0x0f,
+ 0x0c, 0x7e, 0x20, 0xc0, 0xb1, 0xec, 0x00, 0x24, 0x40, 0x2d, 0x2e, 0x0f,
+ 0xad, 0xee, 0xd0, 0x00,
+ 0x17, 0x61, 0x22, 0x00, 0xc0, 0xd0, 0xef, 0xfe, 0x09, 0x0e, 0xe0, 0x07,
+ 0xf0, 0x00, 0x20, 0x03,
+ 0x90, 0xe2, 0xf4, 0x00, 0x00, 0x00, 0xd1, 0xe4, 0x46, 0x61, 0x1f, 0x1e,
+ 0x12, 0x12, 0xff, 0xfe,
+ 0xd1, 0xcf, 0xc9, 0x00, 0x20, 0x34, 0x15, 0x01, 0x5f, 0x4f, 0xd0, 0xe4,
+ 0x16, 0x72, 0x20, 0x3f,
+ 0x30, 0x01, 0x01, 0xd2, 0x41, 0x42, 0x11, 0x51, 0x33, 0x45, 0x10, 0x0f,
+ 0xe1, 0xf6, 0x00, 0x0f,
+ 0x40, 0x50, 0x22, 0x00, 0xef, 0x0f, 0x30, 0x5f, 0x3b, 0x30, 0x07, 0xf3,
+ 0x01, 0x20, 0x3c, 0x00,
+ 0xf1, 0x02, 0x25, 0x02, 0xd0, 0x9e, 0xd0, 0xf3, 0xe4, 0xf3, 0x12, 0x24,
+ 0xc0, 0xbe, 0x0e, 0x30,
+ 0x75, 0x01, 0xe0, 0xe4, 0x04, 0xe0, 0xf0, 0xdd, 0xf0, 0xe0, 0xfe, 0x11,
+ 0x57, 0xf2, 0xb0, 0x01,
+ 0x00, 0x00, 0xbb, 0xf0, 0xe1, 0xd0, 0xce, 0x0f, 0x30, 0x51, 0x11, 0x20,
+ 0x0f, 0x0f, 0x0f, 0x10,
+ 0x1e, 0x18, 0x0b, 0x0e, 0x00, 0x23, 0x20, 0xec, 0xdd, 0xdd, 0x10, 0x30,
+ 0xab, 0xbe, 0xfe, 0xe1,
+ 0xf1, 0xbe, 0x0e, 0x73, 0x6d, 0x18, 0x1d, 0xfc, 0xf0, 0x0f, 0x2f, 0x3e,
+ 0x3e, 0x30, 0x01, 0xec,
+ 0x0b, 0x3e, 0x00, 0xe2, 0x00, 0x1d, 0x5d, 0x0e, 0xfe, 0x15, 0x02, 0xef,
+ 0xeb, 0xde, 0x50, 0x63,
+ 0x21, 0x00, 0xf7, 0xe3, 0x00, 0x10, 0x5f, 0xf1, 0xe6, 0xc2, 0x00, 0xfe,
+ 0xff, 0xd0, 0xf4, 0x03,
+ 0x55, 0x3f, 0xe0, 0x90, 0xf1, 0xd1, 0xd0, 0xf2, 0xf3, 0x10, 0x50, 0x42,
+ 0x16, 0x20, 0xf1, 0xe1,
+ 0xe2, 0x00, 0x30, 0x1c, 0x4d, 0x5d, 0xfe, 0x8e, 0xf0, 0x05, 0x1b, 0x1c,
+ 0x20, 0x46, 0xf2, 0xe0,
+ 0xee, 0x2e, 0x10, 0x04, 0x32, 0x42, 0x50, 0x00, 0x1d, 0x00, 0x21, 0x31,
+ 0x33, 0x33, 0x16, 0xe0,
+ 0xe2, 0x03, 0x00, 0x2e, 0x00, 0xf6, 0x02, 0x11, 0xff, 0xfd, 0x7e, 0x4d,
+ 0x00, 0x06, 0x74, 0x22,
+ 0x00, 0x0e, 0x10, 0x32, 0x24, 0x12, 0x02, 0x07, 0xf5, 0xa1, 0xf0, 0xc1,
+ 0xe0, 0xf1, 0xf0, 0xf1,
+ 0x12, 0x54, 0x02, 0xe4, 0xf0, 0x00, 0x05, 0xf0, 0xf3, 0xa0, 0xdf, 0x00,
+ 0x62, 0x2f, 0xee, 0x00,
+ 0x07, 0x21, 0x00, 0x90, 0xd1, 0xce, 0xff, 0x0f, 0x1e, 0xe0, 0xa0, 0xf0,
+ 0xf4, 0x2e, 0x49, 0x00,
+ 0x11, 0x1f, 0x1c, 0xee, 0xbf, 0x0f, 0x0f, 0x5f, 0x28, 0x0e, 0xfd, 0xde,
+ 0xfc, 0x0f, 0xd0, 0xcf,
+ 0xde, 0xec, 0x1c, 0xfe, 0xaf, 0xf1, 0xe0, 0xe8, 0xfe, 0x1f, 0x1f, 0xf0,
+ 0xef, 0x0f, 0x2e, 0xde,
+ 0xbe, 0x0e, 0x4d, 0xfc, 0xec, 0x3f, 0x22, 0xb2, 0xce, 0xea, 0xef, 0xf0,
+ 0xbe, 0xdf, 0xf0, 0x0c,
+ 0xdb, 0xcf, 0x00, 0x21, 0xf2, 0xd0, 0x3c, 0x7d, 0x0e, 0xa1, 0xe4, 0xe2,
+ 0x0f, 0x0b, 0x30, 0x31,
+ 0x12, 0xd1, 0xef, 0xcc, 0xdd, 0xbc, 0xf1, 0x13, 0x01, 0x00, 0xdb, 0x9f,
+ 0xe0, 0xf0, 0x0f, 0x2e,
+ 0x50, 0x07, 0x01, 0x00, 0xff, 0x0b, 0x0e, 0x0d, 0xe0, 0x04, 0xef, 0xdc,
+ 0x0c, 0x4f, 0x0f, 0xee,
+ 0x00, 0x61, 0x24, 0x0f, 0xfd, 0x00, 0x02, 0x01, 0x1d, 0x70, 0x71, 0x02,
+ 0x02, 0x01, 0x33, 0x00,
+ 0x14, 0x22, 0x37, 0x17, 0x15, 0x10, 0x21, 0x00, 0x0f, 0x70, 0x22, 0x03,
+ 0x03, 0x44, 0x30, 0x31,
+ 0xf0, 0x00, 0x31, 0x71, 0x3e, 0x31, 0x07, 0x03, 0x12, 0x30, 0x71, 0x07,
+ 0x03, 0x02, 0x01, 0xf0,
+ 0xf1, 0x15, 0x51, 0x33, 0x43, 0x03, 0x04, 0xe3, 0x02, 0x22, 0x02, 0x02,
+ 0x04, 0x33, 0xf4, 0xb2,
+ 0x05, 0x24, 0x62, 0x41, 0x31, 0x00, 0xe1, 0xe3, 0x05, 0xe2, 0xc0, 0xf3,
+ 0x03, 0x20, 0x30, 0x41,
+ 0xd2, 0xc0, 0x02, 0x67, 0x02, 0x00, 0x22, 0x44, 0x12, 0x00, 0x0f, 0x0e,
+ 0x0d, 0x18, 0x4d, 0x3f,
+ 0xf0, 0xd0, 0x0f, 0x2d, 0xdd, 0xb2, 0xe2, 0x9d, 0xeb, 0xed, 0x2f, 0x60,
+ 0x00, 0xfa, 0xdf, 0x0f,
+ 0x2d, 0x4d, 0x2f, 0x0a, 0xed, 0xfe, 0x00, 0xed, 0x0b, 0x60, 0x71, 0x20,
+ 0x0b, 0x0f, 0xc0, 0xfe,
+ 0xfd, 0xee, 0x3f, 0x30, 0x0e, 0x00, 0xf2, 0xff, 0xd8, 0xed, 0x10, 0x22,
+ 0x12, 0xc0, 0x0f, 0xef,
+ 0xaa, 0xee, 0x10, 0x76, 0x10, 0x00, 0x00, 0x00, 0xee, 0xef, 0xed, 0xdc,
+ 0xc0, 0xc1, 0xe1, 0xc1,
+ 0xfd, 0xec, 0xee, 0xe0, 0x01, 0x51, 0x0f, 0xbf, 0xd2, 0xee, 0x09, 0xfe,
+ 0xfa, 0xbf, 0xff, 0xff,
+ 0x0c, 0x0c, 0x0d, 0xad, 0xee, 0xfe, 0xfe, 0xd0, 0xd7, 0xe2, 0xfd, 0xfc,
+ 0xde, 0xce, 0x00, 0x7f,
+ 0x10, 0x0e, 0x0f, 0xf0, 0x03, 0x00, 0x3c, 0x3c, 0xee, 0x80, 0xf1, 0x01,
+ 0x0f, 0x0c, 0x13, 0xf4,
+ 0xc0, 0xf2, 0xe3, 0xc0, 0xfa, 0xeb, 0x5f, 0x40, 0x0f, 0x00, 0xfe, 0x01,
+ 0x02, 0xe2, 0x26, 0x30,
+ 0x0c, 0x9e, 0xd0, 0xc4, 0xf3, 0xe5, 0x01, 0x00, 0x0e, 0x00, 0xf0, 0xe1,
+ 0xb3, 0xd2, 0xb0, 0xde,
+ 0xf0, 0xf2, 0x32, 0x36, 0xd0, 0xcb, 0xed, 0xff, 0x0e, 0xf0, 0xbf, 0xe1,
+ 0xc1, 0xe9, 0xff, 0xe0,
+ 0xc0, 0xab, 0xee, 0xdf, 0xee, 0xee, 0xdc, 0x10, 0x05, 0xd2, 0xe1, 0xdf,
+ 0x2d, 0x7e, 0x6e, 0x11,
+ 0x00, 0xde, 0xf8, 0x0e, 0x00, 0x4d, 0x2f, 0x0d, 0xf0, 0xbe, 0xec, 0xde,
+ 0xde, 0x10, 0x12, 0x54,
+ 0x00, 0x0f, 0xda, 0xcc, 0xde, 0x0f, 0x40, 0x51, 0x30, 0x1e, 0x0f, 0x1d,
+ 0x2b, 0x3f, 0x30, 0x22,
+ 0x02, 0x14, 0x5f, 0x1b, 0x0a, 0xa0, 0x0f, 0x30, 0x41, 0x0f, 0x00, 0x10,
+ 0x2b, 0x0e, 0x50, 0x34,
+ 0x00, 0xfe, 0x03, 0x31, 0x12, 0xf2, 0x20, 0x7e, 0x3e, 0x14, 0x17, 0x14,
+ 0x00, 0xfb, 0x0f, 0xd0,
+ 0xb0, 0xe1, 0x01, 0x02, 0x41, 0xf0, 0xb2, 0x15, 0x10, 0x20, 0x0f, 0x02,
+ 0x37, 0x05, 0xb0, 0xf0,
+ 0x0f, 0x40, 0x60, 0x00, 0x02, 0x00, 0xfe, 0x01, 0x23, 0x34, 0x00, 0xe0,
+ 0x00, 0xf0, 0xc2, 0xa2,
+ 0x03, 0x33, 0x51, 0x10, 0xe2, 0x07, 0x07, 0x36, 0x50, 0x40, 0x20, 0x20,
+ 0x10, 0x31, 0x63, 0x03,
+ 0xf3, 0xf4, 0x10, 0x22, 0x11, 0x11, 0x13, 0x03, 0x02, 0x16, 0x71, 0x72,
+ 0x22, 0x24, 0x10, 0x00,
+ 0x20, 0x10, 0x02, 0x10, 0x04, 0x27, 0x14, 0x20, 0x62, 0x10, 0x11, 0x00,
+ 0x02, 0x12, 0x13, 0x04,
+ 0x03, 0x23, 0x10, 0x24, 0xf4, 0x82, 0x00, 0x01, 0x13, 0x32, 0x37, 0x15,
+ 0x01, 0xe2, 0xf0, 0x10,
+ 0x73, 0x03, 0x10, 0x4f, 0x11, 0xc2, 0xb0, 0xf5, 0x05, 0x10, 0x1f, 0x32,
+ 0xf7, 0xb2, 0xef, 0x0e,
+ 0x00, 0x02, 0x63, 0x42, 0x22, 0x11, 0x0f, 0xeb, 0x00, 0x20, 0x2e, 0x1f,
+ 0x2e, 0x31, 0x11, 0xe0,
+ 0xcf, 0x24, 0x10, 0xfb, 0xf0, 0x03, 0x03, 0xbb, 0x0e, 0x0c, 0x4d, 0x4e,
+ 0x30, 0x13, 0x6f, 0x40,
+ 0x3d, 0x08, 0x1e, 0x30, 0x12, 0x51, 0x20, 0x0c, 0x0d, 0xff, 0x00, 0x30,
+ 0x2a, 0x0e, 0x70, 0x20,
+ 0xf1, 0xce, 0xfa, 0xff, 0xe0, 0xef, 0x02, 0x05, 0x00, 0xee, 0xf0, 0xdf,
+ 0xc0, 0x62, 0x41, 0x12,
+ 0xe0, 0x93, 0xf4, 0xf2, 0x00, 0x00, 0xff, 0xfc, 0xcb, 0xef, 0xe3, 0xf5,
+ 0xf0, 0x01, 0xd1, 0xc1,
+ 0xb1, 0xf3, 0xef, 0xd0, 0x0f, 0xef, 0x18, 0x7d, 0x1e, 0x0d, 0xb0, 0xf3,
+ 0x00, 0x0b, 0x0b, 0x1d,
+ 0x0e, 0xfd, 0xce, 0xff, 0x01, 0xd2, 0xda, 0x0e, 0x10, 0x31, 0xeb, 0x0c,
+ 0x3f, 0x7f, 0x20, 0x20,
+ 0x61, 0x11, 0x10, 0x3e, 0x2d, 0x30, 0x02, 0xcf, 0x9d, 0xe0, 0x02, 0x0c,
+ 0x2b, 0x21, 0x33, 0x0e,
+ 0xf9, 0x0e, 0xfd, 0xde, 0x1f, 0x7f, 0x5c, 0xfe, 0xb1, 0x05, 0x0f, 0x1c,
+ 0x2d, 0x2f, 0x02, 0x07,
+ 0xd0, 0xd0, 0xf0, 0xc1, 0x03, 0xf2, 0x02, 0x03, 0xb1, 0xbe, 0xee, 0xe1,
+ 0xf6, 0xf3, 0x25, 0x53,
+ 0x03, 0xdf, 0xcd, 0x00, 0xe5, 0xe1, 0x00, 0x02, 0x04, 0xd0, 0xd0, 0xee,
+ 0xae, 0xd0, 0xc0, 0xf1,
+ 0xc7, 0xf3, 0xef, 0x1f, 0x20, 0x00, 0xf5, 0x11, 0x02, 0x0e, 0x1f, 0x4d,
+ 0x1e, 0x1b, 0x1a, 0x4e,
+ 0x5f, 0x10, 0x00, 0xef, 0xe0, 0xec, 0xbc, 0xcf, 0xdf, 0xe0, 0xd0, 0xda,
+ 0xad, 0xcf, 0xdd, 0xed,
+ 0x0b, 0x5e, 0x2e, 0x00, 0xed, 0xb0, 0xfb, 0x0e, 0x0c, 0x0e, 0x00, 0xfe,
+ 0xd0, 0x0d, 0x7d, 0x2b,
+ 0x0d, 0xfe, 0xdc, 0x0e, 0xec, 0xdd, 0xaf, 0xd0, 0xd0, 0xdc, 0x0c, 0x50,
+ 0x1d, 0xed, 0xe0, 0x01,
+ 0x0e, 0x3a, 0x50, 0x0e, 0xcf, 0xe2, 0x04, 0xcd, 0xda, 0xe0, 0x00, 0x0e,
+ 0x3e, 0x2f, 0xb0, 0xc6,
+ 0xe1, 0xf1, 0x00, 0x01, 0xd0, 0xbc, 0xf0, 0xe1, 0x13, 0x23, 0x05, 0x01,
+ 0x18, 0x00, 0x1c, 0x00,
+ 0xae, 0xd1, 0xff, 0x03, 0x9d, 0xd1, 0x7a, 0x01, 0xaf, 0x0d, 0x38, 0xfb,
+ 0xdd, 0xbd, 0x1f, 0x22,
+ 0x83, 0xd2, 0xf7, 0x20, 0x5c, 0x20, 0xd2, 0xa0, 0xee, 0xed, 0xed, 0x0b,
+ 0x63, 0x44, 0x21, 0x13,
+ 0x00, 0x0f, 0x0d, 0x10, 0x42, 0x27, 0x02, 0xef, 0xd2, 0xf7, 0x00, 0x2d,
+ 0x30, 0x71, 0x70, 0x0e,
+ 0x00, 0xef, 0xff, 0x0e, 0x20, 0x20, 0x25, 0x2f, 0x19, 0x0e, 0x2f, 0x0e,
+ 0x0e, 0x56, 0x23, 0x64,
+ 0x00, 0x00, 0x0d, 0xff, 0xef, 0x01, 0xc1, 0x00, 0xf0, 0x02, 0x31, 0x21,
+ 0x13, 0xdc, 0xce, 0x07,
+ 0x12, 0xdf, 0xee, 0x74, 0x6e, 0xf8, 0xe0, 0x0f, 0x10, 0x00, 0x00, 0xcc,
+ 0xef, 0xc0, 0xc2, 0xe0,
+ 0x0f, 0x11, 0x13, 0xd5, 0xb2, 0xfe, 0xfd, 0x1c, 0x50, 0x21, 0xf1, 0xc0,
+ 0x00, 0x0e, 0x08, 0x2f,
+ 0x60, 0x00, 0x12, 0x01, 0x00, 0x00, 0x03, 0xd0, 0xdc, 0x0e, 0x10, 0xf2,
+ 0x85, 0xd1, 0x00, 0x02,
+ 0x4b, 0x00, 0x02, 0x20, 0x12, 0x0f, 0xdf, 0xd2, 0x37, 0x33, 0x7e, 0x7d,
+ 0x00, 0x01, 0x01, 0x11,
+ 0x3f, 0x1d, 0x20, 0x10, 0x04, 0x07, 0x02, 0xe0, 0xdd, 0x0c, 0x30, 0x74,
+ 0x11, 0x10, 0x11, 0x07,
+ 0x11, 0x33, 0x13, 0x21, 0x0b, 0x0c, 0x0f, 0x70, 0x61, 0x00, 0xff, 0xfd,
+ 0x00, 0xf0, 0x02, 0x10,
+ 0x3f, 0x1b, 0xe1, 0xa5, 0x02, 0xe0, 0x00, 0x00, 0x6b, 0x20, 0xf0, 0xe2,
+ 0x00, 0xe8, 0xee, 0x0f,
+ 0x40, 0x31, 0x11, 0x21, 0x00, 0xbf, 0xfe, 0xed, 0xfe, 0x01, 0xd4, 0xe1,
+ 0xc3, 0xa1, 0xdd, 0xf8,
+ 0x10, 0x73, 0x52, 0xfe, 0x0f, 0x04, 0x03, 0x02, 0x00, 0x17, 0x11, 0x13,
+ 0x10, 0x1e, 0x0e, 0xda,
+ 0xe0, 0x10, 0x53, 0x03, 0x20, 0x3e, 0x3e, 0xfc, 0xef, 0x00, 0xf0, 0x01,
+ 0x72, 0x4e, 0x3b, 0x3f,
+ 0x31, 0x13, 0x20, 0x51, 0x26, 0x24, 0x00, 0xfd, 0xec, 0xde, 0x0f, 0x70,
+ 0x56, 0x00, 0xee, 0xff,
+ 0xf0, 0xf0, 0x01, 0x41, 0x4f, 0x0d, 0x0f, 0x12, 0x27, 0x0f, 0x0c, 0x7e,
+ 0x3f, 0x0d, 0xeb, 0xe0,
+ 0x03, 0xff, 0xca, 0xe0, 0xe1, 0xe3, 0xd0, 0xf1, 0x01, 0xa1, 0xd6, 0xf0,
+ 0x10, 0x1b, 0x00, 0xc0,
+ 0x00, 0x03, 0x00, 0x3e, 0x70, 0x70, 0x3d, 0x0f, 0xe2, 0xf5, 0xf0, 0xfc,
+ 0xd1, 0xe0, 0xd0, 0x02,
+ 0x03, 0xce, 0xda, 0xf0, 0x21, 0x50, 0x00, 0x0b, 0xd0, 0xee, 0xd3, 0x06,
+ 0xf2, 0xb0, 0xf0, 0x1c,
+ 0x70, 0x21, 0x33, 0x31, 0x1f, 0x00, 0xe2, 0xe3, 0x01, 0xee, 0x0c, 0x3d,
+ 0x0b, 0xef, 0x80, 0xe3,
+ 0xd1, 0x00, 0x37, 0x33, 0x40, 0x12, 0xf0, 0xbe, 0xd9, 0xc0, 0xf0, 0x00,
+ 0x71, 0x3f, 0x02, 0xe1,
+ 0xcc, 0xeb, 0x0f, 0xe0, 0x01, 0x02, 0xe3, 0xe7, 0xa0, 0xd0, 0xfe, 0xf0,
+ 0xed, 0xbf, 0xe3, 0xf7,
+ 0xf0, 0xcd, 0xef, 0xef, 0x03, 0x44, 0x20, 0x0e, 0x0e, 0xe0, 0x9d, 0xfe,
+ 0xef, 0xc2, 0xd3, 0xd7,
+ 0x02, 0x10, 0xfe, 0xbb, 0xff, 0xef, 0xef, 0x22, 0x51, 0x32, 0x03, 0x00,
+ 0xf0, 0x10, 0x40, 0x10,
+ 0x00, 0x07, 0x17, 0x20, 0x50, 0x60, 0x11, 0x1e, 0x20, 0x16, 0x00, 0xdc,
+ 0xf0, 0x3e, 0x7e, 0x6f,
+ 0x10, 0x01, 0x00, 0x30, 0x20, 0x10, 0x20, 0x21, 0x50, 0x2c, 0x3f, 0x00,
+ 0x14, 0x37, 0x24, 0x1d,
+ 0x3b, 0x30, 0x30, 0x12, 0x02, 0xd1, 0xe0, 0x0b, 0x30, 0x72, 0x21, 0x44,
+ 0x31, 0x10, 0x10, 0x3c,
+ 0x6f, 0x2f, 0x1e, 0x0d, 0xfd, 0xdf, 0xdf, 0xf0, 0x25, 0x63, 0x1f, 0x0c,
+ 0xe0, 0xc3, 0xf7, 0xd0,
+ 0xcd, 0xee, 0xef, 0xf0, 0x15, 0x71, 0x1c, 0x3e, 0x40, 0x10, 0x2e, 0x0f,
+ 0x61, 0x30, 0x1c, 0x00,
+ 0x00, 0xe7, 0xd1, 0xec, 0x0e, 0x10, 0x30, 0x20, 0x2f, 0xe1, 0x82, 0xdf,
+ 0xf0, 0xd5, 0x00, 0x0e,
+ 0x7f, 0x2d, 0xfe, 0xe1, 0xf4, 0x13, 0x41, 0x44, 0x43, 0x27, 0x02, 0xef,
+ 0xe8, 0x00, 0x2f, 0x10,
+ 0x10, 0x02, 0x43, 0x00, 0x8e, 0xf0, 0xf0, 0xf2, 0xf0, 0xff, 0x01, 0xe3,
+ 0xe2, 0xe1, 0x24, 0x10,
+ 0x0a, 0xe0, 0xb4, 0xf5, 0xe0, 0xda, 0x90, 0xcf, 0xd0, 0xe2, 0x05, 0x00,
+ 0x3f, 0xcf, 0xa0, 0xe0,
+ 0xd0, 0xd1, 0xc2, 0xd1, 0x00, 0xed, 0x0f, 0xef, 0xcf, 0xf8, 0xfe, 0xf0,
+ 0xf1, 0xc2, 0xb3, 0xf0,
+ 0xec, 0xee, 0xe0, 0xa0, 0xe0, 0xd3, 0xd0, 0xd9, 0xff, 0x20, 0x12, 0x01,
+ 0xdc, 0xf0, 0xf2, 0xb1,
+ 0xd0, 0x01, 0x10, 0x6c, 0x20, 0x03, 0x04, 0xf7, 0x03, 0x00, 0x1e, 0xfe,
+ 0xc0, 0x21, 0x25, 0xc1,
+ 0xc0, 0xff, 0xed, 0x0b, 0x6f, 0x30, 0x13, 0xff, 0xda, 0x00, 0x03, 0x52,
+ 0x3f, 0x2d, 0x0e, 0xcf,
+ 0xcf, 0xf4, 0xf5, 0x00, 0x1c, 0x20, 0xd1, 0xa3, 0xf4, 0xcf, 0xcc, 0xf2,
+ 0xd3, 0xf1, 0xe0, 0x03,
+ 0x40, 0xfd, 0xe4, 0xf4, 0xc0, 0xdb, 0xcf, 0xee, 0xdd, 0x0e, 0x0e, 0xbc,
+ 0x00, 0xad, 0xde, 0xc0,
+ 0xe6, 0xe0, 0xeb, 0xd0, 0xc3, 0xc6, 0xc0, 0xd2, 0xef, 0x0c, 0x3e, 0x30,
+ 0x50, 0x05, 0x00, 0xde,
+ 0xfe, 0xe0, 0x11, 0x42, 0x13, 0x2d, 0xfb, 0xd0, 0xef, 0xce, 0xe0, 0x21,
+ 0x76, 0x00, 0xe0, 0xb0,
+ 0x0e, 0xed, 0xed, 0xff, 0x01, 0x06, 0x03, 0x21, 0x0c, 0xde, 0x01, 0x27,
+ 0x30, 0x60, 0x30, 0x1e,
+ 0x00, 0x0f, 0x3e, 0x5f, 0x00, 0x00, 0x73, 0x40, 0x0e, 0xff, 0xc4, 0x06,
+ 0xe0, 0xff, 0x15, 0x63,
+ 0x21, 0x2e, 0x1e, 0x10, 0x0e, 0xff, 0x00, 0x04, 0x02, 0x05, 0x30, 0x60,
+ 0x20, 0x3c, 0x1f, 0x0d,
+ 0x00, 0x11, 0x33, 0x17, 0x02, 0xde, 0xdd, 0x33, 0x05, 0x80, 0xe0, 0xef,
+ 0x0d, 0x6d, 0x5f, 0x20,
+ 0x33, 0x1f, 0x21, 0xef, 0xb8, 0x0e, 0x00, 0x00, 0x0d, 0x2d, 0x20, 0x03,
+ 0xd3, 0xf1, 0x51, 0x2a,
+ 0x5e, 0x2e, 0x0f, 0x00, 0x02, 0x1f, 0x2c, 0x6f, 0x30, 0x37, 0x16, 0x00,
+ 0x00, 0x00, 0x34, 0x72,
+ 0x30, 0x20, 0x1e, 0x0e, 0xf0, 0x12, 0x42, 0x1d, 0x2c, 0x50, 0x32, 0x23,
+ 0x00, 0x30, 0x18, 0x3f,
+ 0x70, 0x43, 0x22, 0x41, 0x29, 0x4d, 0x3f, 0x22, 0x00, 0x0f, 0xf0, 0xe0,
+ 0x0e, 0x20, 0x63, 0x17,
+ 0x13, 0x01, 0x00, 0x00, 0x41, 0x1e, 0x50, 0x45, 0x21, 0x00, 0xd0, 0xfc,
+ 0xed, 0x1e, 0x7d, 0x4f,
+ 0x2f, 0xfc, 0xec, 0x00, 0x01, 0x00, 0x03, 0xe7, 0xd7, 0x00, 0xee, 0xcc,
+ 0xcf, 0xff, 0x2e, 0x50,
+ 0x46, 0x01, 0x10, 0x0e, 0x4f, 0x00, 0x0e, 0xff, 0x20, 0x60, 0x0e, 0x3f,
+ 0x11, 0x26, 0x00, 0xff,
+ 0x0f, 0x10, 0x3f, 0xff, 0xed, 0xd0, 0x8d, 0xd0, 0xf6, 0x35, 0x40, 0x30,
+ 0x00, 0xc0, 0x10, 0x10,
+ 0x44, 0x02, 0x45, 0x12, 0x32, 0x40, 0x4f, 0x2d, 0x0b, 0x0e, 0x0f, 0xd0,
+ 0xc0, 0xf4, 0x25, 0x10,
+ 0xff, 0x0f, 0x60, 0x10, 0x10, 0x14, 0x13, 0x02, 0x20, 0x40, 0x10, 0x0a,
+ 0x10, 0x30, 0x01, 0xd1,
+ 0xee, 0x1e, 0x7d, 0x73, 0x73, 0x0c, 0xe3, 0xf7, 0xf6, 0xff, 0xf0, 0xfe,
+ 0x0f, 0x0c, 0xf0, 0xf0,
+ 0x00, 0x2f, 0x3d, 0x2f, 0x3f, 0x0e, 0xbe, 0xe0, 0xe3, 0x01, 0xce, 0xed,
+ 0xde, 0xd8, 0xca, 0xb0,
+ 0xd3, 0xd0, 0xd1, 0xb0, 0xff, 0x00, 0xe0, 0xe0, 0xfe, 0x00, 0x10, 0xbb,
+ 0xd0, 0x07, 0x67, 0x0f,
+ 0x10, 0x00, 0xe3, 0xd0, 0xe0, 0x02, 0xc2, 0xc1, 0x00, 0x30, 0x2e, 0x1b,
+ 0xc0, 0x80, 0xe1, 0xee,
+ 0x0c, 0x10, 0x30, 0x23, 0x04, 0x04, 0x00, 0x0b, 0x3f, 0x70, 0x32, 0x0f,
+ 0x0d, 0xef, 0xad, 0xfe,
+ 0xef, 0xf5, 0x02, 0x22, 0x01, 0xf1, 0xf1, 0xb1, 0xff, 0xf1, 0xe7, 0xd4,
+ 0xe2, 0x04, 0x20, 0x7a,
+ 0x0d, 0xfe, 0x00, 0x1e, 0x00, 0x3e, 0x2f, 0x0f, 0x9f, 0xd3, 0xd5, 0xa0,
+ 0xf0, 0xec, 0xfd, 0xe0,
+ 0x03, 0xe1, 0xa9, 0x00, 0x0f, 0x00, 0x14, 0x02, 0xef, 0x0b, 0xc0, 0xef,
+ 0x02, 0x14, 0x00, 0xf1,
+ 0x71, 0x11, 0x0c, 0xee, 0xff, 0xdf, 0xff, 0xd3, 0xd6, 0xd0, 0xbe, 0xec,
+ 0xf0, 0xd0, 0xec, 0xe1,
+ 0xd3, 0xc4, 0xa0, 0xe0, 0xf5, 0x30, 0x61, 0x0f, 0x1f, 0xf0, 0xf0, 0xd0,
+ 0xef, 0x10, 0x31, 0x3e,
+ 0x19, 0xf0, 0x80, 0xf3, 0x03, 0x0c, 0x1c, 0x30, 0x34, 0xd1, 0xd2, 0x05,
+ 0xd1, 0xe1, 0xf0, 0xe0,
+ 0xaa, 0xe0, 0x0f, 0x2f, 0x2e, 0x70, 0x54, 0x30, 0xfe, 0xff, 0x03, 0xf4,
+ 0x01, 0xc0, 0xe1, 0xe4,
+ 0xe3, 0xbe, 0x0b, 0x02, 0xe0, 0xed, 0x0f, 0x2f, 0x0f, 0xf4, 0xf7, 0xbd,
+ 0xda, 0xf0, 0x00, 0x93,
+ 0xc1, 0xc1, 0xf0, 0x0d, 0x0d, 0xe1, 0x05, 0xc0, 0xbf, 0xe1, 0xe0, 0xdf,
+ 0x0d, 0x0e, 0x5f, 0x1e,
+ 0xe0, 0xec, 0xd8, 0xee, 0x10, 0x46, 0x31, 0x10, 0xe2, 0x03, 0x00, 0x00,
+ 0x5c, 0x50, 0x21, 0x0f,
+ 0x0e, 0x13, 0x33, 0xfa, 0xbe, 0xe0, 0x02, 0x17, 0x50, 0x50, 0x2f, 0x2d,
+ 0x2f, 0x01, 0x10, 0x22,
+ 0x50, 0x30, 0x20, 0x10, 0x08, 0xfd, 0x2e, 0x30, 0x40, 0x17, 0x31, 0x00,
+ 0xe1, 0xe0, 0xd3, 0xf2,
+ 0xff, 0xfb, 0x4f, 0x60, 0x23, 0x1f, 0x2d, 0x2f, 0x3f, 0x40, 0x17, 0x32,
+ 0x1f, 0x0b, 0x8f, 0x9f,
+ 0x00, 0xd1, 0x02, 0xe2, 0x01, 0xce, 0x0e, 0x0f, 0xdf, 0xef, 0xde, 0x00,
+ 0xc7, 0xe0, 0xc2, 0x02,
+ 0x30, 0x3c, 0x3b, 0x40, 0x01, 0xe1, 0xa1, 0x00, 0x20, 0x30, 0x20, 0x23,
+ 0xf0, 0xde, 0xc9, 0xdf,
+ 0xce, 0xff, 0x00, 0x11, 0xfb, 0xcf, 0x00, 0xb5, 0x02, 0x10, 0x5f, 0x5c,
+ 0x00, 0x12, 0x11, 0x34,
+ 0x12, 0x21, 0x40, 0x1c, 0x0a, 0x0f, 0x20, 0x30, 0x00, 0x6f, 0x51, 0x35,
+ 0x01, 0x04, 0xf0, 0x0e,
+ 0xfd, 0x02, 0x07, 0x13, 0x2e, 0x5c, 0x00, 0x3f, 0x50, 0x23, 0x45, 0x00,
+ 0xf0, 0xe0, 0x0e, 0x11,
+ 0x30, 0x0e, 0xce, 0x07, 0xb3, 0xc1, 0xee, 0x0b, 0x00, 0x7f, 0x42, 0x06,
+ 0xd0, 0xfd, 0x0f, 0x0f,
+ 0x0e, 0x01, 0x33, 0x21, 0x00, 0xcc, 0xed, 0xdf, 0xe1, 0x05, 0xd0, 0xef,
+ 0xcf, 0xcf, 0xde, 0xe0,
+ 0xe1, 0xe0, 0x2d, 0x7f, 0x71, 0x02, 0x1e, 0xf8, 0xfc, 0x01, 0x05, 0x12,
+ 0x22, 0x41, 0x3f, 0x0e,
+ 0x00, 0x03, 0x33, 0x40, 0x3f, 0x41, 0x13, 0x03, 0xf0, 0x1e, 0x28, 0x3a,
+ 0x51, 0x50, 0x43, 0x42,
+ 0x20, 0x0e, 0x10, 0x40, 0x10, 0x30, 0x3f, 0x7c, 0x29, 0x1e, 0x0d, 0x0f,
+ 0x00, 0x04, 0x35, 0x40,
+ 0xf0, 0xdf, 0xe1, 0x02, 0x0f, 0x1d, 0x01, 0x24, 0x65, 0x22, 0x20, 0x30,
+ 0x5b, 0x1f, 0x1f, 0x20,
+ 0x00, 0xde, 0xae, 0xef, 0x01, 0x25, 0x2e, 0x0c, 0xf0, 0x82, 0xd2, 0xf5,
+ 0xe1, 0xfc, 0xed, 0xef,
+ 0x00, 0x02, 0xd2, 0xb1, 0xec, 0xee, 0x0f, 0x41, 0x07, 0x10, 0x01, 0xff,
+ 0x10, 0x60, 0x10, 0x2e,
+ 0x0f, 0x0d, 0xeb, 0xef, 0xf0, 0xc2, 0xdf, 0xcf, 0xe4, 0xa0, 0xde, 0xed,
+ 0x01, 0x30, 0x0d, 0x03,
+ 0xe7, 0xe7, 0x0e, 0x0e, 0x20, 0xf3, 0x93, 0xe2, 0xcd, 0xdb, 0xfe, 0x5d,
+ 0x50, 0x13, 0x04, 0xd2,
+ 0xd4, 0xf0, 0xdd, 0x0f, 0xf2, 0xc5, 0xd0, 0xe5, 0xc3, 0xad, 0xd9, 0x00,
+ 0x21, 0x51, 0x11, 0x41,
+ 0x00, 0xde, 0x0d, 0xf0, 0xf1, 0xd2, 0x04, 0x02, 0x03, 0x8c, 0xee, 0x01,
+ 0xe2, 0xe1, 0xf4, 0x05,
+ 0x60, 0x0e, 0xeb, 0xf1, 0xf1, 0xf0, 0x0f, 0x31, 0x20, 0xec, 0xcf, 0xf3,
+ 0xf3, 0xbb, 0xde, 0xd2,
+ 0xf2, 0xf3, 0x00, 0xdc, 0xc8, 0xff, 0x0e, 0x10, 0x0d, 0xd1, 0x00, 0x12,
+ 0x60, 0x34, 0xe0, 0xe0,
+ 0x7e, 0x50, 0x22, 0x24, 0x03, 0x10, 0x02, 0x00, 0x0e, 0x02, 0x47, 0x37,
+ 0x0f, 0x0c, 0x0f, 0x0f,
+ 0x0f, 0x43, 0x74, 0x32, 0x0f, 0x20, 0x53, 0x2f, 0x3a, 0x6f, 0x2f, 0x1f,
+ 0x00, 0x23, 0x43, 0x31,
+ 0x3a, 0x3f, 0x2f, 0x00, 0x01, 0x03, 0xf3, 0xdf, 0xee, 0x11, 0x75, 0x61,
+ 0x2f, 0x00, 0x03, 0x02,
+ 0x01, 0x4e, 0x2d, 0x2f, 0x30, 0x04, 0x00, 0x19, 0x2e, 0x1d, 0xfc, 0x0f,
+ 0x02, 0x07, 0xc0, 0xe0,
+ 0xee, 0xef, 0xcf, 0xd0, 0xf0, 0xab, 0xdc, 0xfc, 0x30, 0x30, 0x00, 0x45,
+ 0x10, 0x4f, 0xdd, 0x50,
+ 0x72, 0x33, 0x0e, 0xff, 0x10, 0x3f, 0x28, 0x50, 0x1f, 0x00, 0xde, 0xbe,
+ 0xde, 0xee, 0x00, 0x50,
+ 0x1f, 0x23, 0x07, 0xd4, 0xf0, 0x00, 0x00, 0x20, 0x11, 0x16, 0x10, 0x10,
+ 0x1f, 0x0f, 0xab, 0x00,
+ 0x23, 0x32, 0x62, 0x32, 0x20, 0x0f, 0xbf, 0xd0, 0xf1, 0xe1, 0x06, 0x12,
+ 0x0f, 0xee, 0x01, 0xe4,
+ 0xee, 0xed, 0x7f, 0x52, 0x03, 0xf2, 0x0f, 0xd9, 0xe0, 0xfd, 0xc2, 0xf7,
+ 0x03, 0xef, 0xe0, 0xe4,
+ 0x80, 0xdc, 0xe0, 0xe1, 0xf2, 0xd3, 0x06, 0x21, 0xfe, 0xbb, 0x00, 0xf0,
+ 0xed, 0xdf, 0x04, 0xd1,
+ 0x8e, 0xcd, 0xd1, 0xd0, 0xf3, 0x0f, 0xda, 0xcf, 0xce, 0xcc, 0xd0, 0xdd,
+ 0xde, 0xe0, 0xd6, 0xb0,
+ 0xef, 0xf0, 0xff, 0xeb, 0x10, 0x31, 0xe4, 0x90, 0xf3, 0xf6, 0xe0, 0x00,
+ 0xef, 0x1f, 0x10, 0xef,
+ 0xb0, 0xd5, 0xb0, 0xe1, 0x00, 0x10, 0x53, 0xf2, 0xc3, 0xe2, 0xd0, 0xf9,
+ 0xe0, 0x10, 0x63, 0x10,
+ 0x0c, 0x0f, 0x00, 0x1f, 0x0b, 0x10, 0x0f, 0xdd, 0xd0, 0xf1, 0xc4, 0xc0,
+ 0xdd, 0xf0, 0xe4, 0xc4,
+ 0xc3, 0x02, 0x0e, 0x0b, 0x21, 0xf7, 0xb1, 0xd1, 0xcd, 0xea, 0x00, 0x1f,
+ 0x30, 0xd1, 0xa2, 0xf1,
+ 0x00, 0x0e, 0x0c, 0x20, 0xc4, 0xa0, 0xbe, 0xdf, 0x00, 0xfd, 0xdd, 0xed,
+ 0xd2, 0xc3, 0xd2, 0xb1,
+ 0xeb, 0xee, 0xf0, 0x05, 0x40, 0x41, 0x01, 0x16, 0x00, 0xfc, 0xd0, 0x00,
+ 0x01, 0xe1, 0xd0, 0xec,
+ 0xcd, 0x9c, 0xdd, 0xbf, 0x05, 0x04, 0x20, 0x22, 0x00, 0xd0, 0xc2, 0xe1,
+ 0xff, 0x0d, 0xfd, 0xdc,
+ 0xfe, 0x54, 0x57, 0x00, 0x0b, 0x1e, 0x20, 0x52, 0x12, 0x13, 0x20, 0x1d,
+ 0x0d, 0xf2, 0xe4, 0x04,
+ 0xf0, 0x30, 0x5f, 0x2f, 0x00, 0x1e, 0x0d, 0x4e, 0x71, 0x33, 0x27, 0x25,
+ 0x10, 0x1d, 0x3f, 0x20,
+ 0x50, 0x00, 0x0f, 0x01, 0xf2, 0xb7, 0x04, 0xf1, 0x00, 0x3f, 0x3e, 0x71,
+ 0x10, 0x0f, 0x1d, 0x2c,
+ 0x10, 0x20, 0x02, 0x04, 0xf7, 0xc2, 0xff, 0x0d, 0x7b, 0x30, 0xff, 0xc0,
+ 0xf6, 0xd0, 0xd0, 0xfe,
+ 0xdd, 0xef, 0xcf, 0xef, 0xdd, 0x9f, 0xec, 0xd1, 0x26, 0x53, 0x43, 0x1f,
+ 0x00, 0x0e, 0xfe, 0xfe,
+ 0x00, 0x22, 0x01, 0x02, 0x02, 0x1e, 0x4b, 0x73, 0x17, 0x02, 0xe2, 0x12,
+ 0x01, 0x0c, 0x3c, 0x3f,
+ 0x71, 0x37, 0x32, 0x2d, 0x5c, 0x3f, 0x40, 0x40, 0x20, 0x11, 0x43, 0x10,
+ 0x38, 0x1f, 0x30, 0x11,
+ 0x20, 0x1e, 0x12, 0x32, 0x20, 0x30, 0x50, 0x50, 0x45, 0x01, 0x12, 0x2e,
+ 0x2a, 0x3f, 0x4f, 0x40,
+ 0x45, 0x20, 0x1f, 0x1f, 0x00, 0x0e, 0xe1, 0x07, 0x40, 0x40, 0x1e, 0x30,
+ 0xe0, 0xb2, 0x00, 0xcd,
+ 0x00, 0xff, 0x00, 0x1f, 0xfb, 0xcf, 0x00, 0x02, 0x43, 0x11, 0x31, 0x33,
+ 0x32, 0x51, 0x2e, 0x08,
+ 0x00, 0x01, 0xeb, 0xad, 0x00, 0x0f, 0x0e, 0x1b, 0xfe, 0xee, 0x10, 0x56,
+ 0x42, 0x43, 0xfe, 0xdd,
+ 0xf0, 0x03, 0x01, 0x0e, 0x1e, 0x42, 0x76, 0x32, 0x20, 0x20, 0x2e, 0x3a,
+ 0x30, 0x40, 0x11, 0x03,
+ 0x23, 0x45, 0x0e, 0x0d, 0x30, 0x6f, 0x40, 0x11, 0x02, 0xd0, 0x10, 0x7d,
+ 0x2d, 0x16, 0x15, 0x13,
+ 0x10, 0x1a, 0x2f, 0x40, 0x1f, 0xed, 0xdf, 0xd1, 0xa5, 0xe3, 0xd3, 0x0f,
+ 0x3d, 0x5c, 0x00, 0x01,
+ 0xf7, 0xe0, 0xee, 0x00, 0x43, 0x11, 0x10, 0x0f, 0x8c, 0xec, 0xe0, 0x01,
+ 0xf4, 0xe4, 0xd0, 0xff,
+ 0xfd, 0xfd, 0xc0, 0xc0, 0xe4, 0xce, 0xb8, 0xdf, 0xdf, 0xf0, 0x00, 0x30,
+ 0xe2, 0x81, 0xf1, 0xe3,
+ 0x00, 0x1f, 0x00, 0xf0, 0xf4, 0x06, 0x01, 0xf0, 0x0a, 0x2f, 0x01, 0x05,
+ 0x2e, 0x00, 0x16, 0x00,
+ 0x23, 0xe0, 0x9d, 0xc5, 0xd1, 0xdc, 0x8d, 0xc6, 0xa1, 0xd5, 0x05, 0xe8,
+ 0xcc, 0x0f, 0x00, 0x12,
+ 0x21, 0x70, 0x1e, 0x0c, 0xef, 0x61, 0x43, 0x20, 0xf9, 0x0f, 0x0e, 0xcf,
+ 0xdd, 0xdc, 0x00, 0xde,
+ 0x1e, 0x0e, 0x30, 0xd0, 0x8c, 0xe0, 0x00, 0xfa, 0x0f, 0x35, 0x32, 0x20,
+ 0x00, 0xcf, 0xe0, 0xc1,
+ 0x24, 0x03, 0xdf, 0x00, 0x00, 0x73, 0x43, 0xfe, 0xdb, 0x00, 0x22, 0x33,
+ 0x07, 0x06, 0xaf, 0xff,
+ 0xd1, 0xc1, 0xf0, 0xe0, 0x22, 0x61, 0x0e, 0x0f, 0x02, 0x65, 0x01, 0x41,
+ 0x14, 0x02, 0xf0, 0xf1,
+ 0xf5, 0xf1, 0x00, 0xe0, 0x10, 0x0f, 0x0e, 0x00, 0x00, 0x43, 0x0b, 0xeb,
+ 0xf0, 0x10, 0xe0, 0x8d,
+ 0xe5, 0xe3, 0xef, 0xfa, 0x30, 0x7e, 0x3f, 0x0f, 0x01, 0x30, 0x2b, 0x1c,
+ 0x0c, 0xef, 0xff, 0xd2,
+ 0xf2, 0x9e, 0x08, 0x0f, 0x10, 0x0e, 0xcf, 0xc0, 0xee, 0x00, 0x20, 0x1d,
+ 0x7d, 0x2e, 0x2c, 0x0c,
+ 0xee, 0x0b, 0x1f, 0x10, 0xef, 0xbd, 0xed, 0xfe, 0x0c, 0xfc, 0x0e, 0xf0,
+ 0xbf, 0xee, 0xf1, 0x43,
+ 0x3e, 0x18, 0x4f, 0x10, 0xc0, 0xe1, 0x00, 0x2c, 0x2e, 0x5e, 0x1f, 0x12,
+ 0xf6, 0xf2, 0xf0, 0xe0,
+ 0xd0, 0xf1, 0x90, 0xd1, 0xe2, 0xe3, 0x01, 0x0d, 0x0d, 0x1d, 0x3d, 0x6f,
+ 0x35, 0x53, 0xee, 0xb9,
+ 0x10, 0x30, 0x54, 0x30, 0x2e, 0x2f, 0x0d, 0xdc, 0xde, 0x0f, 0x2f, 0x0e,
+ 0x1d, 0x06, 0xb3, 0xbf,
+ 0xdd, 0xc0, 0xf0, 0x0e, 0x09, 0x40, 0x60, 0x02, 0x02, 0x12, 0x0f, 0xfb,
+ 0xe1, 0x15, 0x72, 0x00,
+ 0x1d, 0x0d, 0xeb, 0xcf, 0x0e, 0xe0, 0x04, 0x01, 0xf0, 0xf1, 0xf0, 0xc0,
+ 0xfd, 0xff, 0x02, 0x37,
+ 0x53, 0x01, 0x02, 0xe0, 0xd0, 0x01, 0x00, 0x62, 0x25, 0x37, 0xf1, 0xaf,
+ 0x01, 0xf5, 0x12, 0x41,
+ 0x03, 0xd1, 0xd2, 0xc6, 0xc1, 0xe2, 0xd0, 0x1f, 0x21, 0x32, 0x22, 0x34,
+ 0x56, 0x20, 0x40, 0x50,
+ 0x34, 0x02, 0xf5, 0xd0, 0xe0, 0x22, 0x20, 0x32, 0x72, 0x21, 0xd1, 0xd0,
+ 0x03, 0x1f, 0x2c, 0x1c,
+ 0x1d, 0x9e, 0xe0, 0xe2, 0xe4, 0x01, 0x1d, 0x2d, 0x0f, 0x2e, 0x28, 0xed,
+ 0xfd, 0x10, 0x30, 0x4f,
+ 0x00, 0x1e, 0x78, 0x6e, 0x0e, 0x2f, 0xde, 0xbf, 0xf0, 0x00, 0xe0, 0x0b,
+ 0xfd, 0x1e, 0x50, 0x14,
+ 0xef, 0xdb, 0x0e, 0x3e, 0x2e, 0x5e, 0x32, 0x05, 0xc0, 0xec, 0xef, 0xfe,
+ 0x0e, 0xcf, 0xfe, 0xe0,
+ 0x02, 0xf7, 0x01, 0x30, 0xde, 0xae, 0x00, 0x01, 0x65, 0x12, 0x00, 0xec,
+ 0x00, 0x20, 0x63, 0x26,
+ 0x21, 0xd1, 0xc1, 0xe3, 0xe2, 0x01, 0x24, 0x31, 0x01, 0xa2, 0x00, 0xe3,
+ 0x00, 0x0d, 0xf9, 0xf0,
+ 0x00, 0x03, 0x54, 0x00, 0xce, 0xce, 0x00, 0x0f, 0x51, 0x52, 0x30, 0x20,
+ 0x1e, 0x0b, 0xca, 0x0e,
+ 0xd0, 0x04, 0x02, 0xd0, 0xed, 0x00, 0x00, 0xce, 0xe3, 0x17, 0x67, 0x21,
+ 0x10, 0x21, 0x01, 0xe3,
+ 0x01, 0x63, 0x22, 0x12, 0x03, 0x03, 0x04, 0xc1, 0xd1, 0x02, 0x34, 0x42,
+ 0x01, 0xc3, 0xc7, 0xe1,
+ 0xe3, 0x02, 0x22, 0x01, 0xe3, 0x04, 0xe6, 0xa3, 0xf1, 0xe0, 0x1f, 0x70,
+ 0x73, 0x06, 0xd2, 0x02,
+ 0x01, 0x30, 0x43, 0x04, 0x03, 0xd4, 0xe3, 0xf2, 0xc1, 0xd1, 0xe1, 0xf0,
+ 0xe0, 0xe0, 0xe5, 0x14,
+ 0x53, 0x42, 0x21, 0x00, 0x02, 0x13, 0x36, 0xd1, 0x02, 0xe3, 0xd3, 0x23,
+ 0x71, 0x60, 0x1c, 0x0a,
+ 0x1f, 0x00, 0xc0, 0xf0, 0xf4, 0xf2, 0xf8, 0x0d, 0x0d, 0x10, 0x00, 0xb1,
+ 0xe0, 0xdd, 0xec, 0x0b,
+ 0x7e, 0x41, 0x32, 0x0f, 0xec, 0x1e, 0x29, 0x0f, 0x0f, 0x20, 0x0f, 0x20,
+ 0x01, 0x8e, 0xff, 0xfe,
+ 0xee, 0xfe, 0x0e, 0x2f, 0x40, 0x1d, 0x1e, 0x0c, 0x6c, 0x29, 0x2e, 0x0f,
+ 0xef, 0xbe, 0xee, 0xfc,
+ 0x0d, 0xfe, 0x20, 0x2f, 0x2d, 0x0b, 0xcf, 0xef, 0xaf, 0x0c, 0x0c, 0xfd,
+ 0x2d, 0xfd, 0x00, 0x30,
+ 0x0b, 0xb9, 0x0f, 0x30, 0x70, 0x11, 0x22, 0x20, 0xee, 0xaf, 0xf0, 0xd0,
+ 0xf1, 0xe0, 0x09, 0x0f,
+ 0x5f, 0x0f, 0xce, 0x0d, 0x02, 0x02, 0xe0, 0xfd, 0x0b, 0x0b, 0x3f, 0x3e,
+ 0x40, 0x6d, 0x2e, 0x2d,
+ 0x3f, 0x0f, 0xdf, 0xfd, 0x00, 0x5c, 0x08, 0xeb, 0x00, 0x13, 0xd0, 0xb0,
+ 0x01, 0x00, 0x1d, 0x5f,
+ 0x23, 0x07, 0xc5, 0x00, 0x40, 0x40, 0x3f, 0x22, 0x02, 0x03, 0xe4, 0xf0,
+ 0x00, 0x00, 0x41, 0x02,
+ 0xc2, 0xf6, 0xc1, 0xa1, 0xf0, 0xf4, 0x03, 0x33, 0x13, 0xe3, 0xc7, 0xe2,
+ 0xd1, 0xc1, 0x02, 0xe1,
+ 0x03, 0x02, 0x17, 0x72, 0x43, 0xf2, 0xe3, 0x03, 0x34, 0x13, 0x03, 0xd3,
+ 0xa2, 0xa3, 0xe5, 0xd6,
+ 0x02, 0x30, 0x10, 0x10, 0x42, 0xf2, 0xb1, 0x04, 0x07, 0x10, 0x01, 0x02,
+ 0x21, 0x03, 0x33, 0x61,
+ 0x02, 0x02, 0xf1, 0xe0, 0x12, 0x77, 0x12, 0x00, 0x00, 0x02, 0xcf, 0xfc,
+ 0x00, 0x12, 0x12, 0xf0,
+ 0xc2, 0x03, 0xf3, 0xf0, 0x00, 0x0d, 0x08, 0x4e, 0x7e, 0x10, 0x00, 0xf0,
+ 0x2f, 0x3c, 0x3e, 0xfe,
+ 0xcf, 0xe0, 0xf0, 0xc9, 0xde, 0x0e, 0x2f, 0x3e, 0x31, 0x73, 0x0e, 0x09,
+ 0xdd, 0xef, 0xff, 0x0c,
+ 0x0c, 0x0e, 0x7d, 0x3f, 0xde, 0x98, 0xfe, 0xff, 0x0f, 0x3f, 0x0e, 0x2f,
+ 0xfd, 0xbc, 0x0f, 0x0c,
+ 0xde, 0xfe, 0x0d, 0x4c, 0x3d, 0x1c, 0x0f, 0xf0, 0x00, 0x2b, 0x1e, 0x10,
+ 0x0f, 0xb0, 0xf2, 0x00,
+ 0x2b, 0x5c, 0x3f, 0x30, 0xe1, 0x80, 0xcb, 0x00, 0x2e, 0xfd, 0x0c, 0x0f,
+ 0x0f, 0xce, 0xfc, 0x0c,
+ 0x1e, 0x4e, 0x5d, 0x3d, 0x0c, 0x0e, 0x2e, 0x3c, 0x1b, 0x3c, 0x0d, 0x0f,
+ 0xfe, 0xb0, 0xee, 0xac,
+ 0xea, 0x0f, 0x00, 0x31, 0x00, 0xf0, 0xf0, 0x0a, 0x3f, 0x70, 0x20, 0x33,
+ 0x10, 0x2c, 0x1f, 0xc0,
+ 0xf0, 0xff, 0x00, 0x0b, 0xee, 0x0e, 0x5e, 0x10, 0xef, 0x80, 0xe6, 0x00,
+ 0x0e, 0x20, 0x10, 0xbd,
+ 0xbb, 0xf0, 0xf2, 0xf0, 0xf0, 0x2d, 0x3e, 0x4e, 0x3d, 0x0c, 0x31, 0x07,
+ 0xd2, 0x9f, 0x0f, 0xf3,
+ 0x05, 0x01, 0x00, 0xce, 0xf0, 0xe0, 0xf2, 0x00, 0x0e, 0x0e, 0x10, 0x46,
+ 0x23, 0x05, 0x02, 0xed,
+ 0x0f, 0x70, 0x41, 0x04, 0x05, 0x24, 0x32, 0x40, 0x2e, 0x20, 0x00, 0x01,
+ 0x33, 0x14, 0x80, 0xdc,
+ 0x01, 0xd3, 0xd1, 0xf2, 0x02, 0x34, 0x20, 0xd0, 0xbf, 0x02, 0x01, 0x5c,
+ 0x6f, 0x45, 0x12, 0x0b,
+ 0x0d, 0xed, 0xfc, 0xde, 0x10, 0x0f, 0x0c, 0x0d, 0xcb, 0xdd, 0xef, 0x0f,
+ 0x1e, 0x0a, 0x7f, 0x5e,
+ 0x1f, 0x0f, 0x0f, 0xca, 0xfd, 0x0c, 0x1e, 0x3d, 0x0e, 0xff, 0xfd, 0x0d,
+ 0xfc, 0x1e, 0x2f, 0xae,
+ 0xcc, 0xcd, 0xde, 0xdd, 0x0b, 0x5e, 0x1c, 0x0e, 0x0c, 0xdf, 0x00, 0x34,
+ 0x5e, 0x1b, 0x10, 0x10,
+ 0x03, 0xf0, 0x00, 0x60, 0x22, 0x00, 0xf2, 0x07, 0xd4, 0xa0, 0xfe, 0xe1,
+ 0xf2, 0xf0, 0xf0, 0x00,
+ 0xf2, 0x01, 0xe2, 0xf0, 0x03, 0x32, 0x57, 0x77, 0x21, 0x30, 0x3f, 0xf0,
+ 0xe1, 0x03, 0x34, 0x31,
+ 0x4f, 0x2f, 0xcf, 0xd1, 0xc6, 0xe1, 0xc3, 0xd1, 0xff, 0x0f, 0x00, 0x11,
+ 0x53, 0x37, 0x37, 0x20,
+ 0x00, 0x41, 0x61, 0x21, 0xf0, 0xf0, 0xe3, 0xc0, 0xd0, 0xd0, 0x14, 0x60,
+ 0x41, 0x44, 0x02, 0xd2,
+ 0xd2, 0xb2, 0xf2, 0xe5, 0xf3, 0x03, 0xf4, 0x02, 0x03, 0x00, 0x31, 0x23,
+ 0x23, 0x36, 0x44, 0x06,
+ 0xc2, 0xf2, 0x02, 0x03, 0x14, 0xd1, 0xb3, 0xe2, 0xe3, 0xe5, 0x03, 0xe2,
+ 0x91, 0xf1, 0xf3, 0xe4,
+ 0x46, 0x12, 0xb1, 0xd1, 0xf2, 0xd4, 0x05, 0x32, 0x73, 0x30, 0x33, 0x12,
+ 0x02, 0xf2, 0xf1, 0x11,
+ 0x73, 0x72, 0x34, 0x04, 0xf3, 0xe2, 0xd1, 0x03, 0xf1, 0xf4, 0x10, 0x02,
+ 0xc1, 0xf6, 0xf2, 0xf0,
+ 0x0f, 0x2d, 0x3d, 0x70, 0x17, 0x12, 0x00, 0x1c, 0x0e, 0xf0, 0xbd, 0xff,
+ 0xe0, 0x00, 0xf0, 0x2d,
+ 0x1c, 0x3e, 0x00, 0xa4, 0xd2, 0xde, 0x2e, 0x0f, 0xdc, 0x51, 0x6e, 0x18,
+ 0x0c, 0xff, 0xf0, 0x22,
+ 0x10, 0x1f, 0xe0, 0xe1, 0xf0, 0xcf, 0xfc, 0xff, 0x0e, 0xfd, 0x0d, 0x3d,
+ 0x1d, 0xf9, 0x8c, 0xc0,
+ 0xf0, 0xc1, 0xff, 0x4f, 0x40, 0x1f, 0xfe, 0xf5, 0x16, 0x50, 0x31, 0x20,
+ 0xfe, 0xdb, 0xe0, 0x02,
+ 0x03, 0xe2, 0x8f, 0xf9, 0xff, 0xff, 0xff, 0x01, 0x04, 0x0f, 0xbc, 0xde,
+ 0x1e, 0x7e, 0x3e, 0x1a,
+ 0x0f, 0x2e, 0x0f, 0x0f, 0x1d, 0x2c, 0xfb, 0x0d, 0x3e, 0x1d, 0xae, 0xcb,
+ 0xdf, 0xe0, 0xd0, 0x0d,
+ 0x5f, 0x20, 0x40, 0x0e, 0xcb, 0x0e, 0xee, 0x0d, 0x1a, 0x20, 0x1f, 0x00,
+ 0x7e, 0x4e, 0x1c, 0x1d,
+ 0x1e, 0x0c, 0x0f, 0x02, 0xf2, 0xa1, 0xf0, 0xe0, 0xbb, 0x0f, 0x00, 0x02,
+ 0x00, 0x0e, 0x2f, 0x0e,
+ 0x1f, 0x21, 0x67, 0x27, 0x1f, 0x0e, 0x00, 0xe2, 0xc2, 0xd2, 0xd1, 0xf3,
+ 0x23, 0x60, 0x20, 0x05,
+ 0xd2, 0xa1, 0x0d, 0xec, 0x10, 0x11, 0x25, 0x14, 0xd3, 0xc0, 0xf0, 0xe1,
+ 0x00, 0x22, 0x07, 0x12,
+ 0x14, 0x72, 0x30, 0x2d, 0x0e, 0x00, 0x30, 0x26, 0x32, 0xe1, 0x8e, 0xfe,
+ 0x00, 0xef, 0xd0, 0xe0,
+ 0xd3, 0x04, 0xff, 0x3a, 0x7f, 0x6e, 0x1f, 0xfd, 0xff, 0x00, 0x10, 0xf8,
+ 0xee, 0x1f, 0x0f, 0xdc,
+ 0x1d, 0x3e, 0x3f, 0xdd, 0xbf, 0x12, 0x31, 0x0b, 0xdc, 0xde, 0xff, 0xde,
+ 0x0f, 0x7e, 0x5c, 0x1c,
+ 0x3c, 0x0e, 0xfe, 0xdd, 0x0e, 0x00, 0x51, 0x1a, 0xdc, 0xde, 0xef, 0xf0,
+ 0xc0, 0xff, 0xfb, 0x0c,
+ 0x6d, 0x1e, 0x1c, 0x00, 0xdf, 0xfe, 0xfd, 0x2d, 0x0f, 0xbe, 0x2f, 0x70,
+ 0x6f, 0xfc, 0xec, 0xf3,
+ 0x05, 0x00, 0x0f, 0x2c, 0x00, 0xb0, 0xf0, 0xd5, 0xe4, 0xd0, 0xfe, 0x0e,
+ 0x62, 0x02, 0xfe, 0x0d,
+ 0xfd, 0xfc, 0xfd, 0x0f, 0x5f, 0x40, 0x54, 0x12, 0x1c, 0x0d, 0x0d, 0xc8,
+ 0x08, 0x00, 0xf0, 0xff,
+ 0x00, 0x42, 0x0d, 0x1e, 0x2e, 0x4f, 0x02, 0x02, 0xe1, 0xff, 0xbc, 0xe0,
+ 0xe2, 0x11, 0x5f, 0x2a,
+ 0x6f, 0x1d, 0x0e, 0xfe, 0xeb, 0x0f, 0x13, 0x33, 0x2e, 0x2e, 0x05, 0x81,
+ 0xdf, 0xee, 0xe0, 0xe1,
+ 0x1e, 0x4e, 0x21, 0x27, 0xd1, 0xf1, 0xff, 0x0f, 0x0f, 0x62, 0x17, 0xf4,
+ 0xf3, 0x00, 0xd1, 0x00,
+ 0xe0, 0xfe, 0xe3, 0xb4, 0xd1, 0xe1, 0x20, 0x0d, 0xfb, 0xc2, 0xe7, 0xd3,
+ 0x02, 0x02, 0xc0, 0xb2,
+ 0xf3, 0xf5, 0xe1, 0x44, 0x43, 0x02, 0xb1, 0x02, 0x76, 0x52, 0x10, 0x00,
+ 0x01, 0x03, 0x02, 0xf2,
+ 0x03, 0xf3, 0xd2, 0xf0, 0xf3, 0x05, 0x01, 0x01, 0x07, 0x74, 0x11, 0x0e,
+ 0x2c, 0x00, 0xf2, 0x00,
+ 0x22, 0x60, 0x2b, 0x2e, 0x0f, 0x0e, 0xe0, 0xb0, 0x00, 0x0f, 0x1e, 0xec,
+ 0xdd, 0xef, 0x0f, 0x40,
+ 0x52, 0x01, 0x04, 0xeb, 0xfc, 0x6c, 0x4d, 0x00, 0x00, 0xc0, 0x00, 0xdd,
+ 0x2d, 0x2d, 0x3e, 0x25,
+ 0xfe, 0x89, 0xdf, 0x01, 0x00, 0xda, 0xfe, 0xdb, 0x0f, 0xf0, 0x00, 0xef,
+ 0xa0, 0xde, 0x0d, 0x51,
+ 0x54, 0x11, 0x30, 0x00, 0x0f, 0x09, 0xee, 0xf0, 0x15, 0x01, 0xd1, 0xe1,
+ 0xf0, 0xf0, 0xc0, 0xd0,
+ 0x90, 0xde, 0x01, 0x17, 0x22, 0x00, 0x00, 0x00, 0x63, 0x20, 0x51, 0x22,
+ 0x20, 0x00, 0xc0, 0xcd,
+ 0x00, 0x02, 0xf0, 0x3e, 0x4a, 0x50, 0x00, 0xe2, 0xd0, 0x07, 0x07, 0x22,
+ 0x01, 0x00, 0xf5, 0xc2,
+ 0xd0, 0xc1, 0x11, 0x32, 0x60, 0x52, 0x27, 0x02, 0x01, 0x2f, 0x10, 0x0f,
+ 0xe2, 0xe4, 0xd2, 0xf1,
+ 0xe2, 0xf3, 0xf4, 0xe4, 0xb0, 0xcf, 0xf2, 0x05, 0x01, 0x00, 0xd0, 0x0f,
+ 0x40, 0x63, 0x27, 0x01,
+ 0xa0, 0xe1, 0x00, 0x33, 0x12, 0x04, 0x22, 0xf0, 0xbe, 0xf0, 0xf2, 0xf7,
+ 0xf3, 0xef, 0x0a, 0x00,
+ 0xf0, 0xc2, 0xe4, 0xd3, 0xa1, 0xf0, 0xd1, 0x02, 0x24, 0x42, 0x33, 0x75,
+ 0x32, 0x10, 0x31, 0x13,
+ 0x03, 0xf0, 0xe1, 0xd0, 0x05, 0xf2, 0xb0, 0xff, 0xe1, 0x24, 0xf0, 0x14,
+ 0x37, 0xa0, 0xe0, 0xe0,
+ 0x2d, 0x7f, 0x40, 0x0e, 0x00, 0x01, 0x00, 0xff, 0x1e, 0x60, 0x1b, 0x0e,
+ 0xdf, 0x00, 0x01, 0xe2,
+ 0x0d, 0xf9, 0x5f, 0x1d, 0xf9, 0x0f, 0x30, 0x00, 0xcd, 0xdb, 0x0d, 0x2e,
+ 0x7e, 0x4e, 0x1f, 0xdb,
+ 0xdc, 0x0e, 0x1e, 0x50, 0x0f, 0x0f, 0x0c, 0x0e, 0x0d, 0xb9, 0xde, 0xcd,
+ 0xee, 0xdd, 0x0f, 0x1e,
+ 0x3c, 0xfb, 0x0e, 0xf0, 0xce, 0x10, 0x7c, 0x4f, 0x0e, 0xdf, 0xf0, 0x31,
+ 0x33, 0x3e, 0x4b, 0x2e,
+ 0x0f, 0xe0, 0x81, 0xd0, 0xcc, 0xf0, 0x01, 0xf2, 0x15, 0x51, 0x00, 0x00,
+ 0x0f, 0x0c, 0x0f, 0x20,
+ 0x20, 0x33, 0x03, 0xe5, 0x0f, 0x0a, 0x0e, 0x0d, 0xed, 0x2f, 0x61, 0x42,
+ 0x23, 0xf3, 0xe0, 0xec,
+ 0xf1, 0x27, 0xd4, 0x80, 0xf0, 0xf2, 0x00, 0xf0, 0x51, 0x42, 0x30, 0x10,
+ 0x10, 0xfe, 0x01, 0x16,
+ 0x51, 0x31, 0x22, 0xd4, 0xa0, 0xf1, 0x06, 0x06, 0xd1, 0x00, 0x00, 0xf0,
+ 0xa0, 0xf0, 0xf2, 0xf6,
+ 0x02, 0x01, 0x12, 0x44, 0x12, 0x03, 0x15, 0xd2, 0xb2, 0xe2, 0xe1, 0x03,
+ 0xf5, 0x03, 0x43, 0x52,
+ 0xf3, 0xf3, 0x04, 0x22, 0x24, 0xa1, 0xd5, 0xd3, 0x93, 0xf3, 0xd4, 0xf2,
+ 0x03, 0x13, 0x34, 0x46,
+ 0x44, 0x13, 0x02, 0x01, 0x61, 0x12, 0x01, 0x11, 0x14, 0x03, 0xd2, 0xe0,
+ 0x03, 0x35, 0x02, 0xe1,
+ 0x02, 0xe5, 0xc2, 0xb3, 0x00, 0x12, 0x40, 0x1f, 0x20, 0x50, 0x0f, 0xf0,
+ 0x0e, 0x0d, 0xdb, 0xef,
+ 0xf0, 0x72, 0x20, 0x18, 0xee, 0xef, 0xae, 0xee, 0xfd, 0x01, 0x30, 0x0c,
+ 0xe9, 0x0f, 0x10, 0xff,
+ 0xab, 0x0d, 0x3f, 0x3d, 0x40, 0x00, 0x0e, 0xdd, 0x3d, 0x4b, 0x5d, 0x2d,
+ 0xfc, 0xaf, 0xce, 0x00,
+ 0xfc, 0xfd, 0x29, 0x2f, 0x3f, 0xfe, 0xcd, 0xfe, 0xde, 0xfc, 0xdf, 0x3f,
+ 0x72, 0x21, 0x3e, 0x4d,
+ 0x0c, 0xeb, 0xfc, 0x00, 0x52, 0x00, 0xcf, 0xfe, 0xce, 0xff, 0xeb, 0xf0,
+ 0x02, 0x01, 0x0d, 0x1f,
+ 0x40, 0x30, 0x21, 0x00, 0x0a, 0x0c, 0x0d, 0xab, 0x0e, 0x0e, 0x0c, 0x0d,
+ 0x7d, 0x4d, 0x1a, 0x0d,
+ 0x0e, 0xee, 0xec, 0xff, 0x30, 0x1e, 0xfe, 0x8b, 0xcf, 0xfe, 0xf0, 0x00,
+ 0x2d, 0x1a, 0x6f, 0x0e,
+ 0x3d, 0x1f, 0x10, 0x11, 0x0c, 0xdc, 0x0e, 0x0e, 0x1f, 0x1f, 0x1f, 0xbe,
+ 0xcc, 0xf0, 0x01, 0x20,
+ 0x0a, 0xdd, 0xec, 0xf0, 0x0f, 0x41, 0x72, 0x3f, 0x0b, 0xfe, 0x02, 0xf6,
+ 0xb0, 0xde, 0x01, 0x01,
+ 0x20, 0x3d, 0x7f, 0x40, 0xf2, 0xd4, 0x03, 0x00, 0xdb, 0xfd, 0xf0, 0xc0,
+ 0xe4, 0xf2, 0xd3, 0xff,
+ 0x0f, 0xd5, 0x03, 0x14, 0x74, 0x72, 0x03, 0x02, 0x03, 0xf4, 0xf1, 0x01,
+ 0x21, 0x34, 0x20, 0xfe,
+ 0xe0, 0xe2, 0xc2, 0x00, 0xd1, 0x07, 0x17, 0x42, 0x40, 0xd0, 0x9f, 0xe0,
+ 0xff, 0x20, 0x5f, 0x1a,
+ 0x3f, 0x00, 0xe1, 0x0f, 0x0c, 0x1e, 0x3e, 0xff, 0xe0, 0xc1, 0xc0, 0xfc,
+ 0x3d, 0x6d, 0x09, 0x1d,
+ 0xfc, 0xff, 0xf0, 0xee, 0x0e, 0xca, 0x0e, 0x7f, 0x60, 0x20, 0x0e, 0xe9,
+ 0xde, 0xfd, 0x00, 0x0f,
+ 0xf0, 0x10, 0x20, 0xfb, 0x0f, 0x0e, 0x2e, 0x4e, 0xdd, 0x9b, 0x0e, 0xee,
+ 0x0e, 0xef, 0x0f, 0x2e,
+ 0x1e, 0x4a, 0x3f, 0x20, 0x03, 0x20, 0x71, 0x34, 0x1e, 0xda, 0x9f, 0x00,
+ 0xe2, 0xd0, 0xe0, 0xfe,
+ 0xef, 0x00, 0x13, 0x42, 0x01, 0xc7, 0xf3, 0x14, 0x12, 0x00, 0xd0, 0x01,
+ 0x00, 0x00, 0xd0, 0x13,
+ 0x50, 0x2f, 0x7f, 0x5e, 0x2f, 0x10, 0xf2, 0xf6, 0xd2, 0x11, 0x00, 0xd5,
+ 0x04, 0x04, 0xe3, 0xa0,
+ 0xf1, 0x05, 0x74, 0x01, 0x2f, 0x30, 0x22, 0x17, 0x06, 0xf1, 0x50, 0x41,
+ 0x00, 0x00, 0x02, 0xf2,
+ 0xb3, 0xe1, 0x04, 0xf0, 0xd0, 0xe0, 0x04, 0x11, 0x45, 0x12, 0x05, 0x05,
+ 0x3b, 0x00, 0x3e, 0x00,
+ 0x3c, 0x45, 0x7c, 0x34, 0x73, 0x43, 0x79, 0x31, 0x20, 0x32, 0x77, 0x57,
+ 0x22, 0x21, 0x31, 0x31,
+ 0x53, 0x31, 0x33, 0x63, 0x25, 0x40, 0x23, 0x33, 0x13, 0x12, 0x04, 0x22,
+ 0x23, 0x25, 0x31, 0x12,
+ 0x12, 0xf3, 0xe6, 0xf3, 0x02, 0x43, 0x43, 0x45, 0x33, 0x14, 0x11, 0x10,
+ 0x43, 0x11, 0x32, 0x61,
+ 0x36, 0x12, 0xf2, 0xe1, 0x00, 0x13, 0x23, 0x03, 0xc2, 0xb7, 0xe3, 0xc1,
+ 0xf1, 0xf1, 0x00, 0x50,
+ 0x30, 0x32, 0x10, 0xf1, 0x01, 0xe1, 0x23, 0x04, 0x26, 0x72, 0x73, 0x3f,
+ 0xff, 0xe0, 0xf0, 0x03,
+ 0x02, 0xe1, 0x01, 0xc1, 0xf3, 0x06, 0x40, 0x3f, 0x1b, 0x00, 0x01, 0x00,
+ 0x36, 0x72, 0x32, 0x40,
+ 0x10, 0x1f, 0x3d, 0x30, 0x46, 0x00, 0x0e, 0x41, 0x10, 0x0a, 0xfe, 0xc0,
+ 0xf0, 0xcf, 0xfd, 0xdc,
+ 0x0e, 0x1e, 0x7e, 0x5e, 0x0b, 0x1e, 0x20, 0x11, 0x21, 0x0d, 0x19, 0x1e,
+ 0x0f, 0x0f, 0xfe, 0xef,
+ 0xef, 0xaa, 0xee, 0x0f, 0x11, 0x12, 0xce, 0xbe, 0x00, 0xd0, 0xca, 0xee,
+ 0xe0, 0xdc, 0xbd, 0xfd,
+ 0x0e, 0x0b, 0x0c, 0xfc, 0x1e, 0x2e, 0xde, 0xbe, 0xdf, 0xe0, 0x8e, 0xd8,
+ 0xee, 0xff, 0xef, 0xcd,
+ 0xd0, 0xd0, 0xdc, 0xbe, 0xfc, 0xef, 0xed, 0x00, 0x1e, 0x2e, 0x2d, 0x21,
+ 0xe2, 0xdf, 0xcc, 0xff,
+ 0x1d, 0x7d, 0x4d, 0x00, 0xcd, 0xf9, 0x01, 0x42, 0x0e, 0x3d, 0x30, 0x00,
+ 0xdd, 0xdb, 0x01, 0x00,
+ 0xcf, 0x0e, 0x44, 0x64, 0x14, 0x00, 0x00, 0x3c, 0x1b, 0x0d, 0x20, 0x76,
+ 0x44, 0x00, 0xec, 0x0e,
+ 0x00, 0xfe, 0xfe, 0x00, 0xf3, 0xc0, 0xde, 0xd0, 0xe0, 0xe5, 0xf0, 0xe2,
+ 0x00, 0xc6, 0x82, 0xf1,
+ 0xe2, 0xd0, 0xf0, 0x00, 0x25, 0x34, 0x02, 0x91, 0xd0, 0xd0, 0xe0, 0xd7,
+ 0xd4, 0xe3, 0xd0, 0xd0,
+ 0x02, 0xf2, 0x8f, 0xdf, 0xde, 0xdf, 0xd1, 0xa2, 0xf7, 0x02, 0x00, 0xfa,
+ 0x0f, 0xf0, 0xf0, 0xd2,
+ 0x01, 0xd0, 0xe1, 0xbe, 0xde, 0xe0, 0x00, 0xbd, 0xe9, 0xdf, 0xee, 0xdd,
+ 0x00, 0x5e, 0x0d, 0x0d,
+ 0xce, 0xfd, 0xfb, 0xef, 0x0c, 0x2b, 0x7d, 0x1c, 0x2d, 0x1e, 0x1c, 0xff,
+ 0xcc, 0x0c, 0x0f, 0x0c,
+ 0xae, 0xdb, 0xee, 0xef, 0xce, 0xfd, 0xfc, 0x0e, 0x3f, 0x1f, 0x4f, 0x10,
+ 0xfe, 0xcd, 0x0c, 0x4d,
+ 0xfd, 0xbb, 0xed, 0x00, 0xf3, 0xf0, 0x0b, 0xcd, 0xe0, 0xf2, 0xd4, 0xc2,
+ 0xc2, 0xb2, 0xd0, 0xb1,
+ 0xe1, 0xd1, 0xe0, 0xd9, 0x0f, 0x3f, 0xad, 0xdf, 0xee, 0xef, 0xec, 0x0e,
+ 0x70, 0x10, 0x19, 0x0e,
+ 0xbe, 0xee, 0xf2, 0xf2, 0xed, 0x08, 0xcf, 0xdf, 0xee, 0xd1, 0x00, 0xeb,
+ 0x0e, 0x70, 0x35, 0x00,
+ 0x00, 0xed, 0x00, 0x0d, 0x0f, 0x2f, 0x4e, 0x4f, 0x4e, 0x2c, 0x1d, 0x2c,
+ 0x09, 0x2e, 0x60, 0x34,
+ 0x00, 0xfe, 0x0e, 0xff, 0xee, 0xff, 0x20, 0x60, 0x04, 0x12, 0xf0, 0x0d,
+ 0x02, 0x65, 0x53, 0x20,
+ 0x20, 0x2d, 0x0f, 0x00, 0xdf, 0x1f, 0x00, 0xe3, 0xcf, 0x07, 0xf7, 0xd5,
+ 0xd0, 0x80, 0xe2, 0xd2,
+ 0xf4, 0xd3, 0xd4, 0xf4, 0x11, 0x52, 0x01, 0xf1, 0xe0, 0xe2, 0xf2, 0xe5,
+ 0x04, 0xf4, 0xd2, 0xe2,
+ 0x32, 0x52, 0xf2, 0xb2, 0xd2, 0xe6, 0x02, 0xb2, 0xf1, 0x01, 0x13, 0x20,
+ 0x20, 0x23, 0xd1, 0x9c,
+ 0x0e, 0x71, 0x21, 0x10, 0x00, 0x07, 0x03, 0x00, 0x10, 0x30, 0x1f, 0x09,
+ 0x0e, 0x4f, 0x10, 0x10,
+ 0xff, 0xda, 0x1e, 0x5e, 0x0e, 0x40, 0x51, 0x20, 0x2c, 0x6f, 0x40, 0x3d,
+ 0x1d, 0x3f, 0x1f, 0x1c,
+ 0x3d, 0x10, 0x38, 0xee, 0xee, 0xee, 0x00, 0x20, 0x3f, 0x0a, 0xbd, 0x0f,
+ 0x7f, 0x1e, 0x4f, 0x41,
+ 0x20, 0x0c, 0x00, 0x01, 0xe2, 0x20, 0x3e, 0x6c, 0x3e, 0x30, 0x33, 0x07,
+ 0x04, 0xf0, 0xf2, 0xd2,
+ 0x15, 0x12, 0x02, 0xd1, 0xd4, 0x93, 0xe3, 0x14, 0x75, 0x31, 0x10, 0x00,
+ 0x01, 0x21, 0x20, 0x20,
+ 0x50, 0x34, 0x33, 0x22, 0x03, 0xc1, 0x0f, 0xcf, 0xd0, 0xc3, 0xf2, 0xe7,
+ 0x03, 0xee, 0xfd, 0xc0,
+ 0x03, 0x41, 0x67, 0x25, 0x00, 0xd1, 0xf1, 0x04, 0x20, 0x40, 0x32, 0x20,
+ 0x0f, 0x10, 0x23, 0x25,
+ 0x02, 0x51, 0x3f, 0x4f, 0x33, 0x67, 0x16, 0x0f, 0xce, 0xef, 0xe0, 0xe2,
+ 0x05, 0x52, 0x43, 0x31,
+ 0x31, 0x52, 0x43, 0x20, 0x1f, 0x1e, 0x33, 0x16, 0x63, 0x20, 0x1f, 0x3f,
+ 0x1e, 0x10, 0x03, 0x17,
+ 0xe4, 0xd3, 0xd4, 0xc1, 0xf1, 0x12, 0x70, 0x33, 0x04, 0xd3, 0xf3, 0x06,
+ 0x42, 0x21, 0x22, 0x13,
+ 0xf4, 0xf3, 0x05, 0xf0, 0xc2, 0xd0, 0xd0, 0x01, 0x43, 0xb5, 0xb2, 0xd0,
+ 0xd2, 0xc0, 0xf1, 0x00,
+ 0x1f, 0x0f, 0xc0, 0xdd, 0xed, 0x30, 0x0e, 0xb8, 0xcd, 0xf5, 0xe3, 0xc0,
+ 0xff, 0x0f, 0xef, 0xb0,
+ 0xdc, 0xdd, 0x0e, 0xeb, 0xed, 0xdf, 0xbc, 0xac, 0xed, 0xde, 0xee, 0x00,
+ 0x1c, 0xfc, 0xee, 0x10,
+ 0x52, 0x20, 0x39, 0x3d, 0x3e, 0x0d, 0x1f, 0xa0, 0xdb, 0xbc, 0xee, 0x0d,
+ 0xfb, 0x0d, 0x2e, 0x10,
+ 0xbf, 0xfd, 0xde, 0x2e, 0x3d, 0x0c, 0xdb, 0x0f, 0x00, 0x00, 0xec, 0x0d,
+ 0x7f, 0x5f, 0x10, 0x30,
+ 0x00, 0x0c, 0xde, 0x00, 0x01, 0xe4, 0x02, 0x23, 0xf4, 0x80, 0x9c, 0xff,
+ 0xe1, 0xf5, 0xff, 0xee,
+ 0xef, 0x0f, 0x0f, 0x4a, 0x20, 0x30, 0xfb, 0xae, 0x00, 0x0f, 0xe0, 0xc0,
+ 0xcf, 0xed, 0xed, 0xdc,
+ 0xfc, 0xdb, 0xd0, 0xd0, 0xe3, 0xdd, 0xcd, 0x00, 0x16, 0x31, 0x31, 0x00,
+ 0xdb, 0x9f, 0x00, 0x21,
+ 0x51, 0x31, 0x64, 0x23, 0x30, 0x40, 0x20, 0x30, 0x3b, 0x10, 0x23, 0x37,
+ 0x01, 0xe0, 0x32, 0x5f,
+ 0x30, 0x41, 0x47, 0x12, 0x13, 0x23, 0x25, 0x74, 0x53, 0x20, 0x41, 0x21,
+ 0x33, 0x22, 0x21, 0x31,
+ 0x10, 0x40, 0x25, 0x13, 0x35, 0x02, 0x25, 0x32, 0x21, 0x02, 0x30, 0x43,
+ 0x33, 0x13, 0x64, 0x23,
+ 0x23, 0x12, 0x22, 0x11, 0x57, 0x22, 0x24, 0x31, 0x44, 0x22, 0xf2, 0xe0,
+ 0xf2, 0xe5, 0xd1, 0xd3,
+ 0xf1, 0xe1, 0x92, 0xf2, 0xe2, 0x00, 0x22, 0x42, 0x14, 0x05, 0xb1, 0xe0,
+ 0xf0, 0x2f, 0x50, 0x00,
+ 0x4d, 0x17, 0x12, 0xa0, 0x00, 0x02, 0x00, 0xfb, 0xef, 0x10, 0x02, 0xb0,
+ 0xbc, 0xde, 0xdd, 0xed,
+ 0xf0, 0x30, 0x4e, 0x1c, 0x0e, 0xe0, 0x01, 0x1f, 0x1a, 0x3e, 0x3e, 0xdd,
+ 0x8a, 0xde, 0xff, 0xeb,
+ 0xfe, 0xff, 0x0e, 0x10, 0xe0, 0x8a, 0x0e, 0xee, 0x0d, 0xdc, 0x0d, 0x3d,
+ 0x1f, 0xdd, 0xca, 0x1e,
+ 0x1e, 0x0c, 0x1d, 0x3b, 0x1f, 0xbf, 0xdc, 0x0f, 0x60, 0x10, 0xef, 0xbe,
+ 0xff, 0xbd, 0xde, 0xce,
+ 0xe0, 0xce, 0xd8, 0xdf, 0x0e, 0x1e, 0x0d, 0xfd, 0xdd, 0xbd, 0xf9, 0xef,
+ 0x0f, 0xef, 0xbe, 0xde,
+ 0xeb, 0xdf, 0xcd, 0xbc, 0xee, 0xbc, 0xec, 0xef, 0xdf, 0x00, 0xe0, 0xeb,
+ 0xee, 0xed, 0xc0, 0xb0,
+ 0xf0, 0xdf, 0xdf, 0xec, 0x0d, 0x4d, 0x1e, 0x10, 0x0d, 0xcc, 0xfe, 0xff,
+ 0x0c, 0x20, 0x1d, 0xd9,
+ 0xbf, 0x0e, 0x20, 0x0e, 0xcc, 0xee, 0xcf, 0x01, 0x15, 0x01, 0x12, 0x32,
+ 0x10, 0x20, 0x5d, 0x3d,
+ 0x3d, 0x50, 0x52, 0x4f, 0x08, 0x0c, 0xee, 0x1d, 0x20, 0x0d, 0x0f, 0x43,
+ 0x15, 0xf1, 0x9f, 0xee,
+ 0xcf, 0xef, 0x02, 0x07, 0x01, 0xb0, 0xef, 0x00, 0xe0, 0x00, 0x00, 0x27,
+ 0x24, 0x04, 0xb1, 0xc2,
+ 0xf0, 0xd3, 0xe0, 0xd1, 0xc1, 0xf4, 0xd5, 0x91, 0xe0, 0xe0, 0xc1, 0xe0,
+ 0x02, 0x07, 0x02, 0xa0,
+ 0xd0, 0xe0, 0xef, 0xd0, 0x02, 0x02, 0x10, 0x0c, 0xe0, 0xf1, 0xf7, 0xd1,
+ 0xdf, 0xcd, 0xa0, 0xde,
+ 0xbd, 0xff, 0xee, 0xeb, 0xdb, 0x0f, 0x5f, 0x2f, 0x0f, 0x1d, 0x2e, 0x2d,
+ 0x2d, 0x4f, 0x2a, 0x1c,
+ 0x0f, 0x3e, 0x1d, 0x1c, 0x2c, 0x0c, 0x1d, 0x3d, 0x3d, 0x5d, 0x50, 0x2e,
+ 0x09, 0x0e, 0x3d, 0x2d,
+ 0x3e, 0x5d, 0x0d, 0xfc, 0xcc, 0xfd, 0x0c, 0x7d, 0x7e, 0x2e, 0x1d, 0x1d,
+ 0x10, 0x20, 0x0d, 0x1b,
+ 0x00, 0xd3, 0xd0, 0xe3, 0x06, 0xe0, 0xdd, 0xdd, 0x02, 0x33, 0x01, 0xd6,
+ 0xe4, 0x23, 0x70, 0x71,
+ 0x74, 0x10, 0xf0, 0x01, 0xe5, 0x01, 0xf0, 0xe0, 0x02, 0x12, 0x22, 0x31,
+ 0xe3, 0xc2, 0xe7, 0x12,
+ 0xe0, 0xae, 0x04, 0x05, 0x02, 0x23, 0x61, 0x11, 0x00, 0x21, 0x36, 0x52,
+ 0x24, 0x42, 0x32, 0x22,
+ 0x32, 0x22, 0x21, 0x30, 0x5e, 0x2e, 0x44, 0x27, 0x21, 0x1f, 0x20, 0x24,
+ 0x12, 0x33, 0x76, 0x42,
+ 0x31, 0x01, 0x22, 0x53, 0x10, 0x40, 0x32, 0x34, 0x42, 0x14, 0x33, 0x11,
+ 0x20, 0x10, 0x40, 0x27,
+ 0x44, 0x12, 0x13, 0x14, 0x02, 0xd0, 0x02, 0x42, 0x54, 0x02, 0x45, 0x02,
+ 0xe1, 0x02, 0x12, 0x14,
+ 0x44, 0x34, 0x13, 0x04, 0x01, 0x04, 0x22, 0x02, 0x32, 0x44, 0x11, 0x12,
+ 0x12, 0x43, 0x13, 0x22,
+ 0x03, 0x33, 0x27, 0x24, 0x61, 0x33, 0x30, 0x02, 0x00, 0x71, 0x73, 0x73,
+ 0x04, 0x03, 0x14, 0x00,
+ 0x02, 0x05, 0x00, 0xff, 0x00, 0x02, 0x01, 0x01, 0xf0, 0x1f, 0x41, 0x31,
+ 0x1f, 0x2e, 0x24, 0x03,
+ 0x3f, 0x6f, 0x53, 0x20, 0x3d, 0x30, 0x46, 0x00, 0x2b, 0x0c, 0x2d, 0x0b,
+ 0x20, 0x52, 0x11, 0x1f,
+ 0x1b, 0x0e, 0x1e, 0x4f, 0x1f, 0xfd, 0xcb, 0xed, 0x0d, 0x1f, 0x7f, 0x78,
+ 0x3e, 0x0b, 0xef, 0x0f,
+ 0x00, 0x0f, 0x00, 0xfe, 0x1f, 0x2f, 0x11, 0xe0, 0xb0, 0xdf, 0xcf, 0xdc,
+ 0xd0, 0xf0, 0xff, 0x3d,
+ 0x60, 0x00, 0x1a, 0x11, 0x00, 0xbb, 0xef, 0x00, 0x11, 0x00, 0x0d, 0x08,
+ 0xde, 0xae, 0xcb, 0xff,
+ 0xef, 0xed, 0xbe, 0xdd, 0xde, 0xcd, 0xb9, 0xef, 0xec, 0xdf, 0xee, 0xf0,
+ 0xcd, 0xf0, 0xde, 0xcd,
+ 0xdb, 0x00, 0x21, 0x31, 0x0f, 0x0c, 0xcd, 0xcd, 0xcb, 0xfd, 0x0e, 0x1d,
+ 0x0e, 0xc0, 0xd1, 0xc0,
+ 0xbb, 0xed, 0xfe, 0x02, 0x03, 0x00, 0x0f, 0xc1, 0xfe, 0xe8, 0x1f, 0x70,
+ 0x50, 0x1d, 0x22, 0x12,
+ 0x08, 0xfd, 0x00, 0x1f, 0x30, 0xf0, 0x0e, 0xf1, 0xf2, 0xf2, 0xef, 0xcb,
+ 0xe0, 0xe0, 0xe0, 0x10,
+ 0x51, 0x32, 0x1d, 0x0c, 0xef, 0xe6, 0x17, 0x32, 0x22, 0x81, 0xc0, 0xd2,
+ 0x14, 0x31, 0xd1, 0x20,
+ 0x44, 0x13, 0x05, 0xd2, 0xc0, 0xb0, 0xd2, 0x90, 0xf0, 0xf3, 0xe4, 0xef,
+ 0x00, 0x25, 0x32, 0x01,
+ 0x10, 0x32, 0x01, 0xb0, 0xbf, 0x0f, 0xde, 0x0e, 0xec, 0xdd, 0xa0, 0xd0,
+ 0xef, 0xee, 0xdb, 0xba,
+ 0xde, 0xcd, 0xe0, 0xf5, 0xed, 0xe9, 0x00, 0x10, 0x0d, 0xee, 0xee, 0xaf,
+ 0xee, 0xfd, 0x1e, 0x5b,
+ 0x0d, 0x0b, 0xfe, 0xdd, 0xbe, 0xcd, 0xe0, 0xdf, 0x0f, 0xfc, 0xdc, 0xed,
+ 0xfd, 0x1b, 0xfb, 0xee,
+ 0xbc, 0x0e, 0x0e, 0x5f, 0x72, 0x2f, 0x0c, 0x0e, 0x0e, 0xfe, 0xef, 0x00,
+ 0xd3, 0xe0, 0xbc, 0xf0,
+ 0xd2, 0xe0, 0xcc, 0xfe, 0xe0, 0xd4, 0x01, 0x32, 0x06, 0xb0, 0xbe, 0xf8,
+ 0x0f, 0x20, 0x20, 0x0e,
+ 0xfe, 0xed, 0xbd, 0x90, 0x0e, 0xff, 0xff, 0xfe, 0xf8, 0xc8, 0xdf, 0xb0,
+ 0xe2, 0xed, 0xd9, 0xff,
+ 0xd0, 0xe5, 0xd0, 0xcc, 0xd0, 0xc0, 0xd5, 0x0f, 0x7e, 0x6f, 0x00, 0x03,
+ 0xbf, 0x0c, 0x50, 0x01,
+ 0xf3, 0xde, 0x0b, 0x00, 0x22, 0x32, 0x0e, 0xca, 0xc0, 0x02, 0x13, 0x2f,
+ 0x0e, 0xff, 0xf0, 0x42,
+ 0x4f, 0xde, 0xf1, 0x26, 0x7f, 0x0d, 0xe0, 0xf4, 0x30, 0x7e, 0x0d, 0xe3,
+ 0xe7, 0x22, 0x2f, 0x0e,
+ 0xcd, 0xff, 0x21, 0x56, 0x01, 0xdd, 0xee, 0x21, 0x43, 0x01, 0xc1, 0x0f,
+ 0x4e, 0x20, 0xf7, 0xb4,
+ 0x00, 0x2d, 0x20, 0x01, 0xd4, 0x02, 0x10, 0x4f, 0xff, 0xd1, 0x11, 0x00,
+ 0xdf, 0x80, 0xd1, 0xf4,
+ 0x34, 0x4f, 0x0d, 0xf3, 0x05, 0x70, 0x20, 0x00, 0xb3, 0x0e, 0x1c, 0x0f,
+ 0x14, 0xf7, 0xf1, 0x0c,
+ 0xee, 0xf0, 0xf0, 0x05, 0x70, 0x10, 0xfe, 0x0f, 0x00, 0x10, 0x02, 0xf1,
+ 0xf0, 0x10, 0x50, 0x0e,
+ 0xef, 0xe1, 0x03, 0x4b, 0x09, 0xf0, 0xe0, 0x02, 0x00, 0xfb, 0x11, 0x43,
+ 0x01, 0xed, 0x1c, 0x7f,
+ 0x01, 0xd3, 0xf5, 0x0d, 0x2b, 0x70, 0xf1, 0xd4, 0xe0, 0x0d, 0x3e, 0x50,
+ 0x14, 0x02, 0x00, 0x0f,
+ 0x0c, 0xee, 0x0f, 0x31, 0xe2, 0xc2, 0xf0, 0x0d, 0x6c, 0x60, 0x02, 0xe3,
+ 0xc6, 0x00, 0x30, 0x2f,
+ 0x2f, 0xe2, 0xf1, 0x02, 0x11, 0xe1, 0xa3, 0xf0, 0x0b, 0x00, 0x31, 0x13,
+ 0x46, 0x30, 0x1f, 0x0c,
+ 0xb3, 0xf7, 0x11, 0x00, 0x0e, 0x11, 0x12, 0x0d, 0x8d, 0xe2, 0x07, 0x03,
+ 0x2e, 0x1c, 0x00, 0xc0,
+ 0x20, 0x3d, 0x40, 0x04, 0x07, 0xf0, 0x0c, 0x0d, 0x11, 0x13, 0x34, 0x40,
+ 0x2b, 0x1f, 0x10, 0xb2,
+ 0xd2, 0x01, 0x2e, 0x7c, 0x20, 0x02, 0xd0, 0xdf, 0x21, 0x21, 0x3d, 0x4d,
+ 0x7f, 0x32, 0xf3, 0xa2,
+ 0x0e, 0x0e, 0x06, 0x02, 0xf2, 0xf2, 0x12, 0x7d, 0x0c, 0xff, 0xed, 0x02,
+ 0x07, 0x16, 0x10, 0xfe,
+ 0x0d, 0x40, 0xf2, 0xd4, 0xd5, 0x00, 0x0f, 0x1d, 0x10, 0x54, 0x12, 0x01,
+ 0xc0, 0xe0, 0x00, 0xc0,
+ 0xd0, 0xd1, 0xf4, 0x01, 0x4e, 0x6f, 0x00, 0xd3, 0xe5, 0x13, 0x41, 0x31,
+ 0x23, 0x05, 0xef, 0xbb,
+ 0xf0, 0xf1, 0x06, 0x20, 0x10, 0x0b, 0xa0, 0xf0, 0x00, 0x32, 0x5f, 0x0c,
+ 0xe0, 0xf2, 0xd2, 0x00,
+ 0x0d, 0x2f, 0x1e, 0x0e, 0x1d, 0x30, 0x04, 0xc0, 0xdd, 0x5b, 0x7d, 0x3f,
+ 0x00, 0xbf, 0x0e, 0x0e,
+ 0x01, 0x0d, 0xe8, 0x0f, 0x4f, 0x2f, 0x0e, 0xdc, 0xdd, 0xfd, 0xef, 0xc1,
+ 0xf7, 0x31, 0x7d, 0x2c,
+ 0xf0, 0xd0, 0xf1, 0xf0, 0x00, 0xe0, 0x0f, 0x2b, 0x50, 0x22, 0x01, 0xd2,
+ 0xd2, 0xee, 0xad, 0xe1,
+ 0xf6, 0x12, 0x6f, 0x3d, 0x02, 0xf6, 0x91, 0x01, 0xff, 0xe0, 0x04, 0x15,
+ 0x10, 0x0e, 0x0c, 0xe0,
+ 0x00, 0x26, 0x31, 0x10, 0x0f, 0xde, 0xf1, 0x14, 0x40, 0x21, 0xf0, 0xb1,
+ 0xf0, 0x00, 0xe0, 0xe1,
+ 0x01, 0x7f, 0x7c, 0x2f, 0x00, 0xd0, 0xe5, 0x13, 0x20, 0x1a, 0x0f, 0x30,
+ 0x20, 0xfe, 0xc1, 0xf3,
+ 0x00, 0x4a, 0x5f, 0x30, 0x23, 0x02, 0xfe, 0xfd, 0x00, 0xf0, 0xd4, 0x20,
+ 0x60, 0x4e, 0x3a, 0x2f,
+ 0x1c, 0xf0, 0xc3, 0x05, 0xf0, 0x0e, 0x4c, 0x30, 0x13, 0x06, 0xb0, 0x00,
+ 0x20, 0xe0, 0xe0, 0x00,
+ 0x13, 0x7e, 0x30, 0x23, 0x07, 0xc0, 0xdd, 0xf0, 0xf2, 0x25, 0x72, 0x40,
+ 0x1e, 0xee, 0xd3, 0xf6,
+ 0x03, 0x02, 0x10, 0xe0, 0xce, 0xd1, 0xd3, 0xe2, 0x02, 0x40, 0x61, 0x12,
+ 0xe2, 0xb5, 0x04, 0x22,
+ 0x70, 0x10, 0x07, 0xf4, 0xe1, 0xf0, 0x00, 0x0f, 0x10, 0x3f, 0x1f, 0x10,
+ 0xd2, 0xf0, 0x0c, 0x3d,
+ 0x3d, 0xe0, 0xf3, 0x05, 0x50, 0x1a, 0x00, 0x8e, 0xf0, 0xef, 0x00, 0x50,
+ 0x3f, 0x28, 0x0f, 0xee,
+ 0xb0, 0x03, 0x03, 0x00, 0x48, 0x0f, 0x00, 0xf0, 0xe0, 0x0f, 0xfc, 0x00,
+ 0x00, 0xe0, 0xde, 0x0f,
+ 0x7e, 0x2f, 0x00, 0xe5, 0xcf, 0xdc, 0xd0, 0x00, 0x50, 0x51, 0x20, 0xee,
+ 0xcc, 0x00, 0xf0, 0x03,
+ 0x14, 0xf0, 0x0f, 0x0b, 0x2e, 0xf0, 0xf3, 0x03, 0x02, 0x0f, 0xae, 0xe3,
+ 0xb2, 0xf0, 0xfd, 0x02,
+ 0x02, 0xd0, 0xef, 0xec, 0xce, 0xee, 0xf0, 0x5d, 0x4a, 0x11, 0x17, 0xe7,
+ 0xd1, 0xff, 0xcf, 0xe0,
+ 0xd0, 0x00, 0x2f, 0x00, 0xf2, 0xb0, 0xfe, 0x08, 0x0d, 0x30, 0x23, 0x6f,
+ 0x2c, 0xfb, 0x8f, 0x00,
+ 0xe0, 0xf2, 0x1e, 0x2a, 0x3f, 0x30, 0x0f, 0xde, 0xcf, 0xde, 0x02, 0x04,
+ 0x0f, 0x4a, 0x4f, 0x2f,
+ 0x01, 0xf3, 0x2e, 0xec, 0xad, 0x0f, 0xdf, 0x30, 0x30, 0x1f, 0x2b, 0xde,
+ 0xaf, 0xe0, 0xe6, 0xc2,
+ 0x0f, 0x5d, 0x3d, 0x20, 0xb5, 0xe0, 0xe2, 0x00, 0x1e, 0x01, 0x00, 0x00,
+ 0xed, 0x00, 0xab, 0x01,
+ 0x4e, 0xd6, 0x72, 0xf3, 0x15, 0xdc, 0x30, 0xef, 0xc3, 0xe4, 0x35, 0x72,
+ 0x71, 0x33, 0x14, 0x04,
+ 0xf3, 0xe2, 0xf1, 0x02, 0xf2, 0xe4, 0xb3, 0xb0, 0xd0, 0xd1, 0xd0, 0xfe,
+ 0x0c, 0x1e, 0x10, 0x22,
+ 0x52, 0x3f, 0x3d, 0x11, 0x17, 0x07, 0x22, 0x50, 0x3f, 0x1e, 0x00, 0xc0,
+ 0xdd, 0xec, 0x2b, 0x7d,
+ 0x3d, 0x2b, 0x0e, 0xed, 0xff, 0xf0, 0xfe, 0x0c, 0xec, 0xed, 0xed, 0x2d,
+ 0x7c, 0x4e, 0x2d, 0x0c,
+ 0x0d, 0x1d, 0x3f, 0x70, 0x30, 0x30, 0x3f, 0x0d, 0x00, 0x00, 0x0e, 0x1d,
+ 0x2d, 0x2d, 0x0e, 0xdc,
+ 0xcc, 0xef, 0xf3, 0xe7, 0xd1, 0xc2, 0xd1, 0xe1, 0xf1, 0x14, 0x74, 0x24,
+ 0x05, 0xb3, 0xd3, 0xc2,
+ 0xe3, 0xe4, 0x04, 0x13, 0x33, 0x33, 0x35, 0x13, 0xf4, 0xd3, 0xe2, 0xd2,
+ 0x03, 0xd7, 0x83, 0xa1,
+ 0xd0, 0xa1, 0xe0, 0xc1, 0xf2, 0xf0, 0x0f, 0x0e, 0x0e, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x21, 0x32, 0x40,
+ 0x1d, 0x0c, 0xee, 0xc1, 0xf7, 0xe3, 0xf0, 0xfc, 0x1d, 0x4a, 0x4e, 0x2d,
+ 0x0f, 0x0f, 0x0c, 0x2c,
+ 0x5e, 0x4f, 0x30, 0x3e, 0x5e, 0x3c, 0x3d, 0x0c, 0x0d, 0xff, 0x00, 0x10,
+ 0x61, 0x40, 0x40, 0x10,
+ 0x06, 0x03, 0x11, 0x30, 0x60, 0x3f, 0x30, 0x20, 0x11, 0x10, 0x21, 0x26,
+ 0x11, 0x01, 0x01, 0x07,
+ 0x03, 0x52, 0x51, 0x32, 0x15, 0xf5, 0xb4, 0xd2, 0xc1, 0xe1, 0x01, 0x03,
+ 0x07, 0xe2, 0xf1, 0x11,
+ 0x41, 0x32, 0x23, 0x13, 0x13, 0x12, 0x23, 0x13, 0xe3, 0x82, 0x83, 0xd2,
+ 0xd0, 0xee, 0xe9, 0xfc,
+ 0xed, 0xdb, 0xde, 0xff, 0x00, 0x3e, 0x2d, 0x4e, 0x2f, 0x21, 0x06, 0x03,
+ 0xf3, 0xf1, 0xd0, 0xb0,
+ 0xe0, 0xef, 0x3c, 0x5c, 0x2d, 0x0b, 0xcd, 0xdd, 0xde, 0xee, 0x0e, 0x0d,
+ 0x39, 0x0e, 0xdd, 0xcc,
+ 0xdd, 0x0d, 0x6d, 0x4f, 0x1e, 0x1c, 0x3d, 0x6d, 0x3f, 0x21, 0x22, 0x31,
+ 0x3e, 0x3d, 0x4f, 0x3f,
+ 0x3d, 0x4a, 0x4d, 0x1f, 0x00, 0xc2, 0xdd, 0xd9, 0xfd, 0x0e, 0x4f, 0x30,
+ 0x20, 0x0e, 0xee, 0xbf,
+ 0xd0, 0x90, 0xe2, 0xd4, 0xf1, 0xf1, 0xe5, 0xc5, 0xc2, 0xe1, 0xf3, 0x26,
+ 0x52, 0x23, 0x11, 0x12,
+ 0x12, 0x16, 0x05, 0xb3, 0xb1, 0xd1, 0xd0, 0xdf, 0xdf, 0xde, 0xb0, 0xee,
+ 0xee, 0x0b, 0x0d, 0x2b,
+ 0x2d, 0x3e, 0x1f, 0x00, 0xf0, 0xff, 0xd1, 0xc2, 0xd2, 0xf0, 0x20, 0x5e,
+ 0x1c, 0x1c, 0xfb, 0xcc,
+ 0xde, 0xcf, 0x00, 0x3f, 0x7b, 0x2e, 0x1e, 0x0f, 0xff, 0x0f, 0x4c, 0x5e,
+ 0x2f, 0x1f, 0x10, 0x1c,
+ 0x3e, 0x50, 0x36, 0x25, 0x02, 0x01, 0xf0, 0x10, 0x60, 0x40, 0x31, 0x12,
+ 0x00, 0xfd, 0xfe, 0x0e,
+ 0x2f, 0x1e, 0x40, 0x40, 0x61, 0x20, 0x14, 0x16, 0x03, 0xf3, 0xe7, 0xe3,
+ 0xd2, 0xd1, 0xd1, 0xa2,
+ 0xd5, 0xa5, 0xe3, 0xf1, 0x02, 0x41, 0x22, 0x13, 0x15, 0x14, 0x13, 0x03,
+ 0x03, 0xe1, 0xb2, 0xc3,
+ 0xc4, 0xd1, 0xc0, 0xd0, 0xc0, 0xd0, 0xef, 0xfb, 0x0d, 0x2d, 0x41, 0x26,
+ 0x12, 0x00, 0x02, 0x03,
+ 0x07, 0x22, 0x32, 0x60, 0x11, 0x11, 0x10, 0x1f, 0x1c, 0x2d, 0x0f, 0x0f,
+ 0xfd, 0xfb, 0x0c, 0x3d,
+ 0x4d, 0x1e, 0x0e, 0xdc, 0xda, 0xed, 0x1c, 0x7d, 0x5e, 0x1f, 0x0f, 0x0e,
+ 0x4d, 0x4f, 0x10, 0x00,
+ 0x20, 0x5f, 0x5d, 0x4f, 0x20, 0x0f, 0x0b, 0x00, 0xef, 0xfc, 0x0e, 0x1a,
+ 0x3d, 0x2c, 0x0d, 0xed,
+ 0xff, 0x10, 0x2f, 0x1d, 0x0d, 0xec, 0xdd, 0x9e, 0xb1, 0xc5, 0xb0, 0xd0,
+ 0xe0, 0xf0, 0x00, 0x34,
+ 0x25, 0x13, 0x05, 0x02, 0x04, 0x13, 0x11, 0xf3, 0xb7, 0xb3, 0xd3, 0xc1,
+ 0xc2, 0xd1, 0xb3, 0xe3,
+ 0xe2, 0x00, 0x10, 0x2f, 0x0f, 0x00, 0xe0, 0xd0, 0xd0, 0x06, 0x25, 0x12,
+ 0xf1, 0xb1, 0xf0, 0x01,
+ 0x51, 0x20, 0x00, 0x0b, 0x0c, 0x1c, 0x4e, 0x5e, 0x4f, 0x2f, 0x2c, 0x2e,
+ 0x2e, 0x2c, 0x4b, 0x3d,
+ 0x7d, 0x1e, 0x2e, 0x1e, 0x0d, 0x2c, 0x0e, 0x1f, 0x10, 0x20, 0x50, 0x3f,
+ 0x3e, 0x2d, 0x0d, 0x02,
+ 0x17, 0x02, 0xfc, 0xeb, 0x4e, 0x5f, 0x0e, 0x01, 0x05, 0x11, 0x00, 0x20,
+ 0x41, 0x13, 0x36, 0x23,
+ 0xc2, 0x92, 0xc2, 0xc1, 0xd4, 0xc1, 0xce, 0xe0, 0xf6, 0x14, 0x13, 0x01,
+ 0x04, 0x03, 0x12, 0x00,
+ 0x00, 0x37, 0x44, 0x02, 0xb2, 0x80, 0xce, 0xdc, 0xdf, 0x16, 0x23, 0xf0,
+ 0xe0, 0xff, 0xfd, 0x00,
+ 0x01, 0x03, 0x02, 0x20, 0x10, 0x20, 0x52, 0x47, 0x32, 0x00, 0xec, 0xcc,
+ 0x51, 0x77, 0x10, 0xee,
+ 0x0f, 0x10, 0x0f, 0x1f, 0x00, 0x0f, 0xfd, 0x0f, 0x60, 0x1d, 0x1a, 0x0e,
+ 0x1e, 0x0e, 0x0e, 0x20,
+ 0x2e, 0x0b, 0x3f, 0x4f, 0x2f, 0x1e, 0x0c, 0x2e, 0x73, 0x55, 0x00, 0x0e,
+ 0xec, 0x0e, 0x30, 0x11,
+ 0xed, 0xde, 0x45, 0x54, 0x00, 0xfd, 0xff, 0x00, 0x01, 0x02, 0xe0, 0xe0,
+ 0xe0, 0xa0, 0xd0, 0xf5,
+ 0x03, 0xdf, 0xcb, 0xf1, 0x26, 0x00, 0xbf, 0x10, 0x42, 0x12, 0x23, 0x15,
+ 0xf0, 0xd0, 0xb3, 0xe3,
+ 0xe6, 0xf2, 0xc1, 0xd1, 0xa0, 0xe0, 0x02, 0x01, 0x01, 0x22, 0x01, 0xff,
+ 0xdc, 0xca, 0x11, 0x77,
+ 0x31, 0x00, 0xf0, 0xde, 0xf0, 0x11, 0x00, 0xff, 0x10, 0x11, 0xf0, 0x32,
+ 0x22, 0x00, 0xbc, 0xba,
+ 0x0e, 0x71, 0x10, 0x0d, 0x1e, 0x20, 0x0e, 0xfa, 0xdd, 0x0e, 0x20, 0x51,
+ 0x0d, 0xfb, 0x00, 0x21,
+ 0x22, 0x1f, 0xdb, 0xac, 0x0f, 0x32, 0x21, 0xee, 0x0e, 0x30, 0x31, 0x00,
+ 0xef, 0xfd, 0x50, 0x3d,
+ 0x61, 0x27, 0xff, 0x00, 0x24, 0xed, 0xf0, 0x14, 0xb0, 0xc0, 0x27, 0xf1,
+ 0xaf, 0xff, 0xcd, 0x00,
+ 0x36, 0x11, 0x20, 0x42, 0x00, 0xfe, 0x14, 0x02, 0xcf, 0x00, 0x05, 0xe0,
+ 0xe1, 0xe1, 0xc0, 0xc0,
+ 0xdf, 0xbc, 0x13, 0x26, 0xef, 0xdf, 0x01, 0x12, 0x10, 0x1f, 0x00, 0xd0,
+ 0x04, 0x74, 0x41, 0x0f,
+ 0xd9, 0x51, 0x77, 0x00, 0xef, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0xfd, 0xcb, 0x10, 0x22,
+ 0xef, 0xec, 0x30, 0x50, 0xfd, 0xec, 0x20, 0x51, 0x0e, 0x0e, 0x21, 0x0f,
+ 0xfa, 0x20, 0x72, 0x0f,
+ 0xb9, 0x00, 0x33, 0x11, 0xdd, 0xee, 0x11, 0x31, 0x00, 0x0f, 0xfd, 0x00,
+ 0x54, 0xfe, 0xef, 0x11,
+ 0xfe, 0xdb, 0x22, 0x03, 0x90, 0xde, 0xee, 0xe0, 0x14, 0x14, 0xef, 0xff,
+ 0x10, 0x10, 0x54, 0x12,
+ 0x02, 0x47, 0x01, 0xc0, 0xc0, 0xf2, 0x05, 0x13, 0x13, 0xc0, 0x8c, 0xf0,
+ 0x02, 0x00, 0x0f, 0x00,
+ 0x12, 0x13, 0xfe, 0xd8, 0x12, 0x54, 0xee, 0xee, 0x11, 0x21, 0x31, 0x11,
+ 0xde, 0xe0, 0x14, 0x00,
+ 0xde, 0x40, 0x75, 0x00, 0x0e, 0xfd, 0xfc, 0x0f, 0x63, 0x12, 0xf8, 0xff,
+ 0x20, 0x40, 0x0d, 0x0d,
+ 0x00, 0x41, 0x21, 0xfc, 0xdc, 0x0e, 0x73, 0x56, 0x0f, 0xec, 0x00, 0x21,
+ 0x0f, 0x00, 0x43, 0x00,
+ 0x0d, 0xfc, 0x10, 0x54, 0x0f, 0xfd, 0x35, 0x32, 0x00, 0x0e, 0x22, 0x11,
+ 0xd0, 0x9e, 0x04, 0x17,
+ 0xe0, 0xae, 0x01, 0x02, 0xf1, 0x24, 0x33, 0x0f, 0xde, 0x12, 0x37, 0x00,
+ 0xa0, 0x00, 0x14, 0x00,
+ 0xd1, 0xd0, 0xc1, 0xe0, 0xc0, 0xf0, 0xf0, 0xbe, 0x01, 0x12, 0xeb, 0xf0,
+ 0x05, 0xe0, 0xde, 0x32,
+ 0xe0, 0xcc, 0x72, 0x34, 0x0f, 0x0f, 0x12, 0x46, 0x00, 0xdd, 0xfe, 0x1f,
+ 0x73, 0x00, 0xfb, 0xee,
+ 0x00, 0x54, 0x0d, 0xda, 0x0f, 0x00, 0x0f, 0xfe, 0xfd, 0xfd, 0xee, 0x10,
+ 0x72, 0x00, 0xf9, 0xfe,
+ 0x10, 0x40, 0x11, 0x00, 0x00, 0xf0, 0xff, 0x0e, 0x42, 0x22, 0xcc, 0xcc,
+ 0xff, 0x33, 0x52, 0x0e,
+ 0xeb, 0x10, 0x23, 0x0e, 0x0f, 0x44, 0x00, 0xbe, 0xf2, 0xf6, 0xd0, 0xbf,
+ 0xf0, 0x13, 0xff, 0xdc,
+ 0x00, 0x23, 0x54, 0x12, 0xfe, 0xde, 0x16, 0x22, 0x22, 0x25, 0xb0, 0x9e,
+ 0x02, 0x06, 0xe0, 0xcd,
+ 0x00, 0x00, 0xde, 0xf0, 0x00, 0x00, 0xf0, 0xdb, 0xef, 0x41, 0x30, 0x0d,
+ 0x2e, 0x74, 0xec, 0xdb,
+ 0x55, 0x43, 0xfe, 0xcc, 0xff, 0x33, 0x11, 0xed, 0x00, 0x11, 0x00, 0x0c,
+ 0x0f, 0x1e, 0x20, 0x0c,
+ 0x2f, 0x73, 0x1e, 0xe9, 0x00, 0x73, 0x22, 0x0e, 0xda, 0x10, 0x54, 0x00,
+ 0xde, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0xab, 0x00, 0x44, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0e, 0x20,
+ 0x10, 0x77, 0x22, 0xf0,
+ 0xee, 0x00, 0xf2, 0xc0, 0x02, 0x16, 0xf0, 0xd0, 0xe0, 0xe0, 0x02, 0x11,
+ 0xde, 0x20, 0x77, 0x53,
+ 0xed, 0xee, 0x13, 0x46, 0xf0, 0xcf, 0xf0, 0x13, 0xf0, 0xcd, 0x11, 0x03,
+ 0xcc, 0xdf, 0x02, 0xef,
+ 0xdf, 0x02, 0xef, 0xed, 0x13, 0x24, 0x00, 0xcc, 0xfd, 0x32, 0x77, 0x01,
+ 0x11, 0x11, 0x10, 0x20,
+ 0xfe, 0xac, 0x15, 0x44, 0x00, 0xfd, 0xfe, 0x00, 0x0f, 0xec, 0xff, 0x10,
+ 0x30, 0x1c, 0xda, 0xee,
+ 0x50, 0x72, 0x20, 0x0e, 0x2f, 0x0d, 0xea, 0x10, 0x73, 0x21, 0x0d, 0x0f,
+ 0x10, 0x11, 0x0f, 0xec,
+ 0xdc, 0x00, 0x63, 0x20, 0xfa, 0xed, 0x2f, 0x50, 0x10, 0x11, 0x21, 0x0d,
+ 0xf0, 0x00, 0xdd, 0xcb,
+ 0x01, 0x12, 0xdf, 0xc0, 0x03, 0x14, 0xfd, 0xc8, 0x20, 0x72, 0x24, 0x00,
+ 0x02, 0x14, 0xf0, 0xf2,
+ 0x02, 0x03, 0xf1, 0xd3, 0xb1, 0xe3, 0x05, 0xe2, 0xb0, 0xe2, 0xe2, 0xe2,
+ 0x37, 0xf0, 0x8d, 0xef,
+ 0x26, 0x32, 0xef, 0xf0, 0x00, 0x00, 0x31, 0x32, 0x00, 0xe0, 0xf1, 0xbf,
+ 0x0f, 0x77, 0x01, 0xed,
+ 0x0f, 0x44, 0x21, 0xfe, 0xfd, 0xff, 0x41, 0x21, 0xd8, 0xff, 0x30, 0x40,
+ 0x20, 0x60, 0x10, 0x0e,
+ 0x0e, 0x00, 0x10, 0x0e, 0x40, 0x0a, 0xbc, 0x11, 0x34, 0x00, 0x0e, 0xdb,
+ 0xcd, 0x40, 0x43, 0x1f,
+ 0x31, 0x41, 0xfd, 0xfc, 0x00, 0x11, 0x14, 0xde, 0xce, 0x00, 0xe0, 0xb0,
+ 0xf3, 0xf5, 0xe0, 0xff,
+ 0x43, 0x23, 0x98, 0xff, 0x37, 0x10, 0xd0, 0x00, 0x00, 0xb0, 0x01, 0x03,
+ 0x00, 0x13, 0x01, 0xae,
+ 0xf0, 0xe2, 0xc0, 0xf0, 0x06, 0x12, 0xce, 0xde, 0x03, 0x05, 0x00, 0xff,
+ 0x42, 0x00, 0xab, 0x01,
+ 0x24, 0x21, 0x00, 0x01, 0x11, 0x00, 0xfe, 0x00, 0x00, 0x40, 0x31, 0x21,
+ 0x1f, 0x0b, 0x0e, 0x4f,
+ 0x1d, 0xc8, 0x0e, 0x70, 0x20, 0xeb, 0xdd, 0x30, 0x50, 0x0d, 0x1f, 0x40,
+ 0x1f, 0x40, 0x2e, 0xf8,
+ 0xef, 0x20, 0x31, 0x00, 0x00, 0xfd, 0x0f, 0x72, 0x0e, 0xda, 0x43, 0x21,
+ 0xba, 0x00, 0x52, 0xff,
+ 0xdc, 0x11, 0x35, 0x00, 0x9e, 0xee, 0x00, 0x13, 0x00, 0xff, 0xed, 0xfe,
+ 0x0f, 0x0e, 0x01, 0x25,
+ 0xf0, 0xc0, 0x00, 0x02, 0x23, 0xf2, 0xb0, 0x06, 0x12, 0xd0, 0xcf, 0x25,
+ 0x55, 0xef, 0x9d, 0xff,
+ 0x12, 0x13, 0xff, 0xee, 0x00, 0xfe, 0x22, 0x21, 0xee, 0x15, 0x12, 0xdd,
+ 0xef, 0x44, 0xde, 0x9c,
+ 0x03, 0x12, 0x36, 0x32, 0xcd, 0xdc, 0x00, 0x11, 0x10, 0x00, 0x0e, 0x0e,
+ 0x40, 0x30, 0x10, 0xfa,
+ 0x10, 0x30, 0x0d, 0x2f, 0x60, 0xc8, 0xff, 0x74, 0x31, 0xfe, 0xbc, 0xfe,
+ 0x12, 0x45, 0x0f, 0xee,
+ 0x00, 0xed, 0xff, 0x77, 0x21, 0xfe, 0x00, 0x20, 0x0f, 0x0f, 0x23, 0x10,
+ 0xee, 0x00, 0x01, 0xb0,
+ 0x04, 0x01, 0xcd, 0x01, 0x46, 0x00, 0xcd, 0xed, 0x13, 0x22, 0x00, 0x43,
+ 0x25, 0x00, 0xff, 0xde,
+ 0x56, 0x22, 0xce, 0x00, 0x01, 0xe0, 0xf2, 0xe2, 0xd1, 0xad, 0xf0, 0x16,
+ 0xef, 0xbc, 0x02, 0x23,
+ 0x00, 0x10, 0x23, 0x0f, 0xdd, 0x01, 0x45, 0x32, 0x01, 0x00, 0x47, 0x12,
+ 0xe0, 0x01, 0xef, 0x8a,
+ 0xf0, 0x33, 0x22, 0x00, 0x20, 0xec, 0xac, 0x0f, 0x00, 0x00, 0x0e, 0x30,
+ 0x2f, 0xfa, 0xdd, 0x0f,
+ 0x40, 0x42, 0x10, 0xc9, 0x0f, 0x30, 0x00, 0xe0, 0x53, 0x10, 0xde, 0xfd,
+ 0x0f, 0x20, 0x43, 0x40,
+ 0x2e, 0x1a, 0x2e, 0x20, 0x41, 0x33, 0x00, 0xce, 0xbc, 0x00, 0xf3, 0xe0,
+ 0xef, 0xdd, 0xa8, 0xf0,
+ 0x22, 0x12, 0xcc, 0x00, 0x11, 0xde, 0xcd, 0x14, 0x67, 0x01, 0x22, 0x11,
+ 0xdf, 0xce, 0xf0, 0x03,
+ 0x36, 0x02, 0xcf, 0xc0, 0xe0, 0xe0, 0xd0, 0x22, 0x76, 0x00, 0xdf, 0xff,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x23, 0x12, 0x00, 0xcc, 0x8a, 0x00, 0x36, 0x21, 0xf0, 0xff, 0xe0, 0x0f,
+ 0x0f, 0x41, 0x21, 0xee,
+ 0xdd, 0x10, 0x76, 0xfe, 0xc9, 0xff, 0x30, 0x30, 0x00, 0x0f, 0x10, 0x60,
+ 0x21, 0x0e, 0xfd, 0x0e,
+ 0x0f, 0x0f, 0xfe, 0x00, 0x22, 0x10, 0x0f, 0xfc, 0x30, 0x72, 0x2e, 0x2c,
+ 0x42, 0x0d, 0xfa, 0x01,
+ 0x55, 0x22, 0x00, 0xef, 0xe0, 0x35, 0x23, 0x9f, 0xef, 0x02, 0x01, 0xdf,
+ 0x05, 0x13, 0xf0, 0xf1,
+ 0x01, 0x13, 0x36, 0xe0, 0xb0, 0x44, 0x54, 0x00, 0xe0, 0xf1, 0x01, 0xf2,
+ 0xf3, 0xd1, 0xbf, 0xde,
+ 0xce, 0x05, 0x26, 0xf0, 0xdf, 0xdf, 0x12, 0x22, 0xbf, 0x00, 0x42, 0x0e,
+ 0x00, 0x33, 0x13, 0x03,
+ 0x36, 0x10, 0x10, 0x1f, 0xdd, 0xdf, 0x77, 0x52, 0x0f, 0x0e, 0xec, 0xfe,
+ 0x00, 0x0f, 0xfc, 0x0e,
+ 0xea, 0x0f, 0x70, 0x20, 0xeb, 0xee, 0x70, 0x20, 0x0c, 0x0f, 0x20, 0x21,
+ 0x10, 0xbd, 0xb9, 0x00,
+ 0x32, 0x33, 0x0f, 0x0f, 0x0e, 0xeb, 0x20, 0x62, 0x0f, 0xfd, 0x22, 0x22,
+ 0xde, 0xff, 0x03, 0xf0,
+ 0xcd, 0xf0, 0x47, 0x01, 0xdf, 0x00, 0xce, 0xf0, 0x00, 0xfe, 0xf0, 0x26,
+ 0xe1, 0xb0, 0x02, 0x13,
+ 0x02, 0xe1, 0x05, 0x34, 0x90, 0xad, 0x01, 0x27, 0x02, 0xbe, 0xf0, 0x01,
+ 0x00, 0xfe, 0x01, 0x15,
+ 0x00, 0xff, 0x00, 0x10, 0x53, 0x01, 0xfe, 0xdc, 0x00, 0x03, 0xcd, 0x00,
+ 0x55, 0x10, 0x11, 0x23,
+ 0xee, 0xd9, 0x61, 0x32, 0x0f, 0xec, 0x00, 0x42, 0x0f, 0xfd, 0x0f, 0x43,
+ 0x0f, 0xb8, 0x0f, 0x30,
+ 0x0f, 0xfd, 0x31, 0x11, 0xcd, 0xcc, 0x00, 0x56, 0x32, 0xde, 0xbb, 0x0f,
+ 0x32, 0x20, 0x0f, 0x20,
+ 0x2f, 0x1f, 0x0e, 0x40, 0x31, 0x31, 0x0e, 0xde, 0x46, 0x12, 0x12, 0x11,
+ 0x8c, 0xed, 0x01, 0x26,
+ 0x10, 0x01, 0x00, 0xdf, 0x0f, 0xff, 0xee, 0x35, 0x43, 0x00, 0x75, 0x31,
+ 0xde, 0xae, 0x01, 0x04,
+ 0x01, 0x01, 0xe2, 0xcf, 0xcd, 0xe0, 0xe2, 0xf4, 0x04, 0xd0, 0xcc, 0xdd,
+ 0x47, 0x23, 0xad, 0xfe,
+ 0x14, 0x23, 0xff, 0xef, 0xff, 0x02, 0x36, 0x00, 0xcf, 0xee, 0x22, 0x77,
+ 0x22, 0xef, 0xee, 0x10,
+ 0xef, 0xbd, 0x23, 0x22, 0xed, 0x10, 0x0e, 0xda, 0x40, 0x51, 0x0e, 0x0d,
+ 0x0f, 0x2f, 0x31, 0x43,
+ 0x0f, 0xd9, 0x00, 0xef, 0x00, 0x20, 0xed, 0x0d, 0x60, 0x3f, 0x1b, 0x0d,
+ 0x1e, 0x1c, 0x50, 0x53,
+ 0x33, 0x0e, 0xd8, 0xee, 0x20, 0x00, 0x01, 0x32, 0xde, 0xbc, 0x0f, 0xee,
+ 0xed, 0xff, 0x30, 0x50,
+ 0x0f, 0xdc, 0x21, 0x44, 0xcc, 0xde, 0x47, 0x53, 0x00, 0xe0, 0xd0, 0xf0,
+ 0x13, 0x03, 0xb0, 0x06,
+ 0x02, 0xd0, 0xe0, 0x02, 0xd0, 0x8f, 0x02, 0x25, 0x00, 0x00, 0xe0, 0xe0,
+ 0x13, 0x13, 0xba, 0xef,
+ 0x35, 0x00, 0xd0, 0xf0, 0xd0, 0x23, 0x43, 0x10, 0x10, 0xf0, 0xef, 0xde,
+ 0xe0, 0x56, 0x52, 0x10,
+ 0x0d, 0xeb, 0x10, 0x40, 0x61, 0x32, 0x0c, 0xea, 0x00, 0x00, 0x0e, 0x0f,
+ 0x41, 0x00, 0x12, 0x01,
+ 0xdc, 0xfe, 0x3f, 0x70, 0x31, 0x2f, 0x0a, 0x0d, 0x2f, 0x72, 0x43, 0x0f,
+ 0x0d, 0xfc, 0x0f, 0x13,
+ 0x25, 0x11, 0xfe, 0xbb, 0xe0, 0x03, 0x35, 0x00, 0xcd, 0xcd, 0xee, 0xf0,
+ 0x03, 0x77, 0x13, 0xff,
+ 0xff, 0x12, 0x13, 0xef, 0xcd, 0x15, 0x44, 0x01, 0xcf, 0xdf, 0xcf, 0xe0,
+ 0x05, 0x02, 0xdf, 0xc0,
+ 0xf1, 0xf1, 0xf1, 0x03, 0x03, 0xf0, 0xde, 0xc9, 0xce, 0x32, 0x00, 0x00,
+ 0xde, 0x01, 0xdd, 0x01,
+ 0xd4, 0xc5, 0x4d, 0x43, 0x19, 0xcd, 0xb6, 0x48, 0x32, 0x54, 0xec, 0xec,
+ 0x64, 0x33, 0x0e, 0x01,
+ 0x22, 0xfe, 0xbd, 0xdb, 0xcc, 0x00, 0x54, 0x0e, 0x0b, 0x0e, 0x0d, 0x30,
+ 0x4f, 0x0d, 0x30, 0x11,
+ 0xfb, 0x0e, 0x40, 0x53, 0x00, 0xea, 0xf0, 0x00, 0x10, 0xed, 0x0e, 0x62,
+ 0x00, 0xfa, 0x20, 0x53,
+ 0x0f, 0xfd, 0x23, 0x44, 0x11, 0x00, 0xdc, 0xed, 0x33, 0x45, 0xbd, 0xdb,
+ 0x00, 0x21, 0xef, 0xbd,
+ 0xfe, 0xef, 0x11, 0x34, 0x00, 0xd0, 0x01, 0x45, 0xdf, 0xad, 0x13, 0x57,
+ 0x01, 0xf0, 0xf2, 0xe0,
+ 0xdf, 0x00, 0xf0, 0xf0, 0x26, 0x02, 0xbf, 0xef, 0xff, 0xcd, 0xff, 0x46,
+ 0x11, 0xdf, 0xe0, 0xff,
+ 0xdf, 0x02, 0xf0, 0xad, 0x34, 0x44, 0xef, 0x00, 0x11, 0x01, 0x0f, 0xfe,
+ 0x02, 0x34, 0xff, 0xdc,
+ 0xbb, 0x00, 0x40, 0x10, 0x2f, 0xe9, 0x0e, 0x70, 0x00, 0xfe, 0x00, 0x0e,
+ 0x0e, 0x64, 0x00, 0xfd,
+ 0xef, 0x0e, 0x10, 0x42, 0x20, 0x1c, 0x0e, 0x1d, 0x0c, 0x60, 0x57, 0x11,
+ 0x10, 0x0f, 0x0e, 0xef,
+ 0x01, 0x47, 0x22, 0xdf, 0xbe, 0x00, 0x00, 0xf0, 0x14, 0xfe, 0xbd, 0x13,
+ 0x35, 0xdd, 0xff, 0x55,
+ 0x22, 0x11, 0x22, 0x12, 0xe0, 0xcf, 0xee, 0x47, 0x22, 0x8d, 0xff, 0x05,
+ 0x01, 0xee, 0xf0, 0x14,
+ 0x00, 0xe0, 0x12, 0x00, 0x10, 0x35, 0xd0, 0x8d, 0x03, 0x12, 0xff, 0x00,
+ 0x04, 0x03, 0x02, 0x00,
+ 0x34, 0x44, 0x22, 0xf0, 0xe0, 0x47, 0x01, 0x8d, 0xff, 0x00, 0x0d, 0x00,
+ 0x00, 0x0b, 0xfd, 0x0e,
+ 0x40, 0x2f, 0x0a, 0x0d, 0x1f, 0x61, 0x21, 0x0f, 0x00, 0x0e, 0xe8, 0xde,
+ 0x41, 0x30, 0xfe, 0x0e,
+ 0x0e, 0x40, 0x60, 0xf9, 0xfe, 0x40, 0x52, 0x11, 0x0f, 0x0f, 0xee, 0x0d,
+ 0x23, 0x23, 0xdc, 0xec,
+ 0x00, 0xff, 0xbd, 0x01, 0xf0, 0xff, 0xef, 0xdc, 0x01, 0x35, 0x01, 0xd0,
+ 0x22, 0x67, 0xf0, 0xf2,
+ 0x03, 0x13, 0xd0, 0xe2, 0x27, 0xe2, 0x80, 0xd1, 0x03, 0xb0, 0xe2, 0x14,
+ 0x02, 0xdf, 0x01, 0x45,
+ 0xde, 0xcf, 0x24, 0x01, 0xf2, 0x12, 0x01, 0x13, 0x00, 0xce, 0x01, 0x77,
+ 0x43, 0xf0, 0xdf, 0xdd,
+ 0xe0, 0x12, 0x44, 0x34, 0x11, 0xee, 0xbb, 0x0f, 0x2e, 0x2e, 0x60, 0x20,
+ 0x1e, 0x1d, 0x08, 0xdd,
+ 0x10, 0x61, 0x00, 0x0f, 0x0f, 0x0d, 0xff, 0x00, 0x2f, 0xea, 0xed, 0x2f,
+ 0x50, 0x3f, 0x4f, 0x2d,
+ 0x1c, 0x73, 0x23, 0x0d, 0x1e, 0x10, 0x0e, 0x04, 0x57, 0x03, 0x0f, 0xcc,
+ 0xef, 0x01, 0x02, 0xf3,
+ 0xf1, 0xdf, 0x00, 0x35, 0x43, 0xe0, 0xe0, 0x57, 0x11, 0x00, 0x11, 0x01,
+ 0xd0, 0xe0, 0xe2, 0xf4,
+ 0xe2, 0xa1, 0xf2, 0xe2, 0xa0, 0xc0, 0x05, 0x03, 0x00, 0x03, 0x07, 0xd0,
+ 0xaf, 0xee, 0xee, 0x23,
+ 0x57, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x32, 0x00, 0x00, 0x25, 0x22, 0xc0,
+ 0xac, 0xff, 0x00, 0x01,
+ 0x00, 0x0e, 0x1f, 0x0c, 0xec, 0x0f, 0x3e, 0x0c, 0x0d, 0x60, 0x30, 0x0d,
+ 0xfa, 0xfe, 0x51, 0x10,
+ 0xda, 0xff, 0x40, 0x00, 0xdd, 0xee, 0x0f, 0xfc, 0x60, 0x41, 0x0e, 0xfc,
+ 0xee, 0x20, 0x76, 0x00,
+ 0xec, 0xfe, 0x31, 0x33, 0x00, 0xff, 0xab, 0xff, 0x23, 0xf0, 0xdc, 0x00,
+ 0xde, 0xf0, 0x45, 0xcf,
+ 0xee, 0x22, 0x10, 0xce, 0x10, 0x35, 0xf0, 0xf0, 0xf0, 0x02, 0x44, 0xc0,
+ 0xad, 0xf0, 0x03, 0x35,
+ 0x12, 0xef, 0xaa, 0x00, 0x22, 0xf0, 0xdf, 0xe0, 0xde, 0x00, 0x00, 0xff,
+ 0x01, 0xf0, 0xbc, 0xfc,
+ 0x31, 0x56, 0x00, 0xf0, 0x02, 0xef, 0xde, 0xf0, 0x67, 0x22, 0xc0, 0xee,
+ 0x01, 0x20, 0x0f, 0x0f,
+ 0x10, 0x00, 0x51, 0x44, 0x0c, 0xfd, 0x10, 0x23, 0xfe, 0xba, 0xef, 0x11,
+ 0x45, 0x00, 0xab, 0xed,
+ 0x11, 0x31, 0xfe, 0x30, 0x42, 0x10, 0x20, 0x10, 0x1c, 0x72, 0x36, 0x10,
+ 0x0e, 0x00, 0x12, 0x00,
+ 0xcb, 0x00, 0x32, 0x00, 0xf0, 0x34, 0xde, 0x8a, 0x00, 0x33, 0x32, 0x00,
+ 0xff, 0x0f, 0x20, 0x22,
+ 0x22, 0xf0, 0xdf, 0x12, 0x04, 0xc0, 0xc2, 0xd2, 0xf3, 0x26, 0xb0, 0x9d,
+ 0xf0, 0xf0, 0xee, 0x05,
+ 0x04, 0xd0, 0xcf, 0xde, 0xde, 0xef, 0x00, 0x25, 0x55, 0x00, 0xf0, 0x00,
+ 0x01, 0xf2, 0x05, 0xf1,
+ 0x90, 0x01, 0x25, 0xdf, 0xce, 0x34, 0x32, 0xee, 0xce, 0xfe, 0x00, 0x41,
+ 0x0d, 0xeb, 0x0f, 0x31,
+ 0x53, 0xfe, 0x0e, 0x00, 0xdc, 0xbb, 0x20, 0x41, 0xfd, 0xfd, 0x0e, 0xfb,
+ 0x1f, 0x61, 0x31, 0x20,
+ 0x0a, 0x0e, 0x2f, 0x1e, 0x3f, 0x72, 0x21, 0x10, 0x20, 0x0d, 0x0c, 0x2f,
+ 0xe8, 0x9c, 0x21, 0x43,
+ 0xfe, 0xfc, 0x0f, 0x30, 0xef, 0xfe, 0x42, 0x32, 0x1f, 0x0f, 0x23, 0x03,
+ 0xad, 0xf3, 0x07, 0xe1,
+ 0xd0, 0x13, 0x57, 0xf1, 0xc0, 0xef, 0xf0, 0x01, 0x03, 0x02, 0xe1, 0x9e,
+ 0xee, 0x06, 0x02, 0xce,
+ 0xcc, 0xff, 0x00, 0x24, 0x22, 0xf0, 0xe0, 0x03, 0x02, 0xbe, 0xde, 0x17,
+ 0x22, 0x12, 0x43, 0xef,
+ 0xce, 0x0f, 0x0d, 0x0e, 0x60, 0x0d, 0x08, 0x1e, 0x0e, 0x1e, 0x51, 0x10,
+ 0x0e, 0x55, 0x21, 0xda,
+ 0xbc, 0x00, 0x43, 0x00, 0xee, 0x0f, 0x0e, 0x0f, 0x20, 0x0f, 0x0d, 0x30,
+ 0x72, 0x10, 0x1e, 0x47,
+ 0x32, 0x0f, 0xed, 0x13, 0x35, 0xac, 0xed, 0x34, 0x12, 0xe0, 0xef, 0xd0,
+ 0xdf, 0x02, 0x21, 0x01,
+ 0x35, 0x21, 0x20, 0x21, 0x01, 0xc0, 0xf0, 0x77, 0x23, 0x01, 0xf3, 0xd1,
+ 0xd0, 0x8f, 0x03, 0x27,
+ 0xf3, 0xcf, 0xf0, 0x04, 0xf0, 0x8e, 0x00, 0x04, 0x00, 0xef, 0x00, 0x13,
+ 0x0f, 0x0f, 0x27, 0x22,
+ 0xff, 0x00, 0x12, 0x00, 0xf0, 0xf0, 0xf2, 0x35, 0x00, 0xe1, 0x23, 0xff,
+ 0x88, 0xee, 0x71, 0x21,
+ 0x0c, 0xfe, 0x20, 0x40, 0x1f, 0x1d, 0x1e, 0x1e, 0x2f, 0x30, 0x1f, 0xb8,
+ 0x0e, 0x52, 0x11, 0x00,
+ 0xdb, 0xee, 0x20, 0x51, 0x10, 0x0d, 0xea, 0x20, 0x63, 0x10, 0x10, 0x0f,
+ 0x0d, 0x20, 0x11, 0xfd,
+ 0x00, 0x0f, 0x0f, 0xf0, 0xab, 0xdd, 0x00, 0xfe, 0x13, 0x47, 0xcf, 0xba,
+ 0x00, 0x21, 0x21, 0x01,
+ 0x00, 0xd0, 0xc0, 0x02, 0x14, 0xc0, 0x01, 0x04, 0xd0, 0x01, 0x23, 0xf1,
+ 0xf3, 0xf5, 0x03, 0xf2,
+ 0x8e, 0xbc, 0xf0, 0xf2, 0xf1, 0x16, 0x11, 0xde, 0xef, 0x11, 0x00, 0xbb,
+ 0x01, 0x57, 0x11, 0xe0,
+ 0xf0, 0x31, 0x12, 0x00, 0xe0, 0xf1, 0xd0, 0xf0, 0xab, 0x0f, 0x62, 0x00,
+ 0x0e, 0x20, 0x0c, 0xdb,
+ 0xff, 0x41, 0x31, 0xfe, 0xed, 0x00, 0x53, 0x00, 0xec, 0x0f, 0xed, 0xdb,
+ 0x0f, 0x2f, 0x2d, 0x60,
+ 0x1f, 0x09, 0xff, 0x61, 0x22, 0x0e, 0x30, 0x2e, 0x0d, 0x52, 0x0f, 0xb8,
+ 0x0e, 0x34, 0x22, 0xee,
+ 0xff, 0xbc, 0x00, 0x23, 0x0f, 0xfe, 0xff, 0x0e, 0x23, 0x67, 0x00, 0xef,
+ 0xed, 0xf0, 0x01, 0x22,
+ 0x24, 0xf0, 0xd0, 0xf1, 0x02, 0x26, 0x11, 0xb1, 0x90, 0xe0, 0xe2, 0xe2,
+ 0xf3, 0xf2, 0xd1, 0xf4,
+ 0x47, 0x02, 0xc0, 0xf0, 0x13, 0xce, 0xef, 0x77, 0x24, 0xe0, 0xf0, 0x12,
+ 0x02, 0xf0, 0x01, 0xe1,
+ 0xcf, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0xd9, 0x0e, 0x72, 0x52, 0x0c,
+ 0xfc, 0x10, 0x20, 0x0e,
+ 0x1f, 0x2e, 0x1d, 0x0b, 0x20, 0x0e, 0x88, 0x0f, 0x30, 0x30, 0xed, 0xdc,
+ 0x40, 0x63, 0x0f, 0x2f,
+ 0x20, 0x0d, 0x0d, 0x0e, 0x2f, 0x1f, 0x1f, 0x1e, 0xea, 0xee, 0xef, 0xce,
+ 0xcb, 0x10, 0x41, 0x0f,
+ 0x0f, 0x00, 0xed, 0xee, 0x13, 0x01, 0xbf, 0xc0, 0xc0, 0x07, 0x16, 0xe0,
+ 0xe0, 0x12, 0x23, 0xe1,
+ 0x8f, 0xf2, 0x37, 0x02, 0xb0, 0x00, 0xf1, 0x02, 0xf3, 0xf3, 0xf1, 0xe1,
+ 0xd0, 0xc0, 0xf2, 0x17,
+ 0x01, 0xb0, 0xe0, 0x12, 0x37, 0xf1, 0xa0, 0xe0, 0x01, 0x13, 0x11, 0x00,
+ 0x00, 0xee, 0x44, 0x32,
+ 0xdc, 0x0e, 0x50, 0x0c, 0x0c, 0x30, 0x50, 0x1e, 0x30, 0x10, 0xd8, 0x00,
+ 0x10, 0x20, 0x2f, 0xcc,
+ 0x8c, 0x0e, 0x20, 0x40, 0x1d, 0x1d, 0x3f, 0x60, 0x20, 0x1e, 0x1c, 0x2f,
+ 0x64, 0x23, 0x0e, 0x0d,
+ 0x22, 0x0f, 0xf9, 0xf0, 0x02, 0x03, 0xf0, 0xd0, 0xff, 0x10, 0x20, 0x0f,
+ 0x64, 0x36, 0x00, 0xef,
+ 0x02, 0xf0, 0x9c, 0x01, 0x26, 0x12, 0x02, 0x01, 0xf2, 0xd2, 0xe5, 0xf2,
+ 0xc1, 0x90, 0xd0, 0x03,
+ 0xf2, 0xd0, 0xf4, 0xf1, 0xd0, 0xd0, 0xf2, 0xe0, 0xba, 0x00, 0x53, 0x13,
+ 0x00, 0x25, 0x12, 0xf1,
+ 0xc0, 0xf1, 0x02, 0xcd, 0xd0, 0x17, 0x01, 0xbf, 0x00, 0x00, 0xcd, 0xdc,
+ 0x0f, 0x72, 0x1e, 0x08,
+ 0x0f, 0xfe, 0x00, 0x63, 0x00, 0xfb, 0x00, 0x00, 0xfd, 0xee, 0xe0, 0xed,
+ 0xcc, 0x0e, 0x00, 0x20,
+ 0x0c, 0x0d, 0x50, 0x31, 0x1f, 0x3e, 0x4d, 0x3d, 0x41, 0x47, 0x21, 0x0e,
+ 0xfd, 0xfd, 0xee, 0xcf,
+ 0xe1, 0xf0, 0xfb, 0x0e, 0x1d, 0x62, 0x14, 0xed, 0xdd, 0xef, 0xfe, 0x0e,
+ 0xf0, 0xbd, 0xef, 0x47,
+ 0x25, 0x01, 0x35, 0xf0, 0x8c, 0x00, 0x02, 0x04, 0xe0, 0xf0, 0x01, 0xdf,
+ 0x8c, 0x01, 0x16, 0xff,
+ 0xcc, 0x0f, 0x10, 0x00, 0xfe, 0x0f, 0x00, 0x30, 0x23, 0xdf, 0xac, 0x02,
+ 0x13, 0x01, 0xf2, 0xe2,
+ 0xe4, 0xe2, 0xe1, 0xcf, 0x10, 0x30, 0xfd, 0x10, 0x41, 0xf8, 0x4d, 0x73,
+ 0x1c, 0xea, 0x22, 0x22,
+ 0xee, 0xdd, 0xf0, 0xbc, 0x00, 0x23, 0xbc, 0xdc, 0x00, 0x00, 0x10, 0x2f,
+ 0x0e, 0x50, 0x31, 0x20,
+ 0x73, 0x20, 0x1c, 0x10, 0x23, 0x21, 0x00, 0x00, 0xff, 0xed, 0x37, 0x06,
+ 0xd0, 0x21, 0x62, 0x00,
+ 0xef, 0xee, 0xff, 0x00, 0x66, 0x44, 0x00, 0xff, 0xf0, 0x12, 0x22, 0x00,
+ 0x27, 0x42, 0x00, 0xf2,
+ 0xf1, 0xe1, 0x15, 0x02, 0x80, 0xe1, 0xf3, 0xc0, 0xcf, 0xe0, 0xce, 0xe0,
+ 0x05, 0x00, 0xce, 0xf0,
+ 0x14, 0x00, 0x0f, 0xff, 0xd0, 0x07, 0x56, 0x01, 0xf0, 0xe1, 0xd0, 0xe2,
+ 0xf1, 0x90, 0xf0, 0x03,
+ 0xff, 0xcd, 0x00, 0x20, 0x09, 0x1e, 0x20, 0x30, 0x61, 0x10, 0xfb, 0x0e,
+ 0x51, 0x0e, 0xfa, 0x0f,
+ 0x10, 0x1e, 0xec, 0xbc, 0x0f, 0x10, 0x1e, 0x1e, 0x5e, 0x40, 0x2e, 0x1b,
+ 0x4f, 0x1e, 0x20, 0x51,
+ 0x1e, 0x09, 0x10, 0x31, 0xfe, 0xdb, 0x20, 0x70, 0x20, 0x1f, 0x0f, 0x0e,
+ 0x00, 0x12, 0x00, 0xff,
+ 0x12, 0xf0, 0xd0, 0x27, 0x13, 0xd0, 0xe0, 0xf2, 0x56, 0x12, 0xc0, 0x12,
+ 0x75, 0x12, 0xc0, 0xf2,
+ 0x05, 0xe0, 0xa0, 0xf0, 0x02, 0xf2, 0xdf, 0xe0, 0x04, 0xd0, 0xdf, 0x11,
+ 0x31, 0x02, 0xf6, 0xe2,
+ 0xd1, 0x75, 0x01, 0xd0, 0xf0, 0x03, 0xe1, 0x23, 0x66, 0xef, 0xde, 0x00,
+ 0x30, 0x61, 0x21, 0x10,
+ 0x0d, 0x2e, 0x0c, 0xfe, 0x32, 0x55, 0x0f, 0x0e, 0x0e, 0x0c, 0xed, 0xbd,
+ 0xc9, 0x10, 0x63, 0x0e,
+ 0xfc, 0x20, 0x2e, 0x1e, 0x71, 0x22, 0x0f, 0x1f, 0x1c, 0x1f, 0x21, 0x00,
+ 0x0c, 0x0f, 0x00, 0x0f,
+ 0xff, 0x13, 0x0e, 0xea, 0x00, 0x33, 0x72, 0x00, 0xd8, 0x00, 0x75, 0x30,
+ 0xe0, 0xe0, 0x00, 0x01,
+ 0xf0, 0xf1, 0x02, 0x05, 0x02, 0x02, 0xa0, 0xf2, 0x05, 0xc0, 0xbf, 0x04,
+ 0xf2, 0xb0, 0x01, 0xf1,
+ 0xcd, 0xe0, 0x16, 0x01, 0xf0, 0xf0, 0xf0, 0xe0, 0x02, 0x11, 0xdf, 0x03,
+ 0x27, 0xf1, 0xb0, 0xf1,
+ 0xf2, 0xd1, 0x9d, 0xfe, 0x27, 0x00, 0xed, 0x0f, 0x3e, 0x4f, 0x40, 0x20,
+ 0x1f, 0x0d, 0x22, 0x63,
+ 0x1b, 0x2f, 0x10, 0x0c, 0x0f, 0x10, 0x0b, 0xfd, 0xec, 0xde, 0x0e, 0x1f,
+ 0x5d, 0x3c, 0x7f, 0x3f,
+ 0x3e, 0x0c, 0x0b, 0x0f, 0x2e, 0x0e, 0x30, 0x40, 0x0d, 0x0a, 0x0f, 0x30,
+ 0x1e, 0xaa, 0xf0, 0x40,
+ 0x10, 0xed, 0xfe, 0x10, 0xcc, 0xee, 0x22, 0xe0, 0x89, 0x00, 0x10, 0x00,
+ 0x00, 0xff, 0xef, 0x02,
+ 0x34, 0x01, 0xf1, 0x02, 0xa0, 0xc0, 0xf5, 0xf3, 0xb0, 0xe0, 0xd0, 0xe0,
+ 0xf1, 0xd0, 0xdd, 0xef,
+ 0x02, 0x04, 0xbe, 0xdf, 0x07, 0x04, 0xf1, 0xc2, 0xe3, 0xe7, 0xa1, 0xb0,
+ 0xf2, 0x03, 0x02, 0xf1,
+ 0xde, 0xff, 0x00, 0x12, 0x43, 0x1f, 0x1d, 0x47, 0x21, 0xec, 0x30, 0x72,
+ 0x0f, 0xfc, 0x01, 0x02,
+ 0xce, 0xf0, 0xeb, 0xfe, 0x00, 0x1e, 0x0d, 0x2d, 0x5e, 0x5d, 0x2c, 0x2c,
+ 0x40, 0x31, 0x2d, 0x2a,
+ 0x50, 0x1f, 0x0a, 0x00, 0x43, 0x0f, 0xfc, 0x10, 0x00, 0xeb, 0x0f, 0x60,
+ 0x11, 0xfe, 0x0c, 0x20,
+ 0x30, 0xfd, 0x0e, 0x20, 0x3f, 0x3d, 0x60, 0x22, 0x0f, 0xfc, 0x13, 0x47,
+ 0x01, 0xe2, 0xc2, 0xf6,
+ 0x02, 0x91, 0xd1, 0xd1, 0xd1, 0xf2, 0xf4, 0xa0, 0xe0, 0x03, 0xf1, 0x03,
+ 0x14, 0xff, 0x04, 0x37,
+ 0x01, 0x02, 0xf2, 0x81, 0x07, 0x01, 0xb0, 0xe0, 0x02, 0x02, 0xe0, 0xd0,
+ 0xf0, 0x02, 0x12, 0x00,
+ 0xdd, 0x40, 0x77, 0x00, 0x0f, 0x32, 0x20, 0xfc, 0xfe, 0x00, 0xff, 0xce,
+ 0x00, 0xea, 0xee, 0x30,
+ 0xfd, 0x0c, 0x70, 0x1e, 0x0d, 0x21, 0x3f, 0x0b, 0x3e, 0x40, 0x3e, 0x2d,
+ 0x2b, 0x50, 0x2f, 0x0c,
+ 0x1d, 0x4e, 0x4f, 0x0d, 0x1f, 0x2f, 0x0b, 0xed, 0x40, 0x20, 0xce, 0xcd,
+ 0xee, 0xda, 0xff, 0xfe,
+ 0xee, 0xef, 0xcf, 0xc0, 0x26, 0x51, 0x00, 0x00, 0x13, 0x06, 0xd2, 0xc2,
+ 0xd0, 0xc1, 0xd2, 0xe4,
+ 0xa0, 0xd0, 0xf2, 0xf2, 0xbf, 0xf0, 0x01, 0xe1, 0x05, 0x05, 0xf1, 0xf1,
+ 0x24, 0x03, 0xc4, 0xd2,
+ 0x8f, 0xdf, 0x14, 0x12, 0xff, 0xf0, 0x03, 0xff, 0xea, 0x10, 0x50, 0x00,
+ 0x1c, 0x40, 0x50, 0x20,
+ 0x1e, 0xf8, 0x0f, 0x0f, 0xf0, 0xef, 0xee, 0xfd, 0xdb, 0x20, 0x40, 0xfd,
+ 0x0d, 0x5f, 0x7f, 0x3e,
+ 0x1d, 0x30, 0x20, 0x3f, 0x4e, 0x31, 0x21, 0x20, 0x14, 0x02, 0x43, 0x57,
+ 0x00, 0x02, 0x13, 0x01,
+ 0xe0, 0xf0, 0x26, 0x21, 0xef, 0x22, 0x23, 0xbf, 0xe0, 0x57, 0x42, 0xfe,
+ 0x23, 0x57, 0x01, 0xf0,
+ 0x01, 0x04, 0x13, 0x03, 0x24, 0x03, 0xa2, 0xd0, 0xe4, 0xe2, 0xc1, 0xd2,
+ 0xc1, 0x02, 0x00, 0xf0,
+ 0xf0, 0xde, 0x00, 0x77, 0x16, 0xf0, 0x00, 0x01, 0xd0, 0x02, 0x26, 0xd0,
+ 0x90, 0x00, 0x00, 0xd0,
+ 0xee, 0xe0, 0x01, 0xd0, 0xee, 0x61, 0x53, 0x1e, 0x1f, 0x2f, 0x0d, 0xf9,
+ 0xee, 0x00, 0x2e, 0xc9,
+ 0xee, 0x10, 0x0f, 0xbb, 0x00, 0x00, 0xdc, 0x1f, 0x70, 0x1f, 0x0d, 0x10,
+ 0x22, 0x2f, 0x1c, 0x2d,
+ 0x1e, 0x2f, 0x30, 0x21, 0x0e, 0x2d, 0x5f, 0x30, 0x09, 0x0e, 0x72, 0x1f,
+ 0xea, 0x00, 0x21, 0xdf,
+ 0xbe, 0x00, 0xff, 0xfd, 0x00, 0x12, 0x00, 0xcb, 0xf0, 0x34, 0x00, 0x9d,
+ 0x17, 0x44, 0xf0, 0x01,
+ 0x03, 0xcf, 0xf0, 0x02, 0xd2, 0xe2, 0xe0, 0xed, 0x20, 0x0f, 0xc9, 0x0f,
+ 0x20, 0x01, 0x00, 0x21,
+ 0x01, 0xf2, 0x57, 0x03, 0x80, 0x02, 0x33, 0x13, 0xf2, 0xc1, 0xa0, 0xf0,
+ 0xfe, 0x0f, 0x24, 0x20,
+ 0x0d, 0x20, 0x35, 0x20, 0x0d, 0x1e, 0x3d, 0x0e, 0xcd, 0xbe, 0xe0, 0xcd,
+ 0xb8, 0xeb, 0x00, 0xf1,
+ 0xfd, 0xdc, 0xfd, 0x0d, 0x5e, 0x50, 0x1f, 0x1d, 0x30, 0x2c, 0x3b, 0x50,
+ 0x22, 0x0c, 0x0e, 0x20,
+ 0x30, 0x2e, 0x2e, 0x20, 0x11, 0x0f, 0x0f, 0x00, 0x0e, 0xb8, 0xfe, 0x33,
+ 0x22, 0x00, 0x50, 0x40,
+ 0x2c, 0x2e, 0x22, 0x04, 0x01, 0x75, 0x23, 0x05, 0x05, 0x01, 0xb0, 0xe4,
+ 0xd3, 0xc3, 0xd2, 0xb2,
+ 0xc0, 0xc0, 0xe0, 0x02, 0x02, 0xf2, 0xfe, 0xdc, 0xe4, 0xf6, 0x01, 0xf1,
+ 0x14, 0x24, 0xf1, 0xc1,
+ 0xc2, 0xa0, 0xd2, 0xf4, 0xb1, 0xdf, 0xd0, 0x01, 0xf1, 0x02, 0x17, 0x42,
+ 0x11, 0x20, 0x0f, 0x1f,
+ 0x31, 0x10, 0xfb, 0x10, 0x30, 0x0e, 0xd9, 0x0f, 0x0f, 0xad, 0x05, 0x05,
+ 0x8b, 0x00, 0x6c, 0x00,
+ 0x9c, 0xbe, 0x1e, 0x3a, 0xc5, 0xbd, 0xb5, 0x3c, 0xbc, 0x2e, 0x0b, 0xdf,
+ 0x54, 0x32, 0xfc, 0xfd,
+ 0x0e, 0x5e, 0xb8, 0x0e, 0x54, 0x0f, 0x2f, 0x41, 0x0e, 0xb8, 0x00, 0x21,
+ 0x10, 0x0f, 0x00, 0x21,
+ 0xed, 0xbb, 0x20, 0x43, 0xfe, 0xfc, 0x10, 0x31, 0xff, 0x0e, 0x41, 0x0f,
+ 0x0f, 0x42, 0x10, 0xe0,
+ 0xf1, 0x04, 0x10, 0xb8, 0x10, 0x34, 0xbe, 0xee, 0x10, 0x72, 0xf0, 0xdb,
+ 0x10, 0x13, 0xf0, 0xe0,
+ 0x10, 0x0e, 0x24, 0x35, 0xdf, 0x00, 0xe0, 0x9e, 0x00, 0x06, 0xe0, 0xd0,
+ 0x01, 0x0f, 0x40, 0x34,
+ 0xc0, 0xdd, 0x03, 0x41, 0x0e, 0xf0, 0x35, 0xe0, 0xcf, 0x02, 0xe2, 0x9a,
+ 0x0f, 0x11, 0x14, 0x00,
+ 0xff, 0xdd, 0x00, 0x32, 0x52, 0xfe, 0xdd, 0x30, 0x2f, 0x0f, 0x00, 0xf1,
+ 0x2f, 0x52, 0x02, 0xd8,
+ 0x7c, 0x20, 0x10, 0x15, 0x00, 0xdc, 0x0f, 0x51, 0x21, 0xfc, 0x20, 0x55,
+ 0xde, 0xdc, 0x31, 0x42,
+ 0x0e, 0x1e, 0x30, 0x02, 0x0e, 0x50, 0x32, 0x11, 0x0e, 0x02, 0x01, 0xe1,
+ 0x05, 0x03, 0xfe, 0xae,
+ 0xf5, 0x31, 0x0e, 0xb9, 0xf0, 0x03, 0xee, 0x10, 0x43, 0xd0, 0x00, 0x62,
+ 0x11, 0xef, 0x04, 0x47,
+ 0xd0, 0x8b, 0x01, 0x12, 0xf0, 0xde, 0x14, 0x11, 0xdd, 0x12, 0x56, 0xdf,
+ 0xfe, 0x13, 0x21, 0x00,
+ 0x43, 0xf1, 0xbe, 0x00, 0x37, 0xef, 0xfe, 0x13, 0x00, 0xc0, 0x00, 0x15,
+ 0x00, 0xd0, 0x1d, 0x72,
+ 0x01, 0xce, 0x01, 0x04, 0x0f, 0x44, 0x10, 0xea, 0x11, 0x62, 0xff, 0xff,
+ 0x10, 0x22, 0x20, 0x00,
+ 0x0d, 0x0f, 0x00, 0x11, 0x10, 0x0b, 0x23, 0x2f, 0xb8, 0x0e, 0x22, 0x10,
+ 0x0e, 0x70, 0x20, 0xfa,
+ 0x00, 0x30, 0x00, 0xff, 0xd0, 0xf1, 0xdf, 0x72, 0x67, 0xfe, 0xcc, 0x2f,
+ 0x01, 0x00, 0xf0, 0xfd,
+ 0xee, 0x0f, 0x00, 0x0f, 0x0f, 0x24, 0xde, 0xcf, 0x23, 0x24, 0x8c, 0xda,
+ 0x00, 0x01, 0x04, 0xe0,
+ 0x8b, 0xff, 0x01, 0x10, 0x00, 0x46, 0x00, 0xab, 0x00, 0x11, 0x01, 0x01,
+ 0x10, 0x0e, 0xbf, 0x00,
+ 0x02, 0x01, 0xeb, 0xf0, 0x04, 0x0f, 0xdd, 0x21, 0x21, 0xce, 0xff, 0x00,
+ 0x10, 0x00, 0x0f, 0x2f,
+ 0x0e, 0xe0, 0xff, 0xda, 0x20, 0x21, 0xe0, 0x0f, 0x20, 0xbe, 0xdf, 0xff,
+ 0x1a, 0x7f, 0x00, 0xde,
+ 0xdc, 0x31, 0x00, 0xe9, 0x2f, 0xed, 0x0d, 0x74, 0x70, 0x3d, 0x0b, 0x00,
+ 0x00, 0x02, 0xf2, 0x00,
+ 0x00, 0x20, 0x20, 0x00, 0xce, 0xf1, 0xbe, 0x0b, 0x22, 0xbd, 0xcc, 0x35,
+ 0x20, 0xdc, 0x12, 0x55,
+ 0x00, 0xcd, 0x00, 0x03, 0x03, 0x00, 0xf0, 0xcd, 0xef, 0xd4, 0xe4, 0xd1,
+ 0xf1, 0xd0, 0xb0, 0x10,
+ 0x47, 0xc4, 0xe0, 0x31, 0x1e, 0x30, 0x25, 0x80, 0xfd, 0x00, 0x03, 0x11,
+ 0x03, 0xfe, 0xee, 0x1f,
+ 0x03, 0xd1, 0xcc, 0x00, 0x41, 0xcb, 0xee, 0xf0, 0x24, 0x1e, 0xc9, 0x30,
+ 0x70, 0x0f, 0xfe, 0x00,
+ 0x40, 0x12, 0x0d, 0xeb, 0x2f, 0x40, 0x0d, 0x31, 0x00, 0xa8, 0x0f, 0x00,
+ 0x00, 0xcc, 0x0f, 0x43,
+ 0x1e, 0x08, 0x20, 0x10, 0xf0, 0xe0, 0x2e, 0x20, 0xaf, 0x01, 0x43, 0x10,
+ 0xfe, 0xf0, 0x23, 0x00,
+ 0xdc, 0xb1, 0xf1, 0xed, 0x1f, 0x57, 0xe0, 0xcd, 0x10, 0x21, 0xf2, 0x04,
+ 0x54, 0xff, 0xde, 0x15,
+ 0x10, 0xe0, 0x03, 0xd4, 0xae, 0x11, 0x04, 0xd0, 0x02, 0x42, 0x02, 0xe1,
+ 0xde, 0x51, 0x57, 0x00,
+ 0xee, 0x23, 0x14, 0xe0, 0xfe, 0x00, 0x2f, 0x00, 0xe0, 0xd0, 0x00, 0x70,
+ 0x20, 0xc8, 0xef, 0x27,
+ 0x20, 0xfd, 0x40, 0x41, 0xff, 0xfe, 0x51, 0x01, 0x10, 0x20, 0x2e, 0x0f,
+ 0x10, 0x53, 0x00, 0x0c,
+ 0x40, 0x20, 0x21, 0xe0, 0xec, 0x02, 0x46, 0x0f, 0xec, 0x40, 0x71, 0x11,
+ 0x0e, 0x00, 0x3e, 0x0d,
+ 0x34, 0xf3, 0x00, 0x37, 0x76, 0xff, 0xed, 0x33, 0x35, 0xf0, 0x01, 0xe0,
+ 0x00, 0x12, 0x01, 0xd0,
+ 0xef, 0x10, 0x56, 0x12, 0xf0, 0x00, 0x61, 0x04, 0x02, 0xe2, 0x20, 0x33,
+ 0x02, 0xa0, 0x03, 0xf5,
+ 0xf4, 0xe1, 0x02, 0xd1, 0x13, 0x75, 0x00, 0xc1, 0x03, 0x15, 0x21, 0x00,
+ 0xf0, 0xe1, 0x36, 0x52,
+ 0xde, 0xfe, 0x12, 0xf1, 0xe0, 0x22, 0x31, 0x00, 0xe0, 0xd6, 0xe0, 0x9e,
+ 0xf0, 0x01, 0xc0, 0x2c,
+ 0x73, 0x2f, 0xdc, 0xf4, 0x22, 0x0e, 0x1b, 0x61, 0x11, 0x20, 0x0b, 0xe0,
+ 0x22, 0x10, 0x0f, 0x0f,
+ 0xdc, 0xde, 0x70, 0x12, 0x0d, 0xfa, 0x0f, 0x0f, 0x0e, 0xed, 0x0e, 0x7e,
+ 0x31, 0xd0, 0xed, 0x66,
+ 0x10, 0xfc, 0x00, 0x22, 0x00, 0xec, 0x0e, 0x0f, 0xde, 0xcc, 0x10, 0x20,
+ 0xc9, 0x00, 0x50, 0x01,
+ 0xf0, 0x00, 0x40, 0xde, 0xf2, 0x25, 0x10, 0xbd, 0xcd, 0x06, 0x01, 0xe0,
+ 0x01, 0xc0, 0xfe, 0x01,
+ 0x02, 0xe0, 0x10, 0x67, 0x00, 0xf0, 0xf0, 0xf0, 0xf1, 0xe1, 0xae, 0x0e,
+ 0x14, 0x01, 0xe3, 0xbc,
+ 0xca, 0xf0, 0x07, 0xf0, 0xef, 0x1f, 0x20, 0xcc, 0x00, 0x73, 0xf0, 0xef,
+ 0x01, 0x2f, 0x0b, 0x00,
+ 0x1f, 0x00, 0x30, 0x40, 0x30, 0xf0, 0xab, 0x0f, 0x0f, 0x10, 0x03, 0x0d,
+ 0xc8, 0x30, 0x71, 0x0f,
+ 0x0c, 0x52, 0x10, 0xfc, 0x0e, 0x00, 0x00, 0x1f, 0x43, 0x11, 0xfc, 0x00,
+ 0x52, 0xf0, 0xdb, 0xf2,
+ 0x21, 0xfe, 0xee, 0x31, 0x0e, 0xcf, 0x03, 0xe0, 0x1f, 0x55, 0x24, 0xff,
+ 0xda, 0x10, 0x30, 0xf4,
+ 0xb0, 0xe0, 0xe1, 0xe1, 0x03, 0x02, 0x81, 0xdf, 0xe4, 0x16, 0x00, 0xc0,
+ 0xf1, 0x02, 0x13, 0xe0,
+ 0xc1, 0x27, 0xe1, 0xae, 0x00, 0x35, 0x20, 0xc0, 0xe0, 0xe3, 0xe0, 0xc1,
+ 0xe0, 0xf1, 0xe1, 0xc1,
+ 0xe1, 0x12, 0x0d, 0x9b, 0x00, 0x0e, 0x05, 0x01, 0xca, 0x1e, 0x50, 0x11,
+ 0x21, 0x0f, 0xcc, 0x00,
+ 0x31, 0x20, 0x1e, 0x21, 0xee, 0xec, 0x54, 0x0e, 0xe8, 0x2f, 0x50, 0xef,
+ 0xfe, 0x10, 0x1d, 0x1d,
+ 0x0f, 0x1e, 0x5f, 0x10, 0x33, 0x2e, 0xf8, 0x20, 0x52, 0xfe, 0xdb, 0xf0,
+ 0xc3, 0x20, 0x50, 0xdb,
+ 0xad, 0x00, 0x00, 0x0f, 0x11, 0x33, 0xee, 0xca, 0x10, 0x1e, 0x00, 0x02,
+ 0x04, 0x8f, 0xfc, 0x00,
+ 0x12, 0xdf, 0xcd, 0x11, 0x00, 0xf0, 0x04, 0xef, 0xcd, 0xff, 0x0f, 0x30,
+ 0xe2, 0xe2, 0x1e, 0xe8,
+ 0x00, 0x00, 0xd0, 0xd1, 0x8f, 0x8b, 0x00, 0x01, 0x00, 0xfd, 0x00, 0x0e,
+ 0xea, 0xcf, 0x00, 0x10,
+ 0x0e, 0xee, 0x0f, 0x20, 0x0c, 0x0f, 0x1c, 0xfb, 0x51, 0x32, 0xde, 0xdd,
+ 0x03, 0x26, 0xed, 0x8b,
+ 0xf2, 0x53, 0x0c, 0xfe, 0x12, 0x33, 0xec, 0xba, 0x10, 0x50, 0x02, 0x10,
+ 0x00, 0x0f, 0x2f, 0x20,
+ 0x23, 0xe0, 0x03, 0x24, 0x00, 0xec, 0xf0, 0x10, 0x03, 0xe1, 0xe6, 0x00,
+ 0xee, 0x00, 0x72, 0xf1,
+ 0xff, 0x41, 0x25, 0x0f, 0x0e, 0x50, 0x05, 0xf1, 0xf1, 0xae, 0xf0, 0xe3,
+ 0xf0, 0x25, 0x04, 0xf0,
+ 0xd0, 0xf0, 0xb0, 0xe4, 0x03, 0x64, 0x00, 0xe0, 0x36, 0x51, 0x20, 0x00,
+ 0xbd, 0x03, 0x06, 0x02,
+ 0x10, 0x00, 0xdf, 0x10, 0x02, 0xf2, 0x06, 0x10, 0xd0, 0xe0, 0x00, 0x1f,
+ 0x01, 0xc0, 0x41, 0x73,
+ 0x50, 0x03, 0x00, 0x0b, 0x00, 0x10, 0x62, 0x00, 0x02, 0x27, 0x32, 0x00,
+ 0x1e, 0x1e, 0x0b, 0x2f,
+ 0x10, 0x00, 0xde, 0xeb, 0x3f, 0x70, 0x6e, 0xf9, 0xe0, 0x24, 0x30, 0x2e,
+ 0x31, 0x00, 0xee, 0x00,
+ 0x45, 0x1f, 0x0d, 0x10, 0x44, 0xbd, 0xfe, 0x00, 0x43, 0xff, 0xdc, 0x21,
+ 0x34, 0x0f, 0x0e, 0x10,
+ 0xf1, 0xa0, 0xe3, 0x03, 0x0a, 0xfe, 0x04, 0x23, 0x00, 0xad, 0xde, 0xf4,
+ 0x04, 0xb1, 0x04, 0x30,
+ 0x0c, 0x00, 0x05, 0xf1, 0xc0, 0xe0, 0x11, 0xe0, 0x9e, 0x00, 0x17, 0x02,
+ 0xd0, 0xce, 0x00, 0x00,
+ 0x00, 0x10, 0xaf, 0xcd, 0x07, 0x32, 0xdd, 0x1e, 0x61, 0x00, 0x10, 0x10,
+ 0x0f, 0xfa, 0xf1, 0x00,
+ 0x21, 0x31, 0x02, 0x1d, 0x28, 0x4f, 0x00, 0xd0, 0x00, 0x70, 0x1c, 0x0e,
+ 0x20, 0x6e, 0x0a, 0x00,
+ 0x51, 0x20, 0x0f, 0x0e, 0x2e, 0x00, 0x40, 0x23, 0x10, 0x11, 0x20, 0x0e,
+ 0xe0, 0xdc, 0x31, 0x37,
+ 0xe1, 0xc1, 0x01, 0x2f, 0x60, 0x3f, 0xdc, 0x03, 0x77, 0xf1, 0x0e, 0xe0,
+ 0xf4, 0xd1, 0x02, 0x22,
+ 0x11, 0x12, 0x81, 0xc5, 0x07, 0x00, 0xcf, 0xf1, 0x05, 0xf0, 0x32, 0x10,
+ 0xe0, 0x00, 0x55, 0x01,
+ 0xe0, 0xf0, 0x02, 0xf2, 0xe1, 0x00, 0x52, 0x00, 0xa0, 0x00, 0xf5, 0xf2,
+ 0xf0, 0xfd, 0x00, 0x02,
+ 0x04, 0x22, 0x0e, 0x0b, 0x41, 0x10, 0x1e, 0xed, 0xce, 0x61, 0x33, 0x08,
+ 0x20, 0x31, 0x01, 0x30,
+ 0x0d, 0xea, 0x20, 0x70, 0xfe, 0xed, 0xe0, 0x0e, 0x0b, 0x4e, 0x2c, 0x0e,
+ 0x0f, 0x70, 0x13, 0xfc,
+ 0xed, 0x30, 0x50, 0x1f, 0xff, 0x02, 0x01, 0x0b, 0xac, 0xff, 0x02, 0x0f,
+ 0xcd, 0x24, 0x2f, 0x19,
+ 0x30, 0xd3, 0x8f, 0xec, 0x13, 0x13, 0x0f, 0xff, 0xf0, 0xf1, 0xd3, 0xf7,
+ 0xe0, 0x90, 0xef, 0x01,
+ 0x02, 0xe0, 0xf3, 0x16, 0x22, 0xd0, 0xfe, 0xee, 0xf2, 0xf4, 0xe2, 0x51,
+ 0x01, 0xcd, 0xde, 0x32,
+ 0x25, 0xcf, 0x00, 0xd1, 0x8d, 0xe1, 0x00, 0x03, 0x13, 0x0f, 0x61, 0x0c,
+ 0xd8, 0x10, 0x20, 0x2d,
+ 0x1f, 0x30, 0x20, 0xc8, 0xff, 0x72, 0x10, 0x0a, 0x21, 0x21, 0x01, 0x00,
+ 0x0e, 0x0e, 0xfd, 0x3f,
+ 0x7f, 0x1e, 0x00, 0x02, 0x2b, 0x1b, 0x60, 0x0e, 0x2f, 0x31, 0x21, 0x21,
+ 0x3e, 0x2c, 0x51, 0x11,
+ 0x11, 0x00, 0xdf, 0xcc, 0xe0, 0x25, 0x62, 0xfc, 0x00, 0x42, 0xff, 0xec,
+ 0x13, 0x12, 0xf0, 0x31,
+ 0x4f, 0x20, 0x37, 0xe1, 0x33, 0x12, 0x8b, 0xd0, 0x07, 0x01, 0xa1, 0x01,
+ 0x10, 0x00, 0xe2, 0x01,
+ 0x15, 0xf1, 0x01, 0xe1, 0x00, 0x30, 0x24, 0x23, 0x04, 0xd0, 0x31, 0x02,
+ 0x8e, 0xc0, 0x14, 0xf4,
+ 0xe3, 0xb1, 0xf0, 0xf0, 0x01, 0x07, 0xe1, 0xe0, 0x00, 0x10, 0xc0, 0x31,
+ 0x50, 0xcd, 0x02, 0x37,
+ 0x50, 0x00, 0xe0, 0x42, 0x23, 0xef, 0x03, 0x10, 0xfc, 0xde, 0xfd, 0x00,
+ 0x0c, 0x4b, 0x12, 0xdf,
+ 0xca, 0x50, 0x00, 0xec, 0x4f, 0x70, 0x11, 0x0c, 0x0e, 0x00, 0x01, 0xf0,
+ 0xe8, 0x10, 0x40, 0xed,
+ 0xdf, 0x00, 0x22, 0x0e, 0x4c, 0x1f, 0xef, 0xaf, 0x0e, 0x50, 0x00, 0xfb,
+ 0x01, 0x03, 0xfa, 0xef,
+ 0x1f, 0x00, 0x9f, 0x01, 0x24, 0xdd, 0xd0, 0x12, 0x0d, 0x0d, 0x01, 0xe4,
+ 0xa0, 0xef, 0x01, 0x14,
+ 0x1d, 0xe9, 0xd0, 0x00, 0xf6, 0xf0, 0xcd, 0x90, 0xff, 0xe1, 0xf1, 0x01,
+ 0xcd, 0xef, 0x00, 0xf1,
+ 0xcf, 0x0d, 0xfe, 0x0f, 0x05, 0xcf, 0xc8, 0x10, 0xff, 0xbe, 0x0f, 0x30,
+ 0x00, 0xf3, 0xee, 0x0c,
+ 0xe0, 0xe0, 0x1f, 0x7e, 0x0d, 0x0f, 0x0f, 0xee, 0xc8, 0x0b, 0x30, 0x21,
+ 0xf0, 0x2d, 0x7e, 0x50,
+ 0x10, 0x0d, 0xf1, 0x13, 0x0d, 0x0a, 0x01, 0x40, 0x00, 0x2f, 0xed, 0x8e,
+ 0xf5, 0x11, 0x0b, 0x0f,
+ 0x10, 0x02, 0xf3, 0xfe, 0xfc, 0x40, 0x4c, 0xf0, 0xe5, 0x03, 0xdd, 0x9d,
+ 0x00, 0xe2, 0xd1, 0x05,
+ 0x00, 0xef, 0x00, 0xb2, 0xd0, 0xd0, 0xf1, 0x17, 0x11, 0xf2, 0x02, 0x01,
+ 0xb0, 0xf0, 0x04, 0xc0,
+ 0x12, 0x10, 0xac, 0xe0, 0x05, 0xd0, 0x8d, 0x02, 0x12, 0xfe, 0xe0, 0xe2,
+ 0xf0, 0xf8, 0xee, 0x0f,
+ 0xe0, 0xfd, 0x0f, 0x7f, 0x0c, 0x2f, 0x00, 0xe0, 0xf6, 0x22, 0x0c, 0x1c,
+ 0x71, 0x30, 0xde, 0x0f,
+ 0x00, 0xff, 0xdc, 0x0e, 0x0b, 0x4d, 0x3f, 0x40, 0x1f, 0x0b, 0x51, 0x02,
+ 0x10, 0x3c, 0x00, 0x30,
+ 0x0e, 0xfc, 0x11, 0x12, 0xff, 0x10, 0x63, 0xfd, 0xea, 0xef, 0x41, 0x44,
+ 0x1e, 0x40, 0x65, 0x00,
+ 0xef, 0x1f, 0x10, 0x02, 0x00, 0xd1, 0xff, 0x0e, 0x04, 0x57, 0x06, 0xdd,
+ 0xef, 0x20, 0x34, 0x11,
+ 0x11, 0x00, 0xd0, 0xc0, 0x71, 0x73, 0xf0, 0x03, 0x44, 0xfd, 0xed, 0x04,
+ 0x03, 0x0f, 0xbe, 0x01,
+ 0x06, 0x21, 0xff, 0xe0, 0x33, 0x04, 0xdf, 0xbd, 0x0d, 0x2e, 0x44, 0x24,
+ 0x0e, 0xde, 0x00, 0x40,
+ 0x1e, 0xff, 0x05, 0x14, 0x62, 0x32, 0x00, 0xff, 0x31, 0x11, 0x16, 0x21,
+ 0xd0, 0x0f, 0x3e, 0x7c,
+ 0x50, 0x26, 0x20, 0x0f, 0x2d, 0x31, 0x77, 0x10, 0x11, 0x01, 0x10, 0x21,
+ 0x43, 0x00, 0xe0, 0x00,
+ 0x25, 0xf2, 0xd3, 0x04, 0x30, 0x1e, 0x30, 0x51, 0x24, 0x44, 0x40, 0x10,
+ 0x01, 0xe2, 0xf0, 0x30,
+ 0x53, 0xe0, 0xf2, 0x07, 0xc2, 0xf1, 0x04, 0xf1, 0xd1, 0xe3, 0x06, 0xb0,
+ 0xc0, 0x35, 0x74, 0x00,
+ 0x0f, 0x22, 0x11, 0xf0, 0x11, 0x64, 0x01, 0xf1, 0x05, 0x0f, 0xfe, 0xe2,
+ 0x77, 0x01, 0xe0, 0xd0,
+ 0x12, 0xf1, 0x9d, 0x00, 0x11, 0x11, 0x0f, 0x0e, 0x14, 0x13, 0xff, 0x01,
+ 0x33, 0x70, 0x10, 0x21,
+ 0x07, 0x21, 0x11, 0x01, 0xff, 0xfb, 0x0f, 0x1f, 0x0b, 0x1f, 0x31, 0xd0,
+ 0x2c, 0x70, 0x7d, 0x0e,
+ 0xf0, 0x0f, 0x2d, 0x3f, 0x1e, 0x1b, 0x1e, 0x2f, 0x03, 0x10, 0x2a, 0x1d,
+ 0xbf, 0x02, 0x13, 0xe9,
+ 0xee, 0x32, 0x51, 0x0d, 0x0d, 0xf0, 0xf0, 0xdf, 0x02, 0xf0, 0xa8, 0xfe,
+ 0x11, 0x03, 0xe0, 0xf2,
+ 0xa0, 0xa9, 0xf0, 0x01, 0x02, 0xd1, 0xe0, 0xde, 0xe0, 0x37, 0x62, 0xef,
+ 0xfe, 0xd1, 0xe4, 0xf0,
+ 0xdf, 0xfe, 0xcf, 0xe1, 0x06, 0xf0, 0xc0, 0x02, 0xa0, 0xd0, 0x02, 0xe3,
+ 0xad, 0x01, 0x11, 0x0a,
+ 0x00, 0xf1, 0xb0, 0x00, 0xfd, 0x0c, 0x40, 0x04, 0xeb, 0x0f, 0x42, 0x11,
+ 0xfc, 0xff, 0x00, 0x01,
+ 0x0e, 0xa9, 0x1f, 0x5e, 0x0f, 0x0e, 0x0d, 0x2d, 0x1f, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x1c, 0x4d, 0x71,
+ 0x43, 0xf9, 0xee, 0x0f, 0x0f, 0x10, 0xff, 0xff, 0x22, 0x3f, 0xf9, 0x00,
+ 0x50, 0x11, 0x0f, 0x1f,
+ 0x0e, 0x5e, 0x00, 0xd3, 0xc0, 0xde, 0x12, 0x56, 0x0f, 0xbd, 0x00, 0x05,
+ 0xe0, 0xf2, 0xf6, 0xb0,
+ 0xef, 0x14, 0x21, 0xe0, 0x03, 0x17, 0xd0, 0x9f, 0x00, 0x23, 0xf1, 0xf0,
+ 0x23, 0xf1, 0xcf, 0x02,
+ 0x07, 0xc0, 0x03, 0x01, 0xa0, 0xff, 0x00, 0x36, 0xe0, 0xc0, 0xef, 0xef,
+ 0x00, 0x00, 0x12, 0x10,
+ 0x00, 0x20, 0x01, 0x00, 0x77, 0x41, 0xee, 0x0f, 0x23, 0x00, 0xab, 0x0f,
+ 0x2e, 0x0b, 0x0f, 0x20,
+ 0xf0, 0xcb, 0x00, 0x1d, 0x0f, 0x4f, 0x20, 0x2f, 0x10, 0x0b, 0x3d, 0x0e,
+ 0xef, 0xf0, 0x10, 0xcc,
+ 0xcb, 0x0f, 0x2f, 0xcd, 0xb0, 0x00, 0x0d, 0x71, 0x20, 0xc8, 0xee, 0x00,
+ 0x02, 0x0e, 0xcd, 0x00,
+ 0x00, 0xdb, 0x12, 0x02, 0xbe, 0xca, 0xe0, 0xe0, 0xe0, 0xe0, 0xf3, 0xf0,
+ 0xec, 0xc0, 0x00, 0xce,
+ 0xbf, 0x15, 0x10, 0xfc, 0xef, 0xf0, 0xe1, 0xe0, 0xde, 0x2f, 0x02, 0x82,
+ 0xce, 0xfb, 0x11, 0x14,
+ 0xde, 0xdf, 0x00, 0x1f, 0xf9, 0xdf, 0xbf, 0x00, 0x00, 0x0e, 0xec, 0xed,
+ 0x60, 0x65, 0x00, 0xdb,
+ 0x00, 0x03, 0x0f, 0xee, 0x20, 0x1f, 0xdd, 0x12, 0x32, 0x0b, 0xbb, 0x00,
+ 0x00, 0x11, 0x7e, 0x4f,
+ 0x0c, 0x10, 0x43, 0x10, 0x0e, 0x00, 0x2f, 0x1f, 0x20, 0xf0, 0xde, 0xe4,
+ 0x04, 0x20, 0x41, 0x45,
+ 0x10, 0x10, 0x0d, 0x5f, 0x32, 0x17, 0xf0, 0x11, 0x60, 0x42, 0x12, 0x0f,
+ 0xcb, 0x00, 0x14, 0x05,
+ 0xf2, 0xa0, 0x00, 0x00, 0x22, 0xf5, 0xc2, 0x02, 0xf2, 0x37, 0x10, 0xc0,
+ 0x00, 0x10, 0x53, 0x00,
+ 0x15, 0x12, 0xf0, 0xe0, 0xf1, 0xf1, 0x06, 0x02, 0xe0, 0xe1, 0xe1, 0x04,
+ 0x11, 0x8f, 0x9f, 0xf2,
+ 0x02, 0xf0, 0x0d, 0x00, 0x25, 0x12, 0x20, 0x2e, 0x13, 0xd4, 0x04, 0x73,
+ 0x0e, 0x0f, 0x05, 0x00,
+ 0x1e, 0x62, 0x01, 0xca, 0xf0, 0x00, 0x22, 0x0e, 0xec, 0x0e, 0x01, 0x01,
+ 0x53, 0x00, 0x4c, 0x00,
+ 0x18, 0x09, 0x89, 0x01, 0x2a, 0x06, 0xd8, 0x05, 0x63, 0xf8, 0xf0, 0x21,
+ 0x12, 0xbe, 0xef, 0x27,
+ 0xf0, 0xce, 0x00, 0xe1, 0x26, 0x40, 0xfe, 0x00, 0xd2, 0x8f, 0xe0, 0x30,
+ 0x30, 0x26, 0x00, 0xde,
+ 0x3e, 0x62, 0xd0, 0xc0, 0x01, 0x03, 0xff, 0x2e, 0x0e, 0xbb, 0xf0, 0x27,
+ 0x53, 0xe0, 0xde, 0xff,
+ 0xff, 0x10, 0x62, 0x22, 0xfb, 0xde, 0x20, 0x02, 0x00, 0x0f, 0x1f, 0x0d,
+ 0x0d, 0x27, 0x76, 0xdf,
+ 0xed, 0x0f, 0x51, 0xf1, 0xb0, 0x0f, 0xff, 0x0c, 0x0e, 0x2f, 0x2e, 0x60,
+ 0x05, 0xf0, 0xf3, 0x0e,
+ 0x1e, 0x24, 0x10, 0x00, 0xf5, 0x02, 0x00, 0xbb, 0xfe, 0x00, 0x00, 0xf0,
+ 0x16, 0x00, 0xce, 0x3e,
+ 0x70, 0x02, 0x30, 0x24, 0x10, 0xcf, 0x00, 0xf6, 0xcf, 0xff, 0xe1, 0xf0,
+ 0x0e, 0x33, 0xd0, 0xae,
+ 0x01, 0x15, 0x00, 0x01, 0x12, 0xe0, 0x0c, 0x70, 0x3e, 0x10, 0xf0, 0x9e,
+ 0xfc, 0x06, 0x2f, 0xec,
+ 0xdd, 0x27, 0x32, 0xcd, 0xef, 0xf1, 0xd2, 0x12, 0x41, 0x10, 0xf1, 0x0f,
+ 0x6c, 0x3f, 0x0e, 0x0f,
+ 0xfe, 0x12, 0x43, 0xee, 0x0d, 0x14, 0x2f, 0xf8, 0x40, 0x22, 0x8e, 0xff,
+ 0xfd, 0xef, 0x0f, 0x02,
+ 0xff, 0x08, 0x0e, 0x0d, 0x30, 0x74, 0x41, 0xee, 0x00, 0x23, 0x12, 0x07,
+ 0x00, 0x30, 0x4f, 0x0e,
+ 0xf0, 0xf2, 0xe0, 0xbd, 0xec, 0x04, 0x03, 0xad, 0x0e, 0x13, 0x1e, 0x0d,
+ 0x77, 0x13, 0xfd, 0xbd,
+ 0x03, 0x16, 0x0f, 0x10, 0x12, 0x0f, 0xda, 0x13, 0x44, 0xb0, 0x00, 0x0f,
+ 0xfd, 0xdf, 0x11, 0x34,
+ 0x23, 0xee, 0xb9, 0x00, 0x43, 0xf2, 0xde, 0xfc, 0x41, 0x01, 0xe0, 0xe0,
+ 0x10, 0x00, 0x2f, 0x10,
+ 0x16, 0xf1, 0xaf, 0xec, 0x31, 0x73, 0x01, 0x0f, 0x0d, 0x0d, 0xee, 0x00,
+ 0x24, 0x01, 0x9e, 0x00,
+ 0x20, 0x1a, 0x10, 0x56, 0xf0, 0xde, 0x00, 0xf0, 0xee, 0x0f, 0x10, 0x1e,
+ 0x00, 0xdd, 0x1b, 0x5e,
+ 0x00, 0xf3, 0x01, 0x65, 0x20, 0xfd, 0xe0, 0x57, 0x02, 0xfd, 0x0f, 0x61,
+ 0xf2, 0xc0, 0x00, 0x0b,
+ 0xfe, 0xf0, 0x26, 0x31, 0x3f, 0x2d, 0x10, 0xe0, 0xd1, 0x33, 0x00, 0xdf,
+ 0x34, 0x23, 0xae, 0x0f,
+ 0x22, 0xad, 0xe0, 0xf7, 0xc0, 0xec, 0x04, 0x41, 0xdd, 0x0e, 0x73, 0x02,
+ 0xd9, 0xf0, 0x42, 0x31,
+ 0xee, 0xf0, 0x00, 0xfd, 0x0d, 0x03, 0xe5, 0xc2, 0x00, 0x0f, 0xbe, 0xf0,
+ 0x05, 0x04, 0xf1, 0x1e,
+ 0x7d, 0x50, 0xe4, 0xf3, 0x0f, 0x08, 0x00, 0x21, 0x41, 0x10, 0x10, 0xd0,
+ 0xe0, 0x0d, 0x11, 0x01,
+ 0x9d, 0x04, 0x12, 0x0b, 0xac, 0x02, 0x12, 0x0c, 0x0d, 0x00, 0x43, 0x00,
+ 0x1f, 0xfc, 0x0f, 0x13,
+ 0x47, 0x20, 0x1f, 0x2d, 0x01, 0x13, 0xde, 0x8d, 0x00, 0x02, 0x02, 0xfd,
+ 0xf8, 0x1d, 0x30, 0x14,
+ 0x21, 0xfd, 0x8e, 0x00, 0x02, 0x20, 0x2f, 0x35, 0xf0, 0x9d, 0x00, 0x11,
+ 0xf0, 0xe2, 0x03, 0x0e,
+ 0x0d, 0x17, 0xf1, 0xe1, 0x02, 0xdd, 0x0f, 0x76, 0xf0, 0xce, 0x10, 0x20,
+ 0x03, 0x02, 0xfc, 0xbc,
+ 0x21, 0x04, 0xdf, 0xe1, 0x05, 0xd0, 0xdd, 0x52, 0x77, 0x00, 0xef, 0x10,
+ 0x30, 0xf0, 0xcf, 0xf2,
+ 0x00, 0x1b, 0x4f, 0x10, 0x01, 0xe0, 0x35, 0x20, 0xde, 0x00, 0x77, 0x00,
+ 0xcd, 0xfe, 0x02, 0x12,
+ 0x0e, 0x0e, 0x11, 0xe0, 0xe9, 0x30, 0x41, 0xff, 0xef, 0x50, 0x31, 0x42,
+ 0x33, 0xfe, 0xeb, 0xff,
+ 0x00, 0x13, 0xf0, 0x9f, 0x0c, 0x0f, 0x33, 0x32, 0x0e, 0x00, 0x2e, 0xb8,
+ 0xf0, 0x24, 0x50, 0x0d,
+ 0x10, 0x53, 0x03, 0xef, 0xef, 0xf2, 0xf3, 0x10, 0xfb, 0xa1, 0xe5, 0x01,
+ 0xe0, 0x00, 0x52, 0xcd,
+ 0xdd, 0x11, 0x23, 0x12, 0x05, 0xee, 0x0b, 0x60, 0x21, 0xf0, 0xba, 0x02,
+ 0xf4, 0xee, 0xe0, 0x00,
+ 0x3f, 0x04, 0x05, 0xe1, 0xc0, 0x0c, 0x00, 0x00, 0x50, 0x11, 0x00, 0x00,
+ 0x30, 0x2c, 0x70, 0x13,
+ 0x13, 0x10, 0x0e, 0xfc, 0xdf, 0xf0, 0x03, 0xeb, 0xad, 0x00, 0x22, 0xfe,
+ 0xd9, 0xf0, 0x00, 0x0e,
+ 0xd0, 0x21, 0x75, 0x4c, 0x0d, 0x52, 0x15, 0x0f, 0x0f, 0x20, 0x10, 0xd0,
+ 0x00, 0x10, 0x0c, 0xff,
+ 0xc0, 0xc0, 0x07, 0x20, 0xd0, 0xdb, 0x30, 0x4f, 0xf0, 0x01, 0x43, 0x41,
+ 0x2f, 0x1d, 0x20, 0x25,
+ 0x92, 0xbf, 0x0d, 0x10, 0x11, 0x07, 0xf0, 0xad, 0x00, 0x02, 0xd3, 0x15,
+ 0x0f, 0x0c, 0x31, 0x44,
+ 0x20, 0x2e, 0xd0, 0x9f, 0xff, 0x00, 0x21, 0xaf, 0x01, 0x02, 0x2d, 0xf0,
+ 0x03, 0x47, 0x27, 0xcf,
+ 0xeb, 0x22, 0x10, 0xee, 0x22, 0xf0, 0xcd, 0x1f, 0x70, 0x13, 0xf0, 0xd0,
+ 0x13, 0x5f, 0x0b, 0x00,
+ 0x06, 0xf0, 0x00, 0x0f, 0x0f, 0xdd, 0x10, 0x24, 0x8d, 0x0e, 0x00, 0x1f,
+ 0x0e, 0xfe, 0x32, 0x45,
+ 0x00, 0xf3, 0xf1, 0xcc, 0x10, 0x21, 0x03, 0xae, 0x0e, 0x37, 0x3f, 0xca,
+ 0x12, 0x32, 0xbf, 0xff,
+ 0x10, 0x2c, 0x00, 0x31, 0x26, 0xee, 0xcd, 0xf0, 0x24, 0x01, 0xf0, 0x42,
+ 0xce, 0xcd, 0x00, 0x43,
+ 0x04, 0xd0, 0xe0, 0x00, 0x0e, 0xbb, 0x00, 0x53, 0x13, 0xfd, 0x21, 0x32,
+ 0xcb, 0x0f, 0x02, 0xd0,
+ 0xeb, 0xe0, 0xf1, 0xb5, 0x00, 0x0e, 0x01, 0xe1, 0xd0, 0x2e, 0x3e, 0x02,
+ 0xb2, 0xf0, 0x11, 0x52,
+ 0x32, 0x2b, 0x08, 0x20, 0x73, 0x21, 0xce, 0x00, 0x12, 0xfc, 0x10, 0x34,
+ 0xe3, 0xab, 0x0e, 0x1f,
+ 0x01, 0xc0, 0xdd, 0xef, 0xfd, 0x2f, 0x71, 0x10, 0x00, 0x06, 0x51, 0x0e,
+ 0x1e, 0xf0, 0xf0, 0x15,
+ 0x34, 0x0e, 0xff, 0xd2, 0xf2, 0xfc, 0xfe, 0x00, 0xab, 0x0d, 0x0f, 0x2f,
+ 0x20, 0x05, 0x11, 0x0e,
+ 0xf8, 0x20, 0x71, 0x12, 0x02, 0xe0, 0x0f, 0x60, 0x0f, 0xfb, 0xc1, 0xf5,
+ 0xf3, 0xaf, 0x0e, 0x00,
+ 0x40, 0x01, 0x27, 0x00, 0xce, 0x10, 0x00, 0x11, 0x20, 0xff, 0xd0, 0xd0,
+ 0xef, 0xfd, 0x03, 0x07,
+ 0xc0, 0x10, 0x73, 0xf0, 0xdf, 0xff, 0x0e, 0xe0, 0xf1, 0x06, 0x10, 0x7e,
+ 0x3e, 0x0d, 0xdc, 0x01,
+ 0x35, 0xf0, 0x20, 0x72, 0x21, 0x00, 0xdf, 0x9e, 0x13, 0x0e, 0x08, 0xf0,
+ 0xd0, 0x0f, 0x0d, 0x4d,
+ 0x0f, 0x2f, 0x12, 0x37, 0x20, 0xca, 0x00, 0x50, 0x21, 0xf0, 0xbe, 0x13,
+ 0x35, 0xfe, 0xed, 0x02,
+ 0xe0, 0x00, 0xf3, 0xbf, 0x08, 0x40, 0x51, 0x22, 0x11, 0xee, 0xac, 0x02,
+ 0x42, 0x0e, 0xfd, 0x04,
+ 0x03, 0x10, 0x0f, 0xf1, 0xd4, 0xff, 0xac, 0xf1, 0x03, 0x13, 0x00, 0xec,
+ 0x33, 0x42, 0x0d, 0x0f,
+ 0x30, 0x00, 0x37, 0xbe, 0xdd, 0x00, 0x10, 0xe0, 0xf2, 0xc2, 0x01, 0x26,
+ 0xef, 0x8d, 0xf0, 0xd3,
+ 0x03, 0x25, 0x00, 0xfd, 0x2d, 0x4e, 0x11, 0xf4, 0xe0, 0x10, 0x70, 0x61,
+ 0xfe, 0x0c, 0x00, 0x2d,
+ 0x02, 0x07, 0x00, 0xea, 0xce, 0x0f, 0x32, 0xcf, 0xaa, 0x00, 0x00, 0x10,
+ 0x1f, 0x22, 0x00, 0x0b,
+ 0x00, 0x62, 0x00, 0x2e, 0x20, 0x06, 0x21, 0x22, 0xee, 0xcc, 0xd0, 0x0f,
+ 0xe2, 0x14, 0x0d, 0x1e,
+ 0x10, 0x80, 0x0e, 0xe0, 0x0d, 0x0f, 0x55, 0x01, 0xfe, 0x21, 0x36, 0x00,
+ 0x0f, 0xff, 0xee, 0xf3,
+ 0xe1, 0xf0, 0x12, 0xb3, 0x00, 0xf0, 0xb1, 0x07, 0x17, 0x30, 0x3c, 0x00,
+ 0x80, 0xf1, 0xd0, 0x00,
+ 0x32, 0x1f, 0x0b, 0x00, 0x10, 0x25, 0xcf, 0xc0, 0xf0, 0x00, 0x13, 0x02,
+ 0x9f, 0x0c, 0x00, 0x00,
+ 0xd1, 0x23, 0x30, 0x08, 0x30, 0x41, 0xf1, 0x74, 0x2f, 0xeb, 0x02, 0x23,
+ 0xe0, 0xdb, 0x10, 0xe0,
+ 0xb0, 0x11, 0x11, 0xec, 0xde, 0x30, 0x63, 0xf1, 0xbc, 0xff, 0x20, 0x71,
+ 0x03, 0x12, 0x00, 0x08,
+ 0xf0, 0xf2, 0x01, 0x01, 0x20, 0x1d, 0x10, 0xe0, 0xcf, 0x2f, 0x63, 0x00,
+ 0x0b, 0x0f, 0x0f, 0x23,
+ 0x21, 0x0f, 0x35, 0xf1, 0x0e, 0x7f, 0x14, 0xe4, 0x9e, 0x0d, 0x01, 0xfe,
+ 0xd0, 0x26, 0x1f, 0x0f,
+ 0x23, 0x24, 0xfd, 0xca, 0x00, 0x31, 0x30, 0xed, 0x02, 0x00, 0xce, 0xee,
+ 0xe0, 0xa9, 0x00, 0x16,
+ 0xe0, 0x80, 0xf0, 0x0f, 0xe0, 0x24, 0x45, 0xef, 0xfc, 0x10, 0x02, 0x00,
+ 0x00, 0xc1, 0x00, 0x3d,
+ 0x70, 0x24, 0x02, 0x02, 0x0e, 0xca, 0x12, 0x13, 0xd0, 0xc9, 0x00, 0x41,
+ 0x00, 0xe0, 0x90, 0x0e,
+ 0x0f, 0x20, 0x00, 0x00, 0x00, 0xff, 0x10, 0x70, 0x10, 0x02, 0x01, 0x0d,
+ 0x05, 0x04, 0x0f, 0x1e,
+ 0x5f, 0xd9, 0xf0, 0x23, 0x2e, 0x0b, 0xf0, 0xb0, 0x01, 0x00, 0x0d, 0x1f,
+ 0x42, 0x03, 0x0d, 0x0f,
+ 0x30, 0x20, 0xfe, 0xc0, 0xe0, 0x0e, 0xe7, 0x81, 0xf0, 0x50, 0x1b, 0xf1,
+ 0xf7, 0xf2, 0xdd, 0x00,
+ 0x01, 0x20, 0xde, 0xe0, 0xc0, 0x72, 0x21, 0xed, 0xde, 0x16, 0x01, 0x02,
+ 0xc0, 0x05, 0x22, 0x0f,
+ 0xdc, 0x04, 0xf0, 0xac, 0x0f, 0x01, 0x02, 0x20, 0x10, 0x01, 0x50, 0x30,
+ 0x0e, 0x12, 0x27, 0xd1,
+ 0xf5, 0x73, 0x0e, 0xcc, 0x01, 0x21, 0x00, 0xed, 0xde, 0x0f, 0xff, 0xef,
+ 0x8b, 0x00, 0x5f, 0x1b,
+ 0x00, 0x00, 0x33, 0x0c, 0x0e, 0x00, 0xf1, 0x07, 0x30, 0xef, 0x0c, 0x11,
+ 0x66, 0xf0, 0xbe, 0xf0,
+ 0x00, 0x41, 0x2e, 0xfd, 0x11, 0x24, 0x20, 0x1c, 0x50, 0x13, 0x10, 0x00,
+ 0xee, 0xa1, 0x06, 0x02,
+ 0xee, 0xa0, 0x00, 0x0f, 0x0f, 0x12, 0x13, 0x03, 0xd2, 0xe0, 0x0c, 0x72,
+ 0x33, 0xef, 0xf9, 0x0e,
+ 0x00, 0xe4, 0xdd, 0xdd, 0x00, 0xe2, 0xef, 0xdf, 0xd7, 0xb1, 0x01, 0x44,
+ 0xdf, 0x9d, 0x00, 0x10,
+ 0x12, 0x03, 0xed, 0x08, 0x6e, 0x40, 0x24, 0x03, 0x00, 0xed, 0xee, 0x31,
+ 0x63, 0xf0, 0xff, 0xee,
+ 0x11, 0x00, 0xde, 0xda, 0xca, 0xde, 0x32, 0x71, 0x0e, 0xfe, 0x0f, 0x1f,
+ 0x1e, 0x00, 0x36, 0x21,
+ 0x30, 0x0e, 0xff, 0x03, 0x03, 0x11, 0x20, 0xfb, 0xf0, 0x00, 0x8d, 0xdd,
+ 0x05, 0xd0, 0x00, 0x70,
+ 0x2a, 0xfc, 0x00, 0x26, 0x20, 0xe0, 0xef, 0xcf, 0x1e, 0x61, 0x11, 0x00,
+ 0x04, 0xf2, 0xd0, 0x00,
+ 0xf2, 0xc0, 0xf0, 0xe0, 0xc5, 0x06, 0x10, 0x0f, 0xa0, 0x0f, 0x6d, 0x20,
+ 0xf2, 0xd0, 0xfe, 0x24,
+ 0x26, 0xef, 0xef, 0x20, 0x20, 0xc0, 0x03, 0xf4, 0xbb, 0xcd, 0x0f, 0x22,
+ 0x13, 0x0e, 0x30, 0x71,
+ 0x0e, 0x02, 0xef, 0xd8, 0x32, 0x77, 0x42, 0x0f, 0xed, 0x0e, 0x00, 0x01,
+ 0xe5, 0x00, 0xed, 0x0e,
+ 0xfe, 0x00, 0xc0, 0xf0, 0x0d, 0x1f, 0x10, 0x00, 0x30, 0x6d, 0x02, 0xe7,
+ 0xf0, 0x0e, 0x42, 0x37,
+ 0x70, 0x0f, 0xdd, 0xdf, 0xff, 0x01, 0x03, 0x70, 0x0d, 0xec, 0x22, 0x34,
+ 0xff, 0xef, 0x43, 0x1f,
+ 0xf0, 0xc1, 0xf0, 0x0d, 0x01, 0x27, 0x0e, 0xa9, 0x12, 0x24, 0xe0, 0xef,
+ 0x00, 0xc0, 0xd1, 0x34,
+ 0x70, 0x01, 0x1f, 0x1e, 0x00, 0xb1, 0x03, 0x0f, 0x08, 0x0f, 0xe3, 0xf3,
+ 0x0e, 0x0d, 0xf2, 0xb4,
+ 0xc0, 0xe0, 0xf2, 0xee, 0x00, 0x23, 0x62, 0x0c, 0xc9, 0x11, 0x33, 0x33,
+ 0x41, 0xe8, 0x20, 0x76,
+ 0x0f, 0xde, 0x02, 0x10, 0x10, 0x41, 0xdd, 0xcd, 0x01, 0xd0, 0xfe, 0x00,
+ 0x42, 0x0b, 0x0e, 0xe0,
+ 0x00, 0x11, 0x00, 0x2f, 0x72, 0x30, 0x00, 0x04, 0xfe, 0xf8, 0x74, 0x02,
+ 0xeb, 0xef, 0x00, 0x10,
+ 0x03, 0xd0, 0x0b, 0x40, 0x40, 0xef, 0xde, 0x10, 0x45, 0x0e, 0xec, 0x00,
+ 0x10, 0xd2, 0x0f, 0x71,
+ 0x41, 0xef, 0xef, 0x01, 0x03, 0xd3, 0x03, 0x2f, 0x0e, 0x04, 0xb0, 0x11,
+ 0x46, 0xef, 0xbe, 0x02,
+ 0x05, 0x20, 0xde, 0xfd, 0x21, 0x32, 0xc5, 0xa1, 0x00, 0xf3, 0x24, 0x10,
+ 0xd0, 0xbe, 0xfd, 0x2f,
+ 0x12, 0x03, 0xe2, 0x0a, 0x40, 0x24, 0xbf, 0x0f, 0x01, 0x40, 0x01, 0x33,
+ 0x00, 0xe7, 0x07, 0x0d,
+ 0x3d, 0x11, 0xc2, 0xe0, 0x30, 0xfe, 0xde, 0x61, 0xf8, 0xbd, 0x30, 0x35,
+ 0xd0, 0xfe, 0xe0, 0xde,
+ 0x61, 0x63, 0x00, 0x1f, 0x00, 0x00, 0xef, 0xde, 0x03, 0x20, 0xfc, 0xed,
+ 0x11, 0x61, 0x3e, 0x4f,
+ 0x0c, 0xfe, 0x00, 0x00, 0xf7, 0x05, 0x30, 0x0f, 0x9c, 0x01, 0x12, 0x0f,
+ 0xef, 0xe6, 0xd2, 0xf1,
+ 0x0f, 0x0c, 0x02, 0x71, 0x21, 0x12, 0x02, 0xde, 0xbb, 0x20, 0x43, 0xee,
+ 0x0d, 0x54, 0x10, 0xfc,
+ 0xe0, 0xc3, 0xe5, 0xf0, 0xf0, 0xe0, 0xe0, 0xd2, 0xa5, 0xdf, 0xef, 0x12,
+ 0x1f, 0x2b, 0x1f, 0x30,
+ 0x41, 0x54, 0x10, 0x20, 0x30, 0x10, 0x3e, 0x0f, 0x41, 0xe4, 0x9d, 0x0e,
+ 0xdc, 0xff, 0xe0, 0xdc,
+ 0x0c, 0x01, 0x0f, 0x0d, 0x63, 0xea, 0xdb, 0x30, 0x72, 0x30, 0x20, 0x1e,
+ 0x00, 0x22, 0x43, 0x00,
+ 0xcc, 0xff, 0xf6, 0xf2, 0x00, 0x1d, 0xec, 0xf0, 0x57, 0xf0, 0xb0, 0x0c,
+ 0x00, 0x21, 0x32, 0x2f,
+ 0x3f, 0xfb, 0xcf, 0x40, 0x41, 0x00, 0x00, 0xf5, 0x90, 0xef, 0x00, 0x10,
+ 0x36, 0xe1, 0xb0, 0x00,
+ 0x1f, 0xff, 0xe0, 0x30, 0x4f, 0xf0, 0xd2, 0x10, 0x5c, 0x1e, 0x0f, 0xf7,
+ 0xe3, 0xc0, 0x0d, 0x23,
+ 0x44, 0xd0, 0xae, 0xee, 0xd1, 0x00, 0x00, 0x31, 0xf9, 0xcf, 0x10, 0x11,
+ 0x0a, 0x75, 0x34, 0xfd,
+ 0xcb, 0x01, 0x33, 0x13, 0xef, 0x0d, 0xf0, 0x00, 0x11, 0x02, 0xee, 0x2f,
+ 0xef, 0x8c, 0xdd, 0x13,
+ 0x01, 0xfa, 0xef, 0x51, 0x12, 0x1f, 0x5f, 0x00, 0x00, 0x25, 0x02, 0x88,
+ 0x00, 0x57, 0xde, 0x0f,
+ 0x11, 0x00, 0x1f, 0x11, 0xe0, 0xee, 0x53, 0x00, 0x0c, 0x02, 0x12, 0x21,
+ 0x0d, 0xbb, 0x11, 0x23,
+ 0x01, 0x0f, 0xde, 0x32, 0x10, 0xfd, 0x15, 0xf0, 0xf1, 0xbe, 0xbb, 0x45,
+ 0x10, 0xbb, 0x31, 0x34,
+ 0xce, 0xed, 0x00, 0x33, 0x53, 0xeb, 0xee, 0x02, 0x12, 0xf0, 0xde, 0x20,
+ 0x03, 0xd0, 0xd0, 0xde,
+ 0x00, 0xf0, 0xce, 0xde, 0x03, 0x03, 0x3f, 0x77, 0x70, 0xfd, 0x04, 0x0f,
+ 0xfc, 0x25, 0x0f, 0xfe,
+ 0x36, 0x00, 0xbd, 0x10, 0x22, 0x00, 0xbd, 0xef, 0xe1, 0x15, 0xff, 0xee,
+ 0x0f, 0x60, 0x11, 0x12,
+ 0x0e, 0x10, 0x01, 0x21, 0x0d, 0x4f, 0x12, 0xde, 0x0f, 0x77, 0x0f, 0xfe,
+ 0xf4, 0xeb, 0x00, 0xf2,
+ 0xdf, 0xfd, 0x30, 0x74, 0x30, 0xff, 0xcf, 0x1f, 0x0a, 0x2f, 0x32, 0x14,
+ 0xcf, 0xff, 0xed, 0x44,
+ 0x34, 0xbc, 0xe0, 0x14, 0xfe, 0x00, 0x01, 0xde, 0xce, 0x66, 0x00, 0xe0,
+ 0x0e, 0x00, 0x25, 0x1f,
+ 0xcd, 0xf0, 0x15, 0x20, 0x00, 0x1e, 0x10, 0xd4, 0xb0, 0xcd, 0xee, 0x13,
+ 0x02, 0xec, 0x00, 0xf0,
+ 0x00, 0x33, 0x32, 0x40, 0x1c, 0x0c, 0xf5, 0xa3, 0x00, 0x2f, 0x52, 0x0f,
+ 0x0d, 0x63, 0x04, 0x0e,
+ 0xeb, 0xee, 0xdf, 0x24, 0x00, 0x88, 0x10, 0x50, 0x01, 0x00, 0xf0, 0x0d,
+ 0x02, 0x01, 0x0e, 0xf0,
+ 0x01, 0x00, 0x2f, 0x0d, 0x30, 0x43, 0x23, 0xfb, 0xed, 0x21, 0x77, 0x50,
+ 0x0c, 0x00, 0x01, 0x03,
+ 0xdf, 0xe0, 0x0f, 0x30, 0x50, 0xf1, 0xa0, 0xff, 0x00, 0x14, 0x13, 0x04,
+ 0x01, 0xde, 0x04, 0x02,
+ 0x0d, 0x21, 0x27, 0xf0, 0xba, 0x0f, 0x40, 0x14, 0xe0, 0xec, 0x00, 0x03,
+ 0xc1, 0xd0, 0xd0, 0xae,
+ 0x02, 0x04, 0xad, 0xde, 0xe0, 0x23, 0x02, 0xff, 0xf2, 0x1f, 0x09, 0x72,
+ 0x32, 0x0f, 0x00, 0x04,
+ 0x00, 0x1e, 0x13, 0xf0, 0x0e, 0x73, 0x56, 0xf0, 0xec, 0xff, 0xfc, 0x01,
+ 0x00, 0xc9, 0x02, 0x14,
+ 0xed, 0x0c, 0x2f, 0x51, 0x13, 0xed, 0x0f, 0x32, 0x10, 0x2c, 0x71, 0x23,
+ 0x01, 0x01, 0xdd, 0x0e,
+ 0xdd, 0xf0, 0xe2, 0xf1, 0x04, 0xfd, 0x08, 0x2e, 0x71, 0x31, 0xdf, 0x00,
+ 0x71, 0x0d, 0x3a, 0x00,
+ 0xee, 0xf2, 0x27, 0x0f, 0x4f, 0x00, 0x80, 0xf1, 0x03, 0xe0, 0x03, 0x12,
+ 0x1d, 0xdd, 0xec, 0xde,
+ 0x37, 0x34, 0xdd, 0x3f, 0x71, 0x00, 0xef, 0x02, 0x47, 0xdf, 0x01, 0x05,
+ 0x67, 0x00, 0x33, 0x00,
+ 0x62, 0x06, 0x87, 0xa7, 0x14, 0x07, 0x7e, 0xa8, 0x00, 0xac, 0xda, 0xfb,
+ 0xfc, 0x00, 0xee, 0x0c,
+ 0x3f, 0x4e, 0x3e, 0x0e, 0x2f, 0x10, 0xfd, 0xa8, 0x10, 0x72, 0x20, 0x10,
+ 0x0d, 0x20, 0x05, 0xe1,
+ 0xbd, 0x10, 0x13, 0xf0, 0xc0, 0x00, 0x0e, 0x31, 0x22, 0xf0, 0xbf, 0x08,
+ 0x00, 0x44, 0x10, 0x2f,
+ 0x0f, 0x00, 0xc2, 0x00, 0xff, 0xf0, 0x00, 0x73, 0x10, 0xe9, 0xde, 0x00,
+ 0x14, 0x4f, 0x5f, 0x11,
+ 0xe9, 0xef, 0x44, 0x20, 0x09, 0x00, 0xf0, 0xef, 0x31, 0xef, 0x0d, 0x40,
+ 0xe1, 0xb1, 0xf0, 0xfe,
+ 0x2f, 0x41, 0xf2, 0xd1, 0xdc, 0xda, 0x40, 0x50, 0x0f, 0x0f, 0x00, 0xde,
+ 0x0a, 0x50, 0x01, 0x11,
+ 0xdd, 0xac, 0xe0, 0xe5, 0xb0, 0xd0, 0xfd, 0xf0, 0x23, 0x04, 0xb0, 0xfe,
+ 0x0e, 0x0f, 0x65, 0x14,
+ 0x01, 0xf0, 0x12, 0x24, 0x12, 0x30, 0x55, 0x03, 0xe1, 0x03, 0x25, 0xf1,
+ 0xb0, 0x04, 0x00, 0xb2,
+ 0xf3, 0xe2, 0xf0, 0x04, 0x13, 0x03, 0x04, 0x01, 0x30, 0x74, 0x52, 0x06,
+ 0x02, 0xf0, 0x02, 0x23,
+ 0x20, 0x02, 0x04, 0x05, 0xc0, 0xd0, 0x03, 0x32, 0x41, 0xef, 0x9d, 0x01,
+ 0x26, 0x20, 0x1f, 0x0e,
+ 0x30, 0xf0, 0x0e, 0x20, 0x5e, 0x0d, 0x0c, 0xf1, 0x16, 0x88, 0xff, 0x75,
+ 0x0e, 0xed, 0x13, 0xe0,
+ 0xed, 0x00, 0xf0, 0x0c, 0x52, 0x00, 0xed, 0x0f, 0x10, 0x30, 0xee, 0xdc,
+ 0x00, 0x00, 0xd0, 0xf0,
+ 0x20, 0x0c, 0xbb, 0xee, 0x11, 0x32, 0xf0, 0xcb, 0xce, 0xd0, 0x00, 0x45,
+ 0x30, 0xcc, 0x10, 0x74,
+ 0x30, 0xce, 0x03, 0x23, 0x00, 0xeb, 0x21, 0x24, 0xdf, 0x00, 0x21, 0xbf,
+ 0x01, 0x13, 0x00, 0xd0,
+ 0x0e, 0xdd, 0x36, 0x76, 0xef, 0xdd, 0x21, 0x33, 0x00, 0xf0, 0xf0, 0x0f,
+ 0x62, 0x10, 0xf0, 0xe0,
+ 0xee, 0x10, 0x73, 0x12, 0x01, 0xe0, 0xfb, 0x11, 0x51, 0x1e, 0x23, 0x01,
+ 0xa8, 0x0c, 0x13, 0x00,
+ 0xf0, 0x10, 0x03, 0xf3, 0xee, 0x1e, 0x41, 0xff, 0xf1, 0x27, 0x02, 0xbd,
+ 0x10, 0x42, 0x1f, 0x1c,
+ 0x0d, 0x55, 0x17, 0xc0, 0xbc, 0x00, 0x12, 0x01, 0xb0, 0xe0, 0xe1, 0x10,
+ 0x20, 0x02, 0x04, 0xd0,
+ 0x0e, 0x13, 0x22, 0x0e, 0xd2, 0x01, 0x03, 0x77, 0x64, 0xed, 0x04, 0x00,
+ 0x02, 0x20, 0x01, 0x24,
+ 0x01, 0xc0, 0x17, 0x01, 0xf0, 0xaf, 0x00, 0x10, 0x01, 0x06, 0xde, 0x00,
+ 0x1f, 0x3f, 0x40, 0x54,
+ 0x00, 0xc0, 0x1f, 0x23, 0x10, 0xec, 0xfe, 0x55, 0x03, 0xff, 0xad, 0x0e,
+ 0x13, 0x26, 0x0f, 0xfe,
+ 0x10, 0x13, 0x0e, 0x1f, 0x40, 0x1d, 0x0d, 0xbe, 0x0f, 0x0d, 0x08, 0x00,
+ 0x42, 0xf0, 0xc0, 0xf0,
+ 0x0d, 0x6f, 0x00, 0x00, 0xbd, 0x0b, 0x02, 0xf1, 0x09, 0x40, 0x30, 0x0e,
+ 0x00, 0xff, 0xf1, 0x13,
+ 0xfd, 0xc9, 0x01, 0x01, 0x11, 0x51, 0x21, 0xcf, 0xce, 0xe1, 0xcf, 0xfe,
+ 0xfd, 0x0b, 0x41, 0x00,
+ 0xed, 0xdf, 0x10, 0x47, 0x40, 0x30, 0x11, 0x04, 0xe1, 0xe2, 0x12, 0x0f,
+ 0x00, 0xe7, 0x02, 0xf0,
+ 0x80, 0xcc, 0x00, 0x15, 0xff, 0xce, 0x21, 0x30, 0x30, 0x01, 0xdf, 0x30,
+ 0x74, 0xe8, 0xff, 0x20,
+ 0x0f, 0x0f, 0x00, 0x21, 0x30, 0xfc, 0xaf, 0x00, 0xf2, 0x00, 0x1c, 0x31,
+ 0x12, 0x7d, 0x5c, 0x1d,
+ 0x00, 0x0f, 0xcb, 0x0e, 0xdc, 0x2e, 0x40, 0x30, 0x00, 0xf0, 0x03, 0xed,
+ 0xa8, 0xff, 0xf1, 0x22,
+ 0x10, 0x0c, 0x0f, 0x2e, 0x7f, 0x4e, 0x1a, 0x00, 0x03, 0xbe, 0xe8, 0x30,
+ 0x22, 0x9e, 0xff, 0x0f,
+ 0x1e, 0x0f, 0xf1, 0xe3, 0xe2, 0x00, 0xc8, 0x00, 0x10, 0xf3, 0xcf, 0xfe,
+ 0x23, 0x61, 0x1f, 0x2e,
+ 0x02, 0x07, 0x34, 0x21, 0x02, 0xbe, 0x22, 0x47, 0xd3, 0xd0, 0x0f, 0xc1,
+ 0xf1, 0x15, 0xe0, 0xde,
+ 0x14, 0x11, 0x00, 0x11, 0x74, 0x11, 0x10, 0x01, 0x13, 0x01, 0x01, 0x32,
+ 0x44, 0x02, 0xc1, 0x04,
+ 0xc0, 0x00, 0x37, 0xb3, 0xdf, 0x20, 0x20, 0x10, 0x65, 0x02, 0x0d, 0xff,
+ 0x00, 0x1f, 0x20, 0x2e,
+ 0x0f, 0x50, 0x00, 0x03, 0x12, 0xa8, 0xfd, 0x02, 0x04, 0xf2, 0xcd, 0xed,
+ 0x0e, 0x20, 0x01, 0xad,
+ 0xff, 0xfc, 0x0d, 0x00, 0x42, 0x32, 0x28, 0x0d, 0x00, 0x00, 0x2f, 0xec,
+ 0x0e, 0xfe, 0x8c, 0xef,
+ 0xd1, 0xeb, 0x0c, 0x0f, 0xae, 0xed, 0x00, 0xf1, 0x0f, 0xe8, 0x10, 0x70,
+ 0x40, 0x11, 0x00, 0xff,
+ 0x12, 0x00, 0x00, 0x31, 0x88, 0x10, 0x55, 0xdc, 0x01, 0x12, 0xee, 0x10,
+ 0x10, 0xce, 0x00, 0x34,
+ 0xce, 0x00, 0x3f, 0x00, 0x00, 0x1e, 0x70, 0x01, 0xfc, 0xfe, 0x00, 0x43,
+ 0x0f, 0xfa, 0x0f, 0x00,
+ 0x00, 0xfd, 0x20, 0x10, 0xeb, 0x0f, 0xfd, 0xdd, 0x1e, 0x08, 0x70, 0x70,
+ 0x2f, 0xbe, 0x00, 0x00,
+ 0x0d, 0x0d, 0xfd, 0x02, 0x13, 0x08, 0x0c, 0x42, 0x02, 0xbb, 0x0f, 0x20,
+ 0xff, 0x0f, 0xff, 0xf0,
+ 0x0f, 0x1f, 0x0d, 0x00, 0xbc, 0xfe, 0x00, 0xe0, 0x20, 0x40, 0xd9, 0xd0,
+ 0xf1, 0x8c, 0x00, 0x11,
+ 0x00, 0x0c, 0xd0, 0x0f, 0x41, 0x10, 0x20, 0xf3, 0xf0, 0x77, 0x10, 0x00,
+ 0xe0, 0x00, 0xd0, 0xe4,
+ 0x04, 0x20, 0x0f, 0x00, 0x00, 0xc3, 0xf1, 0xe0, 0x2e, 0x72, 0x77, 0xe0,
+ 0x02, 0x11, 0x0e, 0x01,
+ 0x02, 0xf5, 0x03, 0xed, 0xce, 0x17, 0x43, 0x00, 0x00, 0xe2, 0x11, 0x54,
+ 0x23, 0x21, 0x0f, 0xde,
+ 0x14, 0x00, 0x10, 0x34, 0x32, 0x2f, 0xfd, 0x12, 0xc3, 0x80, 0xe0, 0x12,
+ 0x0c, 0x27, 0x11, 0x01,
+ 0x01, 0x2f, 0x2b, 0xdf, 0xe0, 0x00, 0x2f, 0x1d, 0x0e, 0xff, 0x8a, 0xfe,
+ 0x10, 0x32, 0x1e, 0xf0,
+ 0x80, 0xfc, 0xb9, 0xff, 0x00, 0x1e, 0x1c, 0xed, 0x00, 0x10, 0xed, 0xda,
+ 0x40, 0x51, 0x00, 0xf0,
+ 0x1e, 0x10, 0xbd, 0xc0, 0x27, 0x23, 0x0d, 0x10, 0xd0, 0xdf, 0x33, 0x34,
+ 0x10, 0x40, 0x00, 0xbf,
+ 0x0e, 0x0e, 0x16, 0x34, 0xce, 0xfe, 0x01, 0x23, 0x03, 0xfc, 0x4f, 0x00,
+ 0xa2, 0xe2, 0x05, 0x12,
+ 0x10, 0x41, 0x57, 0xe1, 0xef, 0x00, 0x13, 0xe3, 0xce, 0x20, 0x76, 0x11,
+ 0x2f, 0x0e, 0x31, 0x13,
+ 0xff, 0xce, 0xf2, 0x04, 0x45, 0x00, 0xb2, 0xe3, 0xe0, 0x03, 0x77, 0x24,
+ 0x0f, 0xfe, 0x01, 0x01,
+ 0x10, 0x02, 0x32, 0xf0, 0x0c, 0x22, 0xf3, 0x91, 0xf2, 0xe4, 0xef, 0x10,
+ 0x44, 0xc3, 0xd1, 0xd5,
+ 0xe0, 0xd0, 0xd5, 0xd1, 0xe0, 0xe0, 0x01, 0x63, 0x40, 0x1e, 0x13, 0x67,
+ 0x24, 0x21, 0x01, 0xf0,
+ 0x24, 0x26, 0xb0, 0xce, 0xe0, 0x04, 0x03, 0x00, 0xe0, 0x00, 0xf0, 0xc2,
+ 0xd4, 0xf1, 0x34, 0x72,
+ 0x70, 0x12, 0xf0, 0x03, 0x17, 0x00, 0x0f, 0x01, 0xe5, 0x01, 0x20, 0x00,
+ 0xb1, 0xcc, 0x36, 0x33,
+ 0xde, 0xef, 0x00, 0x00, 0x25, 0xff, 0xcc, 0x60, 0x43, 0x00, 0xfd, 0x20,
+ 0x20, 0x00, 0xee, 0x01,
+ 0x00, 0x0b, 0xf0, 0x01, 0x9f, 0xff, 0xdd, 0x1f, 0x42, 0xdd, 0xd9, 0x21,
+ 0x1f, 0xfa, 0x40, 0x31,
+ 0x00, 0x20, 0xf0, 0xdd, 0x20, 0x65, 0x21, 0xbe, 0xfe, 0x03, 0x21, 0xdc,
+ 0xd0, 0x03, 0xf1, 0xae,
+ 0xf0, 0xe6, 0xde, 0xee, 0x33, 0x74, 0x10, 0x00, 0xf0, 0x0f, 0x32, 0x67,
+ 0x00, 0xff, 0x04, 0x12,
+ 0x0e, 0xf0, 0xf1, 0x01, 0x43, 0x02, 0x8e, 0xe0, 0x06, 0xfe, 0x1d, 0x20,
+ 0x20, 0x12, 0x0e, 0x00,
+ 0xfd, 0x2c, 0x61, 0xfe, 0xe9, 0x00, 0x10, 0x2d, 0x0d, 0xef, 0xd2, 0x04,
+ 0x9a, 0x0f, 0x00, 0x00,
+ 0x2e, 0x1f, 0x1d, 0xda, 0x0e, 0x1f, 0x0d, 0x5e, 0x1e, 0x0d, 0xba, 0x0e,
+ 0x0f, 0x11, 0x10, 0xec,
+ 0x0c, 0x7f, 0x3f, 0x10, 0xfc, 0xbe, 0x00, 0x0d, 0x0c, 0x1f, 0x2d, 0x00,
+ 0xd0, 0xba, 0x24, 0x2f,
+ 0xd8, 0x73, 0x51, 0xab, 0x01, 0x10, 0x01, 0x01, 0xed, 0xf0, 0x01, 0xf0,
+ 0xee, 0x00, 0x13, 0x33,
+ 0x0c, 0x20, 0x21, 0x04, 0x20, 0x00, 0x00, 0x32, 0x11, 0x01, 0x33, 0xb0,
+ 0xce, 0xf0, 0xf3, 0x03,
+ 0x27, 0x77, 0xff, 0xcd, 0x23, 0x13, 0xee, 0x12, 0x34, 0xbc, 0xf0, 0x23,
+ 0x20, 0x0f, 0x1f, 0x30,
+ 0x24, 0x67, 0xe0, 0xce, 0x00, 0x32, 0x22, 0xf1, 0xf0, 0x0f, 0xbf, 0xe0,
+ 0x02, 0x11, 0x0d, 0xf8,
+ 0x20, 0x52, 0xbf, 0xfe, 0x40, 0x30, 0x0e, 0xfe, 0x02, 0xe1, 0xfd, 0xfc,
+ 0x3c, 0x50, 0x00, 0xcd,
+ 0xea, 0x0e, 0x0e, 0x6f, 0x24, 0x00, 0xc9, 0xef, 0x00, 0x0f, 0x10, 0x31,
+ 0xfe, 0xef, 0xdc, 0x0e,
+ 0x41, 0xef, 0x8c, 0x00, 0x1f, 0xfc, 0xcf, 0x1f, 0x3e, 0xe9, 0xef, 0x20,
+ 0x00, 0xad, 0x00, 0x00,
+ 0x10, 0x30, 0x0f, 0xee, 0xdd, 0x00, 0x35, 0x10, 0x21, 0x00, 0x44, 0x13,
+ 0xe0, 0x3c, 0x7e, 0x42,
+ 0xf7, 0xb1, 0xee, 0x0e, 0x00, 0xfe, 0x14, 0x65, 0xef, 0xdc, 0x01, 0x22,
+ 0x12, 0x00, 0xe0, 0x0f,
+ 0x23, 0x34, 0x20, 0x1e, 0x7e, 0x77, 0x40, 0xde, 0x0f, 0x0f, 0x00, 0x0d,
+ 0xdd, 0xeb, 0xef, 0xf0,
+ 0x21, 0x3d, 0xfa, 0xe0, 0x0f, 0x3f, 0x71, 0x71, 0x0d, 0x0d, 0x02, 0x20,
+ 0xf8, 0x0b, 0x40, 0x00,
+ 0xcd, 0x00, 0xe1, 0x01, 0x30, 0x0c, 0xe0, 0xe0, 0xdf, 0xd0, 0xf1, 0xf0,
+ 0x8c, 0xc9, 0xf0, 0x03,
+ 0x00, 0xba, 0x00, 0x10, 0x20, 0x2f, 0x10, 0x00, 0xcd, 0x10, 0x75, 0x11,
+ 0x01, 0xf0, 0xff, 0xf2,
+ 0xf4, 0xe0, 0xe2, 0xf0, 0x05, 0x24, 0x00, 0x12, 0xf0, 0xce, 0x10, 0x64,
+ 0x01, 0x25, 0x01, 0xef,
+ 0xff, 0x22, 0x63, 0x02, 0x02, 0x02, 0xf3, 0xd5, 0x13, 0x21, 0x00, 0x17,
+ 0xd0, 0x90, 0x57, 0x03,
+ 0xdd, 0x20, 0x50, 0x1f, 0x43, 0xe0, 0xdf, 0x0f, 0x44, 0x11, 0xff, 0xff,
+ 0xf0, 0xe0, 0x23, 0x03,
+ 0xcc, 0xd0, 0x21, 0x1d, 0x21, 0x03, 0xd0, 0x63, 0x1b, 0x1e, 0x21, 0x05,
+ 0xff, 0x0a, 0x71, 0x71,
+ 0x0e, 0xea, 0x02, 0xf3, 0xee, 0xed, 0xdf, 0x0f, 0xff, 0xce, 0x00, 0xdf,
+ 0xfd, 0xdb, 0xfd, 0x10,
+ 0x10, 0x3d, 0x50, 0x1e, 0x44, 0x44, 0x1f, 0x00, 0x1f, 0x0d, 0x0e, 0xe5,
+ 0x06, 0xdf, 0xbe, 0x00,
+ 0xf3, 0xf3, 0x22, 0x13, 0x8f, 0x9c, 0x00, 0x14, 0x47, 0x0e, 0xfd, 0x01,
+ 0x22, 0x0e, 0x21, 0x10,
+ 0xfa, 0x11, 0x23, 0xd0, 0xc0, 0xd0, 0x10, 0x73, 0x11, 0xfd, 0xd1, 0x07,
+ 0x01, 0x1f, 0x7f, 0x0f,
+ 0x0e, 0xef, 0xf1, 0x01, 0x31, 0x23, 0x1d, 0x00, 0xd2, 0xd3, 0x27, 0x77,
+ 0x43, 0x00, 0xd0, 0xf1,
+ 0xe4, 0xd1, 0xe0, 0x01, 0x61, 0x02, 0x15, 0x00, 0x01, 0x20, 0x34, 0x65,
+ 0x00, 0x00, 0xb1, 0xf0,
+ 0xd0, 0xf1, 0xf1, 0xee, 0xcd, 0x0f, 0x00, 0xed, 0xef, 0xb8, 0x00, 0x14,
+ 0x60, 0x20, 0x1f, 0x1c,
+ 0x11, 0x03, 0xfd, 0xec, 0xff, 0x22, 0x34, 0x00, 0xcf, 0x02, 0x14, 0xf0,
+ 0x07, 0x03, 0xaf, 0xed,
+ 0xf3, 0x07, 0x01, 0xcf, 0x89, 0x33, 0x34, 0x9d, 0x0e, 0x00, 0x21, 0x23,
+ 0x00, 0xec, 0x12, 0x11,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0xed, 0x03, 0xf4, 0xee, 0x0e, 0x72, 0x24,
+ 0xfe, 0xee, 0x31, 0x21,
+ 0xee, 0xeb, 0x00, 0x63, 0x00, 0x0c, 0x00, 0xe8, 0xd0, 0x63, 0x21, 0xee,
+ 0xde, 0xff, 0xce, 0xfd,
+ 0x45, 0x45, 0xed, 0xdc, 0x41, 0x31, 0x00, 0xed, 0x30, 0x53, 0xff, 0xca,
+ 0x20, 0x20, 0xe0, 0x9f,
+ 0x0e, 0xef, 0xeb, 0x00, 0x11, 0x0e, 0xaa, 0x01, 0x32, 0x0f, 0xfd, 0xf3,
+ 0x12, 0x1d, 0x30, 0x54,
+ 0x23, 0x0e, 0x00, 0xe2, 0x13, 0x52, 0x00, 0x0d, 0xd4, 0xf3, 0xc4, 0xe2,
+ 0x03, 0x01, 0x32, 0x01,
+ 0xb2, 0xef, 0xcb, 0x02, 0x30, 0x0e, 0x23, 0x33, 0xc8, 0xed, 0x10, 0x63,
+ 0x33, 0x46, 0x12, 0xff,
+ 0xd9, 0x20, 0x72, 0x00, 0xfd, 0xdf, 0x0d, 0x0e, 0x0d, 0x02, 0x00, 0xd8,
+ 0x00, 0x12, 0x01, 0xff,
+ 0xbc, 0x1e, 0x70, 0x40, 0x03, 0xe0, 0xfa, 0x1f, 0x20, 0x30, 0x1f, 0xea,
+ 0xe0, 0x10, 0x10, 0xcf,
+ 0xbd, 0x00, 0x03, 0x22, 0xbc, 0xed, 0xee, 0xd0, 0xf4, 0xe1, 0xce, 0xcb,
+ 0x00, 0x21, 0x20, 0x0f,
+ 0x75, 0x21, 0x0f, 0x13, 0x03, 0xd2, 0xf1, 0xc0, 0xf4, 0x07, 0x33, 0x62,
+ 0x04, 0xc0, 0x03, 0x04,
+ 0x01, 0x14, 0x76, 0x33, 0xe0, 0xc0, 0x02, 0x33, 0x02, 0xf3, 0xf2, 0xf2,
+ 0xe2, 0xf2, 0xf5, 0x00,
+ 0x02, 0x03, 0x26, 0x12, 0xe0, 0xdf, 0x12, 0x42, 0x61, 0x54, 0x00, 0xe0,
+ 0x42, 0x33, 0x0e, 0xed,
+ 0x1d, 0x60, 0x04, 0xfc, 0xee, 0x11, 0x23, 0x00, 0xed, 0x0d, 0xda, 0xdd,
+ 0xf0, 0xc1, 0xbf, 0xec,
+ 0xda, 0xfc, 0x3e, 0x1d, 0x0b, 0x50, 0x2e, 0xec, 0x1f, 0x4e, 0x0e, 0x0e,
+ 0xea, 0x50, 0x30, 0x50,
+ 0x20, 0xbd, 0xaa, 0xff, 0x00, 0xe0, 0xfc, 0x0f, 0x20, 0xf0, 0xbb, 0xff,
+ 0x0e, 0x30, 0x2f, 0x0e,
+ 0xef, 0x0f, 0x30, 0x00, 0xcb, 0x00, 0x70, 0x10, 0x01, 0x00, 0xed, 0x10,
+ 0x46, 0x00, 0xff, 0x12,
+ 0xf3, 0xaf, 0x1f, 0x40, 0x14, 0x0e, 0xca, 0x01, 0x00, 0x01, 0x0d, 0x1b,
+ 0x10, 0xe0, 0xe0, 0x01,
+ 0xd1, 0xed, 0x23, 0x75, 0x01, 0x53, 0x1d, 0xf9, 0xf0, 0x20, 0x30, 0x1e,
+ 0x5e, 0x30, 0x0f, 0xdf,
+ 0xeb, 0xfe, 0x11, 0x02, 0xfd, 0xcd, 0x0f, 0xfd, 0x89, 0xce, 0xf0, 0x13,
+ 0x2b, 0x0d, 0x4f, 0x0e,
+ 0x0a, 0x10, 0x60, 0x13, 0x2f, 0x1c, 0x1d, 0x30, 0x10, 0x10, 0xee, 0x8d,
+ 0xf0, 0xe0, 0xdd, 0xc8,
+ 0xff, 0x0f, 0x0f, 0xdf, 0xf0, 0x01, 0x00, 0x1c, 0x5e, 0x2e, 0x11, 0x25,
+ 0x00, 0x0d, 0xfe, 0x0f,
+ 0x1e, 0xce, 0x55, 0x34, 0x10, 0x1f, 0xe0, 0x91, 0xf5, 0xe0, 0xc0, 0x03,
+ 0x11, 0xe0, 0x00, 0x20,
+ 0x55, 0x10, 0x00, 0x12, 0x02, 0x0e, 0x70, 0x27, 0x04, 0xd1, 0x02, 0x02,
+ 0xce, 0xde, 0x27, 0x02,
+ 0xc1, 0x13, 0x63, 0x00, 0x0f, 0xf3, 0x17, 0x31, 0x31, 0x61, 0x00, 0xd0,
+ 0x10, 0x30, 0x03, 0xf2,
+ 0xc4, 0xf3, 0xf3, 0xdc, 0xdc, 0x0f, 0x10, 0x55, 0xf0, 0xbe, 0xfd, 0x00,
+ 0x40, 0x3e, 0x5f, 0x0d,
+ 0xf9, 0x0f, 0x10, 0x30, 0x3d, 0x3f, 0x0b, 0xcd, 0xee, 0xee, 0xf0, 0x10,
+ 0xfd, 0x88, 0xc0, 0xfe,
+ 0xe0, 0xf0, 0xde, 0x1f, 0xee, 0xd0, 0xf2, 0xed, 0xe9, 0x2f, 0x4e, 0x70,
+ 0x31, 0xf0, 0xbf, 0x0d,
+ 0x40, 0x21, 0x0c, 0xf1, 0xf6, 0x00, 0x04, 0xf0, 0xbf, 0x01, 0xf3, 0x01,
+ 0x00, 0xff, 0xf2, 0x01,
+ 0x0f, 0x30, 0x21, 0x2f, 0x32, 0xf7, 0xd7, 0x61, 0x00, 0xb0, 0x15, 0x61,
+ 0x11, 0x01, 0xd2, 0x01,
+ 0x01, 0x00, 0x10, 0x30, 0x00, 0xcf, 0x02, 0x67, 0x07, 0x0f, 0x40, 0x33,
+ 0x00, 0xc1, 0x01, 0x00,
+ 0x60, 0x11, 0x00, 0xdf, 0xde, 0x02, 0x13, 0x1d, 0x60, 0x47, 0x06, 0x0f,
+ 0xd0, 0x21, 0x32, 0x12,
+ 0xff, 0x00, 0x12, 0xc2, 0xb0, 0xf0, 0xdd, 0x0d, 0x02, 0x27, 0x07, 0x80,
+ 0xee, 0xf0, 0xf0, 0x01,
+ 0x13, 0xe2, 0xdf, 0xff, 0x00, 0x30, 0x21, 0xee, 0x0f, 0x77, 0x17, 0xc1,
+ 0x0f, 0x40, 0x02, 0x02,
+ 0x02, 0x02, 0x31, 0x02, 0xc2, 0xf1, 0xe1, 0x11, 0x12, 0x02, 0x06, 0xd0,
+ 0xb1, 0xf3, 0xe3, 0x03,
+ 0x26, 0x00, 0x13, 0x74, 0x71, 0x11, 0xf1, 0xf2, 0x05, 0x21, 0x1f, 0x3f,
+ 0x73, 0x02, 0xe3, 0x27,
+ 0x21, 0xbe, 0xff, 0xf3, 0x04, 0x0e, 0xee, 0x11, 0x22, 0xc3, 0x05, 0x0e,
+ 0x2c, 0x71, 0x27, 0x00,
+ 0xc0, 0xec, 0x10, 0x73, 0x10, 0xff, 0xe0, 0x13, 0x23, 0x0f, 0xed, 0x10,
+ 0x34, 0xf3, 0x03, 0x54,
+ 0x0f, 0xb9, 0xf0, 0x12, 0x11, 0xe0, 0xd2, 0xd3, 0xf4, 0xc1, 0xe0, 0xdf,
+ 0xdc, 0xf2, 0x05, 0xf0,
+ 0x00, 0xdd, 0x40, 0x64, 0x21, 0x32, 0x00, 0xc0, 0x26, 0x10, 0x01, 0x01,
+ 0x29, 0x00, 0x24, 0x00,
+ 0x9d, 0x09, 0xe4, 0x16, 0x97, 0x09, 0x20, 0x16, 0x2b, 0xde, 0x8d, 0xf8,
+ 0x1d, 0x60, 0x11, 0x02,
+ 0xd1, 0xf1, 0xd1, 0xdd, 0xee, 0x43, 0x77, 0x05, 0xde, 0xdd, 0xf0, 0x03,
+ 0x2c, 0x4f, 0x22, 0xe0,
+ 0xef, 0x2d, 0x7e, 0x1c, 0x20, 0x04, 0xdf, 0xe0, 0x05, 0x33, 0xf0, 0xd0,
+ 0xee, 0x05, 0x76, 0x10,
+ 0xef, 0xee, 0x00, 0x20, 0x41, 0xff, 0xed, 0x14, 0x21, 0x5f, 0x5f, 0x31,
+ 0x07, 0x02, 0x12, 0xcc,
+ 0xda, 0x00, 0x33, 0xe0, 0xb0, 0x0e, 0xe0, 0xb0, 0xe2, 0x04, 0xf0, 0xef,
+ 0x20, 0x12, 0x1e, 0x0e,
+ 0x80, 0x02, 0x33, 0x08, 0x1e, 0xf1, 0xf1, 0x20, 0x21, 0xcf, 0xc0, 0xe4,
+ 0x03, 0x62, 0x00, 0xab,
+ 0x03, 0xf7, 0x10, 0x20, 0x0e, 0x20, 0x0f, 0x10, 0x53, 0x00, 0x1b, 0xff,
+ 0x0d, 0xf0, 0xf1, 0xcd,
+ 0x01, 0x33, 0x5f, 0x0b, 0xcf, 0xd1, 0xb0, 0x01, 0x01, 0x09, 0x1e, 0x10,
+ 0x01, 0x62, 0x2e, 0x1b,
+ 0x1d, 0x00, 0x33, 0x03, 0x1d, 0x18, 0x10, 0x01, 0xff, 0xee, 0x21, 0x05,
+ 0xa1, 0xbe, 0xed, 0x00,
+ 0xe0, 0xdd, 0xe3, 0xf2, 0x1d, 0x38, 0x70, 0x72, 0x00, 0x0e, 0xe2, 0x14,
+ 0x30, 0x21, 0x0f, 0x0f,
+ 0xc0, 0xfc, 0xe0, 0x03, 0xe0, 0xdc, 0x05, 0xe4, 0x9e, 0xdc, 0xf1, 0x06,
+ 0x00, 0x00, 0x20, 0x5f,
+ 0x21, 0x00, 0xee, 0x1f, 0x13, 0x36, 0x12, 0x01, 0x02, 0xd2, 0x80, 0xf2,
+ 0xf2, 0x11, 0x30, 0x01,
+ 0x27, 0x5e, 0x0c, 0x30, 0x20, 0xf0, 0xed, 0x02, 0xe0, 0xbf, 0xf0, 0x05,
+ 0xf1, 0xfb, 0x0d, 0x40,
+ 0x0f, 0xf0, 0xf0, 0x00, 0x11, 0x7c, 0x7a, 0x00, 0xd0, 0xdd, 0x1c, 0x2f,
+ 0x10, 0x2d, 0x21, 0x20,
+ 0x0c, 0x10, 0x57, 0x32, 0x10, 0xfb, 0x00, 0x20, 0x8f, 0xe1, 0x06, 0x40,
+ 0x10, 0x0f, 0xc0, 0xd0,
+ 0x04, 0x20, 0x4c, 0x21, 0x00, 0xdf, 0xe0, 0x04, 0x3f, 0xfe, 0x9e, 0x00,
+ 0xf0, 0xcd, 0x12, 0x03,
+ 0xed, 0xc6, 0xf7, 0x01, 0xef, 0xcd, 0xf0, 0xe1, 0xb2, 0x01, 0x22, 0x2e,
+ 0x0a, 0xe0, 0x00, 0x43,
+ 0x54, 0x00, 0x11, 0x03, 0xf1, 0xc1, 0x00, 0x1c, 0xee, 0xe0, 0xf5, 0xd1,
+ 0xe0, 0xc0, 0xdc, 0x7f,
+ 0x3e, 0x0e, 0x01, 0x2f, 0x39, 0x73, 0x15, 0x0f, 0x0d, 0x40, 0xfd, 0xbe,
+ 0x00, 0x06, 0x00, 0xfb,
+ 0xd0, 0x00, 0x52, 0x20, 0x0d, 0xef, 0x21, 0x41, 0x73, 0x01, 0x0d, 0x2b,
+ 0x10, 0x10, 0x20, 0x11,
+ 0xf2, 0xd1, 0x0d, 0x39, 0xff, 0x8e, 0xf5, 0xf3, 0x0f, 0x2c, 0x20, 0xdf,
+ 0xae, 0x00, 0x05, 0x43,
+ 0x11, 0xfd, 0xdc, 0x30, 0x11, 0x00, 0xe0, 0x64, 0x11, 0xcb, 0xf0, 0x00,
+ 0x33, 0x01, 0x90, 0xfd,
+ 0x03, 0xf0, 0xef, 0xb0, 0xf7, 0x03, 0x3e, 0x1d, 0x10, 0xe0, 0xf1, 0x07,
+ 0x12, 0x3e, 0x0f, 0x02,
+ 0x45, 0x50, 0x30, 0x2e, 0xee, 0x04, 0x72, 0x0f, 0xca, 0xfe, 0x00, 0x11,
+ 0x06, 0xd0, 0xce, 0xde,
+ 0x02, 0x02, 0xee, 0xde, 0x00, 0x11, 0x52, 0x20, 0x1c, 0x41, 0x30, 0x60,
+ 0x20, 0xee, 0xd0, 0xe1,
+ 0x0c, 0x0f, 0x3d, 0x24, 0xf4, 0xbe, 0xfe, 0x02, 0x30, 0x2d, 0x43, 0x04,
+ 0xe1, 0x05, 0x32, 0x70,
+ 0x08, 0xdf, 0x50, 0x01, 0x30, 0x10, 0x0d, 0x00, 0x32, 0x21, 0x54, 0x02,
+ 0xcb, 0x9c, 0x0f, 0xf4,
+ 0x13, 0x0a, 0xbd, 0x00, 0xf0, 0x02, 0x10, 0x1d, 0xfa, 0xd0, 0x01, 0x15,
+ 0x6e, 0x3e, 0x22, 0xf0,
+ 0xd0, 0x01, 0x01, 0x02, 0xb0, 0x01, 0xd2, 0xcf, 0xee, 0x27, 0x13, 0x01,
+ 0xa1, 0x0f, 0xfc, 0x20,
+ 0x31, 0xd1, 0xec, 0x2e, 0x60, 0x0e, 0x10, 0x22, 0x17, 0x23, 0xcd, 0xa8,
+ 0x00, 0x30, 0x11, 0xb1,
+ 0xe3, 0x00, 0x00, 0x10, 0x3f, 0x0d, 0xcd, 0xf1, 0x07, 0x30, 0x2e, 0x0d,
+ 0x0f, 0x63, 0x44, 0x0c,
+ 0x0e, 0x11, 0x14, 0x02, 0x00, 0xd0, 0xcc, 0xf0, 0xf0, 0xa0, 0xdf, 0xcd,
+ 0x21, 0x52, 0x1f, 0x11,
+ 0x04, 0xfa, 0xf0, 0x54, 0x44, 0x2f, 0x0b, 0xd0, 0xf1, 0xf0, 0x00, 0x6e,
+ 0x20, 0x1f, 0x00, 0xc1,
+ 0xdf, 0x01, 0xf6, 0x00, 0xd2, 0xef, 0xb0, 0x07, 0x21, 0x0e, 0x0b, 0x00,
+ 0x41, 0x53, 0x0f, 0xcd,
+ 0x0f, 0xd0, 0x01, 0x24, 0x44, 0xce, 0xdf, 0x04, 0x21, 0x0e, 0x20, 0x00,
+ 0xd0, 0xdc, 0x0e, 0x50,
+ 0x1c, 0x2c, 0x43, 0x37, 0xef, 0x89, 0x00, 0x41, 0x02, 0xf1, 0xf0, 0x00,
+ 0xfe, 0xf0, 0xed, 0xd0,
+ 0xf0, 0x11, 0x31, 0x20, 0xdc, 0x01, 0x73, 0x22, 0x3d, 0x0b, 0x1e, 0x70,
+ 0x25, 0xf0, 0xdc, 0xf0,
+ 0xe0, 0x00, 0xf3, 0xe0, 0xa2, 0xe0, 0x00, 0x20, 0x27, 0x43, 0x20, 0x5c,
+ 0x30, 0x4e, 0x1f, 0x02,
+ 0x16, 0x20, 0x30, 0xbe, 0xce, 0xe2, 0x15, 0x30, 0x0e, 0xfe, 0xb0, 0xe7,
+ 0x02, 0x0f, 0xac, 0x02,
+ 0x34, 0x10, 0x0e, 0xd0, 0xef, 0x20, 0x20, 0x45, 0x10, 0xdb, 0xc0, 0x12,
+ 0x12, 0x0f, 0xcf, 0xb0,
+ 0x03, 0x23, 0x10, 0xdc, 0xad, 0x00, 0xf3, 0xf1, 0x00, 0x3d, 0x08, 0xff,
+ 0xee, 0x00, 0x3e, 0x4d,
+ 0x3d, 0x61, 0x34, 0x00, 0xbb, 0xf0, 0x23, 0x10, 0xed, 0xe1, 0xe5, 0xd2,
+ 0x11, 0xec, 0x0e, 0x73,
+ 0x3f, 0xcb, 0xe0, 0x00, 0x2f, 0x60, 0x10, 0x10, 0x00, 0xed, 0x04, 0x10,
+ 0xf0, 0x06, 0x0f, 0xad,
+ 0xff, 0xfe, 0x0e, 0xce, 0xee, 0x07, 0x32, 0xf0, 0xbd, 0x1f, 0x33, 0x37,
+ 0x21, 0x0d, 0x5f, 0x42,
+ 0x20, 0x3c, 0x3b, 0x61, 0x04, 0x01, 0xa1, 0xef, 0xee, 0xe0, 0x01, 0x15,
+ 0xb0, 0xcf, 0xf3, 0x10,
+ 0x10, 0x31, 0xff, 0xdc, 0x02, 0x44, 0x22, 0x0e, 0x0d, 0x00, 0x01, 0x27,
+ 0x66, 0xfe, 0xef, 0x00,
+ 0xf0, 0x14, 0x10, 0x10, 0x0f, 0xdc, 0xbf, 0x00, 0x33, 0x70, 0xff, 0xe2,
+ 0xe0, 0x1d, 0x40, 0x26,
+ 0x00, 0x2e, 0x7e, 0x00, 0x21, 0x14, 0xed, 0xc9, 0x00, 0x20, 0x20, 0x0f,
+ 0xcc, 0x00, 0x03, 0xf4,
+ 0x00, 0x1b, 0x00, 0x10, 0xd2, 0xd0, 0xed, 0x1c, 0xe0, 0x83, 0x06, 0x30,
+ 0x6f, 0x1b, 0x10, 0x40,
+ 0x12, 0x32, 0xe0, 0xee, 0xf0, 0x03, 0x20, 0x22, 0x0f, 0xbc, 0xf0, 0x07,
+ 0x00, 0xcd, 0x52, 0x44,
+ 0xfd, 0xdc, 0x00, 0x31, 0xf4, 0xa0, 0xf0, 0xdc, 0x00, 0x03, 0xe1, 0xe0,
+ 0xfc, 0x00, 0xc0, 0x03,
+ 0xf0, 0xf0, 0xeb, 0xd0, 0x07, 0x85, 0xbe, 0x00, 0x21, 0x00, 0xf1, 0x00,
+ 0x53, 0x00, 0xf0, 0xfc,
+ 0xfd, 0x00, 0x32, 0x1f, 0x0a, 0x70, 0x14, 0xc0, 0xed, 0x11, 0x11, 0x10,
+ 0x42, 0x14, 0x00, 0xac,
+ 0x0f, 0x10, 0x2f, 0xfc, 0xe0, 0x51, 0x42, 0x00, 0x03, 0x27, 0x20, 0x08,
+ 0x00, 0x20, 0x42, 0xf0,
+ 0xbe, 0xef, 0xe0, 0xef, 0xed, 0x3b, 0x5f, 0x00, 0xde, 0x00, 0x51, 0x02,
+ 0xce, 0x00, 0x1f, 0x20,
+ 0x65, 0x23, 0x02, 0xfd, 0x0c, 0x21, 0x2f, 0x1f, 0x25, 0x02, 0xab, 0xce,
+ 0x01, 0x14, 0x00, 0xcf,
+ 0xe0, 0xe2, 0x05, 0x01, 0xb0, 0xda, 0xe0, 0x00, 0x30, 0xf0, 0xee, 0x23,
+ 0x15, 0x00, 0xf1, 0x11,
+ 0x44, 0xf1, 0xaf, 0x0e, 0x33, 0x01, 0x12, 0x46, 0x20, 0x2b, 0x0f, 0x9f,
+ 0xf1, 0x05, 0xff, 0xdf,
+ 0xff, 0x00, 0x03, 0xd0, 0x00, 0xe1, 0x11, 0x73, 0x60, 0xda, 0xde, 0x0f,
+ 0x10, 0x52, 0x00, 0x0a,
+ 0x20, 0x10, 0x14, 0x10, 0x4e, 0x0d, 0x4f, 0x20, 0xe0, 0xbe, 0x03, 0xd2,
+ 0xc8, 0xe0, 0x10, 0x70,
+ 0x01, 0x0f, 0xed, 0x10, 0x56, 0x22, 0x00, 0xed, 0x01, 0x10, 0x0c, 0x10,
+ 0x71, 0x0f, 0x00, 0x07,
+ 0xf0, 0x0d, 0x20, 0x00, 0xef, 0xb1, 0xf1, 0x02, 0x0f, 0xac, 0xef, 0xe2,
+ 0x00, 0x08, 0xfe, 0x21,
+ 0x22, 0x00, 0x10, 0x40, 0x11, 0x03, 0x0d, 0xec, 0x41, 0x05, 0x90, 0xe0,
+ 0x07, 0xf1, 0xc0, 0xe3,
+ 0xd0, 0x0f, 0x51, 0x34, 0x00, 0x0d, 0x0d, 0x20, 0x64, 0x0d, 0x4c, 0x00,
+ 0x01, 0xc1, 0x00, 0xf9,
+ 0xef, 0xf0, 0x01, 0x03, 0xe1, 0xdf, 0xdb, 0x10, 0x10, 0x22, 0x40, 0x3d,
+ 0x71, 0x73, 0x0c, 0xfd,
+ 0x0e, 0x1d, 0x13, 0x27, 0x36, 0x00, 0xfd, 0xcd, 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0xae, 0xd0, 0xf3,
+ 0x02, 0x0f, 0x1d, 0xd1, 0xd7, 0x03, 0x70, 0x3f, 0x3c, 0x33, 0x74, 0x2f,
+ 0x0a, 0xef, 0x0f, 0x12,
+ 0x26, 0x00, 0xe0, 0xad, 0xf0, 0xc2, 0xf4, 0xf0, 0xe1, 0x0e, 0xeb, 0xfe,
+ 0xf0, 0xf0, 0xfd, 0xfc,
+ 0x3f, 0x60, 0xf0, 0xf7, 0x11, 0x2e, 0x0e, 0x46, 0x63, 0x00, 0x0e, 0x11,
+ 0x02, 0x0f, 0x0e, 0x01,
+ 0xd2, 0xcf, 0xc8, 0x00, 0xf0, 0xc1, 0xf0, 0x20, 0x01, 0x8e, 0xf1, 0x12,
+ 0x1f, 0x1d, 0x74, 0x00,
+ 0xed, 0xe0, 0x01, 0x0e, 0x0d, 0x01, 0x00, 0xd9, 0x0e, 0x2e, 0x70, 0x27,
+ 0x02, 0xbf, 0x0e, 0x20,
+ 0x00, 0x0c, 0xe0, 0x1f, 0x30, 0xf0, 0xd0, 0x15, 0x2f, 0x2e, 0x67, 0x01,
+ 0xcf, 0x00, 0x02, 0x11,
+ 0x00, 0x00, 0xf2, 0x33, 0x70, 0x1c, 0x2c, 0x20, 0xf0, 0xbf, 0xf5, 0x27,
+ 0x30, 0x0d, 0xdf, 0x00,
+ 0xc3, 0xd0, 0xbb, 0xff, 0xd1, 0x03, 0x10, 0x0e, 0x3e, 0x00, 0x43, 0x32,
+ 0x10, 0x34, 0x05, 0x80,
+ 0xfe, 0x21, 0x31, 0x0d, 0x05, 0x26, 0xff, 0x0d, 0x00, 0x13, 0x45, 0xee,
+ 0xdd, 0x0e, 0x40, 0x42,
+ 0xe0, 0x90, 0xde, 0xf0, 0x15, 0x10, 0xbc, 0xd0, 0x20, 0x32, 0xed, 0xfd,
+ 0xd0, 0xef, 0x2a, 0x70,
+ 0x30, 0x04, 0xbe, 0xff, 0x23, 0x43, 0x0c, 0xfb, 0x00, 0x30, 0x34, 0x20,
+ 0x1d, 0x41, 0x21, 0xfd,
+ 0xfd, 0x1f, 0x01, 0x85, 0xdd, 0xea, 0xdf, 0xff, 0xf3, 0x27, 0xf0, 0x8d,
+ 0x9e, 0x10, 0x51, 0x12,
+ 0x10, 0x0d, 0xfe, 0x13, 0x15, 0x10, 0x00, 0xff, 0xf0, 0xf5, 0xf3, 0xdc,
+ 0xbc, 0xe0, 0x04, 0xf2,
+ 0x32, 0x1f, 0xdb, 0x00, 0x02, 0x01, 0xce, 0x1f, 0xf2, 0xb4, 0xc0, 0xe1,
+ 0x22, 0x72, 0x2f, 0x0f,
+ 0x05, 0xf1, 0x21, 0x40, 0x20, 0x13, 0xf2, 0xd4, 0xef, 0x00, 0xe2, 0x0b,
+ 0xf2, 0x47, 0xe1, 0xac,
+ 0x0e, 0xef, 0xff, 0xf1, 0x00, 0xf8, 0xcf, 0x0f, 0x50, 0x6e, 0x0e, 0xfe,
+ 0xf0, 0x43, 0x55, 0x0d,
+ 0x0e, 0xf0, 0xe2, 0xe1, 0x01, 0x30, 0x20, 0x0f, 0xdf, 0xe1, 0xd0, 0x0d,
+ 0x1f, 0x60, 0x1d, 0xe9,
+ 0x0e, 0x10, 0x77, 0x06, 0xff, 0xfd, 0x10, 0x41, 0x01, 0xe0, 0x20, 0x31,
+ 0xe0, 0xf4, 0x04, 0xfe,
+ 0x0d, 0x70, 0x64, 0x04, 0xf1, 0xc0, 0xdc, 0xfe, 0x00, 0x12, 0x4e, 0x00,
+ 0x03, 0xdf, 0xa8, 0xf0,
+ 0x04, 0x11, 0x10, 0x0e, 0xf0, 0xd5, 0xd2, 0xaf, 0x0e, 0xf1, 0xe4, 0xe2,
+ 0x47, 0x00, 0xed, 0x20,
+ 0x71, 0x13, 0x0f, 0x0d, 0x0e, 0x0d, 0xff, 0x00, 0x33, 0x0f, 0xc8, 0x00,
+ 0x00, 0xa0, 0xec, 0xf0,
+ 0xf4, 0xf2, 0x0f, 0xfd, 0x00, 0x00, 0xf0, 0x3f, 0x70, 0x42, 0x11, 0x1e,
+ 0x19, 0x70, 0x33, 0x05,
+ 0x31, 0x0d, 0x0e, 0x10, 0x01, 0xee, 0xd8, 0xef, 0xaf, 0xe0, 0xd5, 0xc0,
+ 0xdd, 0xd0, 0x0f, 0x00,
+ 0x4f, 0x60, 0x30, 0x0d, 0x11, 0x75, 0x0f, 0x1e, 0x1f, 0x10, 0xfe, 0xf0,
+ 0x02, 0xf3, 0xd2, 0xe7,
+ 0xf2, 0xde, 0xed, 0x23, 0x23, 0xff, 0x00, 0x47, 0x02, 0x0d, 0x8c, 0x00,
+ 0xd0, 0xf0, 0xfe, 0x12,
+ 0x16, 0xc0, 0xd0, 0xdd, 0x10, 0x47, 0x54, 0x20, 0x00, 0xde, 0x00, 0x10,
+ 0x10, 0xf0, 0xd0, 0xdf,
+ 0xe0, 0xf3, 0xce, 0x00, 0x77, 0x73, 0x00, 0x0f, 0xbb, 0x00, 0x25, 0x00,
+ 0x0d, 0xdf, 0x10, 0x03,
+ 0x00, 0x0d, 0xcf, 0x13, 0x51, 0x1c, 0x0c, 0x13, 0x17, 0x0f, 0x3e, 0x60,
+ 0x02, 0x0f, 0x01, 0x14,
+ 0x00, 0xdb, 0x00, 0x22, 0x44, 0xe0, 0xfe, 0x0e, 0xaf, 0xfe, 0x10, 0x20,
+ 0xed, 0xc8, 0x0f, 0x0f,
+ 0xf0, 0x70, 0x5e, 0x0e, 0x10, 0x0f, 0x11, 0x45, 0x0f, 0xe0, 0x15, 0x20,
+ 0x2e, 0x0f, 0xd0, 0xaf,
+ 0xdd, 0xcf, 0xf0, 0x05, 0x0f, 0x1d, 0x22, 0xd0, 0x99, 0x00, 0xf2, 0x05,
+ 0xf0, 0xbd, 0x00, 0xe2,
+ 0x04, 0x00, 0xc1, 0xe1, 0x02, 0x11, 0x20, 0x04, 0xf5, 0x20, 0x0c, 0x00,
+ 0x70, 0x40, 0x11, 0xcc,
+ 0xff, 0x00, 0x12, 0xef, 0xbc, 0x00, 0x14, 0x00, 0xef, 0xe0, 0x1f, 0x0b,
+ 0xf0, 0x56, 0x21, 0x00,
+ 0x02, 0x02, 0x22, 0x52, 0x20, 0x2b, 0x70, 0x52, 0x10, 0x22, 0x0d, 0xf8,
+ 0xee, 0x00, 0x02, 0xe2,
+ 0xc1, 0xda, 0xde, 0xdf, 0xb0, 0xe3, 0xf0, 0x0f, 0x0c, 0x50, 0x63, 0x1e,
+ 0x4c, 0x21, 0x11, 0x0f,
+ 0xf4, 0x26, 0x30, 0x0e, 0x0e, 0x0e, 0x11, 0x00, 0xed, 0xe1, 0x07, 0xe1,
+ 0x9e, 0xef, 0xe0, 0xd0,
+ 0xe2, 0xd0, 0x8b, 0xff, 0x02, 0x02, 0x00, 0x0c, 0x20, 0x42, 0x15, 0x01,
+ 0x10, 0x01, 0xd0, 0xb3,
+ 0x04, 0x00, 0xde, 0x0f, 0xfc, 0x01, 0xd2, 0xbe, 0x0e, 0x13, 0x57, 0xf1,
+ 0x00, 0xf0, 0x10, 0x30,
+ 0x76, 0x12, 0x0d, 0xed, 0xf1, 0xe0, 0xeb, 0x0f, 0x1e, 0x0d, 0x1d, 0x1f,
+ 0x00, 0x37, 0x64, 0x1d,
+ 0x1e, 0x20, 0x02, 0x01, 0xc0, 0xbd, 0x00, 0x0b, 0x00, 0x71, 0x26, 0x50,
+ 0x0d, 0xe0, 0xe5, 0x01,
+ 0x20, 0xfd, 0x0f, 0x11, 0x03, 0x32, 0x11, 0xfd, 0x2b, 0x72, 0x32, 0xff,
+ 0x9a, 0x0f, 0x21, 0x11,
+ 0x00, 0x0d, 0x37, 0x14, 0xde, 0xf0, 0x10, 0x61, 0x2f, 0x11, 0xd1, 0xb2,
+ 0xee, 0xcc, 0x03, 0xf6,
+ 0xdf, 0xcd, 0x02, 0xe1, 0xdc, 0xee, 0xe0, 0x24, 0x30, 0xdd, 0x8f, 0xf1,
+ 0x33, 0x7d, 0x48, 0xf0,
+ 0x05, 0x00, 0xff, 0x00, 0x0e, 0x10, 0x02, 0xbf, 0x00, 0x26, 0xef, 0xcd,
+ 0x02, 0x12, 0x0e, 0x1b,
+ 0x0f, 0xce, 0x01, 0xf2, 0xad, 0x0e, 0x31, 0x00, 0x03, 0x57, 0x0f, 0x1d,
+ 0x41, 0x56, 0x00, 0xde,
+ 0xfd, 0x22, 0x30, 0x3d, 0xd0, 0xa0, 0xdd, 0x01, 0x07, 0xf3, 0xcb, 0x0e,
+ 0x10, 0x12, 0x0e, 0x1d,
+ 0xf0, 0xcf, 0x2e, 0x74, 0x20, 0x11, 0x01, 0x00, 0x02, 0x04, 0xef, 0x05,
+ 0x67, 0x00, 0xfd, 0x00,
+ 0xe0, 0xd0, 0xe1, 0xff, 0xee, 0xc2, 0xf4, 0xf0, 0xdc, 0x9e, 0x0f, 0x02,
+ 0x64, 0x10, 0x0d, 0xc1,
+ 0xe3, 0x02, 0x13, 0x14, 0x01, 0xe2, 0x13, 0x00, 0x43, 0x47, 0x0b, 0x10,
+ 0x34, 0x42, 0xfd, 0x1f,
+ 0x73, 0x14, 0xf1, 0xc1, 0x0e, 0xea, 0xf0, 0x00, 0x03, 0x20, 0x0a, 0xdd,
+ 0xd0, 0x10, 0x31, 0xe1,
+ 0x30, 0x7b, 0x70, 0x00, 0xf0, 0xd0, 0x0d, 0x1f, 0x20, 0xee, 0xe0, 0x02,
+ 0x00, 0xfa, 0x1f, 0x51,
+ 0x04, 0x02, 0x26, 0x5e, 0x0d, 0x20, 0x04, 0xf2, 0xad, 0x0c, 0x22, 0x54,
+ 0xfd, 0xfe, 0x43, 0x43,
+ 0x0d, 0x0b, 0xe0, 0xe0, 0xf5, 0x03, 0x11, 0x2e, 0x8b, 0xdf, 0x32, 0x76,
+ 0x0f, 0x0d, 0xe0, 0x03,
+ 0x00, 0xef, 0x0e, 0x00, 0x10, 0x00, 0x01, 0xf4, 0xc1, 0xe2, 0xe0, 0xf4,
+ 0x06, 0xb0, 0xec, 0x00,
+ 0x01, 0x05, 0x00, 0x5f, 0x2f, 0x7f, 0x32, 0x01, 0x01, 0x00, 0xfb, 0x0f,
+ 0xdf, 0x02, 0x17, 0x00,
+ 0xb0, 0x00, 0x02, 0x0f, 0x00, 0xe0, 0x8f, 0x0b, 0xf2, 0x01, 0x0d, 0xeb,
+ 0xe0, 0xf1, 0x20, 0x5d,
+ 0x5e, 0x1d, 0x0b, 0x1f, 0x42, 0x27, 0x20, 0x0b, 0xf0, 0x00, 0xd1, 0xf0,
+ 0xcf, 0xfe, 0xb1, 0xe0,
+ 0xf1, 0xf0, 0x4e, 0x1f, 0x20, 0x14, 0x0f, 0x1a, 0x5f, 0x40, 0x20, 0x32,
+ 0xde, 0xbd, 0x03, 0x17,
+ 0x12, 0x0e, 0xff, 0x01, 0x03, 0x80, 0xee, 0x04, 0x01, 0xfd, 0xd0, 0x01,
+ 0x17, 0x00, 0x8d, 0x0e,
+ 0x02, 0x33, 0x00, 0x00, 0xe0, 0xfb, 0x00, 0x00, 0x73, 0x03, 0xc4, 0xe0,
+ 0xef, 0x02, 0x37, 0xf0,
+ 0xdb, 0x50, 0x46, 0xf1, 0xdf, 0xe0, 0x00, 0x10, 0x54, 0x20, 0xf0, 0xdf,
+ 0x31, 0x42, 0x0f, 0xea,
+ 0xbf, 0x0f, 0x1f, 0x2f, 0xd0, 0xa0, 0xe0, 0x0d, 0x0d, 0xe5, 0x00, 0x00,
+ 0x21, 0x01, 0x32, 0x00,
+ 0x32, 0xf0, 0x76, 0x20, 0xa3, 0xf5, 0x50, 0x20, 0xbc, 0xef, 0xe5, 0xf7,
+ 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x0f, 0x3f, 0x5e, 0x30, 0x34, 0x36, 0x21, 0x01, 0x01, 0x12, 0x02,
+ 0x00, 0x1e, 0x6d, 0x4d,
+ 0x29, 0x3e, 0x4d, 0x3d, 0x5c, 0x3e, 0x3e, 0x6d, 0x2d, 0x4f, 0x3e, 0x30,
+ 0x31, 0x34, 0x32, 0x2e,
+ 0x20, 0x1a, 0x3d, 0x5e, 0x3f, 0x4f, 0x18, 0x1b, 0x1e, 0x2d, 0x2e, 0x0e,
+ 0x00, 0xfd, 0xcd, 0xbd,
+ 0xdd, 0xd3, 0xc6, 0xc0, 0xd1, 0xf3, 0xf4, 0xf0, 0xd0, 0xe1, 0xe5, 0xd2,
+ 0xb0, 0xf5, 0x24, 0x23,
+ 0x01, 0x12, 0x23, 0x13, 0xb0, 0xb0, 0xd0, 0xc0, 0xd0, 0xbd, 0xe3, 0xe7,
+ 0xc4, 0xe2, 0xd4, 0xd3,
+ 0xc2, 0xd2, 0xe3, 0xc0, 0xe3, 0x06, 0x11, 0xff, 0x00, 0x21, 0x21, 0x00,
+ 0xee, 0xe2, 0xf5, 0xd0,
+ 0xc0, 0xd0, 0xd3, 0xa4, 0xa0, 0xd1, 0xf7, 0x24, 0x21, 0x30, 0x42, 0x31,
+ 0x21, 0x00, 0x20, 0x61,
+ 0x30, 0x51, 0x31, 0x3f, 0x5e, 0x30, 0x4e, 0x28, 0x3d, 0x3c, 0x3b, 0x1b,
+ 0x2d, 0x2d, 0x1d, 0x0c,
+ 0x2e, 0x4f, 0x2e, 0x0d, 0x1c, 0x2d, 0x3d, 0x7e, 0x1d, 0xf8, 0xee, 0x0f,
+ 0x0e, 0xdc, 0x0f, 0x4f,
+ 0x1f, 0xcd, 0xad, 0x0f, 0x00, 0xdd, 0xba, 0xdd, 0xf0, 0xcf, 0xde, 0xdf,
+ 0xd0, 0xc0, 0xd0, 0xe0,
+ 0xcf, 0xf0, 0x01, 0xde, 0xe9, 0xff, 0x0f, 0x0e, 0xdd, 0xec, 0xbc, 0xbd,
+ 0xba, 0xcc, 0xcd, 0xff,
+ 0xff, 0xdd, 0xdb, 0xef, 0xf0, 0xee, 0xee, 0xef, 0x00, 0xf1, 0xd0, 0xb0,
+ 0xe1, 0x06, 0xd0, 0xd0,
+ 0x03, 0x13, 0xf0, 0x01, 0x51, 0x43, 0x35, 0x11, 0x00, 0x10, 0x77, 0x32,
+ 0x20, 0x21, 0x23, 0x34,
+ 0x44, 0x11, 0x20, 0x40, 0x41, 0x20, 0x32, 0x55, 0x31, 0x1f, 0x0d, 0x30,
+ 0x71, 0x10, 0x08, 0x0d,
+ 0x22, 0x01, 0xde, 0xe0, 0x04, 0xe1, 0xb0, 0xe1, 0x05, 0x04, 0xe1, 0xf2,
+ 0xd1, 0xd0, 0xf2, 0x45,
+ 0x22, 0xd0, 0xe1, 0x66, 0x01, 0xb0, 0x00, 0x05, 0x00, 0xd1, 0xf1, 0xf2,
+ 0x90, 0xcf, 0xe1, 0xf3,
+ 0xd0, 0xad, 0xe0, 0xf5, 0xf2, 0xd0, 0x02, 0x04, 0x01, 0x02, 0x12, 0x00,
+ 0x20, 0x42, 0x21, 0x57,
+ 0x43, 0x00, 0x0e, 0x20, 0x11, 0x00, 0xe0, 0xd1, 0xcf, 0xba, 0xff, 0x00,
+ 0x10, 0x0c, 0xf9, 0xfe,
+ 0x1e, 0x4f, 0x2c, 0x1c, 0x4e, 0x2e, 0x2d, 0x4e, 0x6f, 0x1c, 0x2d, 0x50,
+ 0x20, 0x1b, 0x2e, 0x3f,
+ 0x4f, 0x0b, 0xeb, 0xed, 0x30, 0x3e, 0xfc, 0x0e, 0x2e, 0x3f, 0x3e, 0x4f,
+ 0x62, 0x11, 0x0f, 0x43,
+ 0x36, 0x00, 0xef, 0x02, 0x77, 0x02, 0xdf, 0xc0, 0x03, 0x14, 0xd0, 0xc0,
+ 0xf2, 0x03, 0xd0, 0xb0,
+ 0x04, 0xf3, 0xd0, 0xd1, 0x04, 0x24, 0x00, 0xe0, 0x01, 0x22, 0x01, 0xf2,
+ 0x03, 0x31, 0x40, 0x20,
+ 0x0e, 0xfd, 0x0f, 0x0e, 0x0b, 0x5f, 0x4f, 0x0b, 0x2c, 0x4e, 0x3e, 0x2d,
+ 0x6f, 0x2e, 0x09, 0xdb,
+ 0x9d, 0x0f, 0x43, 0x00, 0xbc, 0x00, 0x02, 0x00, 0xfe, 0x10, 0x20, 0x21,
+ 0x20, 0x10, 0x4f, 0x3d,
+ 0x2c, 0x5e, 0x2c, 0x3c, 0x5c, 0x2c, 0x3d, 0x3f, 0x4f, 0x08, 0x1e, 0x60,
+ 0x00, 0x0c, 0x10, 0x30,
+ 0xfe, 0xec, 0x22, 0x76, 0x00, 0x00, 0x00, 0x03, 0x13, 0x01, 0xe1, 0x02,
+ 0x17, 0xf1, 0x80, 0xf2,
+ 0x03, 0xe2, 0xc2, 0xf6, 0xf2, 0xc1, 0xe2, 0xc1, 0xe3, 0xe6, 0xd1, 0xc1,
+ 0xe1, 0xf2, 0x01, 0x02,
+ 0x03, 0xf3, 0xb0, 0xf3, 0x06, 0xe2, 0xa0, 0xd0, 0xf2, 0x06, 0x02, 0xb0,
+ 0xd0, 0xe2, 0xf1, 0x35,
+ 0x00, 0x0f, 0x61, 0x32, 0x2f, 0x2f, 0x74, 0x11, 0x0d, 0x1e, 0x22, 0x47,
+ 0x10, 0xfd, 0x0f, 0x10,
+ 0x0f, 0x0e, 0x2f, 0xe9, 0xee, 0x30, 0x30, 0x0c, 0xfe, 0x3e, 0x7e, 0x1d,
+ 0x0b, 0x5f, 0x40, 0x2d,
+ 0x0b, 0x4f, 0x40, 0x1e, 0x0c, 0x2f, 0x30, 0x30, 0x0c, 0x1f, 0x20, 0x0d,
+ 0x99, 0x10, 0x64, 0x00,
+ 0xed, 0x0f, 0x21, 0x00, 0xeb, 0xff, 0x41, 0x22, 0xee, 0xde, 0x00, 0x44,
+ 0xef, 0xbc, 0x12, 0x36,
+ 0xe0, 0xaf, 0x02, 0x25, 0xf0, 0xc0, 0x01, 0xf2, 0xe0, 0xf2, 0xf2, 0x04,
+ 0xf1, 0xa0, 0x02, 0x26,
+ 0x01, 0xf0, 0x12, 0x33, 0xc0, 0x01, 0x36, 0xe0, 0xb0, 0x01, 0x02, 0xf1,
+ 0x02, 0xd1, 0x14, 0x54,
+ 0xf0, 0xe0, 0x23, 0x33, 0x00, 0xd0, 0x32, 0x43, 0xdc, 0xbb, 0xff, 0x41,
+ 0x21, 0xec, 0x00, 0x32,
+ 0x0f, 0xda, 0x30, 0x70, 0xfc, 0xdb, 0x40, 0x40, 0xed, 0xfd, 0x20, 0x60,
+ 0x1f, 0x0b, 0x1f, 0x40,
+ 0x1e, 0x2d, 0x2e, 0x3e, 0x2e, 0x0b, 0x1d, 0x4f, 0x0c, 0xdd, 0x0d, 0x51,
+ 0x0e, 0xda, 0x8c, 0x10,
+ 0x35, 0xff, 0xcd, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xbd, 0xed, 0x13, 0x25,
+ 0xbc, 0xee, 0x01, 0x23,
+ 0x00, 0xde, 0xee, 0x03, 0x03, 0xe0, 0xbe, 0xe0, 0x05, 0xcf, 0xde, 0x06,
+ 0xd1, 0x8e, 0xe0, 0x06,
+ 0x02, 0xdf, 0xef, 0x01, 0x25, 0x01, 0xd0, 0xcf, 0x11, 0x43, 0xf0, 0xce,
+ 0x00, 0x15, 0xf0, 0xbf,
+ 0x01, 0x02, 0xcd, 0xf0, 0x16, 0xef, 0xcd, 0x00, 0x23, 0xff, 0xdd, 0xca,
+ 0x00, 0x00, 0x10, 0x51,
+ 0xdc, 0xcb, 0x31, 0x63, 0x0f, 0x0d, 0x1f, 0x20, 0x43, 0x33, 0x0d, 0x0b,
+ 0x30, 0x42, 0x0e, 0x0b,
+ 0x31, 0x31, 0xfd, 0x0d, 0x1f, 0x2d, 0x3e, 0x40, 0xfc, 0x43, 0x54, 0xb8,
+ 0xfe, 0x32, 0x11, 0xdd,
+ 0x0f, 0x10, 0xef, 0xe0, 0x13, 0xcf, 0x9a, 0xf0, 0x33, 0x35, 0xef, 0xcd,
+ 0x02, 0x01, 0xe0, 0x13,
+ 0x02, 0xe0, 0x45, 0x12, 0xc0, 0xef, 0x13, 0xf1, 0xe0, 0x26, 0xe0, 0xcf,
+ 0xf0, 0xe0, 0xe1, 0xe0,
+ 0x8c, 0xdc, 0x23, 0x56, 0xf0, 0xaa, 0xff, 0x23, 0x32, 0xde, 0xcd, 0x01,
+ 0x45, 0x00, 0xdd, 0xff,
+ 0x00, 0x11, 0x21, 0x00, 0xdc, 0x00, 0x73, 0x0e, 0xeb, 0x10, 0x32, 0x31,
+ 0x10, 0x0e, 0x41, 0x32,
+ 0x0f, 0x00, 0x77, 0x46, 0x00, 0x00, 0x31, 0x44, 0x00, 0x00, 0x20, 0x41,
+ 0x32, 0x21, 0x00, 0x1f,
+ 0x63, 0x24, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x22, 0x00, 0x02, 0x36, 0xce,
+ 0xff, 0x77, 0x22, 0xef,
+ 0x00, 0x10, 0x22, 0x31, 0x10, 0x32, 0x44, 0x00, 0x0f, 0x31, 0x10, 0x22,
+ 0x00, 0x89, 0x01, 0x25,
+ 0xdf, 0x8b, 0x00, 0x04, 0xef, 0xde, 0x02, 0x14, 0xdf, 0xbe, 0x02, 0x00,
+ 0x00, 0x01, 0x00, 0xe0,
+ 0xff, 0x23, 0x20, 0xec, 0xdb, 0x00, 0x22, 0xcc, 0x8a, 0xff, 0x22, 0x00,
+ 0xbd, 0xee, 0x02, 0x00,
+ 0xcc, 0xee, 0x00, 0xf0, 0xb8, 0x00, 0x10, 0x00, 0xee, 0x10, 0x40, 0x10,
+ 0x0e, 0x0e, 0x41, 0x10,
+ 0xfc, 0x10, 0x31, 0xca, 0xee, 0x33, 0x10, 0x8a, 0xee, 0x22, 0x11, 0xed,
+ 0xdd, 0x0f, 0x00, 0x10,
+ 0x30, 0x0e, 0xfb, 0x00, 0x52, 0x11, 0xcd, 0xfd, 0x02, 0x02, 0xba, 0xf0,
+ 0x13, 0x02, 0x89, 0xf0,
+ 0x13, 0x01, 0xdc, 0x11, 0x34, 0x00, 0xbd, 0x01, 0x46, 0x00, 0xef, 0xff,
+ 0x43, 0x22, 0xee, 0xed,
+ 0x02, 0x12, 0xff, 0xde, 0x00, 0x04, 0x02, 0xce, 0xdd, 0x11, 0x56, 0xef,
+ 0xbb, 0x00, 0x32, 0x00,
+ 0xec, 0xff, 0x63, 0x00, 0xfd, 0x0f, 0x13, 0x01, 0xcb, 0x00, 0x25, 0x01,
+ 0xef, 0xce, 0x00, 0x43,
+ 0x00, 0xd9, 0x0f, 0x30, 0xfe, 0x20, 0x70, 0x0c, 0x20, 0x53, 0x0f, 0x10,
+ 0x22, 0x30, 0x20, 0x1f,
+ 0x1d, 0x72, 0x11, 0x0c, 0x0e, 0x1e, 0x33, 0x11, 0x11, 0x12, 0xe9, 0xce,
+ 0x24, 0x67, 0x00, 0xe0,
+ 0xcc, 0x00, 0x46, 0x01, 0xce, 0xff, 0x33, 0x01, 0xc0, 0x13, 0x35, 0xe0,
+ 0xe0, 0x02, 0xf1, 0x02,
+ 0x23, 0xd1, 0xd1, 0xd2, 0xa1, 0xf6, 0x02, 0xb0, 0xae, 0x03, 0x05, 0xf0,
+ 0xdf, 0xf0, 0x06, 0xf0,
+ 0xae, 0x00, 0x13, 0x01, 0xdd, 0xee, 0x11, 0x33, 0xfe, 0x0f, 0x54, 0x0d,
+ 0x0c, 0x30, 0x40, 0x0f,
+ 0x30, 0x1e, 0xd8, 0x10, 0x41, 0xfe, 0xcd, 0xdc, 0x00, 0x1f, 0xbb, 0x0f,
+ 0x30, 0x40, 0xdb, 0xfd,
+ 0x72, 0x20, 0x0c, 0x0e, 0x2f, 0x4f, 0x50, 0x10, 0x08, 0x0e, 0x30, 0x30,
+ 0xfe, 0x1e, 0x4f, 0x1f,
+ 0x0c, 0x0f, 0x30, 0x30, 0x0d, 0x0e, 0xfe, 0x31, 0x1f, 0x88, 0x0f, 0x10,
+ 0x21, 0xee, 0xfe, 0x52,
+ 0x12, 0x00, 0xde, 0x03, 0x37, 0x00, 0x8f, 0xf2, 0x06, 0xf0, 0xd0, 0xe2,
+ 0x03, 0xe1, 0x9f, 0x03,
+ 0x05, 0xf0, 0xf1, 0xf2, 0xf2, 0xf1, 0x04, 0x14, 0xc0, 0xf2, 0x13, 0xb0,
+ 0xd0, 0x05, 0x03, 0xe0,
+ 0xe2, 0x04, 0xf0, 0xb0, 0x01, 0x57, 0x23, 0xde, 0xe0, 0x54, 0x23, 0x00,
+ 0x00, 0x12, 0x22, 0x12,
+ 0x12, 0x12, 0x01, 0x00, 0x22, 0x40, 0x0e, 0x1c, 0x72, 0x20, 0xf8, 0x00,
+ 0x53, 0x0f, 0xc9, 0x10,
+ 0x42, 0x0f, 0x1f, 0x30, 0x1e, 0x0d, 0x4f, 0x73, 0x31, 0x0a, 0x0c, 0x1f,
+ 0x51, 0x00, 0x0d, 0x1e,
+ 0x1f, 0x21, 0x10, 0xff, 0xff, 0x01, 0x03, 0xee, 0xdd, 0xec, 0x36, 0x54,
+ 0xce, 0xdd, 0x00, 0x01,
+ 0x22, 0x23, 0x13, 0xf0, 0xf1, 0x04, 0x24, 0x14, 0xe2, 0x80, 0xf5, 0x05,
+ 0xa0, 0xbf, 0x05, 0x03,
+ 0xde, 0xdf, 0xe1, 0x13, 0x02, 0xef, 0xdf, 0x01, 0x36, 0x00, 0xe0, 0x00,
+ 0x52, 0x00, 0x33, 0x77,
+ 0x00, 0xf0, 0x12, 0x55, 0x11, 0x01, 0xf0, 0xf0, 0x46, 0x21, 0xe0, 0xe1,
+ 0xf1, 0x00, 0x01, 0x31,
+ 0x20, 0x0f, 0x00, 0x40, 0x0c, 0xed, 0x3f, 0x70, 0x30, 0x0c, 0x0d, 0x3f,
+ 0x72, 0x20, 0x19, 0x1d,
+ 0x4f, 0x30, 0x3d, 0x09, 0x2f, 0x6f, 0x1f, 0x2d, 0x1b, 0x2f, 0x2f, 0x1e,
+ 0x2e, 0x3f, 0x1d, 0x2d,
+ 0x3d, 0x0c, 0x2e, 0x1d, 0xba, 0xad, 0x00, 0x00, 0xe0, 0xcf, 0xbd, 0xdd,
+ 0x06, 0x03, 0xbd, 0xee,
+ 0x03, 0x02, 0xee, 0xee, 0x13, 0x12, 0xec, 0xbb, 0x00, 0x03, 0xef, 0xbc,
+ 0xf0, 0xe1, 0xbf, 0xdb,
+ 0xe2, 0xf4, 0xcf, 0xca, 0x00, 0x03, 0xde, 0xcd, 0xf0, 0x01, 0x00, 0xfd,
+ 0x01, 0x11, 0x0e, 0x00,
+ 0x17, 0xe0, 0xd0, 0xc0, 0xb0, 0xe0, 0xcf, 0xdd, 0xcf, 0xef, 0xed, 0xdc,
+ 0xeb, 0xdd, 0x0f, 0x00,
+ 0x9b, 0xff, 0x00, 0x00, 0xed, 0x0f, 0x0f, 0xdc, 0x0f, 0x00, 0x0d, 0xeb,
+ 0x1e, 0x71, 0x50, 0x0a,
+ 0x20, 0x40, 0x10, 0x0d, 0x30, 0x32, 0x0e, 0x0c, 0x41, 0x66, 0x0f, 0xea,
+ 0x0f, 0x62, 0x01, 0x0e,
+ 0xff, 0x01, 0x24, 0x00, 0xef, 0xf0, 0x12, 0x14, 0xdf, 0x00, 0x33, 0x32,
+ 0xf0, 0xcc, 0x00, 0x12,
+ 0x11, 0xcf, 0xd0, 0xf3, 0x07, 0xe2, 0x80, 0xc1, 0xe4, 0xd5, 0xe4, 0xe2,
+ 0xb0, 0xdf, 0xe0, 0x03,
+ 0xf0, 0xde, 0xef, 0x01, 0x33, 0x10, 0x64, 0x34, 0x0e, 0x1f, 0x10, 0xfa,
+ 0xde, 0x33, 0x03, 0xbf,
+ 0xac, 0xe0, 0x03, 0xcf, 0xdc, 0xdd, 0x02, 0x02, 0xd8, 0xce, 0x0f, 0x0d,
+ 0x0e, 0xfb, 0xfd, 0xfd,
+ 0x3f, 0x6f, 0x0b, 0x0d, 0x0e, 0x2f, 0x3f, 0x4d, 0x5f, 0x2e, 0x0d, 0x2c,
+ 0x3f, 0x00, 0x33, 0x00,
+ 0xdb, 0x00, 0x50, 0x20, 0x62, 0x12, 0x1c, 0x30, 0x43, 0x11, 0x1e, 0x30,
+ 0x0f, 0xc8, 0x00, 0x01,
+ 0xa0, 0xcf, 0xe2, 0x06, 0xf1, 0xd2, 0x02, 0x04, 0x02, 0x34, 0x41, 0x0f,
+ 0x0e, 0x77, 0x53, 0x10,
+ 0x0f, 0x20, 0x21, 0x00, 0x20, 0x33, 0x11, 0x0f, 0x00, 0xef, 0xcc, 0xef,
+ 0x03, 0xdf, 0xa8, 0xed,
+ 0x00, 0x12, 0xf0, 0xce, 0xff, 0x25, 0x24, 0xd0, 0x0e, 0x71, 0x54, 0x00,
+ 0x0e, 0x0d, 0x31, 0x2f,
+ 0x09, 0x0d, 0x0e, 0xee, 0xed, 0xdc, 0xce, 0x00, 0x0f, 0x0c, 0xbd, 0x01,
+ 0x55, 0x40, 0x2f, 0x40,
+ 0x53, 0x30, 0x2f, 0x42, 0x36, 0x31, 0x31, 0x24, 0x22, 0x22, 0x26, 0x12,
+ 0xf2, 0x02, 0x14, 0x33,
+ 0x02, 0xf1, 0x46, 0x22, 0xf2, 0xb0, 0x03, 0x13, 0x13, 0x03, 0x15, 0xe1,
+ 0x14, 0x33, 0x03, 0xe3,
+ 0x13, 0x23, 0x55, 0x53, 0x21, 0x02, 0x05, 0x03, 0xc3, 0x81, 0xd3, 0xd5,
+ 0xc2, 0xe2, 0xf2, 0xf3,
+ 0xd4, 0xe3, 0xe4, 0xe2, 0x02, 0x02, 0xe1, 0xb1, 0xf1, 0x13, 0x32, 0xe0,
+ 0xa0, 0x24, 0x33, 0xef,
+ 0xad, 0xe0, 0x01, 0xfd, 0xd8, 0xcd, 0xee, 0xee, 0xcb, 0xce, 0xee, 0xfd,
+ 0x0e, 0x4e, 0x2c, 0x0c,
+ 0xfc, 0x4e, 0x5d, 0x1c, 0x0d, 0x2e, 0x3f, 0x1c, 0x0b, 0x0e, 0x2e, 0x5e,
+ 0x3f, 0x4b, 0x3c, 0x4e,
+ 0x3f, 0x4f, 0x5e, 0x3e, 0x3e, 0x2e, 0x2e, 0x1b, 0x3f, 0x61, 0x20, 0x1e,
+ 0x1f, 0x2e, 0x2c, 0x0b,
+ 0x0f, 0xfe, 0xff, 0x0f, 0xde, 0xce, 0xef, 0xd0, 0xbe, 0x01, 0x17, 0x02,
+ 0xf0, 0x33, 0x42, 0xe0,
+ 0xd0, 0x36, 0x34, 0x02, 0x04, 0x44, 0x54, 0x34, 0x33, 0x45, 0x01, 0x03,
+ 0x43, 0x03, 0xb2, 0xf1,
+ 0x02, 0x03, 0xe1, 0x90, 0xe2, 0x04, 0x02, 0xe0, 0xe2, 0xf6, 0xe3, 0xc1,
+ 0xc1, 0xd1, 0x02, 0x54,
+ 0x01, 0xf0, 0x31, 0x52, 0x0f, 0x30, 0x40, 0x1b, 0x1c, 0x5d, 0x1c, 0x0c,
+ 0x0b, 0x0d, 0x2f, 0x2f,
+ 0xed, 0xfd, 0x6e, 0x4e, 0x08, 0x0e, 0x2f, 0x4f, 0x3e, 0x2e, 0x3f, 0x6f,
+ 0x3e, 0x2e, 0x2c, 0x2d,
+ 0x5f, 0x3e, 0x1a, 0x1e, 0x2f, 0x3e, 0x1d, 0x1f, 0x0e, 0xeb, 0xbe, 0xed,
+ 0xcf, 0xbe, 0xdc, 0xcf,
+ 0xdf, 0xbe, 0xdb, 0xde, 0xfe, 0xfe, 0xfe, 0x00, 0xf0, 0xf1, 0xd0, 0xf0,
+ 0xe1, 0xc2, 0xc3, 0xe7,
+ 0xd5, 0x80, 0xc0, 0xd0, 0xe1, 0xd3, 0xc2, 0xc3, 0xe2, 0xd4, 0xe4, 0xc0,
+ 0xd0, 0xf4, 0xe4, 0xe0,
+ 0xf2, 0xf3, 0xd0, 0xd0, 0x07, 0x02, 0xc0, 0xb0, 0xd0, 0xf5, 0xc2, 0xc1,
+ 0xe4, 0xe4, 0xb0, 0xe0,
+ 0xe3, 0xe3, 0x03, 0xf0, 0xfd, 0x10, 0x41, 0x2f, 0x29, 0x4e, 0x4e, 0x2c,
+ 0x3d, 0x50, 0x20, 0x31,
+ 0x4f, 0x2e, 0x40, 0x2d, 0x18, 0x3f, 0x30, 0x2c, 0x0b, 0x2d, 0x6e, 0x2e,
+ 0x2c, 0x3d, 0x5e, 0x40,
+ 0x2d, 0x2c, 0x4e, 0x3e, 0x2c, 0x1d, 0x1d, 0x1d, 0x1f, 0x0f, 0xfe, 0xbd,
+ 0xed, 0xcb, 0xe0, 0xd2,
+ 0xe4, 0xd0, 0xd0, 0xf0, 0x02, 0x10, 0xe9, 0xed, 0x00, 0xff, 0xef, 0x20,
+ 0x41, 0xf2, 0xa2, 0xd3,
+ 0xe7, 0xc4, 0xb3, 0xe4, 0xc3, 0xd1, 0xb1, 0xe0, 0xe2, 0xd0, 0xc0, 0xcf,
+ 0xe0, 0xe0, 0xf0, 0xf1,
+ 0x07, 0x14, 0x12, 0x13, 0x02, 0x01, 0x34, 0x23, 0x01, 0x11, 0x32, 0x02,
+ 0xe1, 0x06, 0x44, 0x03,
+ 0xa1, 0xf2, 0x15, 0x23, 0xe2, 0xa0, 0x02, 0x35, 0x63, 0x12, 0x10, 0x51,
+ 0x30, 0x3f, 0x30, 0x61,
+ 0x2f, 0x1a, 0x2f, 0x3f, 0x4f, 0x3d, 0x2e, 0x40, 0x21, 0x1d, 0x3a, 0x40,
+ 0x41, 0x20, 0x2a, 0x30,
+ 0x50, 0x2c, 0x2d, 0x40, 0x31, 0x2d, 0x3c, 0x30, 0x41, 0x1e, 0x1a, 0x2f,
+ 0x00, 0xf0, 0xd0, 0xbd,
+ 0xce, 0xe2, 0xc2, 0xcd, 0xe2, 0xe7, 0xf6, 0xd0, 0xe0, 0xf2, 0xd2, 0xe2,
+ 0xf2, 0xf3, 0xd1, 0x91,
+ 0xe5, 0xd3, 0xb0, 0xdd, 0xe0, 0xe2, 0xc0, 0xcd, 0xef, 0x01, 0x0e, 0x0a,
+ 0x10, 0x30, 0x11, 0x11,
+ 0x13, 0x27, 0x11, 0xdf, 0xaf, 0xe2, 0xd2, 0xdf, 0xc0, 0xf5, 0xf0, 0xdd,
+ 0xfe, 0xce, 0xba, 0xdd,
+ 0xdd, 0xff, 0x0f, 0x3c, 0x0a, 0xee, 0xae, 0xdb, 0xed, 0xed, 0x0d, 0x3c,
+ 0x4e, 0x0c, 0xfd, 0xed,
+ 0xdd, 0xcb, 0x0e, 0x1c, 0x0e, 0x2f, 0x2f, 0x3e, 0x5d, 0x4f, 0x4f, 0x4d,
+ 0x2d, 0x2b, 0x2f, 0x1e,
+ 0xcc, 0xff, 0x00, 0x80, 0xc0, 0xf3, 0xe5, 0xd3, 0xb3, 0xe5, 0xf3, 0x02,
+ 0xe4, 0xd3, 0xd1, 0xc0,
+ 0xd0, 0xe1, 0xe3, 0xc2, 0xc2, 0xc4, 0xe4, 0xf4, 0xf2, 0x03, 0xf2, 0x12,
+ 0x22, 0x00, 0xf4, 0xf3,
+ 0xf0, 0xce, 0xb4, 0xc4, 0xc2, 0xd5, 0xe4, 0xd2, 0xd1, 0xe2, 0xd2, 0xd0,
+ 0xdd, 0x1c, 0x7f, 0x4e,
+ 0x1d, 0x19, 0x3d, 0x6e, 0x1d, 0x1d, 0x1e, 0x00, 0xf0, 0xcb, 0x01, 0x01,
+ 0x17, 0x00, 0x2a, 0x00,
+ 0x67, 0xc7, 0xbd, 0xe1, 0x6a, 0xc8, 0x27, 0xe1, 0xdf, 0x88, 0xfe, 0x64,
+ 0x42, 0xfb, 0x00, 0x5f,
+ 0x00, 0x23, 0x1f, 0x0f, 0x00, 0x00, 0xed, 0xfe, 0xf5, 0xf4, 0xf0, 0x2e,
+ 0xf0, 0xf5, 0x43, 0xbe,
+ 0x8e, 0x04, 0x37, 0x0f, 0xcd, 0x10, 0x43, 0x03, 0x3f, 0xfd, 0xe0, 0x00,
+ 0xe1, 0x02, 0xf0, 0xef,
+ 0x0f, 0xdc, 0xde, 0x12, 0x47, 0x8f, 0xba, 0x10, 0x23, 0x00, 0xcf, 0x0e,
+ 0x0f, 0x01, 0x26, 0x00,
+ 0x30, 0x3f, 0x0d, 0xec, 0x20, 0x74, 0x30, 0xee, 0xdc, 0x31, 0x31, 0xdb,
+ 0xdf, 0x12, 0xe2, 0xb0,
+ 0x02, 0xe1, 0xae, 0xfd, 0x00, 0x1f, 0x24, 0x00, 0xda, 0x30, 0x51, 0x00,
+ 0x00, 0x6e, 0x0e, 0x10,
+ 0x02, 0x03, 0xfb, 0xcf, 0x00, 0xf1, 0x01, 0xd0, 0xfd, 0xe8, 0xe0, 0xf0,
+ 0xb1, 0x1f, 0x50, 0x22,
+ 0x10, 0x1d, 0x2f, 0x34, 0x67, 0x11, 0x01, 0xf0, 0x0e, 0x20, 0xf2, 0xb3,
+ 0x11, 0x33, 0xde, 0x81,
+ 0x07, 0xe3, 0x0e, 0x02, 0x02, 0xab, 0x12, 0x16, 0xf0, 0xfd, 0x01, 0x53,
+ 0x1e, 0x0c, 0x0f, 0xdf,
+ 0x0f, 0x22, 0x0f, 0xf2, 0xf7, 0xf5, 0xf0, 0xdf, 0xdf, 0x11, 0x33, 0x50,
+ 0x00, 0xbf, 0xf9, 0x0f,
+ 0x70, 0x22, 0x0c, 0xdd, 0x22, 0x65, 0x22, 0xfe, 0xef, 0x01, 0x00, 0x1f,
+ 0x00, 0x03, 0x1c, 0xff,
+ 0xd0, 0xec, 0xdd, 0xee, 0xef, 0x00, 0x70, 0x00, 0xfc, 0xef, 0x00, 0x5e,
+ 0x2e, 0x12, 0x35, 0x00,
+ 0xf3, 0x00, 0x0f, 0x70, 0x0e, 0xa8, 0x0f, 0x44, 0x13, 0xef, 0xdc, 0xfe,
+ 0x10, 0x55, 0x00, 0xfe,
+ 0x0f, 0x09, 0xc0, 0x17, 0x01, 0x0e, 0x2f, 0x41, 0xe1, 0xc0, 0x00, 0x65,
+ 0x00, 0xad, 0x0f, 0x03,
+ 0x25, 0xee, 0xff, 0x22, 0x02, 0xed, 0xcd, 0x0f, 0x43, 0x03, 0xec, 0x0b,
+ 0x00, 0x15, 0x11, 0xef,
+ 0xdf, 0x11, 0xd0, 0xd0, 0x3f, 0x44, 0xe1, 0xb0, 0xf0, 0xee, 0x00, 0x74,
+ 0x71, 0x2a, 0xe0, 0x02,
+ 0x04, 0xde, 0x0e, 0x20, 0x00, 0xeb, 0xf0, 0xff, 0xe2, 0x14, 0x21, 0xea,
+ 0xcf, 0x20, 0x70, 0x00,
+ 0x0e, 0x00, 0x01, 0x03, 0xfb, 0x0f, 0x4f, 0x00, 0x10, 0x50, 0x10, 0x50,
+ 0x2e, 0x4f, 0x01, 0xdd,
+ 0xf8, 0x0d, 0x33, 0x04, 0x2f, 0x0e, 0x8c, 0xd0, 0x12, 0x10, 0x0f, 0xf3,
+ 0xd0, 0xd0, 0x30, 0x77,
+ 0x23, 0xd9, 0x20, 0x61, 0xf1, 0xe0, 0xf0, 0x0f, 0x00, 0xd2, 0x03, 0xac,
+ 0xee, 0xd2, 0x12, 0x32,
+ 0x10, 0xdd, 0xce, 0x33, 0x57, 0xfc, 0xdc, 0x22, 0x44, 0xff, 0x0d, 0x24,
+ 0x12, 0xdd, 0xc0, 0xf5,
+ 0x01, 0xf2, 0x12, 0x30, 0x0c, 0xcd, 0xcd, 0xd0, 0x67, 0x04, 0xad, 0x0f,
+ 0x21, 0x23, 0xff, 0xdd,
+ 0x00, 0x44, 0x50, 0x0f, 0xfc, 0xfe, 0x00, 0x41, 0x00, 0xbb, 0x10, 0x01,
+ 0x04, 0xcf, 0x00, 0xf1,
+ 0xf0, 0x02, 0x67, 0x00, 0x0c, 0xff, 0x10, 0x43, 0x0f, 0x1e, 0x22, 0x1e,
+ 0x0d, 0x00, 0x36, 0x62,
+ 0x0e, 0xfc, 0x02, 0x34, 0xfe, 0xde, 0xc0, 0x17, 0x02, 0xbb, 0xf0, 0x10,
+ 0xf0, 0xa0, 0x0f, 0x30,
+ 0x00, 0x00, 0x30, 0x10, 0x10, 0x02, 0xd0, 0x02, 0x24, 0x45, 0xff, 0xcd,
+ 0x00, 0x0f, 0xaf, 0xd0,
+ 0xd0, 0xec, 0xcf, 0xf7, 0xd0, 0xed, 0x02, 0x54, 0xff, 0xff, 0x10, 0x43,
+ 0x47, 0x00, 0x1b, 0x00,
+ 0x2f, 0x31, 0xe1, 0xf0, 0xd0, 0x70, 0x45, 0xdf, 0xee, 0xdf, 0x02, 0xc3,
+ 0xf2, 0xe0, 0xf0, 0xdc,
+ 0xfc, 0x0e, 0x7c, 0x5e, 0x1e, 0x13, 0x07, 0x00, 0x0c, 0x1f, 0x20, 0xf0,
+ 0x00, 0x31, 0x20, 0xe0,
+ 0x74, 0x5f, 0xfe, 0xf0, 0xef, 0x00, 0x17, 0x31, 0xfb, 0x30, 0x71, 0x10,
+ 0x12, 0x0f, 0x0d, 0x0f,
+ 0x56, 0x00, 0x0c, 0x0f, 0xc0, 0xd0, 0x03, 0x4e, 0x1d, 0xe4, 0x81, 0x02,
+ 0xf3, 0x00, 0xff, 0xe0,
+ 0xdd, 0x0d, 0x00, 0x77, 0x02, 0x0f, 0x1b, 0x1f, 0x21, 0x12, 0xfe, 0x0b,
+ 0x22, 0x01, 0x9d, 0xe0,
+ 0xf7, 0x06, 0xdf, 0xcc, 0x01, 0x02, 0x10, 0x20, 0x30, 0x00, 0xe3, 0xaf,
+ 0x0e, 0x41, 0x20, 0xfd,
+ 0x00, 0x17, 0xf0, 0xae, 0x01, 0x46, 0xff, 0xfe, 0x0f, 0x00, 0x02, 0xfe,
+ 0xde, 0xdf, 0x00, 0x20,
+ 0xde, 0xc0, 0xf1, 0x66, 0x0f, 0x1c, 0x70, 0x02, 0x0f, 0x30, 0x35, 0xef,
+ 0x0f, 0x40, 0x01, 0x00,
+ 0xe0, 0x01, 0x45, 0x01, 0xee, 0x40, 0x77, 0x20, 0xeb, 0x00, 0x01, 0xdf,
+ 0xee, 0xf0, 0x04, 0xf0,
+ 0xaa, 0x10, 0x74, 0x00, 0xef, 0xee, 0x03, 0x12, 0xef, 0xdf, 0x00, 0xf3,
+ 0xef, 0x0e, 0x00, 0x55,
+ 0x12, 0xde, 0xdd, 0x50, 0x6e, 0x10, 0x37, 0xf0, 0xdd, 0xf0, 0xe2, 0xb0,
+ 0x0f, 0xf4, 0xd2, 0xcf,
+ 0xd0, 0xf0, 0x00, 0x2d, 0x5d, 0x00, 0x21, 0x1b, 0x5c, 0x2f, 0x1d, 0x40,
+ 0x10, 0xd9, 0xdf, 0x04,
+ 0x34, 0x10, 0x10, 0xfa, 0x00, 0xb2, 0xd0, 0x00, 0x11, 0xee, 0xcd, 0xef,
+ 0xec, 0x1c, 0x71, 0xf1,
+ 0xcb, 0x3e, 0x71, 0x34, 0xdd, 0xec, 0x20, 0x50, 0x05, 0x00, 0xf0, 0xef,
+ 0xbc, 0x00, 0x14, 0x36,
+ 0xde, 0xbc, 0x10, 0x53, 0x00, 0x0f, 0xf0, 0x1f, 0x30, 0x00, 0x1f, 0x0e,
+ 0xe2, 0x01, 0xf2, 0xd1,
+ 0x0b, 0xfe, 0x01, 0x27, 0xa2, 0xd0, 0x03, 0x12, 0xd0, 0x9f, 0x03, 0x23,
+ 0x20, 0xe1, 0xb2, 0x07,
+ 0x31, 0x1b, 0x20, 0xf2, 0xc3, 0xff, 0xeb, 0x21, 0x42, 0xf0, 0xbd, 0x01,
+ 0x57, 0x02, 0xe0, 0xdd,
+ 0xff, 0x01, 0xd1, 0x9c, 0x0f, 0x0f, 0x31, 0x16, 0x10, 0x3e, 0x30, 0x4f,
+ 0x60, 0x11, 0x53, 0x08,
+ 0x1e, 0x0f, 0xe0, 0xd0, 0xec, 0xef, 0xef, 0xd1, 0xb1, 0xef, 0x0d, 0xf2,
+ 0xe4, 0xd0, 0x63, 0x3f,
+ 0x08, 0x30, 0x32, 0xe3, 0xc9, 0x30, 0x70, 0x00, 0xff, 0x0f, 0x50, 0x01,
+ 0xe0, 0xee, 0x04, 0x12,
+ 0xfb, 0xcf, 0x0f, 0x21, 0x02, 0xe0, 0xed, 0xf1, 0xd2, 0xe0, 0x6d, 0x52,
+ 0x12, 0x0f, 0x02, 0x15,
+ 0x0f, 0x03, 0x07, 0x05, 0xcf, 0xe0, 0x00, 0xf1, 0xc0, 0xd1, 0x24, 0x33,
+ 0xe1, 0xac, 0x0a, 0x00,
+ 0x04, 0xd1, 0x00, 0x00, 0xf0, 0xb0, 0xc0, 0xff, 0x00, 0x2f, 0x1f, 0x04,
+ 0xe2, 0x7e, 0x3b, 0x10,
+ 0x23, 0x17, 0xd0, 0x8f, 0xfd, 0x01, 0x02, 0x0f, 0x0f, 0x32, 0x00, 0x00,
+ 0x20, 0x73, 0x50, 0x08,
+ 0x09, 0x02, 0x13, 0x00, 0x1f, 0x0f, 0x00, 0xf0, 0xdd, 0x10, 0x11, 0xca,
+ 0xbe, 0xf0, 0xd0, 0xd0,
+ 0x1d, 0x40, 0x74, 0x0d, 0x0a, 0x00, 0x74, 0x01, 0x00, 0x0d, 0x20, 0x00,
+ 0xf0, 0x10, 0x30, 0xf3,
+ 0xb0, 0x0c, 0x0f, 0xf0, 0xef, 0xd0, 0x14, 0x44, 0xee, 0xfe, 0x14, 0x02,
+ 0xd0, 0xc8, 0x2f, 0x31,
+ 0x06, 0x10, 0xff, 0xb0, 0x00, 0x01, 0x03, 0xa2, 0xdf, 0xfe, 0x01, 0x24,
+ 0xde, 0xee, 0x72, 0x37,
+ 0xcf, 0xbd, 0xe0, 0xef, 0x00, 0x40, 0x11, 0x10, 0xe0, 0xf1, 0xf0, 0xf0,
+ 0x07, 0x71, 0x2e, 0xed,
+ 0x01, 0x27, 0x22, 0x00, 0x30, 0x7f, 0x10, 0x00, 0x0d, 0x0e, 0x10, 0xc0,
+ 0xfe, 0x11, 0x15, 0x1e,
+ 0x09, 0x40, 0x02, 0xcf, 0xbd, 0xf4, 0x04, 0xe0, 0xbc, 0xee, 0x11, 0x44,
+ 0x30, 0x0a, 0xe0, 0x50,
+ 0x14, 0x3e, 0x4e, 0x51, 0x00, 0x0c, 0x3f, 0x31, 0xe1, 0xbd, 0x0e, 0xf1,
+ 0x01, 0xc9, 0x0f, 0x13,
+ 0x02, 0xfe, 0xee, 0xf3, 0x07, 0x20, 0x30, 0x40, 0x33, 0xce, 0xde, 0x57,
+ 0x03, 0xed, 0x10, 0x32,
+ 0x00, 0x9e, 0xdc, 0xdf, 0x00, 0x04, 0xa0, 0xce, 0x0f, 0xc0, 0xe5, 0xd0,
+ 0x01, 0x02, 0xe1, 0x23,
+ 0x7e, 0x08, 0x00, 0x0f, 0x40, 0x1e, 0x0d, 0xfe, 0x10, 0x13, 0xe7, 0xa0,
+ 0x0f, 0x13, 0x37, 0x00,
+ 0xce, 0x0f, 0x00, 0xde, 0xf0, 0xe1, 0xf0, 0x1d, 0x62, 0x01, 0x2e, 0x2c,
+ 0xec, 0xf0, 0x04, 0x53,
+ 0x1f, 0x2f, 0x0c, 0x1c, 0xcd, 0xe1, 0x04, 0xe0, 0x8b, 0xaf, 0x03, 0x05,
+ 0x0d, 0x1c, 0x21, 0x33,
+ 0x31, 0x3e, 0x2e, 0x30, 0x22, 0x7f, 0x1f, 0x30, 0x01, 0x00, 0x0e, 0x05,
+ 0xe2, 0xbb, 0x00, 0xf7,
+ 0xd2, 0xae, 0x0f, 0xe3, 0x00, 0x0c, 0xeb, 0x02, 0x34, 0x0e, 0x2c, 0x11,
+ 0x51, 0x52, 0x20, 0x20,
+ 0x04, 0x20, 0x1d, 0xb0, 0xe5, 0xf2, 0x00, 0xec, 0xa0, 0xf0, 0xe3, 0xde,
+ 0xef, 0x04, 0xe0, 0xfa,
+ 0x50, 0x50, 0x00, 0xe0, 0x03, 0x64, 0x00, 0x0c, 0xf0, 0x0f, 0x2f, 0xf1,
+ 0xf4, 0xf1, 0x03, 0xe0,
+ 0xeb, 0x0e, 0xff, 0x02, 0x75, 0x10, 0xfb, 0xd3, 0xe2, 0xcd, 0xfc, 0x20,
+ 0x00, 0x2d, 0x30, 0x2f,
+ 0x0d, 0xfe, 0x54, 0x76, 0x22, 0x11, 0x3e, 0x73, 0x17, 0xf2, 0xe0, 0x00,
+ 0xf1, 0xef, 0x00, 0xee,
+ 0xfa, 0x00, 0x50, 0x20, 0x20, 0x20, 0x23, 0x13, 0x0e, 0xf0, 0x37, 0x11,
+ 0x8f, 0xf0, 0xd3, 0xe1,
+ 0xbb, 0xdb, 0xf1, 0x15, 0x40, 0x0d, 0xcf, 0x22, 0x52, 0x00, 0x0e, 0x1e,
+ 0x0e, 0x0b, 0xde, 0x22,
+ 0x04, 0xc1, 0xad, 0x0b, 0x00, 0x01, 0xef, 0xfd, 0x01, 0x25, 0xef, 0x9c,
+ 0x00, 0x33, 0x00, 0xee,
+ 0xf1, 0x05, 0x00, 0x30, 0x00, 0x41, 0x33, 0xcf, 0xd8, 0x20, 0x70, 0x33,
+ 0x00, 0xff, 0xb9, 0xef,
+ 0x00, 0x01, 0x02, 0x90, 0x0f, 0x00, 0x2d, 0x0e, 0x31, 0x02, 0xdd, 0xfa,
+ 0x50, 0x53, 0x02, 0x0b,
+ 0xdc, 0x00, 0x00, 0x43, 0x31, 0x11, 0x04, 0x02, 0x00, 0x0f, 0x4f, 0x0f,
+ 0x2d, 0x3c, 0x12, 0xe7,
+ 0x83, 0xec, 0x0e, 0x53, 0x25, 0x00, 0xcd, 0xf1, 0xf1, 0xe0, 0xf1, 0xb0,
+ 0x0e, 0xf2, 0x02, 0x01,
+ 0xf3, 0x0f, 0xca, 0xef, 0x11, 0x24, 0x21, 0x21, 0x0e, 0xa9, 0xe0, 0xf2,
+ 0x24, 0x30, 0x1e, 0x12,
+ 0x34, 0x71, 0x22, 0xb0, 0x01, 0x14, 0x11, 0xc2, 0xef, 0x1f, 0x1e, 0x09,
+ 0xcf, 0x32, 0x01, 0xb9,
+ 0x00, 0x45, 0x10, 0xfc, 0x1e, 0x70, 0x30, 0x02, 0xae, 0x0f, 0x13, 0x02,
+ 0xfe, 0x0d, 0xe0, 0xef,
+ 0xfd, 0x20, 0x24, 0x04, 0xcc, 0xe9, 0x0f, 0x30, 0x72, 0x4e, 0x0e, 0x00,
+ 0x0f, 0x2f, 0x0f, 0x0f,
+ 0x01, 0x04, 0x0d, 0x30, 0x37, 0x10, 0x0d, 0xbf, 0xa2, 0xf2, 0x07, 0x10,
+ 0x0c, 0xf0, 0x02, 0x01,
+ 0xa0, 0x0f, 0xe0, 0x03, 0x47, 0x00, 0xed, 0xfe, 0x20, 0x30, 0xdb, 0xef,
+ 0x53, 0x20, 0xf1, 0xe3,
+ 0xe5, 0xb1, 0xd0, 0x8f, 0xf2, 0xd3, 0xf4, 0x11, 0x2f, 0x0a, 0x20, 0x73,
+ 0x22, 0x10, 0x1d, 0xfb,
+ 0x1f, 0x40, 0x04, 0xf0, 0xf1, 0xd0, 0xc0, 0xc2, 0xd3, 0xd1, 0xe0, 0xe0,
+ 0xc0, 0x17, 0x32, 0x6d,
+ 0x3c, 0x32, 0x2f, 0x18, 0x0e, 0x20, 0x73, 0x30, 0xfd, 0x00, 0x30, 0x0b,
+ 0xde, 0xde, 0xed, 0xde,
+ 0xd0, 0xd0, 0x3d, 0x48, 0x8c, 0xd1, 0x05, 0x10, 0x00, 0x0f, 0x72, 0x72,
+ 0x00, 0xee, 0x1e, 0x20,
+ 0x00, 0x01, 0x0f, 0x2f, 0x0b, 0xff, 0xf0, 0x01, 0xc5, 0xc2, 0x02, 0x13,
+ 0xfe, 0x89, 0x00, 0xf0,
+ 0xf0, 0xff, 0xee, 0xf0, 0x03, 0x00, 0x2d, 0x10, 0x20, 0x34, 0x65, 0x16,
+ 0x00, 0xe0, 0xef, 0xef,
+ 0xf1, 0x04, 0xd0, 0xc1, 0x03, 0xae, 0xc8, 0xf0, 0x00, 0x03, 0x21, 0x3f,
+ 0x20, 0x64, 0x01, 0x00,
+ 0x20, 0x00, 0x00, 0x31, 0x10, 0xbf, 0xd0, 0x1c, 0x48, 0x00, 0x01, 0xa2,
+ 0xff, 0x00, 0x13, 0xff,
+ 0xda, 0x0f, 0x20, 0x32, 0x11, 0x0f, 0x20, 0x5f, 0x0b, 0x00, 0x74, 0x61,
+ 0x0c, 0x10, 0x14, 0x01,
+ 0xd0, 0x0d, 0x02, 0x01, 0xe8, 0xce, 0x00, 0x42, 0x00, 0xbf, 0x0c, 0x30,
+ 0x60, 0x10, 0x1f, 0x24,
+ 0x1f, 0x0a, 0x00, 0xf5, 0xd1, 0xd0, 0x0f, 0x00, 0x02, 0x01, 0xf0, 0xd1,
+ 0x20, 0x3f, 0xff, 0x30,
+ 0x74, 0x0f, 0x0d, 0x00, 0xd2, 0x8b, 0xec, 0xe1, 0xe6, 0xb0, 0xfd, 0x00,
+ 0x04, 0xf1, 0x01, 0x22,
+ 0x16, 0xbd, 0xee, 0x31, 0x74, 0x01, 0x01, 0xf1, 0xfd, 0xdd, 0xfe, 0xfd,
+ 0xe0, 0xe2, 0xc2, 0x11,
+ 0x41, 0x20, 0x40, 0x20, 0x1c, 0x0d, 0x10, 0x07, 0xe2, 0x01, 0xcb, 0xfd,
+ 0x11, 0x56, 0xf1, 0xd0,
+ 0x0f, 0xfc, 0xd2, 0x52, 0x7c, 0x3d, 0x2d, 0xdd, 0xdb, 0x00, 0x60, 0xf1,
+ 0xcf, 0xf0, 0x06, 0xef,
+ 0xcc, 0xd0, 0xf2, 0x47, 0x30, 0x2d, 0x40, 0x50, 0x10, 0x11, 0x3d, 0x0c,
+ 0x10, 0x53, 0x13, 0x1e,
+ 0x0b, 0xdf, 0xc0, 0x01, 0x05, 0x21, 0xae, 0xdb, 0x00, 0x03, 0xef, 0xdd,
+ 0xf0, 0x04, 0x11, 0x52,
+ 0x03, 0xf0, 0x40, 0x41, 0x02, 0x1f, 0x0e, 0x42, 0x00, 0xc0, 0xdc, 0xcc,
+ 0xf1, 0xd5, 0xf1, 0xf5,
+ 0x17, 0x00, 0x8f, 0xec, 0xf1, 0x02, 0x02, 0xe0, 0xde, 0x1d, 0x7e, 0x1e,
+ 0x25, 0x23, 0x1c, 0x2e,
+ 0x10, 0x10, 0x72, 0x10, 0x0f, 0xb9, 0x01, 0x03, 0xc2, 0x00, 0x3e, 0x00,
+ 0xc0, 0x00, 0x1d, 0x1e,
+ 0xef, 0xfd, 0x3e, 0x46, 0x22, 0x20, 0x4e, 0x03, 0x44, 0x04, 0xa3, 0xf5,
+ 0x13, 0x41, 0xfd, 0xba,
+ 0x0c, 0x0f, 0x0f, 0x13, 0xf1, 0xdb, 0x00, 0x00, 0x20, 0x2e, 0x22, 0xf7,
+ 0xf3, 0x0c, 0x40, 0x74,
+ 0x23, 0x20, 0x4f, 0x32, 0x13, 0x0c, 0x1e, 0x02, 0xb3, 0xc0, 0xeb, 0xde,
+ 0xd1, 0xf4, 0xcf, 0xcd,
+ 0xdd, 0x02, 0x35, 0x00, 0xf0, 0x0e, 0x0f, 0x0d, 0x0b, 0x70, 0x70, 0x01,
+ 0xe1, 0xcf, 0x0c, 0x01,
+ 0x05, 0x10, 0x22, 0x0f, 0xcc, 0xd3, 0x02, 0x0b, 0xea, 0xed, 0xff, 0x70,
+ 0x45, 0x01, 0x0f, 0x1c,
+ 0x0d, 0x10, 0x44, 0x0f, 0x0d, 0x00, 0x22, 0xf1, 0xf0, 0x10, 0x90, 0xda,
+ 0x11, 0x36, 0x9f, 0xdf,
+ 0x0f, 0x00, 0x10, 0x00, 0xdf, 0xdb, 0x10, 0x73, 0x33, 0x2e, 0x0c, 0x2e,
+ 0x0d, 0x20, 0x53, 0x56,
+ 0x0f, 0x0e, 0xe1, 0x02, 0xf0, 0x07, 0x06, 0x00, 0xbd, 0x12, 0x33, 0x30,
+ 0x2d, 0x3e, 0x0f, 0xc0,
+ 0x00, 0x10, 0x50, 0x03, 0xa3, 0x00, 0x01, 0x05, 0x05, 0xd0, 0xcc, 0xf0,
+ 0xf1, 0xc0, 0xdd, 0xe0,
+ 0x06, 0x30, 0x0e, 0x70, 0x01, 0x01, 0x03, 0x02, 0x05, 0x20, 0x2c, 0x3e,
+ 0x1f, 0x1f, 0x9d, 0xdc,
+ 0x00, 0x10, 0x01, 0xc0, 0x0c, 0x62, 0x14, 0x01, 0x0f, 0xeb, 0xfe, 0x03,
+ 0x02, 0x88, 0xee, 0x00,
+ 0x23, 0x20, 0x2f, 0xd1, 0xc1, 0x50, 0x21, 0xf0, 0xeb, 0x00, 0x31, 0xbf,
+ 0xed, 0xf1, 0x37, 0x10,
+ 0xdb, 0xcf, 0xff, 0x00, 0xfe, 0x40, 0x71, 0x10, 0xf0, 0xf0, 0x4f, 0x4d,
+ 0x0d, 0xed, 0x07, 0x07,
+ 0xc0, 0xbc, 0xf0, 0x02, 0x24, 0x20, 0x20, 0x22, 0x0f, 0xfe, 0xfe, 0x33,
+ 0x43, 0x3f, 0x2f, 0x72,
+ 0xf0, 0xdf, 0xe0, 0xb1, 0xe7, 0xf5, 0xf0, 0xdd, 0x12, 0x44, 0xd0, 0xc0,
+ 0xe0, 0xec, 0xeb, 0xd0,
+ 0x12, 0x30, 0xfb, 0xe0, 0x63, 0x62, 0x10, 0x03, 0x06, 0x10, 0x3d, 0x00,
+ 0xc0, 0xf3, 0x03, 0x03,
+ 0xed, 0xec, 0x00, 0xc2, 0xa1, 0x0f, 0x1c, 0x3f, 0x40, 0x4f, 0x40, 0x22,
+ 0x08, 0x0b, 0x10, 0x60,
+ 0x00, 0x0d, 0x00, 0x10, 0xec, 0xd9, 0xf0, 0xe2, 0x14, 0x4f, 0x0f, 0x0e,
+ 0xc2, 0xf0, 0x50, 0x53,
+ 0x10, 0x3d, 0x2b, 0x50, 0x12, 0x0f, 0xf8, 0xfe, 0xff, 0x10, 0x00, 0xe4,
+ 0xf1, 0x61, 0x10, 0x00,
+ 0x01, 0xd0, 0xf2, 0xb4, 0xa1, 0xe0, 0xe9, 0xcf, 0x10, 0x43, 0x00, 0x0d,
+ 0xd2, 0x03, 0x2f, 0x00,
+ 0x05, 0x2f, 0x3b, 0x0f, 0xd0, 0x82, 0xde, 0xee, 0xd7, 0xd1, 0xb0, 0xff,
+ 0xf2, 0x07, 0x10, 0x21,
+ 0x30, 0x0e, 0x01, 0x73, 0x51, 0x1f, 0x0e, 0x0f, 0x22, 0x43, 0xeb, 0xbb,
+ 0x00, 0x21, 0x02, 0xe3,
+ 0xd0, 0x0f, 0x00, 0xcf, 0xbd, 0x0f, 0x33, 0x03, 0xba, 0x0e, 0x30, 0x20,
+ 0x20, 0x44, 0x32, 0x08,
+ 0x1d, 0x52, 0x22, 0x3e, 0xdb, 0xcf, 0xe0, 0x1f, 0x31, 0xd2, 0xdd, 0x1e,
+ 0x1d, 0x0e, 0xfe, 0x2b,
+ 0x7e, 0x1f, 0x04, 0x04, 0xee, 0xee, 0x3f, 0x75, 0x75, 0x10, 0x00, 0x00,
+ 0xed, 0x00, 0x12, 0x00,
+ 0x4a, 0x1f, 0x7e, 0x08, 0xe2, 0x1b, 0x28, 0x09, 0x33, 0x57, 0x31, 0x3d,
+ 0x3a, 0x3e, 0x4e, 0x2c,
+ 0x30, 0x30, 0x2f, 0x0b, 0x1e, 0x0b, 0xed, 0x0f, 0x0e, 0xcb, 0xcc, 0xfe,
+ 0xf0, 0xff, 0xbd, 0xeb,
+ 0xee, 0xee, 0xd0, 0xdf, 0xdf, 0xc1, 0xb3, 0xc3, 0xe4, 0xc5, 0xd1, 0xd2,
+ 0xc4, 0xd7, 0xc1, 0xc1,
+ 0xd1, 0xd3, 0xe3, 0xd3, 0xd4, 0xe4, 0xd3, 0xe5, 0xf3, 0xd3, 0xd4, 0xd2,
+ 0xa2, 0xd3, 0xc4, 0xd2,
+ 0xa1, 0xd2, 0xb1, 0xd0, 0xd0, 0xcd, 0xdb, 0xcd, 0xed, 0xfd, 0xee, 0xf0,
+ 0xde, 0xec, 0xde, 0xcf,
+ 0xdd, 0xeb, 0x0e, 0x1e, 0x2e, 0x3e, 0x4b, 0x2c, 0x3d, 0x5d, 0x4e, 0x3e,
+ 0x5a, 0x2c, 0x3d, 0x2c,
+ 0x1c, 0x1c, 0x1d, 0x1e, 0x1e, 0x2d, 0x1d, 0x0d, 0x1c, 0x0c, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0xfe, 0xdb,
+ 0x1e, 0x7e, 0x4f, 0x0c, 0xfd, 0x0d, 0xdd, 0xdd, 0xdc, 0xad, 0xaa, 0xdd,
+ 0xcd, 0xed, 0xce, 0xdb,
+ 0xde, 0xef, 0xd0, 0xd0, 0xd0, 0xc0, 0xd1, 0xe3, 0x03, 0xe3, 0x92, 0xd2,
+ 0xc3, 0xe7, 0xc7, 0xd1,
+ 0xe2, 0xe2, 0xf3, 0xe1, 0xe0, 0xc0, 0xde, 0xce, 0xe0, 0xf1, 0xd1, 0xa0,
+ 0xce, 0xce, 0xdf, 0xd1,
+ 0xc3, 0xe3, 0xe4, 0xe4, 0xf3, 0x03, 0x05, 0x04, 0x03, 0x25, 0x65, 0x43,
+ 0x42, 0x32, 0x52, 0x22,
+ 0x31, 0x30, 0x2d, 0x2c, 0x2c, 0x2c, 0x2c, 0x1d, 0x0f, 0x11, 0x23, 0x35,
+ 0x55, 0x43, 0x53, 0x43,
+ 0x45, 0x32, 0x32, 0x42, 0x30, 0x31, 0x42, 0x44, 0x31, 0x31, 0x32, 0x33,
+ 0x33, 0x33, 0x35, 0x23,
+ 0x33, 0x13, 0x11, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x0c, 0x0a, 0x0e,
+ 0x10, 0x10, 0x50, 0x21,
+ 0x05, 0x17, 0x74, 0x43, 0x03, 0xe3, 0xe4, 0xf3, 0xb5, 0xb2, 0xd2, 0xa1,
+ 0xe1, 0xd2, 0xf2, 0xe1,
+ 0xf2, 0xe3, 0xf1, 0xf2, 0x02, 0xf3, 0xf0, 0xed, 0xd8, 0xdd, 0xed, 0xcd,
+ 0xab, 0xcc, 0xde, 0xdf,
+ 0xbe, 0xcd, 0xdd, 0xcc, 0xcd, 0xdd, 0xdf, 0xed, 0xea, 0xfc, 0xec, 0xfe,
+ 0x1d, 0x6d, 0x4d, 0x3d,
+ 0x4e, 0x4d, 0x2d, 0x3d, 0x2b, 0x2d, 0x2e, 0x1e, 0x0e, 0x0d, 0xfd, 0xfb,
+ 0xee, 0xdd, 0xbb, 0xdd,
+ 0xff, 0xef, 0x0d, 0x1e, 0x4f, 0x40, 0x30, 0x50, 0x45, 0x24, 0x33, 0x33,
+ 0x32, 0x24, 0x03, 0x07,
+ 0x02, 0xd2, 0xa2, 0xd2, 0xd4, 0xc5, 0xe3, 0xe4, 0xf3, 0xd3, 0xc4, 0xe2,
+ 0x03, 0x04, 0x12, 0x23,
+ 0x34, 0x23, 0x23, 0x53, 0x55, 0x43, 0x33, 0x23, 0x44, 0x45, 0x32, 0x31,
+ 0x21, 0x02, 0xf2, 0xe2,
+ 0xe1, 0xc0, 0xb0, 0xe0, 0xf0, 0x10, 0x3f, 0x2f, 0x4c, 0x3c, 0x3d, 0x5e,
+ 0x3e, 0x5e, 0x20, 0x20,
+ 0x20, 0x2f, 0x10, 0x00, 0x01, 0x0f, 0xe8, 0xda, 0xdb, 0x1d, 0x7e, 0x2e,
+ 0x3d, 0x2a, 0x2d, 0x2d,
+ 0x0e, 0xed, 0xec, 0x1f, 0x3e, 0x2f, 0x4e, 0x5e, 0x2f, 0x5e, 0x4f, 0x4f,
+ 0x50, 0x31, 0x45, 0x23,
+ 0x34, 0x32, 0x34, 0x56, 0x23, 0x23, 0x12, 0x33, 0x43, 0x12, 0x13, 0x22,
+ 0x12, 0x02, 0xc4, 0xd4,
+ 0xe4, 0xc2, 0xb4, 0xc4, 0xc4, 0xd4, 0xc3, 0xc3, 0xd3, 0xe4, 0xd4, 0xc2,
+ 0xd1, 0xd3, 0xd4, 0xc3,
+ 0xf4, 0xf2, 0x03, 0x02, 0x04, 0xf2, 0xf1, 0xf2, 0xf2, 0xe1, 0xc0, 0xf0,
+ 0xe0, 0xe0, 0xe0, 0xec,
+ 0x0c, 0x1c, 0x1a, 0x0c, 0xdd, 0x9e, 0xdc, 0x0e, 0x1e, 0x2f, 0xdf, 0x8c,
+ 0xed, 0xde, 0xdf, 0xdf,
+ 0x0e, 0xfd, 0xed, 0x0d, 0x5c, 0x59, 0x3d, 0x5b, 0x4e, 0x2d, 0x2d, 0x3b,
+ 0x3d, 0x1d, 0x3d, 0x5d,
+ 0x4d, 0x3d, 0x3c, 0x3d, 0x0c, 0x0d, 0xfb, 0x2d, 0x6f, 0x1e, 0x2d, 0x1c,
+ 0x2d, 0x2d, 0x1c, 0x5e,
+ 0x5e, 0x3f, 0x3d, 0x2c, 0x4e, 0x2e, 0x3f, 0x0e, 0x1f, 0x00, 0xcf, 0x9e,
+ 0xdf, 0xb0, 0xde, 0xcd,
+ 0xd0, 0xd2, 0xc4, 0xd7, 0xc2, 0xd1, 0xc0, 0xd2, 0xd2, 0xd1, 0xdf, 0xdc,
+ 0xdc, 0xe0, 0xd3, 0xd2,
+ 0xb1, 0xd7, 0xd6, 0xd2, 0xc1, 0xd2, 0xd3, 0xe2, 0xc4, 0xc3, 0xc0, 0xd0,
+ 0xc0, 0xe5, 0xf3, 0xd1,
+ 0xd1, 0xd2, 0xd2, 0xe3, 0xe3, 0xd1, 0xd1, 0xe3, 0xe5, 0xf2, 0x01, 0x1e,
+ 0x0b, 0x6e, 0x5d, 0x2c,
+ 0x1d, 0x10, 0x1e, 0x09, 0xfd, 0x0d, 0x0e, 0x0c, 0x40, 0x60, 0x30, 0x5f,
+ 0x4e, 0x5b, 0x4b, 0x3e,
+ 0x3d, 0x5c, 0x3c, 0x4e, 0x3e, 0x30, 0x40, 0x21, 0x21, 0x22, 0x13, 0x25,
+ 0x03, 0x14, 0x01, 0x00,
+ 0x10, 0x30, 0x21, 0x30, 0x1c, 0x1d, 0x0e, 0xde, 0xbe, 0xf2, 0xf3, 0xc0,
+ 0xc2, 0xb6, 0xc3, 0xb2,
+ 0xc0, 0xd2, 0xc7, 0xe6, 0xd1, 0xd3, 0xd6, 0xe2, 0xe4, 0xf3, 0xf4, 0x03,
+ 0x04, 0x02, 0xe3, 0xe1,
+ 0xf2, 0x02, 0x13, 0x11, 0xe0, 0x80, 0xe0, 0xd0, 0xe0, 0xd5, 0xc3, 0xd2,
+ 0xc2, 0xc3, 0xc3, 0xc3,
+ 0xd3, 0xd3, 0xd6, 0xd3, 0xf3, 0x03, 0x23, 0x3f, 0x5b, 0x4d, 0x4e, 0x50,
+ 0x30, 0x4c, 0x3b, 0x3d,
+ 0x4d, 0x2a, 0x2c, 0x2c, 0x2d, 0x1c, 0x2d, 0x1d, 0x2c, 0x2d, 0x2d, 0x2d,
+ 0x4c, 0x5c, 0x4e, 0x4d,
+ 0x3e, 0x4c, 0x3d, 0x2c, 0x3d, 0x4f, 0x4f, 0x30, 0x3e, 0x3e, 0x3e, 0x2f,
+ 0x2f, 0x0f, 0x0e, 0xff,
+ 0xdd, 0xbb, 0xde, 0xcd, 0xdd, 0xba, 0xdd, 0xdd, 0xef, 0xe0, 0xd0, 0xd0,
+ 0xdf, 0xe0, 0xd0, 0xc2,
+ 0xc3, 0xe4, 0xb3, 0xc0, 0xc2, 0xe5, 0xd5, 0xc3, 0xd5, 0xe3, 0xe3, 0xc5,
+ 0xe3, 0xf2, 0xf2, 0x05,
+ 0xe2, 0x01, 0x23, 0x35, 0x02, 0x12, 0x12, 0x12, 0xf2, 0xd5, 0xb3, 0xc3,
+ 0xb3, 0xd2, 0xc2, 0xe2,
+ 0xe3, 0x02, 0xf1, 0xf0, 0x01, 0x13, 0x46, 0x41, 0x31, 0x20, 0x21, 0x34,
+ 0x63, 0x34, 0x47, 0x43,
+ 0x43, 0x42, 0x23, 0x47, 0x52, 0x32, 0x31, 0x31, 0x32, 0x42, 0x34, 0x33,
+ 0x22, 0x33, 0x13, 0x35,
+ 0x43, 0x33, 0x34, 0x44, 0x32, 0x43, 0x32, 0x41, 0x23, 0x33, 0x24, 0x23,
+ 0x12, 0x22, 0x01, 0x00,
+ 0xe1, 0xb0, 0xcf, 0xc0, 0xe4, 0xf2, 0xee, 0xfc, 0x0d, 0xf0, 0xe3, 0xd2,
+ 0xa4, 0xd7, 0xe7, 0xd2,
+ 0xd2, 0xe3, 0x05, 0x02, 0xd2, 0xf2, 0x12, 0x62, 0x20, 0x32, 0x43, 0x1f,
+ 0x0c, 0xfc, 0xfd, 0xed,
+ 0x8b, 0xbb, 0xde, 0xac, 0xee, 0xde, 0xce, 0xee, 0xce, 0xed, 0xdd, 0xfe,
+ 0xee, 0x0f, 0x00, 0x00,
+ 0x20, 0x50, 0x34, 0x50, 0x30, 0x4d, 0x38, 0x3d, 0x3d, 0x30, 0x30, 0x2d,
+ 0x3c, 0x3e, 0x2f, 0x1d,
+ 0x1f, 0x10, 0x0e, 0x0e, 0xff, 0xf0, 0x03, 0x17, 0x54, 0x12, 0x53, 0x77,
+ 0x24, 0x21, 0x22, 0x34,
+ 0x43, 0x32, 0x21, 0x32, 0x33, 0x24, 0x00, 0x0f, 0xf0, 0xd0, 0xa0, 0xd0,
+ 0xd0, 0xd2, 0xb0, 0xd0,
+ 0xe3, 0xe7, 0xf5, 0x10, 0x20, 0x1d, 0x2f, 0x51, 0x36, 0x42, 0x44, 0x24,
+ 0x45, 0x23, 0x03, 0x04,
+ 0xd0, 0x67, 0xa0, 0xce, 0x37, 0xd0, 0xdf, 0x00, 0xe0, 0xf0, 0x9c, 0x01,
+ 0x24, 0xed, 0xee, 0x00,
+ 0x12, 0xfe, 0xdc, 0x00, 0x20, 0xef, 0xdd, 0xde, 0xdd, 0xab, 0xdd, 0xed,
+ 0xed, 0xec, 0xcc, 0xfe,
+ 0xec, 0xee, 0x0e, 0x3d, 0x1c, 0x3e, 0x70, 0x5d, 0x09, 0x1e, 0x50, 0x20,
+ 0x0e, 0x2e, 0x0e, 0x20,
+ 0x0f, 0x0f, 0x10, 0xef, 0x13, 0xdf, 0x9d, 0x05, 0xef, 0xf0, 0xf2, 0xbc,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0xe0, 0x04, 0xf2, 0xbe, 0xf3, 0x07, 0xd0, 0xe3, 0xf5, 0xb0, 0xe2, 0xd2,
+ 0xe4, 0xf6, 0xc2, 0xa1,
+ 0xd1, 0xd4, 0xe4, 0xd2, 0xc2, 0xe4, 0xe1, 0xd3, 0xf4, 0x04, 0xf2, 0xf1,
+ 0x02, 0x52, 0x56, 0x21,
+ 0x00, 0x00, 0x12, 0x23, 0xf0, 0xd1, 0xd1, 0xd1, 0x90, 0xef, 0xdf, 0xbc,
+ 0xee, 0xed, 0xed, 0xfe,
+ 0xd8, 0xfe, 0x10, 0x2f, 0x2e, 0x3e, 0x7f, 0x4e, 0x3c, 0x5f, 0x3f, 0x1c,
+ 0x3f, 0x2d, 0x1a, 0x3e,
+ 0x3c, 0x3e, 0x4e, 0x3f, 0x4f, 0x2d, 0x2d, 0x3c, 0x1c, 0x1d, 0x0c, 0x0c,
+ 0x0e, 0xec, 0xdd, 0xdd,
+ 0xad, 0xee, 0x0f, 0x00, 0xde, 0x00, 0x63, 0x00, 0x00, 0x13, 0x41, 0x12,
+ 0x02, 0xe3, 0xf3, 0xe5,
+ 0xc2, 0xb3, 0xc2, 0xc0, 0xc4, 0xd3, 0xd7, 0xe5, 0xc1, 0xb0, 0xe4, 0xf6,
+ 0x02, 0x01, 0x03, 0x02,
+ 0xf3, 0xf3, 0x04, 0x03, 0x03, 0x06, 0x02, 0xf2, 0x43, 0x73, 0x32, 0x34,
+ 0x32, 0x33, 0x31, 0x12,
+ 0x53, 0x33, 0x21, 0x1f, 0x1d, 0x5f, 0x30, 0x4d, 0x3a, 0x2d, 0x4f, 0x2d,
+ 0x08, 0x3e, 0x7d, 0x3d,
+ 0x2d, 0x3d, 0x2c, 0x1d, 0x1d, 0x50, 0x3e, 0x2a, 0x4f, 0x4f, 0x3e, 0x5f,
+ 0x3e, 0x2d, 0x4e, 0x3f,
+ 0x4f, 0x3d, 0x3b, 0x4d, 0x3f, 0x3c, 0x4f, 0x31, 0x30, 0x2f, 0x52, 0x26,
+ 0x11, 0x11, 0x10, 0x00,
+ 0x03, 0x01, 0xcb, 0xee, 0x13, 0x16, 0xe0, 0xbe, 0xef, 0xbe, 0xe0, 0xf1,
+ 0x02, 0xff, 0xe0, 0xf6,
+ 0xf3, 0xd4, 0xa1, 0xd1, 0xd3, 0xb5, 0xc1, 0xa0, 0xe4, 0xf6, 0xd2, 0xc2,
+ 0xd2, 0xe3, 0xd3, 0xe4,
+ 0xe5, 0xc1, 0xe0, 0xe0, 0xf3, 0xe1, 0xe0, 0xcf, 0xce, 0xcf, 0xde, 0xdf,
+ 0xde, 0xce, 0xd0, 0xc2,
+ 0xdc, 0xbc, 0xee, 0xd0, 0xd1, 0xd2, 0xbc, 0xeb, 0xdf, 0xcd, 0xec, 0x0b,
+ 0xf0, 0xc8, 0x33, 0x77,
+ 0xc9, 0xf0, 0x72, 0x00, 0xfd, 0x01, 0x22, 0xec, 0xee, 0x33, 0x21, 0xde,
+ 0xed, 0x00, 0x10, 0x00,
+ 0x0f, 0x2f, 0x0d, 0x3e, 0x4f, 0x2d, 0x2c, 0x2c, 0x60, 0x30, 0x1d, 0x1d,
+ 0x50, 0x0e, 0x0c, 0x56,
+ 0x00, 0x0d, 0x00, 0x11, 0x11, 0x0d, 0xee, 0x23, 0x12, 0xea, 0xf0, 0x00,
+ 0x01, 0x00, 0xcd, 0x00,
+ 0xef, 0x01, 0xab, 0xcc, 0x01, 0x01, 0xcd, 0xdd, 0xd1, 0xd4, 0x9e, 0xe0,
+ 0xf4, 0xe2, 0xe2, 0xe0,
+ 0xcf, 0x04, 0x06, 0xe0, 0x00, 0x01, 0x23, 0x55, 0xff, 0xfe, 0x02, 0x56,
+ 0x00, 0xee, 0x01, 0x22,
+ 0xde, 0x00, 0x13, 0xe0, 0xb0, 0xf1, 0x07, 0xe2, 0x9f, 0x02, 0x04, 0xe0,
+ 0xe1, 0xf2, 0x34, 0x55,
+ 0x00, 0xed, 0x31, 0x77, 0x30, 0xfe, 0x20, 0x74, 0x21, 0x0e, 0x10, 0x32,
+ 0x21, 0x0d, 0x1f, 0x43,
+ 0x11, 0x1f, 0x0d, 0x30, 0x55, 0x1f, 0x1f, 0x42, 0x21, 0x20, 0x3e, 0x20,
+ 0x33, 0x42, 0x36, 0x31,
+ 0x0c, 0x0e, 0x46, 0x32, 0x00, 0xbd, 0xe0, 0x03, 0xf2, 0xbe, 0xf0, 0x04,
+ 0xd0, 0xe1, 0xd2, 0xc0,
+ 0xcd, 0xf5, 0x07, 0xc0, 0xd0, 0xf1, 0xe1, 0xbf, 0xdd, 0x02, 0x05, 0xf0,
+ 0xde, 0xef, 0xdd, 0x00,
+ 0x00, 0xfe, 0xca, 0xfe, 0xf0, 0xde, 0x8b, 0xde, 0x00, 0x02, 0xef, 0xcb,
+ 0x00, 0x03, 0xf0, 0xab,
+ 0x00, 0x34, 0x21, 0xfe, 0x0e, 0x40, 0x52, 0x10, 0x1c, 0x20, 0x3f, 0x1e,
+ 0x10, 0x41, 0x0e, 0xe9,
+ 0xf0, 0x0e, 0xac, 0x0f, 0x53, 0x10, 0x0b, 0x1e, 0x40, 0x31, 0x30, 0x20,
+ 0x2f, 0x30, 0x41, 0x20,
+ 0x2f, 0x31, 0x77, 0x25, 0x1f, 0x10, 0x20, 0x53, 0x22, 0x0f, 0x0e, 0x23,
+ 0x37, 0x00, 0xd0, 0xe0,
+ 0x14, 0x13, 0xd2, 0xb0, 0xd1, 0xf3, 0x04, 0xf2, 0xc1, 0xe2, 0xd1, 0xf4,
+ 0xa0, 0xf2, 0x06, 0x03,
+ 0xc0, 0xe0, 0x02, 0xf2, 0x80, 0xe0, 0x07, 0x01, 0xf0, 0x01, 0x15, 0x01,
+ 0xd0, 0xf0, 0x42, 0x33,
+ 0xe0, 0x0f, 0xec, 0x41, 0x51, 0x22, 0x1e, 0x20, 0x0c, 0x1f, 0x20, 0xff,
+ 0xb9, 0x9a, 0x00, 0xe0,
+ 0x47, 0x89, 0xf0, 0x54, 0xbc, 0x00, 0x11, 0x00, 0x11, 0xed, 0x00, 0x33,
+ 0x21, 0xed, 0xdd, 0x21,
+ 0x43, 0x0f, 0x0e, 0x0f, 0x11, 0x33, 0x0e, 0x00, 0xfe, 0x21, 0x34, 0x00,
+ 0xfe, 0x00, 0xff, 0x43,
+ 0x13, 0x0c, 0x32, 0xfd, 0x77, 0x31, 0xdd, 0x32, 0x45, 0x11, 0xde, 0xd0,
+ 0x43, 0xf0, 0xbe, 0xf0,
+ 0x17, 0x01, 0xbe, 0xe0, 0x14, 0x12, 0xf0, 0xc0, 0xd0, 0x02, 0x15, 0xe0,
+ 0xd0, 0xf1, 0x12, 0x00,
+ 0x11, 0x75, 0x10, 0x10, 0x31, 0x31, 0x32, 0x10, 0xdb, 0x42, 0x33, 0xac,
+ 0xcc, 0x00, 0x13, 0xef,
+ 0xcb, 0xf0, 0x02, 0x00, 0xf0, 0xde, 0xef, 0x21, 0x0f, 0xfa, 0x2f, 0x70,
+ 0x40, 0x2e, 0x30, 0x31,
+ 0x31, 0xe9, 0x00, 0x4f, 0x0f, 0xcd, 0xed, 0x0e, 0xea, 0xdd, 0x50, 0x0f,
+ 0xb8, 0x10, 0x30, 0x0e,
+ 0xfe, 0x40, 0x40, 0x0e, 0xfd, 0xfd, 0x1f, 0x30, 0xfd, 0xcc, 0xee, 0x51,
+ 0x43, 0x0e, 0xfc, 0xbc,
+ 0x00, 0x06, 0xd0, 0xae, 0xde, 0xbc, 0xf0, 0xf2, 0xef, 0xcd, 0xff, 0xf1,
+ 0xee, 0xef, 0xf4, 0xf0,
+ 0xe0, 0xf1, 0xf6, 0xc0, 0xd1, 0xd3, 0x8f, 0xe0, 0xf5, 0xf4, 0xe0, 0xd0,
+ 0xf1, 0x04, 0x04, 0xf0,
+ 0xe0, 0x02, 0xf1, 0xe1, 0x04, 0x01, 0xc0, 0xf0, 0x02, 0x14, 0x23, 0x0f,
+ 0xad, 0xf1, 0x37, 0x34,
+ 0xae, 0xdd, 0x00, 0x01, 0x0f, 0x0f, 0x2f, 0xf9, 0x0e, 0x2f, 0x3e, 0x5f,
+ 0x4e, 0x4f, 0x2d, 0x29,
+ 0x7f, 0x40, 0x2e, 0x1d, 0x3f, 0x50, 0x20, 0x2f, 0x2e, 0x30, 0x3f, 0x3b,
+ 0x50, 0x32, 0x0c, 0x1b,
+ 0x20, 0x0e, 0x41, 0x42, 0x0d, 0x0d, 0x20, 0x1e, 0x0c, 0x0f, 0x45, 0x0f,
+ 0xa9, 0x11, 0x00, 0x00,
+ 0x02, 0xe0, 0xf2, 0xc0, 0xdf, 0x05, 0x02, 0x77, 0x77, 0xac, 0xcb, 0x45,
+ 0x10, 0xdf, 0x00, 0x33,
+ 0xf0, 0x9b, 0x11, 0x23, 0x00, 0xee, 0xf0, 0x11, 0x12, 0xf0, 0x0f, 0x00,
+ 0x01, 0xf0, 0xe0, 0xf0,
+ 0x12, 0x01, 0xe0, 0x01, 0x02, 0x00, 0xe1, 0xbe, 0x01, 0x27, 0xff, 0xd0,
+ 0x10, 0xdf, 0xff, 0x20,
+ 0x10, 0x1f, 0xfc, 0x20, 0x73, 0x2f, 0xf9, 0x00, 0x3f, 0x50, 0x10, 0x1e,
+ 0x0e, 0x0d, 0x10, 0x0c,
+ 0x2f, 0x2e, 0xfc, 0x2e, 0x3d, 0xea, 0x70, 0x50, 0x0f, 0xfc, 0x0e, 0x20,
+ 0x30, 0x0b, 0x40, 0x60,
+ 0x00, 0x31, 0x21, 0x0d, 0x00, 0x22, 0x12, 0x24, 0xde, 0xcd, 0xef, 0xbc,
+ 0xf0, 0xef, 0x00, 0x04,
+ 0xcb, 0xbb, 0x21, 0x32, 0x0f, 0xfe, 0xed, 0xff, 0x01, 0x02, 0xe0, 0x8b,
+ 0xf0, 0x03, 0x03, 0x04,
+ 0xde, 0xee, 0x35, 0x01, 0x13, 0x12, 0x9c, 0x01, 0x37, 0x01, 0x00, 0xf1,
+ 0x01, 0x21, 0x00, 0x75,
+ 0x12, 0xff, 0x0f, 0x00, 0x01, 0x02, 0xe0, 0xad, 0xdc, 0xf0, 0x27, 0x32,
+ 0xd0, 0xbf, 0xf0, 0x01,
+ 0xf0, 0x00, 0x32, 0x00, 0xba, 0xff, 0x61, 0x33, 0x10, 0x0e, 0x2e, 0x41,
+ 0x45, 0x32, 0x1f, 0x0c,
+ 0x21, 0x56, 0x00, 0x00, 0x32, 0x11, 0x00, 0xef, 0x20, 0x77, 0x31, 0x11,
+ 0x10, 0x11, 0x75, 0x11,
+ 0xfd, 0x0f, 0x32, 0x12, 0x10, 0x00, 0x10, 0x12, 0xdc, 0xef, 0x24, 0xf0,
+ 0xbe, 0xef, 0xe1, 0xf1,
+ 0xf2, 0xe1, 0xf2, 0xd0, 0xd0, 0xc0, 0xf3, 0x27, 0x47, 0xf0, 0xc0, 0x00,
+ 0x21, 0x12, 0xae, 0xff,
+ 0x00, 0xf1, 0xe2, 0xcf, 0x88, 0xf0, 0xf1, 0xdf, 0xe0, 0xf0, 0xd0, 0xbf,
+ 0xe0, 0xdd, 0xe0, 0xf2,
+ 0xe0, 0xee, 0xb8, 0x01, 0x11, 0xef, 0xfe, 0x44, 0x0f, 0xef, 0xde, 0x00,
+ 0x20, 0x10, 0x77, 0x88,
+ 0x10, 0x45, 0xcb, 0x00, 0x00, 0x32, 0x31, 0x9b, 0x0f, 0x33, 0x01, 0xfd,
+ 0xfe, 0x12, 0x21, 0xec,
+ 0x00, 0x32, 0x41, 0x10, 0x0f, 0x00, 0x20, 0x30, 0x2f, 0x31, 0x0f, 0x1c,
+ 0x3f, 0x40, 0x43, 0x0e,
+ 0x0e, 0x76, 0x0e, 0xeb, 0x32, 0x21, 0x0f, 0xfe, 0x44, 0x43, 0xca, 0xcd,
+ 0x22, 0x45, 0x00, 0xde,
+ 0xff, 0x22, 0x01, 0xf0, 0xf0, 0x21, 0x22, 0xf0, 0xe0, 0x01, 0x03, 0xf0,
+ 0xd0, 0x03, 0x04, 0x8f,
+ 0xf1, 0x27, 0xce, 0xce, 0x35, 0x11, 0xde, 0xe0, 0xdf, 0xde, 0xac, 0x12,
+ 0x46, 0xce, 0xdd, 0x01,
+ 0x03, 0xf0, 0xe0, 0xce, 0xef, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xba, 0x0f,
+ 0x00, 0x32, 0x12, 0xdc,
+ 0xfd, 0xfe, 0xbd, 0x00, 0xf0, 0xb8, 0xfe, 0x11, 0x10, 0xfe, 0xee, 0x31,
+ 0x00, 0xdd, 0x32, 0x30,
+ 0x43, 0xbc, 0xfe, 0x32, 0xfd, 0x10, 0x75, 0x21, 0x10, 0x33, 0x04, 0x00,
+ 0x59, 0x00, 0x63, 0x00,
+ 0x23, 0x0b, 0xc0, 0xf9, 0xe4, 0x08, 0xc2, 0xf7, 0x2c, 0x53, 0x34, 0xb8,
+ 0xfd, 0x54, 0x22, 0xde,
+ 0xcc, 0xd0, 0x03, 0x37, 0xc0, 0xb0, 0xe0, 0xf3, 0xc0, 0xc0, 0xf3, 0xf2,
+ 0xe0, 0xe1, 0xe2, 0xf4,
+ 0xe0, 0xe0, 0xe0, 0xd2, 0x04, 0x00, 0xbe, 0xde, 0x06, 0x02, 0x8c, 0xcc,
+ 0xe1, 0x05, 0xe0, 0xbe,
+ 0xf0, 0xf0, 0xde, 0xf0, 0x15, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x0f,
+ 0x0e, 0x62, 0x34, 0x88,
+ 0x0c, 0x45, 0xff, 0xee, 0x00, 0x20, 0x00, 0xcc, 0x00, 0x22, 0x0f, 0xcb,
+ 0x00, 0x21, 0x0f, 0x0e,
+ 0x20, 0x41, 0x10, 0x3f, 0x40, 0x20, 0x0c, 0x1e, 0x40, 0x40, 0x30, 0x1e,
+ 0x3f, 0x65, 0x10, 0x0e,
+ 0x31, 0x22, 0x0b, 0x22, 0x55, 0xec, 0xef, 0x00, 0x00, 0xef, 0xbc, 0x11,
+ 0x02, 0xef, 0x00, 0x14,
+ 0xf0, 0xb0, 0x05, 0xf2, 0xbe, 0xd0, 0x05, 0xe1, 0xc0, 0xd0, 0xb0, 0xe1,
+ 0x05, 0xf2, 0xe0, 0x03,
+ 0xf0, 0xe0, 0xf0, 0xef, 0x46, 0x42, 0x0f, 0xed, 0x00, 0x21, 0x10, 0x01,
+ 0xfe, 0xbd, 0xdf, 0xd0,
+ 0xbe, 0xcb, 0xee, 0xdf, 0xef, 0xdc, 0xe0, 0xf0, 0x0f, 0x0e, 0xfb, 0x73,
+ 0x36, 0x0e, 0x0e, 0x51,
+ 0x20, 0x0e, 0x0e, 0x00, 0x45, 0x0f, 0xea, 0xff, 0x50, 0x10, 0xfd, 0x10,
+ 0x30, 0x50, 0x1e, 0x09,
+ 0x0f, 0x4f, 0x40, 0x52, 0x10, 0x2d, 0x3f, 0x41, 0x43, 0x41, 0x30, 0x30,
+ 0x10, 0x20, 0x63, 0x10,
+ 0x19, 0x20, 0x20, 0x11, 0x14, 0x56, 0x21, 0x11, 0x13, 0x00, 0x00, 0x01,
+ 0x04, 0x15, 0xf0, 0xd0,
+ 0x04, 0x36, 0x32, 0x01, 0x02, 0x12, 0x01, 0x33, 0x64, 0x13, 0xdf, 0xcf,
+ 0x35, 0xe0, 0x8d, 0xde,
+ 0x15, 0x67, 0x01, 0xde, 0xac, 0x00, 0x02, 0x00, 0xf1, 0xf1, 0xef, 0xef,
+ 0x00, 0x02, 0xf0, 0xdf,
+ 0xe0, 0x03, 0xe1, 0xd0, 0xc0, 0xd0, 0xe0, 0xd0, 0x03, 0x05, 0x13, 0xf0,
+ 0xaa, 0xed, 0xff, 0xde,
+ 0xdf, 0xbc, 0xed, 0xfa, 0xed, 0xd0, 0xc0, 0x0e, 0x2d, 0xfc, 0x1f, 0x4f,
+ 0x60, 0x20, 0x2f, 0x1b,
+ 0x2d, 0x7f, 0x2e, 0x0c, 0x0c, 0x1e, 0x40, 0x1e, 0x0b, 0x0e, 0xfe, 0x0e,
+ 0xda, 0xce, 0xbe, 0xcd,
+ 0xfe, 0xef, 0xcc, 0xdf, 0xd0, 0xbb, 0xcd, 0xff, 0xe0, 0xce, 0xee, 0xde,
+ 0xdd, 0xc1, 0xdf, 0xd1,
+ 0xd5, 0xf7, 0x90, 0x98, 0x13, 0x02, 0xcb, 0x01, 0x01, 0x01, 0x02, 0xab,
+ 0x00, 0x25, 0x00, 0xde,
+ 0xdf, 0x12, 0x11, 0xcf, 0xf0, 0x01, 0xe0, 0xf0, 0xf1, 0xe0, 0xd0, 0xf1,
+ 0xe1, 0xb0, 0x05, 0xf0,
+ 0xce, 0xf1, 0x03, 0x03, 0xdc, 0xcc, 0x11, 0x36, 0x20, 0xad, 0x0f, 0x43,
+ 0x11, 0x0f, 0x0f, 0x10,
+ 0x10, 0x21, 0x20, 0x0e, 0x0f, 0x24, 0x0f, 0x88, 0x00, 0x31, 0x0f, 0x20,
+ 0x32, 0x2f, 0x1c, 0x40,
+ 0x42, 0x32, 0x2e, 0x0b, 0x62, 0x34, 0x0e, 0x00, 0x20, 0x0e, 0xfe, 0x00,
+ 0x24, 0x21, 0x00, 0x10,
+ 0x00, 0xff, 0x12, 0x26, 0x02, 0xcf, 0x00, 0x14, 0xe0, 0xb1, 0x14, 0x32,
+ 0xef, 0xad, 0x14, 0x24,
+ 0xce, 0x45, 0xff, 0x8a, 0x11, 0x12, 0x00, 0x00, 0x01, 0xf1, 0xac, 0xef,
+ 0x03, 0x02, 0xec, 0xce,
+ 0xf1, 0xe0, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0x01, 0xf0, 0xce, 0xce, 0xeb,
+ 0x06, 0x02, 0xcf, 0xd0,
+ 0x01, 0x0f, 0xdd, 0x01, 0x04, 0xdf, 0x99, 0x00, 0x10, 0x21, 0x00, 0xed,
+ 0x0f, 0x21, 0x00, 0xef,
+ 0xdd, 0x0d, 0x63, 0x30, 0x42, 0x57, 0x32, 0x41, 0x23, 0x26, 0x43, 0x21,
+ 0x32, 0x55, 0x21, 0x30,
+ 0x41, 0x10, 0x12, 0x10, 0x30, 0x62, 0x10, 0x1f, 0x20, 0x19, 0x2e, 0x1e,
+ 0x0f, 0x42, 0x1f, 0x2c,
+ 0x0f, 0xef, 0x32, 0x77, 0x21, 0xe9, 0x41, 0x64, 0xf0, 0xff, 0x1f, 0x31,
+ 0x21, 0x20, 0x41, 0x20,
+ 0x20, 0xfd, 0x30, 0x76, 0x0e, 0x0d, 0x22, 0x12, 0x0d, 0x00, 0x00, 0x1f,
+ 0x0f, 0xe0, 0x02, 0x00,
+ 0x31, 0x00, 0xc8, 0xe0, 0x11, 0x00, 0x11, 0xff, 0x30, 0x72, 0x0b, 0x77,
+ 0x32, 0xdb, 0x10, 0x53,
+ 0x11, 0x0f, 0x1e, 0x10, 0x21, 0x00, 0x00, 0x00, 0x0e, 0xef, 0x00, 0x65,
+ 0x21, 0x20, 0x3e, 0x41,
+ 0x35, 0x11, 0x32, 0x62, 0x31, 0x21, 0x34, 0x41, 0x20, 0x30, 0x20, 0x20,
+ 0x42, 0x65, 0x00, 0x1e,
+ 0x0b, 0x2e, 0x41, 0x21, 0x2f, 0x2d, 0x0c, 0x10, 0x12, 0x0e, 0x3f, 0x67,
+ 0x21, 0x0e, 0x00, 0x46,
+ 0x23, 0x10, 0x30, 0x50, 0x2f, 0x30, 0x55, 0x31, 0x1f, 0x0f, 0x31, 0x56,
+ 0x21, 0x10, 0x10, 0x20,
+ 0x20, 0x0f, 0x00, 0x00, 0xf0, 0xbb, 0xff, 0x21, 0x22, 0x00, 0xdb, 0xef,
+ 0x02, 0xf2, 0x8b, 0xdd,
+ 0x23, 0x40, 0xe8, 0xff, 0x32, 0x00, 0xcc, 0x11, 0xee, 0x0e, 0x30, 0x3e,
+ 0x60, 0x0b, 0x0f, 0xed,
+ 0xdd, 0xff, 0xcb, 0x00, 0x51, 0x77, 0x10, 0xc9, 0x00, 0x31, 0x10, 0x0f,
+ 0x20, 0x20, 0x0f, 0x0e,
+ 0x30, 0x41, 0x10, 0x10, 0x30, 0x31, 0x00, 0x0e, 0xde, 0x10, 0x60, 0x1c,
+ 0x20, 0x1f, 0xeb, 0xed,
+ 0x00, 0x21, 0x21, 0x51, 0x43, 0x00, 0xdc, 0xe0, 0xc3, 0xe5, 0xe1, 0xbf,
+ 0xce, 0xe0, 0xf3, 0xe4,
+ 0xe1, 0xd0, 0xf6, 0x05, 0xe1, 0xc0, 0x00, 0x01, 0x01, 0x13, 0xf1, 0x8f,
+ 0xac, 0xff, 0xf0, 0xee,
+ 0xcb, 0xef, 0xdf, 0xe1, 0xd2, 0xbf, 0xdc, 0xc0, 0xd0, 0xcb, 0xe0, 0x05,
+ 0xd0, 0xd0, 0x16, 0x88,
+ 0x00, 0x56, 0xde, 0x00, 0x10, 0x10, 0x11, 0xac, 0x00, 0x33, 0x00, 0xef,
+ 0xdc, 0xf0, 0x33, 0xe0,
+ 0xbb, 0x00, 0x11, 0x00, 0xdf, 0xf0, 0xf0, 0xf0, 0x00, 0x20, 0x41, 0x11,
+ 0x00, 0x22, 0x10, 0x53,
+ 0x23, 0xd8, 0x41, 0x53, 0xfe, 0xfe, 0x10, 0x34, 0x0f, 0xef, 0x12, 0x01,
+ 0x00, 0xd0, 0xff, 0x26,
+ 0xf1, 0x80, 0xe0, 0xe0, 0xe0, 0xf0, 0x25, 0x02, 0xce, 0xe0, 0xc0, 0xe3,
+ 0x05, 0xf0, 0xd0, 0xd0,
+ 0x80, 0x04, 0xe0, 0xdd, 0xf3, 0xd1, 0x8a, 0x00, 0x03, 0x00, 0xf1, 0x04,
+ 0xf0, 0xef, 0xe0, 0x01,
+ 0x15, 0xf0, 0xdd, 0xdd, 0xf1, 0x06, 0xd0, 0xcf, 0x22, 0xf0, 0xcf, 0xff,
+ 0x0d, 0x30, 0x20, 0x1e,
+ 0xfc, 0xcb, 0xde, 0xbd, 0xee, 0xbc, 0xdc, 0x00, 0xcc, 0xcd, 0x00, 0x00,
+ 0xcd, 0xca, 0xf0, 0x01,
+ 0x11, 0xfe, 0xdb, 0xdf, 0xf0, 0x43, 0x34, 0xff, 0x9d, 0x0e, 0x21, 0x20,
+ 0x20, 0x1d, 0x2c, 0x50,
+ 0x2e, 0x1b, 0x3f, 0x30, 0x30, 0x1c, 0xfc, 0xfd, 0xbd, 0xdf, 0xdf, 0xcb,
+ 0xee, 0x9c, 0xff, 0x13,
+ 0xf0, 0x98, 0xf0, 0x02, 0x00, 0xef, 0xe0, 0xf1, 0xe0, 0xd0, 0xd0, 0xe2,
+ 0xad, 0xd0, 0xe4, 0xe1,
+ 0x07, 0xd0, 0xc0, 0xd0, 0xe0, 0xe1, 0xb0, 0xb0, 0xee, 0xf3, 0xf3, 0xcf,
+ 0xd0, 0xcd, 0xe1, 0xd7,
+ 0xd4, 0xc0, 0xd0, 0xd1, 0xc0, 0xe3, 0xe4, 0xd1, 0xf0, 0xe2, 0xe1, 0xbf,
+ 0x07, 0xf3, 0xe1, 0x17,
+ 0x00, 0x01, 0xc0, 0xd0, 0xe2, 0xb0, 0xd0, 0x01, 0x77, 0x15, 0xbb, 0x00,
+ 0x22, 0x11, 0x20, 0x00,
+ 0x11, 0x00, 0x00, 0x63, 0x34, 0x10, 0x1e, 0x30, 0x67, 0x21, 0x10, 0x20,
+ 0x2f, 0x30, 0x40, 0x10,
+ 0x2f, 0x20, 0x20, 0x1e, 0x0e, 0x22, 0x22, 0x0d, 0x56, 0x0f, 0xdc, 0x22,
+ 0x13, 0x34, 0x21, 0xcd,
+ 0xfe, 0x42, 0x10, 0x2f, 0x73, 0x10, 0x1d, 0x1e, 0x41, 0x57, 0x11, 0x0e,
+ 0x12, 0x11, 0x0d, 0x02,
+ 0x01, 0xdb, 0x00, 0x02, 0xdd, 0x23, 0x54, 0x0c, 0x00, 0x13, 0x00, 0x36,
+ 0x23, 0xbc, 0x0f, 0x33,
+ 0x00, 0x00, 0x77, 0x11, 0x00, 0xe0, 0xdf, 0x12, 0x12, 0xf0, 0x37, 0xd0,
+ 0xae, 0x01, 0x01, 0xf0,
+ 0x10, 0x00, 0x61, 0x2f, 0x2c, 0x41, 0x1e, 0x53, 0x1e, 0x2e, 0x77, 0x27,
+ 0x0e, 0x10, 0x10, 0x31,
+ 0x20, 0x1f, 0x40, 0x20, 0x1e, 0x3d, 0x5f, 0x2e, 0x1c, 0x2c, 0x50, 0x10,
+ 0x1a, 0x30, 0x40, 0x20,
+ 0x31, 0x0e, 0x2d, 0x33, 0x10, 0x1f, 0x0e, 0xeb, 0x0f, 0x20, 0x40, 0x00,
+ 0x00, 0x41, 0x11, 0x31,
+ 0x64, 0x31, 0x20, 0x56, 0x20, 0x1e, 0x1e, 0x52, 0x34, 0x1d, 0x1d, 0x20,
+ 0x1c, 0x2e, 0x64, 0x10,
+ 0x0a, 0xfe, 0xf0, 0xf1, 0xd0, 0xe0, 0xcc, 0xcb, 0xf0, 0x01, 0xf0, 0xfd,
+ 0x51, 0x31, 0x0c, 0x30,
+ 0x40, 0x3d, 0x09, 0x2f, 0x4f, 0x21, 0xdd, 0x88, 0xf0, 0x02, 0xbb, 0xff,
+ 0x00, 0x11, 0xee, 0xcb,
+ 0x11, 0x22, 0x0f, 0xdd, 0x0f, 0x32, 0x00, 0xcc, 0x01, 0x22, 0x00, 0x02,
+ 0xde, 0xde, 0x76, 0x11,
+ 0x0f, 0x11, 0xf0, 0xab, 0x01, 0x14, 0xf0, 0xce, 0x00, 0x13, 0xde, 0xde,
+ 0x27, 0x01, 0xe0, 0xd0,
+ 0xf2, 0x03, 0xa0, 0xe0, 0xf2, 0xe1, 0xe4, 0xc0, 0xbe, 0xf0, 0x05, 0xe0,
+ 0xe1, 0x14, 0xcd, 0xce,
+ 0x36, 0xf0, 0x9e, 0xff, 0x00, 0xf0, 0xdd, 0x0f, 0x0e, 0xee, 0xf0, 0xce,
+ 0xee, 0xcd, 0xdd, 0xcf,
+ 0xdd, 0xe0, 0xe5, 0xdf, 0xcb, 0xf2, 0xd1, 0xce, 0x02, 0x35, 0xff, 0xeb,
+ 0x10, 0x0d, 0x10, 0x64,
+ 0x00, 0xdc, 0xee, 0x42, 0xff, 0xca, 0xef, 0xef, 0xef, 0x01, 0x33, 0xce,
+ 0x8a, 0xf0, 0xf0, 0xf1,
+ 0xef, 0xf0, 0x14, 0x01, 0xf0, 0x21, 0x41, 0x53, 0x31, 0x0e, 0x41, 0x47,
+ 0x00, 0xfe, 0xff, 0x00,
+ 0x32, 0x24, 0x13, 0x00, 0xdf, 0xf0, 0x16, 0x74, 0x00, 0xee, 0xf0, 0x35,
+ 0x10, 0x00, 0x00, 0x35,
+ 0x74, 0x01, 0x00, 0xe0, 0x00, 0x74, 0x10, 0x22, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x3f, 0x51,
+ 0x47, 0x10, 0x31, 0x54, 0x20, 0x23, 0x23, 0x20, 0x32, 0x22, 0x35, 0x01,
+ 0x00, 0xc2, 0xc1, 0xf1,
+ 0x0f, 0x33, 0x23, 0x30, 0x2f, 0xf8, 0x0e, 0x73, 0x73, 0x19, 0x0c, 0x1e,
+ 0x2f, 0x3f, 0x1d, 0x72,
+ 0x0f, 0x08, 0x20, 0x51, 0x0f, 0x0e, 0x53, 0x22, 0xfb, 0x0f, 0x11, 0x21,
+ 0x31, 0x0d, 0x0b, 0x62,
+ 0x22, 0x2f, 0x30, 0x41, 0x32, 0x0b, 0x1e, 0x74, 0x11, 0x0d, 0x2f, 0x20,
+ 0x10, 0x1f, 0x10, 0x0c,
+ 0xef, 0x00, 0xe0, 0xf4, 0xd0, 0xce, 0x05, 0x02, 0x9d, 0xff, 0x01, 0x17,
+ 0x02, 0xee, 0x00, 0x20,
+ 0xed, 0x01, 0x22, 0xcc, 0xd0, 0xc0, 0xce, 0x05, 0x02, 0xd0, 0xd0, 0xc0,
+ 0xf1, 0x17, 0xe0, 0x9e,
+ 0x01, 0x13, 0xf0, 0xcd, 0xcc, 0xe0, 0x06, 0xd0, 0x9c, 0xf0, 0xf1, 0xf0,
+ 0xe0, 0xcd, 0xef, 0xf2,
+ 0xcf, 0xed, 0xe0, 0xdf, 0xcd, 0xf5, 0xe0, 0xd0, 0xde, 0xbb, 0xe0, 0xed,
+ 0xfe, 0x00, 0xe9, 0xde,
+ 0x10, 0x00, 0xec, 0xf0, 0x00, 0xde, 0xfe, 0xab, 0x00, 0xf0, 0xbc, 0x34,
+ 0x10, 0xa8, 0x00, 0x41,
+ 0x00, 0xfe, 0x21, 0x42, 0x0d, 0x0e, 0x61, 0x00, 0x1e, 0x10, 0x0e, 0x0c,
+ 0x00, 0x12, 0xee, 0xdc,
+ 0xe1, 0xc0, 0xcc, 0xe0, 0xe0, 0xe0, 0x03, 0x03, 0xbb, 0xef, 0x13, 0x13,
+ 0x02, 0x01, 0xf2, 0xe4,
+ 0xd2, 0x07, 0xd3, 0x80, 0xd0, 0xd0, 0xc0, 0xe3, 0xe3, 0xbf, 0xc9, 0xcf,
+ 0xe1, 0xf4, 0xc0, 0xd0,
+ 0xc2, 0xe3, 0xe2, 0xd3, 0xf3, 0xe2, 0xf5, 0xe1, 0xd0, 0xf1, 0xf0, 0xf0,
+ 0x27, 0x44, 0x00, 0xe0,
+ 0xd0, 0x00, 0x23, 0xe0, 0x9d, 0xef, 0x01, 0xe1, 0xcd, 0xdb, 0x0f, 0xff,
+ 0xed, 0xee, 0xdd, 0x00,
+ 0x10, 0xca, 0xd0, 0x05, 0x31, 0x40, 0x2c, 0x70, 0x41, 0x12, 0x23, 0x46,
+ 0x52, 0x22, 0x10, 0x0e,
+ 0x0e, 0x1e, 0x0f, 0x0a, 0x0e, 0x40, 0x20, 0x00, 0x00, 0x23, 0x43, 0x53,
+ 0x34, 0x27, 0x21, 0x31,
+ 0x41, 0x21, 0x21, 0x23, 0x45, 0x00, 0x00, 0x31, 0x74, 0x42, 0xfd, 0xee,
+ 0xd0, 0xe3, 0x07, 0xb0,
+ 0xbd, 0xee, 0x01, 0x03, 0x11, 0x30, 0x52, 0x27, 0x01, 0x00, 0xf1, 0xf3,
+ 0xf2, 0xde, 0xff, 0xf0,
+ 0xab, 0xeb, 0xee, 0x0f, 0x0f, 0x0d, 0x20, 0x72, 0x10, 0x1c, 0x0e, 0x0f,
+ 0x21, 0x32, 0x1e, 0x0a,
+ 0x0d, 0x10, 0x10, 0xe9, 0xcd, 0x4d, 0x71, 0x32, 0x00, 0x0f, 0x00, 0x00,
+ 0x11, 0x12, 0xf1, 0xf2,
+ 0xef, 0x00, 0x55, 0x25, 0x22, 0x43, 0x72, 0x33, 0x43, 0x34, 0x24, 0x36,
+ 0x42, 0x20, 0x30, 0x50,
+ 0x24, 0x22, 0x10, 0x1e, 0x0c, 0xff, 0x00, 0x02, 0xd0, 0xbc, 0xdd, 0xec,
+ 0x1e, 0x50, 0x1f, 0xfb,
+ 0x01, 0x03, 0x10, 0x1f, 0x50, 0x21, 0x12, 0x15, 0x00, 0xce, 0xed, 0x13,
+ 0x06, 0xe0, 0xe0, 0x21,
+ 0x72, 0x67, 0x22, 0x20, 0x10, 0x10, 0x22, 0x45, 0x11, 0x00, 0x10, 0x10,
+ 0x32, 0x12, 0xdd, 0x99,
+ 0xdd, 0xe0, 0x01, 0x0f, 0x0c, 0xff, 0x30, 0x50, 0x2d, 0x0b, 0xfe, 0x00,
+ 0x0f, 0x40, 0x00, 0xfd,
+ 0xdd, 0x9b, 0xdc, 0xdc, 0x72, 0x34, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d, 0x2a,
+ 0x61, 0x23, 0x10, 0x0f,
+ 0x00, 0x56, 0x44, 0x21, 0x0e, 0x0c, 0xfe, 0x53, 0x67, 0x00, 0xec, 0xef,
+ 0xf0, 0xef, 0xef, 0xf0,
+ 0x00, 0xdf, 0x00, 0x35, 0xe0, 0xa0, 0xdf, 0x01, 0xe0, 0xf0, 0x01, 0xe0,
+ 0xd0, 0x03, 0x57, 0x01,
+ 0xe0, 0xf1, 0x23, 0x77, 0x52, 0x11, 0x00, 0xfe, 0x00, 0x24, 0x01, 0xfe,
+ 0xef, 0x44, 0x33, 0x0e,
+ 0xfc, 0xed, 0xee, 0x41, 0x31, 0xfb, 0x1f, 0x71, 0x21, 0x10, 0x41, 0x34,
+ 0x0f, 0xe9, 0x00, 0x62,
+ 0x0f, 0xda, 0xf0, 0x20, 0x10, 0x31, 0x61, 0x00, 0x0d, 0x0f, 0x0f, 0x31,
+ 0x33, 0x1e, 0x0d, 0xfb,
+ 0x20, 0x75, 0x00, 0x00, 0x21, 0x00, 0xfd, 0xee, 0xdc, 0x10, 0x77, 0x00,
+ 0x00, 0x0f, 0x0e, 0x0f,
+ 0x31, 0x20, 0x0b, 0x40, 0x40, 0x00, 0x20, 0x00, 0x00, 0xbe, 0xbc, 0xf0,
+ 0x47, 0x13, 0xff, 0xe0,
+ 0x01, 0x01, 0xbe, 0xdc, 0xe0, 0x01, 0x24, 0x00, 0xef, 0x00, 0x02, 0x14,
+ 0x02, 0x8c, 0xca, 0xe0,
+ 0x02, 0x12, 0xfe, 0xde, 0x01, 0x03, 0x00, 0xbe, 0xcc, 0xe0, 0xe0, 0xd1,
+ 0xd0, 0xc0, 0x01, 0xd0,
+ 0xba, 0x03, 0x04, 0xed, 0xdc, 0x35, 0x21, 0xce, 0xee, 0xdd, 0x00, 0x77,
+ 0x00, 0x00, 0x11, 0xff,
+ 0xde, 0x10, 0x11, 0xec, 0x30, 0x74, 0x10, 0x13, 0x23, 0x12, 0x10, 0x00,
+ 0x0e, 0x77, 0x34, 0x00,
+ 0x0e, 0x00, 0x21, 0x10, 0x0d, 0xfd, 0xfc, 0x0e, 0x20, 0xfe, 0xa9, 0xbc,
+ 0x00, 0x44, 0xf0, 0xcb,
+ 0xff, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0xc0, 0xce, 0x00, 0x11, 0x00,
+ 0xe0, 0x25, 0x22, 0xc0,
+ 0xde, 0x13, 0x45, 0xf0, 0x00, 0x43, 0x00, 0xfe, 0x42, 0x66, 0xee, 0xba,
+ 0x00, 0x54, 0x01, 0xfe,
+ 0x0f, 0x00, 0x00, 0xf0, 0xf1, 0xe0, 0x03, 0x35, 0xe0, 0xd0, 0x00, 0xc0,
+ 0xff, 0x44, 0x21, 0x00,
+ 0x0f, 0xef, 0xf0, 0x24, 0x32, 0x22, 0x31, 0x43, 0x01, 0x25, 0xe0, 0x01,
+ 0x77, 0x30, 0xff, 0x1e,
+ 0x3e, 0x1e, 0x3e, 0x71, 0x1e, 0xc8, 0x0e, 0x50, 0x11, 0x10, 0x10, 0x20,
+ 0x30, 0xec, 0x9c, 0x01,
+ 0x12, 0xda, 0xef, 0x10, 0x20, 0x41, 0x10, 0x0e, 0xfe, 0x31, 0x52, 0x21,
+ 0x43, 0x42, 0x23, 0x20,
+ 0x08, 0xed, 0x0e, 0x31, 0x10, 0xbb, 0xf0, 0x00, 0x00, 0xbc, 0x00, 0x13,
+ 0x02, 0xdf, 0xd0, 0xd0,
+ 0xcf, 0x04, 0x67, 0x00, 0xe0, 0xff, 0xf0, 0xde, 0x01, 0xf0, 0xc0, 0xe0,
+ 0xd0, 0xe0, 0xd2, 0xe4,
+ 0x04, 0x05, 0xd2, 0x80, 0xe0, 0xf5, 0xe2, 0xb0, 0xcf, 0xf0, 0xf4, 0xe0,
+ 0xbe, 0xe0, 0xe0, 0xe2,
+ 0x07, 0x01, 0xe0, 0xef, 0xee, 0x33, 0x22, 0x8c, 0xf0, 0x16, 0xf0, 0xe0,
+ 0xf0, 0xf1, 0x01, 0xdf,
+ 0xde, 0xe0, 0xee, 0x41, 0x2f, 0xc8, 0x0e, 0x4f, 0x1f, 0x0d, 0x0d, 0xb9,
+ 0xee, 0x31, 0x42, 0x00,
+ 0x30, 0x50, 0x41, 0x20, 0x0b, 0xfe, 0x0f, 0x40, 0x41, 0xfb, 0xec, 0x40,
+ 0x64, 0x00, 0x0e, 0x00,
+ 0x10, 0x22, 0x00, 0xcd, 0xff, 0x00, 0x02, 0x04, 0x03, 0xde, 0x00, 0x00,
+ 0x4c, 0x02, 0x4e, 0x03,
+ 0x39, 0xe1, 0xe0, 0xa7, 0x9d, 0xf4, 0x66, 0xb7, 0x23, 0x77, 0x01, 0xff,
+ 0x00, 0x11, 0x32, 0x33,
+ 0xf1, 0xc0, 0xf1, 0x15, 0xf0, 0xb0, 0xf1, 0xe2, 0x03, 0x02, 0xce, 0xf0,
+ 0x35, 0x02, 0xf2, 0x02,
+ 0x02, 0x25, 0x01, 0x11, 0x76, 0x21, 0xaf, 0xf0, 0x35, 0x33, 0xf0, 0xcf,
+ 0xf0, 0x32, 0x33, 0xfe,
+ 0x00, 0x30, 0x0d, 0x00, 0x53, 0x12, 0x0f, 0x3f, 0x19, 0x4f, 0x60, 0x12,
+ 0x11, 0x1d, 0xe8, 0x0e,
+ 0x70, 0x20, 0x0d, 0x0c, 0x1f, 0x0e, 0x1e, 0x75, 0x43, 0x0d, 0xd9, 0x00,
+ 0x40, 0x00, 0x0e, 0x2f,
+ 0x20, 0x11, 0x0f, 0xfd, 0xed, 0x21, 0x0f, 0x0c, 0x52, 0x00, 0xed, 0xde,
+ 0x02, 0x46, 0xef, 0xbd,
+ 0x00, 0x11, 0x11, 0xff, 0xee, 0xcf, 0x47, 0x47, 0xd0, 0xbe, 0x11, 0x22,
+ 0x00, 0xf0, 0x02, 0xf0,
+ 0xbe, 0xf0, 0x04, 0xce, 0x02, 0x37, 0xd0, 0xdf, 0x22, 0xf0, 0xc0, 0x54,
+ 0x24, 0xd0, 0xf0, 0x01,
+ 0xce, 0xe0, 0x22, 0xae, 0xf0, 0x17, 0xf0, 0xad, 0xee, 0xf0, 0x01, 0x01,
+ 0xf0, 0x00, 0xed, 0xeb,
+ 0x31, 0x42, 0xfd, 0xd8, 0x10, 0x60, 0x00, 0xf0, 0x00, 0xfe, 0x00, 0x32,
+ 0x22, 0xee, 0xfd, 0x1f,
+ 0x1c, 0x73, 0x77, 0x00, 0x0e, 0x0f, 0x20, 0x0f, 0xfc, 0x0f, 0x10, 0x33,
+ 0x00, 0xe9, 0xef, 0x10,
+ 0x01, 0xdf, 0xef, 0x52, 0x21, 0xfe, 0x0e, 0xf0, 0x13, 0x67, 0xe0, 0xcd,
+ 0x00, 0x1f, 0x0f, 0x55,
+ 0x21, 0xdd, 0xfd, 0x01, 0xf0, 0xcd, 0xf0, 0xcf, 0xce, 0xf0, 0xef, 0xed,
+ 0xcc, 0xe0, 0x07, 0x05,
+ 0xd0, 0x01, 0xf1, 0xe0, 0x20, 0xe0, 0x8c, 0x11, 0x45, 0xef, 0xcc, 0x23,
+ 0x44, 0xdd, 0xbc, 0x10,
+ 0x33, 0x0f, 0xff, 0x00, 0xdf, 0xcd, 0x14, 0x21, 0x98, 0xee, 0x00, 0x00,
+ 0xcd, 0xed, 0x02, 0x12,
+ 0x00, 0xef, 0x00, 0x35, 0xf0, 0x9e, 0x00, 0x17, 0x11, 0xff, 0xdf, 0xff,
+ 0xfe, 0x0f, 0x72, 0x20,
+ 0x0d, 0x10, 0x1f, 0x0c, 0x20, 0x21, 0xfe, 0x0f, 0x41, 0x20, 0x1f, 0xf9,
+ 0x9b, 0x00, 0x31, 0xed,
+ 0xdd, 0x00, 0x12, 0x32, 0x10, 0xfe, 0xff, 0x0f, 0x10, 0x45, 0x00, 0x0e,
+ 0xfe, 0x0e, 0x20, 0x20,
+ 0x77, 0x52, 0xca, 0xcd, 0x21, 0x57, 0x00, 0xff, 0x11, 0x01, 0xef, 0xef,
+ 0x13, 0x12, 0xcd, 0xbe,
+ 0x00, 0x05, 0x21, 0xf0, 0xfe, 0x55, 0x22, 0x0f, 0xfe, 0x0f, 0x20, 0x63,
+ 0x20, 0x0e, 0x00, 0x00,
+ 0x0d, 0x13, 0x15, 0x01, 0x03, 0xe0, 0xbc, 0xed, 0xf0, 0xff, 0x00, 0x57,
+ 0x02, 0x0f, 0x0f, 0x40,
+ 0x41, 0x0f, 0x47, 0x45, 0xf0, 0xf0, 0x10, 0x35, 0x42, 0x02, 0xf0, 0x01,
+ 0x21, 0x31, 0x62, 0x00,
+ 0x0e, 0x22, 0x20, 0xfa, 0x50, 0x40, 0x0e, 0x0d, 0x10, 0x13, 0x22, 0x0f,
+ 0xff, 0x04, 0x37, 0x12,
+ 0xbf, 0x00, 0x23, 0x00, 0x11, 0x01, 0x8e, 0xf0, 0x03, 0x0e, 0x20, 0x77,
+ 0x02, 0xec, 0x02, 0x24,
+ 0x0f, 0xf0, 0x13, 0xff, 0xdc, 0x0f, 0xdd, 0xff, 0x42, 0x11, 0xbb, 0xaa,
+ 0xdd, 0xf0, 0x01, 0x13,
+ 0xff, 0xaa, 0xf0, 0x00, 0xf0, 0xf1, 0x03, 0xe1, 0xdf, 0xee, 0x11, 0x23,
+ 0x00, 0xcd, 0x00, 0x14,
+ 0xcc, 0xed, 0x57, 0x10, 0xbf, 0xdd, 0x00, 0x03, 0x15, 0x11, 0xe0, 0xbd,
+ 0x01, 0x46, 0x20, 0xff,
+ 0x20, 0x32, 0x00, 0x0e, 0x32, 0x32, 0xfe, 0xff, 0x77, 0x76, 0x00, 0x0f,
+ 0xff, 0x00, 0x10, 0x20,
+ 0x10, 0xef, 0xfe, 0x10, 0x42, 0x10, 0x0d, 0x00, 0x0c, 0xfc, 0x0f, 0x10,
+ 0xdc, 0xab, 0x31, 0x32,
+ 0xed, 0xbb, 0xfd, 0x31, 0x75, 0x10, 0x0e, 0x0e, 0xed, 0x2f, 0x76, 0x10,
+ 0x0f, 0x10, 0x11, 0xfe,
+ 0xee, 0x22, 0x00, 0xdd, 0x12, 0x01, 0xdd, 0xf0, 0x27, 0xe0, 0xe0, 0x43,
+ 0x02, 0xbe, 0xdc, 0x21,
+ 0x34, 0x01, 0x24, 0xe0, 0x90, 0xf0, 0x03, 0x36, 0xf0, 0xbf, 0x01, 0x01,
+ 0xf1, 0x16, 0x11, 0xd0,
+ 0x9d, 0x00, 0x13, 0xee, 0xcc, 0xf0, 0xf0, 0xe0, 0xde, 0xd0, 0xbb, 0xee,
+ 0x0f, 0x00, 0x0d, 0x0f,
+ 0x10, 0x00, 0x0d, 0xc9, 0x22, 0x00, 0x8a, 0xff, 0x32, 0x44, 0x00, 0x00,
+ 0x0f, 0xed, 0x00, 0x10,
+ 0x41, 0x20, 0x00, 0x0f, 0xfb, 0xee, 0xfe, 0xef, 0xee, 0xbb, 0xed, 0xff,
+ 0x0e, 0x0d, 0x30, 0x73,
+ 0x0c, 0xc8, 0xff, 0x0f, 0x10, 0xe0, 0xee, 0x00, 0xed, 0xac, 0x0e, 0x10,
+ 0x0f, 0xfc, 0xde, 0x0f,
+ 0xf0, 0xdc, 0xee, 0x40, 0xf0, 0x8b, 0xd0, 0x26, 0x10, 0xc0, 0x00, 0x01,
+ 0xf1, 0xd0, 0xe1, 0x05,
+ 0x43, 0x34, 0xf0, 0xaf, 0xf0, 0x03, 0xf0, 0x24, 0x65, 0xf0, 0xde, 0xf0,
+ 0x01, 0x11, 0x22, 0x22,
+ 0x01, 0xe0, 0xd1, 0xd1, 0xb0, 0xb0, 0x04, 0x17, 0x03, 0xe0, 0xcc, 0xde,
+ 0x21, 0x74, 0x22, 0x21,
+ 0x0e, 0xed, 0x00, 0x01, 0x44, 0x44, 0x00, 0x0c, 0x00, 0x42, 0x10, 0xfa,
+ 0x0f, 0x50, 0x32, 0x10,
+ 0x1f, 0x2f, 0x51, 0x32, 0x1f, 0x0a, 0xfe, 0x0e, 0x0d, 0x2f, 0x4f, 0x3d,
+ 0x2e, 0x1d, 0x0a, 0x20,
+ 0x62, 0x0f, 0x0d, 0x1f, 0x1d, 0x30, 0x32, 0x13, 0x27, 0x11, 0xcf, 0xcd,
+ 0x45, 0x77, 0x00, 0xef,
+ 0x00, 0x10, 0x11, 0x12, 0x02, 0x03, 0xf1, 0xe0, 0xe0, 0x14, 0x02, 0xbf,
+ 0x24, 0x67, 0xf1, 0xd0,
+ 0xd0, 0x02, 0x24, 0xf1, 0xb0, 0xe1, 0xf0, 0xe1, 0x15, 0x22, 0xc0, 0xf0,
+ 0x22, 0x76, 0x21, 0x00,
+ 0x10, 0x31, 0x00, 0x00, 0x12, 0xf0, 0x00, 0x43, 0xdf, 0xab, 0xff, 0x0f,
+ 0x0e, 0x21, 0x53, 0x0e,
+ 0x0e, 0x0d, 0x01, 0x47, 0x13, 0x12, 0x01, 0xe0, 0xc0, 0x27, 0x01, 0x8e,
+ 0xff, 0x26, 0x21, 0xde,
+ 0x00, 0x53, 0x33, 0x0f, 0xe8, 0xef, 0x20, 0x72, 0x10, 0x00, 0x1e, 0x20,
+ 0x0d, 0x0f, 0x11, 0x21,
+ 0x0f, 0x20, 0x40, 0x0c, 0xfd, 0xfe, 0xdb, 0xee, 0x43, 0x77, 0x00, 0xe0,
+ 0x00, 0x00, 0xef, 0x00,
+ 0xef, 0xf0, 0xd2, 0xcf, 0xe0, 0xbf, 0xcd, 0x0f, 0x0f, 0x0d, 0xfb, 0xcb,
+ 0xce, 0x04, 0x56, 0x00,
+ 0xbc, 0xf0, 0x00, 0xe0, 0xde, 0xe0, 0x02, 0xd0, 0xde, 0x00, 0x10, 0x61,
+ 0x1e, 0x1a, 0x1f, 0x41,
+ 0x22, 0x0e, 0x21, 0x24, 0x11, 0x23, 0x00, 0xab, 0xf0, 0x25, 0x21, 0xed,
+ 0xfe, 0x30, 0x3e, 0x0c,
+ 0x0b, 0x30, 0x50, 0x10, 0x0e, 0x00, 0x11, 0x13, 0xd2, 0x05, 0xe1, 0x8e,
+ 0xff, 0x13, 0x37, 0x00,
+ 0xbf, 0xbd, 0x00, 0x23, 0x20, 0x0e, 0x10, 0x21, 0x1e, 0x3d, 0x5d, 0x1c,
+ 0x0f, 0xe9, 0xce, 0x10,
+ 0x00, 0x1f, 0x1d, 0xa8, 0xde, 0xf0, 0x34, 0x21, 0x00, 0xee, 0xce, 0xf0,
+ 0xef, 0xbb, 0x10, 0x01,
+ 0xde, 0x52, 0x23, 0xbb, 0xde, 0x00, 0x13, 0x00, 0x0f, 0x00, 0xdc, 0x9a,
+ 0x0f, 0x00, 0x20, 0x10,
+ 0xec, 0xcc, 0xef, 0x12, 0x01, 0x8b, 0xef, 0x12, 0x12, 0x0f, 0xf0, 0xf0,
+ 0x03, 0x33, 0x0f, 0xb9,
+ 0xff, 0x13, 0x56, 0x00, 0xdf, 0xee, 0x01, 0xbf, 0xee, 0x15, 0x00, 0xd0,
+ 0x01, 0xd0, 0xbf, 0x00,
+ 0x02, 0xe1, 0xe1, 0x04, 0x03, 0x03, 0x24, 0x01, 0xf0, 0x01, 0x22, 0x77,
+ 0x32, 0xf0, 0xf0, 0x24,
+ 0x13, 0x00, 0x01, 0x10, 0xde, 0x0f, 0x74, 0x51, 0x0d, 0xd8, 0xff, 0x20,
+ 0x42, 0x31, 0x21, 0xee,
+ 0x0f, 0x1f, 0xec, 0xdf, 0x00, 0x10, 0x0e, 0xdb, 0xfd, 0x7f, 0x4e, 0xc8,
+ 0x0f, 0x50, 0x20, 0x0d,
+ 0x0d, 0x0d, 0x1d, 0x6f, 0x0c, 0x0a, 0x10, 0x10, 0x0f, 0xff, 0xff, 0xcc,
+ 0xcc, 0x00, 0x1f, 0xcc,
+ 0xdf, 0xef, 0xcf, 0xf0, 0xf0, 0x9a, 0x00, 0x35, 0x00, 0xf0, 0x10, 0x30,
+ 0x51, 0x21, 0x00, 0x11,
+ 0x02, 0xe0, 0xd0, 0xf4, 0x04, 0xf2, 0xb1, 0xb0, 0xdf, 0xe0, 0xe0, 0x03,
+ 0x02, 0xb9, 0xde, 0xe0,
+ 0xf0, 0xed, 0xe0, 0xe2, 0xcf, 0x03, 0x04, 0xcf, 0xef, 0x0f, 0x42, 0x47,
+ 0x13, 0xf0, 0xdd, 0x03,
+ 0x67, 0x34, 0x00, 0x00, 0xe0, 0xf0, 0x22, 0x33, 0x10, 0xef, 0xdc, 0x0f,
+ 0x61, 0x64, 0x1d, 0xf9,
+ 0xed, 0x0f, 0x0f, 0x20, 0x76, 0x21, 0xff, 0xfd, 0x30, 0x41, 0xfe, 0xec,
+ 0x42, 0x44, 0x0f, 0x0d,
+ 0x0d, 0x0e, 0x00, 0x41, 0x00, 0x0b, 0x0f, 0x30, 0x30, 0x1e, 0x40, 0x53,
+ 0x21, 0x22, 0x01, 0xff,
+ 0x47, 0x17, 0xb0, 0xf1, 0xf2, 0xd0, 0xe0, 0x43, 0x34, 0xf0, 0x31, 0x76,
+ 0x20, 0x00, 0x0f, 0x00,
+ 0x33, 0x55, 0x00, 0xe0, 0xf1, 0xd0, 0xf2, 0xe4, 0xc2, 0x02, 0xdf, 0xac,
+ 0x00, 0x04, 0x12, 0xf0,
+ 0xd0, 0xe1, 0xf0, 0xd0, 0xae, 0x01, 0x17, 0x01, 0xe0, 0x27, 0x31, 0xe0,
+ 0xe0, 0x53, 0x23, 0x00,
+ 0x10, 0x00, 0xfc, 0x70, 0x42, 0x0e, 0xeb, 0x20, 0x73, 0x00, 0x0e, 0x10,
+ 0x0e, 0x2f, 0x10, 0x00,
+ 0xfc, 0xfe, 0x0e, 0xe8, 0xdc, 0x50, 0x63, 0x0f, 0x1e, 0x21, 0x10, 0x1f,
+ 0x3f, 0x20, 0x30, 0x43,
+ 0x11, 0xfe, 0xe0, 0xf0, 0xdb, 0x0f, 0x67, 0x12, 0x00, 0x00, 0x10, 0x00,
+ 0x62, 0x0f, 0x10, 0x67,
+ 0x14, 0x0f, 0xf0, 0x02, 0xf0, 0x0f, 0x00, 0x01, 0x02, 0xde, 0xec, 0x0e,
+ 0x10, 0x20, 0x02, 0x02,
+ 0x9b, 0xf0, 0x17, 0xf1, 0xc0, 0xf2, 0xb0, 0xf0, 0x27, 0x00, 0xfe, 0xff,
+ 0x0f, 0x00, 0x10, 0x21,
+ 0x00, 0xde, 0x9c, 0xee, 0x12, 0x47, 0x11, 0x01, 0x00, 0xd0, 0xb0, 0xf0,
+ 0x26, 0x21, 0xbf, 0xe0,
+ 0x01, 0x00, 0xe1, 0x01, 0xbf, 0xcd, 0x22, 0x20, 0xd8, 0xfd, 0x30, 0x20,
+ 0x0f, 0x3f, 0x0c, 0xcc,
+ 0xed, 0xfe, 0x71, 0x00, 0xb9, 0xff, 0x31, 0x20, 0xce, 0x00, 0x21, 0x00,
+ 0x20, 0x20, 0x0d, 0x12,
+ 0x47, 0xb0, 0xcd, 0x01, 0x12, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x1f,
+ 0x41, 0x01, 0xbb, 0x02,
+ 0x57, 0xf2, 0x9b, 0xf0, 0x00, 0xf1, 0xf1, 0xe2, 0xe0, 0xe0, 0xf1, 0x01,
+ 0x02, 0x0e, 0xee, 0x00,
+ 0x15, 0x43, 0x00, 0x00, 0xdf, 0x9a, 0xee, 0x23, 0x13, 0xff, 0xdd, 0xdd,
+ 0x24, 0x14, 0x8c, 0xed,
+ 0x13, 0x33, 0x0f, 0xfc, 0xfd, 0xc8, 0xfe, 0x40, 0x31, 0xee, 0x0f, 0x42,
+ 0x00, 0xf0, 0x11, 0x22,
+ 0x13, 0xf3, 0xd3, 0x05, 0x11, 0xad, 0xcb, 0x10, 0x21, 0x0f, 0xff, 0x10,
+ 0x3d, 0x4d, 0x50, 0x44,
+ 0x2f, 0x08, 0x1f, 0x1f, 0xed, 0x0e, 0x70, 0x0f, 0xfc, 0x0f, 0x00, 0xe8,
+ 0x0f, 0x60, 0x00, 0x00,
+ 0x01, 0xf0, 0x02, 0xd0, 0xcd, 0x0f, 0x66, 0x22, 0x0f, 0xec, 0xfe, 0x0f,
+ 0x60, 0x23, 0x10, 0x10,
+ 0xf8, 0xce, 0xef, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xcb, 0xbc, 0x10,
+ 0x31, 0x00, 0x10, 0x02,
+ 0x00, 0xcf, 0x01, 0x17, 0xc0, 0xaf, 0x0f, 0x00, 0xf1, 0xe0, 0xcc, 0xcc,
+ 0x00, 0xd0, 0xbd, 0xf0,
+ 0xe0, 0xcb, 0xf1, 0x06, 0x02, 0xe0, 0xae, 0x0f, 0x21, 0x23, 0x24, 0x11,
+ 0x00, 0x00, 0x22, 0x46,
+ 0x00, 0xe0, 0x34, 0x23, 0x00, 0x01, 0x00, 0x32, 0x63, 0x10, 0x10, 0x0e,
+ 0x0d, 0x3f, 0x1e, 0xcb,
+ 0x9a, 0x0f, 0x00, 0xfd, 0x00, 0x10, 0x00, 0xdc, 0xeb, 0xee, 0x71, 0x54,
+ 0x0f, 0xfe, 0x0f, 0xfe,
+ 0xfe, 0x0f, 0x0c, 0x2f, 0x73, 0x30, 0x08, 0x1e, 0x3f, 0x60, 0x20, 0x10,
+ 0x21, 0x21, 0x0f, 0xff,
+ 0x01, 0x03, 0xe1, 0xc0, 0xf0, 0xe4, 0xcf, 0xd9, 0xee, 0x22, 0x10, 0xcc,
+ 0x00, 0x35, 0x12, 0xd1,
+ 0x05, 0x12, 0xf1, 0x64, 0x33, 0xf1, 0xb0, 0xd1, 0x04, 0x15, 0xc0, 0x8e,
+ 0xef, 0x03, 0x14, 0x01,
+ 0xe2, 0xd0, 0xd1, 0x04, 0xd0, 0xe1, 0x04, 0xce, 0x01, 0x25, 0xaf, 0xef,
+ 0x24, 0x01, 0xef, 0xf0,
+ 0x00, 0xff, 0x0f, 0x0f, 0x20, 0x50, 0xf9, 0xcd, 0x0f, 0x21, 0x31, 0x0f,
+ 0xda, 0x8b, 0x0f, 0x20,
+ 0x0f, 0xdc, 0x0f, 0x1f, 0x5f, 0x2d, 0x2d, 0x30, 0x2e, 0x1c, 0x3e, 0x71,
+ 0x32, 0x0e, 0x2f, 0x20,
+ 0x0e, 0x0c, 0x1f, 0x76, 0x21, 0x0f, 0x0d, 0x43, 0x32, 0x1c, 0x1b, 0x2f,
+ 0x2f, 0x31, 0x22, 0xef,
+ 0xbe, 0xf1, 0x05, 0xc1, 0xc1, 0xf4, 0x05, 0x23, 0x01, 0xc0, 0xee, 0x34,
+ 0x13, 0xf1, 0x24, 0x33,
+ 0x03, 0x24, 0x02, 0xf2, 0x66, 0x43, 0x01, 0xd1, 0xf2, 0x14, 0xf2, 0xa0,
+ 0xf1, 0x02, 0xf2, 0x04,
+ 0x14, 0xa0, 0xde, 0x03, 0x27, 0x42, 0x01, 0x01, 0x01, 0x02, 0x03, 0x13,
+ 0xd0, 0xb1, 0x15, 0x02,
+ 0xd1, 0xd1, 0xf2, 0x21, 0x72, 0x1f, 0x0b, 0x3f, 0x4d, 0x2d, 0x71, 0x20,
+ 0x2a, 0x0c, 0x1c, 0x0e,
+ 0x1f, 0x0e, 0x1e, 0x2f, 0x1e, 0x0c, 0x0c, 0x4d, 0x3d, 0x6e, 0x2c, 0x2c,
+ 0x60, 0x30, 0x0b, 0x1e,
+ 0x41, 0x32, 0x0e, 0x0e, 0x00, 0x30, 0x30, 0x0c, 0xed, 0x00, 0x52, 0x1f,
+ 0x0d, 0x0f, 0x02, 0xbc,
+ 0xdd, 0x04, 0x01, 0xcf, 0xe0, 0xf3, 0xcf, 0xef, 0x05, 0xf7, 0xe1, 0x8f,
+ 0xed, 0xff, 0xdd, 0xe0,
+ 0x04, 0xe0, 0xc1, 0xf4, 0xd0, 0xe1, 0xe2, 0x9c, 0xed, 0x07, 0x07, 0xe0,
+ 0xb0, 0xf1, 0xf1, 0xb0,
+ 0xe0, 0xf1, 0xf1, 0xef, 0xec, 0xfe, 0xff, 0xed, 0x11, 0x00, 0xec, 0xdd,
+ 0x31, 0x65, 0xf0, 0xe0,
+ 0xe0, 0xef, 0xd0, 0xd3, 0xf4, 0xe0, 0xbf, 0xee, 0x23, 0x0e, 0xa8, 0xec,
+ 0x0e, 0x1f, 0x4f, 0x1f,
+ 0xfb, 0x0e, 0x4f, 0x2e, 0xfb, 0x0e, 0x70, 0x40, 0x3f, 0x4f, 0x1c, 0x1e,
+ 0x20, 0x1d, 0x1e, 0x2f,
+ 0x0e, 0xdc, 0xef, 0xbe, 0xdc, 0x00, 0x00, 0x0b, 0x71, 0x10, 0xe8, 0xde,
+ 0x0f, 0x21, 0x00, 0xae,
+ 0xff, 0xee, 0xff, 0xf0, 0xcf, 0xcd, 0xf0, 0xf1, 0xde, 0xce, 0xf6, 0x03,
+ 0xbf, 0xcd, 0xf4, 0x07,
+ 0xc0, 0xef, 0x14, 0x12, 0xe0, 0xe2, 0xd0, 0xe1, 0x03, 0xe0, 0xc0, 0xf4,
+ 0xe2, 0xe3, 0xe3, 0xe1,
+ 0xcd, 0xeb, 0x43, 0x25, 0xf1, 0xf1, 0x0f, 0xdb, 0xbc, 0x51, 0x54, 0x00,
+ 0xfd, 0x20, 0x63, 0x00,
+ 0xfc, 0x01, 0x46, 0x00, 0x10, 0x31, 0x20, 0x10, 0x11, 0x55, 0x21, 0x00,
+ 0x00, 0x10, 0x0e, 0x0f,
+ 0x0f, 0x0f, 0x73, 0x31, 0x30, 0x53, 0x1f, 0x18, 0x2d, 0x75, 0x21, 0x0d,
+ 0x1d, 0x20, 0x11, 0x10,
+ 0x0e, 0xfd, 0xff, 0x00, 0x13, 0x0e, 0xd8, 0x10, 0x72, 0x23, 0x03, 0x00,
+ 0x00, 0x35, 0x44, 0x12,
+ 0xef, 0xcf, 0x03, 0x47, 0x01, 0xf1, 0xf0, 0xef, 0x10, 0x01, 0xf0, 0x12,
+ 0x12, 0x00, 0x12, 0xd1,
+ 0xe2, 0x04, 0xd1, 0x77, 0x44, 0xa0, 0xde, 0x00, 0x12, 0x21, 0x01, 0x03,
+ 0xe2, 0xaf, 0x00, 0x02,
+ 0xde, 0xff, 0xdd, 0xc8, 0x00, 0x01, 0xd0, 0xe1, 0xe0, 0x01, 0x12, 0xbf,
+ 0xa8, 0xf0, 0x12, 0x12,
+ 0x53, 0x14, 0x00, 0x00, 0x43, 0x10, 0x0b, 0x12, 0x77, 0x23, 0x0f, 0xf0,
+ 0x10, 0x21, 0x00, 0x11,
+ 0x10, 0x10, 0x2f, 0x0e, 0x40, 0x72, 0x1e, 0x20, 0x21, 0x0c, 0x09, 0x0f,
+ 0x21, 0x01, 0xdf, 0xbf,
+ 0x02, 0x27, 0x00, 0xf0, 0x10, 0x0f, 0x0e, 0x5f, 0x4f, 0x3d, 0x4d, 0x1b,
+ 0x0c, 0xfe, 0x31, 0x31,
+ 0x0e, 0x2f, 0x1f, 0xff, 0x32, 0xcd, 0x88, 0xdd, 0x33, 0x00, 0xcd, 0xbb,
+ 0xcb, 0x00, 0x00, 0x0e,
+ 0xee, 0xf0, 0x01, 0x35, 0x43, 0x10, 0xff, 0xee, 0x00, 0x01, 0x04, 0xf1,
+ 0xae, 0xef, 0xd0, 0xf3,
+ 0xf6, 0xe2, 0xa0, 0xdd, 0xf0, 0xe0, 0xf2, 0xe1, 0xe2, 0xcf, 0x03, 0x27,
+ 0xf2, 0x8e, 0xf2, 0x04,
+ 0xfd, 0xdc, 0x44, 0x12, 0xfd, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x00, 0xcf,
+ 0x0e, 0x10, 0xf0, 0xef,
+ 0xe0, 0xd0, 0xbd, 0x1f, 0x77, 0x22, 0xe8, 0xdd, 0x1f, 0x2f, 0x1f, 0x0c,
+ 0x0e, 0x0e, 0x1f, 0x42,
+ 0xf0, 0x8c, 0x0f, 0x33, 0x22, 0xda, 0xde, 0x40, 0x42, 0x1f, 0x2e, 0x2d,
+ 0x0b, 0x0d, 0x1f, 0x5f,
+ 0x2f, 0x1e, 0x0d, 0xee, 0xdf, 0xbe, 0xba, 0xdd, 0xee, 0xf0, 0x05, 0x05,
+ 0x8c, 0x00, 0x7c, 0x00,
+ 0x6c, 0xf3, 0xce, 0xcf, 0xd3, 0xf8, 0x76, 0xcd, 0xdd, 0x88, 0x00, 0x33,
+ 0x0f, 0xcc, 0xf0, 0xf0,
+ 0x26, 0x30, 0x9c, 0x01, 0x04, 0x00, 0xdc, 0xcf, 0x12, 0x33, 0x8b, 0xff,
+ 0x01, 0x00, 0xff, 0x0f,
+ 0xff, 0x00, 0xf1, 0xef, 0xf0, 0xe0, 0x12, 0x02, 0x8b, 0xfe, 0xf0, 0x04,
+ 0xf3, 0xed, 0xdc, 0x22,
+ 0x01, 0xce, 0x00, 0xe0, 0x10, 0x46, 0x0e, 0x99, 0x00, 0x01, 0xe0, 0xec,
+ 0x20, 0x11, 0xef, 0xff,
+ 0xec, 0xdd, 0x32, 0x11, 0xeb, 0x10, 0xed, 0x9f, 0x0f, 0x40, 0x00, 0xe9,
+ 0xdf, 0x10, 0x43, 0xfe,
+ 0xeb, 0xff, 0x40, 0x61, 0xf0, 0xda, 0x21, 0x31, 0xed, 0xcc, 0x21, 0x32,
+ 0x00, 0xed, 0xef, 0x30,
+ 0x1f, 0xfe, 0xee, 0x74, 0x01, 0x9a, 0x00, 0x00, 0xf0, 0xf0, 0x20, 0x23,
+ 0xdd, 0xde, 0x10, 0x22,
+ 0x02, 0x23, 0xfd, 0xc8, 0xad, 0x11, 0x67, 0xef, 0xee, 0x12, 0x00, 0xcf,
+ 0x00, 0x03, 0xe0, 0xec,
+ 0x00, 0x64, 0xff, 0xee, 0x13, 0x00, 0xea, 0xdf, 0x20, 0x40, 0xcd, 0x01,
+ 0x35, 0x0f, 0xf0, 0x32,
+ 0xdf, 0xbe, 0x13, 0x32, 0x30, 0xd8, 0xb0, 0x0f, 0xe0, 0x11, 0x56, 0xce,
+ 0xdd, 0x31, 0x10, 0xdd,
+ 0x00, 0x31, 0x00, 0x0f, 0x1d, 0x50, 0x01, 0xdf, 0xee, 0x11, 0x10, 0xfc,
+ 0xfe, 0xed, 0x21, 0x77,
+ 0x52, 0xea, 0xee, 0x20, 0x20, 0xf0, 0xd3, 0x00, 0xfd, 0x0f, 0xf0, 0x30,
+ 0x77, 0xf0, 0xbe, 0x0f,
+ 0x01, 0x11, 0x00, 0x01, 0xd0, 0x12, 0x77, 0xef, 0xef, 0x11, 0xff, 0xca,
+ 0x01, 0x54, 0x01, 0xce,
+ 0x00, 0x12, 0xf0, 0xcc, 0x26, 0x32, 0xbe, 0xde, 0x12, 0x23, 0xef, 0xfd,
+ 0x01, 0xf0, 0x25, 0x02,
+ 0x9c, 0x00, 0x14, 0x20, 0xf0, 0xff, 0x01, 0x01, 0x01, 0x12, 0x10, 0x1d,
+ 0x2f, 0xf3, 0x77, 0x35,
+ 0xdc, 0x31, 0x72, 0xef, 0xff, 0x35, 0x10, 0xdc, 0x12, 0x20, 0xd0, 0x41,
+ 0x43, 0xbc, 0xff, 0x22,
+ 0x20, 0x1f, 0x21, 0x22, 0x20, 0xff, 0x0f, 0x74, 0x00, 0x21, 0x23, 0x20,
+ 0x20, 0x20, 0x00, 0xec,
+ 0x43, 0x77, 0x00, 0xfb, 0x01, 0x20, 0x00, 0x01, 0x22, 0x1d, 0x40, 0x37,
+ 0x53, 0xf0, 0xbc, 0x01,
+ 0x23, 0x20, 0xe0, 0x01, 0x23, 0xee, 0xde, 0x0e, 0x53, 0x47, 0xf0, 0xdc,
+ 0x22, 0x44, 0xec, 0xf0,
+ 0x12, 0xee, 0x44, 0x33, 0xef, 0xdd, 0x54, 0x32, 0xde, 0xff, 0x00, 0xe2,
+ 0x13, 0x62, 0x0f, 0xfe,
+ 0x01, 0xe0, 0x15, 0x21, 0xdf, 0x46, 0x51, 0xdc, 0xe0, 0x16, 0x31, 0xff,
+ 0xee, 0x20, 0x31, 0x63,
+ 0xf0, 0xba, 0x20, 0x44, 0x0f, 0xf0, 0x00, 0x23, 0xff, 0xbd, 0xf0, 0x35,
+ 0x13, 0xee, 0x0d, 0x32,
+ 0x22, 0xbc, 0x0d, 0x52, 0x12, 0x24, 0x31, 0xeb, 0xcc, 0x65, 0x12, 0xee,
+ 0xdd, 0x63, 0x16, 0x0f,
+ 0xee, 0xf0, 0xf0, 0x02, 0x20, 0x00, 0x00, 0x31, 0xed, 0x30, 0x77, 0x10,
+ 0xf0, 0x10, 0x0e, 0x20,
+ 0x02, 0xf0, 0x30, 0x64, 0xec, 0xcc, 0x34, 0x11, 0xdc, 0xde, 0x12, 0x31,
+ 0x00, 0xac, 0x10, 0x24,
+ 0xe0, 0x0d, 0x31, 0x1f, 0x01, 0x47, 0xff, 0xff, 0x61, 0x00, 0xdd, 0x32,
+ 0x35, 0xdf, 0x20, 0x43,
+ 0xae, 0xfe, 0x01, 0x34, 0x22, 0x01, 0xdd, 0xee, 0x03, 0x00, 0xf0, 0x57,
+ 0x06, 0xce, 0x0f, 0x40,
+ 0x02, 0xf1, 0xff, 0xcc, 0x64, 0x34, 0xbc, 0xff, 0x12, 0x00, 0x00, 0x12,
+ 0x00, 0xac, 0x00, 0x00,
+ 0x01, 0x33, 0xed, 0xfe, 0x04, 0x10, 0x00, 0x01, 0x10, 0xeb, 0xd0, 0x32,
+ 0x33, 0xfe, 0x8a, 0xde,
+ 0x33, 0x66, 0xee, 0xdd, 0x00, 0x12, 0x11, 0x0f, 0x0d, 0x00, 0x20, 0x32,
+ 0x00, 0xfa, 0x10, 0x50,
+ 0xc9, 0x00, 0x74, 0xef, 0xfd, 0x00, 0x10, 0xdc, 0x12, 0x54, 0xed, 0xcd,
+ 0x11, 0x10, 0x01, 0x31,
+ 0x0e, 0xcd, 0x23, 0x33, 0xfe, 0xf1, 0x37, 0x00, 0xef, 0xcd, 0x35, 0x75,
+ 0xef, 0xef, 0x31, 0x11,
+ 0x00, 0x30, 0x02, 0xcf, 0xeb, 0x53, 0x33, 0xef, 0x00, 0xf2, 0xf1, 0x33,
+ 0x00, 0xe0, 0x35, 0x13,
+ 0xd0, 0x91, 0x05, 0x13, 0x01, 0x10, 0x23, 0xf4, 0xb0, 0xe0, 0x47, 0x12,
+ 0x00, 0x54, 0x00, 0xff,
+ 0x00, 0x26, 0x20, 0xe0, 0xcd, 0x43, 0x42, 0xe0, 0xcf, 0x43, 0x22, 0xdd,
+ 0x01, 0x57, 0xee, 0xff,
+ 0x32, 0x01, 0xde, 0x20, 0x30, 0xf1, 0x31, 0x2f, 0x0e, 0x40, 0x0e, 0xc8,
+ 0x10, 0x75, 0x40, 0xdb,
+ 0x00, 0x11, 0x10, 0x1f, 0x00, 0xfe, 0x00, 0x01, 0x00, 0xfd, 0xde, 0x30,
+ 0x21, 0xdd, 0xee, 0x76,
+ 0x52, 0xed, 0xca, 0x20, 0x31, 0x10, 0x00, 0xac, 0x11, 0x00, 0x0f, 0x00,
+ 0xef, 0xcd, 0x15, 0xdf,
+ 0xa9, 0x21, 0x32, 0xbe, 0xfe, 0x00, 0x00, 0xdf, 0x10, 0x0f, 0xfd, 0x01,
+ 0xdf, 0xcc, 0x00, 0x03,
+ 0x31, 0xd9, 0xef, 0x10, 0x35, 0x8e, 0xe0, 0x01, 0xff, 0x9c, 0x11, 0x24,
+ 0xdd, 0xed, 0x03, 0x00,
+ 0xd9, 0x20, 0x42, 0xdf, 0xdd, 0x0e, 0x2f, 0x0f, 0xcd, 0xf2, 0xef, 0xc8,
+ 0xf0, 0x01, 0xe0, 0x9c,
+ 0x00, 0x20, 0x00, 0xbd, 0xff, 0x0f, 0x50, 0x00, 0xf8, 0xe0, 0x10, 0x0f,
+ 0x0f, 0x00, 0xbd, 0x00,
+ 0xff, 0xdc, 0x21, 0x00, 0x8b, 0x00, 0x0e, 0x0e, 0x0e, 0xdd, 0xfc, 0x11,
+ 0x10, 0xcb, 0x20, 0x13,
+ 0xed, 0xbd, 0xfd, 0x01, 0xe0, 0xeb, 0xed, 0xcc, 0x02, 0x04, 0x9c, 0xfe,
+ 0x12, 0xfe, 0xbc, 0x10,
+ 0x01, 0xe0, 0xff, 0xf0, 0xeb, 0xdf, 0x0f, 0xcd, 0xe0, 0x15, 0xcc, 0xce,
+ 0x02, 0xef, 0xcd, 0x0f,
+ 0x13, 0x03, 0xf9, 0x0e, 0x31, 0xd1, 0x9f, 0x0f, 0x01, 0xf0, 0xed, 0xf0,
+ 0x04, 0xdd, 0x9b, 0x01,
+ 0x12, 0xde, 0xef, 0x00, 0x10, 0x0d, 0xed, 0xcd, 0x23, 0x17, 0x04, 0x0e,
+ 0xbc, 0xff, 0x00, 0x01,
+ 0x04, 0x02, 0x0d, 0x2b, 0x11, 0x31, 0x10, 0xeb, 0x5f, 0x63, 0xe0, 0xcd,
+ 0x20, 0x32, 0xf0, 0xf0,
+ 0x0f, 0xcc, 0x00, 0x77, 0x00, 0x00, 0xef, 0xec, 0x20, 0x75, 0x00, 0xee,
+ 0x00, 0x23, 0x00, 0xee,
+ 0x40, 0x24, 0xfe, 0x1e, 0x52, 0x26, 0x01, 0x0e, 0xfe, 0x10, 0x21, 0x13,
+ 0x04, 0x11, 0x0f, 0xed,
+ 0x31, 0x74, 0x1d, 0x10, 0x23, 0x10, 0xed, 0x01, 0x17, 0x01, 0xcd, 0x10,
+ 0x32, 0x01, 0x22, 0x21,
+ 0xf0, 0x73, 0x77, 0x10, 0x00, 0x24, 0x10, 0x0f, 0x36, 0x54, 0x00, 0xee,
+ 0x34, 0x10, 0x90, 0x00,
+ 0x47, 0x00, 0xbd, 0x13, 0x32, 0xef, 0x0e, 0x42, 0x14, 0x00, 0x23, 0x23,
+ 0x10, 0x10, 0x00, 0x46,
+ 0x10, 0x02, 0x11, 0x01, 0x75, 0x10, 0x01, 0x00, 0xf0, 0x11, 0x46, 0x00,
+ 0x0f, 0x62, 0x11, 0x00,
+ 0x35, 0x44, 0x00, 0x10, 0x60, 0x11, 0x0e, 0x00, 0x24, 0x12, 0x00, 0xff,
+ 0x23, 0x30, 0x0f, 0x02,
+ 0x23, 0x1d, 0x21, 0x77, 0x55, 0x0f, 0x0f, 0x02, 0x45, 0x0f, 0xfd, 0x34,
+ 0x10, 0xf0, 0x21, 0x63,
+ 0xff, 0xfe, 0x01, 0x35, 0x11, 0x1f, 0x0e, 0xe0, 0x26, 0x51, 0xf0, 0x00,
+ 0x12, 0x22, 0x22, 0xff,
+ 0x54, 0x57, 0xef, 0xee, 0x13, 0x53, 0x00, 0x04, 0x11, 0x0f, 0xd0, 0x11,
+ 0x16, 0x00, 0xbf, 0x0f,
+ 0x23, 0xf0, 0xce, 0x42, 0x34, 0xef, 0x10, 0x32, 0xbb, 0x22, 0x02, 0xe0,
+ 0x00, 0xf1, 0x03, 0x25,
+ 0xbe, 0xee, 0x02, 0x10, 0xef, 0x0d, 0x1f, 0xfe, 0x0e, 0x73, 0x30, 0xd8,
+ 0x20, 0x73, 0x10, 0x00,
+ 0x0f, 0xee, 0x2c, 0x0b, 0x10, 0x74, 0x0d, 0xec, 0x12, 0x10, 0x0e, 0xfd,
+ 0x2f, 0x0d, 0x3f, 0x33,
+ 0x35, 0xfe, 0xea, 0xcf, 0x50, 0x41, 0x00, 0xe0, 0xef, 0xf2, 0xf2, 0x67,
+ 0x42, 0xef, 0xe0, 0x35,
+ 0x0f, 0x0e, 0x12, 0xf1, 0xaf, 0x00, 0x02, 0x23, 0x00, 0xcc, 0x0f, 0xf0,
+ 0x04, 0x02, 0x0d, 0xfe,
+ 0x07, 0x34, 0x22, 0x90, 0xef, 0x14, 0x01, 0xd0, 0xa0, 0xe6, 0xa1, 0x00,
+ 0xf3, 0x00, 0xe3, 0xef,
+ 0xec, 0x02, 0x46, 0x01, 0x01, 0x00, 0xff, 0x00, 0xf2, 0x54, 0x21, 0xde,
+ 0x00, 0xce, 0xa8, 0x01,
+ 0x13, 0xf0, 0xde, 0xe0, 0x1f, 0x0e, 0x20, 0x52, 0xef, 0x0a, 0x30, 0xf0,
+ 0xef, 0x51, 0x40, 0x0e,
+ 0x00, 0x30, 0x22, 0x1e, 0x08, 0xdd, 0x5f, 0x52, 0xf0, 0xda, 0x10, 0x53,
+ 0x0f, 0xfe, 0x20, 0x11,
+ 0x0e, 0x30, 0x2e, 0x30, 0x60, 0x0e, 0xda, 0x00, 0x53, 0x02, 0x2e, 0x0e,
+ 0x12, 0xd0, 0x00, 0x27,
+ 0x20, 0x32, 0x61, 0xdc, 0xbb, 0xf0, 0x05, 0x0f, 0x00, 0x01, 0x03, 0xbc,
+ 0xde, 0x13, 0x32, 0xef,
+ 0x00, 0x45, 0xee, 0xac, 0x01, 0x13, 0x00, 0x11, 0x43, 0xd0, 0xcc, 0xe1,
+ 0x07, 0xf0, 0xbc, 0x12,
+ 0x32, 0xcf, 0xed, 0x10, 0x30, 0xdd, 0xdd, 0x24, 0x10, 0xbc, 0x01, 0x03,
+ 0xca, 0x00, 0x11, 0xf0,
+ 0xdd, 0xee, 0xcc, 0x0f, 0x50, 0xc9, 0x00, 0x1e, 0x0f, 0x2f, 0x31, 0x0e,
+ 0xfe, 0x0f, 0xee, 0x0c,
+ 0x21, 0x62, 0xdc, 0xed, 0x30, 0xcb, 0x8b, 0xfe, 0x00, 0x30, 0x04, 0xde,
+ 0xda, 0x00, 0x2f, 0x60,
+ 0x1f, 0xfe, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0xce, 0xe0, 0xa2, 0xdc, 0x0f,
+ 0x00, 0xd0, 0xd1, 0x10,
+ 0xee, 0xbd, 0xf3, 0xf2, 0xde, 0x07, 0x04, 0x8c, 0xdc, 0xf2, 0xf4, 0xef,
+ 0xdd, 0x01, 0xc3, 0xee,
+ 0xdf, 0xe0, 0xe4, 0xe0, 0xee, 0xef, 0xfe, 0x04, 0x16, 0x90, 0xd0, 0xf2,
+ 0x15, 0x0e, 0xfc, 0xf2,
+ 0xf3, 0x9e, 0x0d, 0x34, 0x02, 0xff, 0xfc, 0xce, 0xef, 0x11, 0x61, 0xff,
+ 0xcf, 0x00, 0x0f, 0x10,
+ 0x03, 0x67, 0x0e, 0xfa, 0x21, 0x33, 0xdb, 0x0f, 0x51, 0x11, 0x1f, 0x30,
+ 0x10, 0x0b, 0x20, 0x71,
+ 0x31, 0x0f, 0x3d, 0x0e, 0x00, 0x01, 0x0f, 0x10, 0xf0, 0x0d, 0x4e, 0x0c,
+ 0xa0, 0x03, 0x06, 0x22,
+ 0x73, 0x09, 0xee, 0x14, 0x21, 0xfe, 0x00, 0x13, 0x10, 0x00, 0x00, 0x01,
+ 0x03, 0xe3, 0x57, 0x22,
+ 0x0f, 0xfe, 0xe0, 0xbf, 0x16, 0x14, 0xee, 0xae, 0x02, 0x25, 0xc0, 0xef,
+ 0x00, 0xee, 0xee, 0xc1,
+ 0xe0, 0x0e, 0x64, 0x24, 0xcd, 0xed, 0xf0, 0xf2, 0x00, 0x23, 0x03, 0xeb,
+ 0xce, 0x03, 0x04, 0xf0,
+ 0x12, 0xcd, 0xf0, 0x34, 0x13, 0x88, 0xcc, 0x20, 0x32, 0x02, 0xce, 0xeb,
+ 0x00, 0x41, 0x10, 0x2f,
+ 0x55, 0xff, 0xbb, 0x00, 0x21, 0x11, 0x10, 0x1d, 0xee, 0xde, 0xf0, 0x22,
+ 0x3f, 0x0c, 0x52, 0x22,
+ 0xdb, 0x0d, 0x30, 0x60, 0x00, 0x00, 0x10, 0x1d, 0x0d, 0x0e, 0x74, 0x13,
+ 0x01, 0x0d, 0xe8, 0x1e,
+ 0x21, 0x12, 0xfe, 0x0b, 0x00, 0x1f, 0x0e, 0x4f, 0x32, 0x02, 0xcc, 0x2f,
+ 0x72, 0x21, 0x00, 0x10,
+ 0xe0, 0x01, 0x05, 0x0f, 0x0b, 0x0e, 0x0f, 0xe0, 0xd1, 0x8c, 0xc9, 0xe0,
+ 0x11, 0x11, 0xff, 0xf0,
+ 0x02, 0x0f, 0x0e, 0x54, 0xd1, 0xd0, 0x27, 0x20, 0xd1, 0xe1, 0x23, 0xd0,
+ 0x8e, 0x80, 0x07, 0x12,
+ 0x00, 0xf0, 0xfd, 0x0e, 0x00, 0x10, 0x04, 0x00, 0x0e, 0xdb, 0x00, 0x36,
+ 0xc0, 0xbd, 0x00, 0xf0,
+ 0x01, 0x00, 0xa0, 0x0e, 0x00, 0x0d, 0xbd, 0x00, 0x00, 0xfc, 0x0d, 0x00,
+ 0x01, 0xed, 0x2d, 0x53,
+ 0x09, 0x0f, 0x01, 0x22, 0xd8, 0xcf, 0x00, 0x20, 0xbf, 0xfd, 0xff, 0x3e,
+ 0x61, 0x01, 0xdc, 0x1b,
+ 0x3f, 0x1f, 0x32, 0x00, 0x98, 0xf0, 0x0f, 0x10, 0x0f, 0x01, 0x12, 0x00,
+ 0xbb, 0x01, 0x03, 0x00,
+ 0x1f, 0x20, 0xf4, 0xc0, 0x00, 0x43, 0xe3, 0x9c, 0x01, 0x06, 0xd0, 0xf0,
+ 0xf3, 0x01, 0x10, 0x71,
+ 0x13, 0xf1, 0xd0, 0x26, 0x11, 0x00, 0x16, 0x32, 0xa0, 0xf1, 0x04, 0x12,
+ 0x13, 0xf1, 0xd4, 0xf1,
+ 0x14, 0x00, 0xc2, 0x43, 0x10, 0x01, 0xe1, 0x02, 0x77, 0x64, 0x00, 0x00,
+ 0x03, 0x34, 0x00, 0x12,
+ 0x42, 0x02, 0x10, 0x33, 0x00, 0xe0, 0x00, 0x23, 0x14, 0x44, 0x75, 0x10,
+ 0x00, 0x41, 0x42, 0x00,
+ 0x01, 0x46, 0x0f, 0x0f, 0x21, 0x32, 0x30, 0x20, 0x15, 0x10, 0x0d, 0x3e,
+ 0x70, 0x53, 0x10, 0x00,
+ 0x1c, 0x10, 0x21, 0x10, 0x10, 0x47, 0x11, 0x00, 0x41, 0x32, 0x44, 0x06,
+ 0x00, 0x0e, 0x20, 0x52,
+ 0x03, 0xed, 0x22, 0x57, 0x00, 0xf0, 0xef, 0x13, 0x24, 0x0f, 0xde, 0x11,
+ 0x52, 0xee, 0xdd, 0xe0,
+ 0x20, 0x55, 0x16, 0xf0, 0xcd, 0x00, 0xf1, 0xf2, 0x03, 0x04, 0x00, 0xd0,
+ 0x01, 0xff, 0xbc, 0x25,
+ 0x73, 0x00, 0xff, 0x00, 0x03, 0x30, 0x00, 0xce, 0x0d, 0x14, 0x41, 0xec,
+ 0x01, 0x16, 0xef, 0xfe,
+ 0x3f, 0x20, 0xbe, 0xcd, 0x07, 0x02, 0xcc, 0xcc, 0x00, 0x0e, 0x60, 0x50,
+ 0x00, 0xeb, 0x10, 0x30,
+ 0x1f, 0x1d, 0x20, 0x03, 0x00, 0x0b, 0xcf, 0x00, 0xf0, 0xcc, 0x00, 0x00,
+ 0xfc, 0x0c, 0x2f, 0xef,
+ 0xce, 0xed, 0x40, 0x21, 0xbc, 0xfa, 0x4f, 0x30, 0x8e, 0xf0, 0x11, 0x0d,
+ 0xd8, 0xf1, 0x01, 0x00,
+ 0xdd, 0xd0, 0xdf, 0xdf, 0xa0, 0xdf, 0xaa, 0xff, 0xe0, 0xf1, 0xdd, 0xff,
+ 0xf0, 0xbf, 0xdc, 0xf1,
+ 0x04, 0x0e, 0x88, 0xff, 0xf0, 0x01, 0xf0, 0xef, 0xee, 0x00, 0x02, 0xbe,
+ 0xee, 0x00, 0x10, 0xf1,
+ 0xdf, 0x00, 0xf0, 0xdc, 0xec, 0xfe, 0xf0, 0xf0, 0xbd, 0xe9, 0xdf, 0xde,
+ 0x01, 0x43, 0x0e, 0xc8,
+ 0x0f, 0xec, 0xaf, 0x01, 0x02, 0xce, 0xbd, 0x00, 0x0d, 0x0d, 0xf0, 0x00,
+ 0x1c, 0x1d, 0x40, 0x2f,
+ 0x2d, 0x1c, 0x0b, 0x1e, 0x31, 0x00, 0xdb, 0xac, 0x2f, 0x30, 0x00, 0xbf,
+ 0x31, 0x1d, 0xdb, 0xf0,
+ 0x12, 0x0d, 0xcb, 0x20, 0x11, 0xc2, 0xef, 0x0e, 0xcb, 0x9f, 0x12, 0x34,
+ 0xfc, 0xde, 0x12, 0x22,
+ 0x25, 0x00, 0x8c, 0x00, 0x00, 0x27, 0xf0, 0xcf, 0x0f, 0xef, 0x00, 0xd1,
+ 0x01, 0x03, 0xef, 0x0f,
+ 0xf0, 0x9d, 0xec, 0x03, 0x57, 0xff, 0xde, 0xd0, 0x00, 0x11, 0x00, 0xf0,
+ 0x16, 0xf0, 0xcc, 0x10,
+ 0x70, 0x02, 0x00, 0xd1, 0x0f, 0x1e, 0xf0, 0xf2, 0x00, 0x10, 0xff, 0x24,
+ 0x72, 0xf9, 0xe0, 0x40,
+ 0x51, 0x02, 0x00, 0xec, 0x0c, 0x30, 0x22, 0x23, 0xdd, 0xc9, 0x20, 0x72,
+ 0x52, 0x00, 0x0e, 0x10,
+ 0x10, 0x02, 0x00, 0x0a, 0x22, 0x43, 0x00, 0x04, 0x51, 0x0e, 0x00, 0x04,
+ 0x35, 0x10, 0x20, 0x20,
+ 0x32, 0x30, 0x63, 0x14, 0x0f, 0x0e, 0x01, 0x07, 0x23, 0x4f, 0x0d, 0x10,
+ 0x20, 0x20, 0x10, 0x77,
+ 0x23, 0x0e, 0xff, 0x30, 0x30, 0x10, 0x46, 0x01, 0xd0, 0xc0, 0x21, 0x60,
+ 0xed, 0xf0, 0x21, 0x30,
+ 0x10, 0x0e, 0xdd, 0x30, 0x76, 0x50, 0xf1, 0xe2, 0x27, 0x11, 0x12, 0x23,
+ 0x12, 0x00, 0x00, 0xf3,
+ 0x01, 0x74, 0x43, 0x00, 0xff, 0x22, 0x43, 0x00, 0x11, 0x32, 0x32, 0x00,
+ 0x36, 0x57, 0x00, 0x0e,
+ 0x1f, 0xff, 0xf0, 0x15, 0x00, 0x8e, 0xdf, 0x13, 0x47, 0x0f, 0x0e, 0x41,
+ 0x33, 0xff, 0x0e, 0x75,
+ 0x03, 0x0f, 0xed, 0x10, 0x44, 0xf0, 0xff, 0x05, 0x01, 0x1f, 0x10, 0x12,
+ 0xe1, 0x14, 0x73, 0x0f,
+ 0x1c, 0x20, 0x2f, 0x1f, 0x00, 0x14, 0x12, 0x0d, 0x1c, 0x50, 0x00, 0x25,
+ 0x60, 0x0f, 0x0f, 0x11,
+ 0x16, 0x02, 0x31, 0x10, 0xf1, 0xf2, 0x34, 0x44, 0x10, 0x03, 0xf2, 0x32,
+ 0xe0, 0x8f, 0xc3, 0x27,
+ 0x46, 0xf1, 0xf0, 0x1e, 0x50, 0x34, 0x12, 0x00, 0x01, 0x43, 0x21, 0x35,
+ 0x01, 0x01, 0x10, 0x00,
+ 0x05, 0x13, 0x33, 0xd3, 0xb0, 0xf0, 0x25, 0x12, 0xe1, 0x71, 0x74, 0x02,
+ 0x01, 0x00, 0x02, 0x42,
+ 0x02, 0x07, 0x14, 0x01, 0xe1, 0x11, 0x02, 0x31, 0x11, 0x01, 0x14, 0x33,
+ 0xcf, 0xaa, 0xf0, 0x30,
+ 0x75, 0x21, 0xe0, 0x00, 0x01, 0x40, 0x33, 0x26, 0x00, 0xbc, 0x00, 0x22,
+ 0x20, 0x0f, 0x0e, 0x01,
+ 0x00, 0x1e, 0x7e, 0x21, 0x02, 0xfb, 0x0e, 0x01, 0x41, 0x1e, 0x01, 0x01,
+ 0x3a, 0x00, 0x42, 0x00,
+ 0xf1, 0x26, 0x99, 0xf1, 0xc4, 0x25, 0xa9, 0xf3, 0xb2, 0x27, 0x33, 0xdb,
+ 0xae, 0xf2, 0xf4, 0xf1,
+ 0x00, 0xed, 0xdd, 0x03, 0x47, 0x41, 0xce, 0xbc, 0x00, 0x21, 0x00, 0xff,
+ 0xfd, 0x30, 0x51, 0xe0,
+ 0xfe, 0x30, 0x24, 0xdf, 0xfe, 0x77, 0x13, 0x10, 0x0e, 0xdf, 0xbf, 0x27,
+ 0x31, 0xbd, 0xfd, 0x12,
+ 0x20, 0xed, 0x12, 0x33, 0x2e, 0x2e, 0x33, 0x76, 0x1f, 0xfb, 0xe0, 0x00,
+ 0xe1, 0xbf, 0xdf, 0x00,
+ 0xf3, 0xdd, 0xeb, 0x41, 0x41, 0xca, 0x01, 0x65, 0x10, 0x0d, 0x00, 0x00,
+ 0xee, 0x0e, 0x42, 0x26,
+ 0x00, 0xee, 0xaf, 0x00, 0xf0, 0x33, 0x33, 0xe0, 0xd0, 0x25, 0x10, 0xef,
+ 0x8c, 0xff, 0xf0, 0x13,
+ 0x34, 0x0f, 0xfc, 0xf0, 0x00, 0x51, 0x23, 0x1f, 0xfe, 0xb0, 0x15, 0x44,
+ 0xed, 0xcb, 0x03, 0x13,
+ 0x01, 0x03, 0x0b, 0xbb, 0x00, 0x34, 0x01, 0xaf, 0x0e, 0x11, 0x01, 0x0f,
+ 0x0b, 0x00, 0x32, 0xf2,
+ 0xf0, 0x0f, 0x52, 0x22, 0x0c, 0x0f, 0x02, 0x25, 0x1f, 0xfb, 0xf1, 0x02,
+ 0x1f, 0x0f, 0xd0, 0x90,
+ 0x33, 0x3f, 0xf9, 0x70, 0x32, 0x10, 0x00, 0x0d, 0x0f, 0x54, 0xf2, 0xbc,
+ 0xff, 0x01, 0xe0, 0x0d,
+ 0x00, 0xfd, 0xe0, 0x01, 0x22, 0xed, 0xec, 0x55, 0x45, 0x0e, 0x0c, 0x20,
+ 0x65, 0x11, 0xff, 0xce,
+ 0x11, 0x56, 0x00, 0xde, 0x0f, 0x10, 0x01, 0x22, 0x0f, 0x8b, 0x00, 0x03,
+ 0x21, 0xef, 0xcd, 0xff,
+ 0x00, 0x20, 0x05, 0xe1, 0xcc, 0x0e, 0x43, 0x26, 0xfe, 0xde, 0x11, 0x34,
+ 0xee, 0xde, 0x0f, 0x23,
+ 0xd1, 0x8f, 0x23, 0x36, 0xfe, 0x0f, 0x50, 0x01, 0xad, 0x00, 0x25, 0x00,
+ 0x0f, 0x09, 0x00, 0x00,
+ 0x01, 0x13, 0xf0, 0x9e, 0x00, 0x20, 0x01, 0x13, 0x31, 0x20, 0xfe, 0xce,
+ 0xfd, 0xfa, 0x0e, 0x12,
+ 0xb1, 0xf0, 0x11, 0x61, 0x2f, 0x31, 0x24, 0x0c, 0x00, 0xf2, 0xd3, 0xdb,
+ 0xef, 0x02, 0xdf, 0xbb,
+ 0x01, 0xd0, 0x00, 0x11, 0x30, 0x38, 0x1f, 0x20, 0x72, 0x63, 0x0f, 0xde,
+ 0x1f, 0x0e, 0x00, 0x17,
+ 0x42, 0xdc, 0xdf, 0x03, 0xf0, 0xd3, 0x77, 0x20, 0xdc, 0xd0, 0x10, 0x23,
+ 0xe0, 0xbe, 0x0f, 0x20,
+ 0xef, 0xe0, 0x61, 0x1d, 0x0d, 0x00, 0xe0, 0x00, 0x25, 0xf3, 0xeb, 0x20,
+ 0x31, 0xe2, 0xb1, 0x02,
+ 0x03, 0xc0, 0x15, 0x01, 0xdc, 0xdc, 0xe1, 0x05, 0xc0, 0xcf, 0x2b, 0x7f,
+ 0x41, 0x02, 0x0e, 0xd9,
+ 0x00, 0x33, 0x00, 0x0e, 0x0f, 0x00, 0x33, 0xe1, 0x81, 0x02, 0x00, 0x05,
+ 0xe3, 0xbf, 0xff, 0x00,
+ 0x3a, 0xfd, 0x74, 0x23, 0x2d, 0x1f, 0x21, 0x01, 0x1d, 0x0b, 0xf1, 0xd3,
+ 0x9d, 0xfc, 0xf0, 0x26,
+ 0x00, 0xb0, 0xfc, 0xf0, 0x00, 0x00, 0x0c, 0x10, 0x11, 0x22, 0x10, 0xeb,
+ 0x00, 0x73, 0x35, 0xdf,
+ 0xfd, 0x42, 0x04, 0x8f, 0x0f, 0x31, 0x00, 0xfd, 0xf0, 0x00, 0x0f, 0x24,
+ 0x23, 0xff, 0x00, 0x1d,
+ 0xd8, 0xef, 0x76, 0x30, 0xaf, 0x0e, 0x0f, 0x00, 0x11, 0x03, 0x00, 0xec,
+ 0x00, 0x12, 0x00, 0x62,
+ 0x05, 0x00, 0x0e, 0x11, 0xe0, 0xa0, 0x04, 0x11, 0xfc, 0xda, 0xf0, 0x25,
+ 0x00, 0xce, 0x0f, 0x00,
+ 0xd0, 0x02, 0x61, 0xf0, 0x10, 0x72, 0x1f, 0x10, 0x02, 0x00, 0x1d, 0xf0,
+ 0x02, 0xd0, 0xef, 0x03,
+ 0x11, 0x30, 0xef, 0x9b, 0x02, 0x00, 0x28, 0x21, 0x25, 0xd0, 0xf2, 0x10,
+ 0xfc, 0xdf, 0x20, 0x0d,
+ 0xdc, 0x02, 0xc2, 0x8d, 0xfc, 0x42, 0x13, 0x01, 0x14, 0xe1, 0x00, 0x49,
+ 0x0d, 0xfb, 0x00, 0xf3,
+ 0x71, 0x30, 0xeb, 0xc0, 0x30, 0x25, 0xf0, 0xdd, 0x00, 0x41, 0xe1, 0xcf,
+ 0x0e, 0xf0, 0x04, 0x61,
+ 0xcd, 0xdb, 0x30, 0x00, 0xec, 0x21, 0x75, 0x20, 0xdd, 0xf0, 0x12, 0x00,
+ 0x00, 0x30, 0x13, 0x02,
+ 0xb0, 0xc2, 0x07, 0x00, 0xd0, 0xfd, 0xf3, 0x13, 0x75, 0x1f, 0xfa, 0xbf,
+ 0x00, 0xf0, 0xef, 0xe0,
+ 0x32, 0x2e, 0x0e, 0x30, 0x13, 0xf0, 0xd0, 0x07, 0xf1, 0xc0, 0xed, 0xde,
+ 0x00, 0x75, 0x62, 0xd0,
+ 0xff, 0x12, 0x2e, 0xea, 0x11, 0x72, 0x0f, 0xdd, 0x00, 0x42, 0x03, 0x20,
+ 0xfe, 0xde, 0x23, 0x16,
+ 0x0f, 0xdd, 0x00, 0xe0, 0xdb, 0x10, 0xef, 0x9a, 0x10, 0x30, 0x11, 0xa0,
+ 0x0f, 0x0e, 0x50, 0x34,
+ 0x02, 0x20, 0x1b, 0xee, 0x01, 0x26, 0x51, 0x00, 0xbf, 0xed, 0xef, 0x00,
+ 0x13, 0x01, 0xb1, 0x24,
+ 0x00, 0xea, 0x02, 0x75, 0xff, 0xec, 0x00, 0x12, 0x10, 0x1f, 0x00, 0x23,
+ 0x0e, 0xcd, 0x00, 0x21,
+ 0x11, 0x04, 0x32, 0xf0, 0x8f, 0x00, 0x0d, 0xfe, 0xd0, 0xf3, 0x04, 0xf0,
+ 0xf3, 0xd9, 0xbd, 0x20,
+ 0x67, 0x00, 0xff, 0x0f, 0x03, 0x22, 0x41, 0x01, 0x04, 0xe0, 0xdd, 0xcb,
+ 0x00, 0x57, 0x0f, 0xbe,
+ 0x00, 0x12, 0x31, 0xfc, 0x10, 0x73, 0x13, 0x1e, 0x0f, 0x0f, 0x0f, 0x20,
+ 0xfa, 0xce, 0x22, 0x13,
+ 0xd8, 0xf0, 0x21, 0x11, 0xd0, 0xe0, 0x4f, 0xfe, 0xd0, 0x00, 0x42, 0x31,
+ 0x10, 0x0d, 0x10, 0xce,
+ 0xfc, 0x11, 0x24, 0x74, 0x73, 0x0f, 0xd9, 0x01, 0x02, 0x24, 0x00, 0xf0,
+ 0x2f, 0x1b, 0xf0, 0x33,
+ 0xf0, 0x81, 0xee, 0xec, 0x21, 0x01, 0xc0, 0x00, 0xf1, 0xfc, 0x0f, 0x31,
+ 0x05, 0x11, 0x31, 0xbf,
+ 0xd0, 0xf5, 0xef, 0x0d, 0x60, 0x06, 0x32, 0xe0, 0xbc, 0xe0, 0x01, 0xd1,
+ 0xf1, 0xf2, 0xfe, 0x08,
+ 0x0e, 0xf0, 0x76, 0x71, 0x50, 0xed, 0xff, 0xf0, 0xf1, 0x12, 0x00, 0x0f,
+ 0xbf, 0x0f, 0x01, 0x35,
+ 0x00, 0x0c, 0xec, 0x00, 0x12, 0x71, 0x0e, 0xfb, 0x00, 0x20, 0x34, 0x11,
+ 0xdf, 0xef, 0x00, 0x20,
+ 0xde, 0xef, 0x63, 0x05, 0xf0, 0xfd, 0xf0, 0xc0, 0xdc, 0xee, 0x43, 0x52,
+ 0x0f, 0x0e, 0x0f, 0x20,
+ 0x37, 0x52, 0x0b, 0xcd, 0x01, 0x47, 0x00, 0x00, 0x00, 0xe0, 0xe2, 0xf0,
+ 0x40, 0x51, 0xf1, 0xd0,
+ 0x00, 0xe0, 0xa9, 0xf0, 0x00, 0x00, 0x3d, 0x40, 0xf0, 0xc0, 0x02, 0x3f,
+ 0x0e, 0x07, 0x04, 0xed,
+ 0xee, 0xe0, 0x03, 0x54, 0x11, 0x9e, 0xec, 0xf5, 0x11, 0x2f, 0x0c, 0xe0,
+ 0xd0, 0xbe, 0xf0, 0x23,
+ 0x51, 0x1c, 0x10, 0xed, 0xab, 0x0f, 0x55, 0x21, 0xed, 0xde, 0x03, 0x25,
+ 0xf0, 0xec, 0xe0, 0x00,
+ 0x03, 0x32, 0xef, 0xcf, 0x0e, 0x70, 0x33, 0x24, 0x10, 0x11, 0x05, 0x0f,
+ 0xfd, 0x10, 0x20, 0xdb,
+ 0xb1, 0x26, 0xef, 0xbb, 0x00, 0x01, 0xf0, 0x10, 0x40, 0xf0, 0x1f, 0x2f,
+ 0xfd, 0xce, 0xf1, 0x54,
+ 0x00, 0xc9, 0xe0, 0x00, 0x33, 0x45, 0xb0, 0xdd, 0x10, 0x32, 0x0d, 0x00,
+ 0x77, 0x00, 0xbd, 0x01,
+ 0x12, 0x0f, 0xfe, 0x01, 0x03, 0x10, 0x4e, 0x20, 0x00, 0xed, 0xf3, 0x04,
+ 0xda, 0xfe, 0x00, 0xb0,
+ 0xef, 0x0e, 0x40, 0x56, 0x12, 0x00, 0xe1, 0x15, 0x01, 0xf0, 0xbc, 0xd0,
+ 0x01, 0x10, 0x43, 0xf1,
+ 0xad, 0x0c, 0x44, 0x11, 0xef, 0xcb, 0x01, 0x36, 0x0f, 0x0c, 0x01, 0x12,
+ 0x42, 0x21, 0xff, 0xaa,
+ 0x00, 0x52, 0x00, 0xf0, 0xfe, 0x10, 0xe0, 0xde, 0x10, 0x54, 0x1f, 0x0d,
+ 0xf0, 0xf0, 0x00, 0xf0,
+ 0x04, 0x23, 0x0d, 0xdb, 0x00, 0x0f, 0x50, 0xe1, 0x8c, 0xfe, 0x13, 0x22,
+ 0x1e, 0x2e, 0x20, 0x3f,
+ 0x37, 0x25, 0xc0, 0xaa, 0xfe, 0x1f, 0x32, 0x03, 0xf0, 0x10, 0x71, 0x00,
+ 0xdd, 0xf3, 0xf4, 0x00,
+ 0x20, 0xcd, 0xcb, 0x00, 0x26, 0x1f, 0xbc, 0xef, 0x31, 0x41, 0xee, 0x0d,
+ 0x10, 0x25, 0x20, 0x22,
+ 0x30, 0xf0, 0xa1, 0xdf, 0x0f, 0x23, 0xf0, 0xc0, 0x07, 0xc1, 0x03, 0x1f,
+ 0xfc, 0x00, 0x22, 0x00,
+ 0xa1, 0x00, 0xed, 0x30, 0x64, 0x0d, 0xd9, 0x01, 0x02, 0xff, 0x10, 0x00,
+ 0xcd, 0xb0, 0x07, 0x32,
+ 0x0f, 0xdf, 0x00, 0x10, 0x2e, 0xec, 0x42, 0x77, 0x40, 0x0c, 0x00, 0x41,
+ 0xf2, 0xe2, 0xfc, 0xfe,
+ 0x30, 0x62, 0xe0, 0xcd, 0x0f, 0x00, 0x47, 0x35, 0xcf, 0xca, 0xf0, 0x41,
+ 0x20, 0x00, 0xf0, 0x0f,
+ 0x0e, 0xd0, 0xf1, 0x33, 0x40, 0x0d, 0x03, 0x00, 0x2d, 0x3e, 0x00, 0xe0,
+ 0x12, 0x00, 0x8b, 0xcd,
+ 0xf1, 0x05, 0x0f, 0xc8, 0xf0, 0x15, 0x11, 0xe0, 0xbc, 0xf0, 0xf0, 0x31,
+ 0x73, 0x01, 0xed, 0x1e,
+ 0x40, 0x25, 0x31, 0xf1, 0xe0, 0x13, 0x00, 0xdc, 0xcf, 0x21, 0x26, 0xae,
+ 0xed, 0xe2, 0xf0, 0x00,
+ 0x02, 0x24, 0xef, 0x0e, 0x10, 0x9c, 0xfe, 0x43, 0x34, 0xb0, 0x02, 0x01,
+ 0x1c, 0xfb, 0xd1, 0x05,
+ 0x11, 0x30, 0x1f, 0x2f, 0xed, 0xed, 0x51, 0x55, 0x12, 0xf0, 0xcd, 0x1f,
+ 0x7f, 0x20, 0x25, 0x10,
+ 0x0e, 0xdf, 0xfd, 0xf1, 0x05, 0x1d, 0xec, 0xd0, 0x00, 0x00, 0x2d, 0x70,
+ 0x77, 0x35, 0xed, 0xbe,
+ 0x00, 0x10, 0x23, 0x00, 0xed, 0xee, 0x00, 0x12, 0x01, 0x00, 0x32, 0x43,
+ 0xf0, 0xe2, 0x00, 0xb8,
+ 0x10, 0x53, 0x0f, 0x0c, 0x00, 0xe0, 0xf2, 0xd0, 0x00, 0xed, 0xfd, 0xb0,
+ 0xe2, 0x07, 0x52, 0x00,
+ 0x01, 0xde, 0xef, 0x02, 0x37, 0x1f, 0x21, 0x16, 0x8f, 0xde, 0xf0, 0xf2,
+ 0xff, 0xfd, 0x01, 0x22,
+ 0xce, 0xf8, 0x10, 0x73, 0xf0, 0xf0, 0x15, 0x30, 0x3e, 0xfe, 0xc0, 0xf0,
+ 0x00, 0x05, 0x40, 0xff,
+ 0x8b, 0x00, 0x00, 0x21, 0x22, 0xf0, 0xc0, 0x20, 0x3f, 0x2e, 0x1e, 0x1e,
+ 0xfa, 0x30, 0x73, 0x00,
+ 0xef, 0x0e, 0x2f, 0x22, 0x37, 0x07, 0x8e, 0xfd, 0x10, 0x45, 0xff, 0xad,
+ 0x00, 0x12, 0x0f, 0xee,
+ 0x01, 0x31, 0x00, 0x0f, 0x20, 0x00, 0xf0, 0x30, 0x30, 0x0e, 0xca, 0xd0,
+ 0xf3, 0xf1, 0xfe, 0xd0,
+ 0xe5, 0x04, 0x00, 0x1f, 0xf0, 0x00, 0x77, 0x71, 0x10, 0xae, 0xfe, 0x00,
+ 0x20, 0x10, 0xea, 0xf0,
+ 0x22, 0x35, 0x11, 0xf0, 0xbd, 0x00, 0x02, 0x20, 0xc1, 0xa1, 0x01, 0x00,
+ 0x0f, 0x0e, 0xf0, 0xd4,
+ 0x02, 0x4e, 0x28, 0x1d, 0x02, 0x00, 0x00, 0x5e, 0x20, 0x00, 0xec, 0xae,
+ 0xf2, 0xf7, 0x0f, 0x0d,
+ 0x03, 0xf1, 0xbe, 0x30, 0x53, 0x00, 0x09, 0x0f, 0x00, 0xe0, 0x15, 0x60,
+ 0x0f, 0x0e, 0x03, 0x53,
+ 0x03, 0xed, 0xdd, 0x01, 0x10, 0x0b, 0x30, 0x04, 0x11, 0x6d, 0x0b, 0xde,
+ 0xe1, 0x35, 0x20, 0xdc,
+ 0xd0, 0x00, 0xdf, 0x20, 0x60, 0x40, 0x34, 0xbf, 0xa9, 0x00, 0x21, 0x21,
+ 0xe0, 0xe2, 0x03, 0x11,
+ 0x1e, 0xcc, 0xf0, 0x12, 0x00, 0xe1, 0x27, 0x41, 0x00, 0xfd, 0xbe, 0x10,
+ 0x32, 0x01, 0xcd, 0x1c,
+ 0x50, 0x11, 0x05, 0x00, 0x0f, 0x00, 0xf3, 0x11, 0x54, 0xfe, 0xdb, 0xe0,
+ 0xdf, 0xbd, 0xfc, 0x16,
+ 0x32, 0xe1, 0xcf, 0x1d, 0x50, 0x24, 0x00, 0xf0, 0xe1, 0xf2, 0x21, 0x5f,
+ 0xfd, 0xbf, 0x0f, 0x07,
+ 0x15, 0x0e, 0xdf, 0x30, 0x51, 0x00, 0xd2, 0x30, 0x6c, 0x20, 0x46, 0x04,
+ 0x10, 0xec, 0xdf, 0x0e,
+ 0xe0, 0x02, 0x12, 0x51, 0x0e, 0xc0, 0xd0, 0xee, 0x0d, 0x3d, 0x67, 0x16,
+ 0xde, 0xac, 0x0f, 0xf0,
+ 0x10, 0x31, 0x01, 0x21, 0x30, 0xfe, 0xed, 0x0e, 0x1e, 0x26, 0x11, 0xff,
+ 0x9f, 0xdf, 0xde, 0x12,
+ 0x27, 0x22, 0xe0, 0xbd, 0x02, 0x12, 0x0e, 0x0d, 0xdd, 0x2e, 0x6e, 0x00,
+ 0x12, 0xfe, 0xb8, 0xf9,
+ 0x22, 0x00, 0xdf, 0xef, 0x00, 0x64, 0x51, 0x11, 0xef, 0xcc, 0x00, 0x11,
+ 0x47, 0x01, 0xdd, 0x9e,
+ 0x00, 0x15, 0x20, 0xff, 0xfe, 0x10, 0x24, 0x10, 0xff, 0xf0, 0xd0, 0xf0,
+ 0x20, 0xdc, 0xdf, 0xe3,
+ 0x27, 0x30, 0x90, 0xdc, 0x10, 0x71, 0x00, 0xdc, 0x11, 0x73, 0x00, 0x00,
+ 0x00, 0xf0, 0xfe, 0x02,
+ 0x24, 0x00, 0xeb, 0xd0, 0x0f, 0x23, 0x53, 0x0d, 0x0e, 0x3f, 0x0e, 0xe0,
+ 0x17, 0x20, 0xbd, 0xec,
+ 0x21, 0xf2, 0x01, 0x73, 0xeb, 0xbc, 0x22, 0x25, 0x00, 0xec, 0xf0, 0x33,
+ 0x21, 0x00, 0x1f, 0x1e,
+ 0x00, 0xc0, 0x0e, 0x70, 0x01, 0xc0, 0xeb, 0x00, 0x35, 0xef, 0xaf, 0x00,
+ 0x21, 0x01, 0xdf, 0xef,
+ 0xdf, 0x0e, 0x37, 0x74, 0x51, 0xff, 0xee, 0x0f, 0x10, 0x0e, 0xe0, 0x25,
+ 0x23, 0xef, 0xcf, 0x00,
+ 0x0a, 0x1f, 0x10, 0xe0, 0xf1, 0x27, 0x00, 0xce, 0x1f, 0x72, 0x12, 0xe0,
+ 0x00, 0xe0, 0xdd, 0xcd,
+ 0x0c, 0xf3, 0xd3, 0xd1, 0x00, 0x60, 0x37, 0x30, 0x0e, 0x1e, 0x60, 0x36,
+ 0x00, 0xf0, 0xdc, 0x31,
+ 0x35, 0xc0, 0xd1, 0x0e, 0x1f, 0x70, 0x62, 0xf2, 0xff, 0x0c, 0x0d, 0x0d,
+ 0x10, 0x34, 0x24, 0xde,
+ 0xcd, 0x0f, 0xfb, 0x22, 0x67, 0x01, 0xde, 0xec, 0x20, 0x31, 0xef, 0x00,
+ 0x01, 0xe0, 0xfb, 0x31,
+ 0x73, 0x21, 0xf0, 0xe3, 0x02, 0xef, 0xfd, 0x10, 0x1e, 0x0e, 0xad, 0xde,
+ 0x14, 0x34, 0xce, 0x0f,
+ 0x77, 0x52, 0xff, 0xfe, 0x10, 0x12, 0x00, 0x05, 0xf2, 0xbc, 0xeb, 0xf0,
+ 0xf0, 0xe2, 0x04, 0x00,
+ 0xd1, 0xdf, 0xfe, 0x1f, 0x3f, 0x03, 0xb7, 0x00, 0x0b, 0x1e, 0x3f, 0x73,
+ 0x54, 0xf0, 0xf0, 0x0f,
+ 0xed, 0x10, 0x03, 0xc1, 0x10, 0x40, 0x0e, 0xf0, 0xf6, 0xf0, 0xcb, 0x10,
+ 0x21, 0xf0, 0xe0, 0x70,
+ 0x60, 0xfe, 0x00, 0x36, 0x2c, 0xec, 0x00, 0x04, 0x11, 0xce, 0xdf, 0x1f,
+ 0x30, 0xe0, 0xc2, 0x25,
+ 0x00, 0xab, 0xde, 0x01, 0x40, 0x10, 0x10, 0x0d, 0x11, 0x21, 0x21, 0x33,
+ 0x11, 0x0e, 0x20, 0x32,
+ 0x9d, 0xb9, 0xe0, 0x07, 0x00, 0x00, 0x32, 0xff, 0x0f, 0x00, 0xd5, 0xd0,
+ 0x0d, 0x73, 0x02, 0x1c,
+ 0x2d, 0x0d, 0xf2, 0xe6, 0x01, 0x61, 0x00, 0xd0, 0x04, 0xdf, 0xad, 0x00,
+ 0xf1, 0xee, 0x1d, 0x45,
+ 0xe3, 0xbe, 0xda, 0xf0, 0x0e, 0x50, 0x01, 0xf3, 0x04, 0x2e, 0x3c, 0x30,
+ 0x00, 0xb1, 0xd1, 0x01,
+ 0x2e, 0xfa, 0xbf, 0x02, 0x03, 0x2f, 0xf9, 0x31, 0x60, 0x0c, 0x00, 0x54,
+ 0x11, 0xcf, 0xde, 0x14,
+ 0x42, 0x0f, 0x0e, 0x0e, 0x10, 0x31, 0x76, 0x20, 0xe2, 0xb0, 0x0f, 0xfa,
+ 0xee, 0xfe, 0x35, 0x52,
+ 0xfe, 0xff, 0x01, 0x21, 0x3e, 0x0f, 0x00, 0xe3, 0xfe, 0x0e, 0xd8, 0xff,
+ 0x30, 0x72, 0xc2, 0xb0,
+ 0xd0, 0x0f, 0x3f, 0x22, 0x24, 0xd0, 0xcd, 0xf0, 0xee, 0x03, 0x26, 0x13,
+ 0xcf, 0xb8, 0x00, 0x42,
+ 0x10, 0x0e, 0x60, 0x02, 0x11, 0xe0, 0x0d, 0x00, 0x32, 0x02, 0xe0, 0xe3,
+ 0xf1, 0xff, 0xfe, 0x20,
+ 0x50, 0xf2, 0xa0, 0x0e, 0x28, 0x18, 0x10, 0x33, 0x33, 0x20, 0xcb, 0xf0,
+ 0xcf, 0xe2, 0xf4, 0xbf,
+ 0xfe, 0x10, 0x12, 0xdf, 0xdd, 0x65, 0x03, 0xde, 0x0e, 0x00, 0x60, 0x50,
+ 0x00, 0x01, 0x01, 0xf8,
+ 0x0f, 0x52, 0x35, 0xf0, 0xfd, 0xe0, 0xee, 0xff, 0x00, 0x12, 0xc4, 0xe2,
+ 0x00, 0x2c, 0xcd, 0xd0,
+ 0x00, 0xff, 0xee, 0x50, 0x53, 0x0f, 0x1d, 0x50, 0x08, 0xfb, 0x13, 0x46,
+ 0xdf, 0xbc, 0xf0, 0x01,
+ 0x12, 0x32, 0x01, 0x00, 0x0e, 0xd0, 0xdf, 0xf3, 0x12, 0xad, 0xd9, 0x00,
+ 0x12, 0x40, 0x1e, 0x20,
+ 0x00, 0xfd, 0x00, 0x36, 0x71, 0x20, 0x0d, 0xc0, 0x10, 0x20, 0x00, 0x00,
+ 0xaf, 0xfd, 0xd1, 0x10,
+ 0x08, 0x0e, 0x22, 0x25, 0x01, 0x70, 0x3f, 0x0d, 0xd0, 0x03, 0x14, 0xc0,
+ 0xb0, 0x01, 0x13, 0xdf,
+ 0xcd, 0xe2, 0x00, 0x0e, 0x0c, 0x12, 0x53, 0x27, 0x11, 0x0e, 0x0b, 0x10,
+ 0x0e, 0xdf, 0x01, 0x14,
+ 0x70, 0x14, 0x55, 0x0f, 0x1b, 0xe0, 0xd1, 0xf2, 0xde, 0xcf, 0x04, 0x73,
+ 0x4f, 0xfd, 0xde, 0xff,
+ 0x22, 0x23, 0xf1, 0xf0, 0x20, 0x48, 0xfa, 0xd0, 0x01, 0x01, 0x00, 0x80,
+ 0xfe, 0x10, 0x10, 0x00,
+ 0x21, 0x30, 0x21, 0xfd, 0x0b, 0x00, 0x03, 0xe0, 0xeb, 0x8e, 0xef, 0x01,
+ 0x06, 0x0e, 0x0e, 0x71,
+ 0x13, 0x04, 0xdd, 0xdc, 0x01, 0x05, 0x21, 0x41, 0xcd, 0xec, 0x01, 0x01,
+ 0x10, 0x00, 0x43, 0x00,
+ 0x0a, 0xee, 0xc6, 0xba, 0x49, 0xee, 0x84, 0xbb, 0x06, 0x01, 0x2e, 0x8d,
+ 0xad, 0x02, 0x35, 0x10,
+ 0x0c, 0x20, 0x64, 0x01, 0x0f, 0xa8, 0x00, 0x01, 0x24, 0xd0, 0xee, 0x01,
+ 0x01, 0xf0, 0xde, 0x01,
+ 0x02, 0x00, 0x1e, 0x50, 0x0f, 0xc0, 0xe3, 0x02, 0x00, 0x10, 0x77, 0x50,
+ 0x0f, 0x01, 0xe0, 0xdd,
+ 0x0e, 0x0c, 0x33, 0x67, 0x21, 0xfd, 0x0f, 0x32, 0x32, 0xdf, 0xbc, 0x00,
+ 0x17, 0x50, 0xfc, 0xfd,
+ 0x00, 0x20, 0x03, 0xc0, 0xec, 0x0d, 0x00, 0x15, 0x30, 0x1f, 0xfd, 0x40,
+ 0x75, 0x22, 0xff, 0xdc,
+ 0xff, 0x30, 0x74, 0x12, 0xce, 0xeb, 0x00, 0x54, 0x00, 0xe0, 0xf0, 0x0d,
+ 0x0e, 0xf0, 0xe1, 0x00,
+ 0x00, 0x3f, 0x74, 0x46, 0x00, 0xe0, 0xfe, 0x01, 0x03, 0xff, 0xee, 0xc0,
+ 0xd0, 0xdc, 0x00, 0xd0,
+ 0x04, 0x00, 0xec, 0xdf, 0xb0, 0xee, 0x11, 0x74, 0x01, 0xe1, 0x00, 0x35,
+ 0x50, 0x0d, 0xdb, 0x02,
+ 0x14, 0x01, 0x01, 0xd3, 0x00, 0xcd, 0xca, 0xf1, 0x00, 0x10, 0x53, 0x1e,
+ 0x0c, 0x25, 0x14, 0xfe,
+ 0x0e, 0x61, 0x20, 0x00, 0x2e, 0x0d, 0x0f, 0x0c, 0xff, 0xf1, 0x17, 0x24,
+ 0xeb, 0xf0, 0x40, 0xae,
+ 0xee, 0x20, 0x45, 0xe0, 0xbd, 0x30, 0x71, 0x0e, 0xdb, 0x00, 0x55, 0x00,
+ 0xfe, 0x10, 0x21, 0x03,
+ 0xe0, 0xce, 0x00, 0x01, 0xdf, 0xbb, 0x00, 0x24, 0x42, 0x0e, 0xdd, 0x02,
+ 0x31, 0x41, 0x10, 0x0e,
+ 0x00, 0x00, 0x0f, 0xd2, 0xf4, 0x76, 0x44, 0xf2, 0xa0, 0xfb, 0xfe, 0x0f,
+ 0x15, 0x24, 0xe0, 0xcc,
+ 0x0e, 0x10, 0x70, 0x16, 0x01, 0xcf, 0xfd, 0x00, 0x02, 0x20, 0x11, 0xd0,
+ 0xe3, 0x12, 0x4f, 0xfc,
+ 0xd0, 0x0f, 0xed, 0xcd, 0x01, 0x07, 0x72, 0x20, 0xdc, 0xde, 0x11, 0x31,
+ 0x1e, 0x1e, 0x21, 0x15,
+ 0xf0, 0xea, 0x1f, 0x10, 0xe1, 0xe1, 0x00, 0xd2, 0x82, 0xac, 0x00, 0x32,
+ 0x15, 0x3e, 0x0c, 0xe0,
+ 0x0f, 0x1e, 0x50, 0x14, 0xf0, 0xfd, 0x60, 0x44, 0x00, 0x0d, 0x1f, 0x1d,
+ 0x10, 0x22, 0x07, 0xd2,
+ 0xa0, 0xdc, 0xf0, 0x00, 0x03, 0x8c, 0xfd, 0x03, 0x01, 0x00, 0xea, 0xee,
+ 0x01, 0x65, 0x23, 0x22,
+ 0x0f, 0xfd, 0x11, 0x21, 0xdd, 0xf0, 0x17, 0x0f, 0xdb, 0xf1, 0xc2, 0x00,
+ 0x0f, 0x0f, 0xb1, 0x02,
+ 0x70, 0x00, 0xfe, 0x0f, 0x00, 0x02, 0x37, 0x2f, 0x88, 0xf0, 0x11, 0x74,
+ 0x00, 0xee, 0xf0, 0x00,
+ 0x01, 0x01, 0x00, 0xf2, 0xd0, 0xee, 0xfd, 0x13, 0x20, 0x0c, 0x30, 0x77,
+ 0x04, 0x1d, 0x30, 0x20,
+ 0x00, 0x0c, 0x20, 0x02, 0x8e, 0x0d, 0x01, 0x25, 0x11, 0x00, 0xd0, 0x00,
+ 0x34, 0x41, 0xfe, 0xdf,
+ 0x01, 0xbe, 0xc8, 0x0e, 0x01, 0x01, 0x51, 0x0f, 0xfc, 0x10, 0x10, 0x20,
+ 0x42, 0x22, 0xf3, 0xdd,
+ 0xe8, 0x0f, 0xf0, 0xc0, 0xbf, 0x05, 0x12, 0x0e, 0xcc, 0x00, 0x02, 0x21,
+ 0x12, 0xdc, 0x9c, 0x33,
+ 0x63, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x03, 0x26, 0x00, 0xcf, 0xee, 0xdc,
+ 0x00, 0x62, 0x20, 0x10,
+ 0x00, 0x0d, 0xfd, 0xce, 0x00, 0x0f, 0x00, 0x17, 0x27, 0x21, 0x2e, 0x1f,
+ 0xe1, 0x8f, 0xef, 0xd1,
+ 0xf5, 0xf0, 0xee, 0xfe, 0x21, 0xf1, 0xef, 0xe1, 0x56, 0x40, 0x3f, 0x2f,
+ 0x20, 0xbc, 0xfb, 0x51,
+ 0x26, 0xf0, 0xd0, 0x00, 0xed, 0xe0, 0xc0, 0xe0, 0x01, 0x12, 0x62, 0x30,
+ 0x40, 0xf0, 0x0d, 0xfe,
+ 0x03, 0xe1, 0x0d, 0xd9, 0xce, 0xf0, 0x20, 0x75, 0xf0, 0xde, 0x5f, 0x21,
+ 0x0e, 0x0e, 0x32, 0xd1,
+ 0xab, 0x16, 0x45, 0x20, 0x0d, 0xff, 0x01, 0xb0, 0xfe, 0x00, 0x01, 0x5d,
+ 0xfd, 0x01, 0x07, 0x11,
+ 0x1c, 0x0d, 0x22, 0x04, 0xa0, 0xfe, 0xdf, 0xf2, 0xe2, 0x12, 0x25, 0x00,
+ 0xce, 0xfc, 0x01, 0x25,
+ 0xe0, 0x2b, 0x70, 0xf0, 0xe1, 0x51, 0x30, 0x0e, 0xbf, 0x02, 0x11, 0xf0,
+ 0xd1, 0x04, 0x1f, 0x3e,
+ 0x13, 0x07, 0xa1, 0xdb, 0xdf, 0xff, 0x42, 0x45, 0xf0, 0xd0, 0x10, 0x30,
+ 0x0f, 0xd0, 0xa0, 0x0e,
+ 0x10, 0x63, 0x12, 0x00, 0xe4, 0xff, 0x19, 0x00, 0x30, 0x10, 0x21, 0x72,
+ 0xf0, 0xb0, 0x16, 0x20,
+ 0x0b, 0x00, 0x00, 0x12, 0xed, 0x00, 0x30, 0x3e, 0x00, 0x03, 0xf0, 0x3d,
+ 0x70, 0x3c, 0xea, 0x00,
+ 0x03, 0x00, 0xcd, 0x27, 0x73, 0x0e, 0xca, 0x00, 0x02, 0x00, 0x10, 0x0e,
+ 0xdf, 0xde, 0x00, 0x13,
+ 0x71, 0x33, 0x1f, 0xfc, 0xf0, 0x03, 0xf0, 0xec, 0x1d, 0x74, 0x27, 0x13,
+ 0x02, 0x0f, 0xae, 0xe0,
+ 0x00, 0x0f, 0xdf, 0x02, 0x00, 0xde, 0xe7, 0xd0, 0xca, 0xe0, 0x70, 0x10,
+ 0xb0, 0x00, 0x62, 0xe0,
+ 0x00, 0x00, 0x13, 0xf3, 0xe0, 0x42, 0x00, 0xc8, 0xef, 0x01, 0x16, 0x0f,
+ 0x2f, 0x20, 0x20, 0x00,
+ 0xbc, 0x0f, 0x02, 0x11, 0x20, 0x3e, 0xe3, 0x06, 0x50, 0xfd, 0xee, 0x51,
+ 0x46, 0xf0, 0xcb, 0x00,
+ 0xff, 0xff, 0x11, 0x41, 0xe0, 0xeb, 0x0f, 0x50, 0x10, 0x20, 0x01, 0x12,
+ 0xf0, 0xf1, 0xd0, 0xdf,
+ 0x6e, 0x33, 0xf0, 0xd0, 0x25, 0x00, 0xbd, 0x0c, 0x02, 0xf4, 0xee, 0x0d,
+ 0x2f, 0x0d, 0x75, 0x24,
+ 0x0e, 0xcc, 0x01, 0x12, 0xe0, 0x14, 0x77, 0xfe, 0xdf, 0xe0, 0x21, 0x11,
+ 0x02, 0x02, 0x04, 0xaf,
+ 0xec, 0x0f, 0x00, 0x01, 0xe1, 0x00, 0x0e, 0x0b, 0x21, 0xd0, 0x00, 0x77,
+ 0x63, 0xde, 0xfe, 0x00,
+ 0x0e, 0x0c, 0xf0, 0xf4, 0xa1, 0xfe, 0x00, 0x53, 0x0f, 0xfc, 0x00, 0x35,
+ 0x04, 0x0e, 0xdd, 0x00,
+ 0x2f, 0x01, 0x10, 0x2b, 0x1f, 0x30, 0xfc, 0xe0, 0xf4, 0xa0, 0x0e, 0x2f,
+ 0x40, 0x24, 0x25, 0x01,
+ 0x8e, 0xca, 0x01, 0x10, 0x01, 0x0d, 0x1f, 0x30, 0x0f, 0x5f, 0x10, 0x23,
+ 0x3f, 0x60, 0x12, 0xfd,
+ 0xdb, 0x33, 0x24, 0xdc, 0xce, 0x15, 0x01, 0x9c, 0xff, 0x01, 0xd0, 0xf0,
+ 0x02, 0x25, 0xf0, 0xcf,
+ 0xde, 0x00, 0x11, 0x1f, 0x08, 0x60, 0x37, 0x21, 0x00, 0xdd, 0x00, 0x03,
+ 0x00, 0x3e, 0xc0, 0xb0,
+ 0xdf, 0xf0, 0xe2, 0xff, 0x10, 0x73, 0x04, 0x22, 0x31, 0xe8, 0xef, 0x31,
+ 0x70, 0x00, 0xcf, 0x00,
+ 0xff, 0x00, 0xf4, 0x01, 0xcd, 0xf2, 0xe4, 0x0e, 0x50, 0x25, 0xf0, 0xcf,
+ 0x00, 0x67, 0x02, 0x0b,
+ 0xff, 0x00, 0xf0, 0xfe, 0x20, 0x41, 0x21, 0x52, 0x11, 0x01, 0x00, 0xf8,
+ 0xf0, 0xc0, 0x00, 0xf2,
+ 0x02, 0xf0, 0x0f, 0xec, 0x30, 0x2f, 0x0e, 0x50, 0xf3, 0x89, 0x0e, 0x10,
+ 0x41, 0x21, 0x00, 0x0e,
+ 0xff, 0xf0, 0x15, 0x34, 0xbe, 0xeb, 0xe0, 0xc2, 0x01, 0x71, 0x10, 0x0d,
+ 0xff, 0xd1, 0xe2, 0x20,
+ 0x3e, 0x41, 0xf7, 0xd0, 0xd0, 0x0e, 0x1e, 0x21, 0xe0, 0x97, 0x02, 0x02,
+ 0x30, 0x8d, 0x0f, 0x5f,
+ 0xcc, 0x10, 0x11, 0xf8, 0x0d, 0xd1, 0x44, 0x30, 0xee, 0xc0, 0x00, 0x2f,
+ 0x40, 0xf0, 0xe4, 0x00,
+ 0xf0, 0x01, 0xf2, 0x00, 0xee, 0x1f, 0x27, 0xe2, 0xe0, 0xee, 0x10, 0x6e,
+ 0x20, 0x07, 0x37, 0xde,
+ 0x0e, 0x11, 0x51, 0x50, 0x0d, 0xd0, 0x01, 0x52, 0x0e, 0xff, 0xf0, 0x02,
+ 0x1e, 0xfd, 0xb2, 0x02,
+ 0xfe, 0x10, 0x20, 0xfe, 0xee, 0x12, 0x0e, 0xed, 0x35, 0x71, 0x10, 0x0c,
+ 0x0e, 0x63, 0x06, 0x07,
+ 0x04, 0xfe, 0xec, 0xed, 0xff, 0x00, 0x35, 0xb1, 0xde, 0x0e, 0x40, 0x24,
+ 0xf2, 0x01, 0x0d, 0xdc,
+ 0x20, 0x75, 0x20, 0x0b, 0xd0, 0xf4, 0x1f, 0x6d, 0xff, 0xcf, 0xdf, 0x00,
+ 0x07, 0xf1, 0xd0, 0x00,
+ 0xdd, 0xd3, 0x25, 0x41, 0xf0, 0xbd, 0x0e, 0xfe, 0x2f, 0x71, 0x21, 0x00,
+ 0x00, 0x12, 0x01, 0xf0,
+ 0x01, 0xed, 0x12, 0x27, 0x04, 0xb1, 0xde, 0x01, 0x22, 0x9d, 0xf1, 0x05,
+ 0x3d, 0x1d, 0xe4, 0xc1,
+ 0xf0, 0xe0, 0x34, 0x4e, 0x00, 0x13, 0x22, 0xd8, 0x0d, 0x72, 0x44, 0xf0,
+ 0xcf, 0x0e, 0x20, 0x10,
+ 0x42, 0x62, 0xfc, 0xe1, 0x14, 0x1e, 0xfa, 0xde, 0xee, 0x10, 0x67, 0x00,
+ 0xff, 0x40, 0x40, 0x1f,
+ 0x20, 0x01, 0xc0, 0x0d, 0x37, 0x41, 0x00, 0xc0, 0xd0, 0xec, 0x31, 0x50,
+ 0x0f, 0xcd, 0xfd, 0xfb,
+ 0xe2, 0x14, 0x1e, 0x2b, 0x2f, 0x0f, 0x00, 0xe1, 0x04, 0x73, 0x41, 0x00,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0xf0, 0xfc, 0xaf, 0xf1, 0xf7, 0xe5, 0xfe, 0x10, 0x20, 0xd0, 0x9e, 0x00,
+ 0x3f, 0x03, 0xd0, 0xdb,
+ 0x0f, 0xef, 0x9e, 0xcf, 0x00, 0x37, 0x02, 0x0f, 0xf1, 0x12, 0xc0, 0xd0,
+ 0x2e, 0x5f, 0x22, 0xd7,
+ 0xd1, 0x0e, 0x0a, 0x40, 0x71, 0xa0, 0xf0, 0x7c, 0x00, 0xc4, 0x12, 0x30,
+ 0xef, 0xd4, 0x45, 0x10,
+ 0xee, 0xe0, 0x1d, 0x40, 0x01, 0xef, 0x0b, 0x0f, 0x2b, 0x0e, 0x10, 0x13,
+ 0x03, 0x01, 0xe1, 0x2b,
+ 0x0f, 0xf0, 0x00, 0xd3, 0x00, 0x3e, 0xda, 0x20, 0x31, 0x81, 0x00, 0x00,
+ 0x01, 0xef, 0xdb, 0x30,
+ 0x74, 0x00, 0x0e, 0xe0, 0xf0, 0x21, 0x10, 0x0d, 0xce, 0xff, 0x02, 0x26,
+ 0x22, 0x33, 0xc1, 0xd1,
+ 0xf4, 0xf2, 0x70, 0x41, 0xe2, 0xe7, 0x16, 0x30, 0xdd, 0xd0, 0x30, 0x40,
+ 0x04, 0xf0, 0x8f, 0xbb,
+ 0x00, 0x20, 0x04, 0x00, 0x12, 0x13, 0x0d, 0xca, 0x00, 0x41, 0x04, 0xc0,
+ 0xcb, 0xf0, 0x10, 0x42,
+ 0x03, 0xde, 0xfb, 0x20, 0x4f, 0x0f, 0x22, 0x01, 0x00, 0x30, 0x65, 0x0f,
+ 0xdd, 0xff, 0x10, 0x0d,
+ 0xc0, 0x01, 0xff, 0x0a, 0x10, 0x80, 0x01, 0x07, 0x11, 0x0e, 0x0c, 0x10,
+ 0x0f, 0xde, 0x40, 0x62,
+ 0x22, 0x20, 0x0f, 0xff, 0x10, 0x6f, 0x21, 0x27, 0xe4, 0xb0, 0xf0, 0x0f,
+ 0xef, 0x00, 0x11, 0x0c,
+ 0x8c, 0x0f, 0xf0, 0x04, 0x24, 0xfc, 0x0e, 0x11, 0x36, 0xf0, 0xff, 0xfe,
+ 0x10, 0x00, 0xd4, 0xf2,
+ 0x0f, 0xde, 0x03, 0xe0, 0xaf, 0x2f, 0x00, 0xcc, 0x00, 0x54, 0x52, 0x0c,
+ 0xcf, 0x02, 0x1e, 0x00,
+ 0xe3, 0x34, 0x0a, 0xfb, 0xc0, 0x32, 0x74, 0x11, 0xff, 0xcc, 0x00, 0x02,
+ 0xf5, 0xf0, 0xf0, 0xed,
+ 0x41, 0x54, 0x01, 0x00, 0x0f, 0xfe, 0x0f, 0x33, 0x50, 0x0b, 0xe0, 0x23,
+ 0x67, 0x20, 0x00, 0xf0,
+ 0xcc, 0xf0, 0x0f, 0xf1, 0x02, 0x2f, 0xfd, 0xde, 0xf0, 0xe5, 0x01, 0x0f,
+ 0x7f, 0x10, 0xe0, 0x20,
+ 0x40, 0x0c, 0x0b, 0x62, 0x16, 0xff, 0xbb, 0x00, 0x02, 0x0f, 0x0e, 0xb0,
+ 0x31, 0x11, 0x80, 0x09,
+ 0x10, 0x31, 0x03, 0xb0, 0x0e, 0x4e, 0xee, 0xf2, 0x05, 0x20, 0x0f, 0xcf,
+ 0x11, 0x12, 0x0f, 0xf0,
+ 0xf3, 0x01, 0x07, 0x01, 0x0d, 0xea, 0x00, 0x35, 0x60, 0xfd, 0xfe, 0xf1,
+ 0x11, 0x40, 0xed, 0xe0,
+ 0x20, 0x01, 0x11, 0x43, 0x1e, 0xfa, 0x80, 0xf1, 0x12, 0x30, 0xcb, 0xd1,
+ 0x03, 0x14, 0x1d, 0xff,
+ 0xf0, 0x10, 0x30, 0x13, 0x22, 0x1f, 0x0c, 0x01, 0x30, 0x7e, 0x30, 0xf1,
+ 0xfd, 0x2c, 0xbb, 0xdb,
+ 0x10, 0x06, 0xb3, 0x00, 0xdd, 0x0d, 0x21, 0x40, 0x0f, 0xd0, 0x01, 0x3e,
+ 0x50, 0x15, 0x0f, 0xeb,
+ 0xf1, 0x13, 0x00, 0x01, 0x34, 0xde, 0x8c, 0x21, 0x47, 0x01, 0x00, 0xac,
+ 0x00, 0x10, 0x00, 0x02,
+ 0xf0, 0xe9, 0xe0, 0x4f, 0x12, 0x03, 0xfe, 0x2c, 0x00, 0x50, 0x32, 0x00,
+ 0x00, 0x06, 0xe2, 0xff,
+ 0x8d, 0xee, 0xf0, 0xf0, 0x06, 0x00, 0xec, 0x00, 0x12, 0x01, 0xf0, 0xa0,
+ 0x31, 0x62, 0xff, 0xca,
+ 0x0f, 0x30, 0x41, 0x03, 0xff, 0xec, 0x00, 0x32, 0xd1, 0xe3, 0x0c, 0x0d,
+ 0xf5, 0x16, 0xf0, 0xfc,
+ 0x51, 0x11, 0xd1, 0xe0, 0xfe, 0xde, 0xd0, 0x73, 0x20, 0x0f, 0xdf, 0x35,
+ 0x74, 0x12, 0xcc, 0xec,
+ 0x20, 0x32, 0xf1, 0x00, 0xdd, 0xdf, 0x74, 0x22, 0x0e, 0x0f, 0x02, 0x03,
+ 0xcc, 0xfb, 0x32, 0x45,
+ 0x70, 0x4c, 0xc0, 0xf3, 0x23, 0x2f, 0x0a, 0xd0, 0x00, 0x10, 0xf1, 0xf1,
+ 0x40, 0x20, 0xf1, 0xd3,
+ 0xec, 0x0c, 0x00, 0x00, 0xdd, 0xae, 0x00, 0x15, 0x70, 0x3f, 0x10, 0xbb,
+ 0xff, 0x10, 0x00, 0xe3,
+ 0x23, 0x31, 0xf3, 0x10, 0x1a, 0xc1, 0x13, 0x30, 0x0d, 0x00, 0xc0, 0x27,
+ 0x02, 0xff, 0x70, 0x41,
+ 0xe0, 0xef, 0x13, 0x00, 0x98, 0x0f, 0x00, 0xe4, 0xf0, 0x02, 0xc0, 0x0a,
+ 0x12, 0x31, 0xd0, 0x0e,
+ 0x10, 0x0d, 0xff, 0xc0, 0x45, 0x10, 0x0e, 0x30, 0x20, 0x01, 0xe0, 0x8e,
+ 0xff, 0x07, 0x42, 0xf2,
+ 0xc0, 0xec, 0x0f, 0x12, 0x14, 0xf1, 0x10, 0x0e, 0xfd, 0x0d, 0x70, 0x73,
+ 0x11, 0xf8, 0xeb, 0x10,
+ 0x30, 0x2f, 0x1f, 0xff, 0xf2, 0x15, 0x01, 0x10, 0x0e, 0x9e, 0xef, 0xf0,
+ 0x01, 0x2d, 0xeb, 0xd1,
+ 0x24, 0x30, 0x0b, 0x20, 0x01, 0xf1, 0x30, 0x7f, 0x54, 0x02, 0x0f, 0xbb,
+ 0xff, 0xe0, 0x1f, 0x21,
+ 0xf2, 0xc0, 0x0b, 0xf0, 0x14, 0x64, 0x00, 0x00, 0xf1, 0xe3, 0x00, 0x10,
+ 0x0e, 0xeb, 0xf0, 0x54,
+ 0x20, 0x0c, 0xd1, 0x03, 0xd0, 0x8a, 0xf0, 0x01, 0x21, 0x01, 0x04, 0x32,
+ 0x00, 0xac, 0xe0, 0x13,
+ 0x42, 0x0e, 0xdd, 0x8f, 0x00, 0x0f, 0x3f, 0x0e, 0xe4, 0x07, 0x12, 0x30,
+ 0x30, 0x30, 0xfa, 0xff,
+ 0x4f, 0x55, 0x02, 0xbe, 0xfb, 0xdf, 0x0f, 0xe0, 0x01, 0x03, 0xe0, 0xde,
+ 0xdb, 0x00, 0x42, 0x11,
+ 0x51, 0x2e, 0x4f, 0x3e, 0x0b, 0x10, 0x02, 0x31, 0x1b, 0x5f, 0x42, 0x01,
+ 0x0f, 0xff, 0xd2, 0xf5,
+ 0xf2, 0xef, 0x8a, 0xcf, 0x10, 0x31, 0x21, 0xee, 0xce, 0x0e, 0xf0, 0x05,
+ 0x24, 0x31, 0xdc, 0xbf,
+ 0x13, 0xf3, 0xef, 0x0f, 0x7d, 0xed, 0xe0, 0xf1, 0x17, 0x02, 0x00, 0x10,
+ 0x12, 0x24, 0xfe, 0x0d,
+ 0x1f, 0x7f, 0xe0, 0xa5, 0x60, 0x0b, 0xb0, 0x25, 0x00, 0x1f, 0x0d, 0xbf,
+ 0x10, 0x32, 0xf3, 0xb5,
+ 0x02, 0x30, 0x0b, 0xd0, 0x01, 0x34, 0xff, 0x0b, 0x00, 0x02, 0x01, 0x0f,
+ 0x00, 0x00, 0x7f, 0x01,
+ 0xf4, 0x00, 0x01, 0x1e, 0xfe, 0x06, 0x50, 0x0e, 0xee, 0xd0, 0x10, 0x50,
+ 0x0f, 0xdc, 0x0a, 0xfc,
+ 0x00, 0x40, 0x16, 0x01, 0xe0, 0x0f, 0x00, 0x13, 0x7f, 0x0e, 0xef, 0x20,
+ 0x00, 0xaf, 0x0d, 0x01,
+ 0x10, 0x09, 0xe0, 0x12, 0x40, 0xea, 0xae, 0x1f, 0x31, 0x03, 0x01, 0x00,
+ 0x01, 0x06, 0xf0, 0x00,
+ 0xfd, 0x00, 0x01, 0xc2, 0xf2, 0xe3, 0xfc, 0x9b, 0xf0, 0xf5, 0x21, 0x20,
+ 0x00, 0xfe, 0x41, 0x43,
+ 0xf0, 0x0d, 0xfd, 0xcf, 0x7b, 0x1f, 0x00, 0xd0, 0x01, 0x27, 0xf3, 0xcc,
+ 0x0f, 0x00, 0xe1, 0xe0,
+ 0xeb, 0xbf, 0xf0, 0x01, 0x00, 0x10, 0x32, 0x73, 0x25, 0x10, 0xed, 0x0e,
+ 0x77, 0x25, 0xe0, 0x0d,
+ 0x20, 0x0f, 0xf0, 0x02, 0xef, 0xdd, 0xee, 0xfd, 0x00, 0xcf, 0x05, 0x45,
+ 0x71, 0x32, 0xe0, 0xeb,
+ 0xe0, 0xfe, 0x20, 0x11, 0x1f, 0x00, 0x00, 0x40, 0x52, 0x01, 0xe1, 0xe1,
+ 0x0d, 0xc8, 0x01, 0x26,
+ 0x00, 0xcf, 0xdd, 0x0f, 0x20, 0x60, 0x13, 0x03, 0xfe, 0xda, 0x1f, 0x60,
+ 0x01, 0x03, 0xf0, 0x0e,
+ 0x30, 0x30, 0x00, 0xcc, 0xe1, 0xe7, 0x60, 0xef, 0x82, 0x00, 0xf0, 0x0c,
+ 0x10, 0x25, 0x00, 0xff,
+ 0xdf, 0xef, 0x50, 0x23, 0xa0, 0x0d, 0x0c, 0x31, 0x03, 0x00, 0xdc, 0x24,
+ 0x25, 0x0e, 0x00, 0x10,
+ 0xde, 0xd0, 0x03, 0x13, 0xe0, 0x8c, 0xcf, 0x12, 0x24, 0x14, 0x00, 0x52,
+ 0xf2, 0xbc, 0x30, 0x20,
+ 0x02, 0xde, 0x01, 0x37, 0x02, 0xad, 0xff, 0x03, 0x10, 0x09, 0xee, 0x0f,
+ 0x10, 0x04, 0x00, 0x0d,
+ 0x0c, 0x72, 0x34, 0x0e, 0xdc, 0x53, 0x42, 0x0f, 0x0e, 0x12, 0x00, 0x02,
+ 0x17, 0x23, 0x0d, 0xda,
+ 0xf0, 0x24, 0x01, 0x9f, 0xdd, 0x0d, 0x10, 0x64, 0x11, 0x00, 0x1b, 0x10,
+ 0x1f, 0xef, 0x00, 0x42,
+ 0x00, 0xfc, 0xfd, 0xaf, 0xd0, 0xe5, 0x01, 0x43, 0x43, 0x10, 0x01, 0x01,
+ 0x14, 0x00, 0x11, 0x00,
+ 0x61, 0xf7, 0xaa, 0xff, 0xf3, 0xf3, 0xc3, 0xff, 0xf9, 0x8e, 0xf0, 0x36,
+ 0x73, 0x1c, 0xc8, 0xee,
+ 0x00, 0x35, 0x20, 0xdf, 0xa0, 0x00, 0xe2, 0xf0, 0x00, 0xd0, 0x12, 0x04,
+ 0xef, 0x8f, 0xd0, 0x10,
+ 0x2c, 0xdb, 0xd0, 0x63, 0x02, 0x1f, 0x1b, 0x00, 0x21, 0xd0, 0x12, 0x37,
+ 0xf2, 0x00, 0xdc, 0xe0,
+ 0xb0, 0x01, 0x90, 0xb1, 0x33, 0x21, 0xeb, 0xde, 0x1f, 0x30, 0x02, 0x20,
+ 0x1c, 0x0f, 0x53, 0x47,
+ 0x20, 0xfd, 0xef, 0x20, 0x2f, 0x0e, 0xf0, 0xcf, 0x00, 0x20, 0x10, 0xbf,
+ 0x14, 0x65, 0x0f, 0xfa,
+ 0xf0, 0xdf, 0x0f, 0x00, 0x00, 0xef, 0x52, 0x27, 0x21, 0x0e, 0x5e, 0x10,
+ 0x01, 0xb0, 0x0f, 0x0c,
+ 0xe0, 0x02, 0x03, 0x01, 0xdd, 0xec, 0x53, 0x27, 0xe0, 0xf2, 0x21, 0x00,
+ 0x20, 0x31, 0x23, 0x12,
+ 0x9e, 0xdf, 0xce, 0x0e, 0x1e, 0x1e, 0x00, 0x30, 0xb5, 0xf6, 0x53, 0x81,
+ 0x1d, 0x41, 0xa3, 0x17,
+ 0x03, 0x0d, 0x0d, 0xdf, 0x1e, 0x40, 0x07, 0xe5, 0xfd, 0x2c, 0x30, 0x04,
+ 0xa0, 0x1f, 0x30, 0xf0,
+ 0xe0, 0x0f, 0x0e, 0x20, 0x15, 0x01, 0xde, 0xef, 0x00, 0xdd, 0xb9, 0x00,
+ 0x02, 0xe2, 0x70, 0x09,
+ 0xef, 0x00, 0x3f, 0x31, 0x02, 0x01, 0x2f, 0xfe, 0xfe, 0x01, 0x63, 0x20,
+ 0x00, 0xee, 0xfe, 0x11,
+ 0x03, 0x00, 0x33, 0x2f, 0xe8, 0xf8, 0x00, 0x60, 0x44, 0xd0, 0xd0, 0xe0,
+ 0xcf, 0x20, 0x24, 0xe0,
+ 0xfd, 0x9f, 0xc1, 0x12, 0x41, 0xe0, 0x06, 0x21, 0xdd, 0xca, 0x00, 0x22,
+ 0x21, 0xe0, 0xe0, 0x0e,
+ 0x70, 0x25, 0x00, 0xe0, 0xff, 0xd0, 0x02, 0x03, 0xef, 0xcd, 0xdf, 0xed,
+ 0x14, 0x12, 0xdd, 0xbe,
+ 0x20, 0x20, 0x0e, 0x0d, 0xe5, 0x05, 0x70, 0x75, 0x43, 0xfe, 0xfe, 0x21,
+ 0x01, 0xf1, 0xe2, 0x17,
+ 0x40, 0x0d, 0xec, 0xf0, 0xf0, 0x22, 0x40, 0x01, 0x26, 0x10, 0x10, 0x20,
+ 0xcf, 0xfa, 0x60, 0x21,
+ 0x21, 0xf0, 0xaa, 0x00, 0xf1, 0xf0, 0x00, 0x02, 0x0e, 0x40, 0x54, 0x0d,
+ 0xea, 0xd0, 0x30, 0x50,
+ 0xef, 0xf0, 0x04, 0xde, 0xbb, 0x00, 0x12, 0x72, 0x0f, 0xfc, 0x21, 0x0f,
+ 0x0d, 0xf0, 0xe3, 0x07,
+ 0x20, 0xd0, 0xae, 0xe1, 0xf0, 0x00, 0xe0, 0xc2, 0xf2, 0xf2, 0x0f, 0x0c,
+ 0x00, 0x14, 0x63, 0x1d,
+ 0x0b, 0x01, 0x23, 0x13, 0x30, 0x3e, 0x5f, 0x13, 0x00, 0x88, 0xdb, 0x00,
+ 0x12, 0xe0, 0xcc, 0x0f,
+ 0x00, 0xf2, 0xc4, 0x0f, 0x7e, 0x10, 0xd2, 0x1f, 0x3a, 0xe0, 0x02, 0x07,
+ 0x50, 0xf0, 0xe0, 0x4e,
+ 0x10, 0x00, 0x13, 0x20, 0x0c, 0x00, 0xb0, 0x0f, 0xdd, 0x0b, 0x1f, 0xec,
+ 0xa1, 0x15, 0x51, 0x0f,
+ 0xee, 0x00, 0x33, 0x10, 0x3d, 0xd0, 0xf2, 0x6f, 0x0c, 0x00, 0xec, 0xb0,
+ 0x03, 0x34, 0xfe, 0xde,
+ 0x22, 0x16, 0x01, 0x01, 0x23, 0x43, 0xe0, 0xa8, 0x00, 0x30, 0x02, 0x10,
+ 0xeb, 0xcf, 0x0f, 0x32,
+ 0x14, 0x5d, 0x10, 0x04, 0x00, 0xd0, 0xcf, 0x23, 0x02, 0x8e, 0x01, 0x33,
+ 0xff, 0xda, 0xfe, 0xcf,
+ 0x03, 0xf6, 0x0f, 0x5d, 0xfb, 0xe0, 0x00, 0x22, 0xf3, 0x10, 0x31, 0x42,
+ 0x0f, 0xdc, 0xff, 0xbe,
+ 0xdc, 0x01, 0x37, 0x61, 0xef, 0xee, 0x4f, 0xf0, 0xc3, 0x01, 0x33, 0x23,
+ 0x24, 0xf1, 0x0e, 0x0d,
+ 0xf0, 0x75, 0x47, 0x00, 0xbc, 0xff, 0x00, 0x0f, 0xd0, 0x00, 0x14, 0x30,
+ 0xeb, 0xaf, 0x0f, 0x51,
+ 0x11, 0x00, 0x00, 0x01, 0x20, 0x20, 0x23, 0x00, 0x0e, 0xef, 0x0f, 0xff,
+ 0xff, 0x92, 0x07, 0x17,
+ 0x00, 0xef, 0xfe, 0x30, 0x71, 0x13, 0x00, 0x00, 0xfa, 0x0e, 0x10, 0x02,
+ 0x02, 0x10, 0x0e, 0xbb,
+ 0xef, 0x00, 0x01, 0x02, 0x3e, 0x01, 0xe6, 0xdf, 0x6f, 0x42, 0x07, 0x00,
+ 0xef, 0x10, 0x40, 0x1e,
+ 0x0d, 0x3f, 0xe1, 0x83, 0x4e, 0x0a, 0xa0, 0x13, 0x21, 0x12, 0xc0, 0xee,
+ 0x11, 0x03, 0xc6, 0x03,
+ 0x10, 0x1a, 0xee, 0xe2, 0x74, 0x10, 0x0f, 0xfe, 0xfe, 0x01, 0x32, 0xff,
+ 0xee, 0x4f, 0x0f, 0xc0,
+ 0x22, 0x10, 0xc5, 0xf3, 0x1d, 0x0c, 0x93, 0x07, 0x17, 0xfd, 0xbf, 0x00,
+ 0x22, 0x30, 0xdd, 0x0e,
+ 0x30, 0x2e, 0x30, 0x00, 0xce, 0x31, 0x77, 0x04, 0x0d, 0x0e, 0xf1, 0x02,
+ 0x3e, 0xee, 0xc0, 0x21,
+ 0x1f, 0xda, 0xf0, 0x64, 0x22, 0xfe, 0xec, 0xde, 0xf0, 0x20, 0x10, 0xfd,
+ 0x0f, 0x30, 0x50, 0x05,
+ 0x21, 0x41, 0x02, 0x8f, 0x0f, 0x10, 0xfc, 0xfe, 0x02, 0x04, 0xf3, 0xed,
+ 0xc8, 0xff, 0x21, 0x76,
+ 0xe0, 0xcd, 0x12, 0x47, 0x00, 0x00, 0x1f, 0x00, 0xdf, 0x00, 0x01, 0xf2,
+ 0xd0, 0xdf, 0x0f, 0xd0,
+ 0xb1, 0x10, 0x00, 0x26, 0x02, 0xdf, 0x0a, 0x30, 0x34, 0xd0, 0x9f, 0x0c,
+ 0x30, 0x73, 0x74, 0xf0,
+ 0xff, 0x0e, 0x00, 0x0f, 0xfe, 0x03, 0x45, 0x0d, 0xde, 0xf4, 0x03, 0x0d,
+ 0x0d, 0x12, 0xd2, 0xc0,
+ 0x2d, 0x18, 0xed, 0x00, 0x55, 0xf0, 0x11, 0x3b, 0xdf, 0x00, 0x0f, 0x00,
+ 0x00, 0x80, 0xdf, 0x30,
+ 0x41, 0x42, 0x0f, 0xec, 0xfb, 0xf0, 0x70, 0x24, 0x2f, 0x0b, 0xe0, 0x11,
+ 0x22, 0x20, 0xf0, 0xe1,
+ 0xd2, 0xa0, 0x0f, 0xfd, 0xe4, 0x07, 0x21, 0xe0, 0x00, 0xf1, 0xa0, 0xd8,
+ 0xb0, 0xef, 0x70, 0x03,
+ 0xf0, 0xfe, 0x2f, 0x22, 0xd2, 0x01, 0x1e, 0xdd, 0x04, 0xd7, 0x03, 0x60,
+ 0xcb, 0xe0, 0x00, 0x00,
+ 0xf0, 0xd0, 0x20, 0x70, 0x1d, 0xcf, 0x01, 0x23, 0x01, 0x22, 0x22, 0xfc,
+ 0xea, 0x0e, 0x03, 0x17,
+ 0x11, 0x00, 0x70, 0x00, 0xc0, 0x10, 0x31, 0x0e, 0xdb, 0xc0, 0x40, 0x00,
+ 0xf0, 0x60, 0x02, 0xed,
+ 0xfd, 0x07, 0x64, 0x10, 0x0c, 0xe0, 0x00, 0x20, 0x0f, 0x0c, 0xb0, 0x01,
+ 0x21, 0x0f, 0x0e, 0xf1,
+ 0xd1, 0x11, 0x72, 0x05, 0xf0, 0x1e, 0x3d, 0xca, 0x0f, 0xe1, 0x31, 0x10,
+ 0xff, 0x0e, 0x2f, 0x02,
+ 0x30, 0x30, 0xd4, 0x8b, 0xde, 0x01, 0x04, 0xf0, 0x11, 0x25, 0xa1, 0xe0,
+ 0x0e, 0xfe, 0x9b, 0x10,
+ 0x26, 0x15, 0xfe, 0xdc, 0x10, 0x42, 0xf1, 0x1f, 0xef, 0x82, 0x23, 0x2f,
+ 0xfd, 0xe1, 0x47, 0x00,
+ 0xec, 0xf0, 0x41, 0x01, 0xcd, 0x0a, 0x00, 0x02, 0x00, 0x00, 0xe2, 0xf3,
+ 0x50, 0x1f, 0xec, 0x00,
+ 0x02, 0x24, 0x41, 0x00, 0xdf, 0x0f, 0x5f, 0x01, 0x1f, 0x0a, 0x0f, 0x00,
+ 0x04, 0x0f, 0x1c, 0x00,
+ 0x1e, 0x50, 0x11, 0x20, 0xd0, 0xc3, 0xb0, 0x0f, 0x33, 0x50, 0x0e, 0x13,
+ 0x10, 0xf8, 0xee, 0x02,
+ 0x12, 0x2c, 0x5f, 0x00, 0xcd, 0x0f, 0x06, 0x06, 0x00, 0xef, 0x80, 0x15,
+ 0x41, 0xec, 0xce, 0xff,
+ 0xf1, 0x22, 0x40, 0xf0, 0xdc, 0x20, 0x31, 0x01, 0xcf, 0x23, 0x23, 0x0e,
+ 0xce, 0xf7, 0x04, 0x0e,
+ 0xaa, 0xe1, 0x13, 0x31, 0xef, 0xf0, 0x15, 0x0e, 0xfd, 0xef, 0xd0, 0x20,
+ 0x71, 0x00, 0xdb, 0xd0,
+ 0x03, 0x20, 0xd0, 0xd4, 0x22, 0x51, 0x22, 0x8b, 0xca, 0x00, 0x51, 0x14,
+ 0x0e, 0xdd, 0x30, 0x53,
+ 0x0f, 0xd0, 0x21, 0x57, 0x22, 0xf0, 0x9d, 0x01, 0x02, 0x10, 0x00, 0xf1,
+ 0xb2, 0x0b, 0x1b, 0x00,
+ 0x0f, 0x20, 0x21, 0x00, 0xfd, 0x01, 0x30, 0x51, 0x12, 0xff, 0xdc, 0xee,
+ 0x02, 0x17, 0x54, 0xfe,
+ 0xdf, 0x03, 0x22, 0x0f, 0x0c, 0x33, 0x73, 0x0f, 0x0f, 0xed, 0xdd, 0x10,
+ 0x31, 0x52, 0x13, 0xdd,
+ 0xe8, 0x30, 0x60, 0x03, 0x07, 0xef, 0xec, 0xe0, 0xf3, 0xe0, 0xc0, 0x0e,
+ 0xef, 0xfc, 0x0e, 0x71,
+ 0x46, 0x10, 0x10, 0x1d, 0x00, 0x26, 0x00, 0xef, 0xcc, 0xe0, 0x00, 0xfe,
+ 0xf0, 0x03, 0x01, 0xcf,
+ 0xc2, 0x13, 0x0f, 0x89, 0xbf, 0xfd, 0x01, 0x17, 0x51, 0x00, 0xfc, 0xf1,
+ 0x22, 0x30, 0x00, 0x0c,
+ 0xff, 0x10, 0x40, 0x00, 0xb2, 0x02, 0x00, 0x0d, 0xee, 0x9f, 0x0e, 0xef,
+ 0x03, 0x27, 0x15, 0xf1,
+ 0xe1, 0xfe, 0x0e, 0x2f, 0x00, 0x03, 0x00, 0x0f, 0x70, 0x0d, 0x0f, 0x02,
+ 0x33, 0x76, 0x32, 0xcb,
+ 0xea, 0xf0, 0x11, 0x10, 0x02, 0xf5, 0x20, 0x5c, 0xfe, 0xfe, 0x10, 0x21,
+ 0x02, 0xe0, 0xef, 0x00,
+ 0x4b, 0xdf, 0x10, 0x70, 0x01, 0xe0, 0xe6, 0x13, 0x50, 0xeb, 0xc0, 0xf0,
+ 0x43, 0x40, 0x00, 0xbc,
+ 0x0f, 0x10, 0x30, 0x00, 0xf0, 0xe2, 0x02, 0x27, 0x43, 0xe0, 0xde, 0xec,
+ 0xf0, 0x14, 0x13, 0x9d,
+ 0xec, 0x05, 0x52, 0x0d, 0xcc, 0xf1, 0x03, 0x3f, 0x0d, 0x04, 0x14, 0x01,
+ 0xde, 0x0d, 0x60, 0x03,
+ 0x02, 0x0e, 0xfc, 0x13, 0x54, 0x00, 0x02, 0x03, 0x03, 0x2e, 0xcb, 0x90,
+ 0x0f, 0x00, 0xf0, 0xe8,
+ 0xef, 0x23, 0x55, 0x10, 0x1f, 0xfd, 0xcd, 0x00, 0x02, 0x2f, 0x2e, 0xff,
+ 0x9c, 0x00, 0x16, 0x32,
+ 0x0f, 0xba, 0x00, 0xf0, 0x01, 0x00, 0x1a, 0x2f, 0x50, 0x34, 0x00, 0xdb,
+ 0x00, 0x30, 0x71, 0x01,
+ 0x00, 0x0f, 0x30, 0x00, 0xe1, 0xa0, 0x02, 0x04, 0x00, 0xdd, 0xc0, 0x02,
+ 0xf3, 0x0f, 0x0f, 0x73,
+ 0x37, 0x00, 0xdc, 0x0c, 0x10, 0x2e, 0xff, 0xc0, 0x01, 0xe5, 0x02, 0xd2,
+ 0x0e, 0x30, 0xb0, 0xd0,
+ 0x02, 0x05, 0x14, 0xe0, 0xb9, 0x0f, 0xb0, 0x0f, 0x00, 0x51, 0x12, 0x0e,
+ 0x00, 0x46, 0x31, 0x00,
+ 0x01, 0xf1, 0xe0, 0xf0, 0xf0, 0xdb, 0x21, 0x75, 0x10, 0x10, 0x00, 0x03,
+ 0x0f, 0xec, 0xc0, 0x1f,
+ 0x1d, 0x2e, 0xed, 0x8f, 0x06, 0x75, 0x10, 0x2f, 0x00, 0x24, 0x01, 0xfd,
+ 0x00, 0x00, 0x0f, 0xbc,
+ 0xcd, 0x00, 0x20, 0x0f, 0x0e, 0xf0, 0xe4, 0x01, 0x0e, 0x30, 0x47, 0x00,
+ 0x00, 0x0e, 0x60, 0x0f,
+ 0xfd, 0x0e, 0x4f, 0x30, 0x30, 0xbf, 0xdd, 0x03, 0x27, 0x77, 0x00, 0xbd,
+ 0x0e, 0x00, 0xf3, 0xff,
+ 0xdc, 0x01, 0xf6, 0x01, 0xd0, 0xec, 0x21, 0x72, 0x21, 0x0f, 0x0d, 0xb0,
+ 0xf1, 0xe1, 0xfb, 0xee,
+ 0x12, 0x51, 0x00, 0x0f, 0x04, 0x01, 0xfd, 0xee, 0x03, 0x40, 0x1e, 0xd8,
+ 0xa9, 0x02, 0x41, 0x10,
+ 0x12, 0x02, 0xe0, 0xde, 0x11, 0x05, 0xf0, 0x9e, 0xee, 0x00, 0x30, 0x24,
+ 0x2e, 0x2d, 0x60, 0x22,
+ 0xe0, 0x00, 0x21, 0x53, 0x1d, 0xe8, 0xc9, 0xde, 0xff, 0x20, 0x32, 0xd0,
+ 0xa0, 0x20, 0x0e, 0x0f,
+ 0x20, 0x21, 0x03, 0x00, 0x34, 0x57, 0xf0, 0xcf, 0x10, 0x3f, 0x00, 0xb0,
+ 0xdc, 0xe0, 0x54, 0x13,
+ 0x00, 0xe0, 0x0e, 0x00, 0x11, 0x02, 0xed, 0xf9, 0xf0, 0x10, 0x5c, 0x30,
+ 0x33, 0x41, 0x03, 0x07,
+ 0x11, 0xad, 0xca, 0xe0, 0xe0, 0xd0, 0xa0, 0x00, 0x01, 0x13, 0x02, 0x0f,
+ 0x21, 0x57, 0x13, 0x00,
+ 0x0d, 0xf0, 0xee, 0xd0, 0xf0, 0x10, 0xee, 0x8c, 0xff, 0x00, 0x0f, 0x06,
+ 0x53, 0x14, 0x0e, 0x0b,
+ 0xff, 0x60, 0x22, 0x00, 0xed, 0x00, 0x05, 0x00, 0xee, 0x13, 0x46, 0x10,
+ 0xfe, 0xc0, 0x01, 0xdf,
+ 0xbf, 0x00, 0x50, 0x14, 0x00, 0xeb, 0xfd, 0x2d, 0x4f, 0x42, 0x04, 0x00,
+ 0xdd, 0xe0, 0xf1, 0xe5,
+ 0x02, 0xff, 0x8c, 0xdf, 0x01, 0x03, 0x02, 0x30, 0x5d, 0x0d, 0x24, 0x27,
+ 0x74, 0x1e, 0x1f, 0x0e,
+ 0x00, 0x01, 0xf0, 0x02, 0x01, 0xd5, 0x24, 0x30, 0xdf, 0xdb, 0xfe, 0xcf,
+ 0xf0, 0xf2, 0x20, 0x4f,
+ 0xdf, 0x10, 0x20, 0x25, 0x12, 0xbc, 0xcc, 0x00, 0x53, 0x40, 0xd0, 0xdc,
+ 0x32, 0x05, 0x00, 0xbf,
+ 0xef, 0x12, 0xdd, 0xba, 0x20, 0x14, 0x00, 0x0f, 0x20, 0x51, 0x03, 0xbb,
+ 0xee, 0x11, 0x63, 0x00,
+ 0x20, 0x01, 0xf3, 0x05, 0x1e, 0x0d, 0x10, 0x35, 0x32, 0xf1, 0xa0, 0xec,
+ 0xdf, 0xed, 0x40, 0x21,
+ 0xf5, 0xb3, 0xec, 0xdb, 0x0f, 0x0f, 0xf4, 0x14, 0xe0, 0x8c, 0xb0, 0x10,
+ 0x10, 0x20, 0xf0, 0x1f,
+ 0x1f, 0x11, 0x22, 0x42, 0x1e, 0x0c, 0xb0, 0xe0, 0x0f, 0x40, 0x32, 0xe0,
+ 0xe4, 0x77, 0x47, 0x00,
+ 0x0f, 0x0c, 0x00, 0x10, 0x0e, 0x0f, 0xe0, 0xce, 0x0e, 0x00, 0x04, 0xdf,
+ 0x8a, 0x0f, 0x0f, 0x00,
+ 0x00, 0x15, 0x0e, 0xfe, 0x00, 0x61, 0x12, 0x0e, 0xf0, 0x10, 0xfd, 0x0d,
+ 0x36, 0x03, 0x92, 0xe2,
+ 0x04, 0xfe, 0xed, 0x02, 0x24, 0x01, 0xd0, 0x00, 0x30, 0x34, 0xe2, 0xbd,
+ 0x36, 0x55, 0x00, 0xfe,
+ 0x10, 0x5e, 0xf0, 0xf2, 0x04, 0x00, 0x0b, 0xa0, 0x01, 0x22, 0x12, 0x0f,
+ 0xcd, 0x10, 0x03, 0x9e,
+ 0x0f, 0x04, 0xf4, 0x11, 0x30, 0x0c, 0x0c, 0x10, 0x30, 0x04, 0x9b, 0x0e,
+ 0x41, 0x00, 0xd9, 0xfe,
+ 0x21, 0x35, 0xd0, 0xb0, 0x0f, 0xd0, 0xe3, 0xf1, 0x01, 0x0f, 0x7c, 0x40,
+ 0x2e, 0x0a, 0x0d, 0x40,
+ 0x63, 0x02, 0x0e, 0xee, 0x0e, 0x10, 0x26, 0x12, 0x0f, 0xec, 0xc0, 0xe0,
+ 0xc0, 0x00, 0xf0, 0xcd,
+ 0xde, 0x00, 0x00, 0x4e, 0xd9, 0xe0, 0x53, 0x52, 0x14, 0x10, 0x0c, 0x0f,
+ 0xf0, 0xe0, 0x0d, 0xe5,
+ 0xe4, 0xe0, 0xf0, 0x06, 0xc0, 0xd3, 0xc0, 0xbf, 0xdc, 0xf0, 0x05, 0xe0,
+ 0xec, 0x20, 0x50, 0x11,
+ 0x30, 0x71, 0x35, 0x10, 0xde, 0xf0, 0x01, 0xb0, 0xfe, 0x01, 0xd2, 0xd0,
+ 0xf0, 0x0f, 0x0d, 0xcd,
+ 0xfe, 0x30, 0x67, 0x46, 0x2e, 0x0d, 0x22, 0x31, 0x21, 0xfe, 0xab, 0x00,
+ 0x20, 0x42, 0x24, 0x21,
+ 0x24, 0xd0, 0xaf, 0x00, 0x11, 0x5c, 0xf9, 0xf0, 0x00, 0x0f, 0x0f, 0xed,
+ 0x34, 0x77, 0x10, 0xce,
+ 0xef, 0x0f, 0x10, 0x30, 0x13, 0x21, 0x00, 0xcd, 0xfc, 0x1e, 0x30, 0x22,
+ 0x24, 0x11, 0xef, 0x0e,
+ 0x4e, 0x1e, 0xdc, 0x8e, 0xff, 0xc0, 0xc8, 0xcc, 0xf0, 0x04, 0x11, 0x11,
+ 0x23, 0x13, 0x01, 0x24,
+ 0x22, 0xaf, 0xdb, 0xf0, 0x00, 0x00, 0xe2, 0x10, 0x63, 0x00, 0xed, 0xfe,
+ 0x10, 0x0e, 0xd0, 0x13,
+ 0x40, 0x19, 0x1d, 0x02, 0x07, 0xc0, 0xef, 0xdf, 0xc2, 0xe4, 0x2f, 0x1b,
+ 0xff, 0x80, 0xa1, 0x00,
+ 0x0f, 0x0c, 0x1f, 0x23, 0x12, 0x1e, 0x3e, 0x73, 0x25, 0x01, 0x33, 0x20,
+ 0x0b, 0xec, 0xdd, 0x0e,
+ 0x0d, 0x0f, 0xc3, 0x47, 0x31, 0xef, 0x9d, 0x1d, 0x30, 0x03, 0xf2, 0xff,
+ 0x60, 0x21, 0x0c, 0xdd,
+ 0x00, 0x21, 0xf4, 0xbc, 0xed, 0x10, 0x07, 0x15, 0x20, 0x20, 0x41, 0x0f,
+ 0x4e, 0x02, 0xe2, 0x8f,
+ 0xfa, 0x00, 0x00, 0x01, 0x20, 0x31, 0x57, 0x00, 0xd0, 0xec, 0xef, 0xef,
+ 0x02, 0x02, 0x12, 0x03,
+ 0xf2, 0x9f, 0xfe, 0xf1, 0x26, 0x33, 0x13, 0x0f, 0xcd, 0xd0, 0xfc, 0xde,
+ 0xe0, 0x8e, 0xff, 0x00,
+ 0x00, 0xe8, 0x09, 0x50, 0x60, 0x20, 0xe2, 0x00, 0x10, 0x21, 0xee, 0xef,
+ 0x23, 0x03, 0xc0, 0xf4,
+ 0x15, 0x00, 0xbd, 0xff, 0x12, 0x14, 0x0f, 0x0c, 0xf0, 0x1e, 0x51, 0x23,
+ 0x42, 0x20, 0x0e, 0x0f,
+ 0x6e, 0x03, 0x04, 0x00, 0xf3, 0x0f, 0xe9, 0xaf, 0x00, 0x34, 0xfc, 0xec,
+ 0x20, 0x31, 0xef, 0x00,
+ 0x53, 0x33, 0x2c, 0xee, 0x00, 0x35, 0x00, 0xfe, 0xe0, 0x34, 0x75, 0x62,
+ 0xe2, 0xd0, 0x0e, 0x01,
+ 0x00, 0x08, 0x2f, 0xf0, 0xa0, 0xf0, 0xfd, 0x00, 0x22, 0x01, 0x51, 0x53,
+ 0xff, 0xc8, 0xee, 0x13,
+ 0x32, 0x0f, 0xf1, 0x05, 0x1e, 0xee, 0x00, 0x12, 0x24, 0xbf, 0xb9, 0x00,
+ 0x00, 0xf0, 0x8b, 0xe0,
+ 0x11, 0x30, 0x11, 0xe0, 0x10, 0x00, 0x00, 0xc0, 0x11, 0x66, 0x20, 0x0b,
+ 0xed, 0x10, 0x42, 0x45,
+ 0x00, 0xae, 0xef, 0xe0, 0x01, 0x16, 0x00, 0xe0, 0x00, 0x22, 0x00, 0xfb,
+ 0xcf, 0x10, 0x11, 0x00,
+ 0xf0, 0x10, 0x30, 0x62, 0x01, 0xe1, 0xf0, 0x10, 0xfb, 0x00, 0x2c, 0x10,
+ 0xc0, 0xb0, 0x0e, 0x20,
+ 0x40, 0xf1, 0xcd, 0x3e, 0x75, 0x42, 0x00, 0x03, 0x17, 0x04, 0x10, 0xfe,
+ 0xea, 0xef, 0xee, 0x21,
+ 0x15, 0xc1, 0xd2, 0x1e, 0x4e, 0x0f, 0x0f, 0x51, 0x21, 0x0e, 0x00, 0x00,
+ 0xc1, 0x00, 0x8e, 0x00,
+ 0x92, 0xf7, 0x5d, 0xe2, 0x04, 0xf6, 0x2e, 0xe4, 0x3d, 0x4a, 0x5e, 0x30,
+ 0x20, 0x2d, 0x3d, 0x4d,
+ 0x2f, 0x40, 0x23, 0x22, 0x22, 0x33, 0x36, 0x24, 0x23, 0x12, 0x13, 0x03,
+ 0x05, 0x03, 0x23, 0x42,
+ 0x46, 0x44, 0x34, 0x22, 0x01, 0xf1, 0xb0, 0xd1, 0xd2, 0xd3, 0xd2, 0xb3,
+ 0x05, 0x04, 0x04, 0x03,
+ 0x02, 0x13, 0x13, 0x05, 0x13, 0x42, 0x74, 0x65, 0x32, 0x33, 0x31, 0x42,
+ 0x22, 0x22, 0x23, 0x47,
+ 0x42, 0x12, 0x01, 0x01, 0xd1, 0xd2, 0xe3, 0xc3, 0xd2, 0xc2, 0xd3, 0xe2,
+ 0xf2, 0xd1, 0xc0, 0xcb,
+ 0xcb, 0xec, 0xbd, 0xdb, 0xce, 0xed, 0xee, 0x0e, 0x1e, 0x3d, 0x2d, 0x3e,
+ 0x2c, 0x3c, 0x4d, 0x3d,
+ 0x5c, 0x3e, 0x2c, 0x0c, 0x0c, 0x0d, 0xfd, 0xec, 0x0e, 0x3e, 0x4e, 0x3f,
+ 0x5e, 0x4f, 0x2e, 0x2d,
+ 0x1e, 0x1d, 0xfd, 0xde, 0xbd, 0xaa, 0xbc, 0xde, 0xd0, 0xd0, 0xbf, 0xe1,
+ 0xd1, 0xd0, 0xdf, 0xcf,
+ 0xe1, 0xc7, 0xe2, 0xd4, 0xe3, 0xe3, 0xe5, 0xd2, 0xd2, 0xb1, 0xc1, 0xc3,
+ 0xd3, 0xb3, 0xe3, 0xe5,
+ 0xe5, 0xe4, 0xf1, 0xf2, 0xf3, 0x15, 0x34, 0x23, 0x33, 0x43, 0x44, 0x33,
+ 0x44, 0x23, 0x12, 0x12,
+ 0x01, 0x33, 0x74, 0x33, 0x13, 0x23, 0x33, 0x52, 0x41, 0x20, 0x3f, 0x4f,
+ 0x2b, 0x2c, 0x2d, 0x2c,
+ 0x1e, 0x20, 0x3f, 0x3f, 0x50, 0x30, 0x2b, 0x3d, 0x5e, 0x40, 0x30, 0x2b,
+ 0x1c, 0x1c, 0x3f, 0x40,
+ 0x30, 0x60, 0x30, 0x60, 0x22, 0x30, 0x30, 0x32, 0x30, 0x3c, 0x2b, 0x2c,
+ 0x1b, 0x1e, 0x0e, 0x0f,
+ 0x10, 0x01, 0xe1, 0xc2, 0xb3, 0xc4, 0xc2, 0xd6, 0xe3, 0xe2, 0xe2, 0xc2,
+ 0xe2, 0xc1, 0xe3, 0xf3,
+ 0x03, 0xe3, 0xc2, 0xe0, 0xcd, 0xc8, 0xce, 0xdd, 0xc0, 0xde, 0xcd, 0xdd,
+ 0xed, 0xd0, 0xe2, 0xc2,
+ 0xe4, 0xd7, 0xd7, 0xd2, 0xe1, 0xe0, 0xe0, 0xf2, 0x02, 0x02, 0x03, 0xd0,
+ 0xfe, 0x2e, 0x5e, 0x0d,
+ 0xfb, 0xdd, 0xef, 0xec, 0xea, 0xfd, 0x0d, 0xfb, 0xdc, 0xfd, 0x7d, 0x7d,
+ 0x4b, 0x1d, 0x0b, 0x0d,
+ 0xfd, 0x0c, 0x0d, 0x4e, 0x4d, 0x1d, 0x0c, 0x0d, 0xfd, 0xdd, 0xfe, 0x20,
+ 0x2f, 0xff, 0x0d, 0x1e,
+ 0x7f, 0x30, 0x3e, 0x4d, 0x2c, 0x0e, 0x0d, 0xed, 0xea, 0x0d, 0xfc, 0x9d,
+ 0xde, 0xed, 0x2d, 0x4b,
+ 0xdd, 0x9b, 0xde, 0xbe, 0xde, 0xc0, 0xce, 0xcf, 0xc0, 0xc0, 0xd0, 0xbe,
+ 0xec, 0xe0, 0xdf, 0xcd,
+ 0xdc, 0xdd, 0xe0, 0xf5, 0xf4, 0xf0, 0xf0, 0xed, 0xfe, 0xe0, 0xe1, 0xc0,
+ 0xce, 0xee, 0xd0, 0xdf,
+ 0xbd, 0xd0, 0xd0, 0xc0, 0xe0, 0xf0, 0x03, 0x00, 0x01, 0x10, 0x2f, 0x25,
+ 0x67, 0x17, 0x10, 0x11,
+ 0x15, 0x14, 0x33, 0x33, 0x23, 0xf1, 0xa1, 0x02, 0x00, 0xec, 0xcb, 0xff,
+ 0x0e, 0xfd, 0x0c, 0x2e,
+ 0x4f, 0x1e, 0x2d, 0x5e, 0x3b, 0x0d, 0x0f, 0x20, 0x71, 0x21, 0x02, 0x00,
+ 0xef, 0x01, 0x57, 0x53,
+ 0x36, 0x22, 0x33, 0x44, 0x55, 0x22, 0x21, 0x22, 0x33, 0x52, 0x22, 0x33,
+ 0x23, 0x24, 0x25, 0x12,
+ 0x12, 0x02, 0xf2, 0xc0, 0xe0, 0xe0, 0xf2, 0xd0, 0xae, 0xd0, 0xf7, 0xe2,
+ 0xd1, 0xc1, 0xf3, 0xf5,
+ 0xd1, 0x81, 0xe0, 0xd0, 0xe3, 0xd2, 0xd1, 0xc2, 0xe3, 0xe1, 0x04, 0x24,
+ 0x44, 0x44, 0x32, 0x30,
+ 0x4f, 0x3d, 0x30, 0x47, 0x42, 0x10, 0x10, 0x10, 0x12, 0x23, 0x13, 0x46,
+ 0x43, 0x44, 0x22, 0x20,
+ 0x00, 0xe0, 0xd0, 0xe0, 0xf3, 0xf3, 0xc2, 0xf4, 0x05, 0xf3, 0xe3, 0xc0,
+ 0xc1, 0xe0, 0xe0, 0x02,
+ 0xf5, 0xf0, 0xbe, 0xeb, 0x2e, 0x72, 0x77, 0x23, 0x23, 0x41, 0x35, 0x43,
+ 0x34, 0x44, 0x33, 0x32,
+ 0x32, 0x43, 0x21, 0x20, 0x31, 0x22, 0x20, 0x2e, 0x2e, 0x4c, 0x3c, 0x6d,
+ 0x2d, 0x2c, 0x3d, 0x2a,
+ 0x4d, 0x5d, 0x2d, 0x2b, 0x2e, 0x2c, 0x1e, 0x2c, 0x1d, 0x1d, 0x0e, 0xfd,
+ 0xee, 0xbd, 0xed, 0xde,
+ 0xef, 0xee, 0xde, 0xff, 0x00, 0xf1, 0x22, 0x77, 0x73, 0x24, 0x15, 0x33,
+ 0x12, 0x11, 0xf0, 0xf3,
+ 0x04, 0x03, 0x12, 0x03, 0xd1, 0xc1, 0xd2, 0x02, 0x42, 0x77, 0x44, 0x32,
+ 0x32, 0x42, 0x25, 0x25,
+ 0x35, 0x43, 0x33, 0x13, 0x23, 0x22, 0x13, 0x03, 0x02, 0x02, 0xe2, 0xd3,
+ 0xa2, 0xc4, 0xd0, 0xc1,
+ 0xd2, 0xe3, 0x05, 0x03, 0x11, 0x11, 0x31, 0x42, 0x30, 0x6f, 0x20, 0x21,
+ 0x20, 0x2f, 0x1c, 0x4b,
+ 0x4d, 0x1b, 0x0c, 0x0d, 0x0c, 0x0d, 0x3e, 0x5c, 0x2b, 0x2d, 0x5e, 0x4e,
+ 0x2d, 0x3c, 0x3e, 0x5e,
+ 0x3e, 0x2c, 0x2c, 0x1c, 0x1e, 0x0e, 0x0e, 0x2e, 0xdc, 0x9c, 0xde, 0xcc,
+ 0xcd, 0xdd, 0xdd, 0xdd,
+ 0xce, 0xe0, 0xe0, 0xe1, 0xef, 0xd0, 0xc0, 0xc2, 0xb0, 0xd1, 0xe7, 0xc4,
+ 0xd0, 0xb0, 0xd0, 0xe4,
+ 0xc4, 0xe2, 0xd2, 0xcf, 0xcd, 0xde, 0xe1, 0xd7, 0xd0, 0xd0, 0xd0, 0xcf,
+ 0xde, 0xd0, 0xd1, 0xd5,
+ 0xe5, 0xe2, 0xd1, 0x01, 0x02, 0x12, 0x01, 0x05, 0x14, 0x43, 0x22, 0x21,
+ 0x72, 0x24, 0x21, 0x20,
+ 0x40, 0x41, 0x20, 0x2e, 0x2c, 0x1b, 0x0b, 0xfd, 0xed, 0xde, 0x0f, 0x7f,
+ 0x50, 0x32, 0x41, 0x52,
+ 0x33, 0x32, 0x43, 0x32, 0x2e, 0x39, 0x30, 0x51, 0x2f, 0x4d, 0x3e, 0x4d,
+ 0x4d, 0x2e, 0x2c, 0x2b,
+ 0x2e, 0x2e, 0x1e, 0x1c, 0x0a, 0x0c, 0xdd, 0xcd, 0xce, 0xcc, 0xde, 0xef,
+ 0xd0, 0xc0, 0xdd, 0xce,
+ 0xec, 0xcd, 0xe0, 0xe2, 0xd0, 0xc0, 0xc0, 0xe2, 0xf4, 0xe3, 0xf7, 0x05,
+ 0x03, 0x03, 0x04, 0x04,
+ 0x04, 0xd3, 0xd4, 0xf3, 0xa3, 0xc3, 0xb3, 0xd3, 0xc1, 0xb0, 0xdf, 0xe0,
+ 0xe3, 0xe2, 0xe2, 0xe2,
+ 0xc1, 0xcf, 0xdd, 0xef, 0xe0, 0xf1, 0x07, 0x01, 0x0d, 0xf8, 0xfc, 0x0d,
+ 0x1f, 0x3d, 0x3b, 0x3d,
+ 0x4c, 0x1e, 0x1c, 0x1c, 0x1d, 0x2d, 0x0b, 0xcd, 0xbc, 0xfd, 0x0d, 0x1c,
+ 0x5e, 0x5e, 0x2e, 0x1d,
+ 0x1d, 0x1e, 0x4f, 0x50, 0x30, 0x2e, 0x2d, 0x3e, 0x5e, 0x3c, 0x2c, 0x1c,
+ 0x1b, 0x1d, 0x3f, 0x70,
+ 0x3f, 0x2d, 0x1c, 0x2d, 0x3d, 0x2e, 0x1e, 0x2e, 0x0e, 0xdd, 0xa1, 0xe7,
+ 0xc3, 0xb1, 0xc2, 0xe6,
+ 0xf4, 0xe3, 0xd2, 0xc1, 0xe3, 0xe3, 0xc3, 0xc1, 0xd2, 0xe3, 0xf3, 0xf3,
+ 0xf5, 0xd2, 0xc2, 0xe3,
+ 0xd1, 0xb0, 0xe0, 0xf0, 0x12, 0x11, 0x0e, 0xeb, 0xcd, 0xed, 0xfb, 0xfc,
+ 0xdc, 0xac, 0xee, 0xee,
+ 0xcb, 0xbd, 0xdf, 0xe1, 0xd1, 0xb0, 0xdd, 0xbc, 0xe0, 0x03, 0x07, 0x21,
+ 0x12, 0x23, 0x23, 0x53,
+ 0x22, 0x11, 0x30, 0x2f, 0x3b, 0x2c, 0x2d, 0x1b, 0x3e, 0x5e, 0x2e, 0x0e,
+ 0x0f, 0x00, 0x30, 0x50,
+ 0x30, 0x34, 0x34, 0x45, 0x53, 0x35, 0x53, 0x32, 0x22, 0x33, 0x34, 0x33,
+ 0x34, 0x42, 0x23, 0x22,
+ 0x12, 0x00, 0x20, 0x32, 0x20, 0x41, 0x55, 0x44, 0x32, 0x23, 0x22, 0x13,
+ 0x15, 0x23, 0x34, 0x33,
+ 0x03, 0xf3, 0xd3, 0xa4, 0xe4, 0xe4, 0x13, 0x13, 0x04, 0x02, 0xd1, 0xe0,
+ 0x01, 0x02, 0x13, 0x05,
+ 0x63, 0x51, 0x20, 0x00, 0x3e, 0x71, 0x30, 0x09, 0x0e, 0x2d, 0x2c, 0xed,
+ 0xab, 0xfd, 0x0c, 0x0e,
+ 0x2f, 0x60, 0x30, 0x30, 0x2e, 0x0b, 0x0f, 0x0e, 0x00, 0x00, 0xb1, 0x9e,
+ 0xcb, 0xde, 0xd0, 0xd3,
+ 0xd1, 0xce, 0xcc, 0xfe, 0xee, 0xdb, 0xdc, 0xee, 0xef, 0xcf, 0xdb, 0xdd,
+ 0xec, 0x0e, 0x00, 0x0f,
+ 0xed, 0xbc, 0xdd, 0xfd, 0x0e, 0x00, 0xef, 0xf0, 0xf0, 0x11, 0x72, 0x62,
+ 0x20, 0x1d, 0x18, 0x2e,
+ 0x30, 0x50, 0x30, 0x51, 0x30, 0x2a, 0x1c, 0x2c, 0x2b, 0x2d, 0x2d, 0x2e,
+ 0x1d, 0x0c, 0x3e, 0x5d,
+ 0x5f, 0x2e, 0x3e, 0x3e, 0x4f, 0x31, 0x64, 0x12, 0x22, 0x14, 0x25, 0x34,
+ 0x23, 0x13, 0x24, 0x14,
+ 0x03, 0x03, 0x04, 0x02, 0x14, 0x34, 0x44, 0x12, 0x02, 0xf3, 0x33, 0x52,
+ 0x01, 0x21, 0x63, 0x45,
+ 0x32, 0x31, 0x34, 0x24, 0x44, 0x44, 0x42, 0x23, 0x43, 0x43, 0x66, 0x33,
+ 0x32, 0x22, 0x34, 0x44,
+ 0x22, 0x01, 0x02, 0x02, 0x03, 0xd2, 0xe2, 0xc2, 0xe3, 0x05, 0x02, 0xf2,
+ 0xd2, 0xd1, 0xe2, 0xd2,
+ 0xe1, 0xc0, 0xbd, 0xdc, 0xbb, 0xdc, 0xcc, 0xfd, 0xfe, 0x0c, 0x0d, 0x0d,
+ 0x0b, 0x2e, 0x4f, 0x4e,
+ 0x4f, 0x2e, 0x4e, 0x1b, 0x1d, 0x4d, 0x4e, 0x0c, 0x0d, 0xea, 0xde, 0xcd,
+ 0xcd, 0xbd, 0xdc, 0xdd,
+ 0xdd, 0xfe, 0xef, 0xfd, 0xdd, 0xdc, 0xdd, 0xbd, 0xdd, 0xce, 0xf0, 0xd0,
+ 0xe5, 0xc1, 0xc1, 0xc0,
+ 0xc2, 0xe6, 0xc1, 0xd3, 0xb2, 0xe3, 0xd2, 0xd0, 0xc1, 0xd1, 0xe4, 0xe3,
+ 0xf6, 0xd2, 0xe4, 0xf3,
+ 0x07, 0x02, 0x03, 0x13, 0x03, 0x05, 0x23, 0x64, 0x02, 0xf3, 0xe2, 0x24,
+ 0x43, 0x22, 0x02, 0x75,
+ 0x43, 0x02, 0x01, 0x42, 0x74, 0x20, 0x21, 0x31, 0x31, 0x30, 0x30, 0x20,
+ 0x1f, 0x0e, 0x0d, 0x2f,
+ 0x0b, 0xab, 0xdc, 0x10, 0x0f, 0x0d, 0x3f, 0x6f, 0x1c, 0x0a, 0x60, 0x40,
+ 0x30, 0x1f, 0x51, 0x33,
+ 0x20, 0x1c, 0x2e, 0x54, 0x10, 0x1f, 0x1f, 0x2e, 0x0d, 0x2e, 0x2d, 0x09,
+ 0x2f, 0x0d, 0xfd, 0x0c,
+ 0xfe, 0xdd, 0xdf, 0x00, 0xef, 0xbd, 0x00, 0x03, 0xef, 0xad, 0xe2, 0x07,
+ 0xf4, 0x90, 0xdd, 0xdf,
+ 0xf0, 0xf6, 0xd1, 0xd0, 0xd0, 0xcf, 0xcf, 0xe0, 0xf4, 0xc0, 0xf2, 0x07,
+ 0xc2, 0xb0, 0xe4, 0x05,
+ 0x13, 0xf1, 0xb0, 0xf0, 0x14, 0x02, 0xbf, 0xf0, 0xe2, 0xf2, 0xf0, 0xf0,
+ 0x03, 0xf0, 0xf0, 0x36,
+ 0x32, 0xcd, 0xba, 0x00, 0x40, 0x00, 0xe9, 0xff, 0x4f, 0x2f, 0xec, 0xfe,
+ 0x2f, 0x1e, 0xec, 0xbc,
+ 0x3f, 0x4f, 0x0d, 0x0d, 0x4f, 0x2e, 0xdb, 0xbd, 0x0e, 0x0f, 0x1f, 0x1e,
+ 0x40, 0x3f, 0x3f, 0x3d,
+ 0x2c, 0x3e, 0x5f, 0x3c, 0x2d, 0x7f, 0x20, 0x1d, 0x1d, 0x2f, 0x0c, 0xfc,
+ 0xfd, 0xf0, 0xbc, 0xb9,
+ 0xde, 0xf0, 0xf0, 0xbd, 0xcb, 0xe0, 0xef, 0xef, 0xe0, 0xe0, 0xc0, 0xdd,
+ 0xee, 0xe0, 0xf2, 0xb0,
+ 0xde, 0xe3, 0xd3, 0xd2, 0xd3, 0xc5, 0xd3, 0xe6, 0xc1, 0xbd, 0xed, 0x00,
+ 0x0f, 0xec, 0x02, 0x10,
+ 0xd8, 0xcd, 0x00, 0x23, 0xe0, 0xbe, 0xe0, 0xe2, 0xf2, 0xab, 0xec, 0x01,
+ 0x36, 0x00, 0xcf, 0xf0,
+ 0x00, 0x01, 0xe0, 0x23, 0x11, 0x00, 0x00, 0x0e, 0x50, 0x53, 0x1a, 0x1d,
+ 0x0b, 0x0c, 0x2e, 0x2f,
+ 0x1e, 0xec, 0xbe, 0x0f, 0x0f, 0x0f, 0xac, 0xee, 0x10, 0x32, 0x00, 0xea,
+ 0xff, 0x00, 0x41, 0x76,
+ 0x00, 0xf0, 0x32, 0x52, 0x10, 0x33, 0x77, 0x21, 0x00, 0x00, 0x33, 0x35,
+ 0x00, 0x00, 0x00, 0x02,
+ 0xf1, 0x02, 0x03, 0xc0, 0xe0, 0x15, 0xf1, 0xb0, 0xe1, 0xf2, 0x03, 0xb0,
+ 0xe0, 0x06, 0x23, 0x02,
+ 0xcf, 0x03, 0x17, 0xe0, 0xa0, 0xf0, 0x13, 0x02, 0xe1, 0xf2, 0x36, 0xf0,
+ 0x8d, 0x12, 0x67, 0x00,
+ 0xdc, 0x10, 0x22, 0x00, 0xde, 0x0f, 0x54, 0x12, 0xff, 0xff, 0x21, 0x44,
+ 0xff, 0xee, 0x33, 0x45,
+ 0xfe, 0xde, 0x11, 0x43, 0xed, 0xbb, 0x10, 0x00, 0xff, 0xee, 0x00, 0x01,
+ 0xed, 0xb9, 0x10, 0x42,
+ 0x00, 0xed, 0x31, 0x10, 0xdc, 0x31, 0x77, 0x00, 0x0f, 0x11, 0x11, 0x21,
+ 0x01, 0x11, 0x54, 0x33,
+ 0x00, 0x00, 0x64, 0x22, 0x10, 0x10, 0x33, 0x43, 0x10, 0x0d, 0x20, 0x67,
+ 0x10, 0xfc, 0x0f, 0x30,
+ 0x0d, 0xfb, 0x20, 0x20, 0xd9, 0xce, 0x30, 0x0f, 0xbc, 0xee, 0x0f, 0x10,
+ 0xfd, 0xbd, 0x00, 0x11,
+ 0x00, 0x00, 0x02, 0x03, 0x04, 0xb0, 0x05, 0x12, 0xe0, 0xc0, 0x02, 0x46,
+ 0x00, 0xce, 0xbd, 0x24,
+ 0x56, 0xef, 0xee, 0x11, 0x21, 0x00, 0x31, 0x32, 0xff, 0x00, 0x77, 0x43,
+ 0xf0, 0x00, 0x33, 0x34,
+ 0x01, 0xf0, 0x00, 0x35, 0x22, 0x00, 0xf0, 0x11, 0x62, 0x00, 0x00, 0x34,
+ 0x01, 0xad, 0x00, 0x27,
+ 0x11, 0xcf, 0xf0, 0x12, 0x34, 0x00, 0xce, 0xef, 0x33, 0x44, 0xef, 0xee,
+ 0x20, 0x75, 0x00, 0x0e,
+ 0x41, 0x10, 0x0d, 0x21, 0x43, 0x0a, 0xfe, 0x32, 0x53, 0x00, 0x0e, 0x0d,
+ 0x10, 0x10, 0x20, 0x42,
+ 0xb8, 0xd8, 0x20, 0x30, 0xdf, 0xef, 0xee, 0xff, 0x40, 0x10, 0xdf, 0xac,
+ 0x00, 0x22, 0xff, 0xee,
+ 0x21, 0x02, 0xde, 0xd0, 0xf2, 0xe2, 0xd2, 0xd3, 0x80, 0x17, 0x15, 0x8d,
+ 0xff, 0x04, 0x01, 0xee,
+ 0xe0, 0x00, 0xcf, 0xf0, 0xf2, 0xde, 0xa8, 0xf0, 0x12, 0x02, 0xde, 0xee,
+ 0x02, 0x01, 0xdf, 0x14,
+ 0xf0, 0xd0, 0x24, 0xf0, 0x9d, 0xf0, 0x15, 0xf0, 0x00, 0x13, 0xee, 0x0f,
+ 0x00, 0x21, 0x34, 0x21,
+ 0xcd, 0xdd, 0x77, 0x45, 0x0f, 0xab, 0x0f, 0x44, 0x10, 0xed, 0xfd, 0x21,
+ 0x54, 0x0f, 0x0e, 0x0f,
+ 0x10, 0x33, 0x32, 0x1f, 0x0d, 0x52, 0x47, 0x0f, 0x0d, 0x30, 0x52, 0x22,
+ 0x0e, 0x0e, 0x30, 0x00,
+ 0x0a, 0xfe, 0x31, 0x22, 0xcb, 0xee, 0x00, 0x21, 0xbe, 0xdd, 0xf0, 0x01,
+ 0xf1, 0xe0, 0xab, 0xee,
+ 0x13, 0x12, 0xba, 0xf0, 0x12, 0xf0, 0xff, 0x01, 0xf0, 0x04, 0x13, 0xcd,
+ 0xf2, 0x77, 0x04, 0xdf,
+ 0xf0, 0xf2, 0x03, 0xe1, 0xc0, 0x04, 0xf4, 0xc0, 0xe0, 0xf1, 0xe1, 0x03,
+ 0xf1, 0xae, 0x16, 0x45,
+ 0xdf, 0x8c, 0x02, 0x23, 0xfe, 0xee, 0x13, 0x14, 0xec, 0xed, 0x11, 0x0f,
+ 0xfd, 0x20, 0x0f, 0xea,
+ 0x0f, 0x2f, 0x2e, 0xed, 0xbb, 0x20, 0x50, 0xfc, 0xbb, 0x00, 0x40, 0x00,
+ 0xcc, 0x0f, 0x20, 0x0f,
+ 0xed, 0x0e, 0x30, 0x1e, 0xeb, 0x30, 0x70, 0x0e, 0x0d, 0x20, 0x40, 0x0e,
+ 0xfa, 0xff, 0x10, 0x0f,
+ 0xfd, 0x32, 0x00, 0x99, 0x0f, 0x22, 0x10, 0xad, 0x0f, 0x25, 0x11, 0xee,
+ 0xcf, 0x01, 0x02, 0x02,
+ 0x03, 0xe1, 0xb0, 0xe2, 0x07, 0xf1, 0xb0, 0xf2, 0x05, 0x02, 0xd0, 0x01,
+ 0x35, 0x11, 0xae, 0x00,
+ 0x57, 0x00, 0xef, 0x10, 0x22, 0xff, 0xcd, 0x00, 0x23, 0xff, 0xac, 0xff,
+ 0x13, 0x12, 0xcc, 0xfe,
+ 0x00, 0x00, 0xd0, 0xfe, 0x00, 0x01, 0x12, 0xfd, 0xec, 0x21, 0x56, 0xfe,
+ 0xcd, 0x11, 0x42, 0x00,
+ 0xe9, 0x10, 0x62, 0x0f, 0xea, 0x0f, 0x30, 0x1f, 0xed, 0x20, 0x72, 0x10,
+ 0x0e, 0xfd, 0x22, 0x46,
+ 0x00, 0xfe, 0x00, 0x33, 0xfe, 0x32, 0x65, 0xff, 0x11, 0x33, 0x00, 0x21,
+ 0x44, 0x11, 0x10, 0x0e,
+ 0x00, 0x65, 0x00, 0x00, 0xf0, 0x01, 0x14, 0xf0, 0xf0, 0xf2, 0xbe, 0xdd,
+ 0x27, 0x45, 0xf0, 0xc0,
+ 0xce, 0x13, 0x57, 0x01, 0xbe, 0x00, 0x25, 0xf0, 0xdf, 0x01, 0x12, 0xf0,
+ 0xe0, 0x01, 0xe0, 0x01,
+ 0x12, 0xe0, 0xe0, 0xf0, 0xff, 0x41, 0x63, 0xf9, 0xdc, 0x51, 0x20, 0x0e,
+ 0xeb, 0x10, 0x51, 0xff,
+ 0xdb, 0x00, 0x74, 0x00, 0xed, 0xfe, 0x01, 0x21, 0xfe, 0x0f, 0x11, 0xfd,
+ 0x0e, 0x32, 0x10, 0xfb,
+ 0x10, 0xfe, 0x89, 0x00, 0x11, 0xfe, 0xde, 0xcd, 0x0f, 0xfd, 0xba, 0x0f,
+ 0x11, 0x00, 0xbb, 0xf0,
+ 0x32, 0x00, 0xfe, 0xff, 0x0f, 0x30, 0x54, 0x00, 0xda, 0xff, 0x73, 0x01,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0xdd, 0xff, 0x12, 0x22, 0xfd, 0x0d, 0x1f, 0x43, 0x0d, 0xa8, 0x0d, 0x31,
+ 0x10, 0xe9, 0xff, 0x40,
+ 0x1f, 0xee, 0xee, 0x22, 0x55, 0x00, 0xcf, 0x23, 0x67, 0x00, 0xf1, 0x02,
+ 0x33, 0x01, 0xd0, 0x33,
+ 0x21, 0xe0, 0xe0, 0x00, 0x00, 0xff, 0x54, 0x34, 0xee, 0x22, 0x63, 0xfd,
+ 0x01, 0x37, 0x24, 0x00,
+ 0x02, 0x32, 0xf0, 0xae, 0x00, 0x77, 0x12, 0xed, 0x00, 0x43, 0x33, 0x00,
+ 0x10, 0x44, 0x34, 0x22,
+ 0x22, 0x22, 0x13, 0x14, 0x24, 0x22, 0xd0, 0xe0, 0x34, 0x22, 0x8f, 0x02,
+ 0x37, 0xe0, 0xbd, 0x00,
+ 0x33, 0x0f, 0x0f, 0x10, 0xfe, 0xeb, 0x20, 0x72, 0x32, 0xfe, 0x01, 0x01,
+ 0xc3, 0x00, 0xc2, 0x00,
+ 0x47, 0x25, 0x1a, 0x20, 0xd5, 0x23, 0x26, 0x20, 0x34, 0xcd, 0xce, 0x10,
+ 0x20, 0x25, 0xce, 0xdb,
+ 0x11, 0x41, 0xe0, 0xcc, 0x00, 0x00, 0x77, 0x00, 0xdc, 0xf0, 0x22, 0x42,
+ 0x00, 0x0f, 0xff, 0xe0,
+ 0x11, 0x11, 0x01, 0x00, 0xee, 0xcd, 0x77, 0x11, 0xab, 0x00, 0x46, 0x0f,
+ 0xce, 0x00, 0x11, 0x21,
+ 0xf0, 0xed, 0x00, 0x23, 0x21, 0xdd, 0xde, 0x24, 0x64, 0xee, 0x00, 0x31,
+ 0xbc, 0xfe, 0x47, 0x21,
+ 0xef, 0xee, 0xff, 0x22, 0x75, 0xfe, 0xdd, 0x01, 0x32, 0x00, 0x01, 0x00,
+ 0xff, 0xfd, 0x01, 0x21,
+ 0x0f, 0xde, 0x67, 0x00, 0xfe, 0xdd, 0x00, 0x00, 0x32, 0xf0, 0xaa, 0x00,
+ 0x33, 0x0f, 0xfd, 0xcd,
+ 0x35, 0x32, 0xf0, 0xed, 0x10, 0x76, 0x00, 0xde, 0x00, 0x32, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x9b, 0x00, 0x67, 0x00, 0x0f, 0xef, 0xee, 0x00, 0x77, 0xf0, 0xdb, 0x01,
+ 0x43, 0x0f, 0xcd, 0x11,
+ 0x13, 0x00, 0x0e, 0xef, 0x32, 0x22, 0xdd, 0xef, 0x12, 0x23, 0xda, 0xcf,
+ 0x42, 0x22, 0xbc, 0xfe,
+ 0x56, 0x00, 0xcd, 0x00, 0x33, 0x01, 0xed, 0xf0, 0x34, 0x00, 0xdb, 0x12,
+ 0x52, 0xff, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0xfc, 0x01, 0x52, 0x00, 0xfe, 0xfd, 0xff, 0x54, 0xf0,
+ 0xc8, 0x30, 0x32, 0xef,
+ 0xde, 0x43, 0xf0, 0xed, 0x11, 0x20, 0xce, 0xcb, 0x23, 0x44, 0xcd, 0xec,
+ 0x23, 0x43, 0xea, 0xef,
+ 0x63, 0x00, 0xed, 0x0f, 0x54, 0x14, 0xdd, 0xec, 0x34, 0x54, 0xef, 0xcd,
+ 0x00, 0x41, 0x04, 0xdd,
+ 0xfe, 0x00, 0x33, 0xef, 0xcc, 0x21, 0x33, 0xff, 0xbc, 0x00, 0x32, 0x05,
+ 0xfe, 0xdf, 0x11, 0x33,
+ 0x00, 0xcd, 0xf0, 0x00, 0x13, 0x01, 0xd3, 0x22, 0xc8, 0xbe, 0x35, 0x52,
+ 0xfd, 0xed, 0x10, 0x43,
+ 0x00, 0xec, 0x23, 0x00, 0x0f, 0x41, 0x02, 0xdc, 0x00, 0x77, 0xef, 0xec,
+ 0xe0, 0x23, 0x30, 0xc0,
+ 0xfe, 0x10, 0x63, 0x0f, 0xcb, 0x23, 0x13, 0x11, 0x10, 0xff, 0xfe, 0x01,
+ 0x54, 0x0f, 0xc9, 0x0f,
+ 0x10, 0x20, 0x1e, 0xfe, 0x01, 0x01, 0xde, 0x0f, 0xe0, 0xf3, 0x07, 0x8e,
+ 0xef, 0x24, 0x00, 0x20,
+ 0x21, 0x01, 0xdc, 0x40, 0x21, 0xf0, 0x20, 0x75, 0xef, 0xee, 0x55, 0x10,
+ 0xf0, 0xe2, 0x33, 0x10,
+ 0xda, 0xc1, 0x11, 0x0f, 0xff, 0x12, 0x12, 0xbb, 0x02, 0x44, 0xdc, 0xbc,
+ 0x11, 0x12, 0x00, 0xf0,
+ 0x20, 0x44, 0xdf, 0xdd, 0x34, 0xe0, 0xcf, 0x23, 0x55, 0xed, 0xcc, 0x00,
+ 0x30, 0x33, 0xcf, 0xdb,
+ 0x31, 0x52, 0xee, 0xba, 0x11, 0x33, 0x10, 0xec, 0x00, 0x20, 0x20, 0x01,
+ 0xd0, 0x1f, 0x10, 0x00,
+ 0x10, 0xfe, 0xb0, 0x35, 0x40, 0xdd, 0xad, 0x23, 0x57, 0xfe, 0xdc, 0x01,
+ 0x42, 0xe0, 0xec, 0x00,
+ 0x21, 0x00, 0xb0, 0x00, 0xfd, 0x0e, 0x27, 0x02, 0x0e, 0x00, 0x31, 0x00,
+ 0x99, 0x11, 0x64, 0xff,
+ 0xdd, 0x00, 0x24, 0x21, 0x00, 0xf0, 0x02, 0x10, 0x30, 0xf2, 0xbf, 0x32,
+ 0x33, 0xf0, 0xef, 0x0c,
+ 0x0b, 0x11, 0x13, 0x1f, 0xf9, 0xaf, 0x10, 0x22, 0xcd, 0xdc, 0xe0, 0xe0,
+ 0xe0, 0x0e, 0xdc, 0xf0,
+ 0x71, 0x11, 0xdb, 0xe0, 0x56, 0x32, 0xe0, 0xa0, 0x00, 0x14, 0x10, 0xcc,
+ 0x02, 0x01, 0x31, 0x00,
+ 0xab, 0x00, 0x40, 0x20, 0xf0, 0xe0, 0x11, 0x0e, 0x40, 0x57, 0x01, 0xaf,
+ 0x0f, 0x21, 0x22, 0xef,
+ 0x00, 0x16, 0x20, 0xff, 0xfe, 0x0d, 0x1f, 0x35, 0x34, 0xf0, 0xed, 0xe0,
+ 0xf0, 0x00, 0x0e, 0xf1,
+ 0x06, 0x30, 0x8d, 0x8b, 0x02, 0x25, 0xee, 0xcd, 0x02, 0x23, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0x23, 0x62,
+ 0x00, 0x0b, 0x12, 0x30, 0x00, 0xf0, 0xf0, 0xcf, 0x00, 0x53, 0x02, 0xb8,
+ 0x00, 0x23, 0x0f, 0xfd,
+ 0x00, 0x14, 0x00, 0xf0, 0xed, 0xdc, 0xfd, 0x21, 0x47, 0x8d, 0xeb, 0x10,
+ 0x31, 0x03, 0x0e, 0xbc,
+ 0x00, 0x23, 0x00, 0xf0, 0x01, 0x55, 0x00, 0xc0, 0x0e, 0x22, 0x13, 0x44,
+ 0xfc, 0x0f, 0x13, 0xf1,
+ 0xcf, 0x0f, 0x0f, 0xdf, 0x04, 0x11, 0xac, 0xee, 0xef, 0x00, 0x57, 0x00,
+ 0xaa, 0x00, 0x44, 0x00,
+ 0xfd, 0xf0, 0x32, 0x22, 0xff, 0xde, 0x20, 0x10, 0x0f, 0xe0, 0xf3, 0x00,
+ 0x1d, 0x4e, 0xe0, 0xf7,
+ 0x32, 0x1b, 0x0f, 0x13, 0x00, 0x8c, 0x0e, 0x45, 0x34, 0xcf, 0xcd, 0x10,
+ 0x42, 0x01, 0xfe, 0xea,
+ 0x00, 0x22, 0x00, 0x1f, 0x6e, 0x10, 0x30, 0x14, 0x02, 0xdf, 0x0e, 0x54,
+ 0x31, 0xe2, 0xe1, 0x0f,
+ 0x4d, 0x1d, 0xef, 0xd0, 0x00, 0x0c, 0xbd, 0xbb, 0x00, 0x04, 0xfd, 0x0c,
+ 0x32, 0xf1, 0x88, 0x9d,
+ 0x23, 0x04, 0x0f, 0xff, 0x04, 0x25, 0xed, 0xfe, 0x22, 0x12, 0xee, 0x0f,
+ 0x23, 0x22, 0xfb, 0xfe,
+ 0x01, 0x34, 0x22, 0xbf, 0xbb, 0x00, 0x13, 0x10, 0x42, 0x32, 0xef, 0x0e,
+ 0xef, 0x01, 0x16, 0xbd,
+ 0xff, 0x24, 0x02, 0x8c, 0x0f, 0x15, 0x20, 0x00, 0xef, 0xfe, 0x20, 0x61,
+ 0x0c, 0xee, 0x31, 0x42,
+ 0xed, 0xdc, 0x01, 0x40, 0x0d, 0xc0, 0xf3, 0xed, 0xd8, 0xd0, 0x22, 0x32,
+ 0xea, 0xbf, 0x10, 0x73,
+ 0x11, 0xeb, 0xef, 0x32, 0x73, 0x0d, 0xec, 0x21, 0x00, 0x00, 0xe2, 0x12,
+ 0x30, 0xf0, 0xff, 0x20,
+ 0x03, 0xb0, 0xff, 0x14, 0x31, 0x0f, 0xce, 0x00, 0x0b, 0x09, 0x2f, 0xf1,
+ 0xc4, 0x01, 0x00, 0xf0,
+ 0xaf, 0xff, 0x02, 0x07, 0x01, 0x01, 0xb2, 0xc0, 0xd0, 0x03, 0x13, 0xeb,
+ 0xc0, 0x64, 0x34, 0x20,
+ 0x0f, 0xe0, 0x20, 0x42, 0x00, 0xfb, 0x20, 0x10, 0xbc, 0xfe, 0x23, 0x44,
+ 0xeb, 0xde, 0x00, 0x54,
+ 0xff, 0xca, 0xff, 0xef, 0x10, 0x20, 0x35, 0x01, 0x9f, 0xdc, 0x00, 0x32,
+ 0x42, 0xd0, 0xff, 0x00,
+ 0x10, 0x1e, 0x3f, 0x4f, 0x01, 0xcf, 0x1e, 0x53, 0x0f, 0x2c, 0x20, 0xeb,
+ 0xd0, 0x45, 0xdf, 0x9a,
+ 0x11, 0x32, 0x01, 0x00, 0x22, 0x13, 0xfd, 0x20, 0x77, 0x02, 0xee, 0x0d,
+ 0x42, 0x10, 0xeb, 0x00,
+ 0x54, 0x01, 0xcf, 0xff, 0x04, 0x10, 0xad, 0xfe, 0x02, 0x03, 0xfe, 0xfd,
+ 0x30, 0x12, 0x0e, 0xfa,
+ 0x00, 0x24, 0x0e, 0xbe, 0xf3, 0xf6, 0xf0, 0x03, 0x00, 0x9d, 0xf0, 0x00,
+ 0x23, 0xf1, 0xcb, 0x20,
+ 0x44, 0x12, 0x00, 0x2c, 0x01, 0xe2, 0x00, 0x7e, 0x1b, 0xef, 0x00, 0x21,
+ 0x0f, 0xcf, 0xfc, 0x0c,
+ 0xde, 0xf0, 0xef, 0x40, 0x21, 0xee, 0x12, 0x77, 0x6c, 0x00, 0x02, 0x00,
+ 0x2f, 0x3f, 0x04, 0x03,
+ 0xf1, 0x1e, 0xe8, 0x9e, 0xf0, 0x00, 0xf0, 0xe0, 0xb0, 0xf3, 0xf0, 0x0c,
+ 0xf1, 0x12, 0x1e, 0x1b,
+ 0xdb, 0x20, 0x7f, 0x0f, 0x0f, 0x11, 0x36, 0x31, 0xee, 0xbf, 0x01, 0xe3,
+ 0x01, 0x17, 0x53, 0x20,
+ 0x10, 0x01, 0xd0, 0xf0, 0x12, 0xae, 0xdc, 0xcc, 0x0e, 0x63, 0x36, 0x0e,
+ 0xcc, 0x0f, 0x4f, 0x13,
+ 0x01, 0x0f, 0xf0, 0xe0, 0x0d, 0xec, 0x03, 0x57, 0x03, 0xdd, 0xed, 0x02,
+ 0x02, 0xe0, 0x27, 0x72,
+ 0xf1, 0xef, 0x1e, 0x44, 0x33, 0x00, 0x2d, 0x3f, 0x10, 0xe0, 0x0d, 0xed,
+ 0x8e, 0xe1, 0xff, 0xe9,
+ 0x00, 0x35, 0x00, 0xaf, 0xfe, 0x14, 0x11, 0x0f, 0x2d, 0x41, 0x42, 0x30,
+ 0x2e, 0x1b, 0x1f, 0x00,
+ 0x06, 0x02, 0xf0, 0x72, 0x70, 0xfe, 0xbd, 0x03, 0x12, 0x0f, 0xd8, 0x00,
+ 0xf3, 0xed, 0xcd, 0x00,
+ 0x32, 0x01, 0x0f, 0x00, 0x26, 0x41, 0x0d, 0xec, 0x40, 0x77, 0x12, 0xec,
+ 0xff, 0x00, 0xfe, 0xee,
+ 0x13, 0x33, 0xe3, 0xd0, 0xdf, 0x1f, 0x40, 0xdd, 0xcb, 0xe0, 0xcd, 0xcd,
+ 0x0c, 0x0a, 0x00, 0xff,
+ 0xce, 0xef, 0xd0, 0x02, 0xf1, 0x00, 0x3f, 0x74, 0x72, 0x00, 0xe0, 0x01,
+ 0x27, 0x35, 0x1f, 0x0f,
+ 0xf0, 0xe0, 0x02, 0xf0, 0x20, 0x75, 0xd4, 0xbe, 0x0b, 0xef, 0xe0, 0x04,
+ 0x61, 0x21, 0xfe, 0xe1,
+ 0x12, 0x40, 0x10, 0xf1, 0xcc, 0xfb, 0x04, 0x64, 0x00, 0xed, 0x00, 0x03,
+ 0x02, 0x11, 0x0d, 0x1f,
+ 0x73, 0x57, 0x03, 0x0d, 0xfe, 0x01, 0x14, 0xff, 0xed, 0xf2, 0x02, 0xee,
+ 0xec, 0xf0, 0xec, 0x22,
+ 0x77, 0x25, 0xcb, 0xff, 0x0f, 0x50, 0x20, 0xf0, 0xff, 0x0f, 0x0e, 0x0d,
+ 0x02, 0x34, 0x10, 0x01,
+ 0xe1, 0xd0, 0x1e, 0x60, 0xf5, 0xb0, 0x0f, 0x22, 0xff, 0xb8, 0x1f, 0x2f,
+ 0x30, 0xf2, 0xdf, 0xfd,
+ 0xdc, 0xe1, 0x04, 0x44, 0x10, 0x8e, 0xe0, 0x00, 0x23, 0xd0, 0xe1, 0x37,
+ 0x72, 0x21, 0xee, 0xed,
+ 0x21, 0x21, 0xe0, 0x17, 0x01, 0xab, 0x00, 0xde, 0xf0, 0xef, 0x0f, 0x74,
+ 0x13, 0xfc, 0xde, 0x12,
+ 0x02, 0xaf, 0x01, 0x13, 0x0d, 0x00, 0xf4, 0x21, 0x42, 0x0e, 0xfb, 0x00,
+ 0x01, 0x32, 0x0f, 0x0a,
+ 0x0f, 0x00, 0x00, 0x00, 0x20, 0x74, 0x22, 0x00, 0xec, 0xbc, 0xff, 0x31,
+ 0x54, 0xcb, 0xef, 0x00,
+ 0xfd, 0xdc, 0x00, 0x20, 0x11, 0x10, 0x40, 0xfc, 0xdc, 0x6f, 0x21, 0x0f,
+ 0xfa, 0x30, 0x76, 0x20,
+ 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0xd0, 0x9b, 0x11, 0x23, 0x00, 0xcd,
+ 0x30, 0x0e, 0xdf, 0xb1,
+ 0x16, 0x40, 0xe0, 0xcd, 0x00, 0x00, 0xe0, 0xf1, 0x02, 0xef, 0xe3, 0xcf,
+ 0xb8, 0xeb, 0x00, 0x15,
+ 0x00, 0xd2, 0x62, 0x23, 0xdf, 0xee, 0x20, 0x40, 0x24, 0xf1, 0xeb, 0xfe,
+ 0xef, 0x11, 0x50, 0x21,
+ 0x22, 0x01, 0xf0, 0x40, 0x4d, 0xfb, 0xe0, 0x37, 0x22, 0xbe, 0xee, 0x00,
+ 0x12, 0xe0, 0xe0, 0xe2,
+ 0xbe, 0x2e, 0x70, 0x52, 0x04, 0x00, 0xe9, 0x2f, 0x52, 0x0f, 0xd8, 0x00,
+ 0x23, 0x12, 0xed, 0xfe,
+ 0x00, 0x1d, 0x00, 0xd1, 0xd0, 0x9d, 0x0c, 0x30, 0x00, 0xce, 0x47, 0x22,
+ 0xff, 0x0e, 0x00, 0x20,
+ 0x03, 0x04, 0x77, 0x12, 0xdf, 0x0f, 0x41, 0x01, 0xed, 0xdf, 0x11, 0x00,
+ 0xce, 0x00, 0x26, 0x72,
+ 0x00, 0xca, 0x10, 0x34, 0x21, 0xf0, 0xbd, 0x01, 0x03, 0x00, 0xf0, 0x15,
+ 0xef, 0xc0, 0x01, 0xf1,
+ 0xac, 0xef, 0x01, 0x14, 0x50, 0x01, 0x0d, 0x00, 0x17, 0x33, 0x0d, 0xbd,
+ 0x00, 0x00, 0xfd, 0x00,
+ 0x0f, 0xfb, 0x01, 0x14, 0xac, 0xfd, 0x31, 0x43, 0x0e, 0xfc, 0x00, 0x00,
+ 0x2d, 0x0d, 0x1e, 0x4c,
+ 0x2d, 0x44, 0x77, 0x01, 0xfe, 0x1f, 0x11, 0x02, 0xee, 0xde, 0xfe, 0xbe,
+ 0xc8, 0xee, 0x00, 0x22,
+ 0x02, 0x00, 0x3e, 0x60, 0x0f, 0x00, 0x02, 0x44, 0xef, 0xd8, 0x1f, 0x22,
+ 0xf1, 0xd0, 0xbd, 0x13,
+ 0x57, 0x11, 0x12, 0x34, 0x00, 0x11, 0x01, 0x00, 0xef, 0x23, 0x31, 0xa0,
+ 0xbd, 0xd8, 0xee, 0x00,
+ 0x64, 0x10, 0x2f, 0x1f, 0xf0, 0xe0, 0x0d, 0xda, 0x10, 0x42, 0xb0, 0xfe,
+ 0x30, 0x1d, 0xc0, 0xb1,
+ 0xf0, 0x01, 0x14, 0x00, 0xb2, 0x01, 0xf1, 0x00, 0x01, 0x25, 0xef, 0xed,
+ 0x33, 0x77, 0x57, 0x0f,
+ 0xdc, 0x00, 0xf0, 0xef, 0xf0, 0xf4, 0x00, 0x4c, 0x11, 0x00, 0xf0, 0x50,
+ 0x42, 0x47, 0x20, 0x00,
+ 0x0f, 0x20, 0x30, 0x01, 0x11, 0x61, 0x0f, 0xdb, 0x00, 0xd1, 0xdf, 0x1f,
+ 0x02, 0xd2, 0x05, 0xef,
+ 0x8c, 0xce, 0x1f, 0x12, 0x0f, 0xdd, 0x03, 0x56, 0x0f, 0x2c, 0x21, 0xf3,
+ 0x01, 0xde, 0x0d, 0x0c,
+ 0xe0, 0x11, 0xf1, 0xb0, 0xf3, 0x46, 0x10, 0xef, 0x00, 0x75, 0x42, 0x01,
+ 0xef, 0x1d, 0x20, 0xec,
+ 0xab, 0x01, 0xe2, 0xdb, 0xa9, 0xf0, 0x02, 0xf0, 0xce, 0x00, 0x31, 0x00,
+ 0xee, 0x1f, 0x60, 0x02,
+ 0x00, 0x00, 0x12, 0x47, 0x20, 0x31, 0x11, 0xf0, 0xc0, 0x0e, 0xf0, 0xf1,
+ 0xe3, 0xe0, 0xc0, 0xef,
+ 0xdd, 0xf1, 0x27, 0x10, 0xdf, 0x25, 0x31, 0xcc, 0xdb, 0xe0, 0x31, 0x75,
+ 0x7f, 0xdd, 0xee, 0xfe,
+ 0x0e, 0x00, 0x20, 0x76, 0x31, 0xdf, 0xfe, 0x44, 0x22, 0xfe, 0xe1, 0xf5,
+ 0xcf, 0xed, 0x00, 0x0f,
+ 0xc0, 0x14, 0x52, 0xf0, 0xee, 0x0c, 0x4d, 0x10, 0x0e, 0x32, 0x47, 0x02,
+ 0xcc, 0x0e, 0x23, 0x77,
+ 0x00, 0xdc, 0x00, 0x30, 0x00, 0x21, 0x43, 0x22, 0x0d, 0xab, 0x10, 0x01,
+ 0x10, 0x33, 0x01, 0xd1,
+ 0x22, 0x3f, 0xda, 0xbe, 0x00, 0x01, 0x22, 0xff, 0x8a, 0xff, 0xe0, 0x01,
+ 0x00, 0xe2, 0xe0, 0xcf,
+ 0x00, 0x12, 0x11, 0xe0, 0xd0, 0x14, 0x51, 0x36, 0x0f, 0x0e, 0x50, 0x30,
+ 0x25, 0x0f, 0xca, 0xe0,
+ 0xff, 0x01, 0x32, 0xb0, 0xce, 0xef, 0xd0, 0x05, 0x01, 0x02, 0x24, 0x12,
+ 0x10, 0x72, 0x75, 0x10,
+ 0x1d, 0x1f, 0x0e, 0xed, 0xfb, 0x00, 0x23, 0x42, 0xe0, 0xcd, 0x0f, 0x20,
+ 0x00, 0xb2, 0x06, 0x00,
+ 0xda, 0x00, 0x1f, 0xae, 0xdb, 0x30, 0x50, 0xfe, 0xbe, 0x00, 0x10, 0x1e,
+ 0x11, 0x14, 0x0d, 0xd9,
+ 0x20, 0x30, 0x43, 0xff, 0xbd, 0x00, 0x10, 0x21, 0x12, 0x00, 0x32, 0x67,
+ 0xf0, 0xbe, 0x0f, 0x2d,
+ 0x0e, 0x03, 0x25, 0x2f, 0xeb, 0xe0, 0x00, 0x05, 0xc0, 0xd0, 0x10, 0x12,
+ 0xa0, 0xe0, 0x0a, 0x0f,
+ 0xd0, 0x06, 0x10, 0xd0, 0x80, 0x00, 0x12, 0x01, 0x03, 0x34, 0x22, 0xc1,
+ 0xe0, 0x20, 0x75, 0x22,
+ 0xff, 0xcd, 0x00, 0x02, 0x31, 0x1a, 0x0e, 0xe0, 0x33, 0x3f, 0x1c, 0xfe,
+ 0x0e, 0x32, 0x11, 0x8c,
+ 0x02, 0x06, 0x0f, 0xea, 0xd0, 0x32, 0xe0, 0xaf, 0x1f, 0x20, 0x1e, 0x1e,
+ 0xf0, 0x02, 0x01, 0xeb,
+ 0xdd, 0x00, 0x63, 0xfe, 0xab, 0x00, 0x12, 0x00, 0xca, 0x30, 0x50, 0xef,
+ 0xfe, 0x40, 0x51, 0x17,
+ 0x34, 0x41, 0x00, 0xef, 0xe0, 0x03, 0x20, 0x02, 0xf2, 0x0f, 0x1e, 0x9c,
+ 0xfd, 0x11, 0x35, 0x00,
+ 0xcd, 0x10, 0x51, 0xd0, 0xeb, 0x00, 0x22, 0xd0, 0xa0, 0xfe, 0x05, 0x33,
+ 0x0f, 0xde, 0x26, 0x10,
+ 0xff, 0xde, 0x00, 0x35, 0xbf, 0xbc, 0xe1, 0x04, 0xc0, 0xfe, 0x10, 0x52,
+ 0x11, 0x26, 0x23, 0x11,
+ 0xf0, 0xf0, 0x32, 0x24, 0x2f, 0xd9, 0x8e, 0xae, 0xfd, 0x00, 0x04, 0x11,
+ 0x01, 0x1f, 0x2d, 0x3d,
+ 0x4f, 0x0d, 0x10, 0x43, 0x0e, 0xf8, 0x0b, 0x30, 0x62, 0x14, 0x02, 0xee,
+ 0x0f, 0x00, 0xee, 0xa0,
+ 0xf0, 0x00, 0x0e, 0xef, 0xef, 0x3e, 0x1c, 0x00, 0xc0, 0xcf, 0xf2, 0x36,
+ 0x72, 0x33, 0x23, 0xd8,
+ 0xce, 0x10, 0x2f, 0xdf, 0x8e, 0x01, 0x05, 0x12, 0x02, 0xef, 0xf0, 0x07,
+ 0x33, 0x30, 0xee, 0xee,
+ 0x00, 0x00, 0x10, 0x3f, 0x40, 0xcc, 0xac, 0x0e, 0x30, 0x05, 0x12, 0x00,
+ 0x0e, 0xf1, 0xf3, 0xef,
+ 0x0f, 0x03, 0xd2, 0x0e, 0x2f, 0xef, 0x88, 0xd0, 0x53, 0x34, 0x10, 0xee,
+ 0x00, 0x56, 0x22, 0x23,
+ 0x22, 0x00, 0xce, 0x02, 0x27, 0xc3, 0xdc, 0x1f, 0x00, 0xa2, 0xfc, 0xfa,
+ 0xf0, 0x0f, 0x3f, 0x50,
+ 0x40, 0x22, 0x0e, 0xfe, 0xe0, 0x43, 0x53, 0x00, 0xeb, 0xd0, 0x16, 0x41,
+ 0x0f, 0xe0, 0x13, 0x02,
+ 0xcd, 0xf9, 0xe0, 0x22, 0x53, 0x10, 0xff, 0xcb, 0x0f, 0x0f, 0xf0, 0xef,
+ 0xe2, 0x14, 0x72, 0x00,
+ 0xdd, 0x00, 0x77, 0x23, 0xfe, 0xee, 0x00, 0x00, 0xde, 0x2d, 0x74, 0x01,
+ 0xcf, 0x0b, 0x21, 0x12,
+ 0x00, 0x1f, 0xfc, 0xc1, 0xf5, 0xc0, 0xed, 0xff, 0xc1, 0xdf, 0xcb, 0xee,
+ 0x0f, 0x10, 0xf0, 0xee,
+ 0x40, 0x62, 0xfc, 0xeb, 0x00, 0x0e, 0x0f, 0xcc, 0x01, 0x27, 0x52, 0x12,
+ 0x12, 0x61, 0x00, 0x10,
+ 0x1d, 0x0d, 0x00, 0xff, 0xe0, 0x0f, 0xed, 0xe4, 0x06, 0xc0, 0x00, 0x03,
+ 0xe2, 0xd2, 0x11, 0x71,
+ 0x20, 0x08, 0x08, 0x60, 0x21, 0x02, 0xce, 0xfd, 0x10, 0x53, 0x12, 0x00,
+ 0x02, 0x26, 0x10, 0x01,
+ 0xe2, 0xf0, 0xf1, 0xbf, 0xef, 0xe1, 0x01, 0x3c, 0x6f, 0x13, 0x05, 0x0e,
+ 0xec, 0xde, 0x20, 0x70,
+ 0x22, 0x1d, 0xfc, 0x00, 0x10, 0xcd, 0x04, 0x27, 0x72, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x13, 0x00,
+ 0xbe, 0x1b, 0xb5, 0x40, 0x22, 0x1a, 0x5e, 0x40, 0x1c, 0x64, 0x13, 0xfa,
+ 0xde, 0x0f, 0x60, 0xef,
+ 0xbc, 0xdc, 0x04, 0x37, 0x40, 0xcd, 0x9b, 0x00, 0x00, 0x00, 0x00, 0xf2,
+ 0x23, 0x1e, 0xe0, 0x04,
+ 0x01, 0x12, 0xf3, 0xe2, 0x21, 0x7f, 0x30, 0x0b, 0xda, 0x1f, 0x20, 0x15,
+ 0x51, 0x01, 0xcf, 0xde,
+ 0x00, 0x30, 0xf0, 0x8d, 0xfb, 0x02, 0xf4, 0xe1, 0xff, 0xdb, 0x01, 0x32,
+ 0x52, 0x00, 0x0e, 0xef,
+ 0x0e, 0x00, 0x16, 0x12, 0xec, 0xcc, 0x10, 0x22, 0x72, 0x30, 0xfd, 0xe1,
+ 0x27, 0x71, 0x41, 0xfe,
+ 0x00, 0x40, 0xe2, 0xee, 0xfb, 0xc0, 0xde, 0xce, 0x1e, 0x24, 0x00, 0xdb,
+ 0x20, 0x4f, 0xf0, 0x03,
+ 0x50, 0x0d, 0xff, 0xcc, 0xea, 0x00, 0x12, 0x62, 0x20, 0x3f, 0x1f, 0x3e,
+ 0x5f, 0x2f, 0x0f, 0xd1,
+ 0x04, 0x1e, 0xea, 0x8f, 0xd2, 0x37, 0x22, 0xcc, 0xdf, 0x10, 0x12, 0x00,
+ 0x54, 0x20, 0xfd, 0xae,
+ 0x0d, 0x0e, 0xef, 0xe1, 0x03, 0xe3, 0xd2, 0xf2, 0x07, 0x27, 0xe0, 0xe0,
+ 0x72, 0x22, 0xf0, 0xbb,
+ 0x00, 0x02, 0xf0, 0xec, 0x00, 0x53, 0x00, 0x1f, 0x00, 0x20, 0x0f, 0x24,
+ 0x67, 0xf0, 0x0c, 0xf0,
+ 0xe3, 0xee, 0xeb, 0x00, 0xf2, 0x01, 0x72, 0x50, 0x01, 0x10, 0x0f, 0x00,
+ 0xf1, 0x13, 0x0e, 0xbb,
+ 0x00, 0x0f, 0xfe, 0xfe, 0x23, 0x73, 0x4f, 0xd9, 0x0f, 0x2f, 0x4e, 0x00,
+ 0x0f, 0x0f, 0xef, 0x08,
+ 0xed, 0xcf, 0xf3, 0x03, 0xec, 0xcf, 0x05, 0x55, 0x20, 0x30, 0x01, 0xd0,
+ 0x00, 0x1f, 0x51, 0x21,
+ 0xfc, 0xed, 0x13, 0x45, 0x1e, 0x00, 0xe0, 0xaa, 0x01, 0x22, 0x11, 0xf0,
+ 0xb0, 0x04, 0x03, 0x21,
+ 0xe5, 0xc0, 0x0e, 0x50, 0x15, 0xf0, 0x0f, 0x00, 0x31, 0x15, 0x10, 0x0e,
+ 0x00, 0x90, 0xdf, 0xef,
+ 0xc1, 0xf7, 0x17, 0xdf, 0x8e, 0x00, 0x00, 0x11, 0x11, 0x10, 0x0e, 0xba,
+ 0xdf, 0x00, 0x62, 0x20,
+ 0x0d, 0x10, 0x23, 0x0c, 0xcc, 0xff, 0x31, 0x33, 0xdf, 0xdd, 0x00, 0x53,
+ 0x04, 0x02, 0x01, 0x20,
+ 0x3b, 0x60, 0x00, 0xfd, 0xde, 0x0e, 0x0b, 0x0e, 0x00, 0xde, 0xba, 0xef,
+ 0x30, 0x44, 0x0f, 0x2e,
+ 0x72, 0x27, 0xe0, 0xff, 0x1e, 0x31, 0x00, 0xbc, 0x00, 0x13, 0x02, 0xe0,
+ 0x22, 0x27, 0xe1, 0xd1,
+ 0xf1, 0x82, 0xc0, 0x00, 0x20, 0x22, 0x15, 0x10, 0x4e, 0x2e, 0xf0, 0x00,
+ 0x40, 0x0d, 0xaf, 0x0f,
+ 0xec, 0xde, 0x0f, 0xfd, 0xee, 0xae, 0x00, 0x36, 0x6e, 0x2b, 0xf0, 0xe0,
+ 0x01, 0x54, 0x17, 0x03,
+ 0x8b, 0x0e, 0xe0, 0x02, 0x00, 0xfd, 0xe1, 0x03, 0x1e, 0xff, 0x04, 0x00,
+ 0x2d, 0x0a, 0x21, 0x32,
+ 0xfe, 0x0a, 0x70, 0x76, 0x10, 0x00, 0x00, 0x20, 0x20, 0x04, 0xe0, 0xff,
+ 0x00, 0x2f, 0x0f, 0xcf,
+ 0x02, 0x12, 0x30, 0x20, 0xef, 0xed, 0x3c, 0x61, 0x06, 0xe0, 0xdb, 0x21,
+ 0x10, 0x8f, 0xdd, 0x00,
+ 0x05, 0xf0, 0xad, 0x0f, 0x04, 0x11, 0xff, 0xfe, 0x1f, 0x61, 0x12, 0x3f,
+ 0x22, 0x0f, 0xcb, 0x01,
+ 0x01, 0x04, 0x57, 0x21, 0xf0, 0xdd, 0xcf, 0xcd, 0x00, 0xf3, 0xe4, 0xbf,
+ 0xd8, 0xef, 0x00, 0x01,
+ 0x51, 0x01, 0xfe, 0xef, 0x0f, 0xf0, 0x1d, 0x10, 0x0e, 0x0c, 0x4e, 0x2f,
+ 0x52, 0x22, 0x03, 0x37,
+ 0x04, 0xdf, 0xfe, 0x11, 0x77, 0x00, 0xd0, 0xeb, 0xd0, 0xb1, 0xb2, 0x00,
+ 0x02, 0x52, 0x0e, 0xed,
+ 0x00, 0x44, 0x00, 0xfb, 0x10, 0x00, 0x0b, 0x1f, 0x51, 0xf0, 0xcf, 0x0f,
+ 0x01, 0x03, 0x01, 0x03,
+ 0xe0, 0xcd, 0x10, 0x14, 0x03, 0xfc, 0xb8, 0x0e, 0x11, 0x63, 0xff, 0xeb,
+ 0x21, 0x33, 0x12, 0x13,
+ 0x0d, 0x0c, 0xd0, 0x81, 0xc2, 0x43, 0x1f, 0x09, 0xff, 0x00, 0x73, 0x15,
+ 0x10, 0x00, 0x00, 0x20,
+ 0x00, 0x0f, 0x1e, 0xfc, 0x12, 0x76, 0x50, 0xe0, 0xdc, 0x00, 0x30, 0x00,
+ 0xd0, 0xed, 0xf0, 0xe3,
+ 0xf0, 0xff, 0xc0, 0x00, 0x00, 0xf1, 0xa0, 0x0e, 0x33, 0x52, 0x0a, 0xd2,
+ 0x47, 0x12, 0x0c, 0xdc,
+ 0xce, 0xe0, 0x01, 0xe4, 0x44, 0x30, 0xe0, 0xc0, 0x00, 0x41, 0x10, 0x0f,
+ 0xcf, 0xee, 0xcd, 0xe0,
+ 0xf1, 0x27, 0x40, 0x2f, 0x36, 0x74, 0x10, 0x0e, 0x0f, 0x40, 0x27, 0xf0,
+ 0xd0, 0x00, 0xfe, 0xf0,
+ 0x9d, 0x0f, 0x00, 0x12, 0x32, 0x30, 0x11, 0x0f, 0xd1, 0x20, 0x22, 0xae,
+ 0xc8, 0xe8, 0x2f, 0x00,
+ 0xf1, 0xf3, 0x0f, 0xcb, 0x00, 0x22, 0xe0, 0xdd, 0xc0, 0x90, 0xce, 0x0c,
+ 0x0f, 0xf0, 0x45, 0x51,
+ 0x10, 0x1d, 0x2f, 0x10, 0x53, 0x26, 0x0e, 0xef, 0x40, 0x12, 0xe0, 0xec,
+ 0xf0, 0xe1, 0xd0, 0xdd,
+ 0x0f, 0x50, 0xef, 0xdf, 0x13, 0x77, 0x03, 0xfa, 0xde, 0x00, 0x03, 0x01,
+ 0xbf, 0xcf, 0x05, 0x03,
+ 0x23, 0xe2, 0xd5, 0x00, 0x4f, 0x50, 0x00, 0xe3, 0x00, 0x11, 0xd5, 0xc1,
+ 0xe1, 0x21, 0x4f, 0x0c,
+ 0xf0, 0x01, 0x74, 0x0a, 0x2e, 0x30, 0x41, 0x24, 0x00, 0x0d, 0xdd, 0xef,
+ 0xe0, 0x34, 0x55, 0xf0,
+ 0xaf, 0xfb, 0x00, 0x00, 0x01, 0x02, 0x0f, 0xdc, 0xbd, 0xec, 0xf0, 0x0e,
+ 0x0d, 0xee, 0xa0, 0xdd,
+ 0x1e, 0x70, 0x22, 0x12, 0x17, 0x35, 0x00, 0x2f, 0x10, 0x0f, 0x10, 0x03,
+ 0x11, 0x21, 0x00, 0xe2,
+ 0x02, 0x60, 0xd8, 0x90, 0x02, 0x45, 0x31, 0x21, 0x0f, 0xec, 0x0f, 0xe0,
+ 0x01, 0x37, 0x45, 0xed,
+ 0x9f, 0x0f, 0xe0, 0xd0, 0xf1, 0xe0, 0x02, 0x10, 0xee, 0xed, 0x23, 0x23,
+ 0xe1, 0x8e, 0xff, 0xc8,
+ 0x00, 0x65, 0x02, 0xf1, 0xff, 0xff, 0x01, 0x07, 0x22, 0x00, 0xff, 0xef,
+ 0xdf, 0x8e, 0xe0, 0x03,
+ 0x46, 0x1f, 0x0b, 0xf0, 0x20, 0x3f, 0x0e, 0x10, 0x77, 0x40, 0x0e, 0xdf,
+ 0x00, 0x20, 0xdf, 0xfe,
+ 0x20, 0x62, 0xff, 0xcc, 0x03, 0x34, 0x31, 0x40, 0xfc, 0xed, 0x0f, 0x00,
+ 0xdf, 0xda, 0xce, 0xbf,
+ 0x0f, 0x12, 0x41, 0x0f, 0x4e, 0x0f, 0x10, 0x26, 0x24, 0x10, 0x0e, 0xe1,
+ 0xe0, 0xdc, 0xce, 0xd0,
+ 0xe1, 0x80, 0xef, 0x05, 0x24, 0x40, 0x20, 0x14, 0xe1, 0xb0, 0x0d, 0x03,
+ 0x04, 0xe2, 0xf1, 0xde,
+ 0x9f, 0x02, 0x27, 0x00, 0x2a, 0xff, 0xef, 0xd0, 0x0e, 0x3f, 0x40, 0x10,
+ 0x22, 0x44, 0x00, 0xbd,
+ 0x05, 0x01, 0xd0, 0xc0, 0x07, 0x21, 0x00, 0x14, 0x73, 0x50, 0xfe, 0xee,
+ 0xe1, 0x05, 0x30, 0x0d,
+ 0xff, 0x53, 0x30, 0x0b, 0x30, 0x2f, 0x3f, 0x4f, 0xcc, 0x8c, 0xf0, 0x04,
+ 0x11, 0x21, 0x02, 0x02,
+ 0x42, 0x00, 0xeb, 0xeb, 0x4f, 0x4f, 0xfe, 0xef, 0x41, 0x23, 0xb0, 0xdb,
+ 0x00, 0x26, 0x32, 0xc0,
+ 0xaa, 0x0f, 0x31, 0x11, 0xe0, 0x01, 0x21, 0x30, 0xcb, 0xf0, 0x42, 0x53,
+ 0x01, 0xe0, 0x02, 0x0e,
+ 0x10, 0x35, 0x2f, 0x0e, 0x03, 0x80, 0xd9, 0x0e, 0x30, 0x23, 0xe4, 0x00,
+ 0xfd, 0xf0, 0x8e, 0xfb,
+ 0xf0, 0x13, 0x01, 0xff, 0xcc, 0xfe, 0xce, 0x01, 0x37, 0x02, 0x9d, 0x0c,
+ 0x00, 0x03, 0x0e, 0xfb,
+ 0x00, 0x2f, 0x00, 0x0e, 0xff, 0x30, 0x32, 0x77, 0x43, 0xf1, 0xd0, 0x12,
+ 0x43, 0x01, 0xde, 0xea,
+ 0xdf, 0xfe, 0xe0, 0x12, 0x44, 0x00, 0x0c, 0x50, 0x31, 0x10, 0x30, 0x1f,
+ 0x3f, 0xfc, 0xce, 0xed,
+ 0xdc, 0x01, 0x43, 0x11, 0x43, 0x14, 0x13, 0x06, 0xd2, 0xb0, 0x10, 0x53,
+ 0xee, 0xee, 0xe0, 0x20,
+ 0x64, 0x00, 0xcd, 0x00, 0x44, 0x15, 0x00, 0x01, 0x20, 0x01, 0xd6, 0xd1,
+ 0x1f, 0x7f, 0x11, 0x00,
+ 0x0a, 0x20, 0x20, 0x53, 0x20, 0x2a, 0x2f, 0x52, 0x33, 0xce, 0xa8, 0xff,
+ 0xee, 0x00, 0xef, 0xf2,
+ 0x03, 0xeb, 0xce, 0xd0, 0x21, 0x42, 0xf0, 0xc0, 0x00, 0x10, 0x01, 0xf0,
+ 0xdc, 0x43, 0x47, 0x02,
+ 0x30, 0x0e, 0x0e, 0x10, 0x4f, 0xf0, 0xc2, 0xe4, 0xce, 0xf1, 0xe4, 0x1e,
+ 0x5d, 0x47, 0x47, 0x00,
+ 0xde, 0x0f, 0x1f, 0x00, 0x00, 0x10, 0x8f, 0xea, 0x0f, 0x00, 0x13, 0xe1,
+ 0xd0, 0xb1, 0xa0, 0x0c,
+ 0x10, 0x42, 0x01, 0xe0, 0x0f, 0x3f, 0x0f, 0x4e, 0x51, 0x25, 0x01, 0xec,
+ 0x0f, 0x32, 0xf2, 0xe2,
+ 0xf7, 0x24, 0xc0, 0xc0, 0xfb, 0xce, 0xce, 0xd0, 0x00, 0x30, 0xff, 0x0d,
+ 0x5e, 0x40, 0x31, 0x10,
+ 0x21, 0xea, 0xba, 0x00, 0x00, 0x34, 0x00, 0x9e, 0xff, 0x00, 0x45, 0x10,
+ 0x30, 0x0e, 0xfe, 0x0e,
+ 0x0e, 0x2e, 0x3e, 0x14, 0xc3, 0x8d, 0xfe, 0x15, 0x30, 0x0e, 0xad, 0x01,
+ 0xf7, 0x06, 0xf0, 0xdf,
+ 0x1f, 0x20, 0xe0, 0xd0, 0xe0, 0xe0, 0xb0, 0xd0, 0x06, 0x12, 0x42, 0xdf,
+ 0x8c, 0x0f, 0x00, 0x37,
+ 0xd2, 0xbf, 0x0e, 0x30, 0x00, 0x20, 0x74, 0x11, 0x00, 0x0c, 0xdc, 0x00,
+ 0xe0, 0x0f, 0x2f, 0x11,
+ 0xe6, 0xe0, 0xfc, 0x0f, 0x32, 0xf4, 0x01, 0x71, 0x23, 0x00, 0x00, 0x52,
+ 0x0e, 0x0e, 0xf0, 0x0e,
+ 0xd8, 0x4d, 0x5f, 0x31, 0x20, 0xff, 0x0c, 0x30, 0x21, 0x00, 0x80, 0xe7,
+ 0x1f, 0x0c, 0xc0, 0x20,
+ 0x75, 0x21, 0x20, 0x0e, 0xeb, 0xf0, 0xf2, 0xff, 0xbf, 0xf0, 0x00, 0x00,
+ 0x36, 0xd1, 0xd0, 0x4f,
+ 0x21, 0xf2, 0x9f, 0x0c, 0x24, 0x34, 0xf0, 0xbd, 0x00, 0x00, 0x24, 0x50,
+ 0x10, 0x00, 0x00, 0x46,
+ 0x31, 0xdd, 0xd0, 0x21, 0x27, 0xa1, 0xf0, 0xfe, 0xd0, 0xe3, 0xd5, 0x11,
+ 0x30, 0x02, 0x9e, 0x0e,
+ 0x00, 0x33, 0x60, 0x1c, 0x0e, 0xdf, 0x00, 0x00, 0xcc, 0x02, 0x46, 0x20,
+ 0xdd, 0xad, 0x14, 0x41,
+ 0x0a, 0x0e, 0xe0, 0x02, 0x2f, 0xe8, 0xcf, 0xff, 0x00, 0x00, 0x10, 0x23,
+ 0x30, 0x00, 0x0e, 0x71,
+ 0x62, 0x00, 0xf0, 0xe1, 0x1d, 0x2a, 0xff, 0xec, 0x2f, 0x3f, 0x11, 0xe1,
+ 0xbc, 0x1c, 0x4f, 0x20,
+ 0x13, 0x00, 0xdb, 0x1e, 0x20, 0x11, 0x04, 0x04, 0xe1, 0xc0, 0xd2, 0xd4,
+ 0x54, 0x31, 0xe3, 0x82,
+ 0xc0, 0x0f, 0xef, 0x04, 0x04, 0xa0, 0x00, 0xf0, 0x0f, 0x24, 0x01, 0x24,
+ 0x73, 0x08, 0x0b, 0xf0,
+ 0x30, 0x31, 0x20, 0xe0, 0xee, 0x00, 0x06, 0xd0, 0xf0, 0x1f, 0x12, 0x83,
+ 0xec, 0xde, 0xf0, 0xf0,
+ 0x02, 0xeb, 0xbe, 0xf2, 0xe3, 0xfb, 0x2e, 0x72, 0x17, 0x12, 0x0e, 0xfe,
+ 0x0f, 0xdf, 0x0f, 0x1e,
+ 0x61, 0x22, 0x01, 0x0c, 0x0d, 0x0f, 0x76, 0x74, 0x22, 0xf0, 0xec, 0x00,
+ 0x20, 0x24, 0xee, 0xef,
+ 0x00, 0xef, 0xdf, 0x21, 0x77, 0x10, 0x0f, 0xf0, 0x00, 0xe0, 0xf9, 0x20,
+ 0x41, 0x14, 0xdf, 0xbd,
+ 0x0e, 0xf3, 0x23, 0x33, 0xdf, 0xde, 0x0f, 0x0d, 0xbf, 0x0e, 0x1b, 0x61,
+ 0x14, 0xf0, 0xda, 0x30,
+ 0x50, 0x23, 0x02, 0xd6, 0xd1, 0xc0, 0x00, 0xbe, 0xcd, 0xe0, 0xf1, 0xe0,
+ 0xc0, 0xe8, 0xd0, 0x20,
+ 0x75, 0x0f, 0xfe, 0x00, 0x0e, 0x0f, 0x30, 0x00, 0xe0, 0xff, 0x00, 0xdf,
+ 0x12, 0x77, 0x33, 0x01,
+ 0xdf, 0x0d, 0xe0, 0xef, 0x01, 0x57, 0x30, 0xff, 0xcd, 0xfe, 0xea, 0x00,
+ 0x30, 0x34, 0x51, 0x21,
+ 0x01, 0xff, 0x5f, 0x5f, 0x0d, 0xcb, 0xff, 0xff, 0xf0, 0x32, 0x0e, 0xbc,
+ 0x02, 0x26, 0x30, 0xe0,
+ 0xed, 0x70, 0x34, 0xf0, 0xbd, 0xfe, 0xf0, 0xf4, 0x03, 0xf3, 0x10, 0x01,
+ 0x00, 0x0c, 0xec, 0xcf,
+ 0x10, 0x72, 0x67, 0xff, 0xea, 0xff, 0x0f, 0x21, 0x04, 0x23, 0xe0, 0xdf,
+ 0xfe, 0x64, 0x63, 0x10,
+ 0x0d, 0xf0, 0x03, 0x2c, 0xfc, 0xef, 0x02, 0x14, 0x21, 0xf1, 0x9d, 0xfb,
+ 0x02, 0x23, 0x10, 0xec,
+ 0xd0, 0x15, 0x60, 0x0e, 0xec, 0x03, 0x02, 0x0f, 0xf0, 0x03, 0xfb, 0xfd,
+ 0x00, 0x00, 0xc0, 0xc0,
+ 0x0e, 0xb8, 0xff, 0x00, 0x24, 0x34, 0xf0, 0xfe, 0x40, 0x63, 0x42, 0x3f,
+ 0x1f, 0x02, 0xef, 0xda,
+ 0xed, 0xce, 0xe2, 0x07, 0x12, 0xff, 0xd0, 0xe0, 0x02, 0x01, 0x50, 0x3f,
+ 0x0c, 0xd0, 0x72, 0x53,
+ 0x0d, 0x1f, 0x47, 0x02, 0xc0, 0x0e, 0x0d, 0x00, 0x47, 0x00, 0xee, 0xbc,
+ 0xfe, 0x00, 0x30, 0xe2,
+ 0x8b, 0x0d, 0x03, 0x05, 0x0f, 0x0c, 0xe1, 0xe0, 0xf0, 0xdb, 0xed, 0x00,
+ 0x61, 0x35, 0x1f, 0x10,
+ 0x0f, 0x10, 0x33, 0x21, 0x00, 0xdf, 0x00, 0x40, 0x4b, 0xdf, 0xe0, 0x00,
+ 0x2e, 0xdc, 0x90, 0x01,
+ 0x3f, 0x3c, 0x10, 0xf0, 0x9b, 0xfa, 0xe0, 0xe1, 0x22, 0x20, 0xf0, 0x83,
+ 0xf6, 0x0f, 0x00, 0x23,
+ 0x17, 0x32, 0x31, 0xd0, 0x8f, 0xe0, 0x1e, 0x20, 0xf1, 0xd0, 0x34, 0x32,
+ 0xd0, 0x0c, 0x41, 0x33,
+ 0x22, 0x21, 0x53, 0x32, 0x1d, 0x1c, 0x41, 0x00, 0xf1, 0x16, 0xde, 0xec,
+ 0x1f, 0xde, 0xa0, 0xf1,
+ 0xdc, 0x9c, 0x01, 0x03, 0x20, 0x3e, 0xfa, 0xaa, 0xff, 0x22, 0x22, 0x1d,
+ 0xfb, 0xae, 0x0f, 0x00,
+ 0x30, 0xf2, 0xf0, 0x1e, 0x44, 0x30, 0xf8, 0xee, 0x21, 0x23, 0x55, 0x10,
+ 0x1d, 0x1e, 0x00, 0xf3,
+ 0xd1, 0xd0, 0x02, 0x22, 0xf1, 0xa2, 0xf2, 0x10, 0x20, 0x1e, 0x18, 0x2a,
+ 0x41, 0x52, 0x20, 0x00,
+ 0x9e, 0x01, 0xf1, 0xff, 0xe0, 0x07, 0x22, 0x0f, 0x8c, 0xdf, 0xfd, 0xf2,
+ 0x14, 0x41, 0x00, 0x00,
+ 0xe3, 0x00, 0x10, 0x16, 0x24, 0x02, 0x00, 0xff, 0x52, 0x22, 0xbc, 0x0f,
+ 0x01, 0xf2, 0xad, 0x0c,
+ 0x00, 0x20, 0x0f, 0x20, 0x42, 0x47, 0x01, 0xe9, 0xff, 0x40, 0x10, 0xe0,
+ 0xd0, 0x9a, 0xf0, 0x01,
+ 0x13, 0x5f, 0x0c, 0xe0, 0x00, 0x5f, 0x0f, 0xe0, 0x02, 0x00, 0x2f, 0x1e,
+ 0xe9, 0xcd, 0x0f, 0x41,
+ 0x22, 0x12, 0x63, 0x1f, 0x0e, 0x0c, 0x2e, 0x40, 0x33, 0x11, 0xf9, 0xf0,
+ 0xae, 0xef, 0xee, 0x05,
+ 0x76, 0xde, 0xd0, 0x13, 0x00, 0xc0, 0xd0, 0x07, 0xe0, 0xce, 0x00, 0x47,
+ 0x10, 0xff, 0x0f, 0x40,
+ 0x1f, 0x0f, 0xff, 0x40, 0x33, 0xe0, 0xaa, 0xff, 0x00, 0x00, 0xf0, 0xef,
+ 0xd5, 0xd2, 0x01, 0x0f,
+ 0x8f, 0x36, 0x63, 0x0e, 0xee, 0x22, 0x43, 0x0f, 0xfc, 0x01, 0x11, 0x12,
+ 0x00, 0xbd, 0x00, 0x00,
+ 0x14, 0xce, 0xec, 0xde, 0x00, 0x54, 0x53, 0x2f, 0x20, 0x00, 0x09, 0xfd,
+ 0xee, 0x31, 0x63, 0x00,
+ 0x0c, 0x00, 0xd0, 0xec, 0xfe, 0xe0, 0xd3, 0xd7, 0xce, 0xcd, 0xff, 0x1e,
+ 0x7d, 0x4f, 0x07, 0x47,
+ 0x00, 0xde, 0xfe, 0x0f, 0x33, 0x77, 0x00, 0xe0, 0x0f, 0x0f, 0x21, 0x00,
+ 0xd0, 0x0f, 0x20, 0x10,
+ 0xde, 0xe0, 0x0e, 0x30, 0x04, 0x03, 0xd0, 0xfe, 0x2f, 0x00, 0xb1, 0xe0,
+ 0xef, 0xd4, 0xe6, 0xad,
+ 0xde, 0xc0, 0xd3, 0xae, 0xeb, 0xff, 0xed, 0x00, 0x37, 0x40, 0xfd, 0xde,
+ 0xfc, 0xff, 0xef, 0xcd,
+ 0xbd, 0xef, 0x05, 0x05, 0x12, 0x00, 0x00, 0x74, 0x22, 0x32, 0x71, 0x2f,
+ 0xed, 0x01, 0x22, 0x00,
+ 0xfb, 0xd0, 0xfd, 0xca, 0x0f, 0x4f, 0x21, 0x14, 0xfe, 0xf9, 0x50, 0x40,
+ 0xe1, 0xbd, 0x0e, 0x00,
+ 0x2f, 0x22, 0x63, 0x27, 0x03, 0x10, 0x10, 0xfd, 0xe0, 0xd0, 0x30, 0x21,
+ 0xb1, 0xdc, 0xbb, 0xef,
+ 0xf3, 0x07, 0x45, 0x10, 0x10, 0x00, 0x4f, 0x50, 0x44, 0x10, 0x30, 0x0d,
+ 0xc0, 0x0f, 0xf0, 0xef,
+ 0x00, 0x61, 0x10, 0x08, 0xf0, 0x00, 0xf1, 0x01, 0x21, 0x0f, 0xad, 0xef,
+ 0xdf, 0xfe, 0xe2, 0xf4,
+ 0xf0, 0xde, 0xec, 0x00, 0xff, 0x2d, 0x70, 0x32, 0xfc, 0xd8, 0xd0, 0xf2,
+ 0xb0, 0xe0, 0xe0, 0x04,
+ 0xd2, 0x24, 0x50, 0xfc, 0xb0, 0x0f, 0x20, 0x76, 0x21, 0x01, 0x3e, 0x1c,
+ 0x11, 0x16, 0x01, 0xc0,
+ 0x00, 0x12, 0x10, 0xba, 0xe0, 0x10, 0x31, 0x00, 0xe0, 0xcb, 0xef, 0x9e,
+ 0xde, 0xd0, 0xe1, 0xe0,
+ 0x22, 0x12, 0xda, 0xbe, 0x20, 0x50, 0x15, 0x51, 0x22, 0x13, 0x70, 0x12,
+ 0x0f, 0xfb, 0x0f, 0x10,
+ 0x45, 0x00, 0xde, 0xb8, 0xf0, 0x01, 0x00, 0xd0, 0xc0, 0xf0, 0x01, 0x01,
+ 0x1a, 0x00, 0x2d, 0x00,
+ 0xd8, 0x21, 0x5f, 0x38, 0x5b, 0x22, 0x18, 0x38, 0xba, 0xde, 0x11, 0x10,
+ 0x00, 0x40, 0x63, 0x11,
+ 0x0b, 0xce, 0x2f, 0x00, 0xee, 0x9a, 0x22, 0x57, 0xed, 0x00, 0x32, 0xdd,
+ 0xde, 0x42, 0x25, 0xce,
+ 0x0f, 0x33, 0xfe, 0xcd, 0x00, 0x45, 0x21, 0x0e, 0xd0, 0x0f, 0x0f, 0xdc,
+ 0xbe, 0xf2, 0x06, 0x01,
+ 0x02, 0x20, 0xdd, 0xe0, 0x03, 0xf0, 0xa0, 0x25, 0x02, 0x42, 0x30, 0x0c,
+ 0xf0, 0x01, 0x12, 0x3f,
+ 0xff, 0xbf, 0xe0, 0x2b, 0x50, 0x01, 0x00, 0xfe, 0xba, 0xe0, 0xae, 0xef,
+ 0xf2, 0x02, 0x00, 0x20,
+ 0x47, 0x00, 0x02, 0x75, 0x30, 0xec, 0xf0, 0x12, 0x1f, 0x12, 0x25, 0xe0,
+ 0xfd, 0xe0, 0x1f, 0xff,
+ 0x8d, 0x0d, 0x30, 0x54, 0x00, 0x0e, 0x43, 0x1b, 0x1b, 0x20, 0x21, 0xee,
+ 0xe0, 0x07, 0xf1, 0xbe,
+ 0x0e, 0xc0, 0xcd, 0xcd, 0x14, 0x24, 0xf2, 0xcb, 0xdc, 0x11, 0x66, 0x11,
+ 0x0f, 0xfd, 0x10, 0x74,
+ 0x0f, 0xee, 0x10, 0x42, 0x13, 0xf0, 0xf0, 0x24, 0x10, 0xe2, 0xc3, 0xe0,
+ 0x02, 0xfe, 0xdc, 0xe0,
+ 0x02, 0x01, 0x06, 0x34, 0x10, 0xed, 0xd0, 0x12, 0x64, 0x52, 0x22, 0x20,
+ 0xdc, 0xfc, 0x14, 0x43,
+ 0x02, 0xbc, 0xfe, 0x00, 0xec, 0xab, 0x01, 0x04, 0x20, 0x30, 0x0f, 0x8b,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0x00, 0x4f, 0x1f, 0x0f, 0xee, 0x10, 0x17, 0x22, 0x0f, 0x0d, 0xd0, 0xf0,
+ 0xef, 0x0f, 0x40, 0x4f,
+ 0x3f, 0x52, 0x1b, 0xe8, 0xca, 0x00, 0x40, 0x1d, 0x70, 0x32, 0x00, 0xdf,
+ 0x1e, 0x50, 0x11, 0x22,
+ 0x15, 0x02, 0x00, 0xc0, 0xc1, 0xe3, 0xbf, 0xdb, 0xe0, 0xe6, 0xef, 0xce,
+ 0x11, 0x35, 0xf0, 0xf1,
+ 0x50, 0x41, 0x00, 0xef, 0x0e, 0x50, 0x16, 0xd0, 0xe0, 0x40, 0x35, 0xf0,
+ 0xaf, 0x0c, 0x0f, 0x23,
+ 0x32, 0xec, 0xff, 0x01, 0x22, 0x13, 0xff, 0xab, 0xe0, 0x05, 0x02, 0x01,
+ 0xe0, 0xec, 0xcf, 0xd0,
+ 0x00, 0x21, 0xef, 0x1a, 0x3f, 0x20, 0x50, 0x42, 0x0d, 0xdd, 0xf2, 0x45,
+ 0x42, 0x02, 0xdf, 0xdb,
+ 0xef, 0x3f, 0x71, 0x21, 0x31, 0x20, 0x0b, 0xbe, 0x0f, 0x53, 0x22, 0x20,
+ 0x56, 0x11, 0xfc, 0xfe,
+ 0xff, 0xe2, 0x23, 0x33, 0xef, 0xdd, 0x24, 0x02, 0x56, 0x88, 0xd1, 0x72,
+ 0xca, 0x11, 0x31, 0x00,
+ 0x00, 0xdc, 0x21, 0x63, 0xff, 0xcd, 0x00, 0x02, 0x02, 0x0f, 0x12, 0x04,
+ 0x00, 0x0f, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0xab, 0x00, 0xf0, 0xf0, 0xf2, 0xfe, 0x0c, 0x00, 0xe0,
+ 0xd3, 0x9e, 0xf0, 0x27,
+ 0x34, 0x1e, 0xed, 0xdf, 0xee, 0x0f, 0x31, 0x34, 0x33, 0x00, 0x9b, 0x00,
+ 0x01, 0x21, 0x00, 0x02,
+ 0x10, 0x51, 0x05, 0xf0, 0x00, 0x2e, 0x0b, 0x8a, 0xe0, 0x44, 0x10, 0x00,
+ 0xeb, 0x0f, 0x70, 0x10,
+ 0x0f, 0x10, 0x12, 0xcb, 0xef, 0x00, 0x23, 0xee, 0xbb, 0x12, 0x21, 0xf1,
+ 0x10, 0x45, 0x20, 0x00,
+ 0x00, 0x0e, 0xfe, 0xf0, 0xe0, 0x47, 0x02, 0xd0, 0xcd, 0x8c, 0x00, 0x02,
+ 0x01, 0x22, 0x0f, 0xe8,
+ 0xce, 0x10, 0x53, 0x22, 0xfe, 0x1f, 0x63, 0xef, 0xfd, 0x01, 0xf4, 0xf3,
+ 0x04, 0x63, 0x10, 0x1b,
+ 0xf0, 0xe0, 0x03, 0x00, 0x0d, 0xbe, 0x00, 0x00, 0x15, 0x23, 0x0c, 0x0e,
+ 0x52, 0x37, 0x00, 0xb0,
+ 0xce, 0xfd, 0x0e, 0x0f, 0xe0, 0x14, 0x46, 0xff, 0xad, 0x0e, 0x11, 0x02,
+ 0x13, 0x00, 0xef, 0x00,
+ 0x23, 0x40, 0x4d, 0x0a, 0x30, 0x45, 0x11, 0x12, 0x01, 0x0e, 0xde, 0x23,
+ 0x14, 0x88, 0x8d, 0xf0,
+ 0x02, 0x01, 0x25, 0x00, 0xef, 0x0d, 0x00, 0x33, 0x1e, 0x20, 0x32, 0x2f,
+ 0x50, 0x45, 0x24, 0x10,
+ 0x1f, 0x1c, 0x21, 0xe3, 0xb0, 0xec, 0xed, 0xef, 0x04, 0x23, 0xcf, 0xae,
+ 0xfe, 0xdc, 0xe8, 0x00,
+ 0x2e, 0x20, 0xd0, 0xdb, 0x00, 0x02, 0x11, 0xb0, 0xe0, 0xc3, 0x35, 0x00,
+ 0x0b, 0x00, 0x70, 0x61,
+ 0x00, 0x20, 0x00, 0x0e, 0xcc, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, 0x00,
+ 0x10, 0x31, 0x1d, 0x42,
+ 0x77, 0xa9, 0xfd, 0x77, 0xe1, 0xeb, 0x11, 0x35, 0xde, 0xde, 0x33, 0x22,
+ 0xdd, 0xdf, 0x21, 0x73,
+ 0x00, 0xeb, 0x01, 0x21, 0x00, 0xf1, 0x00, 0x00, 0x13, 0x00, 0xef, 0x0f,
+ 0xf1, 0x11, 0x10, 0x0d,
+ 0x30, 0x23, 0xba, 0x00, 0x71, 0x00, 0x0f, 0x10, 0x04, 0x02, 0xf0, 0xff,
+ 0x10, 0xde, 0xff, 0x44,
+ 0x01, 0xe1, 0xdc, 0x0a, 0x00, 0x01, 0xbc, 0xca, 0x30, 0x60, 0x0f, 0xfd,
+ 0x32, 0x42, 0x12, 0x0f,
+ 0xb9, 0xff, 0x00, 0x13, 0xde, 0xac, 0x01, 0x14, 0x01, 0x00, 0xf0, 0x0e,
+ 0x22, 0x35, 0x12, 0x0f,
+ 0xba, 0x00, 0x20, 0xf1, 0x00, 0x02, 0x72, 0x43, 0x0d, 0x0e, 0x55, 0x10,
+ 0x00, 0xd1, 0xf0, 0xd0,
+ 0x0c, 0xde, 0xc0, 0xcc, 0xf1, 0x02, 0xed, 0xaf, 0x02, 0x07, 0x47, 0xf1,
+ 0x0e, 0x40, 0xf0, 0x34,
+ 0x62, 0x01, 0x10, 0xfb, 0xef, 0x10, 0x01, 0x00, 0xe1, 0xe1, 0x25, 0x0f,
+ 0xed, 0xdf, 0xa0, 0xdc,
+ 0xf0, 0x72, 0x25, 0x1f, 0xfd, 0xdf, 0x00, 0x00, 0x11, 0x42, 0x1b, 0xd0,
+ 0xdf, 0x00, 0x66, 0x0f,
+ 0xeb, 0x00, 0x40, 0x22, 0x01, 0xcd, 0xcc, 0xee, 0x21, 0x76, 0x10, 0x0c,
+ 0xf0, 0x2d, 0x3f, 0x1d,
+ 0x20, 0x77, 0x10, 0xd0, 0xef, 0x00, 0x00, 0x00, 0xa0, 0xf3, 0xe2, 0xff,
+ 0xde, 0x20, 0x57, 0x13,
+ 0xfe, 0x0e, 0x0f, 0x0f, 0x02, 0x17, 0x11, 0xd0, 0xf0, 0x00, 0xbe, 0xdf,
+ 0x10, 0x00, 0xd0, 0xaa,
+ 0x0f, 0x0f, 0x00, 0x20, 0x71, 0x01, 0x0f, 0xdf, 0x00, 0x11, 0x37, 0x24,
+ 0xdf, 0xd0, 0x01, 0x15,
+ 0x53, 0xd3, 0x8f, 0xec, 0x00, 0xf0, 0xeb, 0xf0, 0x43, 0x52, 0x2d, 0x20,
+ 0x2f, 0x0e, 0x57, 0x32,
+ 0x0e, 0xdf, 0x0f, 0xf1, 0xf1, 0x0f, 0xfd, 0x88, 0x00, 0x54, 0xcb, 0x11,
+ 0x10, 0x10, 0x11, 0xca,
+ 0x01, 0x73, 0xfe, 0xec, 0x01, 0x12, 0x00, 0xfe, 0xf0, 0x11, 0x12, 0x00,
+ 0x22, 0x42, 0x33, 0xee,
+ 0xed, 0x10, 0x1d, 0x0c, 0x00, 0xe2, 0xa2, 0xeb, 0x00, 0x45, 0xee, 0x00,
+ 0x67, 0x11, 0xef, 0xee,
+ 0x00, 0x02, 0xfe, 0x1f, 0x77, 0x04, 0xdd, 0xdc, 0x00, 0x55, 0x00, 0x01,
+ 0xd0, 0x0f, 0x0e, 0xce,
+ 0xf0, 0xe0, 0xbc, 0xee, 0xd0, 0xf1, 0xe2, 0x1f, 0x41, 0x35, 0xef, 0x10,
+ 0x62, 0x01, 0x00, 0x02,
+ 0x0f, 0x1e, 0x21, 0xf3, 0x06, 0xce, 0x00, 0x02, 0xe0, 0xdf, 0x00, 0x00,
+ 0xfd, 0x59, 0x2f, 0x3e,
+ 0x61, 0x00, 0x08, 0x0f, 0x0e, 0x71, 0x31, 0x00, 0x11, 0xfe, 0xea, 0x00,
+ 0x00, 0xfe, 0xf1, 0x41,
+ 0x0d, 0x1f, 0xe0, 0x14, 0x16, 0x02, 0x03, 0xc0, 0x13, 0xff, 0xff, 0x51,
+ 0x01, 0x66, 0x21, 0x0f,
+ 0x0d, 0x35, 0x02, 0xf0, 0x21, 0x74, 0xec, 0x9a, 0x10, 0x22, 0x10, 0xf1,
+ 0xe0, 0x00, 0x31, 0x31,
+ 0xe0, 0xd0, 0xf0, 0xf0, 0x99, 0x00, 0x22, 0x34, 0xe0, 0xcc, 0x00, 0x12,
+ 0x0f, 0xb8, 0x00, 0xf1,
+ 0x03, 0x01, 0xbe, 0xed, 0x10, 0xd0, 0x8a, 0xf1, 0x12, 0x0f, 0xca, 0xf0,
+ 0x01, 0x62, 0x01, 0x01,
+ 0x10, 0x0f, 0x2e, 0x31, 0x22, 0x44, 0x02, 0xf0, 0xee, 0x2e, 0x63, 0xd8,
+ 0x11, 0x75, 0xee, 0xdc,
+ 0x01, 0x32, 0xe0, 0xcb, 0x01, 0x00, 0xbf, 0xfe, 0x01, 0x22, 0x00, 0xff,
+ 0x00, 0x22, 0x1e, 0x3f,
+ 0x30, 0x0f, 0xee, 0x2e, 0x74, 0x63, 0xfe, 0xe9, 0x00, 0x36, 0x11, 0x01,
+ 0x00, 0x0d, 0xdf, 0x13,
+ 0x03, 0xaa, 0xf0, 0xcf, 0xe0, 0xf0, 0xf0, 0x31, 0xf0, 0xcb, 0x10, 0x63,
+ 0x01, 0xf2, 0x0f, 0x09,
+ 0x00, 0x00, 0x23, 0x00, 0xff, 0xce, 0xcd, 0x0f, 0x22, 0x56, 0x00, 0x1e,
+ 0xeb, 0x00, 0x73, 0x0f,
+ 0x0e, 0x10, 0x01, 0xda, 0xcf, 0x00, 0x24, 0x12, 0xcf, 0xef, 0x00, 0xfb,
+ 0x80, 0xef, 0x00, 0x02,
+ 0x34, 0x25, 0x2f, 0xfc, 0x02, 0x23, 0x71, 0x31, 0x10, 0xcd, 0x02, 0x05,
+ 0x02, 0x00, 0x00, 0xfd,
+ 0xe0, 0xef, 0x9e, 0x0c, 0xed, 0xfb, 0x0e, 0x22, 0x42, 0x0c, 0xe9, 0xff,
+ 0x00, 0x31, 0x02, 0x32,
+ 0x15, 0xd1, 0xb1, 0x33, 0x41, 0xcd, 0xdf, 0x02, 0xc1, 0xdc, 0x1f, 0x7f,
+ 0x61, 0x0f, 0x08, 0x0f,
+ 0x20, 0x52, 0x03, 0x00, 0x0f, 0x1c, 0x00, 0xe6, 0xf0, 0x01, 0xe0, 0xed,
+ 0x0f, 0xcd, 0xe2, 0xd0,
+ 0xd0, 0xcc, 0xed, 0x11, 0x74, 0x10, 0xeb, 0x2e, 0x40, 0xda, 0xc0, 0x40,
+ 0x75, 0x13, 0x0f, 0xcb,
+ 0x01, 0x45, 0x00, 0xdf, 0x00, 0x02, 0x00, 0xd2, 0x12, 0x10, 0xf0, 0xee,
+ 0x21, 0x42, 0xf0, 0xdc,
+ 0xf1, 0xc3, 0x00, 0x26, 0x75, 0x30, 0x12, 0x55, 0x01, 0xf0, 0x01, 0x30,
+ 0x2d, 0xfe, 0xf0, 0xf0,
+ 0x00, 0xcf, 0xee, 0xff, 0xfc, 0x8a, 0xfd, 0xdc, 0xfe, 0x0f, 0x12, 0x56,
+ 0x11, 0x43, 0x10, 0xcc,
+ 0xff, 0x01, 0x23, 0xf1, 0xcf, 0xe0, 0x03, 0xfd, 0x08, 0x1f, 0x62, 0x13,
+ 0x0e, 0x08, 0xef, 0x1d,
+ 0x70, 0x34, 0x0f, 0x0f, 0x0e, 0xfe, 0xde, 0x1e, 0x52, 0x67, 0x02, 0xfd,
+ 0xfd, 0x12, 0xf0, 0xab,
+ 0x35, 0x00, 0x9c, 0x11, 0x00, 0x02, 0x01, 0x0f, 0x02, 0x55, 0xed, 0xbc,
+ 0x01, 0x47, 0x00, 0xcf,
+ 0x0f, 0x00, 0x0f, 0x10, 0x13, 0xff, 0x0e, 0x01, 0x20, 0x21, 0x12, 0x0d,
+ 0x00, 0x27, 0x01, 0xb0,
+ 0xee, 0x0f, 0x23, 0x13, 0xe0, 0xbd, 0x2e, 0x54, 0x00, 0xf0, 0x02, 0x11,
+ 0xfb, 0xee, 0xff, 0xf0,
+ 0x02, 0xf1, 0xbd, 0xfd, 0x27, 0x14, 0xfd, 0x3f, 0x60, 0xf0, 0xfb, 0x0d,
+ 0x30, 0xf0, 0xaa, 0xfe,
+ 0x33, 0x03, 0xd0, 0xfd, 0x10, 0x22, 0x43, 0x12, 0x47, 0x00, 0xf0, 0xdd,
+ 0xe0, 0x70, 0x55, 0x10,
+ 0x00, 0xeb, 0x20, 0x30, 0x01, 0x01, 0x32, 0x20, 0xde, 0x9b, 0x00, 0x10,
+ 0xf0, 0xf2, 0xbe, 0xdb,
+ 0x15, 0x11, 0x0f, 0x20, 0x50, 0x0f, 0xbd, 0x02, 0x31, 0x0c, 0x0e, 0xf2,
+ 0x07, 0x02, 0xce, 0x1d,
+ 0x13, 0x01, 0x01, 0x05, 0x91, 0xdf, 0xbc, 0xff, 0xef, 0x00, 0xc0, 0x0e,
+ 0x10, 0xfd, 0x10, 0x60,
+ 0xf0, 0xe4, 0x11, 0x40, 0x24, 0xf4, 0xe1, 0xed, 0x20, 0x17, 0xb3, 0xd0,
+ 0xed, 0x00, 0x50, 0x0e,
+ 0x10, 0x23, 0x0a, 0x2d, 0xed, 0xde, 0xf0, 0x02, 0x3e, 0x73, 0x4f, 0x08,
+ 0xdb, 0xd0, 0xf1, 0xc1,
+ 0x0f, 0x0d, 0xfb, 0x0f, 0x21, 0xf0, 0x2d, 0x7f, 0x72, 0x07, 0x01, 0x00,
+ 0x2e, 0x12, 0x17, 0x11,
+ 0xf0, 0xcf, 0x2e, 0x12, 0x8f, 0x00, 0xf2, 0xfe, 0xf8, 0x10, 0x63, 0x00,
+ 0xf0, 0xeb, 0x10, 0x4f,
+ 0xee, 0xe0, 0x10, 0x03, 0xc0, 0xe1, 0xf0, 0x12, 0x37, 0x12, 0x12, 0xee,
+ 0x0d, 0x00, 0xa0, 0x14,
+ 0x41, 0x30, 0xf1, 0xef, 0x0d, 0x7e, 0x00, 0x36, 0xe0, 0xb0, 0x16, 0x1f,
+ 0xec, 0x00, 0x12, 0x01,
+ 0xa0, 0xd0, 0xfe, 0x00, 0x00, 0x0f, 0x54, 0x25, 0x3f, 0x3c, 0x1e, 0x0e,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x24, 0x33, 0x40, 0xd1, 0x9f, 0x01, 0x07, 0xf4, 0xed, 0x0e, 0xed, 0x8c,
+ 0xdf, 0xfe, 0x00, 0x00,
+ 0xd0, 0xd0, 0xf0, 0x15, 0x40, 0x0e, 0x30, 0x77, 0x72, 0x1f, 0x1f, 0x45,
+ 0x00, 0xfe, 0x0d, 0x74,
+ 0x16, 0x01, 0x00, 0xe0, 0x00, 0x00, 0xff, 0xdb, 0xcd, 0xef, 0xee, 0xec,
+ 0xe0, 0xf0, 0x05, 0xf0,
+ 0xce, 0xf0, 0x23, 0x74, 0x10, 0x0f, 0x00, 0x02, 0xef, 0xed, 0x1e, 0x22,
+ 0x27, 0xfd, 0xc8, 0x21,
+ 0x32, 0x8f, 0xec, 0x11, 0x42, 0x03, 0x0f, 0xdb, 0x20, 0x0f, 0x00, 0xcf,
+ 0xf3, 0xf0, 0xcd, 0x3e,
+ 0x73, 0x15, 0xeb, 0xab, 0x21, 0x32, 0xf0, 0xff, 0x00, 0x10, 0x10, 0x06,
+ 0x22, 0x00, 0xc0, 0x00,
+ 0x03, 0x00, 0xac, 0x00, 0x00, 0x21, 0x40, 0x40, 0x0f, 0x0e, 0xcd, 0x00,
+ 0x05, 0x2f, 0xfc, 0x01,
+ 0x46, 0xe0, 0xe0, 0xf3, 0xd1, 0x14, 0x50, 0x2d, 0x10, 0x26, 0x51, 0x10,
+ 0xdd, 0xef, 0x11, 0x70,
+ 0x00, 0x00, 0x50, 0x2d, 0x1f, 0x0f, 0x02, 0x0c, 0xdf, 0x01, 0xfd, 0x19,
+ 0x1f, 0xbd, 0x80, 0xeb,
+ 0xfe, 0xdd, 0xce, 0x03, 0x10, 0x1b, 0x0c, 0xff, 0x21, 0x77, 0x14, 0xac,
+ 0x23, 0x55, 0xca, 0x00,
+ 0x42, 0x00, 0xef, 0xff, 0x10, 0x55, 0xff, 0xee, 0x00, 0x00, 0x14, 0xff,
+ 0xdc, 0x02, 0x30, 0x00,
+ 0xd0, 0x02, 0x00, 0xd0, 0x30, 0x50, 0x13, 0xee, 0xff, 0x02, 0xff, 0x0e,
+ 0x32, 0x21, 0x77, 0x44,
+ 0xbb, 0x00, 0x11, 0x21, 0x0f, 0x00, 0x15, 0x00, 0xad, 0xfe, 0x0f, 0x12,
+ 0x03, 0xcf, 0x0c, 0x0e,
+ 0x0e, 0x1f, 0x40, 0x24, 0xf1, 0xe5, 0xe0, 0x02, 0x10, 0xdd, 0xde, 0xe2,
+ 0xc5, 0x34, 0xcb, 0xce,
+ 0x71, 0x41, 0x0f, 0x2e, 0x32, 0x1f, 0x1b, 0x1f, 0xef, 0xbd, 0x0f, 0x10,
+ 0x0f, 0xd9, 0xff, 0x52,
+ 0x23, 0xf0, 0xab, 0x00, 0x24, 0x10, 0x1f, 0x31, 0x01, 0xf1, 0xce, 0xed,
+ 0x02, 0xe2, 0xd0, 0xe2,
+ 0x03, 0x90, 0xfe, 0x07, 0x23, 0x00, 0x07, 0x02, 0xff, 0xac, 0x0f, 0x31,
+ 0x72, 0x1f, 0xfb, 0xef,
+ 0xfe, 0x00, 0xf0, 0xef, 0xdf, 0x13, 0x56, 0x00, 0x23, 0x1f, 0x0e, 0x02,
+ 0xe1, 0x9f, 0xfd, 0xf0,
+ 0x05, 0x14, 0xf0, 0x91, 0xf2, 0x05, 0x00, 0x0d, 0x4f, 0x4e, 0x37, 0x31,
+ 0xbc, 0xdd, 0x20, 0x55,
+ 0x00, 0xfe, 0x11, 0x20, 0xed, 0xcd, 0x12, 0x36, 0xf0, 0xde, 0x00, 0x02,
+ 0x1e, 0xc9, 0xcf, 0x30,
+ 0x40, 0x01, 0xcf, 0x0e, 0x1f, 0x75, 0x53, 0x0f, 0x0f, 0x01, 0x02, 0x00,
+ 0xfc, 0xff, 0x01, 0x04,
+ 0xee, 0xdd, 0x00, 0x00, 0x21, 0x30, 0x04, 0xa0, 0x06, 0x00, 0xfe, 0x73,
+ 0x31, 0x27, 0x02, 0x00,
+ 0x00, 0xcc, 0x00, 0x45, 0x76, 0x00, 0x9c, 0x01, 0x24, 0x0f, 0xed, 0xee,
+ 0xf0, 0xd1, 0xff, 0x12,
+ 0x0d, 0xea, 0x0f, 0x00, 0x44, 0x00, 0x1f, 0x50, 0x00, 0x12, 0x00, 0x9d,
+ 0x01, 0x07, 0xf1, 0xee,
+ 0xef, 0x01, 0x02, 0x00, 0x23, 0x0f, 0x0f, 0x77, 0x34, 0xfe, 0xdd, 0xcb,
+ 0x10, 0x52, 0x00, 0xfd,
+ 0x10, 0x01, 0x1f, 0x0b, 0x00, 0x30, 0xff, 0xdc, 0x32, 0x20, 0xfa, 0x00,
+ 0xe0, 0xf0, 0x62, 0x44,
+ 0xee, 0xef, 0x20, 0x61, 0x27, 0xf0, 0xae, 0x21, 0x03, 0xee, 0xff, 0x32,
+ 0x10, 0x10, 0xff, 0xef,
+ 0x00, 0x33, 0x33, 0x76, 0x3f, 0xce, 0x03, 0xbe, 0xed, 0x03, 0x13, 0x16,
+ 0x0f, 0xca, 0x51, 0x43,
+ 0x00, 0x22, 0x00, 0x35, 0xdd, 0xbe, 0x24, 0x00, 0xed, 0xf1, 0xf3, 0xe4,
+ 0x00, 0xba, 0xff, 0xbf,
+ 0xeb, 0x10, 0x11, 0x00, 0x00, 0xbd, 0x0f, 0xef, 0x00, 0x67, 0x13, 0x01,
+ 0xff, 0x0d, 0x11, 0x32,
+ 0xfc, 0xff, 0x11, 0x20, 0x2f, 0x72, 0x23, 0x0f, 0xe4, 0xf3, 0xe0, 0x35,
+ 0x62, 0x0c, 0xff, 0x0e,
+ 0xc8, 0xdd, 0xf0, 0x00, 0xd1, 0xa0, 0x02, 0xe1, 0xfd, 0xfd, 0x2f, 0x18,
+ 0x20, 0x30, 0x02, 0x11,
+ 0x3f, 0x7e, 0x7c, 0x0c, 0x1f, 0x33, 0x14, 0x14, 0x23, 0x00, 0xf1, 0xf4,
+ 0x00, 0x00, 0xdc, 0xf0,
+ 0x90, 0xed, 0x88, 0xb8, 0x11, 0x12, 0xfe, 0x00, 0x03, 0x10, 0xed, 0xee,
+ 0x53, 0x24, 0xff, 0xee,
+ 0x00, 0x20, 0xf0, 0xd0, 0x35, 0x42, 0x00, 0x1f, 0xca, 0x00, 0x61, 0x01,
+ 0xef, 0x0e, 0xdf, 0xec,
+ 0x03, 0x02, 0xac, 0xff, 0x14, 0x10, 0xc9, 0xe0, 0x40, 0x03, 0x41, 0x12,
+ 0x1e, 0x1f, 0xde, 0x21,
+ 0x33, 0xf1, 0xf4, 0xc1, 0x00, 0x10, 0x32, 0xce, 0xf2, 0x57, 0xfd, 0x10,
+ 0x75, 0x10, 0xdb, 0x10,
+ 0x10, 0x0f, 0xfe, 0x50, 0x12, 0xdc, 0xbe, 0xfe, 0xe1, 0xd1, 0x00, 0xf0,
+ 0xe3, 0x04, 0x03, 0x0c,
+ 0xdd, 0x45, 0x43, 0x00, 0x77, 0x71, 0xfe, 0xfc, 0x10, 0x11, 0x04, 0x04,
+ 0xcc, 0x00, 0xf5, 0x00,
+ 0xbb, 0xd0, 0x23, 0xc8, 0x9a, 0xd0, 0xe6, 0xc7, 0xdd, 0xbb, 0xdd, 0xed,
+ 0xdc, 0xcd, 0xec, 0xdd,
+ 0xdd, 0xcd, 0xec, 0xcc, 0xbc, 0xed, 0xdd, 0xed, 0xdc, 0xcd, 0xdc, 0xcd,
+ 0xdc, 0xcc, 0xdd, 0xdd,
+ 0xcb, 0xce, 0xed, 0xdd, 0xdc, 0xcd, 0xdd, 0xcd, 0xeb, 0xde, 0xdd, 0xdd,
+ 0xcd, 0xdc, 0xcd, 0xdd,
+ 0xcc, 0xcc, 0xdd, 0xce, 0xdd, 0xdd, 0xbc, 0xed, 0xcd, 0xed, 0xdc, 0xcd,
+ 0xee, 0xed, 0xdc, 0xee,
+ 0xde, 0xde, 0xee, 0xdf, 0xf0, 0xe0, 0xff, 0xd0, 0xef, 0xdf, 0xd0, 0xe0,
+ 0xb0, 0xee, 0xbd, 0xdb,
+ 0xde, 0xcf, 0xd0, 0xcf, 0xde, 0xbe, 0xd0, 0xd0, 0xd0, 0xd2, 0xd7, 0xd5,
+ 0xd3, 0xb3, 0xd3, 0xe5,
+ 0xd3, 0xd4, 0xc2, 0xd4, 0xc4, 0xd2, 0xc4, 0xd3, 0xd3, 0xb3, 0xe3, 0xf3,
+ 0xe2, 0xf3, 0x05, 0x00,
+ 0xef, 0x0f, 0x0f, 0x1d, 0x2c, 0x0a, 0x0d, 0x7e, 0x2e, 0x2d, 0x3c, 0x4e,
+ 0x2d, 0x1c, 0x2d, 0x6d,
+ 0x2d, 0x0a, 0x1e, 0x1c, 0x0d, 0xdc, 0xdd, 0xcd, 0xdd, 0xbb, 0xcd, 0xee,
+ 0xef, 0xed, 0xcd, 0xdd,
+ 0xdc, 0xef, 0xee, 0xdd, 0xbd, 0xda, 0xee, 0xed, 0xed, 0xfd, 0x0d, 0xed,
+ 0x0f, 0x1f, 0x0d, 0x20,
+ 0x76, 0x22, 0x12, 0x03, 0x04, 0x47, 0x23, 0xd2, 0x65, 0x02, 0x80, 0xd0,
+ 0x25, 0x44, 0x01, 0xd0,
+ 0xd0, 0x02, 0x33, 0x00, 0xd0, 0xc0, 0xe2, 0xe2, 0xb1, 0x05, 0x03, 0xd0,
+ 0x8e, 0xe0, 0x27, 0x35,
+ 0x01, 0xbf, 0xdf, 0xe0, 0x12, 0x67, 0x32, 0x00, 0xbd, 0xfe, 0x00, 0x21,
+ 0x11, 0x45, 0x43, 0x00,
+ 0x10, 0x0e, 0x0f, 0x67, 0x45, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x00, 0xed,
+ 0x10, 0x40, 0x65, 0x33,
+ 0x10, 0x32, 0x32, 0x10, 0x0d, 0xec, 0x42, 0x67, 0x22, 0x10, 0x00, 0x0e,
+ 0xdc, 0xee, 0x65, 0x66,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x11, 0x21, 0x11, 0x00, 0x00, 0x31,
+ 0x45, 0x11, 0x0f, 0xce,
+ 0xcc, 0x11, 0x77, 0x34, 0xef, 0xf0, 0x10, 0x01, 0x00, 0x01, 0x22, 0x00,
+ 0x01, 0x45, 0x21, 0xf0,
+ 0xe0, 0x01, 0x01, 0x01, 0x22, 0x01, 0xbf, 0x00, 0x36, 0x11, 0xcf, 0xcd,
+ 0xf0, 0x54, 0x35, 0x21,
+ 0xf0, 0xdd, 0xde, 0x00, 0x32, 0xe0, 0xac, 0x33, 0x77, 0x01, 0x0f, 0xef,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x00, 0x11, 0x10, 0x22, 0x65, 0x11, 0x0f, 0xdb, 0x00, 0x74, 0x11, 0xfd,
+ 0xfe, 0x10, 0x0f, 0x00,
+ 0x22, 0x0f, 0xfc, 0xed, 0xfe, 0x55, 0x32, 0x0f, 0x0f, 0xed, 0x0f, 0x32,
+ 0xfd, 0xfe, 0x66, 0x11,
+ 0xee, 0xdc, 0xab, 0xf0, 0x55, 0x12, 0x00, 0xff, 0xee, 0xee, 0x01, 0x22,
+ 0xde, 0x01, 0x33, 0xdf,
+ 0x35, 0x75, 0x00, 0xef, 0xbd, 0xec, 0x23, 0x45, 0xff, 0x00, 0x12, 0x00,
+ 0xfe, 0xee, 0x00, 0x0f,
+ 0x54, 0x23, 0xff, 0xed, 0x11, 0x67, 0x01, 0xcd, 0xba, 0xff, 0x12, 0x22,
+ 0xef, 0xed, 0x00, 0x01,
+ 0x01, 0x01, 0xed, 0xff, 0x12, 0x23, 0x10, 0xed, 0x33, 0x77, 0xec, 0x0f,
+ 0x76, 0x00, 0xee, 0x54,
+ 0x33, 0x0f, 0xee, 0xdc, 0x00, 0x65, 0x00, 0x00, 0x12, 0x0f, 0xfe, 0x00,
+ 0x11, 0xec, 0xff, 0x32,
+ 0x21, 0x11, 0x10, 0xee, 0xfe, 0xcc, 0x99, 0x11, 0x65, 0x00, 0xef, 0x00,
+ 0x00, 0x11, 0x00, 0xff,
+ 0xef, 0x00, 0x23, 0x12, 0xee, 0x88, 0x00, 0x45, 0x10, 0xce, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0xba, 0xff, 0x11, 0x11, 0xef, 0x00, 0x23, 0xdd, 0xaa, 0x00,
+ 0x32, 0x00, 0xde, 0x00,
+ 0x00, 0xed, 0xee, 0x11, 0xdd, 0x88, 0xff, 0x44, 0x11, 0xde, 0xee, 0x00,
+ 0x00, 0xfe, 0x00, 0xce,
+ 0xdc, 0x65, 0x00, 0xdd, 0x00, 0xff, 0xfe, 0x01, 0x33, 0x00, 0xff, 0xdd,
+ 0xff, 0x44, 0x56, 0x00,
+ 0x00, 0x00, 0xfe, 0x00, 0xf0, 0xdc, 0x75, 0x11, 0xed, 0xdd, 0xff, 0x00,
+ 0x10, 0x66, 0x10, 0xcc,
+ 0xdd, 0x00, 0xf0, 0x00, 0x00, 0xee, 0x23, 0xff, 0x88, 0xfe, 0x33, 0xef,
+ 0xba, 0x00, 0x10, 0x21,
+ 0x00, 0xce, 0xfe, 0x00, 0x00, 0xff, 0x00, 0x21, 0x11, 0x00, 0xba, 0xcc,
+ 0xf0, 0x11, 0x21, 0xef,
+ 0xff, 0x00, 0xef, 0xee, 0xce, 0xfe, 0x02, 0x23, 0xbc, 0xca, 0xdd, 0x00,
+ 0x77, 0x01, 0xed, 0xff,
+ 0x01, 0x00, 0x00, 0x12, 0x21, 0xef, 0xab, 0x00, 0x00, 0xff, 0xee, 0x23,
+ 0x24, 0xde, 0xcd, 0x23,
+ 0x13, 0xde, 0x88, 0xff, 0x35, 0x00, 0xcf, 0xf0, 0x00, 0xef, 0x44, 0x54,
+ 0xee, 0xdd, 0xff, 0x12,
+ 0x45, 0xde, 0xcd, 0x33, 0x23, 0xed, 0xed, 0x22, 0x45, 0xcc, 0xee, 0x00,
+ 0x10, 0x21, 0xff, 0xdc,
+ 0x10, 0x52, 0x00, 0xfe, 0x0f, 0xba, 0xee, 0x32, 0x54, 0xff, 0xfe, 0x22,
+ 0x22, 0xfe, 0xbb, 0x00,
+ 0x01, 0x00, 0x13, 0x11, 0xcc, 0xfe, 0x67, 0x12, 0xfe, 0xee, 0x00, 0x55,
+ 0x00, 0xcb, 0xff, 0x43,
+ 0x11, 0x0f, 0x00, 0x22, 0xfe, 0xbb, 0x0f, 0x35, 0x42, 0xff, 0xce, 0x0f,
+ 0x22, 0x00, 0xef, 0x00,
+ 0x12, 0xdd, 0x89, 0x12, 0x34, 0xff, 0xee, 0x00, 0x00, 0xef, 0x00, 0x00,
+ 0x11, 0x00, 0xde, 0x00,
+ 0x44, 0xff, 0xdd, 0x34, 0xf0, 0x88, 0x01, 0x54, 0x00, 0xee, 0xff, 0x00,
+ 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0x11, 0xfe, 0x0f, 0xed, 0xdc, 0x63, 0x22, 0xeb, 0xed,
+ 0x0f, 0x0e, 0xeb, 0x61,
+ 0x21, 0xfe, 0x0e, 0xfc, 0xfd, 0x40, 0x77, 0x43, 0xeb, 0xdc, 0x10, 0x42,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x20, 0x0f, 0xfe, 0x00, 0x00, 0x1f, 0x74, 0x12, 0xfb, 0xee, 0x10, 0x77,
+ 0x10, 0xff, 0x0f, 0xf0,
+ 0x11, 0x32, 0xff, 0xaa, 0x0f, 0x44, 0x00, 0xdd, 0x11, 0x22, 0xff, 0x00,
+ 0x55, 0xf0, 0xcc, 0x00,
+ 0x13, 0x11, 0x01, 0x24, 0x00, 0xf0, 0x00, 0xd0, 0xbe, 0x35, 0x34, 0xdf,
+ 0x11, 0x11, 0x8c, 0xee,
+ 0x46, 0x00, 0xdf, 0x32, 0x22, 0xee, 0xde, 0x0f, 0x11, 0x33, 0x00, 0xfe,
+ 0x00, 0x0f, 0x10, 0x21,
+ 0x32, 0xff, 0x99, 0xdd, 0x00, 0x77, 0x00, 0xcd, 0x0f, 0x43, 0x23, 0xfe,
+ 0xb9, 0xff, 0x00, 0x32,
+ 0x76, 0xff, 0xee, 0x00, 0x32, 0x00, 0xed, 0x00, 0x12, 0x44, 0x21, 0xf0,
+ 0xfe, 0x11, 0x22, 0xf0,
+ 0xff, 0x67, 0x22, 0xde, 0xfe, 0x11, 0x45, 0x33, 0x00, 0xef, 0x22, 0x22,
+ 0x8b, 0x11, 0x47, 0x00,
+ 0xef, 0x00, 0x22, 0x00, 0xf0, 0x01, 0x12, 0xf0, 0x01, 0x43, 0x11, 0xde,
+ 0xf0, 0x77, 0x11, 0x00,
+ 0x22, 0x00, 0xff, 0x22, 0x01, 0x00, 0x00, 0x44, 0xf0, 0x35, 0x76, 0x00,
+ 0xde, 0xf0, 0x22, 0x64,
+ 0x01, 0xf0, 0x00, 0x00, 0x56, 0x22, 0xde, 0xcd, 0x34, 0x54, 0xee, 0xdd,
+ 0x12, 0x54, 0x01, 0x00,
+ 0xff, 0x00, 0x22, 0x00, 0xfe, 0x01, 0x67, 0x23, 0x0f, 0xed, 0x00, 0x23,
+ 0x44, 0x00, 0x0e, 0x01,
+ 0x11, 0xdb, 0x00, 0x75, 0x00, 0xff, 0x0f, 0x32, 0x22, 0xff, 0xee, 0x00,
+ 0x32, 0xff, 0xff, 0xee,
+ 0xcc, 0x66, 0x45, 0x00, 0xde, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff,
+ 0xcd, 0x11, 0x77, 0x22,
+ 0xcc, 0xdd, 0x00, 0x23, 0x00, 0x00, 0x11, 0x00, 0xbb, 0xff, 0x01, 0x11,
+ 0x00, 0xef, 0xa9, 0x00,
+ 0x43, 0x00, 0xba, 0x00, 0x32, 0x00, 0xee, 0xff, 0x10, 0x11, 0x00, 0x0f,
+ 0x0f, 0xee, 0xfe, 0x0f,
+ 0xde, 0xcc, 0x76, 0x32, 0xed, 0xbb, 0x00, 0x11, 0x00, 0xed, 0x00, 0x22,
+ 0x0f, 0x98, 0x00, 0x10,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0xee, 0x10, 0x54, 0x00, 0xcc, 0xff, 0x10,
+ 0x11, 0xdc, 0xee, 0x33,
+ 0x00, 0xab, 0x00, 0x33, 0xdc, 0xde, 0x21, 0x22, 0x9b, 0xfe, 0x00, 0x00,
+ 0xf0, 0xff, 0xed, 0xee,
+ 0x00, 0x11, 0x00, 0xaa, 0xca, 0xf0, 0x21, 0xf0, 0xdd, 0x21, 0x00, 0x8a,
+ 0x0f, 0x11, 0xf0, 0xdb,
+ 0xf0, 0x00, 0x00, 0xce, 0x0f, 0x00, 0x00, 0xdf, 0x00, 0xf0, 0x8a, 0xed,
+ 0x00, 0x44, 0x12, 0xcb,
+ 0xdd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xef, 0xdd, 0x00, 0x54,
+ 0x00, 0xdc, 0xdd, 0x00,
+ 0x65, 0x00, 0xfe, 0xee, 0xdd, 0x0f, 0x33, 0x34, 0xee, 0x88, 0xff, 0x43,
+ 0x22, 0xde, 0xee, 0x01,
+ 0x12, 0x00, 0xef, 0x00, 0xef, 0xbc, 0x23, 0x67, 0x01, 0xff, 0xee, 0xff,
+ 0x01, 0x22, 0x12, 0x00,
+ 0xdb, 0xde, 0x75, 0x22, 0xff, 0xff, 0x00, 0x00, 0x0f, 0x11, 0xfe, 0x98,
+ 0x10, 0x44, 0x00, 0xee,
+ 0xcd, 0xfe, 0x33, 0x46, 0x00, 0xac, 0xed, 0x00, 0x23, 0x11, 0xff, 0x00,
+ 0x01, 0xee, 0xdd, 0x01,
+ 0x33, 0xff, 0xef, 0x00, 0xde, 0xdd, 0x45, 0x00, 0xcc, 0x00, 0x75, 0x0f,
+ 0xcc, 0xfe, 0x12, 0x45,
+ 0x11, 0xee, 0xff, 0x11, 0x11, 0x00, 0x00, 0xff, 0x00, 0xff, 0x20, 0x77,
+ 0x00, 0xef, 0x0f, 0xff,
+ 0x22, 0x33, 0xa9, 0xef, 0x32, 0x32, 0x00, 0x00, 0xdd, 0xef, 0x10, 0xef,
+ 0x00, 0x77, 0x42, 0xfe,
+ 0xff, 0x34, 0x43, 0xee, 0x88, 0xee, 0x22, 0x45, 0x11, 0xff, 0xee, 0xf0,
+ 0x00, 0x00, 0x10, 0x32,
+ 0x32, 0x00, 0xde, 0xee, 0x20, 0x31, 0x21, 0x10, 0x0f, 0x0f, 0x0f, 0xfd,
+ 0x63, 0x77, 0x02, 0xeb,
+ 0x00, 0x21, 0x11, 0x00, 0x22, 0x77, 0x00, 0xed, 0x00, 0x44, 0x21, 0x00,
+ 0x00, 0x32, 0x01, 0xfe,
+ 0x22, 0x67, 0x00, 0xde, 0x00, 0x53, 0x12, 0x00, 0x12, 0x00, 0x0f, 0x0f,
+ 0xed, 0x25, 0x77, 0x22,
+ 0x10, 0xff, 0xff, 0x00, 0x00, 0x12, 0x77, 0x33, 0xcd, 0xf0, 0x01, 0x13,
+ 0x11, 0x34, 0x12, 0xe0,
+ 0xef, 0x11, 0x22, 0xdf, 0xf0, 0x77, 0x22, 0xf0, 0xcc, 0xde, 0x11, 0x24,
+ 0x53, 0x24, 0xff, 0xab,
+ 0x00, 0x01, 0x11, 0x32, 0x12, 0xef, 0xfe, 0x23, 0x44, 0xfe, 0xcd, 0xfd,
+ 0x24, 0x34, 0xf0, 0x0f,
+ 0x11, 0x76, 0x00, 0x00, 0xee, 0xf0, 0x11, 0x21, 0x00, 0x0f, 0x0f, 0x64,
+ 0x23, 0x0d, 0x0f, 0x0f,
+ 0x0f, 0x35, 0x10, 0xca, 0xee, 0x31, 0x53, 0xee, 0xff, 0xfd, 0x00, 0x77,
+ 0x22, 0xbc, 0xfe, 0x11,
+ 0x23, 0x0f, 0xff, 0xff, 0x00, 0x02, 0xfe, 0xdd, 0x00, 0x00, 0x36, 0x31,
+ 0xdf, 0xf0, 0x9d, 0x12,
+ 0x77, 0x13, 0xed, 0xfe, 0x01, 0x21, 0x22, 0x0f, 0xee, 0x22, 0x10, 0x11,
+ 0x25, 0xcc, 0xee, 0x43,
+ 0x00, 0xfe, 0x01, 0x14, 0x66, 0x11, 0xee, 0x00, 0x12, 0x00, 0xbe, 0xf0,
+ 0x25, 0x12, 0x10, 0xba,
+ 0xdf, 0x32, 0x54, 0x00, 0xee, 0xee, 0x10, 0x56, 0x10, 0xde, 0xef, 0x43,
+ 0x44, 0xed, 0xf0, 0x11,
+ 0x55, 0x23, 0xed, 0xcb, 0x00, 0x42, 0x33, 0x11, 0x10, 0x10, 0x0f, 0xbb,
+ 0x00, 0x43, 0x00, 0x0e,
+ 0x00, 0x00, 0x0f, 0xfe, 0xdc, 0xff, 0x11, 0x66, 0x00, 0xff, 0x21, 0x0e,
+ 0xcc, 0x22, 0x22, 0xee,
+ 0xdc, 0x01, 0x55, 0x00, 0xbc, 0x00, 0x32, 0xf0, 0xf0, 0xef, 0xcd, 0xdd,
+ 0x67, 0x23, 0xdd, 0xbc,
+ 0x00, 0x12, 0xec, 0x0f, 0x02, 0x0f, 0xef, 0x0f, 0xfe, 0x32, 0x21, 0xcb,
+ 0xcc, 0xef, 0x00, 0x0f,
+ 0x00, 0xff, 0xcc, 0x33, 0x00, 0x89, 0xde, 0x00, 0x20, 0xfe, 0xdd, 0xf0,
+ 0xfe, 0xdc, 0x0f, 0xff,
+ 0xf0, 0xf0, 0xbc, 0xcc, 0xfe, 0x00, 0x00, 0xf0, 0xdf, 0xab, 0x00, 0x00,
+ 0x0f, 0x77, 0x12, 0xed,
+ 0xcc, 0x00, 0x32, 0x23, 0x01, 0xef, 0xdb, 0x10, 0x43, 0xf0, 0xed, 0xee,
+ 0xdf, 0x15, 0xf0, 0xf0,
+ 0x53, 0xcd, 0x88, 0xf0, 0x01, 0x11, 0x01, 0x00, 0xec, 0xff, 0xef, 0xdd,
+ 0x22, 0x12, 0xaa, 0x12,
+ 0x44, 0xee, 0xbb, 0xff, 0x11, 0x11, 0x00, 0x00, 0x00, 0xcd, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0xee,
+ 0xa9, 0x00, 0x34, 0xde, 0x9b, 0x00, 0x11, 0x00, 0x00, 0xfe, 0xff, 0x12,
+ 0x11, 0xdc, 0xbb, 0x00,
+ 0x54, 0x23, 0xfe, 0xdc, 0x00, 0xff, 0xcb, 0x32, 0x32, 0x0f, 0x00, 0xf0,
+ 0xbd, 0x00, 0x33, 0x01,
+ 0xed, 0xdd, 0x0f, 0x32, 0x57, 0x00, 0xde, 0xff, 0xf0, 0x02, 0x23, 0xdd,
+ 0xff, 0x22, 0x01, 0xf0,
+ 0x00, 0xde, 0x8a, 0x00, 0x67, 0x21, 0xff, 0xcc, 0xee, 0x20, 0x22, 0x32,
+ 0x10, 0xfe, 0xfe, 0x10,
+ 0xfe, 0xdb, 0x10, 0x43, 0x10, 0xce, 0xbb, 0x21, 0x33, 0xcc, 0xbb, 0x00,
+ 0x33, 0x12, 0xff, 0xcc,
+ 0xed, 0x22, 0x66, 0xf0, 0xff, 0x12, 0x11, 0x12, 0x01, 0xe0, 0xcc, 0x21,
+ 0x66, 0x00, 0xee, 0x00,
+ 0x01, 0x22, 0x32, 0xcc, 0xed, 0x55, 0x10, 0xdd, 0xf0, 0x00, 0x21, 0x10,
+ 0xff, 0x01, 0x00, 0xdd,
+ 0x9a, 0x00, 0x12, 0x22, 0x00, 0xff, 0xcb, 0xff, 0x00, 0x21, 0x63, 0x0f,
+ 0xb8, 0xee, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x11, 0x24, 0xdd, 0xbd, 0x00, 0x23, 0x22, 0x10, 0xed,
+ 0xa8, 0x00, 0x22, 0x43,
+ 0x00, 0xfd, 0xcd, 0xff, 0x11, 0x21, 0x10, 0xfd, 0xd8, 0xff, 0x31, 0x73,
+ 0x32, 0xec, 0xbb, 0xff,
+ 0xfe, 0x10, 0x75, 0x11, 0xfe, 0xfd, 0x01, 0x22, 0xfd, 0xdb, 0x21, 0x64,
+ 0x00, 0xfe, 0x0f, 0x00,
+ 0x00, 0x23, 0x12, 0x0f, 0xfe, 0x00, 0x00, 0x10, 0x55, 0x22, 0x00, 0x00,
+ 0xdb, 0xcb, 0x41, 0x65,
+ 0xf0, 0x0f, 0x22, 0x00, 0xec, 0x00, 0x43, 0x00, 0x10, 0x23, 0x00, 0xf0,
+ 0xde, 0xbd, 0x02, 0x77,
+ 0x05, 0x00, 0x00, 0xef, 0x00, 0x24, 0x02, 0x11, 0xf0, 0xbf, 0xf0, 0x23,
+ 0x25, 0x00, 0xc0, 0xe0,
+ 0x12, 0x02, 0xcf, 0xef, 0x46, 0x11, 0xce, 0x13, 0x67, 0x0f, 0xee, 0x11,
+ 0x23, 0x12, 0x10, 0x0f,
+ 0xcd, 0x11, 0x77, 0x00, 0xee, 0x00, 0x23, 0x01, 0xed, 0xff, 0xff, 0x10,
+ 0x41, 0x13, 0xff, 0xf0,
+ 0x22, 0xfa, 0x9b, 0x10, 0x55, 0x10, 0x00, 0x11, 0x00, 0xfe, 0x00, 0x20,
+ 0x00, 0x54, 0x23, 0x00,
+ 0x0f, 0x0f, 0xec, 0xfe, 0x77, 0x23, 0x0f, 0x00, 0x01, 0xff, 0x02, 0x11,
+ 0xef, 0x34, 0x77, 0x00,
+ 0x01, 0x11, 0x00, 0x10, 0x23, 0x22, 0x22, 0x22, 0x01, 0x0f, 0x01, 0x67,
+ 0x11, 0x12, 0x00, 0xdf,
+ 0x44, 0x32, 0x00, 0x11, 0xf1, 0xf2, 0x77, 0x42, 0xf0, 0xf0, 0xf0, 0x01,
+ 0x24, 0x44, 0x01, 0xf0,
+ 0xf0, 0xe0, 0x01, 0x66, 0x12, 0x11, 0x00, 0xdf, 0xcf, 0x00, 0x67, 0x32,
+ 0x00, 0xe0, 0x21, 0x12,
+ 0x32, 0x75, 0x00, 0xf0, 0x12, 0x54, 0x00, 0xfe, 0x33, 0x34, 0x12, 0x32,
+ 0x11, 0x0f, 0xee, 0xfe,
+ 0x77, 0x43, 0xfe, 0xdc, 0x22, 0x34, 0xfe, 0xee, 0x11, 0x00, 0x00, 0x40,
+ 0x0e, 0x10, 0x77, 0xff,
+ 0xdc, 0x10, 0x21, 0x10, 0x0f, 0x0f, 0x00, 0x20, 0x00, 0x0f, 0x40, 0x23,
+ 0xee, 0xdb, 0x76, 0x32,
+ 0xbc, 0xde, 0x00, 0x10, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xfe, 0x00, 0xfe,
+ 0x98, 0xff, 0x00, 0x42,
+ 0x11, 0x0f, 0xde, 0xa9, 0xee, 0x10, 0x22, 0xef, 0x0f, 0xee, 0x00, 0x33,
+ 0xcd, 0xa8, 0x00, 0x32,
+ 0x10, 0x00, 0xdf, 0xdd, 0xdc, 0x41, 0x33, 0xcc, 0xdc, 0x00, 0x0f, 0xbd,
+ 0x00, 0x11, 0x0e, 0xee,
+ 0xcc, 0xff, 0x00, 0x0f, 0xcb, 0x0f, 0x31, 0xed, 0xcd, 0x00, 0x20, 0xfa,
+ 0xce, 0x30, 0x22, 0xbb,
+ 0xee, 0x00, 0x9c, 0xee, 0x11, 0x01, 0xcb, 0xff, 0x01, 0xdc, 0xac, 0x00,
+ 0x01, 0xf0, 0xf0, 0x00,
+ 0xff, 0xdc, 0xbb, 0xef, 0x11, 0x22, 0xee, 0x9b, 0xed, 0xfe, 0x00, 0x01,
+ 0x12, 0x11, 0xdc, 0x9a,
+ 0xf0, 0x0f, 0xff, 0x00, 0x10, 0x00, 0xef, 0xdc, 0xac, 0x0f, 0x01, 0xff,
+ 0xff, 0xff, 0xde, 0xdb,
+ 0x00, 0x13, 0xce, 0xbb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcc, 0x10, 0x22,
+ 0xdc, 0xed, 0x00, 0xbd,
+ 0xfe, 0x35, 0x53, 0x0f, 0xb8, 0xef, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0xe3, 0x01, 0x8f, 0x01,
+ 0x04, 0xd4, 0xf5, 0xd5, 0x25, 0xd7, 0x93, 0xd8, 0x32, 0x67, 0xf0, 0xcd,
+ 0x22, 0x24, 0x00, 0x11,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x55, 0x21, 0x31, 0x21, 0xf0, 0xac, 0x00,
+ 0x25, 0x10, 0x41, 0x45,
+ 0xf0, 0xde, 0xdc, 0xdd, 0x30, 0x77, 0x20, 0xef, 0xf0, 0xff, 0x00, 0x11,
+ 0x0f, 0xef, 0x43, 0x55,
+ 0xef, 0xbc, 0xff, 0x00, 0x23, 0x01, 0x00, 0x00, 0x00, 0xdf, 0x01, 0x14,
+ 0xf0, 0xdd, 0x01, 0x52,
+ 0x00, 0xca, 0xff, 0x44, 0x42, 0xdb, 0xef, 0x53, 0x33, 0xee, 0xff, 0x02,
+ 0xff, 0x01, 0x77, 0x00,
+ 0xff, 0xdd, 0x00, 0x57, 0x01, 0xdd, 0xcd, 0x22, 0x55, 0x00, 0x00, 0xee,
+ 0xfe, 0x33, 0x11, 0xfe,
+ 0x00, 0xfd, 0xed, 0x77, 0xf0, 0xec, 0x12, 0x31, 0xde, 0x0f, 0x12, 0x00,
+ 0xf0, 0xf0, 0x10, 0x77,
+ 0x00, 0xcd, 0xff, 0x00, 0x44, 0x22, 0x00, 0xbb, 0x0f, 0x22, 0x11, 0xfe,
+ 0x00, 0xff, 0x11, 0x31,
+ 0x00, 0x12, 0x00, 0xc8, 0xce, 0x31, 0x53, 0x00, 0xff, 0x21, 0xfe, 0xb9,
+ 0x00, 0x54, 0x23, 0xef,
+ 0xed, 0x12, 0x44, 0x00, 0xfe, 0x02, 0x02, 0x44, 0x43, 0xff, 0xed, 0x00,
+ 0x11, 0xff, 0xb9, 0x00,
+ 0x22, 0x54, 0x10, 0xed, 0xbb, 0x12, 0x33, 0xed, 0x00, 0x24, 0x00, 0xf0,
+ 0xf0, 0xcd, 0x11, 0x77,
+ 0x01, 0xff, 0xee, 0x02, 0x00, 0xde, 0x00, 0x34, 0x00, 0xf0, 0x35, 0xbf,
+ 0x8a, 0xf0, 0x12, 0x22,
+ 0x00, 0xef, 0xfe, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x21, 0x0f, 0x00,
+ 0xef, 0x0f, 0x77, 0x00,
+ 0xda, 0xf0, 0x00, 0x0e, 0x20, 0x74, 0x00, 0xf0, 0xfd, 0xee, 0xff, 0x0e,
+ 0x22, 0x46, 0x10, 0xef,
+ 0xee, 0x00, 0x0e, 0x1f, 0x00, 0xca, 0x30, 0x75, 0x0e, 0xcc, 0x31, 0x63,
+ 0xff, 0xec, 0xfe, 0x00,
+ 0x21, 0x10, 0xeb, 0xdf, 0x00, 0x11, 0xf0, 0xee, 0x00, 0xcf, 0xac, 0x11,
+ 0x25, 0xf0, 0xfe, 0x00,
+ 0xde, 0xdf, 0x12, 0x55, 0x22, 0xde, 0xbc, 0x00, 0x00, 0xdf, 0x33, 0x23,
+ 0x01, 0x24, 0x0f, 0x0e,
+ 0x43, 0xcd, 0x88, 0x11, 0x57, 0x00, 0xff, 0x00, 0x10, 0xe0, 0xde, 0x11,
+ 0x33, 0x0f, 0xfe, 0x00,
+ 0x00, 0xdc, 0x01, 0x44, 0xef, 0xbc, 0x10, 0x76, 0x01, 0xff, 0xef, 0xfe,
+ 0x00, 0x13, 0x13, 0x22,
+ 0xfe, 0xed, 0x55, 0x34, 0xee, 0xdd, 0x0f, 0x31, 0x76, 0x32, 0x00, 0xf0,
+ 0x10, 0x10, 0xfe, 0xcc,
+ 0x22, 0x33, 0x21, 0x52, 0x00, 0xdc, 0xee, 0xed, 0x0f, 0x54, 0x00, 0xea,
+ 0xee, 0xdf, 0xee, 0x10,
+ 0x30, 0xeb, 0x73, 0x45, 0xcd, 0xca, 0x00, 0x43, 0x12, 0xef, 0xff, 0xff,
+ 0x00, 0x23, 0x00, 0xbe,
+ 0x00, 0x03, 0xfe, 0xcc, 0x24, 0x55, 0xff, 0xcb, 0x00, 0x13, 0xdd, 0xcc,
+ 0x22, 0x43, 0xff, 0xff,
+ 0xee, 0xed, 0x00, 0x10, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xdd, 0xa8, 0xee,
+ 0x42, 0x43, 0xff, 0xee,
+ 0xee, 0x0d, 0xa8, 0x0e, 0x33, 0x12, 0xcd, 0xfe, 0x34, 0x10, 0xab, 0x00,
+ 0x12, 0x10, 0xed, 0x00,
+ 0x44, 0x0f, 0xee, 0x34, 0x32, 0xef, 0x00, 0x22, 0x00, 0x0f, 0x00, 0x00,
+ 0x77, 0x22, 0x11, 0x33,
+ 0x01, 0xab, 0xfe, 0x57, 0x22, 0xef, 0xee, 0x00, 0x23, 0x00, 0xff, 0xef,
+ 0x00, 0xe1, 0x02, 0xe0,
+ 0x89, 0xef, 0x12, 0x34, 0x00, 0xbe, 0xdd, 0x01, 0x44, 0x12, 0xed, 0xba,
+ 0x00, 0x33, 0x11, 0x00,
+ 0x00, 0xfe, 0x00, 0x01, 0xef, 0x12, 0x20, 0x00, 0x12, 0xdf, 0x89, 0x00,
+ 0x00, 0x22, 0x46, 0xde,
+ 0x9b, 0x00, 0x10, 0x11, 0x11, 0x11, 0x00, 0xed, 0x00, 0x33, 0x0f, 0x0f,
+ 0x23, 0xfe, 0x30, 0x50,
+ 0x0d, 0x00, 0x00, 0x44, 0x32, 0x0a, 0x99, 0x00, 0x10, 0x00, 0x22, 0x11,
+ 0xff, 0xce, 0x11, 0x20,
+ 0xd9, 0xe0, 0x63, 0x24, 0xef, 0xdd, 0x42, 0x33, 0x00, 0x0f, 0x0f, 0xef,
+ 0x01, 0xcb, 0xff, 0x76,
+ 0x20, 0x00, 0x10, 0x00, 0xbd, 0xfd, 0x33, 0x24, 0xff, 0xcd, 0xff, 0x35,
+ 0x31, 0xef, 0x00, 0xfe,
+ 0xcc, 0xf0, 0xf0, 0x0f, 0x20, 0x31, 0x8c, 0xdd, 0x06, 0x24, 0xf0, 0x01,
+ 0x01, 0xe0, 0x43, 0x24,
+ 0x8a, 0xe0, 0x55, 0x22, 0x00, 0x00, 0xed, 0xff, 0x44, 0x10, 0xff, 0x00,
+ 0xef, 0x22, 0x66, 0x11,
+ 0xff, 0xed, 0xff, 0x00, 0x21, 0x12, 0xfe, 0xdd, 0xee, 0xf0, 0x21, 0x33,
+ 0x0f, 0xa9, 0xff, 0x0f,
+ 0xff, 0x00, 0x10, 0xfd, 0x0d, 0x75, 0x32, 0xc9, 0xef, 0x11, 0xde, 0xbb,
+ 0x32, 0x54, 0xff, 0xee,
+ 0x10, 0x11, 0x00, 0x00, 0x02, 0xee, 0x00, 0x32, 0x22, 0x00, 0xf0, 0xf0,
+ 0xde, 0xed, 0x77, 0x75,
+ 0x0e, 0xdd, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x1f, 0xfc, 0x22, 0x00, 0xa8,
+ 0xef, 0x42, 0x43, 0xfe,
+ 0xba, 0x00, 0x23, 0x00, 0x00, 0x21, 0xf0, 0xde, 0xe0, 0x11, 0x12, 0x23,
+ 0x21, 0xff, 0x00, 0x23,
+ 0x00, 0xb8, 0x20, 0x75, 0x00, 0x0f, 0x00, 0xf0, 0xef, 0x11, 0x33, 0xff,
+ 0xed, 0xcd, 0x34, 0x76,
+ 0x0f, 0x0e, 0x11, 0x23, 0x00, 0xcc, 0x00, 0x76, 0x00, 0xf0, 0xf0, 0xf1,
+ 0x00, 0x01, 0xe1, 0x02,
+ 0xf1, 0xe0, 0xd0, 0x03, 0x47, 0x03, 0xcf, 0xde, 0x0f, 0x23, 0x24, 0xd0,
+ 0xac, 0x00, 0x35, 0x21,
+ 0xf0, 0xef, 0xde, 0x74, 0x45, 0xee, 0x0f, 0x21, 0x00, 0xde, 0x10, 0x52,
+ 0x0f, 0x00, 0x01, 0xea,
+ 0xff, 0x01, 0x00, 0x23, 0xe0, 0x88, 0xdf, 0x10, 0x42, 0x00, 0xed, 0xff,
+ 0x21, 0x10, 0x0d, 0xeb,
+ 0xff, 0x72, 0x43, 0x0f, 0xfd, 0x11, 0x10, 0xf9, 0xf0, 0x01, 0x33, 0x21,
+ 0xe0, 0xef, 0x00, 0x11,
+ 0xff, 0x53, 0x77, 0x13, 0x00, 0x02, 0x00, 0xba, 0x00, 0x44, 0x11, 0x00,
+ 0x00, 0x10, 0x00, 0x02,
+ 0x15, 0x10, 0xcf, 0xdd, 0x43, 0x33, 0xde, 0x01, 0x14, 0xf0, 0x00, 0x13,
+ 0xf2, 0x8c, 0xeb, 0x42,
+ 0x34, 0xef, 0x01, 0x32, 0x00, 0xce, 0xee, 0x11, 0xec, 0x9d, 0x07, 0x12,
+ 0x0f, 0x01, 0x00, 0xde,
+ 0xe0, 0xf2, 0x55, 0x20, 0xfe, 0xfe, 0xbb, 0x00, 0x77, 0x01, 0x0f, 0x00,
+ 0x10, 0x00, 0x20, 0x22,
+ 0x00, 0x00, 0x00, 0x53, 0x34, 0x00, 0xfc, 0x00, 0x10, 0xff, 0xdc, 0xee,
+ 0xcc, 0x00, 0x62, 0x01,
+ 0xfb, 0xfe, 0x0d, 0x0d, 0xee, 0xe0, 0xf0, 0xfc, 0x0c, 0x0d, 0x41, 0x42,
+ 0xdd, 0xa9, 0x00, 0x00,
+ 0xff, 0xff, 0xbd, 0xed, 0x23, 0x21, 0xe0, 0x27, 0x00, 0x8b, 0xee, 0x21,
+ 0x23, 0xef, 0xdd, 0x00,
+ 0xfd, 0x98, 0x00, 0x23, 0x00, 0xbb, 0xff, 0x01, 0x00, 0xee, 0xff, 0xf0,
+ 0x20, 0x33, 0xe0, 0x8a,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0xe0, 0x0f, 0x00, 0x0e, 0x0e, 0x01, 0x00,
+ 0x02, 0x23, 0xb9, 0xfe,
+ 0x63, 0x0f, 0xb8, 0x01, 0x22, 0xff, 0xed, 0x00, 0xfd, 0x00, 0x44, 0xee,
+ 0xcc, 0x00, 0x01, 0x10,
+ 0x10, 0xfd, 0xff, 0x0f, 0xee, 0x33, 0x00, 0xcd, 0x00, 0x04, 0x10, 0x0c,
+ 0xce, 0xad, 0xca, 0x11,
+ 0x02, 0xcd, 0x01, 0x15, 0xde, 0xac, 0xdf, 0xde, 0xf0, 0x15, 0x54, 0x10,
+ 0xce, 0xcd, 0x00, 0x11,
+ 0x00, 0x12, 0x35, 0x00, 0xfe, 0xf0, 0xfd, 0x22, 0x24, 0xbc, 0x0f, 0x55,
+ 0x00, 0xec, 0x00, 0xde,
+ 0xef, 0x23, 0x12, 0xad, 0xfd, 0x32, 0x11, 0xed, 0xdd, 0xa9, 0xf1, 0x27,
+ 0x10, 0x00, 0xfe, 0xf0,
+ 0x10, 0x51, 0x0f, 0x01, 0x67, 0x10, 0xff, 0x11, 0x32, 0x0f, 0x0e, 0x30,
+ 0x10, 0x24, 0x52, 0xfd,
+ 0xfd, 0x34, 0x11, 0xdc, 0xf0, 0x43, 0x34, 0x0f, 0xbc, 0x11, 0x34, 0x21,
+ 0x00, 0x40, 0x66, 0x01,
+ 0xff, 0x00, 0x10, 0x12, 0x66, 0x10, 0xee, 0x11, 0x57, 0xf0, 0xbd, 0x00,
+ 0x32, 0x11, 0x00, 0x00,
+ 0xff, 0x00, 0x22, 0x00, 0xf0, 0x32, 0xfe, 0xca, 0x32, 0x32, 0xef, 0xd0,
+ 0xff, 0x01, 0x03, 0x8b,
+ 0xef, 0x43, 0x23, 0xa9, 0x01, 0x15, 0x00, 0xdd, 0xf0, 0x22, 0x11, 0xf0,
+ 0x0f, 0x21, 0xf0, 0xce,
+ 0x20, 0x5f, 0x0d, 0x02, 0x01, 0xec, 0x55, 0x22, 0xdd, 0xef, 0x23, 0x00,
+ 0x33, 0x77, 0x00, 0xcb,
+ 0xf0, 0x00, 0x23, 0x34, 0x00, 0xde, 0x0f, 0x0e, 0xde, 0x64, 0x57, 0x00,
+ 0x0f, 0x10, 0x0f, 0x0f,
+ 0x00, 0xcc, 0x11, 0x77, 0x00, 0xee, 0x00, 0x00, 0xf0, 0x32, 0x33, 0xe0,
+ 0xef, 0xef, 0xff, 0x42,
+ 0x22, 0xee, 0x0f, 0x00, 0xf0, 0xfe, 0x31, 0x10, 0xa9, 0x11, 0x54, 0x32,
+ 0x0f, 0xa8, 0xff, 0x53,
+ 0x11, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x25, 0x21, 0x00,
+ 0xef, 0x54, 0x00, 0xdd,
+ 0x67, 0x23, 0x00, 0x11, 0x32, 0xdd, 0xde, 0x67, 0x22, 0x0f, 0x00, 0xe0,
+ 0xfe, 0x10, 0x30, 0xcd,
+ 0x00, 0x66, 0x00, 0x00, 0x00, 0x21, 0x00, 0xed, 0x1f, 0x77, 0x01, 0xef,
+ 0x00, 0x00, 0x00, 0x21,
+ 0x13, 0xf0, 0x9e, 0xf0, 0x15, 0x00, 0x00, 0xf2, 0xdf, 0xf2, 0x05, 0x00,
+ 0xf0, 0xef, 0xbf, 0xe0,
+ 0xf3, 0xf3, 0xdf, 0x00, 0x32, 0x30, 0xfc, 0x88, 0xff, 0xf0, 0xfd, 0x11,
+ 0x45, 0x0f, 0xdc, 0xff,
+ 0x11, 0x21, 0xbd, 0xff, 0x57, 0x12, 0xce, 0xfe, 0x11, 0x0e, 0xde, 0x46,
+ 0x00, 0xcd, 0x10, 0x40,
+ 0x0f, 0x0f, 0x0e, 0xdc, 0x21, 0x43, 0x1f, 0x1e, 0x3f, 0xf9, 0xcd, 0x30,
+ 0x63, 0x0f, 0xed, 0xfc,
+ 0xfe, 0x20, 0x0d, 0xdb, 0xe0, 0x00, 0x21, 0x9d, 0xca, 0xf0, 0x01, 0x0f,
+ 0xee, 0x00, 0x33, 0x0e,
+ 0x89, 0x00, 0x11, 0x11, 0x00, 0xed, 0xef, 0x02, 0x10, 0x24, 0x01, 0xbf,
+ 0x04, 0x14, 0xbd, 0x00,
+ 0x66, 0x00, 0xef, 0x01, 0x24, 0x00, 0x01, 0x00, 0x1e, 0x52, 0x02, 0xff,
+ 0xff, 0xfe, 0x00, 0xf0,
+ 0xef, 0x04, 0x46, 0xe0, 0xbd, 0x01, 0xf2, 0xa9, 0x00, 0x36, 0x00, 0xef,
+ 0x11, 0x21, 0xdf, 0xdd,
+ 0x62, 0x34, 0xff, 0xfe, 0x41, 0x44, 0x00, 0xff, 0x02, 0x33, 0x31, 0x22,
+ 0x14, 0xf0, 0xdc, 0x2f,
+ 0x71, 0x22, 0xf0, 0xcc, 0x00, 0x45, 0x0d, 0xfa, 0xef, 0xed, 0x3f, 0x40,
+ 0xdd, 0xdd, 0x22, 0x0e,
+ 0x0c, 0x50, 0xda, 0xd0, 0x21, 0x00, 0x20, 0x0f, 0x8b, 0xf2, 0x14, 0xbd,
+ 0xee, 0x21, 0x34, 0xe0,
+ 0xbe, 0xff, 0x02, 0x04, 0x00, 0xcb, 0xff, 0x45, 0xe0, 0xbe, 0x11, 0x10,
+ 0xed, 0xfe, 0x21, 0x00,
+ 0xd0, 0x02, 0xfd, 0xeb, 0x11, 0xd0, 0x8b, 0x10, 0x00, 0xec, 0x01, 0xf0,
+ 0xac, 0xff, 0x00, 0xf0,
+ 0xed, 0xea, 0x20, 0x20, 0xef, 0xcc, 0xff, 0x00, 0x00, 0xfe, 0x0f, 0xdd,
+ 0x88, 0x10, 0x42, 0x00,
+ 0xf0, 0x01, 0x0f, 0x20, 0x21, 0x01, 0x20, 0x22, 0xf0, 0x35, 0x73, 0x40,
+ 0x1f, 0x20, 0x23, 0x17,
+ 0x11, 0x10, 0x10, 0x21, 0x35, 0x00, 0xef, 0x51, 0x03, 0x8f, 0xf0, 0xf0,
+ 0xe0, 0xef, 0x02, 0xd0,
+ 0xdb, 0x01, 0x22, 0xe0, 0xd4, 0x8a, 0xcd, 0x13, 0x23, 0x0f, 0x01, 0x16,
+ 0x00, 0xfe, 0x00, 0x23,
+ 0xf0, 0xee, 0x00, 0x10, 0x24, 0xe2, 0x8a, 0xdd, 0x20, 0x22, 0x04, 0xe1,
+ 0xef, 0xbb, 0xe0, 0x14,
+ 0xe0, 0xbe, 0x00, 0x31, 0x20, 0xef, 0x02, 0x02, 0xfd, 0x1d, 0x72, 0x30,
+ 0x0c, 0x00, 0x00, 0x3e,
+ 0x6f, 0x08, 0x0f, 0x02, 0x0f, 0xed, 0xfe, 0x12, 0x44, 0xfc, 0x20, 0x54,
+ 0xee, 0xee, 0x32, 0x62,
+ 0xe8, 0x0f, 0x54, 0x00, 0xec, 0x0f, 0x10, 0x12, 0x21, 0x22, 0x11, 0x00,
+ 0xed, 0x30, 0x55, 0x10,
+ 0x10, 0x00, 0x20, 0x40, 0x0f, 0x0f, 0xd8, 0xff, 0x73, 0x53, 0xfc, 0xfd,
+ 0x0e, 0xdb, 0x01, 0x46,
+ 0x00, 0xbf, 0x00, 0x01, 0xf0, 0xef, 0xf0, 0x05, 0x00, 0xa0, 0x02, 0x34,
+ 0x00, 0x01, 0x02, 0x12,
+ 0x00, 0x01, 0x66, 0x53, 0x00, 0x00, 0x23, 0x23, 0x0e, 0x13, 0x24, 0xdd,
+ 0x01, 0x77, 0x00, 0x0f,
+ 0xf0, 0x04, 0x12, 0x0f, 0x0e, 0xfd, 0x00, 0x10, 0xf0, 0xce, 0xed, 0x0f,
+ 0x20, 0xc9, 0xce, 0x42,
+ 0x00, 0x88, 0x00, 0x20, 0x0f, 0xee, 0x00, 0x0f, 0x0d, 0x0e, 0x21, 0x11,
+ 0xdd, 0xfe, 0x43, 0x01,
+ 0x88, 0x00, 0x35, 0xf0, 0x00, 0x22, 0xee, 0xde, 0x21, 0x10, 0x00, 0x10,
+ 0x0e, 0x51, 0x20, 0xfa,
+ 0x0f, 0x30, 0x0f, 0xfe, 0x1e, 0xfd, 0xac, 0x01, 0x13, 0x9b, 0xef, 0x10,
+ 0x22, 0x11, 0x00, 0xdf,
+ 0xee, 0x0d, 0x09, 0x52, 0x22, 0xef, 0xe0, 0x04, 0x01, 0xb0, 0xff, 0x12,
+ 0x35, 0x12, 0xf1, 0x02,
+ 0x13, 0xbf, 0xee, 0x77, 0x33, 0x00, 0x0e, 0x0e, 0xff, 0x21, 0x77, 0x10,
+ 0x00, 0x12, 0x20, 0x0e,
+ 0x42, 0x26, 0xff, 0xef, 0x00, 0x22, 0x01, 0x10, 0x23, 0x26, 0xf1, 0xb0,
+ 0xe1, 0xd1, 0x9f, 0xef,
+ 0x04, 0x06, 0xc1, 0xf1, 0x01, 0x00, 0x00, 0xe2, 0xd4, 0xc1, 0x11, 0x62,
+ 0x12, 0x25, 0x10, 0xed,
+ 0x1f, 0x43, 0x33, 0x43, 0x11, 0x00, 0xba, 0x0f, 0x32, 0x34, 0x24, 0xff,
+ 0x9b, 0xf0, 0x01, 0x01,
+ 0xde, 0x00, 0x10, 0x0f, 0xcb, 0xef, 0xfe, 0x0d, 0x71, 0x1f, 0xe8, 0xfe,
+ 0x1f, 0x1f, 0x0d, 0x30,
+ 0x62, 0x11, 0x0f, 0xea, 0xef, 0x22, 0x22, 0xdf, 0x00, 0x45, 0x00, 0xf0,
+ 0x50, 0x30, 0xf0, 0x02,
+ 0x24, 0x21, 0x72, 0x20, 0x0e, 0x01, 0x37, 0x22, 0x21, 0x31, 0x52, 0xf0,
+ 0xbe, 0x04, 0xf3, 0xf1,
+ 0x57, 0x11, 0xef, 0xdf, 0xf1, 0x12, 0xf0, 0xf0, 0x34, 0x00, 0x8c, 0xef,
+ 0x26, 0x21, 0x00, 0x20,
+ 0x41, 0x00, 0xf0, 0x02, 0xf1, 0xf0, 0x31, 0x31, 0xae, 0xbc, 0xe0, 0xf2,
+ 0xe8, 0xff, 0x23, 0xe1,
+ 0xce, 0xf0, 0x33, 0x64, 0x0e, 0x01, 0x47, 0x11, 0x10, 0x01, 0x00, 0x20,
+ 0x66, 0x11, 0x00, 0x22,
+ 0x0e, 0x0e, 0x41, 0x01, 0x0f, 0x02, 0xfe, 0x0c, 0x41, 0x20, 0xf9, 0xcf,
+ 0xef, 0xed, 0x1d, 0x60,
+ 0x0f, 0xea, 0x00, 0xf0, 0xab, 0xed, 0x0f, 0x2f, 0x10, 0x0e, 0xdc, 0xcd,
+ 0xfe, 0x10, 0x10, 0xef,
+ 0xde, 0xee, 0xed, 0xf0, 0x00, 0xe0, 0x01, 0xb2, 0x8a, 0xed, 0x0e, 0x0d,
+ 0x00, 0x02, 0xb9, 0xdc,
+ 0xf0, 0xee, 0xda, 0x0f, 0x30, 0xe0, 0x8c, 0xef, 0x00, 0xff, 0xfd, 0x00,
+ 0xe0, 0xdf, 0xdd, 0xf0,
+ 0x00, 0xcc, 0xee, 0xf0, 0xed, 0xee, 0x10, 0x0d, 0xcc, 0xc2, 0x07, 0x00,
+ 0xea, 0xde, 0x00, 0xe0,
+ 0x00, 0x60, 0xee, 0xbc, 0x0f, 0x2e, 0xfc, 0xfe, 0x72, 0x11, 0xea, 0xee,
+ 0x10, 0x1f, 0xff, 0x22,
+ 0x53, 0xea, 0x0e, 0x71, 0x00, 0xdb, 0x00, 0x00, 0xfe, 0x20, 0x01, 0xce,
+ 0xce, 0xf1, 0xe1, 0xbc,
+ 0x00, 0x00, 0xce, 0xd1, 0xf7, 0xe2, 0xc0, 0xbf, 0x00, 0x01, 0xec, 0xd0,
+ 0xe1, 0xc0, 0x12, 0x47,
+ 0xef, 0xef, 0x23, 0x32, 0x10, 0x1f, 0x10, 0x32, 0x52, 0x21, 0x00, 0xcb,
+ 0xd0, 0xf2, 0xe0, 0xf6,
+ 0xe2, 0x8f, 0xed, 0x01, 0x01, 0xde, 0x01, 0x26, 0xff, 0xdf, 0x01, 0x5f,
+ 0x1b, 0x0f, 0xf1, 0xf0,
+ 0x32, 0x77, 0x42, 0x0f, 0xef, 0x00, 0x11, 0x22, 0x20, 0x1e, 0x1d, 0x20,
+ 0x20, 0x41, 0x64, 0x1f,
+ 0x10, 0x47, 0x56, 0x00, 0xfe, 0x0e, 0x40, 0x32, 0x26, 0xf0, 0xcd, 0x00,
+ 0x10, 0x0f, 0x77, 0x32,
+ 0x00, 0xfe, 0x00, 0x12, 0x21, 0x43, 0x10, 0xfe, 0xdf, 0x04, 0x44, 0x0e,
+ 0x0e, 0x45, 0x01, 0xe0,
+ 0x11, 0x43, 0x00, 0xfd, 0x00, 0x16, 0x01, 0xf0, 0x20, 0x20, 0xf2, 0xc1,
+ 0x8e, 0xef, 0x04, 0xe4,
+ 0xf1, 0x02, 0xf0, 0xe2, 0xd3, 0xf1, 0x44, 0x34, 0xe1, 0xc0, 0x33, 0x53,
+ 0x00, 0x00, 0x0a, 0xfa,
+ 0x21, 0x56, 0xf0, 0xff, 0x0f, 0x10, 0x00, 0x01, 0xe2, 0xe1, 0x11, 0x71,
+ 0x31, 0x01, 0x02, 0xc0,
+ 0xef, 0x51, 0x2e, 0xc8, 0x21, 0x43, 0x0d, 0x1e, 0x74, 0x45, 0x05, 0x05,
+ 0x57, 0x00, 0x69, 0x00,
+ 0xbf, 0x05, 0xbb, 0x02, 0xbb, 0x06, 0x1b, 0x07, 0x77, 0x22, 0x00, 0x0f,
+ 0x0e, 0x0e, 0x01, 0xf6,
+ 0xe1, 0x31, 0x2e, 0x9b, 0x00, 0x65, 0xf0, 0xe0, 0x30, 0x0f, 0x0f, 0x52,
+ 0xf1, 0xcf, 0x10, 0x43,
+ 0x10, 0x0f, 0x00, 0xe0, 0x1e, 0x12, 0x00, 0xee, 0x21, 0x67, 0xee, 0xea,
+ 0x01, 0x24, 0x11, 0xfd,
+ 0x10, 0x73, 0x03, 0xc0, 0x0d, 0x31, 0x47, 0x00, 0xd0, 0xf1, 0x23, 0x5f,
+ 0x13, 0x05, 0xcc, 0x00,
+ 0x44, 0x20, 0xce, 0x0f, 0x47, 0x10, 0xe0, 0x0f, 0x32, 0x22, 0x00, 0x41,
+ 0x13, 0xee, 0x00, 0x47,
+ 0x50, 0xf0, 0x0e, 0x31, 0x02, 0x0f, 0x01, 0x14, 0xfe, 0x4f, 0x75, 0x12,
+ 0xd0, 0xf0, 0x21, 0x00,
+ 0x12, 0x37, 0xf0, 0xbe, 0x34, 0x20, 0xef, 0x32, 0x03, 0xcd, 0x21, 0x56,
+ 0x00, 0x00, 0x30, 0x11,
+ 0xf0, 0x9e, 0x02, 0x57, 0x00, 0x0c, 0x02, 0x25, 0xff, 0xef, 0x00, 0x11,
+ 0x01, 0x21, 0xf1, 0xe0,
+ 0x21, 0x73, 0xfe, 0xbc, 0x27, 0x12, 0xfe, 0x1f, 0x52, 0xe0, 0xff, 0x21,
+ 0x02, 0xf0, 0x11, 0x20,
+ 0x0d, 0x20, 0x05, 0x00, 0xaf, 0x0f, 0x53, 0x04, 0x0f, 0x0f, 0xf1, 0x00,
+ 0x0f, 0x1f, 0xf0, 0x21,
+ 0x2c, 0xdd, 0x15, 0x1f, 0x29, 0x50, 0xf1, 0xb0, 0x22, 0x64, 0xea, 0xcd,
+ 0x10, 0x56, 0xf0, 0xfe,
+ 0x0f, 0xf0, 0x03, 0x10, 0xff, 0x0d, 0x0f, 0x31, 0x03, 0xd0, 0xfc, 0x60,
+ 0x25, 0xe0, 0xe0, 0x2e,
+ 0x40, 0x10, 0xdf, 0x00, 0x17, 0x61, 0x00, 0xde, 0xff, 0x0f, 0x52, 0xf3,
+ 0xcb, 0xff, 0x32, 0x11,
+ 0xff, 0xdd, 0xfc, 0x75, 0x36, 0xff, 0xee, 0x12, 0xf1, 0xef, 0x40, 0x22,
+ 0x10, 0x2f, 0x04, 0x24,
+ 0xd0, 0xfd, 0x53, 0xe0, 0xfe, 0x73, 0x41, 0xcd, 0x07, 0x14, 0x1e, 0x0d,
+ 0x11, 0x24, 0x01, 0xed,
+ 0xde, 0x33, 0x53, 0xfe, 0x01, 0xfe, 0xf8, 0x51, 0x33, 0x00, 0xbd, 0x00,
+ 0x31, 0x20, 0xee, 0xf0,
+ 0x5f, 0x1f, 0xf0, 0xb1, 0x27, 0x23, 0xd8, 0xf0, 0x21, 0x11, 0x01, 0x00,
+ 0x20, 0x0d, 0xef, 0x02,
+ 0x03, 0x9c, 0xff, 0x22, 0x41, 0xfd, 0x0f, 0x01, 0xce, 0xe0, 0x27, 0x72,
+ 0xe9, 0xdf, 0x11, 0x13,
+ 0xee, 0xfe, 0x00, 0x00, 0xbc, 0x01, 0x02, 0xdb, 0xf0, 0x40, 0x20, 0xcc,
+ 0xbe, 0x02, 0x0e, 0xbc,
+ 0x10, 0x22, 0xfb, 0xac, 0x00, 0x0e, 0xef, 0x00, 0x12, 0x10, 0xf9, 0xef,
+ 0x1f, 0xff, 0x00, 0x56,
+ 0xff, 0x9c, 0x00, 0x31, 0x00, 0xfd, 0xff, 0x24, 0x22, 0xfd, 0xdd, 0xff,
+ 0x30, 0x41, 0xdf, 0xe2,
+ 0xf1, 0xcb, 0x10, 0xff, 0xbf, 0x01, 0x00, 0x0f, 0xec, 0x8e, 0xf0, 0x12,
+ 0xe9, 0xef, 0x33, 0x43,
+ 0xda, 0xef, 0x01, 0xc0, 0x0e, 0x11, 0x23, 0x0d, 0xdd, 0x22, 0xf1, 0x8b,
+ 0xd1, 0x04, 0xeb, 0xef,
+ 0x11, 0xf0, 0xae, 0x0f, 0x02, 0x14, 0x03, 0xad, 0x0b, 0x0f, 0x10, 0xf0,
+ 0xd0, 0x03, 0x00, 0x0e,
+ 0xdd, 0x8a, 0x0f, 0x10, 0x13, 0xd0, 0x0c, 0xf0, 0x12, 0x0c, 0xfb, 0xf0,
+ 0xe4, 0x00, 0x0e, 0xdd,
+ 0xfe, 0x11, 0x40, 0xac, 0xf1, 0x04, 0x00, 0x65, 0xdb, 0xbc, 0x10, 0x12,
+ 0xf0, 0xef, 0x00, 0x2e,
+ 0x0e, 0xf1, 0xf0, 0xde, 0x13, 0x54, 0x0b, 0x0d, 0xff, 0x01, 0xe2, 0xff,
+ 0x3f, 0x7d, 0x0d, 0xdc,
+ 0xed, 0xe1, 0x00, 0x4a, 0x2d, 0xe0, 0xa0, 0xdb, 0x24, 0x74, 0xeb, 0xee,
+ 0x10, 0xf0, 0xfe, 0x33,
+ 0x00, 0x8e, 0x03, 0x12, 0x1f, 0x0b, 0xd0, 0x00, 0x1f, 0x17, 0x15, 0xef,
+ 0xee, 0x30, 0x20, 0x00,
+ 0x72, 0x26, 0xdf, 0xbe, 0x00, 0x30, 0x23, 0xf0, 0xe0, 0x41, 0x02, 0xd0,
+ 0x15, 0x10, 0xed, 0x21,
+ 0x02, 0xe0, 0x23, 0x52, 0xb8, 0x00, 0x30, 0x10, 0xce, 0x11, 0x43, 0xfc,
+ 0xef, 0x11, 0x33, 0x1c,
+ 0x0f, 0x03, 0xa0, 0xfa, 0x10, 0x20, 0xd0, 0xf0, 0x14, 0x21, 0xec, 0xef,
+ 0x10, 0xfe, 0xef, 0x73,
+ 0x75, 0xdd, 0xcc, 0x21, 0x42, 0xdd, 0xfb, 0x22, 0x43, 0x00, 0x00, 0xcc,
+ 0xec, 0x00, 0x40, 0x20,
+ 0xe0, 0xde, 0xfc, 0x30, 0x3d, 0xee, 0xe0, 0xe3, 0xf1, 0xca, 0x3f, 0x70,
+ 0xff, 0xfc, 0x00, 0xe3,
+ 0xe1, 0xda, 0xfd, 0x1f, 0x21, 0x76, 0x0f, 0xbb, 0x00, 0x22, 0xff, 0x00,
+ 0x40, 0xdf, 0x0e, 0x12,
+ 0xef, 0xff, 0x42, 0x33, 0x1e, 0x3d, 0x0e, 0x1c, 0x40, 0x35, 0x0f, 0xff,
+ 0x10, 0xac, 0x0c, 0x73,
+ 0x41, 0xda, 0xee, 0x36, 0x21, 0xdf, 0x00, 0x20, 0x00, 0xf0, 0xd0, 0x03,
+ 0x11, 0x01, 0xe0, 0x00,
+ 0x2d, 0x33, 0x24, 0x72, 0x71, 0xfe, 0xe0, 0x27, 0x21, 0x0f, 0x13, 0x21,
+ 0x0f, 0x37, 0x03, 0x80,
+ 0x01, 0x25, 0x10, 0x2e, 0x00, 0xd4, 0x02, 0x22, 0x00, 0x01, 0x73, 0x10,
+ 0xec, 0x01, 0xf1, 0x24,
+ 0x75, 0x00, 0xff, 0x0e, 0xf1, 0xf2, 0x0f, 0x72, 0x02, 0xdb, 0x03, 0x47,
+ 0xfe, 0xcc, 0x34, 0x12,
+ 0x00, 0xed, 0x21, 0x42, 0xfe, 0x11, 0x47, 0xce, 0xde, 0x75, 0x41, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x11, 0x23, 0x25, 0x00, 0xdd, 0x10, 0x42, 0x14, 0xff, 0xf1, 0x32, 0x10,
+ 0x11, 0x22, 0x51, 0x13,
+ 0x15, 0x14, 0x20, 0x31, 0xef, 0xdd, 0x74, 0x77, 0x12, 0xe0, 0x01, 0x00,
+ 0x01, 0x15, 0x62, 0x0f,
+ 0xde, 0x10, 0x03, 0x00, 0x16, 0x11, 0x00, 0x00, 0x23, 0x20, 0x0f, 0x33,
+ 0x26, 0x01, 0x11, 0x54,
+ 0x40, 0x01, 0x10, 0x41, 0x02, 0x77, 0x42, 0xf0, 0xde, 0x34, 0x20, 0x01,
+ 0x33, 0x03, 0x0f, 0x72,
+ 0x02, 0xe0, 0xef, 0x33, 0x77, 0x01, 0xf0, 0x02, 0x23, 0x0d, 0x0f, 0x02,
+ 0x12, 0x01, 0x54, 0x00,
+ 0x0b, 0x15, 0x22, 0xce, 0x10, 0x74, 0x0f, 0xdc, 0x22, 0x11, 0x0f, 0x20,
+ 0x17, 0x00, 0xbe, 0x11,
+ 0x21, 0x1f, 0x1d, 0x12, 0x15, 0xef, 0x00, 0x4f, 0xcf, 0xf0, 0x33, 0x4d,
+ 0xfd, 0xd0, 0x14, 0xff,
+ 0xb9, 0xf0, 0x30, 0x11, 0xf0, 0x01, 0x00, 0xcc, 0x00, 0x13, 0x0f, 0xda,
+ 0x00, 0x11, 0xa0, 0xff,
+ 0x32, 0xdd, 0x89, 0x02, 0x32, 0xed, 0xcb, 0x10, 0x23, 0xde, 0xdd, 0x01,
+ 0xf1, 0x00, 0x40, 0xfb,
+ 0xad, 0x00, 0x00, 0x24, 0x00, 0xdd, 0xec, 0x00, 0x1d, 0x4e, 0x10, 0x14,
+ 0xfd, 0xa8, 0xde, 0x10,
+ 0x40, 0x30, 0x00, 0xad, 0xdc, 0x10, 0x00, 0x8c, 0x00, 0x02, 0x0f, 0x0c,
+ 0xef, 0xdc, 0xed, 0x21,
+ 0x15, 0xad, 0xeb, 0x10, 0x0f, 0x00, 0x21, 0xcd, 0xfe, 0x02, 0xfe, 0xec,
+ 0x00, 0xdf, 0xdf, 0xf1,
+ 0xbc, 0xee, 0x02, 0x0d, 0xa8, 0xf0, 0x00, 0xef, 0xbc, 0xff, 0x02, 0x0f,
+ 0xdc, 0x10, 0x02, 0xaf,
+ 0xec, 0x00, 0xe0, 0xdb, 0xe0, 0x0f, 0xef, 0xcc, 0x02, 0xe1, 0x8c, 0x0e,
+ 0x2f, 0xfb, 0xb0, 0x01,
+ 0x03, 0x0b, 0xcd, 0x00, 0x10, 0x0f, 0x0d, 0xe4, 0xf2, 0xdc, 0x0e, 0x20,
+ 0xde, 0xde, 0x31, 0x11,
+ 0xcd, 0xbb, 0x00, 0x0d, 0xdd, 0x20, 0x00, 0x0e, 0x31, 0xab, 0xcc, 0x22,
+ 0x00, 0xe9, 0x00, 0x40,
+ 0x10, 0xdb, 0xf1, 0x03, 0xcd, 0xee, 0x1f, 0x0f, 0x70, 0x10, 0xdb, 0xe0,
+ 0x00, 0xdf, 0xbe, 0x12,
+ 0x54, 0xfb, 0x0f, 0x00, 0xdd, 0xf0, 0x06, 0x00, 0xcf, 0x0f, 0x50, 0xff,
+ 0xbf, 0x00, 0x13, 0xf0,
+ 0x00, 0x0e, 0xf9, 0x00, 0x52, 0x05, 0xef, 0x0f, 0xde, 0xfd, 0x22, 0x03,
+ 0xb0, 0x00, 0x0f, 0xdf,
+ 0xe0, 0xfc, 0xf0, 0x02, 0x06, 0x9f, 0xed, 0x21, 0x52, 0xfe, 0xed, 0x02,
+ 0x04, 0xdc, 0xec, 0x00,
+ 0x31, 0x61, 0x1f, 0x11, 0x07, 0xcf, 0x0c, 0x43, 0x20, 0xcd, 0x03, 0x33,
+ 0xe8, 0x0f, 0x11, 0x12,
+ 0x02, 0x1f, 0x0d, 0x11, 0x74, 0x30, 0xac, 0x01, 0x17, 0x3f, 0x0d, 0xd0,
+ 0x11, 0x53, 0x1f, 0xeb,
+ 0xf0, 0x24, 0x10, 0x0e, 0x40, 0x30, 0xf0, 0x01, 0x11, 0x11, 0x31, 0xc0,
+ 0xd0, 0x52, 0x0d, 0x4f,
+ 0x77, 0x14, 0xcf, 0x00, 0x21, 0x00, 0x1e, 0x24, 0x11, 0xc0, 0x16, 0x40,
+ 0x0f, 0x02, 0x03, 0x35,
+ 0x73, 0x0c, 0xde, 0x55, 0xf0, 0x0f, 0x44, 0x00, 0xfd, 0x34, 0x44, 0xff,
+ 0xfd, 0x21, 0x53, 0x13,
+ 0x0e, 0x00, 0x24, 0x0e, 0x0f, 0x77, 0x01, 0xfe, 0x00, 0x33, 0xe0, 0xf0,
+ 0xf1, 0x32, 0x4f, 0x01,
+ 0x17, 0x21, 0xf0, 0x01, 0x0f, 0x4f, 0x73, 0x25, 0xe1, 0xee, 0x31, 0x75,
+ 0xff, 0xed, 0x32, 0x23,
+ 0xde, 0xf3, 0x13, 0x2b, 0x0d, 0x55, 0x25, 0xf0, 0xbf, 0x00, 0x31, 0x1f,
+ 0x0e, 0x24, 0xf3, 0xcf,
+ 0x00, 0x50, 0x11, 0xe0, 0x02, 0x57, 0x00, 0xfe, 0xe0, 0x32, 0x00, 0xef,
+ 0x42, 0x02, 0xdf, 0x42,
+ 0x34, 0xee, 0xd0, 0x15, 0x32, 0x40, 0x10, 0x30, 0x21, 0xd0, 0x26, 0x11,
+ 0xde, 0x2e, 0x4f, 0x41,
+ 0xf1, 0xf0, 0x54, 0x40, 0xed, 0x11, 0x67, 0xee, 0xdb, 0x62, 0x23, 0xed,
+ 0xce, 0x16, 0x10, 0x00,
+ 0x1f, 0x10, 0x00, 0x1e, 0x11, 0x15, 0xc0, 0xf0, 0x21, 0xfd, 0x4e, 0x4f,
+ 0x02, 0xe7, 0x13, 0x0e,
+ 0x00, 0x21, 0x60, 0xfe, 0x01, 0x56, 0x00, 0xfe, 0xe0, 0x22, 0xe0, 0xdd,
+ 0x00, 0xc0, 0x00, 0x45,
+ 0x72, 0x0d, 0xed, 0x16, 0x32, 0x03, 0x00, 0x1c, 0x30, 0x33, 0xe1, 0xcf,
+ 0x40, 0x77, 0x02, 0xfe,
+ 0x21, 0x31, 0xcf, 0xf1, 0x46, 0x10, 0x00, 0x02, 0xae, 0x0f, 0x30, 0x03,
+ 0xf3, 0x01, 0x1b, 0x1e,
+ 0x55, 0x01, 0xef, 0x0e, 0x30, 0x21, 0x1f, 0x2f, 0x42, 0x06, 0x01, 0xb0,
+ 0xd8, 0x0f, 0x60, 0x22,
+ 0xe0, 0xf0, 0xf0, 0x00, 0x60, 0x0d, 0xfe, 0x04, 0x00, 0xe0, 0x54, 0x00,
+ 0xca, 0x10, 0x10, 0x00,
+ 0xe0, 0xf0, 0xf0, 0xcc, 0x0e, 0x65, 0x13, 0xef, 0xcb, 0x0f, 0x21, 0x11,
+ 0xef, 0x12, 0x13, 0xbe,
+ 0x1d, 0x0e, 0xc9, 0x01, 0x01, 0xe0, 0xfe, 0xf1, 0xc0, 0x0d, 0x50, 0xec,
+ 0x99, 0x01, 0x11, 0xec,
+ 0xf0, 0x20, 0xcf, 0xec, 0x00, 0x00, 0x10, 0xff, 0xbb, 0xfe, 0x00, 0x23,
+ 0xed, 0xdb, 0x51, 0x00,
+ 0xdd, 0x00, 0x30, 0x42, 0x20, 0xe9, 0xff, 0x00, 0xc0, 0x00, 0x4f, 0x0c,
+ 0xff, 0xf1, 0xaf, 0xee,
+ 0xf0, 0xec, 0x00, 0x43, 0x00, 0xdb, 0xd0, 0xe0, 0x00, 0xff, 0xf9, 0x0f,
+ 0x20, 0xf1, 0x80, 0xe1,
+ 0xf0, 0xeb, 0xdf, 0x1f, 0x10, 0xc0, 0xd1, 0x01, 0xe3, 0x9b, 0xfc, 0x02,
+ 0xf1, 0x8a, 0x0f, 0x12,
+ 0xf2, 0xce, 0x10, 0x01, 0xcc, 0xff, 0xf0, 0x00, 0x22, 0xf1, 0xbf, 0xd9,
+ 0xf0, 0xf0, 0x13, 0x1e,
+ 0xda, 0xe0, 0xf2, 0xc1, 0x20, 0xf0, 0x88, 0xf0, 0x32, 0x0f, 0xce, 0x00,
+ 0xf2, 0xee, 0x0f, 0xf0,
+ 0x0f, 0x31, 0xd1, 0xdf, 0x0d, 0xef, 0x02, 0xb0, 0xb8, 0x10, 0x41, 0x0f,
+ 0xca, 0xe0, 0x10, 0x33,
+ 0xdd, 0xfc, 0x00, 0xf1, 0xe1, 0xfd, 0x7e, 0x20, 0x01, 0xd2, 0x0d, 0xed,
+ 0x41, 0x30, 0xf8, 0xde,
+ 0xb0, 0xd0, 0x00, 0x4d, 0x0e, 0x1c, 0x20, 0x8e, 0xf0, 0x17, 0x2e, 0xba,
+ 0x01, 0x23, 0x00, 0xfd,
+ 0xe0, 0xf0, 0xef, 0x22, 0x35, 0xae, 0xfe, 0x00, 0x42, 0x00, 0xdc, 0x01,
+ 0x15, 0x11, 0x21, 0x72,
+ 0x00, 0xce, 0xe0, 0x03, 0x45, 0x12, 0x00, 0x00, 0x03, 0xe4, 0x00, 0xf0,
+ 0x00, 0x34, 0x44, 0xff,
+ 0xcf, 0x01, 0x00, 0x0e, 0x77, 0x10, 0xfd, 0xf0, 0x02, 0x10, 0x00, 0x23,
+ 0x3e, 0xb8, 0x00, 0x44,
+ 0x00, 0xfd, 0x10, 0x23, 0xd0, 0x8c, 0x00, 0x31, 0x1f, 0xef, 0x13, 0x10,
+ 0x09, 0xf0, 0x01, 0xde,
+ 0x4f, 0x73, 0x0f, 0xda, 0x01, 0x00, 0x00, 0x40, 0x00, 0x9c, 0x10, 0x21,
+ 0x0f, 0xed, 0x10, 0x10,
+ 0xeb, 0xfe, 0x0f, 0x40, 0x22, 0x24, 0xb8, 0xcc, 0x12, 0x44, 0xfe, 0xde,
+ 0x1f, 0x10, 0x00, 0xe1,
+ 0xce, 0x20, 0x20, 0xf0, 0xd0, 0xf2, 0xef, 0xcb, 0x20, 0x52, 0x00, 0x11,
+ 0xee, 0xaa, 0x22, 0x12,
+ 0x0c, 0x61, 0x02, 0xee, 0x02, 0x67, 0x0e, 0xfd, 0x00, 0x00, 0x23, 0x12,
+ 0x0f, 0x0f, 0x10, 0x00,
+ 0xff, 0x03, 0x01, 0x0a, 0xde, 0x02, 0x51, 0x57, 0x13, 0xdc, 0x0e, 0x52,
+ 0x00, 0x11, 0x34, 0xf0,
+ 0xf0, 0x01, 0x23, 0x0d, 0x30, 0x00, 0xf4, 0x74, 0x42, 0xdc, 0xe1, 0x07,
+ 0x20, 0x40, 0x50, 0x27,
+ 0x01, 0xa0, 0x0d, 0x53, 0x03, 0xff, 0x01, 0x05, 0x10, 0x0d, 0x11, 0x02,
+ 0x14, 0x20, 0xe0, 0x02,
+ 0x21, 0xdc, 0x21, 0x42, 0xe0, 0xef, 0x25, 0xd1, 0xf0, 0x1d, 0x2e, 0x51,
+ 0x47, 0x15, 0xcd, 0xf0,
+ 0x11, 0xf1, 0xdf, 0x71, 0x54, 0x00, 0x0f, 0x00, 0xf0, 0xf2, 0x44, 0x40,
+ 0x00, 0x0d, 0x12, 0x35,
+ 0xf0, 0xef, 0x20, 0x76, 0x32, 0xcf, 0x01, 0x23, 0x00, 0x1e, 0x22, 0x05,
+ 0x23, 0x73, 0x10, 0x0c,
+ 0x11, 0x02, 0xee, 0x20, 0x57, 0x15, 0x00, 0x20, 0x10, 0x30, 0x01, 0xd1,
+ 0x03, 0x64, 0x21, 0x00,
+ 0xf1, 0xcf, 0x1f, 0x63, 0x17, 0x01, 0x12, 0x01, 0x00, 0x0f, 0x50, 0xf4,
+ 0x17, 0x61, 0x00, 0xff,
+ 0x03, 0x32, 0x22, 0x32, 0xf1, 0xf4, 0x44, 0x31, 0x10, 0x13, 0x33, 0x00,
+ 0xf0, 0x02, 0x47, 0x44,
+ 0x2f, 0x4f, 0x31, 0xd2, 0xf3, 0x33, 0x4f, 0x2d, 0x43, 0x27, 0xf1, 0x00,
+ 0x41, 0x10, 0x0f, 0x50,
+ 0x25, 0x00, 0x10, 0x70, 0x01, 0x01, 0x0e, 0x3f, 0x24, 0x03, 0x60, 0x1e,
+ 0xdc, 0xf2, 0x47, 0x10,
+ 0x11, 0x20, 0xce, 0xce, 0x62, 0x10, 0xf9, 0xf1, 0x03, 0x0c, 0x0c, 0x10,
+ 0x20, 0xe2, 0xf2, 0x0f,
+ 0x0e, 0x1c, 0xee, 0xd0, 0x23, 0x74, 0x0d, 0xe0, 0xce, 0x9a, 0x00, 0x1f,
+ 0x20, 0x00, 0xee, 0x0b,
+ 0xe1, 0x03, 0xec, 0xab, 0x00, 0x51, 0xf1, 0xbd, 0x0e, 0xff, 0xec, 0x10,
+ 0x33, 0x02, 0xbd, 0x09,
+ 0x00, 0x1f, 0x0d, 0x00, 0x3f, 0x0f, 0xcf, 0xf0, 0x0d, 0x4f, 0x0c, 0xeb,
+ 0xed, 0x00, 0x14, 0xde,
+ 0xc8, 0x0f, 0x00, 0x0f, 0xd0, 0xcf, 0xe0, 0xce, 0xbc, 0xff, 0xf0, 0xc0,
+ 0xeb, 0x0f, 0xc0, 0xdf,
+ 0x00, 0x0f, 0xbd, 0xde, 0x0e, 0x01, 0xef, 0x88, 0xff, 0x00, 0xf0, 0x0e,
+ 0x00, 0xfe, 0x9e, 0x0f,
+ 0x00, 0x0c, 0x0b, 0xce, 0xe0, 0x01, 0x02, 0xfd, 0xa8, 0xfe, 0x01, 0x01,
+ 0xf0, 0xec, 0xe0, 0xce,
+ 0x00, 0x10, 0xfe, 0xb0, 0xf2, 0x0b, 0xcc, 0xed, 0x00, 0x21, 0xdf, 0xbc,
+ 0xf1, 0xf1, 0xfd, 0xc8,
+ 0x0f, 0xf0, 0x00, 0xf2, 0xcf, 0xcb, 0x00, 0x00, 0x00, 0xf0, 0xe0, 0x0d,
+ 0xed, 0x9f, 0x01, 0x32,
+ 0x0d, 0xa8, 0x00, 0x21, 0xf0, 0xde, 0x0f, 0x0e, 0x0e, 0x1d, 0x0f, 0xce,
+ 0xfd, 0x10, 0x21, 0x05,
+ 0xf0, 0xd9, 0x0f, 0xce, 0xed, 0x61, 0x44, 0xef, 0x9b, 0x0f, 0x00, 0x02,
+ 0x0f, 0xdb, 0x00, 0x10,
+ 0x11, 0x12, 0xbf, 0xef, 0x10, 0x1d, 0x0d, 0x02, 0x05, 0xa0, 0x0e, 0x0e,
+ 0x2f, 0x23, 0xd3, 0xa0,
+ 0x10, 0x44, 0x0f, 0xed, 0xf5, 0x02, 0x00, 0x1f, 0x0d, 0x00, 0xe7, 0xd2,
+ 0xbc, 0x10, 0x33, 0xf6,
+ 0x80, 0xff, 0x0e, 0x30, 0x02, 0x01, 0xe1, 0x00, 0xd2, 0xcf, 0x0b, 0x4e,
+ 0x10, 0x01, 0x10, 0xfd,
+ 0xd5, 0x13, 0x3d, 0x5d, 0x0f, 0x07, 0x02, 0x0d, 0x1d, 0x53, 0x06, 0x11,
+ 0x01, 0xd0, 0x6f, 0x30,
+ 0xed, 0xf2, 0x13, 0x4d, 0x5c, 0x45, 0xe2, 0xde, 0x1f, 0x4e, 0xfc, 0xe0,
+ 0x17, 0x42, 0x20, 0x0f,
+ 0xce, 0xfe, 0x21, 0x57, 0x10, 0x00, 0x21, 0xf0, 0xbe, 0x1f, 0x60, 0x14,
+ 0x01, 0xc0, 0x1f, 0x12,
+ 0x24, 0x00, 0xff, 0x11, 0x25, 0x05, 0x00, 0xae, 0x00, 0x57, 0x13, 0xe0,
+ 0x0e, 0x00, 0x21, 0x11,
+ 0x03, 0x24, 0x30, 0x1e, 0x52, 0x21, 0x14, 0x25, 0x41, 0x0d, 0x10, 0x65,
+ 0x13, 0xe0, 0x30, 0x62,
+ 0x01, 0xe0, 0x35, 0x42, 0xf0, 0xcd, 0x10, 0x44, 0x22, 0x02, 0x01, 0x01,
+ 0x21, 0x00, 0x10, 0x00,
+ 0x63, 0x28, 0xc0, 0x25, 0x6c, 0x29, 0x94, 0x26, 0x50, 0x0f, 0xd6, 0x07,
+ 0x30, 0x0f, 0x60, 0x64,
+ 0x02, 0xdf, 0xe8, 0xef, 0x01, 0x54, 0x40, 0xca, 0xcf, 0x10, 0x22, 0x30,
+ 0x01, 0xc0, 0xfe, 0x01,
+ 0xf2, 0x31, 0x60, 0xeb, 0xdf, 0x36, 0x02, 0xd0, 0xac, 0x0f, 0x3f, 0x43,
+ 0x02, 0xde, 0xbd, 0x00,
+ 0x41, 0x01, 0x02, 0x0f, 0x0c, 0x0f, 0x01, 0xf2, 0x03, 0x2f, 0xfe, 0xe0,
+ 0x25, 0x53, 0x00, 0xe9,
+ 0x00, 0x12, 0x11, 0x99, 0x00, 0x21, 0x20, 0x30, 0x11, 0xb0, 0xdf, 0x00,
+ 0x30, 0x53, 0xfb, 0xab,
+ 0x0f, 0x20, 0x33, 0xf1, 0xb2, 0x0f, 0x0b, 0x0f, 0x00, 0x33, 0xe5, 0xef,
+ 0x1f, 0x10, 0x00, 0x47,
+ 0x00, 0xff, 0xed, 0x00, 0x03, 0x21, 0xee, 0xbe, 0x35, 0x32, 0x23, 0x40,
+ 0xab, 0xdd, 0x0f, 0x01,
+ 0x56, 0xf1, 0x00, 0xec, 0xbd, 0x10, 0x54, 0x00, 0xf1, 0xf0, 0x0c, 0x00,
+ 0x34, 0x10, 0x10, 0x00,
+ 0x0e, 0xe4, 0xe0, 0xfd, 0x30, 0x0e, 0x02, 0x17, 0xc0, 0x8f, 0xdd, 0x10,
+ 0x73, 0x31, 0xce, 0xec,
+ 0xf1, 0x35, 0x30, 0xfe, 0xb0, 0x00, 0x0e, 0x2d, 0x11, 0xe3, 0xdd, 0xea,
+ 0x20, 0x52, 0x20, 0x01,
+ 0x17, 0x10, 0xdb, 0xc0, 0x1f, 0x60, 0x11, 0xf3, 0xd2, 0xde, 0x0a, 0x2f,
+ 0x00, 0x24, 0x50, 0xd0,
+ 0xd1, 0x01, 0x1c, 0x0f, 0x21, 0x33, 0xd1, 0xaf, 0x10, 0x10, 0xfa, 0xef,
+ 0x00, 0x22, 0x00, 0x24,
+ 0x01, 0xde, 0xad, 0x02, 0x04, 0x72, 0x11, 0x03, 0x0b, 0x0a, 0x10, 0x24,
+ 0xe2, 0xff, 0x0d, 0x3f,
+ 0x00, 0xc2, 0xde, 0xac, 0xfe, 0xa0, 0xd0, 0x11, 0x43, 0xe0, 0xee, 0x2f,
+ 0x6a, 0x00, 0x04, 0x24,
+ 0x00, 0xfc, 0x0f, 0x30, 0x14, 0x11, 0x31, 0x1f, 0xbb, 0xf1, 0x02, 0x32,
+ 0x40, 0x0f, 0xe0, 0xc4,
+ 0x0e, 0x0f, 0x0d, 0x10, 0x00, 0xb3, 0xe1, 0x35, 0x01, 0xbf, 0x00, 0x77,
+ 0x12, 0xc0, 0xf9, 0xff,
+ 0x0e, 0x22, 0x04, 0x20, 0x0c, 0xae, 0xf2, 0x15, 0x50, 0xed, 0xe0, 0x01,
+ 0x60, 0x11, 0x01, 0xd0,
+ 0x01, 0xe3, 0x1d, 0x08, 0x0d, 0x03, 0xf3, 0x00, 0x00, 0xcd, 0x0f, 0x0e,
+ 0x23, 0x07, 0x01, 0x7e,
+ 0x1e, 0x00, 0xc1, 0xed, 0x0e, 0x53, 0x27, 0xf1, 0xde, 0x2e, 0x00, 0x00,
+ 0xf1, 0x20, 0x1b, 0x3f,
+ 0x70, 0x31, 0xc0, 0xd7, 0x01, 0xfd, 0x2d, 0x30, 0xf4, 0x01, 0x10, 0x9b,
+ 0xf0, 0x13, 0x10, 0x72,
+ 0x10, 0xf0, 0xeb, 0xef, 0xff, 0x11, 0x23, 0x44, 0x4f, 0x0b, 0xbe, 0xef,
+ 0x00, 0x10, 0x14, 0xf1,
+ 0x22, 0x3f, 0x0b, 0xe0, 0xf2, 0x43, 0x40, 0x9b, 0xd0, 0x12, 0x41, 0xed,
+ 0xd0, 0xf1, 0xf1, 0x2d,
+ 0x74, 0x02, 0xdd, 0x0c, 0x01, 0x07, 0x01, 0xff, 0x2c, 0x20, 0x12, 0xf6,
+ 0xc0, 0xdc, 0x30, 0x71,
+ 0x42, 0xc2, 0xf1, 0x0f, 0x1e, 0x30, 0x03, 0xd1, 0xdf, 0x0e, 0x0f, 0x70,
+ 0x07, 0xe1, 0x00, 0x21,
+ 0x5f, 0xe0, 0xec, 0xeb, 0x20, 0x11, 0x11, 0x0d, 0x8e, 0x04, 0x01, 0x0b,
+ 0x2e, 0x1d, 0xff, 0xff,
+ 0x42, 0x10, 0xc1, 0xe1, 0x00, 0x28, 0x2d, 0x10, 0x25, 0xe0, 0xd2, 0x31,
+ 0xc0, 0xc9, 0x2f, 0x30,
+ 0x94, 0x02, 0x20, 0xfe, 0xec, 0x0f, 0x70, 0x24, 0xf1, 0xaf, 0xfe, 0x00,
+ 0x10, 0x33, 0x01, 0xf1,
+ 0x00, 0x0e, 0xfb, 0xff, 0xf0, 0xc2, 0x17, 0x70, 0x00, 0xcc, 0x00, 0x31,
+ 0x10, 0x00, 0x00, 0x16,
+ 0xf0, 0xf0, 0x0c, 0x00, 0x32, 0x12, 0x80, 0xfd, 0x01, 0x04, 0xf0, 0xff,
+ 0xef, 0xbf, 0x2d, 0x6f,
+ 0x25, 0xe5, 0xd0, 0x2f, 0x3b, 0x1f, 0x00, 0x03, 0x25, 0x10, 0x0e, 0xff,
+ 0xef, 0x2f, 0x4f, 0xd0,
+ 0xe5, 0x04, 0xf0, 0xeb, 0x30, 0x70, 0x33, 0xe1, 0x8e, 0xcc, 0x1d, 0x21,
+ 0x46, 0x01, 0xef, 0xbd,
+ 0x00, 0x23, 0x4f, 0xfe, 0xc0, 0x02, 0x04, 0x30, 0x0f, 0x00, 0xc1, 0xff,
+ 0x1e, 0x20, 0x00, 0xe3,
+ 0x12, 0x1b, 0xfb, 0x00, 0x41, 0x22, 0x30, 0xdf, 0xb4, 0x12, 0x1f, 0xfc,
+ 0xf4, 0x04, 0x00, 0x1e,
+ 0x42, 0x06, 0xce, 0xab, 0x00, 0x22, 0xf0, 0xad, 0x0e, 0x0f, 0x0e, 0x10,
+ 0x01, 0xc3, 0xe1, 0x71,
+ 0x2b, 0xfd, 0xc0, 0x00, 0x12, 0x46, 0xf1, 0xc2, 0x01, 0x2b, 0x0c, 0x40,
+ 0x00, 0xe4, 0xd0, 0x0c,
+ 0x60, 0x05, 0x00, 0x0f, 0x30, 0xff, 0xcf, 0x00, 0x51, 0xff, 0xf3, 0x17,
+ 0x20, 0x0e, 0xef, 0xf0,
+ 0x0f, 0xe1, 0x17, 0x4e, 0x0e, 0x2f, 0xf3, 0xd2, 0xcf, 0x0d, 0x30, 0x11,
+ 0xb3, 0x12, 0x30, 0xdf,
+ 0xa1, 0xfe, 0xc9, 0xd1, 0xe4, 0x21, 0x71, 0x50, 0xec, 0xe9, 0xfe, 0x00,
+ 0x04, 0x01, 0x40, 0x3e,
+ 0x1b, 0xd1, 0xb3, 0x12, 0x30, 0xef, 0xf0, 0x30, 0x00, 0x90, 0x14, 0x35,
+ 0x1e, 0x0b, 0x21, 0x01,
+ 0xa1, 0x0f, 0x1f, 0x3f, 0xf2, 0xd0, 0xe2, 0x0e, 0x2b, 0x2f, 0xf1, 0xa7,
+ 0xe0, 0xdb, 0x1f, 0x41,
+ 0xd0, 0xb0, 0x1e, 0x1e, 0xfe, 0x31, 0x67, 0x00, 0xfe, 0xff, 0x01, 0x24,
+ 0xf0, 0xb0, 0x0d, 0x0d,
+ 0x30, 0x22, 0xf5, 0xf0, 0x0b, 0xf0, 0xd1, 0x13, 0x50, 0x0f, 0x2e, 0x4e,
+ 0xb0, 0xb1, 0x03, 0x01,
+ 0x20, 0x1e, 0xee, 0xef, 0xd2, 0xff, 0x3c, 0x03, 0xe3, 0x1a, 0x7d, 0x73,
+ 0x27, 0xe5, 0xcf, 0x0d,
+ 0x10, 0x01, 0xdf, 0x2f, 0x53, 0x06, 0xd0, 0xef, 0xed, 0x00, 0x01, 0x21,
+ 0x30, 0xfd, 0xbc, 0xfd,
+ 0xf5, 0xf4, 0x2e, 0x7e, 0x40, 0xf6, 0x01, 0x1f, 0x0e, 0x0f, 0x04, 0x54,
+ 0x0f, 0xda, 0x00, 0x4f,
+ 0x42, 0xf3, 0xb0, 0xfe, 0x0c, 0x50, 0x02, 0x01, 0xf1, 0xee, 0x0d, 0x00,
+ 0x02, 0xc0, 0xdf, 0x0d,
+ 0x52, 0x27, 0xe4, 0xbf, 0xec, 0x00, 0x41, 0x20, 0xfd, 0xe1, 0xf3, 0xf1,
+ 0x30, 0x3b, 0x10, 0x06,
+ 0x11, 0x30, 0xe0, 0x8f, 0x00, 0x32, 0x12, 0x90, 0x0e, 0x0a, 0x2f, 0x10,
+ 0xf1, 0xc0, 0x01, 0x00,
+ 0x3f, 0x00, 0xe0, 0x1f, 0x30, 0xf7, 0x01, 0x50, 0x20, 0xea, 0xc0, 0xef,
+ 0xe0, 0x12, 0x61, 0x2d,
+ 0xff, 0xd5, 0x02, 0xfd, 0x0c, 0x30, 0x10, 0x2e, 0xd0, 0xb2, 0x26, 0x70,
+ 0x2f, 0xfb, 0xe0, 0x15,
+ 0x01, 0xe0, 0xbe, 0x10, 0x74, 0x1f, 0x00, 0xf0, 0xf3, 0x00, 0x3d, 0x2e,
+ 0x01, 0xd3, 0xed, 0x08,
+ 0x0d, 0x10, 0x0b, 0xed, 0xd1, 0x77, 0x72, 0x0f, 0xcd, 0xe0, 0x24, 0x32,
+ 0x0f, 0xde, 0xff, 0x00,
+ 0xd2, 0xd0, 0xf1, 0xd0, 0x09, 0x20, 0x33, 0x01, 0x0f, 0x2d, 0x50, 0x05,
+ 0x54, 0x00, 0xfb, 0xe0,
+ 0x30, 0x34, 0x10, 0x80, 0xd0, 0xe0, 0x11, 0x7f, 0x4e, 0xf0, 0xd1, 0xf0,
+ 0x0f, 0x10, 0x01, 0x01,
+ 0x09, 0x0d, 0xdf, 0x17, 0x63, 0x0f, 0xbe, 0xee, 0x01, 0x43, 0x1e, 0x0d,
+ 0xe0, 0xe7, 0xf0, 0x0a,
+ 0x00, 0xff, 0x11, 0x5f, 0x0e, 0x20, 0x05, 0xff, 0xff, 0x20, 0x72, 0x5f,
+ 0x00, 0xe2, 0x03, 0x0d,
+ 0x3f, 0x04, 0xd1, 0x0e, 0x6b, 0x10, 0x03, 0xd2, 0xdd, 0xf8, 0x00, 0x61,
+ 0x43, 0x00, 0xad, 0xe0,
+ 0x10, 0x42, 0xf1, 0xd0, 0xde, 0x01, 0x56, 0x00, 0xfd, 0xff, 0xfe, 0x00,
+ 0x31, 0x45, 0xef, 0xed,
+ 0x00, 0x02, 0x14, 0x22, 0x20, 0xe0, 0xdf, 0xeb, 0xd0, 0x36, 0x31, 0x92,
+ 0xcf, 0xff, 0xf0, 0x1f,
+ 0x00, 0xb0, 0xff, 0x40, 0x77, 0x00, 0x0a, 0xdf, 0x11, 0x66, 0x10, 0xf0,
+ 0xed, 0x20, 0x20, 0x30,
+ 0xe0, 0xbf, 0xf0, 0x01, 0x02, 0x1d, 0x0e, 0xeb, 0x1e, 0x00, 0x05, 0xe3,
+ 0x10, 0xf1, 0xbf, 0x2b,
+ 0x70, 0x1e, 0xd0, 0xc0, 0x23, 0x22, 0xef, 0xcc, 0x0f, 0x2f, 0x1f, 0x34,
+ 0x22, 0xe9, 0x8d, 0xe0,
+ 0x15, 0x41, 0x00, 0xf0, 0x02, 0x3f, 0xfc, 0xcf, 0xe0, 0xf1, 0x56, 0x52,
+ 0x0e, 0xca, 0x0e, 0x00,
+ 0x11, 0x05, 0xd0, 0xf0, 0x2e, 0x20, 0x00, 0xc1, 0xe2, 0xf1, 0x33, 0x72,
+ 0xfc, 0xcb, 0x00, 0x22,
+ 0x00, 0xdf, 0xfe, 0x10, 0x31, 0x44, 0x32, 0x0f, 0x8c, 0x00, 0x02, 0x10,
+ 0x20, 0x04, 0x02, 0x0d,
+ 0x0b, 0xe0, 0xd2, 0x24, 0x4b, 0x2e, 0xf2, 0xd3, 0xdd, 0x1d, 0x72, 0x53,
+ 0xed, 0xfa, 0x0f, 0x0f,
+ 0x00, 0x0f, 0x0d, 0xbf, 0xf2, 0x27, 0x40, 0x0e, 0x0e, 0x13, 0x16, 0xf0,
+ 0xff, 0xdb, 0x01, 0xe4,
+ 0x12, 0x40, 0xec, 0xdf, 0x30, 0x05, 0x80, 0x9f, 0x1e, 0x21, 0x14, 0x00,
+ 0x0d, 0xd0, 0xf0, 0x01,
+ 0x60, 0x00, 0x0c, 0x0e, 0x00, 0x02, 0xe6, 0xf0, 0x00, 0x70, 0x2b, 0x00,
+ 0xf0, 0xc1, 0xf3, 0x10,
+ 0x41, 0x23, 0x0f, 0xfb, 0x00, 0xc2, 0xc3, 0xf6, 0x41, 0x3d, 0xda, 0xc0,
+ 0x02, 0x24, 0xee, 0xee,
+ 0xf0, 0x00, 0x4f, 0x2f, 0xdf, 0x9f, 0x03, 0x31, 0x1d, 0x0b, 0xee, 0xc0,
+ 0x06, 0x44, 0x2f, 0x29,
+ 0xe0, 0xf0, 0xe2, 0x40, 0x60, 0x20, 0x0f, 0xdf, 0x1f, 0x31, 0xd2, 0xb2,
+ 0x0d, 0x3b, 0x20, 0xc4,
+ 0xc1, 0xfc, 0xcf, 0xf0, 0x02, 0x22, 0x01, 0xbe, 0x0b, 0x3f, 0x20, 0xff,
+ 0xc0, 0x00, 0x77, 0x20,
+ 0x31, 0xd0, 0xd0, 0x23, 0x44, 0x00, 0xe2, 0xf3, 0x01, 0x5e, 0xfe, 0xc0,
+ 0xf1, 0xea, 0x0b, 0x2f,
+ 0x3e, 0xf0, 0x90, 0x04, 0x0f, 0x19, 0x00, 0x00, 0xd3, 0x01, 0x40, 0x00,
+ 0xee, 0x0e, 0x50, 0x11,
+ 0x03, 0x00, 0x34, 0xdd, 0xb8, 0x0c, 0x52, 0x64, 0x11, 0x0f, 0xee, 0x00,
+ 0x01, 0x01, 0x01, 0xe0,
+ 0x00, 0xf1, 0xf6, 0x32, 0x20, 0xac, 0x0f, 0x40, 0xe1, 0xb3, 0x04, 0x52,
+ 0x0f, 0xd8, 0x0f, 0x00,
+ 0x4f, 0x00, 0x02, 0xc3, 0xd0, 0x00, 0x00, 0x40, 0x10, 0x2b, 0x11, 0x07,
+ 0xb0, 0x00, 0xff, 0x0e,
+ 0xfd, 0x0f, 0x12, 0x14, 0x3d, 0xfd, 0x80, 0x83, 0x12, 0x10, 0x00, 0x2e,
+ 0x01, 0xd7, 0xf5, 0xff,
+ 0x0c, 0x2f, 0x50, 0x00, 0x0f, 0xf3, 0x04, 0x2f, 0xfd, 0x00, 0x44, 0x31,
+ 0xfe, 0xe8, 0x20, 0x32,
+ 0x40, 0x00, 0x8f, 0xcc, 0x01, 0x22, 0x22, 0x21, 0x00, 0xec, 0xdc, 0xb0,
+ 0x02, 0x36, 0x30, 0x0c,
+ 0xe0, 0x01, 0x11, 0x61, 0x00, 0x2f, 0x1d, 0xd0, 0xe0, 0x3e, 0x6d, 0x0f,
+ 0xde, 0xf5, 0x07, 0xf1,
+ 0x0e, 0xed, 0xd0, 0x25, 0x72, 0x00, 0xbc, 0xdf, 0x00, 0x55, 0x10, 0x20,
+ 0xf0, 0xc0, 0xeb, 0x00,
+ 0x30, 0x32, 0xf2, 0xb1, 0x0f, 0x3a, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xb7,
+ 0xe0, 0x00, 0x7e, 0x1f,
+ 0x02, 0xe5, 0x00, 0xef, 0x32, 0x71, 0x20, 0xec, 0xe0, 0x01, 0xf4, 0x12,
+ 0x4f, 0x0c, 0xbf, 0x01,
+ 0x03, 0x0f, 0xff, 0xef, 0x1e, 0x4d, 0x00, 0x07, 0xf0, 0x0b, 0x2e, 0x60,
+ 0x0f, 0xd0, 0xd0, 0x00,
+ 0x0f, 0x30, 0xcd, 0xfb, 0x1f, 0x10, 0x0e, 0x3d, 0x44, 0xd7, 0xd0, 0x7c,
+ 0x50, 0x00, 0xc2, 0x01,
+ 0x2c, 0xee, 0xe2, 0x05, 0x10, 0x0e, 0xe0, 0xa0, 0xc2, 0xcf, 0x10, 0x53,
+ 0x11, 0xf0, 0xdd, 0x10,
+ 0x35, 0x0e, 0xe9, 0x1e, 0x30, 0x02, 0x04, 0x20, 0x10, 0x3f, 0x32, 0xf5,
+ 0x81, 0xc0, 0xfc, 0xff,
+ 0x00, 0x22, 0x10, 0x10, 0x00, 0xe7, 0xf3, 0x8c, 0xae, 0x33, 0x64, 0x00,
+ 0xe9, 0xe0, 0x00, 0x00,
+ 0x31, 0x20, 0x00, 0xe2, 0x00, 0x00, 0x3c, 0x0f, 0xf0, 0x02, 0xf1, 0x04,
+ 0x75, 0x51, 0x2d, 0xcd,
+ 0xe0, 0xf0, 0x0d, 0x3e, 0x05, 0xf6, 0x01, 0x3f, 0xfb, 0xdf, 0x00, 0x21,
+ 0x22, 0xe0, 0xb1, 0xf0,
+ 0x2f, 0x7e, 0x11, 0x03, 0xde, 0xdc, 0xb1, 0xf0, 0xff, 0x28, 0x6f, 0xf2,
+ 0xe1, 0x00, 0x1f, 0x00,
+ 0x04, 0x32, 0x30, 0xdd, 0x8e, 0xee, 0x0f, 0x64, 0x17, 0x07, 0x02, 0xee,
+ 0xcd, 0x00, 0x40, 0x11,
+ 0x02, 0xd2, 0xcd, 0x1c, 0x11, 0x20, 0x2d, 0xe0, 0xa2, 0x03, 0x3c, 0x0a,
+ 0xde, 0xff, 0x34, 0x34,
+ 0xe0, 0xcc, 0xee, 0x00, 0x73, 0x20, 0xfe, 0xaf, 0x0f, 0x0f, 0x32, 0x16,
+ 0xf0, 0xee, 0xef, 0x10,
+ 0x2d, 0x00, 0x11, 0x0e, 0xf0, 0x37, 0x55, 0xef, 0xfe, 0x4c, 0x7e, 0x01,
+ 0xe6, 0xf1, 0x0e, 0x1e,
+ 0x50, 0x23, 0xd2, 0xc0, 0x01, 0x22, 0x3f, 0xcc, 0xdf, 0xf0, 0x02, 0x22,
+ 0x2e, 0xec, 0xd7, 0x22,
+ 0x6f, 0xfd, 0xef, 0x00, 0x11, 0x04, 0x00, 0xff, 0xbd, 0x01, 0x46, 0x00,
+ 0x0a, 0xcf, 0xe0, 0x03,
+ 0x00, 0x2c, 0x2e, 0x00, 0x04, 0xe5, 0x90, 0x2e, 0x7f, 0x52, 0x04, 0xc0,
+ 0xe0, 0x04, 0x30, 0x1c,
+ 0x00, 0xff, 0xe2, 0xf4, 0x1f, 0x29, 0x20, 0xe1, 0xaf, 0x0d, 0x10, 0x24,
+ 0xd0, 0xa0, 0x0a, 0x1e,
+ 0x00, 0xf2, 0x01, 0xf1, 0xed, 0x00, 0x71, 0x21, 0xdd, 0xfd, 0x42, 0x47,
+ 0x01, 0xde, 0x0d, 0x30,
+ 0x00, 0xf1, 0x0f, 0x0f, 0xe1, 0xb1, 0xfd, 0xc9, 0xef, 0xf3, 0x55, 0x31,
+ 0xe0, 0xbc, 0x0f, 0x1e,
+ 0x30, 0x33, 0x23, 0x11, 0x80, 0x00, 0x18, 0x3d, 0x12, 0xe4, 0xf2, 0xd1,
+ 0xef, 0xec, 0x1e, 0x02,
+ 0x26, 0x11, 0x02, 0xdf, 0xcc, 0x0e, 0x30, 0xd1, 0xd4, 0xe0, 0xa0, 0x1d,
+ 0x7f, 0x20, 0x05, 0xa2,
+ 0xed, 0x0e, 0x34, 0x20, 0xfb, 0xf0, 0xf4, 0x15, 0x70, 0x5d, 0x0e, 0x01,
+ 0xe1, 0x00, 0xf0, 0x02,
+ 0x33, 0x3f, 0x0a, 0xef, 0xb0, 0xf3, 0x00, 0x0e, 0xed, 0xf2, 0x24, 0x20,
+ 0xdb, 0xcf, 0xf0, 0x10,
+ 0x73, 0x0f, 0x0d, 0x05, 0x01, 0xfc, 0xff, 0x03, 0x14, 0xff, 0xdc, 0x00,
+ 0x01, 0x03, 0x20, 0x00,
+ 0x82, 0xb2, 0x24, 0x40, 0x0d, 0x0a, 0x10, 0x15, 0xb1, 0xdc, 0x1c, 0x60,
+ 0x12, 0xe4, 0xe0, 0xfe,
+ 0x0c, 0x22, 0x26, 0x00, 0xd0, 0xeb, 0x20, 0x53, 0x20, 0xe0, 0x0e, 0xe0,
+ 0xb1, 0x20, 0x1d, 0x0e,
+ 0x31, 0x76, 0x0e, 0xde, 0xe0, 0xf2, 0x13, 0x5f, 0x39, 0xff, 0x90, 0x05,
+ 0x01, 0x3e, 0x1f, 0xe0,
+ 0xb4, 0x01, 0x10, 0x0c, 0x40, 0x12, 0x00, 0xef, 0xee, 0x30, 0x67, 0x00,
+ 0x00, 0x0e, 0xef, 0x1f,
+ 0x40, 0x1d, 0x01, 0xf5, 0xd1, 0xff, 0x0e, 0x00, 0xf2, 0xd1, 0xfd, 0xea,
+ 0xb0, 0xc4, 0xf0, 0x09,
+ 0x20, 0x60, 0x05, 0xc0, 0xdf, 0xee, 0x00, 0x70, 0x11, 0x01, 0x21, 0x13,
+ 0x01, 0xc0, 0x0e, 0xfd,
+ 0x00, 0x13, 0x25, 0x31, 0xf1, 0x00, 0x0e, 0x20, 0xa2, 0xc5, 0xf0, 0x2e,
+ 0x72, 0x33, 0xf3, 0xd1,
+ 0xd0, 0x08, 0x2c, 0x0e, 0xf0, 0xb3, 0xf0, 0x00, 0x00, 0x3f, 0x0e, 0x0e,
+ 0xfc, 0xcb, 0xe1, 0x06,
+ 0x70, 0x0d, 0xed, 0x9e, 0x00, 0x01, 0x04, 0x30, 0x0c, 0x77, 0xeb, 0xf0,
+ 0x56, 0xee, 0x0f, 0x51,
+ 0x00, 0xd0, 0x00, 0x33, 0x30, 0xca, 0x00, 0x12, 0x03, 0xbd, 0xee, 0x10,
+ 0x31, 0x01, 0xf0, 0xb0,
+ 0x0e, 0x01, 0x31, 0x0f, 0x1e, 0x0f, 0x00, 0x07, 0x00, 0x3e, 0x00, 0xfe,
+ 0xd0, 0x15, 0x75, 0xcd,
+ 0xdd, 0xe0, 0x13, 0x12, 0xdf, 0x11, 0x0d, 0x40, 0x00, 0x02, 0x05, 0xf0,
+ 0x33, 0xbb, 0x00, 0x74,
+ 0xff, 0x01, 0x12, 0x0f, 0x03, 0x10, 0x1b, 0xcd, 0x0f, 0x34, 0x30, 0xcb,
+ 0x02, 0x10, 0x0b, 0x71,
+ 0x13, 0xcf, 0x0c, 0x10, 0x01, 0x32, 0x11, 0xe0, 0x80, 0x0d, 0xfe, 0x0d,
+ 0x37, 0x30, 0xcd, 0xde,
+ 0x03, 0x14, 0x1c, 0x2e, 0x11, 0x02, 0x02, 0x9d, 0xfe, 0x11, 0x55, 0x02,
+ 0xd2, 0xea, 0xfd, 0x0e,
+ 0x30, 0x36, 0x01, 0xc0, 0xf0, 0x0d, 0x61, 0x30, 0x0c, 0x0f, 0x22, 0xb5,
+ 0xc0, 0xeb, 0x0f, 0x50,
+ 0x31, 0xc3, 0xb0, 0x0e, 0x00, 0x10, 0x12, 0x03, 0xd0, 0xf1, 0x30, 0x18,
+ 0xde, 0xc0, 0x05, 0x31,
+ 0x40, 0x42, 0x1e, 0xdd, 0xbf, 0x00, 0x22, 0x23, 0x03, 0x14, 0x02, 0x60,
+ 0x0d, 0xe0, 0xd2, 0xcf,
+ 0x1c, 0x77, 0x34, 0xcc, 0xec, 0x00, 0x11, 0x30, 0x1d, 0xe2, 0xd2, 0x0e,
+ 0x3b, 0x0e, 0x0e, 0x12,
+ 0x43, 0x41, 0x0f, 0xa9, 0xed, 0x01, 0x24, 0x21, 0x0f, 0x1c, 0x00, 0x03,
+ 0x24, 0x00, 0x38, 0x00,
+ 0xdd, 0x0c, 0x9d, 0x07, 0xf7, 0x0b, 0xae, 0x08, 0x3d, 0x4d, 0x59, 0x2d,
+ 0x00, 0xd4, 0xe0, 0xdd,
+ 0xd9, 0x0f, 0xf1, 0x82, 0xd3, 0xd1, 0x10, 0x50, 0x10, 0x00, 0xf0, 0xc0,
+ 0xc0, 0xf2, 0x11, 0x3d,
+ 0x08, 0xfb, 0x1e, 0x30, 0x00, 0x2f, 0x4d, 0x2d, 0x0f, 0xc0, 0x23, 0x74,
+ 0x73, 0x32, 0x03, 0xe7,
+ 0xe5, 0x02, 0x22, 0x21, 0x52, 0x34, 0x23, 0x14, 0x12, 0x02, 0x00, 0x32,
+ 0x02, 0x93, 0xd3, 0xb2,
+ 0xd0, 0xc0, 0xd1, 0xe5, 0xd3, 0xce, 0xd9, 0xde, 0xe0, 0xd1, 0xc0, 0xff,
+ 0x00, 0x60, 0x3d, 0x3d,
+ 0x2e, 0x3e, 0x35, 0x37, 0x21, 0x1e, 0x2d, 0x1e, 0x00, 0xac, 0xc8, 0xde,
+ 0xcd, 0xee, 0xdd, 0xcc,
+ 0xcd, 0xcd, 0xdd, 0xfd, 0x1d, 0x0b, 0xdc, 0xdd, 0xbf, 0xde, 0xdc, 0x0f,
+ 0x1f, 0x30, 0x00, 0xf0,
+ 0xff, 0x0f, 0x10, 0x40, 0x32, 0x23, 0x22, 0x02, 0x87, 0xb3, 0xe1, 0x00,
+ 0x1f, 0xf0, 0xc4, 0xe4,
+ 0x11, 0xeb, 0x03, 0x07, 0x8b, 0x8f, 0x12, 0x0f, 0xfc, 0x10, 0x01, 0xcb,
+ 0xfe, 0x32, 0x11, 0xee,
+ 0xed, 0xf0, 0x00, 0x1f, 0x1e, 0x0f, 0x00, 0xf0, 0xf0, 0xdd, 0xbb, 0x0e,
+ 0x31, 0x42, 0x0e, 0x0c,
+ 0x10, 0x00, 0x2f, 0x61, 0x0d, 0xfe, 0x17, 0x25, 0x20, 0x10, 0x50, 0x42,
+ 0x14, 0xf0, 0x00, 0x00,
+ 0x30, 0x01, 0xe2, 0xf3, 0x22, 0x42, 0xee, 0x00, 0x77, 0x27, 0x01, 0x01,
+ 0x11, 0x41, 0xe1, 0xc0,
+ 0xe1, 0xd1, 0xc1, 0xd2, 0xb0, 0xd2, 0xb2, 0xc0, 0xf1, 0xe0, 0xe4, 0xd2,
+ 0xc9, 0xde, 0xe3, 0xf7,
+ 0xd1, 0xb0, 0x00, 0x01, 0x01, 0x13, 0x12, 0x00, 0x20, 0x12, 0x45, 0x21,
+ 0x30, 0x31, 0xf1, 0xd0,
+ 0x10, 0x10, 0x10, 0x04, 0x80, 0x8d, 0xf5, 0x05, 0x0f, 0xda, 0x00, 0x22,
+ 0x00, 0xde, 0x00, 0x62,
+ 0x20, 0x1a, 0x2f, 0x50, 0x10, 0x2d, 0x2d, 0x4f, 0x30, 0x1b, 0x1d, 0x20,
+ 0x1f, 0x00, 0x00, 0x10,
+ 0x30, 0x4e, 0x50, 0x1f, 0x08, 0x0f, 0x42, 0x43, 0x20, 0x2c, 0x2d, 0x3c,
+ 0x2d, 0x0b, 0x1f, 0x00,
+ 0xf0, 0x4f, 0x5f, 0x0c, 0x0d, 0x30, 0x63, 0x0f, 0x1e, 0x12, 0x03, 0xd0,
+ 0xc0, 0xe4, 0xf7, 0x03,
+ 0x33, 0x33, 0xf4, 0xd6, 0x03, 0x43, 0x62, 0x13, 0x25, 0x32, 0x12, 0x12,
+ 0x76, 0x23, 0x01, 0x01,
+ 0x23, 0x44, 0x02, 0xe1, 0xf4, 0x04, 0xf3, 0xf1, 0xf0, 0xa1, 0xd0, 0xd0,
+ 0x0f, 0x70, 0x30, 0x3f,
+ 0x40, 0x41, 0x3e, 0x3b, 0x6f, 0x1f, 0x19, 0x0d, 0x2f, 0x1f, 0x0d, 0x1d,
+ 0x1d, 0x0d, 0xfb, 0x0c,
+ 0x0d, 0xfd, 0xfe, 0xdd, 0xac, 0xdf, 0xf0, 0x2e, 0x2a, 0x1d, 0xfe, 0xce,
+ 0xaf, 0xcb, 0xed, 0x2d,
+ 0x2e, 0xfd, 0xcc, 0xdd, 0xdd, 0xfe, 0x0e, 0xde, 0x8d, 0xed, 0xee, 0x0e,
+ 0x00, 0x04, 0xd3, 0xc0,
+ 0xad, 0xe2, 0xf7, 0x04, 0xdf, 0xde, 0x00, 0xf2, 0xb0, 0xe2, 0x07, 0x31,
+ 0x10, 0x20, 0x01, 0xc1,
+ 0xe0, 0xf0, 0x24, 0x24, 0x32, 0x01, 0xcf, 0xf0, 0x00, 0x24, 0xf5, 0x03,
+ 0xf0, 0x42, 0x74, 0x74,
+ 0x21, 0x20, 0x33, 0x57, 0x67, 0xdc, 0x41, 0x56, 0xde, 0x10, 0x21, 0x11,
+ 0x21, 0xee, 0x10, 0x64,
+ 0x01, 0xed, 0xfd, 0x11, 0x24, 0x00, 0x0e, 0x0e, 0x10, 0x10, 0x00, 0x2f,
+ 0x1f, 0x40, 0x10, 0xff,
+ 0x0f, 0x01, 0x31, 0x75, 0x00, 0x0f, 0x01, 0x02, 0x37, 0x05, 0xe0, 0x22,
+ 0x23, 0xe3, 0x81, 0x01,
+ 0x14, 0x01, 0xd1, 0xf4, 0x14, 0x02, 0xd0, 0x10, 0x76, 0x22, 0x01, 0x00,
+ 0xf0, 0x01, 0x23, 0x01,
+ 0xe1, 0xe4, 0xf3, 0xd1, 0xd2, 0xe4, 0x80, 0x9f, 0xe0, 0xf0, 0xf0, 0xee,
+ 0xda, 0xe0, 0xe0, 0xbd,
+ 0xfc, 0x10, 0x30, 0x0c, 0x0c, 0x10, 0x30, 0x00, 0x30, 0x5f, 0x4e, 0x40,
+ 0x1c, 0x0a, 0x1e, 0x10,
+ 0x30, 0x51, 0x31, 0x23, 0x22, 0x0e, 0x31, 0x56, 0x12, 0x00, 0x22, 0x35,
+ 0x21, 0x00, 0x51, 0x20,
+ 0x00, 0x56, 0x34, 0x00, 0x0e, 0x10, 0x40, 0x2f, 0x1c, 0xfd, 0xef, 0xd0,
+ 0xbd, 0xdb, 0xfe, 0x50,
+ 0x13, 0xd1, 0xb1, 0xe1, 0x17, 0x57, 0x11, 0x11, 0x01, 0x11, 0x32, 0x53,
+ 0x12, 0x03, 0x35, 0x33,
+ 0x11, 0x00, 0x02, 0xd2, 0xb1, 0xe1, 0xe2, 0xd1, 0xd3, 0xc3, 0x9f, 0xeb,
+ 0x00, 0x03, 0xe2, 0xd0,
+ 0xf0, 0x00, 0x30, 0x0b, 0xec, 0x0f, 0x2e, 0x1d, 0x3e, 0xfa, 0x8c, 0xde,
+ 0x0f, 0x20, 0x0f, 0x9a,
+ 0xdd, 0xde, 0xee, 0xfe, 0xd9, 0xee, 0x0e, 0xde, 0xdd, 0xfd, 0xfe, 0xdd,
+ 0x0c, 0x0d, 0xdb, 0xbd,
+ 0xee, 0xfd, 0xfd, 0xda, 0x1e, 0x7f, 0x1e, 0xfc, 0xde, 0xde, 0xce, 0xed,
+ 0x0d, 0xee, 0x8c, 0xac,
+ 0xfe, 0xff, 0xee, 0xcc, 0xef, 0xdd, 0xef, 0xde, 0xba, 0xfe, 0x0e, 0xff,
+ 0xee, 0xc0, 0xe0, 0xec,
+ 0xd9, 0x0f, 0xdf, 0xf0, 0xf0, 0xe0, 0x00, 0xe0, 0xcf, 0x02, 0x23, 0x77,
+ 0x77, 0xbc, 0xdc, 0x74,
+ 0x01, 0xee, 0x00, 0x33, 0xff, 0xca, 0x21, 0x33, 0xf0, 0xcd, 0x0f, 0x21,
+ 0x11, 0xef, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f, 0x01, 0x01, 0xdf, 0x11, 0x22, 0x01, 0xe0, 0x8d,
+ 0x03, 0x07, 0xef, 0xfd,
+ 0x00, 0xee, 0xe0, 0x04, 0x01, 0x00, 0xde, 0xde, 0xf2, 0x90, 0xbd, 0xf0,
+ 0xf0, 0x04, 0xf1, 0xd0,
+ 0xde, 0xef, 0xe3, 0xdf, 0xcf, 0xdb, 0xb8, 0xf0, 0xf0, 0xfe, 0x10, 0x21,
+ 0xef, 0xed, 0x0f, 0x64,
+ 0x11, 0xfc, 0x21, 0x23, 0x00, 0x17, 0x12, 0xce, 0x0f, 0xe0, 0xd3, 0xb4,
+ 0x9f, 0xef, 0xff, 0xfd,
+ 0x01, 0x12, 0x14, 0x14, 0xfc, 0x0c, 0x73, 0x45, 0x1f, 0x2e, 0x2c, 0x40,
+ 0x45, 0x42, 0x20, 0x1e,
+ 0x2e, 0x20, 0x11, 0x11, 0x0b, 0x4e, 0x51, 0x01, 0x02, 0x00, 0xf9, 0x1f,
+ 0x30, 0xfe, 0xff, 0xe0,
+ 0xfe, 0x0c, 0xfb, 0x50, 0x0f, 0xcc, 0xfe, 0x00, 0x60, 0x21, 0x11, 0x0f,
+ 0x1e, 0x21, 0x57, 0x15,
+ 0x01, 0x00, 0x02, 0x02, 0xf2, 0x03, 0x35, 0x02, 0xe0, 0x72, 0x77, 0x12,
+ 0x11, 0x21, 0x21, 0x41,
+ 0x23, 0x24, 0x22, 0x01, 0x02, 0x05, 0xe1, 0xf1, 0x03, 0xc2, 0xa0, 0xc0,
+ 0xe1, 0x04, 0xe0, 0xe0,
+ 0xef, 0x00, 0x43, 0x10, 0xe8, 0x2e, 0x71, 0x11, 0x0f, 0x3f, 0x40, 0x31,
+ 0x1e, 0x10, 0x34, 0x00,
+ 0xed, 0x2e, 0x6f, 0x2d, 0x1b, 0x1f, 0x10, 0x1d, 0x0d, 0x2d, 0x5d, 0x64,
+ 0x27, 0x10, 0x10, 0x30,
+ 0x43, 0x13, 0x00, 0x20, 0x35, 0x42, 0x42, 0x3f, 0x19, 0x2f, 0x01, 0x00,
+ 0x10, 0x40, 0xff, 0xc0,
+ 0xf3, 0xf0, 0xf3, 0xe5, 0xe3, 0xd2, 0xa1, 0x07, 0xe6, 0xc1, 0x00, 0x33,
+ 0xd2, 0xd3, 0xd2, 0x64,
+ 0x44, 0x43, 0x23, 0x9a, 0x33, 0x25, 0xce, 0x10, 0x01, 0x54, 0x11, 0xbb,
+ 0x00, 0x33, 0x02, 0xfe,
+ 0xff, 0x22, 0x01, 0xee, 0x00, 0x42, 0x23, 0x10, 0x0f, 0x0e, 0x00, 0x10,
+ 0x2f, 0x20, 0x0e, 0x1d,
+ 0x3f, 0x21, 0x15, 0xe0, 0x00, 0x77, 0xef, 0xeb, 0x50, 0x11, 0xfe, 0xfe,
+ 0x62, 0x23, 0xe8, 0xed,
+ 0x40, 0x52, 0x00, 0xfc, 0x0f, 0x11, 0x00, 0xfe, 0x1e, 0x40, 0x00, 0x0d,
+ 0xed, 0x00, 0x00, 0xce,
+ 0xde, 0x0f, 0xee, 0x98, 0xf0, 0xe1, 0xab, 0xed, 0x02, 0xf1, 0xcd, 0xff,
+ 0xef, 0xfe, 0xed, 0x17,
+ 0x24, 0xbf, 0xee, 0x01, 0x24, 0x22, 0x11, 0xe1, 0xc2, 0x04, 0x03, 0xf4,
+ 0xf3, 0xe1, 0xbf, 0xe1,
+ 0xd5, 0xc3, 0xd1, 0xd0, 0x00, 0x01, 0x00, 0xe2, 0xe1, 0xbb, 0x2e, 0x71,
+ 0x10, 0x0d, 0x1b, 0x3f,
+ 0x1b, 0x1d, 0x6f, 0x1f, 0x2f, 0x0b, 0x0d, 0x30, 0x3d, 0x3f, 0x31, 0x02,
+ 0x01, 0x42, 0x33, 0x00,
+ 0xdc, 0x1f, 0x00, 0x88, 0x0f, 0x61, 0x10, 0x0b, 0x0d, 0xff, 0x01, 0x13,
+ 0x0f, 0xfc, 0x0d, 0x1f,
+ 0xbc, 0xbe, 0xf1, 0xf0, 0x0d, 0x0b, 0xfe, 0xff, 0xfe, 0x0e, 0x30, 0x50,
+ 0x23, 0x12, 0x01, 0x17,
+ 0x77, 0x32, 0x20, 0x00, 0x42, 0x25, 0xf1, 0xc1, 0x01, 0x01, 0xe0, 0xc0,
+ 0xc2, 0xa0, 0xe0, 0xe1,
+ 0xf1, 0xf0, 0xef, 0xdb, 0xde, 0xe3, 0xe5, 0x8a, 0xf0, 0x35, 0xe0, 0xdf,
+ 0x20, 0x41, 0x00, 0xce,
+ 0x00, 0x34, 0x00, 0xfd, 0x1f, 0x20, 0xfd, 0xdc, 0xe0, 0xef, 0xac, 0xfe,
+ 0xef, 0xbb, 0xcc, 0xdc,
+ 0xff, 0x0f, 0x0e, 0xdb, 0xfe, 0xff, 0xbc, 0xed, 0x0d, 0x1d, 0xdc, 0x2f,
+ 0x20, 0xab, 0xfe, 0x10,
+ 0x30, 0xff, 0xde, 0x00, 0x02, 0xa0, 0xf1, 0xf2, 0xe0, 0xdf, 0x14, 0xf3,
+ 0x8e, 0xef, 0x03, 0x01,
+ 0xfe, 0x0d, 0x1c, 0x20, 0x67, 0x12, 0x10, 0x10, 0x00, 0xee, 0xdc, 0xec,
+ 0x12, 0xf2, 0x8c, 0xdc,
+ 0xfe, 0x0e, 0xfd, 0xdd, 0xca, 0xce, 0xff, 0xff, 0xfd, 0xfb, 0x0e, 0x0f,
+ 0x10, 0x10, 0x21, 0x21,
+ 0x20, 0x2e, 0x0d, 0x01, 0xc5, 0x8f, 0xcf, 0x01, 0x31, 0x20, 0x10, 0x02,
+ 0x07, 0x11, 0x0f, 0x7f,
+ 0x33, 0x00, 0xf0, 0x35, 0x56, 0x42, 0x11, 0x10, 0x32, 0x15, 0x23, 0x43,
+ 0x21, 0x00, 0xe0, 0xe0,
+ 0xd3, 0xd2, 0xd0, 0x80, 0xbe, 0xe0, 0x06, 0xc1, 0xc0, 0xf4, 0xe4, 0xd2,
+ 0xf1, 0x15, 0x02, 0x02,
+ 0xf2, 0xf1, 0x04, 0x16, 0x33, 0x23, 0xe0, 0x00, 0x74, 0x75, 0x02, 0x00,
+ 0x02, 0x02, 0xf2, 0xf3,
+ 0x05, 0x01, 0xb0, 0xe0, 0x03, 0xf0, 0xdd, 0x0e, 0x33, 0x67, 0x05, 0xce,
+ 0xcb, 0x10, 0x20, 0x20,
+ 0x10, 0x0f, 0x0e, 0x0e, 0x50, 0x33, 0x20, 0x10, 0x30, 0x32, 0x11, 0x0f,
+ 0x0e, 0x0f, 0x1e, 0x0f,
+ 0x24, 0x77, 0x53, 0x20, 0x2e, 0x3d, 0x4e, 0x3e, 0x3c, 0x2c, 0x4c, 0x3c,
+ 0x3e, 0x10, 0x10, 0x50,
+ 0x5e, 0x2e, 0x22, 0x14, 0x01, 0xf0, 0xf0, 0xdd, 0xeb, 0x0f, 0x0f, 0xfb,
+ 0x1e, 0x60, 0x35, 0x03,
+ 0x00, 0x01, 0x33, 0x55, 0x12, 0x11, 0x11, 0x02, 0x17, 0x15, 0xd1, 0xf2,
+ 0x13, 0x83, 0xd2, 0x03,
+ 0xe4, 0xe3, 0x02, 0xf2, 0xd1, 0x32, 0x32, 0x75, 0x24, 0x75, 0x00, 0xac,
+ 0x76, 0x01, 0xfe, 0x10,
+ 0x21, 0x22, 0x10, 0xba, 0x00, 0x54, 0x00, 0xec, 0x0e, 0x11, 0x11, 0xee,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x0f, 0xee, 0xff, 0xfd, 0xfc, 0x40, 0xfe, 0xca, 0xff, 0x00, 0x20,
+ 0xdc, 0xdd, 0x50, 0x41,
+ 0x00, 0x98, 0x0f, 0x20, 0x00, 0xfe, 0xef, 0xff, 0xf0, 0xf0, 0xe0, 0xce,
+ 0xee, 0x01, 0xc0, 0xab,
+ 0x00, 0x02, 0x00, 0x01, 0x12, 0xff, 0xdd, 0x02, 0x37, 0x43, 0x00, 0xdc,
+ 0x10, 0x03, 0xbf, 0x00,
+ 0x10, 0xfe, 0xdd, 0xfe, 0x03, 0xf0, 0xd0, 0x36, 0x00, 0xf1, 0x74, 0x43,
+ 0x31, 0x0f, 0x00, 0x25,
+ 0x23, 0x53, 0x75, 0x32, 0x22, 0x21, 0x36, 0x22, 0x00, 0x64, 0x01, 0x0f,
+ 0x53, 0x13, 0x10, 0x02,
+ 0x14, 0x00, 0xfb, 0x1e, 0x63, 0x13, 0x0d, 0x0c, 0x1f, 0x00, 0x0e, 0x2d,
+ 0x2e, 0x4d, 0x2d, 0x3d,
+ 0x1e, 0x00, 0xc0, 0xee, 0x17, 0x06, 0xc1, 0x12, 0x23, 0xd2, 0xa2, 0x05,
+ 0x04, 0xd1, 0xd0, 0x02,
+ 0x35, 0x43, 0x11, 0x00, 0x31, 0x53, 0x13, 0x24, 0x34, 0x53, 0x34, 0x32,
+ 0x23, 0x04, 0x03, 0x14,
+ 0xf4, 0xe3, 0xd3, 0x81, 0xe1, 0xd3, 0xb2, 0xd0, 0xce, 0xce, 0xce, 0xed,
+ 0xfd, 0x0e, 0xff, 0x01,
+ 0x15, 0x0e, 0x0a, 0xfd, 0xfb, 0x2f, 0x1d, 0x3c, 0x0e, 0xdc, 0x0e, 0x40,
+ 0xae, 0x88, 0x20, 0x30,
+ 0xff, 0xff, 0x2e, 0x30, 0x12, 0x12, 0x62, 0x21, 0x20, 0x0d, 0x50, 0x47,
+ 0x00, 0x0e, 0x32, 0x11,
+ 0x0f, 0x21, 0x11, 0x30, 0x1d, 0x0b, 0x0e, 0xee, 0xd0, 0xce, 0x0c, 0x2e,
+ 0x20, 0xfe, 0xf0, 0xde,
+ 0x34, 0x44, 0xf0, 0x77, 0x63, 0xdc, 0x01, 0x47, 0x32, 0x00, 0x01, 0x02,
+ 0x12, 0x02, 0x12, 0x02,
+ 0xf2, 0xe2, 0x03, 0x27, 0xd1, 0xa1, 0x01, 0x02, 0x02, 0x80, 0xe1, 0xf2,
+ 0xe1, 0xe1, 0xe2, 0xe1,
+ 0xdc, 0xeb, 0xce, 0xdf, 0x10, 0x40, 0xed, 0xbc, 0xec, 0x0d, 0x00, 0xc0,
+ 0xee, 0xca, 0xad, 0xcc,
+ 0xde, 0xcd, 0xfc, 0x0f, 0xfe, 0xdb, 0xed, 0x20, 0x2e, 0xfc, 0xec, 0xec,
+ 0xdd, 0xfc, 0x4e, 0x5e,
+ 0x0c, 0x0d, 0x1f, 0x40, 0x0d, 0xfc, 0x0e, 0x4f, 0x0f, 0xbd, 0xde, 0xed,
+ 0xdc, 0x89, 0xed, 0xfe,
+ 0xff, 0xcd, 0xdd, 0xdd, 0xef, 0xec, 0xcb, 0xee, 0x00, 0x0f, 0xab, 0xfe,
+ 0x00, 0x00, 0xcd, 0x00,
+ 0xcd, 0xff, 0x01, 0x00, 0x00, 0xee, 0xef, 0xae, 0xe0, 0xf1, 0xec, 0xef,
+ 0x15, 0x77, 0x03, 0xca,
+ 0x00, 0x23, 0x11, 0x00, 0x11, 0x12, 0x00, 0xff, 0x10, 0x22, 0x00, 0xef,
+ 0x00, 0x30, 0x0f, 0x0e,
+ 0x0e, 0x30, 0x11, 0xcf, 0x11, 0x50, 0x08, 0x0d, 0x20, 0x32, 0x12, 0x46,
+ 0x53, 0xf0, 0xd0, 0x02,
+ 0x33, 0x52, 0x01, 0x8f, 0xec, 0xdf, 0xd1, 0xd3, 0xaf, 0xd8, 0xd0, 0xf0,
+ 0xcf, 0xdd, 0xd0, 0xc2,
+ 0xd2, 0x00, 0xfe, 0xe8, 0xdc, 0xef, 0xf0, 0xcf, 0xdd, 0xfe, 0x0e, 0x10,
+ 0x54, 0x33, 0x21, 0x33,
+ 0x10, 0x2d, 0x51, 0x27, 0xd1, 0xe0, 0x36, 0x88, 0xf1, 0x75, 0xad, 0x00,
+ 0x00, 0x01, 0xf1, 0xab,
+ 0x00, 0x23, 0x00, 0xfe, 0xec, 0x00, 0x43, 0x00, 0xec, 0x10, 0x42, 0x11,
+ 0x0f, 0x00, 0x21, 0x11,
+ 0x11, 0x21, 0x24, 0x01, 0x00, 0x10, 0x1f, 0x63, 0x11, 0xe8, 0x40, 0x32,
+ 0xfd, 0xfc, 0x2e, 0x50,
+ 0x0e, 0x0c, 0x1f, 0x0f, 0xfe, 0xed, 0x0f, 0x73, 0x02, 0xef, 0xf0, 0xf0,
+ 0xff, 0x0e, 0x47, 0x12,
+ 0xee, 0x00, 0x01, 0x47, 0x44, 0x00, 0x22, 0x42, 0x21, 0x66, 0x02, 0x11,
+ 0x44, 0x02, 0x00, 0x02,
+ 0x56, 0x01, 0x02, 0x23, 0x01, 0x02, 0x03, 0x43, 0x24, 0xf1, 0xd0, 0xd0,
+ 0x00, 0x33, 0xf0, 0xe0,
+ 0x54, 0x11, 0x01, 0x01, 0x00, 0x41, 0x42, 0x43, 0x10, 0x0d, 0x0b, 0xfc,
+ 0x0e, 0xeb, 0xee, 0x20,
+ 0xed, 0xda, 0x1f, 0xaf, 0x8e, 0xed, 0x10, 0x64, 0x11, 0x00, 0x0c, 0x0e,
+ 0x00, 0x63, 0x24, 0x10,
+ 0x0e, 0x30, 0x53, 0x20, 0x1d, 0x29, 0x1e, 0x30, 0x1f, 0x0e, 0x00, 0x0e,
+ 0x0d, 0x0c, 0xef, 0xd0,
+ 0xa0, 0xe5, 0xf0, 0xfe, 0xeb, 0xbd, 0x02, 0x17, 0x03, 0xcf, 0x01, 0x47,
+ 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0xf2, 0xe2, 0x01, 0x00, 0x43, 0x77, 0x12, 0x32, 0x01, 0xd0, 0xf0,
+ 0x13, 0x34, 0x00, 0x0f,
+ 0x40, 0x73, 0x23, 0x00, 0xef, 0xec, 0x1f, 0x32, 0x23, 0xfe, 0x1d, 0x74,
+ 0x34, 0x26, 0x22, 0x10,
+ 0x10, 0x20, 0x0f, 0xcd, 0x13, 0xe1, 0xe1, 0x65, 0x20, 0x4f, 0x2b, 0x3e,
+ 0x40, 0x0e, 0x0d, 0x63,
+ 0x77, 0x04, 0xf8, 0x2f, 0x50, 0x01, 0x00, 0x0e, 0x00, 0xef, 0xee, 0x01,
+ 0x20, 0x1d, 0x09, 0x0e,
+ 0x21, 0xf1, 0x80, 0xef, 0xdf, 0xef, 0x00, 0xff, 0xfd, 0xfc, 0xcd, 0xdd,
+ 0xee, 0x02, 0xe0, 0xba,
+ 0x10, 0x0f, 0xde, 0x12, 0xf2, 0x05, 0x33, 0xa0, 0xd0, 0xd1, 0x8f, 0xf3,
+ 0x07, 0xf5, 0xf1, 0xe1,
+ 0x01, 0x03, 0xf1, 0xc0, 0xf3, 0x02, 0x10, 0x42, 0x00, 0xed, 0x0f, 0x10,
+ 0x2c, 0x72, 0x2f, 0xf8,
+ 0x0e, 0x00, 0x0f, 0x22, 0x02, 0xcb, 0x3e, 0x70, 0x20, 0x30, 0x22, 0x22,
+ 0x10, 0x0c, 0x0a, 0x30,
+ 0x10, 0x01, 0x65, 0x00, 0xef, 0x20, 0x2f, 0x0d, 0x0f, 0xbf, 0x02, 0xe0,
+ 0x0d, 0x3c, 0x1b, 0x50,
+ 0xfe, 0x0e, 0x77, 0x00, 0x0c, 0x0e, 0x20, 0x01, 0x02, 0xf0, 0x32, 0x11,
+ 0xef, 0xef, 0xd2, 0x91,
+ 0xf1, 0x11, 0x74, 0x11, 0x0d, 0x05, 0x26, 0x12, 0x32, 0x0f, 0xf0, 0x04,
+ 0xd2, 0xc2, 0xe3, 0xe1,
+ 0xf0, 0x80, 0x92, 0xe4, 0xd5, 0x01, 0xe0, 0xde, 0xc0, 0xd1, 0xd3, 0xf2,
+ 0xfd, 0x08, 0x2e, 0x51,
+ 0x25, 0x11, 0x20, 0x40, 0x2c, 0x1c, 0x4f, 0x3f, 0x2e, 0x1d, 0x05, 0x05,
+ 0x20, 0x00, 0x1d, 0x00,
+ 0xa3, 0x0c, 0x2a, 0x12, 0x69, 0x0d, 0x11, 0x14, 0x8d, 0x02, 0xeb, 0x08,
+ 0x71, 0x02, 0xbb, 0xff,
+ 0x34, 0x3f, 0x2b, 0x11, 0x03, 0xd0, 0xce, 0x10, 0x21, 0x35, 0xab, 0xda,
+ 0x74, 0x10, 0xcc, 0x02,
+ 0x11, 0x00, 0xfd, 0xfe, 0x43, 0x02, 0xdd, 0xed, 0x02, 0x22, 0xfe, 0xdb,
+ 0x34, 0x11, 0xbf, 0x0f,
+ 0xec, 0x00, 0x73, 0xff, 0xdc, 0x12, 0xfe, 0xec, 0x23, 0x40, 0xda, 0xaf,
+ 0x00, 0x12, 0xfb, 0xf0,
+ 0x00, 0xd0, 0xe0, 0xf0, 0x10, 0x1f, 0xdb, 0xe0, 0xc0, 0xd0, 0x00, 0xdd,
+ 0x1c, 0x60, 0xf2, 0xbc,
+ 0xf0, 0x00, 0xbc, 0x00, 0x47, 0xff, 0xac, 0x01, 0x01, 0xe0, 0xec, 0xf0,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0e, 0x0d, 0x00, 0x10, 0x2f, 0x30, 0x51, 0xfc, 0x0d, 0x03, 0xff, 0xdb,
+ 0x02, 0xf1, 0xab, 0xdf,
+ 0x00, 0xdf, 0x00, 0x01, 0xfd, 0xe9, 0x20, 0x02, 0x8e, 0xdd, 0x60, 0x00,
+ 0x0e, 0x00, 0xf1, 0xfb,
+ 0xee, 0x44, 0x33, 0x00, 0xbc, 0x02, 0x03, 0xec, 0xfe, 0x02, 0xe1, 0xf1,
+ 0xf0, 0xed, 0x47, 0xe3,
+ 0x8d, 0xbf, 0x01, 0x04, 0x11, 0x00, 0x00, 0x0d, 0x00, 0x03, 0x05, 0x02,
+ 0xdc, 0xdc, 0x13, 0x55,
+ 0xfe, 0xce, 0xf0, 0xf3, 0x01, 0x1c, 0xfe, 0xce, 0xf6, 0xb3, 0xc1, 0x00,
+ 0xff, 0x0b, 0x00, 0x02,
+ 0xd0, 0xc0, 0xe0, 0x0f, 0xbf, 0xd8, 0x20, 0x30, 0x20, 0x10, 0x00, 0xe0,
+ 0xff, 0x0e, 0x7f, 0x2c,
+ 0xff, 0x00, 0x10, 0x20, 0xfd, 0xf3, 0xee, 0x5c, 0x5a, 0x0c, 0x00, 0x03,
+ 0x20, 0xf9, 0xf0, 0xf0,
+ 0x44, 0x00, 0x30, 0x73, 0x4d, 0xcd, 0x17, 0x01, 0xee, 0x01, 0x76, 0x0f,
+ 0xdd, 0x21, 0x54, 0x00,
+ 0xf0, 0xdd, 0xf0, 0x53, 0x00, 0x0f, 0x01, 0x35, 0x01, 0xbd, 0x10, 0x37,
+ 0xef, 0xcf, 0x10, 0x22,
+ 0x20, 0x11, 0xf0, 0xdf, 0x00, 0x01, 0xe2, 0xe1, 0xbd, 0x0d, 0x66, 0x00,
+ 0xdf, 0x00, 0x03, 0x35,
+ 0x1f, 0x0c, 0x73, 0x01, 0xde, 0x04, 0x1e, 0xec, 0x11, 0x10, 0x0e, 0x52,
+ 0xf1, 0xef, 0x20, 0x3d,
+ 0x3e, 0x02, 0x8a, 0xff, 0x15, 0x01, 0xfe, 0xff, 0xcf, 0xf4, 0x05, 0xbc,
+ 0xee, 0x00, 0x10, 0xf0,
+ 0xff, 0x0d, 0x70, 0x13, 0x0b, 0x00, 0x01, 0x00, 0x1e, 0x50, 0x0e, 0xec,
+ 0xef, 0xef, 0x00, 0x0e,
+ 0x40, 0x1f, 0xf8, 0xee, 0x22, 0xf0, 0xab, 0x10, 0x01, 0x0d, 0x0e, 0x0d,
+ 0x75, 0x11, 0xee, 0x15,
+ 0x0d, 0x99, 0x21, 0x33, 0x0f, 0xfe, 0x42, 0x10, 0xdd, 0x10, 0x51, 0x0e,
+ 0xff, 0x00, 0x00, 0xe1,
+ 0xe4, 0x0e, 0x09, 0x40, 0x32, 0xc1, 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x31,
+ 0x0a, 0x40, 0x12, 0xc0,
+ 0xf0, 0xee, 0x20, 0x51, 0x10, 0x32, 0xe1, 0xad, 0x13, 0x13, 0xf6, 0x04,
+ 0x01, 0xee, 0xed, 0xc1,
+ 0x17, 0x13, 0xcf, 0xee, 0x02, 0x03, 0x10, 0x30, 0x73, 0x21, 0x33, 0x00,
+ 0x01, 0x47, 0x05, 0x00,
+ 0x63, 0x21, 0x0e, 0x00, 0xe0, 0x12, 0x22, 0xff, 0xbd, 0x10, 0x44, 0x30,
+ 0x06, 0x04, 0x10, 0x00,
+ 0xff, 0x00, 0x63, 0x53, 0x22, 0x21, 0x27, 0x32, 0x01, 0x0f, 0xde, 0x23,
+ 0x32, 0x41, 0x51, 0x30,
+ 0x33, 0xf0, 0xd0, 0x24, 0x31, 0x33, 0x00, 0xad, 0x04, 0x17, 0x21, 0x1f,
+ 0x34, 0x34, 0x42, 0x10,
+ 0x43, 0x41, 0x2e, 0x31, 0x02, 0xbd, 0x0f, 0x01, 0x05, 0xdf, 0xe4, 0x07,
+ 0x57, 0x00, 0xbf, 0x0f,
+ 0x01, 0x13, 0x34, 0xbf, 0xef, 0x50, 0x33, 0xe1, 0xd2, 0x31, 0x75, 0x11,
+ 0x00, 0x1f, 0x30, 0x44,
+ 0x02, 0x00, 0x17, 0x11, 0x00, 0xd0, 0x22, 0x21, 0xe1, 0xa1, 0x05, 0xf3,
+ 0xf0, 0xef, 0x41, 0x73,
+ 0x53, 0x02, 0xe2, 0x01, 0x01, 0x23, 0x1c, 0x09, 0x0f, 0x13, 0x47, 0x03,
+ 0xec, 0x0f, 0x20, 0x00,
+ 0x00, 0x01, 0x01, 0x00, 0xee, 0x0f, 0x71, 0x30, 0x5f, 0x0f, 0x04, 0xf4,
+ 0xff, 0x0d, 0x2f, 0x33,
+ 0x61, 0x2c, 0x20, 0x01, 0x13, 0x1b, 0x3d, 0x0d, 0x1c, 0x00, 0x53, 0xf2,
+ 0xbc, 0xeb, 0xdd, 0xed,
+ 0xf0, 0xf7, 0xa0, 0xfd, 0x01, 0x01, 0x00, 0x0f, 0xd0, 0xd1, 0xb0, 0xfb,
+ 0xec, 0x0d, 0x0f, 0x23,
+ 0x90, 0xdc, 0xd0, 0xe0, 0x0b, 0x00, 0x1f, 0xec, 0xd1, 0xc3, 0xd0, 0xe0,
+ 0x81, 0x00, 0xe0, 0x00,
+ 0x05, 0xe0, 0xe8, 0xee, 0xce, 0xf0, 0xf0, 0xbd, 0x0d, 0x12, 0x64, 0x00,
+ 0xe9, 0xcf, 0x0f, 0x10,
+ 0x1e, 0x30, 0x30, 0xec, 0xff, 0x11, 0x0e, 0x0d, 0x20, 0xdd, 0xd0, 0xef,
+ 0xdc, 0x2d, 0x78, 0x50,
+ 0x03, 0xe2, 0xfe, 0xfd, 0x1f, 0x52, 0x03, 0x00, 0x0e, 0x3e, 0x70, 0x2f,
+ 0xe8, 0x0f, 0x1f, 0x50,
+ 0x21, 0x0d, 0xdc, 0x00, 0x0e, 0x0b, 0xcf, 0xf0, 0xd3, 0x02, 0x53, 0x4f,
+ 0xf9, 0xbf, 0x00, 0xf0,
+ 0xfe, 0xff, 0x0e, 0xf0, 0x00, 0xd3, 0xe5, 0xac, 0xef, 0xe1, 0xee, 0xea,
+ 0xf2, 0xe2, 0x80, 0xd0,
+ 0x02, 0xe0, 0xef, 0xdd, 0xf7, 0xe1, 0xe2, 0xde, 0x8a, 0xee, 0xff, 0x00,
+ 0x50, 0x00, 0x0f, 0x02,
+ 0xe0, 0xf0, 0x0e, 0x08, 0xed, 0xb0, 0xf3, 0xe1, 0xdf, 0xca, 0xf0, 0xee,
+ 0x0f, 0x1f, 0xff, 0x90,
+ 0xf0, 0xeb, 0x0e, 0xee, 0x0c, 0x1f, 0x20, 0x0f, 0xbe, 0xfb, 0xf0, 0x00,
+ 0xee, 0xee, 0x10, 0x10,
+ 0xfe, 0x88, 0xff, 0x0f, 0x00, 0xf0, 0xef, 0xfe, 0x10, 0x0f, 0xcd, 0xff,
+ 0x01, 0x16, 0xe0, 0xf0,
+ 0x50, 0x62, 0x1e, 0x1d, 0x33, 0x02, 0xea, 0x10, 0x5f, 0x41, 0x21, 0xfb,
+ 0xff, 0x10, 0x12, 0xf5,
+ 0xe1, 0xce, 0xef, 0xe1, 0xc2, 0x02, 0x52, 0x2f, 0xde, 0xa0, 0xea, 0xef,
+ 0x01, 0x14, 0x10, 0x1c,
+ 0xf0, 0x00, 0x0d, 0x2c, 0x76, 0x00, 0xf0, 0x00, 0x21, 0x26, 0x00, 0xbf,
+ 0xd1, 0xf1, 0x00, 0x00,
+ 0xdc, 0xe0, 0x61, 0x30, 0x30, 0x11, 0x00, 0xce, 0xfe, 0x12, 0x10, 0x0c,
+ 0x21, 0x71, 0x24, 0x25,
+ 0x11, 0x00, 0x0a, 0x00, 0x44, 0x61, 0xf0, 0xdc, 0x0e, 0x1f, 0x01, 0x13,
+ 0x47, 0x42, 0x31, 0x00,
+ 0x1f, 0x22, 0x01, 0xd1, 0x07, 0x51, 0x31, 0x71, 0x33, 0x13, 0x15, 0x32,
+ 0x1f, 0x0e, 0x41, 0x32,
+ 0x30, 0x43, 0x06, 0xe0, 0x00, 0x45, 0xe0, 0x00, 0x41, 0x71, 0x33, 0x00,
+ 0x02, 0x04, 0x20, 0x0d,
+ 0x42, 0x43, 0x02, 0xf1, 0xe0, 0xf1, 0x13, 0x4d, 0x1e, 0xff, 0xf0, 0x17,
+ 0x37, 0x04, 0xd0, 0xd0,
+ 0x0f, 0x21, 0xd4, 0x90, 0xd1, 0x8e, 0xf0, 0x00, 0x0e, 0x40, 0x35, 0x10,
+ 0x10, 0x0d, 0xfe, 0x0f,
+ 0x0f, 0x46, 0x10, 0xcb, 0xde, 0xe0, 0xff, 0x01, 0x42, 0xe0, 0xb0, 0xe0,
+ 0x00, 0x10, 0x3c, 0x2f,
+ 0xff, 0xe4, 0xd2, 0xe2, 0x1c, 0x18, 0x70, 0x30, 0xa0, 0x02, 0x01, 0x01,
+ 0x00, 0x09, 0x00, 0x31,
+ 0x12, 0x20, 0x10, 0xea, 0xa0, 0xcf, 0xc0, 0x00, 0x31, 0x43, 0x0f, 0xeb,
+ 0xf0, 0x02, 0xcf, 0x00,
+ 0x23, 0x41, 0x7f, 0x51, 0x26, 0x10, 0x0e, 0x00, 0x22, 0x21, 0x0e, 0x1e,
+ 0x01, 0x37, 0x11, 0xfd,
+ 0x00, 0x12, 0x11, 0x10, 0x11, 0xf1, 0x22, 0x30, 0x02, 0x77, 0x77, 0xd0,
+ 0xce, 0x00, 0x00, 0x0f,
+ 0x3f, 0x40, 0x23, 0x25, 0x20, 0x00, 0x22, 0x05, 0xd0, 0x01, 0x22, 0x3f,
+ 0x1d, 0x11, 0x91, 0xe3,
+ 0xf5, 0x04, 0x41, 0x1f, 0x1e, 0x54, 0x03, 0xd0, 0xce, 0x01, 0x11, 0x63,
+ 0x47, 0x31, 0x10, 0x0f,
+ 0x00, 0x03, 0xf2, 0x0e, 0x51, 0x33, 0x22, 0x06, 0x05, 0xf1, 0xfe, 0x4f,
+ 0x50, 0xf0, 0xe1, 0x17,
+ 0x43, 0x00, 0xbf, 0x0f, 0x00, 0x53, 0x33, 0x27, 0x10, 0x50, 0x00, 0x0f,
+ 0x20, 0x30, 0x1d, 0xdf,
+ 0x26, 0x53, 0xef, 0xed, 0xf0, 0x31, 0x5e, 0x1f, 0xf0, 0xd5, 0x10, 0x53,
+ 0x4f, 0x0a, 0xf0, 0x30,
+ 0x01, 0xc0, 0xee, 0xff, 0x0f, 0xe0, 0xfc, 0x2f, 0x52, 0x05, 0x20, 0x40,
+ 0xf0, 0x82, 0xe7, 0xe1,
+ 0xe1, 0x0f, 0xee, 0xd0, 0xd0, 0xc1, 0xf4, 0x0f, 0x08, 0xd0, 0xaf, 0x00,
+ 0x11, 0x20, 0xfb, 0xae,
+ 0x00, 0xe1, 0x00, 0x20, 0xdf, 0xc9, 0xe0, 0x00, 0xd1, 0xad, 0xee, 0xdf,
+ 0x00, 0xe1, 0x0a, 0x0d,
+ 0xd0, 0x10, 0xef, 0x88, 0xdf, 0x00, 0x10, 0x1e, 0x00, 0x0e, 0xfc, 0xb0,
+ 0x00, 0xff, 0x1e, 0x0d,
+ 0xcd, 0x0e, 0x40, 0xec, 0xdb, 0x00, 0x00, 0x9a, 0xce, 0xf0, 0xef, 0xfe,
+ 0xe0, 0x10, 0x31, 0xeb,
+ 0xef, 0x0e, 0x0f, 0x3e, 0x62, 0x10, 0x2f, 0x1a, 0xff, 0xe0, 0xad, 0xfe,
+ 0x0f, 0x01, 0x00, 0xeb,
+ 0x30, 0x40, 0xa0, 0xff, 0xe5, 0xf1, 0xc0, 0xd0, 0x0d, 0x1f, 0xfe, 0xbd,
+ 0xf0, 0xe3, 0x01, 0xf8,
+ 0xef, 0x20, 0x03, 0xb2, 0xd0, 0xe0, 0xdb, 0xad, 0x01, 0x03, 0x01, 0x03,
+ 0xe2, 0xd0, 0xee, 0xdf,
+ 0xe4, 0xaf, 0xd8, 0xe1, 0x03, 0xd0, 0xae, 0x01, 0x04, 0x00, 0x1f, 0x1e,
+ 0x00, 0x12, 0xc0, 0xeb,
+ 0x0e, 0xea, 0xe0, 0x42, 0x40, 0x10, 0x0f, 0xef, 0x6f, 0x3d, 0x19, 0xfe,
+ 0xe1, 0xe3, 0xd0, 0x0d,
+ 0x5f, 0x20, 0x03, 0x03, 0x10, 0x7c, 0x50, 0x0b, 0x10, 0x02, 0x37, 0x55,
+ 0x2f, 0x1e, 0x0f, 0xf1,
+ 0x01, 0xf0, 0x01, 0x22, 0xfe, 0xd0, 0x04, 0x72, 0x71, 0x14, 0x05, 0x01,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x17, 0x40, 0x1f, 0x1f, 0x31, 0x16, 0x10, 0x22, 0x10, 0x22, 0x45, 0x01,
+ 0x00, 0xe1, 0xe2, 0x80,
+ 0xc2, 0xf3, 0xe0, 0x00, 0x10, 0x33, 0xc2, 0xb0, 0xf2, 0x02, 0x0f, 0x3d,
+ 0x35, 0x06, 0x01, 0x10,
+ 0x20, 0x01, 0x90, 0x00, 0x00, 0x0e, 0xf2, 0x05, 0x11, 0xfc, 0xbc, 0xdd,
+ 0x02, 0x07, 0xd0, 0xef,
+ 0x0d, 0x2f, 0x10, 0xbd, 0xdc, 0xf0, 0xbc, 0xef, 0x13, 0x43, 0x1f, 0x0b,
+ 0x20, 0x4f, 0x0d, 0xca,
+ 0x0f, 0x00, 0xef, 0xec, 0xfe, 0x0f, 0xae, 0xf0, 0xd5, 0x8f, 0xb8, 0xf0,
+ 0x1f, 0x10, 0x2f, 0x10,
+ 0x12, 0x00, 0x0e, 0x1f, 0x2e, 0x10, 0x50, 0x31, 0x10, 0x1e, 0xe8, 0x0f,
+ 0x1f, 0x40, 0x3f, 0x61,
+ 0x15, 0xe0, 0xd0, 0x00, 0x00, 0xfe, 0xde, 0x22, 0x74, 0x10, 0x00, 0xde,
+ 0xfa, 0x10, 0x4e, 0x2f,
+ 0xe0, 0xbd, 0x0f, 0xe3, 0x15, 0x2d, 0xfc, 0x02, 0x13, 0x23, 0x71, 0x0c,
+ 0xea, 0xc0, 0xdf, 0xf0,
+ 0xee, 0xfe, 0x00, 0x25, 0x12, 0x12, 0xfd, 0x1b, 0x70, 0x30, 0xf0, 0x00,
+ 0xfe, 0xf0, 0x00, 0x54,
+ 0x45, 0x10, 0x3c, 0x50, 0x31, 0x12, 0x2f, 0xfb, 0x00, 0x65, 0x11, 0x00,
+ 0x4e, 0x00, 0xf1, 0xe3,
+ 0x05, 0x10, 0x1f, 0x21, 0x74, 0x42, 0x30, 0x51, 0x46, 0x11, 0xf0, 0xd0,
+ 0x01, 0x01, 0x22, 0x31,
+ 0x20, 0x10, 0x47, 0x00, 0x00, 0x53, 0x42, 0x20, 0x32, 0x22, 0xf4, 0xe1,
+ 0x12, 0x31, 0x12, 0x13,
+ 0x52, 0x72, 0x45, 0x11, 0x10, 0x01, 0x25, 0x15, 0x23, 0x40, 0x10, 0x12,
+ 0x37, 0x02, 0xe0, 0xf0,
+ 0x14, 0x02, 0x9f, 0xf0, 0x01, 0x03, 0x11, 0x41, 0x14, 0xe0, 0xdd, 0x22,
+ 0x57, 0x01, 0x13, 0x71,
+ 0x20, 0x20, 0x01, 0x01, 0xc0, 0xf0, 0xee, 0xf2, 0x17, 0x47, 0x00, 0x2f,
+ 0x10, 0x02, 0xf1, 0x00,
+ 0x10, 0x72, 0x41, 0x21, 0x02, 0xf3, 0xd0, 0xf2, 0x01, 0x63, 0x32, 0x25,
+ 0x33, 0x43, 0x0f, 0x1e,
+ 0xfd, 0x0e, 0x57, 0x06, 0x0e, 0xe0, 0xa0, 0xde, 0xde, 0x0f, 0x0e, 0x00,
+ 0x00, 0x11, 0x07, 0x12,
+ 0x0f, 0xed, 0x20, 0x30, 0x11, 0x3d, 0x7d, 0x51, 0x33, 0x2e, 0x4a, 0x30,
+ 0x32, 0x22, 0x0f, 0x0f,
+ 0xee, 0xcf, 0x11, 0x33, 0x07, 0xf7, 0xbe, 0x2f, 0x70, 0x02, 0xdb, 0xdd,
+ 0x31, 0x22, 0xde, 0xca,
+ 0x00, 0x00, 0x00, 0xd2, 0x02, 0x21, 0x0b, 0x3f, 0x70, 0xdf, 0x8e, 0x0f,
+ 0xf2, 0x01, 0xed, 0xe9,
+ 0x00, 0xe0, 0x03, 0x1e, 0xed, 0xdf, 0xd0, 0xe0, 0xae, 0xe0, 0x00, 0x36,
+ 0x30, 0xcc, 0xc0, 0xe2,
+ 0xdf, 0xfe, 0x0d, 0x2b, 0x5d, 0x40, 0x10, 0x0e, 0xcb, 0xdb, 0xee, 0x0f,
+ 0xf2, 0xed, 0xdb, 0xef,
+ 0x8e, 0xde, 0x11, 0x74, 0x10, 0x11, 0x1f, 0x00, 0xff, 0xee, 0xfe, 0x03,
+ 0x27, 0xfe, 0xdd, 0x21,
+ 0x30, 0x50, 0x1e, 0xdf, 0xe0, 0xaa, 0x00, 0x00, 0x32, 0x02, 0xe0, 0x01,
+ 0x17, 0x0f, 0xcb, 0x00,
+ 0xd0, 0x00, 0x20, 0x2c, 0x70, 0x72, 0x00, 0x0d, 0xfe, 0xf3, 0xd4, 0xe2,
+ 0xc3, 0x11, 0x01, 0x01,
+ 0x8f, 0xf2, 0xd4, 0xeb, 0xcd, 0xf2, 0xf3, 0xf0, 0xd8, 0x00, 0xe4, 0xc0,
+ 0xcc, 0xdf, 0xff, 0x1d,
+ 0x2e, 0xe1, 0x93, 0xe2, 0xed, 0xe8, 0xe0, 0x00, 0x02, 0xb0, 0xee, 0x0f,
+ 0x0f, 0xdc, 0xfd, 0xfe,
+ 0xec, 0xc0, 0xc0, 0xcf, 0xee, 0xd8, 0xcc, 0xff, 0xee, 0x1e, 0x2c, 0x1f,
+ 0x61, 0x00, 0xcc, 0xfb,
+ 0xe0, 0x0d, 0xdd, 0xbc, 0xef, 0xed, 0xee, 0xfd, 0xee, 0xcb, 0xde, 0x0f,
+ 0x10, 0xdf, 0xbb, 0xde,
+ 0x00, 0xf0, 0xe0, 0x0a, 0x30, 0x60, 0x10, 0x00, 0x2c, 0x0f, 0x1e, 0x5f,
+ 0x20, 0x0f, 0x0d, 0x00,
+ 0x14, 0x03, 0x01, 0x01, 0x11, 0x0e, 0x5a, 0x71, 0x21, 0xe0, 0xd0, 0xe1,
+ 0xd0, 0xbc, 0x12, 0x57,
+ 0x11, 0x00, 0x0f, 0xf1, 0xf4, 0xd0, 0xe2, 0x11, 0x51, 0x11, 0x00, 0xc2,
+ 0xc2, 0xd0, 0x06, 0xd0,
+ 0xcb, 0x00, 0x10, 0x20, 0x02, 0x12, 0x10, 0x02, 0xe7, 0xe2, 0xa0, 0xf0,
+ 0x0f, 0x0e, 0x11, 0x11,
+ 0x44, 0x51, 0x5f, 0x4e, 0x31, 0x13, 0x0d, 0xf8, 0x0f, 0xef, 0xd0, 0x9b,
+ 0xfc, 0x0f, 0x20, 0x10,
+ 0x37, 0x40, 0x30, 0x20, 0xf0, 0xe0, 0x02, 0x13, 0x71, 0x52, 0x0e, 0x0d,
+ 0x03, 0x07, 0x31, 0x31,
+ 0x00, 0x31, 0x40, 0x74, 0x46, 0x01, 0xf0, 0xff, 0x01, 0x05, 0x01, 0x31,
+ 0x52, 0x21, 0x01, 0x01,
+ 0x03, 0x00, 0x3e, 0x50, 0x56, 0x23, 0x13, 0x04, 0x01, 0x10, 0x10, 0x23,
+ 0x27, 0x11, 0x02, 0x15,
+ 0x01, 0xf0, 0xb0, 0xe1, 0x03, 0xf1, 0xf3, 0xd0, 0xf2, 0xe2, 0x00, 0x73,
+ 0x64, 0x00, 0x03, 0x26,
+ 0x04, 0x02, 0xef, 0xf0, 0xe0, 0xf2, 0xef, 0xdd, 0x10, 0x76, 0x63, 0xff,
+ 0xfe, 0xf0, 0x01, 0x03,
+ 0x12, 0x0b, 0xda, 0xf0, 0x01, 0xc0, 0xec, 0x41, 0x62, 0x10, 0x0a, 0x11,
+ 0x01, 0x20, 0x0f, 0xfe,
+ 0xec, 0xde, 0x2f, 0x30, 0xfe, 0xbd, 0x00, 0x00, 0x0b, 0xff, 0x31, 0xb0,
+ 0xab, 0x00, 0xf0, 0x12,
+ 0xf1, 0x02, 0xee, 0x3e, 0x4b, 0x7f, 0x2e, 0xea, 0xee, 0xcd, 0x20, 0x40,
+ 0x0c, 0x2f, 0x31, 0x00,
+ 0x0f, 0x1f, 0x63, 0x05, 0x0d, 0xca, 0x0f, 0x30, 0x32, 0xf0, 0xdf, 0x20,
+ 0x32, 0xdd, 0xff, 0x54,
+ 0x42, 0x2c, 0x2f, 0x22, 0x07, 0xe2, 0x0e, 0x2d, 0x40, 0x76, 0x34, 0xf0,
+ 0xae, 0x0d, 0x00, 0x11,
+ 0x22, 0x03, 0x01, 0x55, 0x11, 0xff, 0xe0, 0x13, 0x36, 0xcf, 0xd0, 0x13,
+ 0x10, 0x0f, 0x4f, 0x64,
+ 0x12, 0xff, 0xff, 0x47, 0x45, 0x00, 0x1f, 0x20, 0x21, 0x00, 0x0e, 0xd1,
+ 0xd0, 0xb0, 0x0f, 0x72,
+ 0x12, 0x34, 0x04, 0xf3, 0x05, 0x1f, 0x0e, 0x0f, 0x04, 0x04, 0x11, 0x72,
+ 0x21, 0x00, 0xf0, 0x22,
+ 0x77, 0x00, 0x00, 0x01, 0x37, 0x00, 0xbe, 0x00, 0x31, 0x12, 0xff, 0xe0,
+ 0x32, 0x55, 0xf0, 0xfe,
+ 0x10, 0x0e, 0x0e, 0x63, 0x13, 0x00, 0x0e, 0x10, 0x10, 0x0b, 0x43, 0x03,
+ 0xfc, 0xdf, 0xe3, 0xd3,
+ 0xe0, 0xbd, 0xcf, 0xf2, 0x00, 0x22, 0xe2, 0xbe, 0x0f, 0x0f, 0xdb, 0xcd,
+ 0x17, 0x44, 0xdf, 0x9b,
+ 0xff, 0xf0, 0x02, 0xe0, 0xfb, 0x10, 0xec, 0xd0, 0x21, 0x32, 0x22, 0xc0,
+ 0x8c, 0xee, 0x01, 0x03,
+ 0x0c, 0xeb, 0xef, 0xce, 0x04, 0x22, 0x0d, 0xfd, 0x22, 0x43, 0x22, 0x00,
+ 0x0e, 0x03, 0xb8, 0xec,
+ 0x00, 0x73, 0x0b, 0xeb, 0x00, 0x31, 0xad, 0xeb, 0xf0, 0x12, 0x00, 0x00,
+ 0xc5, 0x00, 0x96, 0x00,
+ 0x38, 0xe6, 0x10, 0xbb, 0xcb, 0xeb, 0x49, 0xc0, 0xba, 0xff, 0xde, 0xbe,
+ 0xe0, 0xdd, 0xde, 0x0d,
+ 0x21, 0x32, 0x0c, 0x1e, 0x74, 0x30, 0x0b, 0x10, 0x42, 0x31, 0x10, 0x51,
+ 0x34, 0x1f, 0x0e, 0x37,
+ 0x67, 0x01, 0x00, 0x00, 0x14, 0x01, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf1,
+ 0xe3, 0xf3, 0xe2, 0x02,
+ 0x77, 0x34, 0x01, 0xc2, 0xf4, 0xe2, 0xc1, 0xd1, 0x02, 0x34, 0x11, 0x13,
+ 0x24, 0xe1, 0x80, 0xee,
+ 0xf1, 0xf4, 0xf1, 0xd0, 0xd2, 0xe4, 0xa0, 0xcf, 0xf0, 0x05, 0x00, 0x20,
+ 0x57, 0x12, 0x00, 0x10,
+ 0x20, 0x41, 0x0f, 0xed, 0xff, 0x31, 0x20, 0xc8, 0xee, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x10, 0xff, 0xcd,
+ 0x40, 0x42, 0xef, 0xcc, 0x31, 0x77, 0x40, 0x00, 0x0e, 0x62, 0x23, 0x0f,
+ 0x1e, 0x21, 0x34, 0x11,
+ 0x00, 0x13, 0x16, 0x00, 0xee, 0x10, 0x33, 0xe0, 0xdf, 0x02, 0x25, 0x11,
+ 0x00, 0x01, 0x20, 0x60,
+ 0x2c, 0x09, 0x0e, 0x3e, 0x2e, 0x10, 0x71, 0x21, 0x11, 0x03, 0x06, 0xc3,
+ 0xd5, 0xe3, 0xb3, 0xb1,
+ 0xb0, 0xe0, 0x04, 0x26, 0x01, 0xb0, 0xf2, 0xe1, 0xe1, 0xe1, 0xe2, 0xd0,
+ 0xdf, 0xcf, 0xd0, 0xe0,
+ 0xdf, 0xee, 0x1f, 0x2c, 0x4c, 0x4e, 0x2f, 0x1e, 0x30, 0x1e, 0xb8, 0xdf,
+ 0x0f, 0xfd, 0xfb, 0x50,
+ 0x1f, 0xb9, 0xcd, 0x0f, 0x31, 0x0f, 0xdd, 0x1e, 0x4f, 0x3f, 0x2c, 0x1c,
+ 0x4f, 0x7f, 0x0c, 0x0c,
+ 0x1d, 0x0c, 0x0d, 0xfd, 0x1e, 0x0e, 0xbc, 0xde, 0xce, 0xe0, 0x01, 0xff,
+ 0xfe, 0xef, 0xfd, 0xfe,
+ 0xff, 0x0f, 0x0c, 0x2e, 0x74, 0x60, 0x1a, 0x0d, 0x0c, 0x21, 0x41, 0x21,
+ 0x10, 0x3f, 0x31, 0x56,
+ 0x36, 0x00, 0xd0, 0x02, 0xf1, 0xd0, 0xff, 0x63, 0x13, 0xf0, 0xe0, 0x17,
+ 0x43, 0x00, 0xc0, 0x02,
+ 0x37, 0x12, 0x22, 0x12, 0xe1, 0x01, 0x74, 0x23, 0x11, 0x11, 0x32, 0x43,
+ 0xf0, 0xe0, 0x22, 0x34,
+ 0xe0, 0x8e, 0xe0, 0x05, 0xe0, 0xad, 0x00, 0x04, 0x02, 0xfe, 0x00, 0x26,
+ 0x00, 0xcc, 0x22, 0x77,
+ 0x00, 0xee, 0x10, 0x32, 0x00, 0xdb, 0x0f, 0x52, 0x21, 0xfe, 0xfc, 0x10,
+ 0x43, 0xff, 0xde, 0x25,
+ 0x65, 0xf0, 0xdf, 0x21, 0x44, 0x00, 0xff, 0x21, 0x22, 0x21, 0x12, 0x43,
+ 0x56, 0x00, 0x00, 0x32,
+ 0x55, 0x00, 0xf0, 0x11, 0x12, 0xef, 0x01, 0x35, 0xf0, 0xc0, 0xf1, 0xe0,
+ 0xe1, 0xdf, 0xed, 0x50,
+ 0x41, 0x0b, 0xfd, 0x41, 0x21, 0x0e, 0x0e, 0x43, 0x44, 0xfe, 0xda, 0xe0,
+ 0x13, 0x03, 0x8e, 0xf2,
+ 0x03, 0x00, 0xdd, 0x13, 0x14, 0xc9, 0xce, 0x13, 0x02, 0xbd, 0xdc, 0x00,
+ 0x22, 0x11, 0xec, 0x0f,
+ 0x10, 0x0e, 0x1f, 0x0f, 0x0f, 0x01, 0xbd, 0x12, 0x02, 0xda, 0xcd, 0x01,
+ 0x67, 0xff, 0xbc, 0xdc,
+ 0x10, 0x55, 0xff, 0xde, 0x00, 0x11, 0x00, 0x11, 0x21, 0xfe, 0xfe, 0x75,
+ 0x20, 0xeb, 0xfd, 0x10,
+ 0x51, 0x00, 0x0b, 0xff, 0x00, 0x10, 0xfe, 0xde, 0xef, 0xf0, 0xbe, 0xef,
+ 0x25, 0x00, 0x9b, 0xf0,
+ 0x12, 0xf0, 0xbb, 0xff, 0x0f, 0x10, 0x00, 0xec, 0xed, 0x21, 0x41, 0x0d,
+ 0xdb, 0x00, 0x42, 0x10,
+ 0xfe, 0x21, 0x20, 0xcd, 0x11, 0x44, 0xed, 0xdc, 0x32, 0x44, 0x0f, 0xdc,
+ 0xcd, 0x00, 0x0f, 0x00,
+ 0x13, 0x89, 0xbd, 0x03, 0x24, 0x0f, 0xed, 0xfe, 0x0f, 0x14, 0x11, 0xee,
+ 0xbb, 0x00, 0x00, 0xcd,
+ 0xee, 0x03, 0x01, 0xbb, 0xee, 0x00, 0xef, 0x00, 0xf0, 0xdc, 0x01, 0x12,
+ 0x89, 0xf0, 0x13, 0x01,
+ 0xee, 0x00, 0x11, 0xfd, 0x00, 0x31, 0xfd, 0xc8, 0x0f, 0x51, 0x21, 0xed,
+ 0xcc, 0x11, 0x00, 0xef,
+ 0x12, 0xee, 0xcd, 0x33, 0x31, 0xeb, 0x0f, 0x74, 0x01, 0x11, 0x54, 0x10,
+ 0x10, 0x32, 0x21, 0x53,
+ 0x13, 0x0e, 0x02, 0x37, 0x57, 0x02, 0xcf, 0xff, 0x47, 0x11, 0xcf, 0xee,
+ 0x01, 0x43, 0x0f, 0xfd,
+ 0x0f, 0x00, 0x40, 0x11, 0x0f, 0xfc, 0x21, 0x55, 0xff, 0xef, 0x00, 0x23,
+ 0x23, 0xf0, 0xf0, 0x01,
+ 0xf0, 0xad, 0xf2, 0x17, 0x16, 0xc0, 0xd0, 0x11, 0x13, 0xb0, 0xd0, 0xe0,
+ 0x03, 0x11, 0x01, 0xef,
+ 0xdd, 0x46, 0x43, 0xdf, 0xf0, 0x43, 0x00, 0x0f, 0x30, 0xfe, 0x00, 0x0f,
+ 0x88, 0xdd, 0x44, 0x00,
+ 0xdd, 0xff, 0x00, 0x03, 0x02, 0xff, 0x00, 0x54, 0x11, 0x31, 0x63, 0x31,
+ 0x35, 0x2f, 0x09, 0x20,
+ 0x61, 0x0d, 0xb8, 0x10, 0x31, 0xfe, 0xdc, 0x20, 0x31, 0xce, 0xdd, 0x00,
+ 0xfe, 0xef, 0x00, 0xde,
+ 0xcb, 0x0f, 0x10, 0x1f, 0x0e, 0xed, 0x40, 0x74, 0x0e, 0x0a, 0x00, 0x72,
+ 0x00, 0x0d, 0x00, 0x24,
+ 0x10, 0x0f, 0x00, 0x36, 0x00, 0xef, 0x31, 0x74, 0x00, 0x00, 0x03, 0x25,
+ 0x00, 0xc0, 0xf0, 0x03,
+ 0x03, 0xf0, 0x25, 0x12, 0xcf, 0x01, 0x77, 0x21, 0xdf, 0x00, 0x44, 0x22,
+ 0xe0, 0xc0, 0x00, 0x02,
+ 0xf1, 0xf0, 0xd0, 0xcf, 0xe0, 0x03, 0xf1, 0xad, 0xf0, 0x17, 0x02, 0xe0,
+ 0xf0, 0x35, 0x11, 0x8d,
+ 0x00, 0x35, 0x0f, 0xec, 0x10, 0x52, 0xff, 0xdb, 0x11, 0x42, 0x0f, 0xec,
+ 0x0e, 0x53, 0x21, 0xfd,
+ 0xfd, 0x01, 0x20, 0x0e, 0xfe, 0x10, 0x34, 0x20, 0xec, 0xfc, 0x61, 0x44,
+ 0x0f, 0x0d, 0x34, 0x43,
+ 0x10, 0x0e, 0x00, 0x77, 0x02, 0xf0, 0xf1, 0x04, 0x02, 0xd0, 0x11, 0x67,
+ 0x00, 0x00, 0xef, 0x10,
+ 0x34, 0x00, 0xfe, 0x0f, 0x52, 0xfe, 0x01, 0x35, 0xdf, 0x10, 0x32, 0x00,
+ 0x1f, 0x31, 0x01, 0xe1,
+ 0x8f, 0xe0, 0x07, 0xf2, 0xc0, 0xdf, 0xe0, 0x03, 0xd0, 0xbf, 0xef, 0xa8,
+ 0xee, 0x02, 0x23, 0x01,
+ 0xee, 0xdc, 0x00, 0x34, 0x00, 0x8a, 0xff, 0x22, 0x00, 0xed, 0x10, 0x11,
+ 0xed, 0xdd, 0xfe, 0xdd,
+ 0xef, 0xe0, 0xbb, 0xff, 0xed, 0xed, 0x20, 0x41, 0xfa, 0xbb, 0x40, 0x20,
+ 0x0f, 0x0d, 0x1e, 0x60,
+ 0x09, 0xed, 0x0e, 0x51, 0x0f, 0xea, 0xee, 0x10, 0x10, 0xce, 0xff, 0x00,
+ 0xcd, 0xee, 0xf0, 0xf0,
+ 0xbd, 0xff, 0xee, 0xd9, 0x10, 0x31, 0x00, 0x00, 0xef, 0x11, 0x20, 0xff,
+ 0x20, 0x74, 0x34, 0xdc,
+ 0xef, 0x76, 0x21, 0x00, 0x00, 0x10, 0x31, 0x43, 0x00, 0xca, 0xf0, 0x23,
+ 0x01, 0xcf, 0x00, 0x22,
+ 0x01, 0xef, 0xe0, 0x23, 0x46, 0x00, 0x00, 0x30, 0x76, 0x01, 0xe0, 0xf0,
+ 0x12, 0x01, 0xbe, 0xff,
+ 0x01, 0x00, 0xec, 0xbc, 0x01, 0x03, 0xe0, 0xae, 0x01, 0x07, 0xef, 0xef,
+ 0x02, 0x35, 0xf0, 0xbe,
+ 0x12, 0x13, 0x01, 0x00, 0x11, 0x20, 0x0f, 0x40, 0x40, 0xe8, 0x0f, 0x41,
+ 0xee, 0xff, 0x30, 0x40,
+ 0xfd, 0x00, 0x15, 0xf0, 0xbf, 0xff, 0x56, 0x21, 0xdc, 0x10, 0x73, 0x42,
+ 0x00, 0x10, 0x10, 0x24,
+ 0x22, 0x12, 0x14, 0x03, 0x03, 0xf6, 0xf3, 0xd1, 0xd1, 0x33, 0x44, 0xc0,
+ 0x00, 0x76, 0xf0, 0xde,
+ 0x00, 0x44, 0x00, 0x1f, 0x20, 0x00, 0x0e, 0x1f, 0x71, 0x11, 0x0d, 0xf8,
+ 0x10, 0x53, 0x00, 0x00,
+ 0xff, 0x0f, 0x01, 0x00, 0xdf, 0xe0, 0xf0, 0xf1, 0xbe, 0xed, 0xdd, 0x17,
+ 0x24, 0x9e, 0xef, 0xe0,
+ 0x02, 0x01, 0x23, 0x22, 0xfd, 0x0d, 0x0e, 0x1f, 0x43, 0x00, 0xe8, 0x20,
+ 0x41, 0x89, 0xee, 0x23,
+ 0x12, 0xcb, 0xe0, 0xf0, 0x14, 0x12, 0x00, 0x00, 0x51, 0x43, 0x00, 0x0c,
+ 0x00, 0x43, 0x1f, 0x2d,
+ 0x60, 0x08, 0x0d, 0x10, 0x40, 0x1f, 0x0c, 0xed, 0xfe, 0x21, 0x00, 0xca,
+ 0xdf, 0xdf, 0xdf, 0xef,
+ 0x0f, 0x0e, 0xdd, 0x0f, 0x5f, 0x0b, 0xed, 0x20, 0x52, 0x0f, 0xed, 0xdc,
+ 0x1f, 0x72, 0x43, 0x00,
+ 0x10, 0x33, 0x46, 0x20, 0x1e, 0x40, 0x22, 0x24, 0x0f, 0xed, 0x02, 0xf4,
+ 0xd0, 0xe1, 0x02, 0xff,
+ 0x0f, 0x12, 0xf1, 0x17, 0x57, 0xc1, 0xa0, 0x04, 0x23, 0x00, 0xf0, 0xc0,
+ 0xce, 0x25, 0x22, 0x9d,
+ 0xf0, 0x04, 0xf0, 0xcf, 0xf0, 0x16, 0xf1, 0xcf, 0xcf, 0xf1, 0x06, 0xe1,
+ 0xe1, 0x02, 0x23, 0xf1,
+ 0xcf, 0x02, 0x04, 0xbd, 0xdb, 0x11, 0x31, 0xee, 0xce, 0x20, 0x33, 0xfe,
+ 0xed, 0x10, 0x10, 0xcd,
+ 0xe0, 0xe3, 0x8e, 0xec, 0xef, 0xdd, 0x00, 0x20, 0x2a, 0x4e, 0x3d, 0x2c,
+ 0x2c, 0x3e, 0x3e, 0x73,
+ 0x22, 0x0d, 0x00, 0x57, 0x02, 0x00, 0x03, 0x12, 0x0f, 0x01, 0x27, 0x12,
+ 0x00, 0x10, 0x61, 0x00,
+ 0x0e, 0x00, 0x20, 0xf9, 0xcc, 0x50, 0x31, 0x1e, 0x1e, 0x51, 0x33, 0x0d,
+ 0xe8, 0x10, 0x73, 0x00,
+ 0xdd, 0xee, 0x0f, 0x00, 0xff, 0xcd, 0xe0, 0x06, 0xe1, 0x90, 0xf0, 0xf1,
+ 0xf4, 0xe1, 0xd0, 0xf0,
+ 0x07, 0xf2, 0xc1, 0xe2, 0x03, 0x22, 0x00, 0xd0, 0xee, 0xf0, 0xe1, 0xc0,
+ 0xed, 0x88, 0xdc, 0xd0,
+ 0xf0, 0xde, 0xce, 0xe0, 0x02, 0xf2, 0xee, 0x0e, 0x0d, 0xfa, 0x1f, 0x20,
+ 0xdb, 0x0d, 0x70, 0x7f,
+ 0x2b, 0x1c, 0x4e, 0x2f, 0x1c, 0x0d, 0x0d, 0x0f, 0x0d, 0xca, 0xee, 0xef,
+ 0xed, 0xde, 0xad, 0xec,
+ 0xee, 0xfe, 0x0e, 0xfc, 0xee, 0xed, 0xee, 0xfe, 0xed, 0xfd, 0xff, 0xdd,
+ 0x4f, 0x60, 0x20, 0x64,
+ 0x2e, 0x18, 0x30, 0x30, 0x11, 0x22, 0x21, 0x0f, 0x20, 0x20, 0x00, 0xed,
+ 0x00, 0xc0, 0x8c, 0x04,
+ 0x05, 0x01, 0x03, 0x16, 0x32, 0xf0, 0xc0, 0xe1, 0xe1, 0xe3, 0x14, 0x63,
+ 0x00, 0x02, 0x07, 0xf2,
+ 0xc1, 0xe1, 0x02, 0x00, 0xdf, 0xf0, 0x27, 0x15, 0xf1, 0x02, 0xf1, 0xb1,
+ 0xf1, 0x34, 0xf2, 0x80,
+ 0xd0, 0xf2, 0xf1, 0xd0, 0xde, 0x30, 0x72, 0x30, 0x09, 0x0e, 0x40, 0x30,
+ 0x0e, 0xdb, 0xce, 0xf0,
+ 0x01, 0xe0, 0xef, 0x0f, 0x1f, 0x1f, 0x0b, 0xfe, 0x70, 0x73, 0x41, 0x10,
+ 0x20, 0x34, 0x33, 0x24,
+ 0x26, 0x43, 0x23, 0x13, 0x47, 0x44, 0x22, 0x13, 0x22, 0x33, 0x43, 0x25,
+ 0x12, 0x02, 0x02, 0x33,
+ 0x33, 0x31, 0x42, 0x73, 0x24, 0x10, 0x10, 0x22, 0x21, 0x21, 0x33, 0x32,
+ 0x1f, 0x30, 0x32, 0x00,
+ 0xf1, 0xf5, 0xf4, 0x02, 0xf1, 0xcf, 0xa1, 0xd7, 0xb3, 0xc1, 0xb0, 0xef,
+ 0xf2, 0xe3, 0xf0, 0xf3,
+ 0xf5, 0x04, 0x14, 0x32, 0x42, 0x51, 0x31, 0x1f, 0x0b, 0x0e, 0x0e, 0xfd,
+ 0xed, 0x0f, 0x31, 0x5f,
+ 0xf8, 0xbd, 0xee, 0xf0, 0xf2, 0xd0, 0xaf, 0xf0, 0x02, 0x00, 0x01, 0x14,
+ 0x30, 0x61, 0x43, 0x30,
+ 0x18, 0x2d, 0x5e, 0x2e, 0x2b, 0x2f, 0x30, 0x10, 0x0d, 0xeb, 0xfe, 0x00,
+ 0x10, 0x20, 0x50, 0x1d,
+ 0x1f, 0xf3, 0xe2, 0xe1, 0xc2, 0xe2, 0xd0, 0xc8, 0xdc, 0x00, 0x24, 0xf0,
+ 0xcc, 0x1f, 0x71, 0x72,
+ 0x12, 0x11, 0x11, 0x10, 0x0f, 0x0c, 0xea, 0xff, 0x0f, 0xfd, 0xee, 0xff,
+ 0xde, 0xde, 0xf0, 0xe0,
+ 0xac, 0x0d, 0x30, 0x13, 0xf5, 0xe2, 0xe0, 0xff, 0x20, 0x53, 0x26, 0x01,
+ 0x13, 0x67, 0x00, 0xad,
+ 0xdb, 0xde, 0xd0, 0xc0, 0xef, 0xee, 0x0f, 0xef, 0xde, 0xcd, 0xbc, 0xce,
+ 0xdf, 0xcf, 0xdd, 0xee,
+ 0xf0, 0xdd, 0xd8, 0x0d, 0xec, 0xeb, 0x0f, 0x0d, 0xed, 0xde, 0x1f, 0x0d,
+ 0xee, 0xad, 0xdf, 0xe1,
+ 0x9f, 0xa8, 0xee, 0xf0, 0x00, 0xee, 0xfc, 0x10, 0x20, 0x2f, 0x1f, 0x00,
+ 0x0f, 0x2f, 0x20, 0x1d,
+ 0x3c, 0x7e, 0x40, 0x37, 0x25, 0x34, 0x52, 0x11, 0x22, 0x23, 0x22, 0x12,
+ 0x25, 0x23, 0x22, 0x02,
+ 0x32, 0x73, 0x00, 0x1f, 0x1e, 0x20, 0x25, 0x23, 0x31, 0x61, 0x30, 0x2d,
+ 0x3d, 0x43, 0x15, 0x00,
+ 0x10, 0x10, 0x10, 0x00, 0xcf, 0xef, 0xc4, 0x91, 0xce, 0xd0, 0xd3, 0xc0,
+ 0xde, 0xd7, 0xf7, 0xf4,
+ 0xf1, 0xf2, 0x03, 0xb0, 0xd0, 0xf0, 0x02, 0x0f, 0xdb, 0xde, 0xff, 0xde,
+ 0x8b, 0xfe, 0xef, 0xdd,
+ 0xca, 0xdf, 0xd0, 0xc0, 0xd0, 0xae, 0xe0, 0xd0, 0xd0, 0xdd, 0xfa, 0x0c,
+ 0x1c, 0x2e, 0x2e, 0x0d,
+ 0x0f, 0x2f, 0x4e, 0x3e, 0x0d, 0x1b, 0x60, 0x30, 0x0c, 0xdb, 0x0e, 0x0e,
+ 0x3f, 0x1e, 0xfc, 0xee,
+ 0xef, 0x8c, 0xba, 0xed, 0xed, 0xed, 0xbb, 0xee, 0xfe, 0x0e, 0xfd, 0xfd,
+ 0x0e, 0x1d, 0x2d, 0x4e,
+ 0x5f, 0x3f, 0x2b, 0x2d, 0x3f, 0x3d, 0x1b, 0x1e, 0x3f, 0x50, 0x1d, 0x1c,
+ 0x1e, 0x00, 0xe0, 0xb0,
+ 0xf3, 0xf2, 0x03, 0x67, 0x24, 0x22, 0x12, 0x12, 0x12, 0x43, 0x35, 0x13,
+ 0x02, 0x04, 0x12, 0x34,
+ 0x53, 0x12, 0x22, 0x43, 0x23, 0x02, 0xe6, 0x05, 0x03, 0xb2, 0xc2, 0xd3,
+ 0xc4, 0xb3, 0xe3, 0xe4,
+ 0xc1, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xf3, 0xb1, 0xc0,
+ 0xd0, 0xba, 0xeb, 0xed,
+ 0x0f, 0xff, 0xcd, 0xec, 0x00, 0x0f, 0x1c, 0x4d, 0x3e, 0x3f, 0x1b, 0x2d,
+ 0x50, 0x4f, 0x3e, 0x3d,
+ 0x60, 0x31, 0x20, 0x2e, 0x31, 0x24, 0x27, 0x34, 0x31, 0x32, 0x33, 0x23,
+ 0x13, 0x03, 0x04, 0x34,
+ 0x31, 0x62, 0x22, 0x10, 0x0f, 0x22, 0x67, 0x20, 0x10, 0x41, 0x43, 0x21,
+ 0x30, 0x61, 0x30, 0x30,
+ 0x23, 0x37, 0x27, 0x01, 0x01, 0xf2, 0xe2, 0xc0, 0xb2, 0xd4, 0xd3, 0xc3,
+ 0xe3, 0xe4, 0xd1, 0xe2,
+ 0x06, 0x43, 0x22, 0x02, 0xb3, 0xd3, 0xd2, 0xe1, 0x00, 0x41, 0x43, 0x00,
+ 0x0f, 0xff, 0xcd, 0xcd,
+ 0xc1, 0xc3, 0xc7, 0xe5, 0xe4, 0xd2, 0xc0, 0xcd, 0xfd, 0xfc, 0xfe, 0x10,
+ 0x53, 0x20, 0x2d, 0x2c,
+ 0x3d, 0x30, 0x30, 0x2a, 0x3b, 0x5d, 0x5e, 0x2c, 0x3d, 0x2f, 0x2e, 0x2d,
+ 0x4e, 0x2c, 0x1c, 0x2c,
+ 0x0d, 0xfa, 0xbe, 0xed, 0xbd, 0xdd, 0xfd, 0xed, 0xeb, 0xcd, 0xff, 0x1f,
+ 0x0e, 0x0e, 0xff, 0x00,
+ 0x20, 0x30, 0x73, 0x43, 0x20, 0x2e, 0x30, 0x31, 0x22, 0x11, 0x11, 0x15,
+ 0x37, 0x33, 0x02, 0x23,
+ 0x52, 0x11, 0x11, 0x05, 0x26, 0x33, 0x12, 0xf2, 0xd2, 0x53, 0x76, 0x22,
+ 0x02, 0xf2, 0xf1, 0x23,
+ 0x43, 0x22, 0x51, 0x31, 0x32, 0x23, 0xe3, 0xb1, 0xe6, 0xc4, 0xc2, 0xc2,
+ 0xe3, 0xd2, 0xc0, 0xde,
+ 0x04, 0x16, 0x10, 0x20, 0x41, 0x20, 0x1f, 0x1e, 0x10, 0x24, 0x00, 0xde,
+ 0xbc, 0xce, 0xd0, 0xd0,
+ 0xcf, 0xce, 0xe1, 0x05, 0xe0, 0xfd, 0x0d, 0x6f, 0x1c, 0x18, 0x1d, 0x3d,
+ 0x4e, 0x4f, 0x3e, 0x4f,
+ 0x40, 0x30, 0x32, 0x43, 0x37, 0x44, 0x13, 0x02, 0x13, 0x15, 0x23, 0x23,
+ 0x53, 0x33, 0x21, 0x03,
+ 0xf5, 0xf2, 0xd1, 0xe2, 0xf2, 0x00, 0x23, 0x17, 0x01, 0x12, 0x73, 0x42,
+ 0x21, 0x21, 0x64, 0x33,
+ 0x20, 0x00, 0x0d, 0xdc, 0xcd, 0xff, 0xef, 0xd0, 0xb0, 0xdc, 0xbb, 0xdd,
+ 0xd0, 0xc0, 0xee, 0xc0,
+ 0xd5, 0xc4, 0xd1, 0xf2, 0xf0, 0xee, 0xda, 0xec, 0xfe, 0x0d, 0x1b, 0x0d,
+ 0xdd, 0xcd, 0xee, 0xbf,
+ 0xad, 0xcb, 0xcd, 0xdd, 0xde, 0xef, 0xcc, 0xdc, 0xce, 0xf0, 0xf0, 0xf0,
+ 0x01, 0x02, 0x21, 0x1d,
+ 0x1d, 0x3c, 0x3a, 0x4d, 0x3e, 0x71, 0x32, 0x51, 0x21, 0x20, 0x2b, 0x2e,
+ 0x20, 0x0c, 0xfc, 0xed,
+ 0xec, 0xdc, 0xdc, 0xcd, 0xca, 0xde, 0xdd, 0xdd, 0xcc, 0xde, 0xad, 0xed,
+ 0xee, 0x0e, 0x1d, 0x4e,
+ 0x2e, 0x2e, 0x2e, 0x0e, 0x0c, 0x3e, 0x5e, 0x3f, 0x4d, 0x1d, 0x1e, 0x20,
+ 0x0c, 0xfb, 0x0e, 0x4e,
+ 0x4d, 0x31, 0x45, 0x33, 0x25, 0x13, 0x04, 0x03, 0x03, 0x13, 0x13, 0x22,
+ 0x64, 0x22, 0x22, 0x72,
+ 0x43, 0x20, 0x2f, 0x1e, 0x01, 0x05, 0xd1, 0xa5, 0xe7, 0xd3, 0xb2, 0xd2,
+ 0xd2, 0xd5, 0xd1, 0xb2,
+ 0xe2, 0xf3, 0x06, 0xf2, 0xf1, 0x03, 0x02, 0xf0, 0x01, 0x03, 0x04, 0xd2,
+ 0xc5, 0xb1, 0xc0, 0xf0,
+ 0x03, 0x03, 0xf2, 0xbe, 0xf0, 0xd0, 0xa8, 0xee, 0xff, 0x0f, 0x0d, 0x0d,
+ 0x1e, 0x1e, 0x10, 0x20,
+ 0x2d, 0x1c, 0x2d, 0x61, 0x25, 0x34, 0x34, 0x33, 0x33, 0x23, 0x05, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xec, 0xee, 0x12, 0x04, 0xcc, 0xec, 0x0c, 0x02, 0x0b, 0xdf, 0xcc, 0xbd,
+ 0x34, 0xa8, 0x8d, 0xf1,
+ 0x27, 0x34, 0x1c, 0x30, 0x40, 0x0f, 0xef, 0x30, 0x53, 0x0f, 0x2c, 0x20,
+ 0x12, 0xf0, 0xff, 0x1c,
+ 0x1f, 0x20, 0x20, 0x20, 0x44, 0x20, 0xe2, 0x80, 0xde, 0x05, 0xe2, 0xe0,
+ 0x03, 0x76, 0x1e, 0x09,
+ 0xd0, 0x23, 0x10, 0x0e, 0x31, 0x63, 0x0e, 0x0e, 0xd0, 0x00, 0x0f, 0xf0,
+ 0xb0, 0xdf, 0xc0, 0x07,
+ 0x07, 0xdf, 0xad, 0x00, 0x11, 0xdf, 0xbe, 0x00, 0xf0, 0xdc, 0xd2, 0x16,
+ 0x0e, 0x0f, 0x10, 0x71,
+ 0x1f, 0x0e, 0xdf, 0xe2, 0xf3, 0x20, 0x2c, 0x1e, 0x42, 0xe0, 0xba, 0xfe,
+ 0xe0, 0xd1, 0xbf, 0x00,
+ 0xe0, 0xfb, 0xbd, 0x02, 0x06, 0xd1, 0xf1, 0xe0, 0x0f, 0x00, 0xee, 0x9d,
+ 0x04, 0x27, 0x14, 0xee,
+ 0xad, 0xff, 0x01, 0x10, 0x02, 0xf0, 0xce, 0x1f, 0x41, 0x03, 0x00, 0x05,
+ 0x35, 0xe0, 0xcd, 0x00,
+ 0x02, 0xbf, 0xe0, 0x05, 0x11, 0xce, 0x0e, 0x32, 0x31, 0x0d, 0x10, 0x12,
+ 0xed, 0xae, 0x03, 0x0f,
+ 0xf8, 0x0f, 0xbf, 0xf4, 0xb3, 0xd0, 0xc3, 0xde, 0x00, 0x02, 0x1f, 0x77,
+ 0x05, 0xe0, 0xdb, 0xf0,
+ 0x00, 0x0f, 0x00, 0x12, 0xf0, 0xff, 0xf0, 0xd0, 0xd1, 0xcf, 0xbc, 0xef,
+ 0xbd, 0xfe, 0x0c, 0xe0,
+ 0xf7, 0xae, 0xeb, 0x01, 0x01, 0x00, 0x0e, 0x00, 0x10, 0x00, 0xbc, 0xe0,
+ 0x14, 0x04, 0x00, 0x13,
+ 0x72, 0x1f, 0x0c, 0x22, 0x04, 0x00, 0xee, 0x00, 0x13, 0x02, 0xef, 0x07,
+ 0x04, 0x0f, 0xeb, 0x30,
+ 0x70, 0x61, 0x12, 0x42, 0x3f, 0x0c, 0x21, 0x53, 0x11, 0x2d, 0x3f, 0x6e,
+ 0x2f, 0x3d, 0x09, 0x1e,
+ 0x20, 0x24, 0x32, 0x10, 0x2d, 0xec, 0xd0, 0xf4, 0x14, 0xed, 0x9b, 0xf0,
+ 0x20, 0x36, 0x20, 0x40,
+ 0x20, 0x4f, 0x40, 0x0e, 0x1f, 0x00, 0x10, 0x11, 0xde, 0x9e, 0xf2, 0xff,
+ 0x0e, 0x60, 0x22, 0xe0,
+ 0xcb, 0xf1, 0xf4, 0x02, 0x3f, 0xfc, 0xf0, 0x34, 0x1f, 0x0f, 0xef, 0xff,
+ 0x11, 0x1f, 0x69, 0x2e,
+ 0x3d, 0x52, 0x56, 0x11, 0x20, 0x2f, 0x0f, 0x62, 0x10, 0x3c, 0x00, 0x1c,
+ 0x0e, 0x00, 0x10, 0xff,
+ 0xde, 0x05, 0x07, 0xe0, 0xbb, 0x00, 0x42, 0x70, 0x31, 0x15, 0x20, 0x00,
+ 0x2e, 0x3f, 0x43, 0x56,
+ 0x00, 0x0e, 0x0e, 0x40, 0x51, 0x21, 0x3f, 0x1e, 0x12, 0x14, 0x00, 0x00,
+ 0x3e, 0x0e, 0x0f, 0x21,
+ 0x01, 0xe0, 0xf4, 0x00, 0x00, 0x29, 0x7e, 0x70, 0x50, 0x0e, 0x37, 0x12,
+ 0x0c, 0xed, 0x0f, 0x22,
+ 0x04, 0xe0, 0x01, 0x47, 0x00, 0xed, 0xee, 0xf2, 0xd2, 0xef, 0x2f, 0x72,
+ 0x70, 0xfb, 0xfe, 0x0f,
+ 0x0f, 0x01, 0x02, 0x23, 0x1f, 0x1b, 0x0e, 0xe0, 0xdf, 0xbc, 0xdf, 0xff,
+ 0xbe, 0xe1, 0x07, 0x05,
+ 0x0e, 0xcb, 0x01, 0x00, 0xd0, 0xae, 0x0e, 0x04, 0xe2, 0xdf, 0xce, 0x04,
+ 0x05, 0x20, 0xfe, 0x20,
+ 0x61, 0x04, 0x00, 0xff, 0x10, 0x02, 0xe2, 0xb0, 0x00, 0xf0, 0xef, 0xfc,
+ 0xe0, 0xdd, 0xfd, 0x75,
+ 0x36, 0x03, 0x00, 0x6e, 0x02, 0x13, 0x32, 0x4e, 0x28, 0x0e, 0x2e, 0x61,
+ 0x02, 0x10, 0x2c, 0x51,
+ 0x31, 0x0e, 0x09, 0x00, 0x02, 0xe1, 0xc2, 0x00, 0xff, 0xf0, 0x00, 0x30,
+ 0x73, 0x15, 0x00, 0x00,
+ 0x0f, 0x1f, 0x60, 0x21, 0x1d, 0xfb, 0xf0, 0x24, 0x2f, 0xfa, 0xc0, 0x0f,
+ 0x10, 0x20, 0xf4, 0xb1,
+ 0xe0, 0xee, 0xde, 0x12, 0xe2, 0x8e, 0xec, 0x00, 0xe0, 0xe9, 0xef, 0x00,
+ 0x14, 0xf0, 0xd0, 0xee,
+ 0xed, 0x20, 0x70, 0x46, 0x01, 0xfe, 0xf0, 0x30, 0x0d, 0xf8, 0xff, 0x10,
+ 0x04, 0x81, 0xdf, 0xa0,
+ 0xee, 0xf0, 0x00, 0xf3, 0x01, 0x0f, 0xce, 0xf2, 0xd6, 0xd0, 0x0f, 0x1f,
+ 0x02, 0xc2, 0xcd, 0x08,
+ 0xce, 0x00, 0x10, 0x01, 0xaf, 0x0e, 0x45, 0x41, 0x0f, 0xd0, 0x02, 0xe0,
+ 0xed, 0xc0, 0xe7, 0xe3,
+ 0xff, 0xec, 0xc0, 0x01, 0x04, 0xd0, 0x00, 0x7f, 0x1f, 0x0e, 0x01, 0x27,
+ 0x33, 0xae, 0xec, 0x12,
+ 0x13, 0xcd, 0xdf, 0x02, 0x05, 0xe3, 0xf1, 0xfe, 0xee, 0x90, 0xfe, 0x16,
+ 0x43, 0x01, 0xee, 0x0c,
+ 0x10, 0x0d, 0x1f, 0x32, 0x14, 0x00, 0xe1, 0x80, 0xe0, 0xf0, 0xcf, 0xed,
+ 0xed, 0xda, 0xfc, 0xfe,
+ 0xf1, 0xbf, 0xeb, 0xde, 0xcc, 0xe0, 0xc1, 0xc0, 0xf7, 0xe2, 0xed, 0xec,
+ 0x1e, 0x00, 0x52, 0x15,
+ 0x00, 0xb1, 0x03, 0xe0, 0xfe, 0x31, 0x40, 0x0f, 0x0e, 0xf0, 0xf2, 0xe4,
+ 0xd0, 0x03, 0x72, 0x45,
+ 0x2e, 0x0b, 0x02, 0x04, 0x0f, 0xec, 0x30, 0x74, 0x4f, 0x19, 0x71, 0x21,
+ 0x0f, 0x0e, 0x4e, 0x10,
+ 0x00, 0x15, 0x10, 0x2f, 0x0f, 0xf0, 0xf3, 0x25, 0x12, 0x0e, 0x0d, 0x21,
+ 0x57, 0xff, 0x1e, 0x73,
+ 0x21, 0x00, 0x0f, 0x22, 0x30, 0x29, 0x2e, 0x2f, 0x00, 0x20, 0x23, 0x10,
+ 0x41, 0x10, 0x0d, 0x1d,
+ 0x10, 0xb4, 0x91, 0xe1, 0xe0, 0x09, 0x1e, 0xff, 0xd0, 0x03, 0x31, 0xd0,
+ 0xb0, 0xdd, 0xde, 0x03,
+ 0x12, 0x70, 0x60, 0x12, 0x2d, 0x19, 0x10, 0x02, 0x10, 0xf8, 0x0d, 0x01,
+ 0x10, 0x1e, 0x10, 0xef,
+ 0x88, 0xdd, 0x00, 0x05, 0x40, 0x51, 0x00, 0x11, 0x02, 0x00, 0xfd, 0xf0,
+ 0xe1, 0xe0, 0x0c, 0xf0,
+ 0x0f, 0x10, 0x51, 0x42, 0x31, 0x10, 0x30, 0x6f, 0x37, 0x37, 0x03, 0xdb,
+ 0x00, 0x00, 0xc4, 0x11,
+ 0x30, 0x0f, 0x31, 0x74, 0x30, 0xff, 0xfa, 0x20, 0x71, 0x44, 0x10, 0x0d,
+ 0x10, 0x00, 0x1e, 0x0f,
+ 0x52, 0x13, 0x0f, 0x00, 0x01, 0x02, 0xe2, 0xe6, 0x03, 0x0f, 0xfd, 0xe0,
+ 0x20, 0x78, 0x30, 0x10,
+ 0x22, 0x4f, 0x1b, 0x0e, 0x00, 0x21, 0x37, 0xd0, 0xef, 0x7f, 0x6f, 0x00,
+ 0x00, 0x0f, 0xe1, 0xe2,
+ 0xef, 0xac, 0xf0, 0x20, 0x22, 0xdb, 0xce, 0xec, 0xdf, 0xf0, 0x02, 0x14,
+ 0x30, 0x4d, 0x32, 0x57,
+ 0x23, 0x0f, 0xee, 0x00, 0x41, 0xff, 0xef, 0xf1, 0x02, 0x2f, 0x7f, 0x77,
+ 0x11, 0x0f, 0xdf, 0x03,
+ 0x16, 0x0f, 0x0b, 0x00, 0x31, 0x75, 0x20, 0x0f, 0x1e, 0x10, 0x6e, 0x22,
+ 0x21, 0x1e, 0x1f, 0x20,
+ 0x00, 0x1c, 0x00, 0x14, 0x10, 0x0d, 0x00, 0xd0, 0xa1, 0xf1, 0x14, 0x3f,
+ 0x03, 0x23, 0x2f, 0xfe,
+ 0xb1, 0xd3, 0x08, 0x3b, 0x20, 0xd0, 0xde, 0x71, 0x75, 0x00, 0xec, 0xf0,
+ 0xf1, 0xe2, 0xf2, 0x01,
+ 0x0a, 0xdf, 0x0e, 0xb1, 0xb0, 0xd1, 0xe0, 0xde, 0xbd, 0xf1, 0xf2, 0xed,
+ 0xde, 0xef, 0xe1, 0xe1,
+ 0xe5, 0x01, 0x0d, 0x00, 0x07, 0x23, 0x30, 0xaf, 0xbc, 0xd1, 0xd0, 0xe2,
+ 0x03, 0x01, 0xbc, 0xdb,
+ 0xe0, 0xff, 0x00, 0xde, 0xe4, 0xf7, 0xd7, 0xce, 0xaf, 0xce, 0xc0, 0xd1,
+ 0xf1, 0xcf, 0xef, 0xf0,
+ 0x0f, 0x10, 0xf0, 0x01, 0xfe, 0x0d, 0x0f, 0xbd, 0x01, 0xc7, 0xf3, 0xc5,
+ 0xe2, 0xbf, 0xfe, 0xf5,
+ 0xf0, 0xc0, 0xce, 0xe1, 0xe4, 0x00, 0x0c, 0x00, 0x00, 0xf2, 0x22, 0x22,
+ 0x1c, 0x2c, 0x60, 0x10,
+ 0xfc, 0x90, 0xf0, 0xe7, 0x04, 0xc2, 0xd0, 0xea, 0x00, 0x60, 0x11, 0x00,
+ 0xb0, 0xf0, 0xff, 0x0f,
+ 0x02, 0x21, 0xfe, 0xd0, 0xf0, 0x00, 0xe2, 0xe0, 0xce, 0xef, 0xf7, 0xb4,
+ 0xd0, 0xfe, 0x00, 0xbf,
+ 0xac, 0xef, 0xd0, 0xba, 0xed, 0xe2, 0x03, 0x0f, 0x0c, 0x00, 0x00, 0xc3,
+ 0x05, 0x00, 0x00, 0xee,
+ 0xe0, 0xfe, 0xdf, 0x06, 0xd4, 0xd0, 0xdf, 0xae, 0xef, 0x1f, 0x32, 0xc7,
+ 0x84, 0xed, 0xde, 0xf0,
+ 0xf2, 0xe0, 0xcf, 0xf0, 0x16, 0x4f, 0x0d, 0x02, 0x30, 0x3d, 0x50, 0x24,
+ 0x60, 0x2c, 0x1f, 0xf0,
+ 0xf2, 0x11, 0x3c, 0x0b, 0xed, 0x2e, 0x64, 0x25, 0x02, 0x0d, 0xcc, 0x01,
+ 0x04, 0x10, 0x0f, 0x40,
+ 0x10, 0x4f, 0x10, 0xfd, 0xad, 0x10, 0x46, 0x11, 0xfd, 0xfe, 0x41, 0x20,
+ 0xfd, 0x00, 0x07, 0x10,
+ 0x1f, 0x40, 0x36, 0x00, 0xe0, 0xa0, 0xdd, 0xd0, 0xa1, 0xee, 0xf0, 0x05,
+ 0xee, 0xbf, 0x00, 0x06,
+ 0x10, 0x1f, 0x30, 0x31, 0x02, 0xff, 0xf0, 0x00, 0xff, 0x0c, 0xef, 0x0e,
+ 0xde, 0xaa, 0x00, 0x02,
+ 0x72, 0x12, 0x0b, 0xfc, 0xdd, 0xcf, 0x00, 0x26, 0xc0, 0xb0, 0xd0, 0xed,
+ 0x00, 0x20, 0x02, 0xd1,
+ 0xf1, 0x00, 0x72, 0x1c, 0x1c, 0x0d, 0x10, 0x05, 0x07, 0x01, 0xf0, 0x0c,
+ 0x2f, 0x20, 0x62, 0x00,
+ 0xa0, 0x03, 0xf5, 0xf1, 0x0f, 0x2e, 0x70, 0x32, 0x10, 0x21, 0x0c, 0x1a,
+ 0x21, 0x23, 0x32, 0x1f,
+ 0x10, 0x20, 0x10, 0x0e, 0x4f, 0x0f, 0x15, 0xe3, 0xc2, 0xd0, 0x60, 0x64,
+ 0x0a, 0x1e, 0x10, 0x22,
+ 0xdf, 0xbc, 0x00, 0x01, 0x6d, 0x01, 0x15, 0x26, 0x12, 0x10, 0x0e, 0x1e,
+ 0x11, 0x02, 0xc0, 0xdc,
+ 0xf1, 0x06, 0xa0, 0xed, 0xeb, 0xe0, 0xf0, 0x51, 0x2f, 0xed, 0xd0, 0x13,
+ 0xed, 0x9e, 0x01, 0x35,
+ 0x50, 0x0f, 0xfd, 0x30, 0x21, 0x0e, 0xcd, 0x0d, 0x65, 0x15, 0x31, 0x00,
+ 0xfe, 0x00, 0x07, 0x01,
+ 0xe1, 0xef, 0x00, 0x61, 0x41, 0x33, 0x01, 0x1f, 0x3c, 0x30, 0x30, 0x74,
+ 0x1f, 0x4f, 0x44, 0x22,
+ 0x29, 0x1e, 0x2f, 0x22, 0x20, 0x21, 0x13, 0x33, 0x3f, 0x5f, 0x47, 0x23,
+ 0x0c, 0x5e, 0x21, 0x30,
+ 0x3d, 0x30, 0x45, 0x32, 0x1d, 0x18, 0x20, 0x10, 0x70, 0x30, 0x00, 0x01,
+ 0x20, 0x30, 0x10, 0x31,
+ 0x30, 0x6f, 0x0f, 0xfd, 0xcb, 0x00, 0xcd, 0xff, 0xec, 0xee, 0xcf, 0xf4,
+ 0x04, 0x43, 0x10, 0x1b,
+ 0x2f, 0x5f, 0x20, 0x37, 0x14, 0x0f, 0xec, 0x00, 0x60, 0x2f, 0x2f, 0x30,
+ 0x33, 0x1c, 0x1d, 0x5f,
+ 0x40, 0x40, 0x2f, 0x0f, 0xe1, 0xc1, 0xf2, 0x17, 0x02, 0x00, 0x01, 0x0d,
+ 0x1d, 0x71, 0x33, 0xff,
+ 0xdd, 0x22, 0x44, 0x11, 0x37, 0x50, 0x4e, 0x59, 0x10, 0x31, 0x02, 0x00,
+ 0x03, 0x37, 0x01, 0x1e,
+ 0x30, 0x42, 0x01, 0x50, 0x24, 0x0f, 0x3b, 0x40, 0x51, 0x30, 0x30, 0x33,
+ 0x20, 0x1d, 0x20, 0x1d,
+ 0x09, 0x0f, 0x00, 0xef, 0xf3, 0x55, 0x30, 0x1d, 0x20, 0x23, 0x00, 0x0c,
+ 0xf0, 0x00, 0xf0, 0x8e,
+ 0x02, 0xe2, 0x0f, 0x17, 0x54, 0x0e, 0x60, 0x32, 0xfd, 0xbf, 0xf3, 0x06,
+ 0x1e, 0x0b, 0x01, 0xe1,
+ 0xdf, 0xfe, 0xde, 0xac, 0xdb, 0xde, 0x00, 0xf2, 0xe1, 0xe0, 0xce, 0xcf,
+ 0xbf, 0xef, 0xdf, 0xb1,
+ 0xf1, 0x0e, 0x20, 0x43, 0x07, 0x06, 0x00, 0xbf, 0xfe, 0xf2, 0xe7, 0xe1,
+ 0xe1, 0xd1, 0xd1, 0xae,
+ 0xe0, 0xd0, 0xe0, 0xd2, 0x03, 0x26, 0x01, 0xdd, 0xcc, 0x23, 0x76, 0x2f,
+ 0x1e, 0x20, 0x00, 0x2d,
+ 0x42, 0x24, 0x0e, 0xbc, 0x10, 0x53, 0x02, 0x00, 0xe1, 0xf4, 0x11, 0x20,
+ 0xe8, 0xe0, 0x30, 0x73,
+ 0x1f, 0xcb, 0xf0, 0x12, 0x1f, 0x0e, 0x20, 0x1c, 0xf0, 0xc2, 0x24, 0x51,
+ 0x00, 0x20, 0x3f, 0x1e,
+ 0x00, 0x07, 0xc1, 0xce, 0xbd, 0xe0, 0xd0, 0xc0, 0xe0, 0xdd, 0xcf, 0xcf,
+ 0xdf, 0x20, 0x4f, 0xe5,
+ 0xd3, 0xf0, 0x12, 0xde, 0x9d, 0xf7, 0xf5, 0xee, 0xee, 0x0d, 0x2b, 0x0c,
+ 0x00, 0x31, 0x01, 0xbf,
+ 0xe0, 0x03, 0x02, 0xdb, 0xbd, 0xdf, 0xe0, 0xd1, 0xa2, 0xd6, 0xb0, 0xdd,
+ 0xd1, 0xe4, 0xd0, 0x0d,
+ 0x02, 0x05, 0xc2, 0xfe, 0xbb, 0xe0, 0xff, 0xff, 0xf0, 0x00, 0x04, 0xbf,
+ 0xbc, 0xe3, 0x06, 0xe0,
+ 0xce, 0xd0, 0x12, 0x11, 0xde, 0xd0, 0xf6, 0x10, 0x4f, 0x1e, 0x10, 0xe0,
+ 0xca, 0xaf, 0xf0, 0xf2,
+ 0x04, 0x0f, 0xcd, 0xf0, 0x12, 0x01, 0xc0, 0xb7, 0xe0, 0xc0, 0xef, 0xdf,
+ 0xdf, 0x00, 0xf3, 0xb4,
+ 0xe0, 0x0d, 0xde, 0xd0, 0x03, 0x37, 0x56, 0x00, 0x30, 0x11, 0xe0, 0x80,
+ 0xf3, 0xe0, 0xed, 0xef,
+ 0x1e, 0x2e, 0x01, 0xff, 0x88, 0x0f, 0xe0, 0xf4, 0xfe, 0xed, 0xf2, 0xb0,
+ 0xef, 0xfe, 0x0f, 0x0d,
+ 0xe1, 0x04, 0x13, 0x4e, 0xf8, 0xb0, 0xe0, 0x00, 0x00, 0xdf, 0xda, 0xd0,
+ 0x02, 0xb4, 0xe1, 0xe0,
+ 0xaf, 0xee, 0x00, 0x04, 0xf3, 0xd0, 0x03, 0x02, 0x2f, 0x3f, 0x70, 0x42,
+ 0x20, 0x08, 0xfd, 0x30,
+ 0x30, 0x5d, 0x20, 0x32, 0x0b, 0x0d, 0x40, 0x34, 0x1f, 0x0e, 0x22, 0x54,
+ 0x54, 0x22, 0xfc, 0x0f,
+ 0x02, 0x33, 0x0c, 0x0e, 0xf1, 0x0e, 0x0b, 0x52, 0x67, 0x11, 0x1e, 0x30,
+ 0x43, 0x34, 0x3f, 0x2d,
+ 0x1f, 0x23, 0x02, 0xee, 0xbd, 0xe6, 0xdf, 0xd9, 0xef, 0x10, 0x50, 0x20,
+ 0x0d, 0xd1, 0xd6, 0xe1,
+ 0x20, 0xe0, 0x8f, 0x0f, 0x00, 0x00, 0x51, 0x0f, 0xda, 0xf1, 0x01, 0x1f,
+ 0x2d, 0x74, 0x20, 0x0e,
+ 0x00, 0x10, 0x10, 0x0f, 0xfc, 0xcd, 0x10, 0x02, 0xd2, 0x92, 0x0f, 0xf0,
+ 0xe6, 0xbb, 0xfc, 0x1f,
+ 0x41, 0x04, 0x21, 0x0f, 0x0d, 0x0e, 0x60, 0x31, 0x26, 0x00, 0xfc, 0x0f,
+ 0x22, 0x03, 0xce, 0xed,
+ 0x02, 0x02, 0x11, 0x77, 0x63, 0x0e, 0xfe, 0x00, 0x02, 0x11, 0x2d, 0x1e,
+ 0x35, 0x42, 0x00, 0x0a,
+ 0x00, 0x23, 0x41, 0x04, 0x46, 0x61, 0x20, 0x0c, 0x00, 0xf2, 0x00, 0xe0,
+ 0x00, 0xe0, 0xfd, 0x2d,
+ 0x72, 0x03, 0xfd, 0x00, 0x22, 0x17, 0x23, 0x31, 0x25, 0x20, 0x1f, 0x30,
+ 0x11, 0x6d, 0x4b, 0x0e,
+ 0xff, 0x00, 0x27, 0x30, 0xce, 0xdc, 0x20, 0xef, 0x8d, 0xf0, 0x11, 0x01,
+ 0xaf, 0x0e, 0x10, 0x5f,
+ 0x0d, 0xe0, 0x07, 0x31, 0x1f, 0x0e, 0x1f, 0x2c, 0x20, 0x23, 0xe2, 0x9f,
+ 0x00, 0xf3, 0xfe, 0xe1,
+ 0x37, 0x07, 0xa1, 0x01, 0x12, 0x40, 0x40, 0x01, 0x21, 0x31, 0x3e, 0x2e,
+ 0x5e, 0x4d, 0x2b, 0x00,
+ 0x21, 0x36, 0x6e, 0x19, 0x10, 0x31, 0x61, 0x1f, 0x00, 0x16, 0x21, 0x31,
+ 0x3f, 0x0c, 0x0f, 0x11,
+ 0x42, 0x00, 0xdf, 0xf0, 0xe0, 0x0d, 0xf0, 0x61, 0x7f, 0x2e, 0x27, 0x01,
+ 0x0b, 0x1f, 0x12, 0x02,
+ 0xfe, 0x0f, 0x35, 0x01, 0xdf, 0xfc, 0xbe, 0xee, 0xb0, 0xff, 0xc0, 0xf1,
+ 0xe1, 0xf2, 0xd5, 0xf0,
+ 0xcf, 0xec, 0xef, 0xdc, 0xcf, 0xf0, 0xcf, 0xd4, 0x07, 0x20, 0xcd, 0xcb,
+ 0x10, 0x31, 0xe0, 0xde,
+ 0x00, 0x31, 0x93, 0xcc, 0xed, 0xe1, 0xe7, 0xe1, 0xc0, 0xce, 0xc0, 0xb1,
+ 0x03, 0xe2, 0xe0, 0xde,
+ 0x23, 0x30, 0x0c, 0x00, 0xe4, 0xbc, 0xee, 0xf0, 0x05, 0x0e, 0xee, 0xef,
+ 0xf1, 0x80, 0xf0, 0xe0,
+ 0xf2, 0xe4, 0x07, 0x41, 0x21, 0x01, 0xd2, 0xce, 0xeb, 0xfe, 0xe0, 0xb0,
+ 0x11, 0x00, 0x01, 0xe6,
+ 0x02, 0x40, 0x2e, 0xc0, 0xf5, 0x00, 0xf1, 0xf1, 0x8f, 0xcd, 0x0f, 0x0d,
+ 0xf9, 0xee, 0x00, 0xe4,
+ 0xe1, 0xe0, 0x0d, 0xe2, 0x17, 0x53, 0xef, 0xbc, 0x14, 0x52, 0x30, 0x0e,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x15, 0x10, 0xdd, 0x8e, 0xe0, 0xcd, 0xed, 0xe0, 0xe7, 0xf0, 0xbe, 0xee,
+ 0xdf, 0xd0, 0xe0, 0xfe,
+ 0xf9, 0xff, 0x00, 0x34, 0x10, 0xbd, 0xff, 0x34, 0x53, 0x2f, 0x1e, 0xce,
+ 0xcd, 0xf3, 0xd7, 0xc7,
+ 0xe0, 0xee, 0xe0, 0xe3, 0xcf, 0x0f, 0x02, 0x24, 0x31, 0x0f, 0x0d, 0x40,
+ 0x71, 0x6e, 0x0c, 0x0e,
+ 0x00, 0x00, 0x0b, 0x00, 0x10, 0x71, 0x44, 0x31, 0x2e, 0x20, 0x23, 0x0e,
+ 0xde, 0x00, 0x00, 0x00,
+ 0x02, 0x27, 0x45, 0xfb, 0x1e, 0x7f, 0x30, 0x1f, 0x20, 0x30, 0x22, 0x47,
+ 0x51, 0x1f, 0x3d, 0x01,
+ 0x10, 0x10, 0x3f, 0x2d, 0xda, 0xe0, 0x01, 0x01, 0xef, 0xde, 0x30, 0x41,
+ 0xf0, 0x90, 0xf0, 0xf0,
+ 0xb1, 0xd0, 0xbf, 0xf7, 0x07, 0x04, 0x0c, 0xee, 0x20, 0x23, 0xbf, 0xed,
+ 0x00, 0x10, 0x70, 0x76,
+ 0x0f, 0x0f, 0x0f, 0xf0, 0x03, 0xe0, 0xfd, 0xfe, 0xf0, 0xd0, 0xd3, 0xe6,
+ 0x01, 0xe0, 0xfe, 0x0c,
+ 0x2e, 0x50, 0x23, 0x1e, 0x0d, 0xe0, 0xcd, 0xf8, 0x0e, 0xe1, 0x01, 0x01,
+ 0x18, 0x00, 0x2a, 0x00,
+ 0x89, 0xf7, 0xe3, 0xfa, 0xaf, 0xf8, 0x8c, 0xfe, 0x21, 0x77, 0x34, 0xee,
+ 0x1f, 0x20, 0xf0, 0x35,
+ 0x04, 0x8e, 0xdc, 0x00, 0x10, 0x31, 0x50, 0x2f, 0x30, 0x04, 0x0f, 0xbf,
+ 0x00, 0x44, 0x33, 0xbe,
+ 0xd0, 0x04, 0x32, 0x0d, 0xfe, 0xe2, 0xf5, 0x00, 0xfe, 0xbc, 0xdd, 0x20,
+ 0x00, 0xc3, 0xd7, 0x11,
+ 0x4e, 0x3e, 0x31, 0x47, 0x01, 0xf0, 0x32, 0x71, 0x5d, 0xeb, 0xc0, 0x0f,
+ 0x21, 0xf3, 0xce, 0xee,
+ 0xff, 0x12, 0x00, 0xff, 0xef, 0xee, 0xd0, 0x37, 0x75, 0xee, 0xdf, 0x0e,
+ 0x2d, 0x7d, 0x2f, 0x23,
+ 0x37, 0x15, 0xdd, 0xee, 0x00, 0x41, 0x31, 0x10, 0xce, 0xbd, 0xf2, 0xf1,
+ 0xcd, 0xf0, 0xf7, 0x12,
+ 0x61, 0x10, 0x3e, 0xfe, 0x02, 0x34, 0x0f, 0xfd, 0xcf, 0x0d, 0x12, 0x24,
+ 0x34, 0x70, 0x1c, 0x0c,
+ 0x00, 0x10, 0x12, 0xf4, 0xe0, 0xb1, 0xe1, 0xc4, 0xe3, 0xfc, 0xef, 0xe0,
+ 0xd2, 0x02, 0x20, 0x6e,
+ 0xf8, 0xcc, 0x23, 0x46, 0x40, 0x00, 0x2f, 0x21, 0x03, 0x13, 0xe0, 0x9d,
+ 0xfe, 0xf0, 0x00, 0x0e,
+ 0x00, 0x11, 0xeb, 0xbd, 0xe9, 0xad, 0xdb, 0x00, 0x20, 0x12, 0xe0, 0xf1,
+ 0x07, 0x10, 0x00, 0xcc,
+ 0x00, 0x22, 0x20, 0xff, 0x20, 0x70, 0x6a, 0x00, 0x30, 0x22, 0x1e, 0x1c,
+ 0x22, 0x33, 0x0d, 0xbb,
+ 0xf0, 0x03, 0x0f, 0xce, 0xc3, 0xc3, 0xff, 0x10, 0x1e, 0xe8, 0x00, 0x70,
+ 0x10, 0x11, 0xff, 0xed,
+ 0x00, 0x21, 0x0b, 0x0d, 0xef, 0x22, 0x31, 0x00, 0x22, 0x07, 0x24, 0x12,
+ 0xf0, 0x80, 0xdf, 0xe0,
+ 0x01, 0xfe, 0x1e, 0x30, 0x77, 0x62, 0x0e, 0x1e, 0x00, 0x01, 0x05, 0x01,
+ 0x02, 0xe4, 0xf0, 0xfe,
+ 0xf0, 0xf4, 0xe4, 0xd1, 0xd0, 0xdf, 0xda, 0xde, 0xce, 0xa0, 0xd0, 0xff,
+ 0x00, 0x0e, 0xcd, 0x9f,
+ 0x03, 0x25, 0x40, 0x2f, 0x35, 0x03, 0xe1, 0xf2, 0x16, 0x10, 0xee, 0xc9,
+ 0x00, 0x30, 0xe2, 0x81,
+ 0xb0, 0x00, 0xf0, 0x0f, 0x10, 0x0d, 0x0c, 0x0f, 0x0d, 0xcd, 0x10, 0x40,
+ 0x22, 0x1d, 0x3c, 0x7f,
+ 0x6e, 0x11, 0x22, 0x0d, 0xe8, 0xd8, 0xef, 0x0f, 0xf0, 0xd4, 0xe0, 0xf1,
+ 0xcf, 0x10, 0x71, 0x12,
+ 0x01, 0xf6, 0x02, 0x31, 0x00, 0xcd, 0xf1, 0x04, 0x01, 0x00, 0x4d, 0x7f,
+ 0x5f, 0x0e, 0x0e, 0x00,
+ 0x03, 0x02, 0x00, 0x1c, 0x13, 0x07, 0xe4, 0xa0, 0xec, 0xc1, 0x01, 0xf0,
+ 0x01, 0x03, 0x00, 0x50,
+ 0x0f, 0xdf, 0x0f, 0x57, 0x05, 0x20, 0x0c, 0x00, 0x04, 0x03, 0x31, 0xdb,
+ 0xdd, 0x00, 0x00, 0x10,
+ 0xef, 0x8e, 0xdd, 0xe3, 0x11, 0x1b, 0xfd, 0xd0, 0xc2, 0xd2, 0x35, 0x11,
+ 0xde, 0xa0, 0x14, 0x33,
+ 0x01, 0x01, 0x0b, 0x2d, 0x3f, 0x30, 0x74, 0x73, 0x4e, 0x1b, 0xfd, 0x0e,
+ 0x1f, 0x01, 0xf2, 0xce,
+ 0xe8, 0xee, 0xee, 0xce, 0x0d, 0xf0, 0x16, 0x75, 0x10, 0x00, 0x0d, 0xf0,
+ 0x10, 0x31, 0xe2, 0xce,
+ 0xfe, 0xeb, 0x0d, 0x20, 0x30, 0x31, 0x00, 0xb1, 0x07, 0x17, 0x00, 0xbe,
+ 0xdf, 0xe0, 0x00, 0x11,
+ 0x22, 0x0f, 0x4e, 0x53, 0x01, 0x0d, 0x09, 0x70, 0x41, 0x23, 0x12, 0x00,
+ 0xaf, 0x0e, 0xf1, 0x46,
+ 0x33, 0x00, 0xcb, 0xf0, 0x00, 0xe3, 0x0f, 0xcd, 0x0f, 0xe0, 0x10, 0x0c,
+ 0xde, 0xdf, 0xac, 0x01,
+ 0x14, 0xee, 0x0f, 0x76, 0x55, 0x00, 0x00, 0x00, 0x1f, 0x10, 0xde, 0xd2,
+ 0x04, 0x31, 0x01, 0x12,
+ 0x11, 0x0d, 0xcd, 0xf2, 0xd4, 0xae, 0xfa, 0xf1, 0xf3, 0x03, 0x2e, 0x0d,
+ 0x60, 0x31, 0x4e, 0x50,
+ 0x25, 0x0d, 0xf8, 0xf0, 0xe2, 0xd1, 0xd0, 0x0d, 0x0c, 0x2e, 0x50, 0x14,
+ 0xd0, 0x9e, 0xf0, 0x07,
+ 0x23, 0x20, 0x00, 0x01, 0xc1, 0xce, 0x0e, 0x10, 0x00, 0x1d, 0x08, 0x20,
+ 0x71, 0x41, 0x00, 0x30,
+ 0x21, 0x1c, 0xde, 0xe0, 0xe3, 0x01, 0x35, 0x23, 0xc0, 0xce, 0xed, 0xce,
+ 0xeb, 0xde, 0x00, 0x47,
+ 0x40, 0xfe, 0xdf, 0x10, 0x4f, 0x4f, 0x00, 0xe0, 0xe2, 0x17, 0x02, 0xce,
+ 0xf0, 0x73, 0x13, 0xdc,
+ 0xde, 0xed, 0xcd, 0xcd, 0xd0, 0x06, 0x01, 0xfc, 0x2e, 0x11, 0x06, 0xe1,
+ 0x91, 0xe0, 0xfe, 0xf0,
+ 0x0f, 0xde, 0x32, 0x77, 0x71, 0x1e, 0x0e, 0x1f, 0x2f, 0x10, 0x15, 0x01,
+ 0x00, 0x0f, 0xfa, 0xce,
+ 0xd0, 0x00, 0x10, 0x0d, 0xbf, 0x01, 0xe3, 0xe6, 0x14, 0x30, 0xde, 0xdd,
+ 0x70, 0x42, 0xfd, 0xed,
+ 0xe0, 0x0c, 0xfd, 0x20, 0x60, 0x2f, 0x1d, 0x02, 0xf6, 0xb1, 0x02, 0x06,
+ 0x20, 0x0d, 0xcc, 0x00,
+ 0x35, 0x30, 0x2f, 0x3f, 0x54, 0xf1, 0xde, 0x4f, 0x40, 0x22, 0x20, 0x42,
+ 0x21, 0xa9, 0xbf, 0x00,
+ 0xf1, 0x04, 0x53, 0x11, 0x00, 0x0e, 0xed, 0xec, 0xdd, 0xe1, 0xb5, 0xe0,
+ 0x0f, 0x0d, 0x20, 0x05,
+ 0x23, 0xf1, 0xe3, 0x64, 0x2d, 0x1e, 0x00, 0xd7, 0x43, 0x20, 0x20, 0x2f,
+ 0x10, 0x31, 0xdd, 0x0d,
+ 0xa4, 0x84, 0xd2, 0xf2, 0xdf, 0xe9, 0x02, 0x45, 0x1e, 0x0d, 0x40, 0x10,
+ 0x0e, 0x0a, 0x30, 0x70,
+ 0x31, 0xf0, 0xf1, 0x10, 0x1d, 0xf9, 0xbe, 0xff, 0xfd, 0xf1, 0x04, 0x00,
+ 0x30, 0x41, 0xc3, 0xe2,
+ 0x01, 0xe1, 0xe2, 0xe0, 0xbb, 0xcd, 0x02, 0x44, 0x30, 0x3e, 0x63, 0x13,
+ 0x20, 0x10, 0x17, 0x11,
+ 0x41, 0x43, 0x1e, 0x0b, 0xcd, 0xfd, 0xc0, 0xf6, 0xf1, 0x00, 0xee, 0x0f,
+ 0x02, 0x20, 0xba, 0xd0,
+ 0xd0, 0xef, 0x12, 0x35, 0x10, 0x1b, 0x40, 0x23, 0xa0, 0xf1, 0x11, 0x32,
+ 0x03, 0xdd, 0xc9, 0x00,
+ 0x00, 0xf0, 0x41, 0x31, 0xdd, 0x8d, 0x0e, 0xe0, 0xe5, 0xb0, 0xc2, 0xe3,
+ 0xf0, 0xc9, 0xe0, 0x03,
+ 0x20, 0x0c, 0xfc, 0x62, 0x46, 0x00, 0x20, 0x00, 0x2d, 0x10, 0x4e, 0x31,
+ 0x22, 0x00, 0xec, 0xaa,
+ 0xfd, 0x00, 0x00, 0x40, 0xfe, 0xe0, 0x06, 0x22, 0x20, 0xe0, 0xef, 0x0f,
+ 0x4f, 0x00, 0xc0, 0x0b,
+ 0x1e, 0x40, 0x03, 0xb0, 0xd0, 0x0e, 0x00, 0x47, 0x35, 0x50, 0x0f, 0xcd,
+ 0xc1, 0xf3, 0x13, 0x63,
+ 0x0d, 0xf9, 0x40, 0x53, 0xff, 0xde, 0x01, 0x30, 0x00, 0x0e, 0x0d, 0x31,
+ 0x17, 0xf6, 0xcf, 0x00,
+ 0x2f, 0x30, 0x50, 0x00, 0xf1, 0x82, 0xf0, 0xef, 0xee, 0xff, 0xf0, 0x20,
+ 0x35, 0xf0, 0xdf, 0xef,
+ 0xbc, 0xf0, 0x04, 0x00, 0x2e, 0x53, 0x57, 0x10, 0x3d, 0x32, 0x0f, 0xff,
+ 0xd2, 0x04, 0x01, 0xe0,
+ 0xff, 0x84, 0xf4, 0xee, 0xea, 0xe0, 0xf1, 0x03, 0x40, 0x0c, 0xee, 0x0f,
+ 0x51, 0x32, 0x51, 0x24,
+ 0x0e, 0xe9, 0xde, 0x0f, 0xf0, 0xfe, 0x0d, 0x7e, 0x2d, 0xef, 0xd0, 0x01,
+ 0x0f, 0xe0, 0x47, 0x77,
+ 0x06, 0xac, 0x00, 0x01, 0xf1, 0x02, 0x01, 0x10, 0x0e, 0x0e, 0x30, 0x53,
+ 0x33, 0x1f, 0x0d, 0x00,
+ 0x13, 0x11, 0x11, 0x20, 0xca, 0xde, 0xf0, 0xf0, 0xd0, 0xa2, 0xde, 0xee,
+ 0x20, 0x20, 0x11, 0xfe,
+ 0xb8, 0xe0, 0x00, 0x64, 0x0d, 0x2e, 0x57, 0x12, 0xf2, 0xd1, 0xde, 0x0e,
+ 0xf0, 0x00, 0x1c, 0x5e,
+ 0x1f, 0x4f, 0x12, 0xe2, 0xad, 0xec, 0xee, 0x1c, 0xee, 0xa0, 0xf0, 0x07,
+ 0xf1, 0xdc, 0x0f, 0xd0,
+ 0x00, 0x00, 0x41, 0x33, 0x3f, 0x4f, 0x63, 0x1c, 0xfb, 0xff, 0x11, 0x51,
+ 0x1a, 0x0e, 0x21, 0x12,
+ 0xfc, 0xae, 0xe0, 0x04, 0xf3, 0xf4, 0x21, 0x33, 0x20, 0xed, 0xab, 0x00,
+ 0xf1, 0x0f, 0xfb, 0x1e,
+ 0x6e, 0x12, 0x04, 0xdf, 0x0d, 0x00, 0x01, 0x11, 0x26, 0x35, 0xf6, 0x90,
+ 0xef, 0xfe, 0x31, 0x60,
+ 0x0f, 0x0d, 0x10, 0x00, 0xf0, 0xee, 0xdb, 0xdd, 0x33, 0x63, 0x54, 0x22,
+ 0x0d, 0xea, 0xe0, 0x02,
+ 0xf7, 0x01, 0x20, 0xee, 0xd0, 0x0e, 0x70, 0x31, 0x0f, 0xcd, 0x02, 0xf1,
+ 0xfe, 0xb8, 0xf0, 0x07,
+ 0x00, 0x00, 0xf1, 0x00, 0x3f, 0x3f, 0x20, 0x21, 0x24, 0x20, 0x5f, 0x30,
+ 0x2f, 0xfe, 0x80, 0xc5,
+ 0xf0, 0xe0, 0x12, 0x10, 0xf0, 0xf0, 0xfd, 0x0c, 0x00, 0x20, 0xd2, 0xf7,
+ 0x03, 0xca, 0x9e, 0x00,
+ 0x21, 0x20, 0x0e, 0x00, 0x41, 0x50, 0x0b, 0x0b, 0x30, 0x71, 0x22, 0xff,
+ 0xdf, 0x01, 0xe2, 0x03,
+ 0xd2, 0xb0, 0xf0, 0xe2, 0xf7, 0xe0, 0xf0, 0xe0, 0x0e, 0x6f, 0x6f, 0x21,
+ 0x0e, 0x00, 0x34, 0x46,
+ 0x01, 0x30, 0x3b, 0x0d, 0x0f, 0xf0, 0xe3, 0xb1, 0xbe, 0x0f, 0x01, 0xf5,
+ 0x00, 0xfd, 0xed, 0x00,
+ 0x00, 0x2f, 0xde, 0x14, 0xb0, 0x9c, 0x01, 0xf7, 0x34, 0x20, 0xed, 0x21,
+ 0x53, 0x00, 0x11, 0x16,
+ 0x31, 0x40, 0x40, 0x0d, 0x0f, 0x8b, 0xe0, 0xd0, 0xf0, 0xf3, 0x06, 0x30,
+ 0x0f, 0xcf, 0xd0, 0xf3,
+ 0xdf, 0x0f, 0x01, 0xe1, 0xf0, 0x47, 0x60, 0xeb, 0xf0, 0x10, 0x5e, 0x0d,
+ 0x0d, 0x0f, 0x2e, 0x1e,
+ 0x00, 0xf2, 0x63, 0x1a, 0xf9, 0xf0, 0x13, 0xff, 0xcf, 0xe3, 0x13, 0x20,
+ 0x4e, 0x3b, 0x40, 0x6d,
+ 0x0e, 0x0e, 0xef, 0xcc, 0xfe, 0x01, 0xf3, 0x07, 0x61, 0x20, 0x11, 0x0f,
+ 0xb8, 0xef, 0xf0, 0x00,
+ 0xf0, 0xff, 0x00, 0xe4, 0x11, 0x4f, 0x71, 0x31, 0xfb, 0xf0, 0x00, 0xf0,
+ 0x03, 0x44, 0x45, 0x22,
+ 0x0f, 0xec, 0xce, 0x10, 0x46, 0x01, 0xf1, 0xd0, 0x0e, 0x01, 0x21, 0x43,
+ 0xb3, 0xaf, 0xdd, 0xff,
+ 0x00, 0xf0, 0x02, 0x00, 0x12, 0x77, 0x41, 0x00, 0xf0, 0xf0, 0x0a, 0xd0,
+ 0x00, 0x00, 0x44, 0x01,
+ 0x8d, 0xff, 0x02, 0xf1, 0xff, 0x11, 0x13, 0x12, 0xf0, 0xef, 0x01, 0xe7,
+ 0xf0, 0xf0, 0x0d, 0x0d,
+ 0x0f, 0xe9, 0xad, 0x20, 0x71, 0x3d, 0x28, 0x1c, 0x20, 0x1e, 0x3f, 0x02,
+ 0xf1, 0xc2, 0x01, 0x22,
+ 0xde, 0xdf, 0x03, 0xd3, 0x80, 0xdc, 0xe2, 0xf3, 0xce, 0xf9, 0x0f, 0x51,
+ 0x32, 0x4b, 0x4e, 0x44,
+ 0x13, 0x04, 0xff, 0xfe, 0xe2, 0x03, 0x31, 0x44, 0xe0, 0xe9, 0x00, 0x10,
+ 0xd0, 0xdf, 0x72, 0x6f,
+ 0xf9, 0xe1, 0x03, 0x00, 0xbf, 0xfe, 0xe1, 0xf4, 0x12, 0x00, 0x41, 0x27,
+ 0x01, 0x21, 0x24, 0x1e,
+ 0xeb, 0x00, 0x72, 0x64, 0x00, 0xdf, 0xfc, 0xf0, 0x0f, 0xef, 0xff, 0xe2,
+ 0xc0, 0xcd, 0xff, 0xe2,
+ 0x00, 0xef, 0x12, 0x77, 0x03, 0xfd, 0x0c, 0x11, 0x00, 0xfe, 0x21, 0x31,
+ 0x3a, 0x7f, 0x10, 0x0f,
+ 0x01, 0x00, 0xf0, 0xd0, 0xe4, 0x01, 0xf1, 0x67, 0x26, 0xee, 0xfc, 0x00,
+ 0x2f, 0x30, 0xf0, 0xcc,
+ 0xf0, 0xb0, 0x00, 0x0d, 0x60, 0x0e, 0x31, 0x01, 0x0e, 0xdd, 0xde, 0xfc,
+ 0xe6, 0x07, 0xe0, 0x9f,
+ 0x0d, 0x00, 0x33, 0xe0, 0x01, 0xde, 0xeb, 0x73, 0x63, 0xfe, 0xfd, 0x01,
+ 0x02, 0x03, 0x04, 0x02,
+ 0x4f, 0x7e, 0x1e, 0x0f, 0x02, 0x07, 0x12, 0x03, 0xe0, 0xad, 0x0d, 0xff,
+ 0xdd, 0x0e, 0xf2, 0xf7,
+ 0x07, 0x00, 0x1f, 0x5e, 0x10, 0x2e, 0x10, 0x21, 0x14, 0xf0, 0x0f, 0x1f,
+ 0x5f, 0x89, 0xff, 0x05,
+ 0x00, 0xff, 0xf0, 0x00, 0x00, 0xad, 0x10, 0x17, 0x01, 0xf0, 0x02, 0xf0,
+ 0xef, 0xdf, 0xe0, 0x02,
+ 0x4f, 0x3e, 0x72, 0x73, 0x0c, 0x00, 0x10, 0x0b, 0xdc, 0x0f, 0x1d, 0x2c,
+ 0x30, 0x34, 0xf1, 0xa3,
+ 0x05, 0xe0, 0x01, 0x02, 0xe0, 0xfc, 0x00, 0xe0, 0x8e, 0x03, 0x07, 0x2f,
+ 0x2d, 0x55, 0x25, 0x00,
+ 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x21, 0x23, 0x0f, 0x1a, 0x6f, 0x11, 0xe1,
+ 0xdf, 0xda, 0xf0, 0x10,
+ 0x2f, 0xb1, 0xd3, 0xf2, 0xfe, 0x88, 0xd0, 0x01, 0x31, 0x51, 0x0f, 0xe0,
+ 0x01, 0x53, 0x20, 0x1c,
+ 0x1f, 0x31, 0x31, 0x0e, 0xcd, 0xff, 0xe2, 0xd0, 0xff, 0xa0, 0xdb, 0xdc,
+ 0xce, 0xf3, 0x07, 0xe4,
+ 0xde, 0xde, 0xd0, 0xe2, 0xd0, 0xe0, 0x40, 0x7f, 0x5a, 0x10, 0x20, 0x13,
+ 0x32, 0x0d, 0xdc, 0x01,
+ 0x15, 0x00, 0x02, 0x11, 0x1e, 0x1c, 0x73, 0xff, 0xdc, 0xf2, 0x17, 0x00,
+ 0x9b, 0x0f, 0x40, 0x0f,
+ 0xff, 0x00, 0x00, 0xf0, 0x00, 0x2c, 0xfc, 0x21, 0x25, 0x90, 0x00, 0x02,
+ 0x22, 0xde, 0xce, 0xef,
+ 0xfc, 0x0c, 0x10, 0x40, 0x00, 0xae, 0x01, 0x34, 0x01, 0x10, 0x10, 0x0a,
+ 0x11, 0x55, 0x20, 0x2d,
+ 0x6f, 0x52, 0x46, 0x33, 0xe0, 0xf0, 0x01, 0x01, 0xff, 0x9c, 0x01, 0xf0,
+ 0xd8, 0xd0, 0x00, 0xf2,
+ 0xde, 0x0f, 0x70, 0x21, 0x90, 0x24, 0x33, 0x00, 0xee, 0x1f, 0x13, 0xc1,
+ 0x00, 0x24, 0x0e, 0xd8,
+ 0x0c, 0x42, 0x35, 0xe0, 0xb1, 0x13, 0x04, 0xf0, 0xab, 0xf0, 0x02, 0x00,
+ 0xf0, 0xf0, 0xe4, 0xe0,
+ 0x0d, 0x1e, 0x10, 0x71, 0x21, 0x0c, 0x2c, 0x00, 0x0d, 0x5e, 0x3f, 0x30,
+ 0x02, 0xf1, 0xef, 0xfb,
+ 0xdf, 0xbf, 0xc0, 0xed, 0x07, 0x17, 0xd0, 0xcc, 0x1f, 0x61, 0x00, 0xee,
+ 0x11, 0x65, 0x00, 0x0f,
+ 0x01, 0x14, 0xff, 0x0e, 0x00, 0x40, 0x20, 0x00, 0x0c, 0xef, 0x34, 0x10,
+ 0xcd, 0x04, 0x65, 0x1f,
+ 0xde, 0xd0, 0x00, 0x10, 0x0e, 0xb0, 0xe1, 0xf2, 0xf0, 0xdf, 0x06, 0x44,
+ 0x63, 0x2f, 0x08, 0x10,
+ 0x10, 0x0f, 0x00, 0x23, 0x00, 0xd0, 0x20, 0x4f, 0xef, 0xaa, 0x0f, 0xbe,
+ 0xcf, 0xd0, 0xf2, 0xd7,
+ 0xb2, 0xf0, 0x0e, 0x41, 0x01, 0x0e, 0x00, 0x0f, 0x20, 0x02, 0x16, 0x5f,
+ 0x0b, 0x00, 0xf0, 0x13,
+ 0x02, 0xbb, 0xf0, 0x00, 0x0f, 0x32, 0x56, 0x00, 0xfd, 0xff, 0x00, 0x00,
+ 0x2a, 0x3f, 0x2e, 0x40,
+ 0x0e, 0x1e, 0x50, 0x10, 0x00, 0x2d, 0x5f, 0xdd, 0xb1, 0x07, 0x07, 0xef,
+ 0xdd, 0x30, 0x01, 0xae,
+ 0xef, 0xff, 0x00, 0x31, 0x04, 0x02, 0x34, 0x0f, 0x8c, 0xb0, 0x01, 0x10,
+ 0x4f, 0x37, 0x24, 0x00,
+ 0x2f, 0x40, 0x31, 0x33, 0x30, 0x51, 0x0f, 0xee, 0xce, 0xd3, 0xc0, 0xdd,
+ 0xec, 0x01, 0xf4, 0x02,
+ 0x10, 0x3b, 0xd1, 0xf7, 0xc0, 0xff, 0x21, 0x72, 0x00, 0x21, 0x02, 0xfd,
+ 0xdc, 0x01, 0x0f, 0x0b,
+ 0x71, 0x76, 0x00, 0xed, 0xd2, 0x05, 0x0f, 0xdd, 0xe1, 0x05, 0x00, 0xd0,
+ 0xe4, 0xc0, 0xc0, 0x0f,
+ 0x5d, 0x11, 0xf0, 0xfe, 0x2a, 0x70, 0x40, 0x0e, 0x40, 0x22, 0x0c, 0x0b,
+ 0xf0, 0x01, 0xe0, 0xf1,
+ 0xc3, 0xaa, 0x00, 0xf0, 0x00, 0xfd, 0x00, 0xde, 0xcf, 0x1e, 0x60, 0x07,
+ 0x01, 0x0f, 0x30, 0x14,
+ 0x33, 0x34, 0x5f, 0xfd, 0xa0, 0x03, 0x17, 0x11, 0x12, 0x42, 0x11, 0x00,
+ 0x00, 0xfa, 0x0e, 0xef,
+ 0xbf, 0xff, 0x02, 0xc3, 0x00, 0xae, 0x30, 0x2d, 0x9a, 0x20, 0x03, 0x00,
+ 0x00, 0xe3, 0x25, 0x52,
+ 0xf1, 0xfc, 0x0b, 0x10, 0x20, 0x01, 0xff, 0xee, 0x00, 0xf2, 0xf1, 0x0f,
+ 0xef, 0xd3, 0xd7, 0x91,
+ 0xfb, 0xff, 0xd0, 0x20, 0x10, 0x10, 0x04, 0xde, 0x2d, 0x20, 0x0d, 0x18,
+ 0x3f, 0x60, 0x02, 0x50,
+ 0x20, 0xfc, 0x00, 0x53, 0x0e, 0xbd, 0xf2, 0x17, 0x1e, 0xfd, 0xf3, 0x53,
+ 0x1e, 0xe8, 0xcf, 0x20,
+ 0x50, 0x11, 0xe0, 0xfc, 0x00, 0x22, 0xd2, 0x22, 0x60, 0xec, 0xf0, 0x1f,
+ 0x42, 0x03, 0xaf, 0xf0,
+ 0x01, 0x08, 0xef, 0x00, 0x14, 0x12, 0xdc, 0xaf, 0x04, 0x23, 0x0f, 0x0d,
+ 0x56, 0x32, 0x51, 0x00,
+ 0x10, 0x0f, 0xfe, 0x0f, 0x22, 0xe2, 0x02, 0x0b, 0xbb, 0xd0, 0x02, 0xf2,
+ 0xed, 0x0f, 0xfd, 0xff,
+ 0x00, 0x66, 0x00, 0xf1, 0x00, 0x1d, 0x0e, 0x16, 0x62, 0x0e, 0x10, 0x00,
+ 0xe6, 0x00, 0x0f, 0x30,
+ 0x4f, 0xdd, 0xc0, 0x17, 0x22, 0x0f, 0x10, 0xb1, 0xd4, 0x04, 0x00, 0x8e,
+ 0xde, 0xe3, 0xa0, 0xdb,
+ 0xdf, 0x40, 0x33, 0x0e, 0x09, 0x70, 0x21, 0x00, 0x0e, 0x1f, 0x1f, 0x0c,
+ 0x00, 0x13, 0x01, 0xfe,
+ 0xed, 0xef, 0xd0, 0x8e, 0xfa, 0x03, 0xf1, 0xed, 0x17, 0x24, 0xed, 0x0f,
+ 0x71, 0x52, 0xe0, 0xe4,
+ 0x00, 0xfd, 0xf1, 0x27, 0x33, 0x5f, 0x40, 0xb8, 0x41, 0x37, 0x04, 0x04,
+ 0xa6, 0x00, 0x66, 0x00,
+ 0x49, 0x01, 0x65, 0x00, 0x26, 0xff, 0x44, 0xff, 0x34, 0x40, 0x57, 0x21,
+ 0x32, 0x32, 0x30, 0x32,
+ 0x53, 0x23, 0x20, 0x1d, 0x31, 0x45, 0x10, 0x00, 0x25, 0x33, 0x45, 0x43,
+ 0x41, 0x31, 0x55, 0x20,
+ 0x42, 0x44, 0x20, 0x30, 0x43, 0x21, 0x31, 0x33, 0x67, 0x37, 0x00, 0x0d,
+ 0x11, 0x44, 0x22, 0x00,
+ 0x00, 0x01, 0x12, 0x23, 0x34, 0x23, 0x01, 0xf0, 0x12, 0x16, 0x63, 0x52,
+ 0x12, 0x03, 0x24, 0x33,
+ 0x25, 0x02, 0x22, 0x11, 0x03, 0x14, 0x33, 0x33, 0x23, 0xf2, 0x04, 0x35,
+ 0x52, 0x01, 0xd0, 0x12,
+ 0x73, 0x44, 0x02, 0x11, 0x01, 0x01, 0x33, 0x34, 0x31, 0x42, 0x32, 0x32,
+ 0x43, 0x22, 0x32, 0x22,
+ 0x23, 0x04, 0x90, 0xe0, 0xdf, 0xbc, 0xe0, 0xf1, 0x00, 0x0d, 0x1c, 0x3f,
+ 0x1b, 0x5d, 0x50, 0x2e,
+ 0x2b, 0x3d, 0x3d, 0x50, 0x30, 0x30, 0x3d, 0x28, 0x3c, 0x4f, 0x2e, 0x4d,
+ 0x3e, 0x0a, 0x1d, 0x4f,
+ 0x4f, 0x3e, 0x3e, 0x50, 0x3e, 0x3f, 0x40, 0x30, 0x2e, 0x3b, 0x62, 0x37,
+ 0x41, 0x20, 0x3e, 0x40,
+ 0x53, 0x23, 0x22, 0x20, 0x22, 0x35, 0x24, 0x33, 0x13, 0x13, 0x04, 0x03,
+ 0x05, 0x03, 0x03, 0xd2,
+ 0xb2, 0x07, 0xf2, 0xe2, 0x03, 0xf2, 0xf1, 0x43, 0x22, 0x02, 0xd1, 0xd2,
+ 0x17, 0xf1, 0x81, 0xe1,
+ 0xbf, 0x01, 0x77, 0x17, 0x9c, 0xff, 0x01, 0x12, 0xf0, 0xff, 0xee, 0xdf,
+ 0x01, 0x01, 0x02, 0x00,
+ 0xe0, 0xcd, 0x01, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x41,
+ 0x20, 0x40, 0x98, 0xeb,
+ 0x75, 0x10, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x43, 0xff, 0x88, 0x00, 0x32,
+ 0x00, 0xee, 0x00, 0x10,
+ 0x00, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x1f, 0x20, 0x0e, 0x0d, 0xcb, 0x42,
+ 0x44, 0xde, 0x00, 0x00,
+ 0x89, 0x00, 0x25, 0x00, 0xde, 0x00, 0xe0, 0xef, 0x33, 0x11, 0xae, 0xff,
+ 0xf0, 0x01, 0x25, 0xf0,
+ 0xbe, 0xf0, 0x02, 0xef, 0xe0, 0x03, 0xf0, 0xd1, 0xab, 0x02, 0x25, 0xde,
+ 0x00, 0x35, 0xbf, 0xf0,
+ 0x23, 0xdf, 0xab, 0x01, 0x02, 0x00, 0x01, 0x01, 0x0f, 0xff, 0x00, 0x34,
+ 0x21, 0xff, 0xcc, 0x00,
+ 0x11, 0xbb, 0xdf, 0x00, 0x9a, 0x00, 0xff, 0xde, 0x00, 0x0f, 0xec, 0xf0,
+ 0x00, 0xfe, 0x00, 0xcc,
+ 0xdc, 0x52, 0xdb, 0xef, 0x20, 0xdc, 0x10, 0xee, 0xad, 0x54, 0x00, 0xdb,
+ 0x21, 0x21, 0xde, 0xed,
+ 0x33, 0x21, 0x89, 0xee, 0x00, 0x00, 0x00, 0xf0, 0xdd, 0xff, 0x00, 0x43,
+ 0x0f, 0x0e, 0x1f, 0x0e,
+ 0x44, 0x0f, 0xfc, 0x0e, 0xed, 0x21, 0x21, 0xaa, 0xde, 0x01, 0x04, 0xbe,
+ 0xcc, 0xe0, 0xdf, 0xcd,
+ 0xf0, 0x27, 0xe0, 0x8b, 0xfe, 0xf0, 0x01, 0x00, 0xef, 0xed, 0xe0, 0x0f,
+ 0xcc, 0x00, 0x00, 0xb9,
+ 0xff, 0x00, 0x0f, 0xff, 0xcc, 0xde, 0xff, 0xff, 0xf0, 0xcd, 0xdd, 0xcd,
+ 0xcb, 0xef, 0x00, 0x00,
+ 0xdf, 0xbb, 0xf0, 0x00, 0x00, 0xdc, 0x00, 0x64, 0x0f, 0x0f, 0x00, 0x0f,
+ 0x00, 0x0e, 0x20, 0x54,
+ 0x10, 0x11, 0x01, 0x01, 0x00, 0x03, 0x17, 0xe0, 0xf0, 0x22, 0xcf, 0xe0,
+ 0x02, 0xf0, 0xac, 0x01,
+ 0x56, 0x53, 0x12, 0x10, 0x0f, 0x33, 0x55, 0x00, 0x10, 0x32, 0x22, 0x21,
+ 0x0e, 0x30, 0x11, 0x00,
+ 0x12, 0x24, 0x47, 0x22, 0x44, 0x66, 0x11, 0x00, 0x00, 0x44, 0x43, 0x00,
+ 0xef, 0x00, 0x02, 0x01,
+ 0x02, 0x02, 0xe2, 0x04, 0x35, 0x22, 0x01, 0x12, 0x23, 0x43, 0x54, 0x33,
+ 0x01, 0xd0, 0xe0, 0x12,
+ 0x45, 0x01, 0xd0, 0xf1, 0x77, 0x63, 0x11, 0x00, 0x01, 0x33, 0x55, 0x33,
+ 0x11, 0xfe, 0xed, 0x23,
+ 0x35, 0x00, 0x00, 0xf0, 0xf1, 0xd0, 0xb0, 0x01, 0x00, 0xbc, 0xf0, 0x04,
+ 0x22, 0x0f, 0xed, 0x00,
+ 0x30, 0x1f, 0x20, 0x43, 0x10, 0x0c, 0xc8, 0xff, 0x73, 0x64, 0x0d, 0x0e,
+ 0x20, 0x0f, 0x0a, 0x00,
+ 0x31, 0xff, 0x00, 0x31, 0x10, 0xed, 0x0f, 0x52, 0x0f, 0x0c, 0x54, 0x20,
+ 0x1e, 0x64, 0x33, 0x08,
+ 0x2f, 0x72, 0x32, 0x0d, 0x0d, 0x20, 0x1d, 0x0c, 0x0e, 0x00, 0x34, 0x11,
+ 0x01, 0x00, 0x03, 0x46,
+ 0x00, 0xe0, 0x31, 0x12, 0x00, 0xf0, 0xe0, 0xd0, 0xce, 0xf0, 0x02, 0x02,
+ 0x47, 0x74, 0x23, 0x55,
+ 0x11, 0x00, 0x00, 0x45, 0x43, 0x00, 0x0f, 0x00, 0xef, 0xee, 0xf0, 0x12,
+ 0x00, 0xe0, 0x01, 0x03,
+ 0x07, 0x03, 0xc2, 0x24, 0x75, 0x51, 0x00, 0x00, 0x0f, 0x31, 0x21, 0x0e,
+ 0x1f, 0x62, 0x32, 0x32,
+ 0x67, 0x10, 0xfb, 0x00, 0x76, 0x22, 0xff, 0xee, 0xff, 0x01, 0x01, 0x23,
+ 0x01, 0x0f, 0x00, 0x42,
+ 0x45, 0x20, 0x0f, 0x2f, 0x40, 0x66, 0x21, 0x1f, 0x1e, 0x20, 0x20, 0x20,
+ 0x20, 0x54, 0x23, 0x00,
+ 0x00, 0x00, 0x13, 0x35, 0x22, 0x00, 0xfe, 0x11, 0x02, 0xfe, 0x00, 0x20,
+ 0xec, 0xab, 0x01, 0x77,
+ 0x57, 0xbe, 0xed, 0x12, 0x35, 0x00, 0xef, 0xf0, 0x01, 0xf1, 0xe0, 0x01,
+ 0x02, 0xc0, 0xbe, 0xf0,
+ 0xe0, 0xce, 0xef, 0xf2, 0x02, 0xf0, 0xf1, 0xf1, 0x04, 0x00, 0x03, 0x15,
+ 0xff, 0xdd, 0x77, 0xed,
+ 0x88, 0x11, 0x34, 0x9b, 0x00, 0xff, 0xff, 0x12, 0x00, 0xdd, 0xdd, 0x22,
+ 0x34, 0xee, 0xcd, 0xff,
+ 0xff, 0x00, 0xff, 0xbb, 0xed, 0x00, 0x11, 0x0f, 0x00, 0x0f, 0xa9, 0x0f,
+ 0x11, 0x11, 0x00, 0x0e,
+ 0x00, 0xed, 0x9a, 0x11, 0x32, 0xdd, 0xdd, 0x11, 0x42, 0x11, 0xca, 0x00,
+ 0x21, 0xdd, 0x0e, 0x74,
+ 0x0e, 0x0d, 0x01, 0x0d, 0xfc, 0x33, 0x22, 0xdc, 0xef, 0x00, 0x0f, 0xf0,
+ 0x00, 0xce, 0x99, 0x00,
+ 0x14, 0xef, 0xef, 0x00, 0xe0, 0xf0, 0xf1, 0xe0, 0xf0, 0xd1, 0xcd, 0xcc,
+ 0xee, 0x01, 0x46, 0xef,
+ 0x9c, 0x00, 0x01, 0x00, 0xfe, 0xee, 0x00, 0x13, 0xdc, 0xcb, 0xe0, 0xef,
+ 0xdf, 0xce, 0xce, 0x01,
+ 0xf2, 0xdf, 0xcc, 0xdc, 0xf0, 0xef, 0xdd, 0x00, 0xca, 0xed, 0x00, 0xbb,
+ 0xdd, 0xdd, 0x0f, 0x61,
+ 0x10, 0x10, 0x00, 0x10, 0x10, 0xfd, 0xc9, 0x22, 0x65, 0xef, 0xcc, 0x00,
+ 0x12, 0xff, 0xde, 0x00,
+ 0x12, 0x43, 0x31, 0x33, 0x42, 0x21, 0x55, 0x57, 0x10, 0x10, 0x10, 0x32,
+ 0x54, 0x00, 0x00, 0x01,
+ 0x45, 0x11, 0x01, 0x11, 0x12, 0x00, 0x14, 0x33, 0x02, 0x24, 0x01, 0xe1,
+ 0x03, 0x03, 0xd1, 0xb1,
+ 0xd0, 0x04, 0x57, 0x02, 0x00, 0xb0, 0x01, 0x37, 0x01, 0x01, 0xe1, 0x90,
+ 0xf0, 0xf1, 0xd0, 0x02,
+ 0x03, 0xcf, 0xdf, 0x02, 0x02, 0x02, 0x02, 0x00, 0x10, 0x10, 0x20, 0xfb,
+ 0x73, 0x36, 0xcc, 0x8a,
+ 0x00, 0x13, 0x00, 0xdc, 0xee, 0xff, 0xff, 0x00, 0x00, 0xbc, 0xcc, 0x00,
+ 0x00, 0xed, 0xdd, 0xfe,
+ 0xdd, 0xdc, 0x01, 0x00, 0xca, 0xef, 0xff, 0x0f, 0x30, 0x00, 0xdd, 0xdc,
+ 0x20, 0x5f, 0x0e, 0xfd,
+ 0xfe, 0x32, 0x10, 0xef, 0xdf, 0x8a, 0x89, 0xff, 0x11, 0x00, 0xff, 0xfe,
+ 0x0e, 0xfd, 0x0e, 0x2f,
+ 0x1e, 0x50, 0x0b, 0xfb, 0x10, 0x40, 0x1e, 0xdb, 0xcd, 0x10, 0x30, 0x21,
+ 0x00, 0x00, 0xdf, 0x32,
+ 0x77, 0x00, 0xc0, 0xff, 0x23, 0x00, 0x77, 0x45, 0x88, 0xef, 0x32, 0x22,
+ 0xf0, 0xde, 0x0f, 0x22,
+ 0x21, 0xef, 0x00, 0x21, 0x10, 0x00, 0x00, 0x0f, 0xef, 0x10, 0x00, 0xee,
+ 0xef, 0x21, 0xe0, 0xcd,
+ 0x23, 0x88, 0xff, 0x57, 0x00, 0xef, 0x10, 0xff, 0x00, 0x74, 0x00, 0xfe,
+ 0x00, 0x22, 0x33, 0x11,
+ 0x0f, 0x0f, 0x22, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0xef,
+ 0x77, 0x22, 0x00, 0x0f,
+ 0x0f, 0x43, 0x65, 0x00, 0x0e, 0x01, 0x21, 0x32, 0x22, 0x10, 0xfc, 0x20,
+ 0x77, 0x10, 0x0f, 0xfe,
+ 0x10, 0x33, 0x10, 0x0e, 0x77, 0x45, 0xee, 0xff, 0x11, 0x33, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0xff,
+ 0xff, 0x01, 0xff, 0xde, 0x34, 0x43, 0xf0, 0xff, 0x33, 0x44, 0x13, 0x01,
+ 0x03, 0x25, 0xe1, 0x8f,
+ 0x02, 0x26, 0xf0, 0xbe, 0xf0, 0x25, 0x22, 0x11, 0x01, 0x22, 0x43, 0x23,
+ 0x34, 0x54, 0x01, 0xfe,
+ 0x00, 0x44, 0x01, 0xdd, 0x01, 0x77, 0x01, 0xf0, 0x00, 0x23, 0x02, 0x01,
+ 0xab, 0x34, 0x56, 0xee,
+ 0xce, 0xde, 0x21, 0x66, 0xfe, 0xcd, 0x00, 0x33, 0x10, 0xfe, 0x0e, 0x00,
+ 0x22, 0x00, 0x0d, 0x00,
+ 0x10, 0x0d, 0xdc, 0x00, 0x42, 0xfe, 0xdb, 0x00, 0x20, 0x0d, 0xfd, 0x61,
+ 0x10, 0xe8, 0xff, 0x40,
+ 0x20, 0x0d, 0x0e, 0x1f, 0x60, 0x20, 0x0d, 0x31, 0x20, 0xfa, 0x10, 0x21,
+ 0x30, 0x10, 0xef, 0xde,
+ 0x43, 0x75, 0xfe, 0xba, 0x00, 0x45, 0x10, 0x00, 0xe0, 0x00, 0x11, 0x21,
+ 0x32, 0x12, 0x12, 0x11,
+ 0x22, 0x54, 0x00, 0x01, 0x24, 0x00, 0xf0, 0xff, 0xf0, 0xc0, 0x8a, 0xee,
+ 0x01, 0x03, 0xd0, 0xcf,
+ 0x02, 0x05, 0xd0, 0xac, 0xf0, 0x02, 0x02, 0xff, 0xfe, 0x00, 0x02, 0xfe,
+ 0xb8, 0xf0, 0x10, 0x32,
+ 0x11, 0x01, 0x01, 0x13, 0x54, 0x21, 0x00, 0xde, 0xad, 0x01, 0x14, 0x00,
+ 0xc9, 0xdf, 0x33, 0x21,
+ 0xdc, 0x0f, 0x64, 0x22, 0x00, 0x0f, 0x1f, 0x10, 0x44, 0x32, 0xea, 0xff,
+ 0x60, 0x0f, 0x0d, 0x43,
+ 0x46, 0x00, 0x0d, 0x21, 0x22, 0xdd, 0xdd, 0x00, 0x44, 0x00, 0xce, 0xdf,
+ 0xde, 0xee, 0x33, 0x00,
+ 0xbf, 0x05, 0x54, 0x23, 0x01, 0xef, 0xdd, 0x57, 0x47, 0xf0, 0xd0, 0xf0,
+ 0x12, 0x02, 0xdf, 0xd0,
+ 0xf0, 0xb0, 0xe0, 0x12, 0x01, 0xcf, 0x04, 0x15, 0xd0, 0x9c, 0x00, 0x35,
+ 0x00, 0xd0, 0xff, 0xef,
+ 0xbe, 0xee, 0x02, 0x02, 0xdf, 0xcc, 0xef, 0xf0, 0x24, 0x02, 0xe0, 0xde,
+ 0x01, 0x01, 0xbd, 0xcb,
+ 0xcd, 0xec, 0xf0, 0xfe, 0x98, 0xfe, 0xff, 0x20, 0x43, 0x00, 0xfb, 0xee,
+ 0x0f, 0x31, 0x00, 0xec,
+ 0xde, 0xbe, 0x00, 0x01, 0xdc, 0x9a, 0xef, 0x00, 0x01, 0x00, 0xff, 0xff,
+ 0xee, 0x00, 0x20, 0x0e,
+ 0xc9, 0x1f, 0x50, 0x20, 0x0f, 0x0e, 0xec, 0xfe, 0x77, 0x74, 0x0e, 0x88,
+ 0x0f, 0x34, 0x12, 0xee,
+ 0xee, 0x00, 0x33, 0x00, 0xde, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x11,
+ 0x22, 0xe0, 0xde, 0xef,
+ 0x01, 0xf0, 0xde, 0xcb, 0xf0, 0xde, 0xcd, 0xff, 0x99, 0xf0, 0xdd, 0xef,
+ 0x76, 0xff, 0xaa, 0x00,
+ 0x01, 0x00, 0xff, 0xf0, 0xff, 0xff, 0xee, 0xee, 0x01, 0x00, 0xef, 0xfe,
+ 0xfe, 0x10, 0x33, 0x00,
+ 0x0d, 0x0e, 0x0c, 0xfe, 0x31, 0xef, 0x88, 0xe0, 0x00, 0x00, 0xab, 0xff,
+ 0x44, 0x23, 0xfe, 0xee,
+ 0x00, 0x34, 0x00, 0xde, 0xff, 0x62, 0x23, 0x0f, 0xfd, 0x00, 0x33, 0x57,
+ 0x00, 0x0d, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x43, 0x46, 0x21, 0x00, 0x00, 0xcc, 0x00, 0x44, 0x00,
+ 0xac, 0x11, 0x44, 0xdb,
+ 0xde, 0x10, 0x23, 0x01, 0x00, 0x00, 0x02, 0x12, 0x01, 0x12, 0x22, 0xf0,
+ 0x77, 0xe0, 0x88, 0xf0,
+ 0x33, 0xf0, 0xde, 0xde, 0x00, 0x23, 0xf0, 0xce, 0x10, 0x55, 0x11, 0xff,
+ 0xee, 0x01, 0x55, 0x01,
+ 0x0f, 0xee, 0x00, 0x23, 0x00, 0xee, 0xfe, 0x32, 0x22, 0x0f, 0xde, 0x0f,
+ 0x00, 0xbd, 0xef, 0x04,
+ 0xa9, 0xdd, 0x00, 0x34, 0x12, 0x0f, 0x10, 0x62, 0x00, 0x00, 0x43, 0x11,
+ 0x2f, 0xf8, 0xef, 0x33,
+ 0x41, 0x0e, 0x2f, 0x23, 0x25, 0xf0, 0x8a, 0x00, 0x33, 0x11, 0x00, 0x00,
+ 0x00, 0x64, 0x23, 0x0f,
+ 0x0e, 0x31, 0x43, 0xea, 0xec, 0x0f, 0x20, 0x41, 0x20, 0x20, 0x20, 0x0e,
+ 0x00, 0x52, 0x33, 0x56,
+ 0x10, 0x00, 0x00, 0x43, 0x11, 0xfe, 0xec, 0xba, 0xee, 0x12, 0x34, 0xce,
+ 0xee, 0x33, 0x45, 0x11,
+ 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x64, 0x12, 0x10, 0x0f, 0x20, 0xcd,
+ 0xd0, 0x05, 0x76, 0x22,
+ 0x00, 0xcd, 0xef, 0x35, 0x22, 0x00, 0xd0, 0xdf, 0xf0, 0x54, 0x44, 0xf0,
+ 0x00, 0x32, 0x56, 0x11,
+ 0x10, 0x00, 0xee, 0xcd, 0x77, 0x34, 0xff, 0x0f, 0x12, 0xf0, 0xcd, 0x0f,
+ 0x11, 0x45, 0x21, 0x00,
+ 0xef, 0xee, 0xee, 0x89, 0xcd, 0xfe, 0x01, 0x44, 0x00, 0xfe, 0xee, 0x11,
+ 0x34, 0x76, 0x43, 0x12,
+ 0x11, 0xfe, 0xff, 0x01, 0x11, 0x45, 0x33, 0xf0, 0xef, 0x01, 0x00, 0xe9,
+ 0x74, 0x23, 0xdd, 0xcc,
+ 0x21, 0x76, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x22,
+ 0x01, 0x0e, 0xef, 0x00,
+ 0xe0, 0xba, 0x01, 0x42, 0xef, 0xbb, 0x00, 0x01, 0x00, 0xcd, 0xee, 0x12,
+ 0x45, 0x23, 0x00, 0xfe,
+ 0x01, 0x44, 0x00, 0x00, 0x00, 0x01, 0x33, 0x11, 0xff, 0xee, 0xef, 0xee,
+ 0xff, 0xde, 0xae, 0x02,
+ 0x0e, 0xb8, 0xdc, 0xef, 0x21, 0x0f, 0xbb, 0x00, 0x55, 0x10, 0x00, 0x00,
+ 0x11, 0x43, 0x0f, 0xdc,
+ 0x23, 0x53, 0xdb, 0xee, 0x77, 0x32, 0xff, 0xbc, 0xfe, 0x01, 0x11, 0xff,
+ 0xfe, 0x00, 0xfe, 0xee,
+ 0xed, 0xfe, 0x00, 0x00, 0xfd, 0xed, 0xca, 0x11, 0x31, 0xff, 0xff, 0x42,
+ 0x21, 0xfe, 0xdd, 0x9a,
+ 0xcb, 0xdd, 0xef, 0x00, 0x21, 0x43, 0xff, 0xee, 0x00, 0x46, 0x00, 0xff,
+ 0xdf, 0xde, 0x00, 0x75,
+ 0x55, 0x22, 0x00, 0x00, 0x01, 0x00, 0xba, 0xef, 0x32, 0x43, 0x00, 0xcc,
+ 0xfe, 0xf0, 0x00, 0x00,
+ 0x22, 0xff, 0xce, 0xdb, 0xfe, 0x44, 0x23, 0xfe, 0xcb, 0x00, 0x76, 0x10,
+ 0xf0, 0x00, 0x53, 0x11,
+ 0x00, 0x22, 0x12, 0x21, 0x00, 0x00, 0x33, 0xff, 0x88, 0xed, 0xff, 0x00,
+ 0x11, 0x10, 0xff, 0x00,
+ 0xff, 0x00, 0x00, 0xef, 0xdc, 0x33, 0x66, 0x00, 0xdd, 0xf0, 0x00, 0xef,
+ 0xcc, 0x00, 0x21, 0x34,
+ 0x64, 0x34, 0x00, 0x99, 0xee, 0x01, 0x33, 0xff, 0xdd, 0xf0, 0x00, 0x0f,
+ 0xef, 0x00, 0x54, 0x11,
+ 0xff, 0x00, 0x56, 0x11, 0x00, 0x33, 0x55, 0x00, 0x01, 0x10, 0x11, 0x01,
+ 0x00, 0x11, 0x33, 0xf0,
+ 0x01, 0x76, 0x00, 0xde, 0x00, 0x23, 0x22, 0xff, 0xff, 0x12, 0x45, 0x11,
+ 0x01, 0x00, 0xee, 0x21,
+ 0x45, 0xf0, 0xff, 0xff, 0xad, 0x00, 0x46, 0x00, 0xcd, 0xdc, 0xff, 0x33,
+ 0x01, 0xbb, 0xef, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x42, 0x21, 0x00, 0xdc, 0xab, 0xed, 0x00, 0x21,
+ 0xee, 0xb9, 0xde, 0xef,
+ 0x0f, 0x10, 0x10, 0xff, 0x11, 0x01, 0x89, 0xee, 0x11, 0xf0, 0xcc, 0x00,
+ 0x00, 0x00, 0xf0, 0xde,
+ 0x00, 0x31, 0x00, 0xee, 0xee, 0x00, 0x10, 0xc9, 0xce, 0xff, 0x00, 0xff,
+ 0x10, 0x32, 0x0f, 0xce,
+ 0x88, 0xcd, 0x0f, 0x12, 0x33, 0x11, 0xdd, 0x88, 0xed, 0xdd, 0x12, 0x11,
+ 0xdd, 0x00, 0x11, 0xee,
+ 0x01, 0x57, 0x00, 0xdd, 0xf0, 0x01, 0x21, 0xde, 0xcc, 0x00, 0x11, 0xde,
+ 0xde, 0x43, 0x56, 0x10,
+ 0xce, 0x00, 0x77, 0x22, 0x00, 0x00, 0x11, 0x0f, 0xcd, 0xfe, 0xfe, 0xff,
+ 0x11, 0x45, 0x21, 0x00,
+ 0xff, 0x10, 0x43, 0x23, 0xfd, 0xff, 0x67, 0x11, 0x00, 0x00, 0x11, 0x11,
+ 0x00, 0x11, 0x44, 0x22,
+ 0x00, 0x00, 0x33, 0xdc, 0x9a, 0x11, 0x55, 0x01, 0x0f, 0x00, 0x11, 0x32,
+ 0x11, 0x00, 0x10, 0x55,
+ 0x34, 0x10, 0x00, 0x20, 0x44, 0x11, 0x00, 0x32, 0x33, 0x10, 0x52, 0x00,
+ 0x00, 0x57, 0x10, 0x0f,
+ 0x10, 0x12, 0xfe, 0xde, 0x10, 0x53, 0x36, 0x23, 0x11, 0x00, 0x43, 0x77,
+ 0x11, 0xff, 0xee, 0xff,
+ 0x33, 0x12, 0xef, 0xcc, 0x12, 0x45, 0x11, 0x01, 0x22, 0xf0, 0x00, 0x55,
+ 0x22, 0xf0, 0xe0, 0xde,
+ 0xce, 0x00, 0xde, 0x88, 0xee, 0x13, 0x12, 0xdd, 0xab, 0xff, 0x00, 0x01,
+ 0x00, 0xee, 0x00, 0x13,
+ 0xff, 0xcc, 0x00, 0x01, 0xcd, 0xc8, 0xef, 0x01, 0x00, 0xff, 0x04, 0x00,
+ 0x11, 0x02, 0xce, 0x02,
+ 0xf2, 0xb7, 0x41, 0xd1, 0xfd, 0xb8, 0xf8, 0xd2, 0x11, 0x77, 0x22, 0xf0,
+ 0xde, 0xff, 0x11, 0x55,
+ 0x53, 0x11, 0x00, 0x00, 0x22, 0x22, 0x0d, 0x0e, 0x45, 0x10, 0x21, 0x53,
+ 0x0f, 0xfb, 0xcb, 0x00,
+ 0x32, 0x00, 0xbb, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x53, 0x23, 0x0e, 0xcb,
+ 0x00, 0x11, 0x22, 0x43,
+ 0xff, 0xa8, 0xff, 0x22, 0x00, 0xbc, 0x11, 0x23, 0x00, 0xcc, 0xfe, 0xf0,
+ 0x00, 0x01, 0xef, 0xff,
+ 0x0f, 0x00, 0xe0, 0x14, 0x54, 0x24, 0x44, 0x01, 0xcd, 0xee, 0x77, 0x12,
+ 0xee, 0x00, 0x12, 0x0f,
+ 0xdc, 0xff, 0x00, 0xee, 0xbd, 0xf0, 0x35, 0x11, 0xee, 0x12, 0x44, 0x00,
+ 0x9b, 0x00, 0x13, 0x11,
+ 0x00, 0x11, 0x12, 0x11, 0x0f, 0x00, 0x23, 0x00, 0xa8, 0x0f, 0x12, 0x33,
+ 0x00, 0xcd, 0xff, 0x00,
+ 0xff, 0xff, 0x45, 0x11, 0xdd, 0x21, 0x54, 0x00, 0x12, 0xfd, 0xa8, 0x10,
+ 0x55, 0x00, 0xff, 0x0f,
+ 0x10, 0x21, 0x00, 0xff, 0x10, 0x20, 0x00, 0x1f, 0x30, 0x00, 0xff, 0x00,
+ 0x20, 0x73, 0x13, 0xec,
+ 0x22, 0x67, 0x00, 0xff, 0xff, 0xfd, 0xca, 0x00, 0x42, 0x12, 0x0e, 0xdc,
+ 0xff, 0x00, 0xcd, 0x00,
+ 0x77, 0x22, 0xee, 0xee, 0x22, 0x55, 0x00, 0x0e, 0x00, 0x10, 0xf0, 0x00,
+ 0x22, 0x00, 0x00, 0x76,
+ 0x12, 0xfd, 0xed, 0xff, 0xec, 0xee, 0x00, 0x00, 0x00, 0x10, 0x10, 0x41,
+ 0x54, 0x00, 0x0d, 0x24,
+ 0x57, 0x00, 0xee, 0xdd, 0xee, 0xee, 0x11, 0x31, 0xcb, 0x9b, 0xee, 0xdd,
+ 0x32, 0x66, 0xee, 0xbc,
+ 0x00, 0x01, 0x00, 0xfe, 0x00, 0xee, 0xff, 0xdf, 0x02, 0x13, 0xde, 0xef,
+ 0x02, 0x14, 0x01, 0x16,
+ 0x73, 0x23, 0x21, 0x12, 0x00, 0xdd, 0xce, 0xdd, 0xdb, 0x10, 0xf0, 0x88,
+ 0xce, 0x00, 0x00, 0x12,
+ 0x34, 0x10, 0xef, 0x00, 0x23, 0x34, 0xef, 0x8b, 0xef, 0x01, 0x25, 0xf0,
+ 0xad, 0xff, 0x02, 0x24,
+ 0x01, 0xff, 0xed, 0x11, 0x35, 0x00, 0xff, 0x22, 0x74, 0x00, 0x0f, 0xff,
+ 0x34, 0x43, 0xfe, 0xed,
+ 0x10, 0x23, 0x21, 0x21, 0x34, 0x22, 0xcc, 0xaa, 0x00, 0x00, 0x0e, 0x11,
+ 0x00, 0xfe, 0xff, 0x10,
+ 0x75, 0x33, 0x0f, 0xed, 0xea, 0x10, 0x64, 0x0f, 0xdd, 0x00, 0x00, 0x0f,
+ 0x33, 0x24, 0x89, 0xdd,
+ 0x01, 0x55, 0x01, 0x0f, 0xff, 0x00, 0x01, 0x22, 0x00, 0xff, 0xed, 0xba,
+ 0xff, 0x00, 0xf0, 0xef,
+ 0x00, 0x01, 0x01, 0x01, 0x12, 0x01, 0x22, 0x45, 0xf0, 0xe0, 0x21, 0x00,
+ 0xe0, 0x77, 0x31, 0xe0,
+ 0xff, 0xf0, 0x10, 0x23, 0xbe, 0xca, 0xff, 0x20, 0x01, 0x8b, 0xdd, 0x00,
+ 0x00, 0xf0, 0x00, 0xe0,
+ 0xcf, 0x01, 0x04, 0x11, 0xf0, 0xd0, 0x00, 0x47, 0x01, 0xc0, 0x21, 0x66,
+ 0xf0, 0xdd, 0x10, 0x43,
+ 0x00, 0x00, 0x00, 0x10, 0x0f, 0x10, 0x30, 0x21, 0x00, 0xfd, 0xbb, 0x12,
+ 0x67, 0x00, 0x00, 0x10,
+ 0x21, 0x11, 0x23, 0xfd, 0x98, 0xff, 0x10, 0x21, 0x00, 0x0f, 0x0f, 0xf0,
+ 0x63, 0x34, 0xfe, 0x0f,
+ 0x44, 0x0f, 0xdb, 0x10, 0x75, 0x00, 0x00, 0x33, 0x10, 0xfe, 0xed, 0x0f,
+ 0x32, 0x32, 0xec, 0xbc,
+ 0xed, 0xfe, 0x44, 0x33, 0xfc, 0x00, 0x53, 0xfe, 0xa8, 0x0f, 0x11, 0x11,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x21, 0x10, 0x01, 0x33, 0x31, 0x00, 0xaa, 0xde, 0x10, 0x33, 0x11, 0xff,
+ 0x00, 0x00, 0xef, 0xef,
+ 0x0f, 0xee, 0x01, 0x31, 0x88, 0xde, 0x01, 0x01, 0xe0, 0xcc, 0x12, 0x43,
+ 0xdb, 0xde, 0x23, 0x02,
+ 0xf0, 0x34, 0xbe, 0x9b, 0x00, 0xf1, 0xdf, 0xef, 0x02, 0x25, 0x11, 0xee,
+ 0x01, 0x77, 0x00, 0xee,
+ 0xff, 0x54, 0x33, 0x0f, 0xce, 0xff, 0xf0, 0x01, 0x33, 0x00, 0x0f, 0x10,
+ 0x10, 0x0e, 0x12, 0x35,
+ 0x00, 0x01, 0xce, 0x98, 0xef, 0xdf, 0x10, 0x77, 0x31, 0x00, 0x0f, 0xff,
+ 0x10, 0x10, 0xee, 0xcc,
+ 0x00, 0x00, 0xcc, 0xf0, 0x32, 0x00, 0x0f, 0x00, 0x32, 0x66, 0x22, 0xff,
+ 0xdd, 0xee, 0x10, 0x65,
+ 0xff, 0xdb, 0x00, 0x22, 0xf0, 0xad, 0x00, 0x11, 0x23, 0x22, 0x11, 0xff,
+ 0x22, 0x33, 0xba, 0xef,
+ 0x66, 0x11, 0xcc, 0x00, 0x33, 0x11, 0xdd, 0x0f, 0x12, 0xef, 0xcc, 0x00,
+ 0x23, 0x22, 0xe0, 0xee,
+ 0xee, 0x0f, 0xde, 0x88, 0xdf, 0x33, 0x56, 0x11, 0x00, 0xdf, 0x00, 0x44,
+ 0x00, 0x01, 0x21, 0x00,
+ 0xef, 0x00, 0x44, 0x0f, 0xbc, 0xed, 0x10, 0x32, 0x22, 0x55, 0x21, 0x10,
+ 0x31, 0x55, 0x20, 0xff,
+ 0x0e, 0x0f, 0x00, 0xee, 0xb8, 0xdf, 0xff, 0x00, 0x30, 0x10, 0x00, 0x00,
+ 0xce, 0x8a, 0xff, 0xf0,
+ 0x00, 0xef, 0xff, 0x00, 0x01, 0x24, 0x22, 0x00, 0x00, 0x53, 0x12, 0x13,
+ 0x0f, 0xa8, 0xff, 0x21,
+ 0x00, 0x0f, 0x00, 0xff, 0x0f, 0x21, 0x11, 0x33, 0x33, 0xfd, 0x00, 0x65,
+ 0x0f, 0xb8, 0xff, 0x00,
+ 0x12, 0x42, 0x10, 0x00, 0xfe, 0x00, 0x34, 0x00, 0x0e, 0x50, 0x0f, 0x0e,
+ 0x66, 0x12, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xed, 0xce, 0x00, 0x42, 0x37, 0xdf, 0x88, 0xee,
+ 0x00, 0x01, 0x00, 0xde,
+ 0xcc, 0x00, 0x42, 0xff, 0xdd, 0x00, 0x44, 0x00, 0xfe, 0x11, 0x0f, 0xde,
+ 0x88, 0xce, 0x00, 0x12,
+ 0x02, 0x13, 0x01, 0xed, 0xa8, 0xde, 0x22, 0x34, 0x00, 0x22, 0x33, 0x00,
+ 0xbb, 0xf0, 0x21, 0x10,
+ 0x00, 0x23, 0x32, 0xbe, 0x0f, 0x22, 0xff, 0xee, 0x01, 0x03, 0xf0, 0xe0,
+ 0xee, 0xf3, 0xe4, 0x8c,
+ 0xfd, 0x14, 0x47, 0x00, 0x00, 0x0e, 0x22, 0x67, 0x00, 0xef, 0x32, 0x43,
+ 0xff, 0xff, 0x21, 0x34,
+ 0x00, 0xf0, 0x22, 0x76, 0x31, 0xef, 0xee, 0xf0, 0x11, 0xfe, 0xdd, 0x00,
+ 0x20, 0x75, 0x0e, 0xed,
+ 0x11, 0x65, 0x11, 0x0f, 0x1f, 0x10, 0x0e, 0xea, 0xff, 0x00, 0xed, 0xbd,
+ 0x01, 0x02, 0x00, 0x00,
+ 0xdc, 0xbb, 0xff, 0x00, 0x00, 0xcc, 0xdd, 0x44, 0x22, 0xbb, 0xcd, 0x0f,
+ 0x01, 0x12, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x36, 0x64, 0xfe, 0xab, 0x00, 0x01, 0x12, 0x12, 0x0e,
+ 0xcb, 0xff, 0x00, 0x21,
+ 0x32, 0x34, 0x00, 0xee, 0x01, 0x00, 0x43, 0x22, 0xbc, 0xed, 0x13, 0x13,
+ 0xbb, 0xbb, 0x00, 0x23,
+ 0x00, 0xee, 0xee, 0x00, 0x15, 0x11, 0x00, 0x33, 0x33, 0x01, 0x00, 0x11,
+ 0x63, 0x00, 0xed, 0x11,
+ 0x56, 0x11, 0x00, 0xfc, 0xf0, 0x34, 0x33, 0xee, 0xba, 0xff, 0x42, 0x66,
+ 0x00, 0xdd, 0x00, 0x0f,
+ 0xbc, 0x13, 0x54, 0x00, 0x00, 0x00, 0xef, 0xff, 0x10, 0x12, 0x00, 0xf0,
+ 0x0e, 0x1f, 0x44, 0x00,
+ 0xa8, 0xee, 0xee, 0xef, 0x00, 0xfe, 0xef, 0x43, 0x34, 0xee, 0xfe, 0x10,
+ 0xf0, 0x00, 0x77, 0x31,
+ 0xcd, 0xba, 0xee, 0x22, 0x22, 0x00, 0xee, 0xf0, 0xde, 0xff, 0x11, 0x33,
+ 0x44, 0x53, 0x21, 0xfe,
+ 0xec, 0x32, 0x67, 0x0f, 0xdd, 0x00, 0x42, 0x34, 0x13, 0x22, 0x11, 0x20,
+ 0x00, 0xee, 0xee, 0x00,
+ 0xdc, 0xfe, 0x72, 0x0f, 0xd8, 0x0f, 0x20, 0xde, 0xce, 0x22, 0x33, 0x10,
+ 0x42, 0x00, 0xba, 0x00,
+ 0x11, 0xde, 0xf0, 0xf0, 0x03, 0x35, 0x00, 0xde, 0x8d, 0xec, 0xde, 0xed,
+ 0x00, 0x45, 0x00, 0xf0,
+ 0xdd, 0xed, 0xef, 0x02, 0x77, 0x01, 0x9c, 0xee, 0x01, 0x25, 0x00, 0x00,
+ 0x01, 0x35, 0x22, 0xd0,
+ 0xce, 0x00, 0x11, 0x22, 0x00, 0xf0, 0xdf, 0xee, 0x20, 0x32, 0xcc, 0x8b,
+ 0xff, 0x01, 0xf0, 0x00,
+ 0x02, 0x00, 0xe0, 0x47, 0x35, 0x41, 0x32, 0xde, 0x8c, 0x0f, 0x00, 0x11,
+ 0x45, 0x33, 0xfe, 0xdd,
+ 0x10, 0x43, 0x0f, 0xeb, 0x11, 0x75, 0x00, 0x0d, 0x0f, 0x11, 0x21, 0x20,
+ 0x20, 0xff, 0xfd, 0x10,
+ 0x0d, 0xfc, 0x00, 0x52, 0x00, 0x0c, 0x0f, 0xff, 0x00, 0x52, 0x0f, 0xf0,
+ 0x05, 0xcd, 0xa8, 0xff,
+ 0x10, 0xef, 0xde, 0x01, 0x0f, 0xde, 0xf0, 0x02, 0x12, 0x67, 0x02, 0x00,
+ 0x11, 0xee, 0x10, 0x76,
+ 0x00, 0x00, 0x11, 0x11, 0xff, 0xdd, 0x11, 0x45, 0xf0, 0xdf, 0x44, 0x42,
+ 0xef, 0xbb, 0x11, 0x34,
+ 0xfe, 0xfe, 0x33, 0x00, 0xac, 0x0f, 0x01, 0x13, 0x12, 0x00, 0x0e, 0x01,
+ 0x24, 0xdc, 0x9b, 0x00,
+ 0x23, 0x23, 0x12, 0x22, 0xed, 0xdb, 0x51, 0x34, 0xef, 0xdd, 0x32, 0x41,
+ 0xcc, 0xef, 0x45, 0x10,
+ 0xef, 0x0f, 0x0f, 0xed, 0xee, 0xf0, 0x01, 0x77, 0x54, 0x00, 0xdd, 0xfe,
+ 0x00, 0x00, 0x22, 0x34,
+ 0xed, 0x10, 0x62, 0x0f, 0xed, 0x00, 0x20, 0x34, 0x67, 0x23, 0x11, 0x10,
+ 0xfd, 0xcb, 0x0f, 0x11,
+ 0x12, 0xfe, 0xee, 0x0e, 0xee, 0x00, 0xef, 0xec, 0xef, 0xc0, 0x15, 0x11,
+ 0xce, 0xcd, 0xbc, 0xdd,
+ 0x00, 0x22, 0x11, 0x12, 0x01, 0xf0, 0xff, 0xe3, 0x37, 0x32, 0xd0, 0xbf,
+ 0xfe, 0x77, 0x63, 0xff,
+ 0x0d, 0x0f, 0xfc, 0xdd, 0x01, 0x55, 0x0f, 0xec, 0x0f, 0x10, 0x21, 0x00,
+ 0x0d, 0xcb, 0x00, 0x22,
+ 0xac, 0xdb, 0x01, 0x00, 0xe0, 0xef, 0xcd, 0xcd, 0x01, 0x01, 0xf0, 0x45,
+ 0x02, 0xdd, 0xef, 0x22,
+ 0xef, 0x89, 0x11, 0x00, 0x00, 0x00, 0xed, 0xba, 0x01, 0x34, 0xff, 0xdf,
+ 0xff, 0xcd, 0xf0, 0x01,
+ 0x04, 0xf1, 0xcf, 0x11, 0x44, 0xff, 0xac, 0xec, 0x01, 0x44, 0xe0, 0xcc,
+ 0x01, 0x12, 0x01, 0xe1,
+ 0xe0, 0x05, 0x44, 0x21, 0x01, 0xe0, 0xcf, 0x00, 0x12, 0x23, 0x01, 0x13,
+ 0x21, 0xcc, 0xef, 0x77,
+ 0x65, 0x00, 0x00, 0x0f, 0x0f, 0x11, 0x00, 0xdd, 0xfe, 0x32, 0x56, 0x00,
+ 0xee, 0xee, 0xee, 0x10,
+ 0x42, 0xff, 0xdc, 0x00, 0x10, 0xaa, 0x00, 0x11, 0x00, 0xff, 0xdd, 0xee,
+ 0x31, 0x67, 0x00, 0x00,
+ 0x21, 0x11, 0x00, 0x01, 0x32, 0x00, 0xbb, 0x41, 0x55, 0xff, 0xef, 0x10,
+ 0x12, 0xf0, 0xff, 0x00,
+ 0x12, 0x54, 0x44, 0xfe, 0xc8, 0x10, 0x52, 0x00, 0xf0, 0xff, 0xff, 0x20,
+ 0x11, 0xf0, 0xef, 0x33,
+ 0x33, 0xee, 0xef, 0x20, 0x73, 0x11, 0x13, 0x24, 0x0f, 0xb9, 0xff, 0xff,
+ 0x00, 0x67, 0x11, 0x00,
+ 0x00, 0xf0, 0xfe, 0x00, 0x34, 0x00, 0xef, 0x00, 0x10, 0xff, 0x12, 0x77,
+ 0x10, 0xe0, 0x10, 0x32,
+ 0xe0, 0xee, 0x00, 0x20, 0x75, 0x44, 0x00, 0xfd, 0x0f, 0xcd, 0xcb, 0x00,
+ 0x33, 0xfe, 0x98, 0xee,
+ 0x11, 0x33, 0x00, 0xff, 0xfe, 0x00, 0x21, 0x00, 0xfe, 0xef, 0x45, 0x01,
+ 0xdd, 0xed, 0xfe, 0x0f,
+ 0x43, 0x44, 0x0e, 0xbc, 0xec, 0x00, 0x42, 0xf0, 0xb9, 0xef, 0x10, 0x0e,
+ 0xcd, 0x01, 0x46, 0x11,
+ 0x00, 0xde, 0xdf, 0x31, 0x54, 0x00, 0xef, 0xed, 0x0f, 0x31, 0xf0, 0x9c,
+ 0x00, 0x33, 0x00, 0xee,
+ 0xff, 0x11, 0x67, 0x33, 0x11, 0x21, 0x00, 0xbb, 0x00, 0x00, 0xff, 0xff,
+ 0x11, 0x10, 0xfc, 0xdd,
+ 0xff, 0x35, 0x42, 0xee, 0xdb, 0x31, 0x64, 0xf0, 0x0f, 0x10, 0xde, 0xbd,
+ 0xf0, 0x02, 0x01, 0xe0,
+ 0xab, 0x00, 0x11, 0x0f, 0xfd, 0xff, 0xf0, 0xe0, 0x37, 0x24, 0xc0, 0x01,
+ 0xf0, 0x8f, 0x02, 0x10,
+ 0xe9, 0x00, 0x01, 0xbd, 0x0f, 0x00, 0xff, 0xe0, 0x03, 0x14, 0xf0, 0xdf,
+ 0x23, 0x77, 0x34, 0xdd,
+ 0xff, 0x10, 0x00, 0xef, 0x00, 0xf1, 0xd0, 0x10, 0x10, 0xcf, 0x01, 0x22,
+ 0x77, 0x56, 0x00, 0xf0,
+ 0xef, 0x22, 0x43, 0xfe, 0x00, 0x46, 0x11, 0x00, 0x20, 0x31, 0x20, 0x41,
+ 0x33, 0x10, 0xec, 0x0e,
+ 0x51, 0x21, 0x10, 0x2e, 0x0d, 0x34, 0x77, 0x00, 0x0f, 0x31, 0x42, 0x10,
+ 0x0f, 0xfd, 0x20, 0x77,
+ 0x33, 0xed, 0xb9, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x31, 0x42, 0x0d,
+ 0xfc, 0x32, 0x22, 0xdd,
+ 0xdf, 0x76, 0x12, 0xfd, 0xff, 0x43, 0x22, 0x0f, 0x10, 0xfd, 0xb9, 0x11,
+ 0x53, 0x11, 0x0f, 0xdc,
+ 0xff, 0xff, 0x00, 0x00, 0x02, 0x24, 0x32, 0xff, 0xcc, 0xf0, 0x00, 0x34,
+ 0x75, 0x20, 0xba, 0xef,
+ 0x00, 0x00, 0x00, 0x33, 0x11, 0x01, 0x0f, 0xbc, 0x0e, 0x10, 0x21, 0x0f,
+ 0xda, 0xef, 0x00, 0x11,
+ 0x22, 0x31, 0x12, 0x9e, 0xff, 0x45, 0x00, 0xab, 0x00, 0x11, 0x0f, 0xcc,
+ 0xff, 0xed, 0x00, 0x0f,
+ 0xed, 0xdd, 0xef, 0xe0, 0xe1, 0xfe, 0x20, 0x02, 0xcc, 0x0e, 0x02, 0xce,
+ 0xcd, 0x04, 0x01, 0xd0,
+ 0x07, 0x02, 0x02, 0xaf, 0xde, 0x46, 0x12, 0xcd, 0x43, 0x77, 0x00, 0xff,
+ 0xfe, 0x0f, 0x10, 0x0d,
+ 0xa9, 0x00, 0x14, 0x11, 0x00, 0xee, 0xef, 0xee, 0xe0, 0x13, 0x23, 0xfe,
+ 0xbb, 0x00, 0x03, 0xde,
+ 0xbd, 0x01, 0x05, 0x00, 0xdd, 0x0f, 0x11, 0x01, 0xff, 0xde, 0xe0, 0x45,
+ 0x43, 0x13, 0x00, 0xdc,
+ 0xfe, 0x44, 0x01, 0x8b, 0xdc, 0xef, 0x00, 0xf0, 0xdd, 0xdd, 0x24, 0x76,
+ 0x00, 0xbc, 0xf0, 0x22,
+ 0x12, 0x11, 0x11, 0x00, 0x0e, 0xdb, 0xce, 0xff, 0x10, 0x11, 0x11, 0xe0,
+ 0xef, 0xf2, 0x13, 0x23,
+ 0x77, 0x77, 0x00, 0xdf, 0x00, 0x32, 0x22, 0x0f, 0x00, 0x23, 0x31, 0x31,
+ 0x02, 0xcf, 0xac, 0xfe,
+ 0xfe, 0xec, 0xff, 0x45, 0x22, 0xee, 0xbc, 0x00, 0x03, 0xf0, 0x21, 0x56,
+ 0x00, 0xe0, 0xf0, 0xe0,
+ 0x12, 0x46, 0x30, 0x00, 0x00, 0xef, 0x10, 0x41, 0x21, 0xff, 0x0f, 0x51,
+ 0x00, 0xdd, 0xdc, 0x00,
+ 0x1e, 0x10, 0x66, 0x00, 0xed, 0xfe, 0x62, 0x00, 0xe9, 0xf0, 0x34, 0x21,
+ 0xee, 0xf0, 0x02, 0xf0,
+ 0xcd, 0x40, 0x43, 0xda, 0xee, 0x00, 0x0e, 0x0e, 0x1e, 0x0d, 0x0f, 0x00,
+ 0xce, 0x00, 0x52, 0xdb,
+ 0xa8, 0x22, 0x63, 0x00, 0xed, 0x12, 0x33, 0x0f, 0xda, 0xce, 0xff, 0x10,
+ 0x0e, 0xed, 0xdd, 0xff,
+ 0x74, 0x35, 0x12, 0x11, 0x00, 0x11, 0x33, 0x10, 0xdd, 0x8b, 0xf0, 0x03,
+ 0x02, 0xfe, 0xff, 0xf0,
+ 0x03, 0x04, 0xdb, 0xff, 0x32, 0x12, 0x22, 0x00, 0xef, 0x32, 0x64, 0x45,
+ 0x77, 0x10, 0xfe, 0x00,
+ 0x20, 0x32, 0x23, 0xf0, 0xce, 0xdd, 0xcc, 0x00, 0x12, 0x00, 0x24, 0x00,
+ 0x0d, 0xfe, 0xfe, 0x42,
+ 0x00, 0xe0, 0x27, 0x12, 0x8b, 0xac, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0xdd,
+ 0xff, 0x00, 0xeb, 0xef,
+ 0x56, 0x32, 0xff, 0xcd, 0x10, 0x10, 0xfe, 0xf0, 0x12, 0x01, 0x01, 0xee,
+ 0x11, 0x77, 0x77, 0xff,
+ 0x0e, 0xff, 0xed, 0xde, 0x00, 0x23, 0x11, 0x00, 0x00, 0x33, 0x33, 0x20,
+ 0x32, 0x00, 0xdb, 0xef,
+ 0x41, 0x42, 0x32, 0x0e, 0xba, 0xe0, 0x33, 0x64, 0x10, 0x11, 0x10, 0xee,
+ 0x11, 0x65, 0xdb, 0xab,
+ 0x00, 0x33, 0x00, 0x0e, 0xee, 0xff, 0x35, 0x31, 0x00, 0xe0, 0xbe, 0x00,
+ 0x43, 0x22, 0xeb, 0xdd,
+ 0xef, 0x0e, 0xdd, 0xf0, 0x21, 0x00, 0xd0, 0x00, 0x57, 0x33, 0x00, 0xff,
+ 0xce, 0xdf, 0xcf, 0xe0,
+ 0x25, 0xf0, 0x8d, 0x00, 0x15, 0x00, 0xcf, 0x00, 0xff, 0xcb, 0x01, 0x55,
+ 0x00, 0xde, 0xf0, 0x01,
+ 0x02, 0x12, 0x01, 0x0f, 0x0f, 0x31, 0x22, 0x00, 0xe0, 0xf0, 0xdb, 0x9c,
+ 0x00, 0x45, 0x00, 0xac,
+ 0x00, 0x05, 0x01, 0x12, 0x43, 0x22, 0x00, 0x34, 0x33, 0xdd, 0xcc, 0x21,
+ 0x61, 0x0e, 0xfc, 0x20,
+ 0x56, 0x10, 0x20, 0x32, 0x20, 0x0d, 0x0e, 0x1f, 0x1e, 0x3f, 0x40, 0x10,
+ 0x0e, 0x0d, 0xea, 0xbc,
+ 0xee, 0x10, 0x02, 0x00, 0x10, 0x10, 0x54, 0x56, 0x21, 0x10, 0x0f, 0xee,
+ 0x01, 0x75, 0x21, 0x10,
+ 0x23, 0x33, 0x10, 0xfe, 0xfb, 0x00, 0x0e, 0xde, 0x00, 0x01, 0x0e, 0x73,
+ 0x46, 0x31, 0x32, 0x20,
+ 0x0d, 0x1f, 0x32, 0x30, 0xf9, 0x9c, 0xfe, 0x00, 0x21, 0x11, 0x01, 0xf0,
+ 0x00, 0x10, 0x01, 0x00,
+ 0xbd, 0x15, 0x23, 0x9a, 0xdd, 0x00, 0x23, 0xee, 0xef, 0x02, 0x00, 0x00,
+ 0x12, 0x01, 0x3d, 0x01,
+ 0x49, 0xfc, 0xdf, 0x1d, 0xb0, 0xf8, 0xea, 0x15, 0x00, 0x88, 0x0f, 0x42,
+ 0x00, 0x03, 0x14, 0xdd,
+ 0xbd, 0x10, 0x45, 0x22, 0xef, 0xbd, 0x0f, 0xfd, 0xec, 0xed, 0x0e, 0x11,
+ 0x35, 0xdf, 0x9a, 0x00,
+ 0x11, 0xee, 0xde, 0x32, 0x67, 0x21, 0x00, 0x0e, 0x00, 0x12, 0x00, 0xee,
+ 0x43, 0x21, 0x0d, 0x0f,
+ 0xff, 0xb9, 0x0f, 0x33, 0x24, 0xf0, 0xae, 0xcb, 0xff, 0xf1, 0xe0, 0xff,
+ 0x00, 0xf0, 0x12, 0x41,
+ 0xec, 0x1f, 0x51, 0x0d, 0xec, 0x11, 0x42, 0x1e, 0x0e, 0x2d, 0xf8, 0xcd,
+ 0x56, 0x54, 0x00, 0xcd,
+ 0xf0, 0x21, 0x00, 0xde, 0x01, 0x02, 0x00, 0x00, 0x01, 0xee, 0xff, 0x33,
+ 0x77, 0x21, 0x0f, 0x0e,
+ 0xfe, 0x0f, 0x54, 0x00, 0xb8, 0xff, 0x21, 0x21, 0x00, 0xf0, 0xd0, 0xff,
+ 0xee, 0xdf, 0x00, 0x00,
+ 0xde, 0xbc, 0x0f, 0x41, 0x43, 0x0f, 0xd9, 0xde, 0x11, 0x52, 0x00, 0x0b,
+ 0x0d, 0x10, 0x10, 0x12,
+ 0x00, 0xde, 0xde, 0xe0, 0xbe, 0xfe, 0x23, 0x46, 0xf0, 0xe0, 0xf3, 0xe1,
+ 0xaf, 0x12, 0x77, 0x27,
+ 0x0f, 0x00, 0x21, 0x20, 0x20, 0x31, 0x32, 0x01, 0x00, 0x21, 0x52, 0xff,
+ 0x0e, 0x54, 0x00, 0x88,
+ 0xef, 0x02, 0x01, 0xef, 0xde, 0x00, 0x00, 0x11, 0x00, 0xf2, 0x57, 0x44,
+ 0x00, 0x0f, 0x00, 0x23,
+ 0x32, 0x10, 0x1f, 0x20, 0x41, 0x21, 0x35, 0x33, 0x0f, 0xfd, 0x50, 0x1f,
+ 0xa8, 0x00, 0x00, 0xdf,
+ 0xce, 0x00, 0xdf, 0xba, 0x20, 0x22, 0x00, 0xfe, 0xed, 0xde, 0x11, 0x21,
+ 0x0e, 0xff, 0xe0, 0x00,
+ 0xda, 0x8d, 0x00, 0x12, 0x34, 0x32, 0x11, 0x02, 0x00, 0x56, 0x32, 0xf0,
+ 0x00, 0x77, 0x00, 0xef,
+ 0x0f, 0x00, 0x20, 0x31, 0x33, 0x12, 0xff, 0xbd, 0x0f, 0x00, 0xe0, 0xd0,
+ 0x47, 0x42, 0x12, 0x11,
+ 0xee, 0xef, 0x14, 0xf3, 0xaf, 0xf0, 0xe0, 0xce, 0x14, 0x04, 0xf3, 0x27,
+ 0x42, 0x01, 0x00, 0x41,
+ 0x32, 0xfe, 0xa9, 0xcd, 0xff, 0x42, 0x22, 0x00, 0xf0, 0xbc, 0xee, 0x02,
+ 0x12, 0xff, 0x01, 0x01,
+ 0xcb, 0x00, 0x13, 0xde, 0xaa, 0xef, 0xee, 0x0f, 0x00, 0xde, 0xca, 0x10,
+ 0x41, 0x00, 0x00, 0x62,
+ 0x20, 0x0e, 0x0e, 0x21, 0x22, 0xeb, 0xdc, 0x0e, 0x42, 0x13, 0xe0, 0x01,
+ 0x03, 0xd0, 0xd0, 0x00,
+ 0xf0, 0x67, 0x77, 0x00, 0xdd, 0xfe, 0x00, 0x20, 0xfc, 0xff, 0x00, 0x12,
+ 0x51, 0x0d, 0xfc, 0x21,
+ 0x21, 0xec, 0x41, 0x43, 0xef, 0xf0, 0x01, 0x34, 0x00, 0x99, 0xff, 0x53,
+ 0x20, 0xeb, 0xf0, 0x33,
+ 0x12, 0xed, 0x00, 0x63, 0x00, 0x00, 0xef, 0x01, 0xed, 0xb8, 0x00, 0x22,
+ 0xff, 0xf0, 0xf0, 0xf1,
+ 0x23, 0x00, 0x89, 0xee, 0x01, 0xf0, 0xf0, 0x22, 0x10, 0xed, 0x00, 0x00,
+ 0x0e, 0x41, 0x43, 0x13,
+ 0xff, 0xa8, 0xea, 0x00, 0x54, 0x01, 0xef, 0x00, 0xff, 0xee, 0xff, 0x00,
+ 0x20, 0x76, 0x00, 0xcb,
+ 0x00, 0x22, 0x00, 0x00, 0x01, 0x00, 0x02, 0x11, 0x1e, 0x61, 0x35, 0x00,
+ 0x0e, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0xe1, 0xc2, 0x05, 0x24, 0x34, 0xaf, 0xde, 0x55, 0x33, 0xdc,
+ 0xff, 0x12, 0x11, 0x00,
+ 0x20, 0x10, 0x00, 0x11, 0x52, 0x11, 0x00, 0x20, 0x10, 0x1f, 0x77, 0x77,
+ 0x00, 0x00, 0x11, 0x0f,
+ 0xef, 0x22, 0x11, 0xfe, 0x00, 0xf0, 0xdc, 0xfc, 0x10, 0x11, 0x01, 0xf1,
+ 0xde, 0xbd, 0xef, 0xde,
+ 0x00, 0x0c, 0xd8, 0x61, 0x44, 0xe0, 0xef, 0xfe, 0xdc, 0x10, 0x52, 0xef,
+ 0xce, 0xf1, 0x27, 0x00,
+ 0xf0, 0x31, 0xe0, 0xdf, 0x00, 0xef, 0xde, 0x0e, 0x0f, 0xdf, 0x8d, 0xab,
+ 0xf0, 0x05, 0x21, 0x00,
+ 0xdd, 0xba, 0xf0, 0x10, 0xf0, 0xe0, 0xf0, 0xdf, 0xdd, 0x10, 0x42, 0x10,
+ 0x01, 0xe2, 0x17, 0x64,
+ 0xf0, 0xff, 0x30, 0x20, 0xfd, 0x42, 0x11, 0x98, 0xfe, 0x00, 0x21, 0x11,
+ 0x11, 0xef, 0x00, 0x41,
+ 0x10, 0x01, 0xf2, 0xef, 0xcb, 0x21, 0x45, 0xff, 0xbe, 0xfe, 0xec, 0xee,
+ 0xfe, 0xcc, 0xfe, 0x21,
+ 0x65, 0x00, 0xcd, 0xfe, 0x0e, 0x0f, 0x20, 0x11, 0x53, 0x10, 0xea, 0x00,
+ 0x03, 0x22, 0x24, 0x01,
+ 0xdf, 0x22, 0x55, 0x11, 0x00, 0x11, 0x54, 0x12, 0xee, 0x0d, 0x74, 0x00,
+ 0xd8, 0x0f, 0x01, 0xe0,
+ 0xcf, 0xff, 0x00, 0x22, 0xf0, 0xce, 0xff, 0xef, 0xde, 0xdb, 0x0f, 0x74,
+ 0x66, 0x00, 0xed, 0x00,
+ 0x14, 0x01, 0x01, 0x12, 0x32, 0x00, 0x00, 0x0f, 0xdd, 0xff, 0x44, 0x10,
+ 0xbb, 0xdd, 0x0f, 0x55,
+ 0x21, 0x00, 0x10, 0x31, 0x0e, 0x1e, 0x64, 0x00, 0xfe, 0xfe, 0x00, 0x00,
+ 0xfd, 0xde, 0x02, 0x67,
+ 0x0f, 0xdd, 0xf0, 0xed, 0xeb, 0x54, 0x24, 0xff, 0x10, 0x43, 0x00, 0x20,
+ 0xfd, 0xbf, 0x07, 0x00,
+ 0x10, 0x31, 0xe0, 0xe0, 0x42, 0xf1, 0xbd, 0x10, 0x56, 0x01, 0xef, 0x00,
+ 0x23, 0x21, 0x02, 0x00,
+ 0x00, 0x77, 0x45, 0xdf, 0x01, 0x32, 0xff, 0xde, 0x13, 0x13, 0x01, 0x02,
+ 0xe0, 0xcb, 0x00, 0x23,
+ 0xdf, 0x10, 0x50, 0xff, 0x16, 0x45, 0xc0, 0xde, 0x00, 0x34, 0x01, 0xae,
+ 0x0f, 0x42, 0x21, 0x00,
+ 0x1f, 0x20, 0x1d, 0x0b, 0xdd, 0xcb, 0xce, 0x20, 0x63, 0xfd, 0xb9, 0x0f,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x22, 0xed, 0xff, 0x10, 0x0d, 0xca, 0xce, 0xef, 0xf0, 0x00, 0x0e,
+ 0xba, 0x00, 0x62, 0x21,
+ 0x0c, 0x10, 0x41, 0x01, 0x0e, 0x0d, 0xee, 0xf0, 0x00, 0xee, 0xee, 0x00,
+ 0x01, 0xf0, 0x00, 0x88,
+ 0xbb, 0x02, 0x12, 0x0f, 0xee, 0xf0, 0xf0, 0xed, 0xee, 0x00, 0x02, 0x02,
+ 0x33, 0x32, 0x27, 0xf3,
+ 0x8f, 0xde, 0x17, 0x32, 0xf1, 0xe0, 0x01, 0x00, 0xf0, 0x62, 0x33, 0x00,
+ 0x2c, 0x2f, 0x22, 0xf0,
+ 0xa8, 0xdf, 0xd0, 0xe1, 0x00, 0x00, 0xf0, 0xe1, 0xb0, 0xdb, 0x40, 0x51,
+ 0x00, 0x01, 0x00, 0xdb,
+ 0xcf, 0x00, 0x33, 0x01, 0x35, 0x66, 0x00, 0xcd, 0x0f, 0x22, 0x10, 0xef,
+ 0x00, 0xef, 0xcc, 0xee,
+ 0xf0, 0x00, 0x03, 0x32, 0x52, 0x30, 0x0e, 0x34, 0x77, 0x13, 0x01, 0x01,
+ 0x32, 0x20, 0xd9, 0xde,
+ 0xee, 0xf0, 0x74, 0x42, 0x10, 0x00, 0x1e, 0xfc, 0xfd, 0x56, 0x23, 0xf0,
+ 0x0f, 0x10, 0x00, 0xef,
+ 0xef, 0x01, 0xd0, 0x9c, 0x05, 0x35, 0x00, 0xef, 0x00, 0x10, 0x01, 0xae,
+ 0x00, 0x34, 0x10, 0xdd,
+ 0x10, 0x54, 0xee, 0xed, 0x00, 0xec, 0xff, 0x75, 0x10, 0xfd, 0xec, 0x01,
+ 0x23, 0xfe, 0xd9, 0xef,
+ 0xfe, 0x00, 0x10, 0xcf, 0xdf, 0x00, 0x21, 0x2f, 0x0e, 0x70, 0x00, 0x99,
+ 0xe0, 0x00, 0x00, 0x01,
+ 0x02, 0x01, 0x02, 0x03, 0x14, 0x22, 0x0e, 0xfd, 0x24, 0x14, 0x8b, 0x01,
+ 0x77, 0x00, 0xf0, 0x22,
+ 0x32, 0x0f, 0x0f, 0xdd, 0xf0, 0x01, 0x0f, 0x00, 0x22, 0xee, 0xee, 0x23,
+ 0x03, 0xd0, 0x13, 0x77,
+ 0x20, 0x41, 0x43, 0x12, 0x00, 0x01, 0x11, 0x46, 0x13, 0xef, 0xcd, 0x00,
+ 0x0f, 0x47, 0x42, 0x0e,
+ 0x0f, 0x00, 0x11, 0xfe, 0xed, 0x13, 0x47, 0x20, 0x00, 0xed, 0xee, 0xac,
+ 0xdc, 0x20, 0x74, 0x12,
+ 0x0e, 0xcb, 0xee, 0x00, 0x51, 0x12, 0xff, 0xec, 0xee, 0xed, 0x00, 0x00,
+ 0xdc, 0xdd, 0x23, 0x55,
+ 0x00, 0xee, 0xef, 0x01, 0x22, 0x10, 0x23, 0x03, 0x9b, 0xeb, 0x10, 0x41,
+ 0x01, 0xef, 0xff, 0x0f,
+ 0x10, 0x01, 0xf1, 0x89, 0x00, 0x24, 0x02, 0xc1, 0xe0, 0xdb, 0xfe, 0x02,
+ 0xf1, 0xc0, 0xed, 0xec,
+ 0xce, 0x11, 0x57, 0xf0, 0xef, 0x01, 0x01, 0xf2, 0x13, 0x64, 0x00, 0x00,
+ 0x00, 0xff, 0xcb, 0x00,
+ 0x35, 0x42, 0x51, 0x21, 0xf0, 0x00, 0x0f, 0x00, 0xfe, 0x14, 0x77, 0x11,
+ 0xff, 0xdd, 0xee, 0x10,
+ 0x22, 0xf1, 0xbe, 0x0e, 0x00, 0x0d, 0xee, 0x21, 0x12, 0x01, 0x16, 0x00,
+ 0x2e, 0x2f, 0xae, 0xcc,
+ 0x00, 0x04, 0xf2, 0xf1, 0x24, 0xdf, 0x8c, 0x03, 0x01, 0xfe, 0x25, 0x75,
+ 0x10, 0x0e, 0xff, 0x00,
+ 0x12, 0x11, 0x0f, 0xfb, 0xbc, 0xdd, 0x00, 0x02, 0x0e, 0xfc, 0xff, 0xef,
+ 0xe0, 0xe0, 0xef, 0x0f,
+ 0x5e, 0x62, 0x16, 0x01, 0x00, 0x00, 0x0e, 0x11, 0x77, 0x14, 0x0f, 0x0d,
+ 0x22, 0x55, 0x00, 0x0f,
+ 0x21, 0x00, 0xfe, 0xf0, 0xee, 0xdb, 0x10, 0x02, 0xe0, 0xd0, 0xbe, 0xdb,
+ 0x20, 0x0f, 0xde, 0x12,
+ 0x10, 0x0e, 0x4d, 0x1a, 0xfc, 0xce, 0xbd, 0xdc, 0xee, 0x0d, 0x1e, 0x0e,
+ 0xef, 0xe0, 0xae, 0xdf,
+ 0x02, 0x26, 0x11, 0xe1, 0x90, 0xd0, 0x01, 0x22, 0x43, 0x0e, 0x00, 0x46,
+ 0x33, 0x36, 0x42, 0x31,
+ 0x52, 0x23, 0x04, 0x00, 0x11, 0x10, 0x56, 0x23, 0xe0, 0x9c, 0xf0, 0x00,
+ 0xff, 0x00, 0x26, 0x00,
+ 0xce, 0xd0, 0x04, 0x01, 0x00, 0x2f, 0x30, 0x22, 0x11, 0x20, 0x41, 0x45,
+ 0x21, 0x41, 0x31, 0x11,
+ 0x02, 0xef, 0xde, 0xee, 0x41, 0x71, 0x19, 0xfc, 0xfe, 0x00, 0x00, 0x20,
+ 0x1f, 0x0c, 0x0e, 0xfe,
+ 0x88, 0xdf, 0x33, 0x22, 0x99, 0xde, 0x00, 0x00, 0xe0, 0xff, 0x20, 0x00,
+ 0x01, 0x33, 0xdd, 0x88,
+ 0xef, 0x00, 0x00, 0x11, 0x43, 0x00, 0x00, 0x30, 0x20, 0x21, 0x42, 0x31,
+ 0x0f, 0x00, 0x12, 0x34,
+ 0x10, 0xfb, 0x0e, 0x70, 0x10, 0xef, 0x02, 0xe2, 0x03, 0x37, 0x04, 0xe1,
+ 0xf0, 0xe0, 0xa0, 0xcd,
+ 0xbc, 0x00, 0x02, 0xf0, 0x04, 0x05, 0x01, 0x11, 0x32, 0x35, 0x32, 0xd0,
+ 0x90, 0xf0, 0x13, 0x00,
+ 0x0f, 0x22, 0xde, 0x8a, 0x00, 0x01, 0x00, 0xce, 0xef, 0xe0, 0x14, 0x67,
+ 0x01, 0xf0, 0xe0, 0xe0,
+ 0x00, 0x0e, 0x0e, 0x20, 0x10, 0xfd, 0x00, 0x00, 0x1d, 0x09, 0xdb, 0xef,
+ 0x20, 0xf0, 0x8e, 0xad,
+ 0x00, 0x30, 0x34, 0x13, 0xf0, 0xe0, 0xff, 0xbb, 0x00, 0x33, 0xf0, 0xcd,
+ 0xfc, 0xff, 0x01, 0x55,
+ 0x22, 0x0f, 0xee, 0x12, 0x64, 0x0a, 0xfc, 0x20, 0x32, 0x0e, 0xdb, 0x00,
+ 0x11, 0x11, 0x00, 0x0f,
+ 0x51, 0x01, 0x2f, 0x2d, 0x0c, 0xdd, 0x8c, 0xff, 0xf0, 0xe0, 0xde, 0x11,
+ 0x77, 0x24, 0x21, 0x10,
+ 0x20, 0x31, 0x13, 0x01, 0x00, 0x21, 0x00, 0xfe, 0xec, 0xbb, 0x11, 0x24,
+ 0xf0, 0xf1, 0x22, 0x0f,
+ 0xdc, 0x41, 0x45, 0x01, 0x00, 0xee, 0xbc, 0x0f, 0x1f, 0xdd, 0xdc, 0x50,
+ 0x0d, 0x9a, 0x01, 0x03,
+ 0x00, 0xd0, 0xf1, 0x04, 0xf1, 0xb0, 0xf1, 0x01, 0xf0, 0xde, 0xec, 0xda,
+ 0xcc, 0xff, 0x20, 0x52,
+ 0x20, 0x0e, 0xef, 0x54, 0x22, 0xe0, 0x06, 0x43, 0x00, 0x00, 0xf1, 0xd0,
+ 0xf0, 0x73, 0x11, 0x0e,
+ 0x00, 0xf1, 0xf2, 0xe3, 0xe6, 0x03, 0x24, 0x13, 0x01, 0x02, 0x24, 0x00,
+ 0x32, 0x31, 0x60, 0x72,
+ 0x34, 0x21, 0x31, 0x30, 0x76, 0x34, 0x00, 0x21, 0x44, 0x45, 0x31, 0x20,
+ 0x1f, 0x0f, 0x0f, 0x0d,
+ 0xf9, 0xef, 0x01, 0x10, 0xcd, 0xff, 0x43, 0x22, 0xef, 0xe0, 0x00, 0xe0,
+ 0xbc, 0xf0, 0xf0, 0x9b,
+ 0xfe, 0x0f, 0x00, 0xdd, 0xce, 0xf4, 0xe0, 0xda, 0x1f, 0x20, 0xc0, 0xbf,
+ 0xf1, 0x02, 0xbe, 0xee,
+ 0xee, 0xed, 0xf0, 0x0e, 0x08, 0x0d, 0x20, 0x0e, 0xfc, 0xfe, 0xde, 0xef,
+ 0x00, 0x10, 0xe2, 0x8d,
+ 0xef, 0x47, 0x11, 0x00, 0x42, 0x12, 0xcd, 0x9a, 0xf0, 0xf0, 0x01, 0x03,
+ 0x05, 0x01, 0x24, 0x43,
+ 0x10, 0x0d, 0x20, 0x77, 0x00, 0x0c, 0x00, 0x0f, 0xed, 0x00, 0x01, 0xef,
+ 0xb0, 0x02, 0xf0, 0x10,
+ 0x15, 0x00, 0xe0, 0xf0, 0x0f, 0x19, 0xdd, 0xbe, 0xff, 0x20, 0x0f, 0xda,
+ 0x20, 0x71, 0x00, 0x0e,
+ 0x20, 0x10, 0x00, 0xf0, 0xde, 0x9b, 0xef, 0x02, 0x24, 0xcd, 0xcb, 0xf0,
+ 0xf1, 0x04, 0x02, 0x00,
+ 0x0e, 0x40, 0x66, 0x12, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x0d, 0x41, 0x13,
+ 0xdc, 0xcd, 0x23, 0x66,
+ 0x00, 0x00, 0x00, 0xf0, 0xe0, 0x02, 0x01, 0xfd, 0x0d, 0x46, 0x14, 0xe0,
+ 0xbf, 0xef, 0x00, 0x02,
+ 0x0e, 0x0f, 0x77, 0x53, 0x0f, 0x0f, 0x23, 0x01, 0x0f, 0x1e, 0x11, 0x34,
+ 0x23, 0x12, 0x0d, 0xfd,
+ 0x34, 0x0f, 0xb8, 0xfe, 0x1e, 0xed, 0xde, 0x45, 0x00, 0xae, 0x0e, 0x00,
+ 0x22, 0x10, 0x10, 0x0d,
+ 0xfc, 0xaf, 0xe0, 0x0c, 0x0c, 0x3e, 0x31, 0x04, 0xc0, 0xb0, 0x03, 0x03,
+ 0x12, 0x27, 0xf1, 0xd0,
+ 0xc2, 0xa2, 0xe1, 0x11, 0x00, 0x0f, 0x35, 0x54, 0x11, 0x22, 0x35, 0x52,
+ 0x32, 0x23, 0x10, 0xef,
+ 0xd1, 0x07, 0x22, 0xef, 0x00, 0x41, 0x01, 0xb0, 0xe0, 0x05, 0xd1, 0x8d,
+ 0xf0, 0x14, 0x11, 0xff,
+ 0xed, 0x00, 0x35, 0x22, 0xf0, 0x2f, 0x71, 0x10, 0x1e, 0x1d, 0x0b, 0x31,
+ 0x56, 0x0f, 0xed, 0xee,
+ 0x0f, 0x10, 0x21, 0xeb, 0xee, 0xef, 0xbb, 0xdd, 0x10, 0x21, 0x9d, 0xda,
+ 0x20, 0x30, 0x00, 0x00,
+ 0x1f, 0x0a, 0x2f, 0x71, 0x41, 0x0f, 0xed, 0xde, 0x00, 0x00, 0x31, 0x10,
+ 0x0e, 0xed, 0xab, 0xef,
+ 0x0f, 0x20, 0x1e, 0xdd, 0xf0, 0x46, 0x10, 0xcd, 0xba, 0xde, 0xde, 0xfe,
+ 0x23, 0x02, 0xdf, 0x10,
+ 0x63, 0x02, 0xe1, 0x05, 0xe0, 0xce, 0xdd, 0x03, 0x17, 0x00, 0xe0, 0xdf,
+ 0xf0, 0x45, 0x12, 0xe0,
+ 0x00, 0x71, 0x32, 0x13, 0x13, 0x11, 0x47, 0x52, 0x12, 0x00, 0x0e, 0xdf,
+ 0x01, 0x12, 0xe0, 0xd0,
+ 0xbf, 0x0e, 0x00, 0xf0, 0xcd, 0xe1, 0xd0, 0xc8, 0x0d, 0x71, 0x00, 0x0e,
+ 0x00, 0x26, 0x11, 0xe0,
+ 0xdb, 0x0e, 0x45, 0x01, 0xbe, 0xfe, 0xef, 0xf0, 0x00, 0x30, 0x02, 0xaf,
+ 0xef, 0x01, 0x00, 0x11,
+ 0x00, 0xed, 0xdb, 0xcc, 0xf9, 0x40, 0x74, 0x44, 0x01, 0x32, 0x43, 0x00,
+ 0x00, 0x0e, 0x10, 0x00,
+ 0xff, 0xec, 0xee, 0x21, 0x34, 0x42, 0x43, 0x21, 0x42, 0x20, 0x0f, 0x11,
+ 0x0f, 0xdc, 0xde, 0xbf,
+ 0xe2, 0x00, 0xe8, 0xae, 0x16, 0x44, 0x21, 0x10, 0x22, 0x55, 0x21, 0x21,
+ 0x10, 0xfe, 0xdc, 0xf0,
+ 0x03, 0xc0, 0xde, 0x2f, 0x60, 0x10, 0x32, 0x10, 0x0e, 0x04, 0xf2, 0xed,
+ 0xfd, 0x2e, 0x4e, 0xf8,
+ 0xbe, 0xde, 0xbd, 0xca, 0xef, 0xff, 0xfe, 0xef, 0xce, 0xee, 0xf0, 0xfe,
+ 0xba, 0xf0, 0x01, 0x00,
+ 0xdd, 0xef, 0xff, 0x0f, 0x20, 0x77, 0x65, 0x01, 0x00, 0x00, 0xff, 0xef,
+ 0x03, 0x15, 0x02, 0x01,
+ 0x11, 0x20, 0x00, 0x31, 0x73, 0x00, 0xfc, 0xff, 0x24, 0x22, 0xee, 0xde,
+ 0x33, 0x32, 0xed, 0x11,
+ 0x33, 0x2c, 0x7d, 0x40, 0x00, 0x02, 0x27, 0x22, 0x20, 0x10, 0x2e, 0x53,
+ 0x24, 0x12, 0x47, 0x22,
+ 0x21, 0x72, 0x24, 0x24, 0x22, 0x10, 0x0e, 0xff, 0x20, 0x30, 0x0e, 0x0d,
+ 0xcb, 0xbe, 0xef, 0xcc,
+ 0xdd, 0x00, 0x03, 0x0e, 0x0d, 0xe8, 0x8c, 0xee, 0x00, 0x00, 0xef, 0xdf,
+ 0xee, 0x00, 0x54, 0x0f,
+ 0xfd, 0xff, 0x11, 0x77, 0x12, 0x00, 0x0e, 0xea, 0xee, 0x20, 0x31, 0x0e,
+ 0x1e, 0x00, 0xcf, 0xe1,
+ 0xe1, 0xdf, 0x03, 0x05, 0x8f, 0xde, 0x0f, 0xee, 0xdd, 0xdd, 0x02, 0xf7,
+ 0xb0, 0xe0, 0xd1, 0xd0,
+ 0xdd, 0x0b, 0x1f, 0x31, 0x23, 0xf0, 0xbf, 0x00, 0x43, 0x56, 0x00, 0xe0,
+ 0xd0, 0x01, 0x21, 0x02,
+ 0x16, 0x00, 0xd0, 0xf0, 0xc0, 0xee, 0x31, 0x77, 0x65, 0x00, 0xee, 0x0e,
+ 0x20, 0x30, 0x0f, 0xf0,
+ 0x00, 0x0d, 0x0d, 0x0d, 0xbe, 0xc0, 0xf7, 0x12, 0x00, 0xf0, 0x02, 0x03,
+ 0x12, 0xed, 0xee, 0x26,
+ 0x04, 0xa0, 0xf0, 0xcc, 0xdd, 0x00, 0xf0, 0xbd, 0xf0, 0x04, 0x24, 0x00,
+ 0xbd, 0x00, 0x02, 0xe0,
+ 0xae, 0xff, 0xfc, 0x09, 0x0f, 0x60, 0x00, 0xec, 0xfe, 0x10, 0x10, 0x12,
+ 0x22, 0x10, 0x0f, 0x21,
+ 0x55, 0x22, 0x02, 0xbf, 0xfd, 0x10, 0x22, 0x00, 0x00, 0x17, 0x05, 0x05,
+ 0xcd, 0x00, 0x41, 0x01,
+ 0x9a, 0xe3, 0xfc, 0x02, 0x9e, 0xe5, 0xb8, 0x04, 0xff, 0x74, 0x15, 0xee,
+ 0xd9, 0x00, 0x31, 0x13,
+ 0x40, 0x0d, 0xf0, 0xc0, 0xd0, 0x31, 0x62, 0x0f, 0xff, 0x0f, 0x0d, 0xf3,
+ 0xe0, 0xb8, 0x20, 0x31,
+ 0x03, 0x10, 0x0e, 0xc8, 0xef, 0xa0, 0xee, 0x22, 0x63, 0x0f, 0xcb, 0x00,
+ 0x00, 0xff, 0x02, 0x43,
+ 0x0e, 0xcd, 0xfd, 0x01, 0x35, 0x0d, 0xcd, 0x11, 0x33, 0x01, 0x01, 0x0d,
+ 0xdd, 0x04, 0x46, 0xe0,
+ 0xce, 0x00, 0x20, 0x00, 0x00, 0x0d, 0x1f, 0x10, 0xe3, 0xf2, 0xf4, 0x04,
+ 0xfe, 0xaa, 0x20, 0x00,
+ 0xe5, 0x01, 0x8a, 0xcf, 0x31, 0x54, 0x00, 0xed, 0xe0, 0x20, 0x77, 0x00,
+ 0xfd, 0xf0, 0x02, 0x20,
+ 0xee, 0xe0, 0x14, 0x40, 0xff, 0x0d, 0x43, 0x12, 0xee, 0xfd, 0x14, 0x10,
+ 0x0f, 0x22, 0x72, 0xfb,
+ 0xbd, 0xf0, 0x00, 0x20, 0x0d, 0x04, 0x34, 0xee, 0xbb, 0x11, 0x54, 0x0d,
+ 0xdd, 0x00, 0x24, 0x10,
+ 0x1e, 0xff, 0xab, 0x22, 0x76, 0x00, 0xfd, 0xe0, 0x0f, 0x1f, 0x01, 0x13,
+ 0xfe, 0xdb, 0x21, 0x32,
+ 0xef, 0xdd, 0x12, 0x77, 0x00, 0x0e, 0xff, 0xf0, 0x00, 0x14, 0x1f, 0x30,
+ 0xff, 0xaf, 0x0e, 0xf0,
+ 0x01, 0x22, 0x36, 0x00, 0x01, 0x20, 0xe0, 0xd0, 0xd1, 0x02, 0x23, 0xad,
+ 0xab, 0x37, 0x30, 0xdf,
+ 0xf0, 0x32, 0x10, 0xdf, 0xb0, 0x21, 0x21, 0x11, 0x01, 0xbe, 0x00, 0x31,
+ 0x00, 0x01, 0xdc, 0xe9,
+ 0x01, 0x45, 0xf1, 0x00, 0xf0, 0xce, 0x00, 0x00, 0xef, 0xab, 0x02, 0x35,
+ 0xef, 0xde, 0x40, 0x00,
+ 0x02, 0x74, 0x01, 0xde, 0xce, 0x12, 0x10, 0xcd, 0x01, 0x42, 0xfe, 0xff,
+ 0x15, 0x00, 0xeb, 0x20,
+ 0x43, 0xdf, 0xbd, 0x20, 0x11, 0x00, 0xcc, 0x0e, 0x56, 0xf1, 0xf0, 0x0f,
+ 0x41, 0xff, 0x98, 0x10,
+ 0x37, 0x10, 0xee, 0xe0, 0x0f, 0x10, 0x11, 0x21, 0x00, 0x20, 0x11, 0x00,
+ 0xdf, 0x0e, 0x73, 0x03,
+ 0xba, 0x00, 0x21, 0x0f, 0x20, 0x23, 0x00, 0x00, 0x01, 0xfc, 0x1f, 0x71,
+ 0x12, 0xee, 0xe2, 0x02,
+ 0x09, 0xdc, 0x0f, 0x30, 0xd0, 0xf7, 0x40, 0xef, 0xde, 0xdf, 0x51, 0x63,
+ 0x0f, 0xf0, 0xee, 0xcc,
+ 0xfd, 0x00, 0x45, 0x00, 0xed, 0xe0, 0x00, 0x3f, 0x33, 0x01, 0xd0, 0x0d,
+ 0x36, 0x73, 0xed, 0xbb,
+ 0x01, 0x16, 0x00, 0x0e, 0xdd, 0xf0, 0x76, 0x31, 0xde, 0xde, 0x54, 0x01,
+ 0xec, 0xe0, 0x43, 0x00,
+ 0xff, 0x01, 0x43, 0xec, 0xff, 0x10, 0x36, 0x20, 0x3f, 0x00, 0xc0, 0xff,
+ 0x01, 0x55, 0x42, 0x0f,
+ 0xfc, 0x00, 0x23, 0x20, 0x12, 0x73, 0x00, 0xda, 0x00, 0x41, 0x11, 0x0f,
+ 0xff, 0xf0, 0x00, 0x34,
+ 0x42, 0xfd, 0xdc, 0x13, 0x24, 0x00, 0x40, 0x0d, 0xff, 0xd0, 0x40, 0x01,
+ 0x95, 0x02, 0x0d, 0xe9,
+ 0xf1, 0x42, 0x3f, 0xec, 0xd0, 0x03, 0xf1, 0x40, 0x40, 0x0e, 0xe0, 0x00,
+ 0xdd, 0xff, 0x1e, 0xb8,
+ 0x3f, 0x77, 0x11, 0xdf, 0x00, 0x00, 0xac, 0x00, 0xf0, 0xe0, 0xf0, 0xef,
+ 0x10, 0x72, 0x00, 0xfb,
+ 0xff, 0x24, 0x01, 0xff, 0x0d, 0x0d, 0x00, 0x47, 0xd0, 0xcd, 0x00, 0x00,
+ 0x00, 0x3f, 0xef, 0x8f,
+ 0xff, 0x02, 0x13, 0xfc, 0xee, 0x76, 0x02, 0x00, 0x0c, 0xde, 0x00, 0x23,
+ 0x0f, 0xee, 0xfe, 0x0c,
+ 0xfe, 0x43, 0x05, 0xdd, 0x9d, 0x0e, 0x01, 0x02, 0x2d, 0x0c, 0xb0, 0xff,
+ 0x03, 0x32, 0x1b, 0xdd,
+ 0xc0, 0x0d, 0x02, 0x07, 0xef, 0xa9, 0x10, 0x33, 0x00, 0x10, 0xed, 0xb0,
+ 0x00, 0x1f, 0x00, 0x37,
+ 0x02, 0xad, 0xfd, 0x0d, 0xf0, 0x01, 0x14, 0x30, 0xbb, 0xf0, 0x25, 0x10,
+ 0xbd, 0xf0, 0x12, 0x10,
+ 0xde, 0xdf, 0x00, 0x0e, 0xde, 0xfe, 0x26, 0x10, 0xe0, 0x0e, 0x41, 0xd0,
+ 0xed, 0x75, 0x52, 0xbe,
+ 0x00, 0x03, 0x10, 0x0c, 0xff, 0x00, 0xf0, 0x22, 0x10, 0xfd, 0x37, 0x73,
+ 0xfb, 0xdf, 0x42, 0x43,
+ 0xee, 0xf1, 0xf2, 0xd9, 0x0f, 0x20, 0x02, 0x00, 0x33, 0x30, 0x8b, 0x00,
+ 0x00, 0x00, 0xdd, 0x20,
+ 0x32, 0x02, 0x02, 0xec, 0xdd, 0x03, 0x67, 0x20, 0xec, 0xc0, 0x01, 0x11,
+ 0x62, 0x01, 0xdc, 0x0f,
+ 0x43, 0xf1, 0xe1, 0x34, 0x32, 0x31, 0x04, 0xdd, 0xce, 0x34, 0x43, 0xf0,
+ 0xc0, 0x04, 0x02, 0x33,
+ 0x43, 0xff, 0x00, 0x45, 0x00, 0xcf, 0x10, 0x03, 0xc0, 0xd0, 0x0c, 0x2c,
+ 0x12, 0x37, 0x47, 0x0f,
+ 0x70, 0x43, 0xce, 0xef, 0x31, 0x24, 0xf0, 0xdd, 0x31, 0x64, 0x00, 0x0c,
+ 0x00, 0x02, 0x01, 0x11,
+ 0xfe, 0xef, 0x42, 0x33, 0x00, 0x21, 0x12, 0xfd, 0xbf, 0xd9, 0xbd, 0x0e,
+ 0x47, 0x63, 0x00, 0xeb,
+ 0x00, 0x12, 0x00, 0xfe, 0xf0, 0x2f, 0x10, 0x0f, 0x0e, 0x00, 0x25, 0x0e,
+ 0x1d, 0x30, 0x42, 0x00,
+ 0xdc, 0xce, 0xe1, 0x43, 0x0b, 0x9e, 0x12, 0x21, 0xfe, 0xfe, 0x00, 0x00,
+ 0x0f, 0xdb, 0x9f, 0x00,
+ 0x20, 0x10, 0x01, 0x00, 0x08, 0xee, 0xe0, 0xd0, 0xbd, 0xdd, 0x14, 0x77,
+ 0x74, 0xfe, 0xcc, 0x00,
+ 0x12, 0x00, 0x0f, 0x01, 0x10, 0xc9, 0x00, 0x02, 0x21, 0x31, 0xfe, 0xbf,
+ 0x0f, 0x34, 0x21, 0xff,
+ 0x9d, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0x02, 0x00, 0x0e, 0x02, 0x15, 0x00,
+ 0xe0, 0xf1, 0x23, 0xe8,
+ 0x9e, 0xf0, 0xf1, 0xef, 0xfe, 0x0f, 0xcf, 0xef, 0x23, 0x77, 0x13, 0xfd,
+ 0xdc, 0x22, 0x13, 0xec,
+ 0xcb, 0x00, 0x33, 0x43, 0xef, 0xee, 0x10, 0x20, 0x20, 0x44, 0x03, 0xbf,
+ 0xd9, 0x0f, 0x21, 0x41,
+ 0x0f, 0xe0, 0xf2, 0x00, 0x4d, 0x1e, 0x03, 0x37, 0xff, 0x8e, 0xdf, 0xff,
+ 0x21, 0x43, 0x05, 0x10,
+ 0x0d, 0xdf, 0x00, 0x32, 0x10, 0x00, 0x04, 0x00, 0x2f, 0x2f, 0x22, 0x01,
+ 0xbb, 0x42, 0x56, 0x00,
+ 0x20, 0xef, 0xce, 0x23, 0x54, 0x10, 0x10, 0x30, 0xfb, 0xce, 0x02, 0xf5,
+ 0xaf, 0x0e, 0x42, 0x20,
+ 0x00, 0xce, 0xfd, 0x11, 0x11, 0x00, 0xbc, 0x0d, 0x00, 0x1e, 0x04, 0xfa,
+ 0xbe, 0x34, 0x11, 0x0e,
+ 0xff, 0x43, 0x47, 0x00, 0xce, 0x00, 0xe1, 0xe0, 0x30, 0x33, 0xbe, 0xfb,
+ 0x00, 0x20, 0x02, 0x25,
+ 0x30, 0x4f, 0x3e, 0xc0, 0xb0, 0x57, 0x02, 0xfd, 0xf0, 0x00, 0x0f, 0x10,
+ 0x41, 0x00, 0xde, 0x0f,
+ 0x0d, 0x13, 0x07, 0x45, 0x50, 0x0e, 0x00, 0x02, 0x34, 0x0f, 0xba, 0x10,
+ 0x74, 0x31, 0xe0, 0xed,
+ 0x0e, 0x10, 0x12, 0x12, 0x00, 0x1e, 0x01, 0xf4, 0x11, 0x42, 0x10, 0x32,
+ 0x55, 0xfd, 0x99, 0x00,
+ 0x11, 0x10, 0xfe, 0xf0, 0x03, 0x00, 0x2f, 0x1e, 0x0c, 0x0e, 0xf0, 0x15,
+ 0x74, 0x41, 0x00, 0xec,
+ 0x00, 0xee, 0xe0, 0x22, 0x1e, 0xb8, 0x2f, 0x64, 0xe0, 0xed, 0x12, 0x32,
+ 0x00, 0xed, 0xff, 0x20,
+ 0xf2, 0xa0, 0x0b, 0x20, 0x10, 0xee, 0x35, 0x52, 0x0f, 0xef, 0x00, 0xec,
+ 0xce, 0x00, 0x77, 0x01,
+ 0xef, 0xdd, 0x00, 0x41, 0x0f, 0xee, 0xe1, 0x0f, 0x0e, 0x46, 0x22, 0xed,
+ 0xce, 0x00, 0x10, 0x01,
+ 0x23, 0x22, 0x25, 0x0e, 0xaa, 0x00, 0x02, 0xdf, 0xf0, 0x41, 0xf2, 0xbd,
+ 0xfd, 0x00, 0x12, 0x13,
+ 0x33, 0x00, 0xf1, 0xdd, 0xf8, 0xd0, 0xf3, 0x02, 0xbd, 0xd0, 0xc1, 0xce,
+ 0xfe, 0x47, 0x44, 0xce,
+ 0xce, 0x24, 0x34, 0x00, 0xba, 0xf0, 0x00, 0x13, 0x1f, 0x0f, 0xdd, 0x90,
+ 0x11, 0x23, 0x0f, 0xe0,
+ 0x33, 0x10, 0xfe, 0x12, 0xf2, 0x8f, 0xed, 0x01, 0x0f, 0x1e, 0x1f, 0xf8,
+ 0xdb, 0x10, 0x12, 0x03,
+ 0x01, 0x01, 0xa0, 0xed, 0x22, 0x35, 0x12, 0xe0, 0x00, 0x00, 0xfe, 0x0f,
+ 0x2b, 0x30, 0x20, 0x00,
+ 0x70, 0x57, 0xff, 0xdd, 0x02, 0x35, 0x0f, 0x0f, 0x10, 0x01, 0xf0, 0x0c,
+ 0x1f, 0xd0, 0xa1, 0x00,
+ 0x0c, 0x3d, 0xe0, 0x83, 0x00, 0x51, 0xfa, 0xcb, 0x0f, 0x20, 0x11, 0x00,
+ 0xf3, 0x11, 0x55, 0x00,
+ 0xba, 0xed, 0x11, 0x67, 0xf0, 0xed, 0x00, 0x01, 0x22, 0x0f, 0x00, 0x32,
+ 0x02, 0xef, 0xee, 0x00,
+ 0xee, 0xef, 0x23, 0x30, 0x0a, 0x00, 0xa1, 0xf1, 0x03, 0x50, 0x23, 0x00,
+ 0xf1, 0xcf, 0xf3, 0x37,
+ 0x0e, 0xed, 0xe0, 0x90, 0xfd, 0xfa, 0x40, 0x57, 0x01, 0x0f, 0xef, 0x24,
+ 0x21, 0x1f, 0x0d, 0xff,
+ 0xe2, 0xf3, 0xd0, 0xee, 0x4d, 0x60, 0x00, 0xf0, 0xbf, 0x1e, 0x47, 0x13,
+ 0xfd, 0x01, 0x25, 0x00,
+ 0x8b, 0xff, 0x12, 0x2f, 0x0e, 0x10, 0x01, 0xff, 0xed, 0x00, 0x50, 0x25,
+ 0x0f, 0xeb, 0xf0, 0xf2,
+ 0xc0, 0x0e, 0x43, 0x0f, 0xfa, 0x00, 0x33, 0x1e, 0xcb, 0xf0, 0x01, 0x02,
+ 0x20, 0xed, 0xce, 0x10,
+ 0x53, 0x00, 0xbe, 0x0f, 0x2d, 0x22, 0x57, 0xff, 0xc8, 0x01, 0x42, 0x00,
+ 0x00, 0xdd, 0xe0, 0x01,
+ 0x43, 0x00, 0xe1, 0x00, 0xeb, 0x63, 0x35, 0xee, 0xed, 0xe0, 0xf1, 0x00,
+ 0x41, 0x44, 0xe1, 0xe0,
+ 0xfe, 0x20, 0x00, 0xf2, 0x36, 0x00, 0xc0, 0x0e, 0x23, 0xc0, 0x8b, 0x00,
+ 0x12, 0x02, 0x02, 0xcb,
+ 0xfe, 0x10, 0x43, 0x04, 0xf1, 0x10, 0xfe, 0xdd, 0x00, 0x32, 0xfd, 0x9a,
+ 0xee, 0xdf, 0xff, 0xe0,
+ 0x47, 0x30, 0xee, 0xdd, 0x14, 0x43, 0xbe, 0xdb, 0x00, 0x34, 0x00, 0xbf,
+ 0x0e, 0xff, 0x30, 0x21,
+ 0x01, 0x02, 0xcb, 0xae, 0x00, 0x43, 0x12, 0x0d, 0xfd, 0x01, 0x02, 0x10,
+ 0xff, 0xf2, 0x01, 0x0d,
+ 0xc8, 0x0f, 0x00, 0x1d, 0x0d, 0xf4, 0x75, 0x00, 0xdf, 0xbf, 0x00, 0x40,
+ 0x33, 0xe0, 0xf3, 0x47,
+ 0x1f, 0xd8, 0xf0, 0x40, 0x12, 0x10, 0x00, 0x01, 0xde, 0x20, 0x63, 0x00,
+ 0xff, 0x00, 0x0e, 0x0d,
+ 0x2f, 0xf0, 0xb1, 0x04, 0x2f, 0xe9, 0x13, 0x44, 0xcb, 0x0e, 0x21, 0x01,
+ 0xd0, 0x1c, 0x70, 0x01,
+ 0xd1, 0xe0, 0x0c, 0xe0, 0xde, 0xf0, 0x15, 0x61, 0x20, 0x31, 0xf0, 0xc0,
+ 0x01, 0xed, 0x72, 0x55,
+ 0xed, 0xe0, 0x04, 0x0d, 0x1e, 0x25, 0x12, 0xf0, 0x00, 0x0d, 0x9c, 0x01,
+ 0x44, 0x22, 0x14, 0xdd,
+ 0xbd, 0x04, 0x35, 0xee, 0xfe, 0x33, 0x23, 0xdf, 0xeb, 0x00, 0x24, 0x51,
+ 0x00, 0x40, 0x32, 0x02,
+ 0x00, 0x31, 0x23, 0x0e, 0x23, 0x67, 0x0f, 0xdc, 0x00, 0x00, 0x32, 0x01,
+ 0xff, 0x21, 0x75, 0x30,
+ 0x0f, 0x03, 0x26, 0x00, 0xde, 0xff, 0x10, 0x74, 0x20, 0xec, 0x01, 0x54,
+ 0xee, 0xda, 0x11, 0x52,
+ 0x00, 0xff, 0x00, 0x02, 0x20, 0x11, 0xfe, 0xbb, 0x00, 0x04, 0x10, 0x1e,
+ 0xed, 0xdf, 0x02, 0x33,
+ 0x73, 0x30, 0xcc, 0xf0, 0x20, 0x10, 0xe2, 0xbe, 0x0e, 0x3a, 0x0e, 0x00,
+ 0xe2, 0xe0, 0xdc, 0x0f,
+ 0x75, 0x61, 0xdb, 0xfe, 0x11, 0x04, 0xff, 0xde, 0xee, 0x1f, 0x52, 0x14,
+ 0xef, 0xcb, 0x00, 0x20,
+ 0xe0, 0x00, 0x75, 0x0f, 0xca, 0x00, 0x22, 0x00, 0xdf, 0x10, 0x30, 0x11,
+ 0xef, 0xee, 0x0f, 0x10,
+ 0xde, 0xf0, 0x26, 0xde, 0x8c, 0x02, 0x32, 0xe0, 0xdf, 0x00, 0x2e, 0x71,
+ 0xee, 0xed, 0x12, 0x37,
+ 0x10, 0x9a, 0xef, 0x00, 0x01, 0x00, 0x0d, 0xff, 0x02, 0xf1, 0x12, 0x0d,
+ 0x0c, 0x03, 0x24, 0xbc,
+ 0xee, 0x0e, 0x01, 0xf1, 0xce, 0xdd, 0xe0, 0x04, 0x3f, 0x3d, 0x46, 0xd0,
+ 0xb0, 0x00, 0x44, 0xef,
+ 0xa8, 0x00, 0x11, 0xe0, 0xde, 0xfe, 0xef, 0xd0, 0x64, 0x22, 0xdc, 0xf0,
+ 0x32, 0x12, 0xf0, 0x00,
+ 0x20, 0xcc, 0xcd, 0x24, 0x52, 0x0e, 0xfc, 0x00, 0x00, 0x33, 0x21, 0xff,
+ 0xf0, 0x77, 0x36, 0x11,
+ 0xe0, 0xfd, 0xf0, 0xc0, 0x00, 0x20, 0x61, 0x00, 0xdd, 0xfb, 0x42, 0x53,
+ 0xfe, 0xfe, 0x00, 0xf0,
+ 0xef, 0x02, 0xf1, 0x1e, 0x3d, 0x05, 0x01, 0xff, 0x0c, 0x0d, 0x54, 0xf4,
+ 0x8d, 0x00, 0x37, 0xe1,
+ 0xde, 0x34, 0x75, 0x00, 0xfe, 0x01, 0x12, 0xff, 0xfe, 0x10, 0x34, 0x33,
+ 0x00, 0x9c, 0xf1, 0x03,
+ 0x21, 0x01, 0xf2, 0x14, 0x12, 0x23, 0xef, 0xfb, 0xdf, 0xd0, 0xf7, 0xb0,
+ 0xfc, 0x70, 0x45, 0xe0,
+ 0xfe, 0x12, 0x22, 0x00, 0xf0, 0x11, 0x20, 0x12, 0xcf, 0x00, 0x75, 0x10,
+ 0xfd, 0xf0, 0xf0, 0xed,
+ 0x20, 0x47, 0x00, 0xff, 0x32, 0x11, 0xed, 0xff, 0x10, 0x00, 0x0f, 0x00,
+ 0x34, 0x00, 0xba, 0x0f,
+ 0xca, 0x40, 0x71, 0x11, 0x00, 0xf3, 0xcd, 0xed, 0x02, 0x51, 0x0d, 0xd9,
+ 0x21, 0x21, 0x00, 0xee,
+ 0xfb, 0x10, 0x10, 0xdf, 0xcd, 0x11, 0x31, 0xfe, 0xe0, 0x64, 0x10, 0xfb,
+ 0x0f, 0x00, 0xd0, 0xd1,
+ 0x0e, 0x5a, 0xef, 0xa0, 0xf0, 0x01, 0xee, 0x00, 0x24, 0xcf, 0xe0, 0xe0,
+ 0x30, 0x70, 0x54, 0xe3,
+ 0xdc, 0x0e, 0x0f, 0xfc, 0x11, 0x01, 0xff, 0x13, 0x09, 0xcb, 0x12, 0x23,
+ 0xef, 0xac, 0x11, 0x57,
+ 0x00, 0xcd, 0xff, 0xf0, 0x00, 0x1f, 0xff, 0xd1, 0x24, 0x10, 0xde, 0xc1,
+ 0x01, 0xf0, 0x2f, 0x42,
+ 0xde, 0xbb, 0x10, 0x02, 0x0d, 0xba, 0x0f, 0x51, 0xf2, 0xef, 0x12, 0x11,
+ 0xcc, 0xf0, 0x14, 0x31,
+ 0x00, 0x0f, 0x00, 0x25, 0x40, 0xee, 0xee, 0x31, 0x20, 0x0e, 0xc3, 0x80,
+ 0xfe, 0x11, 0x55, 0x00,
+ 0x0d, 0xf1, 0x00, 0x00, 0x07, 0x24, 0x34, 0x1f, 0xdc, 0xaf, 0xfd, 0xf2,
+ 0xe1, 0x00, 0x57, 0x01,
+ 0x9d, 0x0f, 0x25, 0x31, 0x0f, 0xef, 0x14, 0x11, 0x0c, 0x0f, 0x00, 0x22,
+ 0x14, 0x51, 0x0f, 0xdd,
+ 0x00, 0x23, 0x43, 0x15, 0x21, 0x00, 0xdd, 0x00, 0x0f, 0x00, 0x0f, 0x8c,
+ 0xfe, 0xf0, 0x31, 0x10,
+ 0x01, 0x14, 0xef, 0xed, 0xeb, 0xcb, 0x21, 0x77, 0x20, 0x9d, 0x00, 0x02,
+ 0x0c, 0xfe, 0x11, 0x35,
+ 0x22, 0xce, 0xcb, 0x00, 0x20, 0x65, 0xf0, 0xee, 0xf0, 0x00, 0x21, 0x10,
+ 0x00, 0xee, 0xf0, 0x00,
+ 0x53, 0x21, 0xfd, 0xef, 0x35, 0x32, 0xf0, 0xdf, 0x42, 0x20, 0xce, 0x02,
+ 0x37, 0x12, 0xfc, 0xdd,
+ 0x11, 0x72, 0x00, 0xf2, 0x25, 0x20, 0x40, 0x13, 0x00, 0x0f, 0x74, 0x34,
+ 0xfe, 0x1d, 0x30, 0x01,
+ 0x37, 0x60, 0x10, 0x30, 0x02, 0xbf, 0xff, 0x13, 0x12, 0x32, 0x36, 0xec,
+ 0xad, 0x01, 0x35, 0x01,
+ 0x0f, 0x1f, 0x2f, 0x0d, 0xdd, 0x03, 0x27, 0x40, 0xfe, 0x0f, 0x72, 0x44,
+ 0xdf, 0xda, 0xf0, 0x11,
+ 0x41, 0xff, 0xfe, 0x01, 0x00, 0x9c, 0x00, 0x56, 0x00, 0xee, 0xe0, 0x10,
+ 0x20, 0x10, 0x02, 0x00,
+ 0xab, 0x0f, 0x01, 0x23, 0x2f, 0xdb, 0xf0, 0x44, 0x0e, 0xfd, 0x11, 0x44,
+ 0xe0, 0xef, 0x00, 0xf1,
+ 0xef, 0x0f, 0xee, 0x00, 0x31, 0x10, 0xec, 0xad, 0x01, 0x77, 0x11, 0xf0,
+ 0xcd, 0x0f, 0x30, 0x22,
+ 0x13, 0x25, 0xdf, 0xa9, 0x00, 0x41, 0x01, 0x0f, 0xff, 0xf0, 0xc0, 0xe0,
+ 0xff, 0x00, 0x24, 0x21,
+ 0xce, 0x00, 0x24, 0xff, 0x8a, 0x00, 0x45, 0xff, 0xbd, 0x00, 0x34, 0x0f,
+ 0xde, 0x00, 0x14, 0x00,
+ 0xee, 0x00, 0x15, 0x00, 0xce, 0xdf, 0x01, 0x21, 0xee, 0xdf, 0xe0, 0xd0,
+ 0x9e, 0x03, 0x10, 0xf8,
+ 0x01, 0x41, 0xe1, 0x12, 0x00, 0xfc, 0xd0, 0x01, 0xc0, 0x0f, 0x25, 0xf2,
+ 0x8c, 0xeb, 0x0f, 0x31,
+ 0x02, 0x8f, 0xff, 0x00, 0x01, 0x20, 0x03, 0x01, 0x0e, 0xfc, 0xfe, 0x11,
+ 0x40, 0x0a, 0xbf, 0xe0,
+ 0x12, 0x74, 0x0f, 0xea, 0x11, 0x44, 0xff, 0xee, 0x10, 0x21, 0xf0, 0xee,
+ 0xfd, 0x00, 0x1f, 0x0d,
+ 0x00, 0xf0, 0xf9, 0x10, 0x74, 0x12, 0xdf, 0xfd, 0xcd, 0xfc, 0x23, 0x56,
+ 0xff, 0xbb, 0x0f, 0x00,
+ 0x10, 0xe0, 0x0f, 0x02, 0x12, 0xf0, 0xec, 0xfe, 0xf0, 0x34, 0x44, 0xd1,
+ 0xaf, 0x0f, 0x40, 0x20,
+ 0xf0, 0xcb, 0x01, 0x34, 0xee, 0xde, 0x01, 0x34, 0xfe, 0xfd, 0x75, 0x33,
+ 0xee, 0xbe, 0x00, 0x14,
+ 0x24, 0xcb, 0xde, 0x51, 0x11, 0xef, 0xde, 0xf1, 0x02, 0x0f, 0x05, 0x05,
+ 0x6f, 0x00, 0xc9, 0x00,
+ 0x8f, 0xea, 0xf3, 0xf9, 0xd3, 0xea, 0xc6, 0xfb, 0xf2, 0x36, 0x72, 0x23,
+ 0x21, 0x0e, 0x0e, 0x31,
+ 0x00, 0x88, 0x10, 0x34, 0x00, 0xfd, 0x32, 0x11, 0xff, 0x00, 0x01, 0x24,
+ 0x00, 0xbc, 0xce, 0x44,
+ 0x76, 0x0f, 0xdc, 0x0f, 0x00, 0x30, 0x10, 0xf0, 0xd0, 0x40, 0x42, 0x00,
+ 0xd0, 0xec, 0x01, 0x01,
+ 0xff, 0x1c, 0x3f, 0x30, 0x34, 0xff, 0x1f, 0x71, 0x0e, 0xfe, 0x0d, 0xef,
+ 0x11, 0x77, 0x05, 0x0d,
+ 0xee, 0x01, 0x13, 0x72, 0x10, 0x01, 0xe0, 0xdc, 0xdb, 0xfe, 0x32, 0x45,
+ 0x33, 0x01, 0xbd, 0x00,
+ 0x1f, 0x20, 0x25, 0x33, 0x00, 0x0f, 0xee, 0xed, 0xd0, 0xe2, 0xb3, 0xbf,
+ 0xda, 0x04, 0x34, 0x10,
+ 0x0e, 0x71, 0x47, 0xf4, 0xee, 0x0e, 0x31, 0x00, 0xe0, 0xcf, 0xe0, 0xcf,
+ 0x00, 0x21, 0x12, 0x11,
+ 0xd2, 0xc0, 0x11, 0x61, 0x02, 0x02, 0x11, 0x0e, 0xa8, 0x0d, 0x01, 0x20,
+ 0x0e, 0xbc, 0xe0, 0x01,
+ 0x03, 0x2d, 0x1f, 0x06, 0xe0, 0xcc, 0x01, 0x04, 0x31, 0xeb, 0x9c, 0x00,
+ 0x04, 0x0f, 0x0f, 0x10,
+ 0x10, 0x20, 0x60, 0x12, 0xf0, 0xc0, 0xe0, 0x00, 0x24, 0x37, 0x11, 0xde,
+ 0xdd, 0xfe, 0xfc, 0x40,
+ 0x74, 0x23, 0xdb, 0xbf, 0x01, 0x24, 0x0e, 0xee, 0x04, 0x13, 0x2f, 0x3d,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0xe0, 0xc0, 0x33, 0x70, 0xfa, 0xef, 0x45, 0x44, 0x11, 0xcd, 0xfc, 0x02,
+ 0x00, 0x00, 0x5f, 0x0f,
+ 0xdf, 0xfd, 0x22, 0x32, 0xcd, 0xdf, 0x14, 0x0c, 0x0d, 0x20, 0x20, 0x77,
+ 0x0e, 0xda, 0x00, 0x11,
+ 0x00, 0x90, 0x00, 0x00, 0xf0, 0x10, 0x52, 0x10, 0xef, 0xf0, 0x00, 0x36,
+ 0x10, 0xdf, 0x0e, 0x66,
+ 0x00, 0xcd, 0xff, 0x13, 0x31, 0x0c, 0x02, 0x26, 0xce, 0xee, 0x33, 0x76,
+ 0x00, 0xde, 0x21, 0x43,
+ 0x00, 0xdd, 0xde, 0x10, 0x42, 0x36, 0x31, 0xd0, 0xfe, 0x11, 0x22, 0x10,
+ 0xe0, 0x21, 0x77, 0x70,
+ 0x0e, 0xdf, 0x22, 0x00, 0x10, 0x23, 0x00, 0xcc, 0x11, 0x24, 0xff, 0x0e,
+ 0x13, 0x11, 0x47, 0x52,
+ 0xee, 0xfc, 0x10, 0x64, 0x02, 0x00, 0xdd, 0xfe, 0x01, 0x0f, 0x3e, 0x00,
+ 0xe0, 0xae, 0xf3, 0xf4,
+ 0x0e, 0x0d, 0x77, 0x22, 0xcb, 0x0e, 0x01, 0x01, 0x0c, 0x00, 0x13, 0x0e,
+ 0x00, 0x30, 0x31, 0xe0,
+ 0xce, 0x0f, 0x10, 0x00, 0xbe, 0xfe, 0x00, 0x11, 0x4c, 0xfa, 0xed, 0x0d,
+ 0x00, 0xba, 0xe0, 0x21,
+ 0x42, 0xee, 0xde, 0x03, 0x55, 0x1e, 0xda, 0xdf, 0x0f, 0xfe, 0xee, 0x40,
+ 0x31, 0xe0, 0xa0, 0x0d,
+ 0x0e, 0xef, 0x16, 0x22, 0xae, 0xfe, 0x12, 0x10, 0x0c, 0x0d, 0x4d, 0xfa,
+ 0x9e, 0x02, 0x01, 0xdd,
+ 0xf1, 0x26, 0xed, 0xef, 0x53, 0x10, 0xf8, 0xe0, 0x00, 0x00, 0xdf, 0x8c,
+ 0x01, 0x21, 0x00, 0xfc,
+ 0xe0, 0xf4, 0xf0, 0xdd, 0xd0, 0xf0, 0xe0, 0x2e, 0x74, 0x20, 0xbf, 0x00,
+ 0xfc, 0xd8, 0x0f, 0x01,
+ 0xd1, 0xb0, 0x00, 0x0e, 0x10, 0x20, 0xff, 0xbc, 0x02, 0x02, 0xde, 0xfe,
+ 0x15, 0x42, 0x0f, 0xfe,
+ 0xbd, 0xdb, 0x00, 0x42, 0x00, 0xcd, 0x00, 0x44, 0x0e, 0x0f, 0x25, 0x32,
+ 0xf0, 0xdf, 0xee, 0x0f,
+ 0x33, 0xe0, 0xbb, 0x10, 0x2f, 0xdb, 0x23, 0x77, 0x72, 0xff, 0xff, 0x12,
+ 0x00, 0x00, 0x0f, 0x01,
+ 0x12, 0x0f, 0x0f, 0x0e, 0x0c, 0x0d, 0xed, 0x47, 0x66, 0xff, 0xf0, 0x10,
+ 0xff, 0xae, 0x11, 0x24,
+ 0xfe, 0xdf, 0x0f, 0x10, 0x00, 0x56, 0x11, 0x0f, 0xdf, 0x00, 0xe1, 0x21,
+ 0x31, 0xf1, 0xf3, 0x53,
+ 0x20, 0xf0, 0xee, 0x20, 0x72, 0x27, 0xe6, 0xac, 0x0f, 0x33, 0x34, 0xee,
+ 0xcf, 0x13, 0x24, 0xd0,
+ 0xbb, 0x00, 0x64, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x0e, 0xde, 0x03, 0x55,
+ 0x00, 0xfe, 0x02, 0x01,
+ 0x00, 0x31, 0x57, 0x00, 0x0f, 0x01, 0x21, 0xdf, 0xfd, 0x00, 0x0e, 0x51,
+ 0x04, 0x00, 0xff, 0x1f,
+ 0x0e, 0x31, 0x77, 0x02, 0xed, 0xf0, 0x00, 0x43, 0x12, 0x0f, 0xe8, 0xcd,
+ 0x00, 0x75, 0x20, 0xf0,
+ 0xee, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x10, 0x00, 0xfe, 0x0c, 0x0d, 0x10,
+ 0x44, 0xf1, 0xad, 0x00,
+ 0xf1, 0x0e, 0xfb, 0x31, 0x76, 0x10, 0xe0, 0xcd, 0x01, 0x00, 0x1f, 0x4d,
+ 0x00, 0xff, 0x12, 0x0d,
+ 0x88, 0x0f, 0x04, 0x10, 0xff, 0xfe, 0x00, 0x00, 0x23, 0x20, 0x0f, 0x22,
+ 0x22, 0x88, 0xeb, 0x01,
+ 0x33, 0x11, 0x00, 0xbd, 0xff, 0x0f, 0x00, 0x25, 0x01, 0x01, 0x01, 0x01,
+ 0xf1, 0xbf, 0xfc, 0x10,
+ 0x00, 0xab, 0x00, 0x24, 0x00, 0x98, 0x0f, 0x12, 0x12, 0x10, 0x0f, 0x42,
+ 0xf0, 0xe0, 0xed, 0xf0,
+ 0x0f, 0xcf, 0xef, 0x00, 0x54, 0xf0, 0xce, 0x12, 0x23, 0x0c, 0xdf, 0x11,
+ 0x11, 0x11, 0x25, 0x0f,
+ 0xb9, 0xf0, 0x00, 0x00, 0x33, 0xed, 0xef, 0x73, 0x22, 0xeb, 0x0f, 0x46,
+ 0x02, 0xdf, 0xdd, 0x01,
+ 0x52, 0x02, 0x00, 0xfe, 0xe0, 0x12, 0x31, 0x20, 0xda, 0xbd, 0x03, 0xe3,
+ 0x8f, 0xfd, 0x11, 0x46,
+ 0x22, 0x00, 0x0f, 0xdc, 0x10, 0x33, 0x42, 0x01, 0xde, 0x02, 0x36, 0x0d,
+ 0xdd, 0x32, 0x32, 0xd2,
+ 0xb0, 0xe1, 0xee, 0xfe, 0x57, 0x51, 0x0e, 0xed, 0xf0, 0xef, 0xec, 0xff,
+ 0xdc, 0xfe, 0x11, 0x75,
+ 0x10, 0x0d, 0x00, 0xc0, 0x0f, 0x30, 0x19, 0x0f, 0xb0, 0xc0, 0xdf, 0xfe,
+ 0x0f, 0x3f, 0x25, 0x30,
+ 0x0f, 0x0e, 0xb0, 0x00, 0x32, 0x0b, 0x40, 0x0e, 0xfd, 0x47, 0x10, 0xba,
+ 0xff, 0x73, 0x11, 0xee,
+ 0x02, 0x34, 0xff, 0xff, 0x01, 0x12, 0x00, 0x02, 0x10, 0x0c, 0x20, 0x7f,
+ 0x00, 0xee, 0x06, 0x31,
+ 0x60, 0x20, 0xeb, 0xf3, 0x77, 0x11, 0xfe, 0xf0, 0x44, 0x0f, 0xec, 0x41,
+ 0x22, 0x00, 0xd0, 0xf0,
+ 0xff, 0x21, 0x65, 0x00, 0xef, 0x00, 0x02, 0x00, 0x00, 0x2f, 0x42, 0x35,
+ 0x30, 0x1e, 0x0b, 0x00,
+ 0x63, 0x13, 0xdc, 0xdd, 0xf0, 0xff, 0xf0, 0xd0, 0x34, 0x52, 0xfc, 0x0f,
+ 0x31, 0x00, 0xcd, 0xb9,
+ 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0e, 0x20, 0x71, 0x20, 0x00, 0x0e, 0xe0,
+ 0xed, 0x2d, 0x56, 0x13,
+ 0x0f, 0xfb, 0x10, 0x11, 0xe0, 0xbf, 0xee, 0xec, 0x00, 0x65, 0x13, 0x14,
+ 0xcb, 0xdd, 0x60, 0x12,
+ 0x0f, 0xdc, 0x1f, 0x21, 0x12, 0xef, 0xde, 0x00, 0x61, 0x01, 0x01, 0x07,
+ 0x02, 0xff, 0xee, 0x00,
+ 0x20, 0xcf, 0xc0, 0x01, 0xfb, 0xbd, 0x06, 0x12, 0xdc, 0xfe, 0x73, 0x27,
+ 0xef, 0xbd, 0x00, 0x02,
+ 0x24, 0x0f, 0x0e, 0x00, 0x21, 0xe0, 0xbe, 0x02, 0x04, 0xdf, 0xdd, 0xff,
+ 0xee, 0xf0, 0xf5, 0xf0,
+ 0xce, 0x34, 0x32, 0x8b, 0xed, 0x01, 0x34, 0xef, 0xcd, 0xee, 0x00, 0x34,
+ 0x0f, 0xdc, 0x13, 0x16,
+ 0x00, 0xf0, 0xfe, 0x20, 0x52, 0x14, 0xe0, 0x8c, 0xae, 0x00, 0x24, 0x0e,
+ 0x0b, 0xcf, 0x01, 0x35,
+ 0x11, 0xfd, 0x00, 0x42, 0x22, 0xe0, 0xe0, 0x00, 0x0d, 0x0e, 0x32, 0x42,
+ 0xcc, 0xef, 0xe1, 0x02,
+ 0x60, 0x13, 0x06, 0x12, 0x20, 0x0a, 0xc0, 0x02, 0x00, 0xec, 0x00, 0x50,
+ 0x1f, 0x40, 0x0f, 0x00,
+ 0x12, 0xe3, 0xbb, 0x00, 0x64, 0x00, 0xda, 0xef, 0x20, 0x0e, 0xde, 0x00,
+ 0x00, 0x40, 0x05, 0xe0,
+ 0xbd, 0xde, 0xe0, 0x46, 0x31, 0x10, 0xff, 0x02, 0x00, 0x0e, 0xfa, 0x10,
+ 0x76, 0x50, 0xe0, 0xde,
+ 0x00, 0x10, 0xde, 0x01, 0x26, 0x0f, 0xaf, 0x00, 0x12, 0x20, 0x10, 0xc0,
+ 0xe1, 0x14, 0x00, 0xda,
+ 0xf0, 0x01, 0x31, 0x40, 0x00, 0xef, 0xed, 0x61, 0x13, 0x00, 0x01, 0x34,
+ 0x61, 0x0e, 0x0d, 0xfe,
+ 0xf1, 0x17, 0x0f, 0xac, 0x0e, 0x00, 0x12, 0x31, 0x12, 0x10, 0x64, 0x34,
+ 0xf0, 0xdb, 0x00, 0x31,
+ 0x02, 0x8c, 0x0d, 0x10, 0x44, 0x00, 0x0d, 0x11, 0x00, 0x0e, 0x21, 0x00,
+ 0xf0, 0x17, 0x21, 0xfd,
+ 0xbd, 0xde, 0x00, 0xfe, 0xed, 0x0f, 0x12, 0x33, 0x0b, 0x2c, 0x73, 0x77,
+ 0x00, 0xff, 0xee, 0x00,
+ 0x00, 0x21, 0xf1, 0x03, 0x52, 0x0b, 0xec, 0xef, 0x11, 0x11, 0xe1, 0xd2,
+ 0xc0, 0xdf, 0x1f, 0x40,
+ 0x30, 0x26, 0x36, 0xcf, 0xac, 0x00, 0x21, 0x02, 0xd0, 0xf0, 0x20, 0x72,
+ 0x00, 0xdf, 0xce, 0x00,
+ 0x25, 0x34, 0x22, 0xfe, 0xac, 0x14, 0x23, 0x0d, 0xeb, 0xc0, 0xf2, 0xcf,
+ 0xfe, 0x02, 0x00, 0x10,
+ 0x56, 0x01, 0x00, 0x20, 0x00, 0x40, 0x37, 0xe0, 0x8b, 0xd0, 0x10, 0x0f,
+ 0x0f, 0xe2, 0xe0, 0x0f,
+ 0x1f, 0x0f, 0x00, 0x00, 0xd0, 0x33, 0x45, 0xef, 0x9a, 0xff, 0x00, 0x20,
+ 0xdf, 0xd0, 0x53, 0x21,
+ 0x1c, 0xfd, 0x00, 0x03, 0xf1, 0xe1, 0x10, 0x10, 0x41, 0x16, 0xcf, 0x9d,
+ 0x0f, 0x13, 0x33, 0x00,
+ 0xfd, 0x00, 0xda, 0xe0, 0x12, 0x51, 0x25, 0x42, 0x13, 0xf2, 0xcc, 0xeb,
+ 0x1e, 0x30, 0x00, 0x14,
+ 0x20, 0xfd, 0xfd, 0x73, 0x46, 0xe0, 0xdd, 0xf1, 0x03, 0x52, 0x0d, 0xfc,
+ 0x01, 0x02, 0x10, 0x0f,
+ 0x09, 0xdf, 0x10, 0x0f, 0xb0, 0xce, 0x02, 0x21, 0x1e, 0x5e, 0x1f, 0x04,
+ 0x02, 0x00, 0x18, 0x0d,
+ 0xfd, 0xd0, 0x05, 0xd0, 0x80, 0xbc, 0x00, 0x64, 0x00, 0x00, 0x00, 0x04,
+ 0x20, 0x0a, 0xff, 0x21,
+ 0x12, 0xce, 0xf0, 0x42, 0x40, 0xec, 0xe0, 0x35, 0x01, 0xce, 0x00, 0x13,
+ 0x22, 0x01, 0xff, 0x41,
+ 0x30, 0xe0, 0xfd, 0x46, 0xf1, 0x80, 0x05, 0x21, 0x0c, 0x0f, 0x42, 0x34,
+ 0x10, 0x11, 0x01, 0x13,
+ 0x21, 0xee, 0xde, 0x64, 0x77, 0x01, 0xfd, 0x00, 0x00, 0x01, 0x03, 0x02,
+ 0x00, 0x20, 0x01, 0xf2,
+ 0xec, 0x41, 0x67, 0x00, 0xe0, 0x00, 0x44, 0x31, 0xed, 0xdd, 0x22, 0x02,
+ 0xbb, 0xfd, 0x00, 0x23,
+ 0x44, 0x01, 0x23, 0xed, 0xcc, 0xfe, 0xfe, 0x10, 0x00, 0xec, 0xe0, 0x9f,
+ 0xfe, 0x22, 0x52, 0x01,
+ 0x00, 0x00, 0x47, 0x07, 0xeb, 0x0f, 0x00, 0x00, 0x10, 0x2f, 0x50, 0x0f,
+ 0xbe, 0xff, 0xef, 0xfd,
+ 0x10, 0x35, 0x00, 0xf0, 0x01, 0x21, 0xfe, 0x9a, 0xf0, 0xff, 0x22, 0x11,
+ 0xeb, 0xbe, 0x0f, 0x00,
+ 0x01, 0x20, 0x20, 0x46, 0x23, 0xe0, 0x8e, 0xec, 0x0e, 0x00, 0x21, 0x1e,
+ 0x1f, 0xf1, 0xcf, 0xfd,
+ 0x04, 0x44, 0xff, 0x89, 0xef, 0x10, 0x21, 0x0f, 0xed, 0x00, 0x05, 0x30,
+ 0x00, 0xae, 0xfb, 0x02,
+ 0x24, 0x0f, 0xca, 0x00, 0x11, 0xd0, 0xcf, 0xee, 0x00, 0x31, 0xd0, 0xce,
+ 0xf0, 0xf0, 0x0d, 0x0f,
+ 0xc0, 0xcf, 0xde, 0x40, 0x4f, 0xf0, 0xd2, 0xd1, 0xf6, 0x00, 0xda, 0xe1,
+ 0x53, 0x30, 0xed, 0x81,
+ 0xf5, 0xef, 0x0c, 0x30, 0x4f, 0x0c, 0xde, 0xef, 0x04, 0x50, 0x0e, 0x00,
+ 0xf7, 0x23, 0x10, 0x3e,
+ 0x20, 0xde, 0xbf, 0xe1, 0xf0, 0x23, 0x74, 0x30, 0x11, 0x36, 0x01, 0x01,
+ 0x32, 0x01, 0x00, 0xfe,
+ 0xde, 0xfd, 0x64, 0x46, 0x1d, 0x0d, 0x05, 0x03, 0xaf, 0xff, 0x12, 0x31,
+ 0x0f, 0xcb, 0x01, 0x37,
+ 0x10, 0xfe, 0xdf, 0x00, 0x1f, 0x10, 0x32, 0x11, 0x10, 0xee, 0x02, 0x36,
+ 0x8f, 0xbf, 0x03, 0x10,
+ 0xef, 0xdc, 0x13, 0x55, 0x00, 0xfe, 0xd0, 0xf1, 0xef, 0x0e, 0x20, 0x77,
+ 0xf0, 0xbf, 0xff, 0xf1,
+ 0x13, 0x22, 0x20, 0xff, 0xed, 0x20, 0x25, 0x9f, 0xdc, 0x02, 0x45, 0x00,
+ 0xd1, 0x10, 0x10, 0x3f,
+ 0x00, 0xd4, 0x11, 0x60, 0x19, 0x00, 0x11, 0x01, 0xcd, 0xde, 0xf0, 0xe0,
+ 0x2e, 0x50, 0xef, 0xcf,
+ 0x01, 0x55, 0x32, 0x0e, 0xca, 0x11, 0x44, 0x0f, 0xda, 0x10, 0x41, 0x03,
+ 0x0f, 0x0d, 0x20, 0x20,
+ 0x0e, 0x2f, 0x2d, 0x00, 0x04, 0xce, 0xae, 0x02, 0x11, 0xea, 0xbd, 0x00,
+ 0x1f, 0x2e, 0x30, 0x45,
+ 0xf1, 0xef, 0x00, 0x00, 0x0e, 0x30, 0x25, 0x01, 0xce, 0xfc, 0x00, 0x03,
+ 0x04, 0x8a, 0x8d, 0x00,
+ 0x02, 0x20, 0xdb, 0x00, 0x21, 0x00, 0xff, 0xf0, 0x15, 0x2f, 0x0c, 0xfe,
+ 0xf1, 0xf3, 0xee, 0xfd,
+ 0x50, 0x54, 0xe0, 0xbe, 0x02, 0x01, 0x0c, 0x24, 0x57, 0xe0, 0xed, 0x00,
+ 0x00, 0x10, 0x32, 0x22,
+ 0x20, 0xde, 0x89, 0xff, 0x00, 0x42, 0xff, 0xef, 0x03, 0x44, 0x01, 0xe2,
+ 0xf1, 0xfd, 0x3e, 0x60,
+ 0xf0, 0xd9, 0x10, 0x23, 0xf1, 0xd0, 0x21, 0x23, 0x0f, 0x0c, 0x0e, 0xf2,
+ 0x26, 0x21, 0xae, 0xdd,
+ 0x01, 0x02, 0xdf, 0xc0, 0xfd, 0x50, 0x71, 0x27, 0xf0, 0xce, 0xf0, 0x01,
+ 0x01, 0xf0, 0x17, 0x31,
+ 0x00, 0x9f, 0x01, 0x37, 0x00, 0xde, 0xef, 0x13, 0x22, 0xfd, 0xaf, 0x05,
+ 0x02, 0x20, 0x31, 0x23,
+ 0xd1, 0xc0, 0x12, 0x00, 0xbd, 0x05, 0x21, 0x00, 0x00, 0xdb, 0xe0, 0x11,
+ 0x21, 0xef, 0xd1, 0x77,
+ 0x13, 0xfb, 0xff, 0x00, 0x30, 0x31, 0x20, 0x00, 0x2f, 0x1f, 0xad, 0xff,
+ 0x74, 0x10, 0xf8, 0xee,
+ 0x70, 0x01, 0xf1, 0x12, 0x2f, 0xfa, 0x0f, 0x00, 0xdf, 0xbf, 0x00, 0x21,
+ 0x00, 0xfe, 0x0f, 0x0d,
+ 0x10, 0x77, 0x20, 0x0e, 0x0e, 0x32, 0x12, 0xdd, 0xcd, 0x24, 0x02, 0x0f,
+ 0x0d, 0xcf, 0xf1, 0x91,
+ 0xed, 0x00, 0x23, 0xff, 0xe1, 0x37, 0x2f, 0x1c, 0x73, 0x27, 0xf0, 0xfd,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x13, 0x71, 0x27, 0x02, 0xde, 0xff, 0x13, 0x12, 0xed, 0x40, 0x52, 0x06,
+ 0x03, 0xee, 0xef, 0x41,
+ 0x53, 0x00, 0x02, 0x02, 0x01, 0x1d, 0x0d, 0x03, 0x07, 0x07, 0x00, 0xde,
+ 0xf0, 0x0f, 0x61, 0x22,
+ 0x13, 0x01, 0x1c, 0x2e, 0x00, 0x00, 0x00, 0x02, 0x77, 0x74, 0x10, 0x0e,
+ 0xf0, 0xdc, 0xfe, 0xe0,
+ 0x22, 0x41, 0xcc, 0xfc, 0x21, 0x12, 0x0f, 0xdd, 0x64, 0x45, 0xf0, 0xde,
+ 0x00, 0x22, 0x01, 0x63,
+ 0x10, 0x08, 0xd0, 0x00, 0x00, 0xf0, 0xd0, 0xe1, 0x00, 0x6f, 0x00, 0xfc,
+ 0x05, 0x34, 0x30, 0x00,
+ 0x00, 0xe2, 0xe0, 0xff, 0x0f, 0x2d, 0x00, 0xc1, 0x00, 0x0f, 0x27, 0x77,
+ 0xf0, 0xec, 0x00, 0x21,
+ 0xf1, 0xce, 0xcf, 0x01, 0x22, 0xdc, 0x8d, 0x00, 0x55, 0x0e, 0xef, 0x00,
+ 0x10, 0x0f, 0xf0, 0x11,
+ 0x30, 0xef, 0x10, 0x30, 0x0e, 0xed, 0x00, 0x24, 0xf0, 0x8b, 0x8e, 0x00,
+ 0x02, 0xfd, 0x0d, 0x23,
+ 0x05, 0xeb, 0xee, 0x1f, 0x21, 0x00, 0xfc, 0x01, 0x02, 0xfe, 0xee, 0x12,
+ 0x36, 0x8f, 0xe0, 0xef,
+ 0xdd, 0xdf, 0x04, 0xe3, 0xd3, 0x1e, 0x1a, 0x20, 0x0e, 0xce, 0xd0, 0x12,
+ 0x2b, 0x4f, 0x21, 0xb1,
+ 0xac, 0x00, 0x12, 0x24, 0x12, 0x21, 0x10, 0xcf, 0xc1, 0xdf, 0x0e, 0x00,
+ 0xc9, 0x0f, 0x71, 0x02,
+ 0xfd, 0x21, 0x57, 0x00, 0xef, 0x00, 0x3f, 0x0d, 0xd0, 0x01, 0x04, 0x0f,
+ 0xda, 0x10, 0x0e, 0xbd,
+ 0x01, 0x03, 0x0e, 0x0e, 0x20, 0x14, 0x36, 0xef, 0x8b, 0xc0, 0x20, 0x10,
+ 0xdf, 0xef, 0x0f, 0x30,
+ 0x66, 0x00, 0xfd, 0xee, 0x21, 0x34, 0xde, 0xce, 0x03, 0xd0, 0xaa, 0x10,
+ 0x21, 0xf0, 0xf0, 0x00,
+ 0xcf, 0xf5, 0xd1, 0xf1, 0x00, 0xdf, 0x8a, 0xd0, 0x02, 0x03, 0x00, 0xe2,
+ 0xe3, 0xbd, 0x0e, 0x30,
+ 0x21, 0xd0, 0xad, 0x00, 0x06, 0x01, 0xe0, 0x0c, 0x10, 0x23, 0xdb, 0x00,
+ 0x65, 0x0f, 0xec, 0xd0,
+ 0x45, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xf0, 0xfe, 0x53, 0x30, 0x0b, 0x40,
+ 0x64, 0x00, 0xfc, 0xee,
+ 0x50, 0x42, 0x0d, 0x0e, 0xf0, 0x00, 0x0f, 0x1e, 0x3f, 0x6d, 0x0c, 0xdf,
+ 0xf1, 0xf7, 0x22, 0x1e,
+ 0xfa, 0xde, 0xff, 0x00, 0x60, 0x20, 0x1f, 0x20, 0x13, 0x00, 0x4f, 0x32,
+ 0x52, 0x0f, 0x01, 0x17,
+ 0x00, 0xe0, 0xf1, 0x03, 0x89, 0xee, 0x00, 0x53, 0x00, 0x0e, 0x10, 0x10,
+ 0xfe, 0xd9, 0x00, 0x64,
+ 0x25, 0x0f, 0xfe, 0x32, 0x20, 0x0d, 0xf0, 0x36, 0x10, 0xe1, 0x05, 0x05,
+ 0x69, 0x00, 0xd4, 0x00,
+ 0xa9, 0x24, 0xcb, 0x22, 0x89, 0x29, 0x88, 0x1d, 0xce, 0x01, 0x47, 0x75,
+ 0x0e, 0x00, 0x00, 0x01,
+ 0x11, 0x31, 0x22, 0x13, 0x20, 0x0c, 0xc0, 0x02, 0x11, 0xf0, 0x00, 0x1c,
+ 0xd0, 0xe7, 0xf1, 0xd0,
+ 0x70, 0x32, 0xa0, 0xdb, 0x01, 0xf3, 0xd1, 0xd0, 0x00, 0x31, 0x00, 0xde,
+ 0xd0, 0x01, 0x73, 0x03,
+ 0xc0, 0xce, 0x02, 0xfc, 0xd8, 0xbc, 0x11, 0x12, 0xf2, 0xe2, 0x11, 0x2e,
+ 0xd0, 0xc4, 0x01, 0xd9,
+ 0xf0, 0x00, 0x67, 0xf0, 0x80, 0xc0, 0x00, 0x11, 0x11, 0x10, 0x00, 0xe0,
+ 0xe0, 0xf0, 0x01, 0x21,
+ 0x10, 0xd0, 0xde, 0x57, 0x56, 0x0f, 0xcc, 0x01, 0x12, 0x00, 0xef, 0xef,
+ 0x0f, 0x70, 0x2e, 0xb1,
+ 0x13, 0x10, 0x0a, 0x30, 0xe2, 0xae, 0x0e, 0x43, 0x23, 0xec, 0xfc, 0x1f,
+ 0x2f, 0x1d, 0x0e, 0x10,
+ 0x35, 0x2e, 0xea, 0xe0, 0x41, 0x52, 0xf0, 0xec, 0x00, 0xfe, 0x0f, 0x4f,
+ 0x21, 0xdd, 0xbc, 0x21,
+ 0x54, 0xfd, 0xd9, 0x40, 0x54, 0x00, 0x00, 0x20, 0x10, 0xef, 0x0e, 0x0f,
+ 0x15, 0x12, 0x00, 0xac,
+ 0xf1, 0x01, 0x01, 0xf2, 0x00, 0xff, 0x0f, 0x15, 0x00, 0xe2, 0x33, 0x72,
+ 0x2d, 0xe0, 0x02, 0x35,
+ 0x11, 0x00, 0xf2, 0x02, 0x75, 0x42, 0x03, 0xf0, 0xde, 0x02, 0x27, 0x00,
+ 0xd0, 0x10, 0x11, 0xf6,
+ 0x01, 0xf0, 0x6d, 0x31, 0x01, 0x01, 0x67, 0x11, 0xe0, 0xdd, 0xf0, 0x63,
+ 0x10, 0xfc, 0xff, 0x01,
+ 0x03, 0x02, 0xdd, 0x20, 0x32, 0xe0, 0xac, 0x00, 0xfc, 0x00, 0x00, 0x01,
+ 0xd0, 0xed, 0xfe, 0xfc,
+ 0xc8, 0xee, 0x00, 0x74, 0x0f, 0x9b, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xfe,
+ 0x31, 0x10, 0xce, 0xcf,
+ 0x00, 0x01, 0x10, 0x1a, 0xfe, 0xbd, 0xfd, 0xd0, 0x14, 0x35, 0x0f, 0xfc,
+ 0xcf, 0xbd, 0xf0, 0x23,
+ 0x25, 0xcf, 0xdd, 0xfe, 0x23, 0x64, 0xec, 0xcc, 0x00, 0x06, 0xff, 0xcc,
+ 0xf0, 0x30, 0x11, 0xc0,
+ 0xee, 0x01, 0x30, 0x20, 0xcd, 0x02, 0xe0, 0xca, 0xed, 0x00, 0x11, 0x0f,
+ 0x4e, 0x4f, 0x3e, 0x00,
+ 0xf1, 0xfe, 0x2c, 0x70, 0x00, 0xfd, 0xe9, 0xfe, 0x1e, 0x1f, 0xe0, 0xcf,
+ 0x0f, 0x1f, 0xbc, 0xcd,
+ 0x00, 0x20, 0x70, 0x0f, 0x08, 0xdc, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0xfb, 0x1e, 0x52,
+ 0x17, 0xbf, 0xad, 0xff, 0xe2, 0x02, 0x01, 0x11, 0x00, 0xdc, 0xaf, 0x0f,
+ 0x10, 0x30, 0x00, 0x02,
+ 0x17, 0x11, 0x20, 0x1f, 0xec, 0xdf, 0xf0, 0x34, 0x57, 0x00, 0xb0, 0x0f,
+ 0x42, 0x23, 0x0f, 0xf0,
+ 0x40, 0x02, 0xd0, 0xf3, 0x22, 0x76, 0x21, 0x0e, 0x10, 0x22, 0x11, 0x41,
+ 0x02, 0xf4, 0xef, 0xdb,
+ 0x20, 0xef, 0x2d, 0x20, 0x87, 0x11, 0x70, 0x00, 0xd2, 0x03, 0x12, 0x41,
+ 0x0f, 0xfc, 0x00, 0x00,
+ 0xee, 0xdd, 0xf0, 0x06, 0x00, 0x1c, 0x43, 0x14, 0x0e, 0xff, 0x04, 0x02,
+ 0xfe, 0x8a, 0xf0, 0x43,
+ 0xf3, 0xd0, 0x10, 0x00, 0x11, 0x34, 0x93, 0xf1, 0xf0, 0xfb, 0xf0, 0x06,
+ 0x23, 0x11, 0x1f, 0x00,
+ 0xd0, 0x80, 0xff, 0x01, 0x27, 0x32, 0xe2, 0xd2, 0x00, 0x0e, 0xbf, 0x02,
+ 0x03, 0x2f, 0x1d, 0xc0,
+ 0xd0, 0x0f, 0x0c, 0x53, 0x02, 0xc9, 0xce, 0x0d, 0x0e, 0x01, 0x13, 0x2e,
+ 0x09, 0x10, 0xde, 0x0e,
+ 0x70, 0x70, 0x0f, 0x0e, 0x36, 0x10, 0xfa, 0xef, 0x20, 0x20, 0x00, 0xcd,
+ 0x32, 0x22, 0xef, 0xcd,
+ 0x00, 0x4f, 0x1d, 0x28, 0x1f, 0x20, 0x10, 0xfe, 0x2f, 0x7e, 0x3f, 0xf0,
+ 0x02, 0x00, 0x2e, 0x02,
+ 0x37, 0x23, 0xae, 0xfd, 0xef, 0xe0, 0xe0, 0x02, 0xfd, 0x0a, 0x01, 0x80,
+ 0x10, 0x53, 0x10, 0xd8,
+ 0xfe, 0x11, 0x13, 0x03, 0x02, 0x1f, 0xed, 0xe1, 0xd4, 0x40, 0x20, 0x8d,
+ 0x03, 0x06, 0x0f, 0x33,
+ 0xc5, 0xe0, 0x40, 0x30, 0xe2, 0xd1, 0x00, 0x52, 0x27, 0x02, 0xde, 0x0f,
+ 0x21, 0xf0, 0xed, 0x60,
+ 0x12, 0xeb, 0xcd, 0x00, 0x01, 0xcf, 0x0f, 0x25, 0x56, 0x00, 0x0d, 0xff,
+ 0x00, 0xf2, 0xee, 0xef,
+ 0x13, 0xf1, 0x88, 0x0f, 0x00, 0x01, 0x43, 0x0f, 0x0d, 0xef, 0xee, 0xf0,
+ 0x22, 0x13, 0xab, 0xe0,
+ 0x04, 0x2e, 0xec, 0x00, 0x37, 0x31, 0xe0, 0xc0, 0x11, 0x21, 0xc0, 0xbf,
+ 0x02, 0x35, 0xce, 0xee,
+ 0x00, 0x34, 0x03, 0xaf, 0xfd, 0x23, 0x24, 0xf0, 0xae, 0x02, 0x17, 0x14,
+ 0x0f, 0xcd, 0xf0, 0xf1,
+ 0x01, 0x01, 0x21, 0xe0, 0xed, 0x21, 0x46, 0xe1, 0x90, 0x00, 0x00, 0xee,
+ 0x0e, 0x10, 0x10, 0x22,
+ 0x0b, 0x1d, 0xfa, 0x1e, 0x70, 0x3f, 0x00, 0x44, 0x0f, 0xbb, 0x1f, 0x20,
+ 0xf0, 0xf0, 0x0c, 0x20,
+ 0x0c, 0xde, 0x2e, 0x31, 0x20, 0x4f, 0x2d, 0x5c, 0x0d, 0xde, 0x0e, 0x73,
+ 0x53, 0x0c, 0x0f, 0x42,
+ 0x0b, 0xfe, 0xe0, 0x03, 0x13, 0x00, 0xca, 0xee, 0xe0, 0x34, 0x00, 0xcb,
+ 0x22, 0x53, 0x0e, 0x1f,
+ 0x01, 0x07, 0x01, 0x40, 0x2f, 0x30, 0x10, 0x00, 0x00, 0x05, 0x01, 0x20,
+ 0x71, 0xe0, 0x00, 0x55,
+ 0x46, 0x11, 0x01, 0x00, 0xf0, 0xe0, 0x20, 0x42, 0x25, 0x00, 0x3f, 0x0e,
+ 0x20, 0x77, 0x61, 0xff,
+ 0xef, 0x0f, 0x21, 0x12, 0x00, 0x0d, 0x00, 0xf0, 0xc0, 0x00, 0x20, 0x30,
+ 0x1f, 0x20, 0x77, 0x02,
+ 0xec, 0xe0, 0x25, 0x30, 0xdf, 0xbd, 0xfb, 0xef, 0x20, 0x12, 0xe0, 0xfd,
+ 0x00, 0xeb, 0xdf, 0x10,
+ 0xf0, 0xc0, 0x70, 0x57, 0x00, 0xdf, 0xfd, 0x01, 0x33, 0x01, 0xbe, 0xed,
+ 0x0f, 0x0f, 0x4c, 0xe0,
+ 0x05, 0x02, 0xee, 0xf0, 0x30, 0xf0, 0x80, 0xa6, 0x22, 0x4f, 0x0f, 0xc3,
+ 0x02, 0x0f, 0x1e, 0x02,
+ 0xe6, 0x00, 0xfc, 0xf0, 0x11, 0x1f, 0xde, 0x13, 0x47, 0xe2, 0xce, 0xe0,
+ 0x02, 0x10, 0x00, 0xcc,
+ 0x0d, 0x0e, 0x30, 0x0e, 0xcd, 0x01, 0x56, 0x43, 0x30, 0xaa, 0xe0, 0x31,
+ 0x23, 0xef, 0xcc, 0x00,
+ 0x10, 0x0e, 0x0e, 0x00, 0x21, 0xfd, 0xf0, 0x21, 0x51, 0x03, 0x00, 0x1e,
+ 0x08, 0x0a, 0x31, 0x60,
+ 0x0f, 0x11, 0xf3, 0xe0, 0xfe, 0xcd, 0xe2, 0x47, 0x40, 0xbe, 0xef, 0xf0,
+ 0x00, 0xff, 0xef, 0x12,
+ 0x55, 0x01, 0xed, 0xdc, 0x20, 0x62, 0x11, 0x02, 0xf1, 0xdf, 0x08, 0x10,
+ 0x32, 0x01, 0xdf, 0x31,
+ 0x02, 0x8f, 0xed, 0x00, 0x37, 0x32, 0x31, 0x30, 0xd0, 0x10, 0x11, 0xc0,
+ 0x21, 0x77, 0x40, 0xde,
+ 0x01, 0x02, 0x33, 0x11, 0xe0, 0xed, 0x0b, 0x2f, 0x0d, 0x90, 0xe0, 0x41,
+ 0x30, 0xe4, 0xf1, 0xfd,
+ 0x2f, 0x23, 0xde, 0xea, 0x50, 0x12, 0xa8, 0xdd, 0x02, 0x32, 0x0c, 0xcd,
+ 0x10, 0x43, 0x13, 0x0e,
+ 0xef, 0xf1, 0xe0, 0xfb, 0xef, 0x00, 0xdf, 0xcc, 0x02, 0x06, 0xbf, 0xff,
+ 0xf1, 0xd0, 0x20, 0x1f,
+ 0xbf, 0xf1, 0x23, 0x01, 0x92, 0x17, 0x11, 0xcb, 0xcf, 0x01, 0x02, 0x03,
+ 0xd2, 0x04, 0x51, 0x00,
+ 0xd0, 0xdf, 0xd1, 0x12, 0x76, 0xf0, 0xdd, 0x01, 0x02, 0x00, 0xe9, 0xc1,
+ 0x14, 0x20, 0xcb, 0xcf,
+ 0x10, 0x44, 0x00, 0x1d, 0x00, 0xfe, 0x0e, 0x20, 0x74, 0x00, 0xee, 0x00,
+ 0x30, 0x42, 0x0f, 0xd9,
+ 0x10, 0x11, 0xce, 0xce, 0x10, 0x73, 0x0f, 0xfb, 0x00, 0x54, 0x0f, 0x0a,
+ 0xdf, 0x10, 0x40, 0xf0,
+ 0xec, 0x10, 0x54, 0x00, 0xed, 0x01, 0x22, 0x00, 0x00, 0xfe, 0x01, 0xd0,
+ 0xdc, 0x02, 0x23, 0x1e,
+ 0xff, 0x04, 0x0f, 0xaa, 0x21, 0x54, 0x0e, 0xed, 0x35, 0x33, 0x0f, 0xef,
+ 0xbc, 0x00, 0x23, 0xe0,
+ 0xda, 0x30, 0x34, 0xf0, 0xcf, 0x00, 0x41, 0x15, 0x10, 0xef, 0x70, 0x45,
+ 0xff, 0xef, 0x10, 0x32,
+ 0x00, 0x1f, 0x51, 0xce, 0xda, 0x31, 0x74, 0x0f, 0xde, 0x00, 0x01, 0x10,
+ 0xf0, 0xde, 0x10, 0x54,
+ 0x01, 0x0f, 0x0d, 0x01, 0x01, 0x53, 0xd0, 0xbb, 0x40, 0x1f, 0xdd, 0xf0,
+ 0x0e, 0x0e, 0x00, 0x47,
+ 0x00, 0xfe, 0xee, 0x0c, 0xf0, 0x03, 0x23, 0xc8, 0x8d, 0x01, 0x23, 0x00,
+ 0xf0, 0x03, 0x03, 0x1f,
+ 0xfc, 0x0f, 0x00, 0xe1, 0x01, 0xb1, 0x0e, 0x15, 0x05, 0xc0, 0xf0, 0xdf,
+ 0xee, 0x32, 0x47, 0x01,
+ 0xdf, 0x02, 0x12, 0x80, 0xed, 0x00, 0x00, 0x20, 0x24, 0xb0, 0xdc, 0xf0,
+ 0x03, 0xf4, 0xfe, 0x32,
+ 0x13, 0x99, 0x00, 0x41, 0xf0, 0xcb, 0x10, 0x11, 0x00, 0xfb, 0xce, 0x20,
+ 0x3f, 0x01, 0x54, 0x0e,
+ 0xec, 0x21, 0x23, 0xbd, 0xef, 0x0f, 0x1e, 0x50, 0x00, 0xc8, 0x0e, 0x30,
+ 0x10, 0x0f, 0xfc, 0x30,
+ 0x50, 0x01, 0x20, 0x33, 0x10, 0xfe, 0x0e, 0xfc, 0x02, 0x26, 0xae, 0x00,
+ 0x45, 0x0f, 0xab, 0x00,
+ 0x00, 0xf0, 0xf2, 0x34, 0x31, 0x0e, 0xed, 0x33, 0x55, 0xf0, 0xef, 0x31,
+ 0x40, 0xf0, 0x00, 0xe3,
+ 0xd1, 0x56, 0x00, 0xff, 0xef, 0x11, 0x11, 0x15, 0x53, 0x11, 0x23, 0x23,
+ 0x00, 0x20, 0x50, 0xcf,
+ 0xd2, 0x75, 0x20, 0xc0, 0xf0, 0x04, 0x77, 0x02, 0xed, 0x0e, 0x12, 0x33,
+ 0xf1, 0xef, 0xfd, 0x0e,
+ 0x21, 0x17, 0x10, 0xed, 0x13, 0x67, 0x0f, 0xef, 0x00, 0x13, 0x00, 0x0e,
+ 0x0f, 0x10, 0x0e, 0xbd,
+ 0x00, 0x64, 0x25, 0xec, 0xdc, 0x00, 0x31, 0x11, 0xe0, 0x00, 0x11, 0x00,
+ 0xed, 0xcd, 0x00, 0x77,
+ 0x20, 0xdd, 0xf0, 0x11, 0x0e, 0xdc, 0x40, 0x30, 0x00, 0xe1, 0xbe, 0xec,
+ 0x34, 0x11, 0xbe, 0x00,
+ 0x24, 0x34, 0xff, 0xaa, 0x00, 0x11, 0x01, 0xf1, 0xe0, 0xed, 0x20, 0x03,
+ 0x9d, 0x0e, 0x05, 0x12,
+ 0xfe, 0x00, 0x03, 0xbc, 0xfd, 0x36, 0x30, 0xab, 0xff, 0x00, 0x00, 0xed,
+ 0x00, 0x01, 0x0f, 0x1e,
+ 0x53, 0x02, 0x00, 0xec, 0xee, 0x00, 0xe8, 0x8d, 0xfe, 0x02, 0x11, 0xfc,
+ 0xff, 0x63, 0x00, 0xe8,
+ 0x00, 0x10, 0x21, 0xee, 0x00, 0x42, 0xfe, 0xdb, 0x00, 0x24, 0x0f, 0x9d,
+ 0xfe, 0x00, 0x04, 0x10,
+ 0x0f, 0xf0, 0xcf, 0x00, 0x23, 0x02, 0xba, 0x00, 0x62, 0x00, 0xfe, 0xfd,
+ 0x01, 0x24, 0x11, 0x00,
+ 0xcc, 0xec, 0xff, 0x12, 0x35, 0xe0, 0xdf, 0x40, 0x11, 0xd0, 0xe0, 0x76,
+ 0x32, 0xdf, 0xef, 0x76,
+ 0x00, 0xfc, 0x00, 0x25, 0x00, 0xde, 0x20, 0x54, 0x00, 0xe0, 0x0f, 0x00,
+ 0x75, 0x0f, 0xdd, 0x00,
+ 0x21, 0x00, 0xf0, 0xe0, 0x20, 0x32, 0x0f, 0x00, 0x34, 0x42, 0x00, 0x9f,
+ 0x10, 0x22, 0x0c, 0xea,
+ 0x00, 0x41, 0xff, 0xde, 0x14, 0x22, 0x1f, 0xdd, 0x03, 0x77, 0x0f, 0xde,
+ 0xff, 0x00, 0x27, 0x00,
+ 0xde, 0x00, 0x51, 0xdf, 0xff, 0x21, 0xd0, 0xf0, 0x55, 0x00, 0x00, 0xc1,
+ 0xf0, 0x02, 0xf0, 0xdc,
+ 0x41, 0x12, 0x00, 0xf3, 0xe6, 0x42, 0x00, 0xdf, 0xe0, 0xaf, 0x02, 0x77,
+ 0x10, 0xbd, 0xff, 0xf0,
+ 0x04, 0x22, 0x10, 0xdc, 0xef, 0x11, 0x10, 0xfc, 0xe1, 0x00, 0xce, 0xfd,
+ 0x3f, 0x00, 0x02, 0x30,
+ 0xed, 0xfe, 0x72, 0x00, 0x0c, 0xfa, 0xbe, 0xfd, 0x00, 0x02, 0xca, 0xeb,
+ 0x00, 0x70, 0xf1, 0xfc,
+ 0x21, 0x63, 0xfc, 0xec, 0x00, 0x42, 0x00, 0xfa, 0xff, 0x10, 0x01, 0x00,
+ 0x31, 0x01, 0xce, 0xfd,
+ 0x00, 0x01, 0x02, 0xf0, 0x9a, 0xf0, 0x0f, 0x30, 0x40, 0xef, 0xf0, 0x10,
+ 0x2c, 0xfc, 0xee, 0x75,
+ 0x02, 0xff, 0xeb, 0xef, 0xf0, 0x32, 0x10, 0x88, 0xf0, 0x22, 0x21, 0xde,
+ 0xef, 0x32, 0x31, 0xf0,
+ 0x00, 0x53, 0x02, 0xef, 0x01, 0x02, 0x00, 0x20, 0x0e, 0x11, 0x10, 0x20,
+ 0xed, 0x25, 0x72, 0x3d,
+ 0xef, 0xe0, 0x15, 0x14, 0xdc, 0xbe, 0x55, 0x44, 0xff, 0xed, 0x03, 0x43,
+ 0x0e, 0xca, 0x12, 0x52,
+ 0xff, 0xea, 0x00, 0x01, 0x11, 0x10, 0x20, 0x1f, 0x23, 0x23, 0x8c, 0x0f,
+ 0x02, 0x03, 0xfb, 0xde,
+ 0x01, 0x23, 0xe0, 0xf2, 0x46, 0x20, 0xae, 0x00, 0x37, 0x21, 0xef, 0xae,
+ 0x02, 0x13, 0x0f, 0x00,
+ 0xf1, 0xf0, 0xff, 0x23, 0x25, 0xff, 0xcf, 0x26, 0x52, 0xd1, 0xd0, 0x01,
+ 0xf0, 0xbd, 0x00, 0x25,
+ 0xf0, 0xf2, 0x02, 0xbf, 0xec, 0x12, 0x45, 0x01, 0xcf, 0xed, 0x01, 0x23,
+ 0x21, 0xed, 0xe0, 0xf0,
+ 0x0c, 0x0b, 0x3f, 0x40, 0x23, 0x45, 0xcf, 0xab, 0xff, 0x00, 0x21, 0xd0,
+ 0xdd, 0x0e, 0x10, 0x4f,
+ 0x0b, 0x0b, 0x00, 0x70, 0x30, 0x0d, 0x0e, 0x51, 0x00, 0x1e, 0x42, 0x01,
+ 0xee, 0x2f, 0x4e, 0xb8,
+ 0xed, 0x12, 0x12, 0x12, 0xdc, 0xcd, 0x11, 0x32, 0xf0, 0xdb, 0x23, 0x55,
+ 0x00, 0x20, 0x10, 0x00,
+ 0x01, 0x42, 0x0f, 0xed, 0x22, 0xf0, 0xce, 0xef, 0x57, 0x00, 0xfd, 0xf0,
+ 0x44, 0x34, 0xf2, 0xbf,
+ 0x11, 0x77, 0x11, 0xfe, 0x00, 0x15, 0x10, 0x0e, 0xf0, 0x01, 0x11, 0x01,
+ 0x30, 0x0e, 0x50, 0x43,
+ 0x46, 0x11, 0xef, 0xcf, 0xff, 0x11, 0x44, 0xef, 0xfb, 0x00, 0x41, 0x03,
+ 0x01, 0x12, 0x0e, 0x0e,
+ 0x22, 0x77, 0x11, 0x0f, 0x30, 0xf0, 0xcc, 0x0e, 0x12, 0x42, 0xe0, 0xe9,
+ 0x00, 0x40, 0x11, 0xfe,
+ 0x42, 0x43, 0xcb, 0xee, 0x11, 0x12, 0x0f, 0x21, 0x56, 0x10, 0x0e, 0x0f,
+ 0xcf, 0xd0, 0xe0, 0x25,
+ 0x00, 0xdb, 0x20, 0x71, 0x22, 0xd0, 0xed, 0x45, 0x01, 0x00, 0x00, 0x00,
+ 0xd1, 0xf1, 0x02, 0x62,
+ 0xfe, 0xad, 0x01, 0x07, 0x03, 0xde, 0x12, 0x11, 0xde, 0xe0, 0xe0, 0x02,
+ 0x12, 0x20, 0xc9, 0xdf,
+ 0x72, 0xfe, 0xb8, 0xf0, 0x31, 0x01, 0xce, 0xef, 0x45, 0x20, 0xcf, 0xd0,
+ 0x00, 0x31, 0xdd, 0xaa,
+ 0x00, 0x1f, 0xf0, 0x0e, 0x12, 0x41, 0xfc, 0x00, 0x31, 0x20, 0xfd, 0xf0,
+ 0x14, 0x60, 0xf0, 0xfd,
+ 0xfd, 0xfa, 0x0e, 0x8e, 0xff, 0x16, 0x43, 0xdd, 0xed, 0x00, 0x13, 0x0f,
+ 0x0e, 0x00, 0xeb, 0x20,
+ 0x45, 0xdf, 0xef, 0x1f, 0x00, 0x02, 0x00, 0x50, 0x0c, 0xcf, 0xdc, 0xe0,
+ 0x47, 0x51, 0xff, 0xde,
+ 0x00, 0xf0, 0x23, 0x42, 0xe0, 0xef, 0x33, 0x30, 0xec, 0xe2, 0x77, 0x02,
+ 0xfd, 0xee, 0x51, 0x25,
+ 0xee, 0xfe, 0x43, 0x21, 0x0f, 0xca, 0x21, 0x31, 0xc0, 0xef, 0x00, 0x0e,
+ 0x00, 0x22, 0xd0, 0x0e,
+ 0x50, 0x45, 0x22, 0x2e, 0xd8, 0xbf, 0x00, 0x00, 0xad, 0x00, 0x44, 0xfd,
+ 0xcd, 0x02, 0x21, 0x01,
+ 0x10, 0x10, 0xfa, 0xf1, 0x01, 0x10, 0xfd, 0xbe, 0xee, 0x00, 0x01, 0xfe,
+ 0x0f, 0xce, 0xf4, 0x13,
+ 0xff, 0xee, 0xff, 0x13, 0x57, 0xd2, 0xbd, 0x03, 0xde, 0xd0, 0x77, 0xf5,
+ 0xdd, 0x32, 0x00, 0xfd,
+ 0x11, 0x67, 0x01, 0xbe, 0xf0, 0x00, 0x15, 0x00, 0xad, 0x01, 0x22, 0x00,
+ 0xbd, 0x0f, 0x00, 0x23,
+ 0x01, 0xfe, 0x00, 0xf0, 0xeb, 0x02, 0x45, 0x0f, 0x0d, 0x00, 0x0f, 0x13,
+ 0x13, 0xed, 0xa9, 0x12,
+ 0x42, 0xec, 0xac, 0x10, 0x12, 0xfe, 0xff, 0x32, 0x45, 0x2f, 0xfd, 0xff,
+ 0x20, 0x20, 0xea, 0x01,
+ 0x74, 0xfe, 0xdd, 0x00, 0x13, 0x20, 0xda, 0x00, 0x23, 0x21, 0xbe, 0x00,
+ 0x01, 0x32, 0xfe, 0x0e,
+ 0x10, 0x42, 0x33, 0x11, 0xee, 0xb9, 0xf0, 0x43, 0x01, 0xab, 0x0f, 0x42,
+ 0x01, 0xfd, 0x0f, 0x11,
+ 0x03, 0xf0, 0xff, 0x32, 0x00, 0xde, 0x47, 0x67, 0x00, 0x20, 0x13, 0xde,
+ 0xdd, 0x11, 0x66, 0x00,
+ 0xff, 0x0f, 0x71, 0x01, 0xf0, 0x01, 0x21, 0x0d, 0xfc, 0x02, 0x16, 0x00,
+ 0xee, 0x11, 0x22, 0x00,
+ 0xff, 0xde, 0x1f, 0x70, 0x00, 0x55, 0x22, 0xed, 0xbb, 0x10, 0x22, 0xff,
+ 0xfe, 0x14, 0x02, 0xde,
+ 0x00, 0x74, 0x12, 0xf0, 0xeb, 0xed, 0x0e, 0x00, 0x10, 0x02, 0xd2, 0x02,
+ 0x32, 0xfe, 0xc0, 0x26,
+ 0x00, 0x8c, 0x00, 0x27, 0xef, 0xef, 0x12, 0x00, 0xbd, 0x02, 0xe0, 0x03,
+ 0x45, 0xef, 0xde, 0x44,
+ 0x35, 0x00, 0xde, 0x00, 0x04, 0xe0, 0xb0, 0xf0, 0x01, 0x05, 0x05, 0x05,
+ 0xb2, 0x00, 0xdc, 0x00,
+ 0xd0, 0xdd, 0x8c, 0x35, 0x40, 0xe3, 0xa3, 0x38, 0xf0, 0x34, 0x77, 0xff,
+ 0xce, 0x00, 0x21, 0xe0,
+ 0xff, 0x20, 0x22, 0x0e, 0xcb, 0x00, 0x11, 0x13, 0x01, 0x00, 0x2b, 0x0e,
+ 0xf0, 0x0f, 0xdc, 0x8e,
+ 0x22, 0x75, 0xec, 0xeb, 0x10, 0x62, 0x0f, 0xfc, 0x00, 0x21, 0x30, 0xdc,
+ 0xef, 0x21, 0x54, 0x20,
+ 0x00, 0xec, 0xf0, 0x00, 0x10, 0x43, 0x11, 0xec, 0xcf, 0x11, 0x23, 0xed,
+ 0x11, 0x53, 0xfd, 0xee,
+ 0x04, 0xf2, 0x03, 0x46, 0x53, 0x0f, 0xee, 0x10, 0x30, 0xdf, 0xbe, 0x27,
+ 0x24, 0xdd, 0x10, 0x77,
+ 0x10, 0xd0, 0xf0, 0x02, 0x33, 0x10, 0xf0, 0x02, 0x25, 0x21, 0xe0, 0x10,
+ 0x00, 0xaa, 0x00, 0x61,
+ 0x23, 0xf1, 0xef, 0x10, 0x44, 0x34, 0x00, 0xce, 0xee, 0x22, 0x00, 0x9e,
+ 0x00, 0x44, 0x00, 0x0f,
+ 0x01, 0x00, 0x1e, 0x0e, 0x34, 0x54, 0xdd, 0xee, 0x05, 0x1f, 0xea, 0xff,
+ 0x10, 0x0c, 0x30, 0x70,
+ 0x01, 0xce, 0xfd, 0x12, 0x63, 0x0c, 0xdc, 0x00, 0x0e, 0x00, 0x00, 0xfe,
+ 0x22, 0x44, 0x0e, 0xa8,
+ 0xfd, 0x01, 0x14, 0x10, 0x0d, 0xbc, 0xf0, 0x00, 0x11, 0x10, 0x01, 0x01,
+ 0x0d, 0xef, 0x36, 0x11,
+ 0xbe, 0x0e, 0x42, 0xdc, 0xde, 0x02, 0xc0, 0xbf, 0x05, 0x33, 0xdb, 0xdf,
+ 0x22, 0x00, 0x0f, 0xdf,
+ 0x0f, 0x11, 0x01, 0x01, 0x0f, 0xb9, 0xdf, 0xef, 0x31, 0xbf, 0xce, 0xef,
+ 0x11, 0x11, 0xfb, 0xbd,
+ 0x0d, 0xed, 0xef, 0xfb, 0xcc, 0x20, 0x1f, 0xa8, 0xef, 0x51, 0x30, 0xee,
+ 0x0e, 0x42, 0x11, 0xfd,
+ 0xfd, 0x14, 0xf0, 0xab, 0x0f, 0x00, 0xec, 0xee, 0x11, 0x34, 0x00, 0xab,
+ 0x00, 0x23, 0x10, 0x0e,
+ 0x10, 0x24, 0x00, 0xee, 0x8d, 0x01, 0x22, 0x1f, 0xeb, 0x00, 0xf0, 0x0f,
+ 0xff, 0x13, 0x24, 0xff,
+ 0xff, 0x20, 0x51, 0x04, 0x06, 0x01, 0x71, 0xfe, 0x00, 0x47, 0xf1, 0x9d,
+ 0x0f, 0x37, 0x51, 0xff,
+ 0xf0, 0x01, 0x22, 0xef, 0x0f, 0x23, 0x53, 0x01, 0xdf, 0x0e, 0x10, 0x15,
+ 0x00, 0x00, 0x22, 0x00,
+ 0xdf, 0x2f, 0x1f, 0x23, 0x67, 0x33, 0x1e, 0xfe, 0xd0, 0x01, 0x01, 0x22,
+ 0xdf, 0xb9, 0x20, 0x70,
+ 0xf0, 0xf0, 0x04, 0x22, 0x20, 0xdb, 0x00, 0x23, 0xf0, 0xdc, 0x10, 0x0f,
+ 0xdf, 0x00, 0xd1, 0x90,
+ 0x17, 0x41, 0x9e, 0xee, 0xf0, 0x11, 0x33, 0xf1, 0xc4, 0x00, 0xf0, 0xee,
+ 0x12, 0x14, 0x01, 0x04,
+ 0x42, 0x33, 0xc1, 0x06, 0x25, 0x00, 0x9f, 0xe0, 0xf0, 0x00, 0xce, 0xf1,
+ 0x15, 0x02, 0x00, 0xba,
+ 0xf0, 0xde, 0x00, 0x32, 0x51, 0x01, 0xff, 0xac, 0x00, 0x02, 0x13, 0xf0,
+ 0xdb, 0xd0, 0x22, 0x1f,
+ 0xdc, 0xe0, 0xe0, 0xed, 0x0d, 0x11, 0x0e, 0x88, 0x0d, 0x74, 0x21, 0x0d,
+ 0x0e, 0xf1, 0x00, 0x1c,
+ 0x0c, 0x00, 0x11, 0x22, 0xff, 0xda, 0xef, 0xff, 0x30, 0x30, 0xfe, 0x00,
+ 0xf0, 0x00, 0x73, 0x72,
+ 0x0e, 0xea, 0x0e, 0x0e, 0xfd, 0x01, 0x56, 0x00, 0x0f, 0xee, 0x0f, 0xfe,
+ 0xec, 0x00, 0x65, 0x10,
+ 0xdb, 0xe0, 0x03, 0x3f, 0x00, 0xe0, 0xfe, 0x00, 0x74, 0x13, 0xf1, 0xcf,
+ 0x13, 0x77, 0x20, 0xe0,
+ 0x00, 0x32, 0x10, 0x00, 0x21, 0x00, 0x00, 0xd3, 0x45, 0x33, 0x10, 0x0e,
+ 0xcc, 0x0e, 0x00, 0x47,
+ 0x45, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x3e, 0x70, 0x45, 0x01, 0xf0, 0xcc,
+ 0x00, 0x34, 0x10, 0xfe,
+ 0x00, 0x42, 0x12, 0xde, 0xce, 0x22, 0x63, 0x10, 0x0b, 0xdf, 0x00, 0x01,
+ 0x04, 0x10, 0x0c, 0xe0,
+ 0x02, 0x05, 0xf1, 0xd0, 0xc0, 0xdc, 0xd1, 0x14, 0x53, 0xec, 0xce, 0xe0,
+ 0x05, 0x12, 0xcf, 0xb0,
+ 0xe2, 0x01, 0x56, 0x12, 0x12, 0x00, 0xe0, 0xe2, 0xd1, 0xa0, 0xce, 0xe1,
+ 0x27, 0xf0, 0xbf, 0xef,
+ 0x24, 0x22, 0x1f, 0x00, 0x02, 0xe3, 0xfd, 0xed, 0x02, 0x65, 0x01, 0xae,
+ 0xf9, 0xef, 0x00, 0xf0,
+ 0x01, 0x00, 0xdb, 0xae, 0x00, 0x52, 0x0c, 0x0e, 0x00, 0x03, 0xe9, 0xce,
+ 0x2e, 0x61, 0x1f, 0x1d,
+ 0x0f, 0xfd, 0xea, 0x0f, 0x10, 0x52, 0x00, 0xfc, 0x0f, 0xe0, 0x0f, 0x30,
+ 0x20, 0xcc, 0xdd, 0x2f,
+ 0x53, 0x10, 0xeb, 0xe0, 0x21, 0x30, 0x0e, 0xe0, 0xbf, 0x03, 0x56, 0x00,
+ 0x0c, 0x10, 0x20, 0x01,
+ 0xdd, 0x01, 0x27, 0x20, 0xef, 0xf0, 0x31, 0xf2, 0x80, 0x03, 0x06, 0x30,
+ 0xee, 0xe0, 0x22, 0x74,
+ 0x64, 0x00, 0xee, 0x0f, 0x00, 0x10, 0x00, 0x13, 0x07, 0x00, 0x00, 0x31,
+ 0x02, 0x10, 0x0d, 0xcf,
+ 0x03, 0x16, 0x11, 0x22, 0x0e, 0xab, 0xef, 0x30, 0x73, 0x30, 0x0f, 0x0e,
+ 0x13, 0x47, 0x21, 0x10,
+ 0x0e, 0xf0, 0xf0, 0xff, 0x4f, 0x10, 0xdf, 0xed, 0x0f, 0x0c, 0x3f, 0x7e,
+ 0x50, 0x26, 0x0f, 0xca,
+ 0x00, 0x04, 0x00, 0x0f, 0x11, 0x10, 0xbb, 0xdf, 0x41, 0x76, 0x0f, 0xec,
+ 0xe0, 0x12, 0x20, 0xe0,
+ 0xfe, 0x42, 0x33, 0x00, 0xf1, 0xe2, 0x01, 0x01, 0x02, 0xe0, 0xf1, 0xb0,
+ 0xef, 0xf3, 0x03, 0xf7,
+ 0xe3, 0x00, 0xd2, 0x82, 0xe2, 0x36, 0x70, 0x0f, 0xfc, 0x06, 0x00, 0xef,
+ 0xee, 0x02, 0x03, 0xcd,
+ 0xdc, 0x01, 0xf1, 0xef, 0xd2, 0xe0, 0x0d, 0x20, 0xf0, 0xcc, 0xbc, 0xf1,
+ 0x15, 0x2b, 0xcc, 0x00,
+ 0x61, 0x00, 0xfc, 0xfd, 0x21, 0x43, 0x11, 0x0e, 0xfd, 0x00, 0x00, 0x0e,
+ 0xca, 0x9d, 0xef, 0x02,
+ 0x35, 0x20, 0x0d, 0xfe, 0x01, 0x21, 0x32, 0x50, 0x0e, 0xe0, 0xbf, 0xff,
+ 0x11, 0x3f, 0x18, 0xfa,
+ 0x10, 0x54, 0xff, 0xbd, 0xf0, 0x22, 0x11, 0x01, 0x0f, 0xff, 0xd0, 0xe2,
+ 0xf7, 0xe0, 0xc0, 0x20,
+ 0x71, 0x21, 0xf0, 0xe3, 0x37, 0x70, 0x11, 0x11, 0x01, 0x01, 0x10, 0x11,
+ 0x22, 0x33, 0x15, 0x1f,
+ 0xca, 0xd0, 0x33, 0x64, 0xff, 0xec, 0x01, 0x00, 0xc0, 0x1f, 0x72, 0x22,
+ 0xfc, 0x00, 0x20, 0x22,
+ 0x32, 0x0a, 0xee, 0x01, 0xb1, 0xcd, 0x0c, 0xfd, 0xe0, 0x44, 0x50, 0x0e,
+ 0x0f, 0xf0, 0x10, 0x34,
+ 0x0f, 0xa8, 0xf0, 0xff, 0x00, 0xe0, 0x00, 0xf0, 0xcf, 0xee, 0xe0, 0xf0,
+ 0x0f, 0x32, 0x15, 0x11,
+ 0x13, 0xee, 0x8a, 0xf0, 0x01, 0x45, 0x30, 0xff, 0xe0, 0x05, 0x10, 0xdf,
+ 0xaf, 0x02, 0xf1, 0xcf,
+ 0xee, 0xe0, 0xf4, 0xe3, 0x13, 0x01, 0xbc, 0xeb, 0x00, 0x44, 0x21, 0xc0,
+ 0x00, 0x43, 0xe0, 0x9f,
+ 0x00, 0x23, 0xed, 0xbb, 0xf1, 0x04, 0x0f, 0x0d, 0xf0, 0x03, 0x00, 0xfb,
+ 0xee, 0x0f, 0x2f, 0x1d,
+ 0x20, 0x57, 0x20, 0x1d, 0xec, 0x00, 0x0f, 0x3f, 0x5f, 0x20, 0x10, 0xd9,
+ 0xee, 0xd0, 0xed, 0x8e,
+ 0x02, 0x42, 0x1f, 0xfe, 0xb0, 0x0f, 0x23, 0x16, 0x00, 0x2f, 0xea, 0xf0,
+ 0x12, 0x21, 0xed, 0xac,
+ 0x20, 0x62, 0xfe, 0xff, 0x00, 0x1d, 0x00, 0x14, 0x02, 0x0e, 0x08, 0xdf,
+ 0x00, 0xd1, 0xb0, 0xe0,
+ 0x02, 0x20, 0x32, 0x76, 0x00, 0xec, 0x00, 0x43, 0x66, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01,
+ 0x74, 0x22, 0x0e, 0xcc, 0x00, 0x01, 0x13, 0x12, 0xff, 0xfb, 0x0f, 0x32,
+ 0x10, 0xcd, 0x0f, 0x32,
+ 0x33, 0x0f, 0xd9, 0xf0, 0x42, 0x50, 0x1e, 0x10, 0x01, 0x16, 0xdf, 0xbc,
+ 0x0e, 0x40, 0x31, 0x20,
+ 0x3e, 0xe0, 0xbb, 0xee, 0x00, 0x16, 0x43, 0xce, 0xbc, 0xe0, 0x02, 0x02,
+ 0x2e, 0xfd, 0xbe, 0xf0,
+ 0x02, 0x01, 0x2f, 0xe9, 0xf1, 0x44, 0x32, 0xf0, 0xa0, 0x02, 0x47, 0x00,
+ 0xdf, 0x01, 0x04, 0x00,
+ 0xae, 0x00, 0xf4, 0xf0, 0xef, 0xef, 0x01, 0xf0, 0x11, 0x35, 0x32, 0x00,
+ 0x31, 0x12, 0xcd, 0xef,
+ 0x13, 0x57, 0x0f, 0x8b, 0xde, 0xf1, 0x05, 0x2f, 0xec, 0xc0, 0x01, 0x00,
+ 0xfe, 0x00, 0x10, 0x40,
+ 0x0c, 0xee, 0x2e, 0x73, 0x40, 0xec, 0xec, 0x0d, 0x00, 0x2d, 0x09, 0x1f,
+ 0x60, 0x34, 0x0f, 0xed,
+ 0x00, 0x41, 0x31, 0x0f, 0xfe, 0x11, 0x10, 0xdb, 0xf0, 0x43, 0x24, 0xce,
+ 0x0f, 0x63, 0x00, 0xdd,
+ 0x21, 0x64, 0x14, 0x03, 0x04, 0x00, 0xba, 0xff, 0x10, 0x57, 0x00, 0xef,
+ 0x01, 0x11, 0x01, 0xf1,
+ 0xf0, 0xf1, 0x33, 0x44, 0xf0, 0xe0, 0x24, 0x22, 0x0f, 0x02, 0x03, 0xd1,
+ 0x2f, 0x70, 0x23, 0xe5,
+ 0x03, 0x00, 0x33, 0x14, 0xd0, 0x90, 0x12, 0x46, 0x12, 0x00, 0x0f, 0x31,
+ 0x00, 0x0e, 0x2e, 0x00,
+ 0x0f, 0xdc, 0x01, 0x47, 0x67, 0x10, 0x4e, 0x30, 0x00, 0x00, 0xcf, 0x3e,
+ 0x75, 0x20, 0xde, 0xec,
+ 0x1f, 0x7f, 0x00, 0x11, 0x10, 0x0f, 0x0f, 0x01, 0x01, 0xed, 0xac, 0x00,
+ 0x00, 0xf8, 0xed, 0xe0,
+ 0x22, 0x10, 0x0e, 0xff, 0x3f, 0x60, 0x12, 0x0c, 0x30, 0x37, 0xf0, 0xbe,
+ 0x02, 0x35, 0xff, 0xcb,
+ 0xf0, 0x12, 0xf0, 0x8f, 0xed, 0x01, 0x05, 0x00, 0xff, 0xef, 0xf0, 0x03,
+ 0x51, 0x00, 0x00, 0xcd,
+ 0x00, 0x35, 0x00, 0xce, 0xdd, 0xef, 0xd0, 0xc0, 0xdb, 0x00, 0x02, 0xc0,
+ 0x8a, 0x00, 0x02, 0x10,
+ 0xfb, 0xee, 0x00, 0x0e, 0xed, 0x00, 0x00, 0xdd, 0xd9, 0xb0, 0x0f, 0x3f,
+ 0x00, 0x2f, 0x3e, 0x4f,
+ 0x1e, 0x52, 0x00, 0xe8, 0xbf, 0xf0, 0xde, 0xfe, 0x1f, 0x30, 0x31, 0xce,
+ 0xdc, 0x11, 0x54, 0x10,
+ 0x00, 0xfd, 0xba, 0x00, 0x52, 0x00, 0xd9, 0xe0, 0x00, 0xf0, 0xf0, 0x13,
+ 0x62, 0x01, 0x10, 0x21,
+ 0x0f, 0x00, 0xe2, 0xcc, 0xee, 0x16, 0x13, 0x00, 0x50, 0x23, 0x01, 0x00,
+ 0x77, 0x13, 0x00, 0x00,
+ 0xf2, 0x01, 0x42, 0x65, 0x26, 0x10, 0xe0, 0xdd, 0x00, 0x67, 0x00, 0xee,
+ 0x00, 0x42, 0x00, 0xf0,
+ 0xff, 0x01, 0x23, 0x0f, 0xee, 0x11, 0x46, 0x21, 0x30, 0x41, 0xf0, 0xbe,
+ 0x0e, 0x0f, 0x0f, 0xff,
+ 0x0d, 0x0f, 0x40, 0x20, 0x26, 0x42, 0x1f, 0x0e, 0x00, 0x23, 0xe4, 0x8c,
+ 0xac, 0x00, 0x21, 0xf0,
+ 0xcb, 0x0f, 0xfd, 0x10, 0x21, 0x06, 0x01, 0x01, 0x00, 0x00, 0x0d, 0x00,
+ 0x36, 0x0f, 0xbf, 0xe2,
+ 0x03, 0x20, 0x00, 0xc0, 0xf1, 0xf2, 0xe1, 0xb0, 0xf0, 0x07, 0x12, 0x00,
+ 0xb0, 0xbf, 0xfe, 0xf0,
+ 0x0f, 0x14, 0x26, 0x01, 0xf0, 0x8c, 0xef, 0x01, 0x00, 0xec, 0xdf, 0xd0,
+ 0xf0, 0xd0, 0xa8, 0xf0,
+ 0x30, 0x31, 0x0f, 0xda, 0xe0, 0xf0, 0x01, 0x00, 0xde, 0x00, 0xef, 0xbd,
+ 0x0d, 0xfa, 0x00, 0x7e,
+ 0x30, 0x50, 0x01, 0xec, 0xfc, 0x10, 0x11, 0xfc, 0xcc, 0x00, 0xff, 0xf0,
+ 0x21, 0x41, 0x0f, 0x0e,
+ 0x5e, 0x1e, 0x30, 0x01, 0xb8, 0xdf, 0x01, 0x10, 0xe9, 0x00, 0x00, 0x50,
+ 0x30, 0x31, 0x00, 0xfe,
+ 0x1f, 0x00, 0xc0, 0xe0, 0xa0, 0x01, 0x1e, 0x0b, 0xdf, 0x20, 0x74, 0x41,
+ 0xde, 0x02, 0x37, 0x74,
+ 0x01, 0x00, 0xfe, 0x01, 0x23, 0x03, 0x10, 0x00, 0x10, 0x13, 0x02, 0xf0,
+ 0x00, 0x75, 0x32, 0x0d,
+ 0x10, 0x37, 0xf1, 0xbb, 0xf0, 0x25, 0x31, 0x1f, 0x0e, 0x12, 0x00, 0x40,
+ 0xe0, 0xdf, 0x52, 0x47,
+ 0x01, 0xde, 0xef, 0x2f, 0x73, 0x56, 0x00, 0xfd, 0xf0, 0x23, 0x00, 0x00,
+ 0xe0, 0x35, 0x00, 0xab,
+ 0xe0, 0xf0, 0xf1, 0x00, 0x00, 0x22, 0x02, 0xcf, 0x21, 0x56, 0x00, 0x00,
+ 0xef, 0x00, 0x03, 0xe0,
+ 0xe1, 0x27, 0x61, 0x00, 0xe0, 0x00, 0xb1, 0xde, 0x00, 0x36, 0xf0, 0xb1,
+ 0xe1, 0x00, 0xf0, 0xe0,
+ 0xf0, 0x33, 0x74, 0x00, 0x00, 0xf0, 0xf1, 0x04, 0x15, 0x0f, 0x8a, 0xe0,
+ 0x02, 0x00, 0xf1, 0xde,
+ 0x0d, 0x00, 0x30, 0x0f, 0xfc, 0x00, 0x00, 0x1c, 0x4e, 0x10, 0x02, 0x00,
+ 0x08, 0x1f, 0xf0, 0x8b,
+ 0xed, 0x0d, 0x4e, 0x71, 0x35, 0xee, 0xdd, 0xff, 0x21, 0x30, 0xdb, 0x01,
+ 0x52, 0x00, 0xfe, 0x0e,
+ 0x1e, 0x10, 0x31, 0x23, 0x0d, 0xc9, 0xf0, 0x30, 0x73, 0x02, 0x01, 0x01,
+ 0xee, 0xec, 0xf0, 0x12,
+ 0x40, 0x33, 0x15, 0xd0, 0xf1, 0x22, 0x0c, 0xcd, 0x01, 0x23, 0x21, 0x41,
+ 0x64, 0x27, 0x25, 0xfe,
+ 0xe0, 0x20, 0x02, 0x8f, 0xfd, 0x04, 0x67, 0x10, 0x00, 0x01, 0x10, 0xf1,
+ 0xee, 0x00, 0x03, 0x01,
+ 0x31, 0x74, 0x10, 0x0f, 0x0d, 0x01, 0xf5, 0x00, 0xe0, 0x0e, 0x64, 0x35,
+ 0x0f, 0x1e, 0x22, 0x21,
+ 0x1f, 0x40, 0x44, 0xed, 0xcc, 0xf0, 0x22, 0x5d, 0x1f, 0x30, 0x01, 0x00,
+ 0x02, 0x07, 0x1f, 0xfb,
+ 0xc0, 0x41, 0x02, 0xcd, 0xbb, 0x00, 0x00, 0x00, 0x10, 0x43, 0x30, 0x1d,
+ 0xee, 0xe0, 0x47, 0x31,
+ 0x31, 0xd0, 0xee, 0x20, 0x41, 0x02, 0x9f, 0x00, 0x26, 0x43, 0xe0, 0x9c,
+ 0x00, 0x07, 0x00, 0xf0,
+ 0x1f, 0x10, 0x12, 0x11, 0x02, 0xf3, 0xd0, 0xcd, 0x04, 0x55, 0xd0, 0x9a,
+ 0x00, 0x11, 0xf1, 0xbf,
+ 0x0f, 0x00, 0xf1, 0x0f, 0x01, 0x25, 0xfe, 0xbb, 0x00, 0x03, 0xf0, 0xdd,
+ 0xff, 0x10, 0x20, 0xcd,
+ 0xea, 0xfd, 0x0e, 0x00, 0x71, 0x00, 0xfb, 0x00, 0x13, 0x20, 0x0e, 0xcd,
+ 0xff, 0x1d, 0x0f, 0xff,
+ 0x0e, 0xdb, 0x00, 0x73, 0x32, 0x1c, 0xed, 0xfd, 0xed, 0x20, 0x10, 0xbf,
+ 0xd8, 0xff, 0x2f, 0x30,
+ 0xd1, 0xab, 0xfe, 0x01, 0x47, 0x01, 0x00, 0x00, 0xf1, 0xad, 0xed, 0x21,
+ 0x62, 0x00, 0x0e, 0xe0,
+ 0xee, 0x02, 0x37, 0x22, 0x10, 0x00, 0xc0, 0x01, 0x54, 0x10, 0x04, 0x45,
+ 0xef, 0xce, 0x00, 0x00,
+ 0x12, 0x51, 0x12, 0x02, 0x0f, 0xf9, 0xef, 0xe0, 0x24, 0x21, 0xde, 0xbd,
+ 0x10, 0x77, 0x01, 0xec,
+ 0xf0, 0x40, 0x42, 0x0e, 0xa9, 0x00, 0x00, 0x00, 0x10, 0x0e, 0xe0, 0x0f,
+ 0x10, 0x43, 0x01, 0xcd,
+ 0xfc, 0x12, 0x14, 0x0f, 0xca, 0x00, 0xef, 0xde, 0xcd, 0x10, 0x43, 0x01,
+ 0xde, 0x01, 0x77, 0xf0,
+ 0xeb, 0x00, 0x33, 0x00, 0xff, 0xd0, 0xe1, 0x00, 0x0f, 0xc0, 0x22, 0x34,
+ 0xd0, 0xe0, 0xe1, 0xbf,
+ 0xf2, 0x47, 0x30, 0xe0, 0xde, 0x01, 0xd1, 0x8c, 0xf0, 0x04, 0x64, 0xf0,
+ 0xcc, 0x01, 0x01, 0x00,
+ 0x10, 0x02, 0xc2, 0xff, 0xe0, 0x02, 0x0f, 0xcd, 0x07, 0x30, 0xdf, 0xfe,
+ 0x12, 0x53, 0x00, 0x0f,
+ 0x11, 0xe4, 0xc8, 0xcb, 0x20, 0x52, 0x00, 0x00, 0x0d, 0x30, 0x00, 0xdf,
+ 0x1f, 0x4f, 0x10, 0xef,
+ 0x00, 0x21, 0xdb, 0x9c, 0x34, 0x65, 0xfe, 0xed, 0x0f, 0x31, 0x42, 0xff,
+ 0xee, 0x11, 0x20, 0x0b,
+ 0xce, 0x0f, 0x10, 0x01, 0x03, 0xe0, 0x31, 0x41, 0x00, 0x50, 0x0e, 0xec,
+ 0x10, 0x30, 0x0d, 0xb8,
+ 0x2f, 0x54, 0x14, 0x00, 0x0f, 0x20, 0x02, 0x23, 0x11, 0x20, 0x60, 0x25,
+ 0x34, 0x00, 0xf3, 0x45,
+ 0x00, 0xcc, 0xf0, 0x54, 0x52, 0x0e, 0xfd, 0x26, 0x32, 0x0f, 0xff, 0xc0,
+ 0xff, 0x12, 0x12, 0x00,
+ 0xf0, 0x11, 0x00, 0x20, 0x74, 0x21, 0x00, 0xfc, 0x0d, 0x30, 0x37, 0x76,
+ 0x20, 0x00, 0xd0, 0xef,
+ 0xff, 0x0d, 0x01, 0x24, 0x20, 0xfe, 0xaf, 0xff, 0xd0, 0x00, 0xf0, 0x9c,
+ 0x00, 0x44, 0x00, 0xef,
+ 0xfe, 0x00, 0x05, 0x32, 0xff, 0xba, 0xf1, 0xe2, 0xe0, 0x21, 0x25, 0xe0,
+ 0xc0, 0xd0, 0xd5, 0xdf,
+ 0x00, 0x62, 0x02, 0xbe, 0x0f, 0x34, 0x36, 0xe0, 0xaf, 0x00, 0x05, 0x00,
+ 0x0f, 0x22, 0x44, 0xe0,
+ 0xdd, 0x0e, 0xdf, 0xd1, 0xe0, 0xd0, 0xc0, 0xd4, 0xe0, 0xbb, 0xfe, 0x1f,
+ 0x43, 0x03, 0xdc, 0xdd,
+ 0x70, 0x34, 0x00, 0xe9, 0xff, 0x20, 0x60, 0xfe, 0xb8, 0x0f, 0x00, 0x43,
+ 0x10, 0x0e, 0xee, 0x1e,
+ 0x20, 0x30, 0x12, 0xff, 0xbe, 0x00, 0x10, 0x23, 0x64, 0x10, 0x0b, 0x0d,
+ 0xef, 0x22, 0x33, 0xfc,
+ 0x01, 0x27, 0x1f, 0x1e, 0x00, 0xf0, 0xf1, 0xc0, 0x01, 0x33, 0x75, 0x00,
+ 0xe0, 0xef, 0xe0, 0x30,
+ 0x75, 0x00, 0xcf, 0xf0, 0x13, 0x77, 0x02, 0xe0, 0x00, 0x10, 0x05, 0x05,
+ 0x20, 0x00, 0x83, 0x00,
+ 0xa8, 0x06, 0x63, 0x31, 0xd4, 0x07, 0x57, 0x31, 0x15, 0x64, 0x30, 0x00,
+ 0xc1, 0x03, 0x70, 0x3f,
+ 0x01, 0x47, 0xe0, 0xaf, 0x0f, 0x64, 0x14, 0xfd, 0xff, 0xf1, 0x00, 0xe0,
+ 0xf0, 0x01, 0x0c, 0xe0,
+ 0x67, 0x52, 0x00, 0xfa, 0xf0, 0x10, 0x31, 0x10, 0x00, 0x0d, 0x01, 0xf0,
+ 0xfd, 0x30, 0x2f, 0xe1,
+ 0xc0, 0xb8, 0xee, 0x21, 0x74, 0xff, 0xdc, 0xe0, 0xfe, 0x00, 0x50, 0x0f,
+ 0x0f, 0x0f, 0x1f, 0x20,
+ 0x21, 0x30, 0x13, 0xee, 0x9a, 0x00, 0xe0, 0xfe, 0x0d, 0xdd, 0x01, 0x17,
+ 0x00, 0xdd, 0x00, 0x0e,
+ 0x0f, 0x01, 0xd2, 0xb0, 0x40, 0x00, 0x8a, 0xf0, 0x02, 0x0c, 0xf0, 0xf3,
+ 0x02, 0x1e, 0xfd, 0x03,
+ 0xd2, 0x88, 0xdd, 0xf0, 0xef, 0xe0, 0x03, 0xef, 0x0b, 0xf1, 0xe2, 0xad,
+ 0x0e, 0x00, 0xee, 0xec,
+ 0x1d, 0x0d, 0xbd, 0xe8, 0xdd, 0x0f, 0xfd, 0xca, 0x1f, 0x70, 0x12, 0x10,
+ 0xfb, 0x10, 0x40, 0xe0,
+ 0xcb, 0xe0, 0x00, 0x10, 0x0e, 0x0f, 0x30, 0x0f, 0x2e, 0x10, 0x03, 0xdd,
+ 0xfc, 0x3f, 0x33, 0xc0,
+ 0x88, 0x00, 0x01, 0xef, 0x8a, 0x00, 0x43, 0x12, 0x00, 0x10, 0x01, 0xf0,
+ 0xef, 0x0e, 0x20, 0x41,
+ 0xf0, 0xcf, 0x04, 0x13, 0xe0, 0x17, 0x74, 0x1f, 0x0f, 0x34, 0x00, 0xdf,
+ 0x01, 0x57, 0x34, 0xff,
+ 0xdf, 0x00, 0x31, 0x11, 0x22, 0x32, 0x62, 0x10, 0x01, 0xe1, 0xbf, 0xf0,
+ 0x01, 0x22, 0xf3, 0x05,
+ 0x44, 0x43, 0x00, 0xef, 0x00, 0x73, 0x21, 0x0b, 0x00, 0x01, 0x00, 0x00,
+ 0x13, 0x22, 0xff, 0xec,
+ 0x10, 0x51, 0x02, 0xfc, 0xe2, 0x25, 0x00, 0xc0, 0x00, 0x02, 0x88, 0xc9,
+ 0x11, 0x30, 0x10, 0x01,
+ 0x31, 0x23, 0x0f, 0xbe, 0xfd, 0x12, 0x57, 0xdf, 0xee, 0x01, 0x01, 0xf0,
+ 0xff, 0x00, 0x14, 0x13,
+ 0x22, 0xc0, 0x9a, 0x01, 0x25, 0x40, 0xf1, 0xc0, 0xf0, 0xee, 0x0f, 0x01,
+ 0x35, 0x10, 0x0f, 0xd0,
+ 0x01, 0x11, 0xf1, 0x9e, 0xef, 0xe1, 0xb2, 0xee, 0xef, 0x02, 0x13, 0x27,
+ 0xf2, 0x99, 0xff, 0xf1,
+ 0x02, 0x2e, 0xfd, 0x01, 0x41, 0xf0, 0xfb, 0xe0, 0x0e, 0xff, 0x1d, 0x70,
+ 0x0e, 0xd9, 0x0e, 0x10,
+ 0x20, 0x00, 0x01, 0xf0, 0xc8, 0xbf, 0x0f, 0x51, 0x31, 0x00, 0xfd, 0x0e,
+ 0x10, 0x20, 0x0f, 0x00,
+ 0x1c, 0x10, 0x1f, 0x0c, 0x30, 0x23, 0x8d, 0xfc, 0x11, 0x77, 0x21, 0x0f,
+ 0xdb, 0x0f, 0x30, 0x02,
+ 0x00, 0x0d, 0x0f, 0x1d, 0x30, 0x16, 0x21, 0x30, 0x61, 0x41, 0xf1, 0xbf,
+ 0xfc, 0x13, 0x47, 0x01,
+ 0xee, 0x40, 0x56, 0x00, 0xee, 0x11, 0x31, 0x00, 0x20, 0x65, 0x22, 0x00,
+ 0xbe, 0x0f, 0xf0, 0x02,
+ 0x00, 0x03, 0x00, 0xf0, 0x01, 0x01, 0x32, 0x42, 0x0f, 0x1f, 0x21, 0x0d,
+ 0x0c, 0x57, 0x57, 0x21,
+ 0x00, 0x00, 0x00, 0x0e, 0xc0, 0xd0, 0xff, 0x00, 0x21, 0xd3, 0xa2, 0x01,
+ 0xfc, 0x1f, 0x30, 0xce,
+ 0xed, 0x47, 0x35, 0xbf, 0xe0, 0x11, 0x00, 0xdd, 0xf0, 0x03, 0xd0, 0xcd,
+ 0x04, 0x34, 0x00, 0xc3,
+ 0x04, 0x01, 0xde, 0xee, 0x03, 0x43, 0xce, 0x8a, 0x04, 0xf3, 0xdb, 0xff,
+ 0x42, 0x45, 0xce, 0xdd,
+ 0x11, 0x45, 0x01, 0xde, 0xee, 0x01, 0x02, 0xe0, 0xad, 0x0f, 0x03, 0x01,
+ 0xdd, 0xfe, 0xf0, 0xdd,
+ 0x0e, 0x01, 0x00, 0xec, 0x0e, 0x3c, 0x4c, 0xdb, 0xee, 0x2c, 0xea, 0xbf,
+ 0x0d, 0x70, 0x10, 0x0c,
+ 0x0f, 0x0e, 0xff, 0x2e, 0x1f, 0x0f, 0x2f, 0xaa, 0xee, 0xee, 0x0f, 0x73,
+ 0x60, 0x08, 0xef, 0x00,
+ 0x00, 0x0d, 0xf0, 0x23, 0x42, 0x0f, 0x0c, 0xee, 0xfe, 0x00, 0x12, 0x22,
+ 0xe0, 0xeb, 0xff, 0xfe,
+ 0x24, 0x74, 0x2f, 0x40, 0x00, 0xdf, 0xd0, 0x00, 0x22, 0x76, 0x14, 0xf0,
+ 0xec, 0xef, 0x00, 0x02,
+ 0x13, 0x20, 0x22, 0x01, 0x75, 0x65, 0x00, 0x0e, 0x01, 0x10, 0x02, 0x13,
+ 0x00, 0xed, 0xf1, 0x02,
+ 0xeb, 0xff, 0x44, 0x12, 0x0f, 0xce, 0x14, 0x53, 0x24, 0x34, 0x30, 0x30,
+ 0x50, 0x50, 0x12, 0x10,
+ 0x0d, 0x02, 0x37, 0x0f, 0xc9, 0x11, 0x74, 0xfe, 0xcd, 0x10, 0x43, 0x00,
+ 0xdd, 0x00, 0x10, 0x0f,
+ 0xfb, 0x21, 0x52, 0x10, 0xf2, 0xdd, 0xff, 0x15, 0x42, 0x1e, 0xfd, 0x00,
+ 0x14, 0x64, 0x00, 0xed,
+ 0xdf, 0x12, 0x47, 0x00, 0xcf, 0xce, 0xf0, 0x21, 0x47, 0x44, 0x00, 0xdf,
+ 0xf0, 0x00, 0x22, 0x00,
+ 0xce, 0x01, 0x14, 0xdf, 0x01, 0x14, 0x00, 0x90, 0x01, 0xe0, 0xca, 0xff,
+ 0xe2, 0x05, 0x21, 0xc0,
+ 0xa0, 0x00, 0xf0, 0xee, 0xf0, 0xde, 0xed, 0x1d, 0x30, 0x01, 0x9e, 0xd8,
+ 0x0f, 0x10, 0x0d, 0xfa,
+ 0xe0, 0x20, 0x20, 0x10, 0x71, 0x00, 0x0d, 0xfc, 0xfe, 0x1e, 0x0d, 0xee,
+ 0xe0, 0x23, 0x22, 0x19,
+ 0x5e, 0x60, 0x00, 0xed, 0x00, 0x26, 0x1f, 0x0d, 0x12, 0x0f, 0x89, 0xdf,
+ 0x00, 0x44, 0x00, 0xed,
+ 0x00, 0x74, 0x12, 0x0e, 0xff, 0x11, 0x23, 0x22, 0x0d, 0xcc, 0xff, 0xf4,
+ 0xf1, 0xed, 0xff, 0x14,
+ 0x77, 0x02, 0xf0, 0x00, 0x11, 0x54, 0x10, 0x11, 0xf0, 0xf0, 0x01, 0x27,
+ 0x30, 0x61, 0x12, 0x0f,
+ 0xef, 0x0f, 0x00, 0xf0, 0xb0, 0x00, 0xf1, 0x07, 0x10, 0xdf, 0x10, 0x62,
+ 0x20, 0x0c, 0x0c, 0x20,
+ 0x10, 0x13, 0x13, 0x20, 0x4f, 0x41, 0x0f, 0xfd, 0xe0, 0xbe, 0xee, 0xe1,
+ 0xc8, 0xec, 0x22, 0x73,
+ 0x1d, 0xeb, 0xef, 0x0e, 0x00, 0x00, 0x01, 0x16, 0x62, 0x0f, 0xfd, 0xec,
+ 0x31, 0x32, 0xc0, 0xba,
+ 0xff, 0xe0, 0xe3, 0xf0, 0xf0, 0x34, 0x02, 0xae, 0xfc, 0x33, 0x46, 0xef,
+ 0xf0, 0x42, 0x04, 0xef,
+ 0x9d, 0xfe, 0x00, 0x01, 0x12, 0x01, 0xde, 0xf1, 0x07, 0x33, 0x40, 0xaf,
+ 0xdc, 0x00, 0x05, 0xf0,
+ 0xdd, 0xf2, 0x04, 0x20, 0xe0, 0xc2, 0xe0, 0xec, 0xbd, 0x00, 0x53, 0x02,
+ 0x0e, 0xd0, 0x02, 0x0d,
+ 0xea, 0x00, 0x1f, 0x0e, 0x0d, 0xe0, 0x0f, 0xfa, 0xdf, 0x30, 0x61, 0x0d,
+ 0xdb, 0xff, 0x20, 0x50,
+ 0x21, 0x13, 0x3c, 0x1e, 0x9d, 0xc8, 0x00, 0x30, 0x62, 0x00, 0xec, 0xfe,
+ 0x01, 0x01, 0x00, 0xed,
+ 0x30, 0x4f, 0x30, 0x0c, 0x20, 0x71, 0x20, 0xf8, 0xf0, 0xfe, 0xfd, 0xd0,
+ 0x32, 0x44, 0x0f, 0xed,
+ 0x10, 0x64, 0x21, 0x22, 0x11, 0x0e, 0xc9, 0x00, 0x75, 0x51, 0x00, 0xf1,
+ 0x00, 0x11, 0x10, 0x00,
+ 0x24, 0x44, 0x01, 0xef, 0xee, 0x0f, 0x11, 0xf2, 0xce, 0x00, 0x16, 0xf0,
+ 0xd0, 0x20, 0x70, 0x10,
+ 0x20, 0x30, 0x21, 0x05, 0x00, 0x10, 0x55, 0x24, 0x10, 0xee, 0xbd, 0x00,
+ 0xf0, 0xfc, 0xfb, 0xef,
+ 0x00, 0xf0, 0xde, 0x10, 0x74, 0x0d, 0xce, 0x05, 0xf2, 0xde, 0xdc, 0x00,
+ 0x01, 0x9d, 0xfb, 0x00,
+ 0x00, 0x01, 0xa1, 0xfe, 0xf4, 0x04, 0x23, 0x01, 0xee, 0xde, 0x01, 0x67,
+ 0x02, 0xfe, 0xf1, 0x14,
+ 0xef, 0xbb, 0x00, 0x10, 0x13, 0x00, 0xee, 0xd1, 0x04, 0x13, 0x02, 0xfe,
+ 0x1f, 0xd0, 0x8e, 0xbf,
+ 0x06, 0x13, 0xdf, 0xdc, 0xe0, 0x36, 0x12, 0xce, 0xcb, 0x00, 0x11, 0x00,
+ 0xfe, 0xff, 0x20, 0x51,
+ 0xdd, 0xb9, 0x0f, 0x1d, 0xff, 0x00, 0x00, 0x0d, 0xfe, 0x4f, 0x62, 0x0f,
+ 0xe9, 0x00, 0x51, 0xfc,
+ 0xce, 0x32, 0x42, 0x0f, 0x1f, 0x12, 0x00, 0x0a, 0xad, 0x10, 0x66, 0x00,
+ 0x00, 0x0f, 0x01, 0x01,
+ 0xf0, 0x01, 0x40, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x07, 0x56, 0x10, 0xf0,
+ 0xdf, 0x00, 0x22, 0x31,
+ 0xf0, 0x03, 0x00, 0x13, 0x02, 0x8e, 0x00, 0xf1, 0x00, 0x14, 0x37, 0x42,
+ 0x30, 0x24, 0x00, 0xd0,
+ 0x00, 0x76, 0x21, 0x11, 0x00, 0x01, 0xd1, 0xce, 0xf1, 0x13, 0x00, 0xae,
+ 0xff, 0x25, 0x34, 0x00,
+ 0x30, 0x61, 0x0d, 0x0f, 0x46, 0x21, 0xfe, 0x00, 0x66, 0x10, 0xeb, 0xe0,
+ 0x20, 0x44, 0xef, 0xdc,
+ 0x20, 0x31, 0xe0, 0xde, 0x00, 0x73, 0x20, 0xdb, 0xee, 0x00, 0x64, 0x00,
+ 0x0f, 0xfd, 0xf0, 0xfe,
+ 0x00, 0x20, 0x02, 0xf0, 0xf1, 0x10, 0x30, 0xf5, 0x02, 0x0c, 0xbd, 0xbc,
+ 0xde, 0xfe, 0x5f, 0x23,
+ 0x27, 0x03, 0xff, 0xee, 0x0f, 0xde, 0x10, 0x74, 0xfd, 0x89, 0x00, 0x02,
+ 0x10, 0x0f, 0xf0, 0xde,
+ 0xfd, 0xf0, 0xce, 0x03, 0x04, 0x13, 0xf4, 0xd3, 0x00, 0xbc, 0xfe, 0xcc,
+ 0xee, 0xed, 0x12, 0x53,
+ 0xe9, 0xbc, 0x00, 0x00, 0x00, 0x1d, 0x0d, 0xfe, 0x0e, 0x00, 0x31, 0x20,
+ 0x0b, 0xbc, 0xb9, 0x0f,
+ 0x10, 0x3f, 0xfe, 0xde, 0x00, 0x30, 0x75, 0x00, 0xf9, 0xf0, 0x11, 0x11,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0xce, 0xef, 0xfe, 0x00, 0x0f, 0xbe, 0x00, 0x31, 0x00, 0x77, 0x66, 0x00,
+ 0xff, 0x00, 0x21, 0x00,
+ 0xef, 0x0f, 0x01, 0xf0, 0xcc, 0x01, 0x57, 0x01, 0xef, 0xf0, 0x11, 0x43,
+ 0x21, 0x24, 0x52, 0x10,
+ 0x00, 0x11, 0x33, 0x23, 0x33, 0x24, 0xe0, 0xad, 0x00, 0x14, 0x36, 0xd0,
+ 0x90, 0x01, 0x03, 0x32,
+ 0xe0, 0x00, 0x53, 0x23, 0x25, 0x00, 0xdd, 0xe0, 0x23, 0x55, 0x10, 0x1e,
+ 0x1f, 0x35, 0x00, 0xce,
+ 0x12, 0x33, 0xe9, 0xae, 0xff, 0x02, 0x20, 0x2c, 0xf0, 0x01, 0xf0, 0xbd,
+ 0x0e, 0x01, 0x24, 0x12,
+ 0xdc, 0xff, 0x20, 0x30, 0x32, 0xdd, 0x88, 0xae, 0x02, 0x04, 0xfc, 0xef,
+ 0x02, 0x21, 0xf0, 0xdf,
+ 0x32, 0x14, 0x03, 0x21, 0xe2, 0x54, 0x11, 0xdd, 0xbc, 0xf0, 0xda, 0xce,
+ 0x00, 0x04, 0xc0, 0x00,
+ 0x22, 0x20, 0xe0, 0x91, 0xf3, 0xcf, 0xed, 0xd1, 0x16, 0x00, 0xc0, 0xcd,
+ 0xef, 0xff, 0xda, 0xbd,
+ 0x10, 0x03, 0x00, 0xf0, 0xfe, 0xdb, 0xee, 0x11, 0x00, 0x9c, 0x0e, 0x2e,
+ 0xc8, 0xbc, 0xf0, 0x0f,
+ 0x30, 0x30, 0x1e, 0xfc, 0xef, 0x41, 0x13, 0x02, 0xff, 0x0d, 0x0c, 0xfe,
+ 0xbd, 0xed, 0x40, 0x6e,
+ 0x0b, 0xfd, 0x00, 0x11, 0x0c, 0x0e, 0x20, 0x75, 0x0e, 0xf8, 0x00, 0x32,
+ 0x40, 0x00, 0xee, 0x1f,
+ 0x0e, 0x0d, 0x01, 0x43, 0x0f, 0xcc, 0x15, 0x42, 0x0f, 0x0f, 0x76, 0x00,
+ 0x00, 0x11, 0x21, 0x20,
+ 0x21, 0x21, 0x12, 0x21, 0x10, 0x13, 0x10, 0x33, 0x77, 0x14, 0x00, 0x01,
+ 0x01, 0x43, 0x00, 0xe0,
+ 0x0f, 0x23, 0x05, 0xcf, 0x00, 0x63, 0x00, 0x0e, 0x01, 0x77, 0x26, 0xfe,
+ 0xef, 0x52, 0x45, 0x10,
+ 0xf0, 0x00, 0xe1, 0x00, 0xee, 0x00, 0x52, 0xef, 0xdb, 0x00, 0x44, 0x01,
+ 0xef, 0x02, 0x45, 0x20,
+ 0xd0, 0xef, 0xe0, 0xbe, 0xf0, 0xff, 0x11, 0x0f, 0x8c, 0x01, 0x07, 0x00,
+ 0xff, 0x02, 0x13, 0x0f,
+ 0xff, 0x04, 0x01, 0x0f, 0x13, 0x53, 0xdf, 0xb8, 0xff, 0x00, 0x02, 0xf0,
+ 0xde, 0xde, 0x12, 0x56,
+ 0xf0, 0xc0, 0x0f, 0x20, 0xf1, 0xa0, 0xe0, 0x00, 0x25, 0x00, 0xbb, 0xf0,
+ 0x01, 0x14, 0xde, 0x9c,
+ 0x00, 0x01, 0x00, 0x00, 0x1e, 0x20, 0x00, 0xff, 0xdb, 0xf1, 0xff, 0xa8,
+ 0x0f, 0x20, 0x00, 0xef,
+ 0x0f, 0x2f, 0x0c, 0x20, 0x70, 0xfd, 0xdd, 0xf0, 0x00, 0x61, 0x20, 0x0f,
+ 0x00, 0x00, 0xe8, 0xcc,
+ 0x0e, 0x71, 0x13, 0x00, 0x00, 0x0f, 0x00, 0x21, 0x00, 0xe9, 0xef, 0x00,
+ 0x00, 0x0e, 0x22, 0x35,
+ 0xde, 0x0e, 0x71, 0x22, 0xf0, 0xfd, 0x02, 0xf2, 0xf5, 0x12, 0x0f, 0xff,
+ 0xd1, 0x0e, 0x3a, 0x71,
+ 0x62, 0x01, 0x45, 0x13, 0x12, 0xff, 0x00, 0x36, 0x41, 0xf0, 0xff, 0x30,
+ 0x66, 0xf0, 0xb0, 0x00,
+ 0x10, 0x00, 0xee, 0xf0, 0x01, 0x13, 0x34, 0x12, 0x2f, 0x21, 0x77, 0x30,
+ 0xf0, 0xfe, 0x53, 0x45,
+ 0x1e, 0xff, 0xf0, 0x00, 0x00, 0x02, 0x0f, 0x0e, 0x11, 0x41, 0x00, 0x01,
+ 0x57, 0x10, 0xfc, 0xe0,
+ 0x11, 0x75, 0x10, 0xfe, 0xdd, 0x01, 0x11, 0x1e, 0xeb, 0x02, 0x65, 0x00,
+ 0xdd, 0xf0, 0x11, 0x64,
+ 0x10, 0x01, 0xee, 0xce, 0xfd, 0x02, 0x27, 0x00, 0xf0, 0x22, 0x73, 0x0f,
+ 0xfe, 0x03, 0x30, 0xff,
+ 0xce, 0x03, 0x04, 0xec, 0xef, 0x16, 0x52, 0x01, 0xaf, 0xee, 0xf3, 0xf4,
+ 0xe1, 0xf2, 0xe3, 0xec,
+ 0xcc, 0x13, 0x21, 0xec, 0xbd, 0x01, 0x00, 0xbc, 0x0f, 0x02, 0x00, 0xf9,
+ 0xae, 0xfc, 0x00, 0x12,
+ 0xee, 0xdd, 0x20, 0x30, 0x2a, 0x2f, 0x0d, 0xad, 0x0e, 0x11, 0x0f, 0x0c,
+ 0x00, 0x11, 0x1c, 0xdd,
+ 0xcf, 0xfd, 0x0e, 0x74, 0x42, 0x0e, 0xda, 0xfd, 0x0e, 0x33, 0x0f, 0xda,
+ 0xde, 0x0f, 0x20, 0x30,
+ 0x74, 0x31, 0xec, 0x00, 0x65, 0x22, 0xee, 0xde, 0x01, 0x03, 0xac, 0xfe,
+ 0xff, 0x32, 0x10, 0xed,
+ 0xed, 0x55, 0x33, 0x13, 0x25, 0x44, 0x11, 0x1f, 0xff, 0xbf, 0x00, 0x14,
+ 0x32, 0x20, 0xd0, 0xae,
+ 0x14, 0x15, 0x01, 0xf0, 0xde, 0x00, 0x00, 0xe0, 0xf0, 0x57, 0x63, 0x00,
+ 0x0c, 0xef, 0x00, 0x30,
+ 0x00, 0x0c, 0x50, 0x26, 0xf0, 0xce, 0x11, 0x54, 0x0f, 0xcb, 0xdf, 0x00,
+ 0x20, 0x1e, 0x0f, 0x0f,
+ 0x00, 0x62, 0x0f, 0xfd, 0xed, 0x0e, 0x03, 0x16, 0x0f, 0xeb, 0x12, 0x51,
+ 0x0f, 0xdd, 0xce, 0x21,
+ 0x00, 0x00, 0xe7, 0xd0, 0xbf, 0xff, 0xd0, 0xf1, 0x34, 0x40, 0x00, 0x54,
+ 0x36, 0xef, 0xce, 0x00,
+ 0xf2, 0xf0, 0xed, 0xee, 0xbe, 0x00, 0x17, 0x01, 0xad, 0x01, 0x06, 0x00,
+ 0xb1, 0x00, 0x00, 0xd2,
+ 0xc0, 0xe0, 0x02, 0xd0, 0xcc, 0xf0, 0x02, 0xd2, 0x9d, 0x03, 0x37, 0xf0,
+ 0xbf, 0x10, 0x12, 0xff,
+ 0xcc, 0x02, 0x40, 0xff, 0xdb, 0xfe, 0x0f, 0x2d, 0xed, 0xca, 0x00, 0x31,
+ 0x22, 0x00, 0x43, 0x35,
+ 0x0f, 0xbc, 0xce, 0x0d, 0x00, 0x20, 0x50, 0x0f, 0xc9, 0x20, 0x30, 0x0e,
+ 0xe0, 0x41, 0x53, 0x20,
+ 0x0d, 0x0d, 0xf1, 0x01, 0x22, 0x42, 0x1d, 0xe8, 0xeb, 0x10, 0x00, 0xde,
+ 0x00, 0x73, 0x1d, 0x30,
+ 0x47, 0x40, 0x0f, 0xff, 0x31, 0x75, 0x31, 0x0f, 0xe0, 0x20, 0x31, 0xef,
+ 0xfe, 0x23, 0x33, 0x31,
+ 0x44, 0x05, 0xd0, 0x01, 0x12, 0x00, 0xe1, 0xe0, 0x75, 0x41, 0xef, 0x01,
+ 0x23, 0x20, 0x11, 0x23,
+ 0x03, 0x00, 0x30, 0x50, 0x44, 0x77, 0x07, 0x00, 0x00, 0x32, 0xff, 0xce,
+ 0x00, 0x20, 0x00, 0xcd,
+ 0x0d, 0x0e, 0x00, 0xf5, 0x22, 0x22, 0x9e, 0xff, 0x03, 0x24, 0xdf, 0xba,
+ 0x0f, 0x00, 0xed, 0xac,
+ 0xec, 0xef, 0x01, 0x57, 0x12, 0xf0, 0xdf, 0x22, 0x04, 0xe0, 0xe0, 0x00,
+ 0x12, 0x00, 0xf0, 0x00,
+ 0xfb, 0xe0, 0xf0, 0x8f, 0xfd, 0x01, 0x13, 0x0f, 0xc0, 0xf7, 0x43, 0x22,
+ 0xe0, 0xb0, 0xc1, 0xf2,
+ 0xdc, 0xfd, 0x22, 0x26, 0xae, 0xee, 0xe0, 0x24, 0x22, 0xaa, 0xde, 0x01,
+ 0x44, 0x00, 0xff, 0xe0,
+ 0xfd, 0xce, 0x00, 0x0e, 0xe8, 0xf0, 0x1f, 0x31, 0x0f, 0xad, 0x20, 0x42,
+ 0xfc, 0xce, 0x0f, 0x20,
+ 0x60, 0x13, 0x00, 0xeb, 0xed, 0x0d, 0x00, 0x0f, 0x0e, 0x32, 0x42, 0xfc,
+ 0x00, 0x75, 0x21, 0x1d,
+ 0x0e, 0x03, 0x33, 0xd8, 0xff, 0x11, 0x22, 0xf0, 0xf0, 0x20, 0x10, 0xb1,
+ 0xb0, 0x01, 0x37, 0x35,
+ 0x10, 0x3f, 0xe0, 0x8f, 0x0c, 0x13, 0x42, 0x0e, 0xf0, 0x26, 0x62, 0x00,
+ 0xfe, 0xff, 0x03, 0x22,
+ 0xee, 0x01, 0x77, 0x05, 0xef, 0xff, 0x00, 0x00, 0x00, 0x10, 0xf0, 0xff,
+ 0xf0, 0x12, 0x52, 0x0f,
+ 0x01, 0x43, 0x00, 0x0e, 0x02, 0x67, 0x21, 0xed, 0xfd, 0x11, 0x56, 0x00,
+ 0x0d, 0xdd, 0x0f, 0xf0,
+ 0x0f, 0x1e, 0x03, 0x47, 0x12, 0xfd, 0x0d, 0xe0, 0x51, 0x33, 0xda, 0xbe,
+ 0x0f, 0x20, 0xfb, 0xd0,
+ 0x00, 0x20, 0x30, 0x3d, 0x00, 0xc0, 0xf2, 0x01, 0x02, 0xcf, 0x88, 0xbe,
+ 0x0e, 0xfe, 0x00, 0x21,
+ 0x10, 0x0d, 0xfe, 0x02, 0x77, 0x32, 0x00, 0xcc, 0xdc, 0x00, 0x05, 0x01,
+ 0x1a, 0x00, 0x3c, 0x00,
+ 0x9b, 0xf9, 0xd1, 0xe7, 0x2e, 0xfb, 0x7d, 0xe8, 0x9c, 0x01, 0xe7, 0x80,
+ 0xe0, 0xd0, 0x00, 0x06,
+ 0x01, 0xcd, 0xef, 0x12, 0xf0, 0x9d, 0xff, 0xd2, 0xec, 0xed, 0x13, 0x36,
+ 0xed, 0xdd, 0xd0, 0xe1,
+ 0xa0, 0xda, 0xdf, 0xf0, 0x03, 0x11, 0x11, 0x14, 0xfe, 0xfa, 0x71, 0x01,
+ 0xcf, 0x00, 0x34, 0x44,
+ 0xde, 0xad, 0x01, 0x03, 0x26, 0x0f, 0xde, 0x0f, 0x01, 0x40, 0x21, 0x53,
+ 0x10, 0x3f, 0x2f, 0xfe,
+ 0xc8, 0xcf, 0x12, 0x34, 0xe0, 0x00, 0x42, 0x01, 0x30, 0x22, 0xf1, 0xf0,
+ 0x0b, 0xce, 0xfd, 0x50,
+ 0x50, 0xff, 0xfe, 0xec, 0x00, 0x77, 0x44, 0x10, 0x33, 0x22, 0x0d, 0x0b,
+ 0x00, 0xff, 0x22, 0x40,
+ 0xec, 0xe0, 0x00, 0x01, 0xf0, 0xfc, 0x41, 0x32, 0x3f, 0x0d, 0xeb, 0xae,
+ 0x00, 0x77, 0x32, 0xb9,
+ 0x00, 0x10, 0x32, 0x0f, 0xfd, 0x21, 0x64, 0x00, 0x0e, 0x01, 0x31, 0x00,
+ 0xbc, 0x00, 0x00, 0x10,
+ 0x00, 0x12, 0x23, 0x0c, 0xec, 0xf0, 0x11, 0x52, 0x03, 0xf0, 0xff, 0x20,
+ 0x34, 0x13, 0xeb, 0xcc,
+ 0x00, 0x10, 0x45, 0x01, 0x00, 0xe1, 0x04, 0xdf, 0x8d, 0xc0, 0x13, 0xf0,
+ 0xcd, 0x00, 0x27, 0x52,
+ 0x10, 0x01, 0x0e, 0x0b, 0x10, 0x1d, 0xce, 0xd0, 0xd3, 0x02, 0x0f, 0x10,
+ 0x01, 0xd2, 0x9e, 0xe0,
+ 0x17, 0x27, 0xcd, 0xbf, 0x00, 0xe1, 0xd0, 0xcf, 0xcd, 0xdd, 0xdd, 0x02,
+ 0x77, 0x00, 0xef, 0xd0,
+ 0x00, 0x0f, 0xcd, 0xee, 0x03, 0x23, 0xed, 0x88, 0xfd, 0x23, 0x25, 0x00,
+ 0xdd, 0xff, 0x01, 0x23,
+ 0xf1, 0x15, 0x52, 0xf0, 0xdf, 0x0f, 0xff, 0xf1, 0x01, 0x2d, 0x2d, 0x0f,
+ 0x4e, 0x74, 0x11, 0x0d,
+ 0x22, 0x47, 0x25, 0x0e, 0x0e, 0x00, 0x10, 0x72, 0x0e, 0xfc, 0x14, 0x11,
+ 0xec, 0xbe, 0x22, 0x36,
+ 0x0f, 0x0f, 0x11, 0x64, 0x20, 0x0d, 0x01, 0x14, 0x50, 0x1d, 0x30, 0x32,
+ 0x01, 0x0c, 0xfe, 0xf0,
+ 0xff, 0xee, 0x37, 0x52, 0x00, 0x10, 0x31, 0x2f, 0x3c, 0x21, 0xf2, 0xac,
+ 0x0d, 0x00, 0xf1, 0x10,
+ 0x2c, 0x2e, 0x43, 0x44, 0x0c, 0xdb, 0xff, 0x21, 0x75, 0x72, 0x40, 0xdd,
+ 0x0f, 0x00, 0x01, 0x0e,
+ 0x0c, 0xd0, 0x02, 0x32, 0xff, 0xba, 0x00, 0x24, 0xf0, 0xe0, 0xf1, 0xcd,
+ 0xfd, 0x27, 0x42, 0xf0,
+ 0xaa, 0x00, 0x12, 0xef, 0xcd, 0x01, 0x34, 0xd0, 0xd0, 0x12, 0x13, 0xae,
+ 0xdb, 0xf0, 0x01, 0x11,
+ 0xff, 0xdc, 0x00, 0x34, 0x00, 0x2e, 0xce, 0xb0, 0xe0, 0x90, 0xec, 0x12,
+ 0x37, 0x12, 0xef, 0xde,
+ 0xb0, 0x02, 0x12, 0x00, 0xcb, 0x00, 0x13, 0xf1, 0x8b, 0xef, 0x00, 0x02,
+ 0x00, 0xf0, 0xfc, 0xd0,
+ 0x05, 0x22, 0x0f, 0xbc, 0xd0, 0x00, 0xdf, 0xec, 0xd0, 0x10, 0x20, 0x00,
+ 0x66, 0x31, 0x0f, 0xdc,
+ 0xa0, 0x00, 0x13, 0x01, 0xf1, 0x22, 0x00, 0xe0, 0xec, 0xcf, 0xdc, 0xf0,
+ 0x57, 0x20, 0x00, 0x52,
+ 0x33, 0x00, 0x0e, 0x00, 0x01, 0x42, 0x11, 0xc8, 0xcf, 0x10, 0x22, 0x11,
+ 0x00, 0xfe, 0xf0, 0xc0,
+ 0xf1, 0xf0, 0x00, 0x67, 0x35, 0xfc, 0xe0, 0x1f, 0x20, 0x4e, 0x40, 0x11,
+ 0x43, 0x51, 0x0f, 0x0e,
+ 0x21, 0x23, 0x0e, 0xed, 0x00, 0x20, 0x46, 0xef, 0xcd, 0x10, 0x74, 0x14,
+ 0xe9, 0xcf, 0x20, 0x23,
+ 0x0f, 0xdd, 0x10, 0x71, 0x14, 0x0d, 0x0e, 0x11, 0x56, 0x00, 0x0e, 0x1f,
+ 0x00, 0x10, 0x52, 0x00,
+ 0x0a, 0x00, 0xf0, 0x10, 0x00, 0x23, 0x52, 0x00, 0x08, 0xe0, 0x31, 0x43,
+ 0xfe, 0xdd, 0x00, 0x23,
+ 0x1e, 0xfa, 0xbf, 0x01, 0x32, 0x21, 0x13, 0x00, 0xcf, 0x13, 0x77, 0x20,
+ 0x00, 0x0e, 0x0f, 0xee,
+ 0xce, 0xd0, 0x10, 0x72, 0x23, 0xd0, 0xf0, 0x57, 0x43, 0x0f, 0xdc, 0x0f,
+ 0xfc, 0x00, 0x24, 0xef,
+ 0xee, 0xf0, 0xe0, 0xee, 0xcd, 0x12, 0x47, 0xf0, 0xcf, 0x13, 0x0f, 0x9a,
+ 0xc0, 0x01, 0x13, 0xff,
+ 0xbc, 0x01, 0x02, 0xf0, 0xce, 0xff, 0x12, 0x1f, 0xd8, 0xdf, 0xd0, 0xde,
+ 0xf1, 0x77, 0x41, 0xef,
+ 0xce, 0x10, 0x01, 0x00, 0xff, 0x00, 0x44, 0x00, 0xdd, 0x00, 0x15, 0xff,
+ 0x90, 0x01, 0x21, 0x1f,
+ 0x0f, 0x32, 0x35, 0x00, 0x00, 0x5f, 0x0d, 0x10, 0x00, 0x00, 0x0c, 0xf1,
+ 0x07, 0x00, 0x11, 0xf1,
+ 0xa0, 0x1e, 0x70, 0x01, 0x00, 0x00, 0x2f, 0x2f, 0x2f, 0x0a, 0xee, 0x00,
+ 0x1f, 0x0e, 0x01, 0x77,
+ 0x77, 0x01, 0x0e, 0xdd, 0x00, 0x20, 0x03, 0x0f, 0xdc, 0x11, 0x33, 0x00,
+ 0x0e, 0x3f, 0xcd, 0x23,
+ 0x77, 0x10, 0xdb, 0x00, 0x00, 0x10, 0x10, 0x01, 0x0f, 0xae, 0xfe, 0x01,
+ 0x63, 0x10, 0x00, 0x0d,
+ 0x32, 0x45, 0xff, 0xfd, 0xff, 0x33, 0x26, 0xf0, 0xcc, 0xff, 0x10, 0x10,
+ 0xdd, 0xca, 0x00, 0x34,
+ 0x20, 0x20, 0x73, 0x44, 0xee, 0x0d, 0x00, 0xe4, 0x01, 0x01, 0x10, 0x13,
+ 0xf0, 0xa9, 0xf0, 0x20,
+ 0x32, 0xbd, 0xed, 0x03, 0xf1, 0xd2, 0x37, 0x72, 0x1f, 0xfd, 0x00, 0x01,
+ 0xfd, 0xca, 0x00, 0x42,
+ 0xf0, 0x8c, 0x00, 0x02, 0x02, 0xe1, 0x01, 0x10, 0xf0, 0xd1, 0x25, 0x1e,
+ 0xcb, 0xd0, 0x12, 0x01,
+ 0x8b, 0xef, 0x00, 0x02, 0xe0, 0xf2, 0xf2, 0x00, 0xdc, 0xff, 0xec, 0x00,
+ 0xef, 0xbf, 0xcd, 0xfe,
+ 0x26, 0x43, 0xf0, 0xce, 0x0e, 0x0e, 0xe0, 0xdd, 0x00, 0x37, 0x77, 0xf0,
+ 0xcc, 0x11, 0x02, 0xe0,
+ 0xdf, 0x0d, 0x00, 0x74, 0x0f, 0x0c, 0x00, 0x24, 0x31, 0x42, 0x1f, 0xec,
+ 0xef, 0x12, 0x33, 0xf0,
+ 0xc1, 0x20, 0x2f, 0xd9, 0xa0, 0x10, 0x52, 0x00, 0x10, 0x10, 0x67, 0x00,
+ 0x0e, 0x01, 0x34, 0x10,
+ 0x0b, 0x20, 0x73, 0x00, 0x00, 0x10, 0x0c, 0xf0, 0x0f, 0xf0, 0xfe, 0x23,
+ 0x56, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x53, 0x2e, 0xfa, 0xcf, 0x00, 0x30, 0x10, 0x00, 0x0f, 0x2f,
+ 0x13, 0xcf, 0xdc, 0x30,
+ 0x76, 0x61, 0x01, 0xfe, 0xfd, 0xff, 0x02, 0x12, 0xfe, 0xff, 0xea, 0xef,
+ 0x22, 0x41, 0xfe, 0xf0,
+ 0x01, 0x13, 0xec, 0xc0, 0x17, 0xe0, 0x9b, 0x11, 0x24, 0xce, 0xbe, 0xf0,
+ 0x01, 0x02, 0xef, 0x00,
+ 0x14, 0x34, 0xce, 0xbd, 0x00, 0x24, 0x12, 0xf0, 0x98, 0x00, 0x01, 0x21,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0xe0, 0xde, 0x00, 0xe3, 0xf2, 0xe0, 0x0f, 0x0e, 0xd1, 0x16, 0x31, 0xd0,
+ 0x9f, 0xf0, 0x10, 0xf0,
+ 0x8a, 0xde, 0x01, 0x02, 0xff, 0xee, 0x06, 0xf0, 0xae, 0xed, 0x03, 0x42,
+ 0xf8, 0x9d, 0x00, 0xf1,
+ 0x02, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x22, 0x00, 0x06, 0x34,
+ 0xff, 0xcd, 0x03, 0x31,
+ 0x8b, 0xec, 0x01, 0x43, 0x00, 0x14, 0x52, 0x12, 0x20, 0x0c, 0x00, 0x10,
+ 0x36, 0x20, 0xfe, 0xdd,
+ 0xd0, 0x0f, 0x24, 0x11, 0xec, 0xef, 0xe1, 0xbf, 0x0f, 0x77, 0x73, 0x1e,
+ 0x0d, 0x00, 0x02, 0x10,
+ 0x0c, 0xed, 0x10, 0x45, 0x10, 0x00, 0x11, 0x20, 0x01, 0x53, 0x10, 0xf8,
+ 0xbf, 0x02, 0x11, 0x0f,
+ 0xde, 0x53, 0x44, 0x0e, 0xec, 0x00, 0x2e, 0x1d, 0xfe, 0x13, 0x67, 0x02,
+ 0xcc, 0x0f, 0x20, 0x13,
+ 0x1e, 0x0f, 0x2e, 0x33, 0x11, 0x00, 0x20, 0x42, 0x25, 0x10, 0xdb, 0x8f,
+ 0x00, 0x21, 0x20, 0x1f,
+ 0x0f, 0x00, 0x64, 0x00, 0xec, 0x10, 0x10, 0x1e, 0x22, 0xed, 0xcc, 0xf0,
+ 0x27, 0x25, 0xcd, 0x0f,
+ 0x51, 0x24, 0x00, 0x01, 0xce, 0xdd, 0x0e, 0xf1, 0xd1, 0x11, 0x1e, 0x8c,
+ 0x03, 0x27, 0x50, 0x10,
+ 0x00, 0x02, 0x00, 0x0c, 0xaf, 0x0f, 0x02, 0x17, 0x00, 0xee, 0xdd, 0xd0,
+ 0x02, 0xf0, 0x01, 0xf5,
+ 0x51, 0x12, 0xad, 0xda, 0xd0, 0xf0, 0x01, 0x02, 0xc0, 0xdd, 0xdf, 0x02,
+ 0x36, 0x3f, 0x0d, 0x8e,
+ 0xdd, 0xfe, 0xe0, 0x06, 0x01, 0x10, 0x00, 0x00, 0xff, 0xdf, 0xfe, 0x02,
+ 0x01, 0xab, 0x00, 0xf3,
+ 0x02, 0x10, 0xcd, 0xc0, 0xed, 0x30, 0x77, 0x47, 0xf0, 0xff, 0x11, 0x63,
+ 0x00, 0x0c, 0x00, 0x1f,
+ 0xed, 0xd0, 0x05, 0x32, 0x00, 0xef, 0xbe, 0xf0, 0x00, 0x55, 0x21, 0x1f,
+ 0x0d, 0x0f, 0x50, 0x25,
+ 0x0f, 0xfb, 0xf0, 0x40, 0x01, 0x0f, 0x20, 0x55, 0x11, 0x00, 0xf0, 0x3f,
+ 0x0d, 0x8d, 0x03, 0x06,
+ 0x20, 0x0e, 0x10, 0x21, 0x10, 0x24, 0x32, 0x0b, 0xcd, 0xff, 0x20, 0x40,
+ 0xfe, 0xe0, 0x31, 0x0d,
+ 0xfa, 0x9e, 0x10, 0x74, 0x23, 0x01, 0x00, 0x1e, 0x00, 0x20, 0x01, 0xe1,
+ 0xff, 0xfc, 0xfe, 0x1e,
+ 0x75, 0x45, 0x0c, 0xfc, 0x00, 0x10, 0x00, 0xed, 0xf2, 0x23, 0x63, 0x12,
+ 0x0b, 0xf0, 0x16, 0x00,
+ 0xb0, 0x00, 0x14, 0x0f, 0xae, 0x01, 0xf1, 0x00, 0x43, 0x00, 0xdd, 0xda,
+ 0xc0, 0x03, 0x76, 0x0f,
+ 0xfe, 0x01, 0x55, 0x0f, 0xcc, 0x0f, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0,
+ 0x0f, 0x11, 0x04, 0x01,
+ 0xe0, 0xde, 0xee, 0xbf, 0xe0, 0xd7, 0xe0, 0xbe, 0xf0, 0xde, 0xee, 0xbc,
+ 0x02, 0x07, 0x01, 0x00,
+ 0xbc, 0xcd, 0x02, 0x13, 0xee, 0x9b, 0x00, 0x00, 0xf0, 0x01, 0xf1, 0x03,
+ 0x11, 0xee, 0xcb, 0x01,
+ 0x15, 0x21, 0xef, 0xad, 0x01, 0x13, 0x22, 0xec, 0x0f, 0x21, 0x33, 0x1e,
+ 0x0a, 0x30, 0xf0, 0x01,
+ 0x62, 0x40, 0x00, 0x01, 0x04, 0x12, 0x23, 0x25, 0x1e, 0x0a, 0x9e, 0xf0,
+ 0x32, 0x42, 0xff, 0x0f,
+ 0x74, 0x24, 0x30, 0x0f, 0x1d, 0x10, 0x30, 0x0f, 0x1c, 0x12, 0x77, 0x56,
+ 0xfe, 0x0d, 0x00, 0x01,
+ 0xfe, 0x0f, 0x13, 0x02, 0x10, 0x11, 0x53, 0x00, 0xed, 0x1b, 0x51, 0x15,
+ 0x0e, 0xfd, 0x0e, 0x01,
+ 0x63, 0xfa, 0x00, 0x43, 0xfd, 0xfd, 0x13, 0x76, 0x0e, 0xee, 0x04, 0x22,
+ 0xff, 0xfb, 0xf0, 0x21,
+ 0x00, 0xee, 0xff, 0x20, 0x10, 0x00, 0xf3, 0x0e, 0xbb, 0x21, 0x64, 0x00,
+ 0xcc, 0x00, 0x03, 0x31,
+ 0x02, 0x9c, 0x0f, 0x00, 0xf1, 0xef, 0x00, 0x04, 0x01, 0xf1, 0xef, 0xf0,
+ 0x04, 0x24, 0x0f, 0xbc,
+ 0x0e, 0xf0, 0xe1, 0xed, 0x0e, 0x54, 0xfe, 0xa8, 0x00, 0x01, 0x16, 0x0f,
+ 0xde, 0x0f, 0x02, 0xe3,
+ 0xf0, 0xcf, 0xe0, 0xf3, 0x20, 0x11, 0x8d, 0xcb, 0x01, 0xe2, 0x01, 0x00,
+ 0xbf, 0xff, 0x00, 0xf1,
+ 0xc0, 0x00, 0x47, 0x0e, 0xb8, 0xee, 0x00, 0x02, 0x01, 0x00, 0x12, 0x0e,
+ 0xde, 0x20, 0x22, 0xf1,
+ 0xb0, 0xed, 0xdf, 0xef, 0x17, 0x11, 0xbc, 0xce, 0x00, 0x02, 0x42, 0x02,
+ 0x20, 0x0e, 0x11, 0x77,
+ 0x11, 0x12, 0x3e, 0x0e, 0x23, 0x00, 0xde, 0x24, 0x17, 0x8e, 0xed, 0x01,
+ 0x33, 0xe0, 0xaa, 0x00,
+ 0x20, 0x35, 0x41, 0x10, 0x11, 0x0f, 0x0e, 0x00, 0x5e, 0x0e, 0x0e, 0xf0,
+ 0x04, 0x20, 0x2c, 0x11,
+ 0x20, 0x10, 0x21, 0x47, 0x10, 0xfd, 0xd0, 0x24, 0x64, 0x20, 0xdb, 0xf0,
+ 0x51, 0x10, 0xdb, 0xff,
+ 0x70, 0x54, 0x00, 0x00, 0xdc, 0x00, 0x32, 0x11, 0x20, 0x00, 0x10, 0x20,
+ 0x0d, 0x00, 0x47, 0x20,
+ 0xee, 0x0e, 0x00, 0x11, 0x61, 0x21, 0x40, 0x00, 0xff, 0xdc, 0x43, 0x50,
+ 0xfa, 0xfe, 0x30, 0x40,
+ 0xfb, 0xf1, 0x15, 0xef, 0xad, 0x01, 0x24, 0x30, 0xd0, 0xe0, 0x33, 0x63,
+ 0x1f, 0xc9, 0xef, 0x11,
+ 0x10, 0xe0, 0xf0, 0xe1, 0xf1, 0xf0, 0x63, 0x22, 0x0e, 0x10, 0x00, 0x0d,
+ 0x00, 0x23, 0x44, 0x30,
+ 0x0d, 0xa8, 0xed, 0xef, 0xf0, 0xdf, 0x15, 0x65, 0xde, 0xbd, 0xf0, 0x04,
+ 0xf0, 0xff, 0xe1, 0xed,
+ 0xdf, 0xd0, 0xd2, 0x03, 0x55, 0x00, 0x0a, 0xdf, 0xbd, 0x00, 0x14, 0x00,
+ 0xbc, 0xe0, 0x05, 0xef,
+ 0xbe, 0xf1, 0xf1, 0xf0, 0x0e, 0x11, 0xe2, 0x8c, 0x0e, 0x03, 0x16, 0x00,
+ 0xff, 0x32, 0x13, 0x01,
+ 0xff, 0x21, 0xfb, 0x30, 0x77, 0x1d, 0x00, 0x21, 0x9d, 0x02, 0x00, 0x00,
+ 0x26, 0xfe, 0xae, 0x0f,
+ 0x02, 0x13, 0x20, 0x10, 0x21, 0x0f, 0x10, 0x0e, 0x21, 0x20, 0x0e, 0xbc,
+ 0xca, 0x13, 0x77, 0x00,
+ 0xfd, 0xf0, 0x10, 0x30, 0x03, 0xf1, 0xfd, 0xf0, 0x05, 0x00, 0xde, 0xdf,
+ 0x32, 0x64, 0x0c, 0xfe,
+ 0x0f, 0x3f, 0x00, 0x10, 0x33, 0x51, 0xfa, 0xdd, 0xdf, 0x21, 0x51, 0x10,
+ 0x00, 0xf3, 0x36, 0x71,
+ 0x0e, 0xfd, 0x00, 0x24, 0x0e, 0xcc, 0x00, 0x63, 0x01, 0xfb, 0xf0, 0x10,
+ 0x3f, 0xfe, 0xff, 0xfd,
+ 0x0f, 0x77, 0x45, 0x00, 0x00, 0xdf, 0x00, 0x13, 0x21, 0x0d, 0xd0, 0x03,
+ 0x0f, 0xdd, 0x43, 0x22,
+ 0x20, 0x46, 0x9c, 0xff, 0x00, 0xdd, 0xe1, 0x17, 0x61, 0xf0, 0xfc, 0x11,
+ 0x10, 0xbb, 0x00, 0x02,
+ 0x1f, 0x0e, 0x35, 0x12, 0x8f, 0xfe, 0x14, 0x31, 0xef, 0xcb, 0xf0, 0x01,
+ 0x13, 0xd0, 0xed, 0xe0,
+ 0x90, 0xec, 0x01, 0xe0, 0xe1, 0x05, 0x10, 0xee, 0xfd, 0x00, 0x32, 0xe0,
+ 0x9a, 0xff, 0x00, 0xd0,
+ 0xdb, 0x01, 0x04, 0x32, 0x9e, 0xda, 0xf0, 0x13, 0x20, 0xd0, 0xbd, 0x01,
+ 0x01, 0x01, 0x02, 0x52,
+ 0x11, 0x00, 0xe9, 0x0e, 0x10, 0x44, 0x31, 0x0d, 0xde, 0x00, 0x65, 0x32,
+ 0xff, 0xdf, 0x44, 0x41,
+ 0xed, 0xbc, 0x00, 0x0f, 0x20, 0x43, 0x14, 0x10, 0x12, 0x55, 0x10, 0x0c,
+ 0x11, 0x32, 0x1d, 0x2f,
+ 0x42, 0x42, 0x0e, 0xf9, 0x00, 0x75, 0x10, 0x0d, 0xf0, 0x02, 0x33, 0x00,
+ 0xff, 0xe0, 0x20, 0x4f,
+ 0x0d, 0x22, 0x1d, 0x2b, 0x51, 0x04, 0x10, 0x10, 0x1c, 0xff, 0x40, 0x0e,
+ 0xea, 0x01, 0x77, 0x70,
+ 0xf0, 0xfe, 0x00, 0x10, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x66, 0xda, 0xbd,
+ 0x67, 0x00, 0xfe, 0x00,
+ 0x02, 0x0f, 0xfd, 0x03, 0x44, 0xed, 0xef, 0x00, 0x03, 0x20, 0xed, 0xff,
+ 0xf1, 0xf2, 0x00, 0xef,
+ 0xef, 0x00, 0x35, 0x31, 0x23, 0x8b, 0xef, 0x01, 0x01, 0x00, 0x0f, 0xdd,
+ 0x01, 0x34, 0xbd, 0xdc,
+ 0x03, 0x32, 0x20, 0x00, 0x12, 0xe0, 0xcf, 0xdf, 0x00, 0xcf, 0x34, 0x23,
+ 0xba, 0xde, 0xd3, 0xb4,
+ 0xf0, 0xf3, 0xd1, 0x88, 0xff, 0xff, 0xe0, 0x03, 0x33, 0x1e, 0xda, 0xc0,
+ 0x00, 0xff, 0xce, 0xd0,
+ 0xe1, 0xef, 0x13, 0x46, 0xde, 0xbd, 0x04, 0x02, 0xfd, 0x9c, 0x00, 0x02,
+ 0x00, 0xdf, 0x00, 0x02,
+ 0x00, 0xff, 0xfd, 0x36, 0x20, 0x30, 0x76, 0x41, 0xed, 0xef, 0x23, 0x55,
+ 0xfe, 0xff, 0x10, 0x0f,
+ 0xf0, 0x00, 0x43, 0x32, 0xcc, 0xcb, 0x01, 0x52, 0x12, 0x10, 0x00, 0x36,
+ 0x30, 0x0f, 0x0d, 0xfe,
+ 0x30, 0x20, 0xdb, 0xdf, 0xfd, 0x44, 0x74, 0x50, 0xef, 0x00, 0x13, 0x45,
+ 0xfe, 0xde, 0xf0, 0x02,
+ 0x32, 0x1f, 0x4f, 0x0c, 0xbc, 0xed, 0x02, 0x77, 0x45, 0xfd, 0xef, 0xfe,
+ 0x00, 0x13, 0x20, 0x0e,
+ 0x00, 0x03, 0x20, 0x0f, 0xff, 0x25, 0x31, 0xcd, 0xba, 0x00, 0x43, 0x41,
+ 0x0e, 0x0f, 0xf0, 0x1f,
+ 0x20, 0xfc, 0x00, 0x00, 0x32, 0x73, 0xf9, 0xbe, 0x00, 0x02, 0x12, 0x12,
+ 0xec, 0xce, 0x01, 0x02,
+ 0xf2, 0xf6, 0x63, 0x00, 0x0f, 0xdd, 0x00, 0x1d, 0xef, 0xff, 0xf0, 0x00,
+ 0x04, 0xee, 0x0f, 0x77,
+ 0x03, 0xcb, 0xde, 0x02, 0x64, 0x31, 0x12, 0xee, 0xcc, 0x0f, 0x00, 0x0d,
+ 0x0d, 0x04, 0xf2, 0xd0,
+ 0xb0, 0xe0, 0x05, 0x23, 0x02, 0x8c, 0xec, 0xf0, 0xe1, 0xdf, 0x02, 0x05,
+ 0x32, 0x1f, 0xea, 0x02,
+ 0xbe, 0x00, 0x22, 0x89, 0x11, 0x02, 0x0e, 0x01, 0xcd, 0xff, 0x14, 0x00,
+ 0xbb, 0xf0, 0x02, 0x00,
+ 0xee, 0xf0, 0x25, 0x42, 0x00, 0x0d, 0xe0, 0x10, 0x03, 0x10, 0xf0, 0x0f,
+ 0x40, 0x44, 0xee, 0xcc,
+ 0xd0, 0x31, 0x77, 0x0f, 0xdc, 0x00, 0x03, 0x03, 0x00, 0x21, 0x20, 0xd8,
+ 0x10, 0x72, 0x52, 0x00,
+ 0xfc, 0x10, 0x20, 0x00, 0xd0, 0x0f, 0x42, 0x33, 0xfa, 0xf0, 0x00, 0x00,
+ 0x14, 0x00, 0xf5, 0x00,
+ 0x85, 0x15, 0x97, 0x15, 0x4a, 0x14, 0x83, 0x12, 0x22, 0xc4, 0x55, 0x33,
+ 0x80, 0x81, 0xf2, 0x13,
+ 0x00, 0xd0, 0xf1, 0xf0, 0xf1, 0xde, 0x21, 0x76, 0x43, 0x23, 0x0f, 0xfd,
+ 0xfe, 0xee, 0xf0, 0x0f,
+ 0xb9, 0xe0, 0xf0, 0x01, 0x0f, 0x01, 0x65, 0x20, 0x1e, 0x1d, 0x1e, 0x2e,
+ 0x3d, 0x2a, 0x0c, 0x1e,
+ 0x1d, 0x0b, 0xed, 0x0c, 0x1d, 0x0e, 0x2d, 0x2d, 0x4e, 0x0f, 0x8e, 0xde,
+ 0xde, 0xdf, 0x8d, 0xdd,
+ 0xd0, 0xe1, 0x07, 0x03, 0xf1, 0xc0, 0x02, 0x14, 0xf2, 0xd1, 0xf7, 0xe2,
+ 0xc0, 0xe3, 0x04, 0x80,
+ 0xdc, 0xf0, 0x00, 0x10, 0x11, 0x22, 0x11, 0xc0, 0xbe, 0xf0, 0x05, 0x01,
+ 0xdd, 0xbd, 0xd0, 0xb3,
+ 0xe5, 0xd3, 0xd4, 0xc1, 0xbd, 0xd9, 0xde, 0xe0, 0xf1, 0xe1, 0xde, 0xee,
+ 0x00, 0x22, 0x00, 0x0f,
+ 0xda, 0xfe, 0xfd, 0xdd, 0xdb, 0x00, 0xb0, 0x8b, 0xcb, 0xde, 0x0f, 0x30,
+ 0x00, 0x0c, 0x1e, 0x4f,
+ 0x4f, 0x3e, 0x70, 0x22, 0x30, 0x41, 0x2f, 0x1c, 0x1c, 0x3e, 0x3f, 0x2c,
+ 0x2c, 0x2e, 0x2c, 0x1c,
+ 0x50, 0x41, 0x42, 0x12, 0x22, 0x24, 0x12, 0x10, 0x0e, 0x0c, 0x10, 0x54,
+ 0x32, 0x30, 0x65, 0x35,
+ 0x33, 0x22, 0x12, 0x12, 0x22, 0x25, 0x01, 0x01, 0xf1, 0x00, 0x02, 0xf5,
+ 0xe3, 0xc3, 0xd3, 0xe6,
+ 0xc2, 0xb2, 0xd2, 0xd3, 0xc3, 0xd2, 0xe2, 0x04, 0x32, 0x03, 0xf2, 0xd2,
+ 0xb0, 0xe0, 0xd3, 0xd5,
+ 0xb1, 0xc0, 0xd1, 0xd6, 0xd3, 0xd2, 0xa1, 0xd1, 0xf1, 0xf0, 0xf2, 0xc2,
+ 0xba, 0xdb, 0xff, 0x2f,
+ 0x0e, 0xbb, 0xee, 0x0e, 0xfe, 0xcb, 0xed, 0x0f, 0x0f, 0x0e, 0xed, 0xde,
+ 0xce, 0xae, 0xcc, 0xdd,
+ 0xcd, 0xef, 0x01, 0xe0, 0xda, 0xee, 0x00, 0x10, 0x0f, 0x0f, 0xfe, 0xeb,
+ 0xcc, 0xdd, 0x0f, 0x4f,
+ 0xea, 0x9c, 0xfe, 0xee, 0x0f, 0x2f, 0x3f, 0x60, 0x20, 0x30, 0x0f, 0x0f,
+ 0xe0, 0xf0, 0xdf, 0xdd,
+ 0xac, 0xce, 0xf4, 0x07, 0xf6, 0xe1, 0xe1, 0xe0, 0xb0, 0xc0, 0xd0, 0xf1,
+ 0x11, 0x21, 0x23, 0x20,
+ 0x1f, 0x2f, 0x0e, 0xe9, 0xcd, 0x0f, 0x0f, 0xcd, 0xbe, 0xe0, 0xff, 0xcc,
+ 0xdb, 0xfd, 0x1c, 0x0c,
+ 0xfe, 0x5f, 0x50, 0x1e, 0x0b, 0x1e, 0x5f, 0x3f, 0x5e, 0x2f, 0x1e, 0x2d,
+ 0x4f, 0x31, 0x43, 0x30,
+ 0x3f, 0x32, 0x45, 0x10, 0x00, 0x15, 0x57, 0x12, 0xf0, 0xe0, 0xf2, 0x12,
+ 0x43, 0x33, 0x65, 0x44,
+ 0x34, 0x22, 0x21, 0x21, 0x10, 0x00, 0x1f, 0x00, 0x0e, 0xfe, 0xed, 0x02,
+ 0x27, 0x67, 0x11, 0x12,
+ 0x12, 0x02, 0x02, 0x03, 0xd1, 0xb2, 0xe1, 0xe1, 0xc0, 0xf0, 0x43, 0x77,
+ 0x12, 0x01, 0x00, 0x02,
+ 0x23, 0x23, 0x02, 0xd1, 0xe2, 0xd2, 0xaf, 0xd0, 0x04, 0x16, 0x02, 0x00,
+ 0xe0, 0xdf, 0xd0, 0x13,
+ 0x67, 0x22, 0x31, 0x42, 0x0e, 0x30, 0x41, 0xfc, 0x3f, 0x5e, 0x2e, 0x1f,
+ 0xb8, 0xdc, 0xf0, 0xf0,
+ 0xbd, 0xcc, 0xef, 0xd0, 0xde, 0xf0, 0x02, 0xe0, 0xd0, 0x00, 0x67, 0x11,
+ 0x0f, 0xee, 0xdf, 0x00,
+ 0xdd, 0xdc, 0x00, 0x10, 0x20, 0xfe, 0xed, 0x71, 0x77, 0x22, 0x10, 0x0f,
+ 0x10, 0x0f, 0xfc, 0xfe,
+ 0xec, 0xcc, 0xef, 0xdf, 0xd0, 0xc0, 0xe2, 0xe3, 0xbe, 0xdf, 0xe1, 0xce,
+ 0xc8, 0xdd, 0xe0, 0x00,
+ 0xff, 0x0f, 0x13, 0x33, 0x0e, 0xda, 0x10, 0x30, 0x10, 0x00, 0x8c, 0xa9,
+ 0xee, 0xdd, 0xee, 0xcc,
+ 0xed, 0xed, 0x0d, 0x0f, 0x0d, 0x0f, 0x30, 0x71, 0x32, 0x20, 0x20, 0x2f,
+ 0x20, 0x42, 0x47, 0x42,
+ 0x21, 0x1f, 0x1e, 0x1f, 0x2f, 0x34, 0x33, 0x22, 0x15, 0x25, 0x13, 0x02,
+ 0xf0, 0x23, 0x65, 0x00,
+ 0x00, 0x31, 0x77, 0x53, 0x11, 0x10, 0x00, 0x10, 0x20, 0x10, 0x0e, 0xff,
+ 0xef, 0x03, 0x05, 0xf1,
+ 0xe4, 0x15, 0x33, 0xc1, 0x90, 0xf3, 0x07, 0xe1, 0xc1, 0x01, 0x02, 0x01,
+ 0x02, 0x01, 0x43, 0x53,
+ 0x24, 0x22, 0x31, 0x11, 0x00, 0xde, 0xcb, 0xde, 0xdf, 0xdf, 0xde, 0x23,
+ 0x55, 0x11, 0x22, 0x01,
+ 0x00, 0x40, 0x70, 0x52, 0x10, 0x0b, 0x0a, 0x0c, 0xfd, 0xea, 0xfe, 0x3f,
+ 0x40, 0x0d, 0x0e, 0x0e,
+ 0x0d, 0x0e, 0xee, 0xe0, 0xf0, 0x01, 0x90, 0xd0, 0xe5, 0xb1, 0xe2, 0x04,
+ 0x24, 0x02, 0x90, 0xe0,
+ 0xe0, 0x03, 0xf2, 0x16, 0x34, 0xef, 0xad, 0xee, 0xff, 0xed, 0xfc, 0x01,
+ 0x33, 0x0f, 0xcb, 0xfe,
+ 0x00, 0x20, 0xd0, 0x8d, 0xcf, 0xe2, 0xd7, 0xd4, 0xc1, 0xe2, 0xe1, 0xa0,
+ 0xdd, 0xed, 0xf0, 0xf1,
+ 0xe3, 0xe1, 0x03, 0x17, 0x45, 0x11, 0x10, 0x00, 0x01, 0xff, 0xdd, 0xbd,
+ 0xdd, 0xdc, 0xbb, 0xdc,
+ 0xbc, 0xed, 0x0f, 0xfe, 0x0e, 0x0e, 0x0e, 0x2e, 0x4d, 0x4e, 0x5f, 0x3d,
+ 0x38, 0x1c, 0x4e, 0x40,
+ 0x3e, 0x1b, 0x2e, 0x4f, 0x2e, 0x0c, 0x0c, 0x0e, 0x1e, 0x50, 0x30, 0x10,
+ 0x20, 0x11, 0x21, 0x41,
+ 0x20, 0x2f, 0x30, 0x64, 0x46, 0x23, 0x43, 0x34, 0x33, 0x32, 0x44, 0x33,
+ 0x22, 0x22, 0x14, 0x01,
+ 0x22, 0x34, 0x12, 0xf2, 0x04, 0xd2, 0x90, 0xf2, 0xf5, 0xf2, 0xe1, 0xc0,
+ 0xd2, 0xe4, 0xe2, 0xb0,
+ 0xcf, 0xf4, 0x17, 0x12, 0x01, 0xd2, 0xe2, 0xc2, 0xe2, 0xd1, 0xb1, 0xf3,
+ 0x05, 0x24, 0x12, 0xe0,
+ 0xa0, 0xe1, 0xe3, 0xd0, 0xcd, 0xed, 0x10, 0x0c, 0x98, 0xfc, 0x10, 0x00,
+ 0x0e, 0x0f, 0x20, 0x1e,
+ 0xfd, 0xed, 0x10, 0x2f, 0xcc, 0x8a, 0xed, 0xee, 0xfe, 0xdc, 0xde, 0xcf,
+ 0xdf, 0xf0, 0x02, 0x01,
+ 0xe3, 0xf2, 0xbf, 0xdc, 0xee, 0x00, 0x22, 0x00, 0xea, 0xbb, 0xee, 0x30,
+ 0x62, 0x21, 0x30, 0x43,
+ 0x33, 0x31, 0x13, 0x04, 0x01, 0xd0, 0xbc, 0xde, 0xce, 0xe1, 0xe4, 0xc4,
+ 0xe2, 0xe2, 0xf0, 0xf2,
+ 0xe6, 0xd1, 0xe1, 0x04, 0x56, 0x22, 0x02, 0x01, 0x00, 0xcf, 0xcf, 0xf0,
+ 0xff, 0xce, 0xaa, 0xef,
+ 0xdb, 0x00, 0x02, 0x9b, 0xee, 0x00, 0x00, 0x11, 0xfe, 0xec, 0x43, 0x31,
+ 0x0c, 0x09, 0x1f, 0x71,
+ 0x30, 0x0e, 0x3f, 0x50, 0x2f, 0x3e, 0x30, 0x40, 0x30, 0x1e, 0x2f, 0x34,
+ 0x45, 0x10, 0x12, 0x12,
+ 0x12, 0x0f, 0xec, 0x0f, 0x52, 0x34, 0x67, 0x33, 0x41, 0x21, 0x31, 0x43,
+ 0x20, 0x0d, 0x0c, 0xf0,
+ 0xff, 0xdc, 0xee, 0x02, 0x26, 0x01, 0xf0, 0xf3, 0x03, 0xf4, 0xf3, 0xe4,
+ 0xb2, 0xd2, 0x90, 0xed,
+ 0xef, 0xff, 0x23, 0x67, 0x11, 0x01, 0x12, 0x13, 0x13, 0x22, 0x14, 0x13,
+ 0xe2, 0x8f, 0xcd, 0xf2,
+ 0xf3, 0xf1, 0xe3, 0xe2, 0x05, 0x15, 0x22, 0x31, 0x40, 0x55, 0x22, 0x0f,
+ 0x0d, 0xff, 0x22, 0x41,
+ 0xfb, 0xdb, 0xee, 0x0e, 0xec, 0xac, 0xcd, 0xdc, 0xee, 0xcd, 0xbb, 0xde,
+ 0xf0, 0x00, 0xee, 0xff,
+ 0x12, 0x22, 0x00, 0xfc, 0xcf, 0xde, 0xfe, 0xfd, 0xeb, 0xed, 0xff, 0xfe,
+ 0xdc, 0x30, 0x74, 0x70,
+ 0x30, 0x30, 0x4f, 0x30, 0x10, 0x0b, 0x0b, 0xdd, 0xad, 0xec, 0xef, 0xc0,
+ 0xe0, 0xd0, 0xee, 0xef,
+ 0x03, 0x16, 0xe0, 0x9d, 0xee, 0xef, 0x01, 0x02, 0xf3, 0x04, 0xf2, 0x04,
+ 0x05, 0x21, 0x12, 0x43,
+ 0x34, 0x11, 0xe0, 0x9f, 0xdc, 0xab, 0xee, 0xef, 0xde, 0xdb, 0xed, 0xff,
+ 0x0f, 0x1e, 0x2d, 0x3d,
+ 0x40, 0x40, 0x3e, 0x3e, 0x40, 0x30, 0x57, 0x56, 0x10, 0x0f, 0x0e, 0x00,
+ 0x41, 0x22, 0x01, 0x00,
+ 0x04, 0x24, 0x02, 0xf1, 0x01, 0x13, 0x01, 0x02, 0x67, 0x64, 0x24, 0x10,
+ 0x11, 0x42, 0x22, 0x22,
+ 0x00, 0x00, 0x12, 0x14, 0x77, 0x23, 0x01, 0x00, 0xf1, 0x03, 0x23, 0x12,
+ 0x12, 0xf0, 0xbe, 0xe0,
+ 0xe1, 0xe0, 0xe0, 0xe0, 0xfe, 0x25, 0x77, 0x46, 0x10, 0x00, 0x12, 0x00,
+ 0x10, 0xff, 0xf0, 0xdf,
+ 0x9c, 0xdd, 0x00, 0x01, 0x21, 0x22, 0x22, 0x32, 0x2e, 0x3b, 0x71, 0x21,
+ 0x0d, 0x1e, 0x1c, 0x09,
+ 0xfd, 0xec, 0xfd, 0x30, 0x70, 0x1e, 0x0d, 0x0f, 0x0e, 0xec, 0x0f, 0x20,
+ 0x0e, 0xad, 0xcc, 0xf0,
+ 0xf2, 0xf0, 0xf3, 0x15, 0x01, 0xa0, 0xdf, 0xcd, 0xef, 0x02, 0x05, 0x02,
+ 0xcc, 0xdb, 0x00, 0x10,
+ 0xec, 0xfe, 0x2f, 0x40, 0x01, 0xde, 0xcf, 0xcf, 0xe3, 0xc3, 0xaf, 0xd0,
+ 0xd1, 0xac, 0xe0, 0xf7,
+ 0x06, 0xf2, 0xe0, 0xe0, 0xef, 0xdf, 0xe0, 0xcf, 0xdc, 0xe0, 0xe0, 0x02,
+ 0x46, 0x11, 0x13, 0x54,
+ 0x00, 0xed, 0xdc, 0xff, 0xdd, 0x89, 0xbd, 0xfe, 0xef, 0xed, 0xfd, 0xfe,
+ 0x0f, 0x00, 0x42, 0x20,
+ 0x2f, 0x30, 0x63, 0x13, 0x1c, 0x2a, 0x2d, 0x3d, 0x4d, 0x3e, 0x3d, 0x3b,
+ 0x1d, 0x2c, 0x3f, 0x4f,
+ 0x20, 0x3f, 0x2e, 0x54, 0x56, 0x10, 0x20, 0x21, 0x32, 0x30, 0x42, 0x32,
+ 0x54, 0x47, 0x43, 0x21,
+ 0x32, 0x23, 0x11, 0x23, 0x02, 0x12, 0x24, 0x23, 0x00, 0x00, 0xf3, 0xe1,
+ 0x07, 0x03, 0xf4, 0x05,
+ 0xb2, 0xe2, 0xd3, 0xb3, 0xd1, 0xf2, 0x02, 0xe3, 0xb0, 0xe1, 0xf4, 0x06,
+ 0x23, 0xc1, 0xa2, 0xf4,
+ 0xe2, 0xd1, 0xc1, 0xe3, 0xf2, 0x04, 0x26, 0x42, 0x01, 0xf0, 0xbe, 0xdd,
+ 0xef, 0x00, 0xab, 0xdd,
+ 0xfe, 0xed, 0xed, 0xcb, 0xfd, 0x0e, 0x1e, 0xfd, 0xfd, 0x0e, 0xff, 0xdd,
+ 0xa9, 0xdd, 0xdd, 0xed,
+ 0xed, 0xcd, 0xde, 0xdc, 0xce, 0x00, 0x13, 0x01, 0xbf, 0xcb, 0xcc, 0xee,
+ 0xed, 0xed, 0xfc, 0xdb,
+ 0xcc, 0x0d, 0x2f, 0x5e, 0x2e, 0x1e, 0x50, 0x20, 0x20, 0x12, 0x13, 0x00,
+ 0xed, 0xcd, 0xdc, 0xdc,
+ 0xab, 0xdd, 0xbd, 0xf1, 0x16, 0x02, 0xf0, 0xe0, 0xe0, 0xf5, 0x24, 0x32,
+ 0x01, 0xe0, 0xf0, 0x11,
+ 0x22, 0xd0, 0xbe, 0x12, 0x12, 0xad, 0xdc, 0xd0, 0xd1, 0xd0, 0xb0, 0xee,
+ 0x0e, 0xfb, 0xdd, 0x0d,
+ 0x1d, 0x18, 0x0c, 0x3c, 0x1d, 0x0c, 0x0d, 0x6e, 0x7f, 0x40, 0x2f, 0x3e,
+ 0x4f, 0x30, 0x52, 0x23,
+ 0x20, 0x11, 0x20, 0x10, 0x32, 0x77, 0x16, 0x10, 0x10, 0x00, 0x0f, 0x1e,
+ 0x45, 0x56, 0x21, 0x11,
+ 0x21, 0x52, 0x33, 0x22, 0x12, 0x10, 0x00, 0x00, 0x00, 0x10, 0x22, 0x03,
+ 0x03, 0x02, 0x27, 0x04,
+ 0x02, 0xd2, 0x14, 0x45, 0x02, 0x01, 0xb0, 0xbf, 0xe0, 0x12, 0x02, 0xd1,
+ 0xd2, 0xf6, 0x03, 0x14,
+ 0x63, 0x34, 0x12, 0x12, 0xb2, 0x9f, 0xfe, 0x07, 0x23, 0xe0, 0xce, 0x01,
+ 0x13, 0x22, 0x00, 0xff,
+ 0x23, 0x55, 0x00, 0x00, 0x12, 0x23, 0xf0, 0x0f, 0x33, 0x20, 0xe8, 0xef,
+ 0xad, 0xdd, 0xde, 0xdd,
+ 0xaa, 0xdd, 0xdd, 0xef, 0xdf, 0xce, 0xe0, 0x03, 0x04, 0xbf, 0xbd, 0xfe,
+ 0x00, 0xff, 0xd8, 0xed,
+ 0x1e, 0x0e, 0x2f, 0x30, 0x0d, 0x40, 0x40, 0x3f, 0x70, 0x25, 0x23, 0x21,
+ 0x0f, 0xf9, 0xce, 0xed,
+ 0xcc, 0xed, 0xde, 0xcf, 0xdf, 0xff, 0x00, 0x46, 0x10, 0xde, 0xbd, 0xee,
+ 0xef, 0xed, 0xdb, 0xf0,
+ 0x00, 0xc0, 0xdf, 0xd0, 0xbe, 0xee, 0x25, 0x33, 0xe0, 0xbf, 0xe0, 0xe2,
+ 0xbf, 0xc8, 0xdf, 0xdf,
+ 0xce, 0xed, 0xde, 0xee, 0x0e, 0x00, 0x2e, 0x3d, 0x2b, 0x3f, 0x4e, 0x2c,
+ 0x60, 0x41, 0x1e, 0x31,
+ 0x45, 0x0f, 0x0b, 0x20, 0x20, 0x0f, 0x0e, 0x63, 0x10, 0xfd, 0x0f, 0x12,
+ 0x47, 0x21, 0x02, 0x21,
+ 0x33, 0x57, 0x31, 0x31, 0x61, 0x21, 0x20, 0x10, 0x1f, 0x00, 0x20, 0x35,
+ 0x01, 0x01, 0x25, 0x34,
+ 0x13, 0x02, 0xf2, 0x02, 0x02, 0x02, 0x91, 0xe0, 0x01, 0x24, 0xef, 0xbc,
+ 0x01, 0x67, 0x35, 0x32,
+ 0x32, 0x32, 0x01, 0x00, 0xf0, 0xd0, 0x90, 0xcf, 0xd0, 0x02, 0x02, 0xf1,
+ 0x13, 0x35, 0x74, 0x23,
+ 0x32, 0x22, 0x33, 0x56, 0x10, 0x0f, 0x0d, 0x0c, 0xdb, 0xce, 0x0e, 0x10,
+ 0x0f, 0xed, 0xfe, 0x20,
+ 0x50, 0x3e, 0x4d, 0x2e, 0x0d, 0xbc, 0xed, 0xe0, 0x05, 0xf4, 0xe0, 0xc2,
+ 0xd2, 0xb0, 0xee, 0xff,
+ 0x03, 0x04, 0xe0, 0x00, 0x10, 0x23, 0x26, 0x12, 0x00, 0xde, 0xdd, 0xce,
+ 0x8a, 0x12, 0x04, 0xcf,
+ 0xef, 0xde, 0xcd, 0xe4, 0xa0, 0xb8, 0xdf, 0x04, 0x26, 0x00, 0xe0, 0xf0,
+ 0x00, 0x00, 0xd0, 0xcf,
+ 0xee, 0xe0, 0xf0, 0xe0, 0xf1, 0x04, 0xd1, 0xf1, 0x01, 0x00, 0xce, 0xce,
+ 0xb0, 0xbc, 0xb8, 0xef,
+ 0x00, 0xdd, 0xee, 0x0f, 0x0e, 0x0c, 0x0b, 0x20, 0x72, 0x20, 0x2f, 0x2f,
+ 0x3e, 0x4c, 0x2c, 0x1b,
+ 0x0e, 0x3e, 0x40, 0x0c, 0xfc, 0x0e, 0x10, 0x60, 0x2f, 0x1e, 0x2f, 0x41,
+ 0x21, 0x1e, 0x2f, 0x53,
+ 0x21, 0x1e, 0x20, 0x42, 0x55, 0x45, 0x45, 0x23, 0x21, 0x23, 0x33, 0x35,
+ 0x33, 0x34, 0x32, 0x23,
+ 0x01, 0xf0, 0xe0, 0xe0, 0xdf, 0xdf, 0x03, 0x57, 0x02, 0xe2, 0xe2, 0x24,
+ 0x00, 0xa0, 0xd0, 0xc0,
+ 0xf3, 0xd2, 0xd2, 0xe3, 0xe3, 0xf7, 0xe3, 0x80, 0xd0, 0xd2, 0xe4, 0x05,
+ 0xe1, 0xc2, 0x02, 0x02,
+ 0x01, 0x00, 0x01, 0x43, 0x1f, 0xcb, 0xbd, 0xed, 0xf0, 0xdd, 0xc9, 0xfe,
+ 0x0f, 0x0e, 0x0e, 0x0f,
+ 0xff, 0x0e, 0xfe, 0xfc, 0xda, 0xfe, 0xce, 0x8d, 0xed, 0xee, 0xdf, 0xbe,
+ 0xef, 0xcf, 0xdf, 0xef,
+ 0xdc, 0xc9, 0xff, 0xf0, 0xff, 0xfc, 0xcc, 0xdd, 0xed, 0x1e, 0x1d, 0x0c,
+ 0x2e, 0x71, 0x64, 0x00,
+ 0x00, 0x00, 0x02, 0x37, 0x01, 0xd0, 0xce, 0xce, 0xd0, 0xdf, 0xdf, 0xf0,
+ 0xf0, 0xdf, 0xdf, 0xf4,
+ 0x04, 0x04, 0x66, 0x44, 0x12, 0x00, 0xc0, 0xc0, 0xf0, 0xe0, 0xbd, 0xdd,
+ 0xee, 0xee, 0xcd, 0xdd,
+ 0xce, 0xde, 0xd0, 0xf7, 0xf3, 0xac, 0xee, 0x01, 0x36, 0x30, 0x1d, 0x0b,
+ 0x2e, 0x1d, 0x2d, 0x3d,
+ 0x5d, 0x1d, 0x0a, 0x30, 0x72, 0x51, 0x10, 0x10, 0x20, 0x1c, 0x0c, 0x30,
+ 0x51, 0x20, 0x1f, 0x11,
+ 0x30, 0x1d, 0x2c, 0x62, 0x36, 0x31, 0x30, 0x43, 0x65, 0x11, 0x20, 0x11,
+ 0x22, 0x10, 0x0c, 0xfb,
+ 0xfd, 0x00, 0x00, 0xd0, 0xde, 0xf0, 0x01, 0x05, 0x24, 0x13, 0x13, 0x66,
+ 0x22, 0x01, 0xd0, 0xe0,
+ 0x03, 0xf2, 0x04, 0xe2, 0x8d, 0xb1, 0x47, 0x26, 0x01, 0xf0, 0xf2, 0x01,
+ 0xf1, 0xc0, 0x00, 0x01,
+ 0xf0, 0xcf, 0x00, 0x22, 0x10, 0x00, 0x01, 0x66, 0x01, 0xe0, 0xef, 0xe0,
+ 0xe1, 0xae, 0xf0, 0x23,
+ 0x20, 0x1d, 0x0c, 0xe8, 0x0e, 0x50, 0x0f, 0xdc, 0xcc, 0xbd, 0xee, 0xef,
+ 0xdf, 0xde, 0x01, 0xf2,
+ 0xce, 0xde, 0xf0, 0xff, 0x0f, 0x0b, 0xcb, 0x0d, 0x50, 0x2f, 0x1d, 0x1e,
+ 0x3f, 0x3e, 0x5f, 0x50,
+ 0x22, 0x11, 0x1f, 0x1c, 0x1b, 0x0a, 0xcc, 0xbb, 0xde, 0xde, 0xe0, 0xde,
+ 0xef, 0x01, 0x43, 0x34,
+ 0x51, 0x11, 0xde, 0xcd, 0xf0, 0x02, 0xce, 0xbb, 0xe0, 0xf1, 0xe2, 0xe0,
+ 0x02, 0x16, 0x23, 0x04,
+ 0xf3, 0xf5, 0xc2, 0xb0, 0xe2, 0xd0, 0xcf, 0xbe, 0xed, 0xdd, 0xea, 0xfe,
+ 0x0f, 0xfe, 0x0e, 0x30,
+ 0x2f, 0x1d, 0x0c, 0x0f, 0x20, 0x52, 0x32, 0x44, 0x23, 0x33, 0x32, 0x11,
+ 0x20, 0x73, 0x67, 0x02,
+ 0x01, 0x00, 0x03, 0x07, 0x22, 0x10, 0x11, 0x43, 0x44, 0x75, 0x22, 0x11,
+ 0x21, 0x10, 0x21, 0x34,
+ 0x43, 0x11, 0x22, 0x11, 0x01, 0x00, 0x03, 0x77, 0x67, 0x03, 0xff, 0xff,
+ 0x00, 0xff, 0x00, 0x33,
+ 0x21, 0xeb, 0xde, 0xdf, 0xef, 0x77, 0x64, 0x00, 0x00, 0xf0, 0x00, 0x13,
+ 0xf0, 0xaa, 0xff, 0x00,
+ 0x02, 0x33, 0x10, 0x32, 0x22, 0xfe, 0x9a, 0xee, 0x11, 0x67, 0x22, 0x00,
+ 0x00, 0xcb, 0xac, 0xfe,
+ 0x34, 0x54, 0x00, 0x0f, 0xff, 0xed, 0x00, 0x00, 0x11, 0x22, 0x00, 0x0f,
+ 0xed, 0x00, 0x36, 0x21,
+ 0xce, 0x9a, 0xdd, 0x11, 0x77, 0x11, 0xee, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x44,
+ 0x00, 0xfe, 0xef, 0x00, 0xf0, 0x0f, 0x01, 0x00, 0xce, 0xfe, 0x04, 0x04,
+ 0x91, 0x02, 0xe9, 0x01,
+ 0x57, 0x01, 0x18, 0x09, 0xca, 0x02, 0x2c, 0x08, 0xcc, 0xba, 0xf0, 0x45,
+ 0x43, 0x01, 0xee, 0xde,
+ 0xee, 0x00, 0x23, 0xed, 0x99, 0x12, 0x55, 0x00, 0xff, 0xef, 0xff, 0x00,
+ 0x01, 0xf0, 0xff, 0x00,
+ 0xe0, 0xe0, 0x23, 0x23, 0xbc, 0xb9, 0x00, 0x34, 0x00, 0xce, 0xff, 0x00,
+ 0x00, 0x12, 0x21, 0xf0,
+ 0xed, 0xdd, 0xff, 0x64, 0x23, 0x00, 0xfd, 0xda, 0xef, 0x20, 0x0f, 0x0f,
+ 0x52, 0x00, 0xec, 0xdd,
+ 0xa9, 0x10, 0x75, 0x11, 0x00, 0x0f, 0xfd, 0x00, 0x22, 0x10, 0xfd, 0x22,
+ 0x32, 0x10, 0x54, 0x33,
+ 0x00, 0x0f, 0xda, 0xee, 0x76, 0x32, 0xff, 0x00, 0x32, 0x00, 0xef, 0xed,
+ 0x00, 0x22, 0x77, 0x10,
+ 0xf0, 0x00, 0x00, 0x55, 0x11, 0xde, 0xbc, 0x00, 0x35, 0x11, 0xef, 0x00,
+ 0x01, 0x11, 0x01, 0x22,
+ 0x01, 0x01, 0x01, 0x32, 0x34, 0x9e, 0x13, 0x57, 0xde, 0xef, 0x43, 0xf0,
+ 0xdd, 0x45, 0x33, 0xff,
+ 0xdd, 0xab, 0x00, 0x44, 0x00, 0x00, 0x33, 0xff, 0xcb, 0x00, 0x21, 0xde,
+ 0xf0, 0x22, 0x00, 0x00,
+ 0x11, 0xff, 0xbd, 0xca, 0xcd, 0x22, 0x56, 0x00, 0xdd, 0x00, 0x10, 0x00,
+ 0xfe, 0xfe, 0xee, 0x00,
+ 0x43, 0x10, 0xcc, 0xa8, 0x00, 0x75, 0x00, 0xee, 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0xff,
+ 0xcb, 0x00, 0x21, 0x00, 0xdd, 0x21, 0x44, 0xee, 0xcc, 0x00, 0x22, 0x00,
+ 0xef, 0x00, 0xef, 0x9b,
+ 0x00, 0x24, 0xdd, 0x99, 0x00, 0x34, 0x11, 0xde, 0xee, 0x00, 0x00, 0x11,
+ 0x11, 0xbc, 0xff, 0x44,
+ 0x00, 0xdd, 0x0f, 0xee, 0xed, 0x22, 0x21, 0xfe, 0xff, 0xdc, 0xfe, 0x42,
+ 0x55, 0xff, 0xed, 0x0f,
+ 0xed, 0x10, 0xfc, 0xde, 0x74, 0x10, 0xfc, 0xeb, 0x0f, 0x10, 0x32, 0x62,
+ 0x11, 0xdb, 0xfe, 0x10,
+ 0x00, 0x10, 0x30, 0x20, 0x63, 0xfd, 0xa8, 0x0f, 0x44, 0x0f, 0xdd, 0x00,
+ 0x12, 0x44, 0x00, 0xfe,
+ 0xfe, 0x11, 0x11, 0xee, 0x21, 0x55, 0x00, 0xfe, 0xee, 0xdd, 0x01, 0x77,
+ 0x23, 0xff, 0x00, 0x14,
+ 0x01, 0xff, 0xe0, 0x02, 0x23, 0x36, 0xe0, 0x8f, 0xee, 0x01, 0x77, 0x01,
+ 0xff, 0x00, 0x02, 0x00,
+ 0x02, 0x24, 0x11, 0x00, 0xf0, 0x00, 0x45, 0xff, 0xdf, 0x42, 0x54, 0x00,
+ 0x0f, 0x00, 0x00, 0xff,
+ 0xdd, 0x01, 0x67, 0x00, 0xde, 0x01, 0x01, 0xff, 0x44, 0x33, 0xee, 0xdc,
+ 0x00, 0x42, 0x11, 0xba,
+ 0x0f, 0x44, 0x10, 0xee, 0xff, 0x11, 0x64, 0xfe, 0xfd, 0x00, 0x0f, 0x00,
+ 0x0e, 0xdc, 0x00, 0x00,
+ 0xcc, 0x00, 0x46, 0xef, 0x9a, 0x21, 0x33, 0x0f, 0xff, 0x11, 0x22, 0xe0,
+ 0xbc, 0xf0, 0x0f, 0x01,
+ 0x01, 0xf0, 0xbb, 0x00, 0x66, 0x00, 0xee, 0xef, 0x00, 0x24, 0x10, 0xbc,
+ 0xee, 0x00, 0x23, 0x00,
+ 0x0f, 0x0e, 0xec, 0xcb, 0x00, 0x75, 0x21, 0xef, 0xee, 0x10, 0x11, 0x00,
+ 0xef, 0x02, 0x13, 0xdf,
+ 0x9b, 0x01, 0x35, 0xff, 0xcf, 0x11, 0x11, 0xf0, 0xed, 0x00, 0x53, 0x13,
+ 0x0e, 0x00, 0x12, 0x0f,
+ 0x1f, 0x1f, 0x0e, 0x0b, 0x10, 0x77, 0x53, 0x0e, 0xdb, 0x11, 0x43, 0x00,
+ 0x0f, 0x01, 0x0e, 0x00,
+ 0x54, 0x0f, 0x0d, 0x01, 0x00, 0xfc, 0x34, 0x21, 0xdd, 0xfe, 0xff, 0xdd,
+ 0x00, 0x67, 0x21, 0x0f,
+ 0xfe, 0xaa, 0xef, 0x54, 0x34, 0xf0, 0xcc, 0xef, 0x11, 0x22, 0xff, 0xf0,
+ 0x01, 0x12, 0x22, 0xef,
+ 0xcd, 0x00, 0x22, 0x12, 0x47, 0x01, 0xaf, 0xf0, 0x12, 0x35, 0x00, 0xce,
+ 0x01, 0x35, 0xf0, 0xbe,
+ 0x00, 0xef, 0x00, 0x77, 0x00, 0xbd, 0x02, 0x47, 0x00, 0xdd, 0x10, 0x22,
+ 0xff, 0xee, 0x20, 0x00,
+ 0x10, 0x75, 0x00, 0x0e, 0xf0, 0x00, 0x00, 0x33, 0x12, 0xed, 0xf0, 0x03,
+ 0xdd, 0xcd, 0x14, 0xe0,
+ 0xde, 0x77, 0x13, 0xec, 0xcc, 0x00, 0x55, 0x00, 0xff, 0xfe, 0x11, 0x11,
+ 0x0f, 0xf0, 0x0f, 0xfe,
+ 0xee, 0x0f, 0xaa, 0x00, 0x23, 0xee, 0xcc, 0x31, 0x43, 0xed, 0xb9, 0x00,
+ 0xff, 0x00, 0x54, 0x00,
+ 0xff, 0xff, 0x0f, 0x0f, 0xdd, 0x10, 0x55, 0x00, 0xdb, 0xf0, 0x10, 0x00,
+ 0xee, 0xcd, 0xee, 0x22,
+ 0x22, 0x99, 0xde, 0x0f, 0x33, 0x02, 0xde, 0xee, 0x21, 0xee, 0xcb, 0x52,
+ 0x23, 0xff, 0xee, 0x12,
+ 0x44, 0x11, 0xdc, 0xce, 0x36, 0x42, 0xe0, 0xee, 0x00, 0xff, 0x22, 0x65,
+ 0x01, 0x00, 0xf0, 0x11,
+ 0x33, 0xef, 0xac, 0x00, 0x23, 0x0f, 0xf0, 0x36, 0x31, 0x00, 0xee, 0xdd,
+ 0x42, 0x77, 0x21, 0x00,
+ 0x20, 0xff, 0x11, 0x77, 0x00, 0xdf, 0x01, 0x22, 0xe0, 0xef, 0x12, 0x34,
+ 0xe0, 0xef, 0x32, 0x75,
+ 0x0f, 0xbb, 0x00, 0x34, 0x42, 0x0f, 0xee, 0x0f, 0x00, 0x21, 0x33, 0xfe,
+ 0xfe, 0x42, 0x0f, 0xb8,
+ 0x10, 0x31, 0xf0, 0xee, 0x0f, 0x51, 0x00, 0xfc, 0xee, 0x42, 0x44, 0xec,
+ 0xde, 0x00, 0x21, 0x20,
+ 0x21, 0x0f, 0xfc, 0x00, 0xff, 0xee, 0x9b, 0x10, 0x21, 0xba, 0xff, 0x22,
+ 0x12, 0x00, 0xac, 0xcc,
+ 0x00, 0x22, 0xff, 0xff, 0x35, 0x00, 0xbc, 0x0f, 0x00, 0x02, 0x00, 0xe0,
+ 0xdf, 0x00, 0x34, 0x01,
+ 0xae, 0xf0, 0x14, 0x14, 0xcd, 0xcc, 0x03, 0x45, 0xef, 0xee, 0x14, 0x00,
+ 0x8d, 0x02, 0x15, 0xff,
+ 0x00, 0x13, 0xff, 0xdd, 0x01, 0x22, 0x00, 0x0f, 0x31, 0x21, 0xfe, 0xec,
+ 0x42, 0x66, 0x00, 0xf0,
+ 0xee, 0x00, 0x35, 0xef, 0xe0, 0x54, 0x01, 0xed, 0xdd, 0x32, 0x44, 0xdc,
+ 0x00, 0x74, 0x10, 0xfd,
+ 0x11, 0x55, 0x00, 0xfc, 0x0f, 0x11, 0x21, 0xfe, 0x0d, 0x10, 0x20, 0x0e,
+ 0x1e, 0x20, 0xf9, 0xfe,
+ 0x73, 0x60, 0xe8, 0xee, 0x21, 0x32, 0x00, 0x20, 0x1f, 0xdd, 0x10, 0x52,
+ 0x00, 0xfe, 0x0f, 0xfd,
+ 0x10, 0x10, 0xca, 0x10, 0x76, 0x00, 0xfe, 0xf0, 0xef, 0xce, 0x12, 0x57,
+ 0x00, 0xbd, 0xed, 0x12,
+ 0x01, 0x00, 0x00, 0x02, 0x12, 0xf0, 0xee, 0xf0, 0x04, 0x01, 0xf1, 0xe0,
+ 0xae, 0xf1, 0x37, 0x25,
+ 0xd0, 0xbe, 0xe0, 0x00, 0x24, 0x23, 0xdf, 0x8c, 0xee, 0x37, 0x32, 0xcf,
+ 0xf0, 0x00, 0xf0, 0xe0,
+ 0x00, 0x01, 0xef, 0xfe, 0x10, 0x77, 0x32, 0x0f, 0xdd, 0xf0, 0x32, 0x10,
+ 0x10, 0x33, 0xbd, 0xfe,
+ 0x47, 0x00, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x10, 0x00, 0xec, 0x75, 0x43,
+ 0xee, 0xfd, 0xdc, 0x21,
+ 0x76, 0x10, 0xff, 0xed, 0xdd, 0xff, 0x54, 0x0f, 0xda, 0x11, 0x32, 0xcd,
+ 0xcc, 0x32, 0x21, 0xed,
+ 0x11, 0x32, 0xee, 0xee, 0x21, 0xfe, 0x0f, 0x74, 0x00, 0xfb, 0xdd, 0x0f,
+ 0x20, 0x63, 0x11, 0xea,
+ 0xff, 0x0f, 0xef, 0x00, 0x00, 0xef, 0xff, 0xcd, 0xfe, 0x67, 0x12, 0xed,
+ 0xdc, 0x00, 0x74, 0x00,
+ 0xec, 0x11, 0x12, 0x00, 0x11, 0x12, 0xed, 0xde, 0x02, 0xde, 0xf0, 0x57,
+ 0x11, 0x01, 0x00, 0x03,
+ 0x65, 0xf0, 0x9a, 0xf0, 0x33, 0x23, 0x00, 0x02, 0xef, 0xcc, 0xf0, 0x00,
+ 0x11, 0x24, 0x33, 0xff,
+ 0xaa, 0x00, 0x10, 0x11, 0x21, 0x12, 0xff, 0xff, 0x01, 0xff, 0x01, 0x77,
+ 0xf0, 0xcf, 0x00, 0x01,
+ 0x00, 0xf0, 0x24, 0x34, 0xef, 0xcd, 0x11, 0x76, 0x12, 0x0f, 0x00, 0x00,
+ 0x22, 0xff, 0x0f, 0x33,
+ 0x00, 0x99, 0x00, 0x32, 0x21, 0xed, 0x0f, 0x21, 0xfd, 0xca, 0x10, 0x51,
+ 0x21, 0x21, 0x22, 0xdb,
+ 0xcd, 0x21, 0x0f, 0x10, 0x75, 0x21, 0xfd, 0xfe, 0x00, 0x1f, 0x30, 0x43,
+ 0x22, 0xfd, 0xb8, 0xf0,
+ 0x10, 0x00, 0xef, 0x11, 0x21, 0x0f, 0xaa, 0xde, 0x00, 0x44, 0x32, 0x20,
+ 0xff, 0xbd, 0xfe, 0x01,
+ 0x25, 0x11, 0xff, 0x00, 0xf0, 0x01, 0xd0, 0xae, 0xed, 0x00, 0x27, 0xf0,
+ 0xbe, 0x00, 0x36, 0x54,
+ 0xf0, 0xce, 0xee, 0xf1, 0x01, 0xe0, 0xf0, 0xe0, 0xf0, 0xf1, 0xdf, 0xef,
+ 0x33, 0x00, 0xed, 0x12,
+ 0xed, 0x9a, 0x12, 0x25, 0x00, 0xbd, 0xee, 0xdd, 0x03, 0x67, 0xe0, 0xbc,
+ 0x0f, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x10, 0x00, 0xfb, 0x20, 0x32, 0xdd, 0x21, 0x76, 0x10, 0x0f,
+ 0xee, 0x0e, 0x53, 0x35,
+ 0xfe, 0xdc, 0xff, 0x20, 0x61, 0x10, 0x10, 0x0d, 0xea, 0x21, 0x54, 0x0e,
+ 0x0f, 0x00, 0xed, 0x21,
+ 0x54, 0x10, 0x10, 0x32, 0x0f, 0x0f, 0x20, 0x00, 0xfd, 0x35, 0x64, 0x00,
+ 0xff, 0xde, 0x01, 0x37,
+ 0x21, 0xe0, 0xef, 0xef, 0x21, 0x75, 0x20, 0xde, 0xef, 0x64, 0x11, 0xdd,
+ 0x00, 0x25, 0x32, 0x10,
+ 0x9c, 0xdc, 0xf0, 0x47, 0x31, 0x00, 0xf0, 0x00, 0xe0, 0xef, 0x22, 0x01,
+ 0xbf, 0x22, 0x23, 0xcf,
+ 0xe0, 0xe0, 0xab, 0xf0, 0x23, 0x23, 0xff, 0xf0, 0x23, 0x0e, 0xec, 0x44,
+ 0x21, 0xfe, 0xdd, 0xff,
+ 0x34, 0xf0, 0x9b, 0x00, 0x01, 0x00, 0xdf, 0xe0, 0xab, 0x0f, 0x33, 0x13,
+ 0xdc, 0xab, 0x00, 0x00,
+ 0xfe, 0x00, 0x12, 0x0e, 0xef, 0xfe, 0xef, 0x57, 0x00, 0xdc, 0xce, 0xee,
+ 0x00, 0xee, 0xfe, 0x00,
+ 0x0d, 0x20, 0x10, 0x88, 0xdd, 0x12, 0x43, 0xde, 0xdc, 0x21, 0x21, 0x0f,
+ 0xfe, 0x1f, 0x20, 0x0f,
+ 0xfa, 0x0e, 0x50, 0x0e, 0xff, 0x12, 0xcd, 0x99, 0x0f, 0xf0, 0x10, 0x44,
+ 0xff, 0xa9, 0xff, 0x21,
+ 0x42, 0x00, 0x00, 0x0f, 0x10, 0x30, 0x10, 0x00, 0x1f, 0x0f, 0xef, 0x23,
+ 0x00, 0x63, 0x37, 0xdd,
+ 0xbd, 0x11, 0x57, 0x11, 0x12, 0x21, 0x00, 0x11, 0x00, 0xdf, 0x34, 0x43,
+ 0xe0, 0x34, 0x34, 0xbe,
+ 0xcc, 0x00, 0x33, 0x32, 0x00, 0x22, 0x01, 0xee, 0x00, 0x21, 0x55, 0x33,
+ 0xf0, 0xe0, 0xcf, 0x37,
+ 0x65, 0xdf, 0xce, 0x12, 0x33, 0x01, 0xe0, 0xdf, 0x01, 0x77, 0x01, 0xef,
+ 0xde, 0x23, 0x77, 0x21,
+ 0xf0, 0xef, 0x10, 0xf0, 0xde, 0x34, 0x22, 0x0f, 0x22, 0x00, 0xbc, 0x10,
+ 0x43, 0x00, 0xef, 0xfe,
+ 0x00, 0x21, 0x46, 0x00, 0xef, 0x00, 0x0f, 0x1f, 0x41, 0x0e, 0x0d, 0x51,
+ 0x22, 0x0d, 0x1d, 0x0e,
+ 0xd8, 0xdf, 0x72, 0x33, 0xdc, 0xaa, 0xfe, 0x00, 0x00, 0x10, 0x32, 0xfe,
+ 0xed, 0x0f, 0x0d, 0x0d,
+ 0x10, 0x53, 0x11, 0xfb, 0xdc, 0x11, 0x30, 0x8a, 0xee, 0x12, 0x22, 0x00,
+ 0xee, 0xdd, 0xdc, 0x32,
+ 0x55, 0xef, 0x01, 0x35, 0x00, 0xe1, 0xf0, 0xa0, 0xcd, 0x00, 0x04, 0xff,
+ 0xef, 0xe0, 0xcc, 0x11,
+ 0x43, 0xdb, 0xcd, 0x33, 0x00, 0xcb, 0xf0, 0xde, 0x00, 0x01, 0xe0, 0xcf,
+ 0xcf, 0xcc, 0xcc, 0xff,
+ 0x12, 0x01, 0x00, 0xdf, 0xcd, 0x00, 0x11, 0x46, 0x44, 0xee, 0xaa, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0xfe, 0x00, 0x12, 0xcb, 0xee, 0x1f, 0x40, 0x10, 0x0c, 0xed, 0xcc, 0xff,
+ 0x41, 0x32, 0x0f, 0xda,
+ 0xbe, 0xfe, 0x10, 0x40, 0x20, 0xfb, 0xdc, 0x0f, 0x40, 0x73, 0x11, 0xfa,
+ 0xdd, 0xef, 0xff, 0x00,
+ 0x63, 0x02, 0xea, 0xef, 0x00, 0x21, 0xde, 0xbc, 0x21, 0x44, 0x00, 0xfe,
+ 0xff, 0xff, 0x00, 0x35,
+ 0x21, 0xef, 0xde, 0xf0, 0xf0, 0x00, 0x11, 0x22, 0x00, 0x01, 0xdf, 0x88,
+ 0x22, 0x65, 0xf0, 0x00,
+ 0x12, 0xe0, 0xbd, 0x02, 0x25, 0xe0, 0xf0, 0x02, 0x00, 0xf0, 0xdf, 0xcd,
+ 0x22, 0x77, 0x12, 0x0f,
+ 0x00, 0xfe, 0x01, 0x33, 0x02, 0x12, 0x00, 0x9b, 0xfe, 0x12, 0x26, 0x00,
+ 0xcf, 0xf0, 0x10, 0x01,
+ 0xe0, 0xe0, 0x45, 0x10, 0xde, 0x43, 0x56, 0xff, 0xde, 0x12, 0x44, 0x11,
+ 0xf0, 0xee, 0xee, 0x32,
+ 0x75, 0x0e, 0xcc, 0x00, 0x43, 0x00, 0xec, 0xe0, 0xff, 0x10, 0x32, 0x00,
+ 0xd0, 0x00, 0x31, 0xc9,
+ 0xac, 0x20, 0x54, 0x10, 0x00, 0x00, 0x0f, 0xfd, 0x00, 0x00, 0x0e, 0x12,
+ 0x12, 0xdd, 0xca, 0xef,
+ 0xbc, 0xfe, 0x44, 0x22, 0xfd, 0x00, 0x20, 0x0e, 0x21, 0x10, 0xdb, 0x62,
+ 0x56, 0x00, 0xfe, 0x00,
+ 0x00, 0x00, 0x00, 0x32, 0x45, 0x21, 0x21, 0x10, 0x21, 0x77, 0x12, 0x11,
+ 0x00, 0xff, 0x33, 0x11,
+ 0xd0, 0x01, 0xe1, 0xf2, 0x77, 0x31, 0x00, 0x00, 0x10, 0x21, 0x33, 0x43,
+ 0x31, 0x20, 0x11, 0x00,
+ 0x13, 0x77, 0x14, 0x10, 0x00, 0xe0, 0xe0, 0x01, 0x77, 0x23, 0x00, 0xef,
+ 0x32, 0x11, 0x22, 0x75,
+ 0x01, 0xff, 0x23, 0x46, 0xf0, 0xff, 0x43, 0x22, 0x11, 0x12, 0x10, 0x00,
+ 0xed, 0xfe, 0x76, 0x32,
+ 0xdc, 0xff, 0x32, 0x22, 0xce, 0xee, 0x23, 0x00, 0x0f, 0x20, 0xfd, 0x20,
+ 0x77, 0x00, 0xdb, 0x30,
+ 0x51, 0x00, 0xfe, 0x0f, 0x10, 0x0f, 0xfc, 0x0f, 0x10, 0x00, 0xcd, 0xdc,
+ 0x65, 0x11, 0xcc, 0xed,
+ 0x10, 0x10, 0x11, 0x12, 0x00, 0xff, 0xff, 0x00, 0x10, 0xcd, 0x88, 0xfe,
+ 0x11, 0x34, 0x00, 0x00,
+ 0xf0, 0xcd, 0xee, 0x35, 0x32, 0xe0, 0xe0, 0xcf, 0xe2, 0x17, 0x90, 0xcd,
+ 0x01, 0x16, 0x01, 0xf0,
+ 0xd0, 0xcf, 0xff, 0x22, 0x32, 0xcd, 0xee, 0x12, 0x00, 0xbd, 0x11, 0x13,
+ 0x00, 0xff, 0xdc, 0xe0,
+ 0x04, 0xef, 0x89, 0x00, 0x01, 0xf0, 0xde, 0x12, 0x22, 0x0d, 0x1e, 0x66,
+ 0x11, 0xed, 0x00, 0x22,
+ 0xfe, 0xed, 0x44, 0x11, 0xea, 0x0f, 0x51, 0xec, 0xdb, 0x51, 0x10, 0x00,
+ 0x20, 0x20, 0x20, 0xef,
+ 0xb9, 0xff, 0x21, 0x41, 0xff, 0xbc, 0xed, 0xfd, 0x10, 0x42, 0x42, 0x22,
+ 0xeb, 0xdc, 0xfe, 0x0f,
+ 0xfe, 0x20, 0x33, 0x00, 0xdd, 0x8a, 0xdd, 0x00, 0x12, 0x0f, 0xff, 0x0f,
+ 0xfe, 0xfd, 0x01, 0x36,
+ 0x9e, 0xdd, 0x00, 0x00, 0x00, 0xf0, 0xbc, 0xed, 0x15, 0x12, 0xdc, 0xff,
+ 0x0f, 0xce, 0x00, 0x57,
+ 0x22, 0xf0, 0x9c, 0xff, 0x01, 0x01, 0x03, 0xe1, 0xcf, 0xf0, 0xf0, 0x01,
+ 0xdd, 0xba, 0x12, 0x01,
+ 0x00, 0x00, 0x0e, 0xfc, 0x00, 0x00, 0x20, 0x20, 0x1f, 0x1e, 0xfa, 0xae,
+ 0xbc, 0xf0, 0x00, 0x0d,
+ 0x21, 0x36, 0xe0, 0xab, 0xee, 0xed, 0x21, 0x77, 0x00, 0xfe, 0x00, 0xf0,
+ 0x00, 0x11, 0x0f, 0xfe,
+ 0x32, 0x53, 0xfd, 0xb9, 0xfe, 0x00, 0x10, 0x0f, 0x0e, 0x00, 0xde, 0xcd,
+ 0xf0, 0x00, 0xfe, 0xdd,
+ 0x00, 0x0f, 0xeb, 0xbb, 0xfe, 0x31, 0x20, 0x89, 0xff, 0x21, 0x20, 0xee,
+ 0xff, 0x00, 0xbc, 0x00,
+ 0x12, 0xff, 0xcb, 0xcc, 0x00, 0x22, 0x00, 0x8a, 0xfe, 0x11, 0x23, 0x00,
+ 0x00, 0xee, 0xff, 0x23,
+ 0x00, 0xcc, 0x00, 0xed, 0xdf, 0x36, 0xde, 0xbd, 0x31, 0x21, 0xfd, 0x00,
+ 0x36, 0x00, 0x01, 0x00,
+ 0x12, 0x75, 0x00, 0xcf, 0xe0, 0x01, 0x34, 0x11, 0xe0, 0x9c, 0x00, 0x34,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x30, 0x31, 0x01, 0x34, 0x10, 0xef, 0xcc, 0x43, 0x67, 0x00, 0xf0, 0x02,
+ 0x0f, 0xde, 0x00, 0x77,
+ 0x22, 0xff, 0xe0, 0x22, 0x35, 0x00, 0x11, 0x32, 0x12, 0x63, 0x44, 0x00,
+ 0x00, 0x11, 0x32, 0x00,
+ 0x00, 0x00, 0x63, 0x47, 0x11, 0xee, 0xdd, 0x23, 0x24, 0xee, 0x21, 0x33,
+ 0x00, 0x00, 0xfe, 0xca,
+ 0x40, 0x75, 0x20, 0x0e, 0x0f, 0x11, 0x00, 0xed, 0x20, 0x53, 0x0e, 0x0e,
+ 0x23, 0xc9, 0xaa, 0x00,
+ 0x21, 0x11, 0x00, 0x0e, 0xf0, 0x00, 0x10, 0x21, 0x00, 0xee, 0x00, 0x01,
+ 0xef, 0xce, 0xcd, 0x0f,
+ 0x56, 0x0f, 0xba, 0x00, 0x00, 0x0f, 0x21, 0x34, 0x00, 0xe0, 0xcf, 0xef,
+ 0xe0, 0xe0, 0x05, 0x24,
+ 0xf0, 0x80, 0xf0, 0xf0, 0xe0, 0x03, 0xf2, 0xcd, 0x04, 0x57, 0xf0, 0xef,
+ 0x33, 0x45, 0xff, 0xef,
+ 0xe0, 0x01, 0x22, 0xf0, 0xbd, 0xef, 0x01, 0x04, 0xee, 0xde, 0x01, 0xee,
+ 0xaa, 0x22, 0x44, 0x00,
+ 0xf0, 0x01, 0xf0, 0xf0, 0x23, 0x44, 0x24, 0xfe, 0xee, 0x40, 0x10, 0x1e,
+ 0x76, 0x21, 0x22, 0x33,
+ 0x20, 0x31, 0x54, 0xfd, 0xb8, 0x22, 0x54, 0x00, 0xfd, 0x10, 0x00, 0x00,
+ 0x03, 0x03, 0x5c, 0x02,
+ 0x30, 0x34, 0x30, 0x0f, 0x3b, 0x3e, 0x81, 0x19, 0xed, 0x55, 0x32, 0x0f,
+ 0x0e, 0x10, 0x0f, 0xda,
+ 0x00, 0x13, 0xce, 0xbc, 0x00, 0x33, 0xf0, 0xae, 0xfe, 0xfd, 0x12, 0x12,
+ 0x26, 0x12, 0xef, 0xdd,
+ 0x35, 0x23, 0x8d, 0xda, 0xe0, 0x00, 0x23, 0x33, 0xe0, 0xed, 0x10, 0x20,
+ 0xcc, 0xcd, 0x24, 0x33,
+ 0x22, 0x53, 0xff, 0xcc, 0xf0, 0xf0, 0xe0, 0x26, 0x00, 0xb0, 0xef, 0xcf,
+ 0xde, 0x03, 0x02, 0x0f,
+ 0x77, 0x25, 0xdd, 0xcb, 0x00, 0x62, 0x01, 0x0f, 0xff, 0xfe, 0x0f, 0x12,
+ 0x00, 0xda, 0x00, 0x10,
+ 0xef, 0xde, 0x52, 0x55, 0xff, 0xec, 0x01, 0x23, 0xcd, 0xdc, 0x44, 0x32,
+ 0xff, 0xff, 0xff, 0xef,
+ 0x21, 0x11, 0x0f, 0x30, 0x30, 0x00, 0x0d, 0xdd, 0xab, 0xfe, 0x44, 0x33,
+ 0xf0, 0xd0, 0xdd, 0xdb,
+ 0x9a, 0x00, 0x74, 0x01, 0x0e, 0x0f, 0x24, 0x10, 0xed, 0x0f, 0x43, 0x00,
+ 0xfc, 0x00, 0x12, 0xed,
+ 0xdd, 0x46, 0x21, 0xce, 0x00, 0x31, 0x1f, 0xfe, 0x0f, 0x00, 0x64, 0x11,
+ 0x12, 0x46, 0x00, 0xbc,
+ 0xee, 0x56, 0x22, 0xef, 0xfe, 0x00, 0x33, 0x10, 0x00, 0x10, 0x01, 0x22,
+ 0x45, 0x01, 0xbd, 0x00,
+ 0x56, 0x23, 0x01, 0xcf, 0xde, 0x01, 0x46, 0x11, 0xcf, 0xcd, 0x00, 0x35,
+ 0x11, 0x00, 0x00, 0xed,
+ 0x00, 0x01, 0xf0, 0x11, 0x21, 0x11, 0x12, 0xd0, 0x9d, 0x01, 0x00, 0x37,
+ 0x66, 0xee, 0xbc, 0x00,
+ 0x12, 0x11, 0x02, 0x00, 0xf0, 0xde, 0x01, 0x25, 0xf0, 0x00, 0x32, 0xd0,
+ 0x20, 0x31, 0xdf, 0x00,
+ 0x61, 0x31, 0x0f, 0xc8, 0xad, 0xff, 0x00, 0x00, 0x22, 0x01, 0xba, 0xee,
+ 0x0f, 0x0e, 0xd9, 0x00,
+ 0x40, 0x21, 0xdd, 0xde, 0x60, 0x21, 0x0f, 0xfd, 0xfd, 0xff, 0xff, 0xa8,
+ 0xff, 0x21, 0x00, 0x0e,
+ 0x10, 0x0f, 0xbb, 0xfe, 0x32, 0x31, 0xef, 0xbc, 0xf0, 0x22, 0x11, 0xfe,
+ 0xf0, 0xef, 0xcd, 0xff,
+ 0xff, 0x0d, 0x41, 0x23, 0xca, 0xde, 0x34, 0x33, 0xcf, 0x10, 0x21, 0xef,
+ 0x47, 0xf1, 0x8b, 0xb0,
+ 0x27, 0x22, 0xf0, 0xef, 0xce, 0xf0, 0x22, 0x00, 0xee, 0xe0, 0xff, 0x32,
+ 0x76, 0x00, 0xf0, 0xde,
+ 0xff, 0x00, 0x11, 0x01, 0xff, 0xcc, 0xde, 0x00, 0x22, 0x41, 0xfe, 0xc9,
+ 0xf0, 0x00, 0x02, 0x22,
+ 0x22, 0x00, 0x11, 0x77, 0x31, 0xdf, 0x00, 0x21, 0xcc, 0xdc, 0x73, 0x33,
+ 0xfd, 0xfd, 0x12, 0x22,
+ 0x0e, 0x10, 0x00, 0xfd, 0x00, 0x41, 0x00, 0x0c, 0x0f, 0x0f, 0xe9, 0x0e,
+ 0x75, 0x73, 0x0e, 0xfb,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x0e, 0xfd, 0x12, 0xf0, 0x9a, 0x0f, 0x23,
+ 0x44, 0xed, 0xdb, 0x21,
+ 0x44, 0x00, 0x00, 0x22, 0xf0, 0xce, 0xf0, 0xf0, 0x02, 0x24, 0x22, 0xf0,
+ 0xff, 0x12, 0x00, 0xbc,
+ 0x23, 0x77, 0x00, 0x10, 0x11, 0xf0, 0xf0, 0x04, 0x23, 0x00, 0xd0, 0xc0,
+ 0x07, 0x53, 0xe0, 0xcf,
+ 0x01, 0x14, 0x00, 0xad, 0x00, 0x57, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11,
+ 0x02, 0x10, 0x10, 0xfd,
+ 0xdd, 0xf0, 0x34, 0x00, 0xbc, 0xed, 0x10, 0x44, 0x01, 0xdd, 0xdb, 0x01,
+ 0x55, 0x00, 0x00, 0xdf,
+ 0xde, 0x75, 0x32, 0xde, 0x0f, 0x11, 0x0f, 0xec, 0x20, 0x51, 0x00, 0x11,
+ 0x00, 0xda, 0x00, 0x11,
+ 0x10, 0x11, 0xad, 0x98, 0xff, 0x21, 0x31, 0x00, 0xfd, 0x00, 0x43, 0x10,
+ 0x0d, 0x0d, 0x0f, 0x36,
+ 0x42, 0xef, 0xde, 0x10, 0x0f, 0xaa, 0x00, 0x01, 0x31, 0x10, 0x0f, 0x0e,
+ 0x0f, 0x10, 0xf0, 0x43,
+ 0x77, 0x01, 0x00, 0x00, 0xfe, 0xaa, 0x00, 0x11, 0x11, 0x00, 0x20, 0x0f,
+ 0x00, 0x02, 0x55, 0x21,
+ 0x0f, 0x0e, 0x76, 0x23, 0x00, 0x13, 0x14, 0x00, 0x02, 0x02, 0xf1, 0xae,
+ 0xfd, 0x14, 0x13, 0x01,
+ 0x23, 0x22, 0x01, 0xe0, 0x00, 0x43, 0x0b, 0xce, 0x37, 0x21, 0x00, 0x22,
+ 0x00, 0x8d, 0xfe, 0x01,
+ 0x36, 0x20, 0xee, 0xe0, 0xbc, 0x01, 0x57, 0x01, 0xdf, 0x00, 0x22, 0xff,
+ 0xf0, 0x12, 0x00, 0x00,
+ 0x10, 0x73, 0x23, 0x10, 0x0e, 0x10, 0x01, 0xfe, 0xfd, 0xfb, 0xcc, 0xf0,
+ 0x12, 0x00, 0xaa, 0xfd,
+ 0xfe, 0x0e, 0xee, 0x01, 0x30, 0x1d, 0x0b, 0x0d, 0x71, 0x33, 0xfc, 0xda,
+ 0xef, 0xfe, 0xef, 0xde,
+ 0x8b, 0xfe, 0x20, 0x0e, 0xfd, 0x01, 0x0f, 0xb8, 0x00, 0x31, 0x22, 0xd0,
+ 0xff, 0x20, 0x00, 0x8a,
+ 0xf0, 0x34, 0xf0, 0xac, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x00, 0x11, 0x34,
+ 0xf0, 0xcd, 0x11, 0x23,
+ 0xf0, 0xe2, 0xd3, 0xc4, 0xd1, 0xd0, 0xc0, 0xf0, 0x05, 0xc1, 0xf4, 0x03,
+ 0xbf, 0x11, 0x77, 0x00,
+ 0xdd, 0x15, 0x32, 0xde, 0xde, 0x00, 0xed, 0x10, 0x44, 0xdd, 0xbb, 0x00,
+ 0x11, 0x00, 0x0e, 0xed,
+ 0x00, 0x00, 0xe0, 0x33, 0x10, 0xdd, 0x31, 0x54, 0x42, 0x10, 0x1e, 0x0c,
+ 0x0c, 0x74, 0x43, 0x0e,
+ 0x22, 0x55, 0x1e, 0x0b, 0xee, 0xfe, 0x00, 0x21, 0x54, 0x0f, 0xc9, 0xde,
+ 0x00, 0x21, 0x0f, 0x20,
+ 0x70, 0x00, 0x0f, 0x0d, 0x0c, 0x11, 0x11, 0xdb, 0xfe, 0x31, 0xff, 0xcc,
+ 0x0f, 0xcc, 0xef, 0x22,
+ 0x01, 0xce, 0xff, 0x66, 0x11, 0x00, 0xef, 0xcc, 0xf0, 0x06, 0x00, 0xef,
+ 0xd0, 0xcf, 0xe0, 0x00,
+ 0xdf, 0x02, 0x46, 0xf0, 0xbe, 0x11, 0x43, 0x0e, 0x0f, 0x00, 0xf1, 0x05,
+ 0x02, 0xaf, 0xef, 0x15,
+ 0x01, 0xae, 0xf1, 0x06, 0x12, 0xf0, 0xce, 0x00, 0x02, 0x00, 0x0f, 0x1f,
+ 0x42, 0x00, 0xdd, 0x00,
+ 0x10, 0x22, 0x76, 0x0e, 0xd8, 0x20, 0x63, 0xef, 0xcb, 0x0f, 0x21, 0x10,
+ 0x0f, 0x00, 0xde, 0xe0,
+ 0x31, 0x0f, 0xfe, 0x21, 0xde, 0xac, 0x34, 0x43, 0x0f, 0x2e, 0x1f, 0x31,
+ 0x11, 0xd9, 0x1f, 0x73,
+ 0x2f, 0xa8, 0x00, 0x12, 0xff, 0xcd, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x31,
+ 0x00, 0xfd, 0x30, 0x2d,
+ 0x0c, 0x02, 0xe1, 0xbd, 0x42, 0x00, 0xb8, 0xff, 0x10, 0xff, 0x21, 0x76,
+ 0xfe, 0xdb, 0xf0, 0x00,
+ 0x22, 0x12, 0xef, 0xee, 0xff, 0xee, 0xcd, 0x26, 0x54, 0xf0, 0xe0, 0x00,
+ 0xf0, 0xef, 0xe0, 0xac,
+ 0x20, 0x76, 0x00, 0xfd, 0x11, 0x10, 0x00, 0x45, 0x22, 0xf0, 0xf1, 0xe0,
+ 0x02, 0x34, 0x01, 0xc0,
+ 0x01, 0x02, 0x22, 0x00, 0x53, 0x00, 0xfd, 0x03, 0x47, 0x62, 0x00, 0xda,
+ 0xf0, 0x64, 0x11, 0xee,
+ 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x24, 0x21, 0xef, 0xe0, 0x44,
+ 0xf0, 0xbd, 0x37, 0x14,
+ 0xe0, 0x52, 0x22, 0xde, 0x00, 0x77, 0x42, 0x00, 0x00, 0x00, 0x10, 0x20,
+ 0x10, 0xee, 0x00, 0x03,
+ 0x00, 0xde, 0x00, 0x02, 0x0e, 0xc8, 0x0e, 0x73, 0x00, 0xdc, 0x0f, 0x0e,
+ 0x2f, 0x2f, 0x20, 0xfd,
+ 0x89, 0x00, 0x10, 0x0e, 0x0e, 0x00, 0xfd, 0xfe, 0x0f, 0xfc, 0xed, 0xfd,
+ 0xde, 0xdf, 0xef, 0xe0,
+ 0xf0, 0x00, 0x3f, 0x20, 0xa0, 0x88, 0xf0, 0x00, 0xde, 0x01, 0x34, 0x0d,
+ 0xd8, 0x0f, 0x21, 0x20,
+ 0xde, 0x00, 0x75, 0x21, 0xbf, 0xf0, 0x03, 0xef, 0xd0, 0x37, 0xe0, 0x8e,
+ 0xf0, 0x03, 0xf0, 0x00,
+ 0xf0, 0xef, 0xf2, 0x16, 0x01, 0x12, 0x11, 0xf0, 0xde, 0x34, 0x44, 0xe0,
+ 0xce, 0xfe, 0xfe, 0x30,
+ 0x00, 0xec, 0x00, 0x44, 0x53, 0xee, 0xab, 0x01, 0x23, 0x00, 0x00, 0x13,
+ 0x45, 0x00, 0xcc, 0x21,
+ 0x64, 0x32, 0x21, 0x0f, 0x2f, 0x31, 0x31, 0x44, 0x10, 0x00, 0x44, 0x12,
+ 0xdb, 0x10, 0x74, 0x0f,
+ 0x0d, 0x00, 0x21, 0x00, 0x30, 0x20, 0x2c, 0x62, 0x01, 0x0f, 0xfc, 0x0e,
+ 0x1e, 0x0d, 0x1d, 0x31,
+ 0x45, 0xfb, 0xdc, 0x00, 0xff, 0x8a, 0x00, 0x35, 0x00, 0x0f, 0x20, 0x12,
+ 0xbe, 0xef, 0x24, 0x13,
+ 0xde, 0xbd, 0x00, 0x01, 0xde, 0xce, 0x00, 0x0f, 0x2c, 0x21, 0x22, 0xfe,
+ 0xcc, 0x22, 0x66, 0x00,
+ 0xdf, 0xbf, 0xf2, 0x06, 0xe0, 0xde, 0xd0, 0xcf, 0x01, 0x05, 0xd0, 0xd0,
+ 0x25, 0x00, 0x00, 0x10,
+ 0xb0, 0x03, 0x55, 0x00, 0x00, 0x0e, 0xbc, 0x12, 0x23, 0xca, 0xee, 0x30,
+ 0x31, 0xdf, 0xac, 0x00,
+ 0x11, 0x01, 0x00, 0xdb, 0x0f, 0x53, 0xe0, 0xcf, 0x14, 0x20, 0xfd, 0x0e,
+ 0x72, 0x02, 0x00, 0x11,
+ 0x0c, 0x0e, 0x34, 0xff, 0xed, 0x32, 0x0f, 0xc8, 0x00, 0x01, 0xdf, 0xdd,
+ 0x10, 0x42, 0x10, 0x0d,
+ 0x3f, 0x74, 0x00, 0x0f, 0x20, 0x56, 0x01, 0x00, 0x20, 0x30, 0xec, 0x0e,
+ 0x75, 0x00, 0xfe, 0x0f,
+ 0x0d, 0x2e, 0x22, 0x21, 0x21, 0x24, 0x0f, 0xff, 0x40, 0x20, 0xdc, 0xd0,
+ 0xd3, 0xb3, 0xce, 0xe8,
+ 0xed, 0x00, 0x43, 0x51, 0x1d, 0x51, 0x37, 0x00, 0x10, 0x32, 0x33, 0x01,
+ 0x23, 0x24, 0xef, 0x23,
+ 0x77, 0x03, 0xf3, 0xb0, 0xcd, 0x02, 0x27, 0x11, 0xf1, 0x02, 0x02, 0x00,
+ 0xf0, 0x36, 0x10, 0xd0,
+ 0x0f, 0x10, 0x31, 0x11, 0x9e, 0xdc, 0x00, 0x21, 0x04, 0x01, 0x20, 0xf0,
+ 0xaf, 0x04, 0x01, 0xad,
+ 0xef, 0xf1, 0x04, 0xd0, 0xb0, 0x06, 0xf0, 0xef, 0x20, 0x32, 0x10, 0x03,
+ 0x04, 0x10, 0x73, 0x13,
+ 0xfe, 0x00, 0xef, 0xa8, 0xdd, 0x0e, 0x01, 0x0d, 0x0b, 0x01, 0xef, 0x9c,
+ 0x00, 0x21, 0x0d, 0xf9,
+ 0x20, 0x0f, 0xbb, 0xed, 0x0e, 0x0f, 0x1f, 0x2e, 0x0e, 0x0e, 0xdb, 0xfe,
+ 0x3f, 0x1e, 0x0e, 0xfd,
+ 0x0e, 0x60, 0xfd, 0xdd, 0xca, 0x9c, 0x00, 0x34, 0xef, 0xcd, 0xfd, 0xed,
+ 0xde, 0x35, 0x32, 0xcd,
+ 0xfd, 0x40, 0x30, 0x0c, 0xff, 0x12, 0x01, 0xbd, 0xdf, 0x46, 0x00, 0xd0,
+ 0xe0, 0xd1, 0xa1, 0xce,
+ 0xf0, 0x17, 0x01, 0xc0, 0xf1, 0x15, 0xf0, 0xdf, 0x14, 0xc0, 0xdf, 0x41,
+ 0x23, 0xef, 0x9e, 0xf2,
+ 0x05, 0x00, 0x0d, 0x0e, 0xec, 0x00, 0x03, 0xf0, 0xcc, 0xee, 0xe0, 0xdf,
+ 0x9d, 0x04, 0x06, 0xcf,
+ 0xff, 0x33, 0x13, 0xff, 0x23, 0x75, 0x10, 0x10, 0x33, 0x13, 0x0e, 0xfc,
+ 0x11, 0x41, 0xe8, 0xed,
+ 0x42, 0x10, 0xff, 0x52, 0x1f, 0xfa, 0x20, 0x10, 0x10, 0x20, 0x00, 0x50,
+ 0x42, 0x0d, 0xfa, 0x10,
+ 0x20, 0x1f, 0x0f, 0x1e, 0x0c, 0x10, 0x30, 0xdf, 0xbc, 0x40, 0x51, 0x10,
+ 0x00, 0x0e, 0xfd, 0x10,
+ 0x10, 0x24, 0x35, 0xbf, 0xc0, 0xf4, 0xf4, 0xb0, 0xff, 0x00, 0x35, 0x22,
+ 0x00, 0x11, 0x20, 0x21,
+ 0x00, 0x76, 0x43, 0x01, 0x00, 0xf2, 0xe2, 0xe0, 0x27, 0x33, 0xd1, 0xb1,
+ 0xf2, 0xe1, 0xf3, 0x37,
+ 0xd1, 0x80, 0x00, 0x03, 0x12, 0x00, 0x01, 0x15, 0x23, 0x01, 0x11, 0x12,
+ 0x10, 0x1f, 0x70, 0x25,
+ 0xf0, 0xff, 0x10, 0x1e, 0x0c, 0xbd, 0xe0, 0xce, 0xdc, 0x01, 0x05, 0x13,
+ 0x30, 0x0e, 0x0c, 0x52,
+ 0x22, 0x42, 0x22, 0x0f, 0xfc, 0xdb, 0x50, 0x33, 0x11, 0x1f, 0xb9, 0xdf,
+ 0x00, 0x21, 0x0e, 0xef,
+ 0x32, 0x42, 0xec, 0xdd, 0x0f, 0x0c, 0x70, 0x65, 0x0f, 0xfc, 0x0f, 0x00,
+ 0x00, 0x21, 0x45, 0x11,
+ 0x00, 0xec, 0xed, 0x10, 0x30, 0x00, 0x2f, 0x73, 0x41, 0x0c, 0x1e, 0x21,
+ 0x00, 0xe1, 0x07, 0xe1,
+ 0xe0, 0x00, 0xa0, 0xdd, 0x01, 0x02, 0x0e, 0x3c, 0x70, 0x2e, 0xe8, 0x0f,
+ 0x33, 0x11, 0x63, 0x34,
+ 0x10, 0xf0, 0x01, 0x26, 0x21, 0x02, 0x45, 0x11, 0xd0, 0xa0, 0x13, 0x25,
+ 0x00, 0x00, 0x41, 0x01,
+ 0x00, 0x03, 0x04, 0x00, 0x63, 0x43, 0x11, 0xf0, 0xe1, 0x02, 0x0c, 0x0b,
+ 0x42, 0x11, 0xbc, 0xdd,
+ 0x02, 0x46, 0x00, 0xce, 0xf0, 0x03, 0x03, 0x03, 0xe0, 0xef, 0x32, 0x44,
+ 0x01, 0x42, 0x0f, 0xfa,
+ 0x32, 0x54, 0xf0, 0x01, 0x13, 0x00, 0x42, 0x11, 0xed, 0xac, 0xf0, 0x00,
+ 0xeb, 0x0f, 0x21, 0x0e,
+ 0xff, 0x12, 0xee, 0xd9, 0x4e, 0x60, 0x11, 0x01, 0x0e, 0xcc, 0xfe, 0x1d,
+ 0x2e, 0xe9, 0xbc, 0xfe,
+ 0x1e, 0x3f, 0x0e, 0x0c, 0x0e, 0x00, 0xbf, 0xbb, 0x0e, 0x0f, 0xf0, 0x03,
+ 0xc0, 0xad, 0xff, 0x01,
+ 0xfe, 0xf8, 0x00, 0x10, 0xed, 0xcc, 0x00, 0x00, 0x0d, 0x00, 0x33, 0x00,
+ 0xdf, 0x0f, 0x10, 0xa0,
+ 0xbe, 0xef, 0xde, 0xdf, 0x03, 0x07, 0xd0, 0x81, 0xe4, 0x05, 0x11, 0xe0,
+ 0xf1, 0xf5, 0xf2, 0x03,
+ 0xe3, 0xc0, 0xf0, 0x10, 0x0d, 0xdc, 0x41, 0x54, 0xfc, 0xcc, 0x00, 0x10,
+ 0xdd, 0xc0, 0x04, 0xfd,
+ 0xaa, 0x00, 0x00, 0xbd, 0x0f, 0x00, 0x0e, 0x10, 0x44, 0x11, 0x00, 0x27,
+ 0x42, 0x20, 0x30, 0x52,
+ 0x11, 0x00, 0x10, 0x21, 0x0f, 0x0c, 0x2f, 0x61, 0x0f, 0x0b, 0x00, 0xfe,
+ 0x0e, 0x43, 0x10, 0x09,
+ 0x10, 0x20, 0xfe, 0x0d, 0x0e, 0x0e, 0x0b, 0x0d, 0x0e, 0xdb, 0xbd, 0xfe,
+ 0xfe, 0x2f, 0x71, 0x1d,
+ 0xfa, 0x00, 0x11, 0x00, 0x02, 0x45, 0xd0, 0x80, 0xc0, 0x00, 0xff, 0xdf,
+ 0xef, 0xdd, 0xeb, 0x12,
+ 0x24, 0xff, 0xde, 0x0f, 0x32, 0x44, 0x32, 0x21, 0x10, 0xf0, 0x90, 0xce,
+ 0xf0, 0x04, 0xb1, 0xf6,
+ 0x06, 0xf2, 0xc0, 0xef, 0x10, 0x23, 0x27, 0xe1, 0x8f, 0xee, 0xf0, 0xee,
+ 0x01, 0x46, 0xf0, 0xcc,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0xf0, 0xdf, 0xde, 0x21, 0xed, 0x89, 0x00,
+ 0x00, 0xef, 0xfe, 0x21,
+ 0x10, 0x0e, 0x0f, 0x31, 0x34, 0x10, 0x60, 0x31, 0x22, 0x21, 0x0f, 0x0e,
+ 0x10, 0x0f, 0xfa, 0x0f,
+ 0x30, 0xff, 0x8c, 0xdb, 0x0e, 0x11, 0x01, 0xdd, 0x0e, 0x31, 0x23, 0x20,
+ 0x1a, 0x9a, 0xf0, 0x23,
+ 0x10, 0xde, 0xfc, 0xdf, 0xdf, 0xcf, 0xc0, 0xef, 0x51, 0x50, 0x30, 0x1f,
+ 0x20, 0x01, 0x00, 0x26,
+ 0x15, 0xa0, 0xf0, 0x02, 0xf0, 0xbf, 0xf3, 0x05, 0xef, 0xba, 0x00, 0x00,
+ 0x12, 0x11, 0x31, 0x30,
+ 0x20, 0x40, 0x10, 0x20, 0x20, 0x09, 0xec, 0x20, 0x33, 0xd2, 0x23, 0x62,
+ 0x00, 0x23, 0x47, 0xe0,
+ 0xd1, 0x13, 0x73, 0x25, 0x01, 0x01, 0x12, 0x02, 0x02, 0x21, 0x71, 0x41,
+ 0x22, 0x00, 0x12, 0x36,
+ 0x32, 0x11, 0x00, 0x30, 0x02, 0xc0, 0xcd, 0xed, 0x24, 0x47, 0xe0, 0xb0,
+ 0x02, 0x13, 0x44, 0x34,
+ 0x02, 0xe0, 0x23, 0x77, 0x00, 0x00, 0x10, 0x55, 0x00, 0x00, 0x12, 0x12,
+ 0x11, 0x00, 0x10, 0xf0,
+ 0xb0, 0x04, 0x33, 0x2f, 0x0e, 0x20, 0x21, 0x0d, 0xee, 0x00, 0x0d, 0x08,
+ 0x4e, 0x40, 0xc0, 0xad,
+ 0xfb, 0x0f, 0x1d, 0x50, 0x20, 0x0b, 0x0d, 0x1f, 0x1c, 0x1d, 0x1f, 0xcd,
+ 0xcc, 0x00, 0xf0, 0xbb,
+ 0xff, 0x0f, 0xf0, 0xad, 0xec, 0xf0, 0x1f, 0x0b, 0x0e, 0x00, 0x00, 0xfd,
+ 0xdc, 0x0e, 0xfd, 0x0e,
+ 0xf0, 0xdf, 0xee, 0x2e, 0xef, 0x8c, 0xa4, 0x17, 0x02, 0xff, 0x01, 0x02,
+ 0xce, 0xe1, 0xf6, 0xd1,
+ 0xd2, 0xf2, 0xd1, 0xf2, 0x05, 0x13, 0xf1, 0xf1, 0x73, 0x33, 0x02, 0x01,
+ 0xf0, 0x01, 0xf0, 0xbd,
+ 0xce, 0xe0, 0xf0, 0xcc, 0xd0, 0xdf, 0xdd, 0x05, 0x07, 0xd2, 0xd0, 0x63,
+ 0x33, 0xfe, 0xfb, 0x72,
+ 0x44, 0x22, 0x23, 0x10, 0x10, 0x35, 0x11, 0x10, 0x1e, 0x20, 0x41, 0x23,
+ 0x20, 0x50, 0x47, 0x34,
+ 0x32, 0x50, 0x3f, 0x2e, 0x2f, 0x1f, 0x22, 0x11, 0x1e, 0x1e, 0x10, 0x1b,
+ 0x6d, 0x3e, 0x1a, 0x0c,
+ 0x3f, 0x5e, 0x0c, 0x0c, 0x0d, 0x0e, 0x32, 0x40, 0xed, 0xef, 0xc3, 0xaf,
+ 0xec, 0x00, 0x00, 0xff,
+ 0xde, 0xf2, 0xf0, 0xd9, 0xff, 0xfe, 0xf9, 0x6e, 0x30, 0x0e, 0xc0, 0x03,
+ 0x42, 0x10, 0x00, 0xf1,
+ 0xe4, 0xd0, 0x8f, 0xe0, 0x05, 0xf0, 0xe0, 0xc0, 0xd0, 0xe3, 0x07, 0xf4,
+ 0xc1, 0xc2, 0xe2, 0xf3,
+ 0xd0, 0xe1, 0x10, 0x50, 0x14, 0xe0, 0xef, 0x22, 0x0f, 0xd9, 0xdf, 0xcf,
+ 0xbd, 0xfe, 0xcd, 0xda,
+ 0xbd, 0xff, 0x01, 0xf0, 0xcd, 0x02, 0x24, 0x20, 0x2e, 0x62, 0x05, 0x05,
+ 0x75, 0x00, 0xb9, 0x00,
+ 0x7a, 0xe9, 0x9c, 0x03, 0x95, 0xeb, 0x00, 0x06, 0x23, 0x76, 0x2f, 0x9a,
+ 0x00, 0x13, 0x11, 0x00,
+ 0xff, 0xed, 0xff, 0xf1, 0xf2, 0x30, 0x30, 0x1f, 0x3f, 0xfe, 0x9f, 0xff,
+ 0x01, 0x14, 0xf0, 0x35,
+ 0x21, 0xe0, 0x00, 0xc8, 0xcd, 0x64, 0x31, 0xfe, 0xfc, 0x41, 0x0e, 0xdd,
+ 0x55, 0x24, 0xff, 0x00,
+ 0x10, 0x0d, 0x10, 0x10, 0xe2, 0xd2, 0xec, 0x0f, 0x10, 0x3e, 0x4d, 0x0b,
+ 0x62, 0x47, 0x20, 0x0f,
+ 0x1f, 0x70, 0x14, 0x0f, 0x00, 0x41, 0x0e, 0xbc, 0x22, 0x22, 0x00, 0x11,
+ 0x56, 0x00, 0xed, 0x11,
+ 0x25, 0xef, 0xe0, 0x34, 0x00, 0x0f, 0x70, 0x12, 0xe0, 0x12, 0x34, 0x1e,
+ 0x0f, 0x55, 0x12, 0xf0,
+ 0xdd, 0x21, 0x23, 0x12, 0xe0, 0xe0, 0x12, 0x33, 0x67, 0xe1, 0xdf, 0x01,
+ 0x57, 0x20, 0xd0, 0xf0,
+ 0x00, 0x61, 0x14, 0xf0, 0x01, 0x24, 0x00, 0xe0, 0x51, 0x36, 0xc0, 0xef,
+ 0x02, 0x00, 0xf0, 0x01,
+ 0x30, 0x11, 0xf5, 0xe0, 0x50, 0x32, 0xc0, 0x00, 0x31, 0x26, 0x34, 0xbf,
+ 0xbc, 0xff, 0x00, 0x20,
+ 0x0f, 0xff, 0xee, 0x30, 0x52, 0xec, 0x11, 0x65, 0xfe, 0xf0, 0x21, 0xec,
+ 0xdb, 0x11, 0xf0, 0xde,
+ 0x00, 0x40, 0xfe, 0xdd, 0xde, 0x11, 0x74, 0x1e, 0x09, 0xee, 0x00, 0x41,
+ 0x00, 0x99, 0x00, 0x00,
+ 0x01, 0x10, 0x1f, 0xcb, 0xff, 0x10, 0x1f, 0x00, 0xe2, 0xf2, 0xbb, 0xee,
+ 0x1f, 0x10, 0xd0, 0xc3,
+ 0xc0, 0xcc, 0x0d, 0x30, 0x12, 0xbf, 0x01, 0x10, 0xfc, 0xc0, 0x01, 0xfe,
+ 0xfc, 0xdc, 0x00, 0x04,
+ 0xa0, 0xef, 0xb8, 0x0f, 0x01, 0xe0, 0xef, 0xe0, 0xce, 0xec, 0xf1, 0x02,
+ 0xe1, 0x40, 0x22, 0xce,
+ 0xdd, 0x00, 0x21, 0xe0, 0xd0, 0xe0, 0xa0, 0xd9, 0xed, 0x0e, 0xea, 0xef,
+ 0x64, 0x00, 0xcd, 0x00,
+ 0x45, 0x0f, 0xac, 0xff, 0x24, 0x10, 0xdc, 0x00, 0x23, 0x00, 0xa9, 0xfe,
+ 0x21, 0x31, 0xf0, 0xff,
+ 0x0f, 0xed, 0x3f, 0x42, 0xd0, 0xdc, 0x00, 0x10, 0x0e, 0xcb, 0xf0, 0x00,
+ 0x01, 0xff, 0xe0, 0xbd,
+ 0xfc, 0x21, 0x42, 0x0c, 0x20, 0x00, 0xbf, 0xea, 0x0f, 0x20, 0x41, 0x01,
+ 0xbc, 0xfe, 0x01, 0x02,
+ 0x00, 0x42, 0x10, 0x0b, 0x00, 0xcf, 0xcf, 0x03, 0x27, 0x01, 0x8c, 0xf0,
+ 0x12, 0x20, 0x00, 0xcd,
+ 0xf0, 0x06, 0x11, 0x43, 0x00, 0xde, 0x11, 0x32, 0xe0, 0x02, 0x25, 0xdf,
+ 0xbf, 0xfd, 0xee, 0xf1,
+ 0xe2, 0xef, 0x0d, 0x01, 0x85, 0xe0, 0x02, 0x54, 0x01, 0x2f, 0x00, 0xe1,
+ 0xf4, 0x00, 0xfb, 0xcc,
+ 0x00, 0x55, 0xef, 0xce, 0x02, 0x12, 0xfe, 0xfd, 0x20, 0x75, 0x00, 0xcd,
+ 0xfd, 0x25, 0x10, 0x00,
+ 0xe1, 0x00, 0xee, 0xf0, 0x0c, 0x4f, 0x00, 0xf3, 0x04, 0x0c, 0x2d, 0x74,
+ 0x10, 0x0f, 0x0d, 0xef,
+ 0x10, 0x5f, 0x0c, 0x1f, 0xf0, 0xb4, 0x06, 0x20, 0x0d, 0xef, 0x02, 0x21,
+ 0x10, 0x0d, 0xd8, 0x2f,
+ 0x52, 0x11, 0x4f, 0x0d, 0xfe, 0x07, 0x30, 0x0f, 0xee, 0x2e, 0x72, 0x40,
+ 0xfb, 0x33, 0x67, 0x00,
+ 0xe0, 0x0f, 0x20, 0x30, 0x11, 0x22, 0xd0, 0xa0, 0x26, 0x42, 0xff, 0x00,
+ 0x43, 0x20, 0x00, 0x43,
+ 0x12, 0x12, 0x17, 0x00, 0x30, 0x52, 0x00, 0x0d, 0x0e, 0x12, 0x03, 0xb0,
+ 0x04, 0x57, 0x01, 0xd0,
+ 0x40, 0x35, 0xf0, 0xee, 0x76, 0x21, 0xff, 0x0f, 0x00, 0x02, 0x33, 0x13,
+ 0x10, 0x10, 0x22, 0xe4,
+ 0xe0, 0x2f, 0x73, 0x37, 0x01, 0x01, 0x10, 0xfe, 0x00, 0x13, 0x01, 0x56,
+ 0x52, 0x00, 0x00, 0xf1,
+ 0x03, 0x01, 0x30, 0x41, 0x0e, 0xf0, 0xd0, 0x2f, 0x77, 0x72, 0xfc, 0xf1,
+ 0x14, 0x00, 0x10, 0x1d,
+ 0x10, 0x00, 0xcd, 0x04, 0x36, 0xee, 0xed, 0x13, 0x50, 0x21, 0x00, 0xfd,
+ 0x12, 0x24, 0xdc, 0xde,
+ 0x63, 0x0f, 0xfa, 0x01, 0x22, 0x0f, 0x0e, 0x20, 0x00, 0x20, 0x20, 0xff,
+ 0xff, 0xd0, 0x21, 0xed,
+ 0x88, 0xd0, 0x34, 0xdf, 0xcc, 0x01, 0x01, 0x33, 0x77, 0xd0, 0xce, 0x21,
+ 0x40, 0x00, 0xe0, 0xff,
+ 0xf0, 0x01, 0x13, 0xfe, 0xdf, 0xf0, 0x1f, 0x0f, 0xa4, 0xd6, 0xf0, 0xed,
+ 0xef, 0x11, 0x00, 0xdd,
+ 0x37, 0xc0, 0xbb, 0x71, 0x03, 0xe0, 0x00, 0x05, 0x32, 0x10, 0x0f, 0xe0,
+ 0xed, 0x0f, 0x35, 0x01,
+ 0x8c, 0x0e, 0x31, 0x33, 0xf2, 0xff, 0xf0, 0x04, 0xff, 0x0e, 0x4f, 0xd0,
+ 0xe3, 0x01, 0xa8, 0xfe,
+ 0x20, 0x74, 0x50, 0xeb, 0xf0, 0x10, 0x10, 0x0f, 0xf0, 0x30, 0x11, 0xfe,
+ 0xee, 0xf1, 0xe1, 0xe0,
+ 0x12, 0x63, 0xf8, 0xde, 0x40, 0x12, 0xfe, 0xef, 0x10, 0x00, 0xc8, 0x1e,
+ 0x52, 0xe2, 0xcf, 0x1f,
+ 0x0d, 0xcb, 0x20, 0x72, 0x14, 0xf0, 0xcd, 0x0c, 0x00, 0x00, 0xee, 0x00,
+ 0x06, 0x00, 0xed, 0xe1,
+ 0x03, 0x32, 0x32, 0xee, 0x9a, 0x00, 0xf0, 0xe0, 0xd1, 0x22, 0x30, 0xed,
+ 0x0f, 0x10, 0x00, 0xef,
+ 0x81, 0xde, 0x00, 0x03, 0x00, 0xcd, 0xb8, 0xf8, 0x00, 0x10, 0x00, 0x00,
+ 0xc0, 0x01, 0x32, 0x3e,
+ 0x0e, 0xdf, 0x8a, 0x01, 0x04, 0x02, 0xec, 0xdd, 0x0f, 0x40, 0xf0, 0x01,
+ 0xdf, 0xfe, 0x10, 0xff,
+ 0xca, 0x0e, 0x12, 0x16, 0xa0, 0xcd, 0xee, 0x0f, 0x30, 0xb0, 0xff, 0x0d,
+ 0xee, 0x00, 0x3e, 0x0a,
+ 0x0f, 0x00, 0x00, 0xcf, 0xc9, 0x11, 0x51, 0xde, 0xdf, 0xe0, 0xe1, 0xad,
+ 0xfb, 0x0f, 0xef, 0x10,
+ 0x31, 0x8c, 0xec, 0x00, 0x25, 0x10, 0xca, 0xf0, 0x42, 0xf0, 0xcc, 0x00,
+ 0x30, 0x01, 0x00, 0xdd,
+ 0x10, 0x0e, 0x0f, 0x00, 0xdd, 0xd0, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x10,
+ 0xce, 0x8d, 0xf3, 0x05,
+ 0x0d, 0x31, 0x74, 0xfc, 0xde, 0x21, 0x35, 0x20, 0x12, 0xff, 0xee, 0xff,
+ 0xec, 0x10, 0x11, 0x81,
+ 0xe0, 0x02, 0x14, 0x0d, 0xea, 0x20, 0x53, 0xd0, 0x01, 0x74, 0x0f, 0xe0,
+ 0x07, 0x22, 0x10, 0xfd,
+ 0x01, 0x04, 0xe0, 0x0f, 0x42, 0x01, 0x00, 0x67, 0x02, 0xde, 0x1f, 0x73,
+ 0x02, 0xf3, 0x00, 0x00,
+ 0xf3, 0x26, 0x10, 0x0f, 0xe1, 0x01, 0x10, 0x0f, 0xff, 0xf0, 0xd0, 0x60,
+ 0x76, 0x10, 0x00, 0x06,
+ 0x0f, 0xee, 0x31, 0x10, 0xfa, 0x02, 0x01, 0xf0, 0x0e, 0x0e, 0xbd, 0x00,
+ 0x70, 0x01, 0x04, 0xe0,
+ 0xe9, 0x1e, 0x60, 0x00, 0xf2, 0xe0, 0xfb, 0x00, 0x20, 0x4b, 0x00, 0x01,
+ 0xd1, 0x00, 0x0b, 0x10,
+ 0x20, 0x0f, 0xd0, 0x00, 0x11, 0xad, 0xcd, 0x0f, 0xf0, 0xdc, 0x11, 0x03,
+ 0x01, 0x00, 0xeb, 0x11,
+ 0x66, 0xf1, 0xdf, 0xfe, 0x40, 0x10, 0xf0, 0xd0, 0xa0, 0xe4, 0xf0, 0xfc,
+ 0xbe, 0xdc, 0x03, 0x36,
+ 0xdf, 0xcd, 0x22, 0x25, 0xa0, 0x0f, 0x30, 0xf2, 0xdf, 0x00, 0xf2, 0xb1,
+ 0x26, 0x52, 0xdd, 0xee,
+ 0x10, 0x43, 0xf0, 0x05, 0x13, 0xd0, 0xcb, 0x52, 0x20, 0x10, 0x16, 0x11,
+ 0xd0, 0xff, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x21, 0x73, 0x50, 0x0d, 0x01, 0x21, 0x47, 0x10, 0xff,
+ 0x10, 0x10, 0x00, 0x51,
+ 0x10, 0xec, 0xff, 0x26, 0x10, 0xfe, 0x20, 0x76, 0xf0, 0x0d, 0x10, 0x21,
+ 0x24, 0x20, 0xed, 0xdb,
+ 0x20, 0x51, 0x21, 0x00, 0x1e, 0x42, 0x21, 0x0d, 0x1e, 0x66, 0x12, 0xee,
+ 0x0f, 0x00, 0x1f, 0x11,
+ 0xef, 0x8a, 0x01, 0x23, 0x00, 0x0c, 0x02, 0x47, 0xf1, 0xa0, 0x0e, 0x30,
+ 0x10, 0x01, 0x12, 0xf0,
+ 0xf2, 0x03, 0x0e, 0x2b, 0xcf, 0xf2, 0x17, 0xe0, 0x9e, 0x11, 0x00, 0xce,
+ 0x0e, 0x33, 0x04, 0xde,
+ 0xce, 0x33, 0x64, 0x00, 0xe1, 0x02, 0x00, 0x0e, 0xcd, 0x04, 0x32, 0xde,
+ 0x07, 0x10, 0xee, 0xeb,
+ 0x01, 0x63, 0x00, 0x0c, 0x00, 0x16, 0x00, 0xcf, 0x1f, 0x00, 0xa0, 0xf0,
+ 0x01, 0xe0, 0x10, 0x31,
+ 0x01, 0x10, 0x4d, 0x64, 0x10, 0xfc, 0x00, 0x1f, 0xfc, 0xf0, 0x76, 0x00,
+ 0xee, 0x00, 0x10, 0x32,
+ 0x46, 0x00, 0x0f, 0x0e, 0x10, 0xf2, 0xf1, 0x00, 0x4c, 0x1e, 0x0f, 0x00,
+ 0x11, 0x74, 0x10, 0x2f,
+ 0x51, 0x47, 0x23, 0x0e, 0xfe, 0x00, 0x51, 0x00, 0x1e, 0x11, 0x37, 0x20,
+ 0x01, 0xe0, 0x01, 0x43,
+ 0x1f, 0x52, 0xf2, 0xe3, 0x27, 0x52, 0x02, 0x00, 0x51, 0x25, 0x00, 0x2f,
+ 0x30, 0xf4, 0x04, 0x44,
+ 0x10, 0xe0, 0xef, 0xf0, 0x04, 0xf0, 0x31, 0x45, 0xd0, 0xbe, 0x10, 0x77,
+ 0x12, 0x00, 0x10, 0x00,
+ 0x02, 0xe0, 0x44, 0x32, 0xb0, 0xff, 0x13, 0x00, 0x00, 0x37, 0x04, 0xcf,
+ 0x00, 0x20, 0x30, 0x20,
+ 0x34, 0x12, 0xa1, 0xe1, 0xf2, 0xc2, 0x01, 0x74, 0x14, 0xfd, 0xdf, 0x10,
+ 0x01, 0x00, 0x10, 0x2b,
+ 0x00, 0xd4, 0xee, 0x1e, 0x1a, 0xff, 0x64, 0x01, 0x1f, 0x30, 0xff, 0x8b,
+ 0x20, 0x31, 0xd0, 0xcc,
+ 0x00, 0xec, 0xfd, 0x41, 0x33, 0xbf, 0xfd, 0x00, 0x2c, 0x0c, 0x0f, 0x00,
+ 0x2e, 0x0c, 0xf0, 0x0d,
+ 0xdc, 0x20, 0x31, 0xee, 0x88, 0x0f, 0x2f, 0xed, 0x9c, 0x01, 0x11, 0xee,
+ 0xbd, 0x10, 0x00, 0xdb,
+ 0xcd, 0x11, 0x43, 0x00, 0x0d, 0xe8, 0xcf, 0x11, 0x12, 0x0f, 0xcc, 0x00,
+ 0xf0, 0xe1, 0xbf, 0xdd,
+ 0xff, 0xf0, 0x0e, 0xd9, 0xdf, 0x00, 0xc1, 0xd0, 0xef, 0xee, 0xe0, 0xce,
+ 0xd0, 0xd4, 0x1f, 0x3e,
+ 0x9f, 0xad, 0xf0, 0x00, 0xfd, 0x0f, 0x0b, 0xe8, 0xef, 0x22, 0xe0, 0xce,
+ 0xf0, 0x01, 0x0d, 0xef,
+ 0xe0, 0xc2, 0xbd, 0xee, 0xf3, 0x30, 0xe8, 0x8a, 0xf0, 0x10, 0x30, 0x00,
+ 0xee, 0x20, 0x0d, 0xab,
+ 0x00, 0x42, 0x00, 0xfb, 0xff, 0xfd, 0xe0, 0xfe, 0x00, 0x2f, 0x1f, 0xff,
+ 0xde, 0xee, 0xee, 0xcb,
+ 0xff, 0x61, 0x21, 0xcb, 0xed, 0xff, 0x0c, 0x40, 0x10, 0x0c, 0x00, 0xe0,
+ 0xde, 0x0c, 0x30, 0x20,
+ 0x53, 0x24, 0xec, 0xbd, 0x00, 0xef, 0xab, 0x01, 0x01, 0x27, 0x32, 0xbe,
+ 0xec, 0xf0, 0x23, 0x32,
+ 0x00, 0x1f, 0xf1, 0x90, 0x00, 0x37, 0x04, 0xde, 0x20, 0x10, 0xf0, 0xbf,
+ 0x00, 0x26, 0xff, 0xcf,
+ 0xf0, 0xde, 0xee, 0x45, 0x22, 0xee, 0x30, 0x00, 0x80, 0xf0, 0x07, 0x2f,
+ 0x0f, 0x00, 0x90, 0x00,
+ 0x00, 0x0e, 0x00, 0xf0, 0x03, 0x0e, 0x20, 0x1f, 0x00, 0x04, 0x04, 0x00,
+ 0xed, 0xa0, 0xcb, 0xee,
+ 0x21, 0x45, 0x00, 0xd0, 0xef, 0x00, 0x40, 0x41, 0x30, 0xdc, 0xe1, 0x32,
+ 0x3c, 0xdd, 0xf4, 0x04,
+ 0xfc, 0x2f, 0x70, 0x50, 0xdc, 0x11, 0x03, 0xcf, 0x10, 0x46, 0x11, 0xde,
+ 0xfe, 0x14, 0x00, 0xcd,
+ 0x2d, 0x2c, 0x22, 0x47, 0xd0, 0xef, 0x71, 0x3f, 0xfd, 0x02, 0x47, 0x10,
+ 0x1e, 0x20, 0x11, 0xe0,
+ 0xed, 0x10, 0x55, 0xf2, 0x03, 0x60, 0x0c, 0x1f, 0x23, 0x06, 0x00, 0x62,
+ 0x53, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0x47, 0x35, 0xf0, 0x0f, 0x21, 0x00, 0xdd, 0x01, 0x24, 0x20,
+ 0x2f, 0x42, 0x23, 0x00,
+ 0x6f, 0x34, 0x02, 0x24, 0x61, 0x00, 0xf0, 0x13, 0x37, 0x00, 0xfc, 0x01,
+ 0x26, 0x40, 0x30, 0x60,
+ 0x10, 0x02, 0x02, 0x41, 0x32, 0x11, 0xf1, 0x01, 0x02, 0x13, 0x67, 0xff,
+ 0xee, 0x21, 0x76, 0x10,
+ 0x01, 0x11, 0x32, 0x00, 0xee, 0x00, 0x33, 0x23, 0x30, 0x1c, 0xe0, 0x10,
+ 0x76, 0x40, 0x00, 0x01,
+ 0x10, 0x22, 0x0d, 0xef, 0x12, 0xe7, 0xf0, 0x0c, 0x0f, 0x30, 0x12, 0x12,
+ 0x50, 0x20, 0x0e, 0x1e,
+ 0xdd, 0xc0, 0x76, 0x74, 0x1f, 0x0e, 0xef, 0xfe, 0xf0, 0x2f, 0x50, 0xf0,
+ 0xfd, 0x10, 0xdc, 0xf1,
+ 0x03, 0xcb, 0x10, 0x31, 0x00, 0xff, 0x03, 0xce, 0xe9, 0x73, 0x35, 0xf0,
+ 0x00, 0xbe, 0xfc, 0x00,
+ 0x24, 0x00, 0xeb, 0xd0, 0x03, 0xc1, 0xee, 0x1f, 0x1f, 0xe0, 0xde, 0x11,
+ 0x27, 0xc0, 0xdf, 0x0e,
+ 0xcf, 0xe0, 0x34, 0x01, 0x8d, 0xaf, 0x23, 0x12, 0x00, 0xf2, 0x1e, 0x1f,
+ 0x16, 0x05, 0x20, 0xdd,
+ 0xef, 0x12, 0x63, 0xed, 0xe1, 0x05, 0xee, 0xee, 0x43, 0x55, 0x00, 0xcd,
+ 0x01, 0x00, 0x20, 0x2e,
+ 0x0b, 0xde, 0x00, 0x04, 0x2f, 0x7f, 0x0e, 0xda, 0x00, 0x52, 0x00, 0x0c,
+ 0xe0, 0x03, 0x1f, 0x0c,
+ 0xf0, 0xd3, 0x02, 0x2d, 0x08, 0x2f, 0x30, 0x9f, 0xcd, 0x23, 0x66, 0xfe,
+ 0xee, 0x00, 0xfe, 0x1f,
+ 0x51, 0xf3, 0xfe, 0xfc, 0x2f, 0x1f, 0xbb, 0x01, 0x02, 0xfe, 0xec, 0xd0,
+ 0xee, 0x11, 0x11, 0xff,
+ 0xef, 0x75, 0x01, 0xbd, 0xfd, 0xff, 0x10, 0x33, 0x00, 0xcd, 0x0e, 0xdc,
+ 0xe0, 0xf6, 0xf0, 0x0b,
+ 0xce, 0xe0, 0x32, 0x11, 0xed, 0x90, 0xed, 0xc9, 0x00, 0x10, 0xf0, 0xdd,
+ 0x22, 0x24, 0x00, 0x8b,
+ 0xf0, 0x00, 0x00, 0x0c, 0xff, 0xe0, 0xe0, 0x00, 0x1e, 0xec, 0xdd, 0x00,
+ 0xf4, 0xcf, 0x0b, 0xff,
+ 0x8c, 0xd1, 0xf2, 0xde, 0xeb, 0x10, 0x30, 0xcf, 0xad, 0xed, 0x00, 0x43,
+ 0xea, 0xbc, 0x00, 0x01,
+ 0x0e, 0x30, 0x0e, 0xfd, 0xf0, 0xe0, 0xd0, 0xe0, 0xeb, 0xdc, 0x30, 0x20,
+ 0xbd, 0xee, 0xb2, 0xdf,
+ 0xeb, 0x50, 0xfb, 0x9e, 0x01, 0x10, 0x0b, 0xe0, 0x0f, 0x00, 0x23, 0xfa,
+ 0xde, 0x50, 0x0f, 0xde,
+ 0x11, 0x1d, 0xfa, 0xf1, 0x04, 0x9d, 0xfc, 0xf0, 0x10, 0x12, 0xd0, 0x1e,
+ 0x2f, 0xbe, 0xe0, 0x45,
+ 0x10, 0x0b, 0x23, 0x32, 0xde, 0xef, 0x21, 0x61, 0x23, 0x01, 0xf2, 0xe0,
+ 0xdb, 0xce, 0xfd, 0x0f,
+ 0x30, 0x66, 0xf0, 0xac, 0x00, 0x56, 0x00, 0xff, 0x03, 0x11, 0x0e, 0x0f,
+ 0x01, 0xf2, 0xd0, 0x23,
+ 0x40, 0x0f, 0xd0, 0x23, 0x25, 0xe0, 0x00, 0x77, 0x12, 0xf2, 0x03, 0x03,
+ 0x30, 0xf0, 0xe0, 0x37,
+ 0x61, 0x00, 0xf1, 0x02, 0x00, 0x30, 0x32, 0xc2, 0xc0, 0x67, 0x33, 0xfd,
+ 0xd0, 0x00, 0x43, 0x20,
+ 0x00, 0x0f, 0x21, 0x12, 0x36, 0x20, 0xde, 0x00, 0x21, 0x0f, 0xa8, 0x00,
+ 0x32, 0x3f, 0x9c, 0xf0,
+ 0x23, 0x00, 0xdd, 0x10, 0x6e, 0x0d, 0x0f, 0x02, 0x30, 0xdc, 0xe0, 0x0d,
+ 0x3e, 0x2a, 0x30, 0xf0,
+ 0x8e, 0x0f, 0x1f, 0x08, 0xce, 0x00, 0x00, 0x1d, 0x10, 0xe3, 0xce, 0x0b,
+ 0x00, 0x54, 0x10, 0x10,
+ 0xe0, 0xde, 0x12, 0x77, 0xf0, 0xd0, 0x0f, 0xdc, 0x00, 0x12, 0xe0, 0x8c,
+ 0xfe, 0x00, 0x04, 0x33,
+ 0xf1, 0xcf, 0x00, 0x22, 0x14, 0xe2, 0xb2, 0xf0, 0xeb, 0xed, 0x33, 0x26,
+ 0xe0, 0xe0, 0x01, 0xf0,
+ 0x23, 0x76, 0x01, 0x00, 0xcf, 0xf1, 0x05, 0x20, 0xff, 0xe0, 0x24, 0x43,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x13, 0x75, 0x22, 0x13, 0x00, 0xfe, 0x1c, 0x50, 0x45, 0x21, 0xf0, 0x11,
+ 0x3f, 0x10, 0x21, 0x22,
+ 0x42, 0x20, 0xda, 0xd0, 0x74, 0x31, 0x0c, 0x0e, 0x20, 0x24, 0x00, 0x10,
+ 0xfe, 0x0e, 0x72, 0x73,
+ 0x0a, 0xeb, 0xf0, 0x22, 0x52, 0x0f, 0x0d, 0xf0, 0x10, 0x20, 0x23, 0x27,
+ 0xdf, 0xbb, 0x20, 0x10,
+ 0x0f, 0x00, 0xf1, 0xe0, 0x1f, 0x51, 0xef, 0xfc, 0x65, 0x03, 0x02, 0x11,
+ 0x1f, 0x0d, 0xe1, 0x03,
+ 0x20, 0xf0, 0x9f, 0xfe, 0x0b, 0x00, 0x12, 0xe0, 0x27, 0x64, 0xef, 0xde,
+ 0x0f, 0x0f, 0x01, 0xf3,
+ 0xee, 0xe0, 0xf0, 0xcd, 0x23, 0x04, 0xcf, 0x31, 0x42, 0x00, 0x00, 0xfa,
+ 0x9c, 0x04, 0x06, 0x00,
+ 0xec, 0x00, 0x00, 0x0f, 0xd0, 0xf0, 0x0e, 0x11, 0xc0, 0xe0, 0x23, 0x12,
+ 0x8e, 0x0d, 0x40, 0x02,
+ 0xed, 0xfe, 0x47, 0x12, 0xc8, 0x1e, 0x71, 0x01, 0x00, 0x00, 0x00, 0x0e,
+ 0x10, 0x25, 0x1e, 0x0f,
+ 0x11, 0x24, 0x10, 0x1e, 0x40, 0x22, 0xf0, 0xab, 0x0f, 0x53, 0x00, 0xfc,
+ 0x20, 0x41, 0x13, 0x26,
+ 0x0e, 0x3d, 0x76, 0x42, 0xff, 0xfe, 0x00, 0x20, 0x11, 0x02, 0x2e, 0x00,
+ 0xe1, 0xec, 0x2d, 0x73,
+ 0x37, 0x14, 0xff, 0xdf, 0x20, 0x72, 0x10, 0x01, 0x14, 0x32, 0x05, 0x05,
+ 0x4b, 0x00, 0x85, 0x00,
+ 0xa7, 0x36, 0x29, 0x1d, 0xcb, 0x38, 0xa0, 0x1d, 0x43, 0x66, 0x02, 0xf0,
+ 0xf0, 0x41, 0x35, 0xf0,
+ 0xc1, 0x0f, 0x10, 0x75, 0x12, 0x00, 0xdf, 0x01, 0x23, 0x03, 0x12, 0x00,
+ 0x03, 0x42, 0xed, 0x24,
+ 0x57, 0xc2, 0xe0, 0x22, 0x20, 0x0f, 0x27, 0x34, 0xcf, 0xee, 0x22, 0x22,
+ 0xe0, 0x11, 0x55, 0xe0,
+ 0xaf, 0x00, 0x13, 0x34, 0xf2, 0x03, 0x01, 0x0d, 0x0e, 0x10, 0x41, 0x12,
+ 0xc1, 0xe1, 0x11, 0x4e,
+ 0xf8, 0xd0, 0x11, 0x51, 0x72, 0x00, 0xed, 0x30, 0x42, 0xd9, 0xd0, 0xff,
+ 0xdb, 0xed, 0x0f, 0x00,
+ 0x0f, 0xfe, 0x62, 0xdc, 0xdd, 0x70, 0x2f, 0x08, 0xe0, 0x02, 0x20, 0xfd,
+ 0xb9, 0x2f, 0x30, 0xd0,
+ 0xc0, 0x00, 0x1b, 0x0f, 0xf0, 0xbe, 0xd0, 0x0f, 0x20, 0xdc, 0xad, 0x00,
+ 0x00, 0x00, 0x50, 0xdd,
+ 0xda, 0x00, 0x20, 0x00, 0xee, 0xed, 0xd2, 0xa0, 0xed, 0xfe, 0x0e, 0xec,
+ 0xdc, 0xbc, 0x0f, 0x33,
+ 0xe3, 0x8b, 0xfe, 0xee, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0x03, 0xf1, 0xe8,
+ 0xfb, 0xdf, 0x01, 0x05,
+ 0x00, 0xc0, 0xdc, 0xdf, 0x00, 0x74, 0xe0, 0xac, 0x00, 0xe0, 0xf0, 0x10,
+ 0x02, 0x00, 0xf0, 0xe0,
+ 0xed, 0x00, 0xee, 0xd0, 0x25, 0x62, 0xfa, 0xad, 0x00, 0x0f, 0x20, 0x00,
+ 0x01, 0x03, 0x11, 0x0b,
+ 0xaa, 0x0f, 0x20, 0x01, 0xe0, 0xec, 0xff, 0x10, 0x30, 0xcf, 0xce, 0x00,
+ 0x0e, 0x5f, 0x11, 0xe0,
+ 0xbd, 0x12, 0x2c, 0xf8, 0xfe, 0x01, 0x33, 0xcd, 0xdb, 0x31, 0x72, 0xfe,
+ 0xfc, 0x11, 0x03, 0xf1,
+ 0xee, 0xfb, 0xff, 0x21, 0x12, 0xd0, 0xd0, 0xcb, 0x0f, 0x72, 0x35, 0x00,
+ 0x00, 0xe0, 0xe2, 0x00,
+ 0xff, 0xed, 0x04, 0x03, 0xbe, 0xca, 0x22, 0x74, 0xff, 0xfe, 0x01, 0x02,
+ 0xff, 0xe0, 0xf2, 0xef,
+ 0xed, 0xf0, 0xf1, 0x02, 0x33, 0x00, 0x89, 0x0e, 0x00, 0x30, 0x04, 0xde,
+ 0xcd, 0x14, 0x22, 0xbc,
+ 0xed, 0x0f, 0x23, 0x47, 0xe0, 0xac, 0x00, 0x22, 0x00, 0xcd, 0x02, 0x27,
+ 0xef, 0x0e, 0x0f, 0xff,
+ 0xdf, 0x00, 0x10, 0x72, 0x03, 0x02, 0xff, 0x1d, 0x3f, 0x41, 0x12, 0xeb,
+ 0xac, 0x00, 0x33, 0x0e,
+ 0xe9, 0x00, 0x01, 0x23, 0xff, 0xcb, 0x20, 0x44, 0xe1, 0xf1, 0x10, 0xfc,
+ 0xfe, 0x00, 0x3f, 0x31,
+ 0x76, 0x40, 0x0b, 0x00, 0x43, 0x52, 0x00, 0x00, 0x0e, 0x00, 0x0f, 0x00,
+ 0xee, 0x00, 0x01, 0x20,
+ 0x1e, 0x1f, 0x44, 0x75, 0x53, 0x26, 0x31, 0xff, 0x0e, 0x11, 0x14, 0x02,
+ 0xf0, 0x61, 0x31, 0x02,
+ 0xf0, 0x25, 0x41, 0x01, 0x12, 0x3f, 0x0c, 0x44, 0x37, 0x00, 0xf1, 0x71,
+ 0x10, 0x00, 0x01, 0x13,
+ 0x42, 0x23, 0x20, 0x0e, 0x03, 0x33, 0x00, 0x3e, 0x47, 0x36, 0x42, 0x30,
+ 0x50, 0x34, 0x74, 0x00,
+ 0xf1, 0x00, 0x12, 0x22, 0x35, 0x00, 0xe0, 0x00, 0x53, 0x03, 0x02, 0x03,
+ 0x54, 0x11, 0x12, 0x33,
+ 0x26, 0x00, 0x10, 0x2f, 0x23, 0x01, 0x1f, 0x5d, 0x51, 0x35, 0x25, 0x01,
+ 0x02, 0x52, 0x01, 0x0f,
+ 0x0e, 0xf0, 0xef, 0x03, 0x21, 0xc0, 0xee, 0x2c, 0x70, 0x77, 0xf1, 0xf0,
+ 0x00, 0x33, 0x11, 0x00,
+ 0xfe, 0x1f, 0x43, 0x04, 0x0c, 0xc8, 0xfe, 0x00, 0x0e, 0xfe, 0x20, 0x2e,
+ 0xee, 0xf0, 0x0f, 0x21,
+ 0x30, 0x08, 0x20, 0x24, 0xb0, 0xef, 0x3f, 0x00, 0xd0, 0x01, 0xe0, 0x89,
+ 0xde, 0x50, 0x34, 0xc0,
+ 0xbd, 0x00, 0x0f, 0x31, 0x03, 0xc0, 0x02, 0x06, 0xf0, 0xee, 0xcf, 0xff,
+ 0xe0, 0x0e, 0x1c, 0x00,
+ 0xc3, 0xc3, 0xf1, 0x0f, 0x60, 0x26, 0x12, 0xf2, 0xcf, 0x01, 0x25, 0x1f,
+ 0xcd, 0xf0, 0x04, 0xf2,
+ 0xdf, 0xdf, 0x67, 0x31, 0xe0, 0xc2, 0x05, 0x50, 0x20, 0x0f, 0xd0, 0xd0,
+ 0x0d, 0x00, 0x0d, 0x20,
+ 0x24, 0x21, 0x30, 0x2f, 0x50, 0x57, 0x35, 0xee, 0xbb, 0x00, 0x02, 0xf0,
+ 0x0f, 0x0d, 0x10, 0xe0,
+ 0xe0, 0x0f, 0x60, 0x0f, 0xda, 0x0f, 0x00, 0x21, 0x12, 0x2e, 0x0d, 0x00,
+ 0x7f, 0x51, 0x02, 0xc9,
+ 0xde, 0x10, 0x1f, 0x1c, 0xee, 0xae, 0xfd, 0xfc, 0xfc, 0x10, 0x46, 0x22,
+ 0xd0, 0xde, 0x0f, 0x22,
+ 0x61, 0x00, 0xbd, 0x03, 0x13, 0x0a, 0xce, 0xe0, 0xfc, 0x00, 0x42, 0x01,
+ 0x00, 0xe0, 0xf0, 0xf1,
+ 0xe3, 0xff, 0xd8, 0xcf, 0xd0, 0xcf, 0xca, 0x10, 0x10, 0xd1, 0xb1, 0xfe,
+ 0xfc, 0x0f, 0xe0, 0x34,
+ 0x12, 0x9e, 0xca, 0xe0, 0x0f, 0x2f, 0xfe, 0xbe, 0xe0, 0x00, 0x0f, 0x12,
+ 0xe3, 0xcb, 0xff, 0x20,
+ 0xdb, 0x8e, 0x00, 0xf2, 0xde, 0xeb, 0x0e, 0x0d, 0xff, 0x0e, 0xef, 0xde,
+ 0x01, 0x50, 0x08, 0xbf,
+ 0x00, 0x1f, 0x0e, 0xef, 0xc1, 0x0d, 0xda, 0xdf, 0xe0, 0x0e, 0xcd, 0xb0,
+ 0x03, 0xfb, 0xec, 0xc0,
+ 0x01, 0xff, 0xf9, 0x10, 0x30, 0xe1, 0xce, 0x3e, 0x40, 0x00, 0x0f, 0x00,
+ 0x8c, 0xec, 0xf0, 0x0f,
+ 0xba, 0xdf, 0x10, 0x22, 0x0e, 0xec, 0x00, 0x0f, 0x1f, 0x40, 0x41, 0x02,
+ 0xe0, 0xcd, 0x0e, 0xdf,
+ 0xe0, 0x10, 0x33, 0x32, 0x2f, 0x43, 0x17, 0x0d, 0xca, 0x20, 0x71, 0x02,
+ 0xf0, 0x0e, 0xdc, 0xde,
+ 0x02, 0x34, 0x62, 0x24, 0xdc, 0xad, 0x27, 0x44, 0x00, 0xbe, 0xfe, 0x00,
+ 0x53, 0x01, 0xfc, 0xf0,
+ 0x02, 0x14, 0x14, 0x31, 0xff, 0x00, 0x32, 0x12, 0xd2, 0x04, 0x36, 0x01,
+ 0xf0, 0xf1, 0x40, 0x01,
+ 0xa0, 0xf0, 0x23, 0x75, 0x02, 0x01, 0xff, 0x0f, 0x54, 0x24, 0x00, 0xeb,
+ 0x00, 0x10, 0x34, 0x30,
+ 0x00, 0x20, 0x31, 0x10, 0xdb, 0xb0, 0xff, 0xd0, 0x0f, 0x32, 0xf0, 0xb9,
+ 0x1e, 0x10, 0x0f, 0xf0,
+ 0x71, 0x41, 0x1b, 0x1f, 0x00, 0x00, 0xee, 0xfe, 0xfe, 0x01, 0x10, 0x98,
+ 0xfc, 0x00, 0x01, 0xf0,
+ 0x0d, 0x1f, 0x3e, 0x2e, 0x0d, 0xc0, 0xe0, 0x8f, 0xec, 0x1f, 0x2f, 0x11,
+ 0xf4, 0x00, 0x1b, 0xee,
+ 0x11, 0x31, 0xad, 0xdc, 0xc3, 0xf1, 0xfc, 0xbb, 0x00, 0x02, 0xce, 0xfc,
+ 0x02, 0x04, 0xe3, 0x02,
+ 0xf0, 0x9f, 0xe2, 0x03, 0xde, 0xfe, 0x06, 0x42, 0xe0, 0xe2, 0xe2, 0x01,
+ 0x57, 0x07, 0xf0, 0x02,
+ 0x0f, 0xf0, 0xe0, 0x04, 0x01, 0x80, 0x00, 0x21, 0x23, 0x12, 0x23, 0x02,
+ 0x06, 0x31, 0x42, 0x21,
+ 0x11, 0xdf, 0x00, 0x53, 0x34, 0x23, 0x11, 0x7f, 0x70, 0x34, 0x01, 0xdf,
+ 0x0c, 0x41, 0x37, 0x24,
+ 0x0e, 0x0c, 0x21, 0x22, 0xc0, 0xde, 0x40, 0x32, 0x1f, 0x0d, 0x30, 0x42,
+ 0x11, 0x30, 0x60, 0x1f,
+ 0x38, 0x1f, 0x10, 0x04, 0x33, 0x51, 0x1e, 0x0d, 0xe0, 0x0b, 0x0f, 0x20,
+ 0x6e, 0x19, 0x00, 0x00,
+ 0xf0, 0xe1, 0x52, 0x67, 0x01, 0xff, 0x00, 0x30, 0x03, 0x02, 0x00, 0x1c,
+ 0x00, 0xd1, 0xf1, 0xee,
+ 0xee, 0x02, 0x27, 0x73, 0x22, 0xf1, 0xfe, 0x0e, 0x10, 0xb3, 0xa1, 0x02,
+ 0xe0, 0x01, 0x20, 0xdb,
+ 0xbf, 0xfe, 0x36, 0x33, 0x01, 0xc3, 0x01, 0x00, 0x14, 0x04, 0xbe, 0xd8,
+ 0x00, 0x30, 0x0f, 0xf1,
+ 0xf3, 0xe0, 0x72, 0x20, 0xca, 0xf1, 0x02, 0x02, 0xf0, 0xf0, 0xf0, 0xdf,
+ 0x20, 0x62, 0x12, 0x12,
+ 0x21, 0x0f, 0x08, 0x0d, 0x31, 0x77, 0x32, 0x0e, 0x0e, 0x40, 0x12, 0x00,
+ 0xe0, 0x30, 0x56, 0x00,
+ 0x20, 0xf0, 0x30, 0x32, 0xed, 0xf9, 0x30, 0x72, 0x64, 0x0f, 0x10, 0x20,
+ 0x43, 0x20, 0x00, 0x20,
+ 0x22, 0x17, 0x01, 0xee, 0x0e, 0x00, 0x4f, 0x2c, 0x50, 0x23, 0x02, 0x0d,
+ 0x30, 0x77, 0x22, 0x11,
+ 0x11, 0x32, 0x0f, 0x1e, 0xf0, 0xb0, 0x01, 0x31, 0x35, 0x41, 0x00, 0x06,
+ 0x34, 0x20, 0x0e, 0x51,
+ 0x44, 0x10, 0xff, 0x00, 0x26, 0x11, 0xd0, 0xef, 0x00, 0x52, 0x00, 0xf0,
+ 0x01, 0x33, 0x13, 0x10,
+ 0xf0, 0x92, 0xf1, 0x36, 0x52, 0x04, 0x10, 0x01, 0xf2, 0x22, 0x13, 0x14,
+ 0x0f, 0xe0, 0xf0, 0xd2,
+ 0xd2, 0x57, 0x17, 0xc0, 0xdf, 0xf2, 0x32, 0x61, 0x10, 0x0f, 0xf0, 0x02,
+ 0x12, 0xe1, 0xcd, 0x0e,
+ 0x50, 0x30, 0x43, 0x23, 0x10, 0xfe, 0x01, 0x77, 0x4f, 0xfd, 0xed, 0xaa,
+ 0xc9, 0xff, 0x10, 0x31,
+ 0xbe, 0xee, 0x1f, 0x4f, 0x20, 0x0e, 0x0d, 0x00, 0x25, 0xe0, 0xde, 0xfa,
+ 0xcd, 0xfc, 0xf0, 0xae,
+ 0xed, 0x0d, 0x20, 0x3f, 0x0a, 0xff, 0xfe, 0xce, 0xce, 0xf0, 0xed, 0xfc,
+ 0xcd, 0xdd, 0x0d, 0xfc,
+ 0x9d, 0xec, 0x0f, 0x1d, 0xfc, 0xc0, 0xe0, 0xdd, 0x0c, 0xfc, 0xdf, 0xa0,
+ 0xd0, 0xdc, 0xec, 0xdf,
+ 0xad, 0xfc, 0xe2, 0x00, 0xa8, 0xfe, 0x01, 0xe2, 0xde, 0xee, 0xff, 0xdf,
+ 0xd0, 0xf1, 0xfd, 0x9c,
+ 0xee, 0xf1, 0x01, 0xfd, 0xeb, 0xf0, 0xa0, 0xee, 0xed, 0x00, 0x13, 0xcc,
+ 0xcb, 0xf0, 0x05, 0xf0,
+ 0xcc, 0x00, 0x10, 0xf1, 0xdf, 0xcd, 0xde, 0x0e, 0xd0, 0xeb, 0xde, 0x42,
+ 0x45, 0x0e, 0xec, 0x00,
+ 0x0c, 0x50, 0x1f, 0x00, 0x9d, 0xfd, 0xec, 0xee, 0x0e, 0xec, 0xed, 0xce,
+ 0x00, 0x20, 0x4b, 0x10,
+ 0x0f, 0xf0, 0x00, 0x3b, 0x1d, 0xee, 0x8e, 0xcd, 0x11, 0x22, 0x00, 0x11,
+ 0x3c, 0xc8, 0xbd, 0x0d,
+ 0x1f, 0x10, 0x05, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0x2c, 0xde, 0xef, 0x26,
+ 0x02, 0xc0, 0x20, 0x72,
+ 0x34, 0xde, 0xdc, 0xff, 0xf4, 0xf3, 0x00, 0x3c, 0x40, 0x31, 0xe2, 0xc0,
+ 0xe0, 0x13, 0x01, 0x9f,
+ 0xfe, 0xf0, 0xa2, 0xe0, 0xda, 0x2e, 0x42, 0x37, 0xf1, 0x8e, 0xfc, 0x00,
+ 0x10, 0x0e, 0x0f, 0xd4,
+ 0xe1, 0x0d, 0x0f, 0x11, 0x01, 0xe0, 0xc2, 0x07, 0x40, 0xff, 0xce, 0xeb,
+ 0xed, 0x01, 0x06, 0xb0,
+ 0xdc, 0x00, 0x11, 0x70, 0x00, 0xd0, 0xf0, 0x42, 0x41, 0x11, 0x15, 0x00,
+ 0x1e, 0x0e, 0xde, 0x11,
+ 0x10, 0xfd, 0xa0, 0xf2, 0xe7, 0x02, 0x31, 0x3e, 0x2e, 0x11, 0x06, 0x10,
+ 0x3d, 0x3e, 0x73, 0x64,
+ 0xee, 0xd0, 0x07, 0x72, 0x00, 0x0f, 0x10, 0x01, 0x02, 0x00, 0x2d, 0x00,
+ 0x22, 0x13, 0x0a, 0x1c,
+ 0x0e, 0x43, 0x77, 0x33, 0x00, 0x2e, 0x21, 0x24, 0x21, 0x02, 0x0e, 0x10,
+ 0x66, 0x22, 0x30, 0x40,
+ 0x10, 0x21, 0x12, 0x44, 0x32, 0x52, 0x30, 0x42, 0x14, 0x04, 0x02, 0x02,
+ 0x0f, 0x51, 0x36, 0x10,
+ 0xf1, 0x13, 0x43, 0x30, 0x10, 0x23, 0x11, 0x31, 0x55, 0x34, 0x15, 0x22,
+ 0x70, 0x22, 0x25, 0x12,
+ 0x23, 0x31, 0x01, 0x21, 0x33, 0x36, 0x01, 0xe0, 0x41, 0x77, 0x21, 0x00,
+ 0xf1, 0x23, 0x41, 0x12,
+ 0x12, 0x41, 0x33, 0x31, 0x00, 0x10, 0x32, 0x53, 0x62, 0x15, 0x24, 0x02,
+ 0x02, 0x10, 0x12, 0x02,
+ 0xf4, 0x03, 0xe1, 0xbf, 0x09, 0x5e, 0x10, 0x00, 0x22, 0x13, 0x23, 0x34,
+ 0x4e, 0x1f, 0x14, 0x46,
+ 0x00, 0x00, 0xce, 0x0b, 0x0e, 0xe0, 0xd1, 0x2f, 0x3f, 0x1e, 0x3e, 0x6d,
+ 0x1e, 0x1f, 0xdd, 0xc0,
+ 0x43, 0x3d, 0x18, 0x0f, 0x80, 0x03, 0x0e, 0x5a, 0x0f, 0xdd, 0x0f, 0xf0,
+ 0xf2, 0xf1, 0x20, 0x4e,
+ 0x0c, 0xcb, 0xbd, 0xe0, 0x03, 0x04, 0xef, 0xfe, 0x0e, 0x54, 0x04, 0xee,
+ 0xb9, 0x00, 0x11, 0x01,
+ 0xbe, 0x00, 0x03, 0x12, 0x00, 0x01, 0xf1, 0x05, 0x11, 0x2f, 0x1f, 0x02,
+ 0xc0, 0xee, 0xce, 0xd4,
+ 0xf4, 0x00, 0x0e, 0x10, 0x77, 0x04, 0xd2, 0xd0, 0x10, 0x50, 0xf0, 0x80,
+ 0xee, 0xea, 0x10, 0x55,
+ 0x00, 0xfd, 0xff, 0x10, 0x12, 0x32, 0x21, 0x00, 0xfd, 0xc0, 0xe3, 0xef,
+ 0xe8, 0xee, 0x20, 0x3f,
+ 0xdd, 0x9c, 0x0f, 0x10, 0x53, 0x10, 0x20, 0xf8, 0xe0, 0x02, 0x01, 0x3d,
+ 0x0c, 0x00, 0xd1, 0x01,
+ 0x0e, 0xcb, 0xfe, 0x2e, 0x0e, 0x8e, 0x9a, 0x0f, 0x31, 0x12, 0xe0, 0xee,
+ 0x0d, 0x0f, 0x30, 0x00,
+ 0xf0, 0xff, 0x01, 0xfd, 0xab, 0xf0, 0x01, 0x2f, 0x08, 0xce, 0xe0, 0xf3,
+ 0xe0, 0x1e, 0x5f, 0x12,
+ 0xf5, 0xb0, 0xcb, 0xdd, 0xef, 0x00, 0x00, 0xbd, 0xff, 0xff, 0x02, 0xd0,
+ 0xda, 0xee, 0xf0, 0xef,
+ 0x00, 0x10, 0xbd, 0xbc, 0xee, 0xc9, 0xdf, 0xcf, 0xef, 0xce, 0x0f, 0x22,
+ 0x35, 0xe0, 0x90, 0xfb,
+ 0xfe, 0xff, 0xe0, 0xc0, 0xee, 0xbc, 0xfe, 0xfe, 0xfd, 0xed, 0x0f, 0x2d,
+ 0x00, 0x02, 0x1b, 0x0c,
+ 0xce, 0xe0, 0xd0, 0xdf, 0xd0, 0xcd, 0xa8, 0xdc, 0xe0, 0xf0, 0xdd, 0xee,
+ 0x1f, 0x3c, 0xef, 0xc1,
+ 0xe5, 0xce, 0xfa, 0x20, 0x50, 0xf0, 0xb0, 0xcf, 0xee, 0x0f, 0x60, 0x1f,
+ 0xfc, 0xce, 0xfe, 0x00,
+ 0x22, 0xea, 0xcb, 0x00, 0x00, 0x10, 0x01, 0x00, 0x1b, 0x00, 0x10, 0x10,
+ 0xbf, 0xff, 0x00, 0x0e,
+ 0x9d, 0x12, 0x35, 0x20, 0x00, 0x10, 0x00, 0x3e, 0x20, 0x04, 0x12, 0x10,
+ 0x0f, 0x00, 0x11, 0x0f,
+ 0xdb, 0xe0, 0xc5, 0x01, 0x11, 0xd0, 0x03, 0x74, 0x74, 0x02, 0x14, 0x00,
+ 0xfc, 0xce, 0x01, 0x17,
+ 0x50, 0x01, 0xf2, 0x42, 0x32, 0x01, 0xf2, 0xf2, 0x56, 0x53, 0x14, 0x00,
+ 0x00, 0xe5, 0xf2, 0xf1,
+ 0x00, 0x21, 0x13, 0x00, 0x01, 0x25, 0x75, 0x71, 0x31, 0x10, 0x12, 0x00,
+ 0x00, 0x0f, 0x13, 0x75,
+ 0x01, 0xf0, 0xf0, 0x01, 0x2f, 0x0c, 0x1e, 0x0e, 0x02, 0xf6, 0xc0, 0xfe,
+ 0x3c, 0x70, 0x55, 0x00,
+ 0xcd, 0x00, 0x10, 0x40, 0x0e, 0xed, 0x00, 0x00, 0x0e, 0x0a, 0x0e, 0xce,
+ 0xff, 0x0e, 0x31, 0x4f,
+ 0x0a, 0x0f, 0xee, 0xde, 0x0c, 0xfc, 0x00, 0x00, 0x0e, 0xfe, 0x0e, 0x8b,
+ 0xdf, 0x11, 0x71, 0x1f,
+ 0x00, 0xe1, 0x01, 0xe0, 0xfd, 0x08, 0x1f, 0xf1, 0x92, 0xdc, 0xed, 0xf0,
+ 0x01, 0x25, 0x22, 0x01,
+ 0xc0, 0xbd, 0xe2, 0xe3, 0x03, 0x03, 0x01, 0xed, 0xb0, 0x07, 0xf2, 0x14,
+ 0x40, 0xd1, 0xc5, 0x04,
+ 0x31, 0x20, 0xf1, 0x04, 0x03, 0xa0, 0xd0, 0xf1, 0x32, 0x23, 0xd4, 0xb4,
+ 0x15, 0x23, 0x03, 0xe0,
+ 0x11, 0x60, 0x20, 0x34, 0x00, 0x02, 0x27, 0x73, 0x2e, 0xfe, 0x00, 0x15,
+ 0x72, 0x20, 0x0e, 0xf0,
+ 0x03, 0x15, 0xfe, 0xfc, 0x1f, 0x60, 0x20, 0x12, 0x01, 0x10, 0x31, 0x2e,
+ 0x40, 0x23, 0x13, 0x1f,
+ 0x2b, 0x4f, 0x0c, 0x2f, 0x56, 0x23, 0x1e, 0x0d, 0x40, 0x1c, 0x20, 0x31,
+ 0xef, 0xfd, 0x71, 0x40,
+ 0xfb, 0xdc, 0x02, 0x36, 0x11, 0x20, 0x10, 0x1d, 0x41, 0x56, 0x01, 0x0d,
+ 0x0f, 0x0e, 0xf1, 0xf1,
+ 0x0f, 0x10, 0x36, 0x01, 0x21, 0x10, 0x3f, 0x11, 0xc0, 0x81, 0xc5, 0xc0,
+ 0xfa, 0xf0, 0x03, 0xef,
+ 0xe0, 0xff, 0xfe, 0xd0, 0x11, 0x10, 0x54, 0x22, 0xf0, 0x9b, 0xd0, 0xf2,
+ 0xef, 0x1b, 0x30, 0xe1,
+ 0xc3, 0x20, 0x5d, 0xff, 0xc1, 0xd7, 0xe1, 0xdc, 0xef, 0x61, 0x13, 0xdf,
+ 0xcd, 0x22, 0x62, 0x10,
+ 0x0b, 0xfe, 0x00, 0x15, 0x11, 0x4e, 0x20, 0x12, 0x04, 0xed, 0xbb, 0xe0,
+ 0x11, 0x64, 0x10, 0x10,
+ 0x20, 0x01, 0x10, 0x0e, 0x51, 0x00, 0x1d, 0x13, 0x17, 0x23, 0x40, 0x2f,
+ 0x10, 0x47, 0x23, 0x0f,
+ 0x1c, 0x30, 0x73, 0x31, 0xef, 0x0b, 0x00, 0x3f, 0x2e, 0x42, 0x05, 0xdf,
+ 0x1f, 0x71, 0x25, 0x10,
+ 0x13, 0x12, 0x1d, 0x0d, 0xf0, 0x46, 0x40, 0x01, 0xff, 0x11, 0x32, 0x32,
+ 0x43, 0x52, 0x31, 0x27,
+ 0x04, 0x10, 0x40, 0x01, 0x00, 0xf0, 0xf2, 0xe0, 0x00, 0x32, 0x02, 0xd0,
+ 0x77, 0x62, 0x10, 0xff,
+ 0xd1, 0x25, 0x31, 0x10, 0xe0, 0xd1, 0x07, 0x12, 0x50, 0x4e, 0x30, 0x13,
+ 0x00, 0xd0, 0xd3, 0x04,
+ 0x05, 0x32, 0xd1, 0x92, 0xc0, 0xf2, 0x01, 0x02, 0x46, 0x21, 0x01, 0x02,
+ 0x71, 0x43, 0x00, 0xe1,
+ 0x01, 0x10, 0x01, 0x25, 0x23, 0x00, 0xc1, 0x01, 0x00, 0xe9, 0xee, 0x3f,
+ 0x6a, 0xcd, 0xcf, 0xf0,
+ 0x03, 0x21, 0x1f, 0x3d, 0x0e, 0xdf, 0x40, 0x13, 0xe8, 0xed, 0x05, 0x05,
+ 0x4c, 0x00, 0x66, 0x00,
+ 0x33, 0x00, 0x99, 0xe9, 0xb8, 0xff, 0xf5, 0xe9, 0xdb, 0xac, 0xe0, 0xed,
+ 0xed, 0x1e, 0x4f, 0x1f,
+ 0xdf, 0xde, 0x0b, 0x2c, 0x0e, 0xad, 0xf0, 0x0d, 0xc9, 0xee, 0xef, 0xff,
+ 0xfe, 0xba, 0xef, 0xf0,
+ 0x10, 0xfe, 0x9e, 0x00, 0xf1, 0x0f, 0x0e, 0xcc, 0xbc, 0xed, 0xef, 0x00,
+ 0x0f, 0xde, 0xde, 0xbd,
+ 0xec, 0xee, 0xf0, 0xe2, 0xde, 0xb9, 0xdf, 0xef, 0xdf, 0xbf, 0xe0, 0xe0,
+ 0xea, 0xee, 0x0f, 0xdf,
+ 0xef, 0x00, 0xd3, 0xa0, 0xee, 0x11, 0x14, 0xae, 0xbc, 0xe0, 0xd0, 0x0f,
+ 0x03, 0x1c, 0xca, 0xe0,
+ 0xf1, 0xfe, 0xdb, 0x00, 0x12, 0x25, 0xe1, 0xaf, 0xfc, 0x00, 0x40, 0xf3,
+ 0xcd, 0xfa, 0x10, 0x02,
+ 0xff, 0xd9, 0xcf, 0xdf, 0xef, 0xff, 0xc0, 0xed, 0x0f, 0x60, 0x13, 0x00,
+ 0xf0, 0xf0, 0x1f, 0x0d,
+ 0xcc, 0x0e, 0x2e, 0xbc, 0xca, 0x0f, 0x40, 0x03, 0xfe, 0xd8, 0x20, 0x30,
+ 0x00, 0x0f, 0x3f, 0x01,
+ 0xe0, 0xd0, 0xd0, 0xff, 0x3f, 0xaf, 0x9a, 0xfe, 0x21, 0x76, 0x01, 0x00,
+ 0x00, 0xfe, 0xee, 0xff,
+ 0x24, 0x43, 0x0f, 0x2c, 0xf0, 0xad, 0xf0, 0x00, 0x16, 0x30, 0xee, 0xde,
+ 0xe2, 0xd3, 0xf0, 0xf2,
+ 0x21, 0xfc, 0x89, 0xef, 0x0f, 0x02, 0xd0, 0xff, 0x3e, 0x3f, 0x00, 0x9d,
+ 0xf0, 0x12, 0x32, 0x01,
+ 0xc2, 0xe5, 0xf0, 0xe0, 0x23, 0x0f, 0x98, 0xf0, 0xff, 0xed, 0xdf, 0x01,
+ 0x14, 0x3e, 0xec, 0xb1,
+ 0x10, 0x40, 0x10, 0x03, 0xcf, 0x17, 0x43, 0x20, 0x1f, 0x00, 0xe0, 0xc9,
+ 0xbf, 0xed, 0x00, 0x10,
+ 0x2e, 0x00, 0xe3, 0xe0, 0xfe, 0x02, 0x77, 0x56, 0x0e, 0x0d, 0xc0, 0x03,
+ 0x12, 0x20, 0x20, 0x20,
+ 0x20, 0x00, 0x12, 0x32, 0x52, 0x47, 0x13, 0x10, 0x0c, 0xee, 0xde, 0x2e,
+ 0x3d, 0x0e, 0x26, 0x74,
+ 0x71, 0x01, 0x0f, 0x0e, 0x40, 0x27, 0x01, 0xf0, 0x02, 0x32, 0x22, 0x2e,
+ 0x4e, 0x62, 0x17, 0x01,
+ 0x0f, 0x30, 0x57, 0x21, 0x11, 0x00, 0x03, 0x20, 0x20, 0x1d, 0x11, 0x26,
+ 0x31, 0x70, 0x21, 0xf0,
+ 0x03, 0x03, 0x40, 0x0f, 0x2f, 0x53, 0x27, 0x01, 0xfe, 0x32, 0x77, 0x22,
+ 0x0f, 0x01, 0x03, 0x30,
+ 0x13, 0x13, 0xf0, 0xe0, 0x23, 0x04, 0x04, 0x01, 0x01, 0x74, 0x44, 0x32,
+ 0x03, 0x33, 0x15, 0x11,
+ 0x31, 0x31, 0x43, 0x44, 0x12, 0x33, 0x12, 0x11, 0x04, 0x42, 0x42, 0x33,
+ 0x00, 0xcd, 0x24, 0x45,
+ 0x10, 0x10, 0x45, 0x20, 0x10, 0xdf, 0xbf, 0x00, 0x50, 0x37, 0x51, 0x00,
+ 0xf0, 0x0f, 0x2f, 0x00,
+ 0xdd, 0xfd, 0x01, 0x30, 0xee, 0xd8, 0x1d, 0x70, 0x60, 0x00, 0xfd, 0xe0,
+ 0x10, 0x29, 0xfd, 0x00,
+ 0x12, 0x21, 0xed, 0xdd, 0x0f, 0x2e, 0x3d, 0x0f, 0x00, 0x71, 0x55, 0x0e,
+ 0xe8, 0xad, 0x01, 0x03,
+ 0x1f, 0x0d, 0x10, 0x15, 0x00, 0xbe, 0xee, 0x00, 0x46, 0x00, 0xcc, 0xc0,
+ 0x0f, 0x02, 0x03, 0x01,
+ 0x00, 0xff, 0xfe, 0x0e, 0x42, 0x77, 0x01, 0x01, 0x00, 0xd2, 0x03, 0xf0,
+ 0xff, 0xdb, 0xd1, 0xf6,
+ 0xf1, 0xd0, 0x12, 0x73, 0x0f, 0xec, 0xd0, 0x04, 0x04, 0x00, 0x2f, 0x1f,
+ 0xe1, 0xd2, 0x33, 0x10,
+ 0x0e, 0x62, 0x34, 0x03, 0xd0, 0xae, 0x00, 0x62, 0x0a, 0xcb, 0x00, 0x0f,
+ 0xef, 0x0d, 0x12, 0x54,
+ 0x00, 0x0c, 0x01, 0x12, 0x20, 0x63, 0x0c, 0xee, 0x01, 0xf1, 0xff, 0x1e,
+ 0x3b, 0x2c, 0x10, 0x1e,
+ 0xea, 0x9e, 0x00, 0x32, 0x02, 0xfe, 0x0a, 0x0f, 0xaf, 0xf0, 0xf0, 0x31,
+ 0x1d, 0xcc, 0xd0, 0x13,
+ 0x43, 0x0d, 0x2b, 0x1f, 0xef, 0xe1, 0xf4, 0x0f, 0x8b, 0x00, 0x02, 0x11,
+ 0xc0, 0xde, 0xfd, 0x0b,
+ 0xfe, 0x8d, 0xe0, 0xf5, 0xe0, 0xde, 0xfd, 0xf3, 0xc0, 0xb8, 0xfd, 0xf0,
+ 0xe0, 0x10, 0x10, 0xec,
+ 0xb0, 0x00, 0xdd, 0xdd, 0xd0, 0xc0, 0x00, 0xe0, 0xe0, 0x8f, 0xfc, 0xfb,
+ 0x0c, 0xde, 0xff, 0xe0,
+ 0xde, 0xa8, 0xef, 0xed, 0xe0, 0x00, 0xed, 0xec, 0xe0, 0x00, 0x0e, 0xad,
+ 0xff, 0x04, 0x10, 0xbd,
+ 0xc8, 0xfe, 0xff, 0xf0, 0xe0, 0xdc, 0x0c, 0x0e, 0xdf, 0x02, 0xf1, 0x8d,
+ 0xec, 0xf0, 0x00, 0x0f,
+ 0x3e, 0xde, 0xbc, 0xff, 0x0d, 0xfe, 0xd9, 0x0e, 0x4f, 0x1f, 0x12, 0x00,
+ 0xeb, 0xdd, 0xe0, 0xc1,
+ 0x9c, 0xfc, 0x10, 0x10, 0x0d, 0x0c, 0x00, 0xb0, 0x00, 0x0c, 0xec, 0x0e,
+ 0x00, 0x07, 0x50, 0x30,
+ 0xd0, 0xdd, 0xfe, 0x0f, 0x52, 0x24, 0x10, 0x3e, 0x30, 0x01, 0x12, 0x1d,
+ 0x1d, 0x22, 0x07, 0xd0,
+ 0x8d, 0xc0, 0xf3, 0x17, 0x42, 0xef, 0xce, 0x1f, 0x61, 0x21, 0xde, 0xde,
+ 0x10, 0x57, 0x13, 0xf0,
+ 0xdc, 0x11, 0x75, 0x23, 0xf1, 0xe0, 0x01, 0x14, 0x02, 0xc0, 0x02, 0x13,
+ 0x10, 0xe0, 0xee, 0xf4,
+ 0x26, 0x73, 0x43, 0x22, 0x01, 0x01, 0x21, 0x22, 0x25, 0x02, 0xf3, 0x01,
+ 0xdb, 0x0d, 0x5f, 0x22,
+ 0xef, 0xec, 0x56, 0x22, 0xed, 0x2d, 0x71, 0x13, 0xff, 0xca, 0x00, 0x10,
+ 0x12, 0x0d, 0xee, 0x4d,
+ 0x40, 0x0e, 0x0f, 0xde, 0xfd, 0xfe, 0x20, 0xdd, 0xb8, 0x1f, 0x5e, 0x0a,
+ 0x1d, 0xf1, 0xc1, 0xcb,
+ 0xfe, 0x1e, 0x60, 0x00, 0xed, 0xcd, 0x0f, 0x2f, 0x20, 0xfb, 0xed, 0x1e,
+ 0x2f, 0xf2, 0xc4, 0xf0,
+ 0x3c, 0x60, 0xff, 0xad, 0xfb, 0xff, 0xf1, 0xf1, 0x01, 0x20, 0xe0, 0xc2,
+ 0xc0, 0xf0, 0xf3, 0x02,
+ 0xd2, 0xe6, 0xc0, 0xc0, 0x00, 0x22, 0x31, 0xde, 0xc7, 0x07, 0x52, 0x00,
+ 0x01, 0x24, 0x02, 0x03,
+ 0xe1, 0xc2, 0xc0, 0xde, 0xbd, 0xe0, 0x07, 0x25, 0x01, 0xd0, 0x30, 0x71,
+ 0x22, 0x01, 0x04, 0x24,
+ 0x12, 0x12, 0x1f, 0xef, 0xf0, 0x31, 0x22, 0x42, 0x75, 0x40, 0x01, 0x02,
+ 0x34, 0x52, 0x00, 0x2d,
+ 0x0b, 0x21, 0x02, 0x12, 0x41, 0x11, 0x30, 0x72, 0x77, 0x02, 0xeb, 0x0f,
+ 0x20, 0x13, 0x1e, 0x0f,
+ 0x21, 0x00, 0x0d, 0x02, 0x34, 0x1c, 0x3f, 0x64, 0x00, 0x1f, 0x1f, 0x1f,
+ 0x02, 0x03, 0xec, 0x0f,
+ 0x11, 0x0e, 0x0b, 0x72, 0x47, 0x00, 0xf1, 0x10, 0x40, 0x0d, 0xf1, 0xf2,
+ 0x0f, 0x01, 0x47, 0x20,
+ 0xfe, 0x01, 0x43, 0x15, 0x22, 0x00, 0x10, 0x01, 0xb1, 0xa2, 0xf0, 0xdf,
+ 0xfc, 0xed, 0x0a, 0xbf,
+ 0xf0, 0x03, 0x75, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11, 0xf4, 0xe4, 0x00,
+ 0xec, 0xee, 0x00, 0x44,
+ 0xe0, 0xe1, 0x54, 0x12, 0xd0, 0xcb, 0x12, 0x55, 0x10, 0x0f, 0xff, 0xf0,
+ 0x52, 0x11, 0x0e, 0xdc,
+ 0x74, 0x47, 0x01, 0xd0, 0x0e, 0x30, 0x13, 0x1f, 0x1f, 0x00, 0x02, 0x10,
+ 0x30, 0x1f, 0x75, 0x43,
+ 0x10, 0x0d, 0x03, 0x57, 0x12, 0x00, 0x30, 0x31, 0x02, 0x0f, 0x02, 0x67,
+ 0x30, 0x20, 0x22, 0x11,
+ 0x31, 0x55, 0x11, 0x00, 0xfa, 0x00, 0x22, 0x11, 0x00, 0x50, 0x41, 0x02,
+ 0x00, 0x11, 0x13, 0x52,
+ 0x22, 0x31, 0x02, 0x04, 0x00, 0xd1, 0x22, 0x11, 0x44, 0x77, 0x23, 0x22,
+ 0x11, 0x22, 0x33, 0x10,
+ 0x27, 0x06, 0xcf, 0xcf, 0x00, 0x1f, 0x41, 0x05, 0xd0, 0xdf, 0x70, 0x45,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x21, 0xe2, 0x00, 0x21, 0x42, 0x33, 0x00, 0xb0, 0x04, 0x01, 0x03, 0x31,
+ 0x07, 0x02, 0xc1, 0xb1,
+ 0xd0, 0xdd, 0xf0, 0x17, 0x42, 0x11, 0x33, 0x21, 0x43, 0x00, 0x10, 0x47,
+ 0x11, 0xe1, 0xc1, 0x01,
+ 0x32, 0x20, 0x9b, 0xf0, 0x00, 0x2f, 0xff, 0xde, 0xed, 0x00, 0x03, 0xa1,
+ 0x0c, 0x5b, 0x1f, 0x21,
+ 0xf1, 0x9c, 0xfb, 0x00, 0x2f, 0x00, 0x0d, 0xde, 0xfd, 0x0c, 0x0c, 0xef,
+ 0xae, 0xfb, 0x0e, 0x0e,
+ 0xfe, 0xee, 0xda, 0xfd, 0x0d, 0xbd, 0xef, 0x0d, 0x1b, 0x9c, 0xdf, 0x0d,
+ 0xfe, 0xba, 0xef, 0xfe,
+ 0xfd, 0xce, 0x0f, 0x10, 0x20, 0xa9, 0xef, 0x0f, 0xff, 0xff, 0xde, 0xbe,
+ 0xed, 0xfd, 0xee, 0xff,
+ 0xbf, 0xde, 0xe0, 0xef, 0xfa, 0xcd, 0xfd, 0xcd, 0xdd, 0xcf, 0xff, 0xfb,
+ 0xed, 0xbc, 0xfe, 0xee,
+ 0xf3, 0x04, 0x20, 0xcf, 0xdd, 0xde, 0xae, 0xdf, 0xc0, 0xfb, 0xdb, 0xff,
+ 0xce, 0xef, 0xe0, 0xf0,
+ 0xde, 0xeb, 0xff, 0xc0, 0xf2, 0xf5, 0xd2, 0x90, 0xfb, 0xdd, 0xfc, 0x00,
+ 0xe2, 0xf2, 0xee, 0xe9,
+ 0xf0, 0xee, 0xaf, 0xd0, 0xcf, 0x00, 0x1f, 0x0d, 0x8d, 0xfa, 0x02, 0x27,
+ 0x10, 0x1e, 0x0f, 0xe0,
+ 0xe0, 0xde, 0xbf, 0x00, 0x21, 0x10, 0xdd, 0xba, 0x10, 0x31, 0x0f, 0xbb,
+ 0x01, 0x04, 0x00, 0xfd,
+ 0x10, 0x30, 0x00, 0x9d, 0xeb, 0xfe, 0x01, 0x33, 0x10, 0x00, 0x4f, 0x2f,
+ 0xf1, 0xb1, 0x0f, 0xfb,
+ 0x30, 0x64, 0xfe, 0xb9, 0x00, 0x33, 0x00, 0xef, 0x00, 0x31, 0x01, 0x00,
+ 0xfd, 0x01, 0x06, 0x02,
+ 0xaf, 0xdb, 0xef, 0x0f, 0x2f, 0x0f, 0xed, 0x00, 0x20, 0x10, 0x3f, 0x21,
+ 0x03, 0xe0, 0x8b, 0x00,
+ 0x0e, 0xfd, 0x8c, 0x00, 0xf2, 0xee, 0xe0, 0x0f, 0x18, 0x3d, 0x02, 0xb0,
+ 0xfe, 0x03, 0x03, 0x30,
+ 0xfc, 0xba, 0x00, 0x15, 0x53, 0x10, 0xee, 0x00, 0x04, 0x61, 0x00, 0xde,
+ 0x00, 0xff, 0xdb, 0xfe,
+ 0x00, 0x14, 0x01, 0xf1, 0x32, 0x40, 0x32, 0x12, 0xe2, 0xd7, 0x23, 0x7e,
+ 0x2c, 0xde, 0x01, 0x77,
+ 0x41, 0x00, 0xe2, 0x22, 0x44, 0x43, 0x00, 0x0e, 0x10, 0x12, 0x01, 0xdc,
+ 0xfb, 0x01, 0x77, 0x31,
+ 0x0f, 0x30, 0x40, 0x12, 0x10, 0x22, 0x14, 0x62, 0x20, 0x0f, 0xf0, 0x00,
+ 0x34, 0x40, 0x3f, 0x32,
+ 0x15, 0x60, 0x34, 0x34, 0x13, 0x32, 0x40, 0x11, 0x0f, 0x00, 0x57, 0x01,
+ 0xec, 0x22, 0x76, 0x10,
+ 0x0f, 0x00, 0x23, 0x40, 0x10, 0x1f, 0x22, 0x34, 0x12, 0x10, 0x31, 0x63,
+ 0x03, 0x12, 0x34, 0x04,
+ 0x13, 0x36, 0x41, 0x01, 0x11, 0x01, 0x31, 0x02, 0x13, 0x56, 0x51, 0x21,
+ 0x35, 0x03, 0x20, 0x41,
+ 0x33, 0x42, 0x12, 0x12, 0x22, 0x11, 0x03, 0xf4, 0x11, 0x21, 0x53, 0x24,
+ 0x63, 0x42, 0x03, 0x12,
+ 0x04, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xca, 0xee, 0x21, 0x77, 0x60, 0x02,
+ 0x0f, 0x0f, 0x0f, 0x00,
+ 0x14, 0x11, 0x0e, 0xc8, 0x0e, 0x22, 0x00, 0xee, 0x0e, 0x4f, 0x50, 0x0f,
+ 0x0d, 0xfe, 0x10, 0x32,
+ 0x3c, 0x08, 0xff, 0xed, 0x80, 0xef, 0x00, 0x60, 0x10, 0x0a, 0x0e, 0x20,
+ 0x25, 0xdf, 0xcc, 0x00,
+ 0x30, 0xf0, 0xd0, 0xff, 0xe0, 0xff, 0x00, 0xe0, 0xcf, 0x1f, 0x71, 0x03,
+ 0xdd, 0xfd, 0x0f, 0x03,
+ 0x07, 0xe0, 0x0e, 0x40, 0x42, 0x02, 0xef, 0xe6, 0x15, 0xe0, 0xbf, 0x00,
+ 0xb0, 0xd0, 0xcc, 0x00,
+ 0x01, 0xc4, 0xe1, 0x01, 0xf5, 0xb0, 0x01, 0x11, 0x32, 0xf0, 0xc0, 0x04,
+ 0xd5, 0xb0, 0x0e, 0x10,
+ 0x10, 0xf0, 0xb0, 0xf2, 0x03, 0x00, 0x10, 0x0e, 0xd8, 0xfd, 0xdf, 0xce,
+ 0xd0, 0x00, 0x3e, 0x2b,
+ 0xd0, 0xc4, 0x61, 0x20, 0x2d, 0x1b, 0x0e, 0x30, 0x50, 0x10, 0xec, 0xce,
+ 0xfe, 0xfc, 0x0b, 0x70,
+ 0xf0, 0xcf, 0xec, 0x10, 0x62, 0x00, 0xdb, 0xfc, 0x0e, 0x0d, 0xe0, 0xac,
+ 0x0f, 0xf0, 0x34, 0x4f,
+ 0xeb, 0xdf, 0x0f, 0x00, 0x2f, 0xfc, 0xd0, 0x22, 0x02, 0xcf, 0xa9, 0xff,
+ 0x00, 0x00, 0x20, 0x9d,
+ 0xed, 0xd0, 0xf1, 0x10, 0x09, 0x8f, 0xef, 0xef, 0xed, 0xee, 0x11, 0x40,
+ 0xe9, 0xce, 0x00, 0x01,
+ 0x00, 0xdc, 0xce, 0xfe, 0xe0, 0xee, 0xf2, 0xb2, 0xdd, 0xea, 0xee, 0xdd,
+ 0xdf, 0x00, 0xbe, 0xa8,
+ 0xff, 0xf0, 0x00, 0xef, 0xed, 0xdf, 0xfc, 0xdf, 0xde, 0xcf, 0x00, 0x20,
+ 0x0f, 0xab, 0xef, 0xee,
+ 0xba, 0xef, 0xef, 0xfd, 0xee, 0xfe, 0xef, 0xde, 0xe1, 0x21, 0x1c, 0x0e,
+ 0xd3, 0xe0, 0xb8, 0xfd,
+ 0xdf, 0xc0, 0xc2, 0xfd, 0x19, 0x20, 0x10, 0x01, 0xe0, 0x8f, 0x0c, 0x20,
+ 0x53, 0xf1, 0xde, 0x1e,
+ 0x2f, 0xfc, 0xbc, 0x0e, 0x0d, 0x11, 0xd5, 0xcf, 0xfb, 0x2e, 0x6e, 0xff,
+ 0xe3, 0xf5, 0xf0, 0x0d,
+ 0x3f, 0x4e, 0xfe, 0xc0, 0x13, 0x22, 0x4f, 0x2e, 0x22, 0x14, 0x10, 0x1e,
+ 0x04, 0xf6, 0x90, 0xdc,
+ 0xef, 0x01, 0x16, 0x31, 0x31, 0x10, 0x0e, 0x0f, 0x9f, 0x02, 0x76, 0x32,
+ 0x0f, 0xde, 0x00, 0x52,
+ 0x07, 0xf1, 0xe0, 0x00, 0x32, 0x12, 0x02, 0xe0, 0x02, 0x23, 0xf2, 0x82,
+ 0xcf, 0x0f, 0x34, 0x77,
+ 0x07, 0x10, 0x02, 0x12, 0x21, 0x20, 0x01, 0x14, 0x00, 0xfe, 0xc0, 0x04,
+ 0x12, 0xe0, 0xef, 0x60,
+ 0x4e, 0x10, 0x03, 0x02, 0x36, 0x30, 0xe0, 0xe0, 0xe0, 0x0e, 0x0d, 0x1f,
+ 0x1b, 0xfe, 0x30, 0x12,
+ 0x9c, 0x40, 0x20, 0x43, 0x57, 0xdc, 0xdd, 0x00, 0x40, 0x02, 0xdc, 0xac,
+ 0x0f, 0x3f, 0x0f, 0xfc,
+ 0xdd, 0x02, 0x50, 0x08, 0x30, 0xf1, 0xe2, 0xfd, 0xda, 0x30, 0x33, 0x52,
+ 0x09, 0x3f, 0x00, 0x94,
+ 0x00, 0x1d, 0x7e, 0x60, 0xd2, 0xd0, 0xf0, 0x10, 0x03, 0x1f, 0x1b, 0xe0,
+ 0xc0, 0xf5, 0x20, 0x1d,
+ 0xff, 0xd3, 0x01, 0x1f, 0x9a, 0xf0, 0x03, 0x62, 0x10, 0xd0, 0xd0, 0x15,
+ 0x60, 0x1d, 0x00, 0xd4,
+ 0x02, 0x0f, 0xed, 0xf0, 0x05, 0x10, 0x2d, 0xa0, 0xe5, 0x03, 0x5f, 0x3e,
+ 0xf1, 0xd5, 0x00, 0x00,
+ 0x00, 0x11, 0x02, 0xf0, 0x0e, 0x06, 0x01, 0x3e, 0x2d, 0x20, 0x02, 0xf3,
+ 0x06, 0x74, 0x3f, 0x0d,
+ 0xdf, 0x2f, 0x2f, 0x0e, 0xc4, 0x13, 0x70, 0x7b, 0x30, 0x91, 0x00, 0x20,
+ 0x1d, 0x00, 0x05, 0xf5,
+ 0x0f, 0x1c, 0x00, 0x01, 0x23, 0x00, 0xbf, 0xff, 0x23, 0x23, 0x00, 0xaf,
+ 0x0f, 0x02, 0x20, 0x1d,
+ 0xff, 0x16, 0x72, 0x2f, 0x09, 0xd0, 0xe2, 0x30, 0x6f, 0x0f, 0x04, 0xe3,
+ 0xdb, 0x0f, 0x30, 0x25,
+ 0x10, 0x00, 0x0f, 0x30, 0x03, 0xe1, 0xdf, 0x2e, 0x70, 0x10, 0x0f, 0x0e,
+ 0xbe, 0xf0, 0xff, 0x2a,
+ 0x2e, 0xee, 0xbf, 0x0e, 0x10, 0x27, 0xe2, 0xff, 0x2d, 0x6e, 0x0f, 0xe0,
+ 0x0d, 0x0b, 0x01, 0xe6,
+ 0xcf, 0xec, 0x00, 0x00, 0xe5, 0x01, 0x71, 0x0f, 0xde, 0xd0, 0x00, 0x0f,
+ 0x3c, 0xff, 0xc0, 0x23,
+ 0x00, 0xe0, 0x34, 0x14, 0x0e, 0x09, 0x00, 0xef, 0x70, 0xf5, 0xa0, 0xff,
+ 0x0f, 0x11, 0x00, 0x00,
+ 0x1d, 0x4f, 0x54, 0x17, 0xb1, 0xfe, 0x2e, 0x4f, 0x30, 0x00, 0xb5, 0x03,
+ 0x00, 0x5e, 0x10, 0xf1,
+ 0xf1, 0x01, 0x0e, 0x50, 0x02, 0xf1, 0xfe, 0x21, 0x56, 0x00, 0xc1, 0x10,
+ 0x21, 0x54, 0x04, 0xdf,
+ 0xdc, 0xf0, 0x01, 0x14, 0x23, 0x22, 0x00, 0xce, 0x00, 0x23, 0x52, 0x12,
+ 0x13, 0x50, 0x2c, 0x09,
+ 0xef, 0xed, 0x0e, 0x00, 0x35, 0x04, 0xbf, 0x0d, 0x14, 0x04, 0x0f, 0x0c,
+ 0x30, 0x62, 0x00, 0xff,
+ 0x1d, 0x30, 0x01, 0x14, 0x00, 0x1d, 0x00, 0xc0, 0xcf, 0x00, 0x27, 0x34,
+ 0xbd, 0xbf, 0x00, 0x05,
+ 0x10, 0x4e, 0x00, 0x00, 0xc2, 0xe1, 0x00, 0x03, 0x36, 0x1f, 0x1b, 0x10,
+ 0x05, 0xd5, 0xa1, 0x00,
+ 0xe0, 0x0e, 0x50, 0xf1, 0xc0, 0xff, 0x00, 0x45, 0x32, 0xdf, 0xbd, 0x0e,
+ 0x4f, 0x20, 0xe6, 0xb4,
+ 0x00, 0x1e, 0x3d, 0x0f, 0xc0, 0xee, 0x01, 0x43, 0x14, 0xd0, 0xd9, 0xf0,
+ 0x2f, 0x10, 0xff, 0xc0,
+ 0xff, 0x20, 0x6f, 0x10, 0xf0, 0xba, 0xff, 0x0f, 0x30, 0x40, 0xf0, 0xad,
+ 0x0c, 0x00, 0x0f, 0x0d,
+ 0x2e, 0x1e, 0x41, 0x00, 0xf8, 0xbf, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0xf0,
+ 0xbe, 0xfc, 0xd1, 0x04,
+ 0x0f, 0x2c, 0x20, 0x21, 0x1e, 0x09, 0xde, 0xef, 0x20, 0x7f, 0xfd, 0xdc,
+ 0xee, 0x00, 0x02, 0xd5,
+ 0xf0, 0xcf, 0x00, 0x00, 0x30, 0x4d, 0x00, 0xd1, 0x8f, 0xec, 0xf0, 0x00,
+ 0x07, 0x20, 0x1c, 0xbe,
+ 0xef, 0x02, 0xe7, 0xf3, 0xcf, 0x1d, 0x4e, 0x00, 0xb1, 0xc0, 0x05, 0x05,
+ 0xd9, 0x00, 0x44, 0x00,
+ 0xc7, 0xb6, 0x33, 0x02, 0x94, 0xba, 0x1c, 0x00, 0x12, 0xd1, 0x88, 0xe8,
+ 0x0e, 0x60, 0x13, 0xf5,
+ 0xc4, 0xf0, 0x0f, 0x2e, 0x1f, 0xe2, 0xe1, 0x01, 0x04, 0x03, 0xf0, 0xeb,
+ 0x1e, 0x70, 0x32, 0xe3,
+ 0xd0, 0xe1, 0x01, 0x02, 0x43, 0x1d, 0xcb, 0xef, 0x1e, 0x33, 0x65, 0xf3,
+ 0xc0, 0x0e, 0x0c, 0x1f,
+ 0x0e, 0x00, 0x0f, 0x2c, 0xff, 0xd0, 0xd3, 0x0f, 0x6c, 0x40, 0x31, 0x09,
+ 0xcd, 0xc0, 0x01, 0x06,
+ 0x20, 0x4d, 0x2e, 0x10, 0xfe, 0x0d, 0xef, 0x00, 0x41, 0x32, 0x21, 0x0c,
+ 0xac, 0xfd, 0xd0, 0xf3,
+ 0xd1, 0xe0, 0xe2, 0x03, 0xfe, 0x18, 0x5d, 0x52, 0x23, 0x0f, 0xe8, 0x0d,
+ 0x4e, 0x40, 0x01, 0xed,
+ 0xca, 0x0f, 0xf1, 0xe7, 0xe0, 0x10, 0x3e, 0x6f, 0x10, 0xc1, 0xa1, 0x01,
+ 0x10, 0x3d, 0x30, 0xc1,
+ 0xe0, 0x1c, 0x50, 0x04, 0xe3, 0xd1, 0x00, 0x0d, 0x40, 0x10, 0xf0, 0xc4,
+ 0xf5, 0x03, 0x00, 0xfb,
+ 0xee, 0xfd, 0x0f, 0x52, 0x06, 0xb1, 0xf0, 0x0f, 0x60, 0x11, 0x03, 0xc7,
+ 0x00, 0x02, 0x21, 0x01,
+ 0x00, 0xf0, 0xf2, 0x01, 0x30, 0x30, 0x30, 0x31, 0x12, 0xe3, 0xd3, 0xf2,
+ 0x51, 0x32, 0x7f, 0x2d,
+ 0x00, 0xb5, 0x07, 0x05, 0x02, 0x30, 0x3e, 0x30, 0xff, 0xcf, 0xeb, 0x00,
+ 0x00, 0x64, 0x34, 0x3f,
+ 0x0d, 0x0e, 0xf1, 0x01, 0x20, 0x00, 0x07, 0x41, 0x1f, 0x0b, 0x0e, 0x50,
+ 0x20, 0x12, 0x31, 0x0e,
+ 0x2b, 0x70, 0x71, 0x01, 0xe0, 0xff, 0x0f, 0xf1, 0x07, 0xc2, 0xf1, 0x0e,
+ 0x3f, 0xf1, 0xc5, 0xe2,
+ 0x10, 0x70, 0x4f, 0xfe, 0xfc, 0xed, 0x1e, 0x33, 0x06, 0x01, 0xf1, 0x00,
+ 0x20, 0x22, 0x13, 0xd0,
+ 0xe7, 0xe3, 0x21, 0x70, 0x0e, 0xce, 0x00, 0x31, 0x36, 0x02, 0xa2, 0x0d,
+ 0x1e, 0x20, 0x31, 0xf2,
+ 0xc4, 0xf0, 0x0e, 0x11, 0x42, 0x02, 0xbd, 0xec, 0xee, 0x01, 0x04, 0x1f,
+ 0x0f, 0x10, 0x0f, 0x0b,
+ 0xe0, 0xf5, 0x74, 0x42, 0x10, 0xd0, 0xc1, 0x05, 0x02, 0x12, 0x3f, 0x3e,
+ 0x40, 0x0e, 0xa0, 0x02,
+ 0x07, 0x21, 0x3f, 0x6b, 0x0e, 0x0e, 0x00, 0xf4, 0x01, 0x14, 0x41, 0x12,
+ 0x10, 0xfc, 0xcd, 0x0e,
+ 0xf2, 0x15, 0x12, 0xef, 0xdb, 0x0f, 0x7e, 0x20, 0x01, 0xd0, 0x0f, 0x5c,
+ 0x13, 0xf4, 0xc0, 0x0a,
+ 0x1e, 0x2e, 0x00, 0xb1, 0xf3, 0x01, 0x3f, 0x6b, 0x0e, 0xdd, 0xed, 0xf0,
+ 0x13, 0x33, 0xd1, 0xcc,
+ 0xdd, 0xe0, 0xde, 0xc1, 0xb7, 0xf7, 0xe0, 0x22, 0x40, 0xcd, 0xee, 0x0f,
+ 0x2d, 0x20, 0x00, 0xf2,
+ 0xec, 0x3c, 0x50, 0x2f, 0xf1, 0xb4, 0xe1, 0x01, 0x20, 0x2d, 0x0e, 0xe0,
+ 0xb5, 0x01, 0x00, 0x3e,
+ 0x10, 0x24, 0xf0, 0xde, 0xd0, 0x00, 0x30, 0x65, 0x64, 0x00, 0x0f, 0xc0,
+ 0xf4, 0x07, 0x20, 0x3e,
+ 0x00, 0xd0, 0xff, 0xb0, 0xf0, 0xf0, 0x11, 0x72, 0x2b, 0x0e, 0x00, 0xd6,
+ 0x04, 0x11, 0x01, 0x31,
+ 0x40, 0x20, 0xd1, 0xa0, 0x0f, 0x23, 0x47, 0x17, 0xd0, 0x0f, 0x1d, 0x70,
+ 0x00, 0xf3, 0xf2, 0x10,
+ 0x2f, 0x10, 0x03, 0xe0, 0x0e, 0x1f, 0x2f, 0xd1, 0x92, 0xf2, 0xe3, 0x2f,
+ 0x68, 0x0d, 0xde, 0xec,
+ 0x00, 0x40, 0x34, 0xd0, 0xd9, 0xff, 0x0f, 0x0e, 0xe0, 0xdd, 0xf0, 0x00,
+ 0x01, 0x1d, 0xda, 0xce,
+ 0x00, 0x7e, 0x2f, 0x00, 0xcf, 0xda, 0xfe, 0x0f, 0x0e, 0xc1, 0x82, 0xe0,
+ 0xfe, 0xee, 0x00, 0xe0,
+ 0xd1, 0xf2, 0xe0, 0x08, 0x2e, 0x3b, 0x0f, 0xe0, 0xfd, 0x00, 0x3f, 0x30,
+ 0x22, 0x5e, 0x09, 0x8f,
+ 0xd0, 0xe3, 0x00, 0x10, 0x00, 0x4e, 0x0f, 0xbe, 0xee, 0xe0, 0x05, 0x31,
+ 0x30, 0x2b, 0xcf, 0xe0,
+ 0xe1, 0xf5, 0xd0, 0x00, 0x7e, 0x5f, 0xe1, 0xc2, 0xfe, 0xfd, 0x0f, 0x02,
+ 0x07, 0xce, 0x0c, 0x2e,
+ 0x30, 0x00, 0x07, 0x03, 0x0f, 0x5f, 0x00, 0x03, 0xf0, 0xe1, 0x41, 0x54,
+ 0x01, 0xb0, 0xf4, 0x02,
+ 0x41, 0x30, 0x0c, 0xf0, 0xe2, 0x13, 0x64, 0x22, 0x12, 0x02, 0x00, 0x00,
+ 0x46, 0x03, 0x03, 0xc0,
+ 0xf0, 0x00, 0x00, 0x10, 0xff, 0xef, 0x2e, 0x77, 0x14, 0xef, 0xea, 0x00,
+ 0x60, 0x12, 0x01, 0xd2,
+ 0x00, 0x0d, 0x0c, 0x0c, 0x00, 0xe4, 0x05, 0x02, 0x5c, 0x1d, 0x2f, 0x20,
+ 0x0e, 0xed, 0xd0, 0x02,
+ 0x3e, 0x3d, 0x1e, 0xae, 0x8f, 0xe3, 0xe7, 0xf4, 0xe1, 0x0f, 0x0d, 0x0c,
+ 0xac, 0xf0, 0xfd, 0x10,
+ 0x60, 0x00, 0x0a, 0x0e, 0x0f, 0x0f, 0xe1, 0xf2, 0x0e, 0x5b, 0x2f, 0xf1,
+ 0xb3, 0xfe, 0x0a, 0x00,
+ 0x12, 0x10, 0xfd, 0xfd, 0xfd, 0xff, 0x00, 0x05, 0x02, 0x7d, 0x2c, 0x20,
+ 0xff, 0xc4, 0x04, 0x12,
+ 0x2e, 0xfe, 0xbd, 0xd0, 0xfc, 0x00, 0x20, 0x0f, 0xec, 0xc0, 0x06, 0x31,
+ 0x70, 0x00, 0xee, 0x00,
+ 0x04, 0x27, 0x12, 0xd0, 0xf0, 0x00, 0x32, 0x11, 0x03, 0xd2, 0x21, 0x45,
+ 0x62, 0x30, 0xfe, 0x00,
+ 0x10, 0x73, 0x66, 0x04, 0x02, 0x01, 0xf0, 0x00, 0x1f, 0x04, 0xf5, 0x02,
+ 0x32, 0x00, 0xfe, 0x00,
+ 0x20, 0x11, 0xe2, 0xe2, 0x52, 0x60, 0x1d, 0x00, 0xff, 0x00, 0x00, 0x03,
+ 0xd4, 0x12, 0x70, 0x2c,
+ 0x0c, 0xee, 0x0d, 0x5d, 0x32, 0x2f, 0xf8, 0x08, 0x19, 0x10, 0xf2, 0xa1,
+ 0x01, 0x00, 0x0d, 0xf0,
+ 0xb3, 0xb0, 0xe0, 0x00, 0x0f, 0x51, 0x00, 0xfd, 0xfd, 0x0b, 0x00, 0x2f,
+ 0x00, 0x0f, 0x5f, 0x1d,
+ 0x0b, 0xef, 0xd0, 0x17, 0x32, 0x40, 0x0e, 0xef, 0xc0, 0x00, 0x11, 0x20,
+ 0x00, 0xa0, 0xf0, 0x02,
+ 0x30, 0x61, 0x00, 0x0d, 0x07, 0x07, 0x02, 0x01, 0xdf, 0xdd, 0xfe, 0x00,
+ 0x00, 0xde, 0xbf, 0xe0,
+ 0x15, 0x41, 0x30, 0xf0, 0xb0, 0x00, 0x3f, 0x22, 0xe7, 0xd6, 0xe0, 0x00,
+ 0x1e, 0x10, 0x22, 0x75,
+ 0x11, 0xd1, 0xf0, 0x30, 0x41, 0x20, 0x1f, 0x22, 0x74, 0x31, 0x1f, 0x20,
+ 0x31, 0x30, 0x07, 0xe3,
+ 0x02, 0x00, 0x3c, 0x30, 0xf3, 0x80, 0xd2, 0xf1, 0x01, 0x23, 0x50, 0x4a,
+ 0x1c, 0x0f, 0x11, 0x05,
+ 0x02, 0x00, 0x3e, 0x7c, 0x30, 0xb0, 0xd1, 0xe3, 0x03, 0x72, 0x20, 0x1f,
+ 0x0b, 0xfc, 0x0c, 0x1f,
+ 0x3e, 0x00, 0x23, 0x25, 0x0f, 0xeb, 0xb0, 0xb1, 0xe5, 0x00, 0x00, 0x20,
+ 0xc1, 0xd0, 0xee, 0x00,
+ 0x50, 0x10, 0xee, 0xfd, 0x1e, 0x30, 0x41, 0x0d, 0x0d, 0xf0, 0x17, 0x32,
+ 0x51, 0x00, 0x00, 0x00,
+ 0x2f, 0x1f, 0xf2, 0x85, 0xf0, 0x0b, 0x2e, 0x30, 0x10, 0x01, 0x20, 0x72,
+ 0x06, 0x14, 0x03, 0x11,
+ 0x01, 0xd0, 0x0f, 0x0a, 0x10, 0xf3, 0xc0, 0xfd, 0xff, 0x10, 0x24, 0x01,
+ 0x54, 0x10, 0x01, 0xdf,
+ 0xee, 0x00, 0x36, 0x17, 0xe2, 0xf0, 0x00, 0x70, 0x30, 0x05, 0x80, 0xf2,
+ 0x03, 0x00, 0x32, 0x4f,
+ 0x0f, 0xdd, 0x00, 0x42, 0x17, 0x06, 0x30, 0x7e, 0x2f, 0xf0, 0xd0, 0xd1,
+ 0xe2, 0xe1, 0x31, 0x5e,
+ 0xef, 0xc0, 0xed, 0xf0, 0x00, 0x40, 0x10, 0x00, 0xeb, 0x0b, 0x0e, 0xae,
+ 0xe0, 0xef, 0x20, 0x33,
+ 0x20, 0x98, 0xde, 0x0e, 0x00, 0x4d, 0x5c, 0xfb, 0xfe, 0xff, 0x0d, 0x1f,
+ 0x0e, 0x0e, 0xcd, 0xf0,
+ 0x0e, 0xcf, 0xef, 0xc1, 0xfd, 0xf9, 0xe0, 0xdf, 0xde, 0xfd, 0xf9, 0x0e,
+ 0xff, 0xee, 0x00, 0xdc,
+ 0xee, 0x2d, 0x70, 0x71, 0x00, 0xdf, 0x0d, 0x10, 0x01, 0x00, 0xbe, 0xfb,
+ 0xeb, 0xff, 0xfd, 0xef,
+ 0x1f, 0x20, 0x10, 0x03, 0xf0, 0xea, 0x00, 0x13, 0xf7, 0x91, 0xef, 0xec,
+ 0xce, 0x00, 0x00, 0x91,
+ 0xe0, 0x00, 0x01, 0x20, 0x20, 0xdd, 0x9e, 0x00, 0xf4, 0xf7, 0xe3, 0x0f,
+ 0x2f, 0x6e, 0x00, 0xc2,
+ 0xe5, 0xf5, 0x02, 0x20, 0x2f, 0x1f, 0xd1, 0xb1, 0x01, 0x10, 0x35, 0x22,
+ 0x10, 0x2f, 0x4f, 0x11,
+ 0xf3, 0xf2, 0x05, 0x44, 0x31, 0x0e, 0x9c, 0xd0, 0xc0, 0x14, 0x54, 0x20,
+ 0x00, 0xdf, 0x0f, 0x0d,
+ 0x0f, 0x0e, 0x20, 0x2b, 0x0d, 0xde, 0xe1, 0xd6, 0xd1, 0xee, 0x2d, 0x71,
+ 0x43, 0x2f, 0x08, 0x1e,
+ 0x4d, 0x3f, 0x1f, 0x0e, 0xfe, 0xfe, 0x2f, 0x3f, 0x03, 0x84, 0xdf, 0xcf,
+ 0x02, 0xd7, 0xf1, 0xff,
+ 0xec, 0xce, 0xff, 0xef, 0xee, 0x2d, 0x30, 0x0f, 0xbd, 0x08, 0x1d, 0x60,
+ 0x40, 0x16, 0x01, 0xde,
+ 0xff, 0x1e, 0x10, 0xd0, 0x90, 0xf0, 0xfc, 0x1f, 0x3f, 0x1f, 0x00, 0x0f,
+ 0x05, 0x55, 0x01, 0x00,
+ 0x10, 0x10, 0x2e, 0xf0, 0xa4, 0xd5, 0xc1, 0x00, 0x4b, 0x40, 0x0f, 0xb0,
+ 0xe1, 0x03, 0x02, 0x20,
+ 0x1b, 0x1e, 0x10, 0x13, 0x02, 0xf2, 0xd4, 0x37, 0x51, 0x30, 0x0d, 0x90,
+ 0xf2, 0xd1, 0x11, 0x66,
+ 0x33, 0x00, 0xfd, 0xe0, 0x23, 0x54, 0x22, 0x21, 0x43, 0x00, 0xf2, 0xe0,
+ 0x00, 0x10, 0x00, 0x04,
+ 0x42, 0x06, 0x04, 0xf3, 0x00, 0x3e, 0x50, 0x30, 0x02, 0x0c, 0x1c, 0x1f,
+ 0x42, 0x04, 0x00, 0xd1,
+ 0x01, 0x02, 0x01, 0x43, 0x31, 0x50, 0x0f, 0x59, 0x2d, 0x3a, 0x3f, 0x7f,
+ 0x10, 0x0e, 0x0d, 0x1f,
+ 0x3f, 0x06, 0x06, 0xf1, 0x9f, 0xff, 0x00, 0x01, 0xf2, 0xb2, 0xf0, 0xff,
+ 0x0e, 0x0f, 0x00, 0xdf,
+ 0x00, 0x30, 0x62, 0x21, 0x02, 0x00, 0x5f, 0x24, 0x07, 0xc7, 0xf3, 0x00,
+ 0x2f, 0x3e, 0x2f, 0xf0,
+ 0x93, 0xe2, 0x04, 0x25, 0x40, 0x2f, 0x0f, 0x00, 0x06, 0x01, 0x02, 0xf3,
+ 0x10, 0x52, 0x3f, 0x0c,
+ 0xb0, 0xde, 0xe1, 0x03, 0x23, 0x00, 0x0d, 0xa8, 0xf0, 0xff, 0x10, 0x73,
+ 0x24, 0x01, 0xd0, 0x0d,
+ 0xf1, 0x05, 0x02, 0x1f, 0x0e, 0x21, 0xe2, 0xb4, 0xf0, 0xf0, 0x4f, 0x40,
+ 0x32, 0x12, 0x12, 0x12,
+ 0x33, 0x21, 0x23, 0x1e, 0x38, 0x1c, 0x30, 0x12, 0x03, 0xc3, 0x06, 0x12,
+ 0x72, 0x00, 0xcb, 0x0e,
+ 0x5f, 0x1e, 0xff, 0xcd, 0x0d, 0x0f, 0x20, 0x17, 0xe0, 0xcd, 0xe0, 0x0f,
+ 0x21, 0xf5, 0xb1, 0x00,
+ 0x38, 0x7f, 0x3e, 0x0f, 0xfe, 0x00, 0x2f, 0x2f, 0x00, 0x00, 0xbc, 0xe0,
+ 0xf0, 0xf1, 0xb4, 0xe2,
+ 0xb3, 0x0f, 0x0d, 0xfd, 0xdc, 0x92, 0xf4, 0xf1, 0x0e, 0x4a, 0x0e, 0xde,
+ 0xf0, 0x10, 0x00, 0x06,
+ 0x02, 0x10, 0x4d, 0x10, 0x0e, 0xa0, 0xe0, 0xfd, 0xef, 0x31, 0x32, 0x2c,
+ 0xcc, 0xce, 0x00, 0x27,
+ 0x62, 0x03, 0x0d, 0xeb, 0x00, 0xf3, 0x13, 0x44, 0x10, 0x0a, 0xe0, 0xaf,
+ 0xe0, 0x00, 0xef, 0x10,
+ 0x40, 0x2e, 0x0f, 0xcf, 0xef, 0x00, 0x20, 0x01, 0xe1, 0x00, 0x3f, 0xe0,
+ 0x8c, 0xe9, 0xf0, 0x02,
+ 0x02, 0x0e, 0x0e, 0x23, 0x57, 0x11, 0x02, 0xf1, 0xf0, 0x10, 0x6e, 0x3d,
+ 0x03, 0x16, 0xee, 0xdb,
+ 0x00, 0x00, 0x07, 0xd4, 0xd0, 0x0e, 0x1e, 0x70, 0x00, 0xbf, 0x00, 0x00,
+ 0x0f, 0x1c, 0xfd, 0xcf,
+ 0xe0, 0xff, 0x00, 0xc5, 0xa3, 0xd0, 0xfd, 0x19, 0x5e, 0x0f, 0xcd, 0x0f,
+ 0x3d, 0x3d, 0x2d, 0x0c,
+ 0xec, 0xde, 0x00, 0xd0, 0xf1, 0xed, 0x0c, 0x00, 0xa3, 0xe0, 0x80, 0xe0,
+ 0xe4, 0xfc, 0x09, 0x00,
+ 0xfe, 0xcd, 0xcc, 0x00, 0x10, 0x41, 0x10, 0x1b, 0x0e, 0xd0, 0x00, 0x05,
+ 0x42, 0x00, 0xec, 0xfd,
+ 0xde, 0xd0, 0xd0, 0x0f, 0x3d, 0x71, 0x63, 0xe0, 0xf0, 0x01, 0x00, 0x22,
+ 0x33, 0x27, 0x02, 0x01,
+ 0xf0, 0xb0, 0xec, 0xfe, 0xed, 0x00, 0x0f, 0xec, 0xce, 0x0d, 0x4b, 0x0f,
+ 0xe0, 0xc0, 0x00, 0x70,
+ 0x43, 0x07, 0xe6, 0xe0, 0xee, 0x00, 0x00, 0xf2, 0xf4, 0x00, 0x00, 0x10,
+ 0x40, 0x06, 0xe4, 0x02,
+ 0x71, 0x7f, 0x2e, 0x0f, 0xe1, 0x01, 0x44, 0x33, 0x04, 0xd4, 0x01, 0x01,
+ 0x21, 0x22, 0x02, 0xd3,
+ 0x06, 0x32, 0x4e, 0x4c, 0x1f, 0x00, 0x0f, 0xe2, 0x36, 0x23, 0x00, 0x8e,
+ 0x00, 0xe3, 0xe4, 0xe2,
+ 0xe3, 0x50, 0x5f, 0x3d, 0x41, 0x0f, 0xdc, 0x00, 0x0e, 0x4f, 0x2b, 0x40,
+ 0x09, 0xde, 0xef, 0x02,
+ 0x07, 0x14, 0x10, 0xfe, 0xa0, 0xe0, 0xbf, 0xe0, 0xf0, 0xf0, 0x1f, 0x0e,
+ 0xfb, 0xc0, 0x0e, 0x10,
+ 0x30, 0x71, 0x14, 0x11, 0xe0, 0xde, 0x00, 0xfc, 0x0d, 0x0c, 0x2e, 0x0e,
+ 0x88, 0xd0, 0x0e, 0x00,
+ 0x00, 0x11, 0x22, 0x3f, 0x0d, 0x1e, 0x22, 0xd5, 0x8f, 0xea, 0xff, 0x10,
+ 0x51, 0xff, 0xdd, 0x02,
+ 0x01, 0x0c, 0xee, 0xf1, 0x03, 0x0e, 0x38, 0x0d, 0x90, 0x03, 0x05, 0x20,
+ 0x0f, 0xdf, 0xf1, 0xcf,
+ 0xde, 0xff, 0x22, 0x15, 0x81, 0xd3, 0x00, 0x41, 0x50, 0x0e, 0x00, 0xf5,
+ 0x13, 0x22, 0x12, 0x11,
+ 0x1f, 0x0d, 0xfe, 0xf7, 0x07, 0xf1, 0x22, 0x70, 0x10, 0x31, 0x01, 0x00,
+ 0xde, 0x12, 0x75, 0x20,
+ 0x0e, 0xf0, 0xe0, 0xd1, 0xc3, 0xf6, 0x01, 0x31, 0x3f, 0x1e, 0xe0, 0xf0,
+ 0x53, 0x51, 0x1e, 0x5e,
+ 0x2f, 0xf8, 0xec, 0x00, 0x40, 0x00, 0x0e, 0x10, 0x54, 0x01, 0xcf, 0x01,
+ 0x06, 0x01, 0x00, 0xfe,
+ 0xe1, 0x9f, 0xeb, 0x0e, 0xf0, 0x1f, 0x40, 0x02, 0x00, 0xff, 0x20, 0x21,
+ 0xe0, 0xe5, 0xff, 0xda,
+ 0x5f, 0x10, 0xde, 0x9e, 0x00, 0x20, 0x1d, 0xe0, 0x05, 0x22, 0x2f, 0x09,
+ 0x00, 0x01, 0xe2, 0x90,
+ 0x0f, 0x52, 0x12, 0xfd, 0xde, 0x12, 0x0e, 0xdd, 0xe0, 0xe6, 0xe0, 0xfb,
+ 0x0d, 0x2d, 0x10, 0x04,
+ 0x8f, 0xe1, 0x13, 0x3f, 0x0f, 0x0c, 0xed, 0x02, 0x07, 0xf1, 0xa1, 0x02,
+ 0x01, 0x0f, 0x0f, 0x01,
+ 0x57, 0x34, 0x0f, 0xfd, 0x72, 0x73, 0x0e, 0xea, 0x01, 0x03, 0x01, 0x00,
+ 0x30, 0x03, 0xfe, 0xd0,
+ 0xf4, 0x02, 0x01, 0x70, 0x72, 0x0f, 0xe8, 0x00, 0x12, 0x00, 0xef, 0x14,
+ 0x20, 0xfc, 0xe0, 0x03,
+ 0x15, 0xef, 0x0e, 0x74, 0x43, 0xff, 0xdb, 0x10, 0x31, 0x0e, 0x2d, 0x41,
+ 0x00, 0xf0, 0x0e, 0x4e,
+ 0x10, 0x25, 0x02, 0xe0, 0x54, 0x10, 0xef, 0xc0, 0xf4, 0xe0, 0xdb, 0x00,
+ 0x3f, 0x20, 0xf0, 0xe0,
+ 0x61, 0x21, 0xdd, 0xef, 0x03, 0x55, 0x41, 0x0f, 0x00, 0xef, 0xf0, 0x1d,
+ 0x44, 0x12, 0xc9, 0x10,
+ 0x43, 0x0f, 0x0c, 0x11, 0x47, 0x00, 0xbf, 0xfd, 0x32, 0x77, 0x0f, 0xfe,
+ 0x01, 0x15, 0x00, 0x00,
+ 0xd0, 0x0d, 0x00, 0xff, 0x22, 0x01, 0x9e, 0x00, 0x23, 0x44, 0xfc, 0xec,
+ 0x01, 0x67, 0x00, 0xcf,
+ 0x00, 0x31, 0x00, 0xcf, 0xef, 0x04, 0x02, 0xe0, 0x10, 0x62, 0x00, 0xef,
+ 0x00, 0x05, 0x22, 0x10,
+ 0x40, 0x20, 0x00, 0xf2, 0xd2, 0xf3, 0x06, 0xf0, 0x11, 0x52, 0x21, 0xee,
+ 0xde, 0x00, 0x40, 0x4e,
+ 0x04, 0x07, 0xf0, 0xab, 0xfe, 0xe0, 0x11, 0x24, 0xaf, 0xfd, 0x23, 0x00,
+ 0xee, 0xf0, 0xf0, 0x1d,
+ 0x5b, 0x1f, 0xed, 0xdd, 0xea, 0x2e, 0x5f, 0x0d, 0x0f, 0x10, 0x2f, 0x30,
+ 0x00, 0xd0, 0x8a, 0xd0,
+ 0x0f, 0xed, 0xfd, 0x11, 0xdc, 0x88, 0x0f, 0x01, 0x11, 0xec, 0xde, 0x00,
+ 0x30, 0x10, 0xdc, 0xce,
+ 0x11, 0x34, 0xde, 0xad, 0x10, 0x0f, 0x0c, 0xfe, 0x00, 0xd1, 0xcf, 0xee,
+ 0xec, 0x2e, 0x6f, 0xfc,
+ 0xf0, 0x01, 0xe4, 0xf2, 0x01, 0x00, 0x0a, 0xce, 0x01, 0xd0, 0x8d, 0xeb,
+ 0xf0, 0x22, 0x10, 0xec,
+ 0x9d, 0x01, 0xf5, 0x01, 0x32, 0xf9, 0xdf, 0x11, 0xd0, 0x8e, 0x01, 0x04,
+ 0xf0, 0xea, 0x00, 0x23,
+ 0x01, 0x90, 0x0d, 0x02, 0x32, 0x00, 0x01, 0x0f, 0xdb, 0x20, 0x45, 0xf0,
+ 0xe0, 0xf0, 0x01, 0x32,
+ 0xee, 0x02, 0x47, 0x20, 0x10, 0x1f, 0x50, 0x12, 0xad, 0xfe, 0x21, 0x45,
+ 0x00, 0xcd, 0x02, 0x33,
+ 0xee, 0xba, 0x24, 0x54, 0xdd, 0xed, 0x34, 0x42, 0xdd, 0xdd, 0x11, 0x64,
+ 0x0f, 0xf9, 0x00, 0x32,
+ 0x20, 0xee, 0xfe, 0x54, 0x00, 0xee, 0xef, 0x44, 0x12, 0xec, 0xdf, 0x21,
+ 0x11, 0xef, 0xe0, 0x00,
+ 0x33, 0xdc, 0xbc, 0x52, 0x23, 0xde, 0xed, 0x26, 0x00, 0xcc, 0x05, 0x05,
+ 0x13, 0x01, 0x07, 0x01,
+ 0x36, 0x01, 0x7c, 0xf8, 0x08, 0xf7, 0x35, 0xf1, 0x88, 0x00, 0x01, 0x00,
+ 0xff, 0x00, 0xff, 0x20,
+ 0x31, 0x9b, 0x00, 0x23, 0x00, 0x00, 0x10, 0x22, 0x01, 0xee, 0xe0, 0x06,
+ 0x53, 0xfe, 0xdb, 0x31,
+ 0x00, 0xa0, 0xfe, 0x17, 0x20, 0xde, 0x30, 0x73, 0x00, 0xbd, 0x0f, 0x21,
+ 0x16, 0xff, 0xee, 0x00,
+ 0x21, 0xf0, 0xe0, 0xf2, 0x06, 0x20, 0xff, 0x21, 0x10, 0x9e, 0x10, 0x41,
+ 0x37, 0x0f, 0xde, 0x00,
+ 0x67, 0x21, 0xde, 0xef, 0x43, 0x11, 0x00, 0x02, 0x31, 0xcc, 0x10, 0x65,
+ 0x00, 0xdc, 0x10, 0x63,
+ 0x01, 0xef, 0x0d, 0x00, 0x04, 0x10, 0x00, 0xff, 0x12, 0x24, 0xee, 0x0f,
+ 0x34, 0xde, 0xbb, 0x42,
+ 0x55, 0x0e, 0xdb, 0x10, 0x31, 0x21, 0xff, 0xde, 0x00, 0x64, 0x0f, 0xfd,
+ 0xf0, 0x33, 0x13, 0xcd,
+ 0xee, 0x14, 0x00, 0xdc, 0x41, 0x01, 0xac, 0xff, 0x26, 0x10, 0x0f, 0xde,
+ 0x1f, 0x42, 0x00, 0x03,
+ 0x03, 0xa9, 0x00, 0x51, 0x01, 0xee, 0xe0, 0xf0, 0x01, 0x34, 0x2f, 0xeb,
+ 0xe0, 0x12, 0x02, 0xe0,
+ 0x2f, 0x77, 0x10, 0xce, 0x00, 0x10, 0x00, 0xf1, 0x02, 0xef, 0x34, 0x0f,
+ 0x88, 0x00, 0x23, 0xf0,
+ 0xdd, 0x31, 0x21, 0xbf, 0x00, 0x20, 0xed, 0xde, 0x11, 0x77, 0xf0, 0xcd,
+ 0x01, 0x13, 0x0f, 0xdd,
+ 0x22, 0xff, 0x1e, 0x55, 0xff, 0xdd, 0x00, 0x32, 0xff, 0x0f, 0x54, 0xec,
+ 0x00, 0x04, 0x10, 0x00,
+ 0xff, 0xcc, 0x20, 0x77, 0x31, 0xdd, 0xcc, 0x21, 0x66, 0xff, 0xdc, 0x00,
+ 0x23, 0x21, 0xed, 0xce,
+ 0x10, 0x13, 0x22, 0xf0, 0xcd, 0x0f, 0x23, 0x32, 0xd8, 0xf0, 0x30, 0x20,
+ 0xf0, 0xde, 0x2f, 0x70,
+ 0x10, 0xdc, 0x00, 0x66, 0x00, 0xce, 0x00, 0x22, 0x00, 0xfc, 0xd0, 0x00,
+ 0x03, 0x00, 0xe0, 0xfb,
+ 0x00, 0x75, 0xe0, 0xac, 0x11, 0x22, 0x00, 0x0f, 0x01, 0xe0, 0x00, 0x11,
+ 0xcc, 0x13, 0x67, 0xee,
+ 0xfe, 0x00, 0x01, 0x10, 0x00, 0x00, 0x23, 0x11, 0xfe, 0xf0, 0x11, 0x11,
+ 0x43, 0xf0, 0xaa, 0x36,
+ 0x31, 0x9d, 0xfe, 0x36, 0x20, 0xbe, 0x00, 0x34, 0x10, 0xcd, 0x00, 0x22,
+ 0x00, 0xfe, 0x21, 0x10,
+ 0xf0, 0x01, 0x03, 0xef, 0xdf, 0xde, 0x67, 0x01, 0xed, 0xee, 0x44, 0x44,
+ 0xdd, 0xca, 0x22, 0x62,
+ 0x00, 0xee, 0x11, 0x12, 0x0f, 0xcd, 0x25, 0x22, 0xff, 0xff, 0x33, 0x43,
+ 0xfc, 0xef, 0x21, 0x23,
+ 0xff, 0xdd, 0x44, 0x0f, 0xc8, 0x31, 0x74, 0xde, 0xce, 0x22, 0x36, 0xff,
+ 0xbe, 0x00, 0x20, 0x02,
+ 0xff, 0xf0, 0xff, 0x0f, 0x3f, 0x50, 0xed, 0xcc, 0x11, 0x33, 0x1e, 0xfd,
+ 0x13, 0x47, 0xcd, 0xba,
+ 0x11, 0x44, 0xdf, 0xdc, 0x42, 0x01, 0xce, 0xed, 0x23, 0x12, 0xfe, 0xcc,
+ 0x21, 0x54, 0xfe, 0xbc,
+ 0x01, 0x32, 0xf1, 0xfe, 0x0f, 0x00, 0x01, 0x00, 0xfd, 0xfe, 0x22, 0x02,
+ 0xd9, 0xf0, 0x52, 0x10,
+ 0xee, 0xdc, 0x33, 0x76, 0xfe, 0xef, 0x01, 0x21, 0x0f, 0xce, 0x33, 0x34,
+ 0xdd, 0xdd, 0xe0, 0x36,
+ 0x41, 0xce, 0xeb, 0x21, 0x52, 0xed, 0x22, 0x10, 0xac, 0x12, 0x11, 0xfe,
+ 0xf1, 0x02, 0x00, 0xed,
+ 0xde, 0x02, 0x57, 0x00, 0xfe, 0x00, 0x00, 0x42, 0x0f, 0x10, 0x00, 0xcd,
+ 0xf1, 0x37, 0x23, 0xde,
+ 0xac, 0x00, 0x74, 0x25, 0xff, 0xcd, 0x14, 0x43, 0xec, 0x0f, 0x31, 0x00,
+ 0xbe, 0x00, 0x13, 0x00,
+ 0x20, 0x00, 0xed, 0xf1, 0x05, 0x00, 0x04, 0x11, 0xbb, 0x00, 0x32, 0xff,
+ 0xbb, 0x0f, 0x22, 0x52,
+ 0xfd, 0xeb, 0x23, 0x42, 0xde, 0xda, 0x11, 0x53, 0x0f, 0xdc, 0x01, 0x11,
+ 0xef, 0xef, 0x22, 0xf0,
+ 0xcd, 0x10, 0xf0, 0xbb, 0x22, 0x00, 0xdc, 0xee, 0x00, 0x35, 0xef, 0x8d,
+ 0x00, 0x30, 0x01, 0x9a,
+ 0x10, 0x24, 0xfd, 0xde, 0x00, 0x00, 0x10, 0x12, 0x0d, 0xa8, 0x11, 0x23,
+ 0xfe, 0xee, 0x00, 0x31,
+ 0xef, 0xee, 0x10, 0x33, 0xe0, 0xaa, 0xf0, 0x00, 0x12, 0x00, 0xdb, 0x20,
+ 0x52, 0xff, 0xec, 0x11,
+ 0x11, 0x00, 0xbc, 0xf0, 0x21, 0x02, 0xac, 0xed, 0x03, 0x24, 0xce, 0xff,
+ 0x22, 0x50, 0xfa, 0xff,
+ 0x13, 0x01, 0xce, 0x02, 0x10, 0x1f, 0x0c, 0x03, 0x02, 0x9d, 0x37, 0x13,
+ 0xfe, 0x00, 0x32, 0x00,
+ 0xff, 0x00, 0x23, 0x0f, 0xfc, 0x43, 0x67, 0xf0, 0x99, 0x11, 0x23, 0x01,
+ 0xff, 0xff, 0x01, 0x02,
+ 0xe0, 0xff, 0x00, 0x00, 0x01, 0x40, 0x00, 0xfc, 0x00, 0x73, 0xff, 0xf8,
+ 0x21, 0x43, 0xec, 0xef,
+ 0x31, 0x02, 0xee, 0x00, 0x33, 0xce, 0xed, 0x12, 0x77, 0xf0, 0xcc, 0x0f,
+ 0x12, 0x43, 0xed, 0xee,
+ 0x00, 0x01, 0x34, 0x00, 0xed, 0x23, 0x44, 0x00, 0xdc, 0xdf, 0x00, 0x74,
+ 0x0f, 0xdb, 0x00, 0x21,
+ 0x21, 0x00, 0x20, 0x22, 0xef, 0x43, 0x30, 0x40, 0x41, 0xf2, 0xdf, 0x46,
+ 0x00, 0x98, 0x02, 0x57,
+ 0x00, 0xcd, 0x10, 0x32, 0x21, 0xf0, 0xde, 0x00, 0x52, 0x21, 0xfe, 0xfe,
+ 0x01, 0x04, 0xf0, 0x03,
+ 0x03, 0xca, 0xef, 0x73, 0x14, 0x0f, 0xfe, 0xe0, 0x21, 0x67, 0xff, 0xfe,
+ 0x00, 0x02, 0x22, 0x11,
+ 0x12, 0x10, 0x00, 0x13, 0x23, 0xf0, 0x01, 0x57, 0x53, 0x0f, 0x0e, 0xe0,
+ 0x13, 0x54, 0x0f, 0x0e,
+ 0x00, 0x47, 0x22, 0x00, 0xe0, 0x03, 0x11, 0x02, 0xe2, 0x00, 0x34, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x72, 0x76, 0x00, 0x20, 0x0f, 0x0d, 0x0f, 0x66, 0x11, 0x00, 0x02, 0x0d,
+ 0x03, 0x67, 0xf2, 0xda,
+ 0x10, 0x43, 0x00, 0xde, 0x01, 0x12, 0x0f, 0xed, 0x00, 0x54, 0x03, 0x0e,
+ 0x00, 0x23, 0x02, 0xfc,
+ 0xdf, 0x45, 0x20, 0xcd, 0xfe, 0x46, 0x00, 0xdd, 0x00, 0x52, 0x02, 0xf0,
+ 0x0f, 0x63, 0x1f, 0x0a,
+ 0x01, 0x13, 0x0e, 0xf2, 0x03, 0x0f, 0x10, 0x30, 0xf0, 0x07, 0x01, 0xd0,
+ 0x21, 0x20, 0x7d, 0x61,
+ 0x0d, 0xec, 0x02, 0x26, 0xff, 0xf0, 0x10, 0x00, 0xd0, 0xf0, 0xd4, 0xe1,
+ 0x01, 0x74, 0x52, 0xdb,
+ 0xee, 0x02, 0x12, 0xee, 0xed, 0x55, 0x12, 0xfe, 0xf0, 0x27, 0x01, 0xdf,
+ 0xce, 0x65, 0x43, 0xf0,
+ 0xdd, 0x00, 0x33, 0x02, 0xee, 0x0e, 0x61, 0x13, 0x0e, 0xc9, 0x00, 0x23,
+ 0x01, 0xf0, 0xe0, 0x00,
+ 0xf1, 0xd0, 0xec, 0xdf, 0x02, 0x00, 0xec, 0xde, 0xff, 0xe0, 0xcd, 0x08,
+ 0x5f, 0x0c, 0xcf, 0x30,
+ 0x10, 0xab, 0xfe, 0x00, 0x00, 0xfe, 0xce, 0x30, 0xfd, 0xac, 0xff, 0xee,
+ 0xb9, 0x0f, 0x0f, 0x0f,
+ 0xce, 0x0e, 0x00, 0x0d, 0xdb, 0xef, 0xf0, 0x01, 0xad, 0xeb, 0x00, 0x1d,
+ 0x0e, 0xbc, 0xdf, 0xef,
+ 0xfe, 0x00, 0x00, 0x09, 0x0f, 0x00, 0xef, 0xbe, 0xef, 0xf0, 0xec, 0x0e,
+ 0x5f, 0xef, 0x8e, 0xf0,
+ 0xeb, 0x00, 0x14, 0xfe, 0xec, 0xff, 0xef, 0x0d, 0x21, 0x11, 0xeb, 0xef,
+ 0xff, 0x8e, 0xdd, 0x01,
+ 0xe1, 0xdc, 0xdf, 0x04, 0x02, 0xad, 0xeb, 0xff, 0xd0, 0x02, 0x32, 0xeb,
+ 0xcd, 0xe0, 0x02, 0xcf,
+ 0xec, 0x12, 0x17, 0xdf, 0xbe, 0x00, 0x01, 0xf4, 0xd0, 0x01, 0x0f, 0xee,
+ 0x72, 0x15, 0x0d, 0xcd,
+ 0x1f, 0x62, 0x13, 0x0f, 0xc1, 0x03, 0x10, 0x0c, 0xcb, 0x02, 0x06, 0x00,
+ 0xe0, 0xee, 0xf1, 0x03,
+ 0xce, 0xfa, 0x10, 0x20, 0x2e, 0x0f, 0xff, 0xed, 0x70, 0x5d, 0x0c, 0xfe,
+ 0x03, 0x55, 0x0d, 0xeb,
+ 0x00, 0x20, 0xee, 0xae, 0x00, 0xff, 0x0d, 0x1d, 0x1e, 0x0b, 0xdf, 0x03,
+ 0xd1, 0xec, 0x0f, 0x40,
+ 0x40, 0xe9, 0xd0, 0xc0, 0xe0, 0xcb, 0x00, 0x21, 0x00, 0xdd, 0xdf, 0xee,
+ 0xe0, 0x24, 0x4f, 0x0b,
+ 0x3e, 0x1f, 0x00, 0xe1, 0x01, 0x00, 0x60, 0x14, 0xc0, 0x9d, 0xee, 0x02,
+ 0x07, 0xe0, 0x0f, 0x60,
+ 0x3e, 0x01, 0xde, 0xdc, 0x1f, 0x63, 0x06, 0x00, 0xfe, 0x01, 0x03, 0xf1,
+ 0xa0, 0x06, 0x03, 0x00,
+ 0xec, 0x10, 0x43, 0xf1, 0xd0, 0x0d, 0x20, 0x55, 0x01, 0x02, 0xf1, 0x40,
+ 0x34, 0x25, 0x14, 0x03,
+ 0x03, 0x54, 0x42, 0x20, 0x10, 0x31, 0x75, 0x20, 0x10, 0x12, 0x33, 0x02,
+ 0x11, 0x34, 0x51, 0x11,
+ 0x37, 0x04, 0x00, 0x11, 0x01, 0x33, 0x31, 0xf0, 0xa0, 0x25, 0x53, 0x10,
+ 0x1c, 0x20, 0x21, 0x31,
+ 0x40, 0x32, 0x30, 0x4e, 0x72, 0x13, 0x20, 0x05, 0xf1, 0x01, 0x03, 0x42,
+ 0x0f, 0x2f, 0x12, 0x03,
+ 0xd0, 0x17, 0x77, 0x02, 0x10, 0x1e, 0x0f, 0xf0, 0x03, 0x16, 0x40, 0x0f,
+ 0x00, 0x43, 0xf0, 0x0d,
+ 0x13, 0x37, 0x22, 0xf1, 0xe0, 0x41, 0x30, 0xff, 0xf0, 0x62, 0x65, 0x43,
+ 0x13, 0x00, 0x01, 0x03,
+ 0x16, 0x02, 0xf2, 0x04, 0x00, 0x33, 0x72, 0x22, 0xe1, 0x12, 0x54, 0x0f,
+ 0x2e, 0x02, 0x04, 0x45,
+ 0x00, 0xcc, 0x01, 0x45, 0xf1, 0xb0, 0x0f, 0x13, 0x21, 0x00, 0xe0, 0x04,
+ 0x41, 0x11, 0xf0, 0xee,
+ 0xfd, 0x2f, 0x40, 0x01, 0x37, 0x36, 0x01, 0xc2, 0xd0, 0x11, 0x62, 0x30,
+ 0x32, 0x04, 0x20, 0x4e,
+ 0x30, 0x40, 0x00, 0x30, 0x60, 0x14, 0x24, 0x20, 0x20, 0x10, 0x12, 0x27,
+ 0x03, 0xd2, 0xa1, 0x0f,
+ 0x30, 0x20, 0xd0, 0xce, 0xfe, 0x00, 0x22, 0x21, 0x7c, 0x79, 0x1e, 0x0d,
+ 0x00, 0x04, 0x16, 0x10,
+ 0x2d, 0x2f, 0xfc, 0xdd, 0x00, 0x12, 0x00, 0xdb, 0xdf, 0x30, 0x51, 0xbd,
+ 0xfe, 0xf6, 0x00, 0x00,
+ 0x20, 0x22, 0xb0, 0xd9, 0xef, 0xff, 0x01, 0x13, 0xd0, 0xcf, 0xef, 0xcf,
+ 0xb0, 0xf2, 0xf0, 0xfc,
+ 0x3f, 0x7f, 0x10, 0x00, 0xda, 0xfe, 0x12, 0x11, 0xdd, 0xc3, 0x07, 0x01,
+ 0xde, 0xbd, 0x00, 0x03,
+ 0x57, 0xff, 0xfd, 0x30, 0x20, 0xfe, 0xcf, 0x00, 0x40, 0x10, 0xee, 0xd0,
+ 0xbe, 0xe9, 0x00, 0x13,
+ 0x34, 0x00, 0x9f, 0xe0, 0x01, 0x0e, 0xf8, 0xce, 0x0e, 0x1f, 0xfd, 0xe0,
+ 0xe1, 0x0f, 0xec, 0x11,
+ 0x57, 0xd2, 0xb0, 0x0f, 0x30, 0x21, 0x00, 0xbd, 0x00, 0x11, 0x0f, 0x0c,
+ 0x3f, 0x7f, 0x2c, 0x0f,
+ 0xcf, 0xf2, 0x04, 0x15, 0x01, 0x0f, 0xec, 0xdf, 0xb0, 0xe0, 0xd3, 0xdf,
+ 0xca, 0xde, 0x0f, 0x3c,
+ 0x0d, 0xac, 0xfe, 0x0e, 0x4e, 0x0e, 0x00, 0xfb, 0xec, 0xfe, 0xee, 0x0f,
+ 0xed, 0xdb, 0x9d, 0xec,
+ 0xef, 0xbd, 0xee, 0xdf, 0xee, 0x0e, 0xfc, 0xde, 0xae, 0xea, 0xec, 0x0f,
+ 0x10, 0x0f, 0xef, 0xde,
+ 0xc0, 0xbe, 0xb8, 0xf0, 0xff, 0xd0, 0xef, 0x0e, 0x1d, 0x1e, 0xdd, 0x0e,
+ 0x00, 0x10, 0x4e, 0xfd,
+ 0x9a, 0xfe, 0xf2, 0xe1, 0xff, 0x0f, 0xef, 0xcd, 0x0e, 0x22, 0x53, 0xf8,
+ 0xfe, 0x00, 0x10, 0xfe,
+ 0xbc, 0x00, 0xef, 0xf8, 0xf0, 0x10, 0xe0, 0xa1, 0x01, 0xf0, 0xe1, 0xe0,
+ 0x0f, 0xde, 0xcf, 0xdc,
+ 0xed, 0x1e, 0x4b, 0xde, 0xdd, 0xe1, 0xb5, 0xe2, 0xf0, 0x74, 0x53, 0xed,
+ 0xd0, 0x05, 0x03, 0xf1,
+ 0x02, 0x10, 0x4f, 0x3c, 0x0e, 0x02, 0x07, 0x12, 0x40, 0x50, 0x10, 0x21,
+ 0x01, 0xf2, 0xd3, 0x03,
+ 0x07, 0x02, 0xc0, 0xd0, 0x0f, 0xf1, 0xc3, 0xe0, 0x11, 0x73, 0x4e, 0xfb,
+ 0xed, 0x0f, 0x00, 0x43,
+ 0x23, 0x52, 0x47, 0x11, 0xf0, 0xea, 0x0f, 0x1f, 0x0e, 0xf1, 0x02, 0x23,
+ 0xcd, 0xeb, 0xe0, 0xdd,
+ 0xc0, 0x03, 0x22, 0x7f, 0x38, 0xef, 0xc0, 0xe0, 0xf0, 0x00, 0xd0, 0xc0,
+ 0xcd, 0xea, 0xf0, 0xf3,
+ 0x40, 0x1e, 0x0b, 0x20, 0x10, 0x1f, 0xfd, 0x0e, 0x0d, 0xfd, 0xe1, 0x87,
+ 0xc0, 0xff, 0x0f, 0x10,
+ 0x00, 0x21, 0x33, 0x11, 0x50, 0xfc, 0xec, 0x0d, 0x2d, 0x0a, 0x9d, 0xff,
+ 0x12, 0x52, 0x1b, 0x00,
+ 0x05, 0xe2, 0xd0, 0xf0, 0x17, 0x30, 0xdf, 0xdb, 0x00, 0x00, 0x90, 0xe0,
+ 0xff, 0x10, 0x71, 0x31,
+ 0x21, 0xe1, 0xc5, 0x13, 0x01, 0xf1, 0x03, 0x30, 0x30, 0x0f, 0x32, 0x24,
+ 0x75, 0x72, 0x12, 0x21,
+ 0x11, 0x01, 0x21, 0x24, 0x04, 0x34, 0x23, 0x12, 0x05, 0x03, 0xb1, 0xe0,
+ 0x01, 0x36, 0x32, 0xd0,
+ 0xc0, 0xe1, 0xf0, 0x4f, 0x60, 0x13, 0x23, 0x23, 0x54, 0x13, 0x10, 0xfd,
+ 0x0f, 0x53, 0x23, 0x00,
+ 0x08, 0xfd, 0x00, 0xf2, 0xf2, 0xe3, 0x02, 0x00, 0x00, 0x42, 0x76, 0x11,
+ 0x00, 0x2e, 0x30, 0x00,
+ 0xc2, 0xf4, 0xec, 0xfe, 0xd2, 0xe5, 0xf0, 0x01, 0x57, 0x12, 0x0f, 0xdb,
+ 0x70, 0x5f, 0x0f, 0x00,
+ 0xef, 0x0f, 0x20, 0x12, 0x00, 0x0f, 0x02, 0xd7, 0x24, 0x72, 0x30, 0x10,
+ 0x0f, 0x10, 0x1f, 0xf0,
+ 0xe4, 0x4f, 0x69, 0x1e, 0x3f, 0x00, 0x01, 0x05, 0x01, 0xf1, 0x11, 0x41,
+ 0x01, 0xe0, 0xb1, 0xfe,
+ 0xdf, 0xff, 0x00, 0x2b, 0x0a, 0x3f, 0x3e, 0xf0, 0xf3, 0x26, 0x41, 0x00,
+ 0x00, 0x42, 0x01, 0x80,
+ 0xf2, 0x03, 0x75, 0x40, 0xe0, 0xf1, 0x12, 0x2c, 0x3d, 0x21, 0x65, 0x21,
+ 0x11, 0x13, 0x10, 0xf0,
+ 0x04, 0x47, 0x14, 0x22, 0x21, 0x01, 0xbf, 0xc0, 0xe0, 0x01, 0xe0, 0x00,
+ 0x20, 0x60, 0x13, 0x02,
+ 0x13, 0x21, 0x61, 0x23, 0x00, 0x34, 0x13, 0x2f, 0x2d, 0x08, 0x0d, 0x00,
+ 0x42, 0x04, 0xee, 0xcd,
+ 0x11, 0x46, 0x20, 0x0f, 0x32, 0x25, 0xfd, 0x0e, 0x40, 0x31, 0x9f, 0xdd,
+ 0xf3, 0xf5, 0xf2, 0x02,
+ 0x10, 0xdd, 0xfc, 0x50, 0x44, 0x02, 0x0a, 0x5e, 0x1e, 0x0e, 0xcd, 0x00,
+ 0x14, 0x01, 0x1e, 0x2c,
+ 0x40, 0x57, 0x03, 0xd1, 0xef, 0x10, 0x55, 0x11, 0x3e, 0x2d, 0xff, 0xfe,
+ 0x0e, 0x21, 0x02, 0x0e,
+ 0x70, 0x30, 0x00, 0xe7, 0xf7, 0xe1, 0x0f, 0x40, 0x20, 0xb1, 0xe0, 0x0e,
+ 0x0d, 0x20, 0x51, 0x02,
+ 0xbe, 0xed, 0xf2, 0x03, 0xee, 0xd3, 0x27, 0x17, 0x56, 0x00, 0x00, 0xd1,
+ 0xf0, 0x30, 0x42, 0x32,
+ 0x21, 0x60, 0x2f, 0x00, 0xf0, 0x12, 0x51, 0x12, 0x15, 0x35, 0x23, 0xe0,
+ 0xd2, 0xc1, 0xc2, 0xf0,
+ 0xbf, 0xed, 0xd0, 0x00, 0x01, 0xdf, 0x0a, 0x60, 0x24, 0xf1, 0xbd, 0x0c,
+ 0x30, 0x1f, 0x2d, 0x0d,
+ 0xfb, 0xee, 0xdb, 0xdf, 0x0d, 0xfe, 0x9c, 0xee, 0xe0, 0x00, 0xed, 0x0a,
+ 0x2f, 0x2d, 0xcd, 0xcc,
+ 0xdf, 0xdd, 0xfc, 0xde, 0xac, 0xce, 0xdf, 0xcf, 0xdd, 0xde, 0xea, 0x0e,
+ 0x4d, 0x50, 0xdc, 0xba,
+ 0xf0, 0x1f, 0x00, 0xfe, 0xfd, 0x0e, 0x0f, 0xee, 0xae, 0xe2, 0xd1, 0x00,
+ 0x20, 0xf9, 0xce, 0x0f,
+ 0xf0, 0x0d, 0x1f, 0x3f, 0xfd, 0x89, 0x0f, 0x0f, 0x0f, 0xff, 0xd0, 0xd1,
+ 0xe1, 0xd3, 0xd1, 0x8b,
+ 0xed, 0xef, 0x02, 0xf2, 0x0e, 0xfb, 0xde, 0xbd, 0xdb, 0xef, 0xde, 0xe1,
+ 0x16, 0xff, 0xaf, 0x02,
+ 0xd4, 0x02, 0xc2, 0xf0, 0xe3, 0x01, 0x02, 0x0f, 0xc0, 0xe0, 0xfa, 0x0e,
+ 0x70, 0x47, 0x00, 0x00,
+ 0x00, 0x33, 0x34, 0x03, 0xf3, 0xf1, 0xc2, 0xd0, 0xef, 0xdf, 0xbc, 0xf0,
+ 0xf3, 0x03, 0xe0, 0xf1,
+ 0x14, 0x2e, 0x2a, 0x0f, 0x30, 0x60, 0x4f, 0x3f, 0x29, 0x2e, 0x5e, 0x1f,
+ 0x0f, 0xdf, 0xec, 0xfd,
+ 0x1f, 0x1e, 0xed, 0x99, 0xfe, 0xed, 0x2f, 0x5e, 0x2e, 0x3c, 0x0d, 0x0e,
+ 0xa0, 0xe0, 0xc0, 0xdd,
+ 0x0b, 0xfd, 0xfa, 0xbe, 0xee, 0xd0, 0x1f, 0x2e, 0x0f, 0xd8, 0x0e, 0x1f,
+ 0x2e, 0xcd, 0xf0, 0x0f,
+ 0xdd, 0xbf, 0xc0, 0xed, 0xf2, 0xf5, 0xe0, 0x0e, 0x10, 0x02, 0x8e, 0x08,
+ 0xfc, 0x0e, 0x10, 0xdf,
+ 0xfe, 0x3e, 0x52, 0xe2, 0x8c, 0xff, 0x02, 0x07, 0x02, 0x00, 0x0f, 0x10,
+ 0x00, 0xb1, 0xdd, 0xe9,
+ 0xef, 0x00, 0x00, 0x10, 0xbe, 0xff, 0x00, 0x01, 0x14, 0x15, 0x04, 0x00,
+ 0xc1, 0x10, 0x23, 0x01,
+ 0x0f, 0x3e, 0x74, 0x01, 0x20, 0x70, 0x74, 0x01, 0x00, 0x17, 0x23, 0x03,
+ 0x12, 0x01, 0x02, 0x20,
+ 0x00, 0x03, 0xe5, 0x12, 0x20, 0x10, 0x01, 0x02, 0xd3, 0xd0, 0x05, 0x01,
+ 0x71, 0x00, 0x10, 0x00,
+ 0x1e, 0x1f, 0x5a, 0x34, 0x1f, 0x21, 0x58, 0x36, 0x50, 0x36, 0x10, 0x28,
+ 0x29, 0x30, 0x33, 0x2f,
+ 0x3f, 0x70, 0x30, 0x00, 0xcf, 0xf3, 0xf7, 0x01, 0x10, 0x4f, 0x60, 0x0f,
+ 0x1f, 0x04, 0x24, 0x01,
+ 0x0e, 0xdb, 0x01, 0x11, 0xf1, 0xad, 0xfe, 0xf6, 0x02, 0x00, 0x40, 0x1d,
+ 0x20, 0x20, 0x00, 0x0f,
+ 0x10, 0x70, 0x00, 0x0e, 0xdd, 0xe9, 0xe0, 0x07, 0x16, 0x40, 0x60, 0x20,
+ 0x00, 0x00, 0x0f, 0x0e,
+ 0x1e, 0x4f, 0x50, 0x40, 0x0e, 0xef, 0xec, 0x00, 0x55, 0x03, 0x00, 0x00,
+ 0x13, 0x1f, 0xfb, 0xbf,
+ 0x00, 0x11, 0x0e, 0xec, 0x0e, 0x10, 0x2f, 0xfe, 0xd0, 0x0f, 0x20, 0x37,
+ 0xe6, 0x80, 0x0f, 0x00,
+ 0x45, 0xe0, 0xd2, 0x00, 0xfd, 0xfe, 0x3f, 0x7f, 0x6f, 0x0d, 0x0f, 0x51,
+ 0x13, 0x23, 0x02, 0x10,
+ 0x24, 0x00, 0x23, 0x27, 0x10, 0x1e, 0x2e, 0x3f, 0x0c, 0x9d, 0xee, 0xf3,
+ 0x04, 0x10, 0x4b, 0x1f,
+ 0xff, 0xf1, 0x55, 0x42, 0x20, 0x3c, 0x3f, 0x6f, 0x0e, 0x1f, 0xf1, 0x02,
+ 0x0f, 0xfd, 0xf0, 0x0e,
+ 0x1c, 0x52, 0x37, 0x23, 0x10, 0x12, 0x45, 0x21, 0x0f, 0xfc, 0xdf, 0xb2,
+ 0xe0, 0xe2, 0x03, 0xcf,
+ 0xec, 0xf2, 0xf5, 0x00, 0x01, 0x62, 0x30, 0x3b, 0xef, 0xde, 0xed, 0xea,
+ 0x00, 0x00, 0x63, 0x24,
+ 0x12, 0xf1, 0x80, 0x00, 0x01, 0x04, 0x00, 0x2b, 0x0f, 0x0f, 0x2d, 0x2d,
+ 0x1d, 0x10, 0x30, 0x0f,
+ 0x4d, 0x57, 0x37, 0x10, 0xdf, 0x10, 0x53, 0x00, 0xb0, 0xdc, 0x00, 0x50,
+ 0x0d, 0xf0, 0xd1, 0x0d,
+ 0x4e, 0x0f, 0xfd, 0xfb, 0xff, 0xd0, 0x07, 0x06, 0xd0, 0xd1, 0x00, 0xf1,
+ 0x2f, 0x2e, 0x90, 0xe0,
+ 0x1e, 0x70, 0x70, 0x2d, 0x0d, 0xf0, 0x0d, 0x17, 0x35, 0x20, 0x5f, 0x2f,
+ 0x01, 0x14, 0x00, 0xfd,
+ 0x01, 0xe1, 0xde, 0xeb, 0xff, 0x9f, 0xdf, 0xdf, 0xe0, 0x01, 0x22, 0x73,
+ 0x1d, 0x2c, 0x2e, 0xeb,
+ 0x00, 0x11, 0x24, 0xd0, 0xbb, 0xfd, 0xef, 0xc0, 0xf4, 0xf1, 0x11, 0x40,
+ 0x00, 0xc0, 0xf4, 0xf0,
+ 0xe0, 0x05, 0xd1, 0xd1, 0xe2, 0x81, 0xd0, 0xba, 0xf0, 0xf1, 0x07, 0x03,
+ 0x00, 0xff, 0xce, 0xef,
+ 0xdf, 0xfe, 0xee, 0xee, 0xec, 0x00, 0x27, 0xf3, 0x81, 0xed, 0x01, 0x15,
+ 0xd2, 0xd0, 0x10, 0x3d,
+ 0xfe, 0xef, 0x01, 0xff, 0xfa, 0x0f, 0x70, 0x61, 0x02, 0xdf, 0x00, 0x36,
+ 0x01, 0xb0, 0xfd, 0xf0,
+ 0xfe, 0x00, 0xf3, 0xd1, 0xd0, 0xff, 0x50, 0x1e, 0xd8, 0xb8, 0xf0, 0xf0,
+ 0xe1, 0xc0, 0x01, 0x11,
+ 0x00, 0x80, 0xf3, 0xf3, 0xe3, 0x00, 0x0d, 0x4e, 0x2d, 0xe0, 0xdf, 0x20,
+ 0x0e, 0x09, 0x31, 0x42,
+ 0x63, 0x31, 0x00, 0xee, 0x10, 0x47, 0x43, 0x01, 0x00, 0x18, 0x1f, 0xe0,
+ 0xad, 0xd0, 0xf1, 0xe2,
+ 0x00, 0xfc, 0x0f, 0x30, 0x52, 0x00, 0x22, 0x4f, 0x2c, 0x00, 0xdf, 0xef,
+ 0x0c, 0xf0, 0x0e, 0x30,
+ 0x57, 0x24, 0xfd, 0xdd, 0x40, 0x54, 0x23, 0x0e, 0xeb, 0x10, 0x13, 0xc0,
+ 0xb1, 0xe0, 0xec, 0xe0,
+ 0xe1, 0xd7, 0xc2, 0xe0, 0xc0, 0xed, 0xf0, 0xce, 0xbf, 0xf0, 0x00, 0x4d,
+ 0xfd, 0xc0, 0xe0, 0x02,
+ 0x07, 0xf4, 0xd2, 0xb0, 0xe0, 0xf0, 0xe3, 0xc2, 0xe2, 0xfc, 0xee, 0x0f,
+ 0x1b, 0x4c, 0x1e, 0xe1,
+ 0x05, 0x52, 0x01, 0xdd, 0x0c, 0x20, 0xe0, 0x83, 0xd4, 0xf7, 0x00, 0x20,
+ 0x0d, 0x0e, 0xd0, 0x01,
+ 0xef, 0x9d, 0x0d, 0x00, 0x4f, 0x1e, 0xe1, 0xa4, 0xf6, 0x02, 0xe3, 0xd5,
+ 0x12, 0x21, 0x0f, 0xdb,
+ 0xd0, 0xe0, 0xfd, 0x00, 0x51, 0x2f, 0x3d, 0x60, 0x22, 0x12, 0x37, 0x74,
+ 0x11, 0x2e, 0x1e, 0x31,
+ 0x00, 0x0e, 0x1d, 0x00, 0xf2, 0xd6, 0x8e, 0xea, 0xff, 0x00, 0x14, 0x10,
+ 0x3d, 0x4f, 0x0f, 0x10,
+ 0x20, 0x00, 0x00, 0x1e, 0x4e, 0x1e, 0x02, 0xe0, 0x8d, 0xf8, 0x0f, 0x40,
+ 0xf2, 0x02, 0x01, 0x41,
+ 0x10, 0xe0, 0xfb, 0x00, 0x10, 0x06, 0x11, 0x00, 0xee, 0xd2, 0xe6, 0xe1,
+ 0xa0, 0xe0, 0xb1, 0xe0,
+ 0xeb, 0x1f, 0x40, 0x0e, 0xef, 0x00, 0x23, 0x00, 0xfb, 0x20, 0x71, 0x15,
+ 0xc2, 0xc4, 0xe0, 0x00,
+ 0x10, 0x5e, 0x1e, 0xfc, 0x02, 0x34, 0x2f, 0x5b, 0x3f, 0x2d, 0x00, 0x03,
+ 0x0f, 0x0f, 0x2f, 0x43,
+ 0x57, 0x33, 0x23, 0xf0, 0xff, 0x00, 0xee, 0xcb, 0x1e, 0x6f, 0x0c, 0xea,
+ 0xf0, 0x10, 0x20, 0x04,
+ 0xd0, 0x00, 0x12, 0x21, 0xd0, 0xa4, 0xf3, 0xd0, 0x0f, 0x10, 0x61, 0xec,
+ 0x9c, 0x0d, 0x31, 0x44,
+ 0x21, 0x00, 0x0b, 0x00, 0x43, 0x65, 0x10, 0x00, 0x3d, 0x63, 0x03, 0x01,
+ 0xfe, 0xfc, 0xf0, 0x01,
+ 0x01, 0x00, 0xe0, 0x00, 0x1a, 0x0d, 0x2d, 0x1d, 0x1c, 0x51, 0x57, 0x10,
+ 0x1f, 0x0f, 0x0c, 0x10,
+ 0x2f, 0x51, 0x00, 0x0f, 0x3f, 0x72, 0x00, 0x1b, 0x10, 0x36, 0x10, 0x0f,
+ 0x0e, 0x30, 0x42, 0x02,
+ 0xe0, 0xe0, 0xe7, 0xc1, 0xd1, 0xff, 0xee, 0x0e, 0xf0, 0xe2, 0x35, 0x30,
+ 0x7e, 0x2a, 0x2e, 0x00,
+ 0xf3, 0xc0, 0xf0, 0x02, 0x42, 0x0e, 0xf1, 0x92, 0x02, 0xfd, 0x0f, 0x07,
+ 0x41, 0x72, 0x21, 0x0e,
+ 0xfe, 0xfb, 0x0e, 0x21, 0x14, 0x30, 0x4c, 0x3e, 0x11, 0x37, 0xe3, 0xf0,
+ 0x01, 0x61, 0x20, 0x1c,
+ 0xed, 0xee, 0x0c, 0x20, 0x4e, 0x40, 0xf0, 0xdd, 0x3d, 0x32, 0xc4, 0x97,
+ 0x05, 0xf0, 0xf0, 0xc0,
+ 0xd0, 0xcf, 0x00, 0xf0, 0x21, 0x50, 0x1f, 0x01, 0xf1, 0x00, 0x30, 0x7d,
+ 0x0b, 0x30, 0x57, 0x33,
+ 0x0d, 0x0c, 0x00, 0x10, 0x20, 0x01, 0x26, 0xe0, 0xa0, 0xfb, 0xe0, 0xdd,
+ 0xdf, 0x00, 0x2f, 0x20,
+ 0x01, 0x30, 0x4d, 0x00, 0x21, 0xf0, 0xe0, 0x0f, 0xca, 0xd0, 0x4e, 0x0c,
+ 0x8e, 0xe0, 0x02, 0x17,
+ 0x00, 0x0d, 0x4e, 0x0e, 0xf0, 0xc3, 0x06, 0x21, 0x32, 0xd0, 0x80, 0xe2,
+ 0xc2, 0xe2, 0xc3, 0xe1,
+ 0xec, 0x0c, 0x23, 0xf1, 0xab, 0x0e, 0xfe, 0x00, 0xf4, 0x07, 0x20, 0xdf,
+ 0x90, 0x00, 0xe5, 0x01,
+ 0xc1, 0xe0, 0x00, 0x10, 0x24, 0xd1, 0xbe, 0xfc, 0x00, 0x0e, 0x11, 0xee,
+ 0xea, 0x20, 0x42, 0xf2,
+ 0xe1, 0x05, 0x11, 0x00, 0xc0, 0xa0, 0xd0, 0xa1, 0xfe, 0x0d, 0x0f, 0x0c,
+ 0xcd, 0xdd, 0x0b, 0x0f,
+ 0x1f, 0xf1, 0xd4, 0xe5, 0xb1, 0xd3, 0xb0, 0xdb, 0xe0, 0xf2, 0xf4, 0xd0,
+ 0xe0, 0xdf, 0xa0, 0xf0,
+ 0xcb, 0x00, 0xf5, 0x11, 0x2e, 0x0b, 0x00, 0x00, 0x60, 0x00, 0x21, 0x31,
+ 0x02, 0x14, 0x22, 0x10,
+ 0x0c, 0xaf, 0xde, 0xdf, 0xdd, 0xef, 0x0e, 0x5d, 0x2d, 0x0e, 0xd2, 0x26,
+ 0x5f, 0x1c, 0x1f, 0x2d,
+ 0x2a, 0xee, 0xb0, 0x04, 0x30, 0x1f, 0x4d, 0x20, 0x3f, 0x1d, 0x0c, 0x10,
+ 0x72, 0x63, 0x10, 0x08,
+ 0xfd, 0x00, 0x04, 0xe4, 0xf3, 0xe4, 0x00, 0xf0, 0x02, 0xf2, 0xa1, 0xfb,
+ 0xff, 0x0e, 0x0f, 0x20,
+ 0xf0, 0xde, 0xe2, 0xf5, 0xe0, 0x91, 0xe4, 0xf1, 0x40, 0x41, 0xd4, 0x90,
+ 0x00, 0xe2, 0x26, 0x0f,
+ 0x0b, 0xce, 0x0f, 0x00, 0xff, 0x0a, 0x30, 0x35, 0x20, 0xc0, 0xc0, 0xf0,
+ 0x02, 0x02, 0x02, 0x01,
+ 0xdf, 0xef, 0xef, 0xce, 0xfa, 0x0f, 0x3e, 0x71, 0x44, 0x00, 0xcf, 0xdd,
+ 0xee, 0xbf, 0x07, 0xe4,
+ 0xe0, 0xfe, 0x00, 0x32, 0xdf, 0xef, 0x10, 0x01, 0xb1, 0xd0, 0x00, 0x73,
+ 0x4d, 0x29, 0x2e, 0x20,
+ 0x31, 0x77, 0x32, 0x3e, 0x2e, 0x10, 0x13, 0x31, 0x11, 0x0d, 0xd9, 0x0f,
+ 0x10, 0x51, 0xf1, 0xff,
+ 0x10, 0x72, 0x71, 0x0c, 0x0a, 0xff, 0x1e, 0x10, 0x21, 0x00, 0x1f, 0x1c,
+ 0x2f, 0x22, 0x01, 0x10,
+ 0x10, 0x50, 0x43, 0x3c, 0x1d, 0x13, 0x1d, 0x18, 0x2e, 0x32, 0x05, 0x00,
+ 0x72, 0x23, 0x13, 0xe1,
+ 0xe0, 0xf4, 0x20, 0x1d, 0x2b, 0x30, 0x1d, 0xcd, 0xfe, 0x01, 0x73, 0x13,
+ 0x03, 0x0e, 0x1d, 0x06,
+ 0x03, 0x02, 0x23, 0x07, 0xd2, 0xb0, 0x0f, 0xf0, 0xfd, 0x1e, 0x71, 0x5e,
+ 0x2d, 0x44, 0x01, 0x09,
+ 0x2c, 0x50, 0x01, 0x03, 0x13, 0x23, 0x04, 0x00, 0xb9, 0x00, 0x30, 0x20,
+ 0x1f, 0x0d, 0x0e, 0x3f,
+ 0x1e, 0x0c, 0xfb, 0xce, 0xc0, 0xc5, 0xe3, 0x30, 0x51, 0x00, 0xee, 0xdf,
+ 0x23, 0xf4, 0x91, 0xed,
+ 0x00, 0x03, 0xf2, 0xa4, 0xfe, 0x0a, 0x5f, 0x2f, 0x20, 0x12, 0x42, 0x25,
+ 0x22, 0x22, 0x53, 0x0c,
+ 0x0b, 0xfe, 0x00, 0x02, 0xe3, 0xf2, 0x1f, 0x59, 0x10, 0x21, 0x01, 0x20,
+ 0x3d, 0x20, 0x4f, 0x1c,
+ 0x1f, 0x11, 0x33, 0x29, 0xed, 0xc0, 0x14, 0x72, 0x61, 0x1e, 0x2c, 0x01,
+ 0x0e, 0x1a, 0x6f, 0x10,
+ 0x12, 0x1f, 0x1f, 0x10, 0x02, 0x27, 0x14, 0x01, 0xd1, 0xd0, 0xef, 0xe0,
+ 0x9e, 0xef, 0x0f, 0x0f,
+ 0xff, 0xf0, 0xf6, 0xf0, 0xdb, 0x00, 0x41, 0x33, 0x00, 0xb0, 0xe6, 0xc0,
+ 0xc0, 0xd0, 0xd1, 0xc0,
+ 0xef, 0x00, 0x11, 0xd0, 0xad, 0x0b, 0x1e, 0x2e, 0x0d, 0xef, 0x24, 0x57,
+ 0x02, 0xbe, 0xff, 0x0f,
+ 0x03, 0xd7, 0x00, 0x10, 0x2c, 0x3f, 0x30, 0xf1, 0x80, 0xec, 0xe0, 0x0f,
+ 0xf0, 0x1f, 0xe2, 0xb2,
+ 0xef, 0x01, 0x67, 0x00, 0xbe, 0x0e, 0x02, 0xf2, 0xc2, 0xe1, 0xd2, 0xdd,
+ 0xe8, 0x1f, 0x00, 0x00,
+ 0x00, 0x71, 0x31, 0x2f, 0x1f, 0x33, 0x23, 0x0c, 0xee, 0x00, 0x04, 0x02,
+ 0xf1, 0xe0, 0xf4, 0xb4,
+ 0xdd, 0xca, 0xf1, 0x02, 0x0d, 0x2b, 0xf0, 0x82, 0xed, 0xeb, 0x10, 0x10,
+ 0xf1, 0xef, 0x0f, 0x02,
+ 0xf4, 0xb1, 0x00, 0x2c, 0x1e, 0xbf, 0xcc, 0xeb, 0x0d, 0x0e, 0xd0, 0x02,
+ 0xf5, 0xc1, 0xc5, 0xd1,
+ 0xa1, 0xe1, 0xc0, 0xd1, 0xe1, 0x02, 0xf2, 0xa0, 0xcc, 0xed, 0xfe, 0x00,
+ 0x01, 0xee, 0xd1, 0xd7,
+ 0x05, 0xc0, 0xbd, 0xd0, 0xd1, 0xc3, 0x07, 0xe3, 0xb0, 0xec, 0xee, 0x00,
+ 0x02, 0x10, 0xcd, 0x0f,
+ 0x10, 0x4f, 0x0f, 0xce, 0xf4, 0x05, 0x12, 0xf0, 0xb0, 0x01, 0x01, 0x03,
+ 0x0d, 0x0d, 0xfd, 0xdd,
+ 0xf8, 0xdd, 0x00, 0xb1, 0xb2, 0xdf, 0xfc, 0x01, 0x10, 0xdf, 0xbf, 0x00,
+ 0x00, 0xd0, 0xb0, 0xf3,
+ 0xc1, 0xd0, 0xdf, 0xb1, 0xe5, 0xd2, 0xd1, 0x03, 0x37, 0x77, 0x24, 0x0d,
+ 0xec, 0x0f, 0x32, 0x24,
+ 0x10, 0x1f, 0x30, 0x1f, 0x0f, 0xf0, 0x24, 0x35, 0x11, 0x30, 0x1e, 0x0d,
+ 0x0e, 0x0e, 0x7f, 0x3b,
+ 0x1f, 0xfc, 0x0e, 0x0e, 0x00, 0x70, 0x34, 0x01, 0xcf, 0x01, 0x67, 0x30,
+ 0xdd, 0xda, 0x30, 0x7f,
+ 0x5f, 0x0d, 0x21, 0x12, 0x02, 0x11, 0x02, 0x1d, 0xef, 0xf0, 0x07, 0xf7,
+ 0xd2, 0x8f, 0xec, 0xe0,
+ 0x00, 0x21, 0x01, 0xa0, 0x0d, 0x0e, 0x0f, 0xee, 0xd0, 0xf4, 0x02, 0xf2,
+ 0xf3, 0xd2, 0xa1, 0xe1,
+ 0xf7, 0xd5, 0xde, 0xad, 0xfd, 0x01, 0x11, 0x0d, 0xee, 0xcf, 0x00, 0x00,
+ 0x0f, 0x17, 0x43, 0xe1,
+ 0xc4, 0xf4, 0x01, 0x0e, 0x0c, 0xf0, 0x0f, 0x1e, 0xdc, 0xaf, 0xe0, 0xdf,
+ 0xf0, 0x54, 0x40, 0x20,
+ 0x0f, 0xe0, 0x0f, 0x00, 0x37, 0x65, 0x00, 0xdf, 0xbe, 0xd0, 0xee, 0xc1,
+ 0xd3, 0xe2, 0xe1, 0x11,
+ 0x00, 0x59, 0x00, 0x30, 0x72, 0x31, 0x11, 0x10, 0x30, 0x40, 0x21, 0x10,
+ 0x2d, 0x5c, 0x02, 0x07,
+ 0x07, 0x10, 0x0e, 0xff, 0x00, 0x32, 0x50, 0x0c, 0x0e, 0x0f, 0x30, 0x4f,
+ 0x3d, 0x2d, 0x40, 0x47,
+ 0x04, 0xd0, 0xcf, 0xfa, 0x40, 0x40, 0x10, 0x20, 0x20, 0x2f, 0x1d, 0x4e,
+ 0x3c, 0x00, 0x02, 0x34,
+ 0x40, 0x20, 0xf0, 0xa3, 0xe4, 0x01, 0x12, 0x03, 0xc1, 0x10, 0x50, 0x1c,
+ 0xe9, 0xbf, 0x0f, 0xee,
+ 0x0e, 0x0e, 0x50, 0x25, 0xe0, 0xd5, 0x03, 0x21, 0x11, 0x02, 0xd2, 0xe0,
+ 0x0c, 0xee, 0xa0, 0x00,
+ 0x1c, 0x6b, 0x1f, 0x3f, 0x20, 0x1e, 0x00, 0x13, 0x76, 0x23, 0x34, 0x31,
+ 0x0e, 0x09, 0x30, 0x20,
+ 0x11, 0x20, 0x71, 0x30, 0x0f, 0x0d, 0x0f, 0x00, 0x1e, 0x30, 0x30, 0x22,
+ 0x10, 0x00, 0x57, 0x40,
+ 0xfe, 0xae, 0x01, 0xf7, 0xf0, 0x01, 0xb0, 0xef, 0xf0, 0x01, 0x32, 0x10,
+ 0x0d, 0x50, 0x45, 0x41,
+ 0x1e, 0x0b, 0x4f, 0x41, 0x25, 0x11, 0x00, 0x1f, 0x01, 0x23, 0x66, 0x22,
+ 0x03, 0xef, 0x0c, 0x2c,
+ 0x5d, 0x20, 0x20, 0x11, 0x21, 0x30, 0x3f, 0xcc, 0xdf, 0x00, 0x00, 0x01,
+ 0xff, 0x61, 0x6f, 0x08,
+ 0x3d, 0x3f, 0x3e, 0x2e, 0x2a, 0x4f, 0x70, 0x23, 0x02, 0xff, 0x00, 0x10,
+ 0x12, 0x13, 0x27, 0x12,
+ 0x11, 0x21, 0xe0, 0xed, 0x1d, 0x3e, 0x1e, 0x0b, 0x0d, 0x7e, 0x00, 0xf2,
+ 0x03, 0x74, 0x37, 0x04,
+ 0xef, 0xed, 0xe4, 0xf5, 0xe1, 0xdf, 0x1e, 0x7f, 0x3d, 0x0d, 0xfc, 0x0f,
+ 0x10, 0x43, 0x53, 0x14,
+ 0x14, 0x01, 0x21, 0x22, 0x20, 0x10, 0x20, 0x11, 0x50, 0x5e, 0x20, 0x0f,
+ 0xf8, 0x1b, 0x10, 0x20,
+ 0x44, 0x2f, 0x3d, 0x30, 0x50, 0x10, 0xf0, 0x00, 0x03, 0x53, 0xf3, 0xb1,
+ 0xcd, 0xd8, 0xef, 0xf1,
+ 0xd6, 0x92, 0xf0, 0x00, 0x0c, 0x3f, 0x41, 0x13, 0x11, 0x1d, 0x3f, 0x4e,
+ 0x1e, 0x2c, 0x23, 0x24,
+ 0x24, 0x05, 0xf1, 0xd0, 0xdf, 0x3e, 0x40, 0xee, 0xcd, 0x2e, 0x7b, 0x4c,
+ 0x0f, 0xe0, 0xff, 0xe1,
+ 0xe2, 0xc0, 0x0f, 0x50, 0xfc, 0xaf, 0x00, 0x0e, 0x18, 0x0c, 0x1f, 0x2d,
+ 0x1e, 0x0d, 0x0c, 0xf0,
+ 0xde, 0xe0, 0x12, 0x65, 0x01, 0xc5, 0xf5, 0xf2, 0xd0, 0x90, 0xf1, 0xd2,
+ 0xed, 0xdd, 0xfe, 0xbc,
+ 0xdc, 0xff, 0x00, 0x62, 0xf1, 0xe0, 0xfe, 0xe6, 0x07, 0xd4, 0xb2, 0xdf,
+ 0xd0, 0x00, 0xe3, 0xaf,
+ 0xe9, 0xff, 0xe0, 0x1f, 0x01, 0x01, 0xc1, 0x00, 0xf0, 0xf0, 0xf1, 0xf5,
+ 0xf0, 0xf2, 0x10, 0x10,
+ 0xd0, 0x9f, 0xdd, 0x0e, 0xf0, 0xd3, 0xa3, 0xcd, 0xd8, 0x0f, 0xff, 0x0f,
+ 0x0f, 0xc2, 0xe5, 0x00,
+ 0xfd, 0xcf, 0xc1, 0xd4, 0xb0, 0xdf, 0xbe, 0xc0, 0xd0, 0xed, 0xd3, 0xd7,
+ 0x05, 0xe0, 0xe0, 0xcf,
+ 0x0e, 0x20, 0x00, 0xff, 0xbc, 0x00, 0x12, 0x21, 0x00, 0xcf, 0xd2, 0xf7,
+ 0xf2, 0x03, 0x05, 0x50,
+ 0x0c, 0xee, 0x0e, 0x00, 0x0e, 0xdb, 0xe0, 0xf0, 0x0e, 0x00, 0x90, 0xf4,
+ 0xf1, 0x12, 0x0c, 0x10,
+ 0x10, 0x7f, 0x3d, 0x1d, 0x0e, 0x0a, 0x2e, 0x5c, 0x3d, 0x4e, 0x2e, 0x2f,
+ 0x0f, 0x56, 0x42, 0x24,
+ 0x03, 0x00, 0xf1, 0xf3, 0xc0, 0xbe, 0xfc, 0x00, 0x1e, 0x5c, 0xf0, 0xe0,
+ 0xf8, 0x1e, 0x00, 0xf6,
+ 0xc1, 0xe4, 0xf0, 0xb1, 0xb0, 0xd0, 0xf0, 0x11, 0x10, 0x0e, 0xff, 0xfe,
+ 0xe0, 0xdf, 0xe9, 0xf0,
+ 0x10, 0xb3, 0x8f, 0xff, 0x02, 0x15, 0x20, 0x03, 0xf2, 0x12, 0x1f, 0xee,
+ 0xbd, 0x0e, 0x0e, 0xf0,
+ 0xe1, 0xff, 0x0c, 0x22, 0x11, 0x49, 0x7f, 0x56, 0x02, 0xd0, 0x01, 0x30,
+ 0xf1, 0xbc, 0xed, 0xc0,
+ 0xec, 0xc0, 0xf1, 0xe5, 0x02, 0x02, 0x20, 0x0f, 0x2e, 0x24, 0x41, 0x4c,
+ 0x3e, 0x4f, 0x11, 0x00,
+ 0x2a, 0x20, 0x33, 0x41, 0x42, 0x20, 0x46, 0x33, 0x31, 0x3e, 0x3c, 0x5f,
+ 0x2d, 0x4e, 0x2f, 0x0d,
+ 0x1f, 0x20, 0x24, 0x34, 0x0c, 0x0d, 0x4d, 0x50, 0x13, 0x23, 0x50, 0x38,
+ 0x5b, 0x20, 0x20, 0x2e,
+ 0x2b, 0x2e, 0x6f, 0x30, 0x34, 0x11, 0x32, 0x00, 0x1e, 0x33, 0x06, 0xe1,
+ 0xd2, 0x21, 0x60, 0x00,
+ 0x0d, 0x1e, 0x2c, 0x5b, 0x5f, 0x10, 0x00, 0x00, 0xf3, 0xf2, 0x10, 0x14,
+ 0xe5, 0xc3, 0xe0, 0xf0,
+ 0x00, 0x50, 0x04, 0x0d, 0xf9, 0x20, 0x11, 0xe0, 0x8f, 0x0e, 0x41, 0x10,
+ 0x2f, 0x02, 0x57, 0x14,
+ 0x1f, 0x50, 0x21, 0x00, 0xff, 0xff, 0x01, 0xf1, 0xfd, 0x0b, 0x0e, 0x0d,
+ 0x4d, 0x20, 0x4e, 0x3f,
+ 0x63, 0x37, 0x16, 0x0e, 0xae, 0xff, 0x00, 0xf1, 0xfe, 0xbe, 0x01, 0x05,
+ 0x10, 0x00, 0x19, 0x00,
+ 0x7e, 0xff, 0xe9, 0x09, 0xc9, 0x04, 0x26, 0x0c, 0x16, 0xe2, 0x40, 0x70,
+ 0x70, 0x60, 0x20, 0x06,
+ 0x00, 0x0f, 0x0c, 0x4e, 0x01, 0x05, 0x02, 0x02, 0x04, 0xe5, 0x04, 0xe2,
+ 0x00, 0x12, 0x23, 0x00,
+ 0xd1, 0xe1, 0xf2, 0x32, 0x72, 0x01, 0xa5, 0xe6, 0x00, 0x00, 0x10, 0xe7,
+ 0xd4, 0xf2, 0x01, 0x4e,
+ 0x00, 0xef, 0xce, 0x2f, 0x7d, 0x4f, 0x2d, 0x0c, 0x0e, 0x0c, 0x1f, 0x3f,
+ 0x1f, 0x8c, 0xd2, 0xf4,
+ 0xd3, 0x03, 0xe2, 0xed, 0xf8, 0xfc, 0x21, 0x70, 0x1c, 0xee, 0xee, 0x0d,
+ 0x2d, 0x1d, 0xd0, 0xb2,
+ 0x03, 0x10, 0x3e, 0xfe, 0xbf, 0x0d, 0x57, 0x27, 0x00, 0xdc, 0xf0, 0x20,
+ 0x0e, 0xed, 0xff, 0x41,
+ 0x20, 0x0f, 0x70, 0x1f, 0x1e, 0x01, 0x07, 0x46, 0x20, 0xe0, 0xa0, 0x00,
+ 0xf0, 0xff, 0x00, 0x13,
+ 0x1e, 0x0d, 0x72, 0x47, 0xf1, 0xdf, 0x00, 0x00, 0x01, 0xf0, 0xe0, 0xf1,
+ 0xcf, 0xcf, 0x01, 0xe2,
+ 0xf2, 0xf6, 0xe2, 0x02, 0x76, 0x02, 0x12, 0x2f, 0x4d, 0x4f, 0x0e, 0xfe,
+ 0xfb, 0x1d, 0x4f, 0x32,
+ 0x07, 0xd2, 0xf1, 0xf0, 0x00, 0x00, 0x2f, 0xd2, 0xb6, 0x10, 0x61, 0x0f,
+ 0xb0, 0xee, 0x0e, 0x00,
+ 0x10, 0xe2, 0xc3, 0x01, 0x07, 0x03, 0x12, 0x2c, 0xdc, 0x10, 0x50, 0x3e,
+ 0x3e, 0x0e, 0x0c, 0xe9,
+ 0x2c, 0x7e, 0x0c, 0xfe, 0x9d, 0x0e, 0xfe, 0xf0, 0xfd, 0xdc, 0xef, 0x00,
+ 0x2e, 0x2d, 0x18, 0x1f,
+ 0x6d, 0x1c, 0x2d, 0xee, 0xef, 0xfb, 0x0f, 0x1e, 0xff, 0xce, 0x00, 0x00,
+ 0x52, 0x00, 0xde, 0xfb,
+ 0x0e, 0x1f, 0xfe, 0xac, 0x0d, 0x3e, 0x6d, 0x3d, 0x5e, 0x2e, 0x0d, 0x20,
+ 0x30, 0x40, 0x15, 0x04,
+ 0xb2, 0xd0, 0xeb, 0xff, 0xee, 0xde, 0x0d, 0x4f, 0x53, 0x02, 0xef, 0xff,
+ 0x55, 0x32, 0x0e, 0x00,
+ 0xc3, 0xe3, 0xdf, 0x0a, 0x0b, 0xcd, 0xc0, 0xe1, 0xd0, 0xeb, 0x0f, 0xd2,
+ 0x06, 0x21, 0x50, 0x70,
+ 0x2d, 0x0f, 0x1e, 0x2f, 0x20, 0x24, 0x21, 0x03, 0xf2, 0xd2, 0x14, 0x10,
+ 0xf2, 0xc4, 0xe5, 0x02,
+ 0x77, 0x73, 0x04, 0x00, 0xdf, 0x01, 0x12, 0x01, 0xe4, 0xc3, 0x03, 0xd1,
+ 0xd0, 0xee, 0x01, 0xe7,
+ 0x05, 0x01, 0x52, 0x00, 0xe1, 0xf0, 0x70, 0x51, 0x00, 0xfb, 0x0e, 0x1f,
+ 0x3c, 0x0e, 0xae, 0x00,
+ 0x05, 0x13, 0xf1, 0xe1, 0xd0, 0xf0, 0xf1, 0x00, 0xde, 0xe8, 0x0f, 0x0d,
+ 0x2d, 0x1d, 0xce, 0xcc,
+ 0x0e, 0x30, 0x51, 0x13, 0x01, 0xf1, 0xd0, 0x9e, 0x0c, 0x0d, 0x1e, 0x30,
+ 0x0b, 0xdb, 0xfd, 0x0d,
+ 0x3c, 0x7c, 0x7e, 0x3d, 0x10, 0xf0, 0xe2, 0xf0, 0x2e, 0x42, 0x17, 0xe1,
+ 0xdf, 0x0f, 0xee, 0x2f,
+ 0x0d, 0xe0, 0x23, 0x3e, 0x78, 0x60, 0x00, 0x00, 0xfc, 0x00, 0x20, 0x20,
+ 0xcf, 0xdb, 0x00, 0xe0,
+ 0xc2, 0xb0, 0xc2, 0xe0, 0xf0, 0xd2, 0x00, 0x2f, 0x3c, 0x60, 0x2d, 0x4e,
+ 0x34, 0x21, 0xf7, 0x07,
+ 0x10, 0x0e, 0xef, 0xc1, 0xf3, 0x16, 0x31, 0x02, 0xf0, 0x11, 0x70, 0x14,
+ 0xf4, 0xc2, 0xe3, 0x02,
+ 0xd2, 0xe2, 0xc2, 0xd3, 0xf4, 0xe4, 0x04, 0xf4, 0x02, 0x03, 0xd3, 0x34,
+ 0x77, 0x21, 0x21, 0x21,
+ 0x00, 0x2e, 0x30, 0xe0, 0xc0, 0xdf, 0x0f, 0x71, 0x14, 0x94, 0xe1, 0xf4,
+ 0xf3, 0x00, 0xe4, 0x03,
+ 0x52, 0x1e, 0x0e, 0xf0, 0x0c, 0xdd, 0x2f, 0x70, 0x10, 0x00, 0xe2, 0xc1,
+ 0xff, 0x11, 0x57, 0x17,
+ 0x04, 0xb0, 0xf0, 0x00, 0x44, 0x00, 0xd0, 0x00, 0x03, 0x3f, 0x3d, 0x50,
+ 0x10, 0xf4, 0x15, 0x43,
+ 0x10, 0x0f, 0xf0, 0xf2, 0x02, 0x14, 0x25, 0xe1, 0x81, 0xfe, 0xfd, 0x10,
+ 0x35, 0xd2, 0xf1, 0x21,
+ 0x60, 0x1d, 0x0f, 0xf0, 0xe0, 0x09, 0xd0, 0xe0, 0x80, 0xe0, 0xe7, 0xe2,
+ 0xbd, 0xfe, 0x00, 0x3f,
+ 0x10, 0x13, 0x57, 0x11, 0x10, 0x1c, 0x20, 0x31, 0xee, 0x9f, 0x0f, 0x02,
+ 0x26, 0x11, 0x00, 0xff,
+ 0x10, 0x55, 0x13, 0x02, 0xff, 0x01, 0x55, 0x03, 0xf2, 0xd1, 0xf4, 0x00,
+ 0xf2, 0xe2, 0xe4, 0xa4,
+ 0xe2, 0xf5, 0x04, 0x04, 0xf2, 0xd2, 0x00, 0x30, 0x41, 0x20, 0x4e, 0x71,
+ 0x41, 0x10, 0x0d, 0x0f,
+ 0xd2, 0x07, 0x12, 0x23, 0xe3, 0xb3, 0xd5, 0xe0, 0xff, 0x20, 0x50, 0xff,
+ 0xba, 0x0f, 0x1f, 0x00,
+ 0x22, 0xdf, 0xdd, 0xef, 0x00, 0x00, 0x22, 0x02, 0xc2, 0xd3, 0x16, 0x00,
+ 0xad, 0xf0, 0x1e, 0x5e,
+ 0x08, 0x10, 0x00, 0xdb, 0x2e, 0x70, 0x60, 0x0f, 0xed, 0x00, 0x13, 0x21,
+ 0x03, 0x02, 0xf5, 0xf1,
+ 0x0f, 0x0e, 0xbb, 0xed, 0x23, 0x56, 0x13, 0x11, 0x20, 0x10, 0x4b, 0x51,
+ 0x01, 0xe0, 0xce, 0x03,
+ 0xe5, 0xdf, 0xbc, 0xe0, 0xef, 0xcf, 0xf0, 0x06, 0x02, 0xf1, 0x0f, 0x60,
+ 0x35, 0x30, 0xe0, 0x00,
+ 0x20, 0x4e, 0x1f, 0xf1, 0xd5, 0x20, 0x3e, 0x73, 0x07, 0x12, 0x00, 0xe1,
+ 0x00, 0x02, 0xe4, 0x02,
+ 0xf4, 0xe0, 0x1f, 0x40, 0xa0, 0xc1, 0x03, 0x07, 0x33, 0xe1, 0xb3, 0xe4,
+ 0xe2, 0xe0, 0x02, 0x21,
+ 0x70, 0x1f, 0xf9, 0x0d, 0x6e, 0x1e, 0x0e, 0xfc, 0xfe, 0x1d, 0x00, 0xfe,
+ 0xcd, 0xfe, 0xf0, 0x0f,
+ 0x09, 0xed, 0x0c, 0x2e, 0x4c, 0x0c, 0xef, 0xfc, 0x0c, 0xed, 0xdb, 0x2e,
+ 0x6d, 0x2d, 0xfe, 0x0e,
+ 0x2f, 0x3e, 0x1f, 0x00, 0xeb, 0x8c, 0xde, 0x0e, 0xad, 0xeb, 0xfd, 0xfe,
+ 0x2c, 0x3d, 0x5c, 0x5e,
+ 0x4f, 0x20, 0x00, 0x00, 0xfc, 0x1e, 0x2e, 0x0d, 0xcc, 0xde, 0xfd, 0xdf,
+ 0xfe, 0xcb, 0x1f, 0x5e,
+ 0x2d, 0x4c, 0x20, 0x00, 0xef, 0x0a, 0x1f, 0x00, 0xdd, 0x8d, 0xec, 0xde,
+ 0xed, 0xfe, 0xee, 0xc1,
+ 0xf0, 0x20, 0x39, 0x00, 0x10, 0x50, 0x0e, 0x2a, 0x0f, 0x00, 0x0f, 0xff,
+ 0x52, 0x71, 0x3f, 0x0d,
+ 0xd0, 0x13, 0x37, 0x41, 0x12, 0x03, 0xd0, 0xc2, 0x02, 0x3f, 0x51, 0x17,
+ 0x03, 0x12, 0x30, 0xe5,
+ 0xa3, 0xf3, 0xe1, 0xc2, 0xd5, 0x04, 0xf4, 0xf2, 0xf1, 0x20, 0x74, 0x41,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x20, 0xd0, 0xbe, 0xff, 0x01, 0x03, 0xf0, 0xeb, 0x20, 0x52, 0x26, 0x02,
+ 0xff, 0xfc, 0xde, 0xe0,
+ 0xde, 0x98, 0xfd, 0xef, 0xed, 0x0d, 0x1e, 0x00, 0xee, 0xed, 0x5e, 0x62,
+ 0x03, 0xe1, 0xda, 0xde,
+ 0x0e, 0x1f, 0xfd, 0xc8, 0x2e, 0x7d, 0x20, 0x1f, 0xf0, 0x22, 0x3e, 0x0a,
+ 0x0e, 0xdd, 0xf0, 0x00,
+ 0xe0, 0xcd, 0x0e, 0xd1, 0xe0, 0xfe, 0x28, 0x70, 0x72, 0x30, 0x00, 0x20,
+ 0x40, 0x0d, 0xfd, 0xe0,
+ 0x01, 0xe2, 0xfe, 0x0b, 0xa0, 0xdf, 0xd2, 0xe7, 0x05, 0x00, 0xe1, 0xcf,
+ 0xec, 0x00, 0x12, 0x33,
+ 0x51, 0x30, 0x54, 0x13, 0x10, 0x30, 0x10, 0x13, 0x01, 0x66, 0x14, 0x02,
+ 0xd3, 0xe2, 0x11, 0x42,
+ 0x02, 0x23, 0x47, 0x34, 0x11, 0x03, 0xd3, 0xf3, 0xb4, 0xa3, 0xf4, 0xd4,
+ 0xc2, 0xc4, 0xe3, 0x04,
+ 0x03, 0x02, 0x42, 0x64, 0x22, 0x11, 0x0f, 0x01, 0xe2, 0xf0, 0x22, 0x02,
+ 0xb1, 0xff, 0x01, 0xf6,
+ 0x05, 0x03, 0x23, 0x03, 0xa0, 0x00, 0x13, 0x01, 0xc0, 0xe8, 0x00, 0x2f,
+ 0x10, 0xd1, 0x00, 0x50,
+ 0x6e, 0x1f, 0x00, 0xc7, 0x04, 0x10, 0x10, 0xd0, 0xbf, 0xdc, 0x00, 0x0f,
+ 0x00, 0x23, 0x10, 0x00,
+ 0x00, 0x5f, 0x61, 0x24, 0x03, 0x00, 0x1e, 0x10, 0x02, 0xd0, 0xd1, 0x07,
+ 0x06, 0x02, 0x33, 0x00,
+ 0x9e, 0x0d, 0x02, 0x25, 0x40, 0x14, 0x32, 0x10, 0xff, 0xce, 0xed, 0xee,
+ 0xf1, 0xd4, 0x04, 0x03,
+ 0x83, 0xbf, 0xfe, 0xea, 0x0e, 0xfe, 0x0d, 0x00, 0x15, 0x32, 0x5d, 0x0d,
+ 0x1e, 0x4e, 0x21, 0x17,
+ 0x03, 0xd0, 0xcf, 0x15, 0x23, 0xe1, 0xf1, 0x23, 0x72, 0x50, 0x26, 0x23,
+ 0x31, 0x3f, 0x0e, 0x03,
+ 0x25, 0x00, 0xb0, 0xd5, 0xc4, 0xe2, 0xa4, 0xe2, 0x03, 0x05, 0x42, 0x10,
+ 0x12, 0xf1, 0xdf, 0x0d,
+ 0x2e, 0x40, 0xfe, 0xe0, 0x0d, 0xd8, 0x0c, 0x30, 0x43, 0x03, 0xd0, 0x3f,
+ 0x6e, 0xde, 0xa0, 0xe0,
+ 0x0f, 0x1d, 0x0a, 0x0d, 0xcc, 0x0b, 0x2e, 0x4d, 0xff, 0xb0, 0xef, 0xf0,
+ 0x13, 0x0d, 0xdc, 0xef,
+ 0xe0, 0xee, 0x98, 0x0f, 0x30, 0x2d, 0x0e, 0xdc, 0x30, 0x74, 0x0c, 0xfd,
+ 0x51, 0x20, 0xed, 0x0d,
+ 0x01, 0x1e, 0x0b, 0xe1, 0x36, 0xe0, 0xcd, 0x32, 0x01, 0x9c, 0x10, 0x53,
+ 0x16, 0x0f, 0xdc, 0x71,
+ 0x00, 0x0e, 0x32, 0xf1, 0xef, 0x03, 0x04, 0xdf, 0xfd, 0xe1, 0xe3, 0xef,
+ 0xf0, 0xe0, 0xf4, 0x25,
+ 0x10, 0xcd, 0xf1, 0x66, 0x31, 0x21, 0xff, 0x00, 0xd3, 0xe0, 0xcf, 0xde,
+ 0x01, 0x24, 0x40, 0x72,
+ 0x37, 0x02, 0x0f, 0x40, 0x5e, 0x41, 0x24, 0x1f, 0xca, 0xff, 0xff, 0xdf,
+ 0xee, 0xf6, 0xa1, 0xd0,
+ 0x00, 0x10, 0x02, 0x03, 0xe0, 0x32, 0x70, 0x0e, 0x1e, 0x0c, 0x09, 0x0e,
+ 0x30, 0x00, 0xe0, 0xbe,
+ 0x0d, 0x0d, 0x0c, 0xff, 0xe0, 0xd2, 0xaf, 0xe8, 0x0f, 0x3f, 0x1d, 0xfc,
+ 0x1e, 0x4f, 0xfc, 0x0d,
+ 0x1d, 0x2e, 0x50, 0x1c, 0x1d, 0xe0, 0xb2, 0xee, 0x0b, 0x10, 0x12, 0xad,
+ 0xec, 0x00, 0x20, 0xda,
+ 0x00, 0x10, 0x50, 0x3e, 0xfa, 0x1f, 0x7f, 0x30, 0x03, 0x02, 0x0f, 0x0b,
+ 0x00, 0xef, 0xef, 0xf0,
+ 0xf4, 0xf2, 0xa1, 0xfd, 0xfc, 0x70, 0x20, 0x10, 0x1d, 0x3d, 0x10, 0x01,
+ 0x07, 0xe0, 0xdf, 0xff,
+ 0xaf, 0xee, 0xe0, 0xef, 0xc0, 0xef, 0x02, 0xe3, 0xe8, 0x3e, 0x70, 0x51,
+ 0x01, 0x0f, 0xdf, 0x0f,
+ 0x1d, 0x0e, 0xf0, 0xf5, 0x01, 0x10, 0x01, 0xe7, 0xa2, 0x06, 0x52, 0x21,
+ 0x50, 0x0e, 0x0c, 0x10,
+ 0x3f, 0x00, 0x01, 0x04, 0xc0, 0xe1, 0x01, 0x13, 0xd7, 0xb6, 0xe1, 0xc1,
+ 0xf1, 0x00, 0x52, 0x45,
+ 0x9a, 0xfe, 0x47, 0x00, 0xef, 0x0f, 0x21, 0x11, 0xee, 0xf0, 0x32, 0x11,
+ 0xb0, 0x0e, 0x12, 0x24,
+ 0x0f, 0xad, 0x00, 0x22, 0x01, 0x00, 0xfe, 0xed, 0xee, 0x20, 0x33, 0x0d,
+ 0xef, 0x05, 0x02, 0x01,
+ 0xec, 0x10, 0x22, 0x10, 0xf5, 0x80, 0xf0, 0xf1, 0x00, 0xeb, 0x20, 0x50,
+ 0x0d, 0x12, 0x33, 0xfc,
+ 0x1e, 0x72, 0xfc, 0x0f, 0x00, 0x1d, 0x00, 0xd2, 0xcf, 0x07, 0x23, 0xff,
+ 0xbb, 0x00, 0x6f, 0x30,
+ 0x11, 0x0f, 0xdc, 0x00, 0x50, 0x10, 0xf8, 0xf0, 0x22, 0x0f, 0xbb, 0xff,
+ 0x01, 0x24, 0xf0, 0xce,
+ 0xfc, 0x11, 0x21, 0xff, 0xac, 0x00, 0x00, 0x33, 0x0e, 0xca, 0x10, 0x30,
+ 0x00, 0xd0, 0xf0, 0x15,
+ 0x13, 0xd0, 0xec, 0x70, 0x71, 0x00, 0x00, 0x00, 0x1e, 0x0d, 0x0f, 0x20,
+ 0x10, 0xf0, 0xc2, 0xf7,
+ 0xd4, 0xd2, 0x02, 0xf3, 0xbf, 0xe0, 0x02, 0x26, 0x32, 0x00, 0x00, 0x11,
+ 0x33, 0x40, 0xfc, 0x0e,
+ 0x56, 0x02, 0xe0, 0x90, 0xf1, 0x14, 0x02, 0x12, 0x00, 0xd2, 0x06, 0xe0,
+ 0xbe, 0xff, 0x30, 0x24,
+ 0xce, 0xce, 0x0f, 0x10, 0x62, 0x13, 0x00, 0x0e, 0x01, 0x57, 0x07, 0xe0,
+ 0x0f, 0xf1, 0xf0, 0xd0,
+ 0xd0, 0x22, 0x01, 0x10, 0x70, 0x21, 0x34, 0x13, 0xfe, 0x0c, 0x72, 0x30,
+ 0xf1, 0xd6, 0xf2, 0xdd,
+ 0xdf, 0x04, 0x00, 0xb0, 0x33, 0x43, 0x30, 0xfc, 0xbe, 0x11, 0x21, 0x30,
+ 0x2e, 0x1d, 0xee, 0xa8,
+ 0x0b, 0x00, 0x03, 0xf0, 0xbe, 0x0e, 0xfd, 0x1e, 0x23, 0xab, 0x01, 0x02,
+ 0xcb, 0x10, 0x1e, 0x2b,
+ 0x2e, 0x20, 0xbe, 0xee, 0x04, 0x0f, 0xde, 0x03, 0x11, 0xe0, 0xbd, 0x01,
+ 0x00, 0x62, 0x53, 0x1b,
+ 0x09, 0x0d, 0x2e, 0x20, 0x1f, 0x10, 0xf0, 0xe0, 0xe4, 0xe1, 0xe1, 0xd2,
+ 0x27, 0xe3, 0xb0, 0xf3,
+ 0xd1, 0x02, 0x11, 0x10, 0x22, 0x12, 0xf0, 0xff, 0x61, 0x20, 0x42, 0xe0,
+ 0xe5, 0x36, 0x51, 0x01,
+ 0xe4, 0x02, 0x10, 0xf0, 0xa1, 0x03, 0xbf, 0xfe, 0xff, 0x0a, 0x4f, 0x0e,
+ 0x0e, 0x00, 0x71, 0x57,
+ 0x02, 0xe2, 0xe0, 0x03, 0x03, 0xef, 0x03, 0xe3, 0xc0, 0xe0, 0xdd, 0xfb,
+ 0x25, 0x65, 0x11, 0x1f,
+ 0x3c, 0x3f, 0x51, 0x00, 0xdd, 0x01, 0xed, 0x67, 0x8c, 0x0a, 0x57, 0xd0,
+ 0xeb, 0x44, 0x00, 0xee,
+ 0xf0, 0x10, 0x43, 0x0f, 0x00, 0xed, 0xde, 0x75, 0x01, 0xed, 0x00, 0x11,
+ 0x10, 0x01, 0xfe, 0xef,
+ 0x14, 0x00, 0xcd, 0x13, 0x11, 0xfc, 0xdd, 0x34, 0x22, 0xb9, 0x10, 0x21,
+ 0xf0, 0x32, 0xce, 0xee,
+ 0x24, 0x00, 0xbf, 0x10, 0x45, 0x00, 0xcd, 0x30, 0x52, 0x01, 0x0c, 0xee,
+ 0x32, 0x45, 0xdd, 0xcc,
+ 0x22, 0x22, 0x03, 0xff, 0xcc, 0x02, 0x35, 0xe0, 0xcf, 0x00, 0x54, 0xe0,
+ 0xee, 0x32, 0xf0, 0xfe,
+ 0x01, 0x00, 0xed, 0x00, 0x76, 0x10, 0x00, 0xe0, 0xfe, 0xfe, 0x25, 0x52,
+ 0xcc, 0xf0, 0x23, 0xff,
+ 0xb9, 0x00, 0x32, 0x0f, 0xdd, 0x30, 0x32, 0x10, 0xfe, 0x00, 0xee, 0x10,
+ 0x32, 0x00, 0xee, 0x88,
+ 0x11, 0x00, 0xdf, 0x00, 0xf0, 0x44, 0x0e, 0xdc, 0x60, 0xfe, 0x32, 0x23,
+ 0x88, 0x0f, 0x21, 0x00,
+ 0xff, 0x10, 0x0f, 0xfe, 0xf0, 0x14, 0xff, 0xfe, 0x44, 0xfd, 0xbb, 0x10,
+ 0x10, 0x42, 0xff, 0xca,
+ 0x20, 0x73, 0xfd, 0xdc, 0x12, 0x1f, 0x11, 0x0f, 0xcc, 0x13, 0x0f, 0xed,
+ 0x00, 0xfe, 0x21, 0x44,
+ 0xda, 0xdd, 0x30, 0x22, 0xfd, 0xf0, 0x00, 0xac, 0x01, 0x14, 0xef, 0xcd,
+ 0x23, 0x12, 0x0e, 0x1d,
+ 0x75, 0x41, 0x0e, 0xdb, 0x30, 0x44, 0xdd, 0xed, 0x24, 0x20, 0x20, 0xe0,
+ 0xbd, 0x15, 0x12, 0xf0,
+ 0x02, 0x14, 0xe0, 0xde, 0x00, 0xf2, 0x03, 0xf0, 0xef, 0xdf, 0x20, 0x77,
+ 0x72, 0xf0, 0xef, 0xf0,
+ 0x36, 0x21, 0x00, 0xd1, 0x01, 0x00, 0xcf, 0xcc, 0x01, 0x77, 0x00, 0xee,
+ 0xed, 0x31, 0x23, 0xfd,
+ 0x00, 0x35, 0xee, 0xce, 0x0e, 0x22, 0x44, 0xcd, 0xbd, 0x00, 0x05, 0x10,
+ 0x0e, 0x00, 0xf0, 0x0e,
+ 0x1f, 0x42, 0x00, 0xee, 0x2d, 0x2c, 0x0e, 0x20, 0x01, 0xba, 0x02, 0x11,
+ 0x9c, 0x00, 0x00, 0xd0,
+ 0x00, 0x0c, 0x21, 0x01, 0xfc, 0x0f, 0x2a, 0x70, 0x73, 0x0b, 0xf0, 0x1f,
+ 0x1f, 0x00, 0xef, 0xfd,
+ 0x02, 0xef, 0xb8, 0x11, 0x23, 0xdf, 0xed, 0x10, 0x20, 0x40, 0x0f, 0xdb,
+ 0xdf, 0x40, 0xf0, 0x0f,
+ 0x12, 0x8a, 0xe2, 0x04, 0x10, 0x00, 0x01, 0x24, 0x75, 0xfc, 0x88, 0x65,
+ 0x11, 0xcc, 0x00, 0x21,
+ 0x11, 0x00, 0xdd, 0x12, 0x21, 0x00, 0xe0, 0x00, 0x23, 0xf0, 0xee, 0x01,
+ 0x03, 0x00, 0xe0, 0xee,
+ 0x23, 0x34, 0xcd, 0x00, 0x52, 0xf1, 0x00, 0x13, 0x00, 0x14, 0x35, 0xd0,
+ 0xdf, 0xd0, 0x03, 0x54,
+ 0xcd, 0xef, 0x01, 0xfe, 0x00, 0x27, 0x00, 0x00, 0x20, 0x20, 0x3f, 0x72,
+ 0x0f, 0xc0, 0x14, 0x02,
+ 0x02, 0xed, 0xdc, 0x12, 0x25, 0xc0, 0xf1, 0xf1, 0xd0, 0x22, 0xef, 0x2f,
+ 0x70, 0x51, 0x0f, 0xc8,
+ 0x20, 0x45, 0x12, 0xf0, 0xde, 0xf0, 0xe0, 0x23, 0x01, 0x24, 0xc0, 0xbe,
+ 0x13, 0x00, 0x0f, 0x30,
+ 0x0d, 0x21, 0x31, 0x0a, 0x76, 0x00, 0xcd, 0xff, 0xf0, 0x23, 0x01, 0x9b,
+ 0x11, 0x27, 0xf0, 0xdd,
+ 0x11, 0x31, 0x21, 0xff, 0x99, 0x00, 0x30, 0xf0, 0xaf, 0x0f, 0x01, 0x10,
+ 0xf1, 0x00, 0x01, 0x01,
+ 0xfd, 0x02, 0x66, 0x10, 0x0e, 0xdb, 0x30, 0x42, 0x0f, 0xeb, 0x20, 0x62,
+ 0x00, 0xee, 0x02, 0x32,
+ 0x00, 0xc0, 0x00, 0x17, 0x23, 0xbd, 0xee, 0x00, 0x14, 0x11, 0xff, 0xcc,
+ 0x22, 0x31, 0xef, 0x1f,
+ 0x62, 0x01, 0xcd, 0x17, 0x34, 0xfd, 0xe0, 0x1f, 0xef, 0x01, 0x02, 0xf0,
+ 0x00, 0xcd, 0x30, 0x77,
+ 0x0f, 0xdf, 0x0d, 0x56, 0x10, 0xcf, 0x22, 0xcc, 0xed, 0x46, 0x00, 0xde,
+ 0x11, 0x01, 0xf0, 0xf0,
+ 0xe0, 0xfe, 0x00, 0x30, 0x72, 0x0d, 0xdd, 0x33, 0x24, 0xd9, 0x00, 0x04,
+ 0x78, 0x00, 0xac, 0x00,
+ 0x3f, 0x12, 0x86, 0xf2, 0xb9, 0x10, 0x00, 0xf2, 0x53, 0x00, 0xc8, 0xff,
+ 0x02, 0xb0, 0xac, 0xde,
+ 0xe1, 0xf3, 0xe4, 0xd0, 0xd0, 0x03, 0x03, 0x01, 0x00, 0x1f, 0x32, 0x2f,
+ 0x1a, 0x4f, 0x40, 0x0f,
+ 0xeb, 0xf2, 0x57, 0x12, 0xf0, 0xf0, 0x11, 0x42, 0x00, 0xed, 0xfe, 0xba,
+ 0xce, 0xf0, 0xd0, 0x9e,
+ 0xdf, 0xd1, 0xd3, 0xb5, 0xe5, 0xc2, 0xd1, 0xe4, 0xe1, 0xe1, 0x03, 0x12,
+ 0x0e, 0x2f, 0x3f, 0xb8,
+ 0x70, 0x76, 0xfc, 0x0f, 0x22, 0x11, 0x10, 0x0e, 0x00, 0x11, 0x34, 0x23,
+ 0xde, 0xcc, 0x23, 0x33,
+ 0xfe, 0xfd, 0x00, 0x42, 0x21, 0x00, 0x1e, 0x2f, 0x30, 0x64, 0x11, 0x0f,
+ 0x0f, 0x0a, 0x00, 0x00,
+ 0xcc, 0x00, 0xbc, 0xa8, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x0f, 0x0d, 0xeb,
+ 0x0f, 0x30, 0x40, 0x00,
+ 0xcb, 0xee, 0x11, 0x00, 0xbe, 0xee, 0xef, 0x00, 0x00, 0xdf, 0xde, 0x0f,
+ 0x2f, 0x20, 0x1f, 0x30,
+ 0x0d, 0x0d, 0x30, 0x88, 0x00, 0x54, 0xdd, 0xcd, 0x01, 0x02, 0x03, 0xd0,
+ 0xf0, 0x05, 0xe0, 0xcd,
+ 0x10, 0x73, 0x22, 0x0c, 0x0a, 0x1e, 0x1f, 0x40, 0x32, 0x11, 0x00, 0xff,
+ 0x01, 0x12, 0x34, 0xfd,
+ 0x0e, 0x3f, 0xf8, 0x72, 0x1f, 0xc9, 0x0f, 0x20, 0x30, 0xdf, 0x8d, 0x00,
+ 0xe0, 0xe0, 0xe2, 0xc1,
+ 0xd2, 0xc0, 0xba, 0x0f, 0x00, 0x11, 0x00, 0x0c, 0xfc, 0x2f, 0x50, 0x2f,
+ 0x2d, 0x40, 0x20, 0x20,
+ 0x45, 0x11, 0x36, 0x21, 0x32, 0x54, 0x01, 0x00, 0x12, 0x14, 0x22, 0xf0,
+ 0xbe, 0x02, 0x47, 0x00,
+ 0xff, 0x21, 0x44, 0x00, 0x00, 0x12, 0x22, 0x22, 0x00, 0xdf, 0xf0, 0xf0,
+ 0xbe, 0xee, 0xed, 0x10,
+ 0x1d, 0x1c, 0x3d, 0x4d, 0x60, 0x1e, 0x19, 0x0e, 0x0f, 0x01, 0xbe, 0xbb,
+ 0xee, 0xde, 0xf1, 0xe0,
+ 0xbb, 0xef, 0xee, 0xef, 0x00, 0x0f, 0xfd, 0x0e, 0xfa, 0xee, 0xfd, 0x0e,
+ 0xeb, 0xbd, 0xec, 0x10,
+ 0xe0, 0x88, 0xe0, 0x56, 0x8d, 0xfe, 0x02, 0x00, 0x0f, 0xfe, 0x00, 0x10,
+ 0x10, 0x0d, 0x1d, 0x20,
+ 0x23, 0x1e, 0x0b, 0x10, 0x11, 0x10, 0x30, 0x20, 0x2d, 0x5f, 0x2f, 0x2d,
+ 0x50, 0x0a, 0x1c, 0x2f,
+ 0x1d, 0xd9, 0xef, 0x00, 0xb0, 0xd0, 0xb0, 0xc0, 0xf1, 0xf1, 0x02, 0xd0,
+ 0xdd, 0x03, 0x23, 0x2f,
+ 0x61, 0x1e, 0x08, 0x2d, 0x4e, 0x2d, 0x1e, 0x30, 0x40, 0x33, 0x41, 0x22,
+ 0x24, 0x22, 0x22, 0x36,
+ 0x13, 0x13, 0x03, 0x02, 0xd1, 0x03, 0x23, 0x01, 0x23, 0x77, 0x44, 0x00,
+ 0x43, 0x57, 0x11, 0x12,
+ 0x01, 0xe0, 0xe1, 0x04, 0x02, 0xb0, 0xd0, 0xd0, 0xf3, 0x02, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x13,
+ 0x07, 0x90, 0xd0, 0x01, 0xf4, 0xb0, 0xe1, 0xe2, 0xe4, 0xf4, 0x04, 0x02,
+ 0xd1, 0xb1, 0x04, 0x34,
+ 0x22, 0x00, 0x55, 0x43, 0x12, 0x00, 0x00, 0x65, 0x23, 0xf0, 0xe3, 0xe4,
+ 0xb1, 0xe2, 0x04, 0x03,
+ 0x04, 0x01, 0xf0, 0x51, 0x52, 0x10, 0x30, 0x34, 0x0f, 0xfd, 0xfd, 0xff,
+ 0x02, 0xec, 0xbb, 0x00,
+ 0x01, 0xef, 0xfc, 0x40, 0x70, 0x30, 0x1c, 0x1a, 0x0d, 0x0c, 0x10, 0x0f,
+ 0xf0, 0xe0, 0x8d, 0xe3,
+ 0x07, 0xf2, 0xa0, 0xef, 0xf3, 0xf4, 0xf1, 0xe0, 0xef, 0xff, 0x0e, 0x0d,
+ 0x0d, 0x20, 0x2f, 0x08,
+ 0x1f, 0x71, 0x43, 0x11, 0x10, 0x13, 0x47, 0x23, 0x12, 0x01, 0xf1, 0x02,
+ 0x03, 0x04, 0x02, 0x12,
+ 0x44, 0x44, 0x34, 0x32, 0x22, 0x22, 0x33, 0x34, 0x24, 0x02, 0xd2, 0x92,
+ 0x05, 0xf2, 0xb0, 0xf2,
+ 0xf0, 0x01, 0x21, 0x20, 0x20, 0x70, 0x21, 0x2f, 0x0c, 0x0d, 0x21, 0x21,
+ 0xfd, 0x0f, 0x01, 0x9e,
+ 0xdc, 0xe0, 0xd2, 0xe3, 0xc2, 0xd4, 0xe7, 0xf3, 0xe0, 0x00, 0x00, 0xed,
+ 0x1b, 0x60, 0x3f, 0x2e,
+ 0x0c, 0x00, 0x23, 0xb0, 0x88, 0xbf, 0x27, 0xbe, 0xed, 0x15, 0x00, 0xfe,
+ 0xfe, 0x00, 0x00, 0x0f,
+ 0x1f, 0xfc, 0xfc, 0x42, 0x21, 0xdc, 0xee, 0x00, 0x41, 0x21, 0x2f, 0x1f,
+ 0x3d, 0x50, 0x1b, 0xd9,
+ 0x40, 0x20, 0x8a, 0xff, 0x00, 0x00, 0xdf, 0xee, 0xe0, 0xe1, 0xd1, 0xc0,
+ 0xb0, 0xf0, 0x02, 0xdf,
+ 0xdc, 0x00, 0x02, 0x00, 0x0c, 0x0d, 0x3f, 0x72, 0x43, 0x08, 0x0e, 0x53,
+ 0x11, 0x10, 0x00, 0x23,
+ 0x25, 0x00, 0x00, 0x24, 0x01, 0x01, 0xe0, 0xf1, 0x45, 0x11, 0x00, 0x20,
+ 0x74, 0x11, 0x00, 0x01,
+ 0x13, 0x00, 0x02, 0x04, 0x12, 0xf2, 0x88, 0xe0, 0x02, 0xdd, 0xde, 0x00,
+ 0x20, 0x00, 0xdb, 0x00,
+ 0x2f, 0x1f, 0x1f, 0xcd, 0xbb, 0x10, 0x20, 0x00, 0xed, 0xef, 0xdf, 0xbe,
+ 0xef, 0xf0, 0xcf, 0xb9,
+ 0x21, 0x43, 0xed, 0xfd, 0x1f, 0x3d, 0x1a, 0x0d, 0x40, 0x20, 0xdc, 0xac,
+ 0xe0, 0x01, 0xf0, 0xbc,
+ 0xff, 0x00, 0x10, 0x22, 0x31, 0x20, 0x10, 0x1c, 0x4f, 0x2f, 0x1d, 0x0a,
+ 0xff, 0x00, 0x00, 0x42,
+ 0x22, 0xf0, 0x00, 0x70, 0x6f, 0x0e, 0x1d, 0x08, 0x0e, 0x2e, 0x2c, 0x0c,
+ 0xeb, 0x0f, 0xfe, 0x9d,
+ 0xff, 0xe0, 0xbf, 0xe0, 0xd0, 0xe1, 0xe5, 0xe3, 0x9f, 0xe0, 0xff, 0xf0,
+ 0x02, 0xd8, 0xde, 0x20,
+ 0x2f, 0x0d, 0x51, 0x22, 0x20, 0x22, 0x22, 0x43, 0x36, 0x32, 0x35, 0x8c,
+ 0xee, 0x77, 0x02, 0xed,
+ 0x01, 0x22, 0x00, 0x00, 0x00, 0x33, 0x11, 0x00, 0x23, 0x23, 0x23, 0x14,
+ 0x02, 0xe0, 0xf0, 0x27,
+ 0x01, 0xf1, 0xb0, 0xee, 0x52, 0x32, 0x0e, 0x20, 0x40, 0x0e, 0x62, 0x21,
+ 0x20, 0x20, 0xf8, 0xff,
+ 0x0f, 0x0f, 0xee, 0xcd, 0xde, 0xab, 0xdd, 0xef, 0x00, 0x00, 0xb8, 0x1e,
+ 0x40, 0x0e, 0x1e, 0x2f,
+ 0x2f, 0x1e, 0x0c, 0xff, 0x10, 0xee, 0x88, 0xf0, 0x01, 0xdf, 0xef, 0xef,
+ 0xdd, 0x0e, 0x20, 0x20,
+ 0x0c, 0xfd, 0x0e, 0x0e, 0x1f, 0x0d, 0xdb, 0xfe, 0x2f, 0x3f, 0x70, 0x30,
+ 0x0b, 0x2f, 0x70, 0x1e,
+ 0x1a, 0x40, 0x3e, 0x2e, 0x3d, 0x4d, 0x1c, 0x0c, 0xcd, 0xff, 0x02, 0xf3,
+ 0xc1, 0xb1, 0xf7, 0xe3,
+ 0xa1, 0xe1, 0xf3, 0xc0, 0xe0, 0xf0, 0x00, 0x12, 0x0e, 0x0e, 0x31, 0x2e,
+ 0x2e, 0x77, 0x46, 0x21,
+ 0x11, 0x11, 0x44, 0x34, 0x11, 0x02, 0x13, 0x22, 0x25, 0x02, 0x01, 0x23,
+ 0x12, 0x03, 0x54, 0x44,
+ 0x23, 0x32, 0x22, 0x35, 0x53, 0x03, 0x23, 0x24, 0x01, 0xd2, 0xf3, 0x05,
+ 0xd0, 0x81, 0x02, 0xf0,
+ 0xee, 0x13, 0x11, 0xee, 0x44, 0x34, 0x00, 0x1f, 0x41, 0x45, 0xf0, 0xd0,
+ 0xf3, 0x27, 0xd1, 0x80,
+ 0xf2, 0x03, 0x13, 0x00, 0xf0, 0x33, 0x54, 0x11, 0x45, 0x22, 0x00, 0xef,
+ 0xff, 0x00, 0xf3, 0xf4,
+ 0xb1, 0xd1, 0xc1, 0xf3, 0x06, 0x12, 0x12, 0xf1, 0x01, 0x54, 0x11, 0x00,
+ 0x11, 0x23, 0xf0, 0xe0,
+ 0x01, 0x04, 0xd2, 0xb3, 0xd5, 0xe2, 0x35, 0x62, 0x00, 0xff, 0x0f, 0x1f,
+ 0x6f, 0x0c, 0x0b, 0xfd,
+ 0xfd, 0xfe, 0xcf, 0xbf, 0xbf, 0xef, 0xc0, 0xc0, 0xce, 0xe0, 0xda, 0xcb,
+ 0xee, 0xdd, 0xed, 0xfa,
+ 0xee, 0xe0, 0x00, 0x10, 0x0d, 0x0b, 0xfe, 0x1f, 0x41, 0x66, 0xed, 0xed,
+ 0x77, 0x33, 0xbb, 0x11,
+ 0x33, 0xf0, 0xee, 0x00, 0x32, 0x22, 0x01, 0x0f, 0x0f, 0x10, 0x44, 0x00,
+ 0x0f, 0x43, 0x24, 0x00,
+ 0x01, 0xdf, 0xf0, 0x11, 0x0d, 0x0e, 0xec, 0x0d, 0x4e, 0x60, 0x0b, 0x0d,
+ 0x74, 0x0a, 0x0e, 0x62,
+ 0x0f, 0xf9, 0x00, 0x00, 0x0f, 0xee, 0xdd, 0x00, 0x00, 0xcc, 0xde, 0x00,
+ 0x20, 0x00, 0xfc, 0x0e,
+ 0x2f, 0x2d, 0x0c, 0xec, 0x0e, 0x50, 0x0e, 0xbc, 0xdd, 0xe0, 0xef, 0xf0,
+ 0xcf, 0xdc, 0x21, 0xef,
+ 0x88, 0x00, 0x11, 0x00, 0xdd, 0x0f, 0x10, 0x21, 0xf0, 0xff, 0x13, 0x02,
+ 0xdf, 0xe0, 0x46, 0x31,
+ 0x00, 0x0e, 0x70, 0x74, 0x0e, 0x0a, 0x1f, 0x20, 0x20, 0x0f, 0x0d, 0xee,
+ 0xef, 0xe3, 0xa1, 0xdf,
+ 0xe7, 0xc1, 0xc0, 0xd0, 0xf4, 0xe2, 0x9d, 0x02, 0x05, 0x0f, 0x00, 0xff,
+ 0x0f, 0x32, 0x21, 0x20,
+ 0x20, 0x1c, 0x41, 0x32, 0x22, 0x24, 0x11, 0x01, 0x02, 0x01, 0x11, 0x36,
+ 0x11, 0xde, 0x1c, 0x71,
+ 0x76, 0x41, 0x10, 0x43, 0x24, 0x11, 0x14, 0x12, 0x15, 0x01, 0x01, 0x11,
+ 0x01, 0xd0, 0xdf, 0x00,
+ 0x11, 0x01, 0xde, 0x10, 0x74, 0x2c, 0x0a, 0x50, 0x30, 0x0e, 0xca, 0xee,
+ 0x00, 0x0f, 0xce, 0xdf,
+ 0xae, 0xee, 0xf0, 0x00, 0xe0, 0xee, 0x0e, 0x0c, 0x1b, 0x2e, 0x3c, 0x6e,
+ 0x1f, 0x0c, 0x00, 0x20,
+ 0x00, 0xe0, 0x24, 0xd1, 0x8a, 0xf3, 0x47, 0xaf, 0xed, 0x12, 0x11, 0x0f,
+ 0xee, 0xf0, 0x00, 0x0e,
+ 0x20, 0x32, 0xe0, 0xbd, 0x00, 0x14, 0x13, 0x00, 0x34, 0x00, 0x0f, 0x62,
+ 0x10, 0x4d, 0x77, 0x34,
+ 0x0d, 0xda, 0xee, 0xed, 0x10, 0xf0, 0xbc, 0x00, 0x56, 0x12, 0x11, 0x02,
+ 0x13, 0x02, 0xbf, 0xbb,
+ 0xff, 0x02, 0x01, 0xf0, 0xdc, 0xba, 0xcd, 0xdb, 0x00, 0x72, 0x25, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x21, 0x11, 0x23, 0x11, 0x00, 0x00, 0x44, 0x44, 0x00, 0xde, 0xcc, 0xee,
+ 0x56, 0x54, 0xff, 0xcd,
+ 0x0f, 0x00, 0xff, 0xef, 0x00, 0x00, 0xff, 0x12, 0x33, 0xee, 0xca, 0xee,
+ 0xff, 0x0f, 0x0f, 0x2f,
+ 0x0e, 0x0e, 0x40, 0x30, 0x0e, 0x1d, 0xfb, 0x10, 0x76, 0x63, 0x00, 0xed,
+ 0xef, 0x00, 0x23, 0x10,
+ 0xfe, 0x00, 0x56, 0x22, 0x10, 0xed, 0xcb, 0x00, 0x21, 0x00, 0xef, 0x01,
+ 0x12, 0xef, 0xef, 0x56,
+ 0x44, 0xee, 0xad, 0x00, 0x45, 0x00, 0xcb, 0x00, 0x22, 0x00, 0x33, 0x21,
+ 0xf0, 0xff, 0xf0, 0x00,
+ 0x24, 0x43, 0x01, 0xef, 0xee, 0x65, 0x32, 0x0e, 0x11, 0x43, 0x00, 0xfb,
+ 0xcc, 0xcd, 0x21, 0x56,
+ 0x00, 0xf0, 0xf0, 0xef, 0xf0, 0x12, 0xd0, 0xcd, 0x13, 0x01, 0xdf, 0x13,
+ 0x13, 0xcb, 0x99, 0xee,
+ 0x10, 0x77, 0x00, 0xff, 0x00, 0x21, 0x00, 0xde, 0xff, 0x00, 0x12, 0x33,
+ 0xff, 0xff, 0xf0, 0x10,
+ 0x56, 0x00, 0x9c, 0xdb, 0x00, 0x22, 0x00, 0xde, 0x0f, 0x32, 0x21, 0x00,
+ 0xf0, 0xee, 0xff, 0xde,
+ 0xf0, 0xff, 0xab, 0x10, 0xff, 0x99, 0x00, 0x20, 0xdd, 0xfe, 0x64, 0x0e,
+ 0xd8, 0x11, 0xf0, 0xed,
+ 0x53, 0x01, 0x11, 0x00, 0xba, 0x00, 0x22, 0x00, 0xee, 0x10, 0x30, 0x33,
+ 0x42, 0x21, 0x32, 0x22,
+ 0x0f, 0x00, 0x77, 0x56, 0x00, 0xe0, 0x11, 0x11, 0xef, 0x00, 0x03, 0xdd,
+ 0x00, 0x11, 0x00, 0xbe,
+ 0xa8, 0x10, 0x44, 0x00, 0xcd, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00,
+ 0xef, 0xed, 0x11, 0x42,
+ 0x0c, 0xed, 0x43, 0x22, 0xe8, 0xee, 0x52, 0x20, 0x0f, 0x00, 0x32, 0xff,
+ 0xbb, 0x11, 0x21, 0xad,
+ 0xdb, 0x11, 0x55, 0xf0, 0xdc, 0x00, 0x21, 0x01, 0x00, 0x00, 0x0f, 0x10,
+ 0x42, 0xff, 0x00, 0x23,
+ 0xdd, 0x00, 0x77, 0x01, 0x01, 0x00, 0x0f, 0x01, 0x01, 0x12, 0x01, 0x14,
+ 0x11, 0xf0, 0x01, 0x00,
+ 0x77, 0x45, 0xf0, 0x00, 0x02, 0x11, 0x02, 0x33, 0x47, 0xc0, 0xbf, 0x01,
+ 0x22, 0x02, 0x00, 0x01,
+ 0x23, 0x00, 0xdf, 0xff, 0x30, 0x12, 0xc0, 0x00, 0x13, 0x46, 0x33, 0x02,
+ 0x8f, 0xee, 0x04, 0x14,
+ 0x02, 0x03, 0x12, 0x24, 0x01, 0xbe, 0xed, 0x35, 0x76, 0x00, 0xcd, 0x00,
+ 0x13, 0x00, 0xdd, 0x02,
+ 0x35, 0xe0, 0x00, 0x14, 0xf0, 0x9d, 0x00, 0x34, 0x00, 0xcd, 0xfe, 0xed,
+ 0x0f, 0xf0, 0xef, 0xf0,
+ 0x00, 0xcb, 0xf0, 0x32, 0x13, 0xfe, 0x10, 0x41, 0xfd, 0xfa, 0x20, 0x1e,
+ 0xea, 0x8c, 0x0e, 0x30,
+ 0xfe, 0xcd, 0xfe, 0xfd, 0x0f, 0x20, 0x00, 0xaa, 0xbc, 0xff, 0x13, 0xff,
+ 0xaa, 0x00, 0x01, 0x02,
+ 0x10, 0x0f, 0x0f, 0x21, 0x0f, 0xfc, 0xde, 0xf0, 0x33, 0xdd, 0x88, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0xeb, 0xee, 0x42, 0x32, 0x20, 0xef, 0xfc, 0x75, 0x20, 0xdd, 0x00, 0x0f,
+ 0x64, 0x00, 0xd8, 0x00,
+ 0x41, 0x11, 0xef, 0xde, 0xf0, 0x20, 0x32, 0xff, 0xcc, 0xef, 0x00, 0x21,
+ 0x41, 0x00, 0xbb, 0xbc,
+ 0x0f, 0x22, 0x11, 0xed, 0xee, 0x0f, 0xfd, 0x20, 0x66, 0xec, 0xed, 0x21,
+ 0x31, 0xed, 0xec, 0x1f,
+ 0x2f, 0x40, 0x00, 0xd9, 0x00, 0x4f, 0x10, 0x10, 0x30, 0x40, 0x30, 0x0f,
+ 0x50, 0x51, 0x0d, 0xfc,
+ 0x33, 0x77, 0x10, 0x00, 0x0f, 0x00, 0x32, 0x00, 0xff, 0x03, 0x11, 0xdd,
+ 0x0f, 0x0f, 0xff, 0xef,
+ 0xef, 0xdd, 0xfd, 0xea, 0x0f, 0x51, 0xfd, 0xaa, 0x0f, 0x22, 0x11, 0xdd,
+ 0xdd, 0xf0, 0xcb, 0xff,
+ 0x77, 0x22, 0xae, 0xee, 0x01, 0x14, 0xf0, 0xdd, 0x00, 0x34, 0x00, 0xe0,
+ 0xee, 0x0f, 0x22, 0xff,
+ 0x00, 0x77, 0x45, 0xf0, 0x00, 0x32, 0x21, 0x01, 0x11, 0x22, 0x44, 0x22,
+ 0xf0, 0x00, 0x41, 0x77,
+ 0x22, 0xf0, 0x00, 0x24, 0x43, 0x01, 0x01, 0x02, 0xe2, 0xf3, 0x06, 0xf1,
+ 0xb0, 0x35, 0x22, 0xe0,
+ 0x11, 0x42, 0xf0, 0x12, 0x76, 0x10, 0x00, 0x12, 0x01, 0xe0, 0x01, 0x22,
+ 0xcf, 0x02, 0x45, 0xf0,
+ 0xbe, 0xef, 0x01, 0x44, 0x11, 0xfe, 0xee, 0xfe, 0x24, 0x53, 0x00, 0xdd,
+ 0xff, 0x35, 0x01, 0xde,
+ 0xe0, 0xe0, 0xbe, 0x01, 0x36, 0xf0, 0xbf, 0x00, 0xde, 0xdc, 0x55, 0x33,
+ 0x00, 0xd0, 0xff, 0x11,
+ 0xd0, 0x8b, 0xf1, 0x14, 0x02, 0xef, 0xed, 0x01, 0x12, 0xff, 0xbd, 0x0f,
+ 0x15, 0x10, 0xec, 0xfe,
+ 0xff, 0x55, 0x23, 0xcd, 0xec, 0x10, 0xfe, 0xee, 0x45, 0x00, 0xaf, 0xff,
+ 0xfe, 0xdd, 0xf0, 0xe0,
+ 0xbb, 0xff, 0xf0, 0xee, 0xea, 0xdd, 0x0e, 0x41, 0x10, 0x0d, 0x30, 0x1d,
+ 0x1c, 0x2f, 0xda, 0x0f,
+ 0x71, 0x0f, 0xba, 0x00, 0x33, 0x00, 0xac, 0xfe, 0x11, 0x11, 0x0f, 0x20,
+ 0x1f, 0xfc, 0x00, 0x75,
+ 0x00, 0xfe, 0x0f, 0x21, 0x11, 0xfe, 0xfe, 0x34, 0x11, 0xee, 0xed, 0x42,
+ 0x30, 0xb8, 0xcb, 0x00,
+ 0x40, 0x00, 0xfd, 0x0e, 0xfe, 0xcb, 0x10, 0x40, 0xfe, 0xcd, 0x0f, 0x0f,
+ 0xfc, 0x0e, 0x0d, 0xdc,
+ 0xfd, 0x0f, 0x3f, 0xec, 0x89, 0xde, 0x40, 0x00, 0xbc, 0xee, 0x00, 0x00,
+ 0xfe, 0xfd, 0xfe, 0x0d,
+ 0x0f, 0x1f, 0x1d, 0x0a, 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x72, 0x0e, 0x88,
+ 0xfe, 0x11, 0x22, 0xee,
+ 0x0f, 0x43, 0x0e, 0xda, 0x00, 0x51, 0x00, 0xec, 0x0f, 0x1f, 0x10, 0x0e,
+ 0x0d, 0x41, 0x52, 0x0e,
+ 0xfc, 0x0e, 0x0e, 0x20, 0x40, 0x1e, 0x0c, 0x20, 0x0e, 0x0d, 0x32, 0x21,
+ 0xff, 0x01, 0x22, 0xee,
+ 0xcf, 0xde, 0xdd, 0x77, 0x37, 0xe0, 0x00, 0x10, 0x50, 0x1f, 0x21, 0x77,
+ 0x12, 0x0f, 0x00, 0x32,
+ 0x56, 0x22, 0x01, 0x01, 0x12, 0x00, 0x20, 0x55, 0xf0, 0x00, 0x44, 0x00,
+ 0x00, 0x24, 0x32, 0x01,
+ 0xf0, 0x02, 0x46, 0x21, 0x00, 0x11, 0x32, 0x75, 0x11, 0x00, 0x01, 0x10,
+ 0x11, 0x43, 0x00, 0xcf,
+ 0xf0, 0x04, 0xf1, 0x26, 0x23, 0x8e, 0xcf, 0x26, 0x02, 0xf0, 0x11, 0x23,
+ 0xe0, 0x00, 0x12, 0x00,
+ 0x03, 0x77, 0x02, 0x00, 0xd0, 0xd0, 0x01, 0x24, 0x02, 0x9f, 0xef, 0x02,
+ 0x02, 0xe0, 0x04, 0x27,
+ 0xf1, 0xd0, 0xf2, 0x24, 0x02, 0xc1, 0xd2, 0x36, 0x01, 0x80, 0xe2, 0x23,
+ 0x02, 0xc0, 0xf1, 0x13,
+ 0x44, 0x32, 0x22, 0x00, 0x00, 0x55, 0x44, 0x00, 0x01, 0x04, 0x02, 0xd0,
+ 0xf2, 0x15, 0xe1, 0x80,
+ 0xf0, 0x17, 0x22, 0xf0, 0xd0, 0xe0, 0x12, 0x44, 0x11, 0xe0, 0xd0, 0x00,
+ 0x32, 0x43, 0x01, 0x01,
+ 0xf1, 0xcf, 0xd0, 0x21, 0x43, 0xbb, 0xde, 0x35, 0x21, 0xef, 0xbc, 0x0e,
+ 0x53, 0x45, 0x00, 0x0f,
+ 0x0f, 0xed, 0x11, 0x55, 0x00, 0xff, 0x12, 0x01, 0xde, 0x00, 0x00, 0x00,
+ 0x13, 0x01, 0x48, 0x01,
+ 0x0f, 0x3b, 0x89, 0x0d, 0x7c, 0x41, 0xbe, 0x15, 0xed, 0x74, 0xfd, 0xc8,
+ 0x00, 0x31, 0xee, 0x00,
+ 0x52, 0x00, 0xba, 0xff, 0x01, 0x00, 0x11, 0x33, 0xcd, 0xcc, 0xf0, 0x01,
+ 0x12, 0xee, 0xcd, 0xff,
+ 0xdc, 0xee, 0x25, 0x11, 0x8c, 0xda, 0x11, 0x44, 0xf0, 0xcf, 0x00, 0x01,
+ 0x00, 0x02, 0x00, 0xbe,
+ 0xff, 0xf1, 0xf0, 0xef, 0xf0, 0x02, 0x16, 0xef, 0x0f, 0x75, 0x0f, 0xa9,
+ 0x00, 0x44, 0x12, 0x00,
+ 0x00, 0xed, 0xde, 0x00, 0x12, 0x11, 0x00, 0x0f, 0x0f, 0x0e, 0xfd, 0x0f,
+ 0x02, 0x00, 0x0c, 0x0e,
+ 0x02, 0x04, 0xd0, 0x65, 0x44, 0xce, 0xaa, 0x00, 0x00, 0xf0, 0xee, 0xff,
+ 0x0f, 0xdb, 0xbd, 0x00,
+ 0x10, 0x0f, 0x0c, 0xfc, 0x1f, 0x20, 0x00, 0x30, 0x52, 0xdd, 0x99, 0x10,
+ 0x43, 0x00, 0xfe, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x52, 0x34, 0x23, 0xfd, 0xc0, 0xf0, 0x03, 0x05,
+ 0x36, 0x12, 0xae, 0xef,
+ 0x03, 0x23, 0x21, 0x30, 0x22, 0x12, 0x00, 0xed, 0xff, 0xee, 0xcd, 0x12,
+ 0x67, 0x00, 0xbb, 0xbc,
+ 0xfe, 0x01, 0x03, 0x13, 0x01, 0xeb, 0xcd, 0xfe, 0xff, 0x13, 0x23, 0xde,
+ 0xbb, 0xf0, 0x03, 0xdd,
+ 0xb9, 0xff, 0x11, 0x12, 0x00, 0x0d, 0x52, 0x45, 0x20, 0x0e, 0xec, 0xed,
+ 0x0f, 0x0f, 0x0f, 0x00,
+ 0x00, 0xdf, 0xae, 0xf3, 0x17, 0x00, 0xee, 0xde, 0x01, 0x34, 0x53, 0x00,
+ 0x10, 0x63, 0x10, 0x0c,
+ 0x1f, 0x77, 0x23, 0xfd, 0xfc, 0x20, 0x21, 0x10, 0x00, 0x0f, 0xff, 0x0f,
+ 0xfe, 0x0e, 0x00, 0xd8,
+ 0xde, 0x73, 0x22, 0xee, 0xdd, 0xff, 0x22, 0x54, 0x00, 0x0d, 0x0f, 0x0e,
+ 0x2e, 0x77, 0x11, 0x0f,
+ 0x00, 0x01, 0x16, 0x00, 0xc0, 0x01, 0x02, 0xe0, 0xf1, 0x13, 0x32, 0x77,
+ 0x21, 0x00, 0x11, 0x32,
+ 0x22, 0x34, 0x76, 0x11, 0x00, 0x12, 0x01, 0x11, 0x23, 0x35, 0x12, 0x00,
+ 0xc0, 0x33, 0x76, 0x10,
+ 0xff, 0xf0, 0x33, 0x01, 0xd0, 0x14, 0x65, 0x12, 0xef, 0xad, 0x00, 0x15,
+ 0x12, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x63, 0x10, 0x0c, 0x11, 0x22, 0x00, 0x01, 0xe0, 0xee,
+ 0x01, 0x57, 0x12, 0xde,
+ 0x00, 0x00, 0x0e, 0x1f, 0x41, 0x10, 0x0f, 0x10, 0x31, 0x53, 0x10, 0x22,
+ 0x47, 0x23, 0x0f, 0xf0,
+ 0xcf, 0xcd, 0x13, 0x67, 0x00, 0xb8, 0x0f, 0x20, 0x0f, 0xfd, 0x30, 0x30,
+ 0x0d, 0x0f, 0x10, 0x54,
+ 0x21, 0x0f, 0xec, 0x00, 0x53, 0x0f, 0x0f, 0x22, 0x10, 0x1f, 0x22, 0xf0,
+ 0x88, 0xee, 0x13, 0x00,
+ 0xcd, 0xef, 0x01, 0x01, 0xeb, 0xed, 0x00, 0x00, 0xdf, 0xc9, 0xde, 0x01,
+ 0x00, 0xdf, 0x12, 0xd0,
+ 0xad, 0xf0, 0x01, 0x46, 0x32, 0xe0, 0xab, 0xf0, 0x24, 0x22, 0x00, 0x23,
+ 0x01, 0x00, 0x15, 0x74,
+ 0x24, 0x01, 0xd0, 0xf0, 0x03, 0x01, 0x13, 0x22, 0x8c, 0xfd, 0x11, 0x33,
+ 0x20, 0x10, 0x0d, 0xfa,
+ 0xfe, 0xdb, 0xff, 0x62, 0xef, 0xcd, 0x01, 0xee, 0x88, 0xfe, 0x00, 0x00,
+ 0xed, 0xfe, 0xff, 0xdc,
+ 0xdd, 0x00, 0x10, 0x20, 0xfe, 0xdd, 0x0f, 0x00, 0x45, 0xed, 0x88, 0xef,
+ 0x32, 0x10, 0xff, 0xee,
+ 0xfe, 0x00, 0x20, 0xed, 0xab, 0xfe, 0x10, 0x54, 0x01, 0xff, 0xef, 0x00,
+ 0xab, 0xf0, 0x23, 0x0f,
+ 0x0d, 0x0f, 0xfa, 0xff, 0x20, 0x2f, 0x0e, 0xee, 0xed, 0xee, 0x10, 0x42,
+ 0xff, 0x9b, 0xee, 0xed,
+ 0xf0, 0xe0, 0xcf, 0x01, 0x00, 0xdd, 0xcb, 0x0f, 0xed, 0xde, 0x02, 0x55,
+ 0x00, 0xca, 0xbd, 0xf0,
+ 0x01, 0x00, 0x11, 0x03, 0xd1, 0xf1, 0xe0, 0xe0, 0x02, 0x57, 0x45, 0x22,
+ 0xf0, 0xd0, 0x23, 0x12,
+ 0xaf, 0x00, 0x27, 0x32, 0x01, 0xe1, 0xe0, 0x10, 0x75, 0x20, 0x11, 0x65,
+ 0x11, 0x00, 0x21, 0x21,
+ 0x00, 0xfe, 0x21, 0x32, 0x00, 0x02, 0x00, 0xf0, 0x34, 0x00, 0x8a, 0x14,
+ 0x35, 0xe0, 0xf0, 0x00,
+ 0x21, 0x62, 0x12, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x22, 0x45, 0x00, 0xee,
+ 0xbb, 0xef, 0x21, 0x20,
+ 0x41, 0x11, 0xcb, 0xdd, 0x0f, 0x00, 0x00, 0x00, 0xfc, 0xed, 0x73, 0x20,
+ 0x0b, 0x0f, 0x2e, 0x50,
+ 0x45, 0x00, 0x0e, 0xff, 0x22, 0x34, 0x23, 0x00, 0xcf, 0xbc, 0x0f, 0x11,
+ 0x14, 0x01, 0x00, 0x20,
+ 0x44, 0x64, 0x35, 0x20, 0xff, 0xed, 0xf0, 0xff, 0x13, 0x77, 0xf1, 0xbb,
+ 0xff, 0xf0, 0xf0, 0xcc,
+ 0xee, 0x12, 0x12, 0x0f, 0xdc, 0xee, 0xef, 0x02, 0x35, 0xf0, 0x9d, 0xff,
+ 0x02, 0xe0, 0xe0, 0x05,
+ 0x01, 0xf0, 0x11, 0x00, 0x20, 0x77, 0x40, 0x00, 0x20, 0x21, 0xfd, 0x0e,
+ 0x55, 0x01, 0xff, 0x22,
+ 0x12, 0xdf, 0xbe, 0xd0, 0xe2, 0x27, 0x44, 0xf0, 0x00, 0x00, 0x00, 0x30,
+ 0x42, 0x32, 0x63, 0x0e,
+ 0xe9, 0x00, 0x33, 0x32, 0xf0, 0xce, 0xfd, 0x10, 0x1e, 0xea, 0x2f, 0x70,
+ 0x0a, 0xfe, 0x40, 0x10,
+ 0xed, 0xfe, 0x20, 0x10, 0x0e, 0xed, 0xba, 0xff, 0x51, 0x21, 0xdc, 0xed,
+ 0x30, 0x42, 0xed, 0xcc,
+ 0xed, 0xfc, 0x0f, 0x00, 0xbe, 0xcc, 0xfe, 0xee, 0xbb, 0xed, 0x03, 0x24,
+ 0xee, 0xff, 0x01, 0xf0,
+ 0x00, 0x44, 0x00, 0x21, 0x45, 0x00, 0xe0, 0xee, 0xcc, 0xdd, 0x42, 0x77,
+ 0x12, 0x00, 0x00, 0x00,
+ 0x01, 0x34, 0x00, 0x01, 0x35, 0x01, 0x80, 0xf0, 0x02, 0xd1, 0xe1, 0xe0,
+ 0xf4, 0x03, 0x11, 0x00,
+ 0x00, 0x03, 0x25, 0x33, 0x43, 0xff, 0x42, 0x76, 0x00, 0xf0, 0x00, 0xe0,
+ 0x02, 0x55, 0x0f, 0xfd,
+ 0x00, 0x21, 0x34, 0x44, 0x20, 0x10, 0x20, 0x11, 0x44, 0x67, 0x22, 0x21,
+ 0x12, 0x01, 0xf1, 0xf1,
+ 0x13, 0x75, 0x00, 0x0e, 0x00, 0x21, 0x1f, 0x20, 0x42, 0xfc, 0xed, 0x34,
+ 0x01, 0xcd, 0x00, 0x34,
+ 0x10, 0x00, 0x20, 0xec, 0xfd, 0xfc, 0x7e, 0x74, 0x1e, 0xf8, 0x00, 0x20,
+ 0x0f, 0xcd, 0x13, 0x13,
+ 0xe0, 0x00, 0x01, 0xf0, 0x16, 0x22, 0xad, 0xfe, 0x52, 0x12, 0x10, 0x10,
+ 0x11, 0x00, 0x0e, 0x2f,
+ 0x37, 0x23, 0xe1, 0x9f, 0xf1, 0x27, 0xf0, 0x9e, 0x00, 0x01, 0x02, 0x03,
+ 0x02, 0x01, 0x01, 0x02,
+ 0x03, 0x00, 0xca, 0xee, 0x23, 0x46, 0x10, 0xff, 0x00, 0xf0, 0xbd, 0x0d,
+ 0x43, 0x11, 0x0e, 0xf0,
+ 0x05, 0x67, 0x11, 0xde, 0x0f, 0x21, 0x23, 0xf0, 0xb0, 0xdd, 0xb9, 0xff,
+ 0x01, 0x00, 0xcd, 0xff,
+ 0x00, 0xfe, 0xf0, 0x33, 0x21, 0x10, 0x00, 0xff, 0x34, 0x66, 0x00, 0xed,
+ 0x20, 0x30, 0xfe, 0xfc,
+ 0x41, 0x41, 0x0f, 0x3f, 0x56, 0x02, 0x00, 0x01, 0xe0, 0xbc, 0x00, 0x22,
+ 0x0e, 0xca, 0x31, 0x40,
+ 0xc8, 0x0f, 0x60, 0x00, 0x10, 0x1f, 0x1f, 0x1e, 0x0e, 0xed, 0x00, 0x22,
+ 0x0f, 0x88, 0xed, 0xdd,
+ 0x0f, 0x00, 0x00, 0x2f, 0x3f, 0xfc, 0xfe, 0x0f, 0xff, 0x00, 0x62, 0x22,
+ 0x00, 0x00, 0x98, 0xdc,
+ 0x00, 0x00, 0x00, 0x0f, 0x0e, 0x0c, 0x00, 0x23, 0x22, 0xbe, 0xe0, 0x04,
+ 0x02, 0xe5, 0xc3, 0x91,
+ 0xe1, 0x07, 0xd1, 0xc0, 0xf0, 0xe0, 0xd0, 0x12, 0x53, 0x12, 0x0e, 0xea,
+ 0x20, 0x51, 0x22, 0x11,
+ 0x10, 0x0d, 0x20, 0x43, 0x01, 0xdc, 0xe0, 0x04, 0xf0, 0xd0, 0xe1, 0xa0,
+ 0xe0, 0xf0, 0x03, 0x17,
+ 0x15, 0x11, 0x00, 0x02, 0xc2, 0xc2, 0x24, 0xf0, 0xcf, 0x11, 0x13, 0xbe,
+ 0xca, 0xdc, 0xee, 0x72,
+ 0x23, 0x0f, 0xed, 0xed, 0xeb, 0x00, 0x00, 0xdb, 0x0f, 0x31, 0x00, 0x8b,
+ 0xed, 0x0f, 0x10, 0x20,
+ 0x10, 0x2f, 0x3f, 0x0b, 0x1f, 0x62, 0x00, 0x0b, 0xed, 0x0e, 0x00, 0xee,
+ 0xbc, 0xff, 0x10, 0xff,
+ 0xbc, 0x11, 0x56, 0x00, 0x00, 0xf0, 0x00, 0xef, 0x00, 0xff, 0xbb, 0xdd,
+ 0xcc, 0x00, 0x23, 0xed,
+ 0xa8, 0x00, 0x10, 0x10, 0xf0, 0x00, 0xc0, 0xf0, 0x13, 0xdf, 0xf0, 0xf2,
+ 0x9d, 0x03, 0x15, 0xed,
+ 0x00, 0x24, 0x00, 0xed, 0x23, 0x26, 0x00, 0x31, 0x20, 0x62, 0x23, 0xfe,
+ 0xec, 0x01, 0x45, 0x11,
+ 0xf0, 0xae, 0xdb, 0x00, 0x32, 0xfe, 0xff, 0x0f, 0x2e, 0x71, 0x21, 0x13,
+ 0x13, 0x01, 0xff, 0x00,
+ 0x57, 0x05, 0xe0, 0xef, 0xfe, 0xce, 0xfe, 0x11, 0x64, 0x00, 0xfb, 0x0e,
+ 0x20, 0x10, 0xed, 0xdd,
+ 0xce, 0xed, 0x22, 0x30, 0xb8, 0xfe, 0x00, 0x31, 0x0f, 0x0e, 0x70, 0x63,
+ 0x14, 0x1f, 0xf8, 0xf0,
+ 0x21, 0x00, 0xef, 0x00, 0x01, 0xd0, 0xe0, 0xcf, 0xef, 0x34, 0x43, 0x0f,
+ 0x0e, 0x42, 0x47, 0x00,
+ 0x0f, 0x30, 0x54, 0x01, 0x22, 0x24, 0xcf, 0xd0, 0x35, 0x54, 0x12, 0x01,
+ 0xf0, 0x01, 0x42, 0x23,
+ 0x23, 0x12, 0x32, 0x54, 0x11, 0x13, 0x27, 0x11, 0x32, 0x12, 0xd0, 0xc1,
+ 0x05, 0xe0, 0xb0, 0x13,
+ 0x02, 0x12, 0x11, 0x0e, 0x2f, 0x3e, 0x4e, 0x73, 0x23, 0x0c, 0xdb, 0xdf,
+ 0xdd, 0xcd, 0xff, 0xb9,
+ 0xde, 0x11, 0x01, 0xcd, 0xed, 0x56, 0x12, 0xef, 0xe0, 0x00, 0x24, 0x41,
+ 0x00, 0x10, 0x33, 0x62,
+ 0x33, 0x31, 0x43, 0x30, 0x0b, 0x1d, 0x43, 0x21, 0x0d, 0x0f, 0x0d, 0xc8,
+ 0xef, 0x00, 0xe1, 0xdf,
+ 0x99, 0x0f, 0x0f, 0xdd, 0x0d, 0x2f, 0xfe, 0x0f, 0x0e, 0xfb, 0x20, 0x00,
+ 0x8d, 0xcc, 0x02, 0x03,
+ 0xdb, 0xcd, 0x00, 0x02, 0xbd, 0x00, 0x25, 0x20, 0x20, 0x10, 0x33, 0x00,
+ 0xfe, 0x35, 0x33, 0xf0,
+ 0xe0, 0x55, 0x35, 0xf1, 0xf0, 0xf1, 0x00, 0x62, 0x32, 0x33, 0x21, 0x01,
+ 0x05, 0x45, 0xf0, 0xa0,
+ 0xff, 0x01, 0x13, 0x04, 0xe1, 0xaf, 0xf0, 0x03, 0x02, 0xbb, 0xee, 0x12,
+ 0x20, 0x43, 0x33, 0x0c,
+ 0xfb, 0x0f, 0xfe, 0x00, 0x42, 0x01, 0xcf, 0xdf, 0xcf, 0xf0, 0x14, 0xfe,
+ 0xeb, 0x41, 0xff, 0x88,
+ 0xfd, 0x21, 0x33, 0xfe, 0xed, 0xf0, 0xef, 0x13, 0x33, 0xfe, 0xfd, 0x10,
+ 0x10, 0xde, 0x00, 0x77,
+ 0x40, 0xeb, 0xdd, 0x21, 0x13, 0x89, 0xff, 0x32, 0x00, 0x0e, 0xff, 0xee,
+ 0xfe, 0x20, 0x0d, 0x1d,
+ 0x50, 0x1f, 0x0c, 0x0f, 0x1d, 0x0b, 0x40, 0x73, 0x00, 0xfd, 0xfd, 0xe8,
+ 0xdd, 0xdd, 0x00, 0x00,
+ 0xbd, 0xdc, 0x20, 0x33, 0xcd, 0xb9, 0x00, 0x21, 0xf0, 0xe0, 0x00, 0xf1,
+ 0xce, 0xff, 0x22, 0x00,
+ 0xde, 0x00, 0x2e, 0x1c, 0x0c, 0xdd, 0x12, 0x77, 0x02, 0x13, 0x34, 0xf1,
+ 0xc0, 0x25, 0x76, 0x11,
+ 0xd0, 0xf0, 0x03, 0x22, 0x02, 0x00, 0xf2, 0x02, 0x33, 0x74, 0x21, 0x00,
+ 0x62, 0x37, 0x22, 0x22,
+ 0x00, 0x21, 0x51, 0x33, 0x01, 0xfe, 0xed, 0x32, 0x44, 0x0f, 0x20, 0x10,
+ 0x00, 0x35, 0x01, 0xf0,
+ 0x25, 0x23, 0x12, 0x02, 0xb0, 0xf0, 0x00, 0x2e, 0x77, 0x42, 0xdd, 0xec,
+ 0x40, 0x41, 0x32, 0x11,
+ 0x01, 0xf0, 0xce, 0x03, 0x06, 0xe0, 0xe0, 0xa0, 0xdd, 0xff, 0xff, 0xf0,
+ 0x00, 0x1f, 0x3f, 0x2b,
+ 0x0a, 0x2f, 0x70, 0x20, 0x3f, 0x40, 0x1e, 0x0b, 0x0f, 0x10, 0xfb, 0xac,
+ 0x00, 0x33, 0x11, 0xdd,
+ 0x0f, 0x20, 0xfe, 0xde, 0xe1, 0xc0, 0xc0, 0xd0, 0x98, 0x00, 0x02, 0xfe,
+ 0xff, 0xf0, 0x9c, 0xd9,
+ 0xef, 0x00, 0x00, 0xdf, 0xde, 0xef, 0x00, 0x0f, 0xee, 0xf0, 0xbc, 0xcc,
+ 0xd0, 0xe1, 0x01, 0x02,
+ 0xd0, 0x8c, 0xf0, 0x05, 0x00, 0xf0, 0x11, 0x10, 0x1e, 0x54, 0x0f, 0xd8,
+ 0x10, 0x64, 0x00, 0x0e,
+ 0xfe, 0xed, 0x00, 0x11, 0xfe, 0xed, 0xdd, 0xdd, 0x22, 0x33, 0xee, 0x99,
+ 0xee, 0xff, 0x00, 0x02,
+ 0xff, 0xdc, 0xee, 0xf0, 0x01, 0x22, 0x20, 0xdc, 0xbb, 0xff, 0x00, 0x00,
+ 0x00, 0xee, 0xbb, 0x20,
+ 0x51, 0xfe, 0xa9, 0x0f, 0x0e, 0xec, 0x1f, 0x72, 0x10, 0x0d, 0x0e, 0x10,
+ 0x0f, 0x0e, 0x11, 0xfe,
+ 0xda, 0xdf, 0xde, 0xaf, 0xee, 0xcd, 0xd9, 0xed, 0x0f, 0x41, 0x10, 0xfb,
+ 0x0e, 0x1f, 0x1f, 0x10,
+ 0x40, 0x20, 0x0f, 0x0f, 0x14, 0xe0, 0xae, 0x12, 0x57, 0x11, 0xdd, 0xee,
+ 0x23, 0x23, 0x11, 0x31,
+ 0x21, 0xfe, 0xdf, 0x01, 0x04, 0x02, 0xf3, 0xb4, 0xa2, 0xf7, 0xe4, 0xb0,
+ 0xc0, 0x01, 0x04, 0x01,
+ 0x02, 0x00, 0xee, 0x10, 0x56, 0x22, 0x01, 0xf0, 0xe1, 0x27, 0x32, 0xd0,
+ 0x01, 0x23, 0x02, 0xb0,
+ 0xce, 0x42, 0x44, 0x00, 0xff, 0x10, 0x1f, 0x10, 0x14, 0x35, 0x53, 0x11,
+ 0x00, 0x02, 0x55, 0x55,
+ 0x11, 0x00, 0x00, 0x21, 0x42, 0x21, 0x00, 0x0e, 0x20, 0x20, 0x1d, 0x1d,
+ 0x0c, 0x0d, 0x40, 0x0f,
+ 0xba, 0x00, 0x10, 0x0d, 0x1e, 0x70, 0x1f, 0x1d, 0x40, 0x18, 0x0c, 0x30,
+ 0x0f, 0x10, 0x20, 0xed,
+ 0x9c, 0x00, 0x11, 0x21, 0x00, 0xef, 0x13, 0x56, 0x00, 0xfd, 0xdc, 0xf1,
+ 0x37, 0x11, 0xd0, 0xff,
+ 0x20, 0xf0, 0xce, 0x20, 0x74, 0x11, 0x10, 0x1e, 0x40, 0x31, 0x31, 0x1f,
+ 0x70, 0x23, 0x10, 0x06,
+ 0x14, 0xd0, 0xbe, 0x03, 0x07, 0xf1, 0xe1, 0xd0, 0xb0, 0xe0, 0x04, 0x03,
+ 0x00, 0xee, 0x00, 0x43,
+ 0x05, 0x13, 0x36, 0x11, 0xf0, 0x02, 0x22, 0xf1, 0x80, 0x01, 0x34, 0x01,
+ 0x11, 0x54, 0x01, 0xf0,
+ 0xde, 0x0d, 0x0e, 0xcd, 0x05, 0x46, 0x11, 0x10, 0x52, 0x00, 0x00, 0x43,
+ 0x53, 0x31, 0x0e, 0x20,
+ 0x20, 0x10, 0x66, 0x22, 0x0d, 0xfe, 0x12, 0x10, 0xf9, 0x00, 0xe1, 0xb0,
+ 0xf0, 0x02, 0x33, 0x41,
+ 0x1d, 0x1a, 0x30, 0x2f, 0x1e, 0x3f, 0x2b, 0xfc, 0x0e, 0x20, 0x00, 0x9e,
+ 0xdc, 0xdd, 0xde, 0xee,
+ 0x0f, 0x0e, 0xfd, 0x0b, 0x4d, 0x60, 0x10, 0xfc, 0x0d, 0xfd, 0xfb, 0x0f,
+ 0x1f, 0x9d, 0xfd, 0x21,
+ 0xfd, 0xef, 0x01, 0xdb, 0x8b, 0x00, 0x00, 0x01, 0xee, 0x10, 0x51, 0xfd,
+ 0xd9, 0x03, 0x26, 0xe0,
+ 0xa0, 0x01, 0xf3, 0xe1, 0xf1, 0xf2, 0x02, 0x16, 0x02, 0x90, 0xff, 0x21,
+ 0x32, 0x22, 0x22, 0x22,
+ 0x00, 0x30, 0x31, 0x41, 0x45, 0x12, 0x01, 0xf0, 0xe0, 0xbf, 0x06, 0x12,
+ 0x8c, 0xe0, 0x03, 0xf2,
+ 0xe0, 0x04, 0xe1, 0xdf, 0x15, 0x33, 0xe0, 0x02, 0x76, 0x21, 0x12, 0x34,
+ 0x43, 0x35, 0x31, 0x21,
+ 0x32, 0x00, 0x01, 0x34, 0x11, 0xf0, 0xd0, 0xe0, 0xb0, 0xf0, 0x53, 0x20,
+ 0x4d, 0x60, 0x20, 0x00,
+ 0x0f, 0x08, 0x0e, 0x0d, 0x2f, 0x40, 0x0d, 0xa8, 0xfe, 0x0e, 0x0d, 0x0d,
+ 0x30, 0x2e, 0x0b, 0x0f,
+ 0x0e, 0x2f, 0x71, 0x00, 0xec, 0x00, 0x20, 0x0e, 0xff, 0xff, 0xbb, 0x00,
+ 0xf0, 0xcc, 0xbc, 0x00,
+ 0x10, 0x0c, 0xfc, 0xfd, 0xfd, 0x20, 0x43, 0x00, 0xdd, 0xad, 0xe0, 0xf7,
+ 0xd2, 0xa0, 0xe2, 0xe2,
+ 0xb0, 0xe0, 0x07, 0xf1, 0xef, 0xfe, 0x0f, 0x10, 0x35, 0x10, 0xfd, 0x10,
+ 0x21, 0xff, 0xee, 0x00,
+ 0x1f, 0xff, 0x8a, 0xec, 0xff, 0x0f, 0xfe, 0xfd, 0xfd, 0xdf, 0xad, 0xdb,
+ 0xde, 0xd0, 0xe0, 0xf1,
+ 0xbe, 0xce, 0x07, 0x05, 0xaf, 0xff, 0x00, 0x23, 0x01, 0x00, 0xf0, 0xdb,
+ 0x0f, 0x0f, 0x0e, 0xfd,
+ 0x0c, 0xaa, 0x0f, 0x30, 0x0f, 0x0f, 0x40, 0x2e, 0x3f, 0x2e, 0x0d, 0x50,
+ 0x54, 0x0e, 0xda, 0x10,
+ 0x31, 0xdd, 0xdb, 0x00, 0x0e, 0xdc, 0xce, 0x30, 0x40, 0xfd, 0xff, 0x2f,
+ 0x3e, 0x1f, 0x22, 0x0f,
+ 0x4e, 0x71, 0x30, 0x10, 0x47, 0x22, 0xf1, 0x26, 0x42, 0xcf, 0xde, 0x00,
+ 0x44, 0x33, 0x00, 0x1f,
+ 0x31, 0x41, 0x10, 0x13, 0x47, 0x25, 0xe0, 0xe1, 0xf1, 0xa1, 0xc0, 0xcf,
+ 0xd0, 0x47, 0x33, 0xdf,
+ 0xef, 0x10, 0xf0, 0x02, 0x76, 0x02, 0xf0, 0xe0, 0xe0, 0xe2, 0x03, 0xe2,
+ 0xd1, 0xf2, 0xf0, 0xef,
+ 0x00, 0x33, 0x20, 0xfd, 0x1f, 0x5e, 0x40, 0xea, 0xa9, 0x20, 0x62, 0x00,
+ 0xef, 0x01, 0x03, 0x20,
+ 0x00, 0x31, 0x44, 0x44, 0x33, 0x1f, 0x0a, 0x0f, 0x20, 0xcd, 0x05, 0x01,
+ 0x0b, 0x01, 0xf9, 0x00,
+ 0x57, 0xf4, 0xcf, 0xfb, 0x65, 0xf5, 0xfb, 0xf9, 0xaa, 0x00, 0x02, 0x0f,
+ 0xcd, 0x34, 0x33, 0xdb,
+ 0xde, 0x01, 0x12, 0x00, 0x30, 0xcf, 0xbe, 0x24, 0x12, 0xbc, 0xf0, 0x04,
+ 0x11, 0xee, 0xed, 0x57,
+ 0x12, 0xbc, 0xf0, 0x10, 0x21, 0x11, 0x00, 0x00, 0xcc, 0xf0, 0x34, 0x10,
+ 0xd0, 0xf0, 0xdf, 0xef,
+ 0x42, 0x10, 0xfe, 0xdc, 0x00, 0xf0, 0x00, 0x23, 0x40, 0xfa, 0x00, 0xd1,
+ 0xd0, 0x80, 0xc2, 0x06,
+ 0x0d, 0xdf, 0x11, 0xe0, 0x9f, 0x02, 0x15, 0x0d, 0xfd, 0xef, 0x26, 0x52,
+ 0xde, 0xcb, 0x21, 0x22,
+ 0xf0, 0x11, 0x33, 0x89, 0xf0, 0x10, 0x01, 0xff, 0xf0, 0xce, 0x00, 0x14,
+ 0xe0, 0xe0, 0xef, 0xee,
+ 0xbd, 0xf0, 0x17, 0x02, 0xee, 0xdf, 0xf0, 0x00, 0x5f, 0x00, 0x02, 0x02,
+ 0x20, 0xfd, 0x88, 0x00,
+ 0x04, 0x01, 0xff, 0xdf, 0x11, 0x00, 0xdc, 0xd0, 0x66, 0x00, 0x0e, 0xef,
+ 0xdf, 0x53, 0x24, 0xff,
+ 0xde, 0xdc, 0xe0, 0x24, 0xe0, 0xba, 0x20, 0x12, 0xa0, 0x00, 0x00, 0xe0,
+ 0xf0, 0xfe, 0xdc, 0x02,
+ 0x66, 0xef, 0xde, 0xf0, 0xf2, 0xf0, 0xf0, 0xf3, 0x02, 0xee, 0x9b, 0xf0,
+ 0x04, 0xf0, 0xed, 0x41,
+ 0x32, 0xac, 0x10, 0x37, 0xdf, 0xee, 0x11, 0x33, 0xf0, 0xae, 0x01, 0x23,
+ 0xe0, 0xcc, 0x02, 0x21,
+ 0xfe, 0x00, 0xff, 0xee, 0xda, 0x10, 0x65, 0x00, 0xff, 0xdf, 0x00, 0x75,
+ 0x0f, 0x0e, 0xe0, 0x00,
+ 0x10, 0x42, 0xf0, 0xdc, 0x33, 0x1f, 0xf9, 0x31, 0x01, 0xcf, 0x42, 0x21,
+ 0xfd, 0xfe, 0xf0, 0x25,
+ 0x76, 0x1f, 0xec, 0x41, 0x53, 0x00, 0xfe, 0x0f, 0x11, 0x11, 0x20, 0x1f,
+ 0x0d, 0x74, 0x00, 0xc9,
+ 0x00, 0x53, 0x0e, 0x0e, 0x11, 0x22, 0x00, 0x22, 0x2e, 0x0c, 0x21, 0x20,
+ 0xed, 0x30, 0x76, 0x0d,
+ 0xff, 0x31, 0x0f, 0xfd, 0x23, 0x36, 0x40, 0x0d, 0x30, 0x54, 0x00, 0xfd,
+ 0x22, 0x65, 0x0e, 0x0f,
+ 0x10, 0x2f, 0xfe, 0x02, 0x57, 0x0f, 0xfd, 0x00, 0x21, 0x20, 0x44, 0x1f,
+ 0x0c, 0x10, 0x12, 0x33,
+ 0x50, 0x1f, 0xfc, 0x00, 0x21, 0x13, 0x00, 0x0d, 0xee, 0x11, 0x57, 0x20,
+ 0x0e, 0x00, 0x53, 0xe0,
+ 0x0d, 0x74, 0x13, 0x0c, 0x0f, 0x33, 0xfc, 0x1e, 0x53, 0x00, 0xfd, 0xf8,
+ 0xde, 0x62, 0x36, 0x00,
+ 0x0d, 0x00, 0x20, 0x11, 0x10, 0x32, 0xf0, 0xda, 0xf0, 0xe0, 0x02, 0x33,
+ 0xde, 0x9e, 0x31, 0x41,
+ 0x23, 0x20, 0x0f, 0x1a, 0xff, 0x21, 0x13, 0xdc, 0x40, 0x30, 0xf1, 0x8d,
+ 0xbd, 0x16, 0x11, 0x1d,
+ 0x1f, 0x23, 0xe2, 0xf3, 0x15, 0x00, 0x7e, 0x1c, 0xfd, 0xf2, 0x03, 0x0e,
+ 0xeb, 0x00, 0x32, 0xdd,
+ 0xbd, 0x57, 0xe1, 0xbc, 0x00, 0x22, 0x10, 0xfe, 0x25, 0x00, 0xbc, 0x00,
+ 0x24, 0x10, 0xe0, 0xcf,
+ 0x01, 0x00, 0xad, 0x03, 0x04, 0x0c, 0x00, 0x05, 0x00, 0x1d, 0xde, 0x02,
+ 0x02, 0xee, 0x20, 0x57,
+ 0xc0, 0xcc, 0x00, 0x02, 0xd0, 0x11, 0x03, 0xaf, 0xfe, 0x22, 0xff, 0xdd,
+ 0x02, 0x15, 0x00, 0xac,
+ 0xff, 0x43, 0x00, 0xee, 0x01, 0x01, 0xca, 0xdf, 0x12, 0x74, 0xff, 0xec,
+ 0x02, 0x23, 0xc8, 0xff,
+ 0x23, 0xd0, 0xab, 0x11, 0x10, 0xf1, 0xd0, 0x00, 0x21, 0x00, 0xec, 0x01,
+ 0x23, 0x22, 0x00, 0xfd,
+ 0xd0, 0xd0, 0xe0, 0xd0, 0x8c, 0x01, 0x04, 0xc9, 0xef, 0x52, 0x01, 0xcf,
+ 0x1f, 0x10, 0x00, 0x01,
+ 0x24, 0x01, 0xde, 0xcb, 0x22, 0x10, 0xad, 0xe0, 0x27, 0x00, 0x9e, 0x00,
+ 0x00, 0xfe, 0x03, 0x00,
+ 0xff, 0x12, 0x00, 0x00, 0x55, 0xed, 0x0f, 0x04, 0xf0, 0x00, 0xff, 0xee,
+ 0xac, 0x01, 0x37, 0xf1,
+ 0xbc, 0x30, 0x11, 0x20, 0xf0, 0xdf, 0x00, 0x20, 0x00, 0x0f, 0x45, 0xc0,
+ 0xd0, 0xf0, 0xee, 0x9d,
+ 0xf0, 0x16, 0x10, 0x02, 0xab, 0xff, 0xf1, 0xf3, 0xfd, 0x34, 0x33, 0xee,
+ 0xac, 0x00, 0x04, 0x01,
+ 0x20, 0xfe, 0xbe, 0x03, 0x14, 0x1c, 0x00, 0x03, 0xfc, 0xbd, 0x02, 0x12,
+ 0x12, 0x0e, 0xed, 0xe0,
+ 0xe3, 0xad, 0xff, 0xf4, 0x0d, 0x2c, 0x41, 0x03, 0xf5, 0x15, 0x40, 0x1d,
+ 0x1e, 0x10, 0xe0, 0xdd,
+ 0x14, 0x60, 0xe8, 0xff, 0x00, 0xde, 0x10, 0x66, 0x00, 0x0e, 0x10, 0x41,
+ 0x00, 0xe0, 0x40, 0x20,
+ 0x10, 0x31, 0xfa, 0xef, 0x02, 0x41, 0x1e, 0x09, 0x72, 0x12, 0xed, 0xed,
+ 0x01, 0x44, 0x74, 0x10,
+ 0xda, 0xe0, 0x22, 0x11, 0xe0, 0xf0, 0x11, 0xf0, 0xde, 0xed, 0x0f, 0x73,
+ 0x13, 0xdc, 0x0e, 0x53,
+ 0x32, 0x0d, 0x0d, 0x35, 0xf2, 0xe1, 0x64, 0x14, 0x2f, 0x1d, 0xfb, 0xe0,
+ 0xf2, 0x13, 0x00, 0xfa,
+ 0x01, 0xd0, 0x80, 0x04, 0x53, 0xfd, 0x11, 0x43, 0xda, 0xde, 0x13, 0x64,
+ 0x0e, 0xec, 0x11, 0x23,
+ 0xfd, 0xdd, 0x12, 0x43, 0x0c, 0x0e, 0x42, 0xf3, 0xde, 0xf1, 0x02, 0xdb,
+ 0x20, 0x72, 0x00, 0xee,
+ 0x01, 0x44, 0x10, 0x2e, 0x47, 0x00, 0x0f, 0xee, 0x55, 0x42, 0xfe, 0xed,
+ 0x23, 0x10, 0x0a, 0x32,
+ 0x31, 0x0d, 0x20, 0x40, 0x0e, 0x41, 0x30, 0xfa, 0x30, 0x51, 0x0f, 0x20,
+ 0x3f, 0x0b, 0x51, 0x33,
+ 0xfc, 0xcd, 0x24, 0x31, 0x0d, 0x0f, 0x21, 0x01, 0x10, 0x71, 0x31, 0x0f,
+ 0x62, 0x35, 0x01, 0x14,
+ 0x3e, 0x0d, 0x10, 0x23, 0x3f, 0x1c, 0x0f, 0x43, 0x10, 0x2c, 0x3d, 0x44,
+ 0x47, 0x13, 0xeb, 0xcd,
+ 0x40, 0x55, 0x01, 0x01, 0x20, 0xec, 0xde, 0x00, 0x00, 0x21, 0x55, 0x00,
+ 0xac, 0x00, 0x14, 0x21,
+ 0x00, 0xed, 0x01, 0x00, 0x21, 0x0e, 0x11, 0x14, 0xff, 0x0b, 0x00, 0x2f,
+ 0x71, 0x40, 0xf0, 0xe1,
+ 0x02, 0x20, 0x2c, 0xe0, 0xe2, 0x90, 0xdc, 0xf0, 0xee, 0xb0, 0x17, 0x10,
+ 0xeb, 0xc0, 0x14, 0x12,
+ 0xcd, 0xac, 0x01, 0x25, 0xe0, 0xee, 0x02, 0x0f, 0x9b, 0x22, 0x01, 0xdf,
+ 0x00, 0x00, 0xed, 0x00,
+ 0x07, 0xf0, 0xce, 0x11, 0x13, 0xde, 0x20, 0x73, 0x10, 0xf0, 0xed, 0x01,
+ 0x01, 0xd8, 0x00, 0x71,
+ 0xf0, 0xcb, 0x00, 0x02, 0x31, 0x22, 0x0e, 0xbc, 0x11, 0x22, 0xf0, 0xfe,
+ 0x02, 0x00, 0x00, 0xd0,
+ 0xf3, 0xc1, 0xed, 0x1f, 0x4f, 0x10, 0x42, 0xfe, 0xbb, 0x15, 0x41, 0x20,
+ 0x00, 0x37, 0x00, 0xde,
+ 0xd0, 0x2f, 0x0c, 0x00, 0xf7, 0xd2, 0xbf, 0x20, 0x11, 0x9f, 0xfe, 0x11,
+ 0x35, 0xe0, 0xed, 0x00,
+ 0x10, 0xe4, 0xb0, 0xed, 0x00, 0x20, 0x0f, 0x73, 0x57, 0xfe, 0xa8, 0x00,
+ 0x21, 0x11, 0x01, 0xee,
+ 0xdd, 0xf0, 0x11, 0xef, 0x00, 0x57, 0xdf, 0xac, 0x00, 0x14, 0x11, 0x00,
+ 0x0e, 0xc0, 0xf0, 0x02,
+ 0x31, 0xfe, 0xbd, 0x00, 0x02, 0xed, 0xfe, 0x32, 0x00, 0xbf, 0xfc, 0xe0,
+ 0x07, 0xf2, 0x0f, 0x0e,
+ 0x00, 0xe1, 0xd0, 0xdf, 0x00, 0xf5, 0xd0, 0xcb, 0xdf, 0xaf, 0xf2, 0xf0,
+ 0xf0, 0xbd, 0xc0, 0x03,
+ 0x17, 0x31, 0xfe, 0x00, 0x0f, 0x8c, 0x03, 0xf7, 0x00, 0xdd, 0x00, 0x01,
+ 0x00, 0xd1, 0xc0, 0xf0,
+ 0xfd, 0x00, 0x30, 0x00, 0xb0, 0xe4, 0xe1, 0x10, 0x25, 0xbe, 0xee, 0x21,
+ 0xec, 0x8c, 0x04, 0x35,
+ 0xfe, 0x9c, 0x00, 0x01, 0x02, 0x02, 0x00, 0x0b, 0xd0, 0xf0, 0xf3, 0xe1,
+ 0xf1, 0xde, 0x9a, 0x02,
+ 0x02, 0xf1, 0xe0, 0x0e, 0x0c, 0x02, 0xe4, 0xbf, 0x0e, 0xf0, 0xf0, 0xe3,
+ 0xd0, 0xdf, 0xbb, 0xf0,
+ 0xc2, 0xef, 0xdb, 0x11, 0x13, 0xe0, 0xf0, 0x00, 0x00, 0xae, 0xed, 0x16,
+ 0x22, 0xe0, 0xce, 0xec,
+ 0x2f, 0x35, 0xa1, 0xc0, 0x0e, 0xec, 0xcb, 0x02, 0xf3, 0xef, 0xff, 0x1f,
+ 0xed, 0xe1, 0x07, 0x00,
+ 0x80, 0xfd, 0x02, 0x00, 0xe1, 0x01, 0xe1, 0xa1, 0xda, 0xf0, 0x32, 0x0e,
+ 0xeb, 0xe1, 0xe1, 0xa0,
+ 0x00, 0x03, 0xef, 0xff, 0x13, 0x04, 0x9d, 0xed, 0xf2, 0x00, 0xdb, 0xee,
+ 0x04, 0xe1, 0x02, 0x55,
+ 0xda, 0xe0, 0x31, 0xe2, 0xde, 0x61, 0x25, 0xde, 0xff, 0x10, 0x00, 0xb1,
+ 0xdf, 0x00, 0x00, 0xcc,
+ 0x02, 0x35, 0xf0, 0xb0, 0xec, 0x01, 0x34, 0x00, 0xf1, 0xe0, 0x00, 0x2f,
+ 0x50, 0xed, 0x11, 0x77,
+ 0xf0, 0xf9, 0x30, 0x21, 0xe0, 0x01, 0x00, 0xef, 0x01, 0x10, 0x1f, 0x3f,
+ 0x51, 0x00, 0xe0, 0x0e,
+ 0x72, 0x51, 0x1f, 0xfc, 0x02, 0x35, 0x40, 0x01, 0x11, 0x43, 0x32, 0x0f,
+ 0x0c, 0x31, 0x43, 0x3f,
+ 0x2b, 0x2e, 0x5d, 0x43, 0x20, 0xf8, 0x09, 0x72, 0x32, 0x21, 0x20, 0x0c,
+ 0x00, 0x52, 0x10, 0x0e,
+ 0x1e, 0x30, 0x10, 0x20, 0x0d, 0x3f, 0x71, 0x23, 0x0f, 0x19, 0x30, 0x31,
+ 0x21, 0x37, 0x42, 0x30,
+ 0x3d, 0x5f, 0x10, 0x20, 0x52, 0x1f, 0x09, 0x10, 0x21, 0x52, 0x10, 0x1e,
+ 0x1b, 0x20, 0x75, 0x11,
+ 0x1f, 0x1e, 0x02, 0x10, 0x0e, 0x20, 0x42, 0x11, 0x0e, 0x20, 0x11, 0x1d,
+ 0x42, 0x10, 0x1a, 0x41,
+ 0x56, 0xff, 0x00, 0x04, 0x30, 0x0c, 0x0f, 0x10, 0x31, 0x52, 0x0f, 0x0c,
+ 0x51, 0x11, 0x2f, 0x10,
+ 0x0f, 0x1e, 0x63, 0x00, 0x0d, 0x25, 0x10, 0x10, 0x00, 0xff, 0xf8, 0x5f,
+ 0x25, 0xc0, 0xe0, 0x20,
+ 0x1d, 0x00, 0x11, 0x55, 0xef, 0xf0, 0x0f, 0x1f, 0x4f, 0x11, 0x03, 0xfe,
+ 0xaa, 0x02, 0x25, 0x0e,
+ 0xdc, 0x21, 0x11, 0x00, 0x51, 0x43, 0x0d, 0xec, 0xff, 0x13, 0x46, 0x30,
+ 0x00, 0xec, 0x10, 0xf0,
+ 0xb0, 0x0f, 0x5e, 0x00, 0x0f, 0x00, 0xe0, 0x07, 0x22, 0xff, 0xde, 0xe1,
+ 0xf1, 0x02, 0xe0, 0x8c,
+ 0xae, 0xf0, 0x03, 0xf1, 0x00, 0x2d, 0xec, 0xce, 0x17, 0x13, 0xd0, 0x11,
+ 0x76, 0x0e, 0xfd, 0xf0,
+ 0xf0, 0xf2, 0xe2, 0x12, 0x2e, 0xcc, 0xde, 0x00, 0x57, 0x12, 0xf1, 0xbf,
+ 0xec, 0x12, 0x03, 0xd0,
+ 0xd2, 0x52, 0xec, 0xcb, 0x11, 0x34, 0xff, 0xdc, 0x20, 0x30, 0x02, 0x00,
+ 0xff, 0x8b, 0xc0, 0x21,
+ 0x10, 0x0d, 0xf3, 0xe1, 0xab, 0xf0, 0xe5, 0x00, 0x0f, 0xff, 0xf1, 0xd0,
+ 0x0d, 0x21, 0x13, 0x11,
+ 0x00, 0xda, 0x00, 0x33, 0x60, 0x0f, 0x8c, 0xf0, 0xe0, 0x14, 0x00, 0xcf,
+ 0xec, 0x11, 0x63, 0xfe,
+ 0xfd, 0x02, 0xe0, 0xe9, 0x01, 0x33, 0xd0, 0xc1, 0xf4, 0xfe, 0xdb, 0xd0,
+ 0x10, 0x10, 0x20, 0xe1,
+ 0xc0, 0x0f, 0xab, 0x00, 0x44, 0x22, 0xf0, 0xbe, 0xfe, 0x03, 0x47, 0xf0,
+ 0xcf, 0x00, 0xdf, 0x01,
+ 0x17, 0x00, 0x0c, 0xf0, 0x01, 0xf0, 0x41, 0xde, 0xbd, 0x21, 0x10, 0xb0,
+ 0xf6, 0x00, 0x00, 0xee,
+ 0xb0, 0x00, 0x01, 0x01, 0x00, 0xa8, 0xf0, 0x23, 0x01, 0xdd, 0xbe, 0xf1,
+ 0xc3, 0x02, 0x1f, 0x0f,
+ 0x01, 0x03, 0xee, 0xf0, 0x07, 0x07, 0xef, 0x0d, 0x40, 0xef, 0xdf, 0x02,
+ 0xf3, 0x8d, 0xdc, 0x02,
+ 0x21, 0xdd, 0xe0, 0x35, 0xee, 0xb0, 0x01, 0xee, 0x0e, 0x67, 0x31, 0xf0,
+ 0xde, 0x10, 0xff, 0xcd,
+ 0x23, 0x24, 0xed, 0xd0, 0xce, 0x00, 0x76, 0x40, 0xda, 0xf0, 0x3f, 0x31,
+ 0x12, 0x0d, 0x0f, 0x01,
+ 0x02, 0x01, 0x57, 0x00, 0xef, 0xfb, 0xf0, 0x00, 0x74, 0x30, 0xce, 0x0f,
+ 0x11, 0x31, 0xdd, 0xdf,
+ 0x74, 0x10, 0xfb, 0xf0, 0x22, 0x24, 0xdf, 0xab, 0x00, 0x10, 0x22, 0x11,
+ 0x00, 0x0f, 0x2e, 0x7f,
+ 0x00, 0x13, 0x02, 0x22, 0xfe, 0x0d, 0xfd, 0x11, 0x37, 0xe5, 0xdf, 0xee,
+ 0xfe, 0x70, 0x33, 0x0e,
+ 0xfd, 0x35, 0xd0, 0xaf, 0x0f, 0xf2, 0x05, 0x0f, 0xbd, 0x00, 0x07, 0x01,
+ 0x00, 0x00, 0x20, 0x13,
+ 0x40, 0x0e, 0xed, 0x00, 0x30, 0xf1, 0xbf, 0x00, 0x2e, 0x1a, 0x70, 0xe0,
+ 0xdc, 0x14, 0x35, 0x10,
+ 0xfc, 0xb0, 0x22, 0x52, 0x1f, 0x10, 0x42, 0x00, 0x0e, 0x00, 0x30, 0x30,
+ 0x13, 0xfe, 0x1c, 0x66,
+ 0x02, 0x00, 0x09, 0x2f, 0x3f, 0x40, 0x60, 0x23, 0x00, 0x0d, 0x2f, 0x2f,
+ 0x40, 0x32, 0x0b, 0x10,
+ 0x41, 0x0e, 0x0b, 0x10, 0x00, 0x70, 0x10, 0xe8, 0x0f, 0x62, 0x33, 0x00,
+ 0x10, 0x00, 0x0a, 0x21,
+ 0x43, 0x10, 0x00, 0x10, 0xf0, 0xfe, 0x10, 0x73, 0x10, 0x0a, 0xfe, 0x10,
+ 0x54, 0x10, 0x2e, 0x0f,
+ 0xf0, 0xe4, 0x03, 0x32, 0x40, 0xfb, 0xcf, 0x30, 0x76, 0x10, 0x0d, 0x01,
+ 0x14, 0x10, 0x00, 0x00,
+ 0x0d, 0x13, 0x13, 0xbb, 0xef, 0xf0, 0x21, 0x44, 0xdd, 0x0e, 0x32, 0x63,
+ 0x0f, 0xee, 0x1f, 0x0c,
+ 0x0e, 0x31, 0x02, 0xb0, 0x17, 0x35, 0x8a, 0xef, 0x02, 0x00, 0xd0, 0xff,
+ 0xdf, 0xde, 0x02, 0x03,
+ 0x20, 0xf0, 0xbd, 0xfc, 0xee, 0xe0, 0xf7, 0xe1, 0xa0, 0xf1, 0xf0, 0xbf,
+ 0x0f, 0x01, 0xd0, 0xcc,
+ 0x24, 0x22, 0xfd, 0xd0, 0xe1, 0xfd, 0x23, 0x34, 0x01, 0x11, 0xec, 0x8c,
+ 0xa0, 0x0f, 0x10, 0x12,
+ 0xff, 0xec, 0x03, 0xf0, 0x0e, 0x20, 0x09, 0xfe, 0x13, 0x41, 0xff, 0xf0,
+ 0xd3, 0xa0, 0xfe, 0xeb,
+ 0xef, 0xe3, 0x91, 0xfb, 0x11, 0x22, 0xf0, 0xe6, 0x22, 0x01, 0xf1, 0x0e,
+ 0xcc, 0xe0, 0x05, 0x00,
+ 0x9c, 0x00, 0x22, 0x25, 0xfe, 0x0f, 0x62, 0x03, 0xcd, 0xfe, 0x00, 0x07,
+ 0x46, 0xee, 0xdf, 0xd0,
+ 0xf0, 0xf1, 0x10, 0x12, 0x1f, 0x1c, 0x20, 0x42, 0xf3, 0xff, 0x3c, 0x0e,
+ 0x32, 0x74, 0x00, 0x0c,
+ 0xac, 0xcd, 0xf0, 0xf1, 0x06, 0xb1, 0xdf, 0xbc, 0xf0, 0x00, 0x00, 0x11,
+ 0x02, 0x25, 0x10, 0xdc,
+ 0xd0, 0x43, 0x11, 0xee, 0x8d, 0xf1, 0x04, 0x0f, 0xea, 0xdf, 0x00, 0xd0,
+ 0xdf, 0x52, 0x34, 0xee,
+ 0x01, 0x04, 0xce, 0xed, 0x24, 0x33, 0xbd, 0xda, 0xc0, 0xff, 0x03, 0xe1,
+ 0xef, 0xed, 0xed, 0x50,
+ 0x13, 0x00, 0x00, 0x46, 0x1f, 0xec, 0x00, 0x22, 0xf3, 0xb4, 0xbe, 0xfe,
+ 0x03, 0x14, 0x0e, 0xee,
+ 0x20, 0x1f, 0x40, 0x67, 0xf0, 0x0c, 0x00, 0xef, 0x10, 0x31, 0x54, 0xff,
+ 0x9a, 0x00, 0x00, 0x01,
+ 0x02, 0x10, 0x20, 0x0d, 0x80, 0x02, 0x00, 0x08, 0x00, 0xf2, 0xd1, 0x00,
+ 0x01, 0xe0, 0xcd, 0xe0,
+ 0x23, 0x05, 0xc1, 0xd0, 0xe0, 0xec, 0x02, 0x22, 0x20, 0x32, 0xde, 0x9e,
+ 0xfd, 0xc8, 0x00, 0x14,
+ 0xdf, 0xbd, 0xf1, 0xe3, 0xc0, 0x10, 0x40, 0xf1, 0xe0, 0xf0, 0xe9, 0xf0,
+ 0x06, 0x00, 0x90, 0xfe,
+ 0xed, 0xdf, 0xd0, 0x26, 0x10, 0xbe, 0xce, 0x00, 0x26, 0x00, 0xbf, 0x0e,
+ 0x0f, 0x00, 0xe0, 0xe1,
+ 0x13, 0x11, 0xad, 0xfb, 0x00, 0x11, 0xf2, 0x06, 0xf0, 0xd0, 0xf0, 0xdf,
+ 0xbd, 0x1f, 0x31, 0xe0,
+ 0xbf, 0x02, 0x11, 0xfb, 0xde, 0xb0, 0xe1, 0x00, 0x0f, 0x01, 0x13, 0xe9,
+ 0xce, 0xf0, 0xf6, 0x01,
+ 0xf0, 0x8e, 0xfe, 0x10, 0x02, 0xa1, 0x04, 0xee, 0xe9, 0xf0, 0x02, 0x54,
+ 0x20, 0x01, 0x0f, 0xef,
+ 0xfd, 0xf0, 0x44, 0x03, 0xdc, 0xf0, 0xf0, 0xf0, 0xef, 0x04, 0x92, 0xd0,
+ 0x02, 0x55, 0x0f, 0x00,
+ 0x24, 0x00, 0x25, 0x50, 0x0d, 0x0b, 0x00, 0x00, 0xd0, 0xdd, 0x22, 0x55,
+ 0xee, 0xbb, 0x10, 0x22,
+ 0x0f, 0x40, 0x41, 0x10, 0x11, 0x43, 0x00, 0x2e, 0x30, 0x53, 0x00, 0x01,
+ 0x34, 0x0f, 0x00, 0x73,
+ 0x09, 0x1e, 0x2f, 0x22, 0x44, 0x21, 0x19, 0x0e, 0x61, 0x24, 0x30, 0x1e,
+ 0x30, 0x0d, 0x00, 0x12,
+ 0x61, 0x0e, 0x1a, 0x0f, 0x10, 0x23, 0x50, 0x3f, 0x20, 0x1c, 0x30, 0x63,
+ 0x0f, 0x00, 0x45, 0x21,
+ 0x10, 0x1c, 0x1b, 0x20, 0x44, 0x22, 0x1e, 0x2f, 0x60, 0x33, 0x43, 0x01,
+ 0x1c, 0x0d, 0x2c, 0x2e,
+ 0x51, 0x12, 0x0f, 0x1f, 0x51, 0x12, 0x31, 0x10, 0x1d, 0x26, 0x13, 0x00,
+ 0x1f, 0x19, 0x4e, 0x11,
+ 0x15, 0x12, 0x0d, 0x0f, 0x6f, 0x2b, 0x0e, 0x21, 0x05, 0x31, 0x61, 0x1d,
+ 0x1e, 0x32, 0x35, 0x41,
+ 0x20, 0x1d, 0x10, 0x0f, 0x0c, 0x74, 0x13, 0x0e, 0x0e, 0xff, 0x01, 0x01,
+ 0x22, 0x00, 0x37, 0x00,
+ 0x44, 0x35, 0xad, 0x3f, 0xee, 0x39, 0x61, 0x43, 0x26, 0x01, 0x72, 0x7f,
+ 0xf8, 0x0f, 0x22, 0x44,
+ 0xcf, 0xf0, 0x01, 0xdd, 0xfb, 0x31, 0x12, 0xb0, 0xfc, 0x10, 0x75, 0x01,
+ 0xf0, 0x0f, 0x40, 0x11,
+ 0x00, 0xee, 0x10, 0x36, 0xef, 0xff, 0x10, 0x00, 0xc0, 0xfc, 0xc0, 0x1e,
+ 0x34, 0x32, 0x00, 0xed,
+ 0x1d, 0x0f, 0xe0, 0x57, 0x00, 0x9e, 0x01, 0xf3, 0x0e, 0xfa, 0x11, 0x33,
+ 0xcf, 0xee, 0x01, 0x35,
+ 0x50, 0x11, 0x0f, 0xe0, 0xf0, 0x8c, 0x0e, 0x43, 0x10, 0x1f, 0x0e, 0xfe,
+ 0xe1, 0x35, 0x5f, 0x0d,
+ 0x06, 0xd1, 0xf0, 0x23, 0x67, 0xe0, 0xef, 0x0f, 0xdd, 0xd0, 0x12, 0x75,
+ 0x01, 0xce, 0xdb, 0xff,
+ 0x01, 0x44, 0x32, 0xff, 0x0d, 0x21, 0x33, 0x21, 0x55, 0xee, 0x8a, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0xdd, 0xf0, 0x00, 0x02, 0x3d, 0x20, 0x16, 0x30, 0x03, 0xd0, 0x0e, 0x70,
+ 0x53, 0xdb, 0xdf, 0x12,
+ 0x21, 0x0d, 0xe0, 0xfd, 0x1d, 0x40, 0x04, 0xd0, 0xe0, 0x02, 0x2e, 0x7e,
+ 0x36, 0x04, 0xd0, 0xdd,
+ 0xfe, 0x32, 0x21, 0xfd, 0x8f, 0xff, 0xe8, 0x2b, 0x00, 0x21, 0x55, 0x10,
+ 0x00, 0xcf, 0x00, 0x00,
+ 0x70, 0x01, 0xff, 0xef, 0x02, 0x0f, 0x0d, 0x11, 0x02, 0x00, 0x02, 0x17,
+ 0x23, 0x0e, 0xde, 0xf1,
+ 0xd5, 0x31, 0x53, 0x00, 0xb8, 0xfe, 0x21, 0x22, 0xf0, 0x0f, 0x0f, 0xce,
+ 0xff, 0x10, 0x67, 0x00,
+ 0xdf, 0x20, 0x30, 0xce, 0x00, 0x04, 0xb0, 0xdd, 0xfe, 0xfe, 0xe0, 0x37,
+ 0x75, 0x00, 0xfc, 0x00,
+ 0x74, 0x00, 0x0f, 0x32, 0x00, 0xee, 0xcf, 0x00, 0x11, 0x20, 0xef, 0xc0,
+ 0x10, 0xfe, 0xb8, 0x00,
+ 0x01, 0x51, 0x00, 0x01, 0x30, 0x0f, 0xe0, 0x14, 0x76, 0x0f, 0xcb, 0x00,
+ 0x01, 0x01, 0x0f, 0xdd,
+ 0xf0, 0xf0, 0x00, 0x10, 0x42, 0x31, 0x3c, 0x0e, 0x03, 0x67, 0x10, 0xce,
+ 0xcc, 0x02, 0x46, 0x2f,
+ 0xee, 0xd0, 0xe0, 0xd0, 0x01, 0x52, 0xfe, 0x1f, 0x42, 0x01, 0xee, 0xf0,
+ 0x01, 0xcb, 0x0f, 0x1e,
+ 0x2d, 0x00, 0x10, 0x03, 0xd1, 0x34, 0x50, 0xea, 0xaf, 0x14, 0x01, 0xed,
+ 0xee, 0x11, 0x15, 0xe1,
+ 0xef, 0x0e, 0x3d, 0x40, 0x54, 0x23, 0xfd, 0x9d, 0xfe, 0x02, 0x26, 0x50,
+ 0x00, 0xf2, 0xde, 0xec,
+ 0x12, 0x46, 0xef, 0xdd, 0x01, 0x02, 0xf2, 0xef, 0x20, 0x67, 0x00, 0x00,
+ 0x33, 0x30, 0x00, 0xff,
+ 0x23, 0x0f, 0xff, 0xc1, 0x14, 0x70, 0xea, 0x9b, 0x0e, 0x00, 0x10, 0x1e,
+ 0x20, 0x0e, 0xdf, 0x05,
+ 0x45, 0x10, 0xfe, 0x01, 0x13, 0x11, 0x23, 0x01, 0x8a, 0xef, 0x00, 0x00,
+ 0x43, 0x0f, 0x1f, 0x23,
+ 0x0f, 0xda, 0x30, 0x73, 0x00, 0xff, 0xf0, 0x0d, 0x00, 0x03, 0xa0, 0xec,
+ 0xfd, 0xfc, 0xec, 0x10,
+ 0x10, 0x20, 0x0f, 0xd8, 0x51, 0x43, 0xee, 0xfe, 0x03, 0x02, 0xbc, 0xff,
+ 0x04, 0x43, 0x20, 0xec,
+ 0xad, 0x23, 0x46, 0x0e, 0xce, 0x10, 0x00, 0xfe, 0x12, 0x36, 0x40, 0xfe,
+ 0xcc, 0xf0, 0x00, 0x05,
+ 0x51, 0x10, 0x0f, 0xef, 0xe2, 0xf2, 0x0f, 0x11, 0x32, 0xcc, 0xce, 0xf2,
+ 0x00, 0x00, 0x0f, 0xaa,
+ 0x00, 0x20, 0x21, 0xf3, 0xe2, 0x0d, 0x2c, 0x51, 0x00, 0x23, 0x05, 0xe0,
+ 0x12, 0x4f, 0xe9, 0x02,
+ 0x25, 0xaf, 0xec, 0x01, 0x00, 0xe0, 0xf0, 0x00, 0xef, 0x8c, 0x00, 0x00,
+ 0x02, 0x65, 0x20, 0x0e,
+ 0x10, 0x01, 0xe0, 0x10, 0x04, 0xf0, 0xbe, 0xfe, 0xfe, 0x1f, 0x1b, 0x00,
+ 0x10, 0x21, 0x73, 0x37,
+ 0x00, 0xce, 0x00, 0x24, 0x40, 0xf0, 0xdf, 0xdc, 0xba, 0x10, 0x72, 0x03,
+ 0x0f, 0x0d, 0xfe, 0x00,
+ 0x2f, 0xf0, 0xf4, 0x0f, 0x0c, 0x12, 0xf6, 0xee, 0xfe, 0x72, 0x10, 0xe0,
+ 0xd3, 0x14, 0x00, 0x1f,
+ 0xfe, 0xae, 0x03, 0x12, 0x10, 0x00, 0xe0, 0xda, 0x40, 0x6d, 0x1b, 0x10,
+ 0x03, 0xf0, 0xca, 0xf0,
+ 0x45, 0x32, 0x0f, 0x10, 0x02, 0xe0, 0xc0, 0x00, 0x23, 0x36, 0xc0, 0xaf,
+ 0xff, 0xe0, 0x13, 0x4f,
+ 0x0b, 0xe0, 0x15, 0x21, 0x75, 0x20, 0xee, 0xdd, 0xf0, 0x24, 0x11, 0x22,
+ 0x0f, 0xbb, 0xee, 0x0e,
+ 0x01, 0xa2, 0xec, 0x0f, 0x13, 0x2e, 0xec, 0x10, 0x44, 0x01, 0x21, 0x10,
+ 0x00, 0x14, 0x9e, 0xfb,
+ 0x1f, 0x20, 0xf0, 0xe2, 0x1f, 0x2c, 0xd0, 0x01, 0x70, 0x4f, 0x00, 0x07,
+ 0x05, 0xfc, 0xdf, 0x00,
+ 0x01, 0x30, 0xae, 0xfe, 0x05, 0x01, 0xef, 0x1f, 0x0d, 0x02, 0xd2, 0xae,
+ 0x0b, 0x40, 0x31, 0x13,
+ 0xfe, 0x00, 0x52, 0x10, 0x0b, 0x00, 0x00, 0x02, 0xe3, 0x34, 0x01, 0xae,
+ 0xed, 0xee, 0xe0, 0x37,
+ 0x64, 0x0e, 0xff, 0xce, 0xff, 0x20, 0x46, 0xe0, 0xce, 0xee, 0x0e, 0x22,
+ 0x77, 0x10, 0xff, 0xee,
+ 0x10, 0x00, 0xe0, 0xd0, 0xdf, 0x1f, 0x53, 0xef, 0xdb, 0x00, 0xfe, 0x33,
+ 0x74, 0x20, 0xf0, 0xf2,
+ 0x13, 0x43, 0x0f, 0xda, 0x15, 0x63, 0xef, 0xcb, 0xf0, 0x00, 0x20, 0x0e,
+ 0xee, 0x01, 0xf2, 0xdb,
+ 0xfd, 0x74, 0x34, 0x0f, 0xef, 0x12, 0x33, 0xfe, 0xfe, 0x14, 0x76, 0x0f,
+ 0xad, 0xff, 0xf1, 0x02,
+ 0x1d, 0x1e, 0x0d, 0x01, 0x34, 0xfd, 0x10, 0x77, 0x0f, 0x0c, 0x01, 0x14,
+ 0x01, 0xf0, 0xdd, 0xf0,
+ 0x00, 0x01, 0xf0, 0x11, 0xe0, 0xad, 0x0f, 0x21, 0x20, 0x10, 0xed, 0xf0,
+ 0x06, 0x1e, 0xba, 0x00,
+ 0x1f, 0x3f, 0x71, 0x03, 0xf0, 0xbd, 0x0d, 0x31, 0x0f, 0xb8, 0xf0, 0x15,
+ 0x33, 0x2e, 0xca, 0xc0,
+ 0x10, 0x23, 0x10, 0x00, 0x0e, 0xff, 0xf1, 0x43, 0x52, 0x01, 0xdc, 0xec,
+ 0x2f, 0x40, 0xf0, 0xe4,
+ 0x12, 0xaa, 0xd0, 0x14, 0x01, 0x00, 0xee, 0x54, 0x01, 0xf0, 0x01, 0xf0,
+ 0xe0, 0x40, 0x54, 0x00,
+ 0x02, 0x13, 0x50, 0xfc, 0xbb, 0x00, 0x20, 0x01, 0x0e, 0x0f, 0x00, 0x02,
+ 0xca, 0xfe, 0x30, 0x10,
+ 0x0d, 0x21, 0x47, 0x02, 0xd1, 0x04, 0xf0, 0xfc, 0xf0, 0xd0, 0x0f, 0x4f,
+ 0x31, 0x43, 0x21, 0xdf,
+ 0x30, 0x73, 0x50, 0xa9, 0x00, 0x02, 0x23, 0x10, 0xf0, 0xc0, 0xfe, 0x0b,
+ 0x30, 0x00, 0xcc, 0x0b,
+ 0x1e, 0x0f, 0xd0, 0x02, 0x01, 0x02, 0x4e, 0x09, 0xd0, 0x26, 0x72, 0x30,
+ 0xfc, 0xdf, 0x00, 0x02,
+ 0xef, 0xcf, 0x10, 0x1f, 0x0e, 0x00, 0xe0, 0xd0, 0xee, 0x5c, 0x50, 0xff,
+ 0x17, 0x04, 0xbf, 0xbc,
+ 0x00, 0x22, 0x10, 0x0d, 0x31, 0x03, 0xc0, 0xef, 0x32, 0x1f, 0xeb, 0xd2,
+ 0xe6, 0x80, 0xfb, 0x00,
+ 0x10, 0x02, 0x00, 0x00, 0xee, 0x0d, 0x60, 0x36, 0x10, 0x00, 0x2f, 0x51,
+ 0xe4, 0xb0, 0x00, 0x30,
+ 0x0e, 0xb1, 0x04, 0x01, 0xfc, 0x0e, 0xce, 0xfd, 0x31, 0x31, 0x10, 0x10,
+ 0xfa, 0xbe, 0x23, 0x24,
+ 0x10, 0x0e, 0xc0, 0xdf, 0x02, 0x02, 0xfe, 0xc9, 0x20, 0x51, 0x01, 0xbc,
+ 0x0e, 0x61, 0x00, 0x00,
+ 0xe6, 0x03, 0x0f, 0x1d, 0x12, 0x13, 0xfe, 0xf5, 0x22, 0x1c, 0xdc, 0x20,
+ 0x10, 0xf0, 0x22, 0x4e,
+ 0xfb, 0xb0, 0x02, 0x63, 0x10, 0x0d, 0xfb, 0xf0, 0x12, 0x54, 0x04, 0xa0,
+ 0xfb, 0x00, 0x20, 0x03,
+ 0xe2, 0x02, 0x1e, 0x2c, 0xdf, 0xbe, 0x02, 0x62, 0x00, 0x03, 0x01, 0xf8,
+ 0xdd, 0x22, 0x72, 0x00,
+ 0x10, 0x10, 0xfe, 0xda, 0x00, 0x17, 0x31, 0xcf, 0xbe, 0x01, 0x13, 0x12,
+ 0x0f, 0x0d, 0xef, 0xee,
+ 0x15, 0x10, 0xe1, 0x23, 0x3f, 0x2b, 0x71, 0x65, 0xf0, 0xe0, 0x0d, 0xff,
+ 0x02, 0x46, 0x00, 0xfe,
+ 0xbd, 0xe0, 0x01, 0xf0, 0xea, 0x10, 0x72, 0x00, 0xe0, 0x00, 0x00, 0x33,
+ 0xf2, 0xdf, 0xec, 0x01,
+ 0x21, 0x21, 0x22, 0x00, 0x88, 0xfe, 0x30, 0x61, 0x01, 0x01, 0x0d, 0x0c,
+ 0x21, 0x06, 0xf0, 0xe0,
+ 0xff, 0x1f, 0x50, 0x03, 0x04, 0xf1, 0xdc, 0xde, 0x01, 0x00, 0x40, 0xf0,
+ 0x9c, 0x0f, 0x12, 0x0e,
+ 0xeb, 0x30, 0x20, 0x04, 0x42, 0x43, 0x00, 0xcd, 0xf0, 0x00, 0x0e, 0x00,
+ 0xc6, 0x00, 0x6d, 0x00,
+ 0xe0, 0x00, 0x02, 0xdc, 0xf3, 0x17, 0xf2, 0x0f, 0x70, 0x12, 0x01, 0x00,
+ 0x08, 0xf0, 0x11, 0x40,
+ 0x1f, 0x10, 0xd1, 0xcc, 0xf0, 0xe0, 0x0f, 0x0a, 0xee, 0xd0, 0xc6, 0xf0,
+ 0x72, 0x71, 0x00, 0xcf,
+ 0x01, 0x10, 0x00, 0x36, 0x01, 0xcc, 0xff, 0x01, 0x12, 0x10, 0xee, 0xee,
+ 0x0c, 0xff, 0xcf, 0x10,
+ 0x71, 0x34, 0xf3, 0x04, 0xfc, 0xec, 0x23, 0x13, 0xee, 0xde, 0xe6, 0xc1,
+ 0x00, 0x0e, 0x3f, 0x62,
+ 0xf0, 0xfc, 0x62, 0x11, 0x0d, 0xf9, 0xf0, 0xe0, 0x24, 0x72, 0x0e, 0xeb,
+ 0x00, 0x12, 0x33, 0x00,
+ 0xee, 0xf0, 0xc0, 0xfb, 0x00, 0x42, 0x03, 0x90, 0x0b, 0x0f, 0x1e, 0x01,
+ 0x05, 0x00, 0x0c, 0x0f,
+ 0xb0, 0x0e, 0x00, 0x56, 0x10, 0x0f, 0x0c, 0x10, 0x23, 0xf1, 0xa0, 0xfe,
+ 0xed, 0x00, 0x31, 0xf5,
+ 0xe1, 0xe0, 0xdb, 0xe0, 0x22, 0x31, 0x70, 0x5e, 0xff, 0xf0, 0x01, 0x06,
+ 0x0e, 0x0e, 0xe0, 0xef,
+ 0xcf, 0x0d, 0x21, 0xe1, 0xc3, 0x35, 0x21, 0xa0, 0xf1, 0x15, 0x1e, 0x0f,
+ 0x76, 0x12, 0x00, 0xee,
+ 0x31, 0x57, 0x00, 0xce, 0x00, 0xf1, 0x0f, 0x0e, 0x00, 0x34, 0x01, 0x9f,
+ 0x0c, 0x1f, 0x1d, 0x00,
+ 0x35, 0x52, 0xfe, 0xcd, 0x00, 0x01, 0x15, 0x0f, 0xbc, 0x11, 0x45, 0x00,
+ 0xf0, 0x00, 0x20, 0x0f,
+ 0x0f, 0x12, 0x13, 0xff, 0xfa, 0xf0, 0x13, 0xef, 0x89, 0xf0, 0x0f, 0x00,
+ 0x04, 0xf0, 0xad, 0xff,
+ 0x0f, 0x41, 0x02, 0xe0, 0xdb, 0x0f, 0x20, 0x02, 0x42, 0x10, 0xf8, 0xe0,
+ 0x25, 0x50, 0x0e, 0x20,
+ 0x42, 0x00, 0xf0, 0x00, 0x0e, 0xee, 0xa0, 0xee, 0xe0, 0x04, 0x31, 0x2d,
+ 0xfc, 0xd0, 0x24, 0x73,
+ 0x4f, 0x0c, 0xe0, 0x15, 0x20, 0x00, 0xc1, 0xd3, 0xef, 0xbb, 0xef, 0x42,
+ 0x01, 0xbe, 0xfe, 0x00,
+ 0x04, 0xff, 0xd9, 0x0f, 0x42, 0x53, 0x00, 0x0b, 0xe0, 0x40, 0x77, 0x00,
+ 0xd0, 0xff, 0x00, 0x20,
+ 0x22, 0xf0, 0xbd, 0xff, 0x10, 0x20, 0x21, 0xf0, 0x0f, 0x10, 0x2e, 0x00,
+ 0x04, 0xc0, 0xeb, 0xd0,
+ 0xf0, 0xff, 0xd1, 0xd3, 0x02, 0x4d, 0x0b, 0x00, 0x0f, 0xed, 0x51, 0x73,
+ 0x00, 0xe6, 0x04, 0x20,
+ 0x1e, 0xfc, 0xf0, 0x53, 0x24, 0xd0, 0xf1, 0x31, 0x5a, 0x2f, 0x02, 0xf4,
+ 0x30, 0x1f, 0x99, 0xff,
+ 0x30, 0x62, 0x12, 0xdf, 0xbc, 0x00, 0x04, 0x20, 0x11, 0xff, 0xee, 0xff,
+ 0x00, 0x33, 0x10, 0xfe,
+ 0xf0, 0x00, 0x36, 0x42, 0xce, 0xde, 0x33, 0x52, 0xfd, 0x9a, 0x00, 0x24,
+ 0x0f, 0xea, 0x00, 0x61,
+ 0x12, 0xfd, 0x11, 0x46, 0x00, 0xdc, 0xe1, 0x03, 0x31, 0x00, 0xec, 0x80,
+ 0x03, 0x01, 0x00, 0x0d,
+ 0x20, 0x00, 0xe5, 0x20, 0x11, 0x52, 0x20, 0xfe, 0xfe, 0x05, 0x03, 0xd1,
+ 0xae, 0xfb, 0x0f, 0xff,
+ 0x10, 0x02, 0x14, 0x0c, 0xdb, 0x00, 0x22, 0x63, 0xf0, 0xae, 0xfe, 0x02,
+ 0x10, 0x20, 0x10, 0xf2,
+ 0xac, 0x0e, 0x0d, 0x02, 0x37, 0x2f, 0xfb, 0xe0, 0x00, 0x31, 0x71, 0x13,
+ 0x0e, 0xfa, 0x00, 0x42,
+ 0x24, 0x0f, 0xce, 0x00, 0x00, 0xbf, 0xff, 0x01, 0x03, 0xfd, 0x0f, 0xef,
+ 0x0c, 0x3f, 0x0f, 0xef,
+ 0xfd, 0xfd, 0x1b, 0x4d, 0x0d, 0x00, 0x77, 0x52, 0xee, 0xfe, 0x42, 0x14,
+ 0x02, 0xae, 0xf8, 0x00,
+ 0x27, 0x20, 0xd0, 0xdf, 0x0f, 0x00, 0x31, 0xe2, 0xe1, 0x00, 0x0d, 0x60,
+ 0x52, 0x0e, 0xff, 0x00,
+ 0x01, 0xe0, 0x20, 0x0c, 0xbb, 0x03, 0x12, 0x0a, 0x9d, 0x00, 0xf2, 0x00,
+ 0x03, 0x10, 0x42, 0x00,
+ 0x0e, 0xf3, 0x06, 0x12, 0x53, 0xf2, 0xd1, 0xf0, 0xd8, 0xcf, 0x0f, 0x21,
+ 0x50, 0x20, 0x22, 0xe0,
+ 0x0e, 0x30, 0x27, 0xd1, 0x10, 0x2f, 0xae, 0xc3, 0xe4, 0x0e, 0x3b, 0xef,
+ 0x8f, 0xd0, 0x0f, 0x33,
+ 0x47, 0x10, 0x0d, 0x00, 0x11, 0x10, 0x34, 0x60, 0xf8, 0xff, 0x00, 0x21,
+ 0x00, 0x00, 0x42, 0xdf,
+ 0xee, 0x01, 0xe2, 0x00, 0x74, 0x11, 0xe0, 0xcd, 0xfd, 0xe0, 0x01, 0x12,
+ 0x2c, 0xfe, 0xbe, 0x2f,
+ 0x45, 0x00, 0xe9, 0xcc, 0x1f, 0x73, 0x15, 0x00, 0xdf, 0xee, 0xfe, 0x0e,
+ 0x23, 0x15, 0xdd, 0xad,
+ 0x02, 0x14, 0x10, 0xdf, 0x20, 0x70, 0xfd, 0xdd, 0x25, 0x56, 0x10, 0x0d,
+ 0xe0, 0x00, 0xf0, 0xf1,
+ 0x00, 0xbb, 0xd0, 0x00, 0xf0, 0x00, 0xf2, 0xb0, 0xf0, 0x32, 0x57, 0x41,
+ 0x10, 0x10, 0xf1, 0x36,
+ 0x11, 0xd0, 0xf0, 0xfe, 0xe0, 0x10, 0x20, 0x00, 0x0b, 0xe0, 0xff, 0xe3,
+ 0x00, 0x7f, 0x3e, 0x03,
+ 0xe0, 0xec, 0xfd, 0xcf, 0x34, 0x65, 0x00, 0xce, 0x42, 0x30, 0x0f, 0x01,
+ 0x07, 0xd0, 0xaf, 0x1e,
+ 0x72, 0x16, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0xf1, 0x0f, 0x3d, 0x30,
+ 0x05, 0xf2, 0x90, 0xfa,
+ 0xee, 0x00, 0xfe, 0xe0, 0x07, 0xe0, 0xbe, 0x0e, 0x21, 0x01, 0xf0, 0x22,
+ 0x3f, 0x2d, 0x40, 0x40,
+ 0x05, 0xb1, 0xe0, 0x1b, 0x3d, 0x20, 0xdf, 0x8e, 0xed, 0x13, 0x53, 0xfe,
+ 0xca, 0x01, 0x00, 0x0e,
+ 0x00, 0x03, 0x0f, 0x02, 0x67, 0x0f, 0xdf, 0x01, 0x01, 0x1d, 0x1f, 0x00,
+ 0xc1, 0xd2, 0xed, 0xed,
+ 0xc9, 0xde, 0xff, 0xb3, 0xe2, 0x30, 0x75, 0x00, 0x20, 0x22, 0x01, 0xfe,
+ 0xe1, 0xe6, 0x22, 0x6f,
+ 0x0b, 0xbf, 0x00, 0x26, 0x11, 0x00, 0x2e, 0x1e, 0xef, 0xe2, 0x07, 0xb0,
+ 0xed, 0x0f, 0xf0, 0x01,
+ 0x56, 0x20, 0xcb, 0xbf, 0xed, 0x12, 0x32, 0x10, 0xdd, 0x01, 0x01, 0xe0,
+ 0x05, 0x00, 0x4e, 0x60,
+ 0x01, 0xc1, 0xff, 0x1f, 0x53, 0x14, 0xf0, 0xff, 0x0d, 0x1b, 0x30, 0x30,
+ 0xc2, 0x00, 0x00, 0x07,
+ 0x21, 0x3e, 0x0a, 0xc0, 0x01, 0x12, 0xfe, 0xed, 0xf1, 0x24, 0x71, 0x70,
+ 0x1e, 0xee, 0xf1, 0x06,
+ 0x00, 0xe0, 0xe0, 0x1d, 0x51, 0x03, 0xce, 0xf0, 0x15, 0x0d, 0xd8, 0xff,
+ 0x01, 0x01, 0x70, 0x0f,
+ 0x32, 0x33, 0xfd, 0xed, 0x67, 0x31, 0x00, 0xcf, 0xe0, 0xe0, 0xf0, 0xe0,
+ 0xe0, 0xee, 0x1d, 0x70,
+ 0x30, 0xe3, 0x05, 0x10, 0x3d, 0x0f, 0x57, 0x57, 0xe1, 0xb0, 0x00, 0x0f,
+ 0xee, 0x01, 0xd0, 0x00,
+ 0x31, 0x0d, 0xba, 0x01, 0x21, 0x21, 0x12, 0x00, 0xbd, 0x13, 0x47, 0x0f,
+ 0xfe, 0xe0, 0x01, 0xf0,
+ 0x9c, 0x0f, 0x13, 0x42, 0xfd, 0xed, 0x01, 0x20, 0x10, 0x65, 0x00, 0x0b,
+ 0x11, 0x03, 0x10, 0x30,
+ 0x0e, 0xbb, 0xe0, 0x26, 0x30, 0x00, 0x8d, 0x0f, 0x00, 0x01, 0x22, 0xe0,
+ 0xf0, 0xed, 0x0d, 0x01,
+ 0x00, 0x20, 0x30, 0xe8, 0xbd, 0x01, 0x0f, 0x1b, 0x53, 0x32, 0x1e, 0x40,
+ 0xe1, 0xb1, 0x17, 0x42,
+ 0x00, 0x10, 0xf1, 0xd0, 0x0f, 0x33, 0x35, 0xbf, 0x98, 0xf0, 0x12, 0x11,
+ 0x1f, 0x1f, 0x51, 0x02,
+ 0x0f, 0xff, 0xed, 0x01, 0x05, 0x00, 0x0d, 0xde, 0xdd, 0xcb, 0x00, 0x01,
+ 0x14, 0xe0, 0xee, 0x6e,
+ 0x42, 0xe5, 0xb0, 0x00, 0x41, 0x24, 0xef, 0xed, 0x10, 0x52, 0x01, 0xfd,
+ 0x0d, 0x0f, 0xec, 0xee,
+ 0x47, 0x65, 0xff, 0xce, 0x00, 0x02, 0x44, 0x00, 0xee, 0xef, 0x01, 0x00,
+ 0xbc, 0xf0, 0x13, 0x1e,
+ 0xfc, 0xf0, 0x21, 0x52, 0x1f, 0x1c, 0x21, 0x04, 0x00, 0x34, 0x41, 0xd9,
+ 0xcf, 0x00, 0xf0, 0x11,
+ 0x62, 0x00, 0x01, 0xe0, 0x0e, 0x02, 0x27, 0x0f, 0xed, 0x03, 0xf3, 0xbd,
+ 0x1e, 0x30, 0x31, 0xd0,
+ 0x98, 0xfd, 0x22, 0x53, 0xfe, 0xfd, 0x0f, 0xca, 0xd0, 0x14, 0x54, 0x20,
+ 0x0e, 0xef, 0xce, 0x22,
+ 0x03, 0x9c, 0xfc, 0x00, 0x00, 0x00, 0x10, 0x32, 0x0d, 0xea, 0x01, 0x75,
+ 0x52, 0xec, 0xfe, 0xf0,
+ 0xf1, 0x02, 0xf1, 0xfe, 0xff, 0xec, 0xbc, 0x00, 0x06, 0x20, 0x01, 0x01,
+ 0x51, 0x00, 0x66, 0x00,
+ 0x61, 0x27, 0x21, 0xfc, 0x72, 0x2a, 0xd8, 0x00, 0x32, 0x64, 0x26, 0x02,
+ 0xf1, 0x01, 0x10, 0x00,
+ 0xe0, 0xff, 0x3f, 0x67, 0xe0, 0xdd, 0x0f, 0x00, 0xee, 0xb0, 0x31, 0x53,
+ 0x00, 0x0b, 0xef, 0x0f,
+ 0x10, 0xe3, 0x00, 0x2e, 0x1d, 0xd1, 0x07, 0x70, 0x00, 0xed, 0xb0, 0x02,
+ 0x47, 0x00, 0xf0, 0x10,
+ 0x2f, 0x02, 0xe3, 0xce, 0xf8, 0x30, 0x62, 0xff, 0xf0, 0x00, 0x0e, 0xfd,
+ 0xde, 0x25, 0x63, 0xfd,
+ 0xcc, 0x01, 0x03, 0x01, 0xff, 0xcc, 0x00, 0x52, 0x01, 0xcd, 0x0c, 0x10,
+ 0x2f, 0xfb, 0xf1, 0x56,
+ 0x2f, 0x0e, 0x0f, 0x20, 0x13, 0xff, 0xae, 0xfd, 0x05, 0x02, 0xfe, 0xcc,
+ 0x21, 0x24, 0x00, 0xff,
+ 0xeb, 0x50, 0x44, 0x21, 0x11, 0x11, 0x01, 0xe0, 0xa0, 0x00, 0xf0, 0xdc,
+ 0xca, 0xff, 0x11, 0x43,
+ 0xf0, 0xee, 0x10, 0x0f, 0x88, 0x00, 0x20, 0x23, 0x13, 0x13, 0xf0, 0xf0,
+ 0xed, 0x0e, 0x32, 0x73,
+ 0x0d, 0xdf, 0xf4, 0x05, 0x11, 0x0b, 0xdd, 0x30, 0x01, 0xe1, 0x76, 0x50,
+ 0xdb, 0xc0, 0x00, 0x24,
+ 0x00, 0xfc, 0xce, 0x00, 0xf1, 0xf1, 0x11, 0x0e, 0x0e, 0x20, 0x20, 0x30,
+ 0x57, 0x11, 0xef, 0x10,
+ 0x62, 0x00, 0xf1, 0xf0, 0x0e, 0x10, 0xed, 0xf0, 0x40, 0xf0, 0x98, 0x0f,
+ 0x22, 0x23, 0x0e, 0x0e,
+ 0x01, 0x12, 0xf2, 0xe1, 0x00, 0x10, 0x08, 0x8d, 0x01, 0x65, 0x00, 0xff,
+ 0x00, 0x1f, 0xe1, 0x14,
+ 0x51, 0x02, 0xef, 0xdb, 0x00, 0x44, 0xff, 0xdb, 0x10, 0x63, 0x00, 0x0f,
+ 0x0c, 0x11, 0x42, 0x34,
+ 0xef, 0xdf, 0xf1, 0xf3, 0xd0, 0xb0, 0x0b, 0x20, 0x00, 0xbd, 0xfe, 0x63,
+ 0x11, 0xec, 0xe0, 0x00,
+ 0x00, 0x37, 0x07, 0x00, 0x00, 0x2f, 0x3f, 0x01, 0x03, 0xd0, 0x10, 0x40,
+ 0xda, 0x10, 0x53, 0xcf,
+ 0x9d, 0xf0, 0x12, 0x43, 0x01, 0xde, 0x00, 0x24, 0x0f, 0xec, 0x01, 0x02,
+ 0xcd, 0xdc, 0xe0, 0xf0,
+ 0xcd, 0x1f, 0x52, 0x0e, 0xdd, 0x00, 0x00, 0x60, 0x1c, 0x02, 0x07, 0x10,
+ 0x2c, 0x2f, 0x60, 0x14,
+ 0x04, 0x0e, 0x0c, 0x35, 0xe1, 0x8c, 0x00, 0x0f, 0x0f, 0x03, 0x03, 0xe0,
+ 0x0e, 0x0a, 0xfe, 0xc1,
+ 0x02, 0xed, 0x1b, 0x5e, 0x00, 0x04, 0x60, 0x1e, 0x2f, 0x00, 0xf0, 0x04,
+ 0x67, 0xf1, 0xbd, 0x00,
+ 0x01, 0xd1, 0xdf, 0x0f, 0x01, 0x23, 0x2d, 0x09, 0x30, 0x73, 0x00, 0x00,
+ 0x24, 0x0f, 0xcd, 0xef,
+ 0x26, 0x52, 0xfd, 0xbb, 0xf0, 0x00, 0x10, 0xfe, 0x00, 0x01, 0x00, 0xf1,
+ 0x22, 0x0f, 0xde, 0xc5,
+ 0x43, 0x64, 0x00, 0x0f, 0xfd, 0x10, 0x00, 0xfe, 0xde, 0x33, 0x52, 0xfb,
+ 0xf0, 0x37, 0x35, 0x00,
+ 0x0e, 0xf0, 0xa1, 0xe2, 0x05, 0xcf, 0xcb, 0x11, 0x42, 0xef, 0xcd, 0x00,
+ 0xf0, 0x00, 0x1f, 0x0c,
+ 0x60, 0x43, 0x05, 0xf0, 0x0f, 0x00, 0x1f, 0x10, 0x20, 0x40, 0x12, 0xc0,
+ 0xcd, 0x0e, 0x01, 0x47,
+ 0x13, 0xee, 0xca, 0x32, 0x40, 0xfe, 0xde, 0x07, 0xe0, 0xcf, 0x1d, 0x50,
+ 0x0e, 0x21, 0x01, 0xcd,
+ 0x0c, 0x40, 0xf0, 0x12, 0x61, 0x00, 0x04, 0xb1, 0xed, 0xf0, 0x07, 0x1e,
+ 0xfb, 0x90, 0xf0, 0x03,
+ 0x40, 0x1c, 0x10, 0x11, 0x0f, 0xf1, 0x25, 0x0d, 0xdd, 0x44, 0x24, 0xf0,
+ 0xd0, 0xbf, 0xeb, 0xfe,
+ 0x0e, 0x1f, 0xf1, 0xf3, 0x0d, 0x1f, 0x32, 0x50, 0x03, 0xd3, 0x90, 0x37,
+ 0x67, 0x01, 0xf0, 0x10,
+ 0x04, 0x01, 0x00, 0x00, 0xfe, 0xd0, 0x10, 0x1f, 0x00, 0x0f, 0xee, 0xd0,
+ 0x01, 0x3f, 0x0b, 0x00,
+ 0x45, 0x22, 0x00, 0xfc, 0x72, 0x77, 0xf1, 0xed, 0x0f, 0x2f, 0x12, 0x36,
+ 0x00, 0xdf, 0xce, 0x40,
+ 0x70, 0x34, 0x03, 0xcf, 0xfa, 0x30, 0x33, 0x0e, 0xdf, 0xf0, 0xdf, 0x20,
+ 0x60, 0x02, 0xb0, 0xe9,
+ 0x01, 0x34, 0xd0, 0xcf, 0x0f, 0xde, 0xed, 0x02, 0x03, 0xfd, 0xbb, 0x10,
+ 0x5f, 0x44, 0x11, 0xd8,
+ 0x0e, 0x52, 0x12, 0xe0, 0xef, 0x0f, 0x01, 0x21, 0xcf, 0xdb, 0x10, 0x32,
+ 0x0f, 0xde, 0x30, 0x61,
+ 0x21, 0xff, 0xf2, 0x07, 0x21, 0xac, 0xe0, 0x12, 0x02, 0xd0, 0xd0, 0xe0,
+ 0x0d, 0x0c, 0xee, 0xe0,
+ 0x31, 0x0d, 0x9a, 0x00, 0x53, 0x00, 0x20, 0x05, 0xb1, 0x01, 0x0d, 0x0e,
+ 0x14, 0x02, 0xbd, 0x11,
+ 0x24, 0xed, 0xec, 0x30, 0x4c, 0x52, 0x07, 0xe0, 0x00, 0x50, 0x00, 0xcd,
+ 0x01, 0x04, 0xf0, 0x0f,
+ 0xf9, 0xe0, 0xf0, 0xd0, 0x80, 0xfe, 0x00, 0x10, 0x00, 0x0f, 0xee, 0x11,
+ 0x57, 0x02, 0x2f, 0x00,
+ 0x02, 0x22, 0x61, 0x0f, 0xfc, 0xf2, 0x00, 0x1d, 0x1d, 0x46, 0x31, 0xed,
+ 0xbc, 0xf0, 0xf3, 0x0f,
+ 0x00, 0x44, 0x00, 0xde, 0xea, 0x00, 0x53, 0xe1, 0x00, 0x70, 0x2c, 0x10,
+ 0x43, 0x16, 0xd0, 0xae,
+ 0xfb, 0x00, 0x53, 0x02, 0xd2, 0xfd, 0xfc, 0x00, 0x31, 0x0f, 0xff, 0x00,
+ 0x20, 0x30, 0x22, 0x10,
+ 0x24, 0x02, 0xf0, 0x1f, 0x10, 0x9b, 0xec, 0x32, 0x11, 0xbd, 0xac, 0xfc,
+ 0x00, 0x27, 0x31, 0xdc,
+ 0xdf, 0x02, 0x35, 0xff, 0x0d, 0x72, 0x34, 0x02, 0xf1, 0xe0, 0xef, 0x10,
+ 0x43, 0xe2, 0xbe, 0x0c,
+ 0x20, 0x02, 0x05, 0xf1, 0xde, 0xba, 0x00, 0x21, 0x22, 0x23, 0x31, 0x3e,
+ 0x9d, 0xf1, 0x36, 0x20,
+ 0xce, 0xc8, 0x00, 0x11, 0xc1, 0xce, 0x1e, 0x50, 0x04, 0x00, 0xe0, 0x1e,
+ 0x12, 0x00, 0x5f, 0x43,
+ 0x02, 0x0f, 0xfd, 0xe0, 0xe1, 0x15, 0x41, 0x01, 0xf0, 0xdd, 0xfb, 0xdf,
+ 0xed, 0xbe, 0x01, 0x01,
+ 0xef, 0x28, 0x7f, 0x70, 0x11, 0x12, 0x0f, 0x0b, 0xf0, 0x00, 0x03, 0x05,
+ 0x00, 0xdf, 0xdd, 0x00,
+ 0xf1, 0xd1, 0xe0, 0x21, 0x32, 0x0d, 0x43, 0x77, 0x50, 0xec, 0xe1, 0x15,
+ 0x10, 0x0f, 0xce, 0x10,
+ 0x30, 0xde, 0xc2, 0x03, 0x00, 0x0e, 0x0a, 0xf0, 0x10, 0x32, 0x10, 0xf9,
+ 0xed, 0x73, 0x67, 0xd0,
+ 0xcf, 0xfd, 0x32, 0x62, 0x00, 0xc2, 0x02, 0x10, 0x1e, 0x2d, 0x01, 0x11,
+ 0x03, 0xf0, 0xc8, 0xff,
+ 0x43, 0x13, 0xd0, 0xbe, 0x04, 0x03, 0x00, 0x0c, 0xcf, 0xff, 0x00, 0x11,
+ 0x12, 0xff, 0xc8, 0xef,
+ 0xfe, 0xef, 0x20, 0x40, 0x4d, 0x40, 0x41, 0x35, 0x42, 0xf0, 0xe3, 0xf5,
+ 0x20, 0x40, 0x00, 0x26,
+ 0x62, 0x00, 0x00, 0xdd, 0xcc, 0x00, 0x00, 0xfd, 0xee, 0x67, 0x21, 0x0e,
+ 0xfe, 0xee, 0x02, 0x17,
+ 0x00, 0x5c, 0x31, 0xf0, 0x8e, 0xf0, 0xf0, 0xe1, 0x01, 0x0f, 0xd9, 0xf0,
+ 0x02, 0x20, 0x1f, 0xed,
+ 0x0f, 0x71, 0x14, 0x02, 0xff, 0xe9, 0xff, 0x52, 0x33, 0x01, 0x00, 0xec,
+ 0xef, 0x0f, 0x1d, 0xf0,
+ 0x02, 0xb0, 0x8b, 0xef, 0xf0, 0x11, 0x41, 0x01, 0xf0, 0xe1, 0x16, 0x20,
+ 0x0f, 0x00, 0x02, 0xc2,
+ 0xe1, 0x65, 0x23, 0x03, 0x00, 0x05, 0x62, 0x00, 0xc9, 0x0f, 0x10, 0x02,
+ 0x00, 0x1e, 0x0f, 0xbb,
+ 0xff, 0x01, 0x54, 0x10, 0xf0, 0xde, 0xf0, 0x37, 0x52, 0xf0, 0xdf, 0xef,
+ 0xdf, 0x1e, 0x50, 0x21,
+ 0x03, 0xcc, 0x1f, 0x53, 0x00, 0x09, 0x11, 0x13, 0x10, 0x0d, 0x0f, 0x10,
+ 0x37, 0x12, 0xcc, 0xd0,
+ 0xd0, 0xaf, 0xcf, 0xe0, 0xf1, 0x01, 0x33, 0xd2, 0xcc, 0x1a, 0x50, 0x20,
+ 0x20, 0x00, 0x12, 0x45,
+ 0x10, 0x0d, 0xef, 0xef, 0xe0, 0xe0, 0xdc, 0xab, 0x11, 0x51, 0xff, 0x0b,
+ 0x42, 0x14, 0xe0, 0x2f,
+ 0x62, 0x13, 0xee, 0xde, 0x02, 0x26, 0x2f, 0xbd, 0xf0, 0xf0, 0xe0, 0x00,
+ 0x0f, 0xea, 0x30, 0x42,
+ 0xaf, 0x00, 0x12, 0x2e, 0x9c, 0x0f, 0x1f, 0xef, 0xd1, 0x41, 0x11, 0xf6,
+ 0xd0, 0x25, 0x41, 0xed,
+ 0xef, 0xe0, 0xd1, 0x73, 0x21, 0xdf, 0x25, 0x64, 0x0d, 0xfc, 0x03, 0x12,
+ 0x1e, 0x00, 0xef, 0x0b,
+ 0x01, 0x04, 0x9c, 0xfb, 0x00, 0xf3, 0xe0, 0x01, 0xfd, 0x4f, 0xe0, 0xd0,
+ 0x10, 0x10, 0xec, 0x02,
+ 0x24, 0xc0, 0xc0, 0x44, 0x7f, 0x2c, 0x03, 0x13, 0x00, 0x3c, 0xdf, 0xf0,
+ 0x14, 0x11, 0x20, 0xcd,
+ 0x9b, 0xfc, 0xe0, 0x01, 0x24, 0x31, 0x40, 0xfc, 0xdf, 0x54, 0x34, 0x0f,
+ 0x0c, 0xc0, 0xe0, 0x23,
+ 0x54, 0x00, 0xfc, 0xcd, 0xe0, 0x03, 0x55, 0x0c, 0x00, 0x00, 0x0e, 0xdb,
+ 0x13, 0x57, 0x3f, 0xfe,
+ 0xe0, 0x13, 0x31, 0x01, 0xbf, 0x1f, 0x21, 0x12, 0xdf, 0xb8, 0xf0, 0x01,
+ 0x31, 0x1e, 0xde, 0x33,
+ 0x25, 0xff, 0xdc, 0x40, 0x72, 0x01, 0xd1, 0x00, 0xe2, 0x30, 0x1f, 0xe2,
+ 0x06, 0x40, 0xcc, 0xb0,
+ 0x00, 0x20, 0x16, 0x00, 0x00, 0x30, 0xef, 0xe0, 0xf1, 0xbd, 0xe0, 0xf2,
+ 0x14, 0x73, 0x0e, 0x88,
+ 0x0f, 0x03, 0x11, 0xfd, 0xdf, 0x2e, 0x2d, 0x00, 0x01, 0x15, 0x2e, 0x1e,
+ 0x00, 0xf6, 0x30, 0x00,
+ 0x10, 0x70, 0x21, 0x02, 0xe0, 0xfe, 0x1e, 0x10, 0xae, 0xbb, 0xf1, 0xf2,
+ 0xfb, 0x10, 0x20, 0xdf,
+ 0x0d, 0x7e, 0x1c, 0x0f, 0x00, 0x01, 0x47, 0x02, 0xe0, 0x0d, 0x20, 0xf1,
+ 0xcd, 0xdf, 0xf0, 0x02,
+ 0xf8, 0xef, 0x62, 0x00, 0xcd, 0x20, 0x46, 0x11, 0xdf, 0x00, 0x24, 0x10,
+ 0x50, 0x22, 0x00, 0xb0,
+ 0x02, 0x00, 0xdc, 0xcd, 0x1e, 0x1b, 0xf0, 0xa1, 0x04, 0x00, 0x1b, 0x11,
+ 0x42, 0xed, 0xec, 0x02,
+ 0x46, 0x30, 0x10, 0xb0, 0xfe, 0x00, 0x30, 0xfe, 0xf0, 0x56, 0x10, 0xfd,
+ 0xee, 0x04, 0x15, 0x20,
+ 0x50, 0x0e, 0xe0, 0x02, 0x03, 0x00, 0xe0, 0xd0, 0x8d, 0x0d, 0x01, 0x04,
+ 0xf3, 0xff, 0x0a, 0xce,
+ 0x0e, 0x31, 0x41, 0xdb, 0xdd, 0x43, 0x34, 0xee, 0xe0, 0x45, 0x00, 0xff,
+ 0x30, 0x7f, 0x2f, 0x31,
+ 0x25, 0x13, 0xaf, 0xfe, 0x27, 0x40, 0xde, 0xdd, 0x10, 0x22, 0x0f, 0xba,
+ 0xe0, 0x11, 0x45, 0x00,
+ 0x0e, 0x61, 0x11, 0x00, 0x0e, 0xb0, 0xbe, 0x3e, 0x2e, 0xa0, 0x13, 0x15,
+ 0x0b, 0xfe, 0xf2, 0x03,
+ 0x1f, 0x0c, 0x03, 0x20, 0x0c, 0xf0, 0x04, 0x22, 0x1c, 0x0d, 0xff, 0xcf,
+ 0x00, 0x24, 0x00, 0xc9,
+ 0x00, 0xc0, 0xd1, 0xdf, 0xfd, 0x2e, 0x70, 0xf0, 0xd5, 0xf0, 0x11, 0x40,
+ 0xf1, 0x03, 0x27, 0x33,
+ 0x0f, 0x0c, 0x41, 0x36, 0xa0, 0xdf, 0xef, 0x31, 0x31, 0x21, 0x20, 0x0f,
+ 0xef, 0x3e, 0x71, 0x67,
+ 0x00, 0xee, 0xef, 0x12, 0x22, 0x11, 0x14, 0xf2, 0xb0, 0xcd, 0xf3, 0x26,
+ 0x30, 0x1d, 0x0f, 0x6e,
+ 0x0e, 0xdf, 0x35, 0x21, 0x20, 0x61, 0x10, 0x0c, 0x10, 0x07, 0xf1, 0xff,
+ 0x1f, 0x30, 0xcf, 0x8d,
+ 0xf1, 0xf3, 0xe0, 0xfd, 0x0d, 0xea, 0xf0, 0x01, 0xf1, 0x30, 0x3f, 0x00,
+ 0x04, 0x24, 0x3c, 0x9a,
+ 0xff, 0x60, 0x22, 0x00, 0xdf, 0x0c, 0x10, 0x2f, 0xfe, 0xbc, 0x10, 0x16,
+ 0xff, 0x0f, 0x50, 0xf1,
+ 0xcf, 0xff, 0x00, 0x77, 0x22, 0xee, 0x00, 0xf0, 0xe0, 0x00, 0x03, 0xd9,
+ 0xee, 0x10, 0x13, 0xff,
+ 0xee, 0xe1, 0x02, 0x0d, 0x5b, 0x40, 0xb1, 0xc0, 0x0f, 0x11, 0xff, 0xfc,
+ 0x32, 0x14, 0x02, 0xe2,
+ 0xd0, 0xb0, 0x01, 0x21, 0xef, 0x02, 0x77, 0x22, 0x2c, 0x10, 0x34, 0x40,
+ 0xff, 0xcb, 0xd0, 0x40,
+ 0x0e, 0xde, 0x25, 0xb4, 0xbf, 0x0b, 0xd0, 0x00, 0x0e, 0x00, 0xf2, 0x03,
+ 0x8d, 0xeb, 0x02, 0x32,
+ 0x2e, 0xec, 0x00, 0x31, 0x41, 0x0f, 0x11, 0x44, 0x11, 0x44, 0x20, 0x00,
+ 0xbd, 0xdc, 0xef, 0x14,
+ 0x42, 0x0e, 0x0d, 0xd0, 0xe0, 0x0f, 0x3a, 0x54, 0x04, 0xde, 0x0f, 0x32,
+ 0x34, 0x00, 0x0e, 0x00,
+ 0xad, 0x0d, 0x5f, 0x14, 0xf1, 0xbb, 0x0b, 0x0f, 0x32, 0xe0, 0xf2, 0xf0,
+ 0x1e, 0x2d, 0x30, 0x77,
+ 0x27, 0xf0, 0xce, 0x0f, 0x00, 0xe1, 0xf0, 0x10, 0x00, 0x0f, 0x40, 0xee,
+ 0xe0, 0x74, 0x10, 0x89,
+ 0x20, 0x31, 0xa1, 0x00, 0x41, 0x05, 0xe0, 0xfd, 0xfe, 0x00, 0x11, 0x10,
+ 0xd1, 0x05, 0x61, 0x00,
+ 0xef, 0xff, 0x10, 0x45, 0x00, 0xf1, 0x04, 0xf2, 0xf0, 0x02, 0x1e, 0xd8,
+ 0xae, 0x01, 0x12, 0x32,
+ 0xd0, 0x0a, 0xe0, 0xe0, 0x61, 0xf1, 0xf0, 0x2f, 0x10, 0xe0, 0xdf, 0x10,
+ 0x73, 0x1d, 0x20, 0x03,
+ 0xd3, 0x10, 0x50, 0x01, 0xde, 0x37, 0x27, 0xef, 0xbd, 0x00, 0x01, 0x10,
+ 0x10, 0xef, 0x00, 0xfc,
+ 0xfc, 0x0f, 0x70, 0x1e, 0x14, 0x24, 0xae, 0x0d, 0x3f, 0x1f, 0xf0, 0xe6,
+ 0x03, 0x00, 0xeb, 0xe0,
+ 0x20, 0xeb, 0x8e, 0xf0, 0x04, 0x01, 0x2f, 0x6d, 0x01, 0x01, 0xf3, 0x36,
+ 0x41, 0xf0, 0xec, 0xe0,
+ 0x13, 0x22, 0x01, 0x4f, 0xdd, 0x8c, 0x0e, 0x01, 0x05, 0xf0, 0xed, 0x21,
+ 0x1f, 0xff, 0x01, 0xf4,
+ 0x0f, 0x30, 0x0d, 0xfc, 0x1e, 0x21, 0x02, 0xad, 0xe8, 0x1c, 0x41, 0x03,
+ 0x04, 0x00, 0x0f, 0xf0,
+ 0x56, 0x01, 0xef, 0x0f, 0x02, 0x21, 0x81, 0x12, 0x61, 0x0c, 0xdc, 0xf0,
+ 0x02, 0x23, 0x2e, 0xdb,
+ 0xf1, 0x12, 0xe0, 0xb0, 0x0f, 0xfd, 0x10, 0x14, 0xde, 0xf0, 0x33, 0x0a,
+ 0x5f, 0x30, 0x34, 0x73,
+ 0x11, 0x0e, 0xf2, 0x27, 0x10, 0xf0, 0x0e, 0xef, 0xdf, 0x34, 0x31, 0xed,
+ 0xec, 0x0f, 0x7e, 0x0e,
+ 0xc0, 0xf3, 0x27, 0x62, 0x0c, 0xe0, 0xf3, 0x10, 0x10, 0x0f, 0xbc, 0xde,
+ 0x00, 0xec, 0xdd, 0x20,
+ 0x41, 0x8f, 0x4f, 0x30, 0x80, 0x00, 0x2f, 0x0e, 0xe7, 0x01, 0x10, 0x20,
+ 0xf9, 0xdd, 0x12, 0x37,
+ 0x0f, 0x99, 0x0f, 0x00, 0x20, 0x03, 0x00, 0xee, 0xf0, 0x00, 0x11, 0x46,
+ 0x10, 0xee, 0xf0, 0x21,
+ 0x01, 0x90, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x21, 0x3f, 0x2d, 0x12, 0x07,
+ 0x24, 0x71, 0x00, 0xae,
+ 0x10, 0x25, 0x0f, 0xce, 0x02, 0x00, 0xdd, 0x0d, 0x04, 0x25, 0x00, 0x00,
+ 0xed, 0xf0, 0x04, 0x30,
+ 0x1f, 0xef, 0xe0, 0x0c, 0x1e, 0x7e, 0x76, 0x31, 0xec, 0xfe, 0x2e, 0x22,
+ 0x35, 0x00, 0x90, 0x00,
+ 0xf5, 0xe0, 0xfe, 0x0e, 0x00, 0xd0, 0xff, 0xe1, 0x27, 0x30, 0xc0, 0xbc,
+ 0x00, 0x63, 0x10, 0x0e,
+ 0x0d, 0xf1, 0x03, 0x20, 0xeb, 0xf1, 0x42, 0x2d, 0x0b, 0x10, 0x10, 0xbe,
+ 0x02, 0x02, 0xfb, 0x00,
+ 0xf0, 0x1f, 0x71, 0x32, 0xe0, 0x01, 0x15, 0x53, 0x14, 0xed, 0xde, 0x00,
+ 0xd2, 0xfe, 0x4e, 0xbd,
+ 0xb9, 0xee, 0x00, 0x21, 0x0b, 0xcf, 0x10, 0x77, 0x01, 0x0f, 0xdf, 0x00,
+ 0x00, 0xd0, 0xd1, 0xf3,
+ 0x10, 0x2d, 0x2f, 0xfd, 0x12, 0x60, 0x1c, 0x20, 0x10, 0x11, 0x47, 0x04,
+ 0x0e, 0x30, 0x31, 0x74,
+ 0x20, 0x8f, 0xf9, 0xe0, 0x20, 0x00, 0x02, 0xde, 0xed, 0xd0, 0xde, 0xe6,
+ 0x11, 0x2f, 0x1d, 0xf1,
+ 0x34, 0x6f, 0xfc, 0x00, 0x02, 0x3f, 0x3d, 0x43, 0x03, 0xdc, 0x0c, 0x1f,
+ 0x74, 0x27, 0xf0, 0xce,
+ 0x00, 0x13, 0x4f, 0x4d, 0xe2, 0xd5, 0x01, 0x1c, 0xdc, 0xb1, 0x24, 0x31,
+ 0x0f, 0x9d, 0x02, 0x32,
+ 0x1f, 0x12, 0x25, 0xec, 0x8c, 0x00, 0x44, 0x21, 0xfe, 0xfe, 0x0f, 0xff,
+ 0x03, 0x26, 0x30, 0xde,
+ 0xde, 0xf0, 0x03, 0x55, 0x21, 0x3f, 0x2c, 0xd0, 0xc2, 0x00, 0x00, 0x0e,
+ 0x32, 0x30, 0xe1, 0xc1,
+ 0x0e, 0x7f, 0x31, 0xe0, 0x8d, 0x1b, 0x2e, 0xad, 0x03, 0x46, 0xf0, 0xee,
+ 0x00, 0x2c, 0x0c, 0xe1,
+ 0x07, 0x02, 0x12, 0x40, 0x12, 0xd2, 0xee, 0x0f, 0x0e, 0xc0, 0x07, 0x21,
+ 0x20, 0x40, 0xee, 0x8c,
+ 0x0e, 0x20, 0xc1, 0x03, 0x44, 0xff, 0xd9, 0xf0, 0x14, 0x10, 0x00, 0x0e,
+ 0x00, 0x4e, 0x20, 0xd0,
+ 0x02, 0x73, 0x1f, 0x00, 0xe0, 0xe1, 0x04, 0x41, 0x0f, 0xe0, 0xf2, 0x18,
+ 0xac, 0xe0, 0x01, 0x50,
+ 0x0d, 0xee, 0xfd, 0x2c, 0x1e, 0x12, 0xe7, 0x23, 0x60, 0xee, 0xea, 0x00,
+ 0x10, 0x0f, 0xf2, 0x12,
+ 0x0e, 0xbb, 0x00, 0x00, 0x0f, 0x1c, 0xdf, 0x40, 0x2f, 0xa1, 0x01, 0x01,
+ 0x34, 0x00, 0x30, 0x00,
+ 0xa6, 0xef, 0xd7, 0x03, 0xc1, 0xef, 0xf1, 0x07, 0x43, 0x47, 0xd2, 0x01,
+ 0x75, 0x00, 0xfd, 0xe1,
+ 0x05, 0x00, 0x0e, 0xae, 0xef, 0x0e, 0x00, 0xf3, 0x21, 0x00, 0xbd, 0xf2,
+ 0x44, 0x2d, 0xfc, 0x00,
+ 0x19, 0x0e, 0x01, 0x21, 0x73, 0x21, 0xef, 0xdb, 0x10, 0x54, 0x04, 0xe3,
+ 0x00, 0x0f, 0x00, 0xe1,
+ 0xb0, 0x25, 0x54, 0xfd, 0xed, 0x00, 0x12, 0x16, 0x00, 0xfb, 0xd0, 0x22,
+ 0xf0, 0x8f, 0x00, 0xef,
+ 0xff, 0xfe, 0x0c, 0x10, 0x34, 0x00, 0xec, 0x42, 0x42, 0x01, 0xed, 0xeb,
+ 0x20, 0x42, 0x14, 0x31,
+ 0x22, 0x0f, 0x0d, 0x00, 0xa0, 0x0f, 0x56, 0x31, 0x1d, 0xa1, 0x16, 0x2f,
+ 0xfd, 0xcf, 0x0e, 0x11,
+ 0x06, 0xf0, 0xfe, 0x0f, 0x10, 0x20, 0x03, 0x81, 0xc0, 0x7d, 0x1e, 0xd0,
+ 0x34, 0x00, 0x0a, 0xd0,
+ 0x00, 0x10, 0xf1, 0xf2, 0x11, 0x2e, 0x0a, 0xce, 0xfe, 0xe0, 0x0b, 0x4d,
+ 0x11, 0x04, 0xbd, 0xfd,
+ 0x20, 0x0f, 0xc0, 0x0e, 0x04, 0x27, 0x41, 0xed, 0xd0, 0x12, 0xc2, 0xbf,
+ 0x0d, 0x00, 0x32, 0x11,
+ 0x10, 0x47, 0x33, 0x0c, 0xfd, 0x03, 0xf4, 0x10, 0x60, 0xd3, 0x12, 0x74,
+ 0x43, 0xdf, 0xff, 0x03,
+ 0x31, 0x11, 0x07, 0x32, 0xda, 0x90, 0x10, 0x06, 0x00, 0xf0, 0xee, 0xf0,
+ 0xf0, 0xff, 0x01, 0x73,
+ 0x10, 0x1c, 0x0e, 0x0e, 0x52, 0x34, 0x1f, 0x0b, 0x11, 0x22, 0x02, 0xc1,
+ 0x02, 0x21, 0x11, 0x9b,
+ 0xdf, 0x01, 0xf6, 0xf0, 0xce, 0xec, 0x00, 0x43, 0x00, 0xfd, 0x62, 0x27,
+ 0xee, 0xee, 0xfe, 0xe1,
+ 0x03, 0x21, 0x1b, 0x40, 0x00, 0xdf, 0xec, 0xe0, 0xe1, 0x4f, 0xfb, 0xc0,
+ 0xff, 0x10, 0x71, 0x44,
+ 0xd1, 0xef, 0x30, 0x35, 0x01, 0xdf, 0xf0, 0x0f, 0x0e, 0x0f, 0xef, 0xdd,
+ 0xb3, 0x11, 0x58, 0x3f,
+ 0xfe, 0x80, 0x10, 0x06, 0xf1, 0xf0, 0x0e, 0xdd, 0xd1, 0xe4, 0x21, 0xdf,
+ 0xae, 0x1b, 0x0f, 0x01,
+ 0x60, 0x00, 0x0d, 0xe0, 0x05, 0x03, 0x13, 0x3f, 0x7c, 0x11, 0xf0, 0xdc,
+ 0x40, 0x0f, 0xe0, 0xd0,
+ 0x07, 0x40, 0xdd, 0xcc, 0xf0, 0x07, 0xc1, 0x9e, 0x0e, 0x31, 0x14, 0x00,
+ 0xee, 0xdf, 0x00, 0x00,
+ 0x0f, 0x42, 0x32, 0xd8, 0xff, 0x70, 0x13, 0xe0, 0x00, 0x0d, 0x00, 0x22,
+ 0x54, 0x10, 0x02, 0xc2,
+ 0xfc, 0xdd, 0x10, 0x63, 0x00, 0xdb, 0x00, 0x43, 0x0e, 0xdb, 0xf0, 0x14,
+ 0x31, 0x0f, 0xec, 0x31,
+ 0x64, 0x00, 0xde, 0xca, 0xf0, 0x30, 0x22, 0x00, 0xef, 0xdc, 0x0f, 0x00,
+ 0x74, 0x34, 0x0f, 0xdd,
+ 0xc0, 0x22, 0x65, 0x22, 0xf0, 0xfd, 0xb2, 0x12, 0x7f, 0x0b, 0xb0, 0x20,
+ 0x25, 0xe1, 0xfc, 0x0e,
+ 0x00, 0x23, 0x01, 0xdd, 0x0f, 0x2d, 0x0c, 0x00, 0x05, 0x71, 0xf0, 0xe4,
+ 0x01, 0x0d, 0xfe, 0x03,
+ 0x14, 0xe0, 0xff, 0x27, 0x32, 0xdf, 0xbe, 0x01, 0x75, 0xf0, 0xec, 0x40,
+ 0xf2, 0xe1, 0x00, 0x00,
+ 0x1f, 0xe0, 0xef, 0x0f, 0xf3, 0xc3, 0x1d, 0x61, 0x17, 0x00, 0x0e, 0x10,
+ 0x03, 0xf2, 0xfd, 0xfb,
+ 0x20, 0x4d, 0x24, 0x13, 0x0e, 0x2e, 0xfd, 0xdd, 0xc6, 0x96, 0x00, 0xfb,
+ 0x10, 0x7f, 0x5e, 0xd0,
+ 0xf3, 0x03, 0x0e, 0x09, 0xd0, 0x31, 0x64, 0x0f, 0xde, 0x01, 0x13, 0x0f,
+ 0xdc, 0xff, 0x31, 0x30,
+ 0xbd, 0x02, 0x44, 0x08, 0x0f, 0xff, 0x10, 0x61, 0x10, 0x10, 0xe1, 0xe1,
+ 0x01, 0x23, 0x04, 0x20,
+ 0xe0, 0x8e, 0xd0, 0x23, 0x24, 0xed, 0x0d, 0x04, 0xe0, 0x09, 0xae, 0x00,
+ 0x03, 0x10, 0x1f, 0xda,
+ 0xd0, 0x43, 0x20, 0x1e, 0xfc, 0x0d, 0x11, 0x64, 0x01, 0xc0, 0x00, 0x1f,
+ 0x52, 0x05, 0xf2, 0x12,
+ 0x21, 0xfc, 0x0e, 0x45, 0x33, 0xd0, 0xd0, 0x4f, 0xff, 0xf4, 0x00, 0x09,
+ 0xc0, 0xc3, 0xa0, 0x00,
+ 0x3d, 0xe0, 0xdf, 0x00, 0x4f, 0x03, 0x80, 0xed, 0x25, 0x30, 0x0e, 0x1e,
+ 0xf0, 0xef, 0x1f, 0x27,
+ 0x13, 0x3e, 0x3c, 0x20, 0x33, 0x77, 0x11, 0xee, 0x10, 0x25, 0xee, 0x0c,
+ 0xe0, 0x22, 0x62, 0xd0,
+ 0xad, 0x2f, 0x10, 0x90, 0x01, 0x62, 0x00, 0xe0, 0x03, 0x15, 0x01, 0xe0,
+ 0x00, 0x0e, 0x0f, 0x0b,
+ 0xcd, 0x1f, 0x2d, 0x18, 0x0f, 0x01, 0xd1, 0x0a, 0x0e, 0x10, 0x10, 0x00,
+ 0xe0, 0xb0, 0x10, 0x1e,
+ 0x60, 0x53, 0xe2, 0xd0, 0x05, 0x01, 0xcc, 0x2c, 0x3f, 0xd1, 0xd4, 0xef,
+ 0x0b, 0x33, 0x74, 0x0d,
+ 0xce, 0xe1, 0x36, 0x20, 0x10, 0xdf, 0xdd, 0x00, 0xf0, 0x22, 0x32, 0x1d,
+ 0xee, 0xa0, 0xe1, 0x17,
+ 0x75, 0x3f, 0x0d, 0xd0, 0xc3, 0x02, 0x56, 0x01, 0xef, 0xdd, 0x00, 0x10,
+ 0x00, 0xe1, 0xe0, 0x0b,
+ 0x50, 0x02, 0x13, 0x1e, 0x38, 0x7e, 0x51, 0x05, 0xe0, 0xe0, 0x00, 0x40,
+ 0x10, 0x01, 0xc0, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x03, 0xbe, 0xfd, 0xf2, 0xf4, 0x15, 0x32, 0xce, 0xdc,
+ 0xff, 0x12, 0x34, 0x00,
+ 0x7f, 0x3f, 0xff, 0xdd, 0xeb, 0x3d, 0x30, 0x00, 0xa4, 0xfd, 0xf9, 0x00,
+ 0x43, 0x10, 0x30, 0x10,
+ 0xbb, 0xd0, 0x00, 0x4f, 0x00, 0x33, 0x00, 0xff, 0x01, 0xf2, 0x0d, 0xd8,
+ 0x80, 0x20, 0x64, 0x01,
+ 0x04, 0xf2, 0xff, 0xe8, 0x00, 0x30, 0x12, 0xf0, 0xfe, 0xe0, 0xf2, 0xe0,
+ 0xdf, 0x0f, 0x7f, 0x0e,
+ 0xbf, 0xf3, 0xf3, 0x1c, 0x2d, 0x11, 0xd3, 0xfc, 0x0d, 0x70, 0x43, 0x33,
+ 0xf0, 0xe0, 0x02, 0x10,
+ 0x04, 0xc7, 0x07, 0x02, 0xfe, 0x9c, 0xf0, 0xb0, 0xf0, 0x0e, 0x10, 0x03,
+ 0x0e, 0x30, 0x30, 0xeb,
+ 0xed, 0x0e, 0x10, 0x30, 0x46, 0xf0, 0xda, 0xdf, 0xce, 0x20, 0x35, 0x22,
+ 0x02, 0xcf, 0xde, 0x2e,
+ 0x71, 0x25, 0xcf, 0x0d, 0x00, 0x41, 0x52, 0xd2, 0xdd, 0x70, 0x37, 0x85,
+ 0x10, 0x20, 0xfe, 0xe0,
+ 0xfd, 0x00, 0x33, 0x07, 0x00, 0xce, 0x2f, 0x4f, 0x00, 0xfe, 0x1f, 0x23,
+ 0xe2, 0xf9, 0x00, 0x12,
+ 0x33, 0xfd, 0xfa, 0x00, 0x83, 0x22, 0x21, 0xce, 0x0e, 0x40, 0x01, 0xe0,
+ 0xc0, 0x14, 0x31, 0x1f,
+ 0xed, 0xcd, 0x0f, 0x3f, 0x0d, 0x10, 0xf3, 0xe7, 0x13, 0x70, 0x2d, 0x10,
+ 0xe1, 0xe0, 0xf7, 0x13,
+ 0xe3, 0x20, 0x10, 0x8b, 0xef, 0x0e, 0x3e, 0x0f, 0x01, 0xf1, 0x10, 0x2e,
+ 0xfe, 0xc0, 0x02, 0x46,
+ 0x1f, 0xff, 0xb4, 0xd5, 0xd2, 0x01, 0x2f, 0xe9, 0xff, 0xd1, 0x73, 0x22,
+ 0x0e, 0x0f, 0x31, 0x21,
+ 0x0e, 0xee, 0x71, 0x32, 0xdf, 0xc5, 0x06, 0x00, 0x3f, 0xec, 0xf1, 0x00,
+ 0xd9, 0x10, 0xe0, 0x00,
+ 0x1e, 0x40, 0x31, 0xe2, 0x6e, 0xdc, 0x51, 0x15, 0xbf, 0x10, 0x02, 0xd2,
+ 0x1f, 0xfc, 0x0f, 0x1f,
+ 0x9f, 0x0d, 0x0e, 0x3d, 0x1e, 0x21, 0x01, 0xc1, 0x05, 0x22, 0x22, 0x43,
+ 0xf6, 0xbf, 0xc8, 0x0f,
+ 0x22, 0x03, 0xd1, 0x00, 0x1e, 0xb0, 0xe2, 0x0e, 0x7b, 0x30, 0xf1, 0x00,
+ 0x01, 0x02, 0x2d, 0x0d,
+ 0xf9, 0xbe, 0x0f, 0x02, 0x13, 0x22, 0xde, 0xa9, 0x00, 0x00, 0x11, 0x33,
+ 0x14, 0x00, 0x00, 0xe0,
+ 0x12, 0x50, 0xeb, 0x00, 0x10, 0x32, 0x64, 0x02, 0xc1, 0x00, 0x1c, 0x0e,
+ 0xff, 0xe0, 0x02, 0x00,
+ 0xdc, 0xed, 0xc0, 0xe6, 0x10, 0x10, 0x5d, 0x02, 0xd2, 0xde, 0xfd, 0x30,
+ 0x76, 0x33, 0xff, 0x1b,
+ 0x0e, 0x0f, 0xf0, 0x91, 0xf3, 0x04, 0x56, 0xf1, 0xd0, 0x0e, 0xe0, 0x00,
+ 0x0a, 0x30, 0x70, 0x03,
+ 0xf5, 0x02, 0xf0, 0x7e, 0x2f, 0x1f, 0x1f, 0xe2, 0x37, 0x01, 0xa0, 0x0c,
+ 0x10, 0xff, 0xdf, 0xf1,
+ 0xf2, 0x1e, 0x0b, 0x0d, 0xf0, 0xf1, 0x21, 0x40, 0x1d, 0x6a, 0x1f, 0xdc,
+ 0xce, 0x0f, 0x43, 0x03,
+ 0xa0, 0x00, 0xd2, 0x07, 0x20, 0xec, 0x01, 0x00, 0x1f, 0x0f, 0x04, 0x44,
+ 0x5e, 0x0a, 0xf0, 0x0f,
+ 0x00, 0xe2, 0x11, 0x2f, 0xee, 0x01, 0x16, 0xd0, 0x90, 0x0f, 0x0e, 0x11,
+ 0x33, 0x04, 0x51, 0x21,
+ 0x0f, 0x00, 0x31, 0x54, 0x01, 0xd1, 0xe3, 0xf1, 0x34, 0x01, 0xc0, 0x05,
+ 0x01, 0xde, 0x11, 0x07,
+ 0x9f, 0x0b, 0x50, 0x11, 0x00, 0x10, 0x00, 0x2d, 0x50, 0x40, 0x2d, 0x2f,
+ 0x32, 0x14, 0xee, 0xcc,
+ 0xf0, 0xe0, 0x03, 0xe1, 0xfc, 0xc8, 0xcf, 0x01, 0xe2, 0xb1, 0xf1, 0xcf,
+ 0xdf, 0x52, 0x22, 0xdf,
+ 0xfc, 0xe0, 0xae, 0x30, 0x15, 0x10, 0x0f, 0x0e, 0x05, 0x17, 0x01, 0x0e,
+ 0x30, 0x50, 0x0f, 0xee,
+ 0x10, 0x30, 0x00, 0x02, 0xe1, 0x0d, 0x6e, 0x70, 0x14, 0x00, 0xfd, 0xdc,
+ 0xe9, 0xfe, 0xff, 0xf0,
+ 0xf2, 0xe2, 0xb2, 0x04, 0x03, 0xed, 0xdb, 0xbd, 0xfe, 0xd1, 0x06, 0x22,
+ 0x1e, 0xea, 0x0f, 0x0f,
+ 0x00, 0x32, 0x70, 0xf0, 0x9f, 0xfc, 0x00, 0x10, 0x43, 0x12, 0x0f, 0xfe,
+ 0xf0, 0x09, 0x2e, 0x71,
+ 0x36, 0x00, 0xde, 0xf3, 0x02, 0x02, 0xfd, 0x1c, 0x10, 0xf0, 0x8d, 0xf3,
+ 0xe2, 0xe9, 0xfe, 0x01,
+ 0x13, 0x22, 0x02, 0xd0, 0xe9, 0x3f, 0x7f, 0x21, 0x22, 0x0e, 0xbf, 0xe1,
+ 0x05, 0xf0, 0x1c, 0xcf,
+ 0x9e, 0x0d, 0x00, 0x25, 0x11, 0x12, 0x60, 0x1d, 0x00, 0x03, 0x05, 0x62,
+ 0x0e, 0xfd, 0xf1, 0xe0,
+ 0xfd, 0x02, 0x2e, 0x18, 0xfa, 0xd1, 0x02, 0xe0, 0x30, 0x11, 0xfe, 0xdc,
+ 0x43, 0x67, 0x01, 0xf0,
+ 0xcd, 0x00, 0x01, 0x22, 0x41, 0x01, 0xd0, 0x0f, 0x1c, 0xee, 0x12, 0x33,
+ 0x30, 0x70, 0x3d, 0xeb,
+ 0xe2, 0x26, 0x3f, 0x2f, 0x70, 0x00, 0x0f, 0x00, 0x00, 0x04, 0x22, 0x1e,
+ 0xdb, 0xe2, 0xf6, 0x90,
+ 0xde, 0x0e, 0x20, 0xe0, 0xdf, 0xfe, 0xd2, 0x85, 0x80, 0x03, 0x2e, 0x0b,
+ 0x01, 0x04, 0xf0, 0xf0,
+ 0x10, 0x35, 0x30, 0x21, 0x20, 0x1d, 0x1f, 0xf4, 0xa3, 0x01, 0xcf, 0x1f,
+ 0x15, 0xff, 0x8c, 0x01,
+ 0x02, 0x00, 0x32, 0x65, 0x0f, 0xfa, 0x0e, 0x3d, 0x01, 0x03, 0xce, 0x0e,
+ 0x12, 0x00, 0xde, 0xf1,
+ 0x04, 0x0f, 0xfd, 0xb0, 0xf1, 0x07, 0x15, 0x3f, 0x3c, 0x0f, 0x80, 0xf0,
+ 0x20, 0x50, 0x0e, 0x0d,
+ 0xc9, 0x10, 0x30, 0xf0, 0xde, 0x01, 0x01, 0xee, 0x21, 0x75, 0x1e, 0xec,
+ 0xe1, 0x14, 0x33, 0x0f,
+ 0xec, 0xb1, 0x02, 0xf0, 0x22, 0x42, 0x02, 0xd4, 0xd0, 0xed, 0x03, 0x47,
+ 0x05, 0x20, 0x0e, 0xee,
+ 0xff, 0x1f, 0x2d, 0x5f, 0x40, 0x0f, 0xb0, 0x16, 0x52, 0x1e, 0x0c, 0xe0,
+ 0xd0, 0x0f, 0x30, 0x20,
+ 0x6f, 0x2f, 0x40, 0x01, 0x00, 0x20, 0x37, 0x04, 0x80, 0xf0, 0x03, 0xe0,
+ 0xe0, 0x01, 0x05, 0xce,
+ 0x0f, 0x0f, 0x00, 0xcd, 0x1e, 0x2f, 0x0e, 0xe2, 0xe7, 0x05, 0x41, 0x10,
+ 0x20, 0x34, 0x45, 0x42,
+ 0x30, 0x0f, 0xdd, 0x10, 0x0d, 0x01, 0x62, 0x4c, 0xd8, 0xb0, 0x10, 0x50,
+ 0x20, 0x0e, 0xc0, 0xe0,
+ 0x01, 0x03, 0x05, 0x01, 0xe0, 0xa0, 0x04, 0xf0, 0x00, 0x2c, 0x31, 0xe0,
+ 0xcd, 0xfb, 0x20, 0x74,
+ 0x10, 0x0f, 0xe0, 0x0f, 0x00, 0x00, 0xdc, 0xfb, 0x0f, 0x40, 0xd0, 0xe0,
+ 0x04, 0xdb, 0x8c, 0x0e,
+ 0x40, 0x13, 0x01, 0x10, 0x0f, 0x0e, 0x1d, 0xc2, 0x04, 0xe0, 0xb0, 0xff,
+ 0xe0, 0xf0, 0x0f, 0x0a,
+ 0xee, 0x31, 0x55, 0xd1, 0x06, 0x70, 0x0c, 0xfe, 0xd0, 0x23, 0x10, 0x10,
+ 0xfd, 0x9e, 0x00, 0x24,
+ 0x22, 0x02, 0xe2, 0x24, 0x2f, 0x4e, 0x44, 0x25, 0xb0, 0xec, 0xf0, 0x13,
+ 0x12, 0x21, 0xdb, 0x99,
+ 0x00, 0x10, 0xf2, 0xdf, 0x1f, 0x31, 0x60, 0x0f, 0x0e, 0x32, 0x21, 0x01,
+ 0xe3, 0xf6, 0xf1, 0x01,
+ 0x0d, 0x0e, 0x03, 0xf6, 0x80, 0xbf, 0x12, 0x44, 0x0f, 0x0b, 0xf0, 0xff,
+ 0x21, 0x43, 0x01, 0x01,
+ 0x00, 0xea, 0xdf, 0x10, 0x00, 0xef, 0xc0, 0xd6, 0x10, 0x7c, 0x50, 0x00,
+ 0xc0, 0x0e, 0x51, 0x25,
+ 0x20, 0xff, 0xde, 0x00, 0xde, 0x00, 0x00, 0x00, 0xce, 0xdd, 0xdf, 0xdf,
+ 0x06, 0x05, 0x1f, 0x7c,
+ 0x30, 0xe0, 0x00, 0x70, 0x13, 0x12, 0x01, 0xe0, 0xe2, 0x0f, 0x0f, 0xf3,
+ 0xc3, 0xd0, 0xec, 0x20,
+ 0x3c, 0xc8, 0xdc, 0x00, 0x20, 0x51, 0x1e, 0x0f, 0x60, 0x0a, 0x00, 0x02,
+ 0x25, 0xe0, 0x8e, 0x02,
+ 0xf1, 0x11, 0x31, 0x03, 0xef, 0xe9, 0x0f, 0x00, 0x00, 0x44, 0x20, 0x0d,
+ 0x8c, 0xf1, 0x03, 0x00,
+ 0xed, 0x1f, 0x2e, 0x0e, 0xb0, 0x04, 0xf1, 0x0c, 0xfe, 0xe0, 0x37, 0x43,
+ 0x1d, 0x0d, 0xef, 0xfe,
+ 0x01, 0x41, 0x11, 0x24, 0xf3, 0xe1, 0x01, 0x04, 0x03, 0xff, 0x0e, 0xf1,
+ 0x17, 0x77, 0x74, 0x1f,
+ 0x0f, 0xe0, 0xef, 0x10, 0x10, 0xd0, 0x00, 0x0c, 0x8d, 0x00, 0x43, 0x52,
+ 0x1e, 0x08, 0x00, 0x60,
+ 0x10, 0x00, 0x0e, 0x10, 0xf2, 0x04, 0xe4, 0x0d, 0xdd, 0xf0, 0xf2, 0xcf,
+ 0xfd, 0xf0, 0xf0, 0x10,
+ 0x1d, 0x10, 0x24, 0x62, 0x0b, 0x2d, 0x43, 0x45, 0x03, 0xd0, 0xff, 0x23,
+ 0xf5, 0xa3, 0xf0, 0x03,
+ 0x22, 0xf2, 0xb3, 0x0f, 0x0d, 0x5a, 0x3e, 0x43, 0x07, 0x0f, 0xb8, 0x00,
+ 0x00, 0x01, 0x01, 0x03,
+ 0xf1, 0xae, 0xed, 0x01, 0xf5, 0x00, 0x00, 0xf2, 0x03, 0xdd, 0x0e, 0x20,
+ 0x1f, 0x10, 0x62, 0x31,
+ 0x30, 0x2f, 0xe9, 0xc0, 0x03, 0x12, 0x1d, 0x20, 0x17, 0xd2, 0x80, 0xb9,
+ 0x20, 0x3f, 0x1f, 0xfe,
+ 0xd0, 0x02, 0x01, 0x36, 0x31, 0xdd, 0x8b, 0xe0, 0xd0, 0x01, 0x64, 0x00,
+ 0x0c, 0xce, 0x00, 0x3f,
+ 0x44, 0x00, 0xdd, 0x0d, 0xfe, 0x0f, 0x10, 0x41, 0x0c, 0xbd, 0x01, 0xf4,
+ 0x14, 0x02, 0x00, 0x00,
+ 0x04, 0x10, 0x20, 0x43, 0xfe, 0xf1, 0x07, 0x03, 0xcc, 0x0f, 0x0e, 0x1c,
+ 0x3e, 0x70, 0x43, 0x02,
+ 0xdd, 0xed, 0x20, 0x50, 0xeb, 0xd0, 0xf1, 0xd0, 0xcb, 0x00, 0xf3, 0xdf,
+ 0xce, 0xbb, 0xf0, 0x04,
+ 0x20, 0x10, 0x63, 0x15, 0x20, 0x20, 0xf1, 0xf0, 0x37, 0x63, 0x00, 0x00,
+ 0x1e, 0xff, 0xdf, 0x00,
+ 0x00, 0x0b, 0xe0, 0xf1, 0xb0, 0xdb, 0xdf, 0x21, 0x76, 0x00, 0x00, 0x62,
+ 0x24, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0xc2, 0xe1, 0x0b, 0xed, 0x8d, 0x0e, 0x00, 0x12, 0x00, 0xfb,
+ 0x0c, 0x10, 0x50, 0x12,
+ 0x26, 0x03, 0xf0, 0x0f, 0x01, 0x00, 0x0c, 0x20, 0x47, 0xe3, 0xd0, 0xce,
+ 0x11, 0x55, 0x00, 0xcf,
+ 0x30, 0x4e, 0x0f, 0x0f, 0x01, 0x03, 0x0a, 0xed, 0x10, 0x20, 0xbf, 0xcb,
+ 0xde, 0x20, 0x12, 0x11,
+ 0xf0, 0x8b, 0xd0, 0x04, 0x01, 0xe1, 0x1f, 0x0c, 0xfe, 0x6f, 0x53, 0x04,
+ 0x0f, 0xed, 0x0c, 0xfe,
+ 0x00, 0x45, 0x02, 0xb0, 0xfc, 0xef, 0x11, 0x10, 0xfd, 0x0e, 0x00, 0x1f,
+ 0x45, 0x13, 0xf0, 0xee,
+ 0x23, 0x01, 0xf0, 0xd2, 0xc3, 0x27, 0x76, 0x20, 0xd0, 0x02, 0x31, 0x00,
+ 0x00, 0x01, 0xd2, 0x81,
+ 0xef, 0xf0, 0x01, 0x07, 0xe2, 0x31, 0x70, 0x3b, 0x2c, 0x0f, 0x0f, 0x10,
+ 0x74, 0x20, 0x20, 0x0f,
+ 0x00, 0xf1, 0x02, 0x42, 0xf0, 0xe0, 0xf0, 0xcc, 0xdc, 0xf0, 0x04, 0x10,
+ 0xda, 0x8f, 0x0f, 0xf0,
+ 0x0d, 0x0e, 0x72, 0x00, 0x10, 0xff, 0xd0, 0x06, 0x36, 0x02, 0xd0, 0xce,
+ 0xe1, 0x00, 0x03, 0x13,
+ 0x00, 0x0a, 0x60, 0x4f, 0x30, 0x30, 0xf0, 0xfe, 0x30, 0x5d, 0x1f, 0x02,
+ 0xd9, 0xfd, 0xdf, 0xa3,
+ 0xf4, 0xc0, 0xee, 0xfc, 0x00, 0x0e, 0xdd, 0x02, 0x67, 0x44, 0x20, 0xfd,
+ 0xfb, 0x10, 0x10, 0xe2,
+ 0xa0, 0xe3, 0xf0, 0xde, 0x0d, 0x0c, 0xdd, 0xed, 0x11, 0x77, 0x42, 0x00,
+ 0xf0, 0x20, 0xff, 0x0e,
+ 0x30, 0x3f, 0x0a, 0xed, 0xe0, 0x07, 0xb0, 0xc0, 0xac, 0xf0, 0xf3, 0x00,
+ 0x22, 0x00, 0xed, 0xff,
+ 0x10, 0x2e, 0x51, 0x05, 0xce, 0xee, 0x11, 0x20, 0xfe, 0xbe, 0xde, 0xdf,
+ 0x12, 0x10, 0x21, 0x14,
+ 0x0e, 0xfb, 0x7f, 0x5e, 0x00, 0x17, 0x37, 0xf0, 0xff, 0x00, 0x05, 0x01,
+ 0x16, 0x00, 0x22, 0x00,
+ 0x59, 0x0f, 0xd9, 0x27, 0x4b, 0x11, 0x17, 0x29, 0x0b, 0xf1, 0x83, 0x9e,
+ 0xfa, 0xd0, 0x1f, 0x0e,
+ 0xda, 0xf0, 0x02, 0x34, 0x0e, 0x8e, 0xfe, 0xc1, 0x03, 0x02, 0xd0, 0xff,
+ 0xbb, 0xe0, 0xd1, 0xf7,
+ 0xe5, 0xe0, 0xef, 0xcf, 0xe0, 0xdf, 0x0f, 0xd0, 0x91, 0xc0, 0xdf, 0xd0,
+ 0xd2, 0xe1, 0xf2, 0xc3,
+ 0xe1, 0xbd, 0xeb, 0xf3, 0x27, 0x10, 0x0b, 0xe0, 0xe0, 0x00, 0x12, 0x00,
+ 0xfe, 0x90, 0xf0, 0xcc,
+ 0xce, 0xe0, 0xf3, 0xd5, 0xc1, 0xd0, 0xda, 0xaf, 0xfd, 0x12, 0x11, 0xf1,
+ 0xe1, 0xe2, 0xef, 0xd0,
+ 0xc7, 0xc1, 0xb1, 0xf1, 0xe2, 0xe4, 0xc1, 0xe0, 0xc1, 0xe0, 0xf0, 0xe0,
+ 0xf4, 0xd0, 0xce, 0xef,
+ 0xf0, 0xf3, 0xe9, 0xba, 0xfe, 0x01, 0xc3, 0xf2, 0x01, 0xbc, 0xde, 0xe1,
+ 0x07, 0xc0, 0xdf, 0xd0,
+ 0xcc, 0xdf, 0x02, 0xf5, 0xe0, 0xee, 0xc0, 0xe3, 0xf0, 0xcd, 0xed, 0xee,
+ 0xba, 0xdf, 0xf1, 0xe3,
+ 0xb0, 0xeb, 0xce, 0xee, 0x01, 0x23, 0xc0, 0xce, 0xd0, 0xe4, 0xe0, 0xde,
+ 0xde, 0xb3, 0x07, 0xd0,
+ 0xed, 0xef, 0x10, 0xc0, 0xce, 0xe3, 0xf7, 0x07, 0xc0, 0xde, 0x01, 0xd1,
+ 0x80, 0xcf, 0xf0, 0xe3,
+ 0xd0, 0xc0, 0xef, 0xdf, 0xef, 0xbe, 0xda, 0xe0, 0xfe, 0x0e, 0xde, 0xbd,
+ 0xf0, 0xf3, 0xf7, 0x01,
+ 0x12, 0x01, 0x04, 0xf2, 0xcd, 0xcc, 0xfe, 0x0e, 0x10, 0x40, 0x0f, 0xba,
+ 0xff, 0x00, 0xf0, 0x0f,
+ 0x34, 0xd2, 0x90, 0xf1, 0x07, 0x04, 0xe0, 0xde, 0xb0, 0xe3, 0xe1, 0x02,
+ 0x32, 0xf1, 0xe2, 0x0e,
+ 0x28, 0x70, 0x50, 0x00, 0x1d, 0x10, 0x21, 0x00, 0x2f, 0x0f, 0x0c, 0xf2,
+ 0xf0, 0xdc, 0x0d, 0x73,
+ 0x12, 0x0e, 0x00, 0x47, 0x34, 0x3f, 0x40, 0x13, 0x30, 0x3f, 0x52, 0x46,
+ 0x30, 0x0e, 0x0c, 0x20,
+ 0x1f, 0x31, 0x31, 0x3e, 0x7e, 0x50, 0x20, 0x3a, 0x51, 0x10, 0x1f, 0x1e,
+ 0x1d, 0x2f, 0x41, 0x24,
+ 0x0b, 0xfb, 0xee, 0x01, 0x42, 0x2f, 0x4d, 0x10, 0x22, 0x44, 0x32, 0x31,
+ 0x60, 0x3d, 0x1e, 0x3c,
+ 0x22, 0x31, 0x08, 0x2f, 0x40, 0x21, 0x31, 0x20, 0x0c, 0x3a, 0x4f, 0x2f,
+ 0x00, 0x67, 0x52, 0x22,
+ 0x10, 0x2e, 0x13, 0x35, 0x1f, 0x1c, 0x2f, 0x11, 0x12, 0x00, 0x00, 0xbe,
+ 0x2e, 0x4e, 0x0e, 0x2d,
+ 0x70, 0x4e, 0x0e, 0x21, 0x27, 0x00, 0x0f, 0x0f, 0x41, 0x05, 0x02, 0xd0,
+ 0x0e, 0x1e, 0x22, 0x67,
+ 0x47, 0x2f, 0x3f, 0x31, 0x44, 0x0f, 0x2e, 0x20, 0x5f, 0x2f, 0x10, 0x00,
+ 0xe1, 0x0f, 0x0e, 0x10,
+ 0x16, 0x01, 0x21, 0x70, 0x6d, 0x1e, 0x2f, 0x1f, 0x24, 0x31, 0x3d, 0x20,
+ 0x1f, 0x30, 0x5f, 0x0c,
+ 0x0b, 0x20, 0x30, 0x2d, 0x70, 0x33, 0x0d, 0x09, 0x33, 0x73, 0x2f, 0x1b,
+ 0x30, 0x0f, 0x00, 0x4e,
+ 0x1f, 0x30, 0x27, 0x42, 0x00, 0x21, 0x03, 0x31, 0x21, 0x23, 0x74, 0x10,
+ 0x2b, 0x1f, 0x30, 0x0d,
+ 0xfb, 0x30, 0x6f, 0x1c, 0x00, 0x0f, 0x0e, 0x11, 0x76, 0x20, 0x00, 0x10,
+ 0x00, 0x3e, 0x00, 0x72,
+ 0x26, 0x0c, 0x0c, 0x00, 0x24, 0x00, 0x31, 0x11, 0xf0, 0xfd, 0x21, 0x62,
+ 0x20, 0x3e, 0xfc, 0xbe,
+ 0x03, 0x05, 0xfc, 0xdc, 0xf0, 0xc1, 0xd1, 0xe3, 0xbe, 0xea, 0xef, 0xdf,
+ 0xf0, 0xe0, 0xe2, 0xe1,
+ 0xd3, 0xb1, 0xcf, 0xf1, 0xd4, 0xc0, 0xdd, 0x9d, 0xe6, 0xe4, 0xd3, 0xd1,
+ 0xc6, 0xc0, 0xbe, 0xdf,
+ 0x03, 0xe5, 0xdf, 0xef, 0xd1, 0xf3, 0xf0, 0xcb, 0xed, 0x01, 0xe1, 0xc1,
+ 0xc0, 0xd0, 0xe0, 0xe0,
+ 0xde, 0xdd, 0xc0, 0xc0, 0xc6, 0xe0, 0x0e, 0xda, 0xc0, 0xc0, 0xdc, 0xed,
+ 0x0e, 0xde, 0xc0, 0xf0,
+ 0xfe, 0xed, 0x06, 0xd4, 0x90, 0xf3, 0xe3, 0xe0, 0xf0, 0xe0, 0xbe, 0xf2,
+ 0xe6, 0xe2, 0x04, 0x01,
+ 0xfe, 0xcf, 0x00, 0x40, 0x02, 0x23, 0x2d, 0x08, 0x30, 0xf0, 0x9f, 0x00,
+ 0x13, 0x01, 0x0e, 0xf0,
+ 0xdf, 0x13, 0x77, 0x14, 0x0e, 0x0f, 0xef, 0xef, 0x20, 0x50, 0x04, 0xf0,
+ 0xcf, 0x05, 0x36, 0x00,
+ 0xfd, 0xe0, 0x4d, 0x71, 0x34, 0x01, 0xdf, 0x3f, 0x41, 0x33, 0x10, 0x0c,
+ 0x00, 0x0f, 0xee, 0xcd,
+ 0x07, 0x03, 0x8b, 0xde, 0x0f, 0x20, 0x41, 0x00, 0xcd, 0xfc, 0xef, 0xf1,
+ 0x57, 0x32, 0xed, 0xdc,
+ 0xef, 0xf0, 0x03, 0x2f, 0xca, 0x9f, 0x00, 0xf4, 0xf1, 0x0f, 0xed, 0xf0,
+ 0x1e, 0x20, 0x50, 0x04,
+ 0xe2, 0xe1, 0xd3, 0xe2, 0x05, 0xdf, 0xea, 0xa0, 0x00, 0x01, 0xdf, 0x1e,
+ 0x6f, 0x1d, 0xe9, 0xdf,
+ 0xf0, 0x03, 0x40, 0x30, 0xfa, 0xc0, 0xdf, 0xa0, 0xe1, 0xd1, 0xd1, 0xd3,
+ 0xd1, 0x90, 0xfc, 0xe0,
+ 0x00, 0x13, 0x33, 0x0f, 0xf1, 0x07, 0x20, 0xf0, 0xb1, 0xe3, 0xb0, 0xd0,
+ 0xdf, 0xe0, 0xe0, 0xb3,
+ 0xb2, 0xe0, 0x07, 0x15, 0x1f, 0x0e, 0x05, 0xd0, 0x23, 0x10, 0x1e, 0xac,
+ 0xdf, 0x01, 0x02, 0x27,
+ 0x00, 0xef, 0xbf, 0xfe, 0x0f, 0xf0, 0x02, 0xb8, 0xed, 0xde, 0x01, 0xf2,
+ 0x21, 0xcd, 0xed, 0xb1,
+ 0xd0, 0xe1, 0xc5, 0x06, 0xf0, 0xd4, 0x80, 0xdd, 0xf0, 0x03, 0x10, 0x04,
+ 0x10, 0xde, 0x00, 0x00,
+ 0x63, 0x0e, 0xc8, 0x00, 0x53, 0x01, 0x0e, 0xdd, 0x10, 0x30, 0xa9, 0x00,
+ 0x01, 0x00, 0x0f, 0xe0,
+ 0xf0, 0x00, 0x10, 0xbc, 0x00, 0x00, 0x00, 0xcc, 0x45, 0x21, 0x0f, 0xcc,
+ 0x02, 0x13, 0xf0, 0xf0,
+ 0x0c, 0x75, 0x0d, 0xdf, 0xff, 0xf0, 0x11, 0xec, 0x00, 0xef, 0xf2, 0x8d,
+ 0xe0, 0xf0, 0x0f, 0xdc,
+ 0x57, 0x15, 0xed, 0xf0, 0x11, 0x65, 0xf0, 0xcd, 0xff, 0x15, 0x11, 0xbe,
+ 0xe0, 0x01, 0x02, 0xff,
+ 0xde, 0xf4, 0xe1, 0xbe, 0xf1, 0x27, 0xff, 0x9d, 0x01, 0x34, 0x00, 0xca,
+ 0xf0, 0x14, 0x41, 0xef,
+ 0xee, 0x21, 0x34, 0x0f, 0xdc, 0x00, 0x61, 0xf0, 0x0d, 0x31, 0x32, 0x0e,
+ 0xfc, 0x30, 0x73, 0x0f,
+ 0x0f, 0x2f, 0x01, 0x02, 0x00, 0x00, 0x01, 0x25, 0xf0, 0xfe, 0x13, 0x33,
+ 0x0d, 0x0d, 0x73, 0x61,
+ 0x0b, 0x22, 0x25, 0x2f, 0x1b, 0x0e, 0x31, 0x76, 0x10, 0xfb, 0x11, 0x42,
+ 0x21, 0x2f, 0x3f, 0x3f,
+ 0x0f, 0x2f, 0x42, 0x54, 0x2f, 0x1c, 0x42, 0x11, 0x2e, 0x1e, 0x40, 0x31,
+ 0x31, 0x34, 0x2d, 0x2d,
+ 0x75, 0x30, 0x09, 0x30, 0x33, 0x0f, 0x2d, 0x42, 0x74, 0x0e, 0x0a, 0x00,
+ 0x32, 0x40, 0x1f, 0x0b,
+ 0x00, 0x53, 0x12, 0x1c, 0x0f, 0x41, 0x11, 0x01, 0x32, 0x43, 0x0b, 0x0e,
+ 0x00, 0x31, 0x44, 0x20,
+ 0x0e, 0xfe, 0x0f, 0x30, 0x2f, 0x4f, 0x20, 0x1d, 0x52, 0x47, 0x00, 0x0f,
+ 0xef, 0x22, 0x44, 0x11,
+ 0xed, 0xdd, 0x13, 0x00, 0x47, 0x00, 0x8b, 0x02, 0x35, 0xfe, 0xec, 0x20,
+ 0x43, 0xdd, 0xef, 0x12,
+ 0x63, 0xfd, 0xda, 0x00, 0x14, 0x00, 0xce, 0x11, 0xf0, 0xcf, 0x32, 0x31,
+ 0xdc, 0xe0, 0x0f, 0x44,
+ 0xf1, 0xd0, 0x03, 0x11, 0xdd, 0x89, 0xe0, 0x14, 0xe0, 0xac, 0xf0, 0x02,
+ 0xf2, 0xdd, 0xef, 0x01,
+ 0x01, 0xb9, 0x00, 0x67, 0x01, 0xac, 0x00, 0x23, 0x00, 0xec, 0xf0, 0x24,
+ 0x11, 0xed, 0xcf, 0x01,
+ 0x23, 0x0e, 0xac, 0x12, 0x24, 0xfe, 0xcb, 0x10, 0x44, 0x00, 0xdc, 0x00,
+ 0x13, 0x0f, 0x0f, 0xe0,
+ 0x13, 0x00, 0x8c, 0x00, 0x15, 0x00, 0xed, 0xf1, 0x03, 0xee, 0xfe, 0x36,
+ 0xf0, 0xac, 0x01, 0x01,
+ 0xe0, 0x00, 0xdf, 0x10, 0x21, 0xf1, 0xad, 0x02, 0x24, 0xfe, 0xce, 0x02,
+ 0x25, 0xfe, 0xcd, 0xf0,
+ 0x14, 0x11, 0xab, 0xf0, 0x13, 0x0f, 0xcd, 0x00, 0x37, 0xe0, 0xac, 0x22,
+ 0x11, 0xff, 0xcd, 0x11,
+ 0x26, 0x0f, 0xbd, 0xf0, 0x12, 0x00, 0xd0, 0xfe, 0x00, 0xf1, 0xcd, 0xff,
+ 0x22, 0xf0, 0xdc, 0x0f,
+ 0x55, 0x01, 0xce, 0xcc, 0x23, 0x77, 0xf0, 0xcb, 0x01, 0x12, 0x00, 0xff,
+ 0xf0, 0xf0, 0xcf, 0x23,
+ 0x23, 0xc9, 0xdf, 0x00, 0x44, 0xe0, 0xcd, 0xf0, 0x01, 0x23, 0xd0, 0xdc,
+ 0xe0, 0x02, 0x01, 0x8d,
+ 0x01, 0x13, 0xcb, 0xf0, 0x25, 0x10, 0xcd, 0xfe, 0x13, 0x32, 0x00, 0xcc,
+ 0xfd, 0x01, 0x55, 0xef,
+ 0xec, 0x00, 0x04, 0x10, 0xcd, 0xf1, 0x13, 0xdf, 0xff, 0x36, 0xe0, 0x8d,
+ 0x12, 0x24, 0x0f, 0xcc,
+ 0x00, 0x01, 0x43, 0xf0, 0x0f, 0x0d, 0x99, 0x12, 0x34, 0xff, 0xdc, 0x01,
+ 0x10, 0x33, 0x00, 0x0f,
+ 0xbc, 0x10, 0x24, 0x0f, 0xee, 0x10, 0x45, 0xde, 0xee, 0x22, 0x00, 0x10,
+ 0x30, 0xf1, 0x01, 0x76,
+ 0xed, 0xed, 0x76, 0x11, 0xfe, 0x0e, 0x23, 0x00, 0x0d, 0x23, 0x00, 0xea,
+ 0x00, 0x62, 0x33, 0xdc,
+ 0xde, 0x41, 0x32, 0xfe, 0x00, 0x53, 0xed, 0x11, 0x42, 0xec, 0x00, 0x32,
+ 0x21, 0xea, 0x11, 0x30,
+ 0xef, 0x50, 0x34, 0x0f, 0x2e, 0x0f, 0x0d, 0x64, 0x67, 0x0f, 0xda, 0xf0,
+ 0x53, 0x21, 0xed, 0xcd,
+ 0x23, 0x46, 0xff, 0xde, 0x00, 0x20, 0x23, 0x20, 0xff, 0xed, 0x31, 0x75,
+ 0x0f, 0xcc, 0x11, 0x22,
+ 0x10, 0xf0, 0xfc, 0x00, 0x02, 0x0f, 0xed, 0x23, 0x65, 0xfd, 0xde, 0x44,
+ 0x32, 0x0f, 0xed, 0x00,
+ 0x53, 0x02, 0x1f, 0x0f, 0xee, 0x25, 0x53, 0xeb, 0xee, 0x33, 0x10, 0xff,
+ 0x10, 0x0f, 0xef, 0x52,
+ 0xfd, 0xeb, 0x77, 0x22, 0xdd, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0xef, 0x11, 0x30,
+ 0x2d, 0x3e, 0x98, 0x00, 0x76, 0x20, 0xda, 0x00, 0x74, 0x0f, 0xde, 0x10,
+ 0x54, 0xfe, 0xed, 0x03,
+ 0x20, 0x00, 0x00, 0x00, 0xff, 0x00, 0x21, 0x12, 0x0f, 0x0e, 0x11, 0x67,
+ 0xff, 0xdc, 0x10, 0x76,
+ 0x00, 0xfd, 0xf0, 0x11, 0x32, 0xef, 0xfd, 0x12, 0x30, 0xde, 0x0e, 0x75,
+ 0x00, 0xfc, 0x01, 0x55,
+ 0x00, 0xed, 0x00, 0x10, 0x21, 0x00, 0x10, 0x32, 0xec, 0xde, 0x76, 0x31,
+ 0xcd, 0xfd, 0x34, 0x22,
+ 0xfd, 0xde, 0x11, 0x33, 0x00, 0x00, 0xf0, 0xdd, 0x00, 0x35, 0x10, 0x8c,
+ 0xfe, 0x23, 0x31, 0xcc,
+ 0xfe, 0x35, 0x31, 0x9c, 0xfd, 0x37, 0x20, 0xbf, 0x00, 0x23, 0x00, 0x9a,
+ 0x01, 0x22, 0x00, 0xde,
+ 0xff, 0x13, 0x33, 0xcc, 0xdd, 0x22, 0x23, 0xee, 0xee, 0x03, 0x14, 0x01,
+ 0xde, 0xcd, 0x03, 0x05,
+ 0xee, 0x8b, 0x01, 0x14, 0x0f, 0xdd, 0xff, 0x33, 0x02, 0xca, 0xf0, 0x21,
+ 0x20, 0xcf, 0xed, 0x44,
+ 0xf0, 0xcd, 0xef, 0x00, 0x26, 0xe0, 0xad, 0xf0, 0x12, 0x00, 0xe0, 0x23,
+ 0xe0, 0xbd, 0x27, 0x0f,
+ 0xdf, 0x01, 0x00, 0xef, 0xef, 0xe0, 0x54, 0x00, 0xdc, 0x00, 0x00, 0x43,
+ 0x22, 0xfe, 0x00, 0x0e,
+ 0xbc, 0x24, 0x76, 0x00, 0xed, 0xfe, 0x01, 0x46, 0x10, 0xad, 0xfe, 0x25,
+ 0x20, 0xcd, 0x00, 0x44,
+ 0xff, 0xed, 0x12, 0x21, 0x02, 0x31, 0xfe, 0xfe, 0x10, 0x00, 0x00, 0x45,
+ 0x0f, 0x88, 0x01, 0x44,
+ 0xff, 0xdd, 0x01, 0x52, 0x00, 0xec, 0xf0, 0x56, 0x00, 0xfd, 0xf0, 0x10,
+ 0x33, 0xdf, 0xfe, 0x12,
+ 0x0f, 0xed, 0x21, 0x33, 0xdf, 0x0e, 0x40, 0xda, 0x21, 0x74, 0x0f, 0xdd,
+ 0xf0, 0x11, 0x33, 0xdd,
+ 0xef, 0x36, 0x41, 0xae, 0xdb, 0x44, 0x21, 0xce, 0xfe, 0x11, 0x31, 0x24,
+ 0x0f, 0x9b, 0xfe, 0x34,
+ 0x20, 0xdf, 0xff, 0x20, 0x01, 0xdf, 0xff, 0x10, 0x33, 0xef, 0xdd, 0xf0,
+ 0x35, 0x21, 0x8d, 0x0f,
+ 0x12, 0x44, 0xcc, 0xee, 0x24, 0x00, 0xdf, 0xcd, 0x02, 0x27, 0x00, 0x8c,
+ 0xf0, 0x13, 0x0f, 0xed,
+ 0x00, 0x14, 0x00, 0xcd, 0x01, 0x47, 0xdf, 0xce, 0x01, 0x03, 0x00, 0xef,
+ 0x02, 0xe0, 0xcc, 0x55,
+ 0xef, 0xee, 0x01, 0x32, 0xff, 0xee, 0x23, 0x0f, 0xcb, 0xef, 0x22, 0x55,
+ 0xac, 0xdc, 0x44, 0x00,
+ 0xff, 0xce, 0x00, 0x03, 0x00, 0x0f, 0xff, 0xe0, 0xe0, 0x01, 0x07, 0xd0,
+ 0xbe, 0x01, 0x03, 0xcd,
+ 0xdd, 0x36, 0x00, 0x8d, 0xf0, 0x35, 0xf0, 0xed, 0x00, 0x01, 0xef, 0x00,
+ 0x33, 0x32, 0xbd, 0xba,
+ 0x00, 0x15, 0x00, 0xce, 0x0f, 0xff, 0x01, 0x03, 0xde, 0x0f, 0x10, 0x0e,
+ 0xff, 0xf0, 0x01, 0x26,
+ 0x73, 0xcc, 0xed, 0xf2, 0x11, 0x02, 0xff, 0xff, 0xbb, 0xef, 0xf0, 0xf0,
+ 0xf0, 0x0e, 0xed, 0x13,
+ 0x77, 0xee, 0xbb, 0x34, 0x43, 0xdc, 0xce, 0x12, 0x24, 0x00, 0xde, 0xde,
+ 0x02, 0x23, 0xf0, 0xaa,
+ 0xf0, 0x13, 0x00, 0xdf, 0x20, 0xf1, 0x8d, 0x01, 0x27, 0x00, 0xde, 0xe0,
+ 0xef, 0x25, 0x21, 0xbf,
+ 0xfe, 0xf2, 0x01, 0x10, 0x20, 0x0f, 0xce, 0x0f, 0x55, 0x0f, 0xfc, 0x10,
+ 0x32, 0x0f, 0xed, 0x00,
+ 0x00, 0x53, 0x10, 0xfb, 0xe0, 0x20, 0x44, 0x00, 0xce, 0x0f, 0x33, 0x02,
+ 0x0f, 0xfb, 0x01, 0x54,
+ 0xee, 0x0f, 0x31, 0x00, 0x20, 0x46, 0x0f, 0x1e, 0x72, 0x30, 0xfb, 0x40,
+ 0x46, 0x1f, 0x00, 0x30,
+ 0xed, 0x73, 0x44, 0xfa, 0xf0, 0x30, 0x33, 0xfd, 0x0f, 0x51, 0x34, 0x00,
+ 0x1d, 0x30, 0x53, 0x10,
+ 0x0b, 0x11, 0x51, 0x0e, 0x1d, 0x11, 0x36, 0x2f, 0xfd, 0x20, 0x66, 0x0f,
+ 0x0d, 0x10, 0x52, 0x10,
+ 0x0e, 0x10, 0x32, 0x1f, 0x1d, 0x54, 0x10, 0x1e, 0x21, 0x31, 0x12, 0x2d,
+ 0x0b, 0x20, 0x55, 0x10,
+ 0x2f, 0x2f, 0x1e, 0x40, 0x43, 0x0c, 0x00, 0x65, 0x1f, 0x0c, 0x00, 0x23,
+ 0x0d, 0x0f, 0x22, 0x24,
+ 0x0f, 0x0e, 0x46, 0x11, 0xff, 0x0f, 0x72, 0x00, 0xfc, 0x12, 0x23, 0x0c,
+ 0xcd, 0x31, 0x44, 0x0f,
+ 0xb8, 0x0f, 0x53, 0x03, 0xfd, 0xed, 0x11, 0x46, 0x00, 0xcc, 0x00, 0x22,
+ 0x21, 0xfe, 0x00, 0x31,
+ 0x32, 0xf0, 0xed, 0x00, 0x33, 0x21, 0xcd, 0xcd, 0x04, 0x13, 0xed, 0x99,
+ 0xf0, 0xff, 0xf1, 0xf1,
+ 0x01, 0x00, 0xba, 0x00, 0x15, 0x00, 0xde, 0xe0, 0x22, 0x13, 0xaf, 0xf0,
+ 0x04, 0xdf, 0xef, 0x10,
+ 0xf0, 0xcd, 0x52, 0x25, 0x0f, 0xed, 0x1e, 0x61, 0x0f, 0xda, 0x0f, 0x42,
+ 0x43, 0xeb, 0xfe, 0x22,
+ 0x01, 0x00, 0xff, 0xdf, 0xf1, 0x05, 0x22, 0xf1, 0x8c, 0xcf, 0x00, 0x14,
+ 0xff, 0xff, 0xe1, 0xd0,
+ 0x0b, 0x01, 0x02, 0x02, 0x00, 0x88, 0x00, 0x23, 0x02, 0xf0, 0x01, 0xef,
+ 0xee, 0x04, 0xd1, 0xa1,
+ 0x01, 0xf1, 0xa9, 0x00, 0x34, 0xf0, 0xdd, 0x01, 0x32, 0x00, 0xdd, 0x10,
+ 0x50, 0x00, 0x00, 0x05,
+ 0xf0, 0xcd, 0x23, 0x12, 0x88, 0xef, 0x02, 0xf2, 0xcb, 0xfd, 0x00, 0x10,
+ 0x10, 0x00, 0x2f, 0x00,
+ 0x10, 0x54, 0x00, 0xde, 0xdc, 0x10, 0x33, 0xf3, 0x8a, 0xd0, 0x23, 0x00,
+ 0xdd, 0xbc, 0x12, 0x45,
+ 0xff, 0xdd, 0x20, 0x23, 0x01, 0xcd, 0xdc, 0xf1, 0xd4, 0xb1, 0xd0, 0xc2,
+ 0xd4, 0x03, 0xdd, 0x9b,
+ 0xf3, 0x07, 0xf0, 0xde, 0xf0, 0x03, 0x0e, 0xcc, 0x00, 0x10, 0x21, 0xdd,
+ 0xe0, 0x0d, 0xed, 0x02,
+ 0x06, 0xdf, 0xdc, 0x20, 0x54, 0xaf, 0xed, 0x02, 0x25, 0xbe, 0xef, 0xe1,
+ 0x05, 0xf1, 0xf0, 0xd0,
+ 0xad, 0x00, 0x04, 0xf0, 0xd0, 0x00, 0xf0, 0xd0, 0x10, 0x31, 0x0f, 0xfc,
+ 0x20, 0x10, 0xca, 0xde,
+ 0x72, 0x22, 0xdc, 0xdf, 0xc2, 0xd3, 0x15, 0x00, 0xcd, 0xe0, 0x0e, 0x8e,
+ 0xe1, 0x07, 0x34, 0x00,
+ 0xae, 0xee, 0x01, 0x36, 0xf0, 0xbc, 0x11, 0x42, 0x11, 0x01, 0x00, 0x00,
+ 0x61, 0x0e, 0x0d, 0x02,
+ 0x0e, 0x08, 0x20, 0x11, 0xff, 0xbf, 0x12, 0x23, 0x0e, 0xdd, 0x02, 0x35,
+ 0x0e, 0x0d, 0x20, 0x74,
+ 0x10, 0x1b, 0x20, 0x1d, 0x0d, 0x2f, 0x1d, 0x5f, 0x20, 0x01, 0x11, 0x1c,
+ 0xfb, 0xd1, 0x07, 0x43,
+ 0xcf, 0xcf, 0x00, 0xf2, 0x01, 0xf3, 0xee, 0x1b, 0x70, 0x11, 0xe0, 0x10,
+ 0x31, 0xdc, 0xef, 0x45,
+ 0x92, 0xd0, 0xf1, 0x00, 0x9b, 0xeb, 0xff, 0x11, 0x10, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb1, 0xee, 0x0a, 0xfb, 0x3b, 0xee, 0xfd, 0xfc, 0xcc, 0xaf, 0x0f, 0xf9,
+ 0x61, 0x67, 0x07, 0xe2,
+ 0xfc, 0x11, 0x01, 0x22, 0xcf, 0xee, 0x01, 0x20, 0xfc, 0x20, 0x10, 0xaf,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x63, 0x00, 0xbe, 0x12, 0x04, 0xe0, 0xf5, 0x00, 0x0f, 0xe0, 0x64, 0x11,
+ 0x02, 0xf4, 0xff, 0x43,
+ 0x46, 0xfd, 0xda, 0x10, 0x53, 0xff, 0xda, 0x10, 0x74, 0x00, 0xdb, 0xf0,
+ 0x0e, 0x10, 0x11, 0x00,
+ 0xe0, 0x00, 0x43, 0x02, 0xc0, 0x04, 0x40, 0xff, 0xf0, 0x11, 0x10, 0x0d,
+ 0x2d, 0xf0, 0x92, 0xeb,
+ 0x0e, 0x55, 0x01, 0xfb, 0xef, 0x01, 0x14, 0x00, 0xf0, 0xf0, 0x02, 0x00,
+ 0xef, 0x1e, 0x1c, 0x0a,
+ 0x7f, 0x60, 0x01, 0x00, 0xfe, 0xf0, 0x34, 0x25, 0xdf, 0xad, 0x0e, 0x03,
+ 0xc0, 0xed, 0x00, 0xf7,
+ 0xef, 0x0c, 0x00, 0x00, 0xd0, 0x42, 0x50, 0x1e, 0x2f, 0x00, 0x34, 0xe0,
+ 0x89, 0x11, 0x23, 0x0e,
+ 0xbb, 0x01, 0xf1, 0x03, 0xfd, 0xfc, 0x10, 0x33, 0x01, 0xdd, 0x0e, 0x75,
+ 0x02, 0x0e, 0x1f, 0x01,
+ 0xd4, 0xf0, 0xda, 0x01, 0x00, 0x80, 0x00, 0x27, 0x00, 0xd0, 0xf0, 0x21,
+ 0x54, 0x32, 0x11, 0x3f,
+ 0x10, 0x00, 0xce, 0x10, 0x40, 0x1f, 0xe9, 0xd0, 0x00, 0x1b, 0xbe, 0xff,
+ 0x20, 0x41, 0x0f, 0x4f,
+ 0x23, 0xf1, 0xe0, 0xe0, 0x02, 0x64, 0x0e, 0x8a, 0x00, 0x02, 0x02, 0x0f,
+ 0xfb, 0x01, 0x02, 0x30,
+ 0x30, 0x62, 0x03, 0x0d, 0x20, 0x37, 0x12, 0xde, 0x0f, 0x24, 0x32, 0x0e,
+ 0xac, 0xf0, 0xf2, 0x11,
+ 0x02, 0xd1, 0x0e, 0x1d, 0x55, 0x05, 0xf0, 0xee, 0xdc, 0xf0, 0x00, 0x14,
+ 0xc0, 0x8c, 0xd2, 0x24,
+ 0x0f, 0xae, 0x0f, 0x01, 0x0f, 0x2f, 0x20, 0x67, 0x10, 0x00, 0xf0, 0x06,
+ 0x00, 0xdd, 0xd0, 0x13,
+ 0x00, 0xff, 0xd2, 0xd2, 0xd0, 0xfd, 0x2f, 0x73, 0x53, 0x00, 0x03, 0x0d,
+ 0x2a, 0xfc, 0xab, 0x0e,
+ 0x00, 0x40, 0xf8, 0xca, 0x01, 0xe1, 0xc0, 0xff, 0x11, 0x21, 0x00, 0xf0,
+ 0x23, 0x60, 0xf0, 0x0e,
+ 0x00, 0x40, 0x24, 0x01, 0xab, 0xfe, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0e,
+ 0x20, 0x33, 0x0f, 0xfe,
+ 0xf0, 0x15, 0x4f, 0xe8, 0xfe, 0x40, 0x00, 0x8f, 0xee, 0x11, 0x35, 0xdd,
+ 0xbe, 0x04, 0x13, 0xf0,
+ 0xed, 0x00, 0x10, 0xe0, 0xfb, 0x5f, 0x40, 0x01, 0x0f, 0x12, 0xf2, 0xfd,
+ 0x0a, 0x00, 0x01, 0xde,
+ 0xcf, 0x03, 0x07, 0xd4, 0xce, 0x71, 0x46, 0x10, 0x10, 0x11, 0x22, 0x31,
+ 0x73, 0x00, 0xf1, 0x04,
+ 0x0f, 0xef, 0x01, 0x44, 0x3d, 0x3a, 0x20, 0x3d, 0x0e, 0xcf, 0xf0, 0x42,
+ 0x1d, 0x88, 0xed, 0x02,
+ 0x01, 0xdf, 0xbe, 0xe1, 0xc1, 0xe3, 0x02, 0x46, 0x10, 0xbe, 0x0f, 0x12,
+ 0x42, 0x00, 0x00, 0x3e,
+ 0x41, 0x34, 0x02, 0xf5, 0xf1, 0xee, 0xf1, 0x36, 0x50, 0xdc, 0xc0, 0x20,
+ 0x02, 0xd0, 0xd0, 0xdf,
+ 0x0f, 0x5d, 0x3e, 0x42, 0x31, 0x1a, 0xf0, 0xf1, 0xae, 0xfa, 0x02, 0x05,
+ 0x10, 0xee, 0x9c, 0x0f,
+ 0x02, 0x10, 0xff, 0x0c, 0x5e, 0x3f, 0xff, 0xe0, 0x12, 0x33, 0xdc, 0xb0,
+ 0x02, 0x03, 0xef, 0xd8,
+ 0x00, 0x31, 0x11, 0x00, 0xf2, 0x33, 0xdb, 0xcb, 0x30, 0x75, 0x50, 0xff,
+ 0x0f, 0xd0, 0xe1, 0x00,
+ 0x31, 0xdf, 0x9e, 0xf1, 0xe1, 0xcd, 0xef, 0xf5, 0x05, 0xf1, 0xf1, 0x45,
+ 0x01, 0x23, 0x41, 0x02,
+ 0x43, 0x30, 0x3b, 0x40, 0x72, 0x32, 0x0d, 0x1d, 0x12, 0x54, 0x0d, 0x08,
+ 0x00, 0x30, 0x0f, 0xd0,
+ 0xc0, 0x00, 0x20, 0xff, 0xe2, 0xe2, 0xa1, 0xbb, 0xfd, 0xf1, 0x16, 0x0f,
+ 0xbd, 0xf0, 0x13, 0x56,
+ 0x10, 0x0f, 0xef, 0x1f, 0x20, 0x20, 0x33, 0x00, 0xce, 0x00, 0x22, 0x47,
+ 0xcf, 0xdc, 0x0f, 0x20,
+ 0x61, 0x12, 0x41, 0x2d, 0x0d, 0x02, 0x12, 0x27, 0x03, 0xa0, 0xf0, 0xec,
+ 0xf0, 0xef, 0xee, 0xe1,
+ 0xe5, 0xef, 0xbb, 0x00, 0x03, 0x5e, 0x0a, 0x10, 0x21, 0x00, 0x4f, 0x30,
+ 0xfe, 0x3c, 0x7f, 0xdf,
+ 0xd1, 0xe4, 0xe0, 0xf0, 0xb4, 0xd2, 0xf0, 0x0d, 0x00, 0x30, 0x1e, 0x21,
+ 0x77, 0x11, 0xc8, 0xfc,
+ 0x21, 0x02, 0xf0, 0xdd, 0xcf, 0xf0, 0x02, 0x01, 0xc0, 0xed, 0x21, 0x54,
+ 0x02, 0x13, 0x00, 0xfd,
+ 0xce, 0x00, 0x27, 0x31, 0xb0, 0xee, 0xdf, 0xce, 0x11, 0x17, 0xd0, 0xef,
+ 0xdf, 0xae, 0x12, 0x1f,
+ 0x28, 0x3f, 0x70, 0x20, 0x00, 0x20, 0x23, 0x00, 0x00, 0x10, 0x00, 0xac,
+ 0xf2, 0x07, 0x02, 0x20,
+ 0x30, 0x0e, 0xc0, 0x20, 0x70, 0x30, 0x0e, 0x0c, 0xdb, 0xee, 0xbf, 0xe0,
+ 0x01, 0xf0, 0xde, 0xb2,
+ 0xf6, 0x02, 0x44, 0xfe, 0xdd, 0x31, 0x76, 0x00, 0x0e, 0x00, 0x20, 0x20,
+ 0x23, 0x10, 0x0b, 0xd0,
+ 0x44, 0x57, 0xf0, 0xbf, 0x20, 0x52, 0x0f, 0xfc, 0x10, 0x2e, 0x0d, 0xee,
+ 0x00, 0x23, 0x21, 0xdc,
+ 0xd0, 0xf5, 0xe2, 0xb1, 0xce, 0xee, 0x11, 0x23, 0xf2, 0x00, 0xcb, 0xbe,
+ 0x0c, 0xf0, 0x10, 0x30,
+ 0x73, 0x25, 0xec, 0xd0, 0x23, 0x03, 0xb1, 0xf1, 0xf7, 0x02, 0xd0, 0xef,
+ 0x00, 0x10, 0x30, 0x74,
+ 0x73, 0x00, 0x09, 0x31, 0x23, 0x21, 0x00, 0xbf, 0x01, 0x04, 0x1e, 0xf0,
+ 0xd1, 0xe3, 0x0f, 0xda,
+ 0xad, 0x10, 0x37, 0x00, 0xfd, 0x2e, 0x6e, 0x0c, 0xd0, 0x00, 0x51, 0x02,
+ 0xf0, 0x00, 0x02, 0x01,
+ 0xd0, 0xda, 0xcd, 0xee, 0x22, 0x37, 0xef, 0xfc, 0x70, 0x30, 0xe0, 0x0e,
+ 0x40, 0x0f, 0xde, 0xfe,
+ 0xec, 0xff, 0xe1, 0xf4, 0x03, 0x00, 0xb1, 0x90, 0xf7, 0x03, 0x10, 0xde,
+ 0xf3, 0x17, 0x13, 0x0d,
+ 0x10, 0x31, 0x00, 0x0e, 0x72, 0x74, 0x0d, 0xee, 0x21, 0x10, 0x2d, 0x09,
+ 0xfd, 0x20, 0x71, 0x00,
+ 0xfd, 0xff, 0x0e, 0xd0, 0xf0, 0xf0, 0x17, 0xf0, 0xbe, 0xf0, 0xf3, 0xf0,
+ 0x00, 0x57, 0x01, 0x32,
+ 0x60, 0x0f, 0x0d, 0xe1, 0x17, 0x13, 0xfd, 0xe0, 0xf3, 0xe0, 0x0d, 0x0e,
+ 0xfc, 0x0d, 0x6e, 0x20,
+ 0x11, 0x07, 0x75, 0x00, 0xcc, 0xf0, 0xee, 0xf1, 0xf2, 0x03, 0x30, 0xbc,
+ 0xe1, 0xd4, 0xde, 0x11,
+ 0x76, 0x10, 0x12, 0x2f, 0x4d, 0x1f, 0x21, 0x30, 0x11, 0x10, 0xe0, 0xe1,
+ 0xe6, 0x01, 0xce, 0xe0,
+ 0xa0, 0xf3, 0x07, 0xdf, 0xdf, 0x0f, 0x0e, 0xed, 0x66, 0x63, 0x0f, 0x0b,
+ 0x00, 0x10, 0x12, 0xfc,
+ 0xde, 0x1e, 0x1e, 0xfd, 0xd0, 0xd3, 0xd0, 0x0c, 0x0f, 0x8d, 0xff, 0x30,
+ 0x26, 0x21, 0x11, 0x20,
+ 0x07, 0xe0, 0x01, 0xdd, 0x8d, 0x00, 0xf5, 0xe0, 0xff, 0x02, 0x02, 0xf0,
+ 0x9b, 0x00, 0x41, 0x00,
+ 0x0d, 0xef, 0x10, 0x01, 0x9e, 0x0e, 0x0f, 0x2d, 0xfc, 0x9c, 0xfe, 0x01,
+ 0x32, 0x20, 0x14, 0x03,
+ 0x04, 0xf3, 0x07, 0x71, 0x20, 0x12, 0x06, 0x00, 0xfb, 0xde, 0x10, 0x21,
+ 0x00, 0x0c, 0x00, 0xc1,
+ 0xc2, 0xdf, 0xfe, 0x11, 0xd4, 0xbf, 0x0e, 0x67, 0x25, 0xe0, 0xbf, 0x01,
+ 0xe2, 0x0f, 0xe0, 0x12,
+ 0x10, 0x1e, 0x20, 0x4f, 0x53, 0x2f, 0x4c, 0x1e, 0xff, 0x21, 0x44, 0x0b,
+ 0x0b, 0x1f, 0x31, 0x03,
+ 0x9f, 0xfb, 0xf0, 0xe2, 0x03, 0xf3, 0x00, 0xfb, 0xce, 0x21, 0x72, 0x71,
+ 0x11, 0x0d, 0xff, 0x01,
+ 0x05, 0xff, 0xe1, 0xf2, 0xdc, 0xcc, 0xd1, 0xe0, 0xed, 0xe0, 0xef, 0x22,
+ 0x37, 0x4f, 0x7e, 0x40,
+ 0x10, 0x12, 0x44, 0xf9, 0xdd, 0xee, 0xf0, 0x03, 0xf2, 0xf2, 0xc2, 0x0c,
+ 0x0d, 0xcf, 0x17, 0x32,
+ 0xca, 0xee, 0x70, 0x44, 0x00, 0xdf, 0xfd, 0x31, 0x10, 0xfd, 0xcf, 0x02,
+ 0xf6, 0xf0, 0x02, 0xe0,
+ 0xd0, 0xef, 0xdf, 0x0f, 0x0e, 0xde, 0xe0, 0xf2, 0x54, 0x7b, 0x2d, 0x4f,
+ 0x0b, 0xeb, 0xff, 0x10,
+ 0x00, 0xcd, 0x0f, 0x42, 0xf4, 0x92, 0xf3, 0x07, 0x00, 0xe2, 0xe0, 0xf3,
+ 0x01, 0x33, 0x41, 0xd0,
+ 0xf0, 0x14, 0x04, 0x11, 0x30, 0x5e, 0x30, 0x13, 0x74, 0x32, 0x2c, 0x2d,
+ 0x60, 0x1d, 0xf8, 0xf0,
+ 0xf0, 0xc0, 0xfa, 0x00, 0x01, 0xaf, 0xdb, 0x10, 0x41, 0x10, 0x0e, 0x00,
+ 0x62, 0x00, 0xf0, 0x15,
+ 0x15, 0xef, 0xfc, 0x00, 0x42, 0x10, 0xde, 0xfd, 0x32, 0x34, 0xe0, 0xe0,
+ 0x41, 0x11, 0x20, 0x75,
+ 0x74, 0x10, 0x1f, 0x0f, 0xd0, 0x01, 0x32, 0x0e, 0x00, 0xa0, 0xde, 0xf5,
+ 0x16, 0x10, 0xec, 0xbf,
+ 0x0e, 0x10, 0x33, 0x01, 0xd2, 0x54, 0x2e, 0x1b, 0xf0, 0xef, 0x0d, 0xe0,
+ 0xf2, 0x04, 0xc0, 0xe0,
+ 0x07, 0x23, 0x62, 0x00, 0xcd, 0xf0, 0x13, 0x41, 0x0e, 0x00, 0x07, 0x21,
+ 0xd0, 0xcd, 0x0d, 0xff,
+ 0xe0, 0x90, 0xdb, 0xfc, 0xdb, 0xef, 0x41, 0x75, 0x0f, 0xfc, 0x00, 0x10,
+ 0x62, 0x01, 0x00, 0x00,
+ 0xfe, 0x00, 0xf5, 0xd0, 0xfc, 0xef, 0x00, 0x31, 0xd1, 0x8d, 0x00, 0x23,
+ 0x11, 0xda, 0xd0, 0x10,
+ 0x31, 0xec, 0xe0, 0x2f, 0x5f, 0xff, 0xff, 0x11, 0x20, 0x20, 0x02, 0x14,
+ 0x44, 0x1e, 0xba, 0xe0,
+ 0x50, 0x00, 0xba, 0x00, 0x12, 0x10, 0xfc, 0xf2, 0x23, 0x41, 0xfb, 0x0e,
+ 0x70, 0x0f, 0x0b, 0x00,
+ 0x1f, 0xcf, 0xf0, 0xf0, 0x0f, 0xd3, 0xc7, 0xf4, 0x00, 0x01, 0x80, 0x04,
+ 0x10, 0x23, 0x02, 0x30,
+ 0x05, 0x01, 0x10, 0x7f, 0x30, 0x10, 0x2e, 0x20, 0x11, 0x55, 0x2e, 0xfa,
+ 0xc0, 0xfe, 0xe0, 0x02,
+ 0x01, 0xcf, 0xda, 0xee, 0x00, 0xd0, 0xd1, 0xd1, 0x0f, 0x70, 0x10, 0xf0,
+ 0x11, 0x77, 0x00, 0x0f,
+ 0xec, 0x00, 0xf1, 0xd2, 0x06, 0x41, 0xe0, 0xce, 0xcf, 0xce, 0x10, 0x32,
+ 0x10, 0x0e, 0x20, 0x74,
+ 0x35, 0x02, 0x52, 0x0f, 0x0d, 0xd1, 0xf7, 0x00, 0xea, 0xd0, 0x01, 0xe1,
+ 0xe0, 0xfe, 0x1f, 0x7e,
+ 0x6f, 0x02, 0x03, 0x30, 0x0e, 0x0b, 0xcf, 0x00, 0x23, 0xfe, 0xec, 0x00,
+ 0xe0, 0xb0, 0xc0, 0xf2,
+ 0x0f, 0x0c, 0x20, 0x37, 0x40, 0x0f, 0x0c, 0x40, 0x34, 0x0c, 0x0d, 0x10,
+ 0x65, 0xf1, 0xbf, 0x0d,
+ 0xff, 0xdd, 0xcd, 0xf1, 0x0e, 0xd8, 0x00, 0x00, 0x04, 0x30, 0x0d, 0xd0,
+ 0x07, 0x25, 0xe0, 0xb0,
+ 0xd1, 0x90, 0x00, 0xf0, 0xf1, 0x31, 0x50, 0x50, 0x40, 0x23, 0x1f, 0x1e,
+ 0x42, 0x01, 0x0e, 0x2d,
+ 0x10, 0x10, 0xe0, 0xb9, 0xe0, 0x01, 0xe0, 0xed, 0x02, 0x37, 0x02, 0xdd,
+ 0x1c, 0x60, 0x00, 0x0c,
+ 0xf0, 0x03, 0xfe, 0x8e, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xcb, 0x20, 0x60,
+ 0x00, 0x10, 0x20, 0x12,
+ 0x33, 0x24, 0x00, 0xdb, 0xee, 0x1f, 0x5f, 0x11, 0x06, 0x00, 0xd0, 0xb0,
+ 0xbe, 0x05, 0x01, 0x01,
+ 0x20, 0x41, 0x0b, 0xfd, 0xf0, 0x40, 0x30, 0xdc, 0xde, 0x43, 0x23, 0x8d,
+ 0xe8, 0x00, 0xf0, 0xe0,
+ 0xe0, 0x01, 0x06, 0x50, 0xee, 0x00, 0x13, 0x10, 0xfe, 0x0f, 0x21, 0x03,
+ 0x31, 0x8b, 0xdd, 0xfd,
+ 0x10, 0x20, 0xb0, 0xee, 0x08, 0x1e, 0x6f, 0x00, 0xc0, 0x01, 0x03, 0x21,
+ 0x30, 0x01, 0xc2, 0xd3,
+ 0x03, 0x04, 0x0e, 0xed, 0xb0, 0xff, 0xfe, 0xdf, 0xf1, 0x0a, 0x09, 0x4e,
+ 0x00, 0xb2, 0x04, 0x21,
+ 0x3f, 0xac, 0xe0, 0xd2, 0xef, 0xf1, 0x00, 0x00, 0x20, 0x32, 0x1a, 0x7f,
+ 0x42, 0x24, 0x2f, 0x30,
+ 0x17, 0x11, 0x0c, 0x40, 0x76, 0x00, 0xed, 0xff, 0x12, 0x00, 0xbf, 0x00,
+ 0x20, 0x00, 0xdd, 0x0f,
+ 0x0e, 0xec, 0xee, 0xf0, 0x01, 0x60, 0x0d, 0x91, 0xe7, 0xf6, 0xf0, 0xd0,
+ 0xef, 0x03, 0x43, 0x3c,
+ 0x0c, 0x00, 0x74, 0x2f, 0x20, 0x3f, 0x3f, 0x1e, 0x33, 0x35, 0x10, 0xec,
+ 0xcd, 0x02, 0xe5, 0xef,
+ 0x00, 0x51, 0xf0, 0x9f, 0x0f, 0x55, 0x00, 0x0d, 0x2f, 0x23, 0x04, 0xea,
+ 0xcd, 0x00, 0x04, 0xe0,
+ 0xa0, 0xf0, 0x00, 0xff, 0xdd, 0xe2, 0xe2, 0x00, 0xfd, 0x1f, 0x77, 0x07,
+ 0xf0, 0x0e, 0x31, 0x42,
+ 0x20, 0x0f, 0x01, 0x45, 0x20, 0x10, 0x11, 0x02, 0x20, 0x52, 0xf0, 0xe0,
+ 0x00, 0x50, 0xf0, 0x01,
+ 0xff, 0xda, 0x01, 0x21, 0xb0, 0xda, 0xef, 0xce, 0xcf, 0x30, 0x22, 0xd0,
+ 0xbd, 0xed, 0xd0, 0x0f,
+ 0x30, 0x74, 0x7d, 0x08, 0x00, 0x01, 0x02, 0x02, 0x05, 0xde, 0xc9, 0x00,
+ 0x30, 0xef, 0xcd, 0x2e,
+ 0x3c, 0x4f, 0x50, 0x01, 0xee, 0x1e, 0x50, 0x02, 0xb1, 0x07, 0x05, 0xf0,
+ 0xd0, 0xf2, 0xd2, 0xd0,
+ 0xc0, 0xf1, 0xf0, 0xe2, 0x04, 0x0f, 0x0c, 0x6f, 0x5f, 0x10, 0x2c, 0x01,
+ 0x55, 0x11, 0x0d, 0x2f,
+ 0x02, 0x02, 0xfb, 0xde, 0xee, 0x01, 0x0e, 0x08, 0xcf, 0x01, 0x32, 0x21,
+ 0x60, 0x10, 0x00, 0xf0,
+ 0xe1, 0x12, 0x12, 0x15, 0x81, 0xef, 0xe0, 0x04, 0xe5, 0xbf, 0x20, 0x42,
+ 0x2d, 0x3c, 0x30, 0x30,
+ 0xfe, 0x3c, 0x50, 0x0f, 0xbe, 0x03, 0x37, 0xe0, 0x80, 0xf4, 0x05, 0x10,
+ 0xdf, 0xdd, 0x00, 0x23,
+ 0x64, 0x0f, 0xfd, 0x2f, 0x1c, 0x30, 0x33, 0x1f, 0xe9, 0x00, 0x63, 0x17,
+ 0xe0, 0xce, 0x00, 0x23,
+ 0xf1, 0xc0, 0x1f, 0x01, 0xe1, 0x11, 0x40, 0x02, 0xf4, 0xd0, 0x0e, 0x30,
+ 0x4e, 0xc9, 0xdf, 0x00,
+ 0x01, 0xed, 0xcd, 0x11, 0x74, 0x32, 0x30, 0xe8, 0xdc, 0x00, 0x01, 0x00,
+ 0xdd, 0xbe, 0xdd, 0x00,
+ 0x20, 0x43, 0xe0, 0x31, 0x40, 0x1e, 0x73, 0x05, 0x03, 0xa5, 0xf0, 0xee,
+ 0xfd, 0xc7, 0x13, 0x0f,
+ 0xaa, 0xef, 0xe0, 0x0d, 0x00, 0xef, 0xe0, 0xff, 0x1e, 0x0d, 0x0e, 0x23,
+ 0x31, 0x6e, 0x2d, 0x24,
+ 0x07, 0x33, 0x42, 0x71, 0x10, 0x0f, 0xad, 0xf0, 0x00, 0x09, 0x0d, 0x0f,
+ 0x0f, 0x20, 0x40, 0x20,
+ 0x10, 0x02, 0x02, 0x14, 0x02, 0xcf, 0xcf, 0xc7, 0xc1, 0xd2, 0xc1, 0xc0,
+ 0x00, 0x27, 0x07, 0xd1,
+ 0xef, 0x0f, 0x30, 0x71, 0x60, 0x10, 0x00, 0x20, 0x10, 0x10, 0x05, 0xf0,
+ 0xec, 0xfe, 0x02, 0x15,
+ 0x20, 0xee, 0xcf, 0x2f, 0x3f, 0x41, 0xf2, 0x2e, 0x7c, 0x5e, 0xff, 0xe4,
+ 0x14, 0x0a, 0xfd, 0xf1,
+ 0x02, 0xd0, 0x03, 0x27, 0xe0, 0xbc, 0xc0, 0xf1, 0xe0, 0xea, 0x00, 0x63,
+ 0x01, 0xdd, 0x0f, 0x30,
+ 0x10, 0x0e, 0x0f, 0x30, 0x03, 0x01, 0x05, 0x72, 0x52, 0x02, 0xf0, 0xd1,
+ 0xfd, 0x0b, 0x2e, 0x3f,
+ 0x0d, 0x08, 0x4e, 0x0e, 0x00, 0x31, 0xc1, 0x84, 0xe0, 0xfd, 0xf1, 0xd7,
+ 0x03, 0x2e, 0xed, 0xa0,
+ 0x03, 0x05, 0x1f, 0xfd, 0xd0, 0x00, 0xbd, 0x0f, 0x61, 0x0e, 0x08, 0x0f,
+ 0x10, 0x20, 0x1f, 0x0d,
+ 0x31, 0x73, 0x20, 0xde, 0xed, 0xbf, 0xfd, 0xf0, 0xb1, 0xe0, 0xf5, 0xf3,
+ 0xd5, 0x07, 0x12, 0xef,
+ 0x0f, 0x63, 0x04, 0x32, 0x52, 0x11, 0x32, 0x13, 0xd0, 0xbb, 0x0f, 0x1e,
+ 0x0f, 0x12, 0x07, 0x04,
+ 0x0f, 0xed, 0x01, 0x31, 0x10, 0x0e, 0x50, 0x5c, 0x0c, 0x0e, 0x2f, 0x6e,
+ 0x3e, 0xfc, 0xde, 0x01,
+ 0x17, 0x11, 0x80, 0x00, 0xe0, 0xfe, 0x01, 0xf1, 0x01, 0x20, 0x0d, 0x09,
+ 0x30, 0x3e, 0x50, 0x41,
+ 0x52, 0x11, 0x17, 0x02, 0x00, 0x44, 0x33, 0xd2, 0xe4, 0xf0, 0xd0, 0xf0,
+ 0x01, 0x00, 0xe1, 0x0b,
+ 0x0a, 0x3f, 0x7e, 0x20, 0x12, 0x20, 0xec, 0xe0, 0x34, 0xd0, 0xcd, 0x01,
+ 0xa4, 0xb2, 0xd0, 0xf2,
+ 0xe6, 0x21, 0x4f, 0xec, 0x11, 0x43, 0x0d, 0x0e, 0x42, 0x76, 0x01, 0x13,
+ 0x01, 0xc1, 0x00, 0xfe,
+ 0xdf, 0xfe, 0xf1, 0xee, 0xe8, 0xfd, 0x00, 0xe0, 0xb2, 0xed, 0x5b, 0x50,
+ 0x11, 0x11, 0x1f, 0x0d,
+ 0x0d, 0x24, 0xf5, 0xc2, 0x0f, 0xde, 0x8c, 0xf0, 0x0e, 0x00, 0x20, 0xf0,
+ 0xef, 0x01, 0x07, 0xdf,
+ 0xad, 0x00, 0x01, 0xed, 0xea, 0x10, 0x31, 0xf1, 0xdf, 0x3d, 0x7d, 0x0e,
+ 0x26, 0x57, 0x20, 0x30,
+ 0x00, 0xaf, 0x00, 0x01, 0x00, 0xf0, 0xc0, 0x0b, 0xff, 0x0e, 0x01, 0x01,
+ 0x28, 0x00, 0x29, 0x00,
+ 0x5f, 0xf8, 0x7b, 0x1c, 0x99, 0xf9, 0xb3, 0x1f, 0x0c, 0x00, 0x76, 0x70,
+ 0x0f, 0xfd, 0x03, 0x03,
+ 0x0d, 0xda, 0xe0, 0xd0, 0xe0, 0xd0, 0xe2, 0xd2, 0xf2, 0x22, 0x23, 0x15,
+ 0x75, 0x40, 0x31, 0x44,
+ 0xf1, 0x02, 0x22, 0x30, 0x00, 0x10, 0x12, 0xff, 0xed, 0x30, 0x44, 0x00,
+ 0xfe, 0x0f, 0x3d, 0x08,
+ 0xac, 0x00, 0x60, 0x12, 0x11, 0xee, 0x9b, 0x00, 0xfe, 0xf0, 0xdd, 0xff,
+ 0xdb, 0xbd, 0x00, 0x04,
+ 0x10, 0xec, 0xfe, 0x35, 0x56, 0x00, 0x0f, 0x50, 0x32, 0x11, 0xfe, 0xdd,
+ 0xe0, 0xf3, 0xe0, 0xcc,
+ 0x03, 0x17, 0xf0, 0xe0, 0x60, 0x46, 0x41, 0x21, 0x00, 0x40, 0xf0, 0xef,
+ 0xe0, 0x00, 0x01, 0xff,
+ 0xea, 0xee, 0xdc, 0x0e, 0x60, 0x12, 0x11, 0x4e, 0x01, 0x26, 0x01, 0xbe,
+ 0xee, 0x21, 0x12, 0xbe,
+ 0xcd, 0x02, 0x12, 0x31, 0x20, 0x2b, 0x4f, 0x40, 0x41, 0x0b, 0x0c, 0x0f,
+ 0x3f, 0x20, 0x12, 0x01,
+ 0x0c, 0xab, 0xbe, 0xf0, 0xaa, 0xfe, 0xef, 0xd0, 0xef, 0xd1, 0x07, 0xf2,
+ 0xe1, 0xef, 0x31, 0x63,
+ 0x16, 0x42, 0x10, 0x01, 0x0e, 0xe0, 0xb1, 0xe2, 0x1d, 0x10, 0x34, 0x45,
+ 0x20, 0x00, 0x51, 0x55,
+ 0x40, 0x22, 0x42, 0x1f, 0x0c, 0xfe, 0xef, 0x00, 0x02, 0x0d, 0x8a, 0xf0,
+ 0xf2, 0xf0, 0xe0, 0xf0,
+ 0xd0, 0x0e, 0x0f, 0x24, 0x32, 0x1d, 0x6c, 0x31, 0x01, 0x09, 0xed, 0x31,
+ 0x30, 0xfe, 0xcf, 0xf2,
+ 0xf7, 0xce, 0xed, 0x01, 0x05, 0x00, 0x11, 0x52, 0x51, 0x34, 0x11, 0x23,
+ 0x31, 0x1c, 0xfa, 0xdf,
+ 0xe0, 0xd0, 0xb0, 0x0e, 0x31, 0xe2, 0x8d, 0xdb, 0x01, 0x32, 0x0e, 0x1a,
+ 0x30, 0x02, 0x01, 0xd1,
+ 0x02, 0xf4, 0xae, 0xef, 0x02, 0xf2, 0xec, 0x01, 0x26, 0xe0, 0x00, 0xab,
+ 0xde, 0x2e, 0x50, 0x20,
+ 0xfb, 0xcf, 0xfe, 0xff, 0xe0, 0x12, 0x74, 0xff, 0xac, 0x04, 0x03, 0x0e,
+ 0xbb, 0x11, 0x21, 0x00,
+ 0x0b, 0xf0, 0x00, 0x1f, 0x0f, 0x10, 0x36, 0x10, 0xc0, 0x9f, 0xe0, 0x00,
+ 0xf0, 0xf2, 0xc1, 0x00,
+ 0xde, 0xfc, 0x00, 0x20, 0xee, 0xdf, 0x0e, 0x1f, 0x7e, 0x51, 0x17, 0x23,
+ 0x25, 0x02, 0x11, 0x12,
+ 0x12, 0x32, 0x20, 0xfa, 0xff, 0x0b, 0x1e, 0x20, 0x30, 0x31, 0x5f, 0x2d,
+ 0x01, 0x92, 0xe2, 0xf0,
+ 0xf0, 0xa0, 0xe3, 0xe4, 0xfd, 0xb8, 0xec, 0x02, 0xf1, 0x0f, 0x0c, 0x3e,
+ 0x50, 0x27, 0x61, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x0c, 0xcf, 0x00, 0x02, 0x0d, 0xbc, 0x0f, 0x11,
+ 0x57, 0x04, 0x10, 0x10,
+ 0x55, 0x00, 0x00, 0x10, 0x30, 0x1e, 0x00, 0x0d, 0xfd, 0xed, 0xff, 0x14,
+ 0xf4, 0xae, 0xda, 0xf0,
+ 0xf1, 0x00, 0xf0, 0x32, 0x74, 0x21, 0x00, 0xb2, 0xe1, 0xfd, 0xfd, 0xf3,
+ 0xf5, 0x0e, 0x0b, 0xee,
+ 0xe1, 0x77, 0x71, 0x01, 0x01, 0xf1, 0x14, 0x61, 0x03, 0x01, 0x0f, 0x0f,
+ 0xe0, 0xf0, 0xec, 0xff,
+ 0xf0, 0xe1, 0xfe, 0xd8, 0x0a, 0x61, 0x23, 0x00, 0x0d, 0x21, 0x13, 0xf2,
+ 0xd0, 0x2f, 0x00, 0xc0,
+ 0xcd, 0x1d, 0x44, 0x15, 0xae, 0xfd, 0x0f, 0x30, 0x3d, 0x30, 0x40, 0x2c,
+ 0x08, 0x0d, 0x40, 0x3f,
+ 0xee, 0xd0, 0x0f, 0xd1, 0x90, 0xf0, 0xd6, 0xe0, 0xad, 0xfe, 0xd1, 0x07,
+ 0xf2, 0x00, 0x31, 0xe1,
+ 0xf0, 0x1e, 0xf1, 0xf1, 0x3f, 0x4e, 0x21, 0x43, 0xe0, 0xae, 0xf1, 0xf7,
+ 0x04, 0xdc, 0x1f, 0x5f,
+ 0x53, 0x75, 0x10, 0x0e, 0x1f, 0x0a, 0xfc, 0x00, 0x03, 0x11, 0xe0, 0xfd,
+ 0xe1, 0xd3, 0xd1, 0xb2,
+ 0x02, 0xce, 0xdc, 0x17, 0x62, 0x00, 0x3c, 0x41, 0x02, 0x10, 0x2d, 0x0f,
+ 0x20, 0x10, 0x40, 0x05,
+ 0x02, 0xbf, 0xdc, 0xf0, 0xe5, 0x03, 0x0f, 0xdc, 0x01, 0x13, 0x4e, 0x3d,
+ 0x74, 0x12, 0xff, 0xcb,
+ 0x01, 0x01, 0x00, 0xed, 0xd0, 0x46, 0x72, 0x10, 0xfe, 0x01, 0x00, 0x0d,
+ 0x0c, 0x42, 0x65, 0x00,
+ 0xcf, 0x03, 0x16, 0x01, 0xd1, 0xe0, 0x00, 0x06, 0x13, 0x00, 0x0e, 0x40,
+ 0x32, 0x1e, 0x3a, 0x50,
+ 0xef, 0x00, 0x71, 0xf0, 0xec, 0x1e, 0x50, 0x04, 0xbf, 0x0c, 0xee, 0xdb,
+ 0x00, 0x00, 0x42, 0x10,
+ 0x0b, 0x3e, 0x70, 0x11, 0x01, 0x00, 0xff, 0xf5, 0x04, 0xc0, 0xe0, 0xc0,
+ 0xce, 0xcf, 0xf0, 0x02,
+ 0xfa, 0xdc, 0x0f, 0x10, 0x2c, 0x2e, 0x3f, 0x43, 0xb1, 0xdd, 0x1d, 0x01,
+ 0x93, 0xf5, 0xe5, 0x22,
+ 0xf1, 0xdf, 0xbe, 0x11, 0x15, 0x0d, 0x19, 0x7f, 0x4f, 0x0f, 0x0f, 0x31,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x04, 0xf3, 0xf0, 0x01, 0xe5, 0xd0, 0xa1, 0xd0, 0xed, 0xff, 0xf0, 0x03,
+ 0x24, 0x20, 0xda, 0x22,
+ 0x75, 0x30, 0xee, 0x10, 0x44, 0x31, 0x53, 0x01, 0xc3, 0x00, 0xfd, 0x1f,
+ 0x50, 0x0f, 0x0a, 0x0e,
+ 0x40, 0x56, 0x0f, 0xfd, 0xff, 0x00, 0xe1, 0xf1, 0x45, 0x01, 0x9d, 0xf9,
+ 0x10, 0x21, 0x01, 0x00,
+ 0x00, 0xff, 0x0f, 0x3f, 0x10, 0x14, 0x75, 0x0f, 0xea, 0xd0, 0xe2, 0xc1,
+ 0xff, 0x1e, 0x10, 0xd0,
+ 0xa0, 0xf3, 0xfe, 0x0d, 0x43, 0x25, 0x21, 0x20, 0x40, 0xe0, 0xcf, 0x53,
+ 0x2f, 0x08, 0xdb, 0xdf,
+ 0x0f, 0xf0, 0x01, 0xcf, 0xad, 0x00, 0x42, 0x27, 0x20, 0x0f, 0xbd, 0xf0,
+ 0x02, 0x03, 0xe2, 0xf0,
+ 0x01, 0xb0, 0xec, 0xd0, 0x44, 0x00, 0x2b, 0x2f, 0x30, 0x60, 0x10, 0x2f,
+ 0xf8, 0xf0, 0xf0, 0xdf,
+ 0xfd, 0x0e, 0xe0, 0x80, 0xae, 0x0e, 0x00, 0xe5, 0xe3, 0x04, 0xd0, 0x0f,
+ 0x0b, 0x40, 0x20, 0x44,
+ 0x30, 0x0d, 0x10, 0x07, 0x35, 0xc0, 0xd0, 0xf0, 0x02, 0xe1, 0x90, 0xd0,
+ 0xdf, 0x0f, 0x01, 0x63,
+ 0x52, 0x10, 0x1e, 0x1f, 0x43, 0x10, 0x18, 0x0e, 0xe2, 0x13, 0x3f, 0x20,
+ 0xe3, 0x88, 0xfe, 0xd0,
+ 0x00, 0x02, 0x0d, 0x0c, 0xf0, 0x4f, 0x2d, 0x0f, 0x00, 0x31, 0x61, 0x0f,
+ 0xe9, 0xe0, 0x10, 0x11,
+ 0x07, 0x45, 0x1f, 0x5f, 0x42, 0x21, 0x20, 0x00, 0x40, 0x33, 0x01, 0xde,
+ 0x10, 0x72, 0x42, 0x0d,
+ 0xce, 0xf0, 0xfd, 0x08, 0xee, 0xd1, 0x16, 0x10, 0x0e, 0x00, 0xa1, 0xed,
+ 0xf0, 0x25, 0x10, 0x1f,
+ 0x23, 0x35, 0x71, 0x0e, 0xde, 0x01, 0x63, 0x01, 0x0f, 0xff, 0x01, 0xe0,
+ 0xf1, 0x27, 0x57, 0xd0,
+ 0xae, 0x0e, 0xf1, 0xf3, 0xe0, 0xcf, 0xeb, 0xef, 0x00, 0x01, 0x0f, 0x1d,
+ 0x5d, 0x3d, 0x40, 0x22,
+ 0x57, 0x01, 0x0f, 0xff, 0x00, 0x00, 0xd0, 0xf3, 0xe0, 0xbb, 0xe0, 0xde,
+ 0xde, 0xf0, 0xcf, 0xd9,
+ 0x0e, 0x4f, 0x20, 0x1f, 0x0c, 0x60, 0x30, 0x16, 0x13, 0xc3, 0xa0, 0xed,
+ 0xc0, 0xe0, 0xd3, 0xef,
+ 0x0e, 0x2e, 0x4a, 0x2e, 0x7f, 0x21, 0x30, 0x0d, 0x1d, 0x56, 0x12, 0x0b,
+ 0xcb, 0xff, 0xe0, 0xff,
+ 0xfe, 0x00, 0xd0, 0xcf, 0xe2, 0x07, 0x03, 0xdf, 0x0c, 0xf0, 0x41, 0x72,
+ 0x40, 0x0f, 0xe0, 0x1f,
+ 0x12, 0x24, 0xfe, 0xef, 0x07, 0x45, 0x01, 0xd0, 0xde, 0xf2, 0x73, 0x73,
+ 0x00, 0xff, 0x0e, 0x0d,
+ 0x20, 0x2e, 0x0e, 0xde, 0x0d, 0xfc, 0x0e, 0x00, 0xda, 0xef, 0x23, 0x0f,
+ 0xfa, 0xf0, 0xe1, 0x62,
+ 0x32, 0x00, 0x00, 0xa9, 0xcd, 0xf0, 0x04, 0x10, 0xfc, 0xcf, 0xf0, 0x20,
+ 0x33, 0x02, 0xdf, 0xde,
+ 0x12, 0x47, 0x56, 0x40, 0x00, 0xd0, 0xd0, 0x31, 0x00, 0x80, 0xdf, 0x01,
+ 0x01, 0x31, 0x77, 0x22,
+ 0x0e, 0xec, 0x31, 0x60, 0x03, 0x0e, 0x0c, 0x00, 0xf0, 0xcd, 0x00, 0x10,
+ 0xeb, 0xe0, 0x12, 0x42,
+ 0x10, 0x02, 0x27, 0x07, 0xe0, 0x0d, 0x10, 0x50, 0x21, 0x1e, 0x3c, 0xef,
+ 0xe0, 0x0e, 0x5f, 0x10,
+ 0xdf, 0xee, 0x10, 0x34, 0xc0, 0x9c, 0xdb, 0xde, 0x10, 0x32, 0xe3, 0x80,
+ 0x0d, 0xfd, 0xdc, 0xe0,
+ 0xf2, 0x02, 0x01, 0xbe, 0xfa, 0xf3, 0x06, 0xd3, 0x04, 0x62, 0x12, 0x20,
+ 0x31, 0x43, 0x22, 0x60,
+ 0x0e, 0x3c, 0x2f, 0x02, 0x14, 0x35, 0x2f, 0x00, 0xc3, 0x02, 0xd0, 0xcd,
+ 0xd3, 0xd7, 0xf6, 0x9d,
+ 0xfe, 0xf0, 0xf0, 0x00, 0x2c, 0x3f, 0x0f, 0xfd, 0x1f, 0x71, 0x55, 0x10,
+ 0x0d, 0x0f, 0x00, 0xfe,
+ 0xf0, 0x02, 0xd1, 0xd1, 0xd2, 0x83, 0xf5, 0x00, 0x1e, 0x10, 0x27, 0x76,
+ 0x10, 0x1e, 0x0f, 0x40,
+ 0x01, 0x04, 0xf1, 0x30, 0x0a, 0xcf, 0xf0, 0x03, 0x21, 0xee, 0xcd, 0xf1,
+ 0x01, 0x30, 0xbe, 0xcd,
+ 0x11, 0x03, 0x01, 0x01, 0x31, 0x40, 0x2c, 0x61, 0x17, 0x11, 0x0d, 0x00,
+ 0xde, 0xbd, 0x20, 0x16,
+ 0xd2, 0x8c, 0xfb, 0x00, 0xf0, 0xee, 0xfd, 0x10, 0x0d, 0xff, 0xcc, 0x01,
+ 0x55, 0x00, 0xeb, 0x0e,
+ 0x70, 0x01, 0x02, 0xe1, 0xef, 0xfe, 0xfb, 0xe3, 0x06, 0xf0, 0xcb, 0x20,
+ 0x41, 0xe0, 0xde, 0x1e,
+ 0x20, 0xd1, 0xe0, 0x93, 0xe1, 0xf1, 0xee, 0x8a, 0xef, 0x01, 0x03, 0x10,
+ 0x03, 0x17, 0x33, 0x01,
+ 0x0e, 0x20, 0x51, 0x1f, 0x4b, 0x50, 0x23, 0x0f, 0x0e, 0x32, 0x52, 0x09,
+ 0xed, 0xd0, 0x02, 0xf0,
+ 0xca, 0xe0, 0xe0, 0xd0, 0xc1, 0xd0, 0x00, 0xf0, 0x10, 0x50, 0x55, 0x1c,
+ 0x0e, 0x01, 0xf1, 0xee,
+ 0x08, 0xed, 0xa0, 0xfe, 0xd0, 0xf2, 0x04, 0x01, 0xff, 0xce, 0x13, 0x77,
+ 0x12, 0x22, 0x12, 0x0e,
+ 0x1c, 0x0f, 0x01, 0x51, 0x2f, 0x20, 0x77, 0x21, 0x0d, 0xee, 0x43, 0x44,
+ 0x0f, 0xe9, 0x20, 0x42,
+ 0x11, 0xff, 0xd0, 0x11, 0x21, 0xfd, 0x9c, 0x01, 0xf5, 0xd0, 0xfd, 0xd0,
+ 0x0f, 0x00, 0xb0, 0x03,
+ 0x35, 0x61, 0x0f, 0x1f, 0x04, 0x03, 0x00, 0x23, 0x03, 0xbf, 0x0d, 0x02,
+ 0x06, 0x01, 0xbe, 0x10,
+ 0x65, 0x02, 0x20, 0x0d, 0x1e, 0x21, 0x13, 0xdb, 0xdb, 0xde, 0x8b, 0xf0,
+ 0x02, 0x07, 0xd1, 0xb0,
+ 0x0e, 0x21, 0x75, 0x01, 0x10, 0x1e, 0x10, 0x3f, 0x10, 0x11, 0xec, 0xbc,
+ 0x00, 0xfe, 0x0e, 0x1e,
+ 0xee, 0xd0, 0xee, 0xef, 0x20, 0x47, 0x01, 0x1f, 0x50, 0x30, 0x10, 0x3f,
+ 0x33, 0x0f, 0xcc, 0xdf,
+ 0x89, 0xb0, 0x00, 0xe3, 0xf1, 0xee, 0xef, 0x02, 0x05, 0x22, 0x14, 0x30,
+ 0x4f, 0x30, 0x52, 0x03,
+ 0x1c, 0xfc, 0xe0, 0x04, 0xdf, 0x0d, 0xc0, 0xe0, 0x0f, 0x33, 0x13, 0x0f,
+ 0x0e, 0x71, 0x15, 0x00,
+ 0xfb, 0x3f, 0x4f, 0x00, 0x02, 0x04, 0x00, 0xe0, 0xb7, 0x03, 0x2f, 0xfd,
+ 0xde, 0x30, 0x73, 0x11,
+ 0xfb, 0x00, 0x50, 0x0c, 0xfd, 0x00, 0x13, 0x16, 0x13, 0xf1, 0xf4, 0x35,
+ 0x0f, 0xdc, 0xc0, 0xe2,
+ 0xe0, 0xbc, 0x00, 0x62, 0x20, 0xfc, 0x0f, 0x02, 0xef, 0xee, 0x05, 0x23,
+ 0x0e, 0x1c, 0x03, 0xf5,
+ 0x01, 0x40, 0x1d, 0x23, 0x32, 0x40, 0x6f, 0x17, 0x17, 0x00, 0xfe, 0x20,
+ 0x53, 0xd0, 0xac, 0x01,
+ 0x17, 0x12, 0xe0, 0x9e, 0x00, 0xf1, 0x02, 0x0e, 0x0d, 0x3f, 0xf8, 0x2f,
+ 0x7f, 0x51, 0x01, 0xf0,
+ 0x00, 0x10, 0x00, 0xe0, 0x02, 0x00, 0x0d, 0xdb, 0x00, 0x00, 0x2f, 0x00,
+ 0xe1, 0xd0, 0x3b, 0x3d,
+ 0x2f, 0x03, 0x01, 0x8a, 0xee, 0x00, 0xee, 0xaf, 0xf1, 0xe7, 0xc0, 0xeb,
+ 0xe0, 0xf1, 0xd2, 0xe0,
+ 0xde, 0xef, 0x10, 0x43, 0x1f, 0x20, 0x51, 0x4d, 0x29, 0x31, 0x10, 0xfd,
+ 0xe9, 0x20, 0x63, 0x30,
+ 0x30, 0x1e, 0x00, 0x11, 0x30, 0x00, 0xb3, 0xf1, 0xe2, 0x07, 0x23, 0xd2,
+ 0x8f, 0xdc, 0xf0, 0xd0,
+ 0xe0, 0xae, 0x0d, 0x2f, 0x0d, 0x0f, 0x42, 0x37, 0x16, 0x20, 0x31, 0x66,
+ 0x00, 0xd1, 0x11, 0x13,
+ 0x0f, 0x9d, 0xf0, 0xf0, 0x0d, 0xdc, 0xeb, 0x30, 0x50, 0x20, 0x20, 0x40,
+ 0x30, 0x42, 0x15, 0x22,
+ 0xff, 0xfe, 0xf0, 0x04, 0xd0, 0xd0, 0xcc, 0xdc, 0xfd, 0xd0, 0xb0, 0xf5,
+ 0xf0, 0x1e, 0x2d, 0x30,
+ 0x41, 0xf0, 0xaf, 0x0f, 0xf3, 0xd3, 0xc6, 0x06, 0xe1, 0x9c, 0xef, 0x00,
+ 0x53, 0x00, 0xfa, 0x0e,
+ 0x4e, 0x40, 0x21, 0x30, 0x0c, 0x2f, 0x02, 0xe2, 0xd0, 0xdf, 0xc0, 0xce,
+ 0xd0, 0xe7, 0xc4, 0xde,
+ 0xef, 0xd0, 0xdf, 0x30, 0x74, 0x76, 0x20, 0x0e, 0x0f, 0x11, 0x0f, 0xff,
+ 0xfe, 0x02, 0xe1, 0xa9,
+ 0xdf, 0x00, 0x00, 0xcd, 0xda, 0x0f, 0x70, 0x20, 0x02, 0x0e, 0x0e, 0x30,
+ 0x04, 0xe2, 0xef, 0xfc,
+ 0xff, 0xdd, 0xe0, 0xe2, 0xb0, 0xaa, 0x02, 0x07, 0x21, 0x31, 0x44, 0x21,
+ 0x01, 0x00, 0x02, 0x54,
+ 0x00, 0xe1, 0xd2, 0xee, 0xec, 0x00, 0x04, 0xb0, 0xcc, 0x11, 0x45, 0x30,
+ 0x10, 0x41, 0x41, 0x22,
+ 0xfd, 0xe9, 0x30, 0x50, 0x1f, 0xcf, 0xcd, 0xee, 0x0f, 0xeb, 0xf0, 0xe0,
+ 0x0e, 0x1e, 0x10, 0x73,
+ 0x77, 0x00, 0x00, 0xf1, 0x14, 0x21, 0x0f, 0x00, 0x15, 0x10, 0x01, 0x01,
+ 0xf0, 0xfc, 0xee, 0x11,
+ 0x74, 0x31, 0x30, 0x0e, 0x21, 0x54, 0x35, 0xe0, 0xd9, 0x10, 0x40, 0xc1,
+ 0xc1, 0xcd, 0xdf, 0xe1,
+ 0xf1, 0xf0, 0x0e, 0x20, 0x40, 0x71, 0x31, 0x44, 0x14, 0x02, 0x05, 0xf2,
+ 0x16, 0x22, 0xf3, 0x8e,
+ 0xcc, 0x00, 0xe0, 0x00, 0x05, 0x01, 0xfe, 0xfd, 0x03, 0x06, 0x00, 0xad,
+ 0x0f, 0x00, 0x3d, 0x3f,
+ 0x12, 0x36, 0xee, 0xed, 0x00, 0x46, 0x41, 0x11, 0xef, 0xcd, 0x0f, 0x0e,
+ 0xbf, 0x0d, 0x0a, 0xfc,
+ 0xcd, 0x20, 0x50, 0x00, 0xff, 0xcf, 0xf0, 0xf2, 0xe6, 0xe3, 0xc4, 0x90,
+ 0xe0, 0xd1, 0xf2, 0xf1,
+ 0xf0, 0x0c, 0x3f, 0x6c, 0x2c, 0x0d, 0x10, 0x50, 0x0c, 0x30, 0x23, 0x13,
+ 0x2f, 0x1d, 0x17, 0x21,
+ 0xef, 0xed, 0xe0, 0x80, 0xd8, 0x0f, 0x11, 0x42, 0xfd, 0xba, 0xff, 0x0f,
+ 0x1f, 0x00, 0x00, 0x34,
+ 0x11, 0xff, 0x02, 0x77, 0x10, 0xdd, 0xe0, 0x15, 0x00, 0xc0, 0xf2, 0x11,
+ 0x02, 0x8f, 0x0f, 0x20,
+ 0x10, 0x1e, 0x20, 0x43, 0x14, 0x0e, 0x1c, 0x20, 0x63, 0x21, 0x0d, 0x3d,
+ 0x25, 0x00, 0x9a, 0x00,
+ 0xe0, 0x00, 0xee, 0xbd, 0xf0, 0x05, 0xf0, 0xcc, 0x00, 0x0f, 0x0e, 0x0e,
+ 0x50, 0x20, 0x1c, 0xed,
+ 0x02, 0x77, 0x05, 0xc0, 0x00, 0xe0, 0xf1, 0xe4, 0x12, 0x02, 0xce, 0xee,
+ 0xd0, 0x20, 0x76, 0x21,
+ 0x31, 0x2f, 0x0c, 0x00, 0x6f, 0x10, 0x24, 0x01, 0x0e, 0xf0, 0x17, 0x23,
+ 0xc0, 0xac, 0xff, 0xed,
+ 0x10, 0x32, 0x02, 0x2c, 0x0b, 0x10, 0x50, 0x35, 0x00, 0xc0, 0x00, 0xf0,
+ 0xe0, 0x21, 0x00, 0x9e,
+ 0xea, 0x00, 0x1f, 0x51, 0x0f, 0xdb, 0x0f, 0x5f, 0x20, 0x30, 0x0e, 0x33,
+ 0x00, 0x98, 0xff, 0x01,
+ 0xe2, 0xc0, 0xff, 0xe1, 0xe0, 0xcd, 0xec, 0x01, 0x05, 0x2f, 0x1d, 0x10,
+ 0x03, 0x40, 0x31, 0x64,
+ 0x12, 0x32, 0x27, 0x14, 0x01, 0x11, 0x01, 0x01, 0xf2, 0x9f, 0xfb, 0xef,
+ 0xfe, 0xe0, 0x33, 0x32,
+ 0x0e, 0xcc, 0x20, 0x77, 0x33, 0x0f, 0x0e, 0x2f, 0x2d, 0x00, 0xf0, 0xf6,
+ 0x11, 0xd0, 0x8b, 0xf0,
+ 0x03, 0x1f, 0x0d, 0x00, 0x64, 0x00, 0xde, 0xee, 0xdf, 0x0f, 0x0e, 0x33,
+ 0x37, 0xe0, 0xed, 0x52,
+ 0x01, 0x7f, 0x62, 0x06, 0x0f, 0x0f, 0x11, 0x04, 0x04, 0x01, 0xef, 0xcd,
+ 0xeb, 0xdf, 0x00, 0xff,
+ 0x01, 0x30, 0x3c, 0x30, 0x74, 0x10, 0x0d, 0x4e, 0x43, 0x17, 0x37, 0x10,
+ 0xdd, 0xe0, 0xf0, 0xc1,
+ 0x91, 0xef, 0xcd, 0xdd, 0xf0, 0xf0, 0x00, 0x2f, 0x0f, 0x0d, 0x5e, 0x31,
+ 0x47, 0x01, 0xbd, 0x0b,
+ 0x10, 0x24, 0xe0, 0xdd, 0xd0, 0xcd, 0xc0, 0x01, 0x02, 0xff, 0xfb, 0x60,
+ 0x34, 0x30, 0x20, 0x2b,
+ 0x0c, 0x0e, 0x0f, 0xff, 0xa0, 0xcf, 0xef, 0xc1, 0xb4, 0xe2, 0xe5, 0xf5,
+ 0x00, 0xd0, 0xdd, 0x00,
+ 0x42, 0x35, 0x51, 0x10, 0x3f, 0x08, 0x2f, 0x3f, 0x20, 0x02, 0xf0, 0xd0,
+ 0x20, 0x24, 0x00, 0x10,
+ 0xd1, 0x12, 0x3f, 0x00, 0xe2, 0xde, 0xd9, 0x11, 0x52, 0xce, 0x04, 0x03,
+ 0x43, 0x00, 0xee, 0x00,
+ 0x47, 0x1e, 0x1b, 0x2c, 0xb8, 0x20, 0x63, 0x2e, 0xed, 0xbc, 0xdc, 0xcc,
+ 0xee, 0xcd, 0xbd, 0xec,
+ 0xce, 0xee, 0xdd, 0xbd, 0xdc, 0xcc, 0xdd, 0xbc, 0xed, 0xcc, 0xed, 0xcd,
+ 0xdd, 0xcd, 0xde, 0xdf,
+ 0xce, 0xef, 0xdf, 0xcd, 0xec, 0xdd, 0xcc, 0xec, 0xdc, 0xdd, 0xdb, 0xce,
+ 0xdd, 0xde, 0xdd, 0xde,
+ 0xde, 0xde, 0xcd, 0xdd, 0xdd, 0xde, 0xdd, 0xca, 0xec, 0xcd, 0xdb, 0xcd,
+ 0xdd, 0xcd, 0xcc, 0xcd,
+ 0xdd, 0xbd, 0xee, 0xdf, 0xce, 0xdf, 0xd1, 0xd4, 0xc3, 0xe2, 0xe1, 0xf4,
+ 0xf5, 0xf3, 0xf4, 0xf2,
+ 0xd1, 0xc1, 0xd1, 0xc2, 0xc2, 0xd1, 0xb0, 0xd0, 0xd2, 0xd7, 0xc5, 0xc2,
+ 0xd2, 0xd3, 0xd5, 0xe3,
+ 0xd5, 0xc3, 0xd3, 0xc4, 0xd2, 0xc3, 0xd3, 0xd4, 0xb2, 0xd2, 0xd3, 0xd3,
+ 0xc2, 0xc0, 0xe0, 0xdf,
+ 0xdd, 0xee, 0xee, 0xef, 0xef, 0xec, 0xed, 0xff, 0x02, 0xf4, 0xd0, 0xcc,
+ 0xdb, 0xab, 0xdd, 0xbc,
+ 0xdd, 0xcc, 0xec, 0xcd, 0xdc, 0xed, 0xde, 0xdd, 0xcd, 0xcd, 0xee, 0xd0,
+ 0xc0, 0xd0, 0xc0, 0xd3,
+ 0xc4, 0xc0, 0xdf, 0xcc, 0xcd, 0xee, 0xde, 0xcb, 0xdd, 0xcd, 0xdb, 0xdd,
+ 0xef, 0xdf, 0xcd, 0xee,
+ 0xd0, 0xd3, 0xd4, 0xc2, 0xd3, 0xc4, 0xd2, 0xc0, 0xde, 0xdd, 0xcd, 0xd9,
+ 0xcd, 0xdd, 0xcd, 0xdc,
+ 0xd0, 0xd6, 0xd3, 0xc4, 0xd2, 0xd2, 0xd3, 0xc2, 0xd2, 0xd1, 0xd1, 0xd0,
+ 0xc0, 0xce, 0xee, 0xd2,
+ 0xe7, 0xb1, 0xe1, 0xc1, 0xd1, 0xc4, 0xd7, 0xd3, 0xc4, 0xd2, 0xc1, 0xe1,
+ 0xe1, 0xf1, 0xf2, 0xf1,
+ 0xff, 0x0e, 0x11, 0x36, 0x32, 0x31, 0x42, 0x37, 0x54, 0x24, 0x13, 0x13,
+ 0x05, 0x13, 0x24, 0x24,
+ 0x13, 0x13, 0x33, 0x44, 0x53, 0x54, 0x43, 0x43, 0x43, 0x45, 0x43, 0x33,
+ 0x43, 0x23, 0x33, 0x43,
+ 0x34, 0x33, 0x44, 0x23, 0x43, 0x33, 0x43, 0x45, 0x33, 0x43, 0x43, 0x44,
+ 0x32, 0x33, 0x42, 0x31,
+ 0x40, 0x2f, 0x3e, 0x4e, 0x2f, 0x3e, 0x3f, 0x3f, 0x40, 0x23, 0x37, 0x22,
+ 0x32, 0x32, 0x34, 0x33,
+ 0x34, 0x32, 0x32, 0x30, 0x4d, 0x29, 0x2d, 0x4d, 0x3b, 0x3d, 0x3b, 0x4d,
+ 0x5e, 0x3f, 0x4e, 0x3f,
+ 0x5f, 0x2f, 0x3f, 0x4e, 0x30, 0x4f, 0x2d, 0x39, 0x3d, 0x2d, 0x2b, 0x2d,
+ 0x1c, 0x1d, 0x1c, 0x2d,
+ 0x3e, 0x3d, 0x4e, 0x4e, 0x3e, 0x30, 0x40, 0x3f, 0x3f, 0x3f, 0x21, 0x13,
+ 0x04, 0x04, 0xf4, 0xe3,
+ 0xf4, 0xf4, 0x03, 0x24, 0x43, 0x73, 0x54, 0x21, 0x30, 0x30, 0x3e, 0x5f,
+ 0x40, 0x30, 0x42, 0x43,
+ 0x35, 0x34, 0x45, 0x32, 0x32, 0x32, 0x43, 0x44, 0x32, 0x32, 0x41, 0x20,
+ 0x3d, 0x3b, 0x3e, 0x2d,
+ 0x3c, 0x3d, 0x5f, 0x30, 0x22, 0x21, 0x21, 0x34, 0x44, 0x33, 0x43, 0x43,
+ 0x33, 0x42, 0x31, 0x41,
+ 0x3b, 0x28, 0x3c, 0x4d, 0x3e, 0x4d, 0x3d, 0x4e, 0x4d, 0x3e, 0x50, 0x32,
+ 0x42, 0x20, 0x2d, 0x3c,
+ 0x2d, 0x2b, 0x2c, 0x1e, 0x2d, 0x0c, 0x1c, 0x1d, 0x1c, 0x2f, 0x5f, 0x3f,
+ 0x3f, 0x40, 0x3f, 0x30,
+ 0x2d, 0x2b, 0x7e, 0x09, 0x0d, 0x3f, 0x2e, 0x1c, 0x1c, 0x1e, 0x2e, 0x0c,
+ 0x1d, 0x0b, 0xcc, 0x0d,
+ 0x0c, 0xfd, 0xcd, 0xdd, 0xdc, 0xdd, 0x8d, 0xcc, 0xde, 0xbd, 0xcd, 0xdc,
+ 0xde, 0xbd, 0xcd, 0xdd,
+ 0xce, 0xdf, 0xcf, 0xdf, 0xc0, 0xe2, 0xc1, 0xe0, 0xc2, 0xd2, 0xd1, 0xc2,
+ 0xd5, 0xc4, 0xd4, 0xd3,
+ 0xc3, 0xd4, 0xd2, 0xc0, 0xe1, 0xd1, 0xd0, 0xdc, 0xca, 0xde, 0xdd, 0xcc,
+ 0xcb, 0xde, 0xde, 0xcf,
+ 0xcf, 0xd0, 0xc0, 0xd2, 0xc1, 0xd1, 0xc1, 0xd0, 0xdd, 0xc8, 0xdd, 0xdc,
+ 0xdd, 0xdc, 0xdd, 0xdd,
+ 0xdf, 0xdf, 0xd0, 0xd1, 0xc0, 0xd0, 0xc4, 0xd4, 0xc3, 0xd2, 0xc3, 0xc0,
+ 0xdf, 0xde, 0xcd, 0xed,
+ 0xeb, 0xeb, 0xed, 0x00, 0x01, 0x10, 0x01, 0x13, 0x37, 0x25, 0x33, 0x54,
+ 0x24, 0x33, 0x54, 0x33,
+ 0x34, 0x42, 0x22, 0x33, 0x22, 0x32, 0x44, 0x33, 0x34, 0x22, 0x13, 0x14,
+ 0x54, 0x25, 0x13, 0x13,
+ 0x34, 0x22, 0x03, 0x23, 0x63, 0x33, 0x23, 0x42, 0x62, 0x64, 0x22, 0x32,
+ 0x31, 0x51, 0x21, 0x30,
+ 0x30, 0x30, 0x3e, 0x2b, 0x2e, 0x4f, 0x2f, 0x2f, 0x1f, 0x1e, 0x00, 0x02,
+ 0xf6, 0xe3, 0xb2, 0xc0,
+ 0xdf, 0xb0, 0xd2, 0xc0, 0xdf, 0xe2, 0xe4, 0xd4, 0xf4, 0x04, 0x02, 0x01,
+ 0x21, 0x33, 0x21, 0x10,
+ 0x10, 0x10, 0x20, 0x0e, 0xdc, 0xbf, 0xca, 0xcb, 0xdd, 0xca, 0xdb, 0xbc,
+ 0xdc, 0xdc, 0xed, 0xfd,
+ 0xed, 0xdd, 0xec, 0xfe, 0xee, 0xcd, 0xde, 0xbe, 0xce, 0xce, 0xcf, 0xbe,
+ 0xce, 0xdd, 0xcc, 0xdd,
+ 0xbc, 0xee, 0xee, 0xfd, 0xed, 0xef, 0x03, 0xf4, 0xf3, 0xf4, 0xf2, 0xe0,
+ 0xd0, 0xc0, 0xd1, 0xaf,
+ 0xd9, 0xcd, 0xde, 0xce, 0xda, 0xdb, 0xed, 0xdd, 0xdb, 0xed, 0xff, 0xee,
+ 0xdd, 0xdd, 0xcd, 0xde,
+ 0xcf, 0xad, 0xda, 0xce, 0xc0, 0xd0, 0xcf, 0xdf, 0xce, 0xce, 0xe0, 0xe2,
+ 0xd4, 0xd2, 0xc1, 0xd2,
+ 0xd5, 0xd4, 0xc2, 0xc3, 0xe3, 0xc3, 0xd4, 0xd4, 0xc3, 0xd2, 0xd1, 0xc3,
+ 0xe7, 0xf4, 0xe3, 0xd4,
+ 0xe2, 0xd1, 0xc3, 0xd3, 0xd5, 0xc3, 0xc2, 0xc2, 0xc4, 0xe3, 0xd4, 0xd4,
+ 0xd4, 0xe2, 0xe3, 0xf4,
+ 0x04, 0x13, 0xf0, 0x53, 0x44, 0x00, 0x10, 0x40, 0x40, 0x30, 0x2f, 0x4e,
+ 0x3f, 0x30, 0x30, 0x2f,
+ 0x3c, 0x2a, 0x0b, 0x0d, 0x2d, 0x2e, 0x0c, 0xdb, 0xdd, 0xee, 0xcd, 0xad,
+ 0xdc, 0xdd, 0xcc, 0xde,
+ 0xcd, 0xfe, 0x0f, 0x0e, 0x20, 0x20, 0x40, 0x42, 0x22, 0x23, 0x45, 0x13,
+ 0x01, 0xd1, 0xb2, 0xd2,
+ 0xc2, 0xd1, 0xd3, 0xf6, 0x01, 0x43, 0x67, 0x44, 0x43, 0x33, 0x33, 0x43,
+ 0x25, 0x33, 0x14, 0x13,
+ 0x02, 0x03, 0xe3, 0xd3, 0xe3, 0xd3, 0xd2, 0x02, 0x74, 0x53, 0x33, 0x43,
+ 0x42, 0x33, 0x54, 0x36,
+ 0x33, 0x43, 0x35, 0x34, 0x33, 0x34, 0x33, 0x24, 0x33, 0x32, 0x33, 0x53,
+ 0x43, 0x42, 0x41, 0x31,
+ 0x53, 0x33, 0x43, 0x33, 0x44, 0x36, 0x33, 0x45, 0x32, 0x33, 0x33, 0x44,
+ 0x33, 0x34, 0x42, 0x31,
+ 0x31, 0x52, 0x22, 0x43, 0x22, 0x31, 0x42, 0x34, 0x34, 0x35, 0x42, 0x32,
+ 0x42, 0x34, 0x34, 0x43,
+ 0x22, 0x32, 0x41, 0x32, 0x30, 0x51, 0x21, 0x32, 0x42, 0x31, 0x40, 0x30,
+ 0x3e, 0x4a, 0x3d, 0x3c,
+ 0x5e, 0x20, 0x3f, 0x3c, 0x3c, 0x3d, 0x4c, 0x2d, 0x3e, 0x3d, 0x39, 0x3d,
+ 0x3d, 0x3d, 0x2c, 0x3d,
+ 0x2b, 0x1d, 0x1c, 0x2d, 0x3e, 0x4e, 0x4d, 0x4c, 0x3d, 0x5e, 0x2f, 0x4d,
+ 0x2e, 0x3e, 0x4f, 0x2d,
+ 0x2c, 0x3f, 0x2e, 0x2d, 0x2f, 0x43, 0x24, 0x31, 0x20, 0x3f, 0x3c, 0x3a,
+ 0x5b, 0x2b, 0x1d, 0x2b,
+ 0x1c, 0x0d, 0x0e, 0xec, 0xbd, 0xcd, 0xdd, 0xcd, 0xdd, 0xcc, 0xbd, 0xee,
+ 0xdd, 0xdd, 0xcc, 0xce,
+ 0xdd, 0xdd, 0xdb, 0xbd, 0xdc, 0xce, 0xdd, 0xcd, 0xdc, 0xcd, 0xde, 0xcd,
+ 0xdd, 0xce, 0xde, 0xef,
+ 0xde, 0xdb, 0xdd, 0xdc, 0xed, 0xed, 0xec, 0xdc, 0xcc, 0xcc, 0xdc, 0xce,
+ 0xdd, 0xbe, 0xed, 0xcd,
+ 0xde, 0xdf, 0xcf, 0xd0, 0xcf, 0xde, 0xee, 0xd0, 0xef, 0xdd, 0xdb, 0xca,
+ 0xff, 0x00, 0xcd, 0xee,
+ 0x02, 0x02, 0xd1, 0xd1, 0xd3, 0xd5, 0xa1, 0xc1, 0xc0, 0xdf, 0xd4, 0xc3,
+ 0xcf, 0xde, 0xd0, 0xd7,
+ 0xc4, 0xe4, 0xd3, 0xc3, 0xd4, 0xe4, 0xc4, 0xc2, 0xd2, 0xb1, 0xe2, 0xd2,
+ 0xc1, 0xd3, 0xd3, 0xc0,
+ 0xe3, 0xd5, 0xe2, 0xe5, 0xd2, 0xe2, 0xd0, 0xd0, 0xd1, 0xd5, 0xc2, 0xc0,
+ 0xce, 0xde, 0xe0, 0xdf,
+ 0xbc, 0xdc, 0xec, 0xdd, 0xdd, 0xcc, 0xdd, 0xdd, 0xdb, 0xdd, 0xce, 0xde,
+ 0xac, 0xed, 0xde, 0xbc,
+ 0xee, 0xee, 0xcc, 0xdd, 0xcc, 0xde, 0xde, 0xce, 0xce, 0xde, 0xd0, 0xc0,
+ 0xde, 0xde, 0xde, 0xdb,
+ 0xca, 0xdd, 0xde, 0xd0, 0xc0, 0xd0, 0xdf, 0xc0, 0xd0, 0xd1, 0xc2, 0xd1,
+ 0xd0, 0xcd, 0xc9, 0xd0,
+ 0xb0, 0xde, 0xde, 0xdf, 0xc1, 0xd0, 0xc0, 0xe2, 0xd0, 0xd2, 0xd7, 0xe7,
+ 0xd2, 0xc0, 0xd0, 0xc0,
+ 0xef, 0xd0, 0xcf, 0xcc, 0xcd, 0xef, 0xc3, 0xe7, 0xd4, 0xd2, 0xd2, 0xd4,
+ 0xe5, 0xe4, 0xe2, 0xe1,
+ 0xe0, 0x01, 0x11, 0x00, 0xf0, 0xef, 0xdf, 0xb0, 0xd3, 0xf7, 0xe3, 0xb2,
+ 0xd4, 0xf6, 0x03, 0x04,
+ 0xf2, 0x14, 0x73, 0x34, 0x42, 0x33, 0x33, 0x43, 0x23, 0x23, 0x35, 0x43,
+ 0x23, 0x14, 0x23, 0x34,
+ 0x65, 0x33, 0x54, 0x33, 0x33, 0x53, 0x34, 0x43, 0x33, 0x53, 0x33, 0x42,
+ 0x31, 0x42, 0x42, 0x33,
+ 0x43, 0x44, 0x33, 0x34, 0x44, 0x32, 0x33, 0x43, 0x33, 0x32, 0x33, 0x44,
+ 0x21, 0x2f, 0x30, 0x44,
+ 0x1f, 0x2e, 0x21, 0x31, 0x2e, 0x2c, 0x2e, 0x3f, 0x3d, 0x3a, 0x4d, 0x4d,
+ 0x4d, 0x2a, 0x2d, 0x3d,
+ 0x3d, 0x3c, 0x4d, 0x3f, 0x4e, 0x3f, 0x4f, 0x3e, 0x5f, 0x2c, 0x3c, 0x4d,
+ 0x39, 0x3c, 0x3d, 0x5d,
+ 0x2c, 0x1b, 0x2d, 0x1c, 0x2d, 0x2e, 0x1e, 0x2e, 0x1f, 0x20, 0x20, 0x42,
+ 0x42, 0x32, 0x21, 0x51,
+ 0x33, 0x33, 0x31, 0x3f, 0x3e, 0x4f, 0x20, 0x30, 0x20, 0x22, 0x27, 0x46,
+ 0x43, 0x35, 0x53, 0x33,
+ 0x34, 0x53, 0x43, 0x31, 0x41, 0x30, 0x30, 0x40, 0x40, 0x30, 0x3e, 0x3a,
+ 0x3e, 0x40, 0x34, 0x43,
+ 0x21, 0x30, 0x30, 0x41, 0x42, 0x31, 0x31, 0x41, 0x41, 0x21, 0x32, 0x32,
+ 0x3f, 0x39, 0x2d, 0x3e,
+ 0x3f, 0x2b, 0x1c, 0x1d, 0x3e, 0x4e, 0x60, 0x20, 0x30, 0x4e, 0x4f, 0x30,
+ 0x4e, 0x48, 0x2c, 0x3c,
+ 0x4c, 0x2d, 0x3d, 0x40, 0x3e, 0x2c, 0x1c, 0x2d, 0x1d, 0x1d, 0x3e, 0x2d,
+ 0x1b, 0x2d, 0x4d, 0x3d,
+ 0x5c, 0x2d, 0x30, 0x43, 0x34, 0x23, 0x31, 0x41, 0x2e, 0x2a, 0x1c, 0x2d,
+ 0x2a, 0x2c, 0x2c, 0x4c,
+ 0x5d, 0x2c, 0x1d, 0x1c, 0xfd, 0xdc, 0xdd, 0xae, 0xcd, 0xcc, 0xcd, 0xed,
+ 0xed, 0xcb, 0xde, 0xcd,
+ 0xed, 0xdc, 0xce, 0xce, 0xde, 0xce, 0xcd, 0xde, 0xcf, 0xd0, 0xc0, 0xd0,
+ 0xc2, 0xd1, 0xc1, 0xc2,
+ 0xd4, 0xd2, 0xc1, 0xd0, 0xde, 0xdc, 0xcd, 0xde, 0xc1, 0xe5, 0xd3, 0xc3,
+ 0xd4, 0xd3, 0xb0, 0xd0,
+ 0xdf, 0xcd, 0xdc, 0xcc, 0xcc, 0xdb, 0xdd, 0xdb, 0xce, 0xdd, 0xcc, 0xed,
+ 0xdd, 0xdc, 0xdd, 0xcb,
+ 0xde, 0xde, 0xce, 0xdc, 0xcd, 0xde, 0xce, 0xdc, 0xde, 0xdf, 0xc0, 0xdd,
+ 0xde, 0xd0, 0xd1, 0xd3,
+ 0xd2, 0xc3, 0xe4, 0xc0, 0xe0, 0xdf, 0xce, 0xdb, 0xdb, 0xed, 0xff, 0xf1,
+ 0xf2, 0x05, 0x15, 0x33,
+ 0x33, 0x77, 0x54, 0x12, 0x22, 0x33, 0x45, 0x22, 0x12, 0x22, 0x12, 0x14,
+ 0x13, 0x03, 0x03, 0x06,
+ 0x12, 0x03, 0x04, 0x64, 0x24, 0x22, 0x33, 0x43, 0x43, 0x43, 0x33, 0x22,
+ 0x33, 0x41, 0x20, 0x50,
+ 0x42, 0x31, 0x31, 0x41, 0x44, 0x35, 0x33, 0x44, 0x22, 0x32, 0x22, 0x00,
+ 0x00, 0x00, 0xf0, 0xdf,
+ 0xcc, 0xcc, 0xee, 0xf0, 0xf0, 0xee, 0xfd, 0x12, 0x04, 0x01, 0x04, 0x47,
+ 0x33, 0x02, 0x03, 0x05,
+ 0xe2, 0xe2, 0x81, 0xe2, 0xe3, 0xd3, 0xa1, 0xe0, 0xf0, 0xf0, 0x0f, 0x0d,
+ 0x4d, 0x3a, 0x3c, 0x4d,
+ 0x3d, 0x2b, 0xfa, 0xfd, 0xec, 0x8d, 0xec, 0xcd, 0xdc, 0xcd, 0xcd, 0xee,
+ 0xdd, 0xee, 0xdf, 0xdd,
+ 0xdd, 0xfe, 0xfe, 0xcc, 0xcc, 0xcd, 0xcc, 0xce, 0xdf, 0xb0, 0xd0, 0xd0,
+ 0xc1, 0xe4, 0xc1, 0xe2,
+ 0xe2, 0xe2, 0xd2, 0xe0, 0xd1, 0xe0, 0xce, 0xc9, 0xcd, 0xee, 0xed, 0xd9,
+ 0xdd, 0xdd, 0xdd, 0xee,
+ 0xdf, 0xbd, 0xdb, 0xdd, 0xed, 0xe0, 0xef, 0xcd, 0xbc, 0xcd, 0xdd, 0xdd,
+ 0xce, 0xce, 0xdc, 0xcb,
+ 0xdd, 0xcf, 0xd2, 0xd2, 0xc0, 0xef, 0xd0, 0xd1, 0xc0, 0xe3, 0xc7, 0xd3,
+ 0xd4, 0xc5, 0xc3, 0xd4,
+ 0xc2, 0xd2, 0xc3, 0xd6, 0xc1, 0xd1, 0xc1, 0xe2, 0xf3, 0xd1, 0xe0, 0xf4,
+ 0xf4, 0xe2, 0xf4, 0xf4,
+ 0xf4, 0xe4, 0xf4, 0x03, 0xf3, 0x03, 0x04, 0xd3, 0x03, 0x76, 0x41, 0x00,
+ 0x62, 0x22, 0x31, 0x30,
+ 0x21, 0x41, 0x30, 0x3f, 0x30, 0x40, 0x2e, 0x1b, 0x0c, 0xfc, 0xfc, 0xfd,
+ 0x0d, 0x0d, 0x0b, 0x1d,
+ 0x6e, 0x2d, 0x1c, 0x2e, 0x3e, 0x2d, 0x1c, 0x1e, 0x0e, 0x0d, 0xcd, 0xed,
+ 0xcd, 0xcd, 0xdb, 0xee,
+ 0x0e, 0x0f, 0x3f, 0x20, 0x40, 0x52, 0x11, 0x22, 0x44, 0x01, 0x03, 0xe5,
+ 0xd4, 0xb6, 0xb3, 0xc3,
+ 0xe6, 0xd2, 0xb2, 0xf3, 0xe3, 0xd2, 0x02, 0x02, 0x31, 0x72, 0x34, 0x33,
+ 0x42, 0x33, 0x44, 0x44,
+ 0x34, 0x43, 0x33, 0x23, 0x34, 0x55, 0x33, 0x23, 0x22, 0x42, 0x34, 0x54,
+ 0x23, 0x42, 0x33, 0x32,
+ 0x53, 0x34, 0x33, 0x32, 0x43, 0x45, 0x33, 0x45, 0x32, 0x33, 0x43, 0x33,
+ 0x32, 0x34, 0x54, 0x22,
+ 0x31, 0x31, 0x43, 0x44, 0x31, 0x30, 0x41, 0x41, 0x33, 0x56, 0x23, 0x35,
+ 0x42, 0x22, 0x44, 0x23,
+ 0x33, 0x23, 0x32, 0x33, 0x44, 0x32, 0x32, 0x42, 0x32, 0x41, 0x32, 0x54,
+ 0x21, 0x30, 0x40, 0x30,
+ 0x32, 0x41, 0x43, 0x20, 0x30, 0x4e, 0x3e, 0x42, 0x23, 0x3c, 0x39, 0x3d,
+ 0x4b, 0x2d, 0x3c, 0x2e,
+ 0x3d, 0x38, 0x2d, 0x2c, 0x4d, 0x2d, 0x3b, 0x3e, 0x4d, 0x3e, 0x3d, 0x3d,
+ 0x4e, 0x40, 0x2f, 0x30,
+ 0x41, 0x22, 0x31, 0x32, 0x35, 0x52, 0x10, 0x2e, 0x30, 0x40, 0x31, 0x52,
+ 0x20, 0x47, 0x10, 0x08,
+ 0xe9, 0x40, 0x61, 0x00, 0xfe, 0x0d, 0x0f, 0x0f, 0x0e, 0xfc, 0xdc, 0xee,
+ 0xed, 0x0e, 0x1f, 0x0e,
+ 0xcb, 0xcc, 0xfe, 0x0f, 0x20, 0x31, 0xae, 0x99, 0xed, 0x00, 0x24, 0x12,
+ 0xce, 0xaa, 0xee, 0xf0,
+ 0xef, 0xef, 0x12, 0x13, 0xef, 0xcc, 0xde, 0xee, 0x11, 0x66, 0x00, 0xef,
+ 0xdd, 0xdd, 0x00, 0x00,
+ 0x89, 0xee, 0x00, 0x01, 0x23, 0x02, 0x00, 0x12, 0x00, 0xaa, 0xdc, 0x0f,
+ 0x12, 0x33, 0x01, 0xff,
+ 0xaa, 0xcc, 0xdd, 0x21, 0x67, 0x01, 0x00, 0xff, 0xef, 0xff, 0x00, 0x01,
+ 0x11, 0x00, 0xe0, 0xe0,
+ 0x00, 0x12, 0x12, 0xdf, 0x8a, 0xbb, 0x00, 0x46, 0x22, 0xef, 0xee, 0x00,
+ 0xf0, 0xf0, 0x00, 0x00,
+ 0xd0, 0xf0, 0x23, 0x12, 0xcf, 0xcd, 0xf0, 0x01, 0xe0, 0x01, 0xf1, 0xd0,
+ 0xef, 0xf0, 0x13, 0xdf,
+ 0x88, 0xdd, 0x12, 0x77, 0x13, 0xf0, 0xdc, 0xee, 0x00, 0x00, 0xef, 0xbc,
+ 0x10, 0x46, 0x11, 0xef,
+ 0xde, 0xff, 0x00, 0x10, 0xf0, 0xde, 0x00, 0xe0, 0xe0, 0x22, 0x44, 0xd0,
+ 0x89, 0xef, 0x12, 0x33,
+ 0xce, 0xdc, 0x00, 0x00, 0x00, 0x22, 0xf0, 0xbc, 0xfe, 0xf0, 0x03, 0x14,
+ 0x01, 0xf1, 0xae, 0xdb,
+ 0x03, 0x02, 0xde, 0x01, 0x03, 0xe0, 0xbc, 0xb8, 0xef, 0x43, 0x35, 0x00,
+ 0xef, 0xde, 0xce, 0x00,
+ 0x22, 0xdf, 0xe0, 0x12, 0xd0, 0x00, 0x46, 0x01, 0xc0, 0xad, 0xca, 0x11,
+ 0x44, 0x00, 0xef, 0x11,
+ 0x12, 0xff, 0xbc, 0xfe, 0x01, 0x23, 0x00, 0xde, 0xf0, 0x01, 0x24, 0x23,
+ 0xbd, 0x98, 0xfd, 0x12,
+ 0x34, 0xf0, 0xdd, 0x11, 0x11, 0x00, 0x01, 0x01, 0x00, 0x00, 0x12, 0x67,
+ 0xf0, 0xef, 0x23, 0x00,
+ 0xd0, 0x33, 0x02, 0xbf, 0x57, 0x34, 0xe0, 0xef, 0xcd, 0xee, 0x66, 0x12,
+ 0x00, 0x23, 0x00, 0xfe,
+ 0x10, 0x43, 0xee, 0x0e, 0x56, 0x11, 0x10, 0x32, 0x11, 0x0f, 0x0f, 0xdc,
+ 0x41, 0x77, 0x11, 0x0f,
+ 0x0f, 0x11, 0x10, 0x10, 0x10, 0x0f, 0x0e, 0x51, 0x34, 0x0f, 0xb8, 0x0f,
+ 0x74, 0x11, 0xed, 0xfe,
+ 0x11, 0x01, 0x00, 0x00, 0x12, 0x12, 0x0f, 0xc9, 0x00, 0x31, 0x21, 0xee,
+ 0x31, 0x64, 0xff, 0xfc,
+ 0x00, 0x43, 0x00, 0x0e, 0x32, 0x21, 0xdc, 0xfd, 0x74, 0x00, 0x00, 0x00,
+ 0xa2, 0x08, 0xa8, 0x08,
+ 0x9d, 0x14, 0x0b, 0x0d, 0xe6, 0x1f, 0x0d, 0x19, 0x44, 0x33, 0xee, 0xdc,
+ 0x00, 0x22, 0x00, 0x00,
+ 0x00, 0xef, 0x43, 0x00, 0xde, 0x10, 0xf0, 0xbc, 0x12, 0x45, 0x00, 0xee,
+ 0xee, 0xef, 0x22, 0x45,
+ 0x00, 0xff, 0x00, 0xff, 0xf0, 0x00, 0xcd, 0x44, 0x54, 0xff, 0xdc, 0xef,
+ 0x00, 0x33, 0x76, 0x01,
+ 0xdc, 0xee, 0x22, 0x00, 0xe0, 0x01, 0x01, 0x22, 0x00, 0x88, 0xf0, 0x44,
+ 0xff, 0xdd, 0xff, 0x10,
+ 0x33, 0x00, 0xee, 0xde, 0x21, 0x11, 0xdd, 0x10, 0x77, 0x10, 0x00, 0x00,
+ 0xbb, 0xee, 0x32, 0x54,
+ 0xff, 0xed, 0x10, 0x21, 0x00, 0xdc, 0xef, 0x22, 0x65, 0xf0, 0xcb, 0xff,
+ 0x00, 0x54, 0x00, 0xed,
+ 0x00, 0x02, 0x0f, 0xff, 0x22, 0x23, 0xef, 0xbb, 0x00, 0x23, 0xf0, 0xcc,
+ 0x22, 0x45, 0xef, 0xee,
+ 0x21, 0x21, 0xde, 0x89, 0x00, 0x32, 0x01, 0xdc, 0x0f, 0x00, 0xff, 0x31,
+ 0x54, 0xee, 0xcb, 0x00,
+ 0x10, 0x21, 0xf0, 0xdd, 0x00, 0x21, 0xef, 0xff, 0x00, 0x32, 0xcd, 0xdd,
+ 0x00, 0xee, 0x44, 0x11,
+ 0x88, 0x00, 0x23, 0x0f, 0xdd, 0x01, 0xff, 0x88, 0x00, 0x23, 0x00, 0xff,
+ 0xf0, 0x22, 0x22, 0xbb,
+ 0xee, 0x00, 0x34, 0x32, 0xee, 0xdd, 0x00, 0x76, 0x00, 0xdc, 0x00, 0x11,
+ 0xf0, 0x10, 0xf0, 0xac,
+ 0xfe, 0x00, 0x46, 0x32, 0xee, 0xce, 0xff, 0x10, 0x22, 0x10, 0x22, 0x00,
+ 0xdc, 0xcd, 0x44, 0x54,
+ 0xfe, 0xdd, 0x00, 0xfe, 0x00, 0x56, 0x0f, 0xf0, 0x11, 0xdd, 0xee, 0x43,
+ 0x12, 0xed, 0x34, 0x33,
+ 0xed, 0x11, 0x65, 0x00, 0x11, 0x01, 0xfd, 0x13, 0x77, 0x23, 0x00, 0xff,
+ 0x00, 0x02, 0x45, 0x11,
+ 0xf0, 0xbd, 0x02, 0x57, 0x00, 0xde, 0x00, 0x12, 0xff, 0xff, 0x23, 0x32,
+ 0xfe, 0xdc, 0x00, 0x43,
+ 0x11, 0xdb, 0x31, 0x64, 0xdc, 0xac, 0x11, 0x77, 0x00, 0xee, 0xee, 0x11,
+ 0x23, 0xfe, 0xff, 0x12,
+ 0x10, 0x0f, 0xff, 0x0f, 0xff, 0xed, 0xee, 0x77, 0x13, 0xdc, 0xcd, 0x13,
+ 0x67, 0x00, 0xde, 0x00,
+ 0x12, 0x00, 0xe0, 0x00, 0xef, 0xdc, 0x65, 0x22, 0xcc, 0xfe, 0x23, 0x11,
+ 0xfe, 0x0f, 0x00, 0x00,
+ 0xdd, 0x00, 0x00, 0x21, 0x77, 0x00, 0xdd, 0x10, 0x11, 0xcb, 0x00, 0x54,
+ 0x00, 0xee, 0x0f, 0xff,
+ 0xff, 0x22, 0xed, 0xcb, 0x65, 0x22, 0xee, 0xcc, 0x00, 0x44, 0x00, 0xef,
+ 0x00, 0x22, 0xff, 0xef,
+ 0x11, 0x12, 0xdd, 0xdd, 0x22, 0x00, 0x00, 0x23, 0xee, 0xdc, 0x73, 0x77,
+ 0x00, 0xcb, 0x00, 0x00,
+ 0x12, 0x23, 0x00, 0xfd, 0x00, 0x35, 0x00, 0xab, 0x00, 0x22, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0xfe,
+ 0xfe, 0xef, 0x22, 0x34, 0x9a, 0xff, 0x22, 0x00, 0x12, 0x23, 0xde, 0xdd,
+ 0xee, 0xde, 0x01, 0x77,
+ 0x22, 0xcc, 0xee, 0x00, 0x33, 0x00, 0xcc, 0xff, 0x44, 0x10, 0xee, 0x0f,
+ 0xfe, 0xff, 0x77, 0x12,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xee, 0x0f, 0x10, 0xf0, 0x47, 0x75,
+ 0x00, 0xbc, 0x00, 0x42,
+ 0x23, 0xff, 0xed, 0x33, 0x21, 0xee, 0x21, 0x21, 0xfe, 0x0f, 0x00, 0xdb,
+ 0x8a, 0x00, 0x33, 0x11,
+ 0xff, 0xff, 0x11, 0x00, 0x88, 0xee, 0x11, 0x45, 0x10, 0xef, 0x0f, 0xff,
+ 0xf0, 0x10, 0x32, 0x00,
+ 0xe0, 0xee, 0xde, 0x53, 0x24, 0xcd, 0xdc, 0x22, 0x56, 0x00, 0xef, 0xdf,
+ 0x21, 0x44, 0xcd, 0xee,
+ 0x12, 0xf0, 0x00, 0x77, 0x00, 0x0f, 0x00, 0xfe, 0x0f, 0x23, 0x32, 0xed,
+ 0xbb, 0x00, 0x22, 0x33,
+ 0x10, 0xdd, 0xa9, 0x00, 0x32, 0x11, 0x00, 0x54, 0x00, 0xdc, 0x00, 0x33,
+ 0x21, 0xbc, 0x00, 0x11,
+ 0xfe, 0x00, 0x47, 0x11, 0xde, 0x00, 0x53, 0x00, 0xcc, 0x00, 0x24, 0x22,
+ 0xee, 0x00, 0x00, 0xee,
+ 0xde, 0x21, 0x22, 0x33, 0x42, 0xdb, 0x00, 0x62, 0xff, 0x00, 0x67, 0x12,
+ 0x00, 0xff, 0x00, 0x11,
+ 0xee, 0xf0, 0x57, 0xf0, 0xae, 0x00, 0x35, 0x01, 0x00, 0x00, 0x0f, 0xef,
+ 0x0e, 0x43, 0x22, 0xdb,
+ 0x11, 0x76, 0x00, 0xee, 0x00, 0x33, 0x00, 0xef, 0xee, 0x00, 0x00, 0xee,
+ 0xff, 0x33, 0x32, 0xdc,
+ 0xff, 0x74, 0x0f, 0x00, 0x22, 0x98, 0xdc, 0x01, 0x54, 0x00, 0xde, 0xff,
+ 0x00, 0x00, 0xdf, 0x00,
+ 0x23, 0x00, 0x88, 0x00, 0x34, 0x00, 0xcd, 0x00, 0x66, 0x11, 0xee, 0xee,
+ 0x00, 0x11, 0x11, 0x01,
+ 0xfe, 0xdd, 0x00, 0xff, 0xff, 0x34, 0x10, 0xbd, 0xdc, 0x00, 0x10, 0x0e,
+ 0xee, 0x00, 0x65, 0xfe,
+ 0xaa, 0x11, 0x34, 0x00, 0xba, 0xf0, 0x20, 0x22, 0x00, 0xef, 0xee, 0x00,
+ 0x21, 0x32, 0xde, 0xf0,
+ 0x00, 0xcd, 0x00, 0x00, 0x00, 0xdd, 0xba, 0x21, 0x76, 0x11, 0xff, 0xdc,
+ 0xef, 0x31, 0x21, 0x00,
+ 0x00, 0xde, 0xff, 0x42, 0x43, 0x00, 0xcb, 0xff, 0xff, 0x10, 0x21, 0xed,
+ 0x88, 0x00, 0x77, 0x00,
+ 0xee, 0xdd, 0x11, 0x33, 0x00, 0x00, 0x00, 0xcc, 0xed, 0x34, 0x43, 0xef,
+ 0x0f, 0x12, 0x00, 0xcc,
+ 0x00, 0x34, 0x00, 0x00, 0xff, 0x00, 0x00, 0x12, 0xce, 0xee, 0x77, 0x21,
+ 0xcd, 0xec, 0x12, 0x22,
+ 0xff, 0x00, 0x12, 0x0f, 0xbc, 0xfe, 0x25, 0x10, 0xcd, 0xff, 0x12, 0x10,
+ 0x44, 0x11, 0xed, 0xef,
+ 0x0f, 0x54, 0x21, 0xba, 0x00, 0x32, 0x00, 0x00, 0x33, 0x0f, 0xa9, 0xff,
+ 0x32, 0x11, 0x00, 0x00,
+ 0x00, 0x22, 0x33, 0x44, 0xcc, 0x88, 0xef, 0x11, 0x32, 0x22, 0x00, 0xee,
+ 0xbc, 0xff, 0x10, 0x21,
+ 0x01, 0x21, 0x11, 0xf0, 0xcc, 0xed, 0x01, 0x34, 0x12, 0xac, 0xfe, 0x13,
+ 0x11, 0xee, 0x23, 0x23,
+ 0xec, 0xdd, 0xed, 0x23, 0x66, 0x00, 0x00, 0x00, 0xfe, 0xee, 0x00, 0x67,
+ 0x22, 0xee, 0xef, 0x00,
+ 0x00, 0xe0, 0x21, 0x33, 0x89, 0xff, 0x33, 0x12, 0xed, 0x01, 0x13, 0xee,
+ 0xbb, 0x00, 0x23, 0x12,
+ 0x22, 0x55, 0xff, 0x88, 0x00, 0x00, 0x11, 0x22, 0x00, 0xff, 0xef, 0x00,
+ 0x00, 0x11, 0x55, 0x11,
+ 0xff, 0xfe, 0x00, 0x10, 0x10, 0x00, 0x33, 0x55, 0x21, 0xdd, 0x88, 0x00,
+ 0x33, 0x12, 0x11, 0x00,
+ 0xcd, 0xee, 0xf0, 0x23, 0x57, 0x00, 0xee, 0xf0, 0x32, 0x12, 0xdd, 0xdd,
+ 0x10, 0x65, 0x11, 0x00,
+ 0x00, 0x23, 0x55, 0x00, 0xff, 0xee, 0x00, 0x34, 0x00, 0x0f, 0x10, 0x10,
+ 0x42, 0x11, 0x10, 0x32,
+ 0x00, 0x0d, 0x34, 0x42, 0xda, 0xbd, 0x44, 0x56, 0xef, 0xdd, 0x00, 0x21,
+ 0x22, 0xef, 0x8c, 0x00,
+ 0x00, 0x00, 0x00, 0x13, 0x01, 0x0f, 0xef, 0xee, 0x01, 0x0f, 0xeb, 0x66,
+ 0x23, 0xed, 0xee, 0x00,
+ 0x00, 0x43, 0x01, 0xfe, 0xff, 0x0f, 0xeb, 0x22, 0x66, 0xf0, 0xff, 0xff,
+ 0x11, 0x33, 0xbd, 0xfd,
+ 0x00, 0xfc, 0xef, 0x43, 0x23, 0x00, 0x10, 0xec, 0xfe, 0x00, 0xcc, 0xa9,
+ 0x11, 0x44, 0x00, 0xde,
+ 0xec, 0xef, 0x21, 0x33, 0x00, 0xfe, 0xed, 0xdd, 0x75, 0x33, 0xca, 0xcd,
+ 0x12, 0x54, 0xfe, 0xfe,
+ 0x01, 0x22, 0x45, 0x00, 0xaa, 0x00, 0x11, 0x22, 0x31, 0x01, 0xef, 0xdd,
+ 0xf0, 0x01, 0x00, 0xbd,
+ 0x12, 0x35, 0xdd, 0xcd, 0x01, 0x11, 0xdc, 0xff, 0x67, 0x22, 0xff, 0xef,
+ 0x00, 0x00, 0x00, 0xef,
+ 0x00, 0x33, 0xce, 0xef, 0x21, 0x10, 0xfd, 0xfd, 0x32, 0x54, 0xdb, 0x89,
+ 0xf0, 0x43, 0x22, 0xdd,
+ 0xcc, 0x12, 0x21, 0xee, 0xff, 0x34, 0x00, 0xe0, 0xf0, 0xf0, 0x54, 0x34,
+ 0xcc, 0xcd, 0x00, 0x12,
+ 0xff, 0x00, 0x23, 0xfe, 0x12, 0x57, 0xde, 0x9a, 0x00, 0x42, 0x00, 0xdd,
+ 0x00, 0x11, 0x00, 0xec,
+ 0x00, 0x33, 0x00, 0xbd, 0xfe, 0x35, 0x00, 0xcc, 0x01, 0x54, 0xff, 0xed,
+ 0x0e, 0x33, 0x77, 0x00,
+ 0xdc, 0xee, 0x11, 0x22, 0x0f, 0xf0, 0x00, 0xde, 0xee, 0x00, 0x01, 0x00,
+ 0xcd, 0xbb, 0x02, 0x13,
+ 0x20, 0x23, 0xec, 0x99, 0x00, 0x11, 0x22, 0x21, 0x00, 0xee, 0xfe, 0x00,
+ 0xcc, 0x00, 0x42, 0xee,
+ 0x22, 0x67, 0xee, 0xcb, 0xef, 0x21, 0x21, 0x00, 0x00, 0x00, 0xee, 0xff,
+ 0x00, 0x00, 0x63, 0x00,
+ 0xdc, 0xba, 0x11, 0x67, 0xef, 0xdd, 0x10, 0x33, 0x00, 0x0f, 0xee, 0x00,
+ 0x22, 0x22, 0xbd, 0xda,
+ 0x00, 0x74, 0x34, 0xff, 0xed, 0x00, 0x00, 0xdc, 0x32, 0x75, 0x00, 0x00,
+ 0x00, 0xff, 0x01, 0x34,
+ 0x01, 0xe0, 0xf0, 0x00, 0x22, 0x55, 0x11, 0xf0, 0x0f, 0xf0, 0x00, 0x44,
+ 0x0f, 0xcd, 0x12, 0x33,
+ 0x00, 0xdf, 0xf0, 0xde, 0xdf, 0x77, 0x45, 0x00, 0xbc, 0xfe, 0x11, 0x22,
+ 0x10, 0x33, 0x00, 0xec,
+ 0x0f, 0x1f, 0x0f, 0x0e, 0x42, 0x22, 0xfe, 0xb9, 0x10, 0x54, 0xee, 0xbc,
+ 0x00, 0x34, 0x11, 0xff,
+ 0xee, 0xef, 0x11, 0x34, 0xde, 0x00, 0x36, 0x00, 0xd0, 0x00, 0xe0, 0x8c,
+ 0xf0, 0x33, 0x00, 0xee,
+ 0x00, 0xde, 0x12, 0x76, 0xee, 0xdc, 0x32, 0x12, 0xde, 0xee, 0xee, 0x12,
+ 0x64, 0x0f, 0xff, 0xff,
+ 0x0f, 0xdb, 0xdd, 0x32, 0x63, 0x00, 0x0f, 0xca, 0xff, 0x00, 0x33, 0x56,
+ 0xf0, 0xac, 0xff, 0x00,
+ 0x00, 0x0f, 0x12, 0x00, 0x0f, 0x12, 0xee, 0xcb, 0x00, 0x22, 0x22, 0x11,
+ 0xff, 0xac, 0xff, 0x24,
+ 0x56, 0x00, 0xff, 0xdf, 0xef, 0x00, 0x21, 0x23, 0xff, 0xaa, 0x00, 0x00,
+ 0x55, 0x21, 0xff, 0xcd,
+ 0xfe, 0x00, 0x00, 0x66, 0x23, 0xfe, 0xee, 0x01, 0x23, 0xf0, 0xca, 0x00,
+ 0x44, 0x00, 0xff, 0xdf,
+ 0xfe, 0xe0, 0x21, 0x33, 0xef, 0xcc, 0x00, 0x01, 0x00, 0x42, 0x44, 0x00,
+ 0xef, 0xdd, 0xb8, 0x10,
+ 0x74, 0x00, 0xf0, 0x10, 0x00, 0xdc, 0x00, 0x43, 0x00, 0x00, 0x24, 0x00,
+ 0x0f, 0xde, 0xdd, 0x00,
+ 0x77, 0x54, 0xff, 0x0f, 0xfe, 0x00, 0x43, 0x00, 0x01, 0x11, 0xfc, 0xec,
+ 0x10, 0x54, 0x10, 0xee,
+ 0xee, 0x00, 0x11, 0xef, 0xba, 0x21, 0x23, 0xcc, 0x00, 0x65, 0x0f, 0xed,
+ 0x00, 0x32, 0x12, 0x0f,
+ 0xfd, 0xca, 0x10, 0x74, 0x00, 0xdd, 0xff, 0x23, 0x12, 0xee, 0xde, 0xf0,
+ 0x10, 0x65, 0x02, 0x00,
+ 0x00, 0x13, 0x0f, 0xb8, 0x00, 0x43, 0x12, 0xff, 0x00, 0x00, 0xce, 0x00,
+ 0x00, 0x0f, 0x25, 0x33,
+ 0xfe, 0xde, 0xff, 0xdc, 0xab, 0x43, 0x44, 0xff, 0xfe, 0x00, 0xfe, 0x00,
+ 0x00, 0xec, 0x32, 0x77,
+ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x22, 0x34, 0x10, 0xf0, 0xce, 0xef,
+ 0x33, 0x12, 0xf0, 0xbe,
+ 0xcb, 0x22, 0x22, 0xec, 0x00, 0x0f, 0xcc, 0x65, 0x33, 0xfe, 0xed, 0x00,
+ 0x01, 0x25, 0x22, 0x00,
+ 0x00, 0xd0, 0xce, 0xf0, 0x66, 0x22, 0x00, 0xf0, 0xdd, 0xcd, 0xff, 0x66,
+ 0x44, 0x0f, 0xde, 0x00,
+ 0x11, 0x11, 0x43, 0x02, 0xcb, 0x12, 0x55, 0xff, 0xdd, 0x23, 0x44, 0x00,
+ 0x12, 0x11, 0xee, 0xdd,
+ 0xed, 0x75, 0x34, 0xdd, 0xdb, 0x11, 0x53, 0xee, 0xdd, 0x22, 0x00, 0xde,
+ 0x10, 0x00, 0xf0, 0x25,
+ 0xe0, 0x8a, 0xf0, 0x22, 0x00, 0xef, 0x00, 0x01, 0x01, 0xf0, 0x00, 0x43,
+ 0x23, 0x00, 0xee, 0x57,
+ 0x33, 0xbc, 0xdd, 0x00, 0x00, 0x00, 0x12, 0xe0, 0xdc, 0xef, 0xf0, 0x11,
+ 0xde, 0x88, 0xfe, 0x11,
+ 0x32, 0x00, 0x00, 0x0f, 0xab, 0xdc, 0x10, 0x43, 0xfe, 0xee, 0xfe, 0xff,
+ 0x44, 0xed, 0x98, 0x00,
+ 0x32, 0x11, 0xf0, 0xff, 0xee, 0xed, 0x10, 0x54, 0xff, 0xdb, 0x00, 0x00,
+ 0xe0, 0x00, 0x20, 0x00,
+ 0x10, 0xdf, 0xdf, 0x32, 0x31, 0xcc, 0x0f, 0x61, 0x00, 0xdb, 0xf0, 0x22,
+ 0xfd, 0xdc, 0x41, 0x44,
+ 0xce, 0xeb, 0x20, 0xf0, 0xad, 0x22, 0x33, 0xeb, 0xde, 0x53, 0xff, 0xb8,
+ 0x11, 0x11, 0x01, 0x12,
+ 0x11, 0x10, 0x00, 0xef, 0xee, 0x43, 0x77, 0x00, 0xee, 0xdd, 0xee, 0x11,
+ 0x44, 0x22, 0x33, 0xef,
+ 0x9b, 0xff, 0x00, 0xff, 0x00, 0x23, 0x12, 0x00, 0xdf, 0xa8, 0x0f, 0x12,
+ 0x22, 0x00, 0x00, 0x0f,
+ 0xfe, 0x00, 0x44, 0x0f, 0xbb, 0x00, 0x10, 0x20, 0x22, 0x00, 0xdc, 0x20,
+ 0x75, 0x0f, 0xfe, 0x00,
+ 0xff, 0xf0, 0x46, 0x42, 0x00, 0xcd, 0xdc, 0x00, 0x21, 0x11, 0x01, 0xde,
+ 0xdd, 0x21, 0x62, 0xfb,
+ 0xcc, 0x11, 0x23, 0x0e, 0x00, 0x01, 0xee, 0xee, 0xf0, 0x00, 0x12, 0x11,
+ 0x43, 0x20, 0xde, 0x88,
+ 0xef, 0x24, 0x1f, 0x20, 0x67, 0x02, 0xef, 0xdd, 0xdc, 0x00, 0x76, 0x10,
+ 0xef, 0x00, 0xe0, 0x0f,
+ 0x00, 0x00, 0xee, 0x21, 0x65, 0x00, 0xbd, 0xfe, 0x00, 0x22, 0x12, 0x00,
+ 0x00, 0x00, 0xed, 0x00,
+ 0x16, 0x00, 0xdf, 0x00, 0x33, 0xe0, 0x9e, 0xdc, 0x14, 0x33, 0xcc, 0xcc,
+ 0x23, 0x56, 0xff, 0xff,
+ 0x00, 0x00, 0x11, 0x76, 0x00, 0x0f, 0x0f, 0x00, 0x34, 0x32, 0xcd, 0xdb,
+ 0x11, 0x65, 0x00, 0x00,
+ 0xf0, 0xde, 0x23, 0x23, 0xde, 0x01, 0x00, 0xee, 0x76, 0x00, 0xee, 0x22,
+ 0x32, 0xee, 0xff, 0x34,
+ 0x10, 0x00, 0x00, 0x21, 0x76, 0x11, 0xee, 0xff, 0x21, 0x65, 0x23, 0x10,
+ 0xed, 0xfe, 0x55, 0x22,
+ 0x0f, 0x00, 0x00, 0x20, 0x32, 0x00, 0x20, 0x21, 0xfe, 0xc8, 0x00, 0x73,
+ 0x01, 0x0f, 0x00, 0xff,
+ 0xcc, 0xef, 0x24, 0x44, 0xe0, 0xbd, 0x00, 0x24, 0x0f, 0xee, 0x00, 0x00,
+ 0x33, 0x57, 0x00, 0xed,
+ 0x00, 0x01, 0x01, 0xcd, 0xde, 0x22, 0x67, 0x12, 0xee, 0xab, 0x00, 0x34,
+ 0xff, 0xff, 0x32, 0x00,
+ 0x00, 0x00, 0xed, 0x0f, 0x77, 0x10, 0xef, 0xee, 0x01, 0x00, 0xcd, 0xfe,
+ 0x33, 0x00, 0x0f, 0x24,
+ 0xff, 0x88, 0xef, 0x11, 0x42, 0x00, 0xfe, 0xef, 0x0f, 0x00, 0x10, 0x00,
+ 0xee, 0x20, 0x33, 0x0f,
+ 0x00, 0x00, 0x20, 0x77, 0x31, 0xdd, 0xfe, 0x11, 0x0e, 0x32, 0x77, 0x01,
+ 0xf0, 0xed, 0xed, 0xfe,
+ 0xee, 0x11, 0x56, 0x00, 0xef, 0xde, 0x0f, 0xdd, 0x00, 0x01, 0xab, 0x00,
+ 0x66, 0x00, 0xcc, 0x11,
+ 0x45, 0xf0, 0xee, 0xf0, 0xff, 0x22, 0x00, 0xee, 0xde, 0x11, 0x33, 0xf0,
+ 0xfd, 0x21, 0xfe, 0x88,
+ 0x00, 0x32, 0x00, 0xff, 0x00, 0xde, 0xde, 0x12, 0x34, 0x23, 0xcf, 0xac,
+ 0x00, 0xf0, 0xee, 0x24,
+ 0x24, 0xf0, 0x23, 0x0f, 0xdd, 0x31, 0xcc, 0x88, 0xf0, 0x54, 0x00, 0xde,
+ 0x0f, 0x10, 0xf0, 0xbc,
+ 0x01, 0x24, 0x00, 0xfe, 0x0f, 0x00, 0xfe, 0xff, 0x14, 0x00, 0xdd, 0x0e,
+ 0x76, 0x42, 0xff, 0xed,
+ 0xfd, 0x00, 0x21, 0x22, 0x11, 0xed, 0xb8, 0x10, 0x33, 0xae, 0xdb, 0xee,
+ 0x00, 0x11, 0x22, 0x00,
+ 0xbf, 0x00, 0x01, 0xed, 0xb9, 0x00, 0x23, 0x10, 0x32, 0x00, 0xcb, 0xef,
+ 0xff, 0x0f, 0x30, 0x21,
+ 0xee, 0xde, 0xbe, 0xde, 0x12, 0x22, 0xea, 0x63, 0x47, 0xde, 0xab, 0x0f,
+ 0x32, 0x22, 0xff, 0xff,
+ 0x0f, 0xff, 0x21, 0x11, 0xee, 0xe0, 0x01, 0xf0, 0xad, 0x13, 0x57, 0x00,
+ 0xcc, 0x00, 0x23, 0xee,
+ 0x98, 0x21, 0x32, 0x00, 0x0e, 0xf0, 0xfe, 0x00, 0x11, 0x00, 0x10, 0x12,
+ 0x11, 0x00, 0xf1, 0xf0,
+ 0xee, 0x75, 0x56, 0x01, 0x00, 0x01, 0x00, 0x0d, 0x0f, 0x67, 0x13, 0xff,
+ 0x0f, 0x23, 0x23, 0xcd,
+ 0xee, 0x36, 0x21, 0xe0, 0xff, 0x33, 0x00, 0xbe, 0x33, 0x55, 0xff, 0xf0,
+ 0x11, 0x10, 0x0f, 0x0e,
+ 0xf0, 0x32, 0x43, 0x0f, 0x21, 0x20, 0xa8, 0xeb, 0x42, 0x64, 0xff, 0xfd,
+ 0x00, 0x12, 0x11, 0x00,
+ 0x0f, 0x00, 0x01, 0x13, 0x01, 0xa9, 0xfe, 0x32, 0x34, 0x01, 0xce, 0xcd,
+ 0x00, 0x22, 0x34, 0xef,
+ 0x9a, 0x00, 0x12, 0x13, 0x00, 0x00, 0xec, 0x00, 0x01, 0xdf, 0x00, 0x11,
+ 0x00, 0x10, 0xde, 0xaa,
+ 0x00, 0x10, 0x20, 0x77, 0x00, 0xab, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00,
+ 0x19, 0x02, 0xdf, 0x01,
+ 0x5a, 0x0a, 0x1f, 0xff, 0x02, 0x10, 0x1e, 0x04, 0xba, 0xff, 0x21, 0xee,
+ 0xee, 0x12, 0xcd, 0x0e,
+ 0x32, 0xef, 0xf0, 0x02, 0x45, 0x21, 0xdf, 0x88, 0xe0, 0x00, 0x00, 0x13,
+ 0x22, 0xce, 0xce, 0x01,
+ 0x20, 0xd9, 0xdf, 0x44, 0x33, 0xdf, 0xac, 0x10, 0x33, 0x00, 0xff, 0x00,
+ 0xef, 0xf0, 0xde, 0xdc,
+ 0x76, 0x31, 0x00, 0x21, 0x00, 0xce, 0xed, 0x44, 0x44, 0xe0, 0xcd, 0xf0,
+ 0x14, 0x22, 0xff, 0x00,
+ 0xff, 0xcd, 0xef, 0xf0, 0x00, 0x21, 0x34, 0xcb, 0xab, 0x11, 0x34, 0xff,
+ 0x0f, 0x10, 0xfc, 0x21,
+ 0x53, 0x99, 0xee, 0x33, 0x45, 0x00, 0xfe, 0xef, 0xee, 0x33, 0x31, 0xef,
+ 0xf0, 0xff, 0x21, 0x77,
+ 0x32, 0x0f, 0xed, 0xff, 0x10, 0x20, 0x32, 0x00, 0xfe, 0xef, 0xf0, 0x34,
+ 0x64, 0x01, 0xee, 0xde,
+ 0x00, 0x02, 0x12, 0x22, 0x0f, 0x0c, 0x75, 0x73, 0xfb, 0xed, 0x01, 0x0d,
+ 0xc8, 0x21, 0x53, 0xf0,
+ 0xed, 0x00, 0x11, 0x0f, 0x00, 0x11, 0xed, 0x0f, 0x22, 0x11, 0x00, 0xf0,
+ 0x02, 0xe0, 0xdc, 0x77,
+ 0x76, 0x00, 0xee, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x0f, 0x01, 0x02,
+ 0xab, 0xed, 0x14, 0x55,
+ 0x0f, 0xbc, 0x00, 0x24, 0x10, 0x00, 0x10, 0x0f, 0xfe, 0x0f, 0x10, 0x20,
+ 0x20, 0x31, 0x00, 0x0f,
+ 0x12, 0x13, 0xee, 0x01, 0x77, 0x34, 0x00, 0x11, 0xff, 0xef, 0x12, 0x33,
+ 0xfe, 0xdd, 0x9b, 0x00,
+ 0x56, 0x0f, 0xee, 0x00, 0x22, 0x01, 0xdc, 0xde, 0x75, 0x22, 0xee, 0xf0,
+ 0x00, 0x01, 0x02, 0x10,
+ 0x11, 0x11, 0x0f, 0xee, 0x00, 0x77, 0x34, 0xef, 0xdc, 0x00, 0x52, 0x13,
+ 0xf0, 0xdc, 0x00, 0x53,
+ 0x02, 0x00, 0xf0, 0xed, 0x35, 0x77, 0x00, 0xe0, 0x21, 0x01, 0xf0, 0x01,
+ 0x53, 0x00, 0x23, 0x23,
+ 0xec, 0x0d, 0x22, 0x22, 0x32, 0x0f, 0x88, 0xed, 0x11, 0x43, 0x00, 0xdd,
+ 0xde, 0x02, 0x02, 0xfe,
+ 0xba, 0xee, 0x23, 0x47, 0xf0, 0xdf, 0x20, 0x31, 0xdf, 0xdf, 0x11, 0x43,
+ 0x22, 0xff, 0xef, 0x00,
+ 0xf0, 0xad, 0x00, 0x67, 0x03, 0xde, 0x00, 0xd0, 0xa8, 0xff, 0x01, 0x02,
+ 0x00, 0x0f, 0xfe, 0xde,
+ 0x00, 0x03, 0x00, 0xda, 0xad, 0x20, 0x31, 0xee, 0x0f, 0x10, 0xfe, 0xfd,
+ 0xff, 0xdd, 0x88, 0xdc,
+ 0x10, 0x21, 0xdf, 0x00, 0x10, 0xff, 0xbd, 0xfe, 0x1f, 0xfa, 0xbd, 0x12,
+ 0x23, 0xed, 0x00, 0x21,
+ 0xcd, 0xbc, 0xf0, 0x26, 0x31, 0xdd, 0xee, 0xcc, 0xde, 0x75, 0x11, 0xec,
+ 0xff, 0x00, 0x0e, 0xfd,
+ 0x00, 0xe0, 0xdd, 0xfe, 0x31, 0x44, 0x00, 0xcc, 0xff, 0x21, 0x00, 0xdd,
+ 0xf0, 0xed, 0x00, 0x77,
+ 0x44, 0x00, 0xff, 0x00, 0x10, 0x00, 0xf4, 0x12, 0x00, 0x00, 0x2f, 0x72,
+ 0x37, 0xf0, 0xdf, 0xf0,
+ 0x00, 0xf0, 0x00, 0xa0, 0xcb, 0x12, 0x32, 0xd0, 0x04, 0x11, 0x99, 0xee,
+ 0x11, 0x43, 0x00, 0xee,
+ 0x0f, 0x1e, 0xc9, 0xf0, 0x73, 0x11, 0xfc, 0xee, 0x23, 0x11, 0x0f, 0x00,
+ 0x0f, 0x42, 0x57, 0x00,
+ 0xce, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0d, 0x0d, 0x20,
+ 0xfe, 0xff, 0x44, 0xd9,
+ 0xcd, 0x74, 0x10, 0xcb, 0x00, 0x34, 0xff, 0xde, 0x0f, 0xee, 0xf0, 0x75,
+ 0xf0, 0xcb, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x10, 0x11, 0xef, 0xe0, 0x01, 0x11,
+ 0x0e, 0xce, 0xcd, 0xa9,
+ 0x00, 0x24, 0xef, 0x00, 0x44, 0x00, 0xdc, 0xde, 0xde, 0x00, 0x62, 0x57,
+ 0x10, 0xee, 0xbd, 0x00,
+ 0x00, 0xff, 0xf0, 0x15, 0xf0, 0xdf, 0xe0, 0xdf, 0xf0, 0x26, 0xc0, 0xee,
+ 0x63, 0x11, 0x0f, 0x0f,
+ 0x0e, 0xfe, 0x24, 0x45, 0xdf, 0xff, 0x73, 0x22, 0x00, 0x00, 0xef, 0x02,
+ 0x37, 0x55, 0x00, 0x00,
+ 0xef, 0x00, 0x33, 0xf0, 0xe0, 0x55, 0x11, 0xe0, 0x02, 0x34, 0x10, 0x0e,
+ 0x10, 0x22, 0x54, 0x34,
+ 0xef, 0xbd, 0x54, 0x12, 0xef, 0x00, 0x16, 0x43, 0x00, 0xff, 0x10, 0x64,
+ 0x12, 0x10, 0x31, 0x53,
+ 0x23, 0x0e, 0x1e, 0x1f, 0x22, 0x57, 0x22, 0xfc, 0x00, 0x57, 0x00, 0xce,
+ 0x0f, 0x12, 0x22, 0x00,
+ 0x01, 0xf0, 0xff, 0x23, 0x00, 0xfe, 0x32, 0x00, 0xa9, 0x22, 0x32, 0xf0,
+ 0xef, 0xfe, 0x01, 0x04,
+ 0xae, 0xec, 0x54, 0x22, 0xcb, 0xf0, 0x25, 0x10, 0xce, 0x0f, 0x32, 0x22,
+ 0x00, 0xfe, 0x33, 0x00,
+ 0xbe, 0x10, 0x42, 0x0f, 0x01, 0xf3, 0xed, 0x23, 0x57, 0xdb, 0xde, 0x11,
+ 0x00, 0x0f, 0x75, 0x0f,
+ 0xca, 0xef, 0xf0, 0x10, 0x22, 0xff, 0xcd, 0xfe, 0xee, 0xcb, 0x00, 0x65,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x0f, 0x00, 0xde, 0x10, 0x77, 0x31, 0xee, 0x00, 0x22, 0xee, 0x32, 0x65,
+ 0xff, 0xff, 0xfe, 0xff,
+ 0x21, 0x10, 0xfd, 0xee, 0x00, 0x0e, 0xde, 0xf0, 0x00, 0xaa, 0xe0, 0x15,
+ 0x42, 0x00, 0x8b, 0xee,
+ 0x24, 0x33, 0xdd, 0xef, 0x00, 0x00, 0x00, 0xed, 0x0f, 0x00, 0x13, 0x10,
+ 0xfb, 0xcd, 0x20, 0x20,
+ 0x88, 0x01, 0x33, 0xef, 0x00, 0x11, 0xcd, 0xcd, 0x25, 0x44, 0xf0, 0xf0,
+ 0xf0, 0xdf, 0x10, 0x31,
+ 0xde, 0xde, 0x57, 0x10, 0xff, 0xfe, 0x01, 0x00, 0xad, 0xeb, 0x32, 0x13,
+ 0x9d, 0xff, 0x00, 0xf0,
+ 0x02, 0x13, 0x00, 0xbb, 0xf0, 0x13, 0x0f, 0x0e, 0x23, 0x0e, 0x0f, 0x54,
+ 0x1f, 0x0b, 0x1d, 0x0e,
+ 0x0f, 0x00, 0x00, 0x0e, 0xec, 0x2f, 0x0b, 0xce, 0x89, 0xdf, 0xf0, 0xdf,
+ 0xf0, 0x11, 0x0f, 0xcb,
+ 0xef, 0x00, 0x21, 0xdd, 0xcd, 0x55, 0x23, 0xcc, 0xee, 0x00, 0xff, 0xbb,
+ 0x03, 0x11, 0xbb, 0x0f,
+ 0x00, 0x0f, 0xfe, 0x0f, 0xcc, 0x00, 0x42, 0x00, 0x1f, 0x2f, 0x0c, 0xdb,
+ 0x11, 0x54, 0x00, 0xff,
+ 0xef, 0xfe, 0x00, 0x00, 0xef, 0xe0, 0x01, 0x45, 0xf0, 0x8b, 0x00, 0x12,
+ 0x00, 0xfe, 0xff, 0x21,
+ 0x10, 0xa8, 0xff, 0x10, 0x21, 0x11, 0xed, 0xee, 0x20, 0x32, 0x41, 0x32,
+ 0xfe, 0x24, 0x67, 0xef,
+ 0x0f, 0x73, 0x22, 0xfe, 0x12, 0x26, 0x00, 0x22, 0x31, 0x20, 0x62, 0x14,
+ 0x00, 0xf1, 0x02, 0x03,
+ 0x24, 0x02, 0x24, 0x46, 0x11, 0xe0, 0x01, 0x12, 0xaf, 0xff, 0x66, 0x11,
+ 0xfe, 0x11, 0x22, 0xfe,
+ 0xec, 0x31, 0x54, 0x0f, 0xed, 0x20, 0x51, 0x0f, 0xfd, 0x01, 0x31, 0x10,
+ 0x21, 0x33, 0x0f, 0xda,
+ 0x10, 0x73, 0x22, 0xf0, 0xe0, 0xf4, 0x46, 0x00, 0xfe, 0xf0, 0xee, 0xff,
+ 0x44, 0xe0, 0x9d, 0x03,
+ 0xf0, 0x0f, 0x02, 0xd9, 0xdf, 0x14, 0x00, 0x00, 0x00, 0x9c, 0x03, 0x27,
+ 0xcf, 0xcd, 0x10, 0x43,
+ 0x0f, 0xcc, 0xff, 0x12, 0x01, 0x10, 0xfa, 0xee, 0x62, 0x01, 0xdc, 0x11,
+ 0x31, 0xec, 0xdd, 0x30,
+ 0x00, 0xc0, 0x00, 0xef, 0xcb, 0x00, 0xf1, 0x8d, 0x02, 0x21, 0xfc, 0x00,
+ 0x04, 0xee, 0xee, 0xf0,
+ 0x03, 0xde, 0xc9, 0x00, 0x11, 0xd0, 0xad, 0xf0, 0x02, 0xf2, 0xe0, 0x03,
+ 0x0f, 0xb8, 0x10, 0x62,
+ 0x01, 0x00, 0x00, 0x00, 0x1f, 0x31, 0x11, 0x10, 0x00, 0xe0, 0x06, 0x44,
+ 0x10, 0xef, 0x00, 0xd1,
+ 0x94, 0xe2, 0xf0, 0xee, 0xf0, 0x25, 0x10, 0xdc, 0x50, 0x34, 0xe0, 0xe0,
+ 0x10, 0x0f, 0xfe, 0x02,
+ 0xe0, 0x8b, 0x11, 0x22, 0x00, 0xf3, 0x99, 0xcc, 0x11, 0x33, 0x0f, 0x0f,
+ 0x25, 0x20, 0x0d, 0x0f,
+ 0x53, 0x11, 0x0d, 0x1f, 0x31, 0x36, 0x22, 0xdd, 0xeb, 0x50, 0x53, 0x14,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x26, 0x01, 0xef, 0xf0, 0x51, 0x43, 0x00, 0xe0, 0x00, 0xff, 0x0b, 0x6f,
+ 0x1f, 0x0d, 0x0f, 0xfe,
+ 0x0d, 0x40, 0x0c, 0xec, 0x00, 0xe0, 0xce, 0xdd, 0x10, 0x64, 0xfc, 0x1f,
+ 0x43, 0xfd, 0xb9, 0x12,
+ 0x43, 0x0b, 0xf0, 0x45, 0x00, 0xef, 0xff, 0x21, 0x14, 0x01, 0x13, 0x23,
+ 0xf1, 0xaf, 0x01, 0x25,
+ 0x00, 0xef, 0xd0, 0xf0, 0x10, 0xfd, 0xee, 0xca, 0xcd, 0x63, 0x34, 0xfd,
+ 0xfd, 0x10, 0x0c, 0x40,
+ 0x77, 0x23, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x10, 0x23, 0x03, 0xee, 0x10,
+ 0x77, 0x20, 0x00, 0x10,
+ 0x00, 0xec, 0xcd, 0x21, 0x53, 0x0e, 0xdc, 0x12, 0x23, 0xda, 0x00, 0x23,
+ 0xaf, 0x00, 0x46, 0x10,
+ 0xf0, 0xf0, 0x02, 0x13, 0x0e, 0x0d, 0x0d, 0x0e, 0x31, 0x23, 0xff, 0xfe,
+ 0x10, 0x76, 0x00, 0xec,
+ 0x45, 0x23, 0x9e, 0x00, 0x35, 0x01, 0xd0, 0x03, 0x23, 0x11, 0x13, 0x45,
+ 0x12, 0xf0, 0x00, 0x74,
+ 0x21, 0xfd, 0x00, 0x77, 0x00, 0x00, 0x33, 0x0e, 0xfd, 0x10, 0x01, 0x01,
+ 0xef, 0xdc, 0x01, 0x02,
+ 0x9b, 0xfe, 0x00, 0xe1, 0xf0, 0xff, 0xe0, 0xef, 0x24, 0x36, 0xc0, 0xe0,
+ 0x42, 0x41, 0x21, 0x01,
+ 0xe0, 0xd0, 0x0f, 0xec, 0x32, 0x13, 0x9d, 0xe0, 0xf7, 0xe1, 0xae, 0xfe,
+ 0xff, 0x01, 0x02, 0x02,
+ 0xe3, 0x01, 0xcb, 0xcc, 0x13, 0x35, 0x0f, 0xbc, 0xfe, 0xdd, 0xfe, 0x31,
+ 0x10, 0xbb, 0xff, 0x0e,
+ 0xda, 0x0f, 0x20, 0xbd, 0xcc, 0xff, 0xff, 0xfd, 0xee, 0xef, 0xfe, 0xdf,
+ 0xcd, 0xed, 0xdc, 0xba,
+ 0xed, 0x20, 0x33, 0xe1, 0xf0, 0x00, 0x2c, 0x0c, 0xd0, 0x80, 0xae, 0x0f,
+ 0x00, 0x00, 0x01, 0x0c,
+ 0xf8, 0xfc, 0x00, 0x0f, 0x2f, 0x1f, 0xed, 0x8b, 0xee, 0x00, 0x10, 0x00,
+ 0x0f, 0xbc, 0xef, 0xf3,
+ 0x01, 0xff, 0x0f, 0x12, 0x20, 0x0c, 0x0f, 0x0f, 0x1e, 0x76, 0x62, 0x0f,
+ 0xff, 0x00, 0x01, 0x00,
+ 0x16, 0x44, 0x23, 0x00, 0xef, 0xee, 0x14, 0x23, 0xd0, 0xd0, 0x35, 0xf1,
+ 0x8d, 0x0e, 0x00, 0xcc,
+ 0xee, 0x01, 0xf0, 0x0f, 0x2b, 0xeb, 0xf0, 0x20, 0x40, 0x20, 0x3f, 0x70,
+ 0x0f, 0xcb, 0x02, 0x04,
+ 0x00, 0x55, 0x32, 0xff, 0xef, 0x01, 0x23, 0x10, 0x32, 0x53, 0x11, 0xd8,
+ 0xee, 0x52, 0x21, 0xfd,
+ 0x1e, 0x40, 0x0e, 0xdd, 0xf0, 0xe2, 0xee, 0x30, 0x40, 0xee, 0xbb, 0xe1,
+ 0x02, 0xe8, 0xfe, 0x62,
+ 0x01, 0xce, 0xfd, 0x00, 0x31, 0xfc, 0xdc, 0x11, 0x01, 0xe2, 0xf0, 0xbd,
+ 0xee, 0x26, 0x01, 0xe0,
+ 0x02, 0xce, 0xb9, 0x30, 0x00, 0xcf, 0xf0, 0xd0, 0x0e, 0x50, 0x10, 0xeb,
+ 0xce, 0xf1, 0xf0, 0xfd,
+ 0x32, 0x44, 0xde, 0xd0, 0xe3, 0x8d, 0xd9, 0xf0, 0x00, 0xf2, 0xe0, 0xae,
+ 0xee, 0xe0, 0x05, 0x22,
+ 0x00, 0xf0, 0x00, 0x20, 0x22, 0x56, 0x31, 0x22, 0x23, 0xe0, 0xe0, 0x22,
+ 0x31, 0x47, 0x34, 0xe0,
+ 0xa0, 0x02, 0x23, 0x00, 0x20, 0x77, 0x52, 0x0f, 0xf0, 0x02, 0x01, 0x10,
+ 0x11, 0x14, 0x01, 0xe1,
+ 0x02, 0xf4, 0xe1, 0xe1, 0x04, 0xf1, 0x03, 0x74, 0x32, 0x12, 0x16, 0x44,
+ 0x52, 0x1f, 0x10, 0x31,
+ 0x23, 0x43, 0x44, 0x11, 0x10, 0x52, 0x33, 0x10, 0x2f, 0x57, 0x24, 0x0f,
+ 0x0f, 0x11, 0x23, 0x00,
+ 0x14, 0x55, 0x00, 0x0e, 0x43, 0x12, 0xff, 0x01, 0x01, 0x00, 0x52, 0x25,
+ 0xff, 0xee, 0x04, 0x00,
+ 0xed, 0x0f, 0x32, 0xe0, 0xc0, 0x05, 0x15, 0xd0, 0xae, 0x30, 0x52, 0xfe,
+ 0xee, 0x02, 0xf1, 0x34,
+ 0x75, 0x0f, 0xef, 0x15, 0x22, 0x00, 0x00, 0x10, 0x32, 0x32, 0x32, 0x11,
+ 0xff, 0xe1, 0x01, 0xcd,
+ 0x01, 0x17, 0xac, 0xbb, 0xff, 0xff, 0xcd, 0xfe, 0x00, 0xdc, 0xad, 0x0f,
+ 0x0d, 0x0a, 0xfe, 0xef,
+ 0xef, 0x0f, 0x74, 0x22, 0x0e, 0xed, 0x00, 0x13, 0x24, 0x21, 0x1e, 0x2f,
+ 0x20, 0x12, 0x00, 0x43,
+ 0x20, 0x09, 0x40, 0x62, 0x00, 0xc8, 0xfe, 0x2f, 0x31, 0x34, 0xcf, 0x9c,
+ 0xff, 0xf0, 0xee, 0x03,
+ 0x37, 0xdf, 0xbd, 0xf0, 0x01, 0x01, 0x11, 0x00, 0xec, 0xbd, 0x00, 0x21,
+ 0x0b, 0xed, 0x20, 0x02,
+ 0xde, 0x00, 0x31, 0x0f, 0xcc, 0xef, 0xf2, 0xf4, 0xb0, 0x10, 0x21, 0x02,
+ 0xf3, 0xac, 0xed, 0x02,
+ 0x04, 0x03, 0x32, 0x20, 0x0e, 0x1e, 0x1b, 0x40, 0x42, 0xf0, 0xaa, 0x00,
+ 0xf0, 0xcc, 0xee, 0xbc,
+ 0xb9, 0xf0, 0xf3, 0xe0, 0xe0, 0xfd, 0x0f, 0x11, 0x04, 0x01, 0x12, 0x41,
+ 0x51, 0x30, 0x2f, 0x10,
+ 0x0d, 0xe9, 0x20, 0x1f, 0xbb, 0xf0, 0x00, 0xed, 0xbc, 0x00, 0x22, 0xee,
+ 0xba, 0xff, 0x00, 0xef,
+ 0xf0, 0x0d, 0xfb, 0xee, 0xe0, 0xd1, 0xd0, 0xe0, 0x8c, 0xed, 0x00, 0xf1,
+ 0xb1, 0xf2, 0xfc, 0xf9,
+ 0x00, 0x00, 0xaf, 0xfe, 0xf0, 0x0e, 0x1f, 0x0e, 0xec, 0x0c, 0x0e, 0xee,
+ 0xcc, 0xfd, 0x40, 0x2d,
+ 0xec, 0xe0, 0x01, 0x03, 0xd0, 0xf0, 0x74, 0x02, 0xd1, 0xbf, 0x0d, 0x11,
+ 0x12, 0xc9, 0xde, 0x0f,
+ 0x0d, 0x3e, 0x30, 0xe8, 0x9d, 0x00, 0x20, 0xfe, 0xcc, 0x12, 0x33, 0xee,
+ 0xec, 0x00, 0x00, 0xf0,
+ 0x40, 0x40, 0x0e, 0xdd, 0x47, 0x75, 0x10, 0x0e, 0x30, 0x41, 0x10, 0x02,
+ 0x15, 0x11, 0x30, 0x76,
+ 0x33, 0x01, 0x02, 0x03, 0x12, 0x04, 0x35, 0x12, 0xe1, 0x03, 0x33, 0x30,
+ 0x11, 0x35, 0xb0, 0x00,
+ 0x32, 0x01, 0x01, 0x70, 0x40, 0x0f, 0xfd, 0xfc, 0x31, 0x52, 0x1d, 0x30,
+ 0x54, 0x13, 0x0f, 0x00,
+ 0x21, 0x20, 0x21, 0x00, 0x0f, 0x21, 0x74, 0x09, 0xea, 0xf1, 0x15, 0x00,
+ 0x0f, 0x61, 0x00, 0xed,
+ 0x00, 0xf2, 0xe0, 0x03, 0x11, 0x0e, 0xfd, 0x00, 0x05, 0x90, 0xce, 0x00,
+ 0x16, 0x02, 0xdf, 0xdf,
+ 0x00, 0xf1, 0xd0, 0xdd, 0x30, 0x42, 0xef, 0xef, 0xfe, 0x08, 0x4e, 0x20,
+ 0xde, 0xf0, 0x72, 0x10,
+ 0xa8, 0xeb, 0x10, 0x10, 0x00, 0xef, 0xce, 0xff, 0xf0, 0xe0, 0xdd, 0xcb,
+ 0x0e, 0xf0, 0xd0, 0xcd,
+ 0x0d, 0x21, 0xd5, 0x80, 0xe0, 0x0f, 0xff, 0xbd, 0xdc, 0xd0, 0xe2, 0xe0,
+ 0xef, 0xed, 0xeb, 0x10,
+ 0x31, 0xfe, 0x0e, 0x46, 0x52, 0x11, 0x1f, 0xfd, 0x00, 0x77, 0x24, 0xff,
+ 0xf0, 0xe1, 0xbf, 0xf0,
+ 0x00, 0x1f, 0x1f, 0x03, 0x27, 0x02, 0xef, 0xf1, 0xa0, 0xee, 0x0e, 0x40,
+ 0xde, 0xd0, 0xf7, 0xf2,
+ 0xff, 0x0f, 0x21, 0x02, 0xef, 0x8a, 0x00, 0x04, 0x00, 0x03, 0xe0, 0xbe,
+ 0x0f, 0x31, 0x24, 0xf0,
+ 0xef, 0x20, 0x60, 0x0c, 0x0d, 0x3c, 0x7d, 0x00, 0x0e, 0x15, 0x35, 0x00,
+ 0xff, 0x23, 0x15, 0x02,
+ 0x12, 0x33, 0x31, 0x00, 0x41, 0x63, 0x00, 0xef, 0x12, 0x53, 0x20, 0x3f,
+ 0x42, 0x0f, 0x00, 0x07,
+ 0x23, 0x0d, 0xc8, 0xef, 0xf1, 0x00, 0x0f, 0x0f, 0xdb, 0x0d, 0x0e, 0x8d,
+ 0xfc, 0x20, 0x50, 0x2e,
+ 0x1c, 0x2f, 0x10, 0x21, 0x00, 0x11, 0x76, 0x32, 0x13, 0x12, 0x00, 0xde,
+ 0x07, 0x34, 0x02, 0x21,
+ 0x42, 0xdf, 0xbf, 0x22, 0x34, 0xd0, 0xe1, 0x02, 0xee, 0x0b, 0x0d, 0xdc,
+ 0xde, 0xd0, 0x50, 0x42,
+ 0x0f, 0x0d, 0x3e, 0x72, 0x47, 0x23, 0x00, 0x00, 0x42, 0x32, 0xfe, 0x31,
+ 0x77, 0x20, 0x0e, 0x00,
+ 0x00, 0x0e, 0x20, 0x74, 0x00, 0x0f, 0x24, 0x22, 0xde, 0xd0, 0x13, 0x01,
+ 0xe0, 0x14, 0x31, 0xfd,
+ 0xe1, 0xb5, 0xef, 0x10, 0x66, 0x02, 0x0e, 0xfc, 0x1e, 0x31, 0x20, 0x00,
+ 0xe0, 0xde, 0x1e, 0x71,
+ 0x10, 0xeb, 0xe0, 0x27, 0x33, 0xf0, 0xb2, 0xe1, 0x22, 0x44, 0x03, 0x07,
+ 0x34, 0x01, 0x00, 0x73,
+ 0x73, 0x12, 0x02, 0x13, 0x22, 0x12, 0x22, 0x32, 0x31, 0x24, 0x02, 0x45,
+ 0x20, 0x0f, 0xee, 0xeb,
+ 0x00, 0x05, 0x80, 0xde, 0xfe, 0xff, 0x00, 0x00, 0xee, 0xbe, 0x04, 0x24,
+ 0x30, 0x33, 0x03, 0xe0,
+ 0x12, 0x67, 0xff, 0xfe, 0x10, 0xf0, 0xd1, 0xf4, 0x00, 0x0f, 0xef, 0xa0,
+ 0xd0, 0xd2, 0xf7, 0x01,
+ 0xbf, 0xd0, 0x14, 0x02, 0xdd, 0xef, 0xc0, 0xe5, 0x55, 0x00, 0xcd, 0xed,
+ 0xfe, 0xdd, 0xdf, 0x12,
+ 0x03, 0x8b, 0xec, 0xfc, 0xfd, 0x0d, 0x10, 0xf0, 0x9b, 0xfd, 0x01, 0x05,
+ 0xab, 0x00, 0x7c, 0x00,
+ 0x4a, 0x15, 0x71, 0x2a, 0xf0, 0x15, 0x4b, 0x2e, 0xba, 0x21, 0x32, 0xc0,
+ 0x00, 0x03, 0x0e, 0x0f,
+ 0x01, 0x64, 0xf2, 0xd3, 0x22, 0x09, 0x00, 0x22, 0x20, 0x0f, 0xd0, 0x9a,
+ 0x00, 0x40, 0x02, 0xff,
+ 0x0e, 0x20, 0xed, 0xde, 0x00, 0x4e, 0x0e, 0xdc, 0x01, 0x12, 0xcb, 0x0d,
+ 0x1d, 0xa8, 0x2d, 0x73,
+ 0x00, 0xcc, 0x00, 0x44, 0x0f, 0xe8, 0x00, 0x30, 0x00, 0xef, 0x20, 0x43,
+ 0xe0, 0x9b, 0x0e, 0x12,
+ 0x22, 0x00, 0xe0, 0xef, 0xfd, 0x50, 0x01, 0xf2, 0xee, 0x02, 0x20, 0x08,
+ 0xee, 0x30, 0x2e, 0xe0,
+ 0xd0, 0x21, 0xfc, 0xdc, 0x70, 0x00, 0xdf, 0x3f, 0x22, 0xdf, 0xcb, 0x20,
+ 0x31, 0x21, 0x20, 0xcb,
+ 0xdf, 0x10, 0x1f, 0x4f, 0x63, 0xff, 0xfa, 0x1f, 0x0f, 0xe0, 0xf1, 0x25,
+ 0xfe, 0x8d, 0xe0, 0x20,
+ 0x6f, 0x0e, 0xd9, 0xef, 0x10, 0x13, 0x20, 0x0d, 0xcb, 0x1f, 0x3f, 0xef,
+ 0x01, 0x43, 0xdc, 0xed,
+ 0xfe, 0x0b, 0x40, 0x00, 0xff, 0x3e, 0x2f, 0xad, 0xef, 0x0c, 0x0f, 0x0f,
+ 0x3d, 0x4d, 0xcd, 0xee,
+ 0x01, 0xfb, 0x09, 0x5f, 0x3e, 0xec, 0x00, 0x42, 0xee, 0xb9, 0x0f, 0x0f,
+ 0x71, 0x0f, 0xb9, 0xf0,
+ 0x21, 0x00, 0x1e, 0xf0, 0xee, 0xfd, 0x10, 0x40, 0x0d, 0xfc, 0x00, 0x32,
+ 0xc8, 0x0f, 0x40, 0x10,
+ 0xd0, 0xfe, 0x00, 0x30, 0x1e, 0x2f, 0x3f, 0xd0, 0x8e, 0x01, 0x40, 0x08,
+ 0x0e, 0xf1, 0x12, 0x0e,
+ 0xdc, 0xff, 0x30, 0x10, 0xe2, 0x51, 0x0c, 0xac, 0x01, 0x01, 0x00, 0x0d,
+ 0xf0, 0x33, 0x0c, 0xbc,
+ 0x33, 0x37, 0xe0, 0x9f, 0x0d, 0x12, 0x40, 0x11, 0x01, 0xe0, 0xde, 0x37,
+ 0x31, 0xbe, 0x20, 0x32,
+ 0xf0, 0xff, 0x02, 0xdf, 0xf0, 0x17, 0x00, 0x51, 0x02, 0x01, 0xcf, 0x2e,
+ 0x22, 0xd5, 0xc0, 0x02,
+ 0x75, 0x00, 0xbe, 0x10, 0x32, 0xde, 0xe2, 0x57, 0xf3, 0xef, 0x00, 0x00,
+ 0x00, 0x27, 0x11, 0xe0,
+ 0xf0, 0xff, 0x90, 0x02, 0x0f, 0x31, 0x14, 0xf1, 0x03, 0x01, 0xef, 0x10,
+ 0x01, 0xb1, 0x47, 0x66,
+ 0x0f, 0xe0, 0x00, 0xf3, 0x01, 0x11, 0x13, 0x20, 0xf1, 0x81, 0x03, 0x36,
+ 0x00, 0xbe, 0x05, 0x22,
+ 0x00, 0xf0, 0x0f, 0x21, 0xef, 0xc0, 0x47, 0x11, 0xef, 0xef, 0x02, 0x20,
+ 0x41, 0xdf, 0xf1, 0x03,
+ 0x02, 0xd0, 0x25, 0x73, 0x0c, 0xf0, 0x34, 0x02, 0xef, 0x1f, 0x23, 0x12,
+ 0x10, 0xff, 0x02, 0xd3,
+ 0xa0, 0x14, 0x00, 0x01, 0x37, 0x07, 0xcf, 0xef, 0xaf, 0xe0, 0x74, 0x12,
+ 0xce, 0x00, 0x14, 0x0f,
+ 0x0d, 0xf1, 0x23, 0x0f, 0xf1, 0x24, 0x11, 0xce, 0x0e, 0x20, 0x53, 0xe0,
+ 0xf2, 0x0e, 0xe9, 0x02,
+ 0x22, 0x0f, 0x01, 0x17, 0x8f, 0xfe, 0x65, 0xf0, 0xc0, 0x20, 0x22, 0x01,
+ 0x12, 0x1f, 0xfe, 0x0f,
+ 0x26, 0x24, 0xbe, 0xed, 0x00, 0x00, 0x02, 0x01, 0xd2, 0x01, 0xc0, 0x02,
+ 0x22, 0x0d, 0x0e, 0x46,
+ 0xe1, 0xde, 0x0e, 0x75, 0x76, 0x0f, 0xde, 0x00, 0x01, 0x00, 0x01, 0x15,
+ 0x41, 0xf0, 0xef, 0xf0,
+ 0x00, 0xe0, 0x10, 0x55, 0xf0, 0xc9, 0x11, 0x41, 0xef, 0xde, 0x01, 0x34,
+ 0x0e, 0xdb, 0x71, 0x00,
+ 0xc1, 0x23, 0x10, 0xd9, 0xd0, 0x40, 0x51, 0x01, 0xd0, 0xdf, 0x00, 0x30,
+ 0xfc, 0xe0, 0x31, 0x21,
+ 0x0f, 0xee, 0xfe, 0x0f, 0x70, 0x1e, 0x0d, 0xda, 0x20, 0x20, 0xcc, 0xde,
+ 0x00, 0x2f, 0x32, 0x51,
+ 0xd9, 0xde, 0x30, 0xe0, 0xb0, 0x01, 0x5f, 0x3f, 0xfd, 0xc8, 0x0e, 0x71,
+ 0xf0, 0xfe, 0xfd, 0xff,
+ 0x12, 0x11, 0x1c, 0x1e, 0xda, 0xef, 0x21, 0x02, 0xdf, 0xdb, 0x2f, 0x5d,
+ 0x2f, 0x10, 0x01, 0xbd,
+ 0x2e, 0x1d, 0xe9, 0x0f, 0x7d, 0x21, 0x02, 0xdf, 0xda, 0x20, 0x5e, 0x00,
+ 0xe1, 0x12, 0x0d, 0xce,
+ 0x13, 0x10, 0x0c, 0x20, 0x04, 0xe1, 0x9c, 0x00, 0x34, 0x0f, 0xeb, 0x12,
+ 0x33, 0xef, 0xbd, 0x20,
+ 0xff, 0xdf, 0x75, 0x40, 0xcc, 0xe0, 0x13, 0x44, 0xec, 0xdd, 0x33, 0x34,
+ 0xcc, 0xfe, 0x32, 0x12,
+ 0xff, 0xce, 0x23, 0x41, 0xfe, 0xff, 0x0f, 0xdf, 0xe3, 0x06, 0x40, 0x2d,
+ 0x00, 0xe3, 0xd1, 0x0b,
+ 0x00, 0xe2, 0x80, 0x03, 0x67, 0x00, 0xda, 0x00, 0x00, 0xe1, 0x22, 0x20,
+ 0xe1, 0xe1, 0xfe, 0x0c,
+ 0x71, 0x24, 0xf1, 0xef, 0x00, 0x12, 0x0d, 0x2c, 0x41, 0xb0, 0xd0, 0x47,
+ 0x10, 0xdd, 0xef, 0x11,
+ 0x66, 0x0f, 0xee, 0x00, 0x0f, 0x00, 0x12, 0x30, 0xeb, 0x10, 0x33, 0x8f,
+ 0xea, 0x10, 0x21, 0xf0,
+ 0x01, 0xce, 0xdd, 0x34, 0x30, 0xed, 0xee, 0x01, 0x30, 0x60, 0x0c, 0xde,
+ 0xed, 0xfc, 0x63, 0x2e,
+ 0x09, 0x45, 0xf0, 0x8e, 0x0f, 0x21, 0x0d, 0x0f, 0x04, 0x00, 0x00, 0x32,
+ 0xec, 0xbc, 0x10, 0x10,
+ 0x21, 0x04, 0xad, 0xf9, 0x10, 0x50, 0x01, 0xe1, 0xf0, 0x00, 0x00, 0x0e,
+ 0x3b, 0x00, 0xf1, 0xe6,
+ 0xef, 0x0e, 0x20, 0x00, 0xff, 0x11, 0x75, 0x0f, 0xdd, 0x00, 0x31, 0xef,
+ 0xfd, 0x61, 0x12, 0x01,
+ 0xfe, 0xfb, 0x00, 0xe0, 0xd0, 0x00, 0x60, 0x1d, 0xff, 0xf0, 0xe0, 0x00,
+ 0xf7, 0x31, 0x2c, 0xda,
+ 0x00, 0x73, 0x21, 0xcd, 0x00, 0x63, 0x01, 0xdf, 0x00, 0x0d, 0xff, 0x37,
+ 0x00, 0x9b, 0x01, 0x36,
+ 0x00, 0xbe, 0x0f, 0x30, 0xf1, 0x00, 0x10, 0xf1, 0xad, 0x00, 0x4e, 0x0a,
+ 0x00, 0x20, 0xe2, 0xf0,
+ 0x0f, 0x00, 0x11, 0x1e, 0x0e, 0x02, 0x15, 0x10, 0xf0, 0xd1, 0xbf, 0x00,
+ 0x35, 0xbf, 0x0e, 0x00,
+ 0xee, 0x33, 0x77, 0x10, 0xcc, 0x02, 0x33, 0xdd, 0xfe, 0x20, 0x01, 0xaf,
+ 0x00, 0x10, 0x11, 0x26,
+ 0xf0, 0xdb, 0x0f, 0x10, 0x32, 0x21, 0x30, 0x0f, 0x02, 0xef, 0x0a, 0x70,
+ 0x23, 0xc2, 0xef, 0x0d,
+ 0x0d, 0x03, 0x27, 0x8e, 0xde, 0x21, 0x46, 0x0f, 0xdd, 0x32, 0x36, 0xd0,
+ 0xbf, 0x10, 0x1f, 0x0e,
+ 0x00, 0x35, 0x01, 0xc0, 0xdf, 0x00, 0x4f, 0x0d, 0x01, 0xf2, 0xe0, 0x73,
+ 0x33, 0xba, 0x0e, 0x00,
+ 0x14, 0x00, 0xcf, 0x01, 0x13, 0x01, 0x00, 0x15, 0x24, 0x10, 0xbc, 0x00,
+ 0x54, 0x23, 0x00, 0x05,
+ 0xe0, 0x00, 0x20, 0x20, 0xd4, 0xa0, 0x12, 0x36, 0xd0, 0x8f, 0x00, 0x43,
+ 0xf0, 0xde, 0x13, 0x26,
+ 0xef, 0x00, 0x42, 0xf1, 0xe0, 0x01, 0x67, 0x00, 0xd0, 0x00, 0x00, 0xf0,
+ 0x15, 0x41, 0xf0, 0xd0,
+ 0x00, 0x22, 0x14, 0x02, 0xd0, 0x00, 0x12, 0x11, 0xb3, 0xd5, 0x11, 0x60,
+ 0x11, 0x01, 0xe3, 0xf3,
+ 0xf3, 0xd3, 0x02, 0x31, 0x57, 0x17, 0xd0, 0xd0, 0x11, 0x14, 0x10, 0xff,
+ 0xe0, 0x62, 0x44, 0xe0,
+ 0xc2, 0x00, 0xdf, 0x71, 0x10, 0xed, 0xe1, 0x47, 0x13, 0xcd, 0x00, 0x32,
+ 0x02, 0xc0, 0x00, 0x0c,
+ 0x02, 0xf6, 0xf0, 0x00, 0x01, 0x20, 0xf0, 0xa0, 0x2f, 0x60, 0x26, 0xe0,
+ 0xdc, 0x10, 0x32, 0x14,
+ 0x1d, 0x0e, 0x00, 0xa0, 0x00, 0x36, 0xfe, 0x8e, 0x12, 0x00, 0x0d, 0x10,
+ 0x25, 0xce, 0xed, 0x10,
+ 0x3f, 0x0b, 0x0f, 0x00, 0x20, 0x0e, 0xef, 0xca, 0x0e, 0x40, 0x53, 0x0f,
+ 0xfc, 0x00, 0x00, 0xb0,
+ 0x00, 0x10, 0x2f, 0xfd, 0xc0, 0x27, 0x10, 0xd8, 0x30, 0x51, 0xe0, 0x01,
+ 0x20, 0xdd, 0xfe, 0x72,
+ 0x01, 0xde, 0xfe, 0xf0, 0xed, 0x2b, 0x70, 0x00, 0xc0, 0x00, 0x0f, 0x29,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x50, 0x01, 0xec, 0xfd, 0x21, 0x24, 0xee, 0xbd, 0x21, 0x3e, 0xd8, 0x00,
+ 0x53, 0xf0, 0xbc, 0x10,
+ 0x54, 0x0f, 0xbc, 0x00, 0x01, 0x21, 0x1f, 0xfe, 0xeb, 0x00, 0x02, 0x10,
+ 0x0e, 0xfd, 0x1f, 0x40,
+ 0x0d, 0xde, 0xfe, 0x0c, 0x0f, 0x2d, 0xfc, 0x40, 0x00, 0xad, 0xe0, 0x0e,
+ 0x1a, 0x1e, 0x0c, 0x0f,
+ 0xdd, 0x52, 0x4f, 0xd8, 0xec, 0x12, 0x00, 0x0c, 0x50, 0x00, 0x0e, 0x11,
+ 0x01, 0xbc, 0x0f, 0xf0,
+ 0x0c, 0x1f, 0x0c, 0xbe, 0x0f, 0x0e, 0x00, 0x10, 0x7f, 0xe8, 0xcd, 0x00,
+ 0x50, 0x10, 0xed, 0xff,
+ 0x21, 0xea, 0xee, 0x20, 0x20, 0x30, 0x0f, 0xfe, 0xdd, 0xee, 0x20, 0x52,
+ 0x1b, 0x2f, 0x2f, 0xe0,
+ 0xd0, 0xeb, 0xdc, 0x70, 0x73, 0xee, 0xed, 0xfe, 0x0d, 0x00, 0x30, 0x0d,
+ 0x0c, 0x25, 0xd1, 0xbe,
+ 0x1c, 0x10, 0x10, 0x01, 0x03, 0xe1, 0x00, 0xfc, 0xe9, 0x20, 0x20, 0x32,
+ 0x75, 0x40, 0xef, 0xef,
+ 0x00, 0x43, 0xf0, 0x24, 0x51, 0xbe, 0xdb, 0x33, 0x24, 0xb0, 0x10, 0x32,
+ 0xef, 0xdc, 0x00, 0x67,
+ 0x00, 0xf2, 0x11, 0xf0, 0xcc, 0x31, 0x66, 0xe0, 0x00, 0x11, 0xf0, 0xce,
+ 0x03, 0x03, 0x30, 0x00,
+ 0xd1, 0xe3, 0x04, 0x10, 0x0e, 0x00, 0x27, 0x91, 0x00, 0x11, 0x30, 0xf0,
+ 0xdf, 0x03, 0x43, 0x25,
+ 0xdf, 0x9d, 0x02, 0x67, 0x13, 0xf0, 0xef, 0xf1, 0x03, 0x24, 0x32, 0x00,
+ 0xbd, 0x04, 0x25, 0x10,
+ 0xf2, 0x01, 0xe1, 0xd1, 0x22, 0x73, 0xf0, 0xe0, 0x01, 0xe3, 0x07, 0x02,
+ 0x20, 0x0f, 0xef, 0xf0,
+ 0x03, 0x05, 0x42, 0xf0, 0xbc, 0x44, 0x34, 0xb0, 0x00, 0x10, 0x00, 0x21,
+ 0x03, 0xf2, 0x12, 0x62,
+ 0x12, 0x00, 0xbe, 0x0f, 0x15, 0x02, 0x07, 0x25, 0x00, 0xbd, 0x00, 0x35,
+ 0xc0, 0xd0, 0x33, 0x22,
+ 0xee, 0x02, 0x00, 0xad, 0x20, 0x54, 0x04, 0xd0, 0x00, 0x10, 0xf9, 0xe0,
+ 0x21, 0x14, 0xe0, 0x0e,
+ 0xf1, 0xb0, 0x01, 0x31, 0x20, 0xdf, 0x14, 0x53, 0xfd, 0x0e, 0x32, 0x23,
+ 0xe0, 0x0c, 0x25, 0x15,
+ 0xb0, 0x20, 0x50, 0xee, 0xc1, 0xe5, 0x01, 0x30, 0x1d, 0xd0, 0xe2, 0x02,
+ 0x23, 0x00, 0x88, 0x00,
+ 0x20, 0x33, 0xc0, 0x0f, 0x44, 0xf0, 0xbf, 0x1f, 0x10, 0x23, 0x06, 0x20,
+ 0xfc, 0xb0, 0x02, 0x13,
+ 0x20, 0x00, 0xe0, 0xf5, 0x00, 0xfc, 0x70, 0x34, 0xc2, 0xdf, 0x0c, 0x30,
+ 0x3f, 0x11, 0x02, 0xb1,
+ 0xfd, 0x1e, 0x0c, 0xdd, 0xf1, 0x77, 0x13, 0xe0, 0xfe, 0xef, 0xbd, 0x00,
+ 0x45, 0x20, 0xdd, 0x1f,
+ 0x1f, 0xfd, 0x06, 0x1f, 0xec, 0x40, 0x30, 0x00, 0x11, 0x9f, 0xda, 0x10,
+ 0x3f, 0x10, 0x14, 0xdf,
+ 0xaa, 0x00, 0x41, 0x00, 0xfd, 0xff, 0x40, 0x00, 0xc0, 0x1f, 0x4f, 0x0c,
+ 0xee, 0x0d, 0x12, 0x22,
+ 0xdf, 0x0b, 0x1c, 0x0e, 0x01, 0x32, 0x8e, 0xdc, 0x31, 0x0e, 0xda, 0x00,
+ 0x10, 0x2d, 0x0d, 0x00,
+ 0x63, 0xec, 0xd8, 0x00, 0x7f, 0x1f, 0x0f, 0x10, 0xfe, 0xcc, 0x0f, 0x30,
+ 0x10, 0x0e, 0x0f, 0xe0,
+ 0xfe, 0x1f, 0x60, 0x0b, 0xdf, 0x0f, 0xc0, 0x32, 0x52, 0xc8, 0xed, 0x43,
+ 0x22, 0xef, 0x0e, 0x00,
+ 0xf1, 0xdf, 0x1f, 0x63, 0x04, 0xe2, 0xda, 0x1e, 0x50, 0x00, 0xdc, 0x00,
+ 0x25, 0x11, 0xd0, 0x1e,
+ 0xfe, 0xed, 0x51, 0x46, 0xe0, 0xd0, 0x0f, 0x60, 0x0e, 0xe0, 0x14, 0x10,
+ 0x0e, 0x0f, 0xde, 0xe0,
+ 0x20, 0x11, 0xce, 0x13, 0x26, 0x90, 0xf0, 0xe0, 0x1e, 0x21, 0x44, 0xee,
+ 0xfd, 0x00, 0xff, 0xf0,
+ 0x07, 0x24, 0xec, 0xfe, 0x40, 0x30, 0x04, 0x01, 0xf1, 0x8f, 0xbf, 0x22,
+ 0x41, 0xf0, 0xdb, 0x1f,
+ 0x72, 0x03, 0xfb, 0xe2, 0x15, 0x1d, 0x1f, 0x2f, 0xce, 0xff, 0x27, 0x01,
+ 0x0e, 0x0f, 0x10, 0xb0,
+ 0xe1, 0x30, 0x2e, 0xec, 0xb1, 0xf0, 0xdd, 0xfc, 0x30, 0x70, 0x00, 0xba,
+ 0x0e, 0x11, 0x30, 0x09,
+ 0xd0, 0x10, 0x11, 0x4e, 0x1e, 0xfd, 0x00, 0xf0, 0xd1, 0x14, 0x01, 0xca,
+ 0x0f, 0x71, 0x1f, 0x0e,
+ 0xe0, 0x02, 0x0d, 0x0e, 0x40, 0xf8, 0xce, 0x14, 0x1f, 0x1d, 0xff, 0xae,
+ 0x27, 0x10, 0xad, 0x00,
+ 0x31, 0xdf, 0x23, 0x01, 0xec, 0x2f, 0x54, 0xe1, 0xbc, 0x0f, 0x4f, 0x11,
+ 0xf1, 0x00, 0x14, 0x0c,
+ 0xed, 0x10, 0x24, 0xdd, 0x00, 0x76, 0x00, 0xbd, 0x00, 0x01, 0x1e, 0x0e,
+ 0x12, 0x03, 0xdc, 0xfd,
+ 0x10, 0x2e, 0x0c, 0x42, 0x55, 0xfe, 0xcc, 0x13, 0x34, 0xfb, 0xf1, 0x34,
+ 0x9e, 0x0f, 0x10, 0x00,
+ 0xff, 0xe2, 0x36, 0x10, 0xde, 0xee, 0x31, 0x01, 0x80, 0x22, 0x4f, 0xe9,
+ 0xe0, 0x11, 0x33, 0x0c,
+ 0xcd, 0x01, 0x32, 0x1f, 0xdc, 0x12, 0x02, 0xdd, 0x4f, 0x32, 0xa0, 0x02,
+ 0x47, 0x00, 0xee, 0xe0,
+ 0x01, 0x11, 0x42, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xbb, 0x0f, 0x14, 0x25,
+ 0xff, 0xbc, 0x32, 0x34,
+ 0xef, 0xab, 0x21, 0x23, 0xde, 0x01, 0x53, 0x0b, 0xcd, 0x10, 0x54, 0xf0,
+ 0xd0, 0x0f, 0x0f, 0x2e,
+ 0x2e, 0x24, 0xf1, 0x9e, 0x10, 0x10, 0x00, 0x01, 0xe0, 0x00, 0x34, 0x00,
+ 0xd2, 0x07, 0x00, 0xdf,
+ 0x0e, 0x71, 0x45, 0xdf, 0xec, 0x22, 0x54, 0xe0, 0xee, 0xed, 0x00, 0x53,
+ 0x03, 0x0e, 0xd8, 0xc0,
+ 0x00, 0x32, 0x43, 0xed, 0xcc, 0x00, 0x51, 0x00, 0x00, 0xf7, 0x02, 0xed,
+ 0x2f, 0x74, 0xf1, 0xdf,
+ 0x02, 0x21, 0x02, 0x25, 0x01, 0xf1, 0x01, 0xf0, 0x02, 0x07, 0x10, 0xd0,
+ 0x00, 0x54, 0xf2, 0xd0,
+ 0x02, 0x01, 0xd0, 0xd0, 0x53, 0x57, 0x02, 0xd0, 0xff, 0x00, 0x42, 0x35,
+ 0xe1, 0xc0, 0xf3, 0x00,
+ 0x14, 0x13, 0xf1, 0x03, 0x01, 0x80, 0x04, 0x37, 0xf0, 0xf0, 0x20, 0x21,
+ 0xf5, 0xd1, 0x01, 0xd0,
+ 0xc0, 0x74, 0x42, 0xd1, 0xa0, 0x02, 0x26, 0x11, 0x00, 0xe3, 0xf2, 0xe0,
+ 0x31, 0x77, 0xf0, 0xc1,
+ 0x00, 0x21, 0x10, 0x22, 0x02, 0x01, 0x05, 0x01, 0xbd, 0x0f, 0x54, 0xf0,
+ 0xd0, 0x27, 0x01, 0xcf,
+ 0x0f, 0x00, 0x32, 0x12, 0xc0, 0xd0, 0x02, 0x52, 0x0e, 0xea, 0x22, 0x45,
+ 0xe0, 0xfe, 0x10, 0x11,
+ 0x51, 0xf0, 0xde, 0x22, 0x23, 0xf0, 0xf0, 0xe1, 0xde, 0x35, 0x32, 0xbf,
+ 0xf0, 0xda, 0xee, 0x30,
+ 0x54, 0xe0, 0xef, 0x2c, 0x60, 0x0f, 0xec, 0x0e, 0x00, 0x1f, 0xfb, 0xdf,
+ 0x2f, 0x00, 0xbd, 0x10,
+ 0x50, 0x0b, 0xed, 0x12, 0x55, 0x0f, 0xbb, 0x10, 0x31, 0xff, 0xef, 0x51,
+ 0x01, 0xeb, 0xff, 0x21,
+ 0xf0, 0xdc, 0x20, 0x42, 0xf0, 0xd0, 0x2e, 0x1c, 0xdf, 0xae, 0x0f, 0x40,
+ 0xf0, 0xdc, 0x10, 0x1a,
+ 0x1f, 0x22, 0xbd, 0xf9, 0x50, 0x10, 0x00, 0x10, 0x30, 0xcb, 0x0f, 0x00,
+ 0x21, 0x42, 0xde, 0xae,
+ 0x0f, 0x1f, 0x30, 0x13, 0xcc, 0xbe, 0x02, 0x21, 0x3a, 0xfd, 0x00, 0x26,
+ 0x0f, 0xdd, 0xff, 0x0f,
+ 0x3f, 0xff, 0xa0, 0x10, 0x2c, 0x00, 0xbb, 0xed, 0x10, 0x30, 0xfc, 0x0f,
+ 0x00, 0xee, 0xd9, 0x70,
+ 0x20, 0xef, 0xde, 0x2e, 0x0c, 0x3f, 0x61, 0xcd, 0xef, 0x13, 0x0b, 0x0b,
+ 0x4f, 0x00, 0xd0, 0x0e,
+ 0x60, 0xfc, 0xde, 0x00, 0x41, 0x1e, 0xc9, 0xee, 0x10, 0x2f, 0xdd, 0xff,
+ 0x41, 0x0c, 0xeb, 0xde,
+ 0x1e, 0x4f, 0xff, 0xe0, 0x10, 0x4f, 0xfb, 0xfd, 0x0e, 0x1f, 0x41, 0x4e,
+ 0xca, 0xe0, 0x0f, 0x3c,
+ 0x70, 0x14, 0xbd, 0x0c, 0x00, 0x60, 0xf0, 0x0f, 0x0e, 0xec, 0x00, 0x34,
+ 0x0e, 0xdb, 0xfe, 0x10,
+ 0x12, 0xe0, 0xac, 0x1f, 0x4f, 0x0f, 0xd4, 0x02, 0x0d, 0x1c, 0x40, 0xf0,
+ 0xe0, 0x33, 0x20, 0xcc,
+ 0x20, 0x53, 0xcd, 0x02, 0x37, 0x00, 0xed, 0xf2, 0xef, 0x0f, 0x31, 0x54,
+ 0xff, 0xb0, 0x04, 0x12,
+ 0x31, 0x32, 0xf0, 0x88, 0x00, 0x67, 0x00, 0xef, 0xe0, 0x11, 0x11, 0x10,
+ 0x0f, 0x00, 0x06, 0x00,
+ 0xe1, 0x00, 0x10, 0xe0, 0xef, 0x14, 0x24, 0xe2, 0xa0, 0xdb, 0x20, 0x73,
+ 0x02, 0x00, 0xd1, 0xde,
+ 0xee, 0x66, 0x11, 0x00, 0x00, 0xf1, 0x01, 0x01, 0xf0, 0xf0, 0x26, 0x64,
+ 0x00, 0xd0, 0x02, 0x01,
+ 0x00, 0x32, 0x22, 0xf5, 0x03, 0xb0, 0xe0, 0x31, 0x13, 0x01, 0x46, 0xd1,
+ 0x8f, 0x00, 0x35, 0x01,
+ 0xc0, 0x02, 0xe1, 0x01, 0x61, 0xf1, 0xe1, 0x07, 0x11, 0x10, 0x01, 0x01,
+ 0x43, 0x00, 0x3a, 0x00,
+ 0xa4, 0x2a, 0x9b, 0x3e, 0x87, 0x2b, 0xb0, 0x41, 0x56, 0xe1, 0xef, 0x41,
+ 0x31, 0xda, 0xff, 0x71,
+ 0x01, 0xc2, 0x07, 0x20, 0x00, 0x0e, 0xff, 0x31, 0x47, 0xb0, 0xdc, 0x1f,
+ 0x31, 0x22, 0x43, 0xe0,
+ 0x8a, 0x00, 0x00, 0x10, 0x30, 0xe1, 0xc0, 0xfd, 0x30, 0x23, 0xbf, 0x0e,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xff, 0x00, 0x15, 0x10, 0x0e, 0x21, 0x45, 0x11, 0xfe, 0xcd, 0x11, 0x66,
+ 0x10, 0xee, 0xdd, 0x44,
+ 0x01, 0xf0, 0xf0, 0x00, 0xef, 0x01, 0x33, 0xc0, 0xef, 0x03, 0xf8, 0x0b,
+ 0x50, 0x01, 0xd3, 0x30,
+ 0x4e, 0xec, 0xdf, 0xbf, 0x0f, 0x52, 0x17, 0x02, 0xd2, 0xef, 0xfd, 0x60,
+ 0x21, 0xd0, 0xf0, 0x05,
+ 0x0f, 0x0b, 0x00, 0x21, 0x0f, 0x70, 0x0e, 0xcd, 0x13, 0x51, 0x0e, 0xe5,
+ 0xf3, 0x10, 0x3f, 0xfb,
+ 0xae, 0x00, 0x16, 0x00, 0xae, 0x1d, 0x11, 0x24, 0xf1, 0xee, 0x0f, 0x0d,
+ 0x2f, 0x15, 0x11, 0xff,
+ 0x10, 0x45, 0xde, 0xee, 0xe0, 0xd1, 0x12, 0x71, 0x52, 0xde, 0xe9, 0x00,
+ 0x00, 0xf2, 0xf4, 0x0f,
+ 0x6c, 0x1e, 0x00, 0xf5, 0xdf, 0x0e, 0x55, 0x00, 0x0b, 0xe0, 0x01, 0x01,
+ 0x11, 0x51, 0xee, 0xff,
+ 0x32, 0xf2, 0x90, 0x1e, 0x2f, 0x00, 0xd3, 0x03, 0xfd, 0x0a, 0x3e, 0x10,
+ 0xf6, 0xf1, 0xee, 0x1e,
+ 0x72, 0x10, 0xae, 0x0c, 0x20, 0x10, 0x11, 0xf3, 0xfd, 0x10, 0x2c, 0xcb,
+ 0x03, 0x27, 0x34, 0x8d,
+ 0x0e, 0x21, 0x11, 0xf3, 0xf1, 0x30, 0x00, 0xcf, 0xf3, 0x13, 0x3c, 0x5e,
+ 0x12, 0xf2, 0xbe, 0x01,
+ 0x06, 0x20, 0x3d, 0xe0, 0xd0, 0xe1, 0x02, 0x0f, 0xec, 0x8e, 0x0e, 0x60,
+ 0x00, 0x05, 0xf0, 0xfc,
+ 0x0b, 0x2f, 0x00, 0x1e, 0x0e, 0x31, 0x27, 0xe2, 0xdf, 0xed, 0xde, 0xe0,
+ 0x43, 0x71, 0x0f, 0xfa,
+ 0xd0, 0x15, 0x03, 0xab, 0x0e, 0x31, 0xf1, 0xd2, 0x33, 0xfc, 0xdd, 0x12,
+ 0x47, 0x01, 0xfe, 0xfc,
+ 0x10, 0x01, 0x02, 0xa1, 0x8d, 0x0c, 0x30, 0x13, 0xf1, 0xd2, 0x00, 0x0c,
+ 0x20, 0x04, 0x00, 0xee,
+ 0x5f, 0x61, 0x20, 0xf0, 0xd0, 0xee, 0x1a, 0x30, 0x30, 0x00, 0xaf, 0xf4,
+ 0x07, 0x0f, 0xed, 0xf0,
+ 0x02, 0x23, 0x00, 0xce, 0x0d, 0xf0, 0x2d, 0x65, 0xe1, 0x9b, 0x0c, 0x30,
+ 0x10, 0xe0, 0xf4, 0x01,
+ 0x00, 0x0f, 0x00, 0x20, 0x03, 0xf2, 0x03, 0x72, 0x36, 0xde, 0xfd, 0x1d,
+ 0x0b, 0xb1, 0x15, 0x71,
+ 0x0c, 0xf0, 0xf1, 0x03, 0x20, 0x0e, 0xee, 0x0f, 0x10, 0x07, 0xb1, 0xff,
+ 0x0d, 0x21, 0xe0, 0xff,
+ 0x22, 0xd0, 0xa1, 0x02, 0x02, 0x73, 0x30, 0xe9, 0xe0, 0x11, 0x1c, 0xfc,
+ 0x24, 0x64, 0xf0, 0xcc,
+ 0x00, 0x0f, 0x01, 0x31, 0xdb, 0xff, 0x14, 0x34, 0x0f, 0x9a, 0xf0, 0x01,
+ 0x41, 0x10, 0x0f, 0xef,
+ 0x0f, 0x20, 0x01, 0x01, 0x10, 0xfb, 0x01, 0xe4, 0x10, 0x71, 0x00, 0xde,
+ 0xf2, 0x06, 0x21, 0x0f,
+ 0xca, 0x41, 0x23, 0x01, 0xbe, 0xec, 0xf0, 0x33, 0x3e, 0xfc, 0x00, 0xe3,
+ 0xaf, 0x0e, 0x30, 0x04,
+ 0xf0, 0x2d, 0x2c, 0x00, 0x06, 0x72, 0x10, 0xcd, 0xe0, 0x0f, 0x2f, 0x30,
+ 0x24, 0xe0, 0xf1, 0x07,
+ 0xcf, 0xec, 0x40, 0x44, 0xf0, 0xdc, 0x00, 0xe3, 0xd0, 0x00, 0xef, 0xe0,
+ 0x00, 0x00, 0xd0, 0x8e,
+ 0x8d, 0x11, 0x67, 0xf0, 0xfd, 0x0e, 0x30, 0x01, 0x02, 0xe0, 0x0b, 0xee,
+ 0x10, 0x57, 0xf0, 0xcf,
+ 0x0f, 0x00, 0x0e, 0x12, 0x35, 0xe0, 0xdd, 0x53, 0x22, 0xfe, 0xdc, 0x01,
+ 0x33, 0x31, 0x21, 0xe1,
+ 0xe0, 0xfd, 0xde, 0xb0, 0x21, 0x67, 0x12, 0xee, 0xda, 0xe0, 0xef, 0x3f,
+ 0x30, 0x22, 0xc0, 0x9f,
+ 0xfd, 0xfe, 0x01, 0x15, 0x11, 0x64, 0x2e, 0xec, 0x00, 0xf6, 0x11, 0x10,
+ 0x9d, 0x00, 0x42, 0x21,
+ 0xef, 0x00, 0x03, 0xe0, 0x03, 0x04, 0x30, 0x2e, 0x2d, 0xe9, 0xb0, 0x06,
+ 0x20, 0x30, 0xdf, 0xb0,
+ 0x0f, 0x5c, 0x00, 0xa0, 0x00, 0x10, 0x34, 0xf0, 0xcc, 0x00, 0x21, 0x22,
+ 0x00, 0xf0, 0x0d, 0xba,
+ 0xff, 0x24, 0x42, 0xf0, 0xee, 0x0f, 0x3f, 0xfe, 0x8b, 0x00, 0x06, 0x21,
+ 0x21, 0x01, 0x1f, 0xeb,
+ 0xde, 0x02, 0xf4, 0xb1, 0xde, 0x1e, 0x50, 0x0f, 0xd1, 0xe1, 0xf0, 0x21,
+ 0x55, 0x0f, 0x0b, 0x20,
+ 0x30, 0xf1, 0x01, 0xee, 0x0f, 0x21, 0x30, 0x71, 0x22, 0x88, 0xfe, 0xf0,
+ 0x00, 0x12, 0x00, 0x10,
+ 0xed, 0xef, 0x16, 0x11, 0xf0, 0x2f, 0x1f, 0xef, 0x00, 0x0c, 0x20, 0x71,
+ 0x1e, 0xfb, 0xe0, 0xe0,
+ 0x05, 0x42, 0x00, 0x10, 0xd2, 0xd1, 0x23, 0x75, 0x3f, 0x0d, 0xee, 0xe0,
+ 0x05, 0xed, 0x2a, 0x10,
+ 0x80, 0xe1, 0x10, 0x2c, 0x0c, 0xe0, 0x12, 0x23, 0xcf, 0xef, 0x10, 0x1f,
+ 0x74, 0x32, 0xbd, 0xbc,
+ 0x03, 0x17, 0x21, 0x00, 0x0e, 0xf0, 0x23, 0x33, 0xe3, 0x12, 0x70, 0x18,
+ 0x1f, 0x13, 0xd0, 0xdf,
+ 0x00, 0x13, 0x00, 0x1f, 0x10, 0xbf, 0x9a, 0xf1, 0x05, 0x10, 0x1d, 0x0d,
+ 0x12, 0x33, 0xf1, 0xfc,
+ 0x3d, 0x30, 0x00, 0x3e, 0x70, 0xf0, 0xb1, 0xf6, 0x12, 0x3f, 0xeb, 0xa0,
+ 0x0d, 0x14, 0x27, 0x22,
+ 0x0c, 0xff, 0xf0, 0xe1, 0x45, 0x20, 0xff, 0x00, 0x00, 0xbe, 0x0d, 0x03,
+ 0x15, 0x0f, 0xdb, 0x40,
+ 0x22, 0xc0, 0xfe, 0x1f, 0xff, 0xd0, 0x02, 0x12, 0xc0, 0x1d, 0x7e, 0x1d,
+ 0xae, 0xf3, 0x05, 0x0e,
+ 0x10, 0x64, 0x0f, 0xdd, 0x01, 0x10, 0x12, 0x07, 0x03, 0xf0, 0x3d, 0x20,
+ 0xb0, 0xe4, 0x0e, 0xfc,
+ 0x31, 0x3f, 0x0d, 0xa5, 0x05, 0x0f, 0x1a, 0x20, 0xe2, 0xc1, 0x10, 0x1e,
+ 0xef, 0xef, 0x00, 0x0d,
+ 0xd1, 0xf2, 0x24, 0x14, 0xb0, 0xb9, 0xf0, 0x20, 0x73, 0x33, 0x1f, 0xed,
+ 0x00, 0x22, 0x25, 0xdf,
+ 0x0e, 0x70, 0x01, 0x00, 0x23, 0x74, 0x00, 0xe9, 0x0f, 0x00, 0xb0, 0xf3,
+ 0x32, 0x10, 0xdc, 0xdd,
+ 0x20, 0x31, 0x00, 0xf2, 0x95, 0xf1, 0x01, 0x2e, 0x10, 0x30, 0x2c, 0x2f,
+ 0x16, 0xd2, 0xed, 0x1f,
+ 0x41, 0xf2, 0xe0, 0x1f, 0x77, 0x70, 0x0b, 0xa0, 0x01, 0x07, 0x0f, 0x0e,
+ 0x20, 0x10, 0x02, 0xdf,
+ 0x0f, 0x10, 0x4f, 0x0d, 0xfc, 0x10, 0x45, 0xe1, 0xd0, 0x0e, 0x11, 0x44,
+ 0x20, 0xff, 0xbc, 0x01,
+ 0x33, 0x00, 0x10, 0xe0, 0x8c, 0xef, 0x00, 0x35, 0x00, 0xea, 0xe0, 0xfe,
+ 0xf1, 0xf0, 0x23, 0x51,
+ 0xfd, 0xfe, 0xff, 0x02, 0x12, 0x03, 0xed, 0x00, 0xc6, 0x80, 0x1e, 0x41,
+ 0xf0, 0xff, 0x12, 0x27,
+ 0x04, 0x1e, 0x4d, 0x33, 0x12, 0x0f, 0xfe, 0xac, 0xdb, 0x00, 0x15, 0x1f,
+ 0xef, 0xe0, 0xa3, 0xdc,
+ 0xfe, 0x30, 0x52, 0xe3, 0xd2, 0x09, 0x3e, 0x20, 0x00, 0x0d, 0x30, 0x21,
+ 0x94, 0xee, 0xfc, 0x20,
+ 0x5e, 0xf0, 0xc4, 0xf0, 0x01, 0x21, 0x53, 0x2e, 0x00, 0xff, 0xde, 0x07,
+ 0x47, 0x51, 0x0f, 0xfe,
+ 0xef, 0x00, 0x32, 0x00, 0xf0, 0xce, 0xfb, 0x00, 0xf4, 0xf0, 0xde, 0x00,
+ 0x0e, 0x1f, 0x82, 0xc2,
+ 0x0f, 0x0f, 0x30, 0xef, 0xfc, 0x2f, 0x1c, 0x2e, 0x70, 0x07, 0x04, 0xe0,
+ 0x3f, 0x32, 0x02, 0xf1,
+ 0xe2, 0x0f, 0xfd, 0x90, 0x07, 0x22, 0x3d, 0x1b, 0xe0, 0x92, 0xf3, 0x0f,
+ 0x5d, 0x41, 0x02, 0xae,
+ 0x0f, 0x0d, 0x1e, 0x0e, 0xf8, 0x0b, 0x01, 0x03, 0xe6, 0x00, 0x0c, 0x00,
+ 0x01, 0x13, 0xef, 0xbd,
+ 0x01, 0x01, 0x51, 0x10, 0x2e, 0x11, 0x17, 0xe1, 0xbd, 0xec, 0x11, 0x73,
+ 0x20, 0xfc, 0xcf, 0x00,
+ 0x02, 0x10, 0x3f, 0xf3, 0xe5, 0xde, 0x0d, 0x1e, 0x3d, 0xef, 0xc0, 0x05,
+ 0x20, 0x42, 0x53, 0x0a,
+ 0xac, 0xf0, 0x01, 0x10, 0x30, 0x15, 0x01, 0xe2, 0xef, 0xfb, 0x2f, 0x51,
+ 0xf1, 0xb0, 0x02, 0x03,
+ 0xcf, 0x0a, 0x30, 0x30, 0x00, 0xff, 0x01, 0x04, 0xbe, 0xfb, 0x30, 0x70,
+ 0x33, 0xce, 0x0e, 0x05,
+ 0x00, 0x00, 0x01, 0x04, 0x0e, 0xab, 0xef, 0x00, 0x53, 0x24, 0x14, 0xf2,
+ 0xbd, 0x0b, 0xff, 0x30,
+ 0x30, 0x02, 0xb0, 0xee, 0x0e, 0x30, 0x10, 0x0a, 0x0e, 0xe2, 0x07, 0x30,
+ 0xec, 0xdf, 0x31, 0x53,
+ 0x00, 0xe1, 0xbf, 0xed, 0x21, 0x65, 0x30, 0x00, 0x9f, 0x00, 0x24, 0x31,
+ 0x36, 0xf1, 0xb0, 0xfc,
+ 0x10, 0x12, 0x00, 0xef, 0xf0, 0x01, 0x12, 0x02, 0xd3, 0x00, 0x28, 0x4d,
+ 0xe0, 0xc7, 0xf1, 0x1f,
+ 0x5f, 0x40, 0x2f, 0xe0, 0xbf, 0x02, 0x40, 0x3e, 0xfd, 0xcc, 0xff, 0x00,
+ 0x12, 0x30, 0xee, 0xc2,
+ 0x04, 0x20, 0xfc, 0x01, 0x33, 0x35, 0xd3, 0xfe, 0x1c, 0xfe, 0x0f, 0x76,
+ 0x01, 0x0d, 0xfd, 0xb4,
+ 0xd3, 0xff, 0xfb, 0x2f, 0xe0, 0x92, 0xf4, 0xc0, 0xff, 0x2b, 0x50, 0x10,
+ 0xd1, 0xc0, 0x01, 0x41,
+ 0x3e, 0xfb, 0xff, 0x00, 0x06, 0x21, 0x4f, 0x1e, 0x01, 0xa0, 0x0e, 0x4d,
+ 0x15, 0xf5, 0xc0, 0x0c,
+ 0x30, 0x0f, 0xc1, 0x02, 0x00, 0xff, 0xff, 0x11, 0x05, 0xbc, 0xcd, 0x3f,
+ 0x55, 0x00, 0xaf, 0x0d,
+ 0x00, 0xf1, 0x00, 0x1f, 0x2f, 0xf3, 0xf4, 0x00, 0x0f, 0xf0, 0x02, 0x77,
+ 0x22, 0x0f, 0xfd, 0x0f,
+ 0x0e, 0x2f, 0x30, 0x12, 0x04, 0xb3, 0xe1, 0x28, 0x7c, 0x01, 0x05, 0xe1,
+ 0xd0, 0x00, 0xe0, 0x0d,
+ 0x0f, 0x02, 0xd5, 0xc0, 0xff, 0x0c, 0x5f, 0x2f, 0x00, 0x02, 0x24, 0x0f,
+ 0x2e, 0x70, 0x21, 0xf3,
+ 0xd0, 0xc0, 0x02, 0x04, 0x4d, 0x0d, 0xcf, 0xf5, 0xf5, 0x30, 0x7c, 0x1d,
+ 0xed, 0xff, 0xff, 0xef,
+ 0x06, 0x62, 0x2e, 0x0c, 0xce, 0x0f, 0x03, 0xf6, 0x0f, 0x1c, 0x72, 0x03,
+ 0x11, 0x00, 0xfe, 0x00,
+ 0xe1, 0x04, 0x41, 0xf2, 0xc1, 0x01, 0x3c, 0xec, 0xc0, 0x14, 0x00, 0xee,
+ 0xfe, 0x2f, 0x50, 0x1d,
+ 0x0c, 0xed, 0xd4, 0x47, 0x00, 0x1e, 0x2f, 0x40, 0xf2, 0x82, 0xfd, 0x0c,
+ 0x6e, 0x00, 0x07, 0xe4,
+ 0x0e, 0x2b, 0x31, 0x03, 0xf1, 0xbe, 0xfe, 0x01, 0x25, 0x00, 0x00, 0xcd,
+ 0xe1, 0x02, 0x00, 0xfd,
+ 0xdf, 0x42, 0x73, 0x09, 0xcd, 0xe0, 0x03, 0x14, 0x50, 0x1e, 0xf9, 0xd0,
+ 0xf2, 0x12, 0x6e, 0x0d,
+ 0x0f, 0xd2, 0xf0, 0x0d, 0x0d, 0x10, 0x2f, 0xf2, 0xb4, 0x0f, 0x1e, 0x67,
+ 0x17, 0x00, 0xd0, 0x0f,
+ 0x10, 0x42, 0x20, 0x0f, 0xc1, 0xe0, 0x0f, 0xff, 0xf3, 0x13, 0x4f, 0x28,
+ 0xff, 0xb0, 0xe1, 0xf0,
+ 0x0d, 0x4f, 0x30, 0x06, 0xc0, 0xcf, 0xeb, 0x0f, 0x41, 0x01, 0x11, 0x10,
+ 0x41, 0xf5, 0xb0, 0x0f,
+ 0x0d, 0x40, 0x04, 0x01, 0x40, 0x00, 0xd0, 0x02, 0x2f, 0x0e, 0x86, 0xf1,
+ 0x11, 0x41, 0x11, 0x02,
+ 0xe4, 0xd1, 0x1d, 0x48, 0x0d, 0xf1, 0xe2, 0x00, 0x0c, 0x02, 0x61, 0x0e,
+ 0xdd, 0x00, 0x00, 0x01,
+ 0xd5, 0x22, 0x5d, 0x0b, 0xcf, 0xff, 0x02, 0x03, 0x0f, 0x7c, 0x30, 0xf2,
+ 0xb0, 0x0a, 0x00, 0x21,
+ 0x0e, 0xed, 0xe7, 0xd4, 0xd0, 0x2d, 0x6e, 0x02, 0xd3, 0xb1, 0xd0, 0xff,
+ 0x0e, 0x7f, 0x21, 0x0f,
+ 0xdb, 0x01, 0x26, 0x20, 0x0b, 0xce, 0x20, 0x35, 0x01, 0xcf, 0x0d, 0x20,
+ 0xf0, 0xf0, 0x33, 0x05,
+ 0xde, 0x0e, 0x0e, 0xa0, 0xf1, 0x02, 0x0d, 0x0d, 0xe0, 0x0f, 0x2b, 0xb1,
+ 0xd5, 0x10, 0x1d, 0x3d,
+ 0x41, 0x55, 0x0f, 0xff, 0xf2, 0x14, 0x11, 0xef, 0x8b, 0xd0, 0x20, 0x26,
+ 0x00, 0x10, 0x2e, 0x2e,
+ 0x60, 0x03, 0x00, 0xeb, 0x1f, 0x30, 0x1d, 0x00, 0xe0, 0x9f, 0xbe, 0xe0,
+ 0xf1, 0x24, 0x0f, 0xdf,
+ 0xb1, 0xf7, 0x01, 0x50, 0x30, 0x10, 0xfc, 0x0e, 0x14, 0x05, 0x40, 0x6d,
+ 0x02, 0xf7, 0xe0, 0x0e,
+ 0xf0, 0x11, 0x15, 0x10, 0xc0, 0xb0, 0x00, 0x0f, 0x5f, 0x0e, 0xf0, 0x04,
+ 0x05, 0xd0, 0xfe, 0x1b,
+ 0x70, 0x51, 0x04, 0xc0, 0x0d, 0x0d, 0x10, 0x32, 0x00, 0xcf, 0x0e, 0x00,
+ 0x0f, 0x1e, 0xe1, 0xd4,
+ 0x02, 0x24, 0x62, 0x10, 0xfc, 0xe4, 0x03, 0x0c, 0x3d, 0x05, 0x04, 0x20,
+ 0x50, 0x00, 0xdf, 0xac,
+ 0x00, 0x0e, 0x20, 0x27, 0xe2, 0xbc, 0x0e, 0x00, 0x70, 0x0f, 0xee, 0xf1,
+ 0xf1, 0x0f, 0x19, 0x00,
+ 0x10, 0x20, 0x10, 0xf0, 0xc0, 0xcb, 0x01, 0x15, 0x51, 0x10, 0x0d, 0xef,
+ 0x02, 0x01, 0xf1, 0x0f,
+ 0x31, 0xd7, 0xe5, 0x3e, 0x3c, 0x0f, 0x32, 0x23, 0x82, 0x9f, 0x0b, 0x20,
+ 0x40, 0xff, 0xc0, 0xf0,
+ 0x00, 0x12, 0x00, 0x2f, 0x2e, 0xfc, 0xc0, 0xf4, 0x07, 0xe0, 0xee, 0x1e,
+ 0xff, 0x82, 0x04, 0x21,
+ 0x70, 0x1e, 0x0f, 0xd1, 0x04, 0x30, 0x0c, 0x0e, 0x40, 0x26, 0x02, 0xc1,
+ 0xf0, 0xfd, 0xff, 0x00,
+ 0x22, 0x02, 0xbf, 0xee, 0x0e, 0x28, 0x1f, 0x02, 0x24, 0x70, 0x0e, 0xee,
+ 0xf0, 0x03, 0x01, 0xef,
+ 0xf4, 0x74, 0x40, 0x0c, 0xef, 0xe1, 0x15, 0x13, 0xef, 0xeb, 0x3e, 0x50,
+ 0x16, 0x00, 0xd0, 0xbd,
+ 0x00, 0x00, 0x03, 0x21, 0x2c, 0x0f, 0xe0, 0x11, 0x7f, 0x7f, 0x2f, 0xe1,
+ 0xe3, 0x02, 0xed, 0x0e,
+ 0x31, 0x27, 0x03, 0xa0, 0x0b, 0x0f, 0x00, 0x02, 0x02, 0x2c, 0x0b, 0x0e,
+ 0xd0, 0xc2, 0x05, 0x4d,
+ 0x1b, 0x0f, 0xa1, 0xc3, 0x03, 0x2e, 0x0a, 0xd0, 0xb6, 0xf0, 0x0e, 0x5f,
+ 0x20, 0x13, 0xf0, 0xc1,
+ 0x00, 0x3e, 0x50, 0x02, 0xd0, 0xfe, 0x00, 0x26, 0x50, 0x0d, 0x00, 0xc5,
+ 0x0f, 0x0e, 0xee, 0xf1,
+ 0x32, 0x32, 0xf0, 0xca, 0xe0, 0x01, 0x03, 0x1e, 0x29, 0xdf, 0xe2, 0xf3,
+ 0xaf, 0x0b, 0x6e, 0x00,
+ 0xe3, 0xf2, 0x0e, 0xfb, 0x00, 0x30, 0x00, 0x93, 0x00, 0x00, 0x1c, 0x1e,
+ 0x41, 0x07, 0xe1, 0x20,
+ 0x6e, 0x10, 0x21, 0x13, 0xff, 0xdd, 0x30, 0x22, 0x26, 0xe0, 0x9f, 0xde,
+ 0xd0, 0xf0, 0x01, 0xfe,
+ 0xd9, 0x0f, 0x72, 0x04, 0xd0, 0xfb, 0x10, 0x40, 0x11, 0x01, 0x01, 0x00,
+ 0x1d, 0xc0, 0xe2, 0x01,
+ 0x4d, 0x3c, 0xe2, 0x85, 0x02, 0x30, 0x1e, 0x0f, 0x22, 0xc3, 0xd5, 0x10,
+ 0x7d, 0x3a, 0xe1, 0xd1,
+ 0x02, 0xe0, 0xef, 0x0d, 0x0e, 0x50, 0x13, 0xff, 0xcb, 0x10, 0x30, 0x16,
+ 0x00, 0x01, 0xce, 0xdb,
+ 0x00, 0xf1, 0xd3, 0xb0, 0x0f, 0x0c, 0x30, 0x12, 0x10, 0x9f, 0xe2, 0x57,
+ 0x53, 0x00, 0x0b, 0x0e,
+ 0x2f, 0x00, 0xa4, 0xf1, 0x02, 0x0e, 0x2f, 0x1f, 0xee, 0xfe, 0x04, 0x20,
+ 0x2a, 0x00, 0x13, 0x43,
+ 0x10, 0xbb, 0xce, 0xee, 0x51, 0x52, 0xf0, 0xd2, 0xe2, 0x0c, 0x2f, 0x30,
+ 0xf1, 0xb0, 0x0c, 0x2f,
+ 0x22, 0x17, 0x01, 0xdf, 0x0b, 0x00, 0x00, 0x14, 0xf0, 0x8f, 0xff, 0x05,
+ 0x52, 0x0b, 0xdd, 0xfe,
+ 0x00, 0x64, 0x11, 0x12, 0xf0, 0xff, 0x00, 0xfe, 0x20, 0x14, 0x14, 0xdd,
+ 0x9d, 0xf0, 0x05, 0x43,
+ 0x01, 0xec, 0xfc, 0x30, 0x40, 0x11, 0xfe, 0xde, 0x02, 0x05, 0xb0, 0x0f,
+ 0x4d, 0x30, 0xed, 0xae,
+ 0xe2, 0xe7, 0x01, 0x7d, 0x1e, 0x00, 0x07, 0xe0, 0x0d, 0x1f, 0x12, 0x47,
+ 0x22, 0xe0, 0xbb, 0x00,
+ 0x2f, 0x32, 0x02, 0xe1, 0xbe, 0x00, 0xf5, 0x01, 0x1f, 0x0e, 0x00, 0x01,
+ 0xf2, 0xf2, 0x13, 0x60,
+ 0x3b, 0x10, 0x00, 0xd0, 0x02, 0xff, 0x1e, 0x30, 0x54, 0x0f, 0xd9, 0xff,
+ 0x0e, 0x00, 0xf5, 0xe1,
+ 0x0e, 0x0e, 0xe0, 0x3f, 0x7e, 0x70, 0x10, 0xe0, 0x04, 0x12, 0x0f, 0x08,
+ 0xff, 0xb0, 0xf3, 0x40,
+ 0x32, 0x03, 0x00, 0xdf, 0x9c, 0xdd, 0xee, 0x25, 0x26, 0x00, 0xdb, 0xd0,
+ 0xd0, 0x91, 0x02, 0x20,
+ 0x30, 0x2f, 0xeb, 0xdf, 0x00, 0x31, 0x63, 0x4f, 0x0b, 0xfe, 0xb0, 0x01,
+ 0x26, 0x22, 0x00, 0x0d,
+ 0x20, 0xf2, 0xc3, 0xf0, 0x0c, 0x3d, 0x00, 0xb6, 0xe1, 0xdd, 0x0d, 0x5e,
+ 0x10, 0xe5, 0xd0, 0x20,
+ 0xfc, 0xa0, 0x03, 0x40, 0x0f, 0xd2, 0xe4, 0xff, 0x0b, 0x10, 0x01, 0x01,
+ 0x27, 0x00, 0x1a, 0x00,
+ 0x74, 0xf3, 0xd6, 0xf7, 0x47, 0xf6, 0xfe, 0xf8, 0xca, 0x00, 0x63, 0x63,
+ 0x10, 0x0d, 0xea, 0x00,
+ 0x13, 0x44, 0x20, 0x0f, 0x01, 0xf7, 0xd0, 0xe1, 0xe1, 0x00, 0x2c, 0x4f,
+ 0xde, 0xbf, 0xf0, 0xd5,
+ 0x01, 0x31, 0x7f, 0x0e, 0xef, 0xdb, 0x0f, 0x03, 0x67, 0x00, 0xf0, 0xee,
+ 0xf0, 0x02, 0x4f, 0x1b,
+ 0x12, 0x26, 0x11, 0xd0, 0xbc, 0x00, 0x11, 0x61, 0x00, 0xff, 0xde, 0xf0,
+ 0xf2, 0x01, 0x0b, 0x2d,
+ 0x7f, 0x00, 0xd0, 0xef, 0x12, 0x70, 0x2f, 0x0f, 0xf3, 0xf7, 0x03, 0xfa,
+ 0x2f, 0x02, 0xe4, 0xe0,
+ 0x30, 0x2f, 0x8e, 0xef, 0x02, 0x33, 0x10, 0x09, 0x20, 0x23, 0xb2, 0xff,
+ 0x0c, 0x20, 0x16, 0xd0,
+ 0xf0, 0x0f, 0x1d, 0x0f, 0xef, 0xc0, 0x00, 0x5f, 0x21, 0x45, 0xfe, 0xde,
+ 0x33, 0x76, 0x60, 0xfe,
+ 0xe0, 0xd0, 0x10, 0x1f, 0x1a, 0x11, 0x04, 0x00, 0xaf, 0x0d, 0xf0, 0x04,
+ 0x00, 0x21, 0x24, 0xcf,
+ 0xdd, 0xff, 0x44, 0x33, 0x0e, 0xfe, 0x01, 0xf0, 0x89, 0xee, 0x00, 0x30,
+ 0x23, 0x30, 0xfa, 0xaf,
+ 0x00, 0x01, 0x30, 0x0e, 0xe0, 0xe1, 0x10, 0x3d, 0xc0, 0xdc, 0x40, 0x51,
+ 0xf7, 0xc4, 0xf1, 0x00,
+ 0x3c, 0x4d, 0x02, 0x16, 0x43, 0x21, 0xff, 0xce, 0x0e, 0xef, 0xd2, 0xf4,
+ 0x20, 0x7c, 0x0e, 0xbf,
+ 0xe1, 0xf3, 0x00, 0x54, 0x00, 0x0c, 0x0d, 0x00, 0x01, 0x0d, 0x0a, 0x3f,
+ 0x31, 0x01, 0xbe, 0xdb,
+ 0xf1, 0x35, 0x53, 0x04, 0xe1, 0xff, 0xfc, 0x10, 0x26, 0x31, 0xef, 0xce,
+ 0xc3, 0xf3, 0x6f, 0x3b,
+ 0x1d, 0xf0, 0xe1, 0x07, 0xe0, 0x10, 0x70, 0x3e, 0xce, 0xd0, 0x04, 0x03,
+ 0xf0, 0x1a, 0x50, 0xf0,
+ 0xc0, 0x00, 0x2f, 0x0f, 0x1f, 0x00, 0x0f, 0x10, 0x00, 0x10, 0x70, 0x10,
+ 0xff, 0xbf, 0xf2, 0xf3,
+ 0xfe, 0x03, 0x16, 0xec, 0x9b, 0x00, 0x03, 0x04, 0x41, 0x00, 0xed, 0xd2,
+ 0xe3, 0x01, 0x30, 0x2b,
+ 0x2d, 0x00, 0xf3, 0x0f, 0xf9, 0x20, 0x5f, 0x53, 0x23, 0x0c, 0x1b, 0xe0,
+ 0xc5, 0x02, 0x31, 0x3f,
+ 0xac, 0xe0, 0xb0, 0xf1, 0x0e, 0x7b, 0x10, 0xf0, 0xc0, 0xfd, 0x0d, 0x3f,
+ 0x0c, 0x0d, 0xd4, 0xe7,
+ 0xc6, 0x0f, 0x3e, 0x40, 0x00, 0xd1, 0xf2, 0xf0, 0x3d, 0x70, 0x30, 0xf1,
+ 0xed, 0x1c, 0x20, 0xe0,
+ 0xf3, 0x20, 0x60, 0x0e, 0xe0, 0xdf, 0x0b, 0xc0, 0xdf, 0x00, 0x00, 0xd5,
+ 0x80, 0xdc, 0x2c, 0x5c,
+ 0x00, 0xe1, 0x06, 0x50, 0x00, 0xff, 0x00, 0x33, 0x0f, 0x1d, 0x01, 0x06,
+ 0xf2, 0xf0, 0xee, 0xf0,
+ 0x33, 0x13, 0x81, 0xf1, 0x01, 0x43, 0x07, 0xd5, 0x30, 0x4c, 0x0e, 0x01,
+ 0x44, 0x11, 0xcf, 0xcf,
+ 0x00, 0x40, 0x3e, 0x0b, 0x0f, 0xe1, 0x05, 0xdf, 0xef, 0x10, 0x60, 0x30,
+ 0x20, 0xd0, 0xff, 0x08,
+ 0xc0, 0xd2, 0xc3, 0x0c, 0xb0, 0x01, 0x72, 0x5e, 0x0d, 0x04, 0xf5, 0xe0,
+ 0x10, 0x0f, 0x32, 0xf4,
+ 0xd1, 0x01, 0x3f, 0xca, 0xcf, 0x0f, 0xee, 0x00, 0xf6, 0x00, 0x4d, 0x5e,
+ 0x00, 0xd2, 0xdf, 0x2d,
+ 0x72, 0x22, 0x0c, 0xeb, 0xcf, 0xf0, 0x04, 0x12, 0x2e, 0xec, 0x11, 0x72,
+ 0x00, 0xce, 0xf1, 0x04,
+ 0x12, 0x03, 0x01, 0x0f, 0x0d, 0x4d, 0x10, 0x37, 0xd6, 0xed, 0xce, 0xd2,
+ 0x04, 0x60, 0x0d, 0x0f,
+ 0xff, 0xef, 0xef, 0xe1, 0x07, 0x20, 0x00, 0x0d, 0x8c, 0xff, 0x0f, 0x00,
+ 0x03, 0xf4, 0x34, 0x4f,
+ 0xf9, 0xaf, 0x01, 0x75, 0x31, 0xf0, 0xd2, 0x1f, 0x5e, 0x20, 0x00, 0xce,
+ 0x00, 0x07, 0x01, 0xf0,
+ 0xfd, 0xff, 0xf1, 0x01, 0x11, 0xf0, 0xcf, 0xee, 0x30, 0x75, 0x30, 0xed,
+ 0x10, 0x43, 0x0f, 0x2f,
+ 0xe1, 0xb4, 0xdb, 0xee, 0x24, 0x76, 0x10, 0xe0, 0xc3, 0x00, 0x10, 0x21,
+ 0x13, 0x18, 0x0c, 0x20,
+ 0x01, 0xe4, 0xbf, 0x0b, 0x4f, 0x61, 0x04, 0xf0, 0xff, 0x0f, 0x00, 0x13,
+ 0x52, 0x00, 0xef, 0xfe,
+ 0x0d, 0x20, 0x15, 0xf0, 0xee, 0xfe, 0x0f, 0x30, 0x71, 0x5d, 0x0c, 0xa1,
+ 0x03, 0x02, 0x1c, 0x0b,
+ 0xde, 0x01, 0x05, 0xff, 0xfd, 0xf0, 0xe0, 0xfc, 0xf2, 0xf4, 0xd5, 0xd2,
+ 0x20, 0x70, 0x7f, 0x1d,
+ 0x0f, 0xe2, 0xf7, 0xf1, 0x2e, 0x5d, 0x0f, 0xdf, 0xff, 0x01, 0x27, 0x14,
+ 0x0e, 0xee, 0xe2, 0xc4,
+ 0x0f, 0x2e, 0x4f, 0x3e, 0xfe, 0xb3, 0xf3, 0x00, 0xd8, 0x0f, 0x70, 0x10,
+ 0xcf, 0xcf, 0x0d, 0x01,
+ 0x16, 0x10, 0x0e, 0x0d, 0xef, 0xe0, 0xf4, 0x10, 0x1d, 0x1c, 0x21, 0x43,
+ 0x5f, 0x3c, 0xfe, 0xf0,
+ 0xf4, 0xf3, 0x43, 0x71, 0x1c, 0x0e, 0xd0, 0x07, 0x34, 0xd0, 0xdf, 0x0f,
+ 0x50, 0x00, 0x90, 0xfe,
+ 0xf0, 0x01, 0x0b, 0x1e, 0xf0, 0x12, 0x22, 0xf1, 0xdf, 0x0d, 0x7a, 0x10,
+ 0xf5, 0xf1, 0x1e, 0x3e,
+ 0xf4, 0x00, 0x0c, 0xbf, 0xd3, 0xf5, 0x1f, 0x10, 0x20, 0x22, 0x5e, 0x0e,
+ 0x82, 0xf5, 0x00, 0x3d,
+ 0x2e, 0x30, 0x02, 0xbf, 0x0e, 0x0e, 0x00, 0xf4, 0xd1, 0xcf, 0xfd, 0x2f,
+ 0x6d, 0xf2, 0xb7, 0x00,
+ 0x1c, 0x2b, 0x0f, 0x10, 0x12, 0xd1, 0xc3, 0x04, 0x20, 0x2e, 0x00, 0xdd,
+ 0x9b, 0x01, 0x27, 0x52,
+ 0x0e, 0x0e, 0x21, 0x52, 0xdf, 0xcf, 0x04, 0x20, 0x2e, 0x00, 0x22, 0xec,
+ 0x8d, 0xf2, 0x07, 0x30,
+ 0x2b, 0xe0, 0xd0, 0x32, 0x4f, 0x0e, 0x0f, 0x2f, 0x0d, 0xb0, 0xf4, 0x04,
+ 0x3f, 0x3d, 0xaf, 0xe1,
+ 0xe2, 0x05, 0x24, 0x20, 0x1a, 0x0f, 0xf0, 0x00, 0xc0, 0xde, 0x20, 0x40,
+ 0x20, 0x11, 0x22, 0xff,
+ 0x8d, 0xe0, 0x03, 0x57, 0x07, 0xf1, 0xee, 0x1f, 0x30, 0x4f, 0x00, 0xd0,
+ 0xdd, 0x3e, 0x43, 0x05,
+ 0xe1, 0x1e, 0x0d, 0xbf, 0xf5, 0x11, 0x1f, 0x0c, 0x3f, 0xcd, 0x84, 0xb3,
+ 0x1d, 0x28, 0x10, 0x12,
+ 0x03, 0xff, 0xdd, 0xf0, 0x20, 0x6f, 0x13, 0x37, 0x30, 0x0f, 0xbe, 0xfd,
+ 0x0b, 0x10, 0x11, 0xf4,
+ 0xe2, 0x03, 0x01, 0x0e, 0xff, 0xc0, 0x05, 0x33, 0x01, 0xb1, 0x01, 0x55,
+ 0x02, 0x9e, 0xfb, 0x00,
+ 0x7f, 0x22, 0x05, 0x05, 0x10, 0xdd, 0xdc, 0x11, 0x54, 0x12, 0xe0, 0xde,
+ 0x1f, 0x3f, 0x00, 0xa4,
+ 0x0e, 0x1a, 0x00, 0x1f, 0x21, 0x2f, 0x5b, 0x10, 0x00, 0xf2, 0x22, 0x4f,
+ 0xfc, 0xc1, 0x05, 0x10,
+ 0x01, 0xc0, 0xee, 0x00, 0xe1, 0xa0, 0x0e, 0xec, 0xc0, 0xd0, 0xf4, 0x5f,
+ 0x20, 0xee, 0xed, 0x2d,
+ 0x40, 0x12, 0x16, 0x05, 0xb0, 0x00, 0x0e, 0x1f, 0x5c, 0x0f, 0xee, 0xd0,
+ 0xf7, 0x02, 0x1e, 0x3d,
+ 0x40, 0x00, 0xc1, 0x02, 0x26, 0x71, 0x40, 0xfc, 0xee, 0xf1, 0xf3, 0xd0,
+ 0xed, 0x2e, 0x40, 0x04,
+ 0x8d, 0xfc, 0xd3, 0x17, 0x30, 0x0f, 0xf0, 0xff, 0x22, 0x15, 0xcc, 0xfa,
+ 0x3f, 0x30, 0xf1, 0x03,
+ 0x10, 0x20, 0x3d, 0x10, 0x4f, 0x21, 0xe5, 0x94, 0x30, 0x70, 0x20, 0xee,
+ 0xcc, 0x00, 0x07, 0xd1,
+ 0x2f, 0x3d, 0xe0, 0x90, 0xfd, 0x02, 0x01, 0xff, 0x0d, 0x30, 0x26, 0x21,
+ 0x2f, 0x1b, 0xf0, 0xc1,
+ 0x07, 0xe2, 0x20, 0x7e, 0x20, 0xe0, 0xd1, 0xc0, 0xad, 0x00, 0x03, 0x13,
+ 0x3f, 0x4b, 0x1d, 0xcd,
+ 0xd0, 0x03, 0x4d, 0x3b, 0x21, 0x05, 0xe0, 0xec, 0x00, 0x00, 0x05, 0xef,
+ 0xdd, 0x70, 0x71, 0x23,
+ 0xe0, 0xe0, 0xf1, 0x06, 0x00, 0x2e, 0x30, 0x11, 0x2e, 0xdf, 0xc0, 0xe4,
+ 0xc1, 0xfe, 0x08, 0x4f,
+ 0x02, 0xf3, 0xe0, 0x0c, 0xc0, 0xc0, 0xf5, 0x00, 0x00, 0x60, 0x20, 0x3e,
+ 0x6e, 0x00, 0xc0, 0x05,
+ 0x11, 0x20, 0x1c, 0x0f, 0x4c, 0x41, 0xe6, 0x01, 0x4f, 0xdc, 0xb0, 0x02,
+ 0x30, 0x31, 0xa1, 0xf0,
+ 0x04, 0xff, 0xeb, 0xc0, 0x0f, 0x02, 0x03, 0x0e, 0x6f, 0x30, 0x01, 0xc1,
+ 0x05, 0x00, 0x3e, 0x49,
+ 0x0f, 0xd0, 0xd1, 0x0f, 0xd0, 0x92, 0xf4, 0xfd, 0x0c, 0x2c, 0x0d, 0x0f,
+ 0x00, 0x53, 0x03, 0x2e,
+ 0x0c, 0x21, 0x37, 0x61, 0x20, 0xff, 0xd0, 0xf4, 0xc4, 0xc1, 0x00, 0x6e,
+ 0x1e, 0xf0, 0xc5, 0x01,
+ 0x0f, 0x00, 0x34, 0x00, 0xec, 0x0b, 0x10, 0xf3, 0x01, 0x70, 0x2e, 0xfe,
+ 0xc0, 0x02, 0x4e, 0x0a,
+ 0xe0, 0x01, 0x13, 0xf1, 0x80, 0x0f, 0x0d, 0x1f, 0x10, 0x01, 0xe5, 0x14,
+ 0x44, 0x13, 0x21, 0x0f,
+ 0xce, 0x08, 0x0f, 0x01, 0x27, 0x20, 0xfe, 0x8f, 0x00, 0x12, 0x03, 0xe4,
+ 0x00, 0x6e, 0x1e, 0xe1,
+ 0xd6, 0x0e, 0x2d, 0x1f, 0x00, 0x00, 0x0e, 0x20, 0x33, 0x0b, 0x0c, 0xf0,
+ 0xff, 0x0f, 0x60, 0x3f,
+ 0x50, 0x00, 0xc5, 0xc3, 0xd0, 0xeb, 0x00, 0x35, 0xf2, 0x80, 0xfd, 0xef,
+ 0x0f, 0x30, 0x10, 0xfc,
+ 0x0e, 0xe0, 0xf1, 0x07, 0x32, 0x30, 0x0e, 0xff, 0x74, 0x57, 0x02, 0xce,
+ 0x0c, 0x10, 0x00, 0x10,
+ 0x00, 0xd1, 0xe1, 0x4d, 0x7b, 0x3e, 0xef, 0xa3, 0x02, 0x02, 0x0d, 0x1a,
+ 0x0f, 0xe0, 0x01, 0x14,
+ 0xc0, 0xbd, 0xff, 0x00, 0x42, 0x01, 0xe3, 0x0f, 0x2d, 0x1e, 0x00, 0x21,
+ 0x24, 0x30, 0x2b, 0x0e,
+ 0x0d, 0x30, 0xde, 0x8d, 0xae, 0x0f, 0x3e, 0x28, 0xee, 0xc0, 0x06, 0x01,
+ 0xef, 0x0f, 0x00, 0x10,
+ 0x0d, 0x0c, 0x70, 0x00, 0xe3, 0xcc, 0x0b, 0x01, 0x13, 0x10, 0x3c, 0x30,
+ 0x50, 0x14, 0xe4, 0xe4,
+ 0xf5, 0x0f, 0x3d, 0x30, 0x01, 0xa3, 0xc1, 0xc0, 0x0c, 0x00, 0x00, 0x00,
+ 0x0f, 0x53, 0x47, 0x36,
+ 0xee, 0xfe, 0x30, 0x30, 0x06, 0xd0, 0xee, 0x70, 0x10, 0xd0, 0xc0, 0x00,
+ 0x01, 0x00, 0xe0, 0x0e,
+ 0x4f, 0x3b, 0x30, 0x20, 0xd0, 0x00, 0x40, 0x20, 0x14, 0x02, 0x70, 0x6d,
+ 0x04, 0xe3, 0xc0, 0x00,
+ 0xf0, 0x11, 0x42, 0x06, 0xbe, 0xd9, 0x0f, 0x40, 0x23, 0xe2, 0xcf, 0x0e,
+ 0x14, 0x0f, 0xdb, 0x0f,
+ 0x40, 0x42, 0x31, 0xfb, 0xaf, 0x00, 0x00, 0x5b, 0x00, 0x02, 0xc2, 0x0f,
+ 0x1d, 0x0d, 0x3c, 0x0f,
+ 0xdf, 0xb5, 0x05, 0x00, 0x10, 0xf1, 0x00, 0x4f, 0x70, 0x03, 0xef, 0xdc,
+ 0x01, 0x57, 0x04, 0xfd,
+ 0xec, 0x1f, 0x3f, 0x01, 0xc0, 0xe1, 0x07, 0x04, 0xef, 0xab, 0xf0, 0x0f,
+ 0x61, 0x12, 0xf0, 0xee,
+ 0x0f, 0x40, 0x25, 0xe0, 0xdb, 0x0f, 0x61, 0x12, 0xf0, 0xee, 0xf0, 0x06,
+ 0x31, 0x0f, 0xbe, 0xf1,
+ 0x14, 0x31, 0x40, 0x0e, 0xbc, 0x00, 0x02, 0x1f, 0x0d, 0x00, 0x06, 0x21,
+ 0x3e, 0xec, 0xce, 0xf1,
+ 0x07, 0x61, 0x21, 0x0f, 0xcc, 0xe0, 0xf2, 0x00, 0x02, 0xe2, 0x12, 0x7f,
+ 0x2b, 0x1e, 0xff, 0xe2,
+ 0xf4, 0x02, 0x1c, 0x1d, 0x3d, 0xe0, 0xc6, 0x02, 0x00, 0x3d, 0x30, 0x10,
+ 0xd0, 0x83, 0xf1, 0x05,
+ 0x21, 0x40, 0x1b, 0x00, 0x2f, 0x52, 0x01, 0x30, 0x4c, 0x1e, 0xee, 0x90,
+ 0xf3, 0x06, 0x3f, 0x1d,
+ 0xed, 0xd0, 0xc1, 0xd2, 0xd3, 0x11, 0x6e, 0x1b, 0x00, 0x02, 0xe2, 0xe0,
+ 0x1d, 0x30, 0x1e, 0x9f,
+ 0xee, 0x10, 0x41, 0x37, 0x14, 0xf0, 0x82, 0xc2, 0x02, 0x04, 0x4d, 0x09,
+ 0xef, 0xd1, 0x14, 0x12,
+ 0x1c, 0x0c, 0x6e, 0x3f, 0x11, 0x05, 0xe1, 0x00, 0x2c, 0x10, 0x00, 0x2f,
+ 0x20, 0x16, 0xe1, 0x8f,
+ 0xde, 0xd0, 0xd2, 0x01, 0x03, 0x2d, 0xfd, 0x9e, 0xf0, 0x10, 0x4d, 0x5b,
+ 0x01, 0xf4, 0xe3, 0xe0,
+ 0x2d, 0x4e, 0x0f, 0xdd, 0x0b, 0x2e, 0x20, 0x07, 0xe4, 0xc0, 0xff, 0xfa,
+ 0x00, 0x1f, 0x22, 0xd2,
+ 0x8f, 0x0e, 0x0f, 0x10, 0x20, 0x04, 0x03, 0x12, 0x1d, 0x3c, 0x1f, 0xdc,
+ 0x00, 0x43, 0x14, 0xe0,
+ 0xca, 0x2f, 0x71, 0x51, 0xb1, 0xf0, 0xff, 0x0c, 0x2f, 0x00, 0xf4, 0xd5,
+ 0x05, 0x4f, 0x3d, 0x0f,
+ 0xce, 0xe2, 0x03, 0x21, 0x5f, 0x2c, 0x00, 0x0f, 0xe2, 0xf4, 0xe1, 0x12,
+ 0x31, 0x51, 0xf2, 0x84,
+ 0xf0, 0xfc, 0x08, 0xdf, 0xf0, 0x00, 0x42, 0x00, 0x20, 0x4e, 0x0a, 0x2f,
+ 0x0f, 0x50, 0x43, 0x03,
+ 0xf2, 0xf0, 0xfd, 0xe1, 0x02, 0x02, 0xe5, 0xb1, 0xed, 0xdb, 0xf0, 0x00,
+ 0x03, 0x61, 0x32, 0x0b,
+ 0xac, 0x0f, 0x12, 0x53, 0x00, 0xff, 0xfe, 0x00, 0x04, 0x02, 0x12, 0x33,
+ 0xf3, 0xd0, 0xed, 0x0b,
+ 0xed, 0xa0, 0x0d, 0xfe, 0x2e, 0x23, 0x17, 0x11, 0xb2, 0xd2, 0x01, 0xd1,
+ 0x01, 0x39, 0x6d, 0x3f,
+ 0x2f, 0x01, 0x11, 0xec, 0xad, 0xfc, 0x00, 0x44, 0x00, 0x03, 0x0d, 0xf8,
+ 0xdf, 0x0e, 0xf0, 0x60,
+ 0x30, 0xd4, 0xd7, 0xd6, 0xe0, 0xec, 0x1e, 0x70, 0x30, 0xf3, 0xc1, 0xf0,
+ 0xff, 0xec, 0xfe, 0x2f,
+ 0x70, 0x52, 0x11, 0xf0, 0xdf, 0x10, 0x24, 0x40, 0x0c, 0x1e, 0xf2, 0xe7,
+ 0xf1, 0xd0, 0xf0, 0x00,
+ 0x32, 0x3e, 0xed, 0xdf, 0xd3, 0x03, 0x13, 0x02, 0xd3, 0x85, 0xd5, 0x22,
+ 0x70, 0x4b, 0xdf, 0xd0,
+ 0xf5, 0x21, 0x12, 0x0e, 0x2b, 0x20, 0x10, 0xe3, 0xd2, 0x00, 0x2b, 0xaf,
+ 0xc0, 0x00, 0xff, 0x10,
+ 0x21, 0x14, 0xf1, 0xcd, 0xdf, 0x0e, 0x5f, 0x6f, 0x31, 0x25, 0x02, 0x00,
+ 0x0e, 0x5e, 0x0f, 0xa1,
+ 0xf2, 0x01, 0x08, 0x1a, 0x00, 0xe3, 0xf1, 0x01, 0x0f, 0x0e, 0x1f, 0x71,
+ 0x23, 0xe3, 0xbf, 0x0b,
+ 0x1d, 0x2c, 0x0b, 0x0f, 0x00, 0xe4, 0xf6, 0x40, 0x3f, 0x1d, 0x9f, 0xd0,
+ 0xe4, 0x02, 0x32, 0x40,
+ 0xed, 0xb0, 0x04, 0xe1, 0x0b, 0x1d, 0x1e, 0x3d, 0x10, 0x31, 0x64, 0x1f,
+ 0x2d, 0x03, 0x04, 0x03,
+ 0x02, 0x03, 0x0c, 0x2b, 0x9f, 0xde, 0xe4, 0xc4, 0x00, 0x10, 0x48, 0x00,
+ 0xf1, 0xd1, 0xd0, 0xef,
+ 0x0e, 0x0f, 0x40, 0x51, 0x24, 0x50, 0x04, 0xd2, 0xee, 0xed, 0x1d, 0x30,
+ 0x17, 0x01, 0x00, 0x21,
+ 0x50, 0xdd, 0xde, 0x00, 0x4e, 0x00, 0xa1, 0xf2, 0xd6, 0xb0, 0x0e, 0x0e,
+ 0x5f, 0x02, 0x07, 0xe5,
+ 0xf0, 0xfd, 0xe0, 0x0f, 0x40, 0x71, 0x20, 0xf0, 0xe0, 0xfe, 0x0f, 0x1f,
+ 0x30, 0x40, 0x00, 0xcf,
+ 0xee, 0xf0, 0x0e, 0x10, 0x17, 0x07, 0xc2, 0xeb, 0x0e, 0x0f, 0xe1, 0xe1,
+ 0x00, 0x6e, 0x0f, 0x3f,
+ 0x3e, 0x60, 0x41, 0x10, 0x00, 0x07, 0x15, 0x00, 0x00, 0xff, 0x3f, 0x4e,
+ 0xf0, 0x9e, 0xec, 0x00,
+ 0xd0, 0x04, 0x20, 0x0f, 0xf2, 0x07, 0xf3, 0xf0, 0xee, 0xbd, 0xe1, 0x02,
+ 0x41, 0x73, 0x46, 0x00,
+ 0x00, 0xfb, 0xd0, 0xf0, 0x00, 0x0e, 0x2d, 0x3d, 0x00, 0xf2, 0x91, 0xe2,
+ 0xff, 0x00, 0x0f, 0xce,
+ 0xb1, 0x00, 0xfc, 0x1e, 0x30, 0x07, 0x47, 0x04, 0x1e, 0x1d, 0x30, 0x50,
+ 0x00, 0xe1, 0xbf, 0xf0,
+ 0xff, 0xfe, 0x01, 0x15, 0xe7, 0xe2, 0x21, 0x4e, 0xf8, 0xa0, 0xff, 0x01,
+ 0x22, 0x50, 0x2f, 0x2c,
+ 0xe0, 0xe0, 0x20, 0x72, 0x10, 0x0b, 0x10, 0x1f, 0x31, 0xe2, 0xc2, 0xf1,
+ 0xe3, 0xe1, 0xb0, 0xfd,
+ 0xee, 0xf0, 0xf2, 0xe7, 0xef, 0x0e, 0x4f, 0x71, 0x61, 0x00, 0x1e, 0xf1,
+ 0xd2, 0x0f, 0x1b, 0x3c,
+ 0x1b, 0x0f, 0x02, 0xc7, 0x03, 0x0f, 0xec, 0x1f, 0x00, 0x01, 0xb1, 0xf2,
+ 0x00, 0xed, 0x00, 0x01,
+ 0x60, 0x40, 0x0b, 0xd1, 0xe7, 0x02, 0x10, 0x1e, 0x1f, 0x12, 0x72, 0x10,
+ 0x01, 0xd2, 0xd0, 0x0e,
+ 0x00, 0x12, 0x00, 0xd0, 0xef, 0xbe, 0xd0, 0xe3, 0xf7, 0x0d, 0x3e, 0x35,
+ 0x43, 0x00, 0xed, 0x48,
+ 0x7f, 0x21, 0xf4, 0xc1, 0x0e, 0x29, 0x1f, 0x30, 0x1f, 0xc0, 0xc2, 0xf1,
+ 0xe0, 0x2d, 0x2d, 0x40,
+ 0x02, 0xf5, 0xf4, 0xc0, 0x0f, 0xce, 0xc2, 0x10, 0x22, 0x32, 0x00, 0x1c,
+ 0x7c, 0x1b, 0xff, 0xe0,
+ 0x01, 0x13, 0x71, 0x32, 0x13, 0x02, 0xd0, 0xb9, 0x0e, 0x2d, 0x5e, 0x1e,
+ 0x0f, 0xd0, 0x04, 0xf2,
+ 0xd0, 0x0c, 0xd1, 0xf4, 0xc4, 0x14, 0x50, 0x2f, 0x0f, 0xc4, 0xf4, 0x01,
+ 0x2f, 0xea, 0x0f, 0x10,
+ 0x55, 0x11, 0x2d, 0x1c, 0x20, 0xe0, 0xc3, 0x11, 0x20, 0xfd, 0x05, 0x05,
+ 0x19, 0x00, 0x1d, 0x00,
+ 0x63, 0x6b, 0xf7, 0x53, 0x13, 0x6c, 0xb0, 0x55, 0x75, 0x00, 0xec, 0xbf,
+ 0xe5, 0x07, 0x33, 0x60,
+ 0x3f, 0x0f, 0x00, 0x00, 0x02, 0x20, 0x3c, 0x30, 0x00, 0x00, 0x92, 0xe6,
+ 0xd2, 0xd0, 0xae, 0xfd,
+ 0x0d, 0xf0, 0xe3, 0x97, 0xd6, 0xe1, 0xe0, 0xdd, 0xc0, 0xd0, 0xf3, 0xe2,
+ 0xb0, 0xca, 0xde, 0xed,
+ 0x0e, 0x50, 0x20, 0x02, 0x00, 0xc1, 0x00, 0x0e, 0x08, 0xef, 0x90, 0xe0,
+ 0xe2, 0xe1, 0xdf, 0xdc,
+ 0xfd, 0x0c, 0xfe, 0xef, 0xb0, 0xe0, 0xff, 0x09, 0x0f, 0x0d, 0x0d, 0x2e,
+ 0x2f, 0x0f, 0x9e, 0xec,
+ 0xcd, 0xee, 0xed, 0xed, 0xed, 0xb8, 0xfd, 0xec, 0xd0, 0xdf, 0xe0, 0xe0,
+ 0xfe, 0xd9, 0xdf, 0xd0,
+ 0x0e, 0xf0, 0x8f, 0xdf, 0xee, 0x1f, 0x3d, 0x4d, 0x1c, 0x2f, 0x0e, 0xde,
+ 0x0d, 0x4a, 0x7d, 0x2c,
+ 0x0e, 0xfd, 0xcd, 0xfd, 0xc0, 0xef, 0xc8, 0xed, 0xce, 0xfe, 0x01, 0x52,
+ 0x0d, 0xab, 0xfc, 0xe0,
+ 0x0e, 0x00, 0xf0, 0x0f, 0xfb, 0xee, 0xee, 0xfd, 0x0c, 0x0d, 0xbe, 0xfd,
+ 0x0f, 0xf0, 0xcb, 0xdd,
+ 0xce, 0xc0, 0xde, 0xeb, 0xcd, 0xeb, 0xfe, 0xff, 0x0e, 0x0f, 0xbe, 0xed,
+ 0xed, 0xcb, 0xed, 0xee,
+ 0xc0, 0x0c, 0x2e, 0x10, 0x0e, 0x0b, 0xce, 0xdd, 0xfc, 0xfe, 0x0b, 0xee,
+ 0x8d, 0xbd, 0x0b, 0xef,
+ 0x00, 0xf1, 0x04, 0x00, 0x2d, 0xff, 0xd0, 0xd2, 0xc0, 0x03, 0xf0, 0xfe,
+ 0x2d, 0x7f, 0x24, 0x05,
+ 0xf1, 0x10, 0x1e, 0x0b, 0x0d, 0x1f, 0x23, 0xe3, 0x83, 0xf2, 0xc3, 0xe1,
+ 0xdf, 0x1f, 0x40, 0x57,
+ 0x07, 0xe1, 0xf1, 0x0f, 0x3f, 0x30, 0x30, 0x25, 0x13, 0xf5, 0x00, 0x00,
+ 0x4d, 0x10, 0x01, 0x13,
+ 0x66, 0x03, 0xd1, 0xa0, 0xf0, 0x22, 0x02, 0xf1, 0xb2, 0xf2, 0xe0, 0xd2,
+ 0xf0, 0x1d, 0x71, 0x76,
+ 0x02, 0x01, 0x10, 0x00, 0xf2, 0x04, 0x15, 0x12, 0x12, 0x00, 0x03, 0x26,
+ 0x03, 0xe1, 0x02, 0x12,
+ 0xe3, 0xe2, 0x51, 0x73, 0x20, 0x00, 0x05, 0x04, 0x43, 0x14, 0x31, 0x41,
+ 0x42, 0x03, 0x07, 0x04,
+ 0x13, 0x30, 0x1e, 0xee, 0x02, 0x34, 0x21, 0x40, 0x2d, 0xe0, 0xc0, 0xe2,
+ 0xf3, 0x73, 0x22, 0x34,
+ 0x12, 0x00, 0xf1, 0x07, 0x27, 0x42, 0x62, 0x51, 0x40, 0x24, 0x11, 0x21,
+ 0x00, 0x1f, 0x20, 0x54,
+ 0x03, 0xf4, 0x03, 0x30, 0x20, 0x22, 0x17, 0x11, 0x01, 0x10, 0x23, 0x13,
+ 0x24, 0x74, 0x35, 0x01,
+ 0x01, 0xd0, 0xd0, 0x20, 0x61, 0x43, 0x34, 0x23, 0x01, 0x20, 0x24, 0x16,
+ 0x03, 0xb3, 0x02, 0x23,
+ 0x5f, 0x2f, 0x01, 0x05, 0xe3, 0x14, 0x51, 0x23, 0x10, 0x02, 0x11, 0x13,
+ 0x10, 0xd0, 0xd4, 0x14,
+ 0x73, 0x75, 0x34, 0x00, 0x01, 0x00, 0x0e, 0x0e, 0x20, 0x30, 0x2a, 0x10,
+ 0x40, 0x13, 0x16, 0x2f,
+ 0x2d, 0x40, 0x30, 0x13, 0x17, 0x22, 0xd0, 0xa0, 0x0f, 0x01, 0x75, 0x43,
+ 0x23, 0x11, 0x23, 0x20,
+ 0x20, 0x10, 0x31, 0x52, 0x16, 0x03, 0xf2, 0xf4, 0x00, 0x20, 0x10, 0x32,
+ 0x65, 0x00, 0x02, 0x05,
+ 0x54, 0x20, 0x20, 0x2f, 0x30, 0xf1, 0xc0, 0xe0, 0xdd, 0xff, 0xff, 0x00,
+ 0x24, 0x13, 0x36, 0x40,
+ 0x50, 0xe0, 0x86, 0xb4, 0xf0, 0xe0, 0x0e, 0xe0, 0xe1, 0xe3, 0xf2, 0xf0,
+ 0xfc, 0xed, 0xee, 0xd0,
+ 0xd2, 0x24, 0x4e, 0x0b, 0xbf, 0xdf, 0xe0, 0x0f, 0xdc, 0xc0, 0xde, 0xef,
+ 0xad, 0xd9, 0x9e, 0xee,
+ 0xee, 0xec, 0xed, 0x0b, 0x0e, 0x0d, 0xbf, 0x0b, 0xed, 0xfd, 0xec, 0xfe,
+ 0x1e, 0x2d, 0x0c, 0xcc,
+ 0xbd, 0xdc, 0xee, 0xdc, 0xee, 0xee, 0xec, 0xfd, 0xdb, 0x0e, 0xac, 0xdf,
+ 0xbc, 0xde, 0xcd, 0xef,
+ 0xdd, 0xdf, 0x00, 0x3f, 0x2a, 0xfe, 0xbe, 0xfe, 0x00, 0x00, 0x0f, 0x3e,
+ 0x1d, 0xdf, 0x9c, 0xef,
+ 0xeb, 0xfd, 0xef, 0x0d, 0x00, 0x2c, 0x2f, 0xf0, 0x92, 0xe4, 0xe1, 0xe0,
+ 0xa0, 0x00, 0x0f, 0x3c,
+ 0x10, 0xde, 0xbe, 0x0e, 0x0b, 0x5b, 0x1e, 0x20, 0xe6, 0xb1, 0xee, 0x0e,
+ 0x0f, 0x00, 0x1f, 0x25,
+ 0x17, 0xe0, 0xc0, 0xe0, 0xdd, 0xbf, 0xe0, 0xff, 0x00, 0xd0, 0xc2, 0xe1,
+ 0x00, 0x20, 0x20, 0x3f,
+ 0x70, 0x00, 0x00, 0xcf, 0x0a, 0x0e, 0x0c, 0x3b, 0x30, 0x70, 0x21, 0xf1,
+ 0xff, 0x2a, 0x3d, 0x5f,
+ 0x1f, 0xe1, 0xf2, 0xf3, 0xf1, 0x1e, 0x20, 0x13, 0x17, 0x54, 0x4d, 0x3c,
+ 0x1f, 0x00, 0x12, 0x34,
+ 0x74, 0x20, 0x3e, 0x20, 0x00, 0x03, 0xd3, 0xe1, 0xf3, 0x00, 0x62, 0x20,
+ 0x55, 0x37, 0x12, 0x00,
+ 0x01, 0x12, 0x01, 0xee, 0xec, 0x3f, 0x3e, 0x0d, 0x5d, 0x30, 0xf3, 0x0d,
+ 0xfc, 0x1f, 0x31, 0x07,
+ 0xa4, 0xb2, 0xc1, 0xd0, 0xb0, 0xb5, 0xe5, 0xe2, 0x00, 0x10, 0xff, 0xa0,
+ 0xe0, 0xef, 0x0f, 0xee,
+ 0x00, 0x1c, 0x0e, 0xef, 0xf0, 0xe4, 0xc0, 0xbd, 0xea, 0xf0, 0xc0, 0xf1,
+ 0xef, 0xdd, 0xdd, 0xbb,
+ 0xee, 0xde, 0xef, 0xf0, 0xfe, 0x0e, 0x20, 0x11, 0xfd, 0xd8, 0xe8, 0x8f,
+ 0xef, 0xef, 0x03, 0x33,
+ 0x0e, 0xeb, 0xde, 0xee, 0xce, 0xec, 0xcc, 0xef, 0xef, 0xfe, 0xec, 0x8e,
+ 0xe0, 0xa1, 0xef, 0xe9,
+ 0xff, 0xff, 0x0f, 0x5f, 0x10, 0x04, 0x1f, 0x0d, 0x1e, 0x11, 0x34, 0x54,
+ 0x10, 0x1a, 0x0f, 0x0f,
+ 0x1e, 0x1e, 0x3f, 0x3f, 0x50, 0x24, 0xe3, 0xe0, 0xef, 0xfe, 0xee, 0xed,
+ 0xe0, 0x07, 0x64, 0x03,
+ 0xd0, 0xed, 0x2e, 0x4f, 0x00, 0xb0, 0xd0, 0xa3, 0xf4, 0xf4, 0x2e, 0x2c,
+ 0x01, 0xf4, 0xe5, 0x31,
+ 0x4e, 0x0c, 0xe0, 0xd0, 0x1f, 0xc0, 0x8f, 0xff, 0xf0, 0x03, 0x06, 0x00,
+ 0x1e, 0x1d, 0x0c, 0xd0,
+ 0xbc, 0xf0, 0x02, 0xf0, 0xff, 0x21, 0x73, 0x6a, 0x0c, 0xfe, 0x0e, 0x2f,
+ 0x1e, 0x0e, 0xfc, 0x0e,
+ 0x40, 0x0e, 0x0a, 0x00, 0x03, 0xf7, 0x01, 0x20, 0x2d, 0x31, 0x71, 0x73,
+ 0x72, 0x14, 0x01, 0x13,
+ 0x00, 0x03, 0x13, 0x01, 0x30, 0x10, 0x21, 0x17, 0x26, 0x12, 0x50, 0x22,
+ 0x32, 0x34, 0x24, 0x02,
+ 0x21, 0x22, 0x02, 0x02, 0x54, 0x42, 0x62, 0x22, 0x12, 0x24, 0x13, 0x34,
+ 0x25, 0x34, 0x41, 0x23,
+ 0x34, 0x23, 0x24, 0x32, 0x34, 0x03, 0xe2, 0xe2, 0x03, 0x33, 0x64, 0x22,
+ 0x43, 0x20, 0xff, 0x03,
+ 0x36, 0x42, 0x33, 0x72, 0x43, 0x31, 0x12, 0x24, 0x14, 0xf3, 0xe2, 0xd6,
+ 0x03, 0x52, 0x32, 0x31,
+ 0x33, 0x03, 0x12, 0x12, 0x34, 0x73, 0x64, 0x11, 0x21, 0x24, 0x05, 0x04,
+ 0x12, 0x11, 0x30, 0x41,
+ 0x32, 0x32, 0x62, 0x20, 0x1e, 0x0e, 0x0e, 0x24, 0x24, 0x14, 0x24, 0xf1,
+ 0xaf, 0xda, 0xe0, 0x1d,
+ 0x50, 0x20, 0x14, 0xf6, 0x01, 0x21, 0x20, 0x3f, 0x00, 0x52, 0x20, 0x41,
+ 0x22, 0x40, 0x31, 0x52,
+ 0x2d, 0x18, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0xef, 0xde, 0xd1, 0xe3, 0x03,
+ 0x71, 0x2e, 0xfb, 0xce,
+ 0xef, 0x0c, 0x4c, 0xfe, 0xbe, 0xef, 0xdd, 0x00, 0x07, 0x04, 0xc0, 0x00,
+ 0x1b, 0x3e, 0x00, 0x80,
+ 0xd1, 0xf3, 0xfe, 0xef, 0xfd, 0xd0, 0xdf, 0xb1, 0xf0, 0xd8, 0xdd, 0xaf,
+ 0xdf, 0xc0, 0x0f, 0xff,
+ 0xf0, 0xff, 0xdb, 0xe0, 0xfe, 0xbf, 0xf9, 0xfe, 0x2c, 0x6f, 0x1e, 0x1c,
+ 0x0e, 0xbc, 0xfe, 0xed,
+ 0xfd, 0xdf, 0xec, 0x0c, 0xec, 0xbe, 0x00, 0xf2, 0x10, 0x41, 0x00, 0x0e,
+ 0x0f, 0xfe, 0xe1, 0xf7,
+ 0x00, 0x00, 0xaf, 0xfd, 0xe0, 0x40, 0x50, 0x13, 0x01, 0xe0, 0xd0, 0x0e,
+ 0x0a, 0x0f, 0x03, 0xf7,
+ 0xd1, 0x10, 0x4d, 0x0e, 0xdd, 0xbe, 0xda, 0xec, 0x6e, 0x6e, 0x10, 0x1f,
+ 0xfc, 0xfe, 0xef, 0xe3,
+ 0xd7, 0xc1, 0xf0, 0xfe, 0x0f, 0xb0, 0xc4, 0xc0, 0xcd, 0xfc, 0xef, 0xee,
+ 0xd0, 0xff, 0x1e, 0x0b,
+ 0x88, 0xef, 0xfe, 0xef, 0x1f, 0x2e, 0xee, 0xbf, 0xe0, 0xe0, 0xec, 0xdc,
+ 0xe0, 0xef, 0xf0, 0xed,
+ 0xc9, 0xde, 0xdd, 0x0b, 0x1e, 0xff, 0x8f, 0xef, 0xef, 0xfd, 0xba, 0xed,
+ 0xee, 0xed, 0xfd, 0x0e,
+ 0x40, 0x0e, 0xdd, 0xda, 0xee, 0xed, 0xfe, 0xdd, 0x9a, 0xde, 0xdd, 0xdf,
+ 0xec, 0xfe, 0xce, 0xed,
+ 0xed, 0xcc, 0xde, 0xde, 0xbe, 0xdd, 0xec, 0xeb, 0xfe, 0xef, 0xee, 0xbe,
+ 0xfc, 0x0e, 0x2e, 0x3d,
+ 0x0c, 0xbe, 0xfc, 0xef, 0xf0, 0x00, 0x04, 0xe2, 0xd0, 0x00, 0x0e, 0x5f,
+ 0x3d, 0xf0, 0xb0, 0x02,
+ 0xe5, 0xb0, 0xf0, 0x13, 0x51, 0x44, 0x26, 0x00, 0xdf, 0xed, 0xe0, 0x03,
+ 0x34, 0x71, 0x32, 0x25,
+ 0x03, 0xe3, 0x02, 0xe0, 0x02, 0x12, 0x62, 0x10, 0x21, 0x07, 0xf7, 0x12,
+ 0x12, 0xe0, 0xc1, 0xe4,
+ 0x01, 0x50, 0x31, 0x22, 0x33, 0x55, 0x51, 0x41, 0x42, 0x23, 0x33, 0x24,
+ 0x21, 0x16, 0x02, 0xf0,
+ 0xc0, 0x10, 0x10, 0x31, 0x37, 0x24, 0x71, 0x31, 0x21, 0x10, 0x23, 0x27,
+ 0x52, 0x41, 0x30, 0x32,
+ 0x32, 0x12, 0x25, 0x31, 0x32, 0x51, 0x22, 0x73, 0x33, 0x33, 0x26, 0x12,
+ 0x03, 0x11, 0x13, 0x25,
+ 0x62, 0x22, 0x53, 0x12, 0x03, 0x02, 0x13, 0x10, 0x41, 0x40, 0x36, 0x14,
+ 0x04, 0x32, 0x21, 0x20,
+ 0x33, 0x24, 0x23, 0x16, 0x02, 0x02, 0x01, 0xf2, 0xb3, 0x03, 0xe4, 0x13,
+ 0x24, 0x13, 0x02, 0x61,
+ 0x41, 0x42, 0x43, 0x15, 0x13, 0x04, 0x34, 0x02, 0x01, 0xf2, 0xc0, 0x01,
+ 0x03, 0x22, 0x54, 0x32,
+ 0x13, 0x16, 0x21, 0x22, 0x22, 0xf0, 0xd0, 0xe0, 0xf0, 0x1f, 0x50, 0x2f,
+ 0x72, 0x72, 0x33, 0x01,
+ 0x30, 0x20, 0x12, 0x0e, 0x0c, 0x4b, 0x18, 0x1d, 0x1d, 0x2d, 0x1f, 0xc0,
+ 0xfc, 0x09, 0x1f, 0xfe,
+ 0xaf, 0xdd, 0xcd, 0xef, 0xd1, 0xc4, 0xe0, 0xfe, 0x6d, 0x7d, 0x1d, 0x1b,
+ 0x0d, 0xfa, 0x00, 0x0e,
+ 0x1f, 0x5f, 0x10, 0x32, 0x01, 0x1f, 0x0b, 0x2f, 0x0d, 0xff, 0x02, 0x34,
+ 0x2f, 0x18, 0x0f, 0x0f,
+ 0xc0, 0xd1, 0xa1, 0xfd, 0xee, 0xff, 0x1e, 0x30, 0x14, 0xa6, 0xe1, 0x00,
+ 0x20, 0x1e, 0x00, 0xc3,
+ 0xe6, 0xd0, 0xee, 0xfc, 0xff, 0xd0, 0xc4, 0xf3, 0x00, 0x2e, 0x8f, 0x80,
+ 0xf0, 0xc5, 0xe0, 0xd0,
+ 0xdd, 0xf0, 0xff, 0x30, 0x30, 0x2d, 0xe8, 0xbf, 0xee, 0xd0, 0xef, 0xeb,
+ 0xdd, 0x0b, 0x2d, 0xaf,
+ 0x9d, 0xee, 0xdc, 0xfd, 0x0c, 0x0f, 0x3f, 0x00, 0xb0, 0xf0, 0xd8, 0xfe,
+ 0xfe, 0xf0, 0x0f, 0x20,
+ 0x41, 0x0e, 0xfa, 0xff, 0x0e, 0x4f, 0x20, 0xf0, 0xce, 0xd0, 0xff, 0xd0,
+ 0xcf, 0xcc, 0xee, 0xd1,
+ 0xc3, 0xd2, 0xef, 0xfb, 0x0c, 0x1d, 0xfd, 0xdd, 0x23, 0x73, 0x71, 0x31,
+ 0x0c, 0xfe, 0x0f, 0x30,
+ 0x14, 0x04, 0x03, 0xd7, 0xc4, 0xc2, 0xc2, 0xd3, 0xe4, 0xdf, 0xee, 0xc0,
+ 0x0f, 0x11, 0x14, 0xf2,
+ 0x20, 0x00, 0xe2, 0x82, 0xb1, 0xe1, 0xf5, 0xd3, 0xe0, 0x0d, 0xe0, 0x00,
+ 0xc3, 0xf3, 0x33, 0x22,
+ 0xb0, 0x98, 0xef, 0xe0, 0xfe, 0x0b, 0x0c, 0xff, 0xe0, 0xd3, 0xd4, 0x3e,
+ 0x5b, 0x20, 0x11, 0x41,
+ 0x3f, 0xeb, 0xcf, 0xfe, 0x10, 0x30, 0x0c, 0x4a, 0x5d, 0x1c, 0x0d, 0xec,
+ 0xde, 0xbc, 0xef, 0xcf,
+ 0xff, 0xdd, 0x0d, 0xee, 0xcf, 0xc0, 0xdb, 0xed, 0x0a, 0x2e, 0x5e, 0x00,
+ 0x02, 0x40, 0x4e, 0x1b,
+ 0x00, 0x00, 0x3e, 0x3d, 0x4e, 0x4f, 0x1f, 0x1c, 0x0f, 0x0d, 0x0b, 0x0f,
+ 0xef, 0xbf, 0xcc, 0xdd,
+ 0xdb, 0x0d, 0x0c, 0xde, 0xd0, 0xf2, 0xd4, 0x0f, 0x7b, 0x7f, 0xf0, 0xb3,
+ 0xd1, 0x00, 0xcf, 0x0d,
+ 0x1f, 0x30, 0x13, 0x05, 0xe1, 0xcf, 0xbb, 0xde, 0xee, 0xe0, 0xe0, 0xd2,
+ 0xb0, 0xcf, 0xdb, 0xcf,
+ 0xde, 0xf0, 0x11, 0x32, 0x02, 0xf4, 0xd6, 0xd0, 0xfb, 0xee, 0xec, 0xff,
+ 0xc1, 0xd1, 0xdf, 0xaa,
+ 0xee, 0xdd, 0x0d, 0xdd, 0xde, 0xf0, 0xe3, 0xb0, 0x98, 0xf0, 0xef, 0xf0,
+ 0xe1, 0x0e, 0x20, 0x2f,
+ 0xe0, 0xde, 0x01, 0x30, 0x30, 0x1c, 0x20, 0x57, 0x23, 0x03, 0x02, 0x00,
+ 0xb0, 0xbd, 0x01, 0x33,
+ 0x23, 0xe6, 0xc1, 0x12, 0x42, 0x42, 0x11, 0x10, 0x50, 0x3c, 0x7e, 0x12,
+ 0x27, 0x13, 0x14, 0x22,
+ 0x10, 0x12, 0xf6, 0xc4, 0xf3, 0xd1, 0xb0, 0xd0, 0xd3, 0x05, 0x31, 0x52,
+ 0x13, 0x03, 0xb3, 0xf2,
+ 0xf3, 0x01, 0x02, 0x01, 0x00, 0xd2, 0xd6, 0xd2, 0xf3, 0x04, 0x52, 0x33,
+ 0x11, 0xf0, 0xf0, 0xf5,
+ 0xb0, 0xe1, 0xa0, 0xe0, 0xf5, 0x02, 0x2f, 0x19, 0x0e, 0xdf, 0xef, 0xde,
+ 0xef, 0x31, 0x76, 0x20,
+ 0x32, 0x21, 0x21, 0x00, 0x1f, 0x2c, 0x6c, 0x3a, 0x1d, 0x1e, 0x20, 0x0e,
+ 0xed, 0x2e, 0x5e, 0x10,
+ 0x00, 0xdf, 0xde, 0x08, 0x7d, 0x4e, 0x3f, 0x00, 0xfe, 0x1e, 0x60, 0x1b,
+ 0x3e, 0x6d, 0x2d, 0x2c,
+ 0x0c, 0x20, 0x30, 0x30, 0x70, 0x40, 0x33, 0x23, 0x1e, 0x1f, 0xf0, 0x00,
+ 0xde, 0x1c, 0x7d, 0x1f,
+ 0x34, 0x27, 0x07, 0x21, 0x10, 0x2e, 0x31, 0x36, 0x23, 0x73, 0x33, 0x10,
+ 0x0f, 0x20, 0x33, 0x35,
+ 0x54, 0x42, 0x31, 0x32, 0x02, 0x11, 0x12, 0x22, 0x10, 0x06, 0x03, 0xe6,
+ 0x02, 0x01, 0x62, 0x23,
+ 0x22, 0x13, 0x74, 0x57, 0x22, 0x10, 0x02, 0x01, 0x23, 0x52, 0x21, 0x13,
+ 0x02, 0x12, 0x42, 0x21,
+ 0x31, 0x24, 0x13, 0x12, 0x33, 0x45, 0x15, 0x24, 0x13, 0x33, 0x40, 0x21,
+ 0x11, 0x33, 0x74, 0x41,
+ 0x42, 0x13, 0x34, 0x37, 0x42, 0x33, 0x52, 0x22, 0x12, 0x14, 0x23, 0x12,
+ 0x45, 0x02, 0x44, 0x22,
+ 0x03, 0x13, 0x02, 0xf3, 0x01, 0x33, 0x32, 0x71, 0x71, 0x21, 0x04, 0x34,
+ 0x00, 0x03, 0x24, 0x03,
+ 0x20, 0x2f, 0x04, 0xf3, 0xa0, 0x05, 0xe2, 0x06, 0x22, 0x10, 0x1e, 0x00,
+ 0xe2, 0x14, 0xe1, 0xd3,
+ 0x8d, 0xce, 0x05, 0xf2, 0x02, 0xff, 0xff, 0x27, 0xf0, 0xc0, 0xce, 0x0f,
+ 0xd0, 0x06, 0x23, 0x8a,
+ 0xb0, 0x11, 0x00, 0xde, 0x00, 0x04, 0xdd, 0x9b, 0x00, 0x12, 0x20, 0xcd,
+ 0xf0, 0x03, 0x01, 0x0f,
+ 0x02, 0x0d, 0xd8, 0x6f, 0x11, 0xff, 0xed, 0xfe, 0x10, 0x0e, 0xc8, 0x2f,
+ 0x32, 0xe0, 0x8c, 0xfe,
+ 0x01, 0x01, 0xeb, 0xdf, 0x20, 0x54, 0xee, 0xdc, 0x00, 0x01, 0xab, 0xee,
+ 0x54, 0x11, 0xeb, 0xdf,
+ 0x41, 0x11, 0xdd, 0xec, 0x32, 0x54, 0xfe, 0xcc, 0x00, 0x32, 0x10, 0xcb,
+ 0x00, 0x12, 0x20, 0xbb,
+ 0x00, 0x22, 0x20, 0xce, 0xfd, 0x12, 0x00, 0x00, 0xee, 0x00, 0x11, 0xcc,
+ 0xee, 0x43, 0x21, 0xc9,
+ 0xff, 0x32, 0xf0, 0xab, 0x22, 0x10, 0xde, 0xff, 0xf0, 0xef, 0xff, 0xd0,
+ 0x0e, 0x24, 0xff, 0x8a,
+ 0x00, 0x13, 0x0f, 0xdc, 0x10, 0x24, 0xf0, 0x9c, 0x00, 0x00, 0x21, 0xee,
+ 0xdc, 0x20, 0x00, 0xbc,
+ 0xff, 0x22, 0x0f, 0x88, 0x00, 0x33, 0xef, 0xdc, 0x00, 0x11, 0x01, 0xee,
+ 0xee, 0x31, 0x00, 0xef,
+ 0xee, 0x00, 0x00, 0x0f, 0xdc, 0x72, 0x0f, 0xdb, 0x0f, 0x43, 0x14, 0xcd,
+ 0xcb, 0x00, 0x56, 0x00,
+ 0xbc, 0xf0, 0x11, 0x11, 0xef, 0x10, 0x00, 0xde, 0x40, 0x57, 0xf0, 0xcb,
+ 0x11, 0x42, 0x00, 0xe0,
+ 0xfe, 0x00, 0x24, 0x00, 0xfe, 0x00, 0x12, 0x31, 0xbe, 0x01, 0x35, 0xee,
+ 0xbe, 0x33, 0x45, 0xef,
+ 0xcd, 0x12, 0x23, 0x11, 0xee, 0xdc, 0x12, 0x76, 0x00, 0xee, 0x00, 0x13,
+ 0x22, 0xee, 0xff, 0x34,
+ 0x00, 0xcc, 0x53, 0x02, 0xdc, 0x00, 0x25, 0x10, 0x0f, 0xcf, 0x11, 0x45,
+ 0x00, 0x01, 0x10, 0x8b,
+ 0x01, 0x65, 0x00, 0x0f, 0xf0, 0x00, 0x21, 0x12, 0x0f, 0xdd, 0x00, 0x43,
+ 0x02, 0xfc, 0x00, 0x35,
+ 0xf0, 0xdc, 0x01, 0x32, 0x00, 0x20, 0x01, 0xd0, 0x72, 0xfe, 0xb8, 0x31,
+ 0x34, 0xee, 0xdf, 0x41,
+ 0x12, 0x0e, 0x21, 0x21, 0xde, 0xed, 0x75, 0x44, 0xff, 0xdc, 0x01, 0x00,
+ 0xdd, 0x00, 0x7f, 0x00,
+ 0xf7, 0x39, 0xd7, 0x13, 0x42, 0x34, 0x6d, 0x0f, 0xad, 0x0b, 0x12, 0xfc,
+ 0x0f, 0x24, 0xcf, 0xdb,
+ 0x20, 0x21, 0xce, 0x00, 0x31, 0xdd, 0x10, 0x56, 0x02, 0x13, 0xe1, 0xdf,
+ 0x61, 0x57, 0x07, 0xa0,
+ 0xfe, 0x10, 0x44, 0xe1, 0xcd, 0x1f, 0x42, 0x03, 0xdf, 0xfd, 0x1f, 0x21,
+ 0x16, 0x01, 0xd0, 0x00,
+ 0x33, 0x14, 0xae, 0x0f, 0x21, 0x22, 0x00, 0xcd, 0x1c, 0x3e, 0xec, 0xca,
+ 0x30, 0x41, 0xdf, 0xcb,
+ 0x2e, 0x40, 0xf0, 0xcd, 0x0d, 0x10, 0x20, 0xf1, 0xf0, 0xed, 0x10, 0x76,
+ 0xf0, 0xdc, 0x20, 0x40,
+ 0xef, 0x00, 0x00, 0x00, 0x13, 0x03, 0xbc, 0x34, 0x37, 0xa1, 0xe0, 0x10,
+ 0x03, 0x22, 0x02, 0xe1,
+ 0x34, 0x12, 0xe0, 0x00, 0x10, 0x00, 0x21, 0xee, 0xda, 0x73, 0x53, 0xab,
+ 0xfc, 0x34, 0x02, 0xdd,
+ 0x0f, 0x63, 0xf4, 0xdd, 0x0e, 0x33, 0xef, 0x00, 0x02, 0x0f, 0x0d, 0x00,
+ 0x23, 0xe0, 0xfb, 0xfd,
+ 0x41, 0x14, 0xcd, 0x0c, 0x65, 0x26, 0xc0, 0xee, 0x20, 0x32, 0xd0, 0xec,
+ 0x2f, 0x41, 0xde, 0xec,
+ 0x50, 0x00, 0xce, 0x0c, 0x20, 0x21, 0xce, 0xfb, 0x1f, 0x30, 0xff, 0x0e,
+ 0x21, 0xff, 0x98, 0x30,
+ 0x41, 0xd0, 0xba, 0x30, 0x20, 0xff, 0xdc, 0x0e, 0x20, 0x0f, 0x0e, 0x0f,
+ 0xee, 0x0c, 0x1f, 0x30,
+ 0xbf, 0xdb, 0x3f, 0x30, 0xdf, 0xbc, 0x40, 0x20, 0xef, 0xb9, 0x40, 0x31,
+ 0xaf, 0x0e, 0x21, 0x01,
+ 0xed, 0xfc, 0x42, 0x02, 0xef, 0xec, 0x31, 0x57, 0xf0, 0xbf, 0x10, 0x21,
+ 0xf1, 0xf0, 0x00, 0x01,
+ 0x24, 0xe1, 0xf0, 0x00, 0x42, 0x03, 0xce, 0x0f, 0x36, 0x12, 0xf0, 0xd0,
+ 0x52, 0x27, 0xc0, 0xe0,
+ 0x12, 0x23, 0xe0, 0xdf, 0x41, 0x23, 0xdf, 0xdd, 0x0e, 0x44, 0x26, 0xb0,
+ 0xff, 0x21, 0x23, 0xc0,
+ 0x42, 0x04, 0xcd, 0x32, 0x02, 0xdf, 0x21, 0x24, 0xf0, 0xf0, 0xed, 0x30,
+ 0x74, 0xed, 0xec, 0x0e,
+ 0x20, 0x26, 0xe0, 0x00, 0x10, 0xcd, 0x0f, 0x66, 0xf2, 0xd0, 0xcb, 0x0e,
+ 0x70, 0x25, 0xe0, 0xcb,
+ 0x40, 0x12, 0xe0, 0xff, 0x21, 0x02, 0xdf, 0x10, 0x13, 0xf3, 0x05, 0xf2,
+ 0xe1, 0x23, 0x02, 0x33,
+ 0x56, 0x02, 0x80, 0x00, 0x34, 0xf1, 0xf0, 0xff, 0x31, 0x25, 0xbe, 0xfc,
+ 0x20, 0x33, 0xbe, 0xfa,
+ 0x0f, 0x51, 0xf1, 0xd0, 0x20, 0x01, 0xff, 0x0f, 0x12, 0xf1, 0xef, 0x21,
+ 0xff, 0xed, 0x75, 0x02,
+ 0xef, 0xff, 0x00, 0x37, 0xf0, 0xd0, 0x42, 0x34, 0xf1, 0x8c, 0x10, 0x44,
+ 0xe0, 0xec, 0x0e, 0x1f,
+ 0x10, 0x13, 0xdc, 0xca, 0x30, 0x51, 0xe0, 0xff, 0x10, 0x23, 0xe0, 0x0e,
+ 0x20, 0x32, 0x02, 0xdf,
+ 0xfe, 0x10, 0x30, 0xb9, 0xeb, 0x5f, 0x30, 0xce, 0xdb, 0x3f, 0x20, 0xe0,
+ 0xbd, 0x0c, 0x30, 0x10,
+ 0xce, 0xdc, 0x30, 0x31, 0xad, 0x0e, 0x40, 0x00, 0xeb, 0xfc, 0x41, 0x00,
+ 0xdd, 0x0e, 0x10, 0x20,
+ 0xfe, 0x31, 0x22, 0xab, 0x21, 0x01, 0xeb, 0x20, 0x31, 0xf1, 0xbf, 0x11,
+ 0x14, 0xd0, 0xdf, 0x03,
+ 0x77, 0xf3, 0xab, 0x20, 0x24, 0xf1, 0xef, 0x00, 0x31, 0x03, 0xe2, 0x02,
+ 0x02, 0x01, 0x01, 0x13,
+ 0x02, 0xcc, 0x10, 0x55, 0xe0, 0xbe, 0x32, 0x27, 0xcf, 0xfd, 0x43, 0x03,
+ 0xee, 0x00, 0x01, 0xf0,
+ 0xf0, 0x54, 0x47, 0xe2, 0xcf, 0x0e, 0x22, 0x13, 0xff, 0xfd, 0x0c, 0x2f,
+ 0x20, 0xff, 0xcc, 0x0f,
+ 0x3f, 0xee, 0xca, 0x0e, 0x1f, 0x73, 0xf1, 0xbd, 0x0e, 0x10, 0x31, 0x00,
+ 0x21, 0x00, 0xfb, 0x0f,
+ 0x1e, 0x20, 0xf2, 0xde, 0x0f, 0x77, 0xf7, 0xa0, 0x02, 0x67, 0xe1, 0xf0,
+ 0x00, 0x01, 0x13, 0x01,
+ 0x01, 0x01, 0x14, 0x12, 0xd0, 0xf0, 0x10, 0x21, 0xd0, 0x43, 0x13, 0xab,
+ 0x0d, 0x43, 0x06, 0xf0,
+ 0xd0, 0xff, 0x32, 0x67, 0xd0, 0xd0, 0x21, 0x01, 0x12, 0x11, 0x12, 0xd1,
+ 0xd1, 0x32, 0x02, 0xc0,
+ 0x01, 0x76, 0x02, 0xf1, 0xe0, 0x00, 0x34, 0x25, 0xe1, 0xd0, 0x30, 0x41,
+ 0x02, 0x8f, 0x0d, 0x10,
+ 0x01, 0x00, 0xfc, 0xee, 0x31, 0x00, 0xef, 0x12, 0x14, 0xf0, 0x13, 0x55,
+ 0x02, 0x43, 0xf2, 0xbd,
+ 0x0e, 0x57, 0x02, 0xe0, 0x1f, 0xf8, 0x0f, 0x72, 0xf0, 0xb9, 0x0f, 0x30,
+ 0xff, 0xde, 0x1f, 0x30,
+ 0xe0, 0xed, 0x0c, 0x20, 0x1f, 0xed, 0x0d, 0x2f, 0x2f, 0xa9, 0x0e, 0x20,
+ 0x10, 0xce, 0xfd, 0x62,
+ 0x00, 0xdc, 0x1d, 0x30, 0x20, 0xdc, 0x0f, 0x20, 0xe0, 0xcd, 0x21, 0x23,
+ 0xca, 0x0e, 0x0c, 0x0e,
+ 0x0e, 0xec, 0xdc, 0x0e, 0x4e, 0x1f, 0x2f, 0x0d, 0x0e, 0x72, 0xce, 0xd8,
+ 0x2f, 0x40, 0xee, 0xfe,
+ 0x40, 0x0f, 0xde, 0x00, 0x0f, 0xed, 0xb9, 0x30, 0x50, 0xde, 0xee, 0x33,
+ 0x04, 0xd0, 0xff, 0x64,
+ 0x02, 0xc0, 0x10, 0x36, 0x02, 0xae, 0x0c, 0x21, 0x44, 0xe0, 0xfc, 0x1f,
+ 0x62, 0x01, 0xce, 0x0b,
+ 0x1e, 0x20, 0xee, 0xdc, 0x2f, 0x10, 0x00, 0xfd, 0xfc, 0x2e, 0x1f, 0x0c,
+ 0xdc, 0x4f, 0x60, 0x01,
+ 0xf0, 0xff, 0x0f, 0x03, 0x03, 0x05, 0xf2, 0xd1, 0xd0, 0x67, 0x14, 0xe0,
+ 0xf0, 0x13, 0x45, 0xf1,
+ 0xd1, 0x14, 0xf1, 0xd1, 0x51, 0x11, 0xff, 0x2f, 0x52, 0xc0, 0xec, 0x0e,
+ 0x61, 0x03, 0xe0, 0xfd,
+ 0x10, 0x37, 0xf0, 0xb0, 0x12, 0x23, 0x03, 0xe1, 0xd0, 0x0e, 0x0e, 0x21,
+ 0x01, 0x9e, 0x0b, 0x0e,
+ 0x00, 0x0e, 0x0b, 0x10, 0x10, 0x0f, 0x22, 0x03, 0x35, 0x75, 0xee, 0xee,
+ 0x21, 0x01, 0xe0, 0x0f,
+ 0xdd, 0xda, 0x50, 0x20, 0x0f, 0x0e, 0x10, 0x9c, 0x0d, 0x21, 0x00, 0xda,
+ 0x1f, 0x60, 0x00, 0xfd,
+ 0x0b, 0x0e, 0x2d, 0x1d, 0x2f, 0xfb, 0xaa, 0x1e, 0x40, 0x0e, 0xcc, 0x0f,
+ 0x10, 0xff, 0xdd, 0x0d,
+ 0x3f, 0x0e, 0x0c, 0x3c, 0xec, 0xcc, 0x1f, 0x00, 0xaf, 0xdc, 0x0e, 0x7e,
+ 0x1f, 0xec, 0xeb, 0x3f,
+ 0x2f, 0xee, 0xec, 0x60, 0x41, 0x03, 0xe2, 0xf0, 0xf2, 0x14, 0x02, 0xf1,
+ 0x01, 0x04, 0x03, 0xf4,
+ 0xf2, 0x03, 0x57, 0x12, 0xb0, 0xf2, 0x34, 0x74, 0xf2, 0xd1, 0x13, 0x25,
+ 0xf2, 0xf1, 0x13, 0x34,
+ 0xc2, 0xf3, 0x02, 0x01, 0x01, 0xf2, 0xb2, 0xf1, 0x05, 0x75, 0x01, 0xe0,
+ 0x02, 0x23, 0xe2, 0xd0,
+ 0xf1, 0x05, 0x13, 0x03, 0x34, 0x01, 0x01, 0x63, 0x01, 0xf0, 0x40, 0x20,
+ 0x03, 0xe5, 0x03, 0xe0,
+ 0x02, 0x16, 0xf2, 0x81, 0xc0, 0x02, 0x34, 0xe0, 0x01, 0x10, 0x40, 0x20,
+ 0x1f, 0x0e, 0x0f, 0x33,
+ 0xf4, 0x8f, 0x0e, 0x1f, 0x20, 0x0d, 0xf8, 0x00, 0x37, 0xe3, 0x81, 0x03,
+ 0x05, 0x43, 0x03, 0xc3,
+ 0x03, 0x24, 0x03, 0xe2, 0x03, 0x14, 0x31, 0x20, 0x11, 0xf2, 0x80, 0x01,
+ 0x35, 0x03, 0xe0, 0x10,
+ 0x41, 0xd1, 0xd0, 0x0f, 0x02, 0x03, 0xe3, 0x22, 0x1e, 0xe9, 0xce, 0xbf,
+ 0x0e, 0xef, 0xf0, 0xf4,
+ 0x16, 0xf0, 0xb0, 0x75, 0x45, 0xf1, 0xe0, 0x01, 0x04, 0x02, 0xf1, 0x01,
+ 0x12, 0x32, 0x01, 0xe0,
+ 0xef, 0x3f, 0xbe, 0xdb, 0x50, 0x00, 0xed, 0xea, 0x50, 0x0f, 0xad, 0x0f,
+ 0x20, 0x00, 0x0a, 0x3d,
+ 0x4b, 0x0d, 0x2e, 0xfe, 0xee, 0xeb, 0x0f, 0x5f, 0xdd, 0xfb, 0x2e, 0x2e,
+ 0x0e, 0x9c, 0x0d, 0xfc,
+ 0x0c, 0xfd, 0x2d, 0x2f, 0xff, 0xcf, 0xfd, 0xdc, 0xec, 0x0e, 0x2c, 0xbc,
+ 0x1e, 0x6f, 0x0e, 0xfe,
+ 0x1d, 0x3d, 0xfd, 0x3f, 0x60, 0xf0, 0xf0, 0x0d, 0x2d, 0x40, 0xe0, 0xa8,
+ 0x0f, 0x40, 0x00, 0xdd,
+ 0x0d, 0x00, 0x01, 0xee, 0xcd, 0x00, 0x34, 0x26, 0x02, 0x03, 0xe1, 0x31,
+ 0x00, 0x8c, 0x0e, 0x00,
+ 0x10, 0x00, 0x04, 0xe1, 0x0f, 0x2e, 0x60, 0x03, 0xde, 0x08, 0x00, 0x05,
+ 0x02, 0xd2, 0x02, 0x04,
+ 0xf3, 0xd3, 0x03, 0x02, 0x00, 0x10, 0x70, 0x5f, 0x0e, 0x3d, 0x60, 0x0c,
+ 0xee, 0xe0, 0xef, 0xfd,
+ 0xd8, 0xea, 0xed, 0x2c, 0x1c, 0x0c, 0xdc, 0xbe, 0x1d, 0x4d, 0x5b, 0x5e,
+ 0x0e, 0xec, 0x0d, 0x4f,
+ 0x0d, 0xfd, 0x0c, 0x6f, 0x0e, 0xed, 0xfd, 0x20, 0x00, 0xff, 0xd0, 0x16,
+ 0x13, 0x01, 0xb1, 0x00,
+ 0x03, 0x25, 0xe2, 0xc1, 0x23, 0x23, 0x02, 0x12, 0x14, 0xc2, 0xe2, 0x02,
+ 0x44, 0x55, 0xf2, 0x02,
+ 0x76, 0x13, 0x00, 0xf1, 0x33, 0x04, 0xc3, 0xc2, 0xf2, 0xf4, 0x02, 0xd1,
+ 0x00, 0x54, 0x05, 0xb2,
+ 0x03, 0x04, 0x12, 0x33, 0x04, 0x24, 0x34, 0xe1, 0xc2, 0xf3, 0xd4, 0x01,
+ 0xd1, 0x10, 0x70, 0x6f,
+ 0xdd, 0xfd, 0xfe, 0x0e, 0xec, 0xfd, 0x00, 0x02, 0x03, 0x02, 0x21, 0x0e,
+ 0xf8, 0x4e, 0x7f, 0x20,
+ 0x00, 0x02, 0x56, 0x22, 0x01, 0xd1, 0xf2, 0x02, 0x20, 0x10, 0x20, 0x0f,
+ 0x1d, 0x0b, 0xad, 0xcb,
+ 0xfc, 0x0d, 0x0d, 0xec, 0x0b, 0xcd, 0xbc, 0xdc, 0x0e, 0x1e, 0x0d, 0x0d,
+ 0x6f, 0x3e, 0x0f, 0xee,
+ 0x0f, 0x40, 0x00, 0x0f, 0xe0, 0x12, 0x76, 0x01, 0x00, 0x31, 0xf0, 0xcf,
+ 0x0b, 0xee, 0x0e, 0x0d,
+ 0x0d, 0x0c, 0x0f, 0xed, 0xca, 0x2f, 0x40, 0xe0, 0x9e, 0x0d, 0x02, 0x24,
+ 0xe1, 0x01, 0x34, 0xf2,
+ 0x01, 0x22, 0x22, 0xaf, 0xe8, 0x1e, 0x5f, 0x0f, 0x2f, 0xde, 0xbe, 0xf2,
+ 0x07, 0xa2, 0xf1, 0xf4,
+ 0x14, 0x12, 0x01, 0x02, 0x23, 0x22, 0x73, 0x26, 0x02, 0x00, 0x12, 0xf3,
+ 0xf3, 0xe1, 0x11, 0x47,
+ 0xe1, 0xb0, 0x00, 0x30, 0x00, 0xef, 0x0d, 0x0d, 0x1c, 0xed, 0x3c, 0x6c,
+ 0x0b, 0x0d, 0xfb, 0x1f,
+ 0x1e, 0x0d, 0xfd, 0x4f, 0x40, 0xf0, 0x00, 0x32, 0xc2, 0x02, 0xf7, 0xe3,
+ 0xe5, 0xb2, 0x02, 0x22,
+ 0x63, 0x52, 0x12, 0xe3, 0xc3, 0xf4, 0x13, 0x02, 0xe0, 0x10, 0x30, 0x33,
+ 0xf7, 0x13, 0x23, 0xf3,
+ 0x33, 0x73, 0x23, 0x05, 0x04, 0xb3, 0xd1, 0xb1, 0xf1, 0xe2, 0xd1, 0x02,
+ 0x15, 0x33, 0xc2, 0xf1,
+ 0x02, 0x12, 0xa1, 0xf3, 0x17, 0x16, 0x02, 0x03, 0x13, 0x22, 0x00, 0x00,
+ 0x41, 0x40, 0xff, 0x1e,
+ 0x70, 0x10, 0xf0, 0xcd, 0xed, 0xed, 0xd9, 0xfd, 0x0c, 0x2f, 0x2e, 0x0d,
+ 0xfe, 0x30, 0x70, 0x21,
+ 0x33, 0x03, 0x01, 0xef, 0x0a, 0x1c, 0x09, 0xfc, 0x7e, 0x5e, 0x2e, 0x2f,
+ 0x0f, 0x1d, 0x0e, 0x0b,
+ 0xbd, 0xfd, 0xee, 0xbe, 0xfb, 0xee, 0x0f, 0x0e, 0xeb, 0xfc, 0x4e, 0x0d,
+ 0xbc, 0x2d, 0x1f, 0x10,
+ 0x1f, 0x3e, 0x7f, 0x50, 0x00, 0xfe, 0xee, 0xfd, 0x0d, 0x0c, 0x0b, 0x0d,
+ 0x2c, 0x2e, 0x9a, 0xee,
+ 0x0f, 0x20, 0xf0, 0xdf, 0x40, 0x31, 0x23, 0xf2, 0xe5, 0xd4, 0xd6, 0xe2,
+ 0x02, 0x03, 0x02, 0x22,
+ 0x32, 0x71, 0x72, 0x24, 0x01, 0x02, 0x33, 0x05, 0xb3, 0xd3, 0xf4, 0xb3,
+ 0xd3, 0xe4, 0xf4, 0xe3,
+ 0xf3, 0x14, 0x02, 0x53, 0x33, 0x13, 0x04, 0x64, 0x24, 0x13, 0x03, 0x01,
+ 0x03, 0xf3, 0xd2, 0x05,
+ 0xd3, 0x94, 0x02, 0x02, 0x01, 0x12, 0x22, 0x13, 0x03, 0xb3, 0xd0, 0xf0,
+ 0x1e, 0x6a, 0x1e, 0x5c,
+ 0x1b, 0xee, 0xee, 0xfd, 0xfd, 0x0b, 0x2d, 0x3f, 0x3f, 0x00, 0xc3, 0xe3,
+ 0xf3, 0x24, 0x42, 0x04,
+ 0x04, 0xf3, 0xe4, 0x03, 0x05, 0x81, 0x91, 0x00, 0x01, 0x02, 0x04, 0x33,
+ 0x72, 0x02, 0xe3, 0x02,
+ 0x11, 0x22, 0x11, 0xe0, 0xfd, 0x01, 0xf0, 0xa8, 0xf9, 0x0e, 0x0d, 0xeb,
+ 0x0e, 0x0d, 0x0e, 0x0f,
+ 0xee, 0xee, 0xde, 0x0f, 0x20, 0x4e, 0x0c, 0x4e, 0x2e, 0x1e, 0x0b, 0xfe,
+ 0xbf, 0xfe, 0x1e, 0x71,
+ 0x02, 0xb0, 0xea, 0xed, 0x1e, 0xfc, 0xcc, 0x0e, 0x2f, 0x3f, 0x1f, 0x4f,
+ 0x1e, 0x0c, 0xfc, 0x0e,
+ 0x3c, 0x6d, 0x0e, 0x0f, 0xfd, 0x3c, 0x7d, 0x5a, 0x0c, 0x3d, 0x0b, 0xee,
+ 0x0d, 0xee, 0xfd, 0x0d,
+ 0x1b, 0x4e, 0x0d, 0xdd, 0x8d, 0x0c, 0x0e, 0xed, 0xec, 0xec, 0x0d, 0x2e,
+ 0x1d, 0xdc, 0x0e, 0x5f,
+ 0x0e, 0x0d, 0x5e, 0x0b, 0x0c, 0x2d, 0x2f, 0xfe, 0xdc, 0x4f, 0x3f, 0xdd,
+ 0x9b, 0x1d, 0x2d, 0x0e,
+ 0xcb, 0x1e, 0x7f, 0x0f, 0xff, 0xf1, 0x03, 0x13, 0xf1, 0xe1, 0x02, 0xe7,
+ 0x03, 0xe2, 0x01, 0x30,
+ 0x70, 0x10, 0x0c, 0x0d, 0xdd, 0x0f, 0xff, 0xfe, 0xcc, 0xfd, 0x2e, 0xef,
+ 0x8c, 0xf3, 0x07, 0xe5,
+ 0xd0, 0x32, 0x74, 0x23, 0x02, 0x14, 0x02, 0xf2, 0x02, 0x02, 0xf1, 0x00,
+ 0x62, 0x12, 0x01, 0xd3,
+ 0x03, 0xe3, 0xd2, 0xf0, 0xf0, 0xd0, 0xfd, 0x1c, 0x2b, 0xdd, 0xfb, 0x3e,
+ 0x2a, 0x0d, 0x7c, 0x7d,
+ 0x7d, 0xfd, 0xfb, 0x0d, 0x0d, 0x0c, 0x0e, 0xff, 0x10, 0x52, 0x13, 0x02,
+ 0xc1, 0x14, 0x04, 0x02,
+ 0xe1, 0x11, 0x14, 0xc4, 0xe4, 0xf4, 0x03, 0xe2, 0x03, 0x34, 0x44, 0x54,
+ 0x24, 0x34, 0x13, 0x04,
+ 0xb2, 0x04, 0x24, 0x22, 0x02, 0x22, 0x42, 0xf2, 0xa0, 0xf1, 0x02, 0xf1,
+ 0xf2, 0x27, 0xf3, 0xa4,
+ 0xe2, 0xe2, 0x04, 0x02, 0x02, 0xf3, 0x43, 0x77, 0x02, 0xf2, 0x02, 0x53,
+ 0x03, 0xf2, 0xf2, 0xe1,
+ 0x01, 0xd1, 0xf0, 0xe1, 0xd0, 0x3f, 0x5f, 0x0c, 0xed, 0xe0, 0x03, 0xc2,
+ 0xf0, 0x10, 0x40, 0x0e,
+ 0x30, 0x47, 0xf5, 0xd1, 0x22, 0x62, 0x21, 0x10, 0x41, 0x14, 0x13, 0x04,
+ 0x04, 0x43, 0x03, 0xe2,
+ 0xd2, 0xf1, 0xdf, 0xca, 0x9d, 0xeb, 0xff, 0xed, 0xba, 0x0f, 0x0e, 0xee,
+ 0xfd, 0x0c, 0x2d, 0x3d,
+ 0x7e, 0x1d, 0x2e, 0x1e, 0x00, 0xfe, 0x0d, 0x4f, 0x0e, 0xcc, 0xef, 0x0f,
+ 0x3b, 0x1b, 0x7d, 0x1c,
+ 0x1d, 0x0e, 0xd0, 0xa0, 0xfe, 0x0d, 0x1f, 0xf0, 0xf0, 0xf1, 0x05, 0xc3,
+ 0xf0, 0x0c, 0x0b, 0x6d,
+ 0x4e, 0x3f, 0x20, 0x0c, 0x0d, 0xde, 0xcc, 0xcc, 0xfc, 0xee, 0xf0, 0xe3,
+ 0x06, 0xd2, 0xd2, 0xe4,
+ 0xe3, 0x03, 0x55, 0x44, 0x63, 0x14, 0x22, 0x03, 0xf2, 0xe1, 0x12, 0x43,
+ 0x13, 0x03, 0x02, 0xf3,
+ 0xd1, 0xc0, 0xc0, 0xad, 0xfc, 0x0f, 0x20, 0x0e, 0xec, 0x1c, 0x6a, 0x1c,
+ 0x0b, 0x0c, 0x0d, 0x0d,
+ 0x0b, 0x1d, 0x0d, 0xdd, 0xfe, 0x2d, 0x7d, 0x2c, 0x4f, 0x0f, 0x20, 0x2f,
+ 0x00, 0xc3, 0xc2, 0xd1,
+ 0xe3, 0x17, 0x03, 0xc2, 0xe1, 0x00, 0xf0, 0x50, 0x30, 0x20, 0x33, 0x37,
+ 0x46, 0xd2, 0xf2, 0x73,
+ 0x73, 0x03, 0xf1, 0xf2, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x2f, 0x0d, 0xdd,
+ 0xf0, 0x8f, 0xcc, 0x00,
+ 0xe5, 0xe4, 0x03, 0x14, 0x54, 0x11, 0x12, 0xf4, 0xf5, 0xf2, 0xe1, 0x01,
+ 0x41, 0x41, 0xf0, 0xcf,
+ 0x00, 0xff, 0x20, 0x0e, 0xfb, 0x0e, 0xec, 0x2f, 0x10, 0xdf, 0x8c, 0x0f,
+ 0x10, 0x00, 0x9c, 0x0d,
+ 0xfb, 0x1c, 0x0b, 0x0d, 0x4d, 0x3e, 0x0d, 0x0e, 0x4e, 0x0a, 0x2d, 0x2c,
+ 0x6d, 0x1e, 0xeb, 0xfd,
+ 0x0e, 0x3d, 0x1c, 0x0b, 0x0d, 0xbe, 0xbe, 0xec, 0xed, 0xed, 0xfb, 0x1d,
+ 0x5c, 0x1d, 0x3e, 0x0d,
+ 0xce, 0x0e, 0xed, 0x0d, 0x2c, 0x4d, 0x0e, 0xde, 0x2e, 0x2e, 0xea, 0xfd,
+ 0x2d, 0x6e, 0x1d, 0x2d,
+ 0x6d, 0x2e, 0x0d, 0xbe, 0xdd, 0xff, 0x0f, 0xd0, 0xe2, 0xf3, 0x46, 0x33,
+ 0x02, 0x24, 0x43, 0x43,
+ 0x24, 0x53, 0x35, 0xf3, 0xc2, 0x03, 0xe4, 0x03, 0xe1, 0xe4, 0xf5, 0xd3,
+ 0xe2, 0x06, 0xb3, 0xb2,
+ 0xf3, 0x14, 0x03, 0xc1, 0x22, 0x53, 0x04, 0x02, 0x22, 0x22, 0x12, 0xd0,
+ 0x0f, 0x41, 0x26, 0xc1,
+ 0xc1, 0xf2, 0x06, 0xb3, 0x03, 0x14, 0x43, 0x33, 0x13, 0x04, 0xe2, 0x02,
+ 0x11, 0xf1, 0xaf, 0x0e,
+ 0x0e, 0x2d, 0x0d, 0xa8, 0x2d, 0x6d, 0x2b, 0x0d, 0x0d, 0xfe, 0xf0, 0x10,
+ 0x02, 0xd2, 0xf2, 0x02,
+ 0x20, 0x00, 0xa2, 0xd5, 0xf3, 0x05, 0x45, 0x33, 0x63, 0x03, 0xf3, 0xe6,
+ 0x13, 0x03, 0xc3, 0x24,
+ 0x02, 0x33, 0x43, 0x23, 0x23, 0x03, 0xe3, 0xc2, 0x01, 0xf1, 0x01, 0x01,
+ 0x26, 0x00, 0x10, 0x00,
+ 0x4a, 0x21, 0x84, 0x10, 0xe1, 0x1f, 0xd1, 0x10, 0xc0, 0xdd, 0xb9, 0x02,
+ 0xe7, 0x02, 0x0f, 0xbe,
+ 0x00, 0x15, 0x20, 0x00, 0x00, 0x61, 0x00, 0xc0, 0xde, 0x0b, 0x1c, 0x1f,
+ 0x50, 0x00, 0x9e, 0x00,
+ 0xf7, 0x12, 0x0d, 0xde, 0x24, 0x25, 0xe0, 0xb0, 0x00, 0x11, 0x0e, 0x0b,
+ 0x10, 0x3f, 0x41, 0x04,
+ 0x00, 0x4d, 0x0c, 0x0f, 0x00, 0x71, 0x53, 0x2e, 0x0c, 0x30, 0x01, 0xd0,
+ 0xe1, 0x00, 0x00, 0xeb,
+ 0xc0, 0x04, 0x0e, 0xeb, 0xbe, 0xf0, 0xe1, 0xc0, 0x02, 0x72, 0x16, 0x34,
+ 0x01, 0xdf, 0xfe, 0xef,
+ 0xee, 0x00, 0x00, 0x19, 0x3e, 0x40, 0x11, 0x33, 0x4e, 0x0d, 0x22, 0x62,
+ 0x12, 0x05, 0xd4, 0x00,
+ 0xcf, 0xce, 0xc0, 0xf7, 0xf3, 0x01, 0x3f, 0x2e, 0x51, 0x00, 0xd0, 0x10,
+ 0x42, 0x2c, 0x00, 0x35,
+ 0xe6, 0xa0, 0xfe, 0xe0, 0x03, 0xef, 0xda, 0xe0, 0xd0, 0xa0, 0xee, 0xd0,
+ 0xf3, 0x04, 0x00, 0x3d,
+ 0x73, 0x74, 0x1f, 0x0b, 0x11, 0x12, 0x00, 0xf9, 0xff, 0xe0, 0xe2, 0xe5,
+ 0x00, 0xe0, 0x0e, 0x0e,
+ 0x4e, 0x30, 0xd3, 0xa2, 0x02, 0x23, 0xfd, 0xc8, 0x1f, 0x4d, 0x0e, 0xee,
+ 0xef, 0xef, 0xef, 0x0e,
+ 0x70, 0x47, 0x43, 0x21, 0x13, 0x12, 0x00, 0xcd, 0x00, 0x21, 0x14, 0xd1,
+ 0xd0, 0x10, 0x35, 0xfd,
+ 0x30, 0x60, 0xe7, 0xb4, 0xef, 0x0f, 0x1f, 0x20, 0x12, 0x33, 0x43, 0xfe,
+ 0xfb, 0x10, 0x70, 0x3a,
+ 0xff, 0xff, 0xf0, 0xff, 0xe0, 0xc1, 0xb0, 0x0f, 0xf0, 0x04, 0xef, 0xe0,
+ 0xf4, 0xf6, 0x00, 0x00,
+ 0x3f, 0x72, 0x40, 0xd0, 0xd7, 0xe3, 0x0f, 0xfa, 0xef, 0xf0, 0x60, 0x22,
+ 0x30, 0x50, 0xfd, 0xbf,
+ 0xfd, 0xb0, 0x00, 0xe5, 0x0f, 0x0d, 0x32, 0x20, 0xdd, 0xb0, 0xf5, 0xd1,
+ 0xf1, 0x0f, 0x1c, 0x20,
+ 0x60, 0x03, 0x30, 0x08, 0x3f, 0x20, 0x4f, 0x41, 0x34, 0x43, 0x30, 0x1d,
+ 0xee, 0xbc, 0xf0, 0xed,
+ 0xec, 0xbd, 0x0d, 0x2a, 0xf1, 0xaf, 0xfc, 0x1e, 0x10, 0xff, 0x02, 0x24,
+ 0xe0, 0xb0, 0x0f, 0xf1,
+ 0xd4, 0xdf, 0x0f, 0x72, 0x36, 0x20, 0x10, 0x2e, 0x1f, 0x1c, 0x0c, 0x0d,
+ 0xff, 0xe2, 0xb3, 0xc4,
+ 0xd7, 0xe3, 0xd1, 0x01, 0x10, 0x6f, 0x1d, 0x02, 0xe3, 0x09, 0x3d, 0x7a,
+ 0x2e, 0x20, 0xf0, 0xf2,
+ 0x03, 0x52, 0x0a, 0xdc, 0xf0, 0x14, 0xf0, 0x9f, 0xc0, 0xe5, 0xe4, 0xf0,
+ 0x0f, 0x2d, 0x40, 0x11,
+ 0x01, 0xe3, 0xe1, 0x0f, 0x11, 0x55, 0x31, 0x21, 0xef, 0xdf, 0x01, 0x00,
+ 0x0f, 0x23, 0x35, 0xc0,
+ 0x11, 0x02, 0xff, 0x18, 0x2d, 0xef, 0x80, 0xdc, 0x0e, 0xff, 0xed, 0x29,
+ 0x7f, 0x7f, 0x11, 0x03,
+ 0x00, 0x00, 0x01, 0xf2, 0x0f, 0x20, 0x03, 0x17, 0x07, 0xf1, 0x00, 0x30,
+ 0x6f, 0xff, 0xe0, 0xf0,
+ 0xf0, 0xe1, 0xd2, 0xf0, 0xfd, 0xee, 0x8f, 0x04, 0x33, 0x26, 0x71, 0x0e,
+ 0x0e, 0x00, 0x24, 0x41,
+ 0x20, 0x0f, 0x33, 0x00, 0xb8, 0xee, 0xff, 0xee, 0xfc, 0x00, 0x43, 0x54,
+ 0xff, 0xcf, 0xe1, 0xe7,
+ 0xc0, 0xfd, 0x11, 0x32, 0xf0, 0xee, 0x00, 0x02, 0xef, 0xba, 0xff, 0x0f,
+ 0x10, 0x31, 0x22, 0x41,
+ 0x22, 0xfc, 0xbb, 0x00, 0x12, 0x56, 0x01, 0xd2, 0x0f, 0x0e, 0x8d, 0xec,
+ 0xc0, 0x00, 0xf0, 0x1f,
+ 0x1b, 0x10, 0x12, 0x41, 0x10, 0x5f, 0x33, 0x54, 0x01, 0x22, 0xf0, 0xee,
+ 0xe1, 0x00, 0xf8, 0x09,
+ 0xd0, 0x10, 0xf0, 0x10, 0x60, 0x0f, 0x00, 0x20, 0x0f, 0x0d, 0xae, 0xf1,
+ 0xdf, 0xd2, 0xc4, 0xef,
+ 0xfe, 0x0d, 0x55, 0x33, 0x40, 0x01, 0x05, 0x44, 0x2f, 0x2b, 0x30, 0x31,
+ 0xf7, 0x82, 0xe1, 0x10,
+ 0x0f, 0x0d, 0x1f, 0x02, 0xf3, 0x91, 0xf0, 0x03, 0x13, 0x37, 0x23, 0x2e,
+ 0x6c, 0x1f, 0x20, 0x00,
+ 0x0e, 0xf7, 0x02, 0xf0, 0xe0, 0xc2, 0xd0, 0xfe, 0xfd, 0xe1, 0xe5, 0xf0,
+ 0xfe, 0xa0, 0x03, 0x13,
+ 0x4b, 0x6d, 0x1f, 0x00, 0xc0, 0xe3, 0x0d, 0xf8, 0xfb, 0xdf, 0x10, 0x70,
+ 0x27, 0x02, 0x00, 0xf0,
+ 0xfd, 0xf0, 0x01, 0x00, 0xa1, 0xe0, 0xf0, 0x0f, 0x0d, 0xfe, 0xde, 0x2c,
+ 0x7e, 0x1f, 0xf2, 0x15,
+ 0x3f, 0xed, 0xf1, 0x03, 0x53, 0x2f, 0x39, 0x30, 0x00, 0x90, 0xec, 0xff,
+ 0x10, 0x00, 0x12, 0x37,
+ 0x63, 0xe1, 0xa0, 0x00, 0x03, 0xf5, 0xe0, 0x3e, 0x30, 0x22, 0x12, 0x1f,
+ 0x2f, 0xd0, 0xc4, 0xf1,
+ 0x12, 0x5f, 0x2a, 0x3e, 0x4a, 0xef, 0xce, 0xef, 0xfd, 0x0d, 0x21, 0xe3,
+ 0xff, 0xee, 0xcf, 0xc0,
+ 0xd9, 0xef, 0xe2, 0xc7, 0x01, 0x10, 0x4f, 0xe0, 0x91, 0x04, 0xdf, 0x1d,
+ 0x50, 0x10, 0x00, 0xe1,
+ 0x0f, 0xe9, 0x05, 0x73, 0x40, 0x0d, 0xce, 0x00, 0xf7, 0xe1, 0xc1, 0xce,
+ 0xfc, 0xee, 0x0e, 0x0f,
+ 0xfe, 0x00, 0x22, 0x71, 0x40, 0x2d, 0x2c, 0x3e, 0x04, 0x16, 0x00, 0xfd,
+ 0x0e, 0x00, 0x40, 0x2d,
+ 0x1b, 0x00, 0xa3, 0xff, 0xfd, 0x2f, 0x1b, 0xdf, 0xa0, 0xe0, 0xb1, 0xd7,
+ 0xf7, 0x00, 0x00, 0x2e,
+ 0x10, 0x20, 0x30, 0x0f, 0x0f, 0x60, 0x00, 0x03, 0xf3, 0x20, 0x6f, 0x2e,
+ 0x40, 0x10, 0x0a, 0xc0,
+ 0xd6, 0xe3, 0x00, 0xbf, 0x0f, 0x30, 0x11, 0x13, 0x21, 0x3e, 0xe9, 0xb0,
+ 0x00, 0x61, 0x31, 0x00,
+ 0xf4, 0x16, 0x01, 0xbf, 0xef, 0x0f, 0xdf, 0xdd, 0xff, 0xf2, 0x16, 0xf1,
+ 0xe0, 0x0d, 0xee, 0x0d,
+ 0x50, 0x10, 0x03, 0x03, 0xfc, 0xeb, 0xc0, 0x02, 0x65, 0x72, 0x41, 0x10,
+ 0x0b, 0xe0, 0xe5, 0xd3,
+ 0xc0, 0x00, 0x0f, 0xfd, 0x00, 0xe0, 0xd0, 0xeb, 0xec, 0xde, 0x2b, 0x3f,
+ 0x70, 0x30, 0x70, 0x2f,
+ 0xe2, 0xd0, 0x0f, 0x1c, 0x11, 0x04, 0x3f, 0x7e, 0x7f, 0x01, 0xf1, 0xf8,
+ 0xf0, 0x02, 0xf1, 0x02,
+ 0xf0, 0x04, 0x32, 0x00, 0xa0, 0x01, 0xf2, 0x13, 0x37, 0x17, 0x12, 0xfe,
+ 0x00, 0x11, 0x11, 0x30,
+ 0x0f, 0x3e, 0x5f, 0x0e, 0xee, 0xf0, 0xe0, 0xc8, 0xe0, 0x10, 0x40, 0x10,
+ 0x00, 0xa2, 0xd7, 0xf0,
+ 0x2f, 0x4f, 0xe0, 0x00, 0x65, 0x02, 0x01, 0xb1, 0xfe, 0xff, 0x00, 0x4f,
+ 0x30, 0x00, 0xe2, 0xf1,
+ 0x1f, 0x6a, 0x2f, 0x0e, 0x0c, 0x02, 0x84, 0xe1, 0xdc, 0xea, 0xf0, 0xdf,
+ 0xe0, 0xe0, 0xfe, 0xff,
+ 0x10, 0x55, 0x21, 0x60, 0x20, 0x13, 0x23, 0x01, 0x0e, 0x0e, 0x24, 0x35,
+ 0x21, 0x61, 0x2e, 0x38,
+ 0x2c, 0x40, 0x2e, 0xf0, 0x9f, 0xdf, 0xff, 0x00, 0xd5, 0xe0, 0x0c, 0x0f,
+ 0xf0, 0x90, 0xe3, 0xf1,
+ 0xf0, 0x1d, 0x10, 0x44, 0x53, 0x12, 0x03, 0x1d, 0x18, 0x1e, 0x11, 0x00,
+ 0xfc, 0xf1, 0x37, 0x51,
+ 0xd0, 0xb0, 0xde, 0xc0, 0xf2, 0x00, 0x0e, 0x51, 0x05, 0x11, 0x11, 0x1f,
+ 0x41, 0x2f, 0x28, 0x30,
+ 0x00, 0xa1, 0xe0, 0xf0, 0xfe, 0xff, 0xe0, 0xf0, 0xf5, 0x21, 0x20, 0xc0,
+ 0x8e, 0xff, 0xee, 0xe0,
+ 0xec, 0x0b, 0x10, 0x03, 0x05, 0xc0, 0x10, 0x2f, 0x20, 0x12, 0x77, 0x57,
+ 0x11, 0x11, 0x00, 0x01,
+ 0xcf, 0xef, 0xfe, 0xe0, 0x0f, 0x4e, 0x0c, 0x2d, 0x2e, 0xf0, 0xe0, 0xe0,
+ 0xec, 0x0e, 0x52, 0x01,
+ 0x1e, 0x0d, 0x01, 0xf3, 0x7f, 0x7d, 0x30, 0x04, 0xf0, 0x00, 0x10, 0xe3,
+ 0xe0, 0x0b, 0x31, 0x20,
+ 0x1f, 0xbf, 0xf6, 0x07, 0xe2, 0xa0, 0x0f, 0x3f, 0x51, 0x05, 0xc1, 0x01,
+ 0x0e, 0x1e, 0x50, 0x0d,
+ 0x2e, 0x10, 0x12, 0x25, 0x1e, 0xfe, 0xef, 0x0c, 0x00, 0x0f, 0xd5, 0xe0,
+ 0xa0, 0xe0, 0xd4, 0xd2,
+ 0x43, 0x52, 0xd1, 0xc6, 0xf3, 0xc0, 0xcd, 0x0f, 0x00, 0xf2, 0xed, 0x0a,
+ 0x00, 0x72, 0x00, 0x3e,
+ 0x3e, 0x31, 0x17, 0x01, 0xeb, 0xfd, 0x9e, 0xf0, 0xb0, 0xe3, 0xe7, 0xc0,
+ 0x0f, 0x0e, 0x2c, 0x1f,
+ 0x2f, 0x20, 0x0f, 0xc3, 0x04, 0xdf, 0x0f, 0x33, 0x24, 0x61, 0x4e, 0x2c,
+ 0x30, 0x10, 0x2d, 0x2b,
+ 0x3d, 0x4e, 0x61, 0x22, 0x0f, 0xc8, 0xcb, 0xf0, 0x00, 0xaf, 0xe0, 0x01,
+ 0x03, 0x01, 0x04, 0x03,
+ 0x0f, 0x1f, 0x0d, 0x60, 0x42, 0x19, 0x0c, 0x20, 0x01, 0xf3, 0x00, 0x40,
+ 0x13, 0xfe, 0xb9, 0xe0,
+ 0xd4, 0xe3, 0xbb, 0xff, 0xf0, 0xf1, 0x12, 0x71, 0x44, 0x01, 0x11, 0xee,
+ 0x0f, 0xfe, 0xff, 0x00,
+ 0x46, 0x21, 0x40, 0xe0, 0xd0, 0x0e, 0xf3, 0x17, 0x14, 0x20, 0x13, 0x03,
+ 0xe1, 0x8d, 0xcc, 0xf0,
+ 0xd0, 0xe3, 0xe2, 0x0a, 0x2b, 0x60, 0x2f, 0x10, 0x02, 0xf3, 0x12, 0x30,
+ 0x00, 0x07, 0xc3, 0x00,
+ 0x00, 0x0d, 0x0f, 0xef, 0x00, 0x40, 0xe5, 0x8f, 0xca, 0xef, 0x0f, 0x0e,
+ 0x1d, 0x1f, 0xf2, 0xe1,
+ 0x6e, 0x1c, 0x0f, 0x11, 0x65, 0x21, 0x00, 0xe0, 0x0e, 0x1f, 0x2d, 0x09,
+ 0x0d, 0x1c, 0x0f, 0xe0,
+ 0x80, 0x00, 0xe0, 0xe3, 0xf4, 0x22, 0x15, 0xd3, 0xb4, 0x13, 0x24, 0x10,
+ 0xe0, 0x03, 0x22, 0x52,
+ 0x30, 0x4d, 0x0a, 0x20, 0x1e, 0xec, 0xdc, 0x0f, 0x7e, 0x2b, 0x1e, 0x3e,
+ 0xe0, 0xb5, 0xf6, 0x11,
+ 0x30, 0xed, 0xee, 0xdc, 0x80, 0xce, 0xb0, 0xf2, 0x00, 0xee, 0xf0, 0x1f,
+ 0x5f, 0x3d, 0x21, 0x23,
+ 0x04, 0xf4, 0xd0, 0xad, 0x02, 0x07, 0xe4, 0xe0, 0xe0, 0xf0, 0xfd, 0xdd,
+ 0xef, 0xc4, 0xe3, 0xec,
+ 0x30, 0x47, 0x26, 0x10, 0xff, 0xce, 0x00, 0x3d, 0x4f, 0x5f, 0x30, 0x63,
+ 0x1f, 0x20, 0x30, 0x48,
+ 0x40, 0x0e, 0x41, 0x00, 0x00, 0xfe, 0xf0, 0xc1, 0x02, 0x00, 0xa0, 0xe2,
+ 0xe5, 0x10, 0x01, 0xe0,
+ 0xb0, 0x0e, 0xfb, 0x3e, 0x60, 0x27, 0x34, 0x0f, 0x3c, 0x0d, 0xd0, 0xa0,
+ 0x01, 0x00, 0x0d, 0xe1,
+ 0xf1, 0x0e, 0xee, 0xe4, 0x17, 0x22, 0x13, 0x40, 0x72, 0x76, 0x02, 0xe3,
+ 0x0e, 0x18, 0x00, 0xff,
+ 0x00, 0x1f, 0x00, 0x02, 0x02, 0x0f, 0x4f, 0x01, 0xd5, 0xe2, 0xf1, 0xa0,
+ 0xef, 0xc2, 0x02, 0x0b,
+ 0x0b, 0x0e, 0x0f, 0x00, 0x00, 0xd5, 0x30, 0x71, 0x4f, 0xf0, 0xf2, 0x04,
+ 0x43, 0x01, 0xf1, 0x01,
+ 0x60, 0x10, 0x02, 0xc0, 0x0f, 0xed, 0xec, 0xec, 0xec, 0xee, 0xf0, 0xd6,
+ 0xd0, 0x1b, 0x1f, 0xf0,
+ 0xd3, 0x70, 0x7f, 0x10, 0x06, 0x1f, 0x2c, 0x3e, 0xf0, 0xfe, 0x0c, 0x2e,
+ 0x30, 0xe0, 0xfe, 0xf9,
+ 0xf0, 0xa0, 0xe2, 0xe4, 0xd3, 0xc1, 0x11, 0x11, 0xe0, 0x15, 0x42, 0x54,
+ 0x55, 0x12, 0x01, 0x10,
+ 0x4e, 0x5f, 0x40, 0x01, 0xde, 0xec, 0x0f, 0x10, 0xd0, 0xde, 0x6f, 0x50,
+ 0x2e, 0x0c, 0x06, 0xe5,
+ 0xe0, 0xc0, 0xef, 0xe0, 0xe5, 0xe1, 0x00, 0x2d, 0x20, 0x51, 0x41, 0x10,
+ 0x19, 0x10, 0x30, 0x04,
+ 0xd5, 0x10, 0x41, 0x00, 0xce, 0xce, 0xed, 0xf0, 0xef, 0xd9, 0xc0, 0xbf,
+ 0xdf, 0xff, 0xed, 0xcd,
+ 0xcf, 0xf0, 0x02, 0x03, 0xd1, 0x8f, 0x02, 0x07, 0x26, 0x21, 0x30, 0x70,
+ 0x2d, 0x01, 0x00, 0x2e,
+ 0x1d, 0x0c, 0x21, 0x32, 0x72, 0x2c, 0xfe, 0xc0, 0xe2, 0xe5, 0xe0, 0xde,
+ 0xed, 0xf0, 0xf3, 0x32,
+ 0x1f, 0xcb, 0xed, 0x18, 0x4d, 0x7f, 0x11, 0x35, 0x10, 0xef, 0xfd, 0xe0,
+ 0xff, 0xd0, 0xff, 0xf0,
+ 0xd1, 0xb7, 0x00, 0x50, 0x0e, 0x00, 0x54, 0x14, 0xf3, 0xe0, 0xff, 0x1e,
+ 0x20, 0x10, 0x2c, 0x4b,
+ 0x70, 0x1e, 0x0e, 0x1e, 0x35, 0x03, 0xd0, 0xef, 0xb3, 0xc3, 0xdf, 0xe0,
+ 0x00, 0xd4, 0xff, 0x0d,
+ 0x10, 0xe4, 0x0e, 0x3d, 0xcd, 0xbc, 0xe0, 0x06, 0x37, 0x34, 0x20, 0x3e,
+ 0x0f, 0xb1, 0x25, 0x72,
+ 0x22, 0x10, 0xde, 0x2e, 0x3e, 0xc0, 0xb2, 0xff, 0xee, 0x0d, 0xf8, 0xde,
+ 0xdd, 0xf0, 0x0f, 0x10,
+ 0xef, 0xf1, 0xd2, 0xe0, 0x3d, 0x4c, 0x3d, 0x79, 0x70, 0x10, 0x02, 0xe2,
+ 0x0e, 0x1c, 0x1f, 0x0c,
+ 0xf0, 0x02, 0xf0, 0xb0, 0xc4, 0xd5, 0xf5, 0x01, 0x02, 0x53, 0x22, 0x44,
+ 0x31, 0x12, 0x00, 0xdd,
+ 0x0f, 0xee, 0x00, 0x20, 0x1d, 0x70, 0x37, 0x5d, 0x28, 0x20, 0x1f, 0x0f,
+ 0x00, 0x20, 0xe4, 0x84,
+ 0xd1, 0x10, 0xef, 0xaf, 0xff, 0xfd, 0x02, 0x00, 0x0d, 0x0f, 0x01, 0x03,
+ 0x30, 0x4f, 0x22, 0x37,
+ 0x31, 0x2c, 0xfe, 0x8e, 0xc1, 0x00, 0xff, 0x02, 0x26, 0x00, 0x0d, 0xc8,
+ 0xe0, 0xcf, 0xf0, 0xef,
+ 0xed, 0x00, 0x03, 0x22, 0x04, 0xb1, 0xef, 0xfc, 0x00, 0xd0, 0x33, 0x72,
+ 0x44, 0x20, 0x20, 0x4b,
+ 0x2d, 0x4e, 0x2b, 0x20, 0x00, 0x12, 0x00, 0xdd, 0xea, 0x0e, 0xfb, 0x8f,
+ 0x80, 0x03, 0x04, 0x00,
+ 0xfd, 0x0d, 0x4f, 0x10, 0x22, 0x00, 0x29, 0xf0, 0xf2, 0xf2, 0x0e, 0x0c,
+ 0xe0, 0xb0, 0x04, 0x21,
+ 0x00, 0x00, 0x06, 0xc4, 0xf3, 0x10, 0x30, 0xff, 0x8e, 0xe0, 0x03, 0x1d,
+ 0x2d, 0x2d, 0x60, 0x0f,
+ 0x1e, 0x0d, 0x20, 0x17, 0x07, 0x22, 0x00, 0x01, 0x00, 0x31, 0xe0, 0xa2,
+ 0x05, 0x03, 0x00, 0xed,
+ 0xbb, 0xe0, 0x00, 0x50, 0x00, 0xf5, 0xe0, 0x0c, 0xe0, 0xf0, 0x01, 0x70,
+ 0x50, 0x02, 0x14, 0xf2,
+ 0xd1, 0xd0, 0xe0, 0x2f, 0x3e, 0x1b, 0xcc, 0xe0, 0x02, 0xb6, 0xd1, 0xe1,
+ 0x1f, 0x4c, 0x20, 0x00,
+ 0x30, 0x00, 0xef, 0xae, 0xeb, 0xee, 0xf0, 0x50, 0x63, 0x2e, 0x4b, 0x10,
+ 0x2b, 0xee, 0xbf, 0xfa,
+ 0xfe, 0x00, 0x01, 0x05, 0xd1, 0x02, 0x30, 0x5e, 0xf1, 0xf2, 0x06, 0x31,
+ 0x00, 0xd0, 0x01, 0xd1,
+ 0xb1, 0xf4, 0x11, 0x7e, 0x5a, 0x1f, 0x20, 0x1f, 0x00, 0x0f, 0xd1, 0x02,
+ 0x53, 0x25, 0x00, 0xef,
+ 0xbe, 0xd0, 0xe3, 0xc0, 0xfa, 0x0f, 0x30, 0x0d, 0x3f, 0x20, 0xbe, 0xe8,
+ 0xfe, 0xfd, 0x0f, 0x11,
+ 0x00, 0x12, 0x04, 0xb4, 0xff, 0xc9, 0x10, 0x41, 0xd0, 0xa0, 0xf3, 0x05,
+ 0xf0, 0xbb, 0x0f, 0xf1,
+ 0x02, 0xc2, 0xe2, 0xe1, 0xfe, 0x0f, 0x31, 0x14, 0x10, 0x3e, 0x6f, 0x10,
+ 0x20, 0x4d, 0x49, 0x4f,
+ 0x4e, 0x5e, 0x10, 0x12, 0x1c, 0x0b, 0xf0, 0xc0, 0xf1, 0xe0, 0xdf, 0xeb,
+ 0xe0, 0x1d, 0x42, 0x56,
+ 0x02, 0x02, 0x21, 0x00, 0x3e, 0x1a, 0xef, 0xc0, 0xf0, 0x01, 0xfd, 0x2a,
+ 0x5e, 0x3d, 0x21, 0xf3,
+ 0xa0, 0xe0, 0xc6, 0xf0, 0x00, 0xee, 0xe0, 0xe0, 0x52, 0x33, 0x2d, 0x0f,
+ 0x21, 0x02, 0x0d, 0x7c,
+ 0x40, 0x32, 0x12, 0x07, 0xd5, 0xd2, 0xd1, 0xf2, 0x32, 0x7e, 0x2f, 0xf4,
+ 0xf5, 0xc0, 0xd0, 0xbf,
+ 0xe2, 0xf0, 0xed, 0x0a, 0x2f, 0x1f, 0xd0, 0x91, 0xff, 0xff, 0x00, 0x11,
+ 0x73, 0x57, 0x03, 0x15,
+ 0x20, 0xff, 0xfc, 0xd0, 0x01, 0xf3, 0xe3, 0x05, 0x50, 0x1f, 0x0a, 0x80,
+ 0xfe, 0xff, 0xf0, 0xd0,
+ 0xff, 0xfe, 0x01, 0x07, 0x20, 0x3f, 0x2d, 0x70, 0x60, 0x0f, 0x2d, 0xfd,
+ 0xec, 0xed, 0xee, 0x00,
+ 0x00, 0x0f, 0x48, 0x50, 0x10, 0xf3, 0xe2, 0xe2, 0x07, 0x13, 0x11, 0x22,
+ 0x24, 0xe1, 0xa1, 0xff,
+ 0xfd, 0x0f, 0x2e, 0x3b, 0x10, 0x72, 0x64, 0x01, 0x20, 0x1d, 0x1c, 0x00,
+ 0xd2, 0xe0, 0x01, 0x06,
+ 0xd0, 0xce, 0xfd, 0xde, 0xdf, 0xe0, 0x03, 0x05, 0xf1, 0x00, 0x4d, 0x3e,
+ 0x70, 0x26, 0x42, 0x12,
+ 0x04, 0xf1, 0xd1, 0xf0, 0xe1, 0x07, 0x12, 0x30, 0xfe, 0xca, 0xdf, 0x8f,
+ 0xef, 0xf1, 0xf2, 0x01,
+ 0xff, 0xda, 0xef, 0xaf, 0xc2, 0xe4, 0xd0, 0xfc, 0xdf, 0x0e, 0x01, 0x11,
+ 0x70, 0x74, 0x13, 0x2e,
+ 0x1b, 0x30, 0x00, 0xe0, 0x13, 0x02, 0x0e, 0xc9, 0xfd, 0xfc, 0xde, 0xdc,
+ 0x2f, 0x72, 0x25, 0xf3,
+ 0xc2, 0xfe, 0x0c, 0x0f, 0x1f, 0x2c, 0x5d, 0x1e, 0xdc, 0xdf, 0xee, 0x0f,
+ 0x5d, 0xfd, 0xff, 0xfd,
+ 0xff, 0xd7, 0xb7, 0xe1, 0xf0, 0xd0, 0x00, 0x2f, 0x60, 0x11, 0x04, 0x00,
+ 0x4d, 0x1c, 0xf0, 0xf0,
+ 0x3d, 0x7d, 0x54, 0xf3, 0xf0, 0x10, 0x25, 0xf1, 0xcf, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x1d, 0x00,
+ 0x6a, 0x25, 0x10, 0x15, 0x9e, 0x24, 0xa3, 0x15, 0x0e, 0x3c, 0xf9, 0x8f,
+ 0xcd, 0xdd, 0xcf, 0xef,
+ 0xf1, 0x02, 0x44, 0x00, 0xf1, 0xf4, 0xf0, 0x06, 0x22, 0x22, 0x21, 0x10,
+ 0xff, 0xb7, 0x03, 0x63,
+ 0x0e, 0x2d, 0x5e, 0x31, 0x26, 0xd0, 0x80, 0xfd, 0xe0, 0xd0, 0x00, 0x0f,
+ 0x0e, 0x0e, 0x3f, 0x4d,
+ 0x0c, 0xfb, 0x0e, 0x0f, 0x51, 0x14, 0x21, 0x10, 0x1f, 0x1b, 0x0e, 0xfc,
+ 0xef, 0x0d, 0x60, 0x40,
+ 0x26, 0x32, 0x00, 0xd2, 0xe1, 0xc3, 0xf7, 0xc2, 0xd1, 0xd0, 0xc0, 0xf0,
+ 0x15, 0x72, 0x1f, 0x1e,
+ 0x6f, 0x10, 0x1c, 0x1f, 0x30, 0x45, 0x21, 0x20, 0x1f, 0x1e, 0xe3, 0xc5,
+ 0xf3, 0xf0, 0xe1, 0xef,
+ 0xeb, 0xbd, 0xef, 0xdf, 0xcc, 0xc0, 0x00, 0xee, 0xe0, 0x15, 0x71, 0x42,
+ 0x11, 0x06, 0x03, 0x14,
+ 0x0f, 0xfc, 0xdf, 0xf0, 0x01, 0x20, 0xf0, 0xfa, 0xde, 0xcd, 0xb0, 0xf0,
+ 0xec, 0xfe, 0xa0, 0xd2,
+ 0xb1, 0xd2, 0xd4, 0xed, 0xeb, 0x00, 0x74, 0x22, 0x2d, 0x23, 0xf7, 0x05,
+ 0x1f, 0x1d, 0x5e, 0x10,
+ 0x31, 0x00, 0x12, 0x00, 0x00, 0xef, 0x0b, 0x1f, 0x0f, 0xf0, 0x00, 0xed,
+ 0x91, 0xf5, 0xdc, 0xec,
+ 0xde, 0x00, 0x70, 0x3f, 0x3b, 0x20, 0x2e, 0x0e, 0xfc, 0xe0, 0x07, 0xf1,
+ 0xe0, 0x11, 0x50, 0xf1,
+ 0xa2, 0xe2, 0xc1, 0xf5, 0x03, 0x2f, 0x4d, 0x21, 0x31, 0x50, 0xfe, 0xcd,
+ 0xfd, 0x3c, 0x4c, 0x12,
+ 0x47, 0x15, 0x00, 0xd0, 0x12, 0x21, 0x50, 0x20, 0x00, 0xd3, 0xb5, 0xe3,
+ 0xe1, 0x0f, 0x2d, 0x40,
+ 0x03, 0x50, 0x3a, 0xe0, 0xcd, 0xdd, 0xdc, 0xed, 0xf2, 0x07, 0x65, 0x21,
+ 0x50, 0x1e, 0x00, 0x20,
+ 0x0f, 0xde, 0xe0, 0x00, 0xe0, 0xa3, 0xe0, 0xdd, 0xcd, 0xe0, 0xed, 0x0d,
+ 0xf3, 0x07, 0x13, 0x40,
+ 0x41, 0x10, 0xfe, 0x0b, 0x4f, 0x00, 0x01, 0xcc, 0xfe, 0xfd, 0x3f, 0x3c,
+ 0x7e, 0x6a, 0x1e, 0x0d,
+ 0xf0, 0x05, 0x02, 0x06, 0x00, 0xfd, 0xbe, 0xd0, 0xd1, 0xc5, 0xe2, 0xe1,
+ 0xe1, 0x0f, 0x3d, 0x70,
+ 0x33, 0x55, 0x23, 0x11, 0x1e, 0x0f, 0x24, 0x10, 0x1e, 0x3d, 0x10, 0x04,
+ 0xd0, 0x9f, 0xfa, 0xd0,
+ 0xf0, 0xdf, 0x0f, 0xfe, 0xef, 0x0c, 0xbd, 0xee, 0x0f, 0x70, 0x5f, 0x0a,
+ 0xed, 0x01, 0xf6, 0xe0,
+ 0xf1, 0x01, 0x00, 0x20, 0x70, 0x00, 0x1e, 0xe1, 0xf7, 0xe7, 0xc1, 0xfe,
+ 0xed, 0x9f, 0xef, 0xe1,
+ 0xf1, 0xe0, 0xf0, 0x10, 0x01, 0x20, 0x16, 0x23, 0x60, 0x4e, 0x10, 0x21,
+ 0xde, 0x08, 0xef, 0x0e,
+ 0x1e, 0x3e, 0x7d, 0x2c, 0x0d, 0xeb, 0x00, 0xd2, 0x01, 0xe0, 0xe1, 0x45,
+ 0x60, 0x11, 0x0d, 0xaf,
+ 0xf2, 0xf1, 0xfd, 0x08, 0x30, 0x1f, 0x10, 0x02, 0xf1, 0x00, 0x10, 0x0e,
+ 0xe0, 0x24, 0x35, 0x05,
+ 0xb2, 0xd0, 0xfc, 0x1d, 0x3f, 0x1f, 0x4f, 0x0d, 0x00, 0xf0, 0xe0, 0xce,
+ 0xf1, 0x77, 0x53, 0x35,
+ 0x51, 0x00, 0xfd, 0xff, 0xf2, 0xf0, 0xef, 0xf1, 0x17, 0x27, 0xff, 0xee,
+ 0x10, 0x30, 0xf0, 0xff,
+ 0xf0, 0xc0, 0xb0, 0xc0, 0xf0, 0xe3, 0xf2, 0xb0, 0xfe, 0x0a, 0x2f, 0x51,
+ 0x03, 0x00, 0x31, 0x77,
+ 0x10, 0x1f, 0x0f, 0xe2, 0xd3, 0xd0, 0x00, 0xc0, 0xf5, 0xff, 0xff, 0xd1,
+ 0xf2, 0xc1, 0xe0, 0x33,
+ 0x07, 0x11, 0x0f, 0xfe, 0x2e, 0x2b, 0x3f, 0x1b, 0x3e, 0x40, 0x3e, 0x2b,
+ 0x6c, 0x4f, 0x0f, 0x0d,
+ 0x00, 0x31, 0xd0, 0x81, 0xd2, 0x06, 0x01, 0x00, 0xb0, 0xf2, 0x01, 0x11,
+ 0x33, 0x17, 0xff, 0x2e,
+ 0x50, 0x00, 0x15, 0x03, 0x44, 0x42, 0x4f, 0x1f, 0x40, 0x20, 0x0e, 0xf0,
+ 0xc6, 0xe2, 0xed, 0xfc,
+ 0xcf, 0xdc, 0xdf, 0x0d, 0x10, 0x14, 0x14, 0xd2, 0xf1, 0x02, 0x26, 0xf0,
+ 0xb1, 0x10, 0x7f, 0x42,
+ 0x24, 0x10, 0x2c, 0x30, 0x04, 0x12, 0x10, 0x5e, 0x0e, 0x0e, 0x8f, 0xd0,
+ 0xde, 0xee, 0xee, 0x0b,
+ 0x0d, 0xfe, 0xe0, 0xe0, 0xc3, 0xf5, 0xf0, 0x20, 0x62, 0x27, 0x43, 0x00,
+ 0x10, 0x2f, 0x0b, 0x0f,
+ 0x0e, 0x3f, 0x40, 0x00, 0xde, 0xee, 0x0e, 0x0a, 0x1f, 0x0d, 0x3f, 0x22,
+ 0xd7, 0xb6, 0x10, 0x0f,
+ 0x0f, 0xcf, 0x5e, 0x60, 0x20, 0x1e, 0x0c, 0xfd, 0xfe, 0xd0, 0xcd, 0xff,
+ 0x02, 0x17, 0x42, 0x2e,
+ 0x0c, 0x80, 0x01, 0x04, 0x00, 0xdf, 0xcd, 0x10, 0x02, 0x27, 0x02, 0x7f,
+ 0x2c, 0x0e, 0xf0, 0x01,
+ 0xf2, 0xf1, 0x17, 0x67, 0x00, 0x20, 0x0f, 0x20, 0xe0, 0x0f, 0xf0, 0xf0,
+ 0x0c, 0xef, 0xfd, 0xde,
+ 0xbd, 0x8e, 0xe0, 0xf1, 0xe3, 0xc3, 0xf5, 0xf0, 0x0e, 0x20, 0x47, 0x52,
+ 0x13, 0xf1, 0x02, 0x04,
+ 0x10, 0x00, 0x00, 0x01, 0xe2, 0x03, 0x05, 0xc1, 0xe3, 0x01, 0x3d, 0x3b,
+ 0x01, 0x23, 0x04, 0x91,
+ 0xe0, 0xfa, 0xeb, 0xed, 0xdf, 0x00, 0x20, 0x0d, 0x2e, 0x50, 0x6e, 0x4d,
+ 0x2b, 0x3b, 0x2e, 0xff,
+ 0x02, 0x13, 0xf3, 0xc1, 0xd0, 0xee, 0xdc, 0xe0, 0x05, 0xe6, 0xb2, 0xf0,
+ 0xe1, 0xde, 0xef, 0x5e,
+ 0x60, 0x20, 0x42, 0x42, 0x24, 0x04, 0x00, 0x02, 0x12, 0xf0, 0xf0, 0x0c,
+ 0x48, 0x20, 0x00, 0xa0,
+ 0x00, 0xd0, 0x11, 0x01, 0x52, 0x11, 0x04, 0xb1, 0xde, 0xe1, 0xf7, 0xc3,
+ 0x0f, 0x0e, 0x30, 0x67,
+ 0x22, 0x01, 0x00, 0x0f, 0x1e, 0x3e, 0x31, 0x35, 0x02, 0x9f, 0x0b, 0xfd,
+ 0xad, 0xf0, 0xed, 0xfd,
+ 0xd0, 0xe2, 0xd3, 0xe4, 0xff, 0xde, 0xf0, 0x25, 0x71, 0x33, 0x21, 0xff,
+ 0xee, 0xfb, 0x0e, 0x50,
+ 0x34, 0x5c, 0x1c, 0x1e, 0x0e, 0x11, 0xf3, 0xb0, 0xfc, 0xef, 0xd2, 0x06,
+ 0x02, 0x41, 0x0f, 0x6c,
+ 0x1d, 0x08, 0xff, 0x0f, 0xfe, 0xe0, 0x00, 0x05, 0x71, 0x31, 0x2e, 0x0c,
+ 0x00, 0x1f, 0x01, 0xe2,
+ 0xe0, 0xcf, 0xa0, 0xf1, 0x02, 0xf3, 0xd0, 0x0c, 0x0e, 0x3e, 0x30, 0xd0,
+ 0x22, 0x77, 0x70, 0x0e,
+ 0x00, 0xe0, 0xf2, 0x03, 0x03, 0x11, 0x3e, 0x61, 0x22, 0x01, 0x21, 0xf4,
+ 0xe5, 0xe3, 0xdf, 0xda,
+ 0x00, 0xe3, 0xc0, 0xee, 0xc0, 0xe3, 0xc0, 0xfe, 0x00, 0x53, 0x47, 0x15,
+ 0x40, 0x13, 0x02, 0x0f,
+ 0x00, 0x2f, 0xfe, 0xde, 0xfe, 0xd0, 0xd0, 0xe1, 0x24, 0x0e, 0xfb, 0xd1,
+ 0xf6, 0xb2, 0xe2, 0xe1,
+ 0xa0, 0xef, 0xb0, 0xe0, 0xfc, 0xfd, 0x1a, 0x4e, 0x4e, 0x3f, 0x1a, 0x0f,
+ 0x0e, 0x21, 0x2f, 0x6c,
+ 0x30, 0x4f, 0x10, 0x0f, 0xd1, 0x87, 0x04, 0xee, 0xed, 0xf0, 0xf0, 0xee,
+ 0x0d, 0xfe, 0xd0, 0xf0,
+ 0x14, 0x40, 0x60, 0x37, 0x36, 0x00, 0xf2, 0x0f, 0x1f, 0x00, 0x00, 0x53,
+ 0x30, 0x13, 0x2f, 0x08,
+ 0xef, 0x10, 0x00, 0xb0, 0xc0, 0x0e, 0x32, 0xf3, 0x9f, 0xfc, 0xde, 0x0c,
+ 0x1e, 0x4f, 0x11, 0x10,
+ 0xfb, 0xf0, 0x00, 0xf2, 0x6c, 0x4d, 0x10, 0x10, 0x00, 0xf1, 0x8e, 0xd9,
+ 0x0f, 0xb2, 0xf5, 0x00,
+ 0xe0, 0xf3, 0xf7, 0xf0, 0x0f, 0x01, 0xf2, 0xb0, 0xef, 0x02, 0x13, 0x73,
+ 0x1e, 0x3d, 0x0d, 0x2b,
+ 0x0b, 0x0e, 0xce, 0x0e, 0x0e, 0xf1, 0x07, 0xe0, 0x1e, 0x5f, 0x21, 0x30,
+ 0xec, 0x00, 0xff, 0x02,
+ 0x03, 0xf1, 0x3f, 0x2d, 0x72, 0x3f, 0x19, 0xff, 0xdf, 0x20, 0x12, 0x1e,
+ 0x1e, 0x0f, 0xf1, 0xf7,
+ 0xc7, 0xa0, 0xee, 0xf0, 0x1f, 0x2f, 0x50, 0x21, 0x11, 0x2f, 0x0e, 0xd1,
+ 0x01, 0xe0, 0xed, 0x57,
+ 0x53, 0x1e, 0x0f, 0x11, 0x31, 0x5f, 0x4e, 0x22, 0x05, 0x02, 0x04, 0x04,
+ 0xc0, 0xdd, 0xde, 0x0e,
+ 0x80, 0xee, 0xe1, 0xd6, 0xff, 0xff, 0x01, 0x14, 0x20, 0x4e, 0x32, 0x44,
+ 0x2f, 0x6d, 0x00, 0x05,
+ 0xd2, 0xad, 0x08, 0x0f, 0x00, 0x40, 0x1e, 0x40, 0xf1, 0xc6, 0x02, 0xc1,
+ 0x02, 0x05, 0x10, 0xf0,
+ 0xa1, 0x04, 0x12, 0xe0, 0xdd, 0xe0, 0xf0, 0x40, 0x4f, 0x1d, 0x0d, 0x0c,
+ 0x18, 0x2c, 0x2e, 0x4e,
+ 0x51, 0x31, 0x12, 0xee, 0xcf, 0xee, 0xdb, 0xcf, 0xbe, 0x01, 0x02, 0xf1,
+ 0xe0, 0x00, 0x20, 0x1d,
+ 0x36, 0x54, 0x42, 0x23, 0x03, 0x35, 0x23, 0x10, 0x0f, 0x5e, 0x40, 0x44,
+ 0x10, 0x20, 0x01, 0x04,
+ 0xe1, 0xdb, 0xbe, 0x11, 0x35, 0xe0, 0xde, 0xfe, 0x90, 0xe1, 0xcd, 0xdc,
+ 0xe3, 0xf6, 0x33, 0x76,
+ 0x51, 0x14, 0x10, 0x1e, 0x30, 0x20, 0x00, 0xf0, 0xf0, 0x03, 0x5f, 0x08,
+ 0x0e, 0x00, 0xef, 0xad,
+ 0xff, 0xc0, 0xe0, 0xc2, 0xd6, 0xe0, 0xe1, 0x03, 0x2f, 0x2c, 0x0d, 0x0d,
+ 0x0f, 0xdd, 0xdb, 0x1e,
+ 0x7e, 0x4f, 0x0e, 0xe2, 0x27, 0x14, 0xe0, 0xf0, 0x30, 0x1f, 0xd0, 0x43,
+ 0x42, 0xd1, 0x80, 0x0f,
+ 0x0e, 0x0c, 0xfe, 0x39, 0x5e, 0x20, 0xf4, 0x00, 0x2f, 0x2b, 0xf0, 0x00,
+ 0x42, 0xdf, 0x8d, 0x00,
+ 0x05, 0x00, 0xde, 0xf9, 0xff, 0xff, 0xf0, 0x00, 0x10, 0x42, 0x00, 0x12,
+ 0x03, 0x90, 0x00, 0x1d,
+ 0x2d, 0x00, 0x37, 0x72, 0x20, 0x0c, 0x10, 0x22, 0x60, 0x33, 0x54, 0x0d,
+ 0xd8, 0xfe, 0xd2, 0xe3,
+ 0xce, 0xcb, 0x0f, 0x1f, 0x10, 0x01, 0xe0, 0xe3, 0xe2, 0xf0, 0xd2, 0xe3,
+ 0x01, 0x70, 0x22, 0x15,
+ 0x12, 0x00, 0xee, 0x1f, 0x7f, 0x56, 0x05, 0xf1, 0x02, 0x00, 0xbf, 0xe3,
+ 0x05, 0xf0, 0x00, 0xf3,
+ 0x07, 0x42, 0xee, 0x9b, 0xf0, 0x0e, 0x2e, 0x00, 0x0c, 0x1f, 0x0d, 0x3e,
+ 0x5f, 0x40, 0x0e, 0x2d,
+ 0x0f, 0x0f, 0xc0, 0xf2, 0xe3, 0xdf, 0xb0, 0xf0, 0x04, 0xe2, 0xdf, 0x0c,
+ 0x0e, 0x00, 0xf5, 0xb4,
+ 0x12, 0x2e, 0x30, 0x57, 0x47, 0x50, 0x1f, 0x10, 0x21, 0x21, 0x01, 0xdf,
+ 0x0f, 0x50, 0x40, 0x21,
+ 0x13, 0x1d, 0x29, 0x0f, 0xaf, 0xff, 0xf0, 0xd1, 0xb4, 0xf2, 0xf0, 0x0c,
+ 0x00, 0x41, 0x00, 0x00,
+ 0xf3, 0xf7, 0xe4, 0xf0, 0x62, 0x60, 0x2f, 0x1e, 0x1e, 0x2f, 0x0e, 0xec,
+ 0xdd, 0xee, 0x9a, 0xea,
+ 0x00, 0xe1, 0xd1, 0x91, 0xf0, 0xe0, 0xf2, 0x0e, 0xfc, 0x0e, 0x00, 0x36,
+ 0x21, 0x00, 0x10, 0x5e,
+ 0x2f, 0x1e, 0x1f, 0x12, 0x46, 0x10, 0x10, 0xe2, 0xc1, 0xdf, 0xfd, 0xe2,
+ 0xc3, 0xe2, 0x00, 0x20,
+ 0x5e, 0x08, 0x0d, 0xfd, 0x7e, 0x4d, 0x0d, 0x00, 0x2f, 0xed, 0xd0, 0xd3,
+ 0x2f, 0x2d, 0x01, 0x41,
+ 0x2f, 0x72, 0x05, 0xbf, 0x0c, 0x00, 0x12, 0x01, 0x0c, 0x1e, 0x13, 0xa2,
+ 0xce, 0xed, 0xd2, 0xf4,
+ 0xfe, 0x2f, 0x70, 0x46, 0x11, 0x01, 0x11, 0x10, 0x20, 0x03, 0x17, 0x12,
+ 0xf0, 0xcc, 0xdf, 0x00,
+ 0xf2, 0xd1, 0x00, 0x30, 0x77, 0x36, 0xd1, 0xef, 0x0e, 0x20, 0xe2, 0x01,
+ 0x72, 0x0f, 0xff, 0x13,
+ 0x23, 0x01, 0x0c, 0x1f, 0x5f, 0x0f, 0x3f, 0x44, 0x37, 0xe1, 0xe3, 0x20,
+ 0x13, 0xe0, 0xa4, 0xd1,
+ 0xb1, 0xd3, 0xe3, 0xe0, 0xce, 0xc0, 0xfa, 0x0e, 0x5f, 0x10, 0x40, 0x09,
+ 0x0e, 0x10, 0x40, 0x3f,
+ 0x1c, 0x0e, 0x0f, 0x00, 0x14, 0x20, 0xdd, 0x89, 0xef, 0xf0, 0xef, 0xc1,
+ 0xe6, 0x02, 0x20, 0x0d,
+ 0x0c, 0x10, 0x70, 0x1f, 0xfe, 0xe0, 0xf1, 0xe4, 0x01, 0x54, 0x40, 0x61,
+ 0x13, 0x22, 0x05, 0xf5,
+ 0x03, 0x00, 0x0d, 0x00, 0x14, 0x22, 0xde, 0x89, 0xff, 0x0e, 0x10, 0xe0,
+ 0xdf, 0x1f, 0x01, 0xf7,
+ 0x02, 0x30, 0x40, 0xf0, 0x3c, 0x7e, 0x5e, 0xfc, 0xed, 0x0d, 0x00, 0x01,
+ 0xf0, 0xcd, 0xd0, 0xe3,
+ 0x91, 0xf3, 0xf4, 0x03, 0xe5, 0x02, 0xd2, 0xf0, 0xd1, 0xf1, 0xf0, 0xf3,
+ 0x10, 0x50, 0x10, 0x14,
+ 0x0b, 0x0b, 0x70, 0x61, 0x13, 0x10, 0x02, 0xf1, 0xfd, 0xcd, 0x0c, 0xed,
+ 0xfc, 0x0e, 0x0a, 0x20,
+ 0x10, 0x02, 0x11, 0x1c, 0x4d, 0x5f, 0x40, 0x51, 0x10, 0x14, 0x0e, 0xda,
+ 0xff, 0xd0, 0x00, 0x22,
+ 0x72, 0x3f, 0x0d, 0xfe, 0xed, 0xee, 0x0e, 0x2f, 0xcf, 0xbe, 0xe0, 0x00,
+ 0xbb, 0xea, 0xee, 0x10,
+ 0x10, 0x43, 0x62, 0x34, 0x00, 0x10, 0x23, 0x23, 0x3f, 0xec, 0x02, 0x07,
+ 0x00, 0xef, 0x10, 0x24,
+ 0x93, 0xdf, 0xec, 0xf1, 0xf2, 0xf2, 0x03, 0xf4, 0xb6, 0x03, 0xf0, 0x2f,
+ 0x30, 0x12, 0x40, 0x75,
+ 0xff, 0xc9, 0x00, 0x3f, 0x10, 0x2f, 0x1e, 0x2f, 0x31, 0x06, 0xd2, 0xa1,
+ 0x01, 0xd0, 0xc3, 0xe5,
+ 0xd2, 0xe2, 0xc2, 0xcf, 0xfb, 0x0f, 0x1d, 0xcf, 0xdb, 0x0f, 0x0e, 0xc2,
+ 0x27, 0x70, 0x7f, 0x4e,
+ 0x0e, 0xef, 0xff, 0x00, 0xf0, 0xeb, 0xef, 0x00, 0x1f, 0x1e, 0x0d, 0x0d,
+ 0x11, 0xc6, 0xd1, 0xf0,
+ 0x0d, 0xe0, 0xc2, 0xf3, 0x33, 0x67, 0x22, 0x30, 0x70, 0x2f, 0x00, 0xf2,
+ 0x04, 0x64, 0x25, 0x02,
+ 0x00, 0x10, 0x0c, 0x10, 0x0f, 0x2f, 0x0d, 0xfd, 0xdc, 0xcf, 0xbf, 0xd0,
+ 0xf2, 0xc2, 0xf2, 0xf4,
+ 0x03, 0x66, 0x22, 0x21, 0x22, 0x10, 0x2f, 0x3c, 0x62, 0x21, 0x0d, 0x00,
+ 0x13, 0x01, 0xbf, 0xdc,
+ 0xee, 0x0f, 0xf0, 0xe4, 0x97, 0xe7, 0xd0, 0xcf, 0xd0, 0xde, 0x0f, 0x0e,
+ 0x41, 0x10, 0x10, 0xfd,
+ 0xbf, 0x1f, 0x0e, 0x0d, 0x24, 0x56, 0x00, 0x03, 0xe0, 0xcd, 0x0d, 0x02,
+ 0x10, 0x00, 0xca, 0x1f,
+ 0x71, 0x71, 0x0d, 0xeb, 0x00, 0x30, 0x00, 0x02, 0xe1, 0xe0, 0x0c, 0xda,
+ 0x0f, 0x00, 0x60, 0x20,
+ 0x20, 0xff, 0x00, 0x3d, 0x0b, 0xac, 0xde, 0xde, 0xd9, 0x9e, 0xee, 0xf1,
+ 0xe0, 0x00, 0xf1, 0x12,
+ 0x32, 0x51, 0x26, 0x33, 0x01, 0x40, 0x23, 0x24, 0x41, 0x3b, 0x0e, 0x10,
+ 0x10, 0x45, 0xfd, 0xbc,
+ 0xd0, 0xe0, 0x0d, 0x0f, 0xbe, 0x00, 0x02, 0xf0, 0xc1, 0x02, 0xcb, 0xfa,
+ 0xe0, 0xbe, 0xf1, 0xd3,
+ 0xf1, 0x01, 0x72, 0x40, 0x2a, 0x20, 0x03, 0x02, 0x04, 0xd4, 0x07, 0x02,
+ 0x31, 0x10, 0xa0, 0xe0,
+ 0xe2, 0xd0, 0x90, 0xd1, 0xe1, 0xfe, 0x0e, 0x00, 0x2f, 0x62, 0x34, 0x2d,
+ 0x0b, 0x1e, 0x0b, 0x0d,
+ 0x0f, 0xff, 0x1f, 0x0d, 0x0e, 0x0f, 0x2b, 0xeb, 0xbf, 0x00, 0x00, 0x03,
+ 0xc0, 0xd1, 0xd1, 0xe6,
+ 0x03, 0xd0, 0xbc, 0x0f, 0x4f, 0x52, 0x13, 0x05, 0x36, 0x32, 0x1f, 0x60,
+ 0x27, 0x31, 0x41, 0x50,
+ 0x20, 0x30, 0xf0, 0xc0, 0x0b, 0xff, 0x0e, 0x10, 0x10, 0xd0, 0xc0, 0xc0,
+ 0xc1, 0x00, 0xee, 0xf0,
+ 0x37, 0x66, 0x20, 0x00, 0xe0, 0xd0, 0x10, 0x41, 0x3f, 0x50, 0x0d, 0x1f,
+ 0x33, 0xfd, 0xdb, 0xf1,
+ 0xe1, 0xf1, 0xfe, 0xdc, 0xbf, 0xbf, 0xc0, 0xdf, 0xd9, 0xef, 0xe0, 0xe0,
+ 0xee, 0x0e, 0x70, 0x10,
+ 0x10, 0x3f, 0x45, 0x14, 0x00, 0x03, 0xf6, 0xe1, 0xa1, 0xf3, 0xe1, 0xed,
+ 0xce, 0x1f, 0x40, 0x44,
+ 0x00, 0x00, 0x1e, 0x2f, 0x0d, 0xcb, 0xed, 0x0b, 0x0f, 0x0f, 0x0f, 0x0e,
+ 0x1d, 0x6d, 0x76, 0x12,
+ 0x20, 0x1f, 0xee, 0xed, 0xf2, 0xff, 0xec, 0xdd, 0xed, 0x0f, 0xeb, 0xa0,
+ 0xfd, 0xfe, 0x03, 0xf2,
+ 0x00, 0x10, 0x50, 0x27, 0x53, 0x23, 0x31, 0x33, 0x50, 0x3f, 0xfd, 0xd1,
+ 0xd2, 0xf0, 0xf0, 0x00,
+ 0x11, 0x5c, 0x2f, 0x30, 0x0f, 0x00, 0xe4, 0xe7, 0x05, 0x01, 0x01, 0x00,
+ 0x50, 0x22, 0x20, 0x1d,
+ 0xee, 0xbe, 0x10, 0x2d, 0xf9, 0x30, 0x70, 0x73, 0x13, 0x00, 0x0e, 0x0f,
+ 0xf0, 0xd7, 0xd3, 0xd3,
+ 0xd1, 0xb0, 0xe0, 0xc1, 0xe0, 0xf8, 0xff, 0xff, 0xef, 0x1e, 0x40, 0x43,
+ 0x27, 0x50, 0x01, 0xf0,
+ 0x0e, 0x00, 0x3e, 0x5f, 0x0f, 0x0f, 0x1f, 0xec, 0x8a, 0x0d, 0x0f, 0x03,
+ 0x04, 0x01, 0xfc, 0x0f,
+ 0xef, 0xc0, 0x00, 0x0f, 0xee, 0x00, 0x26, 0x54, 0xe1, 0xa0, 0xf0, 0x14,
+ 0x1d, 0x61, 0x47, 0x10,
+ 0x10, 0x0f, 0x10, 0x22, 0x20, 0x0b, 0x0e, 0x0f, 0x02, 0xf2, 0xed, 0xcc,
+ 0xde, 0x80, 0xf0, 0xd1,
+ 0x07, 0x04, 0x3e, 0x4f, 0x30, 0xf0, 0x10, 0x6d, 0x00, 0x2e, 0x00, 0x00,
+ 0x9a, 0x00, 0x19, 0x00,
+ 0xae, 0x35, 0xbd, 0x2e, 0xd3, 0x32, 0x38, 0x2e, 0x45, 0x33, 0x41, 0x20,
+ 0x4e, 0x2f, 0x22, 0x20,
+ 0x13, 0x07, 0x07, 0x04, 0xc1, 0xd3, 0xc3, 0xd4, 0xd3, 0xd4, 0xe4, 0xd4,
+ 0xc3, 0xd4, 0xd2, 0xd3,
+ 0xc2, 0xd3, 0xb4, 0xd3, 0xc2, 0xd3, 0xd5, 0xe2, 0xf2, 0x03, 0x03, 0x13,
+ 0x02, 0xf0, 0xaf, 0xdd,
+ 0xcb, 0xcc, 0xbb, 0xde, 0xdc, 0xce, 0xdd, 0xce, 0xfd, 0xfc, 0xfd, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0xfe,
+ 0xfe, 0x0d, 0x0b, 0xfc, 0xab, 0xcd, 0xcd, 0xbc, 0xcc, 0xdd, 0xcc, 0xde,
+ 0xed, 0xdc, 0xee, 0xfd,
+ 0xfc, 0xee, 0xee, 0xed, 0xed, 0xfd, 0x0c, 0x1d, 0x5c, 0x2c, 0x3c, 0x4d,
+ 0x3c, 0x3d, 0x2c, 0x2d,
+ 0x1e, 0x2d, 0x2f, 0x5f, 0x3f, 0x3e, 0x1e, 0xee, 0xdd, 0xbd, 0xad, 0xdb,
+ 0xce, 0xdd, 0xed, 0xdd,
+ 0xdb, 0xfc, 0x0d, 0x2b, 0x6e, 0x4d, 0x3d, 0x3d, 0x0c, 0x0d, 0x0c, 0xde,
+ 0xce, 0xce, 0xc0, 0xd0,
+ 0xa2, 0xd4, 0xd3, 0xd3, 0xb5, 0xe4, 0xe3, 0xf6, 0xf2, 0xd4, 0xd2, 0xd1,
+ 0xd2, 0xd2, 0xf1, 0x00,
+ 0x01, 0xf0, 0xf2, 0xf0, 0xcf, 0xcd, 0xda, 0xcd, 0xdc, 0xbc, 0xdc, 0xcc,
+ 0xbb, 0xcd, 0xdd, 0xcc,
+ 0xce, 0xdd, 0xcd, 0xdd, 0xdd, 0xee, 0xee, 0xdd, 0xff, 0x0e, 0x0f, 0x1d,
+ 0x2e, 0x3d, 0x4b, 0x3d,
+ 0x4c, 0x2c, 0x2c, 0x3d, 0x5d, 0x2d, 0x2d, 0x0e, 0x00, 0xef, 0xee, 0xdf,
+ 0xbf, 0xd0, 0xe0, 0xc4,
+ 0xc3, 0xe2, 0xe1, 0xf2, 0x11, 0x52, 0x67, 0x45, 0x33, 0x53, 0x36, 0x33,
+ 0x45, 0x32, 0x33, 0x43,
+ 0x23, 0x24, 0x13, 0x03, 0x02, 0x03, 0x15, 0x22, 0x22, 0x24, 0x45, 0x22,
+ 0x23, 0x14, 0x13, 0xf3,
+ 0xd2, 0xa4, 0xd3, 0xc5, 0xe2, 0xd3, 0xf3, 0x03, 0xf2, 0x02, 0x02, 0x04,
+ 0x02, 0xf4, 0x03, 0xe4,
+ 0xc4, 0xd2, 0xf2, 0xb3, 0xb3, 0xb4, 0xd1, 0xc3, 0xe3, 0xe3, 0x14, 0x43,
+ 0x65, 0x42, 0x42, 0x32,
+ 0x32, 0x23, 0x21, 0x20, 0x0e, 0x0c, 0xfb, 0xec, 0xec, 0xdc, 0xcc, 0xdd,
+ 0xbc, 0xbe, 0xdd, 0xdd,
+ 0xcf, 0xff, 0x00, 0x11, 0x10, 0x01, 0x20, 0x41, 0x40, 0x40, 0x3d, 0x5d,
+ 0x3c, 0x3c, 0x3c, 0x4c,
+ 0x3c, 0x6d, 0x2e, 0x3e, 0x2f, 0x2f, 0x1f, 0x0f, 0x0e, 0xcb, 0xdb, 0xcd,
+ 0xda, 0xdd, 0xed, 0xdb,
+ 0xdd, 0xed, 0xec, 0x1e, 0x3d, 0x5f, 0x3e, 0x4f, 0x3f, 0x20, 0x2f, 0x10,
+ 0x00, 0xe1, 0xe4, 0xc3,
+ 0x83, 0xd5, 0xd7, 0xb2, 0xb1, 0xf6, 0x03, 0xc1, 0xd0, 0xf1, 0x04, 0xf2,
+ 0xf2, 0xd0, 0xd0, 0xc0,
+ 0x03, 0x04, 0xe0, 0xe0, 0xe0, 0xde, 0xff, 0x22, 0x52, 0x0e, 0xfb, 0xfe,
+ 0x00, 0x21, 0xcd, 0x88,
+ 0xee, 0xdd, 0xf0, 0xce, 0x88, 0xed, 0x27, 0x00, 0x01, 0xef, 0x9b, 0x11,
+ 0x32, 0x00, 0xff, 0x0f,
+ 0x20, 0x20, 0x0f, 0x30, 0x73, 0x0d, 0xe9, 0xfe, 0x21, 0x32, 0x00, 0x0f,
+ 0xff, 0x00, 0x00, 0xbd,
+ 0x00, 0x67, 0x00, 0xef, 0x44, 0x10, 0xec, 0x42, 0x43, 0x00, 0x31, 0x22,
+ 0x0e, 0x20, 0x56, 0x22,
+ 0x11, 0x00, 0x12, 0x24, 0x00, 0x00, 0x23, 0x23, 0x00, 0xf0, 0x00, 0x13,
+ 0x02, 0xce, 0x03, 0x27,
+ 0x8e, 0xff, 0x27, 0x00, 0x9d, 0x12, 0x37, 0xef, 0xef, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x01, 0xe0,
+ 0xe0, 0xf2, 0xb0, 0xbe, 0xe0, 0xf0, 0xe1, 0xef, 0x13, 0x47, 0x01, 0xdd,
+ 0xed, 0x12, 0x42, 0x0f,
+ 0x21, 0x43, 0xda, 0x0f, 0x10, 0x0f, 0x00, 0x0e, 0xcc, 0xee, 0xf0, 0xdf,
+ 0xbd, 0xee, 0xb9, 0x21,
+ 0x21, 0x98, 0x00, 0x00, 0xfe, 0x31, 0x00, 0xcd, 0x32, 0x31, 0xdb, 0x20,
+ 0x71, 0x20, 0x1c, 0x30,
+ 0x40, 0x2e, 0x0d, 0x2d, 0x40, 0x67, 0x10, 0x00, 0xec, 0xff, 0x22, 0x01,
+ 0x00, 0x12, 0x10, 0x20,
+ 0x21, 0x1f, 0x74, 0x22, 0x0b, 0x0e, 0x52, 0x34, 0x31, 0x10, 0x1e, 0x1f,
+ 0x21, 0x33, 0x00, 0xed,
+ 0xf0, 0x07, 0x25, 0xd0, 0xb0, 0x03, 0x24, 0xf1, 0x8d, 0xce, 0x03, 0x27,
+ 0x01, 0xe0, 0xef, 0x11,
+ 0x12, 0x00, 0x13, 0x44, 0x22, 0x10, 0x12, 0x75, 0x22, 0x00, 0xfe, 0x00,
+ 0x21, 0x00, 0xed, 0xdd,
+ 0xbd, 0x02, 0x07, 0xf1, 0x9e, 0xdd, 0xcc, 0xef, 0x02, 0x02, 0xee, 0xdd,
+ 0xdd, 0xf0, 0xee, 0xc8,
+ 0xf0, 0x43, 0x10, 0xeb, 0x0f, 0x21, 0x52, 0x10, 0x00, 0x00, 0x0e, 0x44,
+ 0x34, 0xf0, 0x00, 0xe2,
+ 0xf1, 0x13, 0x33, 0x10, 0x3e, 0x1b, 0x7f, 0x3f, 0x2c, 0x72, 0x42, 0x0e,
+ 0x1d, 0xf8, 0xfc, 0x52,
+ 0x21, 0x0e, 0x0e, 0x2f, 0x0d, 0xfc, 0x21, 0x23, 0x9a, 0xde, 0xf0, 0x13,
+ 0x12, 0xe0, 0xae, 0xe0,
+ 0xf1, 0xcf, 0xdd, 0xe0, 0xe4, 0xe0, 0xa9, 0xf0, 0x04, 0x13, 0x01, 0xbd,
+ 0xed, 0xf1, 0x05, 0xd0,
+ 0xd0, 0xc0, 0xbb, 0xcc, 0xff, 0x02, 0xf2, 0xdd, 0xdb, 0xe0, 0xf0, 0xff,
+ 0xef, 0x00, 0x23, 0x00,
+ 0xff, 0x0f, 0x11, 0x0f, 0xba, 0xdd, 0xed, 0xf0, 0xe0, 0xcc, 0xcc, 0xcb,
+ 0xde, 0x00, 0x01, 0x10,
+ 0x8b, 0xed, 0xff, 0x00, 0x23, 0x12, 0x00, 0xcb, 0xcb, 0xdd, 0x1f, 0x60,
+ 0x10, 0x0c, 0x1d, 0x1c,
+ 0x2f, 0x40, 0x20, 0x1e, 0x1e, 0x1f, 0x41, 0x35, 0x10, 0xcd, 0xef, 0xf0,
+ 0xce, 0xdd, 0xf0, 0xf0,
+ 0xee, 0x88, 0x0f, 0x33, 0x43, 0x0d, 0x09, 0x0e, 0x0f, 0x2f, 0x2f, 0x4f,
+ 0x1f, 0x0c, 0xec, 0x0f,
+ 0x20, 0x32, 0xf0, 0xd0, 0xd0, 0x22, 0x66, 0xb0, 0xd0, 0x01, 0x03, 0xc0,
+ 0xe2, 0x37, 0x22, 0xf0,
+ 0xe0, 0x03, 0x04, 0x33, 0x33, 0xb1, 0x9f, 0x1f, 0x32, 0xef, 0x00, 0x57,
+ 0x10, 0xcc, 0xbc, 0x00,
+ 0x12, 0xef, 0xcc, 0xff, 0x00, 0xde, 0x9a, 0x03, 0x13, 0xfe, 0xdc, 0x0f,
+ 0x11, 0x12, 0x21, 0x10,
+ 0x0d, 0x1f, 0x41, 0x31, 0x31, 0x2f, 0x0b, 0x10, 0x32, 0x02, 0xf3, 0x06,
+ 0xd0, 0x80, 0xe0, 0xf3,
+ 0x36, 0x41, 0x01, 0xe0, 0x0f, 0x51, 0x46, 0x01, 0x00, 0x30, 0x52, 0x11,
+ 0x46, 0x32, 0x11, 0x10,
+ 0x21, 0x74, 0x33, 0x23, 0x11, 0x10, 0x43, 0x57, 0x12, 0x21, 0x11, 0x00,
+ 0x1f, 0x11, 0x03, 0x13,
+ 0x00, 0xed, 0xdd, 0x00, 0x57, 0x33, 0x00, 0x00, 0x21, 0x11, 0x9b, 0xf0,
+ 0x47, 0x10, 0xce, 0xde,
+ 0x01, 0x12, 0xd0, 0xdf, 0x00, 0x00, 0x00, 0x12, 0x43, 0x02, 0x01, 0x02,
+ 0x67, 0xf0, 0xb0, 0x24,
+ 0x12, 0xbc, 0xfe, 0x25, 0x14, 0x01, 0xe0, 0x00, 0x0e, 0xbc, 0x0d, 0x51,
+ 0x32, 0x0e, 0xec, 0x1f,
+ 0x20, 0x0e, 0xf0, 0x14, 0x00, 0x01, 0x23, 0x01, 0x04, 0x13, 0xce, 0xfc,
+ 0x73, 0x56, 0x00, 0x1f,
+ 0x30, 0x2e, 0x2f, 0x30, 0x54, 0x10, 0x0d, 0x0f, 0x21, 0x10, 0x0d, 0xff,
+ 0x03, 0x10, 0xd8, 0x9b,
+ 0x00, 0xf1, 0xde, 0xdc, 0x10, 0x1f, 0xca, 0x30, 0x71, 0x0f, 0xdb, 0x0f,
+ 0x50, 0x33, 0x00, 0xbb,
+ 0x12, 0x47, 0xf0, 0xce, 0xf0, 0x01, 0x01, 0xd0, 0xdf, 0xf0, 0xe0, 0x24,
+ 0x43, 0xf0, 0xad, 0x0e,
+ 0x35, 0x44, 0xff, 0xbc, 0x00, 0x33, 0x00, 0xff, 0x00, 0x10, 0x21, 0xee,
+ 0xee, 0x21, 0x00, 0xce,
+ 0x00, 0x00, 0xef, 0xe2, 0x03, 0xec, 0xbb, 0xf0, 0x06, 0xf1, 0xc0, 0x03,
+ 0x8c, 0xc8, 0x00, 0x33,
+ 0x11, 0x0f, 0xdc, 0xfe, 0xf0, 0x00, 0x30, 0x21, 0x51, 0x11, 0xdc, 0xaa,
+ 0x00, 0x22, 0x20, 0xff,
+ 0xef, 0x00, 0x00, 0x62, 0x22, 0x0e, 0x65, 0xfc, 0xed, 0x77, 0x22, 0xcb,
+ 0x00, 0x55, 0x00, 0xcd,
+ 0xfe, 0x13, 0x22, 0x0f, 0xfe, 0xff, 0x02, 0x22, 0x23, 0xff, 0xba, 0x0f,
+ 0x01, 0x11, 0xe0, 0xdd,
+ 0xfe, 0x01, 0x02, 0x01, 0xf0, 0x89, 0xdc, 0x12, 0x77, 0x00, 0xff, 0x00,
+ 0xff, 0xee, 0x00, 0x22,
+ 0x22, 0x11, 0x00, 0xfe, 0xee, 0x00, 0xcc, 0x88, 0xef, 0x00, 0x33, 0x22,
+ 0x00, 0x00, 0x10, 0x12,
+ 0x55, 0x43, 0x12, 0x11, 0xff, 0xed, 0x00, 0x00, 0x32, 0x34, 0xec, 0xde,
+ 0xfe, 0xcd, 0x10, 0x44,
+ 0x00, 0xbc, 0xcb, 0x00, 0x55, 0x01, 0xfe, 0xff, 0xfe, 0x00, 0x00, 0xff,
+ 0xed, 0xff, 0x11, 0x0f,
+ 0xec, 0x21, 0x22, 0xdc, 0x88, 0xe0, 0x31, 0xe0, 0x8b, 0x00, 0x00, 0x00,
+ 0xee, 0xee, 0x00, 0x44,
+ 0x22, 0x00, 0x00, 0x12, 0x22, 0x11, 0x12, 0x10, 0xec, 0x00, 0x76, 0x00,
+ 0xdd, 0xee, 0x01, 0x11,
+ 0xef, 0xdd, 0x00, 0x12, 0xff, 0x88, 0xde, 0x22, 0x45, 0xff, 0xef, 0x43,
+ 0x33, 0x00, 0xff, 0x23,
+ 0x44, 0x00, 0xed, 0x00, 0x76, 0x00, 0xff, 0x44, 0x44, 0xff, 0xcc, 0xfe,
+ 0x00, 0x11, 0xff, 0xff,
+ 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0x11, 0x00, 0xfd, 0xff, 0xba, 0x10, 0x44,
+ 0x00, 0xee, 0x22, 0x55,
+ 0x00, 0xee, 0xde, 0x9b, 0xed, 0xff, 0x00, 0x33, 0x47, 0x00, 0x00, 0x21,
+ 0x22, 0x21, 0x00, 0x01,
+ 0xde, 0xce, 0x44, 0x77, 0x22, 0x00, 0xef, 0x00, 0x01, 0xdd, 0xbb, 0x11,
+ 0x44, 0x10, 0xde, 0xfe,
+ 0x00, 0x00, 0x00, 0x53, 0x00, 0xed, 0xec, 0x11, 0x55, 0x00, 0x00, 0x00,
+ 0x13, 0x55, 0x00, 0xff,
+ 0x00, 0x46, 0x22, 0x21, 0x01, 0x10, 0x44, 0x11, 0xee, 0x00, 0x00, 0x9c,
+ 0xca, 0xef, 0x0f, 0x00,
+ 0x12, 0x00, 0xe0, 0xef, 0xff, 0x00, 0x00, 0xef, 0x21, 0x44, 0xf0, 0xdd,
+ 0x00, 0xef, 0x9a, 0xdd,
+ 0x01, 0x55, 0x11, 0x10, 0x34, 0x11, 0xcc, 0x8a, 0x00, 0x11, 0x11, 0xed,
+ 0xf0, 0x00, 0x0f, 0xfe,
+ 0x01, 0x34, 0x22, 0xf0, 0x00, 0x53, 0x24, 0xfe, 0x34, 0x77, 0x10, 0x00,
+ 0x00, 0xff, 0xf0, 0x00,
+ 0x21, 0x00, 0xfe, 0xff, 0x54, 0x33, 0xcc, 0xec, 0xf0, 0x32, 0x00, 0xff,
+ 0x00, 0x22, 0xff, 0x0f,
+ 0x11, 0xee, 0xdc, 0x31, 0xff, 0xaa, 0x00, 0xcd, 0xdd, 0x63, 0x01, 0xd8,
+ 0xcd, 0x00, 0x21, 0x20,
+ 0xff, 0xcd, 0xfe, 0x21, 0x22, 0x10, 0x0f, 0x10, 0x65, 0x00, 0xfe, 0xed,
+ 0xcb, 0xee, 0x01, 0x11,
+ 0xcd, 0x98, 0xff, 0x01, 0x22, 0x23, 0xff, 0xec, 0x23, 0x01, 0xbc, 0x0f,
+ 0x00, 0xf0, 0x00, 0x45,
+ 0x21, 0xdf, 0xac, 0x01, 0x57, 0x00, 0xf0, 0xef, 0x00, 0x12, 0x00, 0xde,
+ 0xde, 0x00, 0x42, 0x00,
+ 0x0e, 0x00, 0x34, 0xdc, 0x8a, 0x00, 0x22, 0x33, 0x21, 0xf0, 0xa9, 0xee,
+ 0xef, 0x11, 0x33, 0x00,
+ 0xff, 0x00, 0x11, 0x12, 0x54, 0x00, 0xfe, 0x00, 0x21, 0x44, 0x00, 0xdc,
+ 0x00, 0x53, 0xff, 0x0f,
+ 0x47, 0x42, 0x22, 0x00, 0xee, 0x77, 0x54, 0x00, 0xf0, 0x11, 0x10, 0xee,
+ 0xed, 0xff, 0xee, 0x22,
+ 0x57, 0x11, 0x00, 0xf0, 0x00, 0x31, 0x34, 0x00, 0xff, 0x21, 0x32, 0x11,
+ 0x00, 0xce, 0x00, 0x24,
+ 0xce, 0xef, 0x44, 0x10, 0xac, 0xee, 0x00, 0xdc, 0xde, 0x34, 0x12, 0xbc,
+ 0xf0, 0x12, 0x12, 0x00,
+ 0xf0, 0x01, 0x14, 0x22, 0xff, 0xdd, 0x22, 0x76, 0x0f, 0xde, 0x22, 0x33,
+ 0x0f, 0x00, 0x00, 0xed,
+ 0x22, 0x53, 0xfc, 0xdc, 0xff, 0xdd, 0xbb, 0xfe, 0x00, 0x20, 0x00, 0xfe,
+ 0xfd, 0x74, 0x77, 0x02,
+ 0xfc, 0xfe, 0x00, 0x0f, 0x0d, 0x11, 0x00, 0x0e, 0x10, 0x0f, 0x00, 0x20,
+ 0x1e, 0xfe, 0x0e, 0x67,
+ 0x11, 0xed, 0x98, 0xcd, 0xfd, 0x00, 0xbb, 0xec, 0x00, 0x00, 0xdd, 0xcb,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0x00, 0x32, 0x21, 0xdf, 0xce, 0xef, 0xbc, 0xdc, 0xdf, 0x00, 0x01,
+ 0xef, 0xce, 0xed, 0x25,
+ 0x75, 0x00, 0x00, 0xf0, 0x00, 0x12, 0x65, 0x34, 0x11, 0x11, 0x11, 0x21,
+ 0x33, 0x00, 0x01, 0x34,
+ 0x11, 0x34, 0x43, 0xf0, 0x9c, 0xcb, 0xf0, 0x01, 0x11, 0xcc, 0xdd, 0x00,
+ 0x23, 0x00, 0xfe, 0x34,
+ 0x43, 0x01, 0xed, 0xab, 0x0f, 0x13, 0x22, 0xfe, 0x98, 0xff, 0x11, 0x00,
+ 0xcc, 0x00, 0x33, 0x11,
+ 0xcc, 0xdc, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x20, 0x43, 0x23, 0x22,
+ 0x12, 0x77, 0x24, 0xff,
+ 0xbb, 0x11, 0x64, 0x00, 0xfe, 0x11, 0x00, 0xec, 0xff, 0x11, 0x00, 0xbb,
+ 0xf0, 0x22, 0x21, 0xf0,
+ 0x00, 0x34, 0x32, 0xcd, 0xba, 0x21, 0x33, 0x00, 0x00, 0x33, 0x22, 0x00,
+ 0xdd, 0x01, 0x44, 0xff,
+ 0xcd, 0x11, 0x56, 0x11, 0xde, 0xee, 0x31, 0xef, 0xde, 0x77, 0x22, 0xee,
+ 0x00, 0x32, 0x01, 0x00,
+ 0x00, 0xcd, 0xf0, 0x77, 0x11, 0xff, 0xfd, 0x01, 0x32, 0x20, 0xec, 0xfe,
+ 0x32, 0x20, 0xdc, 0xff,
+ 0xfe, 0xce, 0x00, 0x35, 0x21, 0xae, 0xf0, 0x24, 0x56, 0x00, 0xdf, 0xff,
+ 0xde, 0xdd, 0x0f, 0x74,
+ 0x23, 0x10, 0xfc, 0xff, 0x00, 0xde, 0xcc, 0x66, 0x33, 0xef, 0xbb, 0x01,
+ 0x33, 0x01, 0xee, 0x00,
+ 0x00, 0xe0, 0xee, 0x00, 0x11, 0x0f, 0x33, 0x65, 0x0f, 0xed, 0xcb, 0xfe,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x21, 0x11, 0x43, 0x77, 0x01, 0x0e, 0x13, 0x23, 0x00, 0xee, 0xdf, 0xf0,
+ 0xee, 0x00, 0x31, 0xca,
+ 0x9a, 0xee, 0xee, 0x00, 0x64, 0x00, 0xca, 0xef, 0x10, 0x00, 0xee, 0x0f,
+ 0x10, 0x00, 0xde, 0x01,
+ 0x66, 0x00, 0xde, 0x00, 0x33, 0x12, 0x00, 0x35, 0x73, 0x12, 0x01, 0x22,
+ 0x00, 0xcd, 0xec, 0xff,
+ 0x00, 0xec, 0xbc, 0xfe, 0x00, 0x00, 0x0f, 0x55, 0x23, 0x0f, 0xff, 0x11,
+ 0x13, 0x00, 0xba, 0xdd,
+ 0x00, 0x25, 0x00, 0x8d, 0xed, 0x02, 0x35, 0x22, 0x00, 0xdd, 0x0f, 0x33,
+ 0x33, 0x01, 0x34, 0x44,
+ 0x21, 0x00, 0x00, 0x77, 0x43, 0x00, 0xff, 0x00, 0x22, 0x21, 0x33, 0x55,
+ 0x00, 0xfe, 0xdd, 0xfe,
+ 0x0f, 0x0e, 0x22, 0x12, 0xfe, 0x0d, 0x0e, 0x76, 0x65, 0x00, 0x00, 0xfd,
+ 0x0e, 0x00, 0x0e, 0xfd,
+ 0xec, 0xfe, 0xdd, 0x24, 0x67, 0xdf, 0xab, 0x00, 0x21, 0x24, 0x00, 0xf0,
+ 0xee, 0xff, 0x01, 0x43,
+ 0x00, 0xa9, 0xdd, 0xff, 0x00, 0x00, 0xee, 0xf0, 0x23, 0x22, 0xf0, 0xef,
+ 0x00, 0x35, 0x43, 0xcf,
+ 0xcd, 0x01, 0x14, 0x00, 0x32, 0x11, 0xcd, 0xee, 0x14, 0x23, 0x0e, 0xab,
+ 0xde, 0xec, 0x0e, 0x31,
+ 0xac, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x54, 0x11, 0x0f,
+ 0xff, 0x00, 0x34, 0x43,
+ 0xf0, 0x00, 0x33, 0x22, 0xdc, 0x30, 0x76, 0x00, 0xfd, 0x00, 0x20, 0xff,
+ 0xfc, 0x10, 0x20, 0x01,
+ 0x0f, 0xce, 0xee, 0x22, 0x54, 0x00, 0x11, 0x11, 0xfe, 0xfe, 0xe0, 0x99,
+ 0xfe, 0x00, 0x02, 0x22,
+ 0x00, 0xf2, 0x02, 0x77, 0x46, 0xf0, 0xff, 0x22, 0x21, 0xbc, 0x00, 0x44,
+ 0x00, 0xf0, 0x33, 0x24,
+ 0xde, 0xdd, 0xef, 0x01, 0x24, 0xf0, 0x8a, 0xde, 0xfe, 0x01, 0x22, 0xff,
+ 0x0f, 0x33, 0xee, 0x88,
+ 0xde, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x54,
+ 0x25, 0xde, 0x89, 0x00,
+ 0x21, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xef, 0xfe, 0xee, 0x00, 0x20, 0xdd,
+ 0xdb, 0x20, 0x43, 0x00,
+ 0xdc, 0x1f, 0x72, 0x0f, 0xec, 0x22, 0x21, 0x00, 0x56, 0x00, 0xbd, 0x00,
+ 0x0f, 0xdb, 0xef, 0x21,
+ 0x53, 0x33, 0x12, 0x10, 0x56, 0x23, 0x00, 0xf0, 0x33, 0x55, 0x00, 0xcd,
+ 0xef, 0xf0, 0x03, 0x13,
+ 0x02, 0xef, 0x0f, 0x10, 0x0f, 0x11, 0x35, 0x00, 0xdf, 0xde, 0x89, 0xbc,
+ 0xef, 0x00, 0x35, 0x43,
+ 0x00, 0xff, 0xef, 0x00, 0x12, 0xef, 0x99, 0x0f, 0x00, 0xde, 0xef, 0x22,
+ 0x22, 0x00, 0x0f, 0x31,
+ 0x57, 0x22, 0x00, 0xde, 0xde, 0x00, 0x52, 0x00, 0xda, 0xde, 0x31, 0x00,
+ 0x8b, 0xff, 0x00, 0x32,
+ 0x11, 0x21, 0x00, 0x11, 0x32, 0xec, 0xac, 0x23, 0x23, 0xca, 0x00, 0x54,
+ 0x21, 0xee, 0xff, 0x11,
+ 0x00, 0xee, 0xef, 0x21, 0x45, 0x00, 0xcc, 0xef, 0x10, 0x10, 0x00, 0x04,
+ 0xf8, 0x03, 0xc3, 0x02,
+ 0xf8, 0xc9, 0x59, 0xbf, 0x37, 0xd5, 0x03, 0xc9, 0x22, 0x77, 0x11, 0x0f,
+ 0xfe, 0x00, 0x45, 0x00,
+ 0x00, 0x10, 0x12, 0x00, 0xff, 0x01, 0x10, 0xdd, 0xba, 0x00, 0x31, 0x11,
+ 0x45, 0x32, 0xf0, 0x01,
+ 0x66, 0x32, 0xf0, 0xd0, 0x01, 0x02, 0xf0, 0xae, 0xdc, 0xee, 0x00, 0x21,
+ 0x11, 0x12, 0x13, 0xf0,
+ 0x88, 0xcb, 0x00, 0x00, 0x00, 0xef, 0x00, 0x21, 0x21, 0x20, 0x11, 0x10,
+ 0x52, 0x12, 0x12, 0x02,
+ 0xda, 0xce, 0x10, 0x22, 0x00, 0x10, 0x32, 0x0f, 0x0d, 0xfd, 0x32, 0x77,
+ 0x20, 0xfe, 0x11, 0x31,
+ 0xcc, 0xed, 0x00, 0x54, 0x23, 0x10, 0x10, 0x00, 0xec, 0x34, 0x34, 0xef,
+ 0x31, 0x23, 0xb0, 0x22,
+ 0x47, 0xd0, 0xd0, 0x00, 0xe0, 0x00, 0x30, 0xc0, 0x8b, 0xf0, 0x35, 0x52,
+ 0x00, 0xbd, 0xff, 0x13,
+ 0x03, 0x0f, 0xee, 0xee, 0xf0, 0x23, 0x23, 0xcb, 0xef, 0x67, 0x23, 0x00,
+ 0x02, 0x01, 0x00, 0xdd,
+ 0x89, 0x00, 0x13, 0x12, 0x11, 0x01, 0x0f, 0xc9, 0xad, 0x00, 0x35, 0x11,
+ 0x00, 0x23, 0x11, 0xee,
+ 0xce, 0x11, 0x34, 0x00, 0x00, 0x13, 0xde, 0xdc, 0x43, 0x12, 0xbb, 0xff,
+ 0x01, 0xff, 0xee, 0xee,
+ 0xe0, 0xf0, 0xce, 0xa9, 0x00, 0x44, 0x11, 0x00, 0xfd, 0x20, 0x57, 0x00,
+ 0xce, 0x21, 0x33, 0xfe,
+ 0xee, 0x22, 0x33, 0xff, 0xf0, 0x34, 0x75, 0x22, 0xf0, 0xdf, 0xee, 0x00,
+ 0xef, 0xcd, 0xee, 0x00,
+ 0x34, 0xff, 0x99, 0x00, 0x33, 0x43, 0x01, 0x01, 0x22, 0x00, 0xdb, 0xde,
+ 0x0f, 0xfe, 0xdd, 0xe0,
+ 0x01, 0x33, 0x41, 0xda, 0xad, 0xfe, 0x10, 0x40, 0xda, 0xbc, 0x20, 0x53,
+ 0xfd, 0xc9, 0xff, 0x00,
+ 0x41, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x21, 0x65, 0x00, 0xeb, 0xee, 0x10,
+ 0x32, 0x32, 0x00, 0xed,
+ 0xfe, 0x0f, 0x40, 0x75, 0x34, 0x10, 0xff, 0x00, 0x12, 0x23, 0x12, 0xe0,
+ 0xbe, 0x01, 0x05, 0xd0,
+ 0x8b, 0xfe, 0x03, 0x01, 0xfd, 0xdd, 0x00, 0x34, 0x23, 0x00, 0x12, 0x47,
+ 0x22, 0x01, 0x00, 0x13,
+ 0x01, 0xe0, 0x00, 0x55, 0x11, 0xf0, 0xbe, 0xff, 0x15, 0x44, 0x01, 0xef,
+ 0x00, 0x34, 0x76, 0x11,
+ 0xff, 0xf0, 0x10, 0xe0, 0x00, 0x75, 0x00, 0x12, 0x13, 0xef, 0xde, 0x11,
+ 0x34, 0xef, 0xce, 0x0f,
+ 0x12, 0x44, 0xf0, 0xac, 0xee, 0xee, 0xda, 0xee, 0x00, 0xff, 0x42, 0x21,
+ 0xff, 0xff, 0x23, 0x01,
+ 0x00, 0x76, 0x10, 0xdd, 0xbb, 0xfe, 0x12, 0x45, 0x00, 0xdf, 0xef, 0xef,
+ 0xef, 0xff, 0x00, 0x44,
+ 0x54, 0x22, 0x00, 0xdf, 0x0e, 0x56, 0x23, 0xce, 0xdb, 0x10, 0x65, 0x01,
+ 0x00, 0x02, 0x01, 0x00,
+ 0xe0, 0xdf, 0xe0, 0xe0, 0xdf, 0x00, 0x01, 0xbc, 0xfe, 0x23, 0x00, 0xab,
+ 0x00, 0x02, 0x13, 0x23,
+ 0x11, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x54, 0x22, 0x0b, 0xb8,
+ 0xdd, 0xde, 0xee, 0x1e,
+ 0x50, 0x0e, 0xfb, 0xed, 0xed, 0x0e, 0x0f, 0x60, 0x0e, 0xc8, 0xbd, 0x0f,
+ 0x31, 0x21, 0x10, 0x0d,
+ 0x30, 0x74, 0x0e, 0xda, 0x0f, 0x10, 0x20, 0x0f, 0xfd, 0xfe, 0x0f, 0x0f,
+ 0x10, 0xfd, 0xbb, 0xee,
+ 0xfe, 0xef, 0xee, 0x00, 0x20, 0xfe, 0x10, 0x77, 0x42, 0x23, 0xff, 0xa8,
+ 0xff, 0x10, 0x20, 0x32,
+ 0x43, 0xff, 0xdc, 0x01, 0x42, 0xfe, 0xcc, 0x01, 0x44, 0x00, 0xfe, 0x00,
+ 0x11, 0x10, 0x23, 0x35,
+ 0xdf, 0xbe, 0x0f, 0x00, 0xfd, 0xfe, 0x31, 0x21, 0xfe, 0xfd, 0xfc, 0x0f,
+ 0x72, 0x00, 0xd8, 0x00,
+ 0xd0, 0x89, 0xde, 0x00, 0xfe, 0xcd, 0x00, 0xfe, 0xed, 0xfd, 0xfe, 0x10,
+ 0x53, 0x23, 0x0e, 0x00,
+ 0xfb, 0x0c, 0x52, 0x56, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x00, 0x52, 0x00,
+ 0x0f, 0x14, 0x55, 0x00,
+ 0xee, 0x00, 0x33, 0x0f, 0x00, 0x37, 0x00, 0xae, 0xff, 0x01, 0x22, 0x12,
+ 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0xce, 0xed, 0x14, 0x57, 0x35, 0x22, 0xd0, 0x9e, 0x01, 0x34, 0xf0,
+ 0xbc, 0x00, 0x34, 0x00,
+ 0xdf, 0x12, 0x23, 0xef, 0xff, 0x22, 0x22, 0xee, 0xee, 0x02, 0x77, 0x65,
+ 0x00, 0xef, 0xfe, 0x00,
+ 0x01, 0x13, 0x22, 0xfe, 0xfe, 0x55, 0x02, 0xef, 0xee, 0x10, 0x32, 0x23,
+ 0x33, 0x57, 0x22, 0xce,
+ 0xba, 0xf0, 0x10, 0x10, 0x00, 0x00, 0x21, 0x00, 0x0f, 0x00, 0x21, 0x32,
+ 0x00, 0x24, 0x35, 0x01,
+ 0xd0, 0x8f, 0xcd, 0xf0, 0x01, 0x02, 0x04, 0x02, 0xe0, 0x02, 0x15, 0x44,
+ 0x32, 0x12, 0x01, 0xef,
+ 0x74, 0x55, 0x00, 0x00, 0x10, 0x0f, 0xde, 0xe0, 0x02, 0x20, 0xf0, 0xcc,
+ 0x01, 0x47, 0x11, 0x01,
+ 0xd1, 0xc0, 0xf0, 0xcf, 0xd0, 0x17, 0xf0, 0xbf, 0x12, 0x02, 0xde, 0x0f,
+ 0x32, 0x12, 0x77, 0x43,
+ 0xee, 0xdc, 0x01, 0x21, 0xce, 0x0e, 0x10, 0x00, 0x01, 0xdd, 0x88, 0xff,
+ 0x33, 0x01, 0xdd, 0xdd,
+ 0xcc, 0xfe, 0x00, 0x01, 0xf0, 0xcc, 0x0f, 0x62, 0x00, 0xe9, 0xdc, 0x10,
+ 0x73, 0x00, 0xdc, 0x00,
+ 0x02, 0x00, 0xed, 0xef, 0x01, 0x56, 0x11, 0x10, 0x00, 0xed, 0xee, 0x0e,
+ 0x00, 0x23, 0x10, 0x0e,
+ 0xec, 0xdd, 0x75, 0x67, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xdc, 0xff,
+ 0x22, 0x54, 0x01, 0xff,
+ 0xce, 0xf0, 0x01, 0x13, 0x0f, 0xaa, 0x00, 0x13, 0xed, 0xed, 0x10, 0x32,
+ 0x00, 0xeb, 0xec, 0x51,
+ 0x75, 0x11, 0x00, 0x22, 0x12, 0x00, 0x01, 0x23, 0x00, 0xdc, 0x32, 0x56,
+ 0xff, 0xbd, 0x00, 0x02,
+ 0xef, 0xff, 0x01, 0x00, 0x22, 0x77, 0x12, 0xda, 0x00, 0x32, 0x21, 0xde,
+ 0xde, 0xf0, 0x42, 0x21,
+ 0xee, 0xcf, 0x03, 0x45, 0xef, 0xce, 0x00, 0x22, 0x00, 0xf0, 0x03, 0xe0,
+ 0x88, 0xfd, 0x00, 0x00,
+ 0x11, 0x20, 0x0f, 0xff, 0xff, 0xfd, 0x0f, 0x77, 0x00, 0xdc, 0xff, 0x10,
+ 0x00, 0xef, 0x65, 0x12,
+ 0xee, 0x00, 0x12, 0x00, 0xff, 0x12, 0x22, 0x00, 0x77, 0x22, 0xff, 0x00,
+ 0xff, 0xba, 0xf0, 0x31,
+ 0x00, 0xb9, 0xde, 0x20, 0x61, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x0f, 0xb9,
+ 0xff, 0x0e, 0x0f, 0x10, 0x31, 0x0f, 0xdc, 0xac, 0x0f, 0x31, 0x00, 0xdc,
+ 0xdd, 0x20, 0x00, 0xc9,
+ 0x10, 0x72, 0x12, 0x00, 0xfe, 0xed, 0x00, 0x56, 0x11, 0xff, 0xcd, 0xfd,
+ 0x12, 0x00, 0xcc, 0xee,
+ 0x23, 0x11, 0xdf, 0xef, 0x22, 0x54, 0x44, 0x23, 0x22, 0x01, 0xbc, 0xed,
+ 0x02, 0xf0, 0xc9, 0x00,
+ 0x22, 0xfe, 0xdd, 0xee, 0x01, 0x57, 0x00, 0xff, 0x00, 0x32, 0x11, 0x00,
+ 0x33, 0x00, 0xab, 0xde,
+ 0x00, 0x12, 0x00, 0xbb, 0xee, 0x2f, 0x40, 0x30, 0x0e, 0xfb, 0xde, 0x30,
+ 0x74, 0x11, 0x12, 0x00,
+ 0xea, 0x00, 0x30, 0xdb, 0x1f, 0x61, 0xff, 0xed, 0x0c, 0x0f, 0xfe, 0x20,
+ 0x30, 0x00, 0x0e, 0x30,
+ 0x77, 0x72, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x01, 0xde, 0xcb, 0xf0, 0x03,
+ 0xef, 0xdd, 0x00, 0x21,
+ 0x67, 0x01, 0xef, 0xbc, 0x00, 0x46, 0x00, 0xe0, 0x01, 0x11, 0x00, 0x00,
+ 0x22, 0x01, 0x01, 0x02,
+ 0xe0, 0xc0, 0xf0, 0x03, 0x22, 0x01, 0x27, 0x12, 0x02, 0x44, 0x03, 0x01,
+ 0x74, 0x33, 0x12, 0x02,
+ 0x00, 0xf0, 0x77, 0x66, 0x00, 0xce, 0xff, 0x11, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x40, 0x0f, 0xfb,
+ 0x00, 0x01, 0xde, 0xce, 0x35, 0x31, 0xbe, 0xee, 0x00, 0x32, 0x10, 0x00,
+ 0x00, 0xba, 0x10, 0x74,
+ 0x12, 0x00, 0xfd, 0xee, 0xff, 0xfd, 0xfd, 0x02, 0x26, 0x41, 0x00, 0xde,
+ 0xef, 0xf0, 0x22, 0x77,
+ 0x32, 0xdd, 0xac, 0x0f, 0xf0, 0xff, 0x01, 0x02, 0x05, 0x00, 0xee, 0xdd,
+ 0x00, 0x52, 0x00, 0xea,
+ 0xf0, 0x11, 0x01, 0x11, 0x34, 0x22, 0xd0, 0xd0, 0x77, 0x22, 0xc0, 0xdf,
+ 0x00, 0xf1, 0xa0, 0xfe,
+ 0x00, 0x03, 0x10, 0x0d, 0xed, 0x0f, 0xff, 0xfe, 0xfa, 0x30, 0x61, 0x0e,
+ 0x0d, 0x2f, 0x0e, 0xeb,
+ 0x0f, 0x2f, 0x0f, 0x0c, 0xdb, 0xfe, 0x10, 0xfc, 0x5e, 0x70, 0x0b, 0x3f,
+ 0x74, 0x20, 0x0d, 0xfd,
+ 0x0e, 0x33, 0x22, 0xb8, 0xed, 0x10, 0x55, 0x11, 0xff, 0xee, 0x00, 0x00,
+ 0x10, 0x21, 0x21, 0x00,
+ 0xfe, 0x01, 0xf0, 0x9c, 0xed, 0x02, 0x35, 0x0f, 0x0e, 0x10, 0x10, 0x31,
+ 0x10, 0x10, 0x56, 0x33,
+ 0x12, 0x02, 0x00, 0xf0, 0x00, 0x04, 0x17, 0xc1, 0x8e, 0xde, 0x00, 0x02,
+ 0x01, 0x54, 0x46, 0x11,
+ 0xe0, 0xe0, 0x11, 0x33, 0x43, 0x23, 0x13, 0x00, 0xed, 0xbb, 0x00, 0x02,
+ 0x01, 0x00, 0xef, 0xe0,
+ 0xf2, 0xf0, 0x16, 0x77, 0x74, 0x01, 0xe0, 0xff, 0x02, 0x32, 0xf0, 0xe0,
+ 0x02, 0x23, 0x01, 0xc0,
+ 0xb0, 0xc0, 0xe0, 0xf0, 0xff, 0xfe, 0x37, 0x56, 0x00, 0xcd, 0xf0, 0x33,
+ 0x02, 0x0f, 0x32, 0x22,
+ 0xf0, 0xcf, 0xe0, 0x04, 0x37, 0x52, 0x11, 0xd0, 0xbf, 0xf0, 0x10, 0x23,
+ 0x02, 0xed, 0x00, 0x10,
+ 0xcb, 0xbc, 0x00, 0x11, 0x00, 0x01, 0x11, 0xdd, 0xb8, 0x10, 0x20, 0xdf,
+ 0xc0, 0x35, 0x11, 0xd0,
+ 0xd0, 0x00, 0xe0, 0xcf, 0x52, 0x44, 0xeb, 0xcd, 0x00, 0x10, 0x0f, 0x0c,
+ 0x40, 0x10, 0x0f, 0xed,
+ 0x11, 0x65, 0x0f, 0xcc, 0x0e, 0x31, 0xfe, 0xdb, 0x30, 0x52, 0x0f, 0xca,
+ 0xbd, 0x0e, 0x1f, 0x0e,
+ 0x0d, 0xfd, 0xfb, 0x20, 0x63, 0x23, 0x13, 0x10, 0x00, 0x10, 0x01, 0xff,
+ 0xba, 0xe0, 0x04, 0xf0,
+ 0xde, 0xe0, 0x00, 0x00, 0x0e, 0xdc, 0x0f, 0x50, 0x0d, 0x10, 0x0e, 0xd9,
+ 0x00, 0x72, 0x33, 0x10,
+ 0x00, 0xea, 0xee, 0x0f, 0x51, 0x22, 0xde, 0xac, 0xed, 0xd9, 0x00, 0x32,
+ 0x10, 0x20, 0x40, 0x20,
+ 0x0f, 0xfd, 0x31, 0x43, 0xf0, 0x04, 0x34, 0xce, 0x8a, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0xfe, 0xeb,
+ 0xed, 0xfd, 0x11, 0x75, 0x10, 0x10, 0x0f, 0x20, 0x2f, 0xfc, 0xee, 0x10,
+ 0x00, 0xfc, 0xcd, 0xef,
+ 0x77, 0x53, 0x00, 0xed, 0xfe, 0xed, 0xdd, 0x01, 0x27, 0x21, 0x01, 0x00,
+ 0x32, 0x11, 0x31, 0x54,
+ 0x00, 0xce, 0x00, 0x45, 0x01, 0x00, 0xf0, 0xd0, 0x8c, 0xf0, 0x02, 0x01,
+ 0x00, 0x01, 0xbc, 0xfe,
+ 0x26, 0xff, 0x89, 0xff, 0x11, 0x00, 0x00, 0xff, 0xff, 0x11, 0x33, 0x00,
+ 0xe0, 0xde, 0xee, 0x34,
+ 0x53, 0x0f, 0xdc, 0xfe, 0x0f, 0xec, 0x0e, 0x32, 0x11, 0xff, 0xee, 0x55,
+ 0x67, 0x11, 0x00, 0x0e,
+ 0x10, 0x0f, 0x0e, 0x21, 0x30, 0xdc, 0xfd, 0x30, 0x20, 0xdc, 0xfc, 0x2c,
+ 0xdc, 0x70, 0x73, 0x41,
+ 0xfb, 0xff, 0x00, 0x0f, 0x10, 0x10, 0xfd, 0xfc, 0x30, 0x63, 0x00, 0xfd,
+ 0xfe, 0x00, 0x0e, 0x0c,
+ 0x31, 0x20, 0xec, 0xcd, 0x11, 0x36, 0x31, 0x52, 0x53, 0x22, 0x15, 0x34,
+ 0xe0, 0xad, 0x00, 0x10,
+ 0x0f, 0xda, 0xf0, 0x31, 0x32, 0x11, 0x32, 0x11, 0xf0, 0xf0, 0xd0, 0xac,
+ 0x00, 0x26, 0x22, 0xd0,
+ 0xa0, 0xef, 0xee, 0xce, 0xfe, 0xef, 0xf0, 0x12, 0x11, 0x67, 0x47, 0x33,
+ 0x11, 0x01, 0xe0, 0xd0,
+ 0x44, 0x53, 0x00, 0x03, 0x04, 0x02, 0x01, 0x00, 0xfe, 0xdc, 0xf0, 0x45,
+ 0x10, 0xef, 0x41, 0x76,
+ 0x21, 0x11, 0x21, 0x23, 0x01, 0x00, 0x01, 0xf1, 0xc0, 0xe0, 0x0f, 0x10,
+ 0x13, 0x01, 0xe0, 0x07,
+ 0x02, 0x01, 0x13, 0xc1, 0xe2, 0x16, 0x80, 0xbe, 0x01, 0x24, 0xf1, 0xc0,
+ 0xe0, 0xf5, 0x02, 0xf2,
+ 0xc0, 0x00, 0x15, 0x13, 0xf2, 0xe1, 0xd2, 0xd2, 0x04, 0x63, 0x24, 0xf1,
+ 0x8f, 0xf0, 0xf1, 0xf0,
+ 0xef, 0xe0, 0x03, 0x17, 0x04, 0xb0, 0xef, 0x23, 0x01, 0xd0, 0x02, 0x57,
+ 0x44, 0x01, 0x00, 0xf0,
+ 0x01, 0x02, 0x00, 0x02, 0x44, 0x01, 0x0e, 0xfe, 0x00, 0x00, 0x1f, 0x0f,
+ 0x10, 0x0f, 0x88, 0xeb,
+ 0xfe, 0x00, 0x00, 0x0e, 0xed, 0x40, 0x51, 0x0d, 0x0f, 0x51, 0x0d, 0xfb,
+ 0x00, 0x44, 0x20, 0x0c,
+ 0x2e, 0x1d, 0xdb, 0x10, 0x76, 0x31, 0xdf, 0xdd, 0x20, 0x42, 0xf0, 0xef,
+ 0x00, 0x00, 0x0f, 0xfe,
+ 0xad, 0xfe, 0x00, 0x01, 0x22, 0xef, 0xdc, 0xcd, 0xcb, 0x25, 0x22, 0xad,
+ 0xed, 0x22, 0x57, 0x00,
+ 0xff, 0xe0, 0x02, 0x22, 0xf0, 0xf0, 0x14, 0x02, 0xbc, 0xfe, 0x33, 0x56,
+ 0x00, 0xff, 0xdf, 0xf0,
+ 0x12, 0x10, 0x10, 0xfc, 0xdb, 0xff, 0x00, 0xf0, 0xd0, 0xcd, 0xdd, 0xbd,
+ 0xdd, 0x0e, 0x70, 0x10,
+ 0xed, 0xda, 0xef, 0xed, 0xec, 0x30, 0x72, 0x0c, 0xfc, 0x2f, 0x1f, 0x2e,
+ 0x3e, 0x0d, 0x00, 0xd0,
+ 0xb9, 0xfd, 0xfe, 0x10, 0x50, 0x0d, 0xa8, 0xcb, 0xf0, 0x00, 0xff, 0xcd,
+ 0xed, 0xfd, 0xff, 0xf0,
+ 0xed, 0x10, 0x74, 0x10, 0x0f, 0x0e, 0x00, 0x23, 0x22, 0x2f, 0x0d, 0x43,
+ 0x37, 0x12, 0x23, 0x22,
+ 0x00, 0x21, 0x23, 0xae, 0xe0, 0x17, 0xe0, 0xbe, 0x01, 0x01, 0xdc, 0x21,
+ 0x77, 0x10, 0x0f, 0xff,
+ 0xff, 0x11, 0x21, 0xfe, 0xfe, 0xdd, 0xef, 0xfe, 0xba, 0xed, 0xee, 0x10,
+ 0x40, 0x31, 0x10, 0x2d,
+ 0x4d, 0x2c, 0x0c, 0x30, 0x76, 0x30, 0xed, 0x0e, 0x40, 0x31, 0x20, 0x00,
+ 0xf0, 0xe0, 0xcd, 0xec,
+ 0x0f, 0xde, 0xab, 0x25, 0x75, 0x11, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0xf0,
+ 0x03, 0x01, 0xcc, 0x0f,
+ 0x00, 0xe0, 0x05, 0x54, 0x03, 0xff, 0xfe, 0x10, 0x22, 0xcc, 0x98, 0xfe,
+ 0x10, 0x42, 0x01, 0x0f,
+ 0xbd, 0xff, 0x03, 0x11, 0xfd, 0x00, 0x23, 0x0d, 0x0b, 0x32, 0x00, 0xc8,
+ 0xde, 0x10, 0x2f, 0x0f,
+ 0xdc, 0xbd, 0x0f, 0x30, 0x0e, 0xfe, 0x61, 0x30, 0x0c, 0xeb, 0x0d, 0x2f,
+ 0x0e, 0xcc, 0x30, 0x70,
+ 0x0e, 0xfe, 0x02, 0x36, 0x00, 0xef, 0xef, 0xef, 0xe0, 0x75, 0x11, 0xdd,
+ 0xdf, 0x00, 0x34, 0xf0,
+ 0xd0, 0xe1, 0x01, 0x55, 0x00, 0xdc, 0x00, 0x43, 0x00, 0x2f, 0x74, 0x04,
+ 0xf2, 0xf2, 0x01, 0xf3,
+ 0xd0, 0xd0, 0x54, 0x43, 0xec, 0xdd, 0x27, 0x43, 0xf0, 0xef, 0x30, 0x35,
+ 0xe1, 0x90, 0xf1, 0xf2,
+ 0xd0, 0xe0, 0x00, 0xde, 0xcf, 0xe2, 0xe4, 0x13, 0x34, 0xbe, 0xaa, 0x00,
+ 0x02, 0x03, 0x23, 0x20,
+ 0xed, 0x00, 0x52, 0x0e, 0x1e, 0x3f, 0x21, 0x03, 0xfc, 0xb8, 0x10, 0x76,
+ 0x01, 0xfe, 0xfe, 0x00,
+ 0x0d, 0xfc, 0x0f, 0x40, 0x53, 0x10, 0x09, 0x0e, 0x20, 0x21, 0x21, 0x10,
+ 0xff, 0xef, 0x0f, 0x0d,
+ 0x5f, 0x53, 0x00, 0x00, 0x02, 0x02, 0x00, 0x10, 0x37, 0x02, 0xc1, 0xe4,
+ 0x15, 0x53, 0xf2, 0xcf,
+ 0x14, 0x45, 0xe0, 0xdf, 0x00, 0x13, 0x12, 0x00, 0xf2, 0xc3, 0xd0, 0xd0,
+ 0xd1, 0xc3, 0xd7, 0xc1,
+ 0xd0, 0x21, 0x77, 0x02, 0x01, 0x02, 0x00, 0xf1, 0x45, 0x74, 0x00, 0x00,
+ 0x00, 0xff, 0xff, 0x31,
+ 0x33, 0x00, 0x02, 0xf0, 0xf2, 0xd0, 0xf3, 0x46, 0x20, 0x00, 0x40, 0x74,
+ 0x00, 0xf0, 0xed, 0xda,
+ 0x0f, 0x50, 0x00, 0xed, 0xed, 0x11, 0x11, 0x10, 0x41, 0x24, 0x00, 0x0f,
+ 0x0f, 0x0e, 0x2e, 0x6e,
+ 0x1f, 0xfb, 0xcd, 0xf0, 0x02, 0x03, 0xf0, 0xbb, 0xd9, 0xde, 0x00, 0x00,
+ 0xd1, 0xa0, 0xe1, 0x02,
+ 0x44, 0x23, 0x23, 0x23, 0xf0, 0xf7, 0x24, 0x10, 0xf0, 0x1f, 0x1f, 0xff,
+ 0x53, 0x36, 0xaf, 0xee,
+ 0x00, 0x00, 0x46, 0x12, 0xa0, 0xe0, 0x03, 0x02, 0xae, 0xef, 0xf3, 0xf4,
+ 0x04, 0x06, 0x02, 0x01,
+ 0xf0, 0xe0, 0x00, 0x33, 0x22, 0x00, 0x10, 0x64, 0x03, 0xcc, 0xcd, 0xff,
+ 0x0f, 0xff, 0x00, 0x67,
+ 0x21, 0xec, 0xdd, 0x00, 0x42, 0x11, 0x0f, 0xfa, 0x30, 0x70, 0x10, 0x1f,
+ 0x1e, 0x30, 0x22, 0x00,
+ 0x0f, 0x21, 0x00, 0xcc, 0x03, 0x37, 0xdf, 0xae, 0x00, 0x12, 0x05, 0x05,
+ 0x73, 0x00, 0x76, 0x00,
+ 0xc9, 0x1d, 0xd3, 0xfe, 0xa1, 0x1e, 0x12, 0x02, 0x00, 0x77, 0x24, 0xe9,
+ 0xcf, 0x40, 0x64, 0x20,
+ 0xf0, 0xde, 0x0f, 0x01, 0xf2, 0x02, 0x62, 0x1f, 0x0b, 0x00, 0xef, 0xac,
+ 0x03, 0x46, 0x0f, 0xee,
+ 0xf0, 0x03, 0x30, 0x00, 0x24, 0x22, 0x0e, 0xb9, 0x10, 0x53, 0x02, 0xbd,
+ 0x0e, 0x14, 0x21, 0xef,
+ 0xed, 0x13, 0x57, 0xff, 0xde, 0x00, 0x11, 0x00, 0x12, 0x00, 0xcd, 0x02,
+ 0x11, 0x00, 0x40, 0xdd,
+ 0x9a, 0x14, 0x34, 0x0e, 0x00, 0xee, 0xe0, 0x22, 0xec, 0xcd, 0x20, 0x54,
+ 0xef, 0xcb, 0x00, 0x55,
+ 0x00, 0xed, 0xef, 0x00, 0x75, 0x00, 0xdd, 0xff, 0x22, 0x1f, 0xde, 0x01,
+ 0x01, 0x1f, 0xff, 0xee,
+ 0xda, 0x11, 0x30, 0xbf, 0x1f, 0x41, 0xdc, 0x02, 0x36, 0xce, 0xed, 0x02,
+ 0x34, 0x00, 0x9b, 0x00,
+ 0x01, 0x11, 0x00, 0xcc, 0xfe, 0x01, 0x01, 0xce, 0xfe, 0x00, 0x56, 0x32,
+ 0xde, 0x9b, 0x00, 0x21,
+ 0x00, 0x00, 0xf0, 0x01, 0x23, 0xfd, 0xdd, 0x0f, 0x10, 0xf0, 0xce, 0xff,
+ 0x02, 0x35, 0x0d, 0x88,
+ 0xf0, 0x21, 0x31, 0xed, 0xfe, 0x21, 0x02, 0x0f, 0x0e, 0xd0, 0x02, 0x22,
+ 0x2f, 0xb8, 0xcc, 0x10,
+ 0x31, 0x34, 0xae, 0xdb, 0x00, 0x10, 0x11, 0x21, 0x01, 0xac, 0xed, 0xf0,
+ 0x33, 0x23, 0xdc, 0xbb,
+ 0x10, 0x33, 0xe0, 0xad, 0xff, 0x32, 0x10, 0xee, 0xd0, 0x11, 0x1f, 0x0e,
+ 0x27, 0x42, 0xcc, 0xee,
+ 0x00, 0x21, 0xd0, 0xab, 0x01, 0x25, 0x0f, 0x0e, 0xdf, 0x00, 0x55, 0xf0,
+ 0xdc, 0x51, 0x43, 0xef,
+ 0x0e, 0x01, 0xe2, 0xff, 0x10, 0x74, 0x11, 0xff, 0x01, 0x11, 0xee, 0x00,
+ 0x33, 0xfb, 0x9b, 0x12,
+ 0x23, 0x00, 0x0f, 0x0d, 0x00, 0x03, 0x56, 0x0f, 0x0c, 0xf0, 0x04, 0x20,
+ 0xee, 0xdf, 0x64, 0x22,
+ 0x1e, 0xed, 0xe1, 0x12, 0x01, 0x64, 0x22, 0x0d, 0xee, 0x02, 0xfc, 0xdc,
+ 0x35, 0x65, 0xe0, 0xf0,
+ 0x2f, 0x00, 0xd0, 0xf0, 0x0e, 0x00, 0xe3, 0x24, 0x41, 0xef, 0xab, 0x22,
+ 0x32, 0xde, 0xcf, 0x47,
+ 0x74, 0xff, 0xdc, 0x00, 0x25, 0xff, 0xef, 0x11, 0x00, 0xd0, 0x62, 0x11,
+ 0xff, 0xe0, 0x01, 0x32,
+ 0xfe, 0xff, 0x43, 0x00, 0xfc, 0x14, 0x15, 0x10, 0x00, 0x2d, 0x0f, 0x30,
+ 0x76, 0x30, 0x8c, 0xef,
+ 0x12, 0x32, 0xee, 0x00, 0x00, 0x00, 0x10, 0x35, 0x00, 0x1f, 0x0c, 0x10,
+ 0xf1, 0xc0, 0x62, 0x46,
+ 0xee, 0xcc, 0x32, 0x64, 0xff, 0xfc, 0xf0, 0x02, 0x21, 0x0f, 0x10, 0x22,
+ 0xfe, 0xef, 0x54, 0x02,
+ 0xee, 0xec, 0x10, 0x43, 0x25, 0x22, 0xce, 0xec, 0x21, 0x21, 0x35, 0xf0,
+ 0xad, 0xf0, 0x11, 0x0f,
+ 0x11, 0x57, 0x00, 0xcd, 0x01, 0x34, 0x00, 0xcd, 0x02, 0x02, 0x22, 0x21,
+ 0x00, 0xdc, 0xee, 0xef,
+ 0x54, 0x66, 0x01, 0xdd, 0xdc, 0x00, 0x31, 0x74, 0x01, 0x00, 0xdd, 0xfe,
+ 0x0f, 0x21, 0x24, 0xec,
+ 0xce, 0x32, 0x34, 0xfe, 0xdc, 0xf0, 0x00, 0x22, 0x31, 0xe0, 0xcf, 0xed,
+ 0x1f, 0x72, 0x57, 0xef,
+ 0xdc, 0x33, 0x32, 0x00, 0xed, 0x00, 0x01, 0x43, 0x33, 0xbb, 0xde, 0x00,
+ 0x11, 0x30, 0x03, 0xbe,
+ 0xfa, 0x00, 0x20, 0x00, 0x03, 0x45, 0xcb, 0xd0, 0x11, 0x00, 0x41, 0x04,
+ 0x10, 0x0e, 0xc0, 0x01,
+ 0x01, 0x00, 0x57, 0x12, 0xde, 0x00, 0x42, 0xd0, 0xde, 0x00, 0x00, 0x90,
+ 0x04, 0x57, 0x00, 0xdf,
+ 0xec, 0x00, 0x32, 0x13, 0xe0, 0xbd, 0x00, 0x41, 0xf0, 0xe1, 0x12, 0x0d,
+ 0xda, 0xf0, 0x20, 0x42,
+ 0xee, 0xac, 0x0e, 0x15, 0x11, 0xfe, 0xef, 0x10, 0xf1, 0x9b, 0x01, 0x34,
+ 0xfc, 0x0f, 0x20, 0x0f,
+ 0xcc, 0x0f, 0x03, 0x22, 0x0d, 0xfc, 0xef, 0xac, 0xff, 0x45, 0x42, 0xec,
+ 0xdc, 0x00, 0x23, 0xfe,
+ 0xf0, 0x0f, 0xec, 0x00, 0x73, 0x23, 0xfd, 0xdb, 0x00, 0x12, 0xff, 0x5f,
+ 0x22, 0xcd, 0xfa, 0x11,
+ 0x53, 0x00, 0xdd, 0x0f, 0x0c, 0xe0, 0x03, 0x31, 0xef, 0x0e, 0x00, 0xc0,
+ 0x00, 0xcc, 0xc8, 0x61,
+ 0x13, 0xde, 0x00, 0x11, 0xfb, 0xef, 0x0f, 0x0f, 0xff, 0xe2, 0xff, 0x0b,
+ 0x61, 0x11, 0xfe, 0xe0,
+ 0x23, 0xd0, 0x88, 0x0e, 0x21, 0x12, 0xf0, 0xdd, 0xf0, 0x00, 0x20, 0x2e,
+ 0xce, 0xf0, 0x05, 0x4f,
+ 0x0f, 0xde, 0x0c, 0xfd, 0x10, 0xf5, 0x9e, 0x0f, 0x3e, 0x11, 0x67, 0xd1,
+ 0xaa, 0x00, 0x41, 0xf0,
+ 0xe0, 0x10, 0x10, 0xdf, 0xef, 0x12, 0x10, 0x1d, 0x30, 0x23, 0xe0, 0xdb,
+ 0x10, 0x2f, 0x42, 0x45,
+ 0x00, 0xdd, 0xdd, 0x13, 0x22, 0x8a, 0xff, 0x11, 0x2f, 0xfb, 0xc1, 0x04,
+ 0xf0, 0xdd, 0x31, 0x55,
+ 0xde, 0xde, 0xe0, 0xc2, 0xf1, 0x42, 0x54, 0xde, 0xcb, 0x11, 0x12, 0xef,
+ 0xf0, 0x67, 0x00, 0xce,
+ 0x10, 0x23, 0xed, 0xd0, 0x00, 0x02, 0x13, 0x44, 0xfe, 0xba, 0x00, 0x33,
+ 0x00, 0x00, 0xfe, 0xff,
+ 0xf1, 0x13, 0x42, 0x01, 0xec, 0xfd, 0x72, 0x10, 0xd0, 0x04, 0xf1, 0x03,
+ 0x67, 0x00, 0xf0, 0x10,
+ 0x0c, 0x00, 0x12, 0xee, 0xee, 0x32, 0x15, 0xd0, 0xac, 0x11, 0x30, 0x21,
+ 0x57, 0xf0, 0x89, 0xf0,
+ 0x00, 0x22, 0x00, 0x10, 0x0f, 0x00, 0xde, 0x00, 0x10, 0x00, 0xff, 0x03,
+ 0x01, 0x1c, 0x40, 0x03,
+ 0xd0, 0xa0, 0x00, 0x2e, 0x0c, 0x00, 0x25, 0x00, 0x00, 0xe1, 0xed, 0x10,
+ 0x60, 0x0e, 0xec, 0x0f,
+ 0x01, 0xbe, 0xec, 0x53, 0x43, 0x26, 0xed, 0xec, 0x14, 0x44, 0xff, 0xfd,
+ 0x10, 0xf0, 0xce, 0x13,
+ 0x22, 0xec, 0x01, 0x55, 0xdd, 0xd0, 0x00, 0x72, 0x1d, 0x0c, 0x27, 0x22,
+ 0xec, 0xff, 0x23, 0x02,
+ 0xcf, 0x0f, 0x0e, 0xdf, 0x00, 0x40, 0x2f, 0xa8, 0x00, 0xf3, 0xf0, 0xed,
+ 0xe0, 0x01, 0x20, 0x71,
+ 0x32, 0xed, 0x0c, 0x0e, 0x03, 0x17, 0xf1, 0xff, 0x20, 0xef, 0xef, 0xdd,
+ 0x8a, 0x02, 0x47, 0x01,
+ 0xce, 0xfe, 0x10, 0x23, 0x00, 0x00, 0x41, 0x0f, 0xdf, 0x33, 0x21, 0x00,
+ 0xed, 0xed, 0x70, 0x12,
+ 0xe1, 0xe6, 0x33, 0x01, 0xe2, 0x62, 0x40, 0x01, 0xc0, 0x16, 0x31, 0x00,
+ 0x1f, 0xfc, 0xfd, 0x23,
+ 0x34, 0xef, 0x50, 0x52, 0xf9, 0xf0, 0x43, 0x36, 0xef, 0xef, 0x00, 0x3f,
+ 0x52, 0x00, 0xbc, 0x10,
+ 0x76, 0x00, 0x00, 0xff, 0x10, 0x02, 0x13, 0x03, 0xff, 0xfb, 0x00, 0x01,
+ 0x02, 0xe0, 0x23, 0x53,
+ 0x00, 0xf1, 0x24, 0x20, 0x15, 0x01, 0xee, 0x10, 0x77, 0x20, 0xf0, 0x01,
+ 0x34, 0x51, 0x11, 0x0d,
+ 0xc0, 0x00, 0x32, 0x20, 0x00, 0x17, 0x36, 0xae, 0xee, 0x32, 0x63, 0x00,
+ 0xdd, 0x12, 0x13, 0x0f,
+ 0x21, 0x45, 0xce, 0x0d, 0x32, 0x45, 0x02, 0x00, 0x00, 0xec, 0x0f, 0x71,
+ 0x24, 0xdc, 0xcf, 0x00,
+ 0x22, 0xf0, 0xff, 0x00, 0x0c, 0x00, 0x12, 0x1f, 0xf9, 0x40, 0x32, 0xd0,
+ 0x0e, 0xf0, 0xf1, 0x3f,
+ 0x6f, 0x03, 0xff, 0xed, 0x32, 0x24, 0xd9, 0x0e, 0x52, 0x03, 0x8f, 0x0b,
+ 0xf0, 0x10, 0x20, 0x03,
+ 0x00, 0x00, 0x31, 0x02, 0x9a, 0x00, 0x55, 0x00, 0xcd, 0x0f, 0xff, 0xe0,
+ 0x12, 0x22, 0xee, 0xd0,
+ 0x02, 0x20, 0x0f, 0xcd, 0xe2, 0x27, 0x15, 0xdc, 0xcd, 0xe0, 0xe2, 0x34,
+ 0x20, 0xad, 0xff, 0x00,
+ 0x15, 0xf0, 0xbd, 0x0e, 0x30, 0xc0, 0xba, 0xf0, 0x00, 0x01, 0x00, 0xf0,
+ 0xee, 0xbd, 0x00, 0x11,
+ 0x00, 0xcf, 0xfd, 0x0a, 0xfc, 0xee, 0x0f, 0x00, 0x42, 0xdd, 0xdb, 0x00,
+ 0x3e, 0x71, 0xf3, 0xae,
+ 0x0e, 0x1f, 0x2e, 0x23, 0x17, 0x03, 0xcc, 0x0d, 0x00, 0x10, 0xdd, 0x0e,
+ 0x41, 0x12, 0x01, 0xdc,
+ 0xdd, 0x05, 0x42, 0xc9, 0xbc, 0x42, 0x33, 0xbe, 0xfe, 0x01, 0x01, 0x0f,
+ 0x20, 0x24, 0x10, 0xf0,
+ 0xc0, 0xf0, 0xfe, 0x51, 0x10, 0xb8, 0x0f, 0x00, 0x02, 0xf0, 0x05, 0x00,
+ 0xbf, 0xfd, 0x13, 0x44,
+ 0x00, 0xde, 0x0f, 0x02, 0xce, 0xdc, 0x20, 0x2b, 0x0e, 0x02, 0xf3, 0xc0,
+ 0xaa, 0xf0, 0x10, 0x20,
+ 0xf1, 0xd0, 0x00, 0xe0, 0x8c, 0xf2, 0x45, 0xfc, 0xbc, 0x01, 0x34, 0x00,
+ 0xcb, 0x00, 0x21, 0x21,
+ 0x00, 0x01, 0xe0, 0xbc, 0x00, 0x01, 0x22, 0xfd, 0x00, 0x00, 0xee, 0x03,
+ 0xf0, 0xdd, 0xee, 0x52,
+ 0x31, 0xeb, 0xbc, 0x00, 0x26, 0x20, 0x00, 0x9d, 0x0c, 0x22, 0x47, 0x00,
+ 0xcd, 0x0e, 0x02, 0x14,
+ 0x00, 0xbc, 0x00, 0x01, 0x21, 0x01, 0x1f, 0xfd, 0xdf, 0x0f, 0x10, 0x54,
+ 0x01, 0xbb, 0x0f, 0x32,
+ 0x32, 0xce, 0x00, 0x23, 0xf8, 0xff, 0x62, 0x01, 0xdf, 0x00, 0x00, 0xf0,
+ 0x10, 0x30, 0x1e, 0x1f,
+ 0xd0, 0xdf, 0xb8, 0xfe, 0x40, 0x47, 0xf0, 0xd0, 0x50, 0x0f, 0x0f, 0xce,
+ 0xf0, 0x00, 0x33, 0x41,
+ 0xef, 0xab, 0x10, 0x34, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x10, 0x67,
+ 0x11, 0xff, 0x00, 0x00,
+ 0x22, 0x0e, 0xee, 0x23, 0x75, 0x11, 0xf0, 0xed, 0x00, 0x46, 0x44, 0x00,
+ 0xf0, 0x0e, 0xf0, 0x01,
+ 0x64, 0x01, 0x00, 0xf0, 0x11, 0x40, 0xfd, 0x06, 0x13, 0x0c, 0xdd, 0x65,
+ 0x22, 0x00, 0x0e, 0x02,
+ 0x03, 0x10, 0x0e, 0x33, 0x11, 0x22, 0x22, 0x66, 0x51, 0xff, 0xfd, 0x01,
+ 0x34, 0x34, 0xe0, 0xc0,
+ 0x1e, 0x31, 0x11, 0x03, 0x20, 0xde, 0x30, 0x77, 0x2e, 0x0f, 0x27, 0x12,
+ 0x30, 0x31, 0x80, 0xff,
+ 0x10, 0x30, 0x02, 0xf4, 0xcf, 0xff, 0x22, 0x26, 0x01, 0x21, 0x20, 0x52,
+ 0x0f, 0xff, 0x01, 0xf0,
+ 0xed, 0x36, 0x03, 0x10, 0x72, 0x1f, 0xa9, 0x00, 0x25, 0x21, 0xe0, 0x00,
+ 0x21, 0x22, 0xde, 0xcb,
+ 0xde, 0x01, 0x34, 0xd2, 0x9d, 0xfc, 0x20, 0x32, 0xe0, 0x1f, 0x63, 0xf2,
+ 0xe0, 0xcc, 0x1e, 0x33,
+ 0x00, 0x10, 0x01, 0xe1, 0xde, 0xdc, 0xf1, 0x02, 0x0c, 0x0f, 0xd1, 0x8a,
+ 0xad, 0x11, 0x35, 0x0f,
+ 0xed, 0x00, 0x0e, 0xee, 0x0f, 0x0e, 0x0f, 0x20, 0x55, 0x20, 0xf9, 0x9c,
+ 0x00, 0x00, 0xf1, 0x11,
+ 0x00, 0xdd, 0xee, 0x00, 0x71, 0x0e, 0xda, 0x25, 0x31, 0xdc, 0xcf, 0x22,
+ 0x55, 0xee, 0xdd, 0x10,
+ 0x34, 0xff, 0xdd, 0x31, 0x30, 0x0f, 0xfd, 0xd0, 0x03, 0x24, 0x00, 0x88,
+ 0xef, 0x00, 0x30, 0x01,
+ 0xe0, 0x12, 0x10, 0xaa, 0x10, 0x23, 0xf0, 0xff, 0x0f, 0xef, 0xce, 0x41,
+ 0x54, 0xf0, 0xdd, 0xe0,
+ 0xe1, 0xe0, 0xeb, 0xff, 0x44, 0x12, 0x00, 0x0f, 0xdb, 0x9e, 0xf0, 0x00,
+ 0x54, 0x00, 0xc0, 0x0f,
+ 0x00, 0x20, 0x1f, 0x0f, 0xee, 0x0b, 0x40, 0x45, 0x01, 0xdc, 0x0e, 0x20,
+ 0x23, 0x2e, 0x0c, 0x11,
+ 0x34, 0x8e, 0xf0, 0x25, 0x31, 0x0f, 0x0f, 0xbc, 0xee, 0x20, 0x56, 0xf0,
+ 0xdd, 0x00, 0xe0, 0xe0,
+ 0x12, 0x30, 0x0f, 0xfd, 0xed, 0x1e, 0x75, 0x00, 0xdc, 0xde, 0x02, 0x22,
+ 0x63, 0x01, 0xbb, 0xde,
+ 0x01, 0x55, 0xf0, 0xe0, 0x00, 0x01, 0xf0, 0x01, 0x12, 0x10, 0xee, 0x04,
+ 0x04, 0xb9, 0x10, 0x40,
+ 0x11, 0xbe, 0xfe, 0x06, 0x10, 0x1d, 0x01, 0x16, 0xa0, 0xed, 0x01, 0x22,
+ 0xdf, 0xf0, 0x24, 0xef,
+ 0xed, 0x21, 0x22, 0xd0, 0xef, 0x51, 0x11, 0xed, 0xcc, 0x0e, 0x10, 0x01,
+ 0xcd, 0x30, 0x5f, 0xe8,
+ 0xfc, 0x22, 0x03, 0xed, 0xbc, 0x10, 0x4f, 0x20, 0x20, 0x9a, 0xcc, 0x00,
+ 0x31, 0x00, 0xee, 0x11,
+ 0x2f, 0xee, 0x10, 0x34, 0x20, 0x00, 0xac, 0x10, 0x21, 0x00, 0xfd, 0xef,
+ 0x00, 0xfe, 0x00, 0xfe,
+ 0x34, 0xf4, 0x8d, 0x0c, 0x42, 0x01, 0xc0, 0x17, 0x57, 0x0f, 0xde, 0xef,
+ 0x01, 0x44, 0x21, 0x00,
+ 0xd0, 0xfd, 0xf0, 0xf2, 0x01, 0x11, 0x21, 0xe1, 0x00, 0xe0, 0x0f, 0x72,
+ 0x14, 0xef, 0xef, 0x37,
+ 0x44, 0xfe, 0xee, 0x00, 0xa4, 0x05, 0x20, 0x0c, 0xce, 0xb0, 0xff, 0x32,
+ 0x63, 0xeb, 0xfd, 0x00,
+ 0x01, 0x04, 0x31, 0x1f, 0xfb, 0xce, 0x01, 0x04, 0x00, 0xce, 0x0f, 0xfd,
+ 0xed, 0x0d, 0x34, 0x02,
+ 0xcd, 0x00, 0x00, 0xdf, 0x10, 0x77, 0x62, 0xef, 0xec, 0x10, 0x42, 0x11,
+ 0xed, 0x10, 0x01, 0xef,
+ 0xe0, 0x27, 0x30, 0xdb, 0x00, 0x21, 0x21, 0xb0, 0xa0, 0xf1, 0x00, 0x10,
+ 0x57, 0x33, 0xde, 0xed,
+ 0x33, 0x33, 0xff, 0xc0, 0x05, 0x50, 0x0f, 0xff, 0xa0, 0x14, 0x22, 0x0f,
+ 0xfe, 0x05, 0x05, 0x01,
+ 0xf0, 0x11, 0x10, 0xf1, 0x03, 0x12, 0xed, 0x20, 0x35, 0x8e, 0xeb, 0x51,
+ 0x13, 0xdd, 0xf0, 0x30,
+ 0x2f, 0x0e, 0xaf, 0x00, 0x0d, 0x0c, 0x12, 0x12, 0xdc, 0x01, 0x57, 0x22,
+ 0xfe, 0xdc, 0x2f, 0x34,
+ 0x22, 0x0f, 0x0e, 0x20, 0xa0, 0xeb, 0x10, 0x32, 0x00, 0x10, 0x31, 0x00,
+ 0xdd, 0x10, 0x0f, 0x42,
+ 0x37, 0xf5, 0xbe, 0xef, 0x2f, 0x60, 0x0f, 0x0f, 0x34, 0x52, 0xdd, 0x88,
+ 0x00, 0x43, 0x01, 0x10,
+ 0x00, 0xf0, 0x10, 0x53, 0xfe, 0xfb, 0x00, 0x15, 0x30, 0x0f, 0x11, 0x12,
+ 0xfe, 0x20, 0x70, 0x13,
+ 0x00, 0x04, 0xff, 0x0c, 0x10, 0x42, 0x00, 0xed, 0x00, 0x37, 0xf0, 0xc0,
+ 0x41, 0x44, 0xdd, 0xed,
+ 0x43, 0x20, 0x1f, 0x21, 0x00, 0xcc, 0x43, 0x77, 0x02, 0xcc, 0x1f, 0x13,
+ 0x23, 0xfd, 0xff, 0x15,
+ 0x00, 0xd0, 0x10, 0x0d, 0x0d, 0xe3, 0x16, 0x61, 0x10, 0x0f, 0x0c, 0x00,
+ 0x13, 0x34, 0x73, 0x10,
+ 0xed, 0xfe, 0x12, 0x00, 0xfe, 0xe0, 0xf7, 0xe0, 0x31, 0x42, 0xe0, 0xf0,
+ 0x33, 0x34, 0xf0, 0xfe,
+ 0x32, 0x60, 0x3e, 0x30, 0xd3, 0x83, 0x07, 0x33, 0xe8, 0xdd, 0x51, 0x03,
+ 0xf2, 0x13, 0xff, 0xdd,
+ 0xf0, 0x30, 0x76, 0xf0, 0xdd, 0xfe, 0xff, 0x12, 0x46, 0x00, 0x0f, 0x10,
+ 0x01, 0xd0, 0xab, 0x21,
+ 0x64, 0x0e, 0xdd, 0x21, 0x35, 0x00, 0xce, 0x0d, 0x00, 0x37, 0x41, 0xdf,
+ 0xcd, 0x11, 0x32, 0x00,
+ 0xde, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xae, 0x15, 0x74, 0x00, 0x0d,
+ 0xdf, 0x00, 0x01, 0x52,
+ 0x01, 0xfb, 0xef, 0x00, 0xf1, 0x12, 0x21, 0x0c, 0xbd, 0x01, 0x07, 0x01,
+ 0x00, 0xda, 0x9f, 0x00,
+ 0x02, 0xf0, 0xee, 0x02, 0x01, 0xed, 0xed, 0xf0, 0xd0, 0xfc, 0x0f, 0xc0,
+ 0x90, 0x10, 0x4e, 0x25,
+ 0xca, 0xdd, 0x32, 0x24, 0xdf, 0xe0, 0xee, 0xdf, 0x10, 0x4f, 0xd8, 0xd0,
+ 0xe1, 0xae, 0xfc, 0x31,
+ 0x23, 0xd1, 0xbd, 0xfb, 0xff, 0x0e, 0x50, 0x0f, 0x12, 0x04, 0x0e, 0x0e,
+ 0xac, 0xdd, 0x10, 0x00,
+ 0xde, 0xff, 0x11, 0x00, 0x08, 0x0f, 0xdf, 0x01, 0x53, 0xce, 0xba, 0x10,
+ 0x73, 0x0f, 0x0c, 0xe0,
+ 0x03, 0x00, 0xdb, 0x0f, 0x30, 0x00, 0xc1, 0xde, 0xff, 0x13, 0x00, 0x98,
+ 0x00, 0x42, 0xf1, 0xdf,
+ 0x00, 0xfe, 0xfd, 0xe0, 0xfe, 0xef, 0x00, 0xf1, 0xdd, 0x00, 0xd3, 0x9d,
+ 0xfe, 0xea, 0xec, 0x21,
+ 0x56, 0xc0, 0xcd, 0xfe, 0x02, 0x13, 0x01, 0xc2, 0xfe, 0xfd, 0x16, 0x11,
+ 0xcd, 0xed, 0xf0, 0x00,
+ 0x61, 0x0e, 0xd9, 0xe0, 0x43, 0x10, 0x0d, 0xe3, 0x12, 0x2b, 0x0a, 0xf0,
+ 0xf0, 0x76, 0x60, 0x00,
+ 0xdd, 0x00, 0x03, 0x00, 0x10, 0x20, 0x30, 0x01, 0xe0, 0x0e, 0x11, 0x20,
+ 0xfd, 0xb9, 0x10, 0x75,
+ 0x10, 0xf0, 0x0e, 0x2f, 0x3f, 0x52, 0x05, 0xd0, 0xed, 0x1f, 0x62, 0x01,
+ 0xfc, 0x00, 0x03, 0x32,
+ 0xfe, 0xdf, 0x23, 0x0e, 0xec, 0x05, 0x74, 0x10, 0xd0, 0xf3, 0xef, 0x0c,
+ 0x72, 0x04, 0xe1, 0x02,
+ 0x40, 0x02, 0xe2, 0x24, 0x10, 0xfe, 0x24, 0x23, 0xde, 0xf1, 0x02, 0xe0,
+ 0x17, 0x23, 0x0e, 0x0f,
+ 0x02, 0x93, 0x23, 0x56, 0x32, 0x00, 0xeb, 0x20, 0x64, 0x01, 0x11, 0x2f,
+ 0x41, 0x26, 0x10, 0x00,
+ 0x22, 0x31, 0x10, 0x10, 0xe3, 0xc0, 0x63, 0x47, 0xf0, 0xcc, 0x05, 0x05,
+ 0x82, 0x00, 0xee, 0x00,
+ 0x98, 0x2f, 0x89, 0x33, 0xb1, 0x32, 0xa0, 0x3b, 0x65, 0x01, 0xff, 0xee,
+ 0x00, 0x01, 0x71, 0x00,
+ 0x00, 0xf5, 0x10, 0x30, 0x30, 0xef, 0xdd, 0x30, 0x24, 0x05, 0x23, 0x2d,
+ 0x0c, 0x4f, 0x70, 0x25,
+ 0x02, 0xe0, 0xee, 0x01, 0x31, 0x2f, 0xfd, 0x77, 0x25, 0xff, 0xde, 0x00,
+ 0x00, 0xd2, 0xe0, 0x65,
+ 0x52, 0x00, 0xee, 0xe0, 0x10, 0x02, 0xf0, 0x03, 0x21, 0x2d, 0x2f, 0x43,
+ 0x07, 0x01, 0xd0, 0xed,
+ 0x30, 0x70, 0x26, 0xf0, 0xbe, 0xfe, 0x33, 0x42, 0xfe, 0x00, 0x31, 0xfb,
+ 0x0f, 0x20, 0x22, 0x01,
+ 0xda, 0x8e, 0xfe, 0x00, 0x0e, 0x63, 0x13, 0xfb, 0x0e, 0xce, 0xfc, 0x12,
+ 0x02, 0xec, 0x0f, 0x75,
+ 0x10, 0xcd, 0x0e, 0x11, 0x12, 0x24, 0x54, 0xfe, 0xea, 0xdf, 0x20, 0x55,
+ 0x10, 0xff, 0xcd, 0x0f,
+ 0x00, 0x46, 0x10, 0xef, 0xdf, 0x00, 0x1f, 0x21, 0x02, 0xde, 0x0f, 0x73,
+ 0x04, 0x00, 0xff, 0x00,
+ 0xf0, 0x13, 0x61, 0x0f, 0xdb, 0xf2, 0x04, 0x1f, 0x0f, 0x03, 0xc0, 0x00,
+ 0x37, 0x23, 0xaf, 0xfe,
+ 0x00, 0x03, 0x0c, 0x31, 0x34, 0xe0, 0xee, 0x00, 0x32, 0xf0, 0xe0, 0x75,
+ 0x35, 0xed, 0x8c, 0x00,
+ 0x11, 0x0f, 0xfd, 0x00, 0x10, 0xdd, 0xed, 0x0f, 0x3d, 0xe0, 0x07, 0x01,
+ 0xde, 0x8c, 0xc0, 0x11,
+ 0x33, 0xdb, 0x01, 0x03, 0xfb, 0xbd, 0x0f, 0x02, 0xe0, 0xfc, 0xef, 0x00,
+ 0x22, 0x35, 0x10, 0xac,
+ 0xec, 0x00, 0xf1, 0x00, 0xde, 0x8b, 0xff, 0xf1, 0x11, 0x10, 0x00, 0x0e,
+ 0xfb, 0xf0, 0xf3, 0xd2,
+ 0xdf, 0x3f, 0x71, 0x10, 0xcc, 0xdf, 0x00, 0x10, 0x31, 0xc1, 0xf0, 0x00,
+ 0xf8, 0xcd, 0x0f, 0x00,
+ 0x11, 0x11, 0xfc, 0xcc, 0x1f, 0x40, 0x02, 0xae, 0xe8, 0xdf, 0xef, 0x50,
+ 0x20, 0xef, 0xcd, 0x1f,
+ 0x0e, 0x00, 0x0f, 0xf9, 0x1e, 0x71, 0x10, 0xe0, 0x25, 0x10, 0xca, 0xf0,
+ 0x30, 0x21, 0xcf, 0xdd,
+ 0x20, 0x11, 0xe0, 0x0e, 0x00, 0xcd, 0xd0, 0x23, 0x3f, 0x1d, 0x00, 0x8b,
+ 0xfb, 0x00, 0x31, 0x20,
+ 0xf0, 0xe0, 0xcc, 0xdd, 0xfe, 0xd0, 0xd0, 0x00, 0x62, 0xef, 0xb1, 0x06,
+ 0x11, 0x20, 0x03, 0x41,
+ 0x0d, 0xc8, 0x0f, 0x31, 0x31, 0xde, 0xf0, 0x04, 0x00, 0x0e, 0x6f, 0x0a,
+ 0xbc, 0x00, 0x11, 0xe0,
+ 0x01, 0x65, 0xff, 0xec, 0x00, 0x03, 0x10, 0x0f, 0x3f, 0x10, 0x21, 0xd0,
+ 0xa1, 0x16, 0x20, 0x0f,
+ 0x0f, 0x30, 0x72, 0x02, 0x07, 0x01, 0x1e, 0x1d, 0x01, 0x07, 0x53, 0x0f,
+ 0xf0, 0xe0, 0xff, 0x00,
+ 0x12, 0x01, 0xe0, 0xa3, 0xd0, 0xf0, 0x40, 0x22, 0xc0, 0xe4, 0x05, 0x00,
+ 0xf0, 0xfe, 0x55, 0x03,
+ 0x02, 0x04, 0xfd, 0x9d, 0x16, 0x55, 0x00, 0x0f, 0x00, 0xe0, 0xd2, 0x00,
+ 0x02, 0xe0, 0xaf, 0x00,
+ 0x05, 0x10, 0xda, 0x11, 0x53, 0xe0, 0xcc, 0x01, 0x22, 0xd0, 0xd0, 0xef,
+ 0x00, 0x11, 0x12, 0xe1,
+ 0x00, 0x08, 0xd0, 0xcf, 0xe3, 0x13, 0x6f, 0x0b, 0xcf, 0xff, 0xf0, 0x75,
+ 0x1e, 0xec, 0xc0, 0x00,
+ 0x65, 0x00, 0x0e, 0x00, 0xf0, 0x0e, 0x52, 0x00, 0xd9, 0xe0, 0x11, 0x31,
+ 0x20, 0x50, 0x0f, 0xdb,
+ 0xff, 0x30, 0x12, 0x14, 0x0f, 0xbc, 0xef, 0x11, 0x20, 0x11, 0x42, 0x11,
+ 0xfe, 0x00, 0x52, 0x11,
+ 0x0e, 0x00, 0x16, 0x20, 0xf0, 0x00, 0x10, 0xdf, 0xa0, 0x03, 0xf0, 0x2f,
+ 0x20, 0xe2, 0x33, 0x30,
+ 0xdf, 0xab, 0xec, 0x0d, 0x5d, 0x10, 0xf7, 0xc1, 0x0f, 0x1c, 0x10, 0x10,
+ 0x10, 0x53, 0x16, 0xdf,
+ 0xef, 0x25, 0x21, 0xdf, 0xdd, 0x72, 0x25, 0xee, 0xde, 0x30, 0x12, 0x00,
+ 0x61, 0x04, 0xda, 0xf0,
+ 0x20, 0x14, 0x00, 0x2d, 0x62, 0x10, 0x0e, 0xec, 0x00, 0x11, 0x04, 0x01,
+ 0x2f, 0x7f, 0x20, 0x25,
+ 0x76, 0x00, 0x00, 0x20, 0x20, 0x12, 0xdf, 0x00, 0x61, 0x1f, 0x20, 0x17,
+ 0x00, 0x0e, 0x01, 0x02,
+ 0x00, 0x7f, 0x3f, 0x02, 0x05, 0xd0, 0x0f, 0x0e, 0x60, 0x37, 0x01, 0xcf,
+ 0x0e, 0x11, 0x21, 0xff,
+ 0x15, 0x22, 0xff, 0xdf, 0xe3, 0xe4, 0x10, 0x7e, 0x00, 0x00, 0x37, 0x47,
+ 0xef, 0xdf, 0x40, 0x41,
+ 0x01, 0xe0, 0xe0, 0x00, 0x01, 0x01, 0xe0, 0x0f, 0xdf, 0x10, 0x40, 0xd0,
+ 0xb0, 0x04, 0x03, 0x52,
+ 0x0f, 0xd9, 0x01, 0x23, 0x00, 0xef, 0xef, 0x0e, 0x7c, 0x74, 0x57, 0xf0,
+ 0xee, 0x20, 0x22, 0x01,
+ 0x00, 0x0e, 0x01, 0x12, 0x0e, 0x0e, 0x12, 0x55, 0x31, 0xff, 0xea, 0x0f,
+ 0xef, 0x21, 0x63, 0x00,
+ 0xfb, 0x00, 0x42, 0x00, 0xda, 0x0f, 0x00, 0x02, 0xd0, 0x2f, 0x70, 0x2f,
+ 0xdf, 0xc0, 0x23, 0x37,
+ 0x10, 0xe0, 0xbb, 0xff, 0x21, 0x62, 0x00, 0xf0, 0x10, 0x00, 0xe0, 0x0d,
+ 0x31, 0x10, 0xd0, 0xce,
+ 0xdf, 0xe4, 0x03, 0xba, 0xfd, 0x10, 0x30, 0x01, 0xc0, 0xda, 0x00, 0x40,
+ 0x67, 0xf0, 0xbf, 0xfd,
+ 0x00, 0x20, 0x01, 0x11, 0x01, 0xde, 0xe0, 0x15, 0x10, 0xeb, 0x20, 0x50,
+ 0x00, 0xe0, 0xff, 0xce,
+ 0xe1, 0xe0, 0xbc, 0xed, 0x00, 0x00, 0x0c, 0x0d, 0xd0, 0xe0, 0x05, 0xc0,
+ 0x8d, 0xda, 0x00, 0x40,
+ 0xf2, 0xbd, 0xfb, 0x10, 0x11, 0x00, 0x01, 0xef, 0xfd, 0xef, 0x10, 0x23,
+ 0x12, 0xcb, 0xde, 0x00,
+ 0x30, 0xbd, 0xd8, 0x11, 0x22, 0xc0, 0xe1, 0x0f, 0xcd, 0xbf, 0x00, 0x27,
+ 0x00, 0xad, 0xef, 0xf0,
+ 0x10, 0x20, 0x11, 0xd2, 0xcd, 0x1b, 0x2f, 0xee, 0xa0, 0x02, 0x05, 0x1f,
+ 0x10, 0x01, 0xe0, 0xcc,
+ 0xee, 0x0d, 0x73, 0x17, 0xce, 0xec, 0x10, 0x34, 0x11, 0xdf, 0xbd, 0x0d,
+ 0x0f, 0xee, 0x01, 0x01,
+ 0x09, 0x0f, 0x11, 0xb0, 0xe0, 0x00, 0xdc, 0xdc, 0x10, 0x42, 0xe4, 0xcf,
+ 0xcb, 0xbe, 0xf0, 0x33,
+ 0x41, 0xfd, 0xcc, 0x02, 0x23, 0x00, 0xcd, 0x04, 0x02, 0x0c, 0xcd, 0xf0,
+ 0xff, 0x15, 0x00, 0xa9,
+ 0x00, 0x00, 0x42, 0x21, 0x00, 0xef, 0xee, 0x10, 0x43, 0x00, 0xdf, 0x00,
+ 0x00, 0x26, 0x01, 0x00,
+ 0x0b, 0xbe, 0x00, 0x12, 0x74, 0x0e, 0xe0, 0x00, 0x01, 0x0f, 0x4f, 0x20,
+ 0x13, 0x12, 0x1e, 0x1d,
+ 0x00, 0x10, 0x10, 0x5a, 0x40, 0xe0, 0x9c, 0x1e, 0x5f, 0x01, 0xdf, 0x0a,
+ 0x0d, 0x3f, 0x24, 0xf0,
+ 0xdb, 0x00, 0x11, 0x71, 0x2e, 0xf9, 0xdf, 0x21, 0x44, 0xf3, 0xcc, 0xfe,
+ 0x00, 0x55, 0x31, 0xf0,
+ 0xd0, 0x00, 0xf0, 0xf1, 0x00, 0x33, 0x72, 0xff, 0x00, 0x03, 0x00, 0xed,
+ 0xfb, 0x20, 0x23, 0x47,
+ 0x11, 0xef, 0x0f, 0x14, 0x43, 0xef, 0xce, 0xff, 0x37, 0x32, 0xcf, 0xd0,
+ 0x22, 0x74, 0x50, 0xff,
+ 0x05, 0x02, 0x11, 0x00, 0xf4, 0xf0, 0x00, 0x30, 0x30, 0x01, 0x11, 0x0e,
+ 0x1e, 0x52, 0x43, 0x44,
+ 0x12, 0x32, 0x0f, 0xeb, 0xf0, 0x31, 0x44, 0x01, 0xf1, 0xbf, 0xec, 0x20,
+ 0x71, 0x22, 0x37, 0x0f,
+ 0x10, 0x67, 0x11, 0x0f, 0xfb, 0x00, 0x62, 0x02, 0x0e, 0x11, 0x24, 0x20,
+ 0xfe, 0xff, 0x23, 0x76,
+ 0x10, 0xfd, 0xf0, 0x33, 0x12, 0x0e, 0x03, 0x25, 0xf0, 0xee, 0x01, 0x00,
+ 0x00, 0x22, 0x77, 0x10,
+ 0x11, 0x13, 0x00, 0x1f, 0x40, 0x55, 0x02, 0x13, 0x40, 0x00, 0x1f, 0x01,
+ 0x02, 0x40, 0x42, 0x03,
+ 0xbc, 0x00, 0x03, 0x02, 0xf4, 0xd1, 0xf1, 0x02, 0x02, 0x03, 0x2a, 0x0a,
+ 0x60, 0x65, 0x02, 0xee,
+ 0xcb, 0x10, 0x21, 0x23, 0x10, 0xe0, 0xfd, 0xfd, 0x32, 0x13, 0xad, 0x0c,
+ 0x13, 0x35, 0x10, 0xf0,
+ 0xe0, 0xdf, 0xaa, 0xfd, 0xf0, 0x24, 0x41, 0x0f, 0xcb, 0xff, 0xfe, 0x32,
+ 0x22, 0xe0, 0xac, 0x0f,
+ 0x20, 0x41, 0x00, 0xf2, 0x12, 0xfe, 0xb8, 0xf0, 0x10, 0x00, 0xdf, 0xd0,
+ 0xf2, 0x64, 0x10, 0x0d,
+ 0xc0, 0xff, 0x01, 0x36, 0x42, 0xf0, 0xce, 0xed, 0x0f, 0x32, 0x21, 0xf0,
+ 0x00, 0xd0, 0xab, 0xe0,
+ 0x02, 0xe2, 0xf0, 0xdc, 0xca, 0xee, 0x11, 0x44, 0xd0, 0xcf, 0xfe, 0xcf,
+ 0xde, 0x0d, 0x0f, 0x60,
+ 0x02, 0xe0, 0xed, 0xfb, 0xda, 0x9c, 0xfe, 0x01, 0x00, 0xba, 0x01, 0x22,
+ 0xee, 0xea, 0x00, 0x10,
+ 0x01, 0xd0, 0xe0, 0x10, 0xdb, 0x9e, 0xf0, 0xf0, 0x31, 0x32, 0xdf, 0x9a,
+ 0xff, 0x00, 0x00, 0x21,
+ 0x3f, 0x30, 0x02, 0xd0, 0x0d, 0xec, 0xfe, 0x01, 0x02, 0xef, 0x40, 0x0b,
+ 0xab, 0x00, 0x03, 0x11,
+ 0xcd, 0xfd, 0x03, 0xef, 0x89, 0x00, 0x13, 0x30, 0x60, 0x0f, 0xed, 0xe0,
+ 0x42, 0x00, 0xf0, 0xd1,
+ 0x00, 0x0b, 0x1f, 0xe1, 0xe0, 0x09, 0xef, 0x00, 0x0f, 0x41, 0x00, 0xb0,
+ 0xf2, 0x12, 0x1f, 0x25,
+ 0x03, 0x00, 0x72, 0x20, 0x0f, 0x10, 0x00, 0x55, 0x20, 0xec, 0xdf, 0x0e,
+ 0xf0, 0xd2, 0x93, 0xd0,
+ 0xf0, 0x08, 0x1d, 0x00, 0xd1, 0x47, 0x30, 0xae, 0xef, 0xf1, 0x33, 0x00,
+ 0xf0, 0xcf, 0xeb, 0xfe,
+ 0x12, 0x54, 0xec, 0xdd, 0x02, 0x00, 0x6f, 0x34, 0xff, 0xa9, 0x00, 0x00,
+ 0x12, 0x0f, 0xdc, 0xf0,
+ 0x03, 0x20, 0x1e, 0xc8, 0xde, 0x00, 0x22, 0x12, 0x10, 0xce, 0xcd, 0xed,
+ 0x0f, 0x31, 0xd5, 0x9f,
+ 0x0e, 0x41, 0x03, 0x01, 0xd0, 0xcc, 0x00, 0x04, 0x00, 0xf0, 0x11, 0x16,
+ 0xc0, 0xbf, 0xfe, 0x0f,
+ 0x1f, 0x20, 0x00, 0x15, 0xe0, 0x8e, 0xfd, 0x01, 0x55, 0xff, 0xde, 0x01,
+ 0xf0, 0x0b, 0x10, 0x22,
+ 0xf3, 0x9a, 0x00, 0x0f, 0x2f, 0x01, 0x36, 0x00, 0xef, 0x20, 0x42, 0x1f,
+ 0x0f, 0x01, 0x06, 0xb0,
+ 0x00, 0x00, 0x3e, 0x0e, 0xdc, 0xbf, 0x01, 0x21, 0x2d, 0x1e, 0xe1, 0xd3,
+ 0x0d, 0x0e, 0x45, 0x03,
+ 0xe9, 0x9d, 0xef, 0xf3, 0x46, 0x3f, 0xfb, 0xc0, 0xf0, 0x13, 0x70, 0x00,
+ 0x20, 0x20, 0x0f, 0x0e,
+ 0xf2, 0xe2, 0xd0, 0x35, 0x3f, 0xfe, 0x00, 0x20, 0xb2, 0x80, 0xf0, 0x25,
+ 0x30, 0x20, 0x12, 0xf1,
+ 0xba, 0x0e, 0x10, 0x33, 0x41, 0x00, 0x1f, 0x00, 0xfd, 0x20, 0x57, 0x03,
+ 0xfe, 0xff, 0xff, 0x00,
+ 0x53, 0x27, 0x01, 0xcf, 0xfe, 0x00, 0x22, 0x77, 0x01, 0x00, 0xff, 0x11,
+ 0x32, 0x33, 0xef, 0xcc,
+ 0x00, 0x25, 0x43, 0x01, 0xf0, 0xcc, 0xfe, 0x10, 0x31, 0x12, 0x11, 0x10,
+ 0x20, 0xcf, 0x8e, 0xde,
+ 0x0c, 0x20, 0x46, 0x02, 0xd0, 0xee, 0x01, 0x11, 0x32, 0x23, 0xe0, 0xd5,
+ 0x37, 0x21, 0x8d, 0x8b,
+ 0x02, 0x36, 0x30, 0xf0, 0xde, 0x00, 0xe0, 0x03, 0x21, 0x21, 0xdf, 0xcf,
+ 0x03, 0x43, 0x0e, 0xfd,
+ 0x04, 0x44, 0x00, 0xde, 0x23, 0x77, 0x10, 0xed, 0xf0, 0x00, 0x43, 0x03,
+ 0x1f, 0x0d, 0x0c, 0x12,
+ 0x65, 0x00, 0x20, 0x50, 0x0e, 0x0f, 0x02, 0x03, 0x3d, 0x2b, 0x21, 0x14,
+ 0x1e, 0x0c, 0x00, 0x11,
+ 0x72, 0x5d, 0x0a, 0xf0, 0x04, 0x1f, 0x1e, 0x20, 0x20, 0x00, 0x00, 0x43,
+ 0x1f, 0x08, 0x00, 0x42,
+ 0x21, 0xef, 0xc0, 0x11, 0x41, 0x0f, 0xee, 0x50, 0x64, 0x00, 0xef, 0x00,
+ 0x36, 0x43, 0x21, 0xee,
+ 0xfe, 0xed, 0xef, 0x27, 0x64, 0x0f, 0x0f, 0x54, 0x03, 0xef, 0x00, 0x14,
+ 0x00, 0xde, 0xf0, 0x26,
+ 0x10, 0x0e, 0x31, 0x02, 0xcf, 0x20, 0x77, 0x00, 0xd0, 0x1f, 0x40, 0x10,
+ 0x20, 0x03, 0xc0, 0xf0,
+ 0x11, 0x6f, 0x1e, 0x00, 0x01, 0x00, 0x0e, 0x2e, 0xe9, 0xe2, 0x02, 0x0d,
+ 0x4d, 0x73, 0x01, 0xea,
+ 0xfe, 0x02, 0x24, 0x31, 0x0c, 0xdd, 0x71, 0x35, 0x01, 0xee, 0xcb, 0xe0,
+ 0x10, 0x42, 0x00, 0xf0,
+ 0xdf, 0x15, 0x13, 0x02, 0x0f, 0x0e, 0xd0, 0x80, 0x00, 0x12, 0x20, 0xfe,
+ 0xf7, 0x07, 0xde, 0xac,
+ 0x00, 0x23, 0x00, 0x00, 0xc1, 0xd1, 0x02, 0x23, 0x22, 0x9d, 0xed, 0x00,
+ 0x31, 0x05, 0xd0, 0x9c,
+ 0x12, 0x47, 0xe0, 0xdf, 0xe1, 0xe1, 0xdd, 0xdd, 0x10, 0x42, 0xf0, 0xc0,
+ 0x02, 0x45, 0x0d, 0xeb,
+ 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xca, 0xff, 0x10, 0xd0, 0x8a, 0xf0, 0x40,
+ 0x12, 0xce, 0xee, 0xf1,
+ 0x00, 0x0c, 0x1f, 0x10, 0x11, 0x03, 0xee, 0xd8, 0x1f, 0x50, 0x20, 0xe0,
+ 0xce, 0xfe, 0x2f, 0x1b,
+ 0xde, 0x8f, 0xf1, 0xd2, 0xed, 0xfd, 0x00, 0x2e, 0xea, 0xde, 0xe2, 0x21,
+ 0x50, 0x1f, 0xfd, 0xfd,
+ 0x0c, 0xbc, 0xe0, 0x00, 0x0f, 0x40, 0x0e, 0xf0, 0x9f, 0xe9, 0x00, 0x35,
+ 0x00, 0xcd, 0x0f, 0xf0,
+ 0xe0, 0xbc, 0xfd, 0x35, 0x30, 0x9c, 0xdd, 0xee, 0x10, 0x64, 0x0f, 0xed,
+ 0xff, 0x0e, 0xf0, 0x00,
+ 0x01, 0xe8, 0xdd, 0xd0, 0x00, 0xf1, 0x00, 0x30, 0x3d, 0x0e, 0xcf, 0xe0,
+ 0xf1, 0xa3, 0xe0, 0xcd,
+ 0xc8, 0xfe, 0x01, 0x01, 0x0c, 0x0c, 0x00, 0x0d, 0x11, 0x42, 0xcc, 0xbf,
+ 0x02, 0x03, 0x0f, 0x02,
+ 0xd7, 0x13, 0x2b, 0x0d, 0x01, 0xb2, 0xde, 0xfe, 0x12, 0x45, 0x61, 0x10,
+ 0xdb, 0xd0, 0x22, 0x57,
+ 0xf0, 0xdd, 0x00, 0x33, 0x00, 0xed, 0xff, 0x10, 0x43, 0x31, 0x31, 0x0f,
+ 0xbf, 0x00, 0x00, 0x60,
+ 0x10, 0x25, 0x11, 0xeb, 0xd0, 0x20, 0x75, 0x00, 0xd0, 0xc0, 0xfe, 0x10,
+ 0x45, 0x24, 0x00, 0xac,
+ 0x01, 0x23, 0x0e, 0x00, 0x45, 0x21, 0x00, 0x0e, 0xf2, 0x02, 0x00, 0x30,
+ 0x2f, 0x11, 0x57, 0x04,
+ 0xdd, 0xee, 0x31, 0x15, 0x00, 0xef, 0x30, 0x72, 0x31, 0x30, 0x2f, 0x00,
+ 0x43, 0x76, 0x10, 0xf0,
+ 0x10, 0x20, 0x12, 0x01, 0x10, 0x20, 0x73, 0x0f, 0xea, 0xf1, 0x47, 0x33,
+ 0xf0, 0xdd, 0x0f, 0x70,
+ 0x13, 0x00, 0x00, 0x0e, 0x21, 0x57, 0x12, 0x0f, 0xfe, 0x10, 0x22, 0x01,
+ 0xe1, 0xcf, 0xed, 0x24,
+ 0x50, 0xea, 0x0e, 0x21, 0x43, 0x00, 0xc0, 0x13, 0x66, 0x10, 0x10, 0x0f,
+ 0x0f, 0x01, 0x13, 0x23,
+ 0x30, 0x10, 0x10, 0x40, 0x42, 0x27, 0x01, 0x00, 0x0f, 0x1e, 0x00, 0xe5,
+ 0x03, 0x22, 0x52, 0x32,
+ 0x0c, 0xcb, 0xf0, 0x65, 0x32, 0x10, 0x0d, 0x10, 0x21, 0x12, 0x14, 0x10,
+ 0x61, 0x31, 0xf0, 0xfc,
+ 0x23, 0x74, 0x20, 0x00, 0x00, 0x05, 0x02, 0xcf, 0x0d, 0x0e, 0xea, 0xe0,
+ 0x42, 0x35, 0xf0, 0x8b,
+ 0x0f, 0x21, 0x21, 0xe0, 0xf0, 0x00, 0xc1, 0xf1, 0xf2, 0x11, 0x0f, 0xd8,
+ 0xdf, 0x70, 0x32, 0x01,
+ 0xad, 0x0f, 0xf0, 0x01, 0x04, 0x02, 0x10, 0xff, 0xbe, 0x05, 0x22, 0xe0,
+ 0xee, 0x01, 0x10, 0x0b,
+ 0xe0, 0xe0, 0x01, 0x41, 0x1f, 0xee, 0xad, 0xcc, 0xf0, 0x27, 0x42, 0x0c,
+ 0x0f, 0x20, 0x0f, 0xdf,
+ 0xfe, 0xdf, 0x02, 0x77, 0x43, 0xdb, 0xff, 0x20, 0x10, 0x00, 0x76, 0x21,
+ 0xf0, 0xef, 0x1f, 0x30,
+ 0x01, 0x0f, 0x00, 0x42, 0xf2, 0xdd, 0xeb, 0x00, 0x41, 0x02, 0xd1, 0x0d,
+ 0xea, 0xdf, 0x00, 0x75,
+ 0x70, 0xf0, 0xdc, 0x01, 0x00, 0xf1, 0x00, 0xff, 0x9d, 0x13, 0x15, 0x0e,
+ 0xdd, 0xff, 0xf0, 0x06,
+ 0x00, 0xe0, 0xfe, 0xd0, 0xc0, 0xf0, 0x0f, 0x33, 0xc2, 0xad, 0xfb, 0x11,
+ 0xff, 0xeb, 0x00, 0x44,
+ 0xe0, 0xdd, 0xbd, 0x0f, 0xdd, 0xfd, 0x0e, 0x40, 0x00, 0xec, 0xfa, 0x10,
+ 0x22, 0xd0, 0xd0, 0xfe,
+ 0x1f, 0x1f, 0xbd, 0xf0, 0x17, 0xdf, 0x8b, 0xcf, 0x0d, 0x00, 0x20, 0x1f,
+ 0x0c, 0xf0, 0x0f, 0x5e,
+ 0xdb, 0xef, 0x44, 0x21, 0xab, 0xef, 0x00, 0x00, 0x01, 0x2f, 0x2e, 0xea,
+ 0xbf, 0xef, 0xef, 0xf0,
+ 0x30, 0x3f, 0x0c, 0x00, 0xd1, 0x8d, 0x0e, 0x33, 0x11, 0xf0, 0xbc, 0xe0,
+ 0xd0, 0x05, 0x23, 0xfd,
+ 0xdb, 0x0f, 0x10, 0x02, 0x90, 0x03, 0xf0, 0xda, 0xef, 0x00, 0xb0, 0xdd,
+ 0xfc, 0x43, 0x11, 0xcb,
+ 0xef, 0x0f, 0xff, 0xd1, 0xf6, 0xf1, 0xbe, 0xca, 0x0f, 0x21, 0x42, 0x00,
+ 0x10, 0xff, 0xcf, 0xf0,
+ 0x00, 0x0e, 0x3c, 0x2d, 0x2f, 0x10, 0x1e, 0xd0, 0xad, 0x0e, 0x05, 0x05,
+ 0x45, 0x00, 0x3b, 0x00,
+ 0x15, 0xff, 0x5e, 0xdd, 0x65, 0xfc, 0x5c, 0xde, 0xbd, 0xe8, 0x10, 0x50,
+ 0x00, 0x0f, 0x32, 0x10,
+ 0xfb, 0xac, 0x00, 0x32, 0x51, 0xea, 0xe0, 0x13, 0x43, 0x0d, 0xdc, 0x12,
+ 0x26, 0x00, 0xde, 0x00,
+ 0x36, 0x00, 0x20, 0x0f, 0x50, 0x30, 0x03, 0x00, 0xee, 0xdd, 0x23, 0x47,
+ 0xb3, 0x9e, 0xef, 0x11,
+ 0x35, 0xf0, 0xef, 0x00, 0x32, 0xe1, 0x01, 0x73, 0x42, 0xd1, 0xdf, 0x14,
+ 0x67, 0x22, 0xed, 0xee,
+ 0x21, 0x24, 0x00, 0xe0, 0x00, 0xb0, 0xef, 0xe0, 0x10, 0x11, 0x21, 0xfd,
+ 0xa8, 0x00, 0x34, 0x33,
+ 0xf0, 0xcc, 0xff, 0x10, 0x51, 0x12, 0x10, 0xed, 0x00, 0xff, 0xdd, 0xec,
+ 0x0c, 0xfe, 0xf5, 0xa3,
+ 0xbd, 0xdb, 0x11, 0x65, 0x00, 0xde, 0x00, 0x10, 0x10, 0x21, 0x01, 0x0f,
+ 0x0f, 0x0e, 0x0e, 0x71,
+ 0x0d, 0xb8, 0xfd, 0xf1, 0xf2, 0x00, 0x00, 0xe2, 0xfd, 0xe9, 0x20, 0x20,
+ 0xe1, 0xc1, 0x00, 0x3f,
+ 0x71, 0x16, 0xff, 0xce, 0x00, 0x00, 0xd4, 0xf1, 0x32, 0x77, 0x20, 0xdc,
+ 0xb0, 0xf0, 0x03, 0x31,
+ 0x00, 0xf0, 0xcc, 0x0f, 0x22, 0x22, 0xef, 0xda, 0x20, 0x63, 0xee, 0xdc,
+ 0x00, 0x42, 0x20, 0x0d,
+ 0x00, 0x0f, 0xef, 0x0f, 0x13, 0x42, 0x0c, 0xed, 0x00, 0x00, 0xfa, 0x3f,
+ 0x75, 0x62, 0x0e, 0xde,
+ 0xff, 0xe0, 0x0f, 0x5f, 0x32, 0xee, 0xd0, 0x27, 0x57, 0xff, 0xed, 0x01,
+ 0x52, 0x00, 0x40, 0x11,
+ 0xf0, 0xdc, 0x02, 0x43, 0x21, 0x0f, 0xf0, 0x01, 0x46, 0x13, 0x01, 0x0e,
+ 0x00, 0x56, 0x20, 0x0f,
+ 0x0f, 0x3e, 0x71, 0x27, 0x23, 0x00, 0x1f, 0x10, 0xe0, 0xf0, 0x0f, 0x75,
+ 0x33, 0x00, 0x0c, 0x10,
+ 0x31, 0x00, 0x20, 0x33, 0x22, 0x00, 0x0f, 0x10, 0x53, 0x32, 0x00, 0x2f,
+ 0x64, 0x05, 0x00, 0xd1,
+ 0x00, 0x43, 0x47, 0x33, 0x3f, 0x2f, 0x00, 0x22, 0x25, 0xe0, 0xbd, 0x10,
+ 0x42, 0x04, 0x03, 0xf0,
+ 0x0f, 0x5e, 0x33, 0xe2, 0xc2, 0x02, 0x0d, 0x25, 0x47, 0xe3, 0xef, 0x60,
+ 0x34, 0x01, 0xd0, 0xf0,
+ 0x01, 0x33, 0x46, 0x20, 0xe0, 0xf2, 0x01, 0x10, 0x15, 0x25, 0x51, 0xf0,
+ 0xbd, 0x00, 0x30, 0x12,
+ 0x30, 0xf0, 0x92, 0xd1, 0xe0, 0x11, 0x20, 0x2d, 0x44, 0xd4, 0xd1, 0xdc,
+ 0x88, 0xf0, 0x43, 0x12,
+ 0xde, 0xdc, 0x11, 0x00, 0xee, 0x0e, 0x30, 0x0f, 0x02, 0x75, 0x0d, 0xab,
+ 0x00, 0x12, 0x21, 0x0b,
+ 0xff, 0xf0, 0x03, 0xe0, 0x0d, 0x40, 0x0d, 0x0e, 0x33, 0x21, 0xda, 0xdf,
+ 0xde, 0x2e, 0x0b, 0x20,
+ 0x33, 0xb0, 0xfe, 0x50, 0x51, 0x1e, 0x08, 0xc0, 0x02, 0x14, 0xf0, 0xab,
+ 0xef, 0x00, 0x72, 0x12,
+ 0xec, 0xdf, 0x11, 0x32, 0x2f, 0xdd, 0xe2, 0x24, 0x10, 0xed, 0x8d, 0xed,
+ 0x00, 0x22, 0x10, 0x0d,
+ 0xea, 0x00, 0xd0, 0xde, 0xf1, 0xe2, 0xeb, 0xec, 0xf0, 0xc2, 0xf1, 0xdb,
+ 0xab, 0xff, 0x10, 0x41,
+ 0xcf, 0xdd, 0x12, 0x35, 0xe0, 0x8d, 0xee, 0x00, 0x32, 0x26, 0xbf, 0xec,
+ 0x00, 0x20, 0x00, 0xdf,
+ 0xde, 0x00, 0x02, 0x1e, 0xde, 0xdd, 0xce, 0x42, 0x56, 0xfe, 0xa8, 0x00,
+ 0x0f, 0x20, 0x00, 0xf1,
+ 0xf0, 0x0e, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xed, 0xd0, 0x02, 0x0d, 0xce,
+ 0xd0, 0xf0, 0x32, 0x67,
+ 0x00, 0xee, 0x98, 0xee, 0x01, 0x24, 0xef, 0xdc, 0x00, 0x00, 0xaf, 0xfe,
+ 0x00, 0x01, 0xf2, 0xe0,
+ 0x9e, 0x0f, 0xf4, 0xe3, 0xbc, 0xfd, 0x00, 0x25, 0xf3, 0xe0, 0xdc, 0xf0,
+ 0xce, 0xe0, 0x03, 0xd4,
+ 0xb0, 0xff, 0x00, 0xef, 0xae, 0x07, 0xf2, 0xee, 0x0d, 0x02, 0x25, 0xde,
+ 0xfc, 0x41, 0x44, 0xc0,
+ 0xcb, 0xf0, 0xdf, 0x0f, 0x32, 0x03, 0x90, 0x0b, 0x10, 0x2f, 0x0f, 0x2f,
+ 0x0c, 0xf0, 0x11, 0x04,
+ 0xef, 0xfb, 0x30, 0x2f, 0x0f, 0x61, 0x53, 0x00, 0xeb, 0xde, 0xde, 0x00,
+ 0x44, 0x1e, 0xfb, 0xfe,
+ 0x40, 0x20, 0x1f, 0x0d, 0x20, 0x6e, 0x50, 0x15, 0x00, 0xdc, 0x1f, 0x60,
+ 0x04, 0x0f, 0xff, 0xff,
+ 0xf2, 0x01, 0x0f, 0x44, 0x27, 0x11, 0xee, 0x0f, 0x73, 0x33, 0xe0, 0xd1,
+ 0xf2, 0x57, 0x32, 0xfd,
+ 0xbc, 0x01, 0x04, 0x52, 0x0f, 0x0d, 0x00, 0x14, 0x22, 0x13, 0x00, 0xfe,
+ 0x0d, 0x0e, 0x14, 0x47,
+ 0x03, 0x00, 0x20, 0xfe, 0x0e, 0x40, 0x13, 0x12, 0x10, 0x2c, 0x72, 0x77,
+ 0x12, 0xfe, 0xe0, 0x22,
+ 0x44, 0x20, 0x11, 0x11, 0x00, 0xff, 0x00, 0x04, 0x21, 0x31, 0x55, 0x00,
+ 0xdf, 0xef, 0x22, 0x40,
+ 0x0b, 0x02, 0x04, 0x42, 0x60, 0x1c, 0x20, 0x10, 0x21, 0x02, 0x36, 0x22,
+ 0x10, 0x11, 0x62, 0x23,
+ 0x00, 0x01, 0x47, 0x10, 0x10, 0x20, 0x22, 0x05, 0xe2, 0xf1, 0xf2, 0xc1,
+ 0xcf, 0xfe, 0x75, 0x26,
+ 0x20, 0x23, 0x0f, 0xff, 0xf0, 0x34, 0x65, 0x00, 0xd0, 0x10, 0x73, 0x43,
+ 0xef, 0xe0, 0x02, 0x00,
+ 0x0b, 0x42, 0x33, 0xf0, 0xef, 0x00, 0x12, 0x65, 0x01, 0x01, 0xf1, 0xf0,
+ 0x0f, 0x10, 0x1e, 0xeb,
+ 0xe0, 0x14, 0x72, 0x5f, 0x0e, 0x0d, 0x01, 0x07, 0x03, 0xfd, 0xec, 0x32,
+ 0x41, 0xbb, 0xfd, 0x00,
+ 0x42, 0x00, 0xbb, 0x00, 0x02, 0x21, 0x20, 0x11, 0x01, 0xce, 0xfb, 0xef,
+ 0x10, 0x02, 0xf0, 0x1d,
+ 0x0d, 0x0e, 0xd0, 0x00, 0x0f, 0xb9, 0xd0, 0x00, 0x43, 0x0e, 0xab, 0x00,
+ 0x14, 0x42, 0xfd, 0xdd,
+ 0x11, 0x24, 0x20, 0x5c, 0x00, 0xc0, 0x00, 0x04, 0x3f, 0xea, 0x10, 0x71,
+ 0xf0, 0xb0, 0x02, 0x24,
+ 0x1e, 0xfc, 0xe0, 0x14, 0x11, 0x00, 0xce, 0xfd, 0xfe, 0x0f, 0xc8, 0x0e,
+ 0x71, 0x31, 0xff, 0xed,
+ 0x00, 0x0d, 0x0c, 0xfb, 0xdf, 0x01, 0x46, 0x10, 0xaa, 0xd0, 0x00, 0x11,
+ 0xd1, 0x9f, 0x00, 0xfe,
+ 0xfe, 0x00, 0xd0, 0xee, 0xff, 0xf0, 0x00, 0xe0, 0x8c, 0xfe, 0xee, 0x12,
+ 0x3f, 0xe8, 0xde, 0x00,
+ 0x12, 0xf0, 0xbe, 0xed, 0xef, 0xf0, 0xe0, 0xf0, 0xda, 0xbc, 0x01, 0x03,
+ 0x00, 0xcd, 0xd0, 0xe1,
+ 0xf5, 0xc0, 0xac, 0xef, 0xf1, 0x00, 0x13, 0x42, 0xed, 0xcd, 0x14, 0x31,
+ 0x0d, 0xfd, 0xba, 0xed,
+ 0x0f, 0x01, 0x13, 0xee, 0xdf, 0x01, 0x0d, 0x08, 0x0b, 0xc0, 0xa1, 0x01,
+ 0x73, 0x20, 0xfb, 0xdd,
+ 0x40, 0x32, 0xf0, 0xdf, 0x01, 0x21, 0x50, 0x20, 0x0e, 0xdb, 0x00, 0x04,
+ 0x21, 0x1e, 0xea, 0xb0,
+ 0xe4, 0xe0, 0x0f, 0x0e, 0x10, 0x00, 0xdd, 0x9e, 0x13, 0x34, 0x0f, 0x1e,
+ 0x42, 0x00, 0xd1, 0x16,
+ 0x00, 0xee, 0xdd, 0x61, 0x22, 0xd0, 0xf0, 0x13, 0x0e, 0xfd, 0xbf, 0xce,
+ 0xf7, 0x37, 0x60, 0x1f,
+ 0xe0, 0xe1, 0xf4, 0x10, 0x00, 0x0e, 0xdd, 0x0e, 0x22, 0x33, 0x09, 0x3f,
+ 0x50, 0xe2, 0x00, 0x0e,
+ 0xf2, 0x36, 0x10, 0xfe, 0x9f, 0xd0, 0xb3, 0x22, 0x20, 0xe9, 0x8d, 0x0d,
+ 0x32, 0x35, 0xf0, 0x0f,
+ 0x0e, 0xdf, 0xde, 0x0e, 0x44, 0x53, 0x0f, 0x09, 0x0f, 0x00, 0xef, 0xe3,
+ 0xf2, 0xcc, 0x0f, 0x00,
+ 0xa3, 0x13, 0x60, 0xfe, 0xdf, 0x01, 0x12, 0x61, 0x11, 0xe9, 0xef, 0xff,
+ 0xf1, 0x01, 0xcb, 0x0e,
+ 0x37, 0x23, 0xad, 0x0f, 0x00, 0x0e, 0x10, 0x03, 0x45, 0xf0, 0xd0, 0xe0,
+ 0x0f, 0x00, 0xf1, 0xc0,
+ 0x02, 0xe0, 0x8c, 0xe9, 0xef, 0x01, 0x13, 0x02, 0xcb, 0xde, 0xf0, 0x34,
+ 0x21, 0xe1, 0xaf, 0x0b,
+ 0xff, 0x01, 0x15, 0x10, 0xff, 0x0f, 0x12, 0xc0, 0xad, 0x00, 0xe4, 0xf0,
+ 0x0d, 0x0e, 0x1e, 0x2d,
+ 0x21, 0x04, 0xf0, 0xc9, 0x0e, 0x71, 0x54, 0x00, 0x00, 0x0d, 0xf0, 0x0d,
+ 0x2e, 0x4f, 0x0e, 0xf2,
+ 0xe5, 0x0e, 0x0c, 0x40, 0x30, 0x32, 0xfe, 0xde, 0x23, 0x53, 0xfd, 0xe0,
+ 0x02, 0x67, 0x24, 0x54,
+ 0x24, 0x0f, 0xdd, 0x30, 0x56, 0x32, 0xf0, 0xcf, 0x10, 0x31, 0x0f, 0xd0,
+ 0x02, 0x37, 0x22, 0xef,
+ 0xde, 0x40, 0x60, 0xf0, 0x11, 0x47, 0x02, 0xef, 0xe0, 0xf0, 0xff, 0xdd,
+ 0x20, 0x63, 0x13, 0x04,
+ 0x02, 0xff, 0xec, 0xc0, 0x05, 0x77, 0x20, 0x00, 0xef, 0x00, 0x22, 0x20,
+ 0x00, 0x00, 0x42, 0xb0,
+ 0xcc, 0x13, 0x73, 0x14, 0x10, 0xfe, 0xec, 0x22, 0x56, 0x0f, 0xfe, 0x00,
+ 0x35, 0x21, 0xef, 0x00,
+ 0x00, 0x20, 0x21, 0x03, 0x00, 0x10, 0x0e, 0x1e, 0x20, 0x54, 0x53, 0x10,
+ 0x21, 0x24, 0x0c, 0xcc,
+ 0x02, 0x24, 0x0e, 0x5d, 0x53, 0x0d, 0xfb, 0xf0, 0x34, 0x75, 0x0f, 0x0c,
+ 0x01, 0x33, 0x10, 0x0f,
+ 0x0e, 0x02, 0x24, 0xe0, 0xbb, 0xff, 0x12, 0x23, 0xd0, 0xff, 0x13, 0x20,
+ 0x01, 0x05, 0x44, 0xfe,
+ 0xdb, 0x00, 0x75, 0x41, 0xef, 0x1e, 0x42, 0x00, 0xe0, 0x42, 0x23, 0xd0,
+ 0x8c, 0x00, 0x12, 0x20,
+ 0x0f, 0xf1, 0x07, 0x02, 0xfc, 0x00, 0x1f, 0x00, 0x2f, 0x74, 0x21, 0x10,
+ 0x1c, 0x2f, 0x24, 0x02,
+ 0xfe, 0x1d, 0x20, 0x03, 0x20, 0x1f, 0x0c, 0xf4, 0x43, 0x0e, 0xd9, 0x40,
+ 0x7f, 0x1f, 0xf0, 0x15,
+ 0x30, 0xfe, 0xff, 0x40, 0x72, 0x22, 0xe0, 0xfe, 0x42, 0x20, 0xfb, 0xc2,
+ 0x01, 0x0d, 0x20, 0x6f,
+ 0x0e, 0x00, 0xfc, 0xff, 0x37, 0x77, 0xfd, 0xde, 0x10, 0x34, 0x20, 0xef,
+ 0x0e, 0x13, 0x24, 0xee,
+ 0x9f, 0xff, 0xf0, 0x00, 0x12, 0x13, 0x0f, 0x0e, 0x31, 0xc0, 0xb0, 0xfe,
+ 0xf0, 0x67, 0x17, 0x00,
+ 0xc0, 0x0e, 0x0f, 0x41, 0x04, 0x00, 0xed, 0x00, 0xe1, 0xdf, 0x00, 0x53,
+ 0x00, 0x00, 0x07, 0xe0,
+ 0x9e, 0xf0, 0xf1, 0x21, 0x31, 0x0f, 0xbb, 0x0e, 0x0f, 0x27, 0x03, 0xdd,
+ 0xcc, 0x00, 0x03, 0x31,
+ 0xab, 0xde, 0xf1, 0x02, 0xe0, 0xfe, 0xdc, 0xeb, 0x00, 0xd0, 0xe0, 0x01,
+ 0xdf, 0x8e, 0xe0, 0xee,
+ 0xec, 0xdd, 0xfe, 0xe0, 0xf5, 0xa0, 0xff, 0xef, 0xf0, 0xdf, 0x9b, 0xef,
+ 0x00, 0xf0, 0xec, 0xcb,
+ 0xef, 0xf0, 0x1f, 0x0f, 0xff, 0xd1, 0xde, 0xc9, 0xff, 0x0f, 0x02, 0xcf,
+ 0x88, 0xfe, 0x01, 0x01,
+ 0x00, 0x0f, 0x20, 0xf0, 0xdc, 0xd0, 0xde, 0xff, 0x40, 0x73, 0xfd, 0xba,
+ 0x0e, 0xe0, 0x00, 0x10,
+ 0x0a, 0x0f, 0x00, 0xd0, 0xee, 0x10, 0x51, 0x22, 0xfe, 0xb8, 0xef, 0xf0,
+ 0xff, 0xfd, 0xee, 0x01,
+ 0x42, 0x1d, 0xab, 0xe0, 0xe1, 0x00, 0xff, 0x10, 0x00, 0xa9, 0x00, 0xf0,
+ 0x0f, 0xfe, 0x03, 0xf3,
+ 0xee, 0xcc, 0xef, 0x00, 0x25, 0xf1, 0xae, 0x1e, 0x63, 0x13, 0xff, 0xb8,
+ 0x00, 0x11, 0x23, 0x00,
+ 0xce, 0x01, 0x10, 0xfc, 0xf0, 0x25, 0x31, 0x01, 0xce, 0xff, 0x0f, 0xe0,
+ 0x02, 0x32, 0x70, 0x2d,
+ 0x10, 0x00, 0xf0, 0x02, 0x57, 0x05, 0x0c, 0xff, 0x2e, 0x40, 0x00, 0x1e,
+ 0x01, 0x04, 0x03, 0x11,
+ 0x0f, 0x2d, 0x72, 0x77, 0x02, 0x0e, 0xef, 0x20, 0x02, 0x11, 0x34, 0x40,
+ 0x0e, 0xf1, 0x06, 0x01,
+ 0x1f, 0x30, 0x37, 0x22, 0xff, 0x10, 0x40, 0x02, 0x01, 0xf2, 0xe0, 0x33,
+ 0x0e, 0xfe, 0x74, 0x77,
+ 0x20, 0xd0, 0x02, 0x33, 0x40, 0x00, 0xd1, 0x01, 0x37, 0x32, 0xf0, 0x42,
+ 0x72, 0x20, 0xf0, 0xc1,
+ 0x05, 0x02, 0x34, 0x22, 0x02, 0xef, 0xef, 0x44, 0x43, 0x02, 0x02, 0x01,
+ 0xff, 0xff, 0x35, 0x72,
+ 0x2d, 0xeb, 0x01, 0x33, 0x0e, 0xed, 0xf3, 0x55, 0x32, 0x10, 0x2d, 0x23,
+ 0xee, 0x0c, 0x70, 0x4d,
+ 0x00, 0x23, 0x00, 0x00, 0x34, 0x11, 0x50, 0x3d, 0x42, 0x37, 0x0f, 0x0a,
+ 0x00, 0x22, 0x54, 0x52,
+ 0x22, 0x0f, 0xf9, 0x0f, 0x42, 0x33, 0xe0, 0x1f, 0x73, 0x1f, 0x0f, 0x03,
+ 0x14, 0x31, 0x30, 0x44,
+ 0x01, 0x21, 0x21, 0x22, 0x00, 0x0f, 0x31, 0x35, 0x10, 0x2f, 0x10, 0xe1,
+ 0x02, 0x77, 0x72, 0x01,
+ 0x05, 0x13, 0x0e, 0xdc, 0x0f, 0x01, 0x42, 0x00, 0xd1, 0xe0, 0x1f, 0x4e,
+ 0xfc, 0xe0, 0x42, 0x47,
+ 0x02, 0xfe, 0xbb, 0x00, 0xf0, 0x12, 0x1e, 0xd8, 0xe0, 0x40, 0x00, 0xd1,
+ 0x50, 0x00, 0xbc, 0xe0,
+ 0x03, 0xe0, 0xac, 0x01, 0x12, 0x0e, 0xfc, 0x00, 0x11, 0xf0, 0x00, 0x32,
+ 0x42, 0xcc, 0xce, 0x00,
+ 0x00, 0x20, 0x57, 0x0f, 0xfc, 0x0f, 0x30, 0x76, 0x00, 0xde, 0x00, 0x2f,
+ 0x11, 0xf3, 0xe0, 0xff,
+ 0x00, 0xd1, 0x41, 0x5f, 0x1c, 0x05, 0x13, 0x01, 0x02, 0xd1, 0xe2, 0xd0,
+ 0x01, 0x17, 0xd0, 0x8e,
+ 0xac, 0x00, 0x22, 0x34, 0x11, 0xcc, 0xbe, 0x02, 0x04, 0x01, 0xf1, 0x14,
+ 0xf0, 0x9b, 0xfd, 0xef,
+ 0x0d, 0x0f, 0x00, 0x00, 0xab, 0xff, 0xf2, 0x04, 0x0d, 0xcc, 0x00, 0xf2,
+ 0xef, 0xfd, 0xf0, 0x00,
+ 0x00, 0x02, 0xb8, 0xec, 0xf1, 0xd0, 0xde, 0x00, 0x32, 0xbb, 0xef, 0x0e,
+ 0x0f, 0x10, 0xed, 0xb8,
+ 0xf0, 0x23, 0xf0, 0x8e, 0xfc, 0x00, 0xf0, 0xd0, 0x00, 0x00, 0xfd, 0xbb,
+ 0x10, 0x00, 0xfe, 0xdd,
+ 0x12, 0x53, 0x0e, 0x0d, 0x00, 0xeb, 0x0f, 0xff, 0xbb, 0xff, 0x10, 0x3f,
+ 0xee, 0xab, 0xdc, 0xfd,
+ 0x52, 0x33, 0xdb, 0xdd, 0x00, 0x10, 0x1f, 0x0c, 0xfe, 0xcf, 0xf0, 0xe0,
+ 0x00, 0xd0, 0x10, 0xfb,
+ 0x8c, 0x00, 0x01, 0xe0, 0xea, 0x41, 0x24, 0xcf, 0xec, 0x40, 0x41, 0xfd,
+ 0xde, 0x01, 0x10, 0x0f,
+ 0x10, 0x11, 0xbe, 0x00, 0x10, 0xdb, 0x8d, 0xf1, 0x07, 0xe0, 0xdc, 0x32,
+ 0x30, 0xfe, 0xee, 0xe0,
+ 0xf0, 0xdd, 0x00, 0xfc, 0xfe, 0x3e, 0x52, 0xd6, 0x8f, 0xdd, 0x1f, 0x50,
+ 0x22, 0xff, 0xc8, 0x0e,
+ 0x01, 0x24, 0xde, 0xbe, 0x00, 0x12, 0x24, 0xfe, 0xfd, 0xff, 0x00, 0x04,
+ 0x02, 0x02, 0x71, 0xf9,
+ 0xac, 0x00, 0x00, 0x01, 0x12, 0x03, 0xde, 0xf0, 0x03, 0x33, 0xef, 0xbd,
+ 0xf5, 0xe1, 0xde, 0xfe,
+ 0x22, 0x27, 0xe1, 0x8f, 0xbe, 0x1f, 0x11, 0x14, 0xf0, 0xff, 0x05, 0x02,
+ 0xe0, 0x21, 0x60, 0x24,
+ 0x31, 0xf1, 0xd0, 0xf1, 0xd2, 0x00, 0x44, 0x20, 0xed, 0xb9, 0x02, 0x03,
+ 0x0f, 0xfc, 0x00, 0x00,
+ 0x13, 0x44, 0x64, 0x00, 0xde, 0x0e, 0x57, 0x12, 0xdc, 0x9c, 0x00, 0x10,
+ 0x35, 0x00, 0xbd, 0x0e,
+ 0x22, 0x24, 0x00, 0x00, 0xf0, 0xe0, 0x00, 0x13, 0x42, 0x0f, 0xed, 0xf2,
+ 0x01, 0xde, 0x0f, 0x15,
+ 0x77, 0x43, 0xce, 0xeb, 0x20, 0x11, 0x12, 0x1f, 0x0e, 0xd0, 0x21, 0x0f,
+ 0xe0, 0x36, 0x10, 0x8e,
+ 0xdd, 0x00, 0x13, 0x10, 0xdd, 0x20, 0x72, 0x0d, 0xdd, 0x00, 0x37, 0x30,
+ 0x0d, 0x24, 0x63, 0x0c,
+ 0xcd, 0x11, 0x33, 0xfc, 0xcc, 0x30, 0x43, 0xf1, 0xe1, 0xfc, 0xfd, 0x37,
+ 0x44, 0xcf, 0xde, 0x00,
+ 0x00, 0x20, 0xdd, 0x01, 0x42, 0x30, 0xf1, 0xaf, 0x0b, 0x20, 0x10, 0xff,
+ 0x00, 0x74, 0x04, 0x0d,
+ 0xfc, 0x0e, 0xeb, 0xff, 0x22, 0x02, 0xee, 0x0f, 0x41, 0x01, 0x21, 0x25,
+ 0xf3, 0xc4, 0xa0, 0x0d,
+ 0xed, 0xf0, 0x77, 0x15, 0xff, 0xff, 0xf0, 0xe2, 0x32, 0x61, 0x00, 0x00,
+ 0x01, 0x25, 0x02, 0x30,
+ 0x3f, 0x00, 0xd2, 0xc4, 0x01, 0x03, 0xd2, 0xa0, 0xfb, 0x2f, 0x72, 0x01,
+ 0x00, 0x03, 0x45, 0x22,
+ 0x10, 0x10, 0x51, 0x37, 0x03, 0x0d, 0x00, 0x44, 0x10, 0x00, 0x1e, 0x1f,
+ 0x50, 0x20, 0x03, 0x12,
+ 0x0c, 0x1d, 0x55, 0x27, 0x10, 0x0d, 0x31, 0x53, 0x01, 0x0d, 0x5f, 0x11,
+ 0x02, 0x20, 0x3f, 0x30,
+ 0x36, 0x23, 0x21, 0x1f, 0xe0, 0xd0, 0x1e, 0x74, 0x76, 0x00, 0xe0, 0x01,
+ 0x03, 0x12, 0x01, 0x13,
+ 0x43, 0x11, 0x25, 0xe3, 0xf1, 0x22, 0x42, 0x27, 0x45, 0x22, 0x00, 0xdf,
+ 0x0f, 0x44, 0x34, 0x00,
+ 0x3e, 0x73, 0x14, 0xc0, 0xfe, 0x00, 0x05, 0x22, 0x01, 0x01, 0x22, 0x63,
+ 0x20, 0x00, 0x00, 0xf0,
+ 0x01, 0x75, 0x00, 0xfd, 0x0e, 0x10, 0x01, 0x0e, 0xd0, 0x26, 0x05, 0x05,
+ 0x28, 0x00, 0x29, 0x00,
+ 0x7c, 0x0d, 0x46, 0x0f, 0x5e, 0x0f, 0x13, 0x14, 0x1f, 0x42, 0x77, 0x26,
+ 0xee, 0xbc, 0x00, 0x0e,
+ 0xff, 0xed, 0x30, 0x4f, 0xbc, 0x02, 0x23, 0x0c, 0xfc, 0x01, 0x06, 0x10,
+ 0x1d, 0xcb, 0xff, 0x1f,
+ 0x20, 0x01, 0x04, 0x10, 0xcb, 0x8f, 0xde, 0xf0, 0xe0, 0xa0, 0x03, 0x23,
+ 0x00, 0xa8, 0xef, 0x00,
+ 0x43, 0x01, 0x02, 0xdd, 0xdc, 0x10, 0x34, 0x12, 0xef, 0xfd, 0x01, 0xd1,
+ 0x81, 0x00, 0x0f, 0x0e,
+ 0x05, 0xd0, 0xfb, 0xf0, 0xe1, 0xa1, 0xcd, 0xee, 0x0e, 0x2f, 0x10, 0xdc,
+ 0xb9, 0xfe, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xf0, 0xdb, 0x0e, 0x0d, 0x0d, 0x8c, 0xed, 0xff, 0xef,
+ 0x0f, 0xed, 0xab, 0xfe,
+ 0x0e, 0xde, 0xde, 0x01, 0xf1, 0xdd, 0xfd, 0xf1, 0x0d, 0x08, 0x08, 0xb0,
+ 0xe0, 0x10, 0x4f, 0x0f,
+ 0xb0, 0xdf, 0xca, 0x0f, 0x3f, 0x10, 0xe1, 0xd0, 0x0d, 0xdc, 0xaf, 0xf1,
+ 0x06, 0x00, 0xfe, 0x2f,
+ 0xef, 0x9e, 0xff, 0x00, 0x24, 0xf0, 0xac, 0xf0, 0x10, 0x50, 0x13, 0xf0,
+ 0xbc, 0x00, 0x02, 0x00,
+ 0x0e, 0x0b, 0x00, 0xe1, 0x00, 0x13, 0xf2, 0xab, 0xff, 0x12, 0x21, 0x10,
+ 0xde, 0xd0, 0x03, 0xfb,
+ 0x98, 0xef, 0xff, 0x10, 0x12, 0xa1, 0xf1, 0xfe, 0xfd, 0xf1, 0xd2, 0xf0,
+ 0x21, 0xee, 0x9d, 0x02,
+ 0x01, 0xde, 0xdb, 0x04, 0x13, 0xdc, 0xdf, 0x00, 0xba, 0xf0, 0x37, 0x31,
+ 0xdf, 0xbe, 0x00, 0x01,
+ 0x03, 0x50, 0x0f, 0xf0, 0xbd, 0xda, 0xff, 0x00, 0x20, 0x32, 0x01, 0x80,
+ 0xeb, 0xe0, 0xf0, 0x12,
+ 0x34, 0xe0, 0xbb, 0x0f, 0x11, 0x42, 0x0f, 0xed, 0xad, 0x02, 0x34, 0x2e,
+ 0x0d, 0xe0, 0x03, 0x02,
+ 0x31, 0x10, 0xff, 0x03, 0xf6, 0x04, 0x42, 0x41, 0x0c, 0x9b, 0x00, 0xf4,
+ 0x00, 0x20, 0x21, 0x21,
+ 0x21, 0x0e, 0x0b, 0x00, 0x75, 0x10, 0x0f, 0x24, 0x30, 0x10, 0x5e, 0x21,
+ 0x01, 0xfc, 0x0c, 0x32,
+ 0x75, 0x10, 0xe0, 0xe0, 0xef, 0x24, 0x52, 0x0e, 0x0d, 0x11, 0x30, 0x11,
+ 0x17, 0x12, 0x2f, 0x72,
+ 0x33, 0xfc, 0xfc, 0x00, 0x54, 0x33, 0x00, 0xd0, 0x02, 0x53, 0x20, 0x02,
+ 0x07, 0x11, 0x0f, 0xfc,
+ 0x00, 0x03, 0x21, 0x72, 0x22, 0x12, 0x33, 0x00, 0xfe, 0x10, 0x62, 0x37,
+ 0x17, 0x20, 0x60, 0x10,
+ 0x11, 0xff, 0xf0, 0x0e, 0x10, 0x53, 0x06, 0xf0, 0xfe, 0x43, 0x53, 0x00,
+ 0xf0, 0x36, 0x00, 0x00,
+ 0xf1, 0x22, 0x52, 0x0f, 0xfe, 0x23, 0x76, 0x01, 0x0f, 0x00, 0x23, 0x37,
+ 0x10, 0x11, 0x10, 0x02,
+ 0x23, 0x10, 0x1d, 0x77, 0x03, 0xf0, 0xf0, 0x00, 0x22, 0x00, 0x41, 0x25,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x53, 0x24, 0x42, 0x30, 0x00, 0x10, 0x30, 0x33, 0xf1, 0x92, 0x0f, 0x4d,
+ 0x06, 0xf1, 0xb0, 0x12,
+ 0x13, 0x13, 0x03, 0xdb, 0xef, 0xf6, 0x04, 0x10, 0x3c, 0x00, 0xc0, 0xb1,
+ 0x11, 0x44, 0xf0, 0xcf,
+ 0xf0, 0xf0, 0xe0, 0xd0, 0xcd, 0xe0, 0x13, 0xcd, 0xbc, 0x23, 0x0c, 0xec,
+ 0x15, 0x21, 0x8d, 0x0e,
+ 0x03, 0x04, 0x22, 0xe2, 0xce, 0x0b, 0x1e, 0x10, 0x30, 0x33, 0x08, 0xef,
+ 0xf0, 0x41, 0x51, 0x20,
+ 0xfd, 0xe1, 0x23, 0x1c, 0xd9, 0xdf, 0x10, 0x02, 0xa0, 0x0f, 0x40, 0xfd,
+ 0xbc, 0x00, 0x10, 0x54,
+ 0x00, 0xf8, 0xde, 0x0f, 0x20, 0x2f, 0x2f, 0x3f, 0x20, 0xa0, 0xdc, 0x00,
+ 0x21, 0x20, 0xef, 0xcb,
+ 0xf0, 0xde, 0xec, 0xd0, 0x02, 0xde, 0x88, 0xae, 0x00, 0x00, 0x22, 0xee,
+ 0xee, 0xf0, 0x0f, 0xed,
+ 0x0f, 0xbe, 0xed, 0xdd, 0x0e, 0x32, 0x00, 0xac, 0xfc, 0xec, 0x00, 0xde,
+ 0xca, 0x11, 0x45, 0xee,
+ 0xbc, 0xf0, 0x00, 0x02, 0x1d, 0x00, 0x00, 0xad, 0xfd, 0x03, 0x24, 0x0a,
+ 0xdf, 0x00, 0xff, 0xec,
+ 0xf0, 0x02, 0x62, 0x0e, 0x09, 0xef, 0x10, 0x01, 0xf0, 0xee, 0x2e, 0x51,
+ 0x04, 0xae, 0xc9, 0xff,
+ 0x20, 0x10, 0x00, 0x00, 0x1e, 0x1f, 0x00, 0x02, 0x52, 0x0e, 0x0c, 0x00,
+ 0x00, 0xd8, 0xbf, 0x01,
+ 0xf2, 0xbd, 0x00, 0x40, 0xff, 0xfe, 0x15, 0x01, 0xb0, 0x00, 0x12, 0x02,
+ 0x00, 0x01, 0x10, 0xdf,
+ 0xac, 0x02, 0x37, 0x03, 0xbe, 0x00, 0xf2, 0xf0, 0xdf, 0xe3, 0xee, 0xcd,
+ 0xe4, 0x07, 0xf1, 0xde,
+ 0xf0, 0x15, 0xe1, 0x8c, 0xbd, 0x10, 0x25, 0x21, 0x0f, 0xfd, 0x01, 0x44,
+ 0x01, 0xee, 0xff, 0x00,
+ 0x2e, 0x2f, 0x10, 0x01, 0xcd, 0x9b, 0x00, 0x00, 0x2b, 0xee, 0xef, 0xff,
+ 0x0e, 0x64, 0x26, 0x0f,
+ 0xdd, 0x0f, 0x2f, 0xef, 0xde, 0x0c, 0x3d, 0x21, 0xe2, 0x9d, 0xfb, 0x0f,
+ 0x6f, 0x11, 0xfe, 0xdc,
+ 0xff, 0x0f, 0x0f, 0x11, 0x01, 0xfd, 0xfe, 0xd1, 0xf7, 0x37, 0x9e, 0xdf,
+ 0x01, 0x61, 0x00, 0xef,
+ 0x02, 0x03, 0x00, 0x01, 0x00, 0x1d, 0xcc, 0xc0, 0x02, 0x15, 0xf1, 0x03,
+ 0x62, 0x0a, 0xee, 0xf0,
+ 0xcf, 0xf0, 0x77, 0x10, 0xde, 0xee, 0x02, 0x13, 0xfc, 0x0f, 0x40, 0xeb,
+ 0xd0, 0x02, 0x34, 0xed,
+ 0xbc, 0x0f, 0x31, 0x74, 0x10, 0x0f, 0x00, 0xfd, 0x02, 0x43, 0xf0, 0xd0,
+ 0x00, 0xc8, 0xef, 0x11,
+ 0xe0, 0xbe, 0x00, 0x23, 0x13, 0xdd, 0x0d, 0x5f, 0x33, 0x15, 0xee, 0xbb,
+ 0x00, 0x01, 0x26, 0x20,
+ 0x0d, 0xdf, 0x20, 0x74, 0xfe, 0xab, 0x00, 0x22, 0x01, 0xec, 0xff, 0x12,
+ 0x13, 0xf2, 0x03, 0x20,
+ 0xee, 0xf3, 0x24, 0xe0, 0x8a, 0x01, 0x22, 0x02, 0xf0, 0xef, 0xe0, 0x33,
+ 0x36, 0xb0, 0x00, 0x74,
+ 0x00, 0xe0, 0xe2, 0xd4, 0x40, 0x3e, 0xd0, 0xe5, 0x62, 0x33, 0x0f, 0xdf,
+ 0x0b, 0x00, 0x22, 0x42,
+ 0x22, 0x21, 0xf0, 0xb0, 0xe0, 0xec, 0x0c, 0x54, 0x27, 0xc0, 0xfd, 0x02,
+ 0x45, 0x20, 0x00, 0xfe,
+ 0x11, 0x01, 0xc0, 0x20, 0x44, 0x10, 0x10, 0x30, 0x3f, 0xf1, 0xb5, 0x03,
+ 0x53, 0x20, 0x20, 0x04,
+ 0x05, 0x02, 0x10, 0x4d, 0x50, 0x05, 0xe0, 0x0f, 0x31, 0x45, 0x20, 0x00,
+ 0x0e, 0x00, 0x01, 0x45,
+ 0x52, 0x2f, 0x2c, 0x00, 0x01, 0x44, 0x42, 0x42, 0x01, 0x00, 0x1f, 0x0e,
+ 0x42, 0x32, 0x12, 0x06,
+ 0x00, 0x1c, 0x70, 0x42, 0x21, 0x10, 0x21, 0x00, 0xea, 0xd0, 0x25, 0x72,
+ 0x2d, 0x3e, 0x21, 0x12,
+ 0xee, 0xfc, 0xef, 0x2e, 0x21, 0x57, 0x10, 0x0e, 0x0f, 0xf0, 0x11, 0x74,
+ 0x32, 0x02, 0x00, 0x2e,
+ 0x00, 0x0f, 0x00, 0x47, 0x34, 0x10, 0x3f, 0x30, 0xe0, 0xde, 0x2f, 0x70,
+ 0x74, 0x01, 0x00, 0x13,
+ 0x16, 0x00, 0x0f, 0x00, 0x45, 0x02, 0x0e, 0xdc, 0x10, 0x11, 0x10, 0x30,
+ 0xf3, 0xa0, 0x00, 0xdd,
+ 0x00, 0x76, 0x36, 0x02, 0xd0, 0xdc, 0x11, 0x13, 0xf0, 0x00, 0xf1, 0x11,
+ 0x50, 0x00, 0x01, 0xbd,
+ 0xdd, 0x35, 0x77, 0x00, 0xcf, 0x0e, 0x00, 0x01, 0x1f, 0x0c, 0x0f, 0x20,
+ 0x24, 0x41, 0xfe, 0xdc,
+ 0xef, 0xdc, 0xff, 0x61, 0x22, 0xcc, 0xcd, 0xf0, 0x13, 0x45, 0xef, 0xde,
+ 0xfe, 0x0e, 0x6f, 0x13,
+ 0x27, 0x03, 0xdc, 0x0e, 0x41, 0x11, 0x02, 0xf0, 0x0e, 0x22, 0x03, 0xbd,
+ 0xfc, 0x42, 0x13, 0xe0,
+ 0xde, 0xf6, 0x01, 0x60, 0x20, 0x04, 0x8e, 0xf0, 0x27, 0x37, 0x0f, 0xef,
+ 0x00, 0x10, 0xe2, 0x0f,
+ 0x30, 0xe2, 0x8e, 0x0e, 0xef, 0x10, 0x22, 0x00, 0xff, 0xd2, 0x15, 0x00,
+ 0xc0, 0xad, 0x04, 0x10,
+ 0xdc, 0xcc, 0xdc, 0xed, 0x0f, 0x15, 0xf2, 0xaf, 0xfb, 0xf0, 0x02, 0xe0,
+ 0xfc, 0xfd, 0x01, 0xc2,
+ 0xd0, 0xcb, 0xce, 0x0c, 0x3e, 0x30, 0x00, 0x9d, 0xfb, 0x0f, 0x01, 0x21,
+ 0xcd, 0xcb, 0xff, 0xff,
+ 0xf0, 0xe0, 0x1d, 0x30, 0xf0, 0x98, 0xef, 0x0d, 0x0f, 0x0d, 0x0f, 0x20,
+ 0xe2, 0xac, 0xeb, 0x00,
+ 0x53, 0x00, 0xcc, 0x0e, 0x00, 0x01, 0x00, 0xcb, 0x0f, 0xfe, 0x0f, 0xff,
+ 0x02, 0x10, 0xdb, 0xbe,
+ 0x00, 0xd0, 0xf0, 0x2f, 0x1e, 0xff, 0xe0, 0xb8, 0xbe, 0xef, 0x02, 0xf0,
+ 0xba, 0xe0, 0x00, 0xf0,
+ 0xd0, 0xce, 0xfe, 0xce, 0xe0, 0xd3, 0xd0, 0xeb, 0xd0, 0x21, 0x32, 0xcd,
+ 0xce, 0xef, 0xef, 0x52,
+ 0x23, 0xcd, 0xd1, 0x17, 0x10, 0xec, 0xcc, 0x01, 0x32, 0xf2, 0xa0, 0xdd,
+ 0xd9, 0x11, 0x52, 0x0f,
+ 0x0d, 0xee, 0x0e, 0x1e, 0x0e, 0x2f, 0x0e, 0x00, 0x43, 0x54, 0x10, 0x21,
+ 0x65, 0x0f, 0x1d, 0x0d,
+ 0x1d, 0x0d, 0x3b, 0x10, 0x66, 0x01, 0x00, 0xfd, 0x17, 0x54, 0x20, 0x0e,
+ 0xff, 0x12, 0x45, 0x41,
+ 0x42, 0x22, 0xff, 0xfc, 0x00, 0x34, 0x32, 0xf0, 0x21, 0x73, 0x00, 0xe0,
+ 0x04, 0x24, 0x33, 0x20,
+ 0x00, 0x10, 0x36, 0x63, 0x2f, 0x30, 0x45, 0x12, 0x01, 0x02, 0x24, 0x44,
+ 0x01, 0x10, 0x2e, 0x31,
+ 0xd4, 0x93, 0x03, 0x63, 0x11, 0x20, 0x35, 0x00, 0x0b, 0x00, 0x22, 0x54,
+ 0x00, 0xf0, 0xe1, 0x01,
+ 0x13, 0x14, 0x43, 0x21, 0x0f, 0xd1, 0x35, 0x51, 0x10, 0x4f, 0x0d, 0x34,
+ 0x47, 0x20, 0xce, 0x00,
+ 0x21, 0x13, 0x00, 0x40, 0x75, 0x20, 0xfe, 0x00, 0x0d, 0x0e, 0xdf, 0x02,
+ 0x67, 0x10, 0x0e, 0xe0,
+ 0x42, 0x24, 0x00, 0x0f, 0x51, 0x24, 0x0e, 0x0e, 0x22, 0x35, 0x02, 0x01,
+ 0xe0, 0x01, 0x47, 0x00,
+ 0xae, 0x11, 0x77, 0x00, 0xe0, 0x10, 0x11, 0xd0, 0xe1, 0x20, 0x44, 0x10,
+ 0xdf, 0xcf, 0x10, 0x60,
+ 0x26, 0x01, 0x10, 0x0e, 0xee, 0x10, 0x04, 0xff, 0xf0, 0x41, 0x57, 0xf0,
+ 0xfe, 0x1f, 0x40, 0x11,
+ 0x02, 0x0f, 0x0e, 0x10, 0x1f, 0xbb, 0xcf, 0x2f, 0x40, 0x22, 0x0e, 0x1b,
+ 0x10, 0xe1, 0xe0, 0x10,
+ 0x1c, 0x1b, 0x00, 0xe0, 0xce, 0xce, 0xbe, 0xcb, 0xf0, 0x14, 0x0f, 0xab,
+ 0xf0, 0xf2, 0x23, 0x40,
+ 0x3f, 0x01, 0xd0, 0xdc, 0x20, 0x60, 0x20, 0x2e, 0x04, 0x01, 0xed, 0x0f,
+ 0xd1, 0xd2, 0xdc, 0x01,
+ 0x77, 0x01, 0xde, 0x13, 0x03, 0x31, 0x52, 0xee, 0xef, 0x3f, 0xff, 0xff,
+ 0x4d, 0x0c, 0xf7, 0x14,
+ 0x0f, 0x3f, 0x71, 0x02, 0x10, 0x41, 0x36, 0x12, 0xff, 0xdd, 0x10, 0x00,
+ 0xc3, 0x07, 0x62, 0x3e,
+ 0xea, 0xaf, 0xfe, 0x02, 0x21, 0x02, 0xe1, 0x00, 0x00, 0xea, 0xce, 0xff,
+ 0xbf, 0xbf, 0xdf, 0x02,
+ 0x1f, 0x40, 0xfe, 0x9b, 0xfd, 0xd0, 0xe2, 0x33, 0x2f, 0xb8, 0x9b, 0x01,
+ 0x33, 0x00, 0xfe, 0xde,
+ 0x00, 0x00, 0x00, 0x04, 0x01, 0x20, 0xda, 0xc0, 0xdf, 0xf0, 0x11, 0x13,
+ 0xbd, 0xfa, 0xf0, 0xef,
+ 0xe0, 0x13, 0xf2, 0xcf, 0xe8, 0xb0, 0x00, 0xf2, 0xed, 0xbe, 0x0f, 0x23,
+ 0x03, 0x10, 0x00, 0xae,
+ 0x0c, 0x10, 0x3c, 0x0f, 0xe0, 0xcd, 0xfe, 0x10, 0x2f, 0x0d, 0xe8, 0xac,
+ 0x10, 0x22, 0x20, 0x12,
+ 0x0b, 0xcc, 0xe0, 0xf0, 0xd0, 0xda, 0x00, 0x50, 0x0f, 0xbe, 0x0f, 0x30,
+ 0x62, 0x00, 0xda, 0x0e,
+ 0x00, 0x1f, 0x00, 0xf0, 0x0f, 0xed, 0x1f, 0x00, 0xcd, 0x01, 0x00, 0x5a,
+ 0x20, 0xc3, 0xb1, 0xfd,
+ 0x0b, 0xf0, 0xff, 0x0f, 0x32, 0x14, 0xef, 0xda, 0x20, 0x72, 0x20, 0xed,
+ 0xff, 0x6f, 0x2f, 0xf0,
+ 0xc0, 0xcd, 0x03, 0x07, 0x12, 0x0f, 0xdd, 0x00, 0x11, 0x00, 0xdb, 0x63,
+ 0x24, 0xdf, 0xf0, 0x01,
+ 0x1f, 0x01, 0x90, 0xf9, 0x0e, 0x1f, 0x44, 0x23, 0x00, 0xfb, 0xef, 0x0f,
+ 0xf0, 0xcf, 0xe0, 0xee,
+ 0xc9, 0x41, 0x53, 0xe0, 0xdc, 0x0f, 0xf0, 0xf1, 0x10, 0x11, 0xf1, 0xf2,
+ 0x22, 0x52, 0x01, 0xcf,
+ 0xf1, 0xf0, 0xcd, 0x00, 0x37, 0x56, 0x0f, 0xde, 0xf1, 0x02, 0x30, 0x71,
+ 0x27, 0xe0, 0xee, 0xc0,
+ 0x00, 0x22, 0x33, 0x00, 0xe0, 0xcc, 0xee, 0x25, 0x22, 0xbd, 0xdd, 0xf1,
+ 0x57, 0x44, 0x00, 0xe0,
+ 0xf0, 0x01, 0x22, 0x00, 0xde, 0xaf, 0xf2, 0xe7, 0xd1, 0x22, 0x10, 0xae,
+ 0xc0, 0x03, 0x15, 0x10,
+ 0xe0, 0xf0, 0x13, 0x23, 0xcf, 0xcb, 0x2f, 0x31, 0xf4, 0xbf, 0xec, 0x13,
+ 0x32, 0xfe, 0x9e, 0x11,
+ 0x01, 0x0d, 0xdf, 0x00, 0x13, 0x24, 0xfc, 0x2f, 0x00, 0xe0, 0x1f, 0x0d,
+ 0xfb, 0x70, 0x51, 0x00,
+ 0xf8, 0xbc, 0x0e, 0x40, 0x32, 0xed, 0xe8, 0x20, 0x53, 0x11, 0x0f, 0xed,
+ 0x00, 0xde, 0xfe, 0xee,
+ 0x10, 0x54, 0x02, 0xdf, 0xdd, 0x32, 0x43, 0x30, 0x0f, 0x36, 0x21, 0x0c,
+ 0xef, 0x44, 0x73, 0x0c,
+ 0x0b, 0x00, 0x02, 0xee, 0xfd, 0x74, 0x21, 0x10, 0x53, 0x02, 0xe0, 0xee,
+ 0x12, 0x10, 0xfc, 0xad,
+ 0x00, 0x02, 0xf1, 0x04, 0x45, 0x20, 0x11, 0x32, 0x9c, 0xfc, 0x31, 0x07,
+ 0x00, 0x1f, 0x30, 0x01,
+ 0x00, 0x20, 0x02, 0xd2, 0x0e, 0xe0, 0x07, 0x76, 0x60, 0xfe, 0xcf, 0x00,
+ 0x20, 0x03, 0x00, 0x01,
+ 0x22, 0x43, 0x00, 0x0f, 0x12, 0x53, 0x2c, 0x01, 0x27, 0x10, 0xfc, 0x00,
+ 0x42, 0x54, 0x1f, 0xfe,
+ 0x01, 0x64, 0x00, 0x00, 0x20, 0x1d, 0x0e, 0x22, 0x01, 0x04, 0x33, 0x32,
+ 0x64, 0x0f, 0x0e, 0x03,
+ 0x57, 0x05, 0x1e, 0x20, 0x11, 0x20, 0x00, 0x00, 0x22, 0xe0, 0xae, 0xff,
+ 0x03, 0x07, 0x04, 0x10,
+ 0x00, 0x11, 0x30, 0x74, 0x23, 0xd0, 0xf4, 0x54, 0x22, 0xdf, 0xff, 0x31,
+ 0x21, 0xe0, 0x24, 0x72,
+ 0x0e, 0xd0, 0x02, 0x07, 0x54, 0x00, 0xe0, 0xf0, 0x43, 0x54, 0x02, 0x01,
+ 0x23, 0x00, 0xd8, 0x0e,
+ 0x31, 0x00, 0x02, 0x40, 0xf2, 0x01, 0x0d, 0x0e, 0x75, 0x12, 0xf0, 0x00,
+ 0x10, 0x0e, 0x10, 0x57,
+ 0x00, 0x0f, 0xfd, 0xfd, 0xf0, 0x03, 0x32, 0x6c, 0x0b, 0x02, 0x13, 0x3e,
+ 0x0a, 0x00, 0x02, 0xad,
+ 0xed, 0x03, 0x00, 0xdd, 0xee, 0x70, 0x1e, 0x29, 0x20, 0x01, 0xe2, 0x9d,
+ 0x0e, 0x20, 0x00, 0xfd,
+ 0xed, 0xd6, 0xe2, 0x11, 0x0d, 0x88, 0xe0, 0x42, 0x13, 0x0f, 0xff, 0x21,
+ 0x40, 0x00, 0xf0, 0x00,
+ 0xf1, 0x11, 0x20, 0xed, 0x80, 0x12, 0x74, 0xf2, 0xde, 0x10, 0x31, 0xd8,
+ 0xee, 0x12, 0x02, 0x01,
+ 0x35, 0x01, 0xdc, 0xfd, 0xfe, 0xfe, 0x3f, 0x67, 0x11, 0xfe, 0xcb, 0xf0,
+ 0xef, 0x00, 0x10, 0xec,
+ 0xff, 0xf0, 0xc0, 0xc1, 0xee, 0x0c, 0xa0, 0xbc, 0xe0, 0x00, 0x0d, 0x99,
+ 0x00, 0x21, 0xf0, 0xdc,
+ 0x01, 0x32, 0x0d, 0xff, 0xe0, 0xf4, 0x20, 0xf2, 0xa0, 0xfc, 0x0e, 0xe0,
+ 0xf1, 0xf0, 0xde, 0xd0,
+ 0xeb, 0xfb, 0xdf, 0x8e, 0xee, 0x02, 0x13, 0xcb, 0xec, 0x30, 0x32, 0xe0,
+ 0xcc, 0xef, 0x10, 0x32,
+ 0xdf, 0x9a, 0x00, 0xfe, 0xe0, 0xd0, 0x33, 0x1e, 0xc8, 0xf0, 0x20, 0x10,
+ 0x00, 0x3f, 0x1f, 0x3e,
+ 0xf0, 0xcf, 0xfc, 0x0e, 0x11, 0xa4, 0xbb, 0xfe, 0xee, 0x02, 0x73, 0x1f,
+ 0xe8, 0xbf, 0x00, 0x10,
+ 0x0e, 0xce, 0xee, 0x0e, 0x0f, 0xf3, 0x07, 0xff, 0xcd, 0x00, 0x00, 0xe3,
+ 0xe0, 0xef, 0x00, 0xef,
+ 0x21, 0x27, 0x81, 0xed, 0x00, 0x03, 0x00, 0xde, 0xea, 0x21, 0x76, 0x10,
+ 0xe0, 0xff, 0xde, 0x00,
+ 0x22, 0xf0, 0x80, 0x0e, 0xff, 0x00, 0x00, 0x0e, 0x0c, 0xd0, 0xdf, 0xfe,
+ 0x49, 0x10, 0xf0, 0xe0,
+ 0x64, 0x41, 0x00, 0x30, 0x41, 0x0e, 0xcf, 0x02, 0x34, 0x32, 0x00, 0x00,
+ 0x1d, 0x24, 0xf3, 0x06,
+ 0x70, 0x4e, 0xde, 0x01, 0x62, 0x14, 0x27, 0x00, 0x0d, 0x0f, 0x3e, 0x0e,
+ 0x03, 0x35, 0x4f, 0xfd,
+ 0xe0, 0xff, 0x10, 0x63, 0x00, 0x20, 0x24, 0x01, 0xf1, 0x25, 0x02, 0x03,
+ 0x71, 0x70, 0xf9, 0xff,
+ 0x04, 0x13, 0x00, 0xf0, 0x02, 0x41, 0x21, 0xe3, 0xe4, 0x00, 0x1f, 0x11,
+ 0x02, 0xf0, 0x00, 0xf7,
+ 0xf3, 0x2f, 0x72, 0x01, 0xce, 0x01, 0x07, 0x01, 0x01, 0xe2, 0x02, 0xe7,
+ 0x11, 0x70, 0x30, 0x00,
+ 0xd4, 0x11, 0x72, 0x23, 0x01, 0x10, 0x16, 0x00, 0xd0, 0xcf, 0x05, 0x05,
+ 0x30, 0x00, 0x47, 0x00,
+ 0xa9, 0x11, 0x52, 0x2d, 0xb5, 0x0e, 0xc7, 0x27, 0xe1, 0x98, 0x1f, 0x31,
+ 0xf2, 0xcf, 0x0d, 0x3d,
+ 0x20, 0x30, 0x70, 0x0e, 0x11, 0x51, 0x20, 0x0f, 0x05, 0x23, 0x0d, 0x21,
+ 0x47, 0x07, 0x00, 0x0f,
+ 0x10, 0x00, 0xbf, 0x01, 0x22, 0x44, 0x45, 0x20, 0x00, 0x20, 0x60, 0x01,
+ 0x02, 0x03, 0x65, 0x00,
+ 0xef, 0x02, 0x35, 0x20, 0xfc, 0xf2, 0x44, 0x21, 0x0f, 0x00, 0x1f, 0x30,
+ 0x45, 0x33, 0x01, 0x00,
+ 0x10, 0x72, 0x26, 0x00, 0xe0, 0x00, 0x00, 0x50, 0x11, 0xe0, 0xf0, 0x34,
+ 0x53, 0x0d, 0xcd, 0xfd,
+ 0xfe, 0x00, 0x17, 0x27, 0x0e, 0xbe, 0xe0, 0xb0, 0x00, 0xf0, 0xd0, 0x04,
+ 0x30, 0xde, 0xaf, 0x00,
+ 0x10, 0x00, 0x11, 0xff, 0xeb, 0x05, 0xf2, 0xee, 0x20, 0x2e, 0x0d, 0x40,
+ 0x71, 0x1e, 0xe9, 0xf0,
+ 0x32, 0x40, 0x1e, 0xed, 0xdf, 0x00, 0x00, 0xe0, 0x10, 0xdf, 0xac, 0xda,
+ 0x00, 0x01, 0xb0, 0xdb,
+ 0x20, 0x20, 0xb2, 0x01, 0x3f, 0x0a, 0xcc, 0xd0, 0x01, 0x12, 0x00, 0x90,
+ 0xdd, 0xdb, 0xde, 0xce,
+ 0x00, 0x32, 0x80, 0xbf, 0x0e, 0x0c, 0x0f, 0x01, 0xf0, 0xe9, 0x00, 0x00,
+ 0xff, 0xb9, 0xef, 0xdf,
+ 0xe0, 0x0e, 0xf0, 0xdd, 0xad, 0x0f, 0x0f, 0xf0, 0xb0, 0xfa, 0xfe, 0xfe,
+ 0xcc, 0xe0, 0x10, 0x13,
+ 0xf0, 0xdc, 0xd9, 0xfe, 0xf0, 0xd0, 0xe0, 0x02, 0x71, 0x0e, 0xfa, 0xdf,
+ 0x0f, 0x0f, 0x3c, 0x0e,
+ 0xd0, 0x01, 0xe0, 0x0d, 0x5f, 0xfb, 0xbf, 0x10, 0x0e, 0xbf, 0xfe, 0x1f,
+ 0x2d, 0x10, 0x62, 0x0e,
+ 0xe8, 0x1e, 0x74, 0x10, 0x0c, 0xf0, 0x20, 0x30, 0xd2, 0xf0, 0x0e, 0x50,
+ 0x32, 0x23, 0x10, 0x0a,
+ 0xe0, 0x32, 0x73, 0x10, 0x0b, 0x00, 0x02, 0x1e, 0x0c, 0xdd, 0x0d, 0x63,
+ 0x01, 0xd0, 0x05, 0x53,
+ 0x00, 0x00, 0x02, 0x03, 0x22, 0x10, 0x04, 0x37, 0x43, 0x0f, 0xee, 0xf0,
+ 0x1f, 0x71, 0x26, 0xe0,
+ 0xd0, 0xd2, 0x04, 0x75, 0x21, 0xcf, 0xcf, 0x03, 0x17, 0x21, 0x00, 0xf0,
+ 0x20, 0x12, 0x12, 0x00,
+ 0x71, 0x1f, 0xfc, 0xd0, 0x23, 0x25, 0xce, 0xbf, 0x02, 0x33, 0x01, 0x03,
+ 0x02, 0x01, 0xe1, 0xec,
+ 0x10, 0x77, 0x03, 0xef, 0xf1, 0x00, 0xd9, 0xb0, 0x02, 0x12, 0xdd, 0xd0,
+ 0x03, 0x6e, 0xea, 0xe0,
+ 0x11, 0x20, 0xef, 0xbf, 0x00, 0x01, 0xec, 0xac, 0xf0, 0x00, 0x00, 0xfe,
+ 0xd8, 0xee, 0x11, 0x02,
+ 0xf0, 0xf0, 0x0d, 0xbe, 0xc0, 0xf4, 0x00, 0x3e, 0xfe, 0xd0, 0x00, 0x2f,
+ 0xf3, 0x9d, 0x0f, 0x07,
+ 0xf1, 0xc9, 0x0f, 0x10, 0xf1, 0xf3, 0x4e, 0x2a, 0xee, 0x9e, 0x1f, 0x20,
+ 0x24, 0x10, 0x0f, 0x0e,
+ 0x20, 0x02, 0xf0, 0x24, 0x73, 0x4e, 0xe8, 0x0f, 0x00, 0x10, 0x1e, 0x40,
+ 0x20, 0x00, 0xe0, 0x0d,
+ 0x9f, 0xde, 0x0f, 0x2f, 0x00, 0x15, 0x3f, 0xea, 0xaf, 0x00, 0x34, 0x41,
+ 0xff, 0x02, 0xf3, 0xfc,
+ 0x0e, 0x36, 0x24, 0xdf, 0x8e, 0x00, 0x13, 0x01, 0x00, 0xd1, 0x67, 0x22,
+ 0xfe, 0xef, 0x10, 0x51,
+ 0x0e, 0x00, 0xe0, 0x0e, 0x23, 0x23, 0x0d, 0x0f, 0xd0, 0xe0, 0x04, 0x07,
+ 0x01, 0x5e, 0x0f, 0x02,
+ 0x06, 0x00, 0xd0, 0x00, 0x7f, 0xff, 0x9e, 0x0e, 0x00, 0x55, 0x13, 0x00,
+ 0x0b, 0x0d, 0xe1, 0x27,
+ 0x52, 0x00, 0xfc, 0x00, 0x41, 0x24, 0xce, 0xdc, 0x00, 0x44, 0x12, 0x00,
+ 0x00, 0xfe, 0x00, 0x00,
+ 0xe1, 0xd0, 0x8c, 0x00, 0x03, 0x23, 0xee, 0xce, 0x17, 0x33, 0x00, 0xc2,
+ 0xd1, 0xf1, 0x00, 0x05,
+ 0xf5, 0x42, 0x00, 0x9e, 0x00, 0x02, 0x32, 0x02, 0x02, 0x45, 0x00, 0xd0,
+ 0x0f, 0x21, 0x03, 0x80,
+ 0xf5, 0x11, 0x2f, 0xec, 0xe0, 0x11, 0x43, 0xf0, 0xbd, 0x01, 0x30, 0x08,
+ 0xda, 0x00, 0x42, 0x42,
+ 0x10, 0x3f, 0x1e, 0x21, 0x42, 0x1f, 0x70, 0x21, 0x1d, 0x10, 0x25, 0x0f,
+ 0x1e, 0x53, 0x0e, 0x08,
+ 0x0b, 0x40, 0x22, 0x20, 0x10, 0x2f, 0x7f, 0x0d, 0x13, 0x47, 0xff, 0xfd,
+ 0x00, 0x33, 0x10, 0x1f,
+ 0x3f, 0x30, 0x40, 0x20, 0x0e, 0x0b, 0x21, 0x77, 0x00, 0x11, 0x50, 0x20,
+ 0xef, 0xf0, 0x35, 0x41,
+ 0x10, 0x01, 0x21, 0x00, 0x00, 0x22, 0x35, 0x10, 0xf0, 0xf1, 0xf4, 0x0f,
+ 0xad, 0x10, 0x75, 0x10,
+ 0x00, 0xee, 0xf0, 0x00, 0xf1, 0xf3, 0x0f, 0x4d, 0x00, 0xb0, 0x2e, 0x77,
+ 0x17, 0xf0, 0x0e, 0x02,
+ 0x00, 0xdf, 0x0e, 0xff, 0x01, 0x36, 0x00, 0xa0, 0xff, 0x01, 0x02, 0xfe,
+ 0x1d, 0x34, 0x13, 0x3f,
+ 0x19, 0x00, 0x2f, 0x0d, 0x8e, 0x10, 0x14, 0xfe, 0xcc, 0xfe, 0xce, 0x01,
+ 0x10, 0xcf, 0xef, 0x1e,
+ 0x73, 0x11, 0xdc, 0x02, 0x57, 0x14, 0xef, 0xcc, 0x0e, 0x02, 0x36, 0xf0,
+ 0xae, 0xf0, 0xf2, 0x12,
+ 0x23, 0x10, 0xf0, 0xbf, 0x01, 0x27, 0x01, 0xc0, 0xef, 0x0f, 0x01, 0x01,
+ 0x01, 0xc0, 0xbe, 0x01,
+ 0x37, 0x34, 0xde, 0xd1, 0x23, 0x51, 0x01, 0x00, 0x0e, 0x10, 0x00, 0xb0,
+ 0xe1, 0x05, 0x04, 0xe0,
+ 0x9e, 0xed, 0xef, 0x03, 0xf1, 0xdd, 0x0f, 0x0b, 0x1f, 0x32, 0x04, 0xbe,
+ 0xda, 0xef, 0xfe, 0xed,
+ 0xe0, 0x93, 0xd0, 0xde, 0xf0, 0x1e, 0x08, 0x99, 0x01, 0x02, 0x10, 0x1f,
+ 0x1f, 0x0f, 0xed, 0x00,
+ 0x2f, 0x10, 0xde, 0xcf, 0xec, 0x00, 0x30, 0x8e, 0xba, 0xf0, 0x00, 0x00,
+ 0xed, 0xfb, 0x21, 0x01,
+ 0x8c, 0x0d, 0x31, 0x21, 0xec, 0xdb, 0x00, 0x10, 0xf0, 0xbc, 0xff, 0xfe,
+ 0x00, 0x11, 0x10, 0x1f,
+ 0xed, 0xed, 0x23, 0x2e, 0xc8, 0x1f, 0x60, 0x0e, 0xed, 0xad, 0xfd, 0x21,
+ 0x01, 0xd9, 0x10, 0x0f,
+ 0x8d, 0xef, 0x00, 0x20, 0xeb, 0xbc, 0x00, 0xf2, 0x00, 0xec, 0xee, 0x0f,
+ 0xf0, 0xde, 0xbe, 0xfe,
+ 0xf1, 0xf2, 0x0f, 0xe9, 0x00, 0xfe, 0xd0, 0x02, 0x0e, 0xaa, 0xf0, 0x00,
+ 0x0e, 0xe0, 0x0f, 0x9c,
+ 0x0f, 0x20, 0x10, 0xdd, 0xb8, 0xe0, 0x10, 0x30, 0x00, 0xee, 0xce, 0x0c,
+ 0x1f, 0x30, 0xd0, 0xfe,
+ 0x63, 0x14, 0x0f, 0x00, 0x22, 0x65, 0x02, 0xf2, 0x01, 0x02, 0x01, 0x32,
+ 0xf0, 0x1f, 0x45, 0x37,
+ 0x61, 0x21, 0x22, 0x12, 0x2d, 0x2f, 0x04, 0x04, 0x12, 0x72, 0x34, 0x14,
+ 0x33, 0x00, 0x0d, 0x11,
+ 0x77, 0x01, 0x10, 0x01, 0x30, 0x52, 0x44, 0x01, 0x01, 0x20, 0x00, 0x46,
+ 0x14, 0x32, 0x22, 0x00,
+ 0xfd, 0x00, 0x57, 0x43, 0x0f, 0xff, 0x0f, 0x30, 0x66, 0x11, 0x00, 0x00,
+ 0x01, 0x30, 0x02, 0x23,
+ 0x15, 0x10, 0x0e, 0x00, 0x00, 0x73, 0x22, 0x0e, 0x01, 0x77, 0x10, 0x00,
+ 0x22, 0x12, 0x33, 0x01,
+ 0xf0, 0x14, 0x54, 0x00, 0xc0, 0xf5, 0x23, 0x53, 0xe0, 0xde, 0x03, 0x56,
+ 0x00, 0xf0, 0x34, 0x63,
+ 0xfd, 0xef, 0x01, 0x33, 0x10, 0x0e, 0x00, 0x30, 0x30, 0x00, 0x20, 0x41,
+ 0x0d, 0x00, 0x20, 0x1a,
+ 0xbc, 0x00, 0x51, 0x47, 0x03, 0xec, 0xfe, 0x15, 0x01, 0x8e, 0x0f, 0x01,
+ 0x01, 0x0f, 0x02, 0x37,
+ 0x21, 0xdf, 0x0f, 0x31, 0x32, 0x00, 0x0f, 0x71, 0x04, 0x0f, 0xa9, 0x00,
+ 0x11, 0x22, 0xef, 0xbc,
+ 0x00, 0x21, 0x03, 0x10, 0x51, 0x23, 0x20, 0x0e, 0xfa, 0x10, 0x00, 0x41,
+ 0x13, 0xff, 0xee, 0xec,
+ 0x0e, 0xc0, 0xc0, 0xf0, 0x0d, 0xfb, 0xc0, 0xe2, 0x02, 0x32, 0xcb, 0xce,
+ 0x03, 0x10, 0xcf, 0xbf,
+ 0xee, 0xf2, 0x07, 0xf5, 0x9c, 0x00, 0x01, 0x10, 0x02, 0x00, 0x0f, 0xd0,
+ 0x24, 0x32, 0xff, 0xbc,
+ 0x00, 0x44, 0x01, 0xe0, 0x0f, 0x0d, 0x2e, 0xde, 0xd0, 0x0b, 0xfe, 0x35,
+ 0x64, 0xcd, 0xdb, 0x0f,
+ 0x40, 0x46, 0x21, 0xef, 0xdb, 0x2f, 0x40, 0x50, 0x10, 0xf0, 0xef, 0xdd,
+ 0x10, 0x31, 0xee, 0xbc,
+ 0x31, 0x66, 0x00, 0xec, 0x00, 0x30, 0x0d, 0x4f, 0x21, 0xf0, 0xbb, 0x00,
+ 0xff, 0x00, 0x4f, 0x0e,
+ 0xdf, 0x10, 0x0d, 0xcc, 0x00, 0xf4, 0xcf, 0xee, 0xe1, 0xd2, 0xe0, 0xbd,
+ 0x9d, 0xed, 0x06, 0xf1,
+ 0xae, 0x01, 0x03, 0x03, 0xed, 0xea, 0x13, 0x47, 0x13, 0xde, 0xee, 0xf0,
+ 0x00, 0x12, 0x1f, 0x0c,
+ 0xb1, 0xd0, 0x0d, 0x12, 0x02, 0xdb, 0xdd, 0xd0, 0x82, 0xfb, 0xea, 0x1f,
+ 0x1f, 0x00, 0x00, 0x03,
+ 0xbd, 0xcb, 0x00, 0x20, 0x12, 0xde, 0x20, 0x72, 0x0d, 0xec, 0xee, 0x0d,
+ 0x41, 0x37, 0xf0, 0xfd,
+ 0x2e, 0x50, 0x0e, 0xef, 0x1e, 0x3e, 0xed, 0xab, 0x1f, 0x20, 0x1f, 0xfc,
+ 0x10, 0x00, 0xec, 0x0b,
+ 0x0d, 0x5f, 0x21, 0x1e, 0x29, 0x61, 0x21, 0x0e, 0x0f, 0x0f, 0xcd, 0x9f,
+ 0x02, 0x05, 0xf0, 0xf1,
+ 0xf1, 0xd1, 0x00, 0xe5, 0x32, 0x40, 0xcc, 0xe0, 0x23, 0x13, 0xfd, 0x99,
+ 0xf0, 0x01, 0x04, 0xe0,
+ 0x0d, 0x12, 0x04, 0x8f, 0xfe, 0x01, 0x00, 0x0f, 0x10, 0x0d, 0xdf, 0x00,
+ 0x0c, 0x0f, 0x27, 0x01,
+ 0xde, 0xe0, 0x02, 0x41, 0x20, 0xaf, 0xd8, 0x0e, 0x11, 0x65, 0xf0, 0xdd,
+ 0xfe, 0x00, 0x12, 0xbd,
+ 0xed, 0x45, 0x10, 0xdc, 0xf0, 0x12, 0xee, 0xfd, 0x1f, 0xdb, 0x9d, 0xee,
+ 0x0f, 0x10, 0x4e, 0x0c,
+ 0xdd, 0xfe, 0x0d, 0x00, 0x1e, 0x0b, 0xc0, 0xf2, 0x37, 0x20, 0xb0, 0x8d,
+ 0xd0, 0x03, 0x06, 0x10,
+ 0xed, 0xc0, 0x00, 0x04, 0x03, 0x21, 0x04, 0xc0, 0xae, 0x01, 0x02, 0x21,
+ 0x00, 0xc2, 0x03, 0x21,
+ 0x36, 0x42, 0x31, 0x12, 0xe0, 0x00, 0x75, 0x67, 0x02, 0xf0, 0x0e, 0x00,
+ 0x36, 0x01, 0xe0, 0xdf,
+ 0x01, 0x22, 0x30, 0x13, 0x01, 0x00, 0x23, 0x50, 0xd9, 0xc0, 0x20, 0x52,
+ 0x04, 0x20, 0x22, 0x11,
+ 0xf0, 0xbf, 0xf0, 0xf2, 0xe2, 0xe6, 0xe1, 0xcf, 0x0d, 0x10, 0x02, 0x02,
+ 0x3e, 0x0c, 0x00, 0x52,
+ 0x77, 0x44, 0x00, 0x0b, 0xcf, 0x20, 0x22, 0xed, 0xbf, 0x02, 0x14, 0x3c,
+ 0xed, 0xd0, 0x02, 0x00,
+ 0xed, 0x33, 0x12, 0xd0, 0x0f, 0x0b, 0x8f, 0xd1, 0xf1, 0xed, 0xfd, 0xdb,
+ 0x0d, 0x5e, 0x01, 0xd1,
+ 0xfd, 0x00, 0x57, 0x00, 0x0e, 0x00, 0xdf, 0xde, 0x64, 0x41, 0x10, 0x00,
+ 0x20, 0x19, 0x10, 0x0f,
+ 0xed, 0x11, 0x25, 0x41, 0x10, 0xcf, 0xbd, 0x0e, 0x0d, 0x01, 0xf7, 0xbf,
+ 0xc9, 0x0e, 0x30, 0x61,
+ 0xf2, 0xf1, 0xe0, 0xeb, 0xf0, 0x02, 0xf1, 0x00, 0x70, 0x43, 0x13, 0xeb,
+ 0xdd, 0x00, 0x02, 0xcf,
+ 0x01, 0x52, 0x0f, 0xe0, 0x00, 0x00, 0x0b, 0x2f, 0x40, 0x2e, 0x23, 0x10,
+ 0xf8, 0x10, 0x72, 0x44,
+ 0xed, 0xda, 0x00, 0x23, 0x03, 0x0f, 0xf1, 0x14, 0x4f, 0x40, 0x22, 0x20,
+ 0x6e, 0x40, 0x57, 0x25,
+ 0x1f, 0x1f, 0x21, 0x33, 0x00, 0x2e, 0x31, 0x31, 0xfe, 0xd0, 0x36, 0x61,
+ 0x00, 0x1f, 0x2f, 0x74,
+ 0x36, 0x10, 0xed, 0x20, 0x42, 0x00, 0x20, 0x40, 0x33, 0x00, 0x1d, 0x25,
+ 0x12, 0x00, 0x71, 0x25,
+ 0xf0, 0x00, 0x33, 0x44, 0x10, 0x31, 0x00, 0x10, 0x12, 0x22, 0x27, 0x21,
+ 0x00, 0xc0, 0x03, 0x01,
+ 0xe0, 0x01, 0x35, 0x51, 0x71, 0x37, 0x21, 0xf0, 0xfe, 0x30, 0x63, 0x41,
+ 0x00, 0xb1, 0x03, 0x11,
+ 0xf1, 0xe2, 0x17, 0x13, 0xfd, 0xe1, 0x17, 0xd1, 0xaf, 0x0f, 0xf1, 0x04,
+ 0xf1, 0xd0, 0xf2, 0x02,
+ 0x10, 0xbe, 0xde, 0xbf, 0x01, 0x23, 0x00, 0xde, 0x0d, 0xe9, 0x0f, 0x50,
+ 0x46, 0xfd, 0x9b, 0x00,
+ 0x00, 0x00, 0x0e, 0xe0, 0xf1, 0xdf, 0xef, 0xed, 0xfc, 0x1d, 0x45, 0x33,
+ 0xfb, 0x9d, 0x01, 0x02,
+ 0x01, 0x2f, 0xdc, 0xdd, 0x0e, 0x53, 0x26, 0xd0, 0xdc, 0x01, 0x21, 0xaf,
+ 0xcf, 0x0f, 0x00, 0x20,
+ 0x34, 0x20, 0xb9, 0xef, 0x00, 0x72, 0x02, 0x00, 0x0d, 0xff, 0x10, 0x14,
+ 0x10, 0x10, 0x0c, 0x10,
+ 0x20, 0xf0, 0xfd, 0xcf, 0xef, 0x00, 0x01, 0xab, 0x98, 0xfe, 0xf0, 0x04,
+ 0xff, 0xed, 0x00, 0x01,
+ 0x00, 0xec, 0xd0, 0x13, 0x10, 0xec, 0xcf, 0xff, 0xef, 0x0f, 0x3f, 0xc2,
+ 0x8f, 0xc8, 0x1d, 0x43,
+ 0xf1, 0xcc, 0x00, 0xf0, 0x02, 0x00, 0x0d, 0xee, 0xe0, 0xbd, 0x0d, 0x43,
+ 0x01, 0xb8, 0x0a, 0x00,
+ 0x21, 0x00, 0xf0, 0x00, 0xee, 0x2f, 0x1e, 0x10, 0xe0, 0xe0, 0xe9, 0x3f,
+ 0x50, 0xee, 0xcd, 0x0f,
+ 0xf0, 0xe0, 0x24, 0x72, 0x0b, 0xfc, 0xfe, 0x60, 0x33, 0xfe, 0xdd, 0x0d,
+ 0x2c, 0x00, 0x22, 0xf0,
+ 0xa8, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0xc0, 0xb0, 0xde, 0xe1, 0xf2, 0xef,
+ 0xd0, 0xb1, 0xc0, 0xbb,
+ 0xfe, 0xf2, 0xef, 0xc8, 0x00, 0xf1, 0xf4, 0x12, 0xe1, 0xae, 0xf0, 0x03,
+ 0x25, 0x12, 0xe1, 0xbf,
+ 0x00, 0x03, 0xde, 0xcb, 0x0f, 0xed, 0xfe, 0x06, 0x01, 0xff, 0x0e, 0x1f,
+ 0xdd, 0xbe, 0x00, 0x1f,
+ 0x3c, 0x00, 0xbe, 0xd9, 0xee, 0x00, 0xf2, 0x03, 0x2e, 0xfa, 0xef, 0x51,
+ 0x53, 0x40, 0x51, 0x12,
+ 0x0c, 0x0e, 0x10, 0x10, 0x17, 0x20, 0x1e, 0x20, 0x73, 0x2f, 0xfa, 0xee,
+ 0x21, 0x51, 0x20, 0x32,
+ 0x42, 0x10, 0x0b, 0x0e, 0x41, 0x57, 0x11, 0x00, 0x0d, 0x00, 0x10, 0x37,
+ 0x10, 0x10, 0x0e, 0x00,
+ 0x30, 0x44, 0x31, 0x41, 0x00, 0x40, 0x51, 0x21, 0x20, 0x1f, 0xf0, 0xf1,
+ 0x14, 0x0d, 0x1d, 0x65,
+ 0x14, 0x01, 0x00, 0xff, 0x00, 0x42, 0x44, 0x02, 0xe1, 0xfe, 0xed, 0x41,
+ 0x21, 0xcb, 0xed, 0x62,
+ 0x17, 0xdf, 0xbc, 0x11, 0x57, 0x12, 0x00, 0x0f, 0xf1, 0xe1, 0x10, 0x20,
+ 0x22, 0x12, 0xf3, 0x06,
+ 0x00, 0x00, 0xfe, 0xc0, 0x20, 0x74, 0x72, 0x01, 0x01, 0x0f, 0x0f, 0x40,
+ 0x31, 0x10, 0xff, 0xc9,
+ 0x0f, 0x31, 0x10, 0x2f, 0xf0, 0xd2, 0x0c, 0x00, 0xf5, 0xe1, 0x34, 0x72,
+ 0x01, 0x03, 0x24, 0xf0,
+ 0xfd, 0xe1, 0xe0, 0xc0, 0x07, 0x16, 0xc0, 0x90, 0xce, 0xf1, 0x13, 0x40,
+ 0x04, 0x02, 0xe0, 0x0f,
+ 0x0f, 0x53, 0x15, 0x31, 0x52, 0x01, 0x00, 0xf3, 0x07, 0x31, 0x3f, 0x00,
+ 0x02, 0x01, 0x00, 0xfe,
+ 0x50, 0x55, 0x11, 0x01, 0x0e, 0x00, 0x11, 0x76, 0x21, 0xe0, 0xfd, 0xfc,
+ 0x00, 0x02, 0x26, 0xf0,
+ 0xcf, 0x10, 0x43, 0xe1, 0xae, 0xfe, 0x01, 0x22, 0xfe, 0x10, 0x03, 0xb0,
+ 0x27, 0x52, 0x0c, 0xcb,
+ 0xf0, 0x10, 0x25, 0x30, 0x00, 0xee, 0xf1, 0x00, 0x10, 0x10, 0x00, 0xe1,
+ 0xe2, 0xec, 0xfd, 0xef,
+ 0xf1, 0x77, 0x61, 0xe1, 0xed, 0xed, 0x0f, 0x63, 0x02, 0x00, 0xee, 0xfc,
+ 0xcb, 0x0d, 0x1e, 0x1e,
+ 0x00, 0x35, 0xfc, 0xcd, 0x1e, 0x0d, 0xff, 0x77, 0x52, 0xed, 0xe9, 0xf0,
+ 0x10, 0x40, 0x1e, 0xff,
+ 0xef, 0x10, 0x20, 0xfd, 0xff, 0xde, 0x9a, 0xff, 0x00, 0xe1, 0xef, 0x0d,
+ 0xdf, 0xe0, 0xe1, 0x9e,
+ 0xed, 0xf0, 0xdc, 0xcb, 0xfe, 0xce, 0xfd, 0xfc, 0x00, 0x00, 0xbf, 0xdb,
+ 0xf0, 0x21, 0x35, 0xcd,
+ 0xbd, 0x12, 0x01, 0xfb, 0xcd, 0xe0, 0xff, 0x00, 0xff, 0xaa, 0xf0, 0x0f,
+ 0x0e, 0xd0, 0xf2, 0x00,
+ 0xc9, 0xdf, 0xd0, 0xf1, 0x90, 0xed, 0xff, 0xe0, 0xd0, 0x01, 0x01, 0x0c,
+ 0xfc, 0x11, 0x64, 0x02,
+ 0x00, 0xed, 0x0e, 0x32, 0x66, 0x11, 0x00, 0xc0, 0x03, 0x42, 0x00, 0x0c,
+ 0x30, 0x1d, 0xfc, 0x11,
+ 0x77, 0x3f, 0x0c, 0x00, 0x00, 0x10, 0x53, 0x10, 0x0a, 0x0e, 0xef, 0x0f,
+ 0x70, 0x37, 0x10, 0x0e,
+ 0x0c, 0xe0, 0x00, 0x33, 0x01, 0x21, 0x31, 0xe0, 0xfd, 0x71, 0x25, 0xe0,
+ 0xfc, 0x22, 0x65, 0x00,
+ 0xfe, 0x10, 0x36, 0x01, 0x30, 0x1f, 0x00, 0x11, 0x01, 0x03, 0x33, 0x02,
+ 0xef, 0x1f, 0xfe, 0xc1,
+ 0x02, 0x63, 0x05, 0xf0, 0x10, 0x72, 0x04, 0x03, 0x03, 0x52, 0x37, 0xe3,
+ 0x8e, 0xe0, 0x05, 0x01,
+ 0xd1, 0x11, 0x23, 0xcf, 0x0e, 0x00, 0x01, 0xf0, 0x00, 0x0e, 0x01, 0x05,
+ 0x10, 0x00, 0x20, 0x00,
+ 0x53, 0xf5, 0x27, 0x12, 0x74, 0xf5, 0x5f, 0x14, 0x31, 0xfe, 0xb8, 0x3f,
+ 0xde, 0x8b, 0xff, 0xfd,
+ 0x0d, 0xe9, 0x1e, 0x6e, 0x31, 0x11, 0x1c, 0x0f, 0xe0, 0x12, 0x71, 0x0d,
+ 0xab, 0xf0, 0x02, 0x20,
+ 0x0e, 0x98, 0x0e, 0x00, 0x10, 0x12, 0x2f, 0xfc, 0x00, 0x53, 0x00, 0x0d,
+ 0x0e, 0x11, 0x24, 0x00,
+ 0xcf, 0x0c, 0x22, 0x24, 0xce, 0xd0, 0x42, 0x20, 0xef, 0xf5, 0xe1, 0x21,
+ 0x65, 0x00, 0xe1, 0xf0,
+ 0xef, 0xeb, 0x32, 0x52, 0xcc, 0xdb, 0xe1, 0xf3, 0xf1, 0xe3, 0x00, 0xae,
+ 0xeb, 0x0f, 0x40, 0x46,
+ 0x00, 0xb0, 0x1f, 0x31, 0x23, 0x10, 0x01, 0x00, 0x2f, 0x00, 0x03, 0x1e,
+ 0xec, 0xaa, 0x00, 0x20,
+ 0x10, 0xdd, 0xe0, 0x44, 0x4f, 0x2e, 0x11, 0x03, 0xdf, 0xcb, 0xee, 0x1b,
+ 0x2e, 0xef, 0xc1, 0x03,
+ 0x7f, 0x2d, 0x0c, 0xcd, 0x0e, 0xfd, 0xd0, 0x14, 0x40, 0x08, 0xfd, 0xe0,
+ 0x0f, 0x20, 0x21, 0xc1,
+ 0x2c, 0x5f, 0xe0, 0x07, 0x73, 0x00, 0x10, 0xef, 0xbb, 0x10, 0x20, 0x12,
+ 0x03, 0x13, 0x25, 0xd0,
+ 0x9f, 0x00, 0x00, 0xc0, 0x16, 0x21, 0xd0, 0xc1, 0xdf, 0xed, 0x65, 0x35,
+ 0xd0, 0xcd, 0x00, 0x10,
+ 0x12, 0x33, 0x11, 0xd0, 0xbe, 0x23, 0x15, 0xf2, 0xb0, 0x04, 0x67, 0x21,
+ 0x00, 0xf0, 0xf1, 0x12,
+ 0x74, 0x00, 0xdc, 0x11, 0x12, 0x00, 0xdd, 0x00, 0x13, 0x00, 0xed, 0xf1,
+ 0x37, 0xe2, 0x8a, 0x00,
+ 0x00, 0x23, 0x40, 0x10, 0x10, 0x00, 0x1f, 0x0f, 0x0e, 0xf0, 0x22, 0x13,
+ 0x2f, 0xda, 0x8f, 0x02,
+ 0x35, 0x00, 0xc0, 0x01, 0x01, 0x23, 0x01, 0xac, 0xfe, 0x02, 0x13, 0x22,
+ 0x0e, 0x98, 0x0f, 0x00,
+ 0x46, 0x00, 0x00, 0xfe, 0xef, 0xff, 0xf1, 0x11, 0x10, 0x00, 0x01, 0x32,
+ 0x1d, 0x98, 0x00, 0x14,
+ 0x10, 0x00, 0xe0, 0x00, 0xb2, 0x01, 0x02, 0x40, 0x30, 0x02, 0xbf, 0x0e,
+ 0x0e, 0x02, 0x16, 0x31,
+ 0x52, 0xf2, 0xaf, 0xfd, 0x21, 0x00, 0x09, 0x0f, 0x21, 0xfc, 0xdc, 0x31,
+ 0x50, 0xed, 0x00, 0x11,
+ 0x0e, 0xfd, 0x04, 0xb1, 0xcd, 0x0d, 0x37, 0x31, 0xef, 0xdf, 0x0f, 0xa0,
+ 0x00, 0x30, 0x34, 0x00,
+ 0x7f, 0x31, 0x12, 0xed, 0xa8, 0x0a, 0xef, 0x20, 0x53, 0xf0, 0xdf, 0xf0,
+ 0x00, 0x11, 0x0e, 0x0e,
+ 0x01, 0xeb, 0x1d, 0x40, 0xff, 0x08, 0x7f, 0x43, 0xe0, 0xed, 0xe0, 0x17,
+ 0x42, 0x00, 0xde, 0xe0,
+ 0xe2, 0x01, 0xf3, 0xd0, 0xbe, 0x0c, 0x01, 0x13, 0xf3, 0x21, 0x70, 0x30,
+ 0x17, 0x37, 0xf0, 0x0f,
+ 0x20, 0x03, 0xf0, 0x00, 0x10, 0xe1, 0x55, 0x51, 0x02, 0x9f, 0xed, 0x0f,
+ 0x27, 0x14, 0xdf, 0xfe,
+ 0x01, 0x11, 0x01, 0xc0, 0xc0, 0x10, 0x50, 0x10, 0xf2, 0xd2, 0x0f, 0x2e,
+ 0x32, 0xf2, 0x9b, 0x0d,
+ 0x01, 0x03, 0xe0, 0x1a, 0x5f, 0x00, 0xdf, 0xef, 0x01, 0x0e, 0x0d, 0x77,
+ 0x03, 0xfc, 0x0f, 0xff,
+ 0xef, 0x0f, 0x1e, 0x2f, 0x62, 0x17, 0x02, 0xe0, 0x0f, 0x2e, 0x0e, 0x0f,
+ 0xf0, 0xed, 0xfc, 0x5c,
+ 0x5d, 0x34, 0xde, 0x88, 0x0f, 0x45, 0x00, 0x00, 0xdd, 0xff, 0x0f, 0x20,
+ 0x23, 0x00, 0xfb, 0xde,
+ 0xf0, 0x2d, 0x4e, 0x40, 0x40, 0x0e, 0xc8, 0xed, 0x2f, 0x5f, 0x00, 0x0f,
+ 0xcc, 0xfd, 0x0f, 0x10,
+ 0x30, 0xdc, 0x9d, 0xfc, 0xee, 0x0d, 0x00, 0xfb, 0xcc, 0x00, 0x30, 0x41,
+ 0xfb, 0x0e, 0x0e, 0x0d,
+ 0x60, 0x00, 0xef, 0xfb, 0xde, 0x1d, 0x50, 0x13, 0x0e, 0xec, 0xbe, 0x11,
+ 0x44, 0x00, 0xfd, 0xed,
+ 0x10, 0x21, 0x41, 0x01, 0x1e, 0xe8, 0xe9, 0x00, 0xe1, 0x20, 0x50, 0xee,
+ 0x10, 0x52, 0xff, 0xce,
+ 0x00, 0x00, 0x1c, 0x73, 0x23, 0xee, 0xed, 0x00, 0x17, 0x11, 0x10, 0x00,
+ 0xf0, 0xe0, 0xe0, 0xf0,
+ 0x50, 0x67, 0x13, 0x01, 0xe0, 0x34, 0x40, 0xdd, 0xf0, 0x04, 0x01, 0x12,
+ 0x13, 0xb5, 0xc0, 0xcc,
+ 0xdf, 0x13, 0x35, 0x0f, 0xb0, 0xf0, 0x12, 0x62, 0x27, 0x01, 0xce, 0x00,
+ 0x46, 0x11, 0xf0, 0xbd,
+ 0x00, 0x04, 0x20, 0xd0, 0xde, 0x01, 0x02, 0x13, 0x56, 0x00, 0xf0, 0xf0,
+ 0x00, 0x12, 0x03, 0xb0,
+ 0xf1, 0x03, 0x37, 0x01, 0x90, 0x00, 0xf2, 0x02, 0x22, 0x10, 0x01, 0xf1,
+ 0x14, 0x14, 0x32, 0x00,
+ 0x0f, 0xf0, 0x07, 0xf2, 0xd1, 0xd2, 0x25, 0x42, 0x81, 0xb0, 0x21, 0x25,
+ 0x13, 0xf1, 0xf0, 0x42,
+ 0x55, 0x12, 0x12, 0x01, 0xcf, 0x00, 0x50, 0x15, 0x01, 0x00, 0xee, 0xff,
+ 0x24, 0x53, 0xfe, 0xde,
+ 0x11, 0x00, 0xfe, 0x0d, 0x0c, 0x8a, 0xff, 0x21, 0x33, 0x0c, 0xbc, 0xff,
+ 0x00, 0x02, 0x35, 0xfe,
+ 0xcf, 0x01, 0x02, 0xfd, 0x0d, 0x4d, 0x20, 0x0e, 0x98, 0x0e, 0x13, 0x00,
+ 0xfe, 0x0e, 0x42, 0x34,
+ 0x00, 0xbd, 0x0f, 0x01, 0x34, 0x66, 0x00, 0xf0, 0xe0, 0x00, 0xf1, 0x01,
+ 0x02, 0x42, 0x1f, 0xdb,
+ 0xbe, 0x00, 0x21, 0x45, 0x13, 0xed, 0xda, 0x00, 0x01, 0x04, 0x00, 0xc0,
+ 0xce, 0xdc, 0x11, 0x13,
+ 0xf0, 0xca, 0x00, 0x11, 0x00, 0x00, 0x1e, 0x3f, 0x71, 0x76, 0x10, 0xfd,
+ 0x00, 0x0f, 0x41, 0xf0,
+ 0xd0, 0xfe, 0x0c, 0x0d, 0xf0, 0xf2, 0xee, 0xff, 0x05, 0x04, 0x2d, 0x49,
+ 0x30, 0x70, 0x23, 0xce,
+ 0xcd, 0x0e, 0x3c, 0x20, 0x33, 0x42, 0xfe, 0x89, 0xf0, 0x00, 0x10, 0x0e,
+ 0xf2, 0x05, 0x20, 0xdd,
+ 0xfb, 0xf0, 0x20, 0x50, 0x00, 0xee, 0x30, 0x31, 0x0e, 0x1e, 0x40, 0xee,
+ 0x8c, 0x0f, 0x06, 0x00,
+ 0xdd, 0xeb, 0x20, 0x52, 0x04, 0xfe, 0xcc, 0x00, 0x0f, 0xcd, 0x0f, 0x22,
+ 0x02, 0xff, 0x20, 0x2c,
+ 0xde, 0xe0, 0x15, 0x74, 0x01, 0xd0, 0xbf, 0xfe, 0x0f, 0x44, 0x74, 0x10,
+ 0x0c, 0x01, 0x02, 0x00,
+ 0x01, 0x32, 0x02, 0xe3, 0x0f, 0x1c, 0xf0, 0x01, 0x0e, 0x88, 0xc8, 0x00,
+ 0x11, 0x20, 0xe0, 0x0f,
+ 0x3f, 0x00, 0x01, 0x0f, 0x0d, 0x3f, 0x60, 0x0f, 0x0f, 0x1d, 0x00, 0xbe,
+ 0xe8, 0x0f, 0x40, 0x1f,
+ 0xfe, 0xdf, 0x12, 0x74, 0x11, 0xe0, 0x0e, 0xfa, 0xe0, 0x13, 0x42, 0x12,
+ 0x00, 0x9a, 0xfe, 0xf0,
+ 0x01, 0x32, 0x3f, 0x0d, 0xab, 0x0d, 0x1f, 0x10, 0x13, 0x27, 0xef, 0xce,
+ 0x0f, 0x2f, 0x01, 0xe1,
+ 0xd1, 0xcf, 0x1e, 0xfd, 0x88, 0xfd, 0x22, 0x47, 0x10, 0x00, 0xff, 0x00,
+ 0xf0, 0x10, 0x01, 0x13,
+ 0x01, 0xef, 0xbb, 0x00, 0x33, 0x12, 0xd0, 0xce, 0x0f, 0xf0, 0x30, 0x60,
+ 0x0c, 0xfe, 0x00, 0x52,
+ 0x0f, 0xc8, 0x10, 0x2f, 0xef, 0xb0, 0x00, 0x21, 0x0f, 0xdc, 0xff, 0xce,
+ 0x15, 0x43, 0x00, 0xd0,
+ 0x4f, 0x5d, 0x0f, 0x04, 0x07, 0x15, 0xec, 0xbe, 0x00, 0x20, 0x01, 0xcf,
+ 0xdc, 0x00, 0x33, 0x73,
+ 0x0f, 0xf9, 0xff, 0x20, 0x50, 0xf0, 0xdd, 0x0e, 0x10, 0x40, 0x01, 0xef,
+ 0xbc, 0x0f, 0x03, 0x45,
+ 0xff, 0xdf, 0xe0, 0x10, 0x21, 0x00, 0x00, 0xfe, 0x30, 0x31, 0x2f, 0xb8,
+ 0xda, 0x00, 0x71, 0x53,
+ 0x11, 0x0f, 0x0e, 0xf2, 0x23, 0x54, 0x04, 0xf0, 0xe0, 0x1f, 0x22, 0x01,
+ 0xe3, 0xd1, 0x00, 0x35,
+ 0xf0, 0x8b, 0xe0, 0x35, 0x12, 0xe0, 0x12, 0x01, 0x00, 0xbc, 0xef, 0xd1,
+ 0x55, 0x31, 0x01, 0xf1,
+ 0xb0, 0xd0, 0xfe, 0xf4, 0x12, 0x0f, 0xef, 0xd2, 0x25, 0x66, 0x13, 0x00,
+ 0x00, 0xf0, 0x33, 0x76,
+ 0x00, 0xaf, 0x0f, 0x12, 0x21, 0xff, 0xdd, 0x00, 0x06, 0x11, 0x50, 0x0f,
+ 0x00, 0xf1, 0x00, 0x11,
+ 0x37, 0x11, 0xec, 0xce, 0xf0, 0x01, 0x22, 0x10, 0xcf, 0xac, 0x00, 0x04,
+ 0x21, 0x02, 0x10, 0xfc,
+ 0xcc, 0x1f, 0x70, 0x31, 0x00, 0xee, 0xdf, 0x10, 0x70, 0x01, 0x0d, 0xe1,
+ 0x04, 0x45, 0xf0, 0xcd,
+ 0xe9, 0xff, 0x10, 0x50, 0x16, 0x03, 0xfc, 0xdc, 0x00, 0x40, 0x02, 0x20,
+ 0xdc, 0xad, 0x00, 0x00,
+ 0x01, 0x33, 0xef, 0xce, 0x0f, 0x00, 0xfe, 0xda, 0x01, 0x33, 0x33, 0xf1,
+ 0xd0, 0xda, 0x9e, 0x0f,
+ 0x43, 0x14, 0x1e, 0xfe, 0xe1, 0x66, 0x20, 0x0f, 0xce, 0x00, 0xfe, 0x0d,
+ 0x40, 0x00, 0xfd, 0x0e,
+ 0x05, 0x31, 0x30, 0x44, 0xde, 0xed, 0x74, 0x15, 0x0f, 0xcd, 0x2f, 0x64,
+ 0x04, 0xff, 0xc9, 0x10,
+ 0x51, 0x01, 0x00, 0x0e, 0x00, 0x41, 0x04, 0xe0, 0xfe, 0x11, 0x13, 0xf1,
+ 0xf2, 0xe0, 0xac, 0x00,
+ 0x22, 0xf2, 0xbb, 0x0e, 0x0d, 0x0f, 0x00, 0x2e, 0xfa, 0x10, 0x67, 0x13,
+ 0x10, 0xff, 0xac, 0x01,
+ 0x03, 0x20, 0x00, 0xf0, 0xda, 0x0f, 0x30, 0xe0, 0xc0, 0xf1, 0xd4, 0x14,
+ 0x00, 0xb0, 0xf3, 0x02,
+ 0x03, 0x04, 0xd0, 0x2b, 0x71, 0xf3, 0xd0, 0x55, 0x56, 0x00, 0xef, 0x00,
+ 0x01, 0xf0, 0x00, 0x47,
+ 0x01, 0xef, 0xdd, 0x00, 0x44, 0xf1, 0xb0, 0x00, 0x13, 0x23, 0xe0, 0xde,
+ 0x12, 0x65, 0x11, 0xf0,
+ 0xf1, 0x04, 0x10, 0xd0, 0xe0, 0x45, 0x11, 0x00, 0x31, 0x35, 0xb0, 0xee,
+ 0x20, 0x20, 0x00, 0xef,
+ 0x1f, 0x70, 0x13, 0x31, 0x21, 0x00, 0xda, 0xee, 0x20, 0x32, 0x8d, 0xb8,
+ 0x00, 0x21, 0x21, 0xeb,
+ 0xbf, 0x0f, 0x20, 0x10, 0x00, 0xf0, 0x02, 0x0f, 0x1d, 0x30, 0xd1, 0x88,
+ 0xdc, 0x00, 0x11, 0x00,
+ 0x2f, 0x20, 0x00, 0xc0, 0x00, 0x53, 0x67, 0x02, 0xdd, 0x00, 0x00, 0x21,
+ 0x56, 0x00, 0xd0, 0x0e,
+ 0x0f, 0x00, 0x35, 0x32, 0xd0, 0xbd, 0x00, 0x34, 0xd0, 0xcd, 0x00, 0x0f,
+ 0x5f, 0x00, 0xfe, 0xab,
+ 0x00, 0x23, 0x0d, 0x0c, 0x00, 0x25, 0x0f, 0x0c, 0xcc, 0xfe, 0xfd, 0x64,
+ 0x34, 0xed, 0xcc, 0x0f,
+ 0x20, 0x21, 0x11, 0xdc, 0xab, 0x00, 0x10, 0x00, 0xff, 0xed, 0x20, 0x7e,
+ 0x10, 0x00, 0x20, 0x0d,
+ 0xf9, 0x10, 0x00, 0xdd, 0x0d, 0x40, 0x40, 0xf0, 0xbb, 0xdd, 0xff, 0x34,
+ 0x54, 0xee, 0xac, 0x00,
+ 0x00, 0x12, 0x20, 0xf8, 0x00, 0x30, 0x01, 0x0e, 0x0d, 0xd0, 0x1e, 0x0f,
+ 0x02, 0x11, 0x2f, 0x0c,
+ 0xe0, 0xdd, 0x0d, 0x0e, 0xd0, 0xf3, 0x75, 0x20, 0x1b, 0xba, 0xbe, 0x0f,
+ 0x00, 0x00, 0xad, 0x0d,
+ 0xff, 0x11, 0x00, 0xfa, 0xd0, 0x41, 0x22, 0xcd, 0xba, 0x21, 0x35, 0x32,
+ 0xef, 0xdd, 0x0f, 0x10,
+ 0x52, 0x02, 0x02, 0x40, 0x0c, 0x0e, 0x01, 0x12, 0xde, 0x00, 0x67, 0x10,
+ 0xfd, 0xd0, 0xdd, 0x9c,
+ 0x00, 0x34, 0x21, 0x00, 0xd1, 0x0f, 0x1b, 0x40, 0x52, 0x16, 0x00, 0xd0,
+ 0x0f, 0x60, 0x24, 0xf0,
+ 0xcd, 0x00, 0x00, 0x13, 0x00, 0x0f, 0xf1, 0xf1, 0xef, 0x07, 0x25, 0xd0,
+ 0xdf, 0x30, 0x12, 0x31,
+ 0x11, 0x73, 0x75, 0x10, 0xcc, 0x00, 0xf3, 0xe0, 0xff, 0xe0, 0xe3, 0x45,
+ 0x33, 0xe1, 0x02, 0xf0,
+ 0x00, 0x76, 0x73, 0x0d, 0xb9, 0x0f, 0x10, 0x12, 0x03, 0xff, 0xda, 0x0f,
+ 0x11, 0x04, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x34, 0x00, 0xbf, 0xef, 0x33, 0x60, 0xfb, 0xdd, 0x00,
+ 0x43, 0x21, 0x01, 0xde,
+ 0xbb, 0x00, 0x0e, 0xee, 0xef, 0x12, 0x25, 0x01, 0x30, 0xed, 0xcd, 0x11,
+ 0x67, 0x13, 0x01, 0xd0,
+ 0x12, 0x35, 0xe1, 0xa0, 0xfe, 0xf0, 0x47, 0x24, 0x00, 0x10, 0x11, 0x01,
+ 0x51, 0x14, 0xf0, 0xee,
+ 0x20, 0x54, 0x01, 0xd0, 0xc0, 0xf0, 0xf0, 0x40, 0x23, 0xaa, 0xf0, 0xf3,
+ 0x02, 0x32, 0x30, 0x0e,
+ 0xdb, 0xc0, 0x00, 0x45, 0x00, 0xee, 0xdf, 0x02, 0x02, 0xe0, 0xd0, 0x80,
+ 0xfb, 0x0d, 0x41, 0x41,
+ 0xff, 0xce, 0x00, 0x05, 0x42, 0x57, 0x12, 0x01, 0x0f, 0xe1, 0x37, 0x11,
+ 0xff, 0xff, 0x02, 0x22,
+ 0x01, 0xff, 0x00, 0xef, 0x00, 0x06, 0x01, 0xe0, 0x11, 0x62, 0xf0, 0x00,
+ 0x37, 0x91, 0xc0, 0xf3,
+ 0xf2, 0xe1, 0x02, 0xd3, 0xb1, 0x11, 0x10, 0x01, 0xb2, 0x01, 0x15, 0x43,
+ 0x01, 0x32, 0x37, 0xc3,
+ 0xaf, 0xff, 0x04, 0x13, 0x12, 0x41, 0xf0, 0x8a, 0x00, 0x15, 0x00, 0x1d,
+ 0x1f, 0x02, 0x15, 0x32,
+ 0x0f, 0xbb, 0x00, 0x1f, 0x40, 0x03, 0x13, 0x0e, 0xcc, 0xfe, 0x00, 0x00,
+ 0x12, 0x23, 0xeb, 0xce,
+ 0x1f, 0x50, 0x10, 0xeb, 0xfe, 0x0d, 0x2f, 0x70, 0x0c, 0xca, 0x0f, 0x30,
+ 0x0f, 0x0e, 0x0d, 0xed,
+ 0x1d, 0x0b, 0x0e, 0x3f, 0x20, 0xda, 0x8c, 0x0e, 0x0e, 0x5d, 0x00, 0x02,
+ 0x00, 0xe9, 0xdf, 0xae,
+ 0xee, 0xfd, 0x13, 0x32, 0x0d, 0x88, 0x00, 0x10, 0x20, 0x00, 0x10, 0x00,
+ 0x00, 0xdf, 0x00, 0x30,
+ 0x3e, 0x0f, 0xfc, 0x0e, 0x10, 0x0f, 0xab, 0x00, 0x33, 0x22, 0xda, 0xd0,
+ 0x60, 0x10, 0x0e, 0xcd,
+ 0xfe, 0xdd, 0xca, 0x10, 0x40, 0x1c, 0x1e, 0x60, 0x02, 0x03, 0xfe, 0x0c,
+ 0x30, 0x2f, 0x0d, 0xc0,
+ 0xfc, 0x0d, 0x30, 0x30, 0x00, 0xdf, 0xae, 0xec, 0x0f, 0x35, 0x36, 0x1f,
+ 0x0c, 0xf0, 0x70, 0x40,
+ 0xfd, 0xde, 0x45, 0x54, 0x0e, 0xcb, 0xf0, 0x01, 0xe0, 0x01, 0x00, 0xdd,
+ 0xdd, 0x00, 0x20, 0x76,
+ 0x43, 0x01, 0xff, 0xfe, 0xff, 0xff, 0x10, 0x35, 0xb0, 0xef, 0xce, 0xe0,
+ 0x02, 0x04, 0xf0, 0xe3,
+ 0xf7, 0x03, 0x23, 0xf2, 0x33, 0x60, 0xfe, 0xf3, 0x77, 0x27, 0x00, 0xe0,
+ 0x0e, 0x01, 0x02, 0x13,
+ 0x01, 0x8f, 0xfe, 0x02, 0xf0, 0x05, 0x43, 0x21, 0xf0, 0xff, 0x21, 0x43,
+ 0xe1, 0xd2, 0x16, 0x10,
+ 0x40, 0x21, 0x9e, 0xce, 0x07, 0x04, 0xef, 0xef, 0x12, 0x62, 0x00, 0x00,
+ 0x01, 0x10, 0x20, 0x10,
+ 0x0d, 0xcd, 0x20, 0x22, 0x22, 0xe8, 0xb9, 0x00, 0x3f, 0x10, 0x0f, 0x10,
+ 0x0e, 0x0d, 0x50, 0x12,
+ 0xee, 0xb8, 0xf0, 0x00, 0x00, 0xde, 0x9e, 0xf0, 0x00, 0x1d, 0xfe, 0xfe,
+ 0xed, 0x0d, 0x50, 0x42,
+ 0x0b, 0xd8, 0xfe, 0xff, 0x71, 0x24, 0x00, 0x00, 0x0e, 0x10, 0x14, 0xf0,
+ 0x24, 0x41, 0x00, 0x40,
+ 0x43, 0xbd, 0xdb, 0x12, 0x77, 0x10, 0xfe, 0xdd, 0x01, 0x23, 0x01, 0xef,
+ 0xe0, 0x11, 0x01, 0xf0,
+ 0xd0, 0xbd, 0xed, 0x15, 0x55, 0x10, 0xed, 0xd0, 0x00, 0x22, 0x10, 0x0e,
+ 0x0b, 0xdc, 0xc0, 0x24,
+ 0x02, 0x01, 0x00, 0x40, 0x3f, 0xc0, 0x90, 0xfb, 0x0e, 0x53, 0x36, 0xef,
+ 0xdb, 0x10, 0x50, 0x31,
+ 0x01, 0xef, 0xdc, 0x10, 0x40, 0x34, 0xe1, 0x9e, 0x0e, 0xe1, 0x01, 0x1f,
+ 0x1d, 0xf0, 0x02, 0x27,
+ 0xf0, 0x00, 0x00, 0xff, 0xae, 0x10, 0x54, 0x01, 0xc0, 0x03, 0x05, 0x01,
+ 0x00, 0x32, 0x17, 0xb0,
+ 0x00, 0x10, 0x73, 0x23, 0x04, 0xf0, 0xd0, 0x11, 0x00, 0x0f, 0x20, 0x24,
+ 0x17, 0x10, 0x01, 0xf0,
+ 0x8f, 0xfc, 0xff, 0x24, 0x05, 0xc0, 0xde, 0xee, 0x01, 0x22, 0xd2, 0x02,
+ 0x46, 0x00, 0xdd, 0xe0,
+ 0x74, 0x54, 0xe0, 0xbc, 0x00, 0x00, 0x41, 0x00, 0xf0, 0x01, 0x12, 0x20,
+ 0x15, 0x10, 0xff, 0xba,
+ 0x00, 0x02, 0xe0, 0xcf, 0xfe, 0xfd, 0x0e, 0x17, 0x72, 0x20, 0x0d, 0x00,
+ 0x02, 0x21, 0x00, 0x0f,
+ 0x0f, 0x55, 0x11, 0x00, 0xcf, 0xfd, 0x02, 0x10, 0x00, 0x23, 0xf6, 0xbf,
+ 0xef, 0x34, 0x43, 0x2f,
+ 0x00, 0xf0, 0xc0, 0x36, 0x74, 0x00, 0xfe, 0xdd, 0x00, 0x04, 0x23, 0x10,
+ 0xce, 0xbb, 0xfe, 0x10,
+ 0x25, 0x21, 0x0c, 0x2d, 0x4f, 0x13, 0xd2, 0xbe, 0xfc, 0x0e, 0xe0, 0xed,
+ 0xcd, 0xd8, 0xdf, 0x21,
+ 0x63, 0x00, 0xbb, 0xfd, 0x0f, 0x33, 0x35, 0xe0, 0x4f, 0x10, 0x1e, 0x0d,
+ 0x99, 0x00, 0x21, 0x33,
+ 0xee, 0xbd, 0x00, 0x00, 0xfe, 0x02, 0x34, 0xed, 0xff, 0x40, 0xfe, 0xdc,
+ 0xfd, 0x50, 0x56, 0x00,
+ 0xbc, 0xff, 0x00, 0x01, 0x03, 0x44, 0x13, 0xcd, 0xcc, 0x11, 0x47, 0x00,
+ 0xf0, 0x00, 0x00, 0x24,
+ 0x32, 0xf0, 0xee, 0xdf, 0xf1, 0x37, 0x31, 0x10, 0x2d, 0x10, 0x01, 0x05,
+ 0x20, 0x00, 0x37, 0x00,
+ 0x28, 0xf0, 0xbb, 0x0e, 0x7d, 0xef, 0x51, 0x0f, 0x12, 0x76, 0x22, 0xf0,
+ 0xbe, 0x10, 0x53, 0x00,
+ 0xbd, 0x0a, 0xef, 0x00, 0x11, 0x10, 0xed, 0xdc, 0x0f, 0x0f, 0x22, 0x63,
+ 0x0e, 0xfa, 0xcf, 0x00,
+ 0x10, 0x1b, 0xfc, 0x00, 0x24, 0x62, 0x11, 0x00, 0x13, 0x44, 0xff, 0xee,
+ 0xe0, 0x04, 0x1f, 0x0f,
+ 0x00, 0xec, 0x51, 0x47, 0xe4, 0xbf, 0xff, 0xf0, 0x13, 0x23, 0xd3, 0xa0,
+ 0x0d, 0x0d, 0x1e, 0x00,
+ 0x27, 0x35, 0x00, 0x30, 0x11, 0x12, 0xd0, 0xf0, 0xd3, 0xb3, 0xb2, 0xde,
+ 0xbd, 0x07, 0x36, 0xd0,
+ 0xee, 0x21, 0x52, 0x00, 0xee, 0x10, 0x65, 0x11, 0x11, 0x00, 0xdb, 0x0f,
+ 0x10, 0x00, 0x02, 0xf0,
+ 0x3f, 0x42, 0x03, 0xaf, 0xdd, 0x0f, 0x0c, 0x43, 0x66, 0x00, 0xff, 0xec,
+ 0x1f, 0x40, 0x14, 0x0e,
+ 0x99, 0x00, 0x02, 0x11, 0xeb, 0xdf, 0x20, 0x3f, 0x10, 0xed, 0xff, 0x50,
+ 0x40, 0x00, 0x1c, 0x0e,
+ 0xfa, 0xf0, 0x60, 0x01, 0xcb, 0xcd, 0x0f, 0x00, 0x23, 0x0b, 0xbc, 0x0f,
+ 0x00, 0x20, 0x20, 0x0e,
+ 0xdc, 0xde, 0xf0, 0xef, 0x0e, 0xff, 0x1e, 0x20, 0xfc, 0xdd, 0x3d, 0x00,
+ 0x06, 0x72, 0x60, 0xeb,
+ 0xef, 0xff, 0x0f, 0x10, 0x0d, 0x5e, 0x64, 0x02, 0xdb, 0xee, 0x10, 0x2f,
+ 0x2f, 0x32, 0x02, 0xcb,
+ 0xec, 0xf0, 0x1e, 0x50, 0x1f, 0x00, 0x12, 0x2f, 0x1c, 0x5f, 0x23, 0x01,
+ 0xac, 0x0e, 0x01, 0x42,
+ 0xec, 0xd9, 0x00, 0x34, 0x71, 0x00, 0xfd, 0x00, 0x30, 0xfd, 0x0d, 0x13,
+ 0x13, 0x0d, 0xec, 0xef,
+ 0x03, 0xc2, 0x89, 0xf0, 0x07, 0x32, 0x10, 0xd0, 0xbf, 0x0f, 0x02, 0x34,
+ 0xff, 0xfe, 0x32, 0x23,
+ 0xf0, 0x0f, 0x44, 0x57, 0x12, 0xdf, 0x8c, 0xf0, 0x04, 0x24, 0x00, 0xdd,
+ 0xe0, 0x00, 0x15, 0x11,
+ 0xf0, 0xe0, 0x00, 0x22, 0x77, 0x52, 0xd0, 0xe0, 0x00, 0x11, 0x02, 0x10,
+ 0xe0, 0xe0, 0x12, 0x55,
+ 0xf1, 0xe0, 0x02, 0x23, 0x24, 0xf3, 0xe0, 0xb0, 0x01, 0x15, 0x01, 0x14,
+ 0x35, 0xd0, 0xd2, 0xd2,
+ 0x91, 0xe2, 0x05, 0x24, 0x21, 0xe0, 0xc0, 0x02, 0x63, 0x26, 0x12, 0x10,
+ 0x2f, 0x71, 0x15, 0x11,
+ 0xf0, 0xe0, 0x23, 0x53, 0xef, 0xab, 0x00, 0x02, 0x23, 0x00, 0x00, 0x00,
+ 0x00, 0xd0, 0xe1, 0x07,
+ 0x00, 0xbe, 0x0e, 0x20, 0x01, 0x8b, 0xfc, 0x01, 0x12, 0x1f, 0x0d, 0xef,
+ 0xff, 0x12, 0x12, 0xdd,
+ 0xbb, 0x0e, 0x50, 0x00, 0x0d, 0xda, 0x32, 0x54, 0x00, 0x11, 0x42, 0x22,
+ 0x0e, 0x1e, 0x21, 0x32,
+ 0x11, 0x67, 0x00, 0x0f, 0x00, 0x03, 0xf2, 0x04, 0x37, 0xc0, 0x8b, 0xef,
+ 0x01, 0x23, 0x00, 0xcf,
+ 0x0e, 0x30, 0x23, 0x01, 0xcd, 0xed, 0x00, 0x45, 0x10, 0x0c, 0xee, 0xed,
+ 0xd0, 0xe0, 0xc0, 0x0e,
+ 0xfb, 0xfe, 0xfd, 0x0f, 0x72, 0x72, 0xf9, 0xdc, 0x1f, 0x30, 0x1f, 0xee,
+ 0xce, 0x0d, 0xfc, 0x40,
+ 0x00, 0xd9, 0xe0, 0x00, 0x0c, 0x0f, 0x60, 0x15, 0x10, 0x1e, 0x0f, 0x52,
+ 0x02, 0xfe, 0xab, 0x00,
+ 0x21, 0x0e, 0xfe, 0xff, 0xee, 0xc0, 0x0f, 0x10, 0x54, 0x00, 0x0b, 0x0e,
+ 0x40, 0x41, 0x12, 0x0f,
+ 0x30, 0x00, 0xb8, 0x0e, 0x31, 0x02, 0xac, 0xfc, 0xdf, 0x21, 0x00, 0xed,
+ 0x0b, 0x1f, 0x60, 0x23,
+ 0x12, 0xdc, 0xbc, 0x0f, 0x02, 0x00, 0xdf, 0xfd, 0xff, 0xed, 0x0f, 0x10,
+ 0x3e, 0x77, 0x15, 0x00,
+ 0x00, 0x34, 0x50, 0xfe, 0xdd, 0x00, 0x03, 0xf3, 0xf0, 0xd0, 0x20, 0x08,
+ 0xff, 0xe0, 0x16, 0x40,
+ 0x02, 0x8e, 0xec, 0x00, 0x00, 0xf0, 0xee, 0x60, 0x1f, 0x10, 0x11, 0x04,
+ 0x00, 0x02, 0xf1, 0xcf,
+ 0xce, 0xff, 0x10, 0x53, 0x17, 0x10, 0x0f, 0x0d, 0x24, 0x43, 0x0c, 0xff,
+ 0x03, 0x66, 0x33, 0x00,
+ 0x88, 0xed, 0x10, 0x35, 0x20, 0x01, 0x10, 0xee, 0xe0, 0x30, 0x50, 0x20,
+ 0x02, 0xf0, 0xcc, 0x00,
+ 0x00, 0x00, 0xdc, 0xde, 0x30, 0x53, 0xef, 0xb9, 0x10, 0x41, 0x01, 0xc0,
+ 0xfe, 0xee, 0x1d, 0x0c,
+ 0x0e, 0xfd, 0xf1, 0x56, 0x21, 0x0f, 0xfc, 0xe0, 0x32, 0xc1, 0xe0, 0x43,
+ 0x13, 0xa8, 0xcd, 0x00,
+ 0x20, 0x21, 0xf1, 0x00, 0x10, 0x0b, 0xed, 0x9d, 0xff, 0x15, 0x73, 0x01,
+ 0xeb, 0xef, 0xf0, 0x10,
+ 0x21, 0x03, 0x00, 0xdb, 0xe0, 0x22, 0x10, 0xf0, 0xae, 0xff, 0xf2, 0x13,
+ 0x6f, 0x00, 0xec, 0x0f,
+ 0x75, 0x16, 0x0f, 0x0a, 0xe0, 0x10, 0x00, 0x20, 0x00, 0xff, 0xff, 0x00,
+ 0x10, 0x60, 0x00, 0x00,
+ 0xd1, 0x37, 0x0f, 0xcd, 0x0f, 0x0e, 0xbc, 0xde, 0xef, 0x0d, 0x00, 0x32,
+ 0x1a, 0xca, 0xdf, 0x10,
+ 0x72, 0x42, 0x00, 0xcc, 0x0e, 0x00, 0x12, 0x21, 0x0f, 0x20, 0x31, 0x10,
+ 0x73, 0x27, 0x00, 0xb0,
+ 0x10, 0x22, 0x02, 0xff, 0xee, 0x05, 0x46, 0x01, 0xe1, 0xf0, 0xcf, 0xf0,
+ 0x01, 0xe2, 0xe1, 0x12,
+ 0x01, 0x0f, 0x40, 0x27, 0xe2, 0xf0, 0x10, 0x03, 0x56, 0x01, 0x82, 0xd2,
+ 0x04, 0xd0, 0xe0, 0xd1,
+ 0x04, 0xe3, 0x33, 0x0f, 0xee, 0x74, 0x77, 0x31, 0xdf, 0x0f, 0x42, 0x15,
+ 0xe0, 0xce, 0x00, 0x40,
+ 0x00, 0xf0, 0xd0, 0x02, 0x12, 0x10, 0xff, 0x22, 0x34, 0x22, 0x03, 0x22,
+ 0x61, 0xfe, 0xca, 0x0f,
+ 0x1e, 0x0d, 0xcb, 0xff, 0x03, 0x27, 0x11, 0x00, 0x9d, 0xee, 0xe0, 0x33,
+ 0x32, 0x0c, 0x2e, 0x20,
+ 0x76, 0x33, 0xcd, 0xcc, 0x20, 0x53, 0x00, 0xed, 0x02, 0x0f, 0x0a, 0xde,
+ 0x0e, 0x20, 0x1f, 0x01,
+ 0x03, 0x41, 0xfd, 0x9a, 0xf0, 0x04, 0x02, 0xdd, 0x8a, 0xf0, 0x12, 0x03,
+ 0x0e, 0xf0, 0x42, 0x01,
+ 0xfe, 0x00, 0x35, 0x10, 0xe0, 0xe2, 0x01, 0xaa, 0xde, 0xce, 0x0f, 0x3f,
+ 0x0f, 0x53, 0x23, 0x08,
+ 0xee, 0x11, 0x30, 0x00, 0x2e, 0x30, 0xdf, 0x9c, 0xfc, 0x0f, 0xfe, 0xcc,
+ 0x30, 0x74, 0x00, 0xee,
+ 0xfd, 0x0c, 0x51, 0x47, 0x0f, 0xfe, 0x00, 0x32, 0x10, 0x1f, 0x00, 0xf0,
+ 0xec, 0xbd, 0xe0, 0x16,
+ 0x01, 0x0e, 0xfe, 0xe1, 0x01, 0x54, 0x33, 0x00, 0xcc, 0xfe, 0x01, 0x65,
+ 0x23, 0x00, 0xbe, 0x0d,
+ 0x00, 0x02, 0xf3, 0xf2, 0xfe, 0xfa, 0x1e, 0x51, 0xe1, 0xdd, 0x0c, 0x25,
+ 0x04, 0x02, 0xaf, 0xed,
+ 0xf0, 0x00, 0xf2, 0x00, 0xf4, 0xf0, 0xbe, 0xec, 0x12, 0x15, 0x74, 0x44,
+ 0x10, 0x0f, 0x12, 0x01,
+ 0xcc, 0x01, 0x53, 0xf0, 0xc9, 0x00, 0x36, 0x10, 0xae, 0x0f, 0x01, 0x56,
+ 0x00, 0xc0, 0x0e, 0x31,
+ 0x00, 0x12, 0xf0, 0xe0, 0x00, 0x22, 0x03, 0x01, 0xbf, 0xe0, 0x04, 0x27,
+ 0x12, 0xf0, 0xee, 0xde,
+ 0x23, 0x77, 0x62, 0x00, 0xdd, 0x01, 0x33, 0x00, 0xf0, 0xf0, 0xe0, 0x07,
+ 0x22, 0xff, 0xcd, 0x22,
+ 0x67, 0x01, 0x00, 0xff, 0x00, 0xef, 0xf0, 0x01, 0x00, 0x0f, 0x0c, 0x9f,
+ 0xfe, 0xef, 0x0f, 0x1e,
+ 0x1f, 0x10, 0x01, 0xff, 0xca, 0xef, 0xe1, 0xd0, 0x9a, 0x00, 0x70, 0x20,
+ 0x00, 0x31, 0x01, 0x02,
+ 0x35, 0x23, 0x0f, 0xed, 0xc1, 0x24, 0x45, 0xff, 0xcc, 0x02, 0x13, 0x01,
+ 0xdd, 0x0d, 0x00, 0xf1,
+ 0x01, 0x3f, 0x29, 0xfe, 0xdd, 0xef, 0x21, 0x77, 0x2f, 0x1e, 0x1f, 0xd0,
+ 0x8e, 0xfe, 0x47, 0x14,
+ 0xce, 0xcd, 0xe0, 0x10, 0x10, 0xfe, 0xed, 0x51, 0x32, 0xfa, 0xad, 0x10,
+ 0x10, 0x20, 0x01, 0xef,
+ 0x0d, 0xdc, 0xed, 0x1d, 0x31, 0xef, 0xfc, 0x50, 0x45, 0x10, 0x0e, 0xf0,
+ 0x02, 0x00, 0x22, 0x00,
+ 0x88, 0xec, 0xff, 0x10, 0x13, 0x1d, 0x0d, 0x30, 0x33, 0x02, 0xdb, 0xcf,
+ 0x52, 0x46, 0x00, 0xef,
+ 0xdd, 0x2f, 0x50, 0x11, 0xe0, 0x0d, 0x19, 0x5f, 0x30, 0x30, 0xfd, 0x9b,
+ 0xfd, 0x0f, 0x30, 0x0e,
+ 0xaa, 0x0e, 0x0f, 0x20, 0x00, 0xc8, 0xef, 0x00, 0x1f, 0xe0, 0xbd, 0x10,
+ 0x30, 0x00, 0xdb, 0x0f,
+ 0x3f, 0x22, 0x43, 0x01, 0xcd, 0x0c, 0x20, 0x12, 0xe2, 0x9d, 0xfd, 0x0d,
+ 0x0f, 0x06, 0x01, 0xf0,
+ 0x2d, 0x2d, 0x0e, 0x33, 0x57, 0x10, 0x00, 0x02, 0xf0, 0x8d, 0x8d, 0x02,
+ 0x26, 0xf0, 0x01, 0x11,
+ 0x44, 0x12, 0x00, 0x00, 0x34, 0x13, 0x00, 0x04, 0x10, 0xfc, 0xd0, 0x20,
+ 0xf2, 0xb4, 0xf2, 0xf0,
+ 0xeb, 0xdf, 0x04, 0x75, 0x62, 0x02, 0x12, 0xef, 0xdf, 0x03, 0x46, 0x42,
+ 0xf1, 0xcf, 0x0e, 0x02,
+ 0x02, 0x02, 0x0e, 0xdd, 0x00, 0xed, 0xd8, 0xff, 0x60, 0x31, 0x00, 0x11,
+ 0x45, 0x10, 0xfe, 0x8f,
+ 0x00, 0x00, 0x0e, 0xfb, 0x00, 0x04, 0xf3, 0xfc, 0xdc, 0x1f, 0x42, 0x06,
+ 0x20, 0x10, 0x00, 0x72,
+ 0x11, 0xbd, 0xcd, 0x00, 0x02, 0x23, 0xed, 0xda, 0x12, 0x57, 0x00, 0xef,
+ 0xcf, 0xf0, 0xf0, 0x42,
+ 0x06, 0xe0, 0x0f, 0x22, 0x32, 0xc0, 0xfe, 0x01, 0x37, 0x62, 0x01, 0xd0,
+ 0xf0, 0xd0, 0x00, 0x22,
+ 0x52, 0x23, 0x52, 0x25, 0x22, 0xce, 0x0d, 0x23, 0x57, 0x07, 0xcf, 0x0f,
+ 0x00, 0x11, 0x02, 0xe0,
+ 0xdf, 0x00, 0x40, 0x22, 0x31, 0x20, 0xfd, 0xf0, 0x0f, 0xbf, 0x9b, 0xfd,
+ 0xed, 0xeb, 0xf0, 0x32,
+ 0x02, 0xac, 0xfd, 0x00, 0x22, 0xcf, 0xf8, 0x10, 0x51, 0x11, 0x1f, 0x2c,
+ 0x0f, 0x61, 0x13, 0x00,
+ 0x00, 0x35, 0x00, 0xb0, 0x01, 0xf3, 0x12, 0x05, 0x02, 0xd0, 0x0e, 0x00,
+ 0x47, 0x33, 0x11, 0x0f,
+ 0xcf, 0x00, 0x32, 0x77, 0xf2, 0xcf, 0x00, 0x00, 0x00, 0x23, 0xe1, 0xb2,
+ 0xf3, 0x03, 0x25, 0xf0,
+ 0xb0, 0x01, 0x15, 0x23, 0xd0, 0xbe, 0xe1, 0x00, 0x2f, 0x54, 0xe1, 0xdd,
+ 0x01, 0x43, 0x0e, 0x00,
+ 0x15, 0x02, 0x0f, 0x00, 0xff, 0xf8, 0x10, 0x3f, 0xf1, 0x30, 0x2e, 0xdd,
+ 0xff, 0xdf, 0xdd, 0x53,
+ 0x77, 0x2f, 0xdb, 0xbf, 0xfe, 0x10, 0x20, 0x00, 0x2f, 0x2e, 0x0d, 0xdc,
+ 0x10, 0x76, 0x40, 0xdc,
+ 0xdd, 0xf0, 0x00, 0x31, 0x1b, 0x2e, 0x2e, 0x0d, 0x7f, 0x2f, 0xd8, 0xfe,
+ 0x00, 0x0f, 0xff, 0x20,
+ 0x20, 0x8b, 0x8c, 0x0f, 0x21, 0x13, 0x0d, 0xfd, 0xe0, 0x00, 0x00, 0x2d,
+ 0x0b, 0x0f, 0xf0, 0x13,
+ 0x00, 0x0d, 0x0f, 0xfb, 0x50, 0x15, 0xe0, 0xdf, 0xe0, 0xff, 0x20, 0x52,
+ 0xa9, 0xfd, 0x00, 0x52,
+ 0x0d, 0xec, 0xfd, 0x0e, 0x50, 0x21, 0x0c, 0xdb, 0xff, 0xfe, 0xf1, 0x00,
+ 0x1c, 0xfd, 0x00, 0x00,
+ 0xeb, 0x0d, 0x7d, 0x40, 0x32, 0xe0, 0xd9, 0x00, 0x4f, 0x00, 0x1d, 0x2d,
+ 0x00, 0x01, 0xae, 0xfb,
+ 0x00, 0xfb, 0xee, 0x30, 0x75, 0x52, 0xff, 0xcb, 0x0f, 0x11, 0x22, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x43, 0x02, 0x01, 0xb1, 0x05, 0x01, 0xd9, 0xbe, 0x43, 0x33, 0xe0,
+ 0xcc, 0x10, 0x31, 0x01,
+ 0xe1, 0xd1, 0x06, 0x01, 0xe0, 0xaf, 0x00, 0x0e, 0xf0, 0x14, 0x05, 0xe0,
+ 0x42, 0x32, 0xe0, 0x9e,
+ 0x00, 0x37, 0x33, 0xff, 0x9e, 0xfe, 0x11, 0x12, 0x02, 0x00, 0x20, 0xf2,
+ 0xbf, 0x0f, 0x47, 0x34,
+ 0xd0, 0xbf, 0x00, 0xf6, 0x00, 0x01, 0xe0, 0xe3, 0x00, 0x0f, 0x0e, 0x44,
+ 0x53, 0xdd, 0xee, 0x02,
+ 0x03, 0x55, 0x01, 0xbf, 0x01, 0x64, 0x03, 0x0f, 0x0e, 0xf0, 0x03, 0x17,
+ 0x33, 0x00, 0xd0, 0xe0,
+ 0xe2, 0x47, 0x22, 0xed, 0x1f, 0x30, 0xad, 0x00, 0x27, 0x12, 0xde, 0xdc,
+ 0xe0, 0xee, 0xfe, 0xdf,
+ 0x21, 0x31, 0xbd, 0xc8, 0xbc, 0x00, 0x40, 0x31, 0x00, 0x20, 0x1e, 0x0e,
+ 0xdd, 0x21, 0x66, 0x00,
+ 0x40, 0x20, 0x1f, 0x00, 0xbc, 0x20, 0x77, 0x23, 0x0f, 0xcd, 0x00, 0x30,
+ 0x2f, 0x02, 0x0f, 0x0e,
+ 0x00, 0x00, 0x0f, 0xff, 0xdd, 0x9c, 0x03, 0xf6, 0xe0, 0xfd, 0xd0, 0xed,
+ 0xf0, 0x51, 0x00, 0x00,
+ 0x35, 0xfe, 0xde, 0x45, 0x13, 0xc2, 0xa0, 0xfe, 0xe8, 0xde, 0xde, 0xd0,
+ 0x02, 0x53, 0x1d, 0x1c,
+ 0x21, 0x02, 0x20, 0x22, 0x60, 0x54, 0x10, 0x0f, 0xfe, 0xea, 0x00, 0xff,
+ 0xf0, 0x34, 0x40, 0x00,
+ 0xbe, 0x06, 0x73, 0x00, 0x0d, 0xd0, 0x02, 0x00, 0xfe, 0xdf, 0x07, 0x67,
+ 0xe1, 0xde, 0x11, 0x13,
+ 0xe0, 0xd1, 0x23, 0xce, 0xfc, 0x75, 0x32, 0x10, 0x0e, 0x21, 0x40, 0x32,
+ 0x11, 0xdd, 0x10, 0x31,
+ 0xbd, 0xd9, 0xc0, 0xff, 0x02, 0x34, 0x00, 0xcf, 0xba, 0x0f, 0x42, 0x47,
+ 0xf1, 0xbd, 0x10, 0x22,
+ 0xf0, 0xc0, 0xe0, 0x01, 0x01, 0x0f, 0xd0, 0xe4, 0x24, 0x73, 0x14, 0x00,
+ 0xed, 0xfd, 0x00, 0xf1,
+ 0x03, 0x57, 0xf0, 0xac, 0x0f, 0xe1, 0x16, 0x00, 0xce, 0xf0, 0x00, 0x11,
+ 0x21, 0x22, 0xf0, 0x20,
+ 0x77, 0x30, 0xf0, 0x0e, 0x51, 0x01, 0xee, 0x00, 0x36, 0x21, 0xe0, 0xed,
+ 0x12, 0x25, 0x11, 0x50,
+ 0xf1, 0xcf, 0xdd, 0x0f, 0x44, 0x33, 0x57, 0x00, 0xbf, 0x0f, 0x30, 0x00,
+ 0x03, 0x11, 0x10, 0x0d,
+ 0x42, 0x02, 0x00, 0x4e, 0x0f, 0xbb, 0x00, 0xf0, 0xdc, 0x98, 0xfe, 0x20,
+ 0x10, 0xed, 0xde, 0x0c,
+ 0x1e, 0x40, 0x21, 0x0f, 0xdd, 0xdb, 0xfd, 0xfd, 0x10, 0x0c, 0x9d, 0x00,
+ 0x10, 0x0d, 0xbc, 0xee,
+ 0xed, 0xff, 0x75, 0x24, 0xfe, 0xdb, 0xfe, 0x0d, 0x10, 0x0c, 0xb0, 0x31,
+ 0x30, 0x1c, 0x2d, 0x40,
+ 0x00, 0xe0, 0xdf, 0xcb, 0xcc, 0x00, 0x33, 0x75, 0x0f, 0xde, 0xf0, 0x02,
+ 0x20, 0x1d, 0x11, 0x00,
+ 0xad, 0x17, 0x67, 0xf0, 0xce, 0xfe, 0x11, 0x35, 0x31, 0xf0, 0xc1, 0x01,
+ 0x11, 0x10, 0x0d, 0x30,
+ 0x77, 0x32, 0xf0, 0xce, 0x00, 0x0f, 0x30, 0x14, 0x10, 0xdf, 0xcd, 0x01,
+ 0xf5, 0xdf, 0xcc, 0xde,
+ 0xf1, 0xe0, 0xf0, 0xe0, 0x99, 0xde, 0x10, 0x41, 0x21, 0x2e, 0x30, 0x20,
+ 0x30, 0x01, 0xd0, 0xee,
+ 0x64, 0x03, 0xdb, 0xbf, 0x11, 0x15, 0x33, 0x03, 0xdf, 0x8f, 0x12, 0x14,
+ 0x21, 0x02, 0x02, 0x12,
+ 0x77, 0x02, 0xfe, 0xee, 0x00, 0x44, 0x04, 0x25, 0x41, 0xff, 0xbe, 0x02,
+ 0x05, 0x01, 0x00, 0xf0,
+ 0x12, 0xf3, 0xe2, 0x25, 0x53, 0xf2, 0xb0, 0xf2, 0xe1, 0x01, 0xe0, 0xe1,
+ 0x02, 0x41, 0x14, 0x00,
+ 0xef, 0x2b, 0x50, 0x53, 0x37, 0x04, 0xbd, 0xfe, 0x00, 0x02, 0x20, 0x00,
+ 0xab, 0xed, 0x22, 0x67,
+ 0x00, 0xdd, 0x0e, 0x00, 0x31, 0x03, 0xfe, 0xed, 0x21, 0x23, 0x9c, 0xdd,
+ 0x00, 0x22, 0x10, 0xfc,
+ 0xde, 0x20, 0x44, 0x00, 0x1f, 0x1e, 0x08, 0x3f, 0x70, 0x33, 0xff, 0xa8,
+ 0x0f, 0x20, 0x2e, 0x0f,
+ 0x9b, 0x0f, 0xf0, 0x10, 0x0f, 0x1d, 0xfd, 0xfe, 0x0e, 0x2f, 0x1e, 0x2d,
+ 0x2a, 0x1e, 0xfd, 0xfe,
+ 0xff, 0xa0, 0xf2, 0xe1, 0x0d, 0xd8, 0xb0, 0xf0, 0xfe, 0xed, 0x10, 0x50,
+ 0x30, 0x10, 0x52, 0x0d,
+ 0x08, 0x0e, 0x00, 0x30, 0x00, 0x8e, 0xf9, 0xf0, 0x0f, 0xdf, 0xdd, 0x0d,
+ 0x52, 0x21, 0x0d, 0xfc,
+ 0x35, 0x51, 0xfd, 0xfd, 0x10, 0x3e, 0xec, 0xe0, 0x0f, 0x0e, 0x70, 0x15,
+ 0x00, 0x0f, 0x0b, 0xfe,
+ 0x10, 0x71, 0x12, 0x00, 0xfb, 0xdf, 0xf0, 0x04, 0x22, 0x0e, 0xdf, 0x64,
+ 0xf5, 0xd1, 0xd0, 0xbd,
+ 0x00, 0x36, 0x72, 0xf0, 0xef, 0x11, 0x64, 0x00, 0xfe, 0x02, 0xf2, 0x00,
+ 0x00, 0x01, 0xe4, 0xf0,
+ 0x01, 0x30, 0x00, 0x03, 0x04, 0x27, 0x62, 0x00, 0xf0, 0xc0, 0xe0, 0x01,
+ 0x03, 0xf3, 0xc0, 0x03,
+ 0x25, 0x74, 0xf1, 0xcf, 0x1f, 0x44, 0x06, 0xe1, 0x31, 0x42, 0xdf, 0xab,
+ 0x00, 0x00, 0x00, 0x14,
+ 0x34, 0xef, 0xbe, 0x04, 0x14, 0xe0, 0xb1, 0x00, 0x01, 0x05, 0x01, 0xf1,
+ 0x03, 0x12, 0x30, 0x22,
+ 0x05, 0xc2, 0xd0, 0xd0, 0x27, 0x73, 0x51, 0xcf, 0x01, 0x07, 0x11, 0x01,
+ 0x20, 0x44, 0x01, 0xf0,
+ 0xf1, 0x44, 0x32, 0x10, 0x01, 0xe3, 0xc0, 0xc0, 0xf0, 0x02, 0x00, 0x00,
+ 0x10, 0x00, 0x68, 0x00,
+ 0x32, 0x11, 0xf4, 0x29, 0x11, 0x11, 0x59, 0x2b, 0xfc, 0xbc, 0xfe, 0xee,
+ 0x8c, 0x9c, 0xdc, 0xdd,
+ 0xdd, 0xaa, 0xcd, 0xdc, 0xed, 0xde, 0xdd, 0xbd, 0xdb, 0xde, 0xee, 0xe0,
+ 0xee, 0xee, 0xfe, 0xdf,
+ 0xee, 0xe0, 0xf2, 0x03, 0xe2, 0xd0, 0xe2, 0x13, 0x47, 0x74, 0x32, 0x63,
+ 0x32, 0x31, 0x21, 0x43,
+ 0x35, 0x31, 0x30, 0x20, 0x43, 0x44, 0x32, 0x11, 0x20, 0x20, 0x43, 0x23,
+ 0x00, 0x0c, 0x3f, 0x31,
+ 0x33, 0x31, 0x2e, 0x1b, 0x3e, 0x51, 0x00, 0xa8, 0xcd, 0xde, 0xdc, 0xac,
+ 0xdc, 0xcd, 0xde, 0xdf,
+ 0xde, 0xcd, 0xef, 0xdd, 0xdd, 0xef, 0xcc, 0xd9, 0xde, 0xf0, 0xf0, 0xfe,
+ 0x0c, 0x0e, 0xed, 0xef,
+ 0xef, 0x00, 0x21, 0x20, 0xdd, 0xcf, 0xaf, 0xbe, 0xda, 0xb0, 0xf4, 0xe4,
+ 0xd1, 0xe0, 0x02, 0x22,
+ 0x23, 0x34, 0x32, 0x2e, 0x5e, 0x42, 0x43, 0x3d, 0x5a, 0x3f, 0x5e, 0x2d,
+ 0x3c, 0x4d, 0x2a, 0x2d,
+ 0x3d, 0x50, 0x2f, 0x2b, 0x2d, 0x3d, 0x3d, 0x4e, 0x2d, 0x1a, 0x2f, 0x10,
+ 0x10, 0x0f, 0xe0, 0xf5,
+ 0x07, 0x02, 0xb1, 0xd1, 0xd2, 0xf4, 0xe3, 0x04, 0x32, 0x11, 0x22, 0x33,
+ 0x45, 0x24, 0xf1, 0x80,
+ 0xb1, 0xf2, 0xf2, 0xd1, 0xa0, 0xdf, 0xdf, 0xef, 0xcd, 0xdd, 0xe2, 0xf7,
+ 0xe4, 0x03, 0x02, 0xf1,
+ 0xdf, 0xe0, 0xf1, 0xe3, 0xd2, 0xd1, 0xf1, 0xe0, 0x9e, 0xca, 0xd0, 0xf1,
+ 0x01, 0xfd, 0xe9, 0xee,
+ 0xf0, 0x00, 0x33, 0x20, 0xcc, 0xc0, 0x35, 0x73, 0x21, 0x22, 0x43, 0x42,
+ 0x21, 0x30, 0x40, 0x55,
+ 0x45, 0x20, 0x42, 0x32, 0x51, 0x20, 0x2d, 0x31, 0x34, 0x30, 0x1b, 0x2d,
+ 0x1c, 0x2b, 0x1d, 0x1d,
+ 0x1c, 0x4d, 0x4e, 0x40, 0x3f, 0x4f, 0x2f, 0x3d, 0x2d, 0x1e, 0x0b, 0xde,
+ 0xe0, 0x02, 0x05, 0xe3,
+ 0x80, 0xbe, 0xee, 0xee, 0x0e, 0x00, 0xf0, 0xfc, 0xdb, 0xec, 0xde, 0x00,
+ 0x14, 0x04, 0xf0, 0xa0,
+ 0xe0, 0xe2, 0xd1, 0xaf, 0xd0, 0xd2, 0xd5, 0xc3, 0xd0, 0xce, 0xff, 0xef,
+ 0xb8, 0xdb, 0xef, 0xe0,
+ 0xef, 0xce, 0xec, 0xde, 0xee, 0xdf, 0xc0, 0xd0, 0xd0, 0xde, 0xf3, 0x07,
+ 0x21, 0x40, 0x60, 0x20,
+ 0x41, 0x64, 0x22, 0x30, 0x40, 0x20, 0x2f, 0x08, 0x0d, 0x1b, 0x0e, 0x20,
+ 0x21, 0x00, 0x0f, 0xed,
+ 0xdb, 0xbc, 0xde, 0xd0, 0xcf, 0xcf, 0xcc, 0xbb, 0xdc, 0xce, 0xde, 0xf1,
+ 0xe2, 0xd1, 0xe2, 0xe3,
+ 0x16, 0x22, 0x14, 0x12, 0x14, 0x12, 0x02, 0x32, 0x22, 0x23, 0x54, 0x23,
+ 0x33, 0x73, 0x43, 0x32,
+ 0x31, 0x54, 0x47, 0x52, 0x21, 0x20, 0x31, 0x43, 0x23, 0x33, 0x24, 0x33,
+ 0x22, 0x10, 0x00, 0x03,
+ 0x15, 0x01, 0x03, 0x24, 0x11, 0x00, 0xff, 0xb0, 0xf4, 0x06, 0xe1, 0xa0,
+ 0xdf, 0xd0, 0xbf, 0xdf,
+ 0xbd, 0xdd, 0xdb, 0xde, 0xef, 0xef, 0xf0, 0x11, 0x62, 0x1e, 0x19, 0x2f,
+ 0x3f, 0x50, 0x3f, 0x3f,
+ 0x2e, 0x2c, 0x29, 0x2e, 0x1f, 0x20, 0x10, 0x01, 0xb1, 0xb0, 0xde, 0xd0,
+ 0xd0, 0xe3, 0xf7, 0xb1,
+ 0xc0, 0xd0, 0xf3, 0xe3, 0xd0, 0xbe, 0xdd, 0xed, 0xdc, 0xfd, 0x0e, 0x0d,
+ 0x0a, 0xec, 0xfd, 0x1e,
+ 0x2c, 0x5e, 0x5c, 0x3c, 0x3c, 0x2d, 0x1b, 0x3f, 0x6f, 0x1d, 0x0b, 0x1f,
+ 0x10, 0x01, 0xf0, 0xe0,
+ 0x10, 0x50, 0x20, 0x0f, 0x0e, 0x0f, 0x52, 0x43, 0x2e, 0x0a, 0xed, 0xee,
+ 0xe0, 0xff, 0xe0, 0xcf,
+ 0xcb, 0xed, 0xdd, 0xab, 0xcc, 0xcb, 0xcd, 0xdc, 0xdd, 0xdc, 0xcd, 0xdd,
+ 0xee, 0xe0, 0xcd, 0xce,
+ 0xf0, 0x03, 0x02, 0xcf, 0xde, 0xc0, 0xe0, 0xe0, 0xcb, 0xff, 0xf0, 0xf3,
+ 0x06, 0x14, 0x32, 0x30,
+ 0x50, 0x34, 0x26, 0x43, 0x32, 0x32, 0x22, 0x63, 0x45, 0x33, 0x23, 0x11,
+ 0x33, 0x65, 0x22, 0x21,
+ 0x31, 0x43, 0x33, 0x54, 0x21, 0x32, 0x43, 0x45, 0x21, 0x20, 0x10, 0x21,
+ 0x2e, 0x2c, 0x1e, 0x2e,
+ 0x2b, 0x0c, 0x2e, 0x4e, 0x4e, 0x2c, 0x1e, 0x30, 0x42, 0x10, 0xfd, 0xbc,
+ 0xdd, 0xdf, 0xe0, 0x01,
+ 0xe1, 0x9b, 0xd8, 0xde, 0x00, 0x31, 0x10, 0xfd, 0x00, 0x31, 0x11, 0xf0,
+ 0xd1, 0x12, 0x32, 0x12,
+ 0xb1, 0xcf, 0x01, 0x47, 0x37, 0x00, 0xa1, 0xe0, 0x04, 0x03, 0xf1, 0xe1,
+ 0xf3, 0x03, 0x14, 0xc4,
+ 0x82, 0x92, 0xe2, 0xd3, 0xe6, 0xe3, 0xd4, 0xb2, 0xe2, 0xe4, 0xf3, 0x02,
+ 0xd2, 0xf4, 0x14, 0x12,
+ 0x32, 0x43, 0x52, 0x33, 0x31, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0xba,
+ 0xdd, 0xdd, 0xff, 0x1f,
+ 0x0b, 0xdb, 0xac, 0xee, 0x0d, 0x1e, 0xeb, 0xac, 0xcc, 0xdc, 0xde, 0xbd,
+ 0xed, 0xee, 0xee, 0xee,
+ 0xff, 0xff, 0xfe, 0xf0, 0x00, 0x00, 0x2f, 0x10, 0x0f, 0x0f, 0x00, 0x00,
+ 0x30, 0x52, 0x0f, 0xe9,
+ 0x0e, 0x6f, 0x50, 0x42, 0x63, 0x20, 0x1e, 0x30, 0x37, 0x47, 0x31, 0x32,
+ 0x32, 0x32, 0x10, 0xee,
+ 0xf0, 0x46, 0x53, 0x12, 0x01, 0xf1, 0x11, 0x22, 0x42, 0x32, 0x20, 0x10,
+ 0x02, 0x01, 0xd0, 0x9c,
+ 0xdd, 0xdf, 0xbe, 0xdb, 0xcd, 0xee, 0x0c, 0xee, 0xf1, 0xf2, 0x1f, 0x3d,
+ 0x3b, 0x2b, 0x2b, 0x1d,
+ 0x2d, 0x3d, 0x6f, 0x0d, 0xe9, 0xae, 0xde, 0xe0, 0xc0, 0xd0, 0xc0, 0xe1,
+ 0xc0, 0xdd, 0xf1, 0x17,
+ 0x23, 0x00, 0xf0, 0xfe, 0xdd, 0xcd, 0xbe, 0xe1, 0xf7, 0x13, 0xe0, 0xde,
+ 0x00, 0x2f, 0x1b, 0x5e,
+ 0x7e, 0x6d, 0x2b, 0x1c, 0x2b, 0x2f, 0x3d, 0x2c, 0x0d, 0x3d, 0x3f, 0x3d,
+ 0x3f, 0x1f, 0x0f, 0xf0,
+ 0x06, 0xd1, 0x80, 0xd0, 0xf3, 0x04, 0x02, 0x03, 0xe3, 0x04, 0x04, 0xe3,
+ 0x81, 0xe5, 0x05, 0xf2,
+ 0xe2, 0xd1, 0xe2, 0xd1, 0xd2, 0xf3, 0xd4, 0xb1, 0xc1, 0xc1, 0xd1, 0x90,
+ 0xdf, 0xd2, 0xd7, 0xf2,
+ 0xd1, 0xd1, 0xd2, 0xf3, 0x04, 0xf3, 0x04, 0x01, 0xff, 0xbd, 0xfd, 0x0f,
+ 0x0e, 0xfe, 0x1d, 0x0b,
+ 0x1d, 0x0f, 0xfd, 0x30, 0x72, 0x73, 0x41, 0x11, 0x1e, 0x34, 0x67, 0x23,
+ 0x21, 0x31, 0x44, 0x21,
+ 0x2f, 0x3e, 0x42, 0x47, 0x24, 0x21, 0x31, 0x22, 0x41, 0x20, 0x2f, 0x2d,
+ 0x3c, 0x5c, 0x2c, 0x2b,
+ 0x2e, 0x3d, 0x3f, 0x2e, 0x1d, 0x2d, 0x2d, 0x2e, 0x31, 0x47, 0x32, 0x10,
+ 0x00, 0x2f, 0x70, 0x70,
+ 0x1e, 0x0a, 0x30, 0x31, 0x3f, 0x3c, 0x5f, 0x2f, 0x21, 0x36, 0x12, 0x00,
+ 0x13, 0x13, 0x02, 0xe0,
+ 0xa1, 0xd0, 0xf4, 0x06, 0x01, 0xcf, 0xbe, 0xef, 0xd0, 0xdf, 0x01, 0x00,
+ 0xef, 0xcf, 0xd4, 0xc4,
+ 0x9d, 0xd8, 0xcf, 0xc0, 0xdf, 0xd1, 0xc3, 0xe2, 0xc1, 0xf3, 0xe5, 0x04,
+ 0xf2, 0x03, 0x04, 0x13,
+ 0x24, 0x32, 0x22, 0x30, 0x73, 0x35, 0x32, 0x31, 0x43, 0x42, 0x31, 0x2f,
+ 0x1b, 0x1f, 0x0e, 0xfa,
+ 0xee, 0x0e, 0xec, 0xac, 0xdd, 0xcd, 0xba, 0xdd, 0xab, 0xed, 0xde, 0xf0,
+ 0xdf, 0xcc, 0xde, 0xde,
+ 0xef, 0xf0, 0xf2, 0xf2, 0xf3, 0x04, 0x03, 0x03, 0xf1, 0xd0, 0xe4, 0xf6,
+ 0xc1, 0xc1, 0xd2, 0xe2,
+ 0x24, 0x53, 0x11, 0x33, 0x53, 0x46, 0x53, 0x22, 0x21, 0x21, 0x44, 0x44,
+ 0x22, 0x20, 0x20, 0x31,
+ 0x22, 0x30, 0x31, 0x40, 0x30, 0x40, 0x41, 0x31, 0x20, 0x2f, 0x2f, 0x2d,
+ 0x1a, 0x0c, 0xdb, 0xbe,
+ 0xdf, 0xce, 0xde, 0xcb, 0xab, 0xed, 0xee, 0xfd, 0xed, 0xed, 0xfd, 0x0d,
+ 0x1c, 0x0b, 0x0e, 0x1e,
+ 0x1d, 0x1d, 0x1f, 0xfd, 0x8c, 0xdc, 0xee, 0xdf, 0xbe, 0xce, 0xdf, 0xd0,
+ 0xd2, 0xe0, 0xd3, 0xe6,
+ 0xe2, 0xc0, 0xd0, 0xd0, 0xef, 0xe1, 0x07, 0xe1, 0xc0, 0xf2, 0x04, 0xf1,
+ 0xd0, 0x31, 0x73, 0x60,
+ 0x2e, 0x3b, 0x4c, 0x4d, 0x3b, 0x2c, 0x2c, 0x2e, 0x40, 0x3e, 0x3d, 0x2e,
+ 0x2d, 0x2d, 0x2e, 0x30,
+ 0x2f, 0x3d, 0x1c, 0x2f, 0x41, 0x22, 0x31, 0x74, 0x23, 0x2f, 0x0f, 0x10,
+ 0x05, 0xc3, 0xd3, 0xc2,
+ 0xd1, 0xd2, 0xb2, 0xe6, 0xd5, 0xb1, 0xdf, 0x0e, 0x0d, 0x09, 0xdc, 0xde,
+ 0xef, 0xfe, 0xfd, 0xdc,
+ 0xde, 0x01, 0xe1, 0x80, 0xb1, 0xe6, 0xd2, 0xa0, 0xd1, 0xc0, 0xc1, 0xd1,
+ 0xc0, 0xd0, 0xdc, 0xe0,
+ 0xe2, 0xd0, 0xd0, 0xe2, 0xd2, 0xe4, 0x07, 0x27, 0x11, 0x32, 0x62, 0x24,
+ 0x32, 0x42, 0x55, 0x33,
+ 0x35, 0x21, 0x22, 0x13, 0x22, 0x13, 0x34, 0x43, 0x43, 0x21, 0x41, 0x62,
+ 0x44, 0x52, 0x20, 0x20,
+ 0x4f, 0x2f, 0x32, 0x44, 0x20, 0x2e, 0x20, 0x32, 0x1d, 0x18, 0x0c, 0x1e,
+ 0x2f, 0x4f, 0x2e, 0x2f,
+ 0x3e, 0x1a, 0x1d, 0x2d, 0x6e, 0x40, 0x3f, 0x1e, 0x2e, 0x2d, 0x1d, 0x0d,
+ 0x20, 0x33, 0x00, 0xec,
+ 0xd0, 0x17, 0x52, 0x01, 0xf0, 0xe1, 0xe1, 0xf2, 0xe2, 0xe2, 0xb2, 0xe5,
+ 0xc2, 0xc4, 0xa4, 0xc2,
+ 0xc1, 0xb3, 0xd1, 0xc0, 0xe5, 0xd1, 0xc0, 0xd0, 0xd4, 0xd3, 0xf7, 0x04,
+ 0xf1, 0x01, 0x03, 0x14,
+ 0x02, 0x14, 0x24, 0x01, 0xf1, 0xd1, 0xe3, 0x02, 0x43, 0x52, 0x23, 0x67,
+ 0x24, 0x00, 0x00, 0x00,
+ 0x2f, 0x0d, 0xcb, 0xee, 0xed, 0xab, 0xdc, 0xdd, 0xec, 0xcd, 0xcc, 0xee,
+ 0xcd, 0xcd, 0xdb, 0xce,
+ 0x00, 0xff, 0xce, 0xde, 0xe0, 0xe0, 0xce, 0xde, 0xdf, 0xd0, 0xd3, 0xd1,
+ 0xe1, 0x0f, 0x0c, 0x1f,
+ 0x41, 0x53, 0x30, 0x3d, 0x5e, 0x55, 0x35, 0x31, 0x22, 0x36, 0x32, 0x44,
+ 0x45, 0x21, 0x11, 0x01,
+ 0x13, 0x35, 0x32, 0x21, 0x21, 0x21, 0x73, 0x22, 0x32, 0x34, 0x33, 0x21,
+ 0x00, 0xd0, 0xb1, 0xd2,
+ 0x90, 0xe1, 0xd4, 0xc0, 0xdf, 0xcb, 0xde, 0xf1, 0x03, 0x00, 0xda, 0xed,
+ 0x0f, 0x2f, 0x2f, 0x3f,
+ 0x50, 0x2d, 0x18, 0x4e, 0x60, 0x20, 0x1e, 0x3e, 0x30, 0x2c, 0x2c, 0x2f,
+ 0x51, 0x45, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x13, 0x10, 0xfc, 0xf0, 0xf5, 0xf3, 0xc0, 0xde, 0xbe,
+ 0xef, 0x02, 0x21, 0x30,
+ 0x3e, 0x6d, 0x38, 0x2a, 0x3e, 0x3e, 0x6f, 0x30, 0x40, 0x40, 0x2d, 0x1a,
+ 0x0e, 0x2e, 0x40, 0x00,
+ 0xfe, 0x0f, 0x30, 0xfe, 0xcc, 0xe0, 0xe1, 0x17, 0x54, 0x11, 0x02, 0x43,
+ 0x45, 0x32, 0x13, 0x01,
+ 0xc0, 0xcf, 0x00, 0x03, 0x04, 0xf1, 0xa0, 0xce, 0xf0, 0xf2, 0xef, 0xb8,
+ 0xde, 0xd0, 0xd1, 0xd1,
+ 0xb0, 0xcc, 0xef, 0xd0, 0xd0, 0xc0, 0xe1, 0xf2, 0xf0, 0xec, 0xdc, 0xe1,
+ 0xf5, 0xf0, 0xf0, 0xec,
+ 0xbc, 0xce, 0xde, 0xc0, 0x03, 0xf0, 0xcd, 0xef, 0x02, 0x05, 0x04, 0x24,
+ 0x54, 0x43, 0x21, 0x3f,
+ 0x51, 0x67, 0x12, 0x21, 0x11, 0x23, 0x31, 0x10, 0x20, 0x33, 0x43, 0x31,
+ 0x30, 0x28, 0x1d, 0x1c,
+ 0x2e, 0x4f, 0x4f, 0x2c, 0x2f, 0x3e, 0x0c, 0xfc, 0xed, 0xee, 0xab, 0xbd,
+ 0xcc, 0xef, 0x0f, 0xfe,
+ 0xed, 0xff, 0xed, 0xfc, 0xfd, 0x3f, 0x70, 0x20, 0x0d, 0xfd, 0xec, 0xed,
+ 0xbd, 0xd0, 0xd1, 0xc2,
+ 0xd2, 0xd6, 0xe4, 0x02, 0x22, 0x1f, 0x1c, 0x60, 0x43, 0x22, 0x20, 0x30,
+ 0x41, 0x20, 0x0f, 0x25,
+ 0x04, 0xf0, 0xbe, 0xed, 0xf1, 0x07, 0xe3, 0xa0, 0xde, 0xd0, 0x04, 0x06,
+ 0x02, 0x02, 0x24, 0x34,
+ 0x12, 0x01, 0x73, 0x56, 0x22, 0x11, 0x22, 0x32, 0x53, 0x35, 0x52, 0x22,
+ 0x33, 0x44, 0x33, 0x32,
+ 0x00, 0x0f, 0xfd, 0xed, 0xde, 0xcf, 0xdc, 0xbb, 0xcc, 0xdc, 0xee, 0xfd,
+ 0xdd, 0xed, 0xfe, 0xef,
+ 0xed, 0xde, 0xef, 0xf0, 0xb0, 0xd1, 0xb0, 0xc3, 0xd4, 0xe4, 0xc1, 0xd3,
+ 0xc4, 0xf7, 0xf3, 0xc0,
+ 0xc0, 0xf0, 0x24, 0x57, 0x00, 0xf0, 0xcd, 0xfd, 0x33, 0x77, 0x34, 0xf0,
+ 0xce, 0x00, 0x22, 0x0f,
+ 0x21, 0x77, 0x32, 0x00, 0x00, 0xfe, 0x10, 0x77, 0x32, 0x0f, 0xf0, 0xef,
+ 0x00, 0x11, 0xcd, 0xdc,
+ 0x00, 0x13, 0x77, 0x22, 0x10, 0x22, 0x11, 0xee, 0x89, 0xff, 0x11, 0x33,
+ 0x11, 0x00, 0xed, 0x88,
+ 0xdc, 0x00, 0x55, 0x32, 0xf0, 0xfe, 0xef, 0xff, 0x00, 0x00, 0x10, 0x11,
+ 0x00, 0xee, 0xff, 0x12,
+ 0x44, 0xf0, 0xbc, 0xba, 0xde, 0x44, 0x76, 0x00, 0xee, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0xff,
+ 0x11, 0x33, 0x00, 0xdc, 0xef, 0x10, 0x0f, 0x00, 0x20, 0x0e, 0xdc, 0x00,
+ 0x61, 0x0e, 0xca, 0xed,
+ 0x10, 0x75, 0x22, 0x00, 0xfd, 0xdc, 0xff, 0x22, 0x10, 0xcc, 0xee, 0x76,
+ 0x33, 0xff, 0xee, 0xee,
+ 0x00, 0x21, 0x00, 0xff, 0x00, 0x00, 0xff, 0x23, 0x56, 0x11, 0xdd, 0xcd,
+ 0x23, 0x67, 0x00, 0xdd,
+ 0x00, 0x00, 0xf0, 0x12, 0x12, 0xee, 0xdd, 0xdf, 0x12, 0x77, 0x10, 0xf0,
+ 0xe0, 0xdd, 0x00, 0x22,
+ 0x0f, 0x01, 0x23, 0xff, 0xac, 0xdc, 0xdc, 0x43, 0x77, 0x02, 0x0f, 0xff,
+ 0xed, 0x00, 0x35, 0x00,
+ 0xef, 0x10, 0x01, 0x11, 0x65, 0x11, 0x00, 0xce, 0xdd, 0x00, 0x77, 0x00,
+ 0x0f, 0x11, 0x12, 0x00,
+ 0xed, 0xff, 0x0f, 0x21, 0x45, 0x00, 0xdd, 0x00, 0x52, 0x36, 0xff, 0x9b,
+ 0xee, 0x00, 0x33, 0x00,
+ 0xff, 0x00, 0x11, 0x10, 0x21, 0x00, 0x0d, 0x10, 0x21, 0x35, 0x00, 0xdf,
+ 0x74, 0x00, 0xa8, 0x20,
+ 0x22, 0xdf, 0x00, 0x75, 0x10, 0xee, 0xee, 0xee, 0x22, 0x43, 0xff, 0x13,
+ 0x23, 0xcb, 0xee, 0x22,
+ 0x00, 0xbd, 0x14, 0x13, 0xf0, 0x02, 0x01, 0xd0, 0xd0, 0xaa, 0xee, 0x36,
+ 0x43, 0xee, 0xef, 0x10,
+ 0x32, 0x10, 0xff, 0xff, 0x0f, 0x53, 0x34, 0x00, 0xbb, 0xcd, 0x46, 0x55,
+ 0xff, 0xee, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x10, 0x21, 0xcc, 0xec, 0x21, 0x53, 0xfe, 0xed, 0x22,
+ 0x10, 0xdc, 0xca, 0x00,
+ 0x31, 0xdf, 0x00, 0x00, 0xdf, 0xcd, 0x20, 0x21, 0xab, 0xbb, 0x11, 0x65,
+ 0x00, 0xee, 0xff, 0x00,
+ 0x01, 0x12, 0x00, 0xdd, 0x12, 0x35, 0xef, 0xdf, 0x00, 0xee, 0xff, 0x43,
+ 0x23, 0x0f, 0xde, 0xde,
+ 0x11, 0x77, 0x21, 0x0f, 0x00, 0x10, 0x00, 0x12, 0xde, 0x00, 0x77, 0x00,
+ 0xee, 0xff, 0x10, 0x32,
+ 0x34, 0x33, 0xce, 0x88, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x23, 0xee,
+ 0xaa, 0x22, 0x32, 0xcc,
+ 0xff, 0x00, 0x21, 0x12, 0x0f, 0xec, 0x00, 0x21, 0x00, 0xfe, 0x63, 0x23,
+ 0x00, 0xef, 0xa8, 0xef,
+ 0x00, 0x24, 0xf0, 0xde, 0x00, 0x12, 0x00, 0xf0, 0xfe, 0x10, 0x74, 0x42,
+ 0x0c, 0xdc, 0xfd, 0x33,
+ 0x65, 0xed, 0xed, 0x11, 0x13, 0x00, 0x01, 0x12, 0x00, 0xdc, 0xed, 0x44,
+ 0x32, 0xc9, 0x00, 0x62,
+ 0x00, 0x0f, 0x00, 0x21, 0x00, 0xcc, 0xdd, 0x35, 0x44, 0xde, 0xbe, 0x01,
+ 0x01, 0x00, 0x47, 0x10,
+ 0xdf, 0xde, 0x11, 0x43, 0xf0, 0xac, 0x00, 0x44, 0x00, 0xee, 0x00, 0x17,
+ 0x00, 0xd0, 0x00, 0x10,
+ 0xf0, 0x00, 0xf0, 0xe0, 0x53, 0x11, 0xde, 0x10, 0x21, 0xa8, 0x00, 0x42,
+ 0x01, 0xf0, 0x00, 0x42,
+ 0x20, 0xcc, 0xdc, 0x0f, 0x00, 0x43, 0x01, 0xee, 0xba, 0x10, 0x65, 0xff,
+ 0xdd, 0x0f, 0x11, 0x43,
+ 0x0f, 0xcb, 0x00, 0x11, 0x00, 0x10, 0x44, 0x00, 0xcd, 0xed, 0x24, 0x55,
+ 0x00, 0xed, 0x00, 0x42,
+ 0x11, 0x00, 0x0e, 0x01, 0x01, 0xca, 0x00, 0x65, 0x00, 0xde, 0xf0, 0x23,
+ 0xf0, 0xdd, 0x00, 0x10,
+ 0x22, 0x20, 0x1f, 0x30, 0x2f, 0xd9, 0x1f, 0x70, 0x0f, 0xca, 0x31, 0x64,
+ 0xf0, 0xdd, 0x00, 0x12,
+ 0x01, 0x00, 0x00, 0xfe, 0xee, 0x22, 0x24, 0xff, 0xdf, 0xff, 0xde, 0x0f,
+ 0x64, 0x00, 0xee, 0xf1,
+ 0xbf, 0xdd, 0x00, 0x46, 0x00, 0xee, 0xdd, 0xa9, 0xf0, 0x46, 0x32, 0xdf,
+ 0x8b, 0xfe, 0x22, 0x12,
+ 0xee, 0x01, 0x02, 0x01, 0x01, 0x0f, 0xef, 0x12, 0xf0, 0x14, 0x67, 0xf0,
+ 0xef, 0x00, 0x42, 0x43,
+ 0xfd, 0xde, 0x13, 0x46, 0x00, 0xee, 0xfe, 0xbb, 0x43, 0x34, 0x00, 0x00,
+ 0x66, 0x05, 0xab, 0x05,
+ 0x3e, 0xe0, 0xc8, 0xf8, 0x5d, 0xf2, 0xb4, 0x0e, 0x54, 0x13, 0xfd, 0xff,
+ 0x10, 0xfe, 0xdc, 0x11,
+ 0x00, 0xcb, 0x43, 0x33, 0xee, 0xdd, 0x0f, 0x0e, 0x0f, 0x66, 0x00, 0xee,
+ 0x01, 0x00, 0xcc, 0x10,
+ 0x64, 0xdc, 0x00, 0x77, 0x00, 0xed, 0xff, 0x11, 0x22, 0x00, 0xff, 0xf0,
+ 0x11, 0x01, 0x00, 0x02,
+ 0x01, 0xcf, 0x00, 0xfe, 0x10, 0x77, 0x01, 0xdb, 0x20, 0x42, 0x10, 0xfe,
+ 0xfd, 0xfe, 0x00, 0x56,
+ 0x23, 0x00, 0xd0, 0x22, 0x32, 0x9a, 0xf0, 0x23, 0x02, 0x00, 0xf0, 0xee,
+ 0x10, 0x34, 0x0f, 0xbb,
+ 0x00, 0x34, 0xf0, 0x9d, 0x00, 0x34, 0x23, 0x00, 0xee, 0xef, 0x00, 0xe0,
+ 0xff, 0x67, 0x22, 0xdc,
+ 0xbd, 0x12, 0x23, 0xee, 0xdd, 0x12, 0x33, 0x01, 0x02, 0xe0, 0xcb, 0xef,
+ 0x45, 0x55, 0x00, 0xef,
+ 0x0f, 0x00, 0xff, 0x0f, 0x0f, 0x0e, 0x20, 0x20, 0xed, 0x43, 0x77, 0x0e,
+ 0xdb, 0x10, 0x41, 0x11,
+ 0xf0, 0x00, 0xff, 0xfe, 0x63, 0x11, 0xd9, 0xf0, 0x42, 0x0f, 0x9a, 0x00,
+ 0x31, 0x00, 0x0f, 0xff,
+ 0x11, 0x21, 0xdd, 0xba, 0xf0, 0x33, 0x53, 0xfe, 0xec, 0xff, 0x00, 0x23,
+ 0x0f, 0xec, 0x00, 0x21,
+ 0xee, 0xbb, 0x22, 0x01, 0xbe, 0xed, 0x15, 0x23, 0xd0, 0xbc, 0xf0, 0x14,
+ 0xf0, 0xbd, 0x00, 0x00,
+ 0x10, 0x23, 0x21, 0xea, 0xff, 0x30, 0x00, 0xff, 0x10, 0x43, 0xee, 0xef,
+ 0x34, 0x56, 0x43, 0xf0,
+ 0x8b, 0x00, 0x13, 0x11, 0x0f, 0x11, 0x12, 0xff, 0xdd, 0x00, 0x33, 0x22,
+ 0xec, 0xee, 0xdd, 0x11,
+ 0x77, 0x00, 0xcc, 0x22, 0x33, 0xcc, 0xcc, 0x00, 0x11, 0x10, 0x00, 0x21,
+ 0x00, 0xa9, 0x00, 0x21,
+ 0x00, 0x00, 0x65, 0x00, 0xee, 0x00, 0x01, 0x22, 0x00, 0x10, 0x33, 0x00,
+ 0xbc, 0xff, 0x45, 0x32,
+ 0x0f, 0x0f, 0x0e, 0x00, 0x21, 0x00, 0x67, 0x22, 0xff, 0xde, 0x00, 0x32,
+ 0xf0, 0xde, 0x55, 0x33,
+ 0xce, 0xdd, 0x11, 0x34, 0xdd, 0xdd, 0x22, 0x00, 0xbb, 0x00, 0x11, 0xdf,
+ 0x00, 0x43, 0x0f, 0x0f,
+ 0xdd, 0x13, 0x77, 0xff, 0xca, 0x11, 0x42, 0xff, 0x00, 0x44, 0xde, 0xcc,
+ 0x12, 0x12, 0xdd, 0xf0,
+ 0xf2, 0xd0, 0xd1, 0x9e, 0x02, 0x37, 0x01, 0x22, 0x10, 0xcb, 0xaa, 0x00,
+ 0x52, 0x21, 0xff, 0xda,
+ 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf0, 0x00, 0x31, 0x02,
+ 0x00, 0xf0, 0xdf, 0x32,
+ 0x75, 0x00, 0xdf, 0xab, 0x00, 0x12, 0x55, 0x11, 0xde, 0xdd, 0x01, 0x77,
+ 0x00, 0xff, 0x12, 0x00,
+ 0xf0, 0xff, 0x00, 0x00, 0x00, 0x10, 0x31, 0x77, 0x00, 0xcd, 0x00, 0x02,
+ 0x00, 0x33, 0x01, 0xff,
+ 0xef, 0x00, 0x45, 0x00, 0xef, 0x12, 0x11, 0xed, 0x0d, 0x20, 0xb9, 0x00,
+ 0x76, 0x21, 0xed, 0xcc,
+ 0xff, 0x32, 0x54, 0x00, 0xed, 0xcc, 0xfe, 0x12, 0x44, 0xed, 0x0f, 0x21,
+ 0xff, 0xdb, 0x00, 0x51,
+ 0xff, 0xfe, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0xdc, 0x00, 0x44, 0x01, 0xab,
+ 0xdc, 0x00, 0x43, 0x21,
+ 0x00, 0xdc, 0x00, 0xff, 0xdc, 0x11, 0x22, 0xc0, 0xce, 0xce, 0x03, 0x47,
+ 0xe0, 0xbf, 0xff, 0xf0,
+ 0x23, 0xff, 0xec, 0x21, 0x33, 0x10, 0x0e, 0x0d, 0x0d, 0x0f, 0x40, 0x0e,
+ 0x10, 0x77, 0x02, 0x01,
+ 0x23, 0x57, 0x11, 0xab, 0xde, 0x00, 0x34, 0x32, 0x11, 0xf0, 0xcd, 0xff,
+ 0xf0, 0xee, 0x23, 0x67,
+ 0x01, 0x00, 0xee, 0x00, 0xf0, 0x00, 0x02, 0xf0, 0xcd, 0xf0, 0x01, 0xce,
+ 0x45, 0x32, 0xca, 0xef,
+ 0x00, 0x21, 0x11, 0x32, 0x64, 0x00, 0xdc, 0xde, 0x32, 0x76, 0x00, 0xef,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x22, 0x33, 0xdc, 0xcd, 0x54, 0x44, 0x00, 0xfe, 0x11, 0x00, 0xfd, 0x00,
+ 0x02, 0x24, 0x67, 0x11,
+ 0xee, 0xcd, 0xff, 0x00, 0x0f, 0x35, 0x64, 0xee, 0xdb, 0x00, 0x10, 0x00,
+ 0x10, 0x73, 0x00, 0xec,
+ 0xed, 0x00, 0x00, 0xfe, 0x11, 0x45, 0x10, 0xfd, 0xcb, 0xee, 0x31, 0x53,
+ 0x23, 0x20, 0xcb, 0xdd,
+ 0x00, 0x11, 0x01, 0x03, 0x02, 0xe1, 0xf2, 0x46, 0xcf, 0x8b, 0x0f, 0x01,
+ 0x34, 0x00, 0xfe, 0x0f,
+ 0x53, 0x22, 0xfe, 0xfc, 0xff, 0x00, 0x22, 0x10, 0x13, 0x01, 0x01, 0x01,
+ 0xef, 0xf0, 0x37, 0x01,
+ 0xe0, 0x00, 0x8d, 0xfd, 0x04, 0x57, 0x01, 0x0f, 0xff, 0xff, 0x44, 0x45,
+ 0xe0, 0xce, 0x00, 0x21,
+ 0x00, 0xf0, 0x01, 0x21, 0xff, 0xcd, 0xfe, 0x12, 0x0f, 0x00, 0x75, 0x12,
+ 0x0f, 0xfe, 0xdd, 0x12,
+ 0x67, 0x03, 0xed, 0x00, 0x0f, 0xee, 0x24, 0x54, 0x00, 0x0e, 0xed, 0x01,
+ 0x33, 0xfc, 0x0e, 0x0e,
+ 0xfd, 0x22, 0x57, 0x21, 0x42, 0x01, 0xcd, 0xff, 0xe0, 0xbc, 0x00, 0x37,
+ 0x10, 0x00, 0xee, 0xab,
+ 0x00, 0x33, 0x21, 0xfe, 0xfe, 0xfd, 0x21, 0x32, 0xde, 0x88, 0xf0, 0x33,
+ 0x0f, 0xdc, 0x00, 0x32,
+ 0x53, 0x00, 0xb9, 0xee, 0x10, 0x63, 0x01, 0x00, 0x0f, 0xee, 0xde, 0x00,
+ 0x14, 0xf0, 0xdf, 0xe1,
+ 0xf1, 0xe0, 0xd0, 0xbb, 0xff, 0x0f, 0x11, 0x44, 0xfe, 0x0f, 0x10, 0xd9,
+ 0x0f, 0x71, 0x00, 0xfe,
+ 0xf0, 0x12, 0x22, 0xee, 0xde, 0x23, 0x11, 0xef, 0x02, 0xe2, 0x88, 0xe0,
+ 0x67, 0x01, 0xee, 0xff,
+ 0x21, 0x00, 0xfe, 0x12, 0x34, 0xe0, 0xfe, 0x00, 0x01, 0x64, 0x00, 0xdb,
+ 0xce, 0x00, 0x10, 0x0f,
+ 0x31, 0x10, 0x1f, 0x74, 0x0f, 0xc8, 0x00, 0x32, 0x10, 0xff, 0x00, 0x11,
+ 0x11, 0x10, 0x01, 0x01,
+ 0x11, 0x00, 0xde, 0xed, 0x30, 0x30, 0x31, 0x42, 0xdb, 0x0d, 0x3f, 0x40,
+ 0x77, 0x77, 0x0f, 0xbc,
+ 0xff, 0x33, 0x11, 0xf0, 0xef, 0xef, 0xef, 0x11, 0x10, 0xee, 0x0e, 0xbb,
+ 0xe0, 0x01, 0x00, 0x32,
+ 0x0f, 0x88, 0xed, 0x00, 0x23, 0x01, 0x00, 0x00, 0x0f, 0x0f, 0xeb, 0xde,
+ 0x61, 0x00, 0x0e, 0x67,
+ 0x00, 0xec, 0xce, 0x00, 0x24, 0x00, 0xf0, 0x02, 0xc0, 0xd0, 0xf0, 0x02,
+ 0x02, 0x00, 0xf0, 0xcd,
+ 0xdc, 0x77, 0x22, 0xdb, 0x00, 0x41, 0x31, 0x00, 0x0f, 0x0f, 0x31, 0x64,
+ 0x0f, 0xdb, 0xf0, 0x42,
+ 0x66, 0x00, 0xee, 0x00, 0x00, 0xee, 0x0f, 0x44, 0x10, 0x00, 0x22, 0xef,
+ 0xfe, 0x33, 0x12, 0xdf,
+ 0xee, 0xee, 0x11, 0x56, 0x11, 0xde, 0xde, 0xfe, 0xe0, 0x33, 0x00, 0x9b,
+ 0x00, 0x22, 0x00, 0xe0,
+ 0x00, 0xbf, 0xee, 0x16, 0x64, 0x01, 0xee, 0xcc, 0x00, 0x02, 0x12, 0x25,
+ 0x11, 0xef, 0x0f, 0x1f,
+ 0xfd, 0x00, 0x46, 0x52, 0x10, 0xff, 0x0e, 0x22, 0x11, 0x8a, 0xf0, 0x24,
+ 0x22, 0x00, 0xdf, 0xcd,
+ 0x0f, 0x45, 0x00, 0xfe, 0x22, 0x32, 0x00, 0x0f, 0x0e, 0xb9, 0xee, 0x41,
+ 0x11, 0xff, 0x00, 0xdf,
+ 0xff, 0x31, 0x20, 0x88, 0x1f, 0x42, 0xfe, 0xec, 0x0f, 0x0f, 0x21, 0x00,
+ 0x0f, 0x00, 0xc0, 0xad,
+ 0xee, 0x03, 0x17, 0x02, 0xf0, 0xcf, 0xdd, 0x01, 0x12, 0x46, 0x21, 0xcd,
+ 0xcb, 0x00, 0x20, 0x00,
+ 0x41, 0x10, 0x00, 0x64, 0x01, 0xfd, 0x00, 0x14, 0x22, 0x21, 0x00, 0xdd,
+ 0xcb, 0x11, 0x77, 0x11,
+ 0x00, 0xff, 0xff, 0x00, 0x22, 0x24, 0x11, 0xdf, 0xdd, 0x11, 0x55, 0x44,
+ 0x00, 0xbc, 0xde, 0x00,
+ 0x00, 0x21, 0x77, 0x00, 0xee, 0x00, 0x11, 0x01, 0xdd, 0x0f, 0x54, 0x22,
+ 0x00, 0xed, 0xff, 0xf0,
+ 0x00, 0x35, 0x10, 0xde, 0xef, 0x00, 0x00, 0x11, 0x44, 0x11, 0xf0, 0x0e,
+ 0x99, 0xee, 0x44, 0x22,
+ 0xef, 0x21, 0x32, 0xac, 0xdd, 0x12, 0x23, 0xff, 0x22, 0x23, 0x0f, 0xcd,
+ 0xca, 0xed, 0x44, 0x66,
+ 0x00, 0xfe, 0xff, 0xfe, 0x11, 0x12, 0x00, 0x01, 0x0f, 0xaa, 0x00, 0x30,
+ 0x21, 0x00, 0xec, 0x0f,
+ 0x20, 0x0e, 0xcb, 0x00, 0x51, 0xfe, 0xce, 0x25, 0x22, 0xac, 0xf0, 0x02,
+ 0x13, 0x00, 0xe0, 0xcc,
+ 0xed, 0x46, 0x21, 0xce, 0xed, 0x11, 0x44, 0xfe, 0xee, 0x0f, 0x1f, 0x41,
+ 0x33, 0x01, 0x00, 0x22,
+ 0x12, 0xb9, 0xdd, 0x33, 0x65, 0x0f, 0x00, 0x01, 0xde, 0xff, 0x01, 0x00,
+ 0x11, 0x57, 0x00, 0xe0,
+ 0xff, 0xef, 0xbe, 0x02, 0x57, 0x00, 0xff, 0x00, 0xf0, 0xdf, 0x11, 0xef,
+ 0xee, 0x76, 0x11, 0x00,
+ 0xf0, 0x00, 0x0f, 0x01, 0x12, 0x13, 0x34, 0x00, 0x0f, 0xac, 0x00, 0x35,
+ 0x00, 0x10, 0xee, 0x0f,
+ 0x63, 0x0e, 0x0d, 0x00, 0x0d, 0x53, 0x47, 0x00, 0xfd, 0x0f, 0xff, 0x10,
+ 0x23, 0x00, 0x0f, 0xed,
+ 0xee, 0xcc, 0x12, 0x46, 0x10, 0x00, 0xeb, 0xbc, 0xee, 0x20, 0x75, 0x10,
+ 0xee, 0x0f, 0x01, 0x00,
+ 0x22, 0x22, 0xcd, 0xee, 0x67, 0x10, 0xdc, 0x0f, 0x52, 0x11, 0x10, 0x10,
+ 0x0f, 0xec, 0xdd, 0x00,
+ 0x67, 0x01, 0xbe, 0xf0, 0x14, 0x01, 0xde, 0xf1, 0x03, 0xe0, 0x00, 0x02,
+ 0xee, 0x14, 0x45, 0xac,
+ 0xff, 0x21, 0x10, 0x00, 0x0f, 0x11, 0x12, 0x00, 0x00, 0x21, 0x55, 0x11,
+ 0xdc, 0x00, 0x67, 0xf0,
+ 0xbc, 0x00, 0x10, 0x10, 0x11, 0x00, 0x00, 0x00, 0x01, 0x02, 0x32, 0xdd,
+ 0xca, 0x00, 0x32, 0x32,
+ 0xf0, 0xd0, 0xae, 0xa8, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xef, 0x22, 0x21,
+ 0xab, 0xee, 0x23, 0x44,
+ 0x00, 0xf0, 0xef, 0xdd, 0x00, 0x56, 0x01, 0xdd, 0x00, 0x31, 0xf0, 0xf0,
+ 0x53, 0x21, 0x10, 0x00,
+ 0x0f, 0x22, 0x35, 0x00, 0xed, 0x43, 0x24, 0xce, 0xd0, 0x17, 0x00, 0xbe,
+ 0x10, 0x63, 0xff, 0xda,
+ 0x00, 0x00, 0xdc, 0x0f, 0x32, 0xe0, 0x8c, 0x00, 0x00, 0xc8, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x20,
+ 0x1e, 0xec, 0xed, 0x10, 0x72, 0x30, 0xed, 0xba, 0xee, 0xff, 0x00, 0x23,
+ 0x24, 0xf1, 0x9e, 0xee,
+ 0xf0, 0xff, 0xef, 0x14, 0x03, 0x00, 0xee, 0xa8, 0xfd, 0x11, 0x21, 0x00,
+ 0x10, 0x00, 0x0e, 0x1f,
+ 0x52, 0x11, 0xdb, 0xee, 0x10, 0x20, 0x00, 0x00, 0xec, 0xfd, 0x76, 0x10,
+ 0xff, 0x00, 0x00, 0xde,
+ 0x33, 0x77, 0x11, 0xef, 0xbc, 0x00, 0x11, 0x00, 0x12, 0xf0, 0xdf, 0x00,
+ 0x31, 0x22, 0xb9, 0x00,
+ 0x21, 0x01, 0xf0, 0x00, 0xff, 0xd0, 0xe0, 0x00, 0x35, 0x22, 0x01, 0x11,
+ 0xd0, 0x80, 0xad, 0x04,
+ 0x12, 0x10, 0x47, 0x13, 0xf0, 0xdc, 0xdd, 0xfd, 0x76, 0x53, 0xfe, 0xff,
+ 0x0f, 0x0f, 0x01, 0x02,
+ 0x0f, 0xf0, 0x37, 0x10, 0xcf, 0xdd, 0xff, 0x30, 0x33, 0x10, 0x10, 0x31,
+ 0xdc, 0xdd, 0x32, 0x32,
+ 0xf0, 0xd1, 0x46, 0x21, 0xd0, 0xad, 0x10, 0x77, 0x1f, 0xec, 0x20, 0x72,
+ 0x10, 0x0d, 0x00, 0x1f,
+ 0x0d, 0x24, 0x34, 0x0f, 0xdd, 0xdd, 0x46, 0x55, 0xd0, 0x9d, 0x00, 0x13,
+ 0x13, 0x00, 0xe0, 0xdb,
+ 0x00, 0x44, 0x00, 0x0f, 0x20, 0xee, 0x32, 0x65, 0xee, 0x0f, 0x43, 0x00,
+ 0xfd, 0x12, 0x14, 0x00,
+ 0x00, 0x0f, 0x44, 0x44, 0xfe, 0xdd, 0x00, 0x34, 0x45, 0x10, 0xdf, 0xbd,
+ 0x22, 0x45, 0xf0, 0xff,
+ 0xe0, 0xf0, 0x21, 0x00, 0xe1, 0x03, 0xcf, 0xba, 0xff, 0x23, 0x23, 0xef,
+ 0x01, 0x20, 0xed, 0xcd,
+ 0x36, 0x77, 0x20, 0xd0, 0xe0, 0x31, 0x11, 0xef, 0x00, 0x21, 0x12, 0x75,
+ 0x22, 0x0f, 0x0f, 0x30,
+ 0x21, 0xfe, 0xdc, 0x10, 0x74, 0x44, 0x00, 0xca, 0xef, 0x32, 0x00, 0xff,
+ 0x12, 0x11, 0xf0, 0x0f,
+ 0xdc, 0xcd, 0x51, 0x24, 0xee, 0xba, 0x00, 0x00, 0xce, 0xde, 0x11, 0x13,
+ 0xe0, 0x01, 0x22, 0x88,
+ 0xee, 0x10, 0x42, 0x11, 0x0f, 0xed, 0x0f, 0x1f, 0x20, 0x20, 0x0e, 0x0f,
+ 0x22, 0x03, 0x02, 0xf3,
+ 0xd0, 0x37, 0x54, 0xbf, 0xbd, 0x00, 0xf0, 0xff, 0x27, 0x21, 0xe0, 0xdd,
+ 0xdc, 0xff, 0x0f, 0x20,
+ 0x73, 0x24, 0x0f, 0xfd, 0xff, 0x0f, 0x0d, 0x20, 0x0d, 0xb8, 0x32, 0x31,
+ 0xab, 0x00, 0x32, 0x21,
+ 0xde, 0xee, 0x0f, 0x41, 0x34, 0xef, 0xcd, 0xf0, 0x14, 0x22, 0xdf, 0xff,
+ 0xe0, 0x8a, 0xee, 0x13,
+ 0x02, 0xee, 0x0f, 0xf0, 0xed, 0x00, 0x35, 0x55, 0x01, 0xce, 0xee, 0x01,
+ 0xde, 0xf0, 0x44, 0x01,
+ 0x02, 0x02, 0xdf, 0x22, 0x53, 0xa8, 0xfc, 0x65, 0x22, 0x0f, 0xff, 0x20,
+ 0x10, 0xfe, 0xff, 0x33,
+ 0x21, 0x0f, 0xf0, 0x23, 0x0f, 0xcb, 0x22, 0x11, 0xdd, 0xdb, 0x71, 0x44,
+ 0x0f, 0xec, 0xed, 0xfe,
+ 0x01, 0x12, 0x03, 0x00, 0x9c, 0x0f, 0x26, 0x01, 0xac, 0xfe, 0x00, 0x10,
+ 0x43, 0x10, 0x0d, 0xfd,
+ 0x10, 0x0b, 0xbb, 0x0f, 0x11, 0x10, 0x22, 0x11, 0xce, 0xce, 0xf0, 0xdf,
+ 0x02, 0x06, 0xd0, 0xbe,
+ 0xe0, 0xce, 0xef, 0x03, 0x0e, 0x0e, 0x67, 0x03, 0xba, 0xfe, 0x02, 0x35,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x11, 0x32, 0xf0, 0xde, 0x22, 0x11, 0xdf, 0x10, 0x77, 0x63, 0xfd, 0xee,
+ 0x24, 0x01, 0xdc, 0x00,
+ 0x75, 0x00, 0x0f, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x0d,
+ 0xfe, 0xec, 0xcc, 0x10,
+ 0x74, 0x10, 0xfe, 0xfd, 0x0e, 0xf9, 0xcd, 0x22, 0x46, 0xf0, 0xcd, 0x10,
+ 0x43, 0xef, 0xdc, 0x01,
+ 0x53, 0x0f, 0xfd, 0x22, 0x22, 0xfc, 0x00, 0x66, 0x00, 0x0f, 0x00, 0x11,
+ 0xff, 0xff, 0xf0, 0x01,
+ 0x23, 0x20, 0x10, 0x32, 0xcb, 0x89, 0x00, 0x34, 0x01, 0xdd, 0xe0, 0x01,
+ 0x02, 0xf0, 0xef, 0xe0,
+ 0x00, 0x13, 0x33, 0xce, 0x98, 0x10, 0x62, 0x11, 0x00, 0xea, 0x0f, 0x20,
+ 0x52, 0x00, 0xed, 0xfe,
+ 0x12, 0x46, 0x00, 0x01, 0xf0, 0xdf, 0xf0, 0xd0, 0xde, 0x01, 0x00, 0xf0,
+ 0xf1, 0x9c, 0xfe, 0x0f,
+ 0x0e, 0x37, 0x22, 0x9b, 0xee, 0x00, 0x21, 0x11, 0x10, 0x00, 0xde, 0xbc,
+ 0x10, 0x01, 0xed, 0x12,
+ 0x02, 0xfe, 0x33, 0x01, 0xf1, 0x14, 0x55, 0x43, 0x11, 0xee, 0xcd, 0x16,
+ 0x22, 0x22, 0x66, 0x01,
+ 0xff, 0xff, 0x11, 0x00, 0xdd, 0x12, 0x77, 0x11, 0xef, 0x0f, 0x43, 0x12,
+ 0xf0, 0x00, 0xe0, 0xf1,
+ 0xd0, 0x8b, 0x02, 0x26, 0x00, 0x00, 0x01, 0xe0, 0xcd, 0x00, 0x54, 0x10,
+ 0xfe, 0xfe, 0x22, 0x66,
+ 0x00, 0x0f, 0x10, 0x0f, 0xf0, 0x01, 0x01, 0x10, 0x31, 0x00, 0xc9, 0x0f,
+ 0x43, 0x11, 0xfe, 0x20,
+ 0x0e, 0x0e, 0x54, 0xdd, 0x88, 0x00, 0x47, 0x00, 0x00, 0xef, 0xde, 0x00,
+ 0x42, 0x0f, 0xee, 0xfe,
+ 0xff, 0x31, 0x52, 0x0f, 0xfa, 0xed, 0x0f, 0x20, 0x31, 0x10, 0xef, 0xdf,
+ 0xdf, 0xe1, 0x33, 0x02,
+ 0xad, 0xca, 0xef, 0xe0, 0xf0, 0xf1, 0xf0, 0xdc, 0x31, 0x77, 0x00, 0xcd,
+ 0x00, 0x10, 0xcc, 0x00,
+ 0x77, 0x11, 0xff, 0x0f, 0x01, 0x10, 0x0f, 0x01, 0x00, 0xef, 0x11, 0x41,
+ 0x01, 0x00, 0x10, 0x00,
+ 0xef, 0x23, 0x77, 0x24, 0xdd, 0xee, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xdb,
+ 0xef, 0x21, 0x8e, 0xca,
+ 0x00, 0x54, 0x11, 0xec, 0xee, 0x22, 0x23, 0xff, 0x00, 0x01, 0xdf, 0xde,
+ 0x01, 0x03, 0x24, 0x36,
+ 0x10, 0x00, 0x31, 0x41, 0xf0, 0xee, 0x74, 0x74, 0x00, 0x10, 0x02, 0x0f,
+ 0x00, 0x05, 0x23, 0xff,
+ 0xee, 0x00, 0x67, 0x31, 0xfd, 0x0f, 0x22, 0x20, 0xfe, 0xb9, 0x31, 0x52,
+ 0xff, 0xee, 0xf0, 0x00,
+ 0xf0, 0x00, 0x01, 0x21, 0x10, 0xef, 0xff, 0x34, 0x75, 0x0e, 0x0c, 0x0d,
+ 0x50, 0x33, 0x10, 0x0c,
+ 0x0d, 0x43, 0x36, 0x01, 0x00, 0xc0, 0x00, 0x57, 0x00, 0xc0, 0xf0, 0x01,
+ 0xbf, 0xef, 0x01, 0x01,
+ 0x00, 0x11, 0xff, 0xdc, 0x02, 0x14, 0x23, 0x32, 0xcc, 0xac, 0x00, 0x47,
+ 0x11, 0x00, 0xef, 0x01,
+ 0x23, 0x00, 0xfd, 0xed, 0x12, 0x77, 0x32, 0x00, 0x00, 0x31, 0x00, 0xce,
+ 0x02, 0x13, 0x33, 0x00,
+ 0xed, 0xef, 0xf0, 0xce, 0xcb, 0x45, 0x53, 0xfe, 0xf0, 0x0f, 0x00, 0x00,
+ 0x59, 0x01, 0x36, 0x01,
+ 0xbc, 0x28, 0xe4, 0x39, 0x3c, 0x33, 0x8c, 0x46, 0x43, 0x57, 0x00, 0xf0,
+ 0x0e, 0xee, 0xcf, 0xf3,
+ 0xf5, 0xc0, 0x9c, 0xf0, 0x15, 0x00, 0xed, 0x01, 0x10, 0x0f, 0x1e, 0x30,
+ 0x00, 0xc9, 0x0f, 0x72,
+ 0x11, 0x00, 0x11, 0x12, 0x00, 0xed, 0x10, 0x30, 0xd9, 0x00, 0x53, 0x1f,
+ 0x1e, 0x42, 0x0e, 0xdc,
+ 0xce, 0x00, 0x54, 0x0e, 0xec, 0xdd, 0xba, 0x12, 0x56, 0xff, 0xdf, 0x00,
+ 0x00, 0xfd, 0x0f, 0x10,
+ 0xfd, 0xfc, 0x2f, 0x60, 0x10, 0x0e, 0xfc, 0x10, 0x00, 0xfe, 0xef, 0xdf,
+ 0xbf, 0x03, 0x07, 0xe0,
+ 0xbe, 0xfe, 0xed, 0xcd, 0xd0, 0xe3, 0xff, 0xfe, 0xfc, 0xfd, 0x23, 0x01,
+ 0x9c, 0xff, 0xe0, 0xf0,
+ 0x0d, 0xdc, 0xab, 0xf0, 0x04, 0xff, 0xf2, 0x26, 0xdd, 0x99, 0x00, 0x11,
+ 0x11, 0xf0, 0x0f, 0x30,
+ 0x0f, 0xbc, 0x33, 0x65, 0xfe, 0xdc, 0x00, 0x12, 0xf0, 0xfe, 0x0f, 0x0f,
+ 0x32, 0x22, 0xbb, 0xfd,
+ 0x20, 0x20, 0x0f, 0x1e, 0x0f, 0x0d, 0x20, 0x2f, 0xee, 0x14, 0x15, 0xc1,
+ 0x04, 0xe0, 0x9f, 0x63,
+ 0x37, 0xfe, 0xef, 0x55, 0x11, 0xff, 0x00, 0x10, 0x0f, 0x44, 0x23, 0xdd,
+ 0xef, 0x14, 0x11, 0x21,
+ 0x10, 0x00, 0x31, 0x00, 0x0f, 0x31, 0xcd, 0xcd, 0xf0, 0xf0, 0xf0, 0xcc,
+ 0xad, 0xb8, 0xf0, 0x05,
+ 0xf1, 0xb0, 0x02, 0x01, 0xee, 0xcc, 0xec, 0xfe, 0x10, 0x52, 0x34, 0x0e,
+ 0xea, 0x0f, 0x40, 0x20,
+ 0x00, 0x43, 0x33, 0x01, 0x01, 0xe0, 0xfe, 0x25, 0xf1, 0x9e, 0x03, 0x26,
+ 0xf0, 0x0f, 0xe0, 0xbe,
+ 0x00, 0x05, 0x00, 0xce, 0x10, 0x53, 0x0f, 0x0d, 0xfd, 0xed, 0x27, 0x62,
+ 0x10, 0x0d, 0x0e, 0x1e,
+ 0x20, 0x2e, 0x0c, 0x53, 0x36, 0x0f, 0x0f, 0x43, 0x31, 0x0e, 0x20, 0x11,
+ 0x13, 0x35, 0x11, 0xbd,
+ 0x00, 0x56, 0xff, 0xed, 0x01, 0x45, 0x11, 0xfe, 0xde, 0x10, 0x31, 0x00,
+ 0x0e, 0x40, 0x12, 0xbe,
+ 0xcc, 0xf0, 0xe3, 0x07, 0x14, 0xcf, 0xc0, 0x46, 0x12, 0xbf, 0xde, 0x22,
+ 0x43, 0x02, 0x12, 0x01,
+ 0xe0, 0x14, 0x24, 0xf0, 0x13, 0x45, 0xe0, 0x01, 0x75, 0x21, 0x10, 0x10,
+ 0x10, 0x33, 0x00, 0xed,
+ 0x30, 0x73, 0x1c, 0xda, 0x22, 0x23, 0xde, 0xcd, 0x02, 0x23, 0x00, 0xcd,
+ 0xf0, 0x00, 0x9b, 0xfe,
+ 0x1f, 0x2b, 0x0d, 0x0f, 0xfb, 0x0e, 0x70, 0x00, 0x0b, 0x00, 0x2f, 0x0f,
+ 0x31, 0x32, 0xad, 0xec,
+ 0xf0, 0x01, 0x15, 0x01, 0xdf, 0xcf, 0xff, 0xce, 0xf0, 0x27, 0x32, 0xf0,
+ 0x00, 0x10, 0x01, 0x00,
+ 0xe1, 0xc0, 0x77, 0x74, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x23, 0x01, 0xfe,
+ 0xf0, 0xfd, 0x00, 0x46,
+ 0x00, 0xef, 0x01, 0x01, 0x00, 0xef, 0x10, 0xed, 0xde, 0x46, 0x42, 0x22,
+ 0xad, 0xb8, 0x00, 0x53,
+ 0x00, 0xdc, 0x0f, 0x00, 0x00, 0x0e, 0xfe, 0xf0, 0x00, 0x02, 0xf1, 0xbe,
+ 0xf0, 0x04, 0xdb, 0xd0,
+ 0x56, 0xf0, 0xe0, 0x30, 0x0f, 0xbb, 0x10, 0x63, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x0f, 0xfc,
+ 0x22, 0x35, 0xf0, 0xf0, 0x10, 0x22, 0x0e, 0xe9, 0x70, 0x43, 0xef, 0xee,
+ 0x00, 0x1e, 0x30, 0x30,
+ 0x00, 0xce, 0x9b, 0x02, 0x12, 0x0e, 0x00, 0xfe, 0xdb, 0x00, 0x0e, 0x0a,
+ 0xfe, 0x0d, 0x1e, 0x0f,
+ 0x2f, 0x0e, 0x0e, 0x70, 0x40, 0x1f, 0xfd, 0xcb, 0xf1, 0xe0, 0xd0, 0x16,
+ 0xf1, 0x9e, 0xdd, 0xf0,
+ 0x01, 0xdd, 0x98, 0x00, 0x13, 0x00, 0xcd, 0x00, 0x01, 0xdc, 0x00, 0x27,
+ 0xcf, 0xde, 0x11, 0x00,
+ 0xe0, 0xef, 0xce, 0xd0, 0x42, 0x23, 0x10, 0x20, 0x10, 0xdc, 0xf0, 0x77,
+ 0x24, 0x00, 0x00, 0x00,
+ 0x00, 0x33, 0xe0, 0xd1, 0xf3, 0x16, 0x11, 0x8f, 0xf0, 0x21, 0x30, 0x0f,
+ 0x1e, 0x41, 0x42, 0xea,
+ 0xee, 0x20, 0x33, 0x12, 0xcf, 0x9c, 0xf0, 0x02, 0xf3, 0x14, 0x0f, 0x1e,
+ 0x72, 0x0d, 0xf8, 0x10,
+ 0x52, 0x0f, 0x0d, 0x23, 0x10, 0x00, 0x12, 0x20, 0x45, 0x45, 0x11, 0x00,
+ 0x00, 0x20, 0x11, 0x10,
+ 0x30, 0x63, 0x22, 0x0a, 0xfe, 0x10, 0xfc, 0xbb, 0x22, 0x43, 0xfe, 0xef,
+ 0x11, 0xcf, 0xaa, 0xf0,
+ 0x01, 0x00, 0xdb, 0xfe, 0x10, 0x0f, 0xec, 0xff, 0x10, 0x2f, 0x2f, 0x41,
+ 0x11, 0xef, 0xee, 0x32,
+ 0x56, 0x02, 0xb0, 0xe1, 0x07, 0x12, 0xd0, 0xb0, 0xd0, 0xe1, 0x03, 0xf2,
+ 0x80, 0xf3, 0x04, 0xf0,
+ 0x01, 0x00, 0xcc, 0x02, 0x12, 0x0e, 0x1f, 0xe8, 0xde, 0x43, 0x00, 0xc9,
+ 0x0f, 0x40, 0x21, 0xdf,
+ 0xee, 0x00, 0x31, 0x11, 0xff, 0xbb, 0x41, 0x43, 0xce, 0xfe, 0x13, 0x0f,
+ 0xbb, 0x00, 0x12, 0xf0,
+ 0x01, 0x01, 0x0e, 0x0e, 0x02, 0xec, 0x2e, 0x72, 0x1a, 0x0f, 0x12, 0x00,
+ 0xbe, 0xf1, 0x06, 0xf0,
+ 0xe0, 0x0f, 0x52, 0x02, 0x00, 0x00, 0x23, 0x34, 0x00, 0x21, 0x33, 0xfc,
+ 0x0d, 0x77, 0x64, 0x00,
+ 0x02, 0x00, 0x00, 0x23, 0x24, 0x20, 0x21, 0x00, 0x00, 0x22, 0x51, 0x1d,
+ 0x0c, 0x1f, 0x12, 0x13,
+ 0x00, 0x0c, 0xdf, 0x07, 0xf2, 0x8f, 0xff, 0x04, 0xe1, 0xbe, 0xfd, 0xed,
+ 0xfc, 0x0f, 0x20, 0xf9,
+ 0x0e, 0x70, 0x0e, 0x0f, 0x0f, 0xc8, 0x00, 0x30, 0x10, 0xf0, 0x00, 0x01,
+ 0xdf, 0xcd, 0x11, 0x02,
+ 0xad, 0xed, 0xfd, 0xf0, 0x05, 0xdf, 0xaa, 0x00, 0x31, 0x33, 0x02, 0x00,
+ 0x00, 0xed, 0x13, 0x22,
+ 0xda, 0xee, 0x40, 0x70, 0x0e, 0x0e, 0x11, 0x00, 0xfc, 0x31, 0x74, 0x10,
+ 0x10, 0x12, 0x02, 0x36,
+ 0x32, 0xf1, 0x05, 0x13, 0xf1, 0xe1, 0x03, 0x56, 0x01, 0x01, 0x53, 0x22,
+ 0xe0, 0x00, 0x73, 0x1f,
+ 0xea, 0x34, 0x33, 0xdf, 0xdd, 0xe0, 0xf1, 0xd2, 0xf3, 0x05, 0x01, 0x90,
+ 0xee, 0x01, 0x00, 0xef,
+ 0xef, 0xee, 0x30, 0x0e, 0xed, 0xcc, 0x89, 0x00, 0x37, 0x00, 0xb0, 0x00,
+ 0xff, 0xef, 0x25, 0x23,
+ 0xd0, 0xce, 0x10, 0x30, 0x0c, 0x1e, 0x40, 0x30, 0x0e, 0xfe, 0x75, 0x42,
+ 0x0f, 0x00, 0x01, 0xef,
+ 0xcd, 0xf0, 0x27, 0x00, 0xcd, 0xf0, 0x11, 0xed, 0xd9, 0x60, 0x0e, 0xec,
+ 0x50, 0x30, 0x1c, 0x0e,
+ 0x2f, 0x20, 0x10, 0x1c, 0x1d, 0x1e, 0x0f, 0x00, 0xd0, 0xce, 0xee, 0x00,
+ 0x00, 0x9a, 0x00, 0x35,
+ 0xcf, 0xbf, 0x22, 0x13, 0xe0, 0xf1, 0x16, 0x00, 0x00, 0x20, 0x33, 0xf0,
+ 0xcf, 0x01, 0x75, 0x00,
+ 0xfd, 0x65, 0x22, 0xf0, 0x22, 0x13, 0xfd, 0x23, 0x55, 0x01, 0x13, 0x01,
+ 0x03, 0x17, 0x02, 0xe1,
+ 0x02, 0x02, 0xf2, 0xf0, 0x11, 0x01, 0x21, 0x77, 0x11, 0xd0, 0x00, 0x41,
+ 0x22, 0x01, 0xa0, 0xd0,
+ 0x03, 0x00, 0x01, 0x46, 0xf0, 0xef, 0x02, 0x43, 0x0f, 0x0c, 0x1e, 0x3f,
+ 0x20, 0x0e, 0xfe, 0x0f,
+ 0xed, 0x88, 0x0f, 0x42, 0x12, 0x0e, 0xee, 0xee, 0xee, 0x52, 0x53, 0x08,
+ 0xff, 0x0e, 0x0c, 0x2d,
+ 0x40, 0x10, 0xdb, 0xff, 0x00, 0x01, 0xe0, 0xe0, 0xe1, 0xd3, 0x80, 0xd0,
+ 0xe0, 0xde, 0xb8, 0x0f,
+ 0x11, 0x01, 0xff, 0x10, 0x3d, 0x4c, 0x2c, 0x1f, 0x0f, 0x0f, 0x50, 0x32,
+ 0x23, 0x22, 0xfa, 0xbc,
+ 0xf0, 0xd1, 0xe2, 0xe2, 0xd0, 0x8b, 0xdd, 0xf0, 0x02, 0xe2, 0xf2, 0xa9,
+ 0xee, 0x01, 0x03, 0x0f,
+ 0xed, 0x00, 0x01, 0xff, 0xcc, 0xff, 0xdd, 0x01, 0x47, 0xc0, 0xce, 0xff,
+ 0x0f, 0xfe, 0x0f, 0x33,
+ 0x35, 0x00, 0xdf, 0x9c, 0x00, 0x13, 0xf0, 0xbc, 0x03, 0x04, 0xfd, 0xfb,
+ 0x30, 0x1e, 0x0e, 0x0f,
+ 0x1f, 0x0d, 0x2c, 0xeb, 0x9d, 0xfe, 0xf0, 0xfe, 0xcd, 0x0f, 0x00, 0x88,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x42, 0x0e, 0xe8, 0xff, 0x10, 0x2f, 0x0f, 0x30, 0x40, 0xec, 0xcd, 0x21,
+ 0x54, 0x00, 0x00, 0x21,
+ 0x12, 0xf0, 0x00, 0x00, 0x1f, 0x5f, 0x61, 0x1f, 0xfc, 0xfe, 0x03, 0x2e,
+ 0x08, 0x52, 0x25, 0xef,
+ 0xcf, 0x00, 0x12, 0x00, 0xcd, 0xf0, 0xf0, 0xd0, 0xe0, 0xce, 0xc8, 0x00,
+ 0x00, 0xdf, 0xff, 0xfe,
+ 0xb9, 0x1f, 0x50, 0x0f, 0xf0, 0x00, 0xdf, 0x00, 0x20, 0xff, 0xbc, 0xe0,
+ 0xc0, 0xdf, 0xe1, 0x06,
+ 0xd0, 0xd1, 0x04, 0xd2, 0x80, 0x01, 0x03, 0x25, 0x02, 0x01, 0xe1, 0xd1,
+ 0x03, 0x35, 0x01, 0xc0,
+ 0x02, 0x02, 0x12, 0x33, 0x32, 0x63, 0x35, 0x21, 0x00, 0x72, 0x33, 0x43,
+ 0x27, 0x12, 0x00, 0x11,
+ 0x35, 0x21, 0x40, 0x74, 0x23, 0x00, 0x0d, 0x11, 0x22, 0x0e, 0x2f, 0x20,
+ 0x00, 0x0e, 0x1e, 0x31,
+ 0x21, 0x00, 0x27, 0x21, 0x10, 0x61, 0x52, 0x11, 0x03, 0x17, 0x12, 0x2e,
+ 0xfa, 0x0f, 0x40, 0x20,
+ 0x70, 0x21, 0x00, 0x11, 0x23, 0x13, 0x01, 0x27, 0x65, 0x00, 0xd0, 0x00,
+ 0x43, 0x00, 0x11, 0x45,
+ 0x20, 0x1e, 0x51, 0x34, 0x00, 0x00, 0x02, 0x01, 0x14, 0x15, 0xc1, 0x91,
+ 0xf3, 0xf5, 0xd0, 0xe0,
+ 0xf1, 0xc0, 0xd0, 0xe2, 0x03, 0x1f, 0xfc, 0x2d, 0x7f, 0x2c, 0x0d, 0x11,
+ 0x21, 0x20, 0x65, 0x10,
+ 0xfa, 0x00, 0x10, 0x00, 0xde, 0xef, 0xe0, 0xfe, 0xee, 0xce, 0xcd, 0xce,
+ 0xf1, 0xf0, 0xe0, 0x00,
+ 0xda, 0xb9, 0xff, 0x0f, 0xef, 0xef, 0x20, 0x00, 0x9b, 0xee, 0x0f, 0x0c,
+ 0xfd, 0xfe, 0xfe, 0x0c,
+ 0x60, 0x40, 0x0e, 0x0b, 0x0f, 0x10, 0x11, 0x33, 0x31, 0x30, 0x30, 0x44,
+ 0x14, 0x43, 0x53, 0x11,
+ 0x31, 0x66, 0x22, 0x0f, 0xfd, 0x1f, 0x30, 0x35, 0x01, 0x9c, 0xee, 0xf0,
+ 0xde, 0xf0, 0x37, 0xf3,
+ 0x9e, 0xef, 0x00, 0xf0, 0x00, 0x10, 0xfc, 0xdc, 0xee, 0x11, 0x0e, 0xea,
+ 0x10, 0x14, 0xc0, 0xc1,
+ 0x03, 0x23, 0xf0, 0xe0, 0x02, 0x04, 0xb0, 0x00, 0x40, 0x20, 0x31, 0x0e,
+ 0xe8, 0x0f, 0x00, 0x00,
+ 0x12, 0x42, 0x01, 0xe1, 0xd0, 0xe1, 0x02, 0xb6, 0x81, 0xe0, 0x02, 0xf0,
+ 0x0e, 0x1c, 0xf9, 0xee,
+ 0x40, 0x41, 0x1e, 0x4d, 0x4c, 0x1e, 0x2f, 0x0e, 0x0f, 0x00, 0x2e, 0x2d,
+ 0xfb, 0xdd, 0xcf, 0xaf,
+ 0xf0, 0x14, 0xde, 0xd1, 0x57, 0x01, 0xd0, 0x01, 0x54, 0x22, 0xef, 0x00,
+ 0x12, 0x02, 0x02, 0xe2,
+ 0xe0, 0xa0, 0xe1, 0xc4, 0xe4, 0x01, 0x0f, 0xe8, 0x10, 0x40, 0xe0, 0x00,
+ 0x40, 0x1c, 0x3f, 0x41,
+ 0xe0, 0xbf, 0x01, 0x03, 0x03, 0x05, 0x01, 0x0f, 0x10, 0xf0, 0xa1, 0xde,
+ 0x01, 0x13, 0xcc, 0x9b,
+ 0xe0, 0xe0, 0xef, 0xdd, 0x05, 0x04, 0xd1, 0xc0, 0xef, 0x34, 0x54, 0x00,
+ 0xff, 0x00, 0x3f, 0x4e,
+ 0x40, 0x1c, 0xe9, 0x0f, 0x12, 0x01, 0xcf, 0x01, 0x76, 0x00, 0xff, 0x00,
+ 0x03, 0x01, 0x00, 0x4f,
+ 0x3e, 0x0a, 0x1f, 0x50, 0x2e, 0x19, 0x3e, 0x6f, 0x1e, 0x1f, 0x0f, 0xfe,
+ 0xde, 0x00, 0x35, 0xc0,
+ 0x9f, 0xee, 0xee, 0xee, 0xd0, 0x00, 0xdc, 0xfd, 0x00, 0x1a, 0x2c, 0x40,
+ 0x1e, 0xfb, 0x4f, 0x4f,
+ 0x2f, 0x4f, 0x3f, 0x2d, 0x0c, 0xbc, 0xff, 0x10, 0x0c, 0xfe, 0x00, 0x01,
+ 0xa0, 0xef, 0xf0, 0xff,
+ 0x00, 0x10, 0xf2, 0xf2, 0x12, 0x41, 0xb8, 0xc0, 0xf6, 0xe2, 0xdf, 0x00,
+ 0x02, 0xc0, 0x00, 0x14,
+ 0x01, 0xf2, 0x13, 0x20, 0x3d, 0x60, 0x23, 0x03, 0xd0, 0xe0, 0x25, 0x42,
+ 0xe1, 0xe0, 0x17, 0x53,
+ 0x22, 0x10, 0x11, 0x41, 0x3f, 0x00, 0x11, 0x0e, 0x1a, 0x30, 0xee, 0x9d,
+ 0x01, 0x47, 0xcf, 0x9d,
+ 0x00, 0x02, 0xe2, 0xe0, 0xde, 0xde, 0xf0, 0xd1, 0xcb, 0xca, 0xee, 0x00,
+ 0x13, 0x01, 0x00, 0x35,
+ 0x15, 0xf3, 0xf2, 0x33, 0x73, 0x43, 0x02, 0x14, 0x44, 0x34, 0x42, 0x23,
+ 0x32, 0x41, 0x43, 0x21,
+ 0x00, 0x24, 0x57, 0x22, 0x01, 0x01, 0xe0, 0x06, 0x12, 0xf1, 0xe0, 0xf3,
+ 0xb1, 0xd0, 0x00, 0x1f,
+ 0x4e, 0x3f, 0x41, 0x31, 0x2d, 0x4f, 0x3f, 0x0a, 0x0d, 0x7f, 0x1e, 0x0c,
+ 0xe0, 0x0f, 0xfb, 0xdc,
+ 0xef, 0xd0, 0xde, 0x8b, 0xef, 0xf0, 0x00, 0xff, 0x00, 0xfd, 0x0c, 0x30,
+ 0x30, 0xff, 0x9c, 0xee,
+ 0x0f, 0xee, 0xbd, 0xf0, 0x00, 0x00, 0xbe, 0xec, 0x02, 0x1d, 0xf8, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x2e,
+ 0x2e, 0x2c, 0x0d, 0x30, 0x1f, 0xde, 0x01, 0x71, 0x4e, 0x1b, 0x40, 0x1f,
+ 0xfc, 0xdd, 0x0f, 0x4d,
+ 0x08, 0xed, 0x10, 0x00, 0xff, 0xf0, 0xe2, 0xd0, 0xe3, 0x93, 0xe4, 0x15,
+ 0x43, 0x53, 0x32, 0x22,
+ 0x13, 0x22, 0x30, 0x0e, 0x40, 0x74, 0x17, 0x13, 0x00, 0xcf, 0x02, 0x07,
+ 0x14, 0x01, 0x43, 0x21,
+ 0xff, 0x10, 0x43, 0x00, 0x0f, 0x32, 0x3f, 0x2a, 0x5e, 0x0c, 0x0f, 0x00,
+ 0x00, 0x11, 0xd2, 0xa0,
+ 0xe1, 0xf1, 0xf4, 0xc3, 0xa0, 0xcc, 0xee, 0x02, 0xcb, 0xfd, 0x23, 0x21,
+ 0x0b, 0x0e, 0x0f, 0x0d,
+ 0x3e, 0x72, 0x30, 0x1b, 0x20, 0x52, 0x0e, 0x0b, 0x00, 0x10, 0x0f, 0x00,
+ 0x10, 0x0b, 0xed, 0xff,
+ 0xdd, 0xfd, 0x30, 0x51, 0x0c, 0xe9, 0x0e, 0x10, 0x00, 0xd0, 0x91, 0xe2,
+ 0xf1, 0x02, 0x02, 0xd0,
+ 0xd0, 0x37, 0x74, 0x41, 0x10, 0x10, 0x20, 0x42, 0x22, 0x13, 0x46, 0x11,
+ 0x00, 0x31, 0x75, 0x12,
+ 0x01, 0xf3, 0x04, 0x03, 0x03, 0x43, 0x22, 0x23, 0x12, 0x13, 0x46, 0x10,
+ 0x0f, 0x10, 0x40, 0x37,
+ 0x14, 0xd1, 0xc0, 0x02, 0x13, 0x04, 0xa2, 0xb1, 0xd1, 0xf4, 0xf1, 0xe1,
+ 0xf5, 0xb1, 0xe2, 0xf4,
+ 0xe1, 0xd0, 0x03, 0x14, 0xf3, 0x05, 0x32, 0x42, 0x22, 0x21, 0x13, 0x12,
+ 0x43, 0x74, 0x20, 0x20,
+ 0x50, 0x31, 0x0d, 0x09, 0x0f, 0x00, 0x21, 0x41, 0xfe, 0xcb, 0xdf, 0xde,
+ 0xcc, 0xdf, 0xe1, 0xbf,
+ 0xca, 0xed, 0xec, 0x0d, 0x1e, 0x0f, 0xdd, 0xdc, 0x1d, 0x6d, 0x0b, 0x0d,
+ 0x2e, 0x3e, 0x1d, 0x1e,
+ 0x0d, 0xdb, 0xcd, 0xec, 0xfe, 0xbf, 0xe0, 0xde, 0xcc, 0x0e, 0x2f, 0x3f,
+ 0x30, 0x00, 0xdd, 0x1f,
+ 0x61, 0x00, 0xff, 0x01, 0xe1, 0x8f, 0xdb, 0xff, 0xf0, 0xe1, 0xf0, 0xf2,
+ 0xe1, 0xe0, 0xf1, 0xdb,
+ 0xba, 0x20, 0x63, 0x10, 0x00, 0x05, 0x25, 0x00, 0xb0, 0x02, 0x23, 0x00,
+ 0xf0, 0x27, 0x33, 0xd0,
+ 0x8e, 0xff, 0x00, 0x00, 0x02, 0x02, 0xee, 0xfc, 0x10, 0x13, 0xd4, 0xc4,
+ 0xe4, 0xa0, 0xdc, 0xcd,
+ 0xde, 0xed, 0xcd, 0xf1, 0xd0, 0xc9, 0xfe, 0xff, 0xff, 0x0d, 0x10, 0x10,
+ 0xfd, 0xdd, 0x0e, 0x10,
+ 0x54, 0x20, 0x0d, 0x2d, 0x3d, 0x4b, 0x7f, 0x3f, 0x3a, 0x5d, 0x3b, 0x2c,
+ 0x3f, 0x40, 0x31, 0x0f,
+ 0x00, 0x12, 0x23, 0x43, 0x0f, 0xdc, 0xcf, 0xd0, 0xe2, 0xf3, 0xce, 0xdc,
+ 0xdc, 0xdc, 0xce, 0x10,
+ 0x10, 0x11, 0x00, 0x0c, 0x1e, 0x30, 0xfc, 0x2c, 0x7e, 0x0f, 0xce, 0xcb,
+ 0xdd, 0xdd, 0xdb, 0xfd,
+ 0xed, 0xbd, 0xde, 0xdd, 0xdb, 0xef, 0x1f, 0x0d, 0xae, 0xd3, 0xa6, 0xb0,
+ 0xc0, 0xe0, 0xe3, 0x06,
+ 0xd0, 0xb0, 0xf2, 0xf4, 0xf2, 0x03, 0x03, 0xf0, 0xf1, 0x02, 0x11, 0x10,
+ 0x14, 0x37, 0x13, 0xf1,
+ 0x04, 0x55, 0x03, 0x03, 0x04, 0x12, 0x44, 0x31, 0x51, 0x21, 0x10, 0x02,
+ 0x52, 0x51, 0x20, 0x30,
+ 0x36, 0x32, 0x22, 0x20, 0x32, 0x34, 0x33, 0x54, 0x42, 0x10, 0x0f, 0x00,
+ 0x0d, 0x0c, 0xfb, 0x1e,
+ 0x1e, 0xca, 0xfe, 0x00, 0x11, 0xe0, 0xc0, 0xf0, 0x20, 0x72, 0x51, 0x33,
+ 0x1f, 0x34, 0x67, 0x10,
+ 0x1f, 0x3f, 0x5f, 0x2c, 0x3f, 0x2d, 0x2f, 0x43, 0x26, 0x22, 0x33, 0x32,
+ 0x00, 0x1f, 0x1f, 0x00,
+ 0xd0, 0xc1, 0xf5, 0xe2, 0xaf, 0xde, 0xff, 0xfd, 0xcd, 0x17, 0x33, 0x0e,
+ 0x0f, 0x0f, 0x0e, 0x00,
+ 0x13, 0x13, 0x40, 0x43, 0x01, 0xb0, 0xcc, 0xe0, 0x17, 0x17, 0x31, 0x52,
+ 0x11, 0x20, 0x1f, 0xef,
+ 0xd0, 0x17, 0x31, 0x00, 0xf0, 0xb3, 0x92, 0xe2, 0xf4, 0xf1, 0x05, 0x01,
+ 0xa2, 0x00, 0x5c, 0x00,
+ 0x1a, 0x11, 0x74, 0x20, 0xef, 0x13, 0x86, 0x21, 0x0f, 0x77, 0x21, 0xdb,
+ 0x00, 0x03, 0x0f, 0x2f,
+ 0x2f, 0xda, 0xc0, 0x33, 0x14, 0xf0, 0xdd, 0x01, 0x03, 0x01, 0x5d, 0x3e,
+ 0x00, 0xd0, 0x0f, 0x62,
+ 0x25, 0x1d, 0x09, 0x20, 0x62, 0x02, 0x20, 0x00, 0x20, 0x23, 0x30, 0x4f,
+ 0x0f, 0xda, 0x01, 0x76,
+ 0x1e, 0x0e, 0x00, 0x31, 0x21, 0xfc, 0xee, 0x22, 0x73, 0x00, 0x00, 0x12,
+ 0x1f, 0x0c, 0x50, 0x03,
+ 0x00, 0xfe, 0x65, 0x11, 0x0b, 0xfe, 0x11, 0x64, 0x1f, 0x1e, 0x01, 0x13,
+ 0x30, 0xfc, 0xf0, 0x36,
+ 0x20, 0xfc, 0x22, 0x62, 0xfe, 0x0f, 0x00, 0xbf, 0xec, 0x25, 0x41, 0x0d,
+ 0xff, 0x00, 0xfe, 0x01,
+ 0x05, 0x20, 0xfb, 0x10, 0x71, 0x13, 0xfe, 0xde, 0x24, 0x23, 0xdc, 0xdd,
+ 0x0f, 0x20, 0x46, 0xf0,
+ 0x0e, 0x71, 0x00, 0xff, 0x0f, 0x21, 0xc0, 0xf0, 0x02, 0xad, 0x00, 0x04,
+ 0xf0, 0xd0, 0xfd, 0x17,
+ 0x01, 0xac, 0x00, 0x44, 0x00, 0x0d, 0x00, 0x01, 0xcf, 0xec, 0x35, 0x30,
+ 0xfc, 0x24, 0xe2, 0xc0,
+ 0x00, 0xe0, 0xbd, 0xfd, 0x51, 0x34, 0x01, 0xcf, 0x02, 0x1e, 0x08, 0x0f,
+ 0x10, 0x01, 0x43, 0x00,
+ 0xff, 0xf0, 0xe0, 0x10, 0x34, 0xd0, 0xed, 0xf0, 0x8e, 0xb0, 0x16, 0x33,
+ 0xdb, 0xef, 0x21, 0x00,
+ 0xdd, 0xe1, 0xe5, 0x80, 0x22, 0x24, 0xaa, 0x00, 0x01, 0x21, 0x00, 0xe0,
+ 0xce, 0x0f, 0x25, 0x10,
+ 0xeb, 0x41, 0x30, 0xe0, 0xbf, 0x01, 0x03, 0x0f, 0x1d, 0x2f, 0x0f, 0x00,
+ 0x05, 0xe1, 0xf0, 0x9a,
+ 0x00, 0x00, 0xcc, 0x01, 0x25, 0xe0, 0xa0, 0x0e, 0x00, 0x40, 0x00, 0x00,
+ 0xf0, 0x00, 0x42, 0x02,
+ 0xd9, 0x20, 0x72, 0xe0, 0xf0, 0x10, 0x11, 0x0e, 0x1f, 0x52, 0x04, 0xfc,
+ 0xf0, 0x00, 0x0f, 0x0f,
+ 0xe1, 0x15, 0x1f, 0x8e, 0x03, 0xf2, 0x0d, 0x20, 0x00, 0xcb, 0x11, 0x33,
+ 0x1e, 0xd9, 0x01, 0x01,
+ 0x52, 0x0d, 0xee, 0x36, 0x43, 0xcf, 0xcd, 0x06, 0x42, 0xfe, 0xde, 0x01,
+ 0x03, 0x2e, 0x0d, 0x11,
+ 0xe4, 0x9c, 0x20, 0x52, 0xfc, 0xed, 0x11, 0x01, 0x01, 0x27, 0x12, 0x9b,
+ 0xf0, 0x10, 0x10, 0x10,
+ 0xf0, 0xf2, 0xe1, 0xfd, 0xfb, 0x00, 0x0e, 0xd0, 0x8f, 0x05, 0x11, 0x00,
+ 0xfd, 0xc0, 0x07, 0xf0,
+ 0x0f, 0x00, 0xaf, 0xf0, 0x22, 0x10, 0xec, 0xee, 0x01, 0x04, 0x22, 0xec,
+ 0xfe, 0x72, 0x04, 0xce,
+ 0x00, 0x02, 0x13, 0x2e, 0xfd, 0xe0, 0xf3, 0xee, 0xfe, 0xb0, 0xbf, 0xe1,
+ 0xf7, 0x01, 0x0b, 0xe0,
+ 0x03, 0x11, 0xbb, 0xff, 0x30, 0x73, 0x03, 0xce, 0x0f, 0x12, 0x0d, 0xd8,
+ 0x11, 0x44, 0x00, 0x1f,
+ 0xc0, 0xcb, 0x22, 0x70, 0x00, 0x00, 0xf5, 0xf0, 0x0d, 0xf0, 0xfd, 0x2f,
+ 0x01, 0xb5, 0x01, 0x00,
+ 0xfe, 0xee, 0x00, 0x23, 0xef, 0xee, 0xfc, 0xf0, 0x03, 0xeb, 0xcf, 0x20,
+ 0x23, 0x03, 0x91, 0xec,
+ 0x00, 0xe4, 0xc1, 0xf3, 0xf0, 0xd9, 0x22, 0x73, 0xec, 0xce, 0x11, 0x01,
+ 0x0c, 0x0e, 0x52, 0x03,
+ 0xd0, 0x0d, 0x10, 0x20, 0xf3, 0xc3, 0xf4, 0xf0, 0x11, 0x0e, 0xa8, 0xee,
+ 0xf6, 0xe0, 0x0f, 0x00,
+ 0x0e, 0xee, 0x73, 0x34, 0xcd, 0x02, 0x06, 0xf0, 0x00, 0x10, 0x4d, 0xf0,
+ 0xd2, 0x03, 0xf0, 0xbd,
+ 0x01, 0x10, 0x4b, 0x30, 0x00, 0x33, 0x10, 0x2b, 0x73, 0x00, 0x20, 0x40,
+ 0x10, 0xf8, 0xde, 0x20,
+ 0x74, 0x01, 0x0f, 0xef, 0x00, 0xdf, 0x0c, 0x00, 0x31, 0xf2, 0xe0, 0x2e,
+ 0x0e, 0x0e, 0xc2, 0x44,
+ 0x1d, 0x98, 0x0f, 0x15, 0x10, 0xfe, 0xdf, 0x00, 0x21, 0x0f, 0x63, 0x15,
+ 0xf0, 0x2e, 0x42, 0xdd,
+ 0xde, 0x13, 0x35, 0x00, 0xcd, 0xef, 0x00, 0x65, 0xf0, 0xd0, 0x03, 0xef,
+ 0xc8, 0x0f, 0x40, 0x21,
+ 0x11, 0x11, 0xf0, 0x00, 0x3e, 0x3e, 0x00, 0xe0, 0x23, 0x14, 0xf1, 0x55,
+ 0x0f, 0x0a, 0x00, 0x11,
+ 0xe0, 0x00, 0xe0, 0x70, 0x70, 0x41, 0xe0, 0x0f, 0x2c, 0x0e, 0x03, 0x31,
+ 0x21, 0x37, 0x03, 0x6f,
+ 0xf8, 0xcf, 0x31, 0x43, 0x00, 0xfe, 0x00, 0x10, 0x61, 0x30, 0x1f, 0x0e,
+ 0x12, 0x16, 0xee, 0x0f,
+ 0x71, 0x04, 0x00, 0x00, 0x0e, 0x20, 0x00, 0x00, 0xf0, 0xff, 0x0f, 0x2d,
+ 0x74, 0x56, 0x00, 0x20,
+ 0x1e, 0x20, 0x20, 0x44, 0x51, 0x3f, 0x0d, 0x04, 0x05, 0x2c, 0x2d, 0x40,
+ 0x01, 0xbd, 0x12, 0x26,
+ 0xfe, 0xfb, 0x20, 0x74, 0x10, 0xfc, 0x00, 0x22, 0x0f, 0x0b, 0x11, 0x41,
+ 0x0f, 0x0f, 0xf0, 0x11,
+ 0xff, 0x2f, 0x7f, 0x0f, 0x01, 0x15, 0x11, 0xff, 0x00, 0x22, 0x40, 0xce,
+ 0xfd, 0x20, 0xf0, 0xb7,
+ 0x17, 0x40, 0xf0, 0xfd, 0x00, 0x00, 0x00, 0x72, 0x20, 0x00, 0xfc, 0xed,
+ 0x11, 0x37, 0x12, 0xfd,
+ 0xf0, 0x22, 0xe1, 0xf0, 0x42, 0xde, 0x8d, 0x12, 0x52, 0x0a, 0x0f, 0x11,
+ 0x24, 0x0f, 0x0d, 0x0f,
+ 0x20, 0x2f, 0x53, 0x12, 0x0c, 0xe2, 0x27, 0x00, 0xae, 0x30, 0x35, 0x0e,
+ 0xde, 0xf0, 0xc0, 0x22,
+ 0x5f, 0xf9, 0xc0, 0x02, 0xe0, 0x2d, 0x20, 0x03, 0xc4, 0xd0, 0x0f, 0x31,
+ 0xcf, 0x0f, 0x64, 0xcc,
+ 0xdd, 0x04, 0x0f, 0xca, 0x11, 0x12, 0xf0, 0xc2, 0x00, 0xfb, 0x20, 0x22,
+ 0x22, 0x72, 0x0b, 0xdd,
+ 0xf0, 0x44, 0x21, 0xf0, 0xdf, 0xde, 0x0e, 0x00, 0x00, 0x1f, 0xe0, 0xb0,
+ 0x0f, 0x00, 0x66, 0x10,
+ 0xd9, 0xc0, 0x00, 0x22, 0x00, 0xdd, 0x10, 0xe0, 0xcf, 0x03, 0xf1, 0xe0,
+ 0x02, 0x41, 0x10, 0x00,
+ 0x9c, 0xdc, 0x01, 0x17, 0x43, 0x00, 0xfd, 0xb1, 0xf4, 0xf2, 0xf0, 0xcf,
+ 0xfa, 0x02, 0x03, 0xde,
+ 0xdb, 0x10, 0xd1, 0x80, 0xe0, 0x00, 0xdc, 0x00, 0x26, 0xc0, 0x90, 0x00,
+ 0x15, 0xe0, 0xde, 0x00,
+ 0x10, 0xe1, 0xe1, 0xe1, 0xab, 0xf2, 0x23, 0x0c, 0x9d, 0x01, 0x11, 0xff,
+ 0xe0, 0x07, 0x01, 0xef,
+ 0xbe, 0xf0, 0x04, 0x11, 0x00, 0xce, 0xfd, 0xef, 0xf2, 0xf0, 0xeb, 0x30,
+ 0x00, 0xcf, 0x16, 0x00,
+ 0xbe, 0xfd, 0x04, 0x10, 0xc0, 0xf3, 0x01, 0xdc, 0xde, 0x12, 0x00, 0x10,
+ 0xd0, 0x8f, 0xdb, 0x20,
+ 0x32, 0x20, 0x0e, 0x02, 0x55, 0x1e, 0x0b, 0x30, 0x42, 0x00, 0xf0, 0x36,
+ 0x20, 0xec, 0x00, 0x01,
+ 0xbf, 0xf0, 0x52, 0x20, 0xdc, 0xfe, 0x32, 0x13, 0x00, 0x71, 0x30, 0xf8,
+ 0x0e, 0x30, 0x33, 0x21,
+ 0x00, 0x0e, 0x20, 0x7f, 0x21, 0x06, 0xee, 0x20, 0x72, 0x0f, 0xef, 0x03,
+ 0x00, 0x2b, 0x10, 0x04,
+ 0x05, 0xff, 0xed, 0x00, 0x25, 0x12, 0xc0, 0xbb, 0x40, 0x10, 0xef, 0x11,
+ 0x31, 0x1f, 0x0e, 0xe0,
+ 0x10, 0x30, 0x33, 0x71, 0x00, 0xb9, 0xe1, 0x44, 0x21, 0xfc, 0xf0, 0x02,
+ 0x0f, 0x4f, 0x4f, 0x0f,
+ 0xbe, 0x11, 0x75, 0x1f, 0x0b, 0x10, 0x00, 0xfe, 0x05, 0x13, 0x4f, 0xfc,
+ 0xff, 0xf0, 0x42, 0x13,
+ 0xdb, 0xdd, 0x30, 0x32, 0x10, 0x01, 0xef, 0xfd, 0x2e, 0x20, 0xe4, 0x04,
+ 0x75, 0x50, 0x1f, 0x0f,
+ 0xe1, 0x12, 0x1c, 0x0e, 0x36, 0x74, 0x00, 0x0b, 0x00, 0x50, 0x20, 0x00,
+ 0x10, 0x63, 0x10, 0x2f,
+ 0x10, 0x0c, 0xfd, 0x44, 0x33, 0x11, 0xf0, 0x0f, 0x1d, 0x2b, 0x20, 0x03,
+ 0x02, 0x71, 0x2e, 0xfe,
+ 0x00, 0x5e, 0x2c, 0x0e, 0xef, 0x02, 0x45, 0x2d, 0xe9, 0xe0, 0x42, 0x21,
+ 0x0e, 0xd1, 0xf5, 0x1e,
+ 0x1d, 0x71, 0x55, 0xcf, 0x00, 0x00, 0x0e, 0x0f, 0x06, 0x11, 0xf0, 0x11,
+ 0x11, 0xef, 0xde, 0x31,
+ 0x22, 0x0e, 0x00, 0xef, 0xaf, 0x0d, 0xfc, 0xef, 0xa0, 0x07, 0x2f, 0xab,
+ 0xd0, 0x01, 0x04, 0x10,
+ 0x01, 0xd3, 0x21, 0xdc, 0x0d, 0x72, 0x04, 0xd1, 0x1f, 0x3b, 0xee, 0x13,
+ 0x13, 0xc0, 0x21, 0x30,
+ 0xda, 0xbf, 0x25, 0x12, 0xef, 0x00, 0x30, 0xd0, 0x8c, 0x00, 0x11, 0x1e,
+ 0x0e, 0x10, 0x3f, 0xea,
+ 0xe0, 0x05, 0x20, 0x1e, 0x60, 0x23, 0xef, 0xbc, 0x13, 0x13, 0xec, 0xcf,
+ 0x34, 0xf0, 0x9e, 0x0e,
+ 0x01, 0xe0, 0x0f, 0x51, 0x0e, 0x10, 0x07, 0x23, 0x1c, 0x2f, 0x0f, 0x01,
+ 0x32, 0xe0, 0xf1, 0xf0,
+ 0xec, 0xcd, 0xc1, 0x17, 0x41, 0xd1, 0xc0, 0xeb, 0x0f, 0x20, 0x01, 0xce,
+ 0xed, 0x43, 0x57, 0xcf,
+ 0xed, 0x10, 0x12, 0xce, 0x21, 0x44, 0xec, 0xf0, 0x1f, 0xf0, 0x0f, 0x50,
+ 0x11, 0x01, 0xe0, 0xf9,
+ 0x00, 0x42, 0xf1, 0x90, 0x03, 0x06, 0xed, 0xce, 0xf0, 0x00, 0x02, 0x00,
+ 0x62, 0xfc, 0x9e, 0x04,
+ 0x11, 0x0d, 0x02, 0xf4, 0xfe, 0xfa, 0x10, 0x00, 0xe0, 0xe0, 0x04, 0x14,
+ 0x02, 0x0f, 0xaa, 0x00,
+ 0x31, 0x41, 0xf0, 0xdf, 0xde, 0x1f, 0x73, 0x23, 0xed, 0x05, 0x22, 0x0d,
+ 0xce, 0x01, 0x04, 0x11,
+ 0x0f, 0xfd, 0x14, 0x65, 0xdd, 0xdc, 0xff, 0x0f, 0x30, 0x13, 0xd0, 0xe0,
+ 0xee, 0xf3, 0xc5, 0xd3,
+ 0x61, 0x0c, 0x8a, 0x01, 0x14, 0x00, 0xef, 0xf2, 0xf0, 0xec, 0xf0, 0x00,
+ 0xff, 0xfb, 0x72, 0x32,
+ 0xca, 0x00, 0x14, 0x20, 0xed, 0x00, 0x01, 0xae, 0xf1, 0x02, 0x03, 0xff,
+ 0xca, 0xd0, 0xe1, 0x23,
+ 0x20, 0x0b, 0xf1, 0xd1, 0xc0, 0x1f, 0x41, 0x11, 0xff, 0xbf, 0x01, 0x03,
+ 0x0c, 0xca, 0xc0, 0xf4,
+ 0x03, 0x20, 0x0a, 0xf0, 0xcf, 0x00, 0x74, 0x01, 0xcf, 0x0d, 0x00, 0x11,
+ 0x01, 0x21, 0x12, 0xcf,
+ 0xd0, 0x25, 0x60, 0x0e, 0x00, 0xe0, 0xf0, 0x2e, 0x2c, 0x01, 0xf2, 0xf2,
+ 0xee, 0xc8, 0x52, 0x12,
+ 0xac, 0xf0, 0x01, 0xf0, 0x23, 0x05, 0xdc, 0xcd, 0x30, 0x20, 0xdf, 0xd0,
+ 0x53, 0x42, 0x0b, 0xcd,
+ 0xf0, 0xf1, 0x00, 0x06, 0x33, 0xcf, 0xde, 0x01, 0xf1, 0xfb, 0x31, 0x02,
+ 0x8f, 0x0f, 0x21, 0xec,
+ 0xfe, 0x01, 0x32, 0x0e, 0x07, 0x01, 0xab, 0xff, 0x20, 0x23, 0xbf, 0xfe,
+ 0x02, 0x10, 0xdc, 0xd1,
+ 0xd4, 0xde, 0x2f, 0x22, 0xae, 0xee, 0x35, 0x33, 0x0c, 0x0e, 0x20, 0x36,
+ 0x01, 0x40, 0x7f, 0xee,
+ 0xe0, 0x22, 0x63, 0x01, 0xd0, 0xf0, 0x10, 0x3f, 0x00, 0x47, 0x02, 0xeb,
+ 0x5f, 0x00, 0x00, 0xfd,
+ 0x40, 0x31, 0xed, 0xf0, 0x13, 0x10, 0x1f, 0x25, 0xe0, 0x0f, 0x2c, 0x0d,
+ 0x2e, 0x60, 0x1e, 0xea,
+ 0xf0, 0xd1, 0x13, 0x47, 0xe0, 0xbc, 0xed, 0xe0, 0x17, 0x02, 0xd0, 0x80,
+ 0xbe, 0x0f, 0x10, 0x11,
+ 0xf0, 0xe3, 0xd1, 0x0d, 0x00, 0x10, 0x9e, 0x0e, 0x14, 0x43, 0xcd, 0xf2,
+ 0x02, 0xe9, 0x03, 0x33,
+ 0xfb, 0xc0, 0x0f, 0xec, 0x52, 0x25, 0xce, 0xdd, 0x00, 0x21, 0x53, 0x22,
+ 0xed, 0xbe, 0x16, 0x33,
+ 0x30, 0xed, 0xf0, 0x2f, 0x2d, 0x4f, 0x30, 0xe6, 0xd0, 0xfd, 0x50, 0x40,
+ 0xfd, 0xe0, 0x16, 0x11,
+ 0x20, 0x41, 0x00, 0xf0, 0x20, 0x52, 0xee, 0xed, 0x02, 0x0e, 0x1d, 0x03,
+ 0x77, 0x57, 0xf0, 0x0c,
+ 0x30, 0x31, 0x20, 0x43, 0x42, 0x0f, 0x0c, 0x4f, 0x0e, 0x11, 0x53, 0x06,
+ 0x0f, 0xfc, 0x10, 0x03,
+ 0x11, 0x42, 0x0d, 0x0c, 0x54, 0x00, 0xfe, 0x2e, 0x71, 0x0f, 0x10, 0x26,
+ 0x00, 0x0b, 0xf0, 0x10,
+ 0x60, 0x21, 0xfe, 0x0f, 0x00, 0x43, 0x0b, 0x0d, 0x11, 0x11, 0x2d, 0x2e,
+ 0x34, 0x01, 0xdd, 0x0e,
+ 0x3d, 0x61, 0x37, 0x14, 0x00, 0xba, 0x20, 0x00, 0x10, 0x50, 0xf0, 0xe2,
+ 0xe0, 0x2f, 0x1c, 0x1f,
+ 0x31, 0x02, 0x00, 0xf1, 0xc5, 0x00, 0x40, 0xfe, 0xf1, 0x27, 0x00, 0xbf,
+ 0x0e, 0x00, 0x00, 0x0c,
+ 0x61, 0x43, 0x00, 0xce, 0x13, 0x12, 0x00, 0x16, 0x61, 0x00, 0xfe, 0xfe,
+ 0x20, 0x2f, 0xef, 0xc4,
+ 0x16, 0x3d, 0x0d, 0x40, 0xef, 0xab, 0x01, 0x44, 0x00, 0x01, 0xe0, 0xf0,
+ 0x01, 0x37, 0xf0, 0xac,
+ 0x00, 0x01, 0xf1, 0xbf, 0xfe, 0x12, 0x20, 0x0f, 0xeb, 0x21, 0x44, 0xfe,
+ 0x0f, 0x54, 0x00, 0x0f,
+ 0x20, 0x02, 0xd1, 0xd0, 0xcc, 0x0f, 0x32, 0xd1, 0xa0, 0x04, 0x0e, 0xe8,
+ 0xf0, 0x00, 0x60, 0x00,
+ 0x02, 0xef, 0xeb, 0x10, 0x02, 0xd0, 0xf3, 0xcc, 0x20, 0x12, 0x8c, 0xe0,
+ 0x31, 0xca, 0xf0, 0x40,
+ 0x0e, 0xfe, 0x34, 0x23, 0xbf, 0xda, 0x00, 0x50, 0x01, 0xe2, 0x05, 0x10,
+ 0xcd, 0xe0, 0x14, 0x00,
+ 0xaf, 0x02, 0x01, 0x0d, 0xf1, 0xe1, 0xef, 0xeb, 0xe0, 0x33, 0x26, 0xcf,
+ 0xbd, 0x0f, 0xf2, 0xf5,
+ 0xd0, 0xcf, 0xec, 0x11, 0x73, 0xfe, 0xce, 0x04, 0x0f, 0xc8, 0x10, 0x13,
+ 0xd0, 0xff, 0x00, 0x02,
+ 0xcf, 0xd0, 0x02, 0x42, 0xce, 0xef, 0x11, 0xe0, 0xbc, 0x02, 0x07, 0xf0,
+ 0xcd, 0xee, 0xf0, 0xe0,
+ 0xae, 0x02, 0xf7, 0xe0, 0xf0, 0x00, 0xab, 0xe0, 0xf2, 0x04, 0xef, 0xbe,
+ 0xe0, 0x01, 0xf1, 0xe1,
+ 0xe0, 0xed, 0x10, 0x51, 0x02, 0xde, 0xfe, 0x10, 0x42, 0xf5, 0xed, 0x0d,
+ 0x0c, 0xee, 0x07, 0x56,
+ 0xbe, 0xfd, 0x00, 0x31, 0xf0, 0xd1, 0x00, 0x2d, 0x1d, 0x30, 0xe2, 0xaf,
+ 0xee, 0x00, 0x11, 0x00,
+ 0x02, 0xf7, 0xcf, 0x0d, 0x1e, 0xee, 0x10, 0x70, 0x30, 0x23, 0x5f, 0xf8,
+ 0xee, 0x02, 0x63, 0x1f,
+ 0x0b, 0x01, 0x14, 0x31, 0x00, 0xf0, 0xd3, 0x16, 0x50, 0x1d, 0xfc, 0xf0,
+ 0x02, 0x01, 0x31, 0x00,
+ 0xdc, 0x1f, 0x50, 0xe3, 0xa3, 0x17, 0x24, 0xdc, 0xce, 0x42, 0x53, 0x01,
+ 0xde, 0xed, 0x00, 0x11,
+ 0x22, 0x0f, 0x00, 0x03, 0x00, 0x0f, 0x1d, 0x0f, 0x02, 0x67, 0x57, 0x1e,
+ 0x2f, 0x0f, 0x0f, 0x50,
+ 0x1f, 0x11, 0x11, 0x02, 0xfb, 0xee, 0x1e, 0x70, 0x13, 0xef, 0x0f, 0x0e,
+ 0x13, 0x54, 0x0a, 0xd0,
+ 0xe0, 0xcd, 0x0f, 0x72, 0xf0, 0xc0, 0x02, 0x20, 0x08, 0xf0, 0x14, 0x24,
+ 0x10, 0x2e, 0x40, 0x10,
+ 0x0e, 0x2f, 0x5f, 0x35, 0x02, 0x01, 0x61, 0x0c, 0x0f, 0x45, 0x22, 0xfe,
+ 0x0e, 0x1c, 0x1e, 0x74,
+ 0x14, 0x0e, 0x1e, 0x20, 0x0e, 0x0d, 0x74, 0x02, 0xfc, 0x02, 0x45, 0x0e,
+ 0xfe, 0x01, 0x21, 0x31,
+ 0x1f, 0x0a, 0x00, 0x52, 0x21, 0x0c, 0xfe, 0x54, 0x10, 0x0d, 0x20, 0x01,
+ 0x24, 0x20, 0xfe, 0xff,
+ 0x02, 0x00, 0x10, 0x34, 0xdf, 0xff, 0x00, 0xe9, 0x10, 0x62, 0xdf, 0xf0,
+ 0x21, 0x01, 0xe0, 0xf1,
+ 0xf7, 0xc3, 0xae, 0x0d, 0x33, 0xe1, 0xbd, 0xfb, 0x20, 0xf2, 0x90, 0xff,
+ 0x1f, 0x0c, 0xfc, 0xef,
+ 0x12, 0x06, 0x9e, 0x00, 0x23, 0x10, 0xde, 0x10, 0x34, 0xce, 0xed, 0x33,
+ 0x1f, 0xa9, 0xf2, 0x24,
+ 0x20, 0x0d, 0xce, 0x00, 0x25, 0xe2, 0xd1, 0x30, 0x2d, 0xd0, 0x03, 0xbf,
+ 0xbd, 0x01, 0x1d, 0xdb,
+ 0x03, 0x35, 0xce, 0xef, 0x33, 0x0e, 0xcc, 0x00, 0x03, 0x74, 0x62, 0xfc,
+ 0xed, 0x00, 0x20, 0x26,
+ 0xf0, 0xde, 0x20, 0x70, 0x01, 0xff, 0x0f, 0x10, 0x12, 0x00, 0x10, 0x1b,
+ 0x00, 0xe2, 0x00, 0x24,
+ 0xf1, 0xdf, 0xdd, 0x9c, 0xff, 0x07, 0x11, 0xec, 0xdf, 0x0f, 0x10, 0x21,
+ 0x5c, 0x0c, 0xe0, 0x26,
+ 0xee, 0xee, 0x74, 0x00, 0x8d, 0x11, 0x13, 0xed, 0xf1, 0x07, 0xe1, 0xde,
+ 0x1f, 0x00, 0xf0, 0xd1,
+ 0xe0, 0x00, 0xe9, 0xdf, 0x10, 0x64, 0xf2, 0xe0, 0xfd, 0xd0, 0xa4, 0xf2,
+ 0x00, 0x0f, 0x20, 0xf0,
+ 0xb2, 0xef, 0xf0, 0x01, 0x00, 0xe9, 0xb0, 0x00, 0x00, 0xfd, 0x02, 0xc2,
+ 0xf3, 0x3f, 0x58, 0x01,
+ 0x03, 0xd0, 0xee, 0x0f, 0x53, 0xde, 0xa8, 0x41, 0x44, 0x00, 0xdc, 0x00,
+ 0x32, 0x00, 0xef, 0x2f,
+ 0x51, 0xf0, 0xdd, 0x05, 0x03, 0xdd, 0xdd, 0xdf, 0xb0, 0x07, 0x24, 0xcc,
+ 0xd0, 0x10, 0x31, 0x11,
+ 0x30, 0xed, 0xde, 0x72, 0x53, 0xe0, 0xfc, 0x00, 0x11, 0x35, 0xf0, 0xe1,
+ 0x00, 0x2f, 0x3f, 0xdb,
+ 0xbf, 0x21, 0x63, 0xf8, 0x0f, 0x00, 0x03, 0xf0, 0xbe, 0x0f, 0x01, 0x01,
+ 0x35, 0x00, 0x35, 0x00,
+ 0xa3, 0x01, 0x93, 0x09, 0x6e, 0x02, 0x84, 0x0b, 0x91, 0xf6, 0xf3, 0x0d,
+ 0x1b, 0x71, 0x01, 0x00,
+ 0x0e, 0x0b, 0x0f, 0x32, 0x31, 0xfe, 0xe5, 0xbf, 0xb8, 0x51, 0x22, 0xf0,
+ 0xc1, 0xf2, 0xef, 0x1f,
+ 0x00, 0x00, 0x00, 0x34, 0x00, 0xea, 0x10, 0x51, 0x00, 0x0d, 0x01, 0x03,
+ 0x25, 0x20, 0xcc, 0x30,
+ 0x33, 0xd2, 0x00, 0x30, 0xff, 0xcf, 0x30, 0xd0, 0x80, 0xe3, 0x35, 0x40,
+ 0x1e, 0xfd, 0x0e, 0x71,
+ 0x03, 0xff, 0xff, 0x25, 0x61, 0xf8, 0xde, 0xe0, 0x12, 0xfe, 0xdc, 0x14,
+ 0x22, 0xce, 0xdd, 0x11,
+ 0x44, 0x10, 0xe8, 0xd0, 0x30, 0x63, 0x0f, 0xce, 0x00, 0xd0, 0x22, 0x33,
+ 0xfc, 0xd0, 0x0f, 0xd0,
+ 0x24, 0x77, 0x00, 0xcc, 0x20, 0x61, 0x02, 0xdf, 0x1e, 0x30, 0x00, 0x01,
+ 0xe0, 0xec, 0x0f, 0x31,
+ 0x56, 0x00, 0xef, 0xf0, 0xe0, 0x00, 0x5e, 0x4f, 0x14, 0xd2, 0xac, 0x10,
+ 0x14, 0x0f, 0xd0, 0x02,
+ 0x00, 0x1d, 0x03, 0xe4, 0x00, 0xf0, 0xab, 0xfc, 0x41, 0x61, 0x0f, 0xfc,
+ 0x01, 0x24, 0x0e, 0x0a,
+ 0x00, 0x03, 0x22, 0x0d, 0xce, 0xe4, 0xd0, 0xf0, 0xf1, 0xf2, 0x0d, 0x2b,
+ 0xe0, 0xa1, 0x0e, 0x0b,
+ 0x00, 0x01, 0xe2, 0xda, 0x50, 0x43, 0xd2, 0xa0, 0xfe, 0x00, 0x42, 0x27,
+ 0x11, 0xdf, 0xed, 0x01,
+ 0x00, 0x2e, 0x10, 0x03, 0x31, 0x51, 0x10, 0x0e, 0xd8, 0x10, 0x72, 0x13,
+ 0x02, 0x34, 0xdf, 0xbc,
+ 0x0f, 0x0f, 0xf0, 0x00, 0x42, 0x01, 0x0b, 0x00, 0x20, 0x10, 0x3e, 0x20,
+ 0x57, 0x12, 0xe0, 0xfc,
+ 0xaf, 0xbd, 0x00, 0x33, 0x00, 0xdd, 0xdc, 0xaf, 0x04, 0x47, 0xee, 0xce,
+ 0x10, 0x50, 0x00, 0x1f,
+ 0x00, 0x01, 0x04, 0x01, 0x2e, 0x0f, 0x00, 0x0e, 0x10, 0x17, 0x03, 0x00,
+ 0x73, 0x00, 0xcc, 0x2e,
+ 0x2e, 0xf0, 0xb1, 0x03, 0x04, 0x23, 0xe2, 0xaa, 0xfd, 0x00, 0x16, 0x00,
+ 0xf1, 0xff, 0xec, 0xf0,
+ 0x32, 0x73, 0x10, 0x0b, 0xfe, 0x10, 0x0f, 0xec, 0x00, 0x36, 0x31, 0x01,
+ 0xa0, 0xed, 0xf0, 0x02,
+ 0xd5, 0xe0, 0xf1, 0x3e, 0x5e, 0x0e, 0x10, 0x11, 0xff, 0x0e, 0x31, 0xef,
+ 0x88, 0x0f, 0x20, 0x11,
+ 0xc2, 0xe0, 0x00, 0x00, 0x04, 0x71, 0xfe, 0xed, 0xee, 0xf1, 0x00, 0x3c,
+ 0x0b, 0x20, 0x42, 0x0e,
+ 0x1d, 0x53, 0x02, 0xf0, 0x57, 0x24, 0xff, 0xec, 0x0f, 0x22, 0x57, 0xef,
+ 0xcf, 0x0e, 0x02, 0x33,
+ 0x00, 0xcb, 0x00, 0x02, 0xf0, 0x02, 0x4f, 0xfb, 0xe0, 0x31, 0xf3, 0x8d,
+ 0xfc, 0x01, 0x04, 0x03,
+ 0xc0, 0x0c, 0x10, 0x0f, 0x10, 0x12, 0x00, 0xfd, 0x71, 0x66, 0xf0, 0xff,
+ 0xff, 0xff, 0x00, 0x15,
+ 0x40, 0xf1, 0xf0, 0x10, 0x44, 0x00, 0xcd, 0x01, 0x31, 0x1d, 0x00, 0x11,
+ 0xb0, 0xdb, 0xf0, 0x0e,
+ 0xf0, 0xef, 0x0e, 0x20, 0x05, 0x80, 0xd9, 0x00, 0x11, 0x1f, 0x1c, 0x31,
+ 0xf1, 0xeb, 0x0d, 0x3e,
+ 0x50, 0x30, 0x0c, 0x0f, 0xd1, 0x07, 0x77, 0x00, 0xed, 0xf0, 0xf0, 0xe0,
+ 0x61, 0x22, 0x0c, 0x0e,
+ 0xef, 0xf0, 0xf1, 0x00, 0x0c, 0x41, 0xe3, 0x8e, 0xfd, 0x04, 0x25, 0xf0,
+ 0xed, 0x00, 0x02, 0x07,
+ 0xe0, 0xed, 0xc0, 0x00, 0x74, 0x10, 0x00, 0x0f, 0x5f, 0x1f, 0x10, 0xf5,
+ 0xe0, 0x00, 0x60, 0x22,
+ 0x0e, 0xdd, 0xd0, 0x03, 0xfe, 0x04, 0x37, 0xb0, 0xfc, 0x10, 0x53, 0x01,
+ 0xd0, 0x0c, 0x50, 0x10,
+ 0x21, 0xef, 0xfe, 0x02, 0x40, 0xff, 0xa0, 0xf7, 0xe5, 0x0e, 0x00, 0xef,
+ 0xd0, 0x00, 0x21, 0x01,
+ 0x00, 0x32, 0x00, 0xe9, 0x1e, 0x71, 0x35, 0x42, 0x1f, 0xfd, 0x00, 0x73,
+ 0x10, 0xed, 0x00, 0x25,
+ 0x10, 0xef, 0xf0, 0x53, 0x00, 0xee, 0x00, 0x0e, 0xcf, 0xf4, 0x57, 0x02,
+ 0xca, 0xfe, 0x01, 0x52,
+ 0x01, 0xee, 0xf0, 0x00, 0xfe, 0x2d, 0x40, 0x0b, 0x1d, 0x40, 0x11, 0xe2,
+ 0xb0, 0x0e, 0xea, 0x01,
+ 0x15, 0x01, 0xd0, 0x02, 0x3e, 0xa9, 0xc0, 0x00, 0x63, 0x0f, 0xfe, 0x00,
+ 0x2f, 0x01, 0xf1, 0xfd,
+ 0xfe, 0x21, 0x54, 0x01, 0x04, 0xe3, 0xe0, 0xef, 0xf2, 0x16, 0x41, 0xcd,
+ 0xba, 0x00, 0x11, 0x11,
+ 0x00, 0xff, 0xff, 0xee, 0x54, 0x46, 0x00, 0xf1, 0x00, 0x0e, 0x11, 0x04,
+ 0xef, 0xee, 0x41, 0x00,
+ 0xed, 0xe0, 0x00, 0x24, 0x73, 0x2b, 0xee, 0xd0, 0x32, 0x6e, 0x0d, 0xdf,
+ 0x02, 0xf7, 0xf5, 0xcd,
+ 0xbb, 0x00, 0x21, 0x34, 0xd0, 0x8e, 0x0e, 0x00, 0x31, 0x00, 0x1f, 0x21,
+ 0xe0, 0xfe, 0x10, 0x1e,
+ 0x3f, 0x00, 0xf6, 0xe0, 0x1c, 0x1e, 0x10, 0xf1, 0xfd, 0x0e, 0x77, 0x13,
+ 0xc0, 0xea, 0x4f, 0x40,
+ 0xd1, 0xc2, 0x00, 0xff, 0x42, 0x63, 0xff, 0xbc, 0xf0, 0x0e, 0x02, 0x23,
+ 0x2f, 0x08, 0xf0, 0x0e,
+ 0x4f, 0x1f, 0xde, 0xdf, 0x31, 0x00, 0xe0, 0x07, 0x03, 0x01, 0x31, 0x70,
+ 0x00, 0x90, 0x00, 0x21,
+ 0x45, 0x00, 0xff, 0xeb, 0x00, 0x0d, 0x0c, 0x10, 0xe1, 0xd2, 0x03, 0x0d,
+ 0xad, 0xe3, 0xd5, 0x01,
+ 0xf0, 0x80, 0xee, 0x01, 0x01, 0x30, 0x0b, 0xef, 0xdf, 0x10, 0x77, 0x62,
+ 0x0e, 0xf0, 0x04, 0x04,
+ 0x13, 0x0f, 0x0b, 0xfe, 0x00, 0x13, 0xf5, 0xc0, 0xef, 0x01, 0x04, 0x0e,
+ 0xec, 0x0e, 0x70, 0x0f,
+ 0x21, 0x20, 0x4d, 0x1b, 0x00, 0xe1, 0xe0, 0x9c, 0x01, 0x37, 0x31, 0xbf,
+ 0xee, 0xf3, 0x02, 0x00,
+ 0x3e, 0x33, 0xef, 0xdf, 0x40, 0x2e, 0x1e, 0xe0, 0x07, 0x33, 0x1e, 0x51,
+ 0x27, 0x30, 0xde, 0xd0,
+ 0x10, 0x4e, 0x2f, 0x30, 0x26, 0xf1, 0xf0, 0xfd, 0xdc, 0xce, 0x1f, 0x24,
+ 0x82, 0x91, 0xff, 0xec,
+ 0x20, 0x10, 0xe0, 0xe0, 0x1e, 0x04, 0x00, 0x0f, 0x2b, 0x4d, 0xfb, 0x00,
+ 0x10, 0xe0, 0xa1, 0x01,
+ 0x04, 0x00, 0xe0, 0x8d, 0xd1, 0xf0, 0x40, 0x47, 0xf2, 0xff, 0xff, 0xcd,
+ 0xfc, 0x0d, 0x20, 0x51,
+ 0xf4, 0xd1, 0xfe, 0x10, 0x35, 0x00, 0xfd, 0xf1, 0x27, 0x76, 0x2e, 0x9d,
+ 0x00, 0x12, 0x00, 0x0f,
+ 0x10, 0x00, 0x0d, 0x33, 0x34, 0x10, 0xef, 0xbf, 0x1f, 0x5f, 0x10, 0x07,
+ 0xf2, 0xe0, 0x0b, 0xff,
+ 0xf0, 0xf1, 0xef, 0xf0, 0x12, 0x43, 0x0f, 0x2f, 0x7b, 0x29, 0x00, 0x02,
+ 0xd4, 0x0f, 0x0b, 0x50,
+ 0x21, 0xe0, 0x80, 0xc0, 0x12, 0x20, 0x00, 0xf0, 0xe1, 0x02, 0x43, 0x0e,
+ 0x09, 0x00, 0x14, 0x31,
+ 0x00, 0xfd, 0x00, 0x31, 0x00, 0xff, 0xfe, 0x10, 0x03, 0xc7, 0x01, 0x2f,
+ 0xff, 0xb2, 0xd5, 0xf0,
+ 0x3d, 0x7c, 0x10, 0xd2, 0xb5, 0x01, 0x00, 0x0e, 0x50, 0x00, 0xf2, 0xc2,
+ 0xf3, 0x00, 0x28, 0xee,
+ 0x3f, 0x50, 0xf0, 0xcd, 0xfd, 0x0c, 0x41, 0x02, 0xad, 0x0d, 0x00, 0xe4,
+ 0xe4, 0x00, 0x2f, 0x2d,
+ 0x03, 0x15, 0x40, 0xdb, 0x0f, 0x70, 0x43, 0xfe, 0xcb, 0x10, 0x43, 0x04,
+ 0xc0, 0xfc, 0xf0, 0x04,
+ 0x03, 0xe1, 0x01, 0x33, 0x00, 0xcd, 0xea, 0xd0, 0xf0, 0x42, 0x72, 0x21,
+ 0xe0, 0xfd, 0x1e, 0x40,
+ 0x02, 0x16, 0x32, 0xf2, 0xb2, 0x1f, 0x59, 0x00, 0xf3, 0x05, 0x00, 0xe0,
+ 0xf0, 0x0c, 0x4f, 0x00,
+ 0x13, 0x13, 0x10, 0xeb, 0x1d, 0x4e, 0x0f, 0xa2, 0x02, 0xf2, 0xff, 0xdb,
+ 0xff, 0xe0, 0xe0, 0xcf,
+ 0xce, 0xf1, 0xf3, 0x08, 0xfd, 0x02, 0xe4, 0xde, 0x7b, 0x4e, 0x00, 0x23,
+ 0x20, 0xef, 0xf2, 0x45,
+ 0x71, 0x1f, 0x0f, 0xde, 0xde, 0x15, 0x64, 0x0f, 0xfd, 0x12, 0x43, 0x00,
+ 0xfa, 0xff, 0xff, 0x01,
+ 0x11, 0xf0, 0xd4, 0xe0, 0xee, 0xfc, 0xf0, 0x11, 0x10, 0x10, 0x3d, 0x2c,
+ 0xed, 0x1e, 0x41, 0x80,
+ 0x8f, 0x0c, 0x00, 0x00, 0x00, 0x24, 0x17, 0x07, 0xc0, 0x1d, 0x4e, 0x20,
+ 0x04, 0xd2, 0xf0, 0x0e,
+ 0x61, 0x12, 0xed, 0xda, 0xef, 0x21, 0x36, 0x41, 0xf0, 0xef, 0xef, 0xc1,
+ 0xd0, 0x01, 0xde, 0x0f,
+ 0x70, 0x10, 0xff, 0x8c, 0x01, 0x02, 0x21, 0x2e, 0x09, 0xe0, 0xf2, 0xf2,
+ 0x30, 0x6d, 0xf2, 0xc5,
+ 0x03, 0x0f, 0x0b, 0x00, 0x12, 0x34, 0xf1, 0xe1, 0x5f, 0x3f, 0x40, 0x00,
+ 0xff, 0xec, 0x1f, 0x3e,
+ 0x11, 0x03, 0xd4, 0xb3, 0xcb, 0xcc, 0xf1, 0x05, 0x01, 0x3f, 0x0b, 0xc0,
+ 0xe6, 0xd0, 0x0f, 0x6d,
+ 0x20, 0x31, 0x22, 0xf1, 0xae, 0x1d, 0x21, 0x51, 0x00, 0x00, 0x24, 0x14,
+ 0xf1, 0xdf, 0xea, 0x0f,
+ 0x20, 0x20, 0x53, 0x00, 0xbc, 0xff, 0x0f, 0x20, 0xe6, 0x91, 0x00, 0x13,
+ 0x43, 0x21, 0x00, 0xdf,
+ 0xde, 0x2c, 0x40, 0x11, 0x0f, 0xc9, 0xed, 0xff, 0x10, 0x40, 0x04, 0xd0,
+ 0xd8, 0xd0, 0x21, 0x63,
+ 0x0f, 0xef, 0xe0, 0xd0, 0x00, 0xf2, 0xe0, 0xd9, 0x00, 0x20, 0x01, 0x30,
+ 0x00, 0x0e, 0x70, 0x21,
+ 0x07, 0xc6, 0x10, 0x4e, 0x1f, 0x3f, 0x01, 0x82, 0x90, 0xef, 0x0d, 0x10,
+ 0x42, 0x12, 0xff, 0xcd,
+ 0x03, 0x20, 0x09, 0x1f, 0x2f, 0x13, 0x06, 0xff, 0xde, 0x0e, 0x20, 0x00,
+ 0xd0, 0x07, 0x10, 0x30,
+ 0x5f, 0x0c, 0xe0, 0x71, 0x72, 0x2f, 0x0b, 0x00, 0xef, 0xff, 0x02, 0xe3,
+ 0x00, 0xda, 0xd0, 0xf1,
+ 0xe1, 0xc1, 0xee, 0xc0, 0xe3, 0x01, 0xed, 0xc8, 0x20, 0x72, 0x51, 0xf0,
+ 0xee, 0x0c, 0x40, 0x11,
+ 0x03, 0xf0, 0x0d, 0x03, 0x14, 0x01, 0x21, 0xf1, 0xb0, 0x0f, 0x40, 0x52,
+ 0x00, 0x0a, 0x00, 0xe2,
+ 0x05, 0x4f, 0x1e, 0x00, 0xe5, 0xe1, 0xf2, 0xd2, 0xe0, 0x50, 0x40, 0xf1,
+ 0xbe, 0xf8, 0x0d, 0x00,
+ 0x02, 0x00, 0xee, 0xf0, 0xce, 0xdc, 0x0e, 0x3e, 0x61, 0x17, 0x03, 0xc3,
+ 0xbe, 0xf8, 0x30, 0x70,
+ 0x02, 0xe0, 0xde, 0xfe, 0x10, 0x30, 0x12, 0xf3, 0xc0, 0x10, 0x30, 0x10,
+ 0xef, 0xcc, 0xf0, 0x04,
+ 0x76, 0x20, 0xfa, 0xbf, 0x00, 0x0f, 0xff, 0x00, 0x20, 0x02, 0x40, 0x10,
+ 0x0f, 0xfe, 0xdf, 0x0f,
+ 0x75, 0x16, 0x00, 0xc0, 0x0f, 0x01, 0x01, 0x11, 0x13, 0xf3, 0xee, 0x1d,
+ 0x70, 0x02, 0x47, 0x03,
+ 0x21, 0x1e, 0xea, 0xdf, 0xe0, 0x02, 0x44, 0x00, 0xec, 0xbe, 0xf0, 0xf4,
+ 0xe0, 0xff, 0x1d, 0x03,
+ 0xd7, 0x00, 0x3c, 0x4e, 0x20, 0x22, 0x03, 0xb0, 0xfe, 0x3c, 0x70, 0x07,
+ 0xd2, 0xe0, 0x00, 0xff,
+ 0x00, 0x00, 0x4e, 0x30, 0x10, 0x10, 0x14, 0x13, 0x0c, 0xca, 0xb0, 0xd3,
+ 0xe4, 0x00, 0x30, 0x30,
+ 0xcf, 0x8f, 0xb0, 0x10, 0x1f, 0x0e, 0x30, 0x3e, 0x22, 0x05, 0xef, 0xec,
+ 0x1e, 0x7e, 0x3f, 0x03,
+ 0x05, 0xd0, 0x10, 0x2b, 0x0d, 0x50, 0x17, 0x00, 0xbd, 0xfe, 0x0f, 0xf0,
+ 0xe3, 0xef, 0xff, 0xf0,
+ 0x60, 0x1e, 0xeb, 0xc0, 0xf2, 0x11, 0x02, 0xde, 0xf9, 0x1e, 0x31, 0x13,
+ 0xf0, 0xfb, 0xcf, 0x00,
+ 0x05, 0x70, 0x60, 0x00, 0x03, 0xf0, 0x1e, 0x5f, 0x0e, 0xff, 0xc4, 0x07,
+ 0xe2, 0xfc, 0x00, 0x41,
+ 0x13, 0x02, 0x00, 0x2d, 0x2f, 0x00, 0xf0, 0x13, 0x61, 0x1f, 0xe9, 0x90,
+ 0x02, 0x03, 0x0e, 0x3e,
+ 0xc3, 0xb4, 0xf3, 0x1e, 0x2c, 0xf0, 0xb7, 0xf4, 0xfe, 0x1c, 0x40, 0x20,
+ 0x01, 0xf0, 0x0e, 0x30,
+ 0x62, 0x07, 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x2d, 0x0f, 0xe5, 0x11, 0x0f,
+ 0xfb, 0xcf, 0x4f, 0x70,
+ 0x1f, 0xff, 0xdd, 0xd0, 0x03, 0x12, 0x1a, 0xde, 0xe3, 0x17, 0x00, 0xed,
+ 0xee, 0x1f, 0x12, 0x35,
+ 0x10, 0x8b, 0xff, 0x20, 0x40, 0x01, 0x12, 0x30, 0xff, 0xfd, 0x71, 0x27,
+ 0xc1, 0xd0, 0x0d, 0x40,
+ 0x20, 0x00, 0xb0, 0xfe, 0x0c, 0x11, 0x46, 0x10, 0x0f, 0xcf, 0xe0, 0x01,
+ 0x31, 0x03, 0xaf, 0x1c,
+ 0x20, 0x16, 0xe3, 0xed, 0x0d, 0x0f, 0x11, 0x55, 0xf0, 0xc0, 0x0e, 0x00,
+ 0xf0, 0xb0, 0x00, 0x7f,
+ 0x00, 0xd0, 0xdd, 0x10, 0x20, 0x10, 0x0e, 0xcb, 0xd0, 0xf3, 0x5e, 0x49,
+ 0x01, 0xd6, 0x11, 0x10,
+ 0x00, 0x0f, 0x0f, 0x60, 0x13, 0xe0, 0xc0, 0x00, 0x02, 0x0f, 0x00, 0xf5,
+ 0xf1, 0xcd, 0xec, 0x01,
+ 0x07, 0x03, 0x1f, 0x09, 0x2f, 0x1e, 0x3f, 0x00, 0xd0, 0x32, 0x31, 0x2e,
+ 0x40, 0x30, 0x3c, 0x21,
+ 0xe7, 0x84, 0xd1, 0x1f, 0x7e, 0x70, 0x20, 0xfe, 0xe0, 0x22, 0x0c, 0x0e,
+ 0x13, 0x05, 0xf0, 0xf0,
+ 0xdf, 0xff, 0x04, 0x65, 0x12, 0xd0, 0xd3, 0xe0, 0x0a, 0x2e, 0xff, 0xbf,
+ 0x0d, 0x0e, 0x4f, 0x2f,
+ 0x11, 0x30, 0x2c, 0xce, 0xe0, 0x25, 0x74, 0x0f, 0xfd, 0xc2, 0x12, 0x2f,
+ 0xe8, 0xbf, 0x0f, 0xf0,
+ 0xf0, 0x10, 0x01, 0xe0, 0xb2, 0xf0, 0x10, 0x53, 0x23, 0xf0, 0xb8, 0xf0,
+ 0x02, 0x25, 0x10, 0xc0,
+ 0xde, 0x00, 0x32, 0x20, 0xef, 0xbc, 0x22, 0x35, 0xf0, 0xaf, 0x1e, 0x60,
+ 0x00, 0xe0, 0xe1, 0x03,
+ 0x00, 0x0e, 0x3b, 0x22, 0x07, 0xf1, 0x1c, 0x40, 0x20, 0x57, 0x11, 0x10,
+ 0xee, 0x0f, 0x1f, 0x50,
+ 0x21, 0xf4, 0xcf, 0x0e, 0xf2, 0x17, 0x0f, 0xac, 0xf0, 0xe0, 0x02, 0xd0,
+ 0xf0, 0x0e, 0x3f, 0x40,
+ 0xfe, 0xc0, 0x01, 0x01, 0x5e, 0x0e, 0xf0, 0x37, 0x34, 0x0f, 0x1c, 0x70,
+ 0x22, 0x11, 0x00, 0x0e,
+ 0x0d, 0x00, 0x21, 0x52, 0xfe, 0xdd, 0xf0, 0xf7, 0xf3, 0xc1, 0xef, 0xb0,
+ 0xf1, 0x02, 0x46, 0x02,
+ 0x0f, 0xcd, 0xd0, 0xba, 0xec, 0x01, 0x44, 0x02, 0x3f, 0x2c, 0x00, 0xd1,
+ 0xe0, 0x10, 0x6f, 0x31,
+ 0xf0, 0x9c, 0xfd, 0xe0, 0x07, 0x20, 0x0d, 0xcd, 0xc0, 0x00, 0x01, 0x01,
+ 0xf0, 0x20, 0x71, 0x2f,
+ 0x0b, 0xdf, 0x2f, 0x3f, 0x13, 0xe7, 0xc6, 0xee, 0xdd, 0x10, 0x40, 0x04,
+ 0xd0, 0x01, 0x01, 0xde,
+ 0xff, 0x5f, 0x5e, 0xff, 0xc4, 0x17, 0x10, 0x0e, 0x00, 0x10, 0x00, 0xaf,
+ 0x0f, 0x30, 0x61, 0x00,
+ 0xfe, 0xf2, 0x16, 0x20, 0x1b, 0x1e, 0x00, 0x22, 0x02, 0x10, 0x06, 0xe2,
+ 0x00, 0x60, 0x40, 0xf1,
+ 0xd3, 0xd1, 0xe0, 0x0e, 0x60, 0x08, 0x1e, 0x0f, 0xf0, 0xf0, 0x21, 0x55,
+ 0xe1, 0xb0, 0xf2, 0xd3,
+ 0xf1, 0xf9, 0x0f, 0x11, 0x13, 0xfe, 0xf9, 0x2f, 0x4f, 0x50, 0x4f, 0x20,
+ 0x01, 0xc0, 0x0f, 0x33,
+ 0x23, 0x0e, 0x30, 0x57, 0xa7, 0xcf, 0xee, 0x21, 0x42, 0x00, 0xcf, 0xef,
+ 0x0f, 0x0e, 0xfc, 0x0f,
+ 0x00, 0x01, 0x42, 0x3e, 0xfb, 0xc0, 0x11, 0x44, 0x20, 0x0e, 0xfe, 0x20,
+ 0x12, 0xcc, 0xe9, 0xe0,
+ 0xe0, 0x02, 0x03, 0xce, 0x1c, 0x50, 0xf0, 0xb0, 0x01, 0x61, 0x01, 0xe4,
+ 0xd0, 0xec, 0x02, 0x33,
+ 0x31, 0xe0, 0x80, 0xd5, 0x02, 0x42, 0x34, 0x22, 0x30, 0xe0, 0xfe, 0x0d,
+ 0x2c, 0x03, 0x37, 0x31,
+ 0x1c, 0xa0, 0xdf, 0xe0, 0x20, 0x36, 0x10, 0xa0, 0xe0, 0x00, 0xdf, 0xac,
+ 0xf0, 0x22, 0x75, 0x3f,
+ 0x0b, 0xef, 0x0f, 0x00, 0x12, 0x22, 0xd0, 0xb1, 0x03, 0x10, 0xf0, 0xc0,
+ 0xfc, 0x01, 0x41, 0xed,
+ 0xbd, 0x0e, 0x18, 0x3c, 0xe0, 0xc0, 0xf2, 0x13, 0x03, 0xc0, 0x0d, 0x02,
+ 0x03, 0x17, 0x72, 0x63,
+ 0x1f, 0x08, 0xff, 0x00, 0x33, 0x3f, 0x2c, 0x00, 0x10, 0x00, 0xe2, 0xc1,
+ 0xe0, 0x03, 0x42, 0xf3,
+ 0xa0, 0xea, 0xef, 0x0f, 0x00, 0x10, 0x10, 0x1c, 0x0b, 0xed, 0x0c, 0x60,
+ 0x30, 0x01, 0xb1, 0x07,
+ 0x01, 0x1f, 0x29, 0x30, 0xe2, 0xc1, 0xd0, 0x0e, 0x20, 0x51, 0xe0, 0xc0,
+ 0xf0, 0xf2, 0xf2, 0x3f,
+ 0x3a, 0xe0, 0xd0, 0x44, 0x20, 0xdb, 0x9f, 0xe0, 0xf2, 0x12, 0x03, 0xf0,
+ 0xd0, 0x0d, 0xe0, 0x80,
+ 0xf4, 0x05, 0x11, 0x30, 0x01, 0x10, 0xed, 0xe0, 0x03, 0x55, 0x7f, 0x2c,
+ 0x00, 0xe1, 0xf7, 0x01,
+ 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x11, 0x13, 0x0e, 0x0f, 0x0a,
+ 0xe9, 0xde, 0xc0, 0xd3,
+ 0x01, 0x1f, 0xeb, 0x80, 0x03, 0xe0, 0xfe, 0x2d, 0x70, 0x0e, 0x01, 0x01,
+ 0x10, 0x00, 0x1f, 0x00,
+ 0xef, 0x1f, 0x67, 0x35, 0x70, 0x21, 0x86, 0x36, 0x0e, 0x39, 0x5e, 0x00,
+ 0xf1, 0xf7, 0x93, 0xdf,
+ 0x1d, 0x3f, 0x11, 0x23, 0x04, 0x31, 0x7e, 0x6f, 0x11, 0x12, 0x2a, 0x2d,
+ 0x3f, 0xd1, 0xa0, 0x06,
+ 0x22, 0x02, 0x00, 0xbe, 0x00, 0xf3, 0xe1, 0xc1, 0x00, 0x2d, 0xfd, 0xbd,
+ 0x1b, 0x5d, 0x1a, 0xf0,
+ 0xf3, 0x03, 0x40, 0xfd, 0xfb, 0x30, 0x24, 0x01, 0xc0, 0xe0, 0x03, 0x46,
+ 0x50, 0xef, 0xdb, 0x00,
+ 0x13, 0x30, 0x40, 0x40, 0x10, 0xcc, 0xdd, 0x0c, 0x5b, 0xfe, 0xaf, 0x03,
+ 0xe5, 0xdf, 0xbe, 0x00,
+ 0x03, 0x21, 0x0f, 0xfb, 0xdf, 0x00, 0x04, 0x04, 0x31, 0x5e, 0x2e, 0x10,
+ 0x03, 0x0b, 0xfe, 0x01,
+ 0x24, 0x0f, 0x2e, 0x51, 0x13, 0x3d, 0x6a, 0x10, 0xe2, 0xc3, 0x00, 0x2d,
+ 0x0a, 0x01, 0x06, 0x20,
+ 0x5e, 0x1f, 0xfe, 0xf0, 0x44, 0xf1, 0x91, 0x00, 0x3d, 0x3d, 0x10, 0xb5,
+ 0xe0, 0xee, 0x2f, 0x11,
+ 0x01, 0xad, 0xed, 0xb0, 0xf5, 0x05, 0x01, 0x0e, 0x2f, 0x42, 0x12, 0xf0,
+ 0xf0, 0x10, 0x61, 0x3c,
+ 0x1e, 0x22, 0x01, 0x0d, 0x2c, 0x53, 0x03, 0xef, 0x0e, 0x17, 0xf7, 0xe7,
+ 0xe0, 0xe0, 0xdf, 0x00,
+ 0xe1, 0x90, 0xee, 0xe1, 0x01, 0x0f, 0xfc, 0xd0, 0x00, 0x31, 0xde, 0x0e,
+ 0x74, 0x31, 0x0e, 0x1d,
+ 0xe2, 0xe7, 0x01, 0xe0, 0x83, 0xd0, 0x19, 0x5f, 0x00, 0xbf, 0xf0, 0x01,
+ 0x64, 0x00, 0x1d, 0x1f,
+ 0x21, 0x22, 0x00, 0xe0, 0xcd, 0xf1, 0x25, 0x30, 0xf1, 0xe0, 0xfe, 0xf2,
+ 0x34, 0x7f, 0x0e, 0xa4,
+ 0xe0, 0xf9, 0x1e, 0x4e, 0x1f, 0x00, 0xc1, 0xec, 0x0f, 0x51, 0x05, 0xfe,
+ 0x0a, 0x10, 0x03, 0xd6,
+ 0xd0, 0x1f, 0x5e, 0x5f, 0x10, 0x11, 0x1e, 0x0d, 0x00, 0x21, 0x51, 0x02,
+ 0x02, 0xe0, 0x00, 0xf2,
+ 0x05, 0xd0, 0xd2, 0x00, 0x0c, 0xe0, 0xf5, 0x41, 0x0a, 0x80, 0x95, 0x00,
+ 0x1f, 0x0c, 0xe0, 0xd1,
+ 0x05, 0x11, 0xf1, 0x02, 0x40, 0x0e, 0x2d, 0x11, 0x03, 0xc0, 0x0f, 0x6e,
+ 0x5e, 0x0a, 0x0b, 0xd0,
+ 0x01, 0x06, 0x01, 0x00, 0x11, 0x22, 0xd0, 0xf0, 0x01, 0x35, 0x60, 0xfe,
+ 0xde, 0xd0, 0xf0, 0xeb,
+ 0x0d, 0x7e, 0x3f, 0xe2, 0xd2, 0x0f, 0x0b, 0xde, 0x2e, 0x7e, 0x01, 0xa0,
+ 0xfa, 0xff, 0x02, 0x24,
+ 0x0f, 0x1c, 0x0f, 0xee, 0xf0, 0x02, 0x70, 0x20, 0x20, 0x00, 0xfc, 0x0a,
+ 0x3e, 0xcd, 0xe0, 0xc5,
+ 0x11, 0x11, 0x00, 0xb0, 0xca, 0xe0, 0x14, 0x12, 0xf1, 0xe0, 0x1d, 0x40,
+ 0x21, 0x42, 0x11, 0x20,
+ 0x41, 0x30, 0x30, 0x37, 0xf2, 0x92, 0xe0, 0xe0, 0x11, 0x01, 0x04, 0xf3,
+ 0xd0, 0x0b, 0x2f, 0x7d,
+ 0x1d, 0x00, 0xf3, 0xf0, 0x0d, 0x20, 0xfc, 0xe9, 0x10, 0x40, 0xe0, 0x80,
+ 0xf5, 0x03, 0x00, 0x0f,
+ 0x19, 0xf0, 0xb0, 0xe0, 0xf0, 0xd3, 0xf2, 0xd2, 0xd1, 0xf0, 0x00, 0x00,
+ 0x86, 0x04, 0x21, 0x0c,
+ 0xaa, 0x10, 0x51, 0x00, 0x0e, 0x0c, 0x30, 0x21, 0x30, 0x30, 0x13, 0x03,
+ 0x03, 0x02, 0x0f, 0x4c,
+ 0x40, 0x34, 0xd0, 0x80, 0xd2, 0x01, 0x2a, 0x2f, 0x30, 0xe0, 0xad, 0x07,
+ 0x05, 0x40, 0x2e, 0xfe,
+ 0xe0, 0xf1, 0x21, 0x10, 0x13, 0xdf, 0xfc, 0x00, 0xc0, 0xe2, 0x3f, 0x78,
+ 0x0f, 0xd0, 0x00, 0x42,
+ 0x00, 0x0e, 0x0c, 0x70, 0x12, 0xe1, 0xcd, 0xfb, 0x01, 0x06, 0x00, 0x0e,
+ 0xed, 0xd0, 0xd0, 0x0f,
+ 0x01, 0x24, 0xf4, 0x90, 0x0d, 0xfc, 0x10, 0x6f, 0x11, 0xf3, 0xae, 0x0b,
+ 0x10, 0x02, 0xf4, 0xf5,
+ 0xf0, 0x01, 0xe2, 0xe0, 0x0a, 0x20, 0x4e, 0x00, 0xd0, 0xe4, 0x22, 0x7e,
+ 0x3c, 0x51, 0x23, 0x10,
+ 0xd0, 0x00, 0x00, 0x31, 0x11, 0x37, 0x53, 0xfd, 0x9b, 0x0e, 0x0e, 0xfe,
+ 0x0f, 0xe3, 0x15, 0x13,
+ 0x00, 0x00, 0x0f, 0xde, 0xd2, 0x37, 0x32, 0xe0, 0xce, 0x1d, 0x4f, 0xee,
+ 0xcc, 0x2d, 0x7d, 0x6d,
+ 0x0e, 0x05, 0x13, 0xff, 0xdc, 0xf3, 0x14, 0x53, 0x04, 0xf2, 0xf0, 0x4f,
+ 0x23, 0x03, 0xcc, 0x0a,
+ 0x1e, 0x3d, 0xf0, 0x01, 0x0f, 0x6c, 0x00, 0xf4, 0x00, 0xfc, 0xfe, 0xd5,
+ 0xd6, 0xf0, 0xaf, 0xcf,
+ 0xe0, 0xff, 0xf0, 0x0f, 0x00, 0x4f, 0x31, 0xe2, 0x0f, 0x7f, 0x60, 0x04,
+ 0xd0, 0x1e, 0x2e, 0x0f,
+ 0x14, 0xd5, 0xb0, 0xee, 0xf0, 0x00, 0x2d, 0x1f, 0xcd, 0xce, 0xf7, 0xf7,
+ 0xf0, 0x0f, 0x1f, 0x20,
+ 0x00, 0xeb, 0x60, 0x40, 0x24, 0x0f, 0xcc, 0x00, 0x03, 0xc5, 0xf1, 0x3f,
+ 0x70, 0x02, 0x01, 0xed,
+ 0xf0, 0x16, 0x51, 0x2f, 0x0d, 0xfe, 0x12, 0x36, 0xd0, 0x9d, 0x0e, 0x31,
+ 0x27, 0xe0, 0xd0, 0x00,
+ 0x21, 0x20, 0x0d, 0xbf, 0x01, 0xe3, 0xde, 0x0c, 0x30, 0x1e, 0xbe, 0xdf,
+ 0xe0, 0xf7, 0x43, 0x51,
+ 0x22, 0x20, 0x10, 0x20, 0x01, 0x13, 0x2d, 0x29, 0x20, 0x33, 0x32, 0x08,
+ 0xbc, 0xf0, 0x05, 0xd1,
+ 0x40, 0x71, 0x70, 0x10, 0xfe, 0xd0, 0xef, 0xd0, 0x00, 0x01, 0x0e, 0x3b,
+ 0x0d, 0xd0, 0xc0, 0x05,
+ 0xee, 0xdc, 0x40, 0x21, 0xe4, 0x80, 0xdd, 0xf0, 0xf0, 0xf4, 0x0f, 0x2f,
+ 0x30, 0x30, 0x0e, 0x2d,
+ 0x0f, 0x01, 0x01, 0x7e, 0x3f, 0x4f, 0x3e, 0x0b, 0xe2, 0xe3, 0x89, 0xbd,
+ 0x0e, 0x02, 0x37, 0x03,
+ 0xcf, 0xfc, 0xff, 0xd0, 0x00, 0xf1, 0x0f, 0x2d, 0x2d, 0x5c, 0x3d, 0xfd,
+ 0xa1, 0xf3, 0xf7, 0x07,
+ 0x20, 0xed, 0xd0, 0x11, 0x26, 0x11, 0x30, 0x1f, 0x0f, 0x60, 0x71, 0x32,
+ 0x11, 0x00, 0x00, 0x13,
+ 0x30, 0x08, 0x0f, 0x02, 0x42, 0x10, 0x50, 0x30, 0x0f, 0x9e, 0xe0, 0xe3,
+ 0x00, 0x4b, 0xfd, 0xbc,
+ 0x00, 0x00, 0xe0, 0xc3, 0x05, 0x02, 0x0e, 0x0b, 0x10, 0x10, 0xf3, 0xf1,
+ 0x00, 0x10, 0x29, 0x20,
+ 0x32, 0x63, 0x2c, 0x1d, 0x00, 0x25, 0xc0, 0x81, 0xf1, 0x32, 0x50, 0x00,
+ 0xe0, 0xe1, 0xf1, 0x13,
+ 0x47, 0x06, 0x0f, 0x2d, 0x00, 0xf0, 0x23, 0x52, 0x1f, 0xfc, 0xd0, 0x1f,
+ 0x3f, 0x0b, 0x9f, 0xef,
+ 0x00, 0x11, 0xf4, 0xbf, 0x0c, 0x50, 0x23, 0x00, 0xcb, 0x0f, 0x00, 0x31,
+ 0x0f, 0xfb, 0xe0, 0x01,
+ 0x22, 0x0f, 0xef, 0x0e, 0x3e, 0x0f, 0xc6, 0xf3, 0xd1, 0xcf, 0x00, 0x67,
+ 0x52, 0xfd, 0xbe, 0x00,
+ 0x2f, 0x0e, 0x0b, 0x00, 0x03, 0xe2, 0xff, 0xfe, 0xb2, 0xe1, 0xf0, 0xc0,
+ 0x07, 0x07, 0x42, 0x1f,
+ 0x00, 0xd0, 0xff, 0x1f, 0x2f, 0x60, 0x34, 0x10, 0xff, 0xdd, 0x70, 0x44,
+ 0x23, 0x11, 0x00, 0xf5,
+ 0xd0, 0xe2, 0x00, 0xed, 0xeb, 0xed, 0x00, 0xf2, 0xc1, 0xaf, 0xeb, 0xef,
+ 0x0f, 0x13, 0xe1, 0x80,
+ 0x00, 0x06, 0x30, 0x2b, 0x2e, 0xe0, 0xb1, 0x10, 0x3c, 0x3c, 0x0d, 0x0f,
+ 0x10, 0x52, 0x03, 0xa0,
+ 0x09, 0x00, 0x50, 0x02, 0x01, 0xf1, 0xfe, 0x0d, 0x0f, 0x30, 0x13, 0x00,
+ 0x0e, 0xea, 0x0e, 0x1d,
+ 0xee, 0x83, 0xf6, 0x01, 0x10, 0x1b, 0x00, 0xf0, 0xd4, 0xc0, 0xcd, 0xcd,
+ 0xff, 0x1f, 0x3f, 0x2b,
+ 0x6f, 0x11, 0xf3, 0xe1, 0x1f, 0x40, 0x07, 0x17, 0x31, 0x6f, 0x0d, 0x0f,
+ 0x00, 0x03, 0xe4, 0xaf,
+ 0xfc, 0x21, 0x45, 0x00, 0xb1, 0x00, 0x00, 0xe0, 0x0f, 0x10, 0x0c, 0x0f,
+ 0x30, 0x01, 0x9c, 0x0d,
+ 0x00, 0x00, 0xf7, 0xa2, 0x00, 0xee, 0x03, 0x00, 0xf0, 0x10, 0x22, 0x06,
+ 0x21, 0x31, 0x0c, 0x4f,
+ 0x3d, 0x40, 0x2f, 0x20, 0x00, 0xb0, 0x01, 0xe4, 0x0f, 0x7d, 0x3f, 0x00,
+ 0xc1, 0x14, 0x12, 0x39,
+ 0x1a, 0x1e, 0xe0, 0xad, 0xed, 0x0f, 0x23, 0x07, 0xd0, 0x80, 0xf2, 0xf4,
+ 0xf0, 0xeb, 0x00, 0x71,
+ 0x16, 0x00, 0xdd, 0xef, 0x00, 0x50, 0x00, 0x1f, 0x02, 0x25, 0x20, 0x10,
+ 0x30, 0x01, 0x01, 0x01,
+ 0x05, 0xf2, 0x00, 0xd1, 0xff, 0x2e, 0x7d, 0x1e, 0xe0, 0xc6, 0x12, 0x6f,
+ 0x0c, 0x00, 0x23, 0x00,
+ 0xb1, 0xf5, 0xf0, 0xea, 0xf0, 0x00, 0x22, 0x0d, 0xab, 0x00, 0x02, 0x01,
+ 0x0f, 0x0f, 0x00, 0x1f,
+ 0x30, 0x13, 0xb0, 0xda, 0xed, 0x00, 0x04, 0xf1, 0xc0, 0x90, 0xe1, 0x00,
+ 0x11, 0xef, 0xef, 0x32,
+ 0x70, 0x3b, 0x00, 0xf7, 0x44, 0x7e, 0x2f, 0x11, 0xd4, 0xe1, 0x0f, 0xfa,
+ 0xff, 0x00, 0xf5, 0xd1,
+ 0x00, 0x20, 0x0e, 0xde, 0x0e, 0x50, 0x65, 0x02, 0xf0, 0xec, 0x2e, 0x7d,
+ 0x1f, 0x13, 0xe6, 0xe0,
+ 0xf0, 0x2d, 0x5e, 0x00, 0x00, 0xd5, 0x00, 0xfe, 0x0d, 0xf0, 0xef, 0x0e,
+ 0x60, 0x00, 0xe3, 0xf5,
+ 0xff, 0x0c, 0x00, 0x3f, 0x20, 0x03, 0xd5, 0xdf, 0x8c, 0xd0, 0x02, 0x46,
+ 0x30, 0x0e, 0xec, 0x30,
+ 0x72, 0x02, 0x04, 0xe0, 0xf0, 0x1c, 0x10, 0x13, 0xb0, 0xde, 0x00, 0x12,
+ 0xd6, 0x91, 0x02, 0x30,
+ 0x4b, 0x10, 0x21, 0xf2, 0xd4, 0x10, 0x5d, 0x00, 0xf0, 0xd0, 0xff, 0x0f,
+ 0xe4, 0x05, 0x02, 0xb0,
+ 0xf8, 0x10, 0x7f, 0x00, 0xc3, 0xf0, 0x0d, 0x0d, 0x01, 0xc0, 0x08, 0xee,
+ 0x50, 0x31, 0x01, 0xd0,
+ 0xff, 0xe0, 0x01, 0x02, 0x01, 0xee, 0xee, 0x0d, 0x2b, 0x70, 0x43, 0x03,
+ 0xbd, 0xfa, 0x10, 0x30,
+ 0x00, 0xb2, 0xd3, 0x00, 0xff, 0x1f, 0x15, 0x02, 0xce, 0x0c, 0x14, 0x46,
+ 0x41, 0x10, 0x1d, 0x2f,
+ 0x5f, 0x1f, 0x10, 0x36, 0x42, 0x30, 0x10, 0x12, 0x20, 0xf3, 0x03, 0x13,
+ 0x50, 0xcc, 0xce, 0x20,
+ 0x2e, 0xfc, 0xef, 0xdc, 0x88, 0xca, 0x10, 0x73, 0x01, 0x01, 0xd0, 0x00,
+ 0xec, 0x00, 0x01, 0x00,
+ 0xd0, 0xf2, 0xf0, 0xed, 0xcf, 0xff, 0x0d, 0x0e, 0xd0, 0xb6, 0x03, 0x40,
+ 0x6f, 0x03, 0x17, 0x00,
+ 0x0e, 0x0f, 0x02, 0x66, 0x00, 0xde, 0xe1, 0x00, 0x0d, 0x4d, 0x00, 0x22,
+ 0xe4, 0xb2, 0xf5, 0xf0,
+ 0x0f, 0x6d, 0x0f, 0x0d, 0xe0, 0x03, 0x2d, 0x18, 0x20, 0xf0, 0xd0, 0x00,
+ 0x50, 0x2d, 0x30, 0x24,
+ 0x00, 0xf0, 0xd0, 0x2e, 0x6c, 0x0f, 0x2b, 0xf0, 0xa0, 0x03, 0xde, 0xfc,
+ 0xec, 0xf1, 0xe7, 0x86,
+ 0x00, 0x1d, 0x70, 0x30, 0xff, 0xcf, 0x10, 0x11, 0x00, 0x2e, 0x00, 0x1f,
+ 0x00, 0xc3, 0x02, 0xe0,
+ 0x00, 0xf4, 0xc1, 0xe0, 0x0c, 0x44, 0x07, 0xc1, 0xdd, 0xfa, 0x0e, 0x0f,
+ 0x11, 0x42, 0x62, 0x10,
+ 0x26, 0x01, 0xdf, 0xbf, 0x00, 0x4f, 0x30, 0x04, 0xe3, 0x00, 0x1f, 0x0b,
+ 0xbc, 0xde, 0x00, 0x16,
+ 0xf0, 0xc0, 0xcf, 0xf0, 0x12, 0x34, 0x10, 0x00, 0x00, 0xf1, 0x03, 0x01,
+ 0xbb, 0xcd, 0xff, 0x10,
+ 0x70, 0x3d, 0x0b, 0xef, 0x10, 0x71, 0x13, 0x22, 0x11, 0x20, 0x25, 0x23,
+ 0xf1, 0xb3, 0xe2, 0x0f,
+ 0xfa, 0x00, 0x0d, 0xff, 0xc0, 0xd7, 0xf3, 0x30, 0x60, 0x0b, 0xf0, 0x22,
+ 0x31, 0x4d, 0x2e, 0x10,
+ 0x01, 0x2e, 0x4a, 0x0e, 0xef, 0x1f, 0x0f, 0x80, 0x8f, 0x0d, 0xfa, 0x0e,
+ 0x12, 0x23, 0x00, 0xe1,
+ 0xf0, 0x0f, 0x31, 0xe5, 0xf7, 0x32, 0x10, 0xbb, 0x00, 0x32, 0x32, 0xd1,
+ 0xb2, 0x01, 0x2f, 0x0a,
+ 0x0e, 0xd0, 0xd0, 0xd2, 0xf7, 0x01, 0xd0, 0xaf, 0xbe, 0xaf, 0xdf, 0x00,
+ 0x34, 0x31, 0xfc, 0xcd,
+ 0x10, 0x41, 0x22, 0x0f, 0x0a, 0x50, 0x40, 0x23, 0xe1, 0xbf, 0x0f, 0x03,
+ 0x14, 0x40, 0x04, 0xf4,
+ 0xf1, 0x0f, 0x1f, 0x31, 0x20, 0xca, 0xee, 0x00, 0x61, 0x2e, 0x0d, 0xe1,
+ 0xe7, 0xe1, 0xef, 0xfc,
+ 0x21, 0x45, 0xc1, 0xb0, 0xe1, 0xdf, 0xe9, 0xdf, 0x0e, 0x00, 0x42, 0xf0,
+ 0xcd, 0x2d, 0x70, 0x30,
+ 0xee, 0x01, 0x17, 0x06, 0xad, 0x10, 0x52, 0x02, 0x11, 0x01, 0x02, 0x10,
+ 0x42, 0x10, 0xed, 0xfe,
+ 0x00, 0x02, 0x0e, 0x1d, 0x3f, 0x00, 0xf2, 0xc3, 0xe1, 0x15, 0x2e, 0xa8,
+ 0xfe, 0x02, 0xf2, 0xe6,
+ 0x88, 0x9e, 0x55, 0x00, 0x0f, 0x0f, 0xec, 0x00, 0x55, 0x00, 0xdd, 0x00,
+ 0x02, 0x20, 0xf0, 0xfe,
+ 0x04, 0x10, 0xbc, 0x00, 0x12, 0x34, 0xfe, 0xde, 0xef, 0x11, 0x32, 0x00,
+ 0xca, 0x43, 0x10, 0xad,
+ 0x33, 0x13, 0xa8, 0x00, 0x43, 0xf0, 0xee, 0x11, 0x0f, 0xdd, 0x11, 0x43,
+ 0x0f, 0xed, 0xf0, 0x11,
+ 0x10, 0xfe, 0x03, 0x04, 0x21, 0x00, 0x10, 0x14, 0x02, 0x1f, 0x1d, 0x77,
+ 0x20, 0xab, 0x34, 0x31,
+ 0xdb, 0x00, 0x73, 0xf0, 0xcc, 0x12, 0x12, 0x0f, 0x00, 0xf0, 0xff, 0x00,
+ 0xdd, 0x03, 0xf1, 0xdf,
+ 0x1e, 0x2f, 0x00, 0x0f, 0x41, 0x75, 0x2e, 0xd9, 0xc0, 0x32, 0x24, 0x1f,
+ 0x0d, 0x00, 0xff, 0xae,
+ 0x14, 0x01, 0x0f, 0x20, 0xef, 0xdf, 0x03, 0xf3, 0xce, 0x0f, 0x1f, 0x25,
+ 0x77, 0xae, 0xfb, 0x22,
+ 0x00, 0x31, 0x03, 0xec, 0x00, 0x64, 0xfd, 0xfe, 0x17, 0x20, 0xed, 0xf0,
+ 0x23, 0x10, 0xde, 0x0e,
+ 0x40, 0x35, 0xe0, 0x8d, 0xec, 0x0f, 0x34, 0x32, 0xde, 0x0f, 0x00, 0xff,
+ 0x10, 0x11, 0x11, 0x33,
+ 0xab, 0xed, 0x02, 0x35, 0xf0, 0xde, 0xdd, 0xd0, 0x03, 0x50, 0x0f, 0xbc,
+ 0xf0, 0x05, 0x03, 0x1d,
+ 0xec, 0x11, 0x72, 0x00, 0xf8, 0xbf, 0x23, 0x42, 0x00, 0xdb, 0x00, 0x01,
+ 0x24, 0x0f, 0xff, 0x21,
+ 0x11, 0xf1, 0xdf, 0x30, 0x52, 0x00, 0xfb, 0x20, 0x63, 0xf0, 0xdd, 0xff,
+ 0xf1, 0x13, 0x43, 0x21,
+ 0xf0, 0xe0, 0x0d, 0x01, 0xf7, 0xd6, 0x9d, 0x0f, 0x10, 0xf0, 0x02, 0x2e,
+ 0x4d, 0x73, 0x02, 0xd8,
+ 0xef, 0x30, 0x43, 0x01, 0xff, 0xee, 0xfe, 0x01, 0x55, 0xee, 0xcf, 0x00,
+ 0xef, 0x22, 0x44, 0xff,
+ 0xbc, 0x0f, 0xf0, 0x34, 0x31, 0x30, 0x40, 0xba, 0xef, 0x00, 0x00, 0x15,
+ 0x22, 0xee, 0xed, 0x02,
+ 0xc0, 0xba, 0x11, 0x64, 0x00, 0xed, 0x10, 0x32, 0x00, 0x20, 0xdc, 0x0f,
+ 0x30, 0xe0, 0x9e, 0x00,
+ 0x01, 0x00, 0xec, 0xcd, 0x27, 0x52, 0xf0, 0xbc, 0xfe, 0x02, 0x46, 0x00,
+ 0xff, 0xf0, 0xff, 0xfe,
+ 0x00, 0x73, 0x27, 0xef, 0xcd, 0x00, 0x32, 0x01, 0x00, 0x12, 0x32, 0x00,
+ 0xcb, 0x00, 0x31, 0x00,
+ 0xbe, 0x0f, 0xf0, 0x02, 0x24, 0xf0, 0xdd, 0xde, 0x20, 0x47, 0x11, 0x0d,
+ 0x9c, 0x0e, 0x03, 0x57,
+ 0x00, 0x01, 0xff, 0x0c, 0xfe, 0x0e, 0x03, 0x55, 0x00, 0xfd, 0xe0, 0xe0,
+ 0xe0, 0xe2, 0xe0, 0xef,
+ 0xcf, 0x01, 0x02, 0x12, 0x40, 0xda, 0x0f, 0x52, 0x4d, 0x4c, 0x51, 0x02,
+ 0xf0, 0xea, 0x10, 0x43,
+ 0x34, 0x0f, 0xda, 0xce, 0x00, 0x13, 0x32, 0xf1, 0xc0, 0xdd, 0xde, 0x00,
+ 0x47, 0x00, 0xdf, 0x20,
+ 0x6f, 0x00, 0xf1, 0x00, 0xdf, 0x10, 0x24, 0x22, 0x11, 0x61, 0x10, 0xfa,
+ 0x00, 0x41, 0x45, 0xff,
+ 0xcd, 0x40, 0x31, 0xcd, 0xee, 0x37, 0x63, 0xff, 0xcb, 0xee, 0x01, 0x33,
+ 0x01, 0xee, 0xcf, 0x24,
+ 0x10, 0x0e, 0xbb, 0x12, 0x45, 0xef, 0xcd, 0x0f, 0x22, 0x23, 0xc0, 0xcd,
+ 0xf0, 0x04, 0x00, 0x20,
+ 0xf0, 0xdf, 0xf0, 0x21, 0x47, 0x30, 0x21, 0x40, 0xdf, 0xaa, 0x21, 0x62,
+ 0x02, 0xfe, 0x00, 0x05,
+ 0xdf, 0x0d, 0x31, 0x77, 0x2f, 0xdd, 0xfe, 0x11, 0x33, 0x00, 0x2f, 0x1e,
+ 0xff, 0xd0, 0x01, 0xf0,
+ 0x0f, 0xed, 0xa0, 0x07, 0x06, 0x0f, 0xde, 0xef, 0xa0, 0xff, 0x13, 0x40,
+ 0xfd, 0xcc, 0x00, 0x0f,
+ 0x70, 0x14, 0x00, 0x0e, 0x00, 0xfc, 0xfd, 0x22, 0x47, 0x00, 0xec, 0x00,
+ 0x53, 0x01, 0xe0, 0xe0,
+ 0xe1, 0x00, 0xf2, 0x01, 0x01, 0x33, 0x10, 0x1e, 0x4d, 0x20, 0x25, 0x42,
+ 0x1f, 0x9c, 0xe0, 0xe0,
+ 0x15, 0x24, 0xc0, 0x8b, 0xfe, 0xf1, 0x04, 0x00, 0x00, 0x30, 0x20, 0x0a,
+ 0xee, 0x41, 0x64, 0x10,
+ 0xfc, 0xff, 0x0f, 0x21, 0x22, 0x0f, 0xde, 0xae, 0xf1, 0x07, 0x32, 0xed,
+ 0xad, 0xff, 0x01, 0x30,
+ 0x00, 0x04, 0xd0, 0xed, 0x0d, 0x40, 0x17, 0x53, 0x02, 0xbc, 0x00, 0x00,
+ 0x2e, 0x00, 0x5a, 0x00,
+ 0xa5, 0x16, 0x9f, 0x21, 0x1e, 0x18, 0x8a, 0x21, 0xd2, 0x26, 0x62, 0x01,
+ 0xef, 0xf0, 0xfe, 0xca,
+ 0x0e, 0x30, 0xff, 0x8c, 0xed, 0x0f, 0x73, 0x11, 0x0c, 0x14, 0x54, 0xfb,
+ 0xec, 0x00, 0x01, 0xf0,
+ 0xde, 0x0d, 0x10, 0x73, 0x43, 0x10, 0x10, 0x10, 0x33, 0x57, 0x23, 0x10,
+ 0x10, 0x24, 0x25, 0x13,
+ 0x12, 0xe0, 0xd0, 0x00, 0xcf, 0xcc, 0xef, 0x00, 0x00, 0xec, 0xcc, 0xf0,
+ 0x12, 0x0d, 0xe8, 0x4f,
+ 0x70, 0x20, 0x0f, 0x20, 0x20, 0xc9, 0xde, 0x41, 0x53, 0x00, 0xeb, 0xde,
+ 0x00, 0x32, 0xff, 0x10,
+ 0x20, 0x00, 0xe0, 0x8c, 0x00, 0x04, 0xe1, 0xb0, 0xde, 0xcf, 0xdf, 0xc0,
+ 0xf2, 0xe3, 0xd0, 0xe1,
+ 0xe3, 0xce, 0xf1, 0x07, 0x0f, 0xeb, 0x21, 0x1e, 0xe9, 0x51, 0x10, 0xdd,
+ 0xde, 0xfe, 0x41, 0x0f,
+ 0xa8, 0xf0, 0x00, 0xee, 0xce, 0xef, 0x21, 0x20, 0xdc, 0xbd, 0x01, 0x02,
+ 0x00, 0xe0, 0xe0, 0xf2,
+ 0xe4, 0x90, 0xf3, 0xe3, 0xff, 0xdc, 0x01, 0x07, 0xe1, 0xe0, 0xf2, 0xf1,
+ 0xf1, 0x12, 0x53, 0x34,
+ 0x13, 0xf0, 0xe0, 0x74, 0x56, 0x10, 0x10, 0x10, 0x20, 0x61, 0x3f, 0x3d,
+ 0x60, 0x20, 0x2b, 0x2d,
+ 0x2f, 0x31, 0x2d, 0x09, 0x10, 0x00, 0xdf, 0xc0, 0xd3, 0xb2, 0xdf, 0xbc,
+ 0xef, 0xf4, 0xe3, 0xde,
+ 0xca, 0xee, 0xee, 0xf0, 0xf0, 0xe0, 0xef, 0xcc, 0xdf, 0xf2, 0x07, 0xc0,
+ 0xcf, 0xf0, 0x01, 0xf3,
+ 0xe0, 0x01, 0x24, 0x45, 0x21, 0x30, 0x61, 0x43, 0x44, 0x10, 0x21, 0x23,
+ 0x45, 0x12, 0x12, 0x02,
+ 0xe0, 0xf5, 0x24, 0x43, 0x02, 0xf1, 0xc1, 0xf3, 0x03, 0x01, 0x00, 0xc9,
+ 0xff, 0x0e, 0xca, 0x0f,
+ 0x60, 0x2f, 0x0d, 0xdb, 0x0e, 0x0e, 0xfc, 0x0e, 0x2e, 0x1d, 0x1b, 0x1e,
+ 0x0d, 0x0d, 0x2c, 0x3d,
+ 0x0d, 0xed, 0x1d, 0x7d, 0xea, 0x9e, 0xee, 0xdf, 0xef, 0x00, 0xdf, 0xde,
+ 0xde, 0xf0, 0xd1, 0x92,
+ 0xc2, 0xd0, 0x9d, 0xee, 0xdd, 0xdc, 0xef, 0xf3, 0xc0, 0xdf, 0xe0, 0x00,
+ 0x20, 0x47, 0x12, 0x21,
+ 0x46, 0x32, 0x20, 0x10, 0x2e, 0x30, 0x50, 0x2e, 0x20, 0x20, 0x11, 0x06,
+ 0x45, 0x32, 0x31, 0x55,
+ 0x24, 0x01, 0xd0, 0xcf, 0x02, 0x36, 0xe1, 0xd0, 0xf2, 0xe1, 0xc3, 0x92,
+ 0xe3, 0xe4, 0xd1, 0xb0,
+ 0xf1, 0x25, 0x43, 0x10, 0xe0, 0xf0, 0xf1, 0x02, 0x03, 0x24, 0x25, 0xe1,
+ 0x91, 0x03, 0x57, 0x11,
+ 0x00, 0x00, 0x10, 0x41, 0x23, 0x23, 0x25, 0x01, 0xf0, 0x00, 0x53, 0x46,
+ 0x12, 0x01, 0x02, 0x65,
+ 0x11, 0x11, 0x43, 0x33, 0x23, 0x55, 0x31, 0x32, 0x31, 0x42, 0x32, 0x41,
+ 0x53, 0x34, 0x35, 0x22,
+ 0x20, 0x20, 0x53, 0x34, 0x23, 0x21, 0x20, 0x1f, 0x1e, 0x10, 0x20, 0x0f,
+ 0xea, 0xae, 0xdd, 0xcc,
+ 0xfe, 0x00, 0x11, 0xff, 0xa9, 0xee, 0xe0, 0xef, 0xde, 0xbc, 0xdd, 0xcd,
+ 0xdf, 0xdf, 0xce, 0xee,
+ 0xce, 0xee, 0xe3, 0x07, 0xf3, 0xe0, 0xe0, 0xe0, 0xfe, 0x00, 0x24, 0x0f,
+ 0xea, 0x3d, 0x7d, 0x60,
+ 0x1f, 0x1a, 0x0d, 0x0b, 0x0e, 0x1e, 0x0d, 0x0e, 0x0f, 0xd0, 0xcf, 0xde,
+ 0xbc, 0xff, 0xd0, 0xbf,
+ 0xdd, 0xc0, 0xd0, 0xdf, 0xdf, 0xef, 0xee, 0xda, 0x00, 0x0f, 0x0d, 0x21,
+ 0x77, 0x26, 0x00, 0xcc,
+ 0xff, 0x77, 0x31, 0xef, 0xee, 0x21, 0x63, 0x00, 0x10, 0x20, 0x20, 0x30,
+ 0x20, 0x30, 0x31, 0x20,
+ 0x2f, 0x30, 0x30, 0x0f, 0xfc, 0x9d, 0xee, 0xef, 0xb8, 0xff, 0x03, 0x11,
+ 0xfd, 0xfd, 0xff, 0x03,
+ 0x14, 0x0f, 0xeb, 0xee, 0x21, 0x76, 0x32, 0x00, 0xf1, 0xf2, 0x13, 0x24,
+ 0x01, 0x20, 0x10, 0x20,
+ 0x73, 0x3f, 0x0b, 0x50, 0x42, 0x2f, 0x1c, 0x2e, 0x31, 0x40, 0x2e, 0x1c,
+ 0x1d, 0xfc, 0x10, 0x00,
+ 0xfb, 0xce, 0xde, 0x02, 0x11, 0xce, 0xbb, 0xde, 0xdd, 0x00, 0x03, 0x0f,
+ 0xcb, 0xcd, 0xf0, 0x00,
+ 0x0e, 0xea, 0x0f, 0x70, 0x40, 0x2d, 0x1a, 0x3f, 0x50, 0x2f, 0x3e, 0x1e,
+ 0x1d, 0x1f, 0x0d, 0x00,
+ 0x02, 0xef, 0xdd, 0x05, 0x26, 0x03, 0xc2, 0xd2, 0x03, 0x34, 0x03, 0x05,
+ 0x03, 0x82, 0xb3, 0x07,
+ 0x33, 0x02, 0xf1, 0x03, 0xf3, 0x92, 0xe1, 0x05, 0x44, 0x01, 0xd1, 0x02,
+ 0x44, 0x22, 0x11, 0x43,
+ 0x42, 0x33, 0x45, 0x42, 0x21, 0x11, 0x31, 0x32, 0x43, 0x12, 0x35, 0x32,
+ 0xde, 0xf0, 0x77, 0x33,
+ 0xf0, 0xce, 0x12, 0x22, 0xef, 0x00, 0x03, 0xf0, 0x02, 0x10, 0x0e, 0x20,
+ 0xfe, 0xba, 0x23, 0x22,
+ 0xee, 0x0e, 0x72, 0x20, 0x1c, 0x2f, 0x40, 0x4d, 0xf8, 0x0a, 0x30, 0x10,
+ 0xed, 0xbd, 0x0f, 0x0e,
+ 0xdc, 0xcf, 0xde, 0xad, 0xcb, 0xde, 0xff, 0xef, 0xde, 0xab, 0xee, 0xef,
+ 0xed, 0xff, 0xcd, 0xca,
+ 0xef, 0x00, 0x0f, 0xcd, 0xee, 0xf0, 0x04, 0x11, 0xf0, 0xf0, 0xe0, 0xef,
+ 0xee, 0xed, 0x0f, 0x42,
+ 0x34, 0x10, 0xd8, 0xfe, 0x71, 0x43, 0x20, 0x10, 0x30, 0x30, 0x11, 0x00,
+ 0x74, 0x21, 0x0e, 0xfd,
+ 0xdd, 0xf0, 0xdd, 0xd0, 0xd6, 0x8e, 0xdd, 0xe3, 0xe0, 0xb9, 0xcb, 0xf0,
+ 0xf1, 0xce, 0xdb, 0xdf,
+ 0xef, 0xef, 0xfe, 0xdd, 0xcd, 0x00, 0xff, 0xfe, 0xed, 0xed, 0x1e, 0x30,
+ 0x50, 0x3f, 0x28, 0x0b,
+ 0x3f, 0x50, 0x30, 0x20, 0x0d, 0xfc, 0xed, 0xff, 0xe0, 0xaf, 0xde, 0xcf,
+ 0xde, 0xab, 0xed, 0xf0,
+ 0xfe, 0xec, 0x0e, 0x00, 0x13, 0x0d, 0xfa, 0x20, 0x30, 0x00, 0xde, 0xef,
+ 0x34, 0x52, 0x00, 0x03,
+ 0x47, 0x53, 0x12, 0x0f, 0x3e, 0x50, 0x41, 0x42, 0x40, 0x30, 0x54, 0x21,
+ 0x30, 0x3e, 0x2b, 0x30,
+ 0x35, 0x10, 0x1f, 0x10, 0x12, 0xef, 0x88, 0xde, 0xff, 0xdd, 0xcb, 0xef,
+ 0xe0, 0xe0, 0xd0, 0xc0,
+ 0xe2, 0xd1, 0xd1, 0xd4, 0xd3, 0x91, 0xe4, 0xf4, 0xf3, 0x05, 0xe1, 0xf0,
+ 0x05, 0x44, 0x11, 0x22,
+ 0x53, 0x23, 0x32, 0x22, 0x45, 0x43, 0x21, 0x22, 0x24, 0x02, 0x03, 0x02,
+ 0x02, 0xe2, 0x04, 0x24,
+ 0x12, 0x03, 0x23, 0x02, 0x12, 0x76, 0x73, 0x11, 0x01, 0x02, 0x01, 0xf1,
+ 0x12, 0x1f, 0x0f, 0x00,
+ 0xea, 0xdd, 0x3e, 0x7f, 0x50, 0x1c, 0x2d, 0x3d, 0x3d, 0x3c, 0x2a, 0x3d,
+ 0x4f, 0x60, 0x2f, 0x1b,
+ 0x0d, 0x0d, 0x3e, 0x4e, 0x4e, 0x30, 0x40, 0x2d, 0x2f, 0x20, 0x2f, 0x21,
+ 0x20, 0x10, 0x0f, 0xef,
+ 0xd2, 0xb3, 0xd7, 0xc1, 0xb0, 0xf4, 0xf2, 0xf0, 0xfd, 0x00, 0x47, 0x36,
+ 0x10, 0x1f, 0x4f, 0x4e,
+ 0x2e, 0x3e, 0x31, 0x12, 0x30, 0x0e, 0x0b, 0xf0, 0x02, 0xcd, 0x8a, 0xf0,
+ 0xf1, 0xd0, 0xcc, 0xcd,
+ 0xff, 0x02, 0x01, 0xd0, 0xdf, 0xe0, 0xe7, 0xc1, 0xbf, 0xf0, 0xf5, 0xe2,
+ 0x04, 0xe3, 0xe2, 0xf2,
+ 0xf2, 0x04, 0x33, 0x21, 0x40, 0x41, 0x40, 0x52, 0x30, 0x1e, 0x2a, 0x1c,
+ 0x50, 0x40, 0x1c, 0x1f,
+ 0x31, 0x20, 0x31, 0x21, 0x22, 0x02, 0xef, 0x00, 0x77, 0x00, 0xfd, 0x01,
+ 0x47, 0x33, 0x12, 0xf0,
+ 0x88, 0x00, 0x45, 0x00, 0xcf, 0xf0, 0x00, 0x01, 0x21, 0x00, 0x0e, 0x00,
+ 0x53, 0x23, 0x30, 0x30,
+ 0x50, 0x33, 0x23, 0x2f, 0x1c, 0x2f, 0x43, 0x24, 0x0f, 0x02, 0x27, 0x13,
+ 0xf0, 0x12, 0x64, 0xf0,
+ 0x12, 0x57, 0xee, 0xbc, 0x00, 0x23, 0xf0, 0xef, 0xf0, 0xdf, 0xcf, 0xc0,
+ 0xe0, 0xd0, 0xd3, 0xbf,
+ 0xdc, 0xd0, 0xcf, 0xdb, 0xe0, 0xc0, 0xcd, 0xff, 0xf0, 0xdb, 0xcd, 0xee,
+ 0x12, 0x13, 0x0f, 0xfc,
+ 0xfd, 0xfb, 0x0f, 0x72, 0x0d, 0x08, 0xfd, 0x10, 0x20, 0xec, 0xde, 0xdf,
+ 0xbd, 0xef, 0xce, 0xac,
+ 0xee, 0xcb, 0xe0, 0x02, 0xd0, 0xf0, 0xf0, 0xe0, 0xff, 0x01, 0xf5, 0xf0,
+ 0xde, 0x0f, 0x33, 0x25,
+ 0x00, 0x30, 0x72, 0x62, 0x20, 0x20, 0x41, 0x35, 0x30, 0x30, 0x30, 0x30,
+ 0x64, 0x12, 0x1c, 0x0c,
+ 0x0e, 0xfe, 0x00, 0x0f, 0xdd, 0xfc, 0xc8, 0xee, 0x0e, 0x1f, 0xfc, 0xcb,
+ 0xff, 0x20, 0x41, 0x0f,
+ 0x0e, 0x30, 0x8b, 0xdd, 0x24, 0x57, 0xd0, 0x9c, 0x01, 0x00, 0xf0, 0x01,
+ 0xe0, 0xff, 0x02, 0x01,
+ 0xef, 0x01, 0x13, 0x11, 0x00, 0xf0, 0x24, 0x76, 0x21, 0x20, 0x31, 0x10,
+ 0x0f, 0x20, 0x1f, 0x0d,
+ 0x2f, 0x61, 0x10, 0x01, 0x14, 0x01, 0xc0, 0x04, 0xd0, 0x26, 0x75, 0x01,
+ 0xdf, 0xde, 0x01, 0x23,
+ 0x0e, 0xeb, 0xfd, 0x3f, 0x6f, 0x20, 0x31, 0x30, 0x40, 0x41, 0x1f, 0x0b,
+ 0x0f, 0x41, 0xfd, 0xc8,
+ 0xdd, 0xee, 0xef, 0xab, 0xed, 0xdd, 0xdd, 0xcc, 0xde, 0xdd, 0xbd, 0xed,
+ 0xdf, 0xe0, 0xd0, 0xcf,
+ 0xf0, 0xef, 0xdf, 0xd3, 0xd5, 0xd1, 0xaf, 0xff, 0x07, 0x43, 0x01, 0x10,
+ 0x22, 0x53, 0x47, 0x32,
+ 0x00, 0x10, 0x11, 0x32, 0x01, 0x00, 0x42, 0x44, 0x22, 0x35, 0x43, 0x00,
+ 0x0f, 0xde, 0xdc, 0x00,
+ 0x11, 0xff, 0xff, 0xd0, 0xb0, 0xe0, 0xde, 0xe0, 0x47, 0x23, 0xe1, 0xf2,
+ 0x04, 0x22, 0x02, 0xe1,
+ 0x03, 0x76, 0x72, 0x43, 0x36, 0x43, 0x42, 0x11, 0x10, 0x12, 0x00, 0x00,
+ 0xf0, 0x00, 0x12, 0x04,
+ 0xf2, 0x04, 0xe0, 0xce, 0x01, 0x13, 0x8c, 0xda, 0xf0, 0x01, 0xe0, 0xef,
+ 0xf0, 0x12, 0x12, 0x0f,
+ 0x21, 0x00, 0x32, 0x77, 0xf0, 0xc9, 0x00, 0x41, 0xf0, 0xcc, 0x21, 0x63,
+ 0x00, 0x0d, 0x0f, 0x20,
+ 0x0f, 0x0e, 0x01, 0x35, 0x00, 0xee, 0xfd, 0x30, 0x2f, 0x1e, 0x73, 0x1e,
+ 0x09, 0x0d, 0xcb, 0xdd,
+ 0xee, 0x20, 0x1e, 0xfc, 0xef, 0xdf, 0xe1, 0xc0, 0x8b, 0xbc, 0xe0, 0x03,
+ 0xf0, 0xce, 0xdf, 0xf0,
+ 0xf0, 0xb8, 0xf0, 0x00, 0x00, 0xed, 0x00, 0x11, 0x52, 0x25, 0x11, 0x20,
+ 0x42, 0x20, 0x11, 0x11,
+ 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0e, 0x45, 0x24, 0x11, 0x23, 0x47, 0x43,
+ 0x01, 0xdf, 0xbe, 0x13,
+ 0x25, 0xee, 0xbc, 0xf0, 0xf0, 0xdf, 0x9b, 0xed, 0x00, 0xee, 0xbc, 0x00,
+ 0x02, 0xdd, 0xcd, 0x01,
+ 0x04, 0xe0, 0xde, 0x00, 0x27, 0x23, 0x13, 0x54, 0x22, 0x31, 0x52, 0x77,
+ 0x22, 0x11, 0x20, 0x33,
+ 0x11, 0x10, 0x43, 0x21, 0x10, 0x23, 0x35, 0x31, 0xfe, 0xee, 0x10, 0x2f,
+ 0xdb, 0xdd, 0x10, 0x60,
+ 0x0c, 0xdc, 0x00, 0x31, 0x0f, 0x88, 0x10, 0x33, 0x0f, 0xef, 0x01, 0x10,
+ 0x11, 0x13, 0x24, 0x11,
+ 0x00, 0x01, 0x01, 0x11, 0x35, 0x12, 0xaf, 0xed, 0xf0, 0xff, 0x01, 0xe0,
+ 0x1f, 0x51, 0x0f, 0x03,
+ 0x12, 0xac, 0x06, 0x26, 0xd0, 0x8d, 0xf0, 0x14, 0x00, 0xbd, 0x0f, 0x15,
+ 0x32, 0x0f, 0xfb, 0x0e,
+ 0x71, 0x23, 0x0d, 0x0e, 0x30, 0x10, 0x1f, 0x0e, 0x0d, 0xfc, 0xee, 0x33,
+ 0x22, 0xcc, 0xdc, 0x51,
+ 0x31, 0xf9, 0xac, 0x0e, 0x30, 0xfb, 0xbc, 0xed, 0xfe, 0x10, 0xde, 0xce,
+ 0x00, 0xe0, 0xce, 0x03,
+ 0x16, 0xf0, 0xaf, 0xef, 0x02, 0x02, 0xdd, 0xef, 0x13, 0x35, 0x01, 0x01,
+ 0x34, 0x33, 0x23, 0x02,
+ 0x02, 0x77, 0x53, 0x01, 0x00, 0x03, 0x12, 0x11, 0x45, 0x22, 0xff, 0xdf,
+ 0x01, 0x32, 0x30, 0xf0,
+ 0xd1, 0xe0, 0xe1, 0xd2, 0x24, 0x12, 0x9f, 0xed, 0x00, 0x44, 0x57, 0x00,
+ 0x0f, 0x0e, 0x00, 0x42,
+ 0x11, 0xfc, 0xc9, 0x00, 0x21, 0x9e, 0xdb, 0x10, 0x01, 0x00, 0x0f, 0xed,
+ 0xdc, 0xee, 0x40, 0x72,
+ 0x00, 0x0d, 0x1d, 0x1c, 0x1f, 0x0d, 0xdc, 0xfe, 0x0e, 0xad, 0xc9, 0xee,
+ 0xf0, 0xe0, 0xbc, 0xff,
+ 0x02, 0xe0, 0xdf, 0xde, 0x01, 0x23, 0x00, 0xfb, 0x20, 0x33, 0x00, 0x2f,
+ 0x74, 0x23, 0x11, 0x77,
+ 0x02, 0x0a, 0x12, 0x55, 0x00, 0xfe, 0x01, 0x12, 0xf0, 0x01, 0x33, 0x11,
+ 0xc0, 0x00, 0x34, 0x44,
+ 0xe0, 0x00, 0x45, 0x00, 0xc0, 0xf0, 0x56, 0x21, 0xf0, 0xce, 0x12, 0x44,
+ 0x00, 0x01, 0x11, 0xd0,
+ 0xef, 0x33, 0x01, 0xb0, 0xcb, 0xe0, 0xf0, 0x9c, 0xed, 0x01, 0x14, 0xff,
+ 0xed, 0x21, 0x34, 0x00,
+ 0xdc, 0x1e, 0x73, 0x11, 0x0b, 0xfc, 0x10, 0x00, 0xcb, 0x41, 0x66, 0x00,
+ 0xdd, 0x10, 0x33, 0xff,
+ 0xca, 0x00, 0x41, 0x11, 0xcc, 0xee, 0x10, 0x20, 0xde, 0xcc, 0x21, 0x21,
+ 0xbe, 0xec, 0x12, 0x33,
+ 0xed, 0xdd, 0x00, 0x10, 0x00, 0x0e, 0x20, 0x52, 0xfa, 0xee, 0x51, 0x33,
+ 0xfd, 0xec, 0x32, 0x23,
+ 0xdd, 0x10, 0x10, 0xde, 0x04, 0x02, 0xab, 0x00, 0x00, 0xde, 0x2f, 0x53,
+ 0xee, 0xfa, 0x10, 0x0f,
+ 0x00, 0xfc, 0x30, 0x11, 0x9c, 0xcb, 0xf0, 0x22, 0x00, 0xb0, 0x11, 0x02,
+ 0xe0, 0xe1, 0x16, 0x13,
+ 0x8f, 0xf1, 0x27, 0x01, 0xdf, 0xe0, 0x13, 0x44, 0xff, 0xde, 0x00, 0x11,
+ 0x02, 0x13, 0xed, 0x10,
+ 0x37, 0xe0, 0x31, 0x72, 0x01, 0x13, 0x32, 0x21, 0x01, 0xaf, 0xdd, 0x67,
+ 0x37, 0xef, 0xdf, 0x20,
+ 0x21, 0x10, 0x21, 0x00, 0xbd, 0x11, 0x77, 0x10, 0xee, 0xf0, 0x21, 0x11,
+ 0x00, 0xef, 0x0e, 0x0f,
+ 0x20, 0x20, 0x0e, 0x2d, 0x3f, 0xf9, 0x10, 0x70, 0x0d, 0xb8, 0x10, 0x51,
+ 0x00, 0xed, 0xfe, 0x10,
+ 0x10, 0xef, 0xdd, 0xfe, 0x43, 0x12, 0xdd, 0xba, 0x00, 0x33, 0xff, 0xde,
+ 0x34, 0x00, 0xdf, 0x00,
+ 0xf0, 0x8a, 0xf0, 0x14, 0x00, 0xed, 0xcd, 0xff, 0x00, 0x00, 0x56, 0x11,
+ 0xbb, 0xee, 0x22, 0x12,
+ 0xde, 0xdf, 0xe0, 0x01, 0x13, 0xf0, 0xaf, 0xe0, 0x02, 0x24, 0xf2, 0x06,
+ 0x53, 0x00, 0xef, 0x01,
+ 0x24, 0x01, 0x43, 0x25, 0x01, 0x64, 0x01, 0xef, 0x02, 0x67, 0x01, 0x00,
+ 0x00, 0x01, 0xff, 0x22,
+ 0x33, 0xdd, 0xb9, 0x10, 0x43, 0x00, 0xdd, 0xff, 0x00, 0xef, 0x01, 0x22,
+ 0xef, 0xfe, 0x32, 0x00,
+ 0xcc, 0x21, 0x75, 0x0e, 0x10, 0x34, 0x0f, 0x0e, 0x31, 0x31, 0x65, 0x00,
+ 0xed, 0xeb, 0x63, 0x36,
+ 0xff, 0xac, 0x00, 0x43, 0x00, 0xec, 0xee, 0x32, 0x44, 0x0f, 0xfd, 0xff,
+ 0x10, 0x21, 0x21, 0xfe,
+ 0xec, 0x62, 0x23, 0x0a, 0xff, 0x21, 0x41, 0x10, 0x0f, 0x0f, 0x20, 0x0e,
+ 0xdc, 0x00, 0x66, 0x00,
+ 0xde, 0xf0, 0x13, 0x00, 0xcf, 0xd0, 0x02, 0x01, 0xd0, 0xef, 0xce, 0xd9,
+ 0x63, 0x13, 0xcc, 0x00,
+ 0x21, 0x0f, 0x00, 0x00, 0xed, 0x14, 0xde, 0x88, 0x01, 0x24, 0xe0, 0xbd,
+ 0xf0, 0x00, 0x04, 0x00,
+ 0xff, 0x00, 0x00, 0x12, 0x21, 0x20, 0x0f, 0x10, 0x00, 0xdd, 0x66, 0x44,
+ 0xbd, 0xdb, 0x44, 0x13,
+ 0xef, 0xd0, 0x44, 0x13, 0xcd, 0x00, 0x34, 0x00, 0x0f, 0x32, 0x23, 0x00,
+ 0x0f, 0x52, 0x12, 0xf0,
+ 0xda, 0x32, 0x64, 0xdd, 0xc9, 0x20, 0x64, 0x00, 0xed, 0x10, 0x44, 0x00,
+ 0xfd, 0x00, 0x43, 0x0f,
+ 0xec, 0x10, 0x32, 0xff, 0xee, 0x21, 0x45, 0x00, 0xbe, 0xfe, 0x01, 0x03,
+ 0x01, 0x03, 0xf0, 0x9a,
+ 0x01, 0x25, 0xf0, 0xac, 0x01, 0x24, 0x00, 0xee, 0xef, 0x01, 0x23, 0x12,
+ 0x00, 0xfe, 0xfe, 0x33,
+ 0x67, 0x00, 0xef, 0x00, 0x10, 0x00, 0xcd, 0x0f, 0x57, 0x00, 0xaa, 0x00,
+ 0x33, 0x0f, 0xef, 0x22,
+ 0x31, 0xdd, 0xdd, 0x43, 0x45, 0xff, 0xbc, 0x00, 0x55, 0x00, 0xdd, 0xff,
+ 0x00, 0x00, 0xfd, 0xef,
+ 0x0e, 0x0e, 0xfe, 0xdc, 0xed, 0x1f, 0x2e, 0x98, 0xee, 0x10, 0x1f, 0xed,
+ 0xdc, 0x10, 0x50, 0xfe,
+ 0xdd, 0x0e, 0x10, 0x0e, 0xcb, 0x21, 0x31, 0xcd, 0xcd, 0xff, 0x26, 0x43,
+ 0xf0, 0xce, 0x10, 0x13,
+ 0xef, 0x12, 0x12, 0xcc, 0x23, 0x12, 0xdf, 0xfe, 0xf0, 0xf1, 0xbd, 0xa8,
+ 0x00, 0x23, 0xf0, 0xdc,
+ 0xee, 0x01, 0x45, 0xef, 0xff, 0xff, 0xac, 0xee, 0x21, 0x34, 0x10, 0xde,
+ 0xed, 0x77, 0x43, 0x00,
+ 0xcd, 0x02, 0x45, 0x00, 0xef, 0x11, 0x21, 0xf0, 0xff, 0x00, 0x00, 0x00,
+ 0x92, 0x00, 0xbf, 0x00,
+ 0x91, 0xe8, 0xc5, 0xde, 0x81, 0xe6, 0x2e, 0xdb, 0xdd, 0xce, 0x47, 0x12,
+ 0xe0, 0x43, 0x77, 0xef,
+ 0xcc, 0x21, 0x22, 0xee, 0xbc, 0x10, 0x22, 0xff, 0xbb, 0x10, 0x33, 0x00,
+ 0xbc, 0x0e, 0x12, 0x11,
+ 0xee, 0x00, 0x01, 0xf0, 0x00, 0x03, 0x00, 0xff, 0x02, 0xbb, 0xdc, 0x13,
+ 0x32, 0xff, 0x00, 0x14,
+ 0x76, 0x00, 0xef, 0x23, 0x77, 0x01, 0xee, 0xf0, 0x24, 0xf0, 0xcf, 0x00,
+ 0x02, 0x22, 0x34, 0x00,
+ 0x9d, 0x00, 0x35, 0x10, 0x10, 0x31, 0x32, 0x00, 0x0f, 0x0f, 0x00, 0x33,
+ 0x03, 0xdd, 0xee, 0x37,
+ 0xd1, 0x8e, 0xe0, 0x47, 0x00, 0xce, 0x00, 0x21, 0x12, 0xdf, 0xcd, 0x21,
+ 0x44, 0xff, 0x9a, 0x01,
+ 0x12, 0xff, 0xed, 0x00, 0x12, 0xec, 0xdc, 0x21, 0x21, 0xfe, 0xec, 0x1e,
+ 0x50, 0x00, 0x2c, 0x2f,
+ 0xdd, 0x30, 0x21, 0xbb, 0xf0, 0x21, 0x02, 0x9f, 0xff, 0x00, 0xde, 0xb8,
+ 0xff, 0x34, 0x00, 0xab,
+ 0x00, 0x44, 0x00, 0xf0, 0x0f, 0x12, 0x22, 0x00, 0x00, 0x24, 0x21, 0x21,
+ 0x52, 0x23, 0x00, 0x10,
+ 0x45, 0x33, 0x0f, 0x31, 0x72, 0x0e, 0x0c, 0x21, 0x42, 0x0e, 0x10, 0x2f,
+ 0xf8, 0x0e, 0x20, 0x73,
+ 0x10, 0xf9, 0xee, 0x1f, 0x30, 0xff, 0xfd, 0xfe, 0x0e, 0x20, 0x02, 0xc0,
+ 0xdd, 0xf0, 0xf3, 0xb0,
+ 0xcc, 0xef, 0x47, 0x14, 0xdf, 0xf0, 0x02, 0x11, 0x10, 0x42, 0x33, 0xf0,
+ 0xfe, 0x0e, 0x52, 0x47,
+ 0x00, 0x00, 0x75, 0x22, 0xec, 0xff, 0x65, 0x11, 0xfe, 0xff, 0x11, 0x23,
+ 0x10, 0x0f, 0x11, 0x56,
+ 0x21, 0x00, 0x00, 0x00, 0x23, 0x10, 0x56, 0x22, 0xe0, 0xde, 0x21, 0x64,
+ 0x00, 0xfe, 0xdc, 0x11,
+ 0x75, 0x0e, 0xed, 0x00, 0x10, 0x01, 0x10, 0x1f, 0x0d, 0xed, 0x0f, 0x0f,
+ 0xec, 0xf0, 0x45, 0x44,
+ 0x00, 0x00, 0x00, 0x34, 0x43, 0x00, 0xe0, 0x17, 0x63, 0x01, 0xe0, 0xe1,
+ 0x35, 0x23, 0x02, 0xe1,
+ 0xf2, 0x65, 0x21, 0x01, 0x32, 0x22, 0x00, 0x22, 0x64, 0x11, 0x31, 0x11,
+ 0xff, 0x10, 0x75, 0x32,
+ 0x00, 0x00, 0xb8, 0x00, 0x53, 0x00, 0xbb, 0x00, 0x11, 0x00, 0xee, 0x00,
+ 0x01, 0x00, 0xff, 0xde,
+ 0xf0, 0x01, 0xef, 0xcd, 0x03, 0x13, 0xca, 0xcd, 0x12, 0x33, 0xec, 0xee,
+ 0x44, 0x02, 0xbe, 0xff,
+ 0x11, 0x00, 0xdc, 0xdc, 0x0f, 0xf0, 0x9b, 0xfd, 0x0f, 0xec, 0xec, 0xdc,
+ 0xef, 0x20, 0xff, 0xab,
+ 0x0f, 0x00, 0x00, 0xff, 0xfe, 0x0f, 0x00, 0xff, 0xbc, 0x10, 0x00, 0xed,
+ 0xcd, 0xfe, 0xcc, 0xdc,
+ 0xee, 0xe0, 0xbc, 0xcc, 0xe0, 0x01, 0xdd, 0xa9, 0x00, 0x00, 0xd0, 0xcc,
+ 0x0f, 0x10, 0xff, 0x0e,
+ 0x40, 0x31, 0x0c, 0xcb, 0x30, 0x73, 0x13, 0xfe, 0xeb, 0x10, 0x14, 0xe0,
+ 0xad, 0xfe, 0x00, 0xd0,
+ 0xcd, 0xe0, 0xf2, 0xef, 0xdd, 0xe2, 0x07, 0x02, 0xdf, 0xcd, 0xed, 0x00,
+ 0x20, 0xfe, 0xb8, 0xdd,
+ 0xee, 0xdf, 0x10, 0x22, 0xbc, 0xba, 0xff, 0x00, 0x0f, 0xeb, 0xef, 0x2f,
+ 0x2f, 0x10, 0x30, 0xee,
+ 0xcd, 0xfd, 0xfd, 0xbc, 0xed, 0x1f, 0xfe, 0xaa, 0xcd, 0xfd, 0x00, 0xfe,
+ 0x9b, 0xfc, 0x00, 0x00,
+ 0xef, 0xee, 0xff, 0xff, 0xef, 0xbc, 0xde, 0xe0, 0x00, 0x02, 0xf2, 0xf0,
+ 0x11, 0x45, 0x31, 0x42,
+ 0x55, 0x10, 0x31, 0x42, 0x34, 0x32, 0x21, 0x32, 0x33, 0x42, 0x1f, 0x35,
+ 0x43, 0x00, 0x0e, 0x43,
+ 0x34, 0x0e, 0x0f, 0x22, 0xdc, 0xbe, 0x01, 0x00, 0xb2, 0xd4, 0xe4, 0xf7,
+ 0xc1, 0xc0, 0xe1, 0xd4,
+ 0x04, 0xe3, 0xd0, 0xc0, 0xf1, 0x15, 0x01, 0xf0, 0x23, 0x66, 0x01, 0xf1,
+ 0x00, 0x24, 0x33, 0x03,
+ 0x24, 0x12, 0x01, 0x74, 0x65, 0x12, 0x01, 0x10, 0x54, 0x44, 0x00, 0x00,
+ 0x32, 0x44, 0x11, 0x00,
+ 0x12, 0x46, 0x22, 0x00, 0xf0, 0x01, 0x34, 0x22, 0x00, 0x10, 0x52, 0x10,
+ 0x1f, 0x2f, 0x2f, 0x6f,
+ 0x3d, 0x3e, 0x2c, 0x3c, 0x5e, 0x3e, 0x2d, 0x3e, 0x40, 0x1a, 0x1d, 0x2d,
+ 0x3b, 0x3e, 0x3f, 0x0d,
+ 0xfb, 0xfd, 0x0e, 0xde, 0x9b, 0xe0, 0x00, 0xce, 0xbd, 0xef, 0x00, 0xdf,
+ 0xcb, 0xf0, 0x02, 0xd1,
+ 0xcf, 0xf1, 0xe1, 0xc0, 0x00, 0xf3, 0xf4, 0xf0, 0xef, 0xed, 0x00, 0x2f,
+ 0xfb, 0xcd, 0x00, 0x14,
+ 0x0f, 0xdd, 0x13, 0x76, 0x00, 0x10, 0x42, 0x35, 0x32, 0x42, 0x34, 0x43,
+ 0x54, 0x23, 0x24, 0x36,
+ 0x32, 0x00, 0x00, 0x03, 0x14, 0x42, 0x01, 0x02, 0x04, 0xf1, 0x11, 0x73,
+ 0x54, 0x01, 0x00, 0x31,
+ 0x23, 0x00, 0x10, 0x3f, 0x71, 0x22, 0x1e, 0x0c, 0x10, 0x3e, 0x3e, 0x42,
+ 0x33, 0x42, 0x35, 0x21,
+ 0x21, 0x31, 0x34, 0x47, 0x24, 0x23, 0x32, 0x11, 0x33, 0x75, 0x31, 0x22,
+ 0x77, 0x11, 0x00, 0xfe,
+ 0x01, 0x33, 0x10, 0x00, 0x10, 0x10, 0x00, 0x12, 0x31, 0x32, 0x72, 0x11,
+ 0x10, 0x44, 0x41, 0x1a,
+ 0x0d, 0x40, 0x43, 0x2e, 0x3d, 0x50, 0x20, 0x18, 0x20, 0x42, 0x20, 0x1d,
+ 0x20, 0x22, 0x0d, 0xa8,
+ 0xfe, 0x01, 0xdf, 0xbc, 0xef, 0xe0, 0xef, 0xdd, 0xbc, 0xe0, 0xd2, 0xbe,
+ 0xdb, 0xd0, 0xd0, 0xce,
+ 0xd0, 0xe0, 0xe0, 0xed, 0xef, 0x02, 0xf0, 0x0d, 0xeb, 0x0e, 0x20, 0x1e,
+ 0x0e, 0x77, 0x33, 0x10,
+ 0x1d, 0x43, 0x25, 0x00, 0xbb, 0xef, 0x03, 0x01, 0xbe, 0xf1, 0x05, 0xd0,
+ 0xae, 0xee, 0xf3, 0x05,
+ 0xe0, 0xd0, 0xe1, 0xf1, 0xf1, 0xd0, 0xdf, 0xce, 0xe9, 0x0e, 0x00, 0xe0,
+ 0xef, 0xee, 0x21, 0x77,
+ 0x01, 0xee, 0x00, 0x23, 0x33, 0x0f, 0x0e, 0x70, 0x30, 0x1a, 0x2e, 0x50,
+ 0x3f, 0x3a, 0x3f, 0x5f,
+ 0x30, 0x40, 0x1b, 0x2e, 0x2f, 0x0d, 0xfe, 0x10, 0xff, 0x99, 0xde, 0xee,
+ 0xee, 0xcd, 0xee, 0xe0,
+ 0xdd, 0xdb, 0x0f, 0xf0, 0x00, 0xee, 0xec, 0x00, 0x21, 0x0e, 0xbc, 0x20,
+ 0x64, 0x0f, 0xda, 0xce,
+ 0xff, 0x10, 0x0f, 0x0f, 0x0f, 0xec, 0xcc, 0xfe, 0x00, 0xee, 0xbd, 0xdd,
+ 0xde, 0xcd, 0xcc, 0xd0,
+ 0xb0, 0xc0, 0xcc, 0xd0, 0xe7, 0xe2, 0xc0, 0xe3, 0x04, 0x03, 0xf1, 0xdf,
+ 0xec, 0x33, 0x20, 0x99,
+ 0xed, 0x00, 0x00, 0xfc, 0xfe, 0x20, 0x00, 0x0c, 0xde, 0x0f, 0x6e, 0x0b,
+ 0x0d, 0xfe, 0x0d, 0x0c,
+ 0x2e, 0x0e, 0xcb, 0xfd, 0x1f, 0x40, 0x00, 0xee, 0xae, 0xbd, 0xdf, 0xe2,
+ 0xe3, 0xae, 0xef, 0x03,
+ 0x07, 0x03, 0x04, 0x02, 0x01, 0x03, 0x03, 0x34, 0x22, 0x22, 0x10, 0x0f,
+ 0x63, 0x25, 0x12, 0x24,
+ 0x30, 0x4f, 0x20, 0x0f, 0x12, 0x57, 0x01, 0xce, 0xce, 0x00, 0x11, 0xf1,
+ 0xd2, 0xe4, 0xe1, 0xf5,
+ 0x36, 0x73, 0x22, 0x12, 0x22, 0x55, 0x33, 0x22, 0x00, 0x33, 0x74, 0x22,
+ 0x00, 0x0f, 0x32, 0x55,
+ 0x11, 0x11, 0x03, 0x00, 0xf0, 0xff, 0x10, 0x10, 0xc9, 0xde, 0xfe, 0x00,
+ 0xe0, 0xdd, 0xbb, 0xfe,
+ 0xee, 0x0e, 0x1e, 0x0e, 0xbe, 0xde, 0x01, 0x52, 0xea, 0x9a, 0xf0, 0x00,
+ 0x02, 0xe0, 0xd0, 0xc0,
+ 0xde, 0xce, 0xe0, 0xe0, 0xd0, 0xc0, 0xd2, 0xe3, 0x06, 0x24, 0x00, 0x20,
+ 0x64, 0x21, 0x40, 0x64,
+ 0x34, 0x10, 0x2e, 0x53, 0x35, 0x20, 0x1e, 0x2f, 0x32, 0x35, 0x10, 0x10,
+ 0x31, 0x21, 0x02, 0x04,
+ 0x14, 0xf1, 0xb0, 0x03, 0x17, 0x00, 0xc0, 0x02, 0x34, 0x00, 0xe0, 0x01,
+ 0x12, 0x02, 0xd0, 0xe0,
+ 0x00, 0x02, 0x8f, 0xaa, 0x00, 0x02, 0x00, 0xda, 0xee, 0x00, 0x10, 0x0d,
+ 0xed, 0xdf, 0xcc, 0x0f,
+ 0x70, 0x1f, 0x0b, 0x30, 0x53, 0x1f, 0x0b, 0x00, 0x10, 0x00, 0xee, 0xef,
+ 0xe0, 0xcf, 0xbc, 0xdd,
+ 0xee, 0xd0, 0xe0, 0x89, 0xdc, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x12, 0x02,
+ 0x13, 0x76, 0x22, 0x22,
+ 0x25, 0x43, 0x43, 0x13, 0x11, 0x45, 0x43, 0x22, 0x22, 0x43, 0x20, 0x3e,
+ 0x4e, 0x31, 0x44, 0x2d,
+ 0x0b, 0x20, 0x21, 0x1f, 0x0d, 0xce, 0xe1, 0xd2, 0xa9, 0xdd, 0xde, 0xee,
+ 0xee, 0xdd, 0xcc, 0xed,
+ 0x00, 0x14, 0x01, 0xec, 0xfe, 0x00, 0x00, 0x04, 0x05, 0xf2, 0xd1, 0x03,
+ 0xf3, 0xe4, 0x43, 0x74,
+ 0x02, 0x00, 0x22, 0x73, 0x32, 0x23, 0x10, 0x23, 0x46, 0x10, 0x30, 0x56,
+ 0x02, 0x00, 0x00, 0x02,
+ 0xf2, 0xf0, 0xf0, 0xc0, 0xe0, 0x07, 0x00, 0xee, 0x00, 0x77, 0x42, 0x00,
+ 0x10, 0x61, 0x44, 0x12,
+ 0x0f, 0x0d, 0x1f, 0x51, 0x21, 0x1d, 0x19, 0x20, 0x3f, 0x4f, 0x2d, 0x2d,
+ 0x2e, 0x1d, 0x1c, 0x2d,
+ 0x40, 0x0e, 0xc8, 0xde, 0xee, 0xf0, 0xdf, 0xd0, 0xaf, 0xbd, 0xff, 0x04,
+ 0x01, 0xdd, 0xd0, 0x04,
+ 0x03, 0xf0, 0x02, 0x56, 0x22, 0x12, 0x01, 0x12, 0x42, 0x44, 0x12, 0x12,
+ 0x25, 0x13, 0x01, 0xef,
+ 0x22, 0x74, 0x40, 0x0d, 0x0e, 0x31, 0x2f, 0x2f, 0x33, 0xe8, 0x89, 0xff,
+ 0xf0, 0xe0, 0xbf, 0xef,
+ 0xef, 0xe0, 0xd1, 0xcf, 0xce, 0xf0, 0xf3, 0xd0, 0xe3, 0xf5, 0xc0, 0xde,
+ 0x00, 0x04, 0x12, 0x10,
+ 0x30, 0x66, 0x23, 0x20, 0x50, 0x43, 0x25, 0x20, 0x3d, 0x4d, 0x21, 0x00,
+ 0xfa, 0x00, 0x20, 0x0d,
+ 0xba, 0xff, 0x01, 0xf0, 0xd0, 0xf2, 0x01, 0xc0, 0xef, 0x03, 0x01, 0xce,
+ 0xfe, 0x03, 0xdf, 0x88,
+ 0xdb, 0xf0, 0xf0, 0xc0, 0xbe, 0xff, 0xf0, 0x03, 0xf2, 0xd2, 0xf4, 0xe0,
+ 0xff, 0x21, 0x67, 0x22,
+ 0x20, 0x43, 0x22, 0x22, 0x32, 0x32, 0x00, 0x10, 0x37, 0x43, 0x45, 0x12,
+ 0x11, 0x01, 0x32, 0x75,
+ 0x10, 0x00, 0x00, 0x32, 0x12, 0xff, 0xfe, 0xff, 0xcd, 0xe0, 0xe0, 0x8d,
+ 0xd9, 0xbe, 0xef, 0xde,
+ 0xf0, 0xee, 0xdd, 0xec, 0xec, 0xeb, 0xdd, 0x00, 0xee, 0xeb, 0xfe, 0x3f,
+ 0x2c, 0xfd, 0x0c, 0x0e,
+ 0x0e, 0xed, 0x0d, 0x6e, 0xee, 0xab, 0xee, 0x00, 0xf1, 0x8c, 0xbc, 0xf0,
+ 0xee, 0xdd, 0xce, 0xef,
+ 0xc9, 0xbc, 0xfd, 0xff, 0xef, 0xec, 0xed, 0x0f, 0x00, 0x0f, 0xee, 0x0f,
+ 0xed, 0xfd, 0xff, 0x00,
+ 0x34, 0x55, 0x10, 0x10, 0x43, 0x46, 0x20, 0x30, 0x62, 0x21, 0x10, 0x20,
+ 0x32, 0x20, 0x2e, 0x4f,
+ 0x2d, 0x2e, 0x2e, 0x1c, 0x2f, 0x2d, 0x0b, 0x0e, 0xcc, 0xcb, 0xcb, 0xac,
+ 0xee, 0x00, 0x00, 0xdf,
+ 0xee, 0xef, 0xef, 0xf1, 0x36, 0x11, 0xa0, 0xdf, 0x02, 0x04, 0xf2, 0xb0,
+ 0xf0, 0x15, 0x03, 0x02,
+ 0x13, 0x65, 0x23, 0x22, 0x12, 0x24, 0x53, 0x23, 0x23, 0x26, 0x43, 0x23,
+ 0x01, 0x02, 0x13, 0x13,
+ 0x03, 0x17, 0x42, 0x01, 0xf1, 0x01, 0x63, 0x23, 0x00, 0xf2, 0x46, 0x62,
+ 0x10, 0x00, 0x11, 0x35,
+ 0x20, 0x20, 0x40, 0x31, 0x40, 0x4f, 0x3f, 0x50, 0x2f, 0x2b, 0x2d, 0x3c,
+ 0x3e, 0x3e, 0x3d, 0x2d,
+ 0xf8, 0xcd, 0xee, 0xff, 0xed, 0x9c, 0xee, 0xee, 0xbb, 0xdd, 0xde, 0xef,
+ 0xde, 0xcd, 0xed, 0xdf,
+ 0xef, 0xd0, 0xee, 0xde, 0xe0, 0xf2, 0x03, 0xf0, 0xc0, 0xe2, 0x47, 0x55,
+ 0x00, 0xff, 0x20, 0x23,
+ 0x01, 0x10, 0x50, 0x31, 0x00, 0x01, 0x02, 0xb0, 0xe5, 0xd0, 0xaf, 0xf3,
+ 0xf7, 0xe4, 0xaf, 0xef,
+ 0xe1, 0xf4, 0xe1, 0x04, 0x04, 0xe2, 0xf2, 0x06, 0x12, 0x02, 0x12, 0x12,
+ 0x03, 0x34, 0x74, 0x63,
+ 0x11, 0x21, 0x22, 0x45, 0x32, 0x32, 0x30, 0x11, 0x73, 0x35, 0x10, 0x0f,
+ 0xfe, 0x0f, 0x00, 0x02,
+ 0x00, 0xfd, 0x0c, 0x31, 0x43, 0x0e, 0x1d, 0x4f, 0x2d, 0x1a, 0x40, 0x61,
+ 0x1d, 0x2d, 0x2d, 0x1c,
+ 0x20, 0x3f, 0x0c, 0x01, 0xdf, 0x88, 0xde, 0xef, 0xf0, 0xdd, 0xdd, 0x0f,
+ 0x20, 0x1d, 0x09, 0x2d,
+ 0x7f, 0x50, 0x20, 0x1c, 0x0c, 0x0b, 0x1e, 0x1e, 0x0d, 0xfd, 0x0f, 0xfe,
+ 0xdc, 0xff, 0x30, 0x10,
+ 0xbd, 0xe0, 0x00, 0xce, 0xcc, 0xcc, 0xcf, 0xe1, 0xd2, 0xc0, 0xbb, 0xce,
+ 0xe0, 0xe2, 0xf3, 0xe3,
+ 0xd0, 0xbe, 0xf0, 0xf4, 0x00, 0x12, 0x07, 0x00, 0xed, 0x00, 0x25, 0x02,
+ 0xde, 0xcd, 0xef, 0xf0,
+ 0xe1, 0xc0, 0xac, 0xed, 0x00, 0xf0, 0xf3, 0xff, 0xd9, 0xff, 0xf1, 0xe4,
+ 0xa0, 0xee, 0xe1, 0xd2,
+ 0xb3, 0xc3, 0xf2, 0xf2, 0xe3, 0xe3, 0xbc, 0xe9, 0xf0, 0xf1, 0x03, 0x01,
+ 0x0f, 0x10, 0x27, 0x13,
+ 0x14, 0x35, 0xf0, 0xc0, 0x43, 0x75, 0x21, 0x43, 0x34, 0x43, 0x43, 0x53,
+ 0x23, 0x22, 0x43, 0x47,
+ 0x33, 0x31, 0x21, 0x32, 0x43, 0x42, 0x10, 0x10, 0x34, 0x32, 0x31, 0x10,
+ 0x0c, 0x0f, 0x1e, 0x0e,
+ 0x10, 0x1c, 0x0b, 0x0e, 0x50, 0x51, 0x34, 0x0f, 0x0c, 0x00, 0x3f, 0x1f,
+ 0xfb, 0x0f, 0x0f, 0xfe,
+ 0xec, 0xec, 0xcf, 0xb0, 0xd0, 0x9d, 0xca, 0xdf, 0xee, 0xd0, 0xdd, 0xcd,
+ 0xf0, 0xee, 0xf0, 0xe1,
+ 0xd0, 0xef, 0x01, 0xe7, 0xc3, 0x07, 0x02, 0xf2, 0x81, 0xe1, 0xf2, 0x02,
+ 0xe4, 0x03, 0x02, 0xf2,
+ 0x03, 0x77, 0x56, 0x20, 0x00, 0x20, 0x21, 0x40, 0x20, 0x21, 0x20, 0x10,
+ 0x1e, 0x2e, 0x4d, 0x2d,
+ 0x09, 0xbd, 0xed, 0xeb, 0xff, 0xde, 0xac, 0xcd, 0xed, 0xdd, 0xcb, 0xde,
+ 0xdf, 0xdf, 0xdf, 0xef,
+ 0xae, 0xdb, 0xff, 0x0f, 0xff, 0x00, 0x43, 0x11, 0x00, 0x22, 0x63, 0x25,
+ 0x12, 0x22, 0x33, 0x22,
+ 0x11, 0x35, 0x33, 0x11, 0x20, 0x10, 0x00, 0xe0, 0xd0, 0x00, 0x55, 0x01,
+ 0x00, 0x3e, 0x6d, 0x2a,
+ 0x1e, 0x20, 0x73, 0x1e, 0x0d, 0x0d, 0x20, 0x47, 0x22, 0x00, 0x22, 0x27,
+ 0x12, 0x01, 0x52, 0x52,
+ 0x33, 0x52, 0x11, 0x20, 0x2f, 0x5f, 0x2f, 0x3d, 0x2d, 0x4f, 0x2f, 0x0a,
+ 0x0e, 0xed, 0xce, 0xdc,
+ 0xbd, 0xd9, 0xcd, 0xe0, 0xe0, 0xdc, 0xff, 0xf1, 0xdf, 0xba, 0xee, 0xf1,
+ 0xf0, 0xad, 0xdc, 0xe0,
+ 0xe3, 0xd0, 0xe1, 0xe6, 0xe2, 0xe3, 0x03, 0x03, 0x02, 0x15, 0x74, 0x23,
+ 0x23, 0x65, 0x33, 0x22,
+ 0x33, 0x55, 0x33, 0x24, 0x22, 0x11, 0x11, 0x23, 0x33, 0x13, 0x10, 0x10,
+ 0x21, 0x30, 0x20, 0x40,
+ 0x63, 0x26, 0x42, 0x21, 0x32, 0x44, 0x24, 0x22, 0x24, 0x22, 0x53, 0x13,
+ 0x0e, 0xed, 0x02, 0x05,
+ 0x01, 0xb0, 0xdf, 0xc0, 0xdf, 0xef, 0xef, 0xcc, 0xf2, 0x06, 0xde, 0xbb,
+ 0xff, 0xf0, 0x0f, 0x00,
+ 0x1f, 0x00, 0x0e, 0xeb, 0xfe, 0x0e, 0xfc, 0xff, 0x41, 0xe0, 0x8c, 0x8c,
+ 0xff, 0xf0, 0xef, 0xc9,
+ 0xed, 0xde, 0xde, 0xcd, 0xdd, 0xed, 0xdc, 0xcb, 0xed, 0xed, 0x0e, 0xed,
+ 0xed, 0xee, 0xed, 0xec,
+ 0x0e, 0xf0, 0x9c, 0xcb, 0xef, 0xf0, 0xf1, 0x01, 0xe0, 0xdd, 0xf0, 0x00,
+ 0x10, 0xff, 0xed, 0x22,
+ 0x42, 0x2f, 0x1b, 0xd8, 0xad, 0x1d, 0x4f, 0x10, 0x1d, 0x1a, 0x1e, 0x0e,
+ 0x1e, 0x7e, 0x5e, 0x0b,
+ 0xfc, 0x0e, 0x1f, 0xfe, 0xbb, 0x0f, 0x30, 0x00, 0xde, 0xcd, 0xff, 0xf0,
+ 0x02, 0x00, 0xd0, 0xe0,
+ 0xe2, 0x24, 0x63, 0x14, 0x45, 0x22, 0x21, 0x11, 0xee, 0xbc, 0x00, 0x00,
+ 0xe0, 0xae, 0xed, 0x04,
+ 0xe3, 0xde, 0x05, 0x45, 0x01, 0xe2, 0x04, 0x12, 0xf0, 0xb0, 0x00, 0x02,
+ 0x02, 0x23, 0x02, 0x23,
+ 0x77, 0x73, 0x32, 0x20, 0x34, 0x55, 0x23, 0x33, 0x23, 0x23, 0x32, 0x32,
+ 0x42, 0x10, 0x2d, 0x2c,
+ 0x2a, 0x2e, 0x3f, 0x5f, 0x3d, 0x1d, 0x1c, 0x1e, 0x60, 0x2e, 0x09, 0x0d,
+ 0x0f, 0x20, 0x00, 0xee,
+ 0xbe, 0xdc, 0xef, 0x00, 0x04, 0xc0, 0xbd, 0xdc, 0x00, 0x14, 0x32, 0x44,
+ 0x13, 0x14, 0x25, 0x22,
+ 0x23, 0x74, 0x12, 0x02, 0x02, 0x13, 0x04, 0xf0, 0xc0, 0xf2, 0xf2, 0xb0,
+ 0xdf, 0xd0, 0xb1, 0xdf,
+ 0xcd, 0xd0, 0xd3, 0xb1, 0xd9, 0xcd, 0xce, 0xe2, 0xf2, 0xe0, 0x07, 0xf4,
+ 0xf1, 0x03, 0x14, 0x12,
+ 0x43, 0x77, 0x25, 0x32, 0x22, 0x30, 0x32, 0x32, 0x43, 0x31, 0x05, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x63, 0x09, 0x96, 0x28, 0xec, 0x08, 0x98, 0x27, 0xcb, 0xfc, 0x30, 0x0e,
+ 0x88, 0x9d, 0x17, 0x20,
+ 0xed, 0xdd, 0x44, 0x31, 0xfe, 0xef, 0x44, 0x00, 0x0b, 0x11, 0x61, 0x01,
+ 0xff, 0xe0, 0x12, 0xfd,
+ 0x89, 0x02, 0x15, 0x10, 0xfd, 0xee, 0x01, 0x04, 0x10, 0x1f, 0x20, 0x34,
+ 0x01, 0xee, 0x0f, 0x22,
+ 0x21, 0xbc, 0xec, 0x62, 0x55, 0x00, 0x0c, 0x0f, 0x00, 0x10, 0x20, 0x22,
+ 0x10, 0x40, 0x25, 0x0f,
+ 0xce, 0xfd, 0x24, 0x77, 0x00, 0xdc, 0x00, 0x10, 0x10, 0x21, 0x10, 0x1e,
+ 0x10, 0x2f, 0xee, 0xbf,
+ 0x26, 0x62, 0xf0, 0xdc, 0xf0, 0x22, 0xe0, 0xbd, 0x0e, 0xff, 0x04, 0x01,
+ 0x9d, 0xed, 0xf0, 0xf1,
+ 0x05, 0x22, 0xde, 0xdf, 0xe0, 0xa3, 0x06, 0x00, 0x01, 0xf0, 0xac, 0xff,
+ 0xf0, 0x05, 0xf0, 0xdc,
+ 0xcf, 0xd0, 0xf0, 0xd2, 0xe0, 0xbe, 0x02, 0xd4, 0xae, 0xf1, 0x07, 0xf5,
+ 0xcd, 0xde, 0xd1, 0xe2,
+ 0x00, 0xe0, 0xbc, 0xe0, 0x00, 0x56, 0x00, 0xd0, 0xdd, 0x12, 0x12, 0x00,
+ 0xff, 0xc0, 0xe0, 0xff,
+ 0xcb, 0x12, 0x12, 0xee, 0xad, 0xfe, 0x01, 0x07, 0x21, 0xfd, 0xcf, 0xf0,
+ 0x03, 0x0e, 0x0e, 0xc0,
+ 0xe0, 0xd3, 0x00, 0xd0, 0x2f, 0xd0, 0x8d, 0xa5, 0x07, 0x11, 0xef, 0xed,
+ 0xf0, 0x02, 0x26, 0x01,
+ 0xdd, 0xef, 0xf0, 0xf1, 0xff, 0xda, 0x73, 0xf4, 0xce, 0x30, 0x74, 0x30,
+ 0xce, 0xe9, 0x13, 0x74,
+ 0x00, 0x0d, 0x0d, 0x01, 0x12, 0x00, 0x0c, 0x20, 0x10, 0x0e, 0xee, 0xce,
+ 0x26, 0x33, 0xfe, 0xfd,
+ 0x0f, 0x72, 0x37, 0x22, 0x0d, 0x0c, 0x40, 0x43, 0x42, 0x0c, 0xec, 0x00,
+ 0x40, 0x10, 0x0f, 0xff,
+ 0x00, 0x2c, 0x00, 0x26, 0x30, 0x00, 0x1f, 0x60, 0xf0, 0x0f, 0x20, 0x01,
+ 0xa0, 0xfe, 0x56, 0x22,
+ 0xed, 0xf0, 0x24, 0x0e, 0x1f, 0x23, 0xd1, 0xf0, 0x41, 0x41, 0xf0, 0xca,
+ 0x00, 0x1f, 0x02, 0x14,
+ 0x00, 0xcf, 0xac, 0xff, 0xe2, 0x25, 0x31, 0xdc, 0xbd, 0x00, 0x02, 0xf3,
+ 0x16, 0x40, 0xdc, 0xd0,
+ 0x22, 0x42, 0xce, 0xbd, 0x15, 0x10, 0x22, 0x22, 0xce, 0xdd, 0xe1, 0x36,
+ 0x62, 0x10, 0x0d, 0xce,
+ 0x0d, 0x01, 0x57, 0x02, 0x1c, 0x1f, 0x20, 0x00, 0x10, 0x40, 0x11, 0x0f,
+ 0xfe, 0x0e, 0xed, 0x32,
+ 0x77, 0x4e, 0xa8, 0x00, 0x32, 0x11, 0x0f, 0x0f, 0x00, 0x00, 0x1f, 0x21,
+ 0x33, 0x0e, 0x0d, 0x53,
+ 0x36, 0x30, 0x0e, 0xdd, 0x21, 0x32, 0x01, 0x00, 0x00, 0x0c, 0x40, 0x50,
+ 0x56, 0x00, 0xce, 0x11,
+ 0x43, 0x0d, 0xdd, 0x17, 0x41, 0x0e, 0x0d, 0xe0, 0xd0, 0xee, 0x60, 0x42,
+ 0x00, 0xf0, 0x12, 0x41,
+ 0x40, 0x33, 0x36, 0x62, 0x10, 0x2c, 0x00, 0x20, 0x10, 0x25, 0x21, 0x0d,
+ 0xec, 0x01, 0x03, 0xff,
+ 0xe0, 0x16, 0x60, 0xfe, 0xf0, 0x56, 0x30, 0xcb, 0xde, 0x00, 0x43, 0x12,
+ 0xfe, 0xcb, 0x10, 0x40,
+ 0xf1, 0xe2, 0x12, 0x32, 0xff, 0x88, 0xaf, 0x12, 0x14, 0x0f, 0x00, 0x0f,
+ 0xdf, 0x0f, 0x13, 0x20,
+ 0xec, 0x0e, 0x33, 0x02, 0x90, 0x0e, 0x02, 0x25, 0xde, 0xbc, 0x01, 0x03,
+ 0x03, 0xdc, 0xdc, 0x01,
+ 0x15, 0x0f, 0xcd, 0xcd, 0xce, 0x15, 0x42, 0x00, 0xbc, 0x01, 0xf2, 0xf0,
+ 0x00, 0x54, 0x00, 0x0e,
+ 0x03, 0x11, 0x3a, 0xfe, 0x20, 0x5f, 0x1c, 0x1f, 0x52, 0x12, 0x0c, 0x42,
+ 0x11, 0xfb, 0xdc, 0x11,
+ 0x56, 0x11, 0x10, 0x0f, 0xcc, 0x0f, 0x02, 0x13, 0x1f, 0x00, 0x13, 0x0f,
+ 0xed, 0xe4, 0xb1, 0xed,
+ 0x3f, 0x22, 0x8d, 0xef, 0x37, 0x00, 0xbc, 0xf1, 0x12, 0x01, 0xee, 0xdb,
+ 0x02, 0x25, 0x31, 0x21,
+ 0xce, 0xcd, 0xf2, 0xd2, 0xcf, 0x21, 0x57, 0xce, 0xde, 0x00, 0x00, 0x14,
+ 0xff, 0xcc, 0xe0, 0x12,
+ 0x36, 0xae, 0xde, 0x02, 0x12, 0xdf, 0xdd, 0x01, 0x20, 0x0f, 0x9d, 0x01,
+ 0x12, 0x0c, 0x2f, 0x0f,
+ 0x88, 0xfe, 0x03, 0x35, 0x0f, 0xed, 0xef, 0xf0, 0x12, 0x63, 0x0e, 0xee,
+ 0xd0, 0xf0, 0x25, 0x22,
+ 0xcd, 0xde, 0x14, 0x32, 0xe1, 0xc0, 0x00, 0x24, 0x10, 0x32, 0x76, 0x00,
+ 0xee, 0x52, 0x23, 0x1c,
+ 0x0e, 0x21, 0x20, 0x0a, 0x00, 0x21, 0x20, 0x60, 0x22, 0xd9, 0xae, 0x22,
+ 0x45, 0xfd, 0xdd, 0x32,
+ 0x34, 0xfe, 0xde, 0x0f, 0x10, 0x01, 0x76, 0x10, 0xfc, 0x10, 0x32, 0xf0,
+ 0x10, 0x73, 0x30, 0xfd,
+ 0xde, 0x11, 0x55, 0x11, 0xff, 0xed, 0x01, 0x00, 0x0f, 0xfd, 0xf1, 0x27,
+ 0x32, 0x0f, 0xdc, 0xe0,
+ 0xf2, 0xb0, 0x8a, 0x0e, 0x11, 0x43, 0x0e, 0xfe, 0x00, 0x00, 0x01, 0x03,
+ 0x43, 0x22, 0xba, 0xe0,
+ 0x06, 0x10, 0x0f, 0x10, 0x10, 0xc0, 0xe0, 0x32, 0x02, 0xcf, 0xfe, 0xf0,
+ 0x06, 0x11, 0xfd, 0xcd,
+ 0x74, 0x76, 0x00, 0xea, 0xf0, 0x32, 0x10, 0x0f, 0x00, 0xfe, 0xdf, 0x10,
+ 0x30, 0xf0, 0xdd, 0x10,
+ 0x71, 0x00, 0x22, 0x27, 0x30, 0x70, 0x23, 0x0e, 0x00, 0x31, 0x42, 0x21,
+ 0x00, 0x3f, 0x1e, 0xfa,
+ 0xdd, 0x20, 0x2f, 0xf0, 0x56, 0x70, 0x1c, 0x0f, 0x22, 0x23, 0x2e, 0x5f,
+ 0x30, 0xf9, 0xac, 0x11,
+ 0x25, 0x00, 0x00, 0x0e, 0xef, 0xfe, 0x21, 0x57, 0x1f, 0x0e, 0x1f, 0x11,
+ 0x10, 0x10, 0x32, 0x30,
+ 0x1d, 0x2f, 0x00, 0xf3, 0xc0, 0x8c, 0xe0, 0x06, 0xe1, 0xe0, 0xde, 0x80,
+ 0xd0, 0x02, 0x03, 0x00,
+ 0xc0, 0x04, 0xfc, 0xdd, 0x07, 0x03, 0xef, 0x8c, 0xf0, 0x03, 0x01, 0xd0,
+ 0xf0, 0xf0, 0xee, 0x11,
+ 0x02, 0xae, 0x00, 0x14, 0xfa, 0xff, 0x23, 0x46, 0xee, 0xfc, 0x00, 0x10,
+ 0xf3, 0x00, 0x11, 0xdb,
+ 0xef, 0x21, 0x10, 0xb0, 0x8e, 0xef, 0xf0, 0x27, 0x20, 0xed, 0xd0, 0xdf,
+ 0x02, 0xf0, 0xe0, 0xc1,
+ 0xa2, 0xd2, 0x03, 0xfd, 0xfd, 0x9d, 0xfc, 0x02, 0x17, 0x14, 0x0e, 0xdd,
+ 0xef, 0x00, 0x04, 0x11,
+ 0x03, 0x10, 0xd1, 0xbe, 0xbc, 0x02, 0x07, 0x00, 0x02, 0xb1, 0xca, 0x0f,
+ 0x0f, 0xe1, 0xf3, 0x0f,
+ 0x0c, 0x54, 0x13, 0xcb, 0xcd, 0x52, 0x47, 0x00, 0xfe, 0x10, 0x0f, 0x10,
+ 0x30, 0x31, 0x0d, 0x60,
+ 0x00, 0x0d, 0x0c, 0x41, 0x12, 0x10, 0x1d, 0x21, 0x15, 0x20, 0xee, 0x99,
+ 0x00, 0x31, 0x12, 0xef,
+ 0xce, 0x01, 0x22, 0xff, 0xe0, 0x12, 0xf1, 0x8d, 0xf0, 0x03, 0x05, 0xe4,
+ 0x01, 0xef, 0xde, 0x04,
+ 0x26, 0xae, 0xcd, 0x01, 0x57, 0x0f, 0xee, 0x00, 0xff, 0x00, 0x14, 0xff,
+ 0xbb, 0x00, 0x24, 0x22,
+ 0xde, 0xce, 0xdf, 0xd0, 0x00, 0x02, 0x32, 0x02, 0x9e, 0xea, 0xf0, 0xf2,
+ 0x13, 0x00, 0x1f, 0xff,
+ 0xc0, 0x04, 0xf0, 0x0f, 0x20, 0x11, 0xb0, 0xcb, 0x02, 0x14, 0x00, 0x99,
+ 0x00, 0x00, 0xf0, 0x13,
+ 0x2e, 0x0b, 0x20, 0x42, 0x41, 0x21, 0xee, 0xbb, 0x00, 0x10, 0x52, 0x02,
+ 0xff, 0xeb, 0xf0, 0x11,
+ 0x45, 0x10, 0xfe, 0xe0, 0xf1, 0x10, 0x0e, 0xf0, 0x73, 0x70, 0xfa, 0xd0,
+ 0x10, 0x34, 0x22, 0xcd,
+ 0xeb, 0x32, 0x65, 0x00, 0xdf, 0x0e, 0x20, 0x12, 0x20, 0x10, 0xfe, 0x20,
+ 0x72, 0x0d, 0x09, 0x10,
+ 0x10, 0x32, 0x41, 0x31, 0x0d, 0x2f, 0x32, 0x44, 0x52, 0x20, 0x21, 0x10,
+ 0xfb, 0xed, 0x12, 0x43,
+ 0xdb, 0xde, 0x20, 0x06, 0x8e, 0xcd, 0x00, 0x02, 0xe0, 0xe2, 0x01, 0x30,
+ 0x11, 0xf0, 0x9a, 0x0f,
+ 0x00, 0x21, 0x01, 0xcf, 0xee, 0x00, 0xd0, 0x00, 0x17, 0xd2, 0xf0, 0x20,
+ 0x11, 0x42, 0xee, 0x88,
+ 0x02, 0x45, 0x00, 0xee, 0xe0, 0xec, 0xbd, 0xe0, 0xe6, 0x12, 0xfe, 0x8d,
+ 0xf0, 0xe0, 0x00, 0x14,
+ 0xe0, 0xb0, 0x01, 0x00, 0xfe, 0xcd, 0xf0, 0x06, 0xf0, 0xdb, 0xf2, 0x01,
+ 0x00, 0xbd, 0x00, 0x06,
+ 0x20, 0xf0, 0xbf, 0xed, 0x00, 0x75, 0x00, 0xe0, 0x0f, 0x0f, 0x10, 0x00,
+ 0x02, 0x00, 0x11, 0x00,
+ 0xdc, 0x10, 0x31, 0xef, 0x88, 0x00, 0x02, 0x10, 0xef, 0xe1, 0x00, 0x0f,
+ 0xf1, 0x91, 0xef, 0x26,
+ 0x12, 0xf0, 0xf0, 0x10, 0x10, 0xcc, 0xde, 0x13, 0x77, 0x20, 0x0f, 0xdc,
+ 0x00, 0x21, 0x35, 0x31,
+ 0x10, 0xec, 0x10, 0x76, 0x30, 0xee, 0xe0, 0x0e, 0x10, 0x10, 0xff, 0x02,
+ 0xe2, 0xdf, 0xed, 0x00,
+ 0x10, 0xd2, 0x8c, 0xcf, 0x12, 0x17, 0x42, 0x30, 0xfa, 0x10, 0x51, 0x20,
+ 0x32, 0x50, 0x1e, 0x3e,
+ 0x0e, 0x0d, 0x50, 0x31, 0x10, 0x08, 0x0e, 0x42, 0x76, 0x10, 0x0e, 0x10,
+ 0x2f, 0x20, 0x20, 0x13,
+ 0x0f, 0xe9, 0x20, 0x64, 0xff, 0xdf, 0x10, 0x12, 0x00, 0xce, 0x01, 0x05,
+ 0xdf, 0x00, 0x11, 0x30,
+ 0x2f, 0x52, 0xf2, 0x0e, 0x71, 0x41, 0x0b, 0xee, 0xfc, 0x12, 0x67, 0x00,
+ 0xe0, 0x1d, 0x20, 0x13,
+ 0xf1, 0xcf, 0xff, 0xee, 0x02, 0x65, 0x00, 0x0f, 0x10, 0x0f, 0x0f, 0xf0,
+ 0x41, 0x54, 0x0e, 0xcc,
+ 0x12, 0x35, 0x00, 0xff, 0x00, 0x12, 0x32, 0x10, 0x60, 0x03, 0xf8, 0x0f,
+ 0x60, 0x0e, 0x0f, 0x23,
+ 0x30, 0xf8, 0xff, 0x0f, 0x72, 0x44, 0x0e, 0xfa, 0x00, 0x30, 0x21, 0x51,
+ 0x0f, 0x0e, 0x1f, 0x10,
+ 0x10, 0x1f, 0x34, 0x12, 0x1e, 0x10, 0x27, 0xcf, 0xdc, 0x01, 0x01, 0x23,
+ 0x41, 0xdf, 0x9c, 0xf0,
+ 0x00, 0x34, 0xff, 0xee, 0x25, 0xf0, 0xdd, 0x00, 0x11, 0x31, 0x01, 0x71,
+ 0x71, 0x10, 0x0c, 0xfd,
+ 0x0e, 0x4f, 0x1e, 0x13, 0x12, 0x0b, 0x1e, 0x67, 0x32, 0x12, 0x00, 0x0f,
+ 0x0f, 0x20, 0x73, 0x37,
+ 0xfe, 0xed, 0x01, 0x32, 0x00, 0x0d, 0x00, 0xeb, 0xf0, 0x53, 0x67, 0x11,
+ 0xfd, 0xdd, 0x10, 0xfe,
+ 0xee, 0x24, 0x66, 0xee, 0xce, 0x11, 0x10, 0x01, 0x02, 0x00, 0xea, 0x11,
+ 0x73, 0x00, 0xbd, 0x00,
+ 0x34, 0x10, 0x00, 0x00, 0x00, 0xec, 0x10, 0x25, 0x00, 0xf0, 0xfd, 0x8e,
+ 0xe0, 0xf5, 0x45, 0x00,
+ 0xbc, 0xef, 0x00, 0xf1, 0xf1, 0xef, 0xdc, 0x12, 0x25, 0x00, 0xfe, 0xcf,
+ 0xd0, 0x00, 0x1f, 0x51,
+ 0xf2, 0xc0, 0x11, 0x2e, 0xfa, 0x22, 0x35, 0xce, 0x0f, 0x70, 0x01, 0x00,
+ 0x1e, 0x0d, 0x0f, 0xf0,
+ 0x57, 0x22, 0xec, 0xee, 0x51, 0x23, 0xf0, 0xf0, 0x53, 0x0c, 0xc9, 0x00,
+ 0x22, 0x11, 0xce, 0xf0,
+ 0xf0, 0x00, 0x00, 0xff, 0xd0, 0x43, 0x67, 0x10, 0xff, 0xcd, 0x00, 0x00,
+ 0x34, 0x00, 0xdd, 0x33,
+ 0x22, 0xbc, 0xfd, 0x34, 0x75, 0xff, 0xfe, 0x00, 0x04, 0x23, 0x00, 0xeb,
+ 0x9d, 0x01, 0x04, 0xf1,
+ 0xd0, 0xf0, 0xdd, 0xbd, 0x04, 0xf3, 0xe2, 0xed, 0x0d, 0x0f, 0xfd, 0x35,
+ 0x47, 0xf0, 0xdd, 0x2e,
+ 0x50, 0x11, 0xef, 0xab, 0x00, 0x13, 0x20, 0x00, 0xd0, 0xab, 0x00, 0x0f,
+ 0x00, 0x23, 0x02, 0xee,
+ 0x19, 0x0f, 0x11, 0x03, 0xf0, 0x8c, 0x00, 0x04, 0xf0, 0xf0, 0xd0, 0xf0,
+ 0x00, 0x02, 0x03, 0xde,
+ 0x98, 0x31, 0x44, 0x0f, 0x30, 0x53, 0xed, 0x0d, 0x00, 0x20, 0x11, 0xde,
+ 0xde, 0x24, 0x20, 0x43,
+ 0x10, 0x98, 0x0e, 0x03, 0x12, 0xff, 0xff, 0x32, 0x1f, 0xec, 0xc0, 0x04,
+ 0xf1, 0xe0, 0x0f, 0x99,
+ 0xc0, 0xf1, 0xe3, 0xe0, 0xdd, 0xc2, 0xf5, 0xe0, 0xe0, 0x00, 0x90, 0x04,
+ 0x11, 0x1e, 0xdf, 0x00,
+ 0x00, 0x12, 0xf0, 0xf1, 0x0c, 0xfc, 0x00, 0xb0, 0xbd, 0xeb, 0x05, 0x00,
+ 0xac, 0x00, 0xec, 0x8f,
+ 0x02, 0x07, 0x20, 0xbe, 0xff, 0x03, 0x02, 0xfe, 0xd0, 0x01, 0xe2, 0xf0,
+ 0xef, 0xf2, 0xf4, 0xfd,
+ 0x00, 0x67, 0x03, 0xda, 0xf0, 0x02, 0x21, 0xf0, 0xcd, 0xe0, 0xae, 0x0f,
+ 0x25, 0x21, 0xac, 0xff,
+ 0x12, 0x42, 0x1f, 0x2d, 0x10, 0x2f, 0x30, 0x62, 0x03, 0x1f, 0x2f, 0x46,
+ 0x2f, 0x1e, 0x30, 0x0f,
+ 0x13, 0x47, 0x33, 0x1b, 0x0e, 0x3f, 0x50, 0x0f, 0x2f, 0x30, 0x0f, 0x4f,
+ 0x62, 0x10, 0x09, 0x31,
+ 0x65, 0x10, 0x0c, 0x1f, 0x21, 0x20, 0x20, 0x0d, 0x0c, 0x31, 0x54, 0x31,
+ 0x1f, 0x0a, 0x00, 0x0f,
+ 0x00, 0x23, 0x43, 0x00, 0xdb, 0x00, 0x9f, 0x02, 0x35, 0xde, 0x8d, 0x0f,
+ 0xf1, 0x06, 0x00, 0xfe,
+ 0xc0, 0xef, 0x13, 0x23, 0x9b, 0xee, 0xe2, 0x02, 0x02, 0x25, 0x01, 0xac,
+ 0xee, 0xf0, 0x03, 0x14,
+ 0xff, 0xed, 0xf0, 0xe0, 0x01, 0xf0, 0x0f, 0x03, 0xf0, 0xfb, 0x22, 0xe3,
+ 0xbd, 0x0e, 0x50, 0x00,
+ 0x9b, 0x00, 0x02, 0xff, 0xcb, 0x00, 0xf1, 0xef, 0xf0, 0x13, 0xdc, 0xbd,
+ 0xf1, 0x27, 0xdf, 0xbd,
+ 0xff, 0xe0, 0xe0, 0xf1, 0xd5, 0xbd, 0xf0, 0x07, 0x03, 0xde, 0xfe, 0x00,
+ 0xdf, 0x05, 0x13, 0xf0,
+ 0x9a, 0x21, 0x01, 0xcf, 0xcd, 0x01, 0x26, 0xc0, 0xef, 0x30, 0xff, 0x8f,
+ 0xdf, 0x14, 0x22, 0x11,
+ 0xf0, 0xdd, 0xfd, 0xcf, 0x00, 0xe0, 0x14, 0x6f, 0x0e, 0x0f, 0xff, 0x0f,
+ 0x57, 0x34, 0xfc, 0x0d,
+ 0x21, 0x54, 0x1f, 0x2f, 0x41, 0x0e, 0x1f, 0x20, 0x2d, 0x0b, 0xff, 0x72,
+ 0x22, 0x0e, 0xfd, 0x11,
+ 0x21, 0x2e, 0x0e, 0xe0, 0xdf, 0x04, 0x17, 0xb0, 0xac, 0xf0, 0xe1, 0xe0,
+ 0xf3, 0x17, 0xe3, 0xbc,
+ 0x1f, 0x12, 0x03, 0x01, 0x30, 0x40, 0x12, 0x77, 0x12, 0xfc, 0x0f, 0x42,
+ 0x02, 0x0d, 0x0e, 0x00,
+ 0x10, 0x0f, 0xfe, 0xc0, 0xf1, 0x1f, 0x1d, 0xbc, 0xbc, 0x03, 0x17, 0x35,
+ 0x0e, 0xde, 0xff, 0x11,
+ 0x00, 0xc0, 0x00, 0x21, 0xea, 0xaf, 0x33, 0x56, 0xde, 0x0f, 0x42, 0x00,
+ 0xf1, 0x00, 0x23, 0x10,
+ 0xd9, 0x00, 0x10, 0x72, 0x73, 0x10, 0x0a, 0xf0, 0x1f, 0x20, 0x52, 0x01,
+ 0x0d, 0x0c, 0x42, 0x33,
+ 0xfd, 0xeb, 0x11, 0x32, 0x00, 0x2f, 0x4f, 0x0f, 0xf0, 0x00, 0x31, 0x45,
+ 0x31, 0x1f, 0xc8, 0xcf,
+ 0x10, 0x75, 0x10, 0x00, 0xfe, 0x00, 0x01, 0x41, 0x1e, 0x20, 0x41, 0x23,
+ 0x2f, 0x0a, 0x01, 0x20,
+ 0x3e, 0x4f, 0x32, 0x54, 0x0e, 0xcb, 0x00, 0x21, 0x11, 0x55, 0xff, 0xbc,
+ 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0xf0, 0xde, 0x01, 0x13, 0xee, 0xcd, 0x55, 0x13, 0xfe, 0xcc, 0xf0,
+ 0xf0, 0xf0, 0xd0, 0xdf,
+ 0xf1, 0x67, 0x13, 0xfd, 0xef, 0x00, 0x22, 0x01, 0x32, 0x10, 0x08, 0xef,
+ 0x50, 0x00, 0x8d, 0xdf,
+ 0x23, 0x13, 0x23, 0x0e, 0x98, 0xe0, 0x00, 0x25, 0x11, 0xf0, 0xce, 0xef,
+ 0xd0, 0xe0, 0xb0, 0xdf,
+ 0xe0, 0xcf, 0xe0, 0xf4, 0xbf, 0xec, 0xd0, 0x07, 0x33, 0xb0, 0xbc, 0xf0,
+ 0x00, 0x12, 0xf0, 0x04,
+ 0xef, 0xeb, 0xc0, 0xff, 0xf0, 0xef, 0x02, 0xe3, 0xae, 0x11, 0x35, 0xfe,
+ 0xcf, 0x00, 0x21, 0x37,
+ 0x00, 0x9c, 0x0f, 0x00, 0x33, 0x00, 0xfb, 0x00, 0xf3, 0xff, 0x40, 0x52,
+ 0xfd, 0xcb, 0x11, 0x32,
+ 0x00, 0x0f, 0x0e, 0xfd, 0x9c, 0x03, 0x27, 0x31, 0xdf, 0xac, 0x00, 0x02,
+ 0x56, 0x00, 0x0f, 0xee,
+ 0x20, 0x12, 0x11, 0x34, 0x30, 0xfd, 0xfd, 0x02, 0x00, 0x00, 0x53, 0xee,
+ 0x89, 0xf0, 0x02, 0x12,
+ 0x02, 0xff, 0xcc, 0x01, 0x04, 0x43, 0x0e, 0xca, 0x00, 0x12, 0x10, 0x00,
+ 0x0e, 0xce, 0x0e, 0x75,
+ 0x22, 0x20, 0x0c, 0x0f, 0x00, 0x21, 0x52, 0x20, 0x0c, 0x2e, 0x1d, 0x2e,
+ 0x02, 0x10, 0x0d, 0x29,
+ 0xff, 0x00, 0x02, 0xfe, 0x61, 0x36, 0x30, 0x0f, 0xca, 0xf0, 0x22, 0x11,
+ 0xde, 0xf0, 0x10, 0x01,
+ 0xf0, 0x8c, 0xb0, 0x00, 0x27, 0x32, 0xe1, 0xbd, 0x20, 0x45, 0x01, 0x0f,
+ 0x0d, 0xe0, 0xff, 0x11,
+ 0x41, 0x31, 0x11, 0xe0, 0x11, 0x11, 0x01, 0x37, 0xce, 0xde, 0x01, 0x02,
+ 0x74, 0x20, 0x0a, 0xf0,
+ 0x60, 0x43, 0x00, 0xca, 0xf0, 0x33, 0x20, 0xdc, 0xe1, 0x24, 0x11, 0x0e,
+ 0x7f, 0x34, 0x00, 0x0f,
+ 0x2f, 0x30, 0x4d, 0x4f, 0x3f, 0x30, 0x10, 0x0a, 0x2f, 0x40, 0x05, 0x05,
+ 0x19, 0x00, 0x1d, 0x00,
+ 0x02, 0x12, 0x60, 0x11, 0xdc, 0x10, 0xef, 0x10, 0x77, 0x00, 0x00, 0xff,
+ 0xc0, 0xea, 0x0e, 0x11,
+ 0x12, 0xdc, 0xeb, 0xf0, 0xce, 0xce, 0x4f, 0x70, 0x0d, 0xdd, 0x02, 0x01,
+ 0x0b, 0x0e, 0x03, 0x03,
+ 0xad, 0xfd, 0x27, 0xf0, 0xaf, 0xfd, 0x03, 0x16, 0x10, 0xfb, 0xe0, 0x20,
+ 0x62, 0x11, 0x10, 0x44,
+ 0x00, 0xfe, 0x0f, 0x10, 0x00, 0x1d, 0x63, 0x13, 0x0d, 0x0d, 0x21, 0x55,
+ 0x10, 0x12, 0x37, 0x33,
+ 0x31, 0x0d, 0xec, 0x11, 0x77, 0x11, 0x0f, 0x00, 0xe0, 0xf0, 0x23, 0x00,
+ 0x01, 0x14, 0x01, 0x32,
+ 0x72, 0x76, 0x22, 0xff, 0xfd, 0x33, 0x46, 0x00, 0xdf, 0xcd, 0x00, 0x45,
+ 0x23, 0xf0, 0xbf, 0xff,
+ 0x00, 0x47, 0x21, 0xe0, 0xf0, 0x42, 0x33, 0x01, 0xe3, 0x12, 0xfe, 0x99,
+ 0xf0, 0x23, 0x44, 0x01,
+ 0xdf, 0xfd, 0x0f, 0x02, 0x16, 0x11, 0xe0, 0xa0, 0x00, 0x01, 0xe0, 0xe0,
+ 0x02, 0x66, 0x00, 0xbd,
+ 0x00, 0xe2, 0x0f, 0xe0, 0xf0, 0xf1, 0x02, 0xfe, 0xff, 0xef, 0x02, 0x77,
+ 0x17, 0x10, 0xee, 0xcd,
+ 0xff, 0x20, 0x33, 0xf0, 0xe0, 0x10, 0x0d, 0xfd, 0xfe, 0x53, 0x16, 0x00,
+ 0x1e, 0xde, 0xbb, 0x01,
+ 0x31, 0xde, 0xdb, 0xef, 0xce, 0xee, 0x0e, 0x70, 0x22, 0x0f, 0xcc, 0xdf,
+ 0xcd, 0xeb, 0x0b, 0x70,
+ 0x32, 0xdc, 0xbe, 0x22, 0x1f, 0xd8, 0x00, 0x00, 0xff, 0xbe, 0x00, 0x02,
+ 0xee, 0xbb, 0xe0, 0xef,
+ 0xe0, 0x31, 0x23, 0xce, 0xac, 0xf0, 0x0f, 0xff, 0xed, 0xdf, 0x02, 0xd1,
+ 0x01, 0x10, 0xbc, 0xd0,
+ 0xe1, 0xf0, 0x47, 0x42, 0xdd, 0xdc, 0x32, 0x75, 0x20, 0xeb, 0x00, 0x10,
+ 0x0e, 0xbc, 0x00, 0x00,
+ 0x30, 0x22, 0xdf, 0x9a, 0x00, 0x31, 0x00, 0x0f, 0xf0, 0xfd, 0xfe, 0xfe,
+ 0xfc, 0xeb, 0xee, 0x10,
+ 0x30, 0x0b, 0x60, 0x30, 0x1f, 0x5e, 0x20, 0x31, 0x35, 0x20, 0x00, 0xed,
+ 0xbc, 0xed, 0xde, 0xf0,
+ 0x36, 0xdf, 0x8b, 0xdf, 0xef, 0x0f, 0x00, 0xf0, 0xe0, 0xce, 0xca, 0xfe,
+ 0xde, 0x10, 0x72, 0x0d,
+ 0xd9, 0xdf, 0x00, 0xff, 0xf0, 0xce, 0xbf, 0xfe, 0x22, 0x54, 0xee, 0xca,
+ 0x20, 0x34, 0x00, 0x10,
+ 0x00, 0xbc, 0xf0, 0x11, 0x53, 0x00, 0xde, 0xee, 0x01, 0x04, 0x46, 0x00,
+ 0xbb, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0xbe, 0xfd, 0xff, 0x0e, 0x01, 0x02, 0xf0, 0x33, 0xf2, 0xaf,
+ 0xf2, 0xd1, 0xe6, 0x25,
+ 0x12, 0xd0, 0xc2, 0x04, 0x01, 0xd0, 0xbf, 0x13, 0x45, 0x23, 0xd0, 0xde,
+ 0x76, 0x23, 0x03, 0x00,
+ 0x04, 0x20, 0x00, 0x33, 0x53, 0x01, 0x03, 0x34, 0x42, 0xce, 0xee, 0x33,
+ 0x47, 0x30, 0x75, 0x11,
+ 0x00, 0x01, 0x33, 0x51, 0x22, 0x13, 0x22, 0x12, 0x23, 0x45, 0x31, 0x10,
+ 0x10, 0x0e, 0x10, 0x57,
+ 0x32, 0x51, 0x00, 0x22, 0x05, 0x20, 0x30, 0x22, 0x20, 0xcd, 0xed, 0x00,
+ 0x34, 0x3e, 0x98, 0xde,
+ 0x0f, 0x20, 0x23, 0xfe, 0xcf, 0x0e, 0x0d, 0xfc, 0x00, 0x0e, 0x8a, 0xdf,
+ 0x00, 0xfe, 0xde, 0xce,
+ 0xff, 0xda, 0xbe, 0x10, 0x25, 0x00, 0xbd, 0x00, 0xce, 0xde, 0xef, 0x00,
+ 0x01, 0x01, 0xad, 0xfe,
+ 0xeb, 0xcd, 0x00, 0x01, 0xdf, 0xbf, 0xf3, 0xfd, 0xf1, 0x07, 0xd3, 0xdd,
+ 0xc8, 0xee, 0xe0, 0x12,
+ 0x44, 0xdd, 0xab, 0x00, 0xf2, 0x12, 0x20, 0xcc, 0xdd, 0x01, 0x55, 0x21,
+ 0x00, 0xf0, 0xed, 0xde,
+ 0xfe, 0xe0, 0x11, 0x32, 0xc0, 0x9a, 0xee, 0xff, 0xf0, 0x0d, 0x51, 0x13,
+ 0xef, 0xca, 0x11, 0x34,
+ 0x00, 0xff, 0xe0, 0x0e, 0x20, 0x77, 0x00, 0xbd, 0xfe, 0x25, 0x34, 0x00,
+ 0xfc, 0xd0, 0x01, 0x11,
+ 0x43, 0x21, 0xf0, 0xde, 0x00, 0x45, 0x41, 0x00, 0x20, 0x11, 0x05, 0xf0,
+ 0x1f, 0x61, 0x43, 0x11,
+ 0x00, 0x20, 0x55, 0x12, 0x30, 0x31, 0x0f, 0x1d, 0x75, 0x33, 0x00, 0x00,
+ 0x0c, 0x2d, 0xff, 0xee,
+ 0xfe, 0x1e, 0x63, 0x37, 0xe0, 0xa8, 0xff, 0x00, 0x10, 0x31, 0x10, 0xcd,
+ 0x0e, 0x0f, 0x1e, 0x2f,
+ 0x11, 0x00, 0xfc, 0x10, 0x50, 0x0c, 0xde, 0x21, 0x65, 0x00, 0x0d, 0xee,
+ 0x00, 0x10, 0x00, 0xef,
+ 0xcb, 0xd0, 0x00, 0xb3, 0xdb, 0x0e, 0x70, 0x10, 0xf0, 0xef, 0xcc, 0xef,
+ 0x26, 0x30, 0xff, 0xdf,
+ 0x20, 0x00, 0xd0, 0x23, 0x12, 0x89, 0x8d, 0x02, 0x14, 0x00, 0x10, 0xf4,
+ 0xee, 0x00, 0x67, 0x26,
+ 0x0f, 0xdf, 0x20, 0x22, 0x31, 0x11, 0x12, 0xf1, 0x12, 0x21, 0x00, 0x01,
+ 0x21, 0x75, 0x22, 0x42,
+ 0x01, 0x00, 0x20, 0x11, 0x40, 0x33, 0x67, 0x11, 0xfe, 0xfe, 0x40, 0x34,
+ 0x00, 0x1e, 0x20, 0x44,
+ 0x22, 0x31, 0xfd, 0xea, 0x42, 0x54, 0x10, 0x20, 0x0e, 0x0f, 0x03, 0x22,
+ 0x30, 0x0d, 0xb0, 0xf1,
+ 0xfc, 0xfa, 0x61, 0x21, 0x03, 0x12, 0x0e, 0x08, 0x40, 0x51, 0x0f, 0xff,
+ 0x00, 0x30, 0x44, 0x01,
+ 0xdd, 0xed, 0xc0, 0x0f, 0x43, 0x25, 0x01, 0xbf, 0xfe, 0x25, 0x73, 0x00,
+ 0x0e, 0x04, 0x00, 0xea,
+ 0x00, 0xf3, 0x03, 0x3e, 0x21, 0x77, 0x13, 0xde, 0xfe, 0x13, 0x32, 0x34,
+ 0x31, 0xf0, 0x99, 0x00,
+ 0x20, 0xe0, 0xcc, 0x32, 0x42, 0xd0, 0xbc, 0x01, 0x14, 0x00, 0xfe, 0xe0,
+ 0x00, 0x02, 0x02, 0xef,
+ 0x89, 0x00, 0x00, 0x22, 0xf1, 0xb0, 0x00, 0x01, 0x0e, 0xef, 0xe3, 0xe5,
+ 0xe1, 0xcf, 0x00, 0xe4,
+ 0xce, 0xbb, 0xf0, 0xf0, 0xe3, 0x00, 0xef, 0xde, 0xf0, 0xff, 0xfe, 0x04,
+ 0xf2, 0xe0, 0xde, 0x2d,
+ 0x75, 0xff, 0xbb, 0x10, 0x44, 0x1f, 0x08, 0x1f, 0x20, 0xf1, 0xde, 0x30,
+ 0x72, 0xec, 0xbd, 0xfd,
+ 0xec, 0xfd, 0x12, 0x00, 0x8b, 0xfc, 0xed, 0x0f, 0x03, 0x0e, 0xd8, 0xce,
+ 0x10, 0x32, 0x00, 0xed,
+ 0x0e, 0xef, 0x0f, 0xbd, 0x0f, 0xf0, 0xe0, 0xfd, 0xc8, 0xef, 0xd0, 0x02,
+ 0xef, 0xfe, 0x40, 0x01,
+ 0x9c, 0x00, 0x12, 0xee, 0x01, 0x26, 0x0f, 0xdd, 0x02, 0x46, 0xd0, 0x9e,
+ 0x11, 0x24, 0xb0, 0xbd,
+ 0x01, 0x25, 0x02, 0x00, 0x00, 0xec, 0x23, 0x64, 0x12, 0x1d, 0x10, 0x32,
+ 0x41, 0x20, 0x0f, 0xfc,
+ 0xff, 0x23, 0x55, 0x0e, 0xe9, 0x00, 0x32, 0x00, 0x0f, 0x30, 0x73, 0xee,
+ 0xba, 0x00, 0x22, 0x11,
+ 0xfe, 0xec, 0xf0, 0x20, 0x50, 0x33, 0x00, 0xeb, 0xe0, 0x52, 0x20, 0xdb,
+ 0x12, 0x75, 0x10, 0xed,
+ 0xf0, 0x22, 0x21, 0x0f, 0xdf, 0x20, 0x43, 0x47, 0x21, 0xdd, 0xfe, 0x21,
+ 0x51, 0x00, 0xfc, 0x12,
+ 0x61, 0x32, 0x20, 0xfe, 0xef, 0x20, 0x64, 0x01, 0x24, 0x10, 0xee, 0xff,
+ 0x14, 0x21, 0x27, 0xf1,
+ 0xcf, 0xed, 0x35, 0x75, 0x02, 0xef, 0xe0, 0x30, 0x44, 0xf0, 0xd2, 0x00,
+ 0x00, 0x10, 0x57, 0x11,
+ 0xe0, 0xff, 0x22, 0x20, 0x20, 0x61, 0x10, 0x10, 0x12, 0xee, 0xc8, 0x00,
+ 0x50, 0xf3, 0x9d, 0x00,
+ 0x23, 0x01, 0xb1, 0x00, 0xf2, 0x0f, 0x05, 0x17, 0x02, 0xf0, 0xdf, 0xe0,
+ 0xe0, 0x01, 0x67, 0xf1,
+ 0xcf, 0x1e, 0x10, 0xf1, 0xe1, 0x22, 0x41, 0x03, 0xd1, 0xff, 0xdb, 0xf0,
+ 0x62, 0x54, 0x10, 0xfb,
+ 0xd0, 0xfe, 0x32, 0x52, 0x0f, 0x0e, 0x10, 0x0e, 0xfe, 0x75, 0x33, 0x10,
+ 0x20, 0x21, 0x37, 0x00,
+ 0x00, 0x10, 0xfd, 0xce, 0x53, 0x37, 0x04, 0xbe, 0xed, 0x10, 0x43, 0x10,
+ 0x10, 0x23, 0x00, 0x10,
+ 0x12, 0x44, 0x41, 0x0c, 0xb9, 0x00, 0x63, 0x02, 0x0d, 0x0d, 0x00, 0x10,
+ 0x1f, 0x01, 0x26, 0x0f,
+ 0xfb, 0xd0, 0x20, 0x22, 0xcd, 0xe0, 0xf0, 0xd0, 0xb0, 0xee, 0xf0, 0x01,
+ 0xf3, 0xb1, 0xad, 0xd8,
+ 0xdd, 0x10, 0x54, 0xf0, 0xbc, 0x00, 0x00, 0xee, 0xec, 0xff, 0xcd, 0xf0,
+ 0x04, 0xe0, 0xcb, 0xff,
+ 0x10, 0x20, 0x14, 0x33, 0x01, 0xdc, 0xfd, 0x70, 0x56, 0x00, 0xfb, 0x00,
+ 0x00, 0x21, 0x00, 0x0f,
+ 0x21, 0x23, 0x22, 0x02, 0xad, 0xdd, 0xec, 0x42, 0x37, 0xf0, 0x9c, 0x0e,
+ 0x00, 0x0f, 0x0f, 0x0f,
+ 0xfb, 0xf0, 0x34, 0x10, 0xef, 0xcc, 0xff, 0x0f, 0x72, 0x22, 0x0f, 0xde,
+ 0xfd, 0xf0, 0x0e, 0x0f,
+ 0x02, 0xd0, 0xab, 0x00, 0xd0, 0xb8, 0x02, 0x46, 0x00, 0xc1, 0xef, 0xf0,
+ 0xe1, 0xe1, 0x01, 0x01,
+ 0x03, 0xf2, 0xa0, 0xf1, 0x04, 0x00, 0x02, 0x17, 0x00, 0xc0, 0xe0, 0x01,
+ 0x75, 0x41, 0x01, 0x0f,
+ 0x00, 0x0f, 0x01, 0x02, 0xde, 0x0b, 0x31, 0x03, 0x11, 0x3f, 0x73, 0x34,
+ 0xfc, 0x0b, 0x30, 0x1f,
+ 0x0f, 0x10, 0x21, 0x0a, 0x9c, 0x0f, 0xce, 0xdd, 0x0f, 0x40, 0xfe, 0xca,
+ 0xdf, 0xce, 0xd0, 0x52,
+ 0x01, 0xbb, 0xde, 0xef, 0xec, 0xff, 0x10, 0x21, 0xcd, 0xb8, 0x0f, 0x30,
+ 0x21, 0xff, 0xde, 0xde,
+ 0xef, 0x1f, 0x1e, 0x8b, 0xde, 0x0f, 0x30, 0x0c, 0x8d, 0xf0, 0xff, 0x0e,
+ 0xfc, 0x00, 0x01, 0xfa,
+ 0xcd, 0x00, 0x20, 0x14, 0x0f, 0xfd, 0x9b, 0xf0, 0x00, 0x12, 0x00, 0xdc,
+ 0xef, 0xef, 0x00, 0xde,
+ 0xe0, 0xfc, 0x0e, 0xcd, 0xae, 0xff, 0xfb, 0x10, 0x1f, 0xdc, 0x00, 0x20,
+ 0x0f, 0xcd, 0x0a, 0x51,
+ 0x12, 0xbe, 0xec, 0x12, 0x56, 0x0f, 0xae, 0x00, 0x04, 0x11, 0xf0, 0xdc,
+ 0x02, 0x15, 0x12, 0x00,
+ 0xbf, 0x01, 0x04, 0x21, 0x11, 0xe0, 0x32, 0x75, 0x13, 0x11, 0x00, 0x20,
+ 0x53, 0x13, 0x22, 0x45,
+ 0x23, 0x10, 0x11, 0x31, 0x54, 0x22, 0xf0, 0xff, 0x25, 0x77, 0x12, 0x00,
+ 0x00, 0x12, 0x22, 0x33,
+ 0x42, 0x11, 0x00, 0xf0, 0x13, 0x43, 0x13, 0x00, 0x0c, 0xfd, 0x17, 0x77,
+ 0x72, 0x00, 0x0f, 0x00,
+ 0x01, 0x02, 0x22, 0x10, 0xfe, 0xee, 0xf0, 0x14, 0x20, 0xee, 0xfd, 0x63,
+ 0x21, 0xd8, 0xef, 0x43,
+ 0x54, 0x0f, 0xed, 0x00, 0xf0, 0x01, 0x03, 0xdf, 0xf0, 0xbd, 0xed, 0x17,
+ 0x23, 0x8d, 0xdc, 0x01,
+ 0xf3, 0xf0, 0x00, 0xf2, 0xd2, 0xbc, 0xff, 0x03, 0x03, 0xd1, 0xbe, 0xff,
+ 0xe4, 0xf7, 0xd2, 0xcd,
+ 0xdd, 0x00, 0xf3, 0xe1, 0xf1, 0x47, 0x67, 0xdf, 0xcc, 0xe0, 0x42, 0x35,
+ 0xf0, 0xce, 0x0f, 0xbf,
+ 0x00, 0x03, 0x21, 0xdd, 0xde, 0x14, 0x11, 0xfe, 0xcd, 0x11, 0x32, 0x00,
+ 0xce, 0xec, 0xd9, 0xef,
+ 0x0f, 0x50, 0x00, 0xfa, 0xd0, 0x11, 0x0f, 0xdd, 0x2f, 0x74, 0x70, 0xfd,
+ 0xef, 0x10, 0x20, 0x2e,
+ 0x1f, 0x20, 0xd9, 0xe0, 0x42, 0x10, 0xf9, 0x00, 0x40, 0x02, 0xe0, 0x50,
+ 0xe0, 0x8c, 0x00, 0x01,
+ 0x23, 0xee, 0xdc, 0x00, 0x00, 0x02, 0x31, 0xfb, 0x9a, 0x00, 0x52, 0x11,
+ 0x1f, 0x1d, 0x00, 0x53,
+ 0x25, 0x0e, 0x2f, 0x2f, 0x0e, 0x0d, 0xea, 0xff, 0x41, 0x12, 0xee, 0xbb,
+ 0xef, 0xed, 0x10, 0x73,
+ 0x00, 0xff, 0xed, 0x1e, 0x0e, 0x2f, 0x0d, 0xd8, 0x0f, 0x10, 0x1f, 0xef,
+ 0xde, 0xfe, 0x0f, 0x72,
+ 0x04, 0xfe, 0xdd, 0xee, 0x11, 0x66, 0xee, 0xcc, 0x00, 0x32, 0x21, 0x00,
+ 0x00, 0x11, 0x32, 0x23,
+ 0xd0, 0xa0, 0x0d, 0x1d, 0x57, 0x07, 0x00, 0x0f, 0x70, 0x14, 0xf0, 0xdd,
+ 0x10, 0x31, 0x27, 0x01,
+ 0x00, 0x12, 0x22, 0x02, 0x64, 0x56, 0x32, 0x12, 0xf0, 0xe1, 0x11, 0x76,
+ 0x21, 0x42, 0x11, 0x11,
+ 0x32, 0x22, 0x53, 0x11, 0x45, 0x54, 0x21, 0x01, 0x10, 0x0f, 0x44, 0x46,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x21, 0x41, 0x11, 0x23, 0x13, 0xee, 0xbd, 0x14, 0x67, 0x00,
+ 0xff, 0xff, 0xf0, 0x13,
+ 0x00, 0x00, 0x21, 0xf0, 0x01, 0x35, 0x1f, 0x0f, 0x22, 0xf0, 0x0c, 0xdf,
+ 0x74, 0x45, 0xfd, 0x0d,
+ 0x11, 0x64, 0x0f, 0xda, 0x00, 0x23, 0x40, 0xef, 0xcb, 0xf0, 0xf0, 0x52,
+ 0x00, 0xba, 0x00, 0x02,
+ 0x41, 0xe0, 0x0e, 0x13, 0x22, 0x0f, 0xad, 0xed, 0xf0, 0x17, 0x32, 0x00,
+ 0xfe, 0x00, 0x02, 0x01,
+ 0xc0, 0x00, 0x61, 0x1f, 0x0d, 0xf3, 0x26, 0x30, 0xfb, 0xce, 0x0f, 0x20,
+ 0x0f, 0xab, 0xe0, 0x00,
+ 0x43, 0xfe, 0xcb, 0xce, 0x01, 0x06, 0x00, 0x8f, 0xfd, 0x01, 0x13, 0xf0,
+ 0xca, 0x00, 0x01, 0x21,
+ 0xf0, 0xe0, 0xdf, 0xfe, 0x14, 0x01, 0x8c, 0xca, 0x00, 0x00, 0x20, 0xf0,
+ 0xd0, 0xee, 0xfd, 0xff,
+ 0x2f, 0x1f, 0x1f, 0xee, 0xcc, 0x1e, 0x5e, 0x0f, 0x20, 0xfb, 0x0c, 0x40,
+ 0x12, 0xff, 0xb8, 0xdd,
+ 0xef, 0x41, 0x00, 0x9b, 0xff, 0x00, 0xee, 0xee, 0x0e, 0xcd, 0xff, 0x00,
+ 0xe0, 0xea, 0x21, 0x11,
+ 0xae, 0xda, 0x0f, 0x0e, 0x20, 0x20, 0x10, 0x1e, 0x3f, 0xfb, 0x00, 0x11,
+ 0xd0, 0xee, 0x50, 0x52,
+ 0xfd, 0xf1, 0x37, 0x02, 0x8e, 0xfd, 0x03, 0x04, 0xdd, 0xe0, 0x17, 0x01,
+ 0x80, 0xdf, 0x02, 0x03,
+ 0x15, 0x53, 0xf3, 0xe0, 0xf1, 0xf2, 0x23, 0x42, 0xe0, 0xc0, 0x01, 0x37,
+ 0x24, 0x10, 0x52, 0x33,
+ 0x02, 0x21, 0x65, 0x23, 0x23, 0x00, 0x01, 0x11, 0x16, 0x21, 0xf0, 0xef,
+ 0x31, 0x74, 0x22, 0x12,
+ 0x11, 0x11, 0x20, 0x62, 0x27, 0x02, 0xfc, 0x11, 0x23, 0x00, 0xde, 0x0e,
+ 0xee, 0x13, 0x22, 0x1f,
+ 0x00, 0x35, 0x30, 0x0b, 0x71, 0x73, 0x0e, 0xfc, 0x10, 0x44, 0x42, 0x0d,
+ 0xf8, 0xef, 0x30, 0x53,
+ 0x00, 0x0f, 0x0d, 0xff, 0x00, 0x35, 0x00, 0xfd, 0xfd, 0xec, 0xc0, 0x30,
+ 0x33, 0xdc, 0xef, 0x9c,
+ 0xcc, 0xd0, 0xe0, 0xc1, 0x00, 0xe9, 0xaf, 0xf0, 0x04, 0x00, 0xd0, 0xee,
+ 0x11, 0x31, 0x00, 0x20,
+ 0x00, 0xbf, 0xea, 0x0f, 0x0f, 0x0e, 0xb0, 0x03, 0xfe, 0xfc, 0x52, 0x20,
+ 0x0a, 0xcf, 0x00, 0x10,
+ 0x50, 0xfc, 0x9a, 0x0f, 0xfe, 0x0e, 0xdf, 0xee, 0x00, 0xff, 0x9d, 0x00,
+ 0xe0, 0x04, 0x05, 0x00,
+ 0x9b, 0x00, 0xef, 0x00, 0x01, 0xe0, 0x01, 0x22, 0xdf, 0xdb, 0x00, 0x34,
+ 0x62, 0x12, 0x03, 0xfe,
+ 0xeb, 0x20, 0x74, 0x35, 0x00, 0x0d, 0x10, 0x33, 0x00, 0xfd, 0x10, 0x25,
+ 0xff, 0x00, 0x73, 0x02,
+ 0x01, 0x45, 0x21, 0x32, 0x23, 0x00, 0x33, 0x23, 0xf0, 0x2e, 0x72, 0x13,
+ 0x2f, 0x26, 0x32, 0x10,
+ 0x33, 0x42, 0x65, 0x37, 0x14, 0x0e, 0x0e, 0x40, 0x75, 0x00, 0xed, 0x10,
+ 0x42, 0x22, 0xfd, 0xec,
+ 0x02, 0x31, 0x10, 0x20, 0x01, 0xe1, 0xae, 0xf0, 0x0f, 0xff, 0xff, 0x04,
+ 0x04, 0xbe, 0xed, 0x02,
+ 0xf6, 0xe0, 0xcd, 0xe1, 0xe7, 0xd0, 0x8e, 0xdf, 0x03, 0x07, 0x0f, 0xce,
+ 0xd0, 0x03, 0xe2, 0x0f,
+ 0x00, 0xd1, 0xd0, 0x01, 0x36, 0xd0, 0xbc, 0x31, 0x43, 0xc3, 0xef, 0x01,
+ 0xe1, 0xef, 0xdf, 0x14,
+ 0x34, 0xb0, 0xe0, 0xc0, 0xee, 0xe0, 0xcd, 0xb9, 0x12, 0x46, 0xd0, 0xde,
+ 0x1f, 0x00, 0xc0, 0xfc,
+ 0xee, 0xdf, 0xf4, 0x30, 0xc9, 0x8c, 0xde, 0x72, 0x12, 0x0e, 0xdc, 0x00,
+ 0x0d, 0x10, 0x20, 0x00,
+ 0xfc, 0x0d, 0x00, 0xfd, 0xdd, 0xdb, 0x00, 0x71, 0x22, 0xdb, 0xcd, 0xdd,
+ 0xf0, 0x01, 0x03, 0xf0,
+ 0x9c, 0xe0, 0xe3, 0xf4, 0x13, 0x0b, 0xcd, 0x22, 0x05, 0xde, 0x9c, 0xff,
+ 0x11, 0x32, 0x1f, 0xd9,
+ 0xd0, 0x30, 0x61, 0x35, 0x10, 0x0f, 0x0e, 0x63, 0x01, 0xfe, 0xed, 0xfd,
+ 0xfe, 0x11, 0x21, 0xfa,
+ 0xdd, 0x30, 0x1f, 0xee, 0xaa, 0x0f, 0xf0, 0x01, 0x60, 0x10, 0xca, 0xac,
+ 0x0e, 0x11, 0x20, 0xde,
+ 0xdd, 0x0f, 0x0d, 0x0f, 0x1f, 0x2f, 0x1d, 0x0f, 0x04, 0x10, 0xf9, 0xde,
+ 0x20, 0x11, 0x00, 0x2e,
+ 0xcd, 0xce, 0xed, 0xed, 0xef, 0x32, 0x0b, 0xcb, 0x30, 0x0f, 0xec, 0x4e,
+ 0x60, 0xde, 0xaa, 0x00,
+ 0xfe, 0xff, 0xed, 0x12, 0xf2, 0xac, 0xfd, 0xed, 0xe0, 0x07, 0x42, 0xff,
+ 0xdf, 0xf2, 0x14, 0x30,
+ 0xf0, 0xaf, 0x0f, 0x01, 0x24, 0x02, 0x00, 0x0e, 0x02, 0x01, 0x00, 0x00,
+ 0x60, 0x00, 0x84, 0x00,
+ 0xc6, 0xfb, 0x6c, 0x06, 0x24, 0xfb, 0x6c, 0x05, 0x23, 0x55, 0x33, 0x31,
+ 0x32, 0x33, 0x33, 0x24,
+ 0x23, 0x12, 0xf0, 0xbe, 0xdf, 0xf2, 0xe5, 0xc0, 0xe2, 0xe2, 0xd3, 0xd6,
+ 0x14, 0x64, 0x24, 0x22,
+ 0x32, 0x41, 0x11, 0x42, 0x73, 0x22, 0x20, 0x20, 0x20, 0x1f, 0x31, 0x31,
+ 0x2d, 0x1f, 0x21, 0x66,
+ 0x55, 0x21, 0x1f, 0x1e, 0x2d, 0x3d, 0x08, 0xeb, 0xde, 0x0f, 0x0e, 0x9c,
+ 0xde, 0xdd, 0xdd, 0xf0,
+ 0x10, 0x10, 0x00, 0x10, 0x41, 0x10, 0x0e, 0xde, 0xee, 0x10, 0x0f, 0x9b,
+ 0xec, 0xed, 0x00, 0x23,
+ 0x45, 0x31, 0x21, 0x44, 0x76, 0x32, 0x30, 0x00, 0x0c, 0xdc, 0xee, 0xfe,
+ 0xee, 0xba, 0xfe, 0x0f,
+ 0xad, 0xbd, 0xdd, 0xef, 0xce, 0xec, 0xde, 0xcd, 0xed, 0xe0, 0xf0, 0xdf,
+ 0xba, 0xdd, 0xff, 0xee,
+ 0xfe, 0xdf, 0xe0, 0xd0, 0xd1, 0xc1, 0xc2, 0xd0, 0xd4, 0xe7, 0xc2, 0xb0,
+ 0xe2, 0xe2, 0xf1, 0xde,
+ 0xcb, 0x00, 0x00, 0x00, 0x02, 0xf2, 0x03, 0x25, 0x76, 0x22, 0x01, 0x00,
+ 0x13, 0x77, 0x42, 0x11,
+ 0x11, 0x10, 0x10, 0x2f, 0x3f, 0x31, 0x54, 0x21, 0x10, 0x20, 0x30, 0x1f,
+ 0x2f, 0x73, 0x36, 0x2f,
+ 0x0c, 0x2e, 0x3d, 0x2c, 0x0c, 0x0e, 0x0e, 0xed, 0xbd, 0xce, 0xdd, 0xea,
+ 0xde, 0x00, 0xe5, 0xa0,
+ 0xef, 0xdc, 0x0c, 0x2e, 0x3e, 0x3e, 0x3f, 0x20, 0xee, 0xbf, 0xf3, 0x27,
+ 0x64, 0x13, 0xe2, 0xb3,
+ 0xf5, 0x03, 0x02, 0x02, 0x32, 0x74, 0x42, 0x32, 0x31, 0x21, 0x21, 0x22,
+ 0x52, 0x43, 0x44, 0x21,
+ 0x10, 0x00, 0x21, 0x13, 0x00, 0xf2, 0xd0, 0xcc, 0xeb, 0xff, 0x0e, 0x09,
+ 0x0e, 0x1e, 0x0b, 0xbd,
+ 0xdd, 0x0f, 0x00, 0xad, 0xcc, 0xce, 0xef, 0xbd, 0xda, 0xde, 0xdd, 0xde,
+ 0xdc, 0xcb, 0xee, 0x0e,
+ 0x00, 0x0d, 0xee, 0xee, 0xee, 0xff, 0xef, 0xdf, 0xce, 0xdc, 0x00, 0x56,
+ 0x12, 0x00, 0x02, 0x03,
+ 0x03, 0x03, 0x77, 0x54, 0x12, 0x01, 0x02, 0x01, 0x02, 0xe1, 0x02, 0x13,
+ 0x01, 0x01, 0x41, 0x30,
+ 0x1e, 0x3d, 0x70, 0x52, 0x20, 0x1b, 0x20, 0x65, 0x35, 0x31, 0x52, 0x13,
+ 0x25, 0x23, 0x33, 0x53,
+ 0x35, 0x32, 0x20, 0x2e, 0x1e, 0x1f, 0x00, 0x14, 0x14, 0x00, 0xff, 0xef,
+ 0x00, 0x43, 0x14, 0xf2,
+ 0xe2, 0xe2, 0xdf, 0xef, 0xff, 0xb9, 0xcd, 0xcd, 0xae, 0xcd, 0xcb, 0xcb,
+ 0xdd, 0xdf, 0xde, 0xca,
+ 0xdd, 0xef, 0xff, 0xdd, 0xdc, 0xfe, 0x0f, 0x2f, 0x3e, 0x1e, 0x3d, 0x4e,
+ 0x40, 0x33, 0x36, 0x52,
+ 0x45, 0x33, 0x33, 0x11, 0x00, 0xf0, 0x00, 0x03, 0x01, 0xd0, 0xab, 0xcd,
+ 0xdd, 0xde, 0xdc, 0xcc,
+ 0xde, 0xdf, 0xc1, 0xd7, 0xd2, 0xe2, 0xf2, 0x34, 0x51, 0x31, 0x32, 0x64,
+ 0x35, 0x33, 0x33, 0x33,
+ 0x22, 0x42, 0x55, 0x22, 0x00, 0x00, 0x12, 0x23, 0x01, 0xfe, 0xfe, 0x2f,
+ 0x40, 0x0e, 0xcc, 0xcb,
+ 0xdd, 0xcc, 0xcf, 0xd0, 0xc0, 0xe0, 0xd2, 0xe3, 0xd0, 0xbe, 0xdb, 0xbe,
+ 0xe2, 0xf5, 0xf5, 0xe2,
+ 0x02, 0x02, 0x01, 0xe1, 0xd3, 0xd6, 0xc3, 0xc3, 0xc1, 0xd0, 0xdf, 0xed,
+ 0x09, 0x0e, 0x0d, 0x0d,
+ 0x0c, 0x2d, 0x2b, 0x2e, 0x1b, 0xfd, 0x2d, 0x7d, 0x5e, 0x0d, 0x3f, 0x7e,
+ 0x3d, 0x4b, 0x2d, 0x3c,
+ 0x3d, 0x3d, 0x4d, 0x1c, 0x0b, 0xee, 0xcd, 0xde, 0xaf, 0xde, 0xdf, 0xe0,
+ 0xe1, 0xe1, 0x11, 0x44,
+ 0x53, 0x31, 0x21, 0x31, 0x43, 0x11, 0x10, 0x0f, 0x03, 0xe7, 0xa0, 0xd1,
+ 0xc3, 0xd5, 0xc0, 0xe2,
+ 0xf1, 0xf0, 0x0b, 0x0f, 0x40, 0x2e, 0x3d, 0x1f, 0x22, 0x11, 0x27, 0x04,
+ 0x36, 0xf2, 0xa1, 0x03,
+ 0xc2, 0x27, 0x22, 0xf2, 0x03, 0xe2, 0xb2, 0xf1, 0x01, 0x74, 0x64, 0x00,
+ 0x00, 0xfd, 0xcb, 0xcd,
+ 0x23, 0x77, 0x12, 0x00, 0x00, 0x00, 0xf0, 0x11, 0x31, 0x33, 0x44, 0x00,
+ 0x10, 0x42, 0x67, 0x23,
+ 0x00, 0xec, 0xbb, 0xff, 0x65, 0x22, 0xee, 0xed, 0x00, 0xed, 0xfe, 0x00,
+ 0x10, 0xfe, 0x0f, 0x45,
+ 0x11, 0xed, 0xcc, 0x00, 0x00, 0xed, 0x0f, 0x00, 0xd0, 0xee, 0x35, 0x53,
+ 0xe0, 0xaa, 0xf0, 0x32,
+ 0x77, 0x11, 0xf0, 0xee, 0xef, 0x11, 0x32, 0x00, 0xbc, 0x00, 0x67, 0x11,
+ 0xee, 0xee, 0x0f, 0x00,
+ 0x00, 0xff, 0x0f, 0x00, 0x0f, 0xff, 0x43, 0x45, 0x00, 0xcb, 0xef, 0x32,
+ 0x42, 0xee, 0xde, 0x20,
+ 0x22, 0x43, 0x56, 0x00, 0xff, 0x00, 0xee, 0x00, 0x45, 0x00, 0xf0, 0xbc,
+ 0xff, 0x44, 0x11, 0xff,
+ 0x01, 0x43, 0x00, 0xdd, 0xb9, 0xef, 0x43, 0x24, 0x00, 0xdf, 0xde, 0xde,
+ 0x00, 0x13, 0xdf, 0xdf,
+ 0x22, 0xf0, 0x11, 0x44, 0xfe, 0xcc, 0xa9, 0xde, 0x32, 0x76, 0x00, 0xff,
+ 0x10, 0x01, 0xff, 0xde,
+ 0xff, 0x01, 0x33, 0x12, 0xed, 0xef, 0x22, 0x65, 0x11, 0xfd, 0x88, 0xed,
+ 0x00, 0x32, 0x00, 0xee,
+ 0x0f, 0x00, 0x11, 0x21, 0xfd, 0xdb, 0xf0, 0x0f, 0x21, 0xce, 0xff, 0x44,
+ 0xbb, 0xee, 0x43, 0x00,
+ 0xaa, 0x11, 0x45, 0x00, 0xde, 0xed, 0xff, 0x43, 0x12, 0x00, 0x22, 0x10,
+ 0xcc, 0x0f, 0x23, 0xee,
+ 0xed, 0x57, 0x22, 0x11, 0x33, 0x01, 0x00, 0x00, 0xef, 0x23, 0x77, 0x43,
+ 0xff, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0xcc, 0xff, 0x12, 0x00, 0xcd, 0x98, 0xed, 0x45, 0x22, 0xdd,
+ 0xdd, 0x00, 0xff, 0x00,
+ 0x22, 0x10, 0x10, 0x00, 0xaa, 0x0f, 0x21, 0x22, 0xee, 0x20, 0x65, 0x00,
+ 0xed, 0x0f, 0x33, 0x22,
+ 0x0e, 0x11, 0x22, 0xfe, 0xf0, 0x66, 0x00, 0x9a, 0xfe, 0x24, 0x43, 0xee,
+ 0xee, 0x11, 0x12, 0x0f,
+ 0x00, 0x10, 0x00, 0x46, 0x21, 0x00, 0x11, 0x00, 0xce, 0x22, 0x67, 0x00,
+ 0xff, 0xef, 0xff, 0x10,
+ 0x22, 0x10, 0xf0, 0xfe, 0xfe, 0xff, 0x00, 0x1f, 0x64, 0x34, 0xfe, 0xdc,
+ 0x0f, 0x11, 0x34, 0x43,
+ 0x02, 0xad, 0xdb, 0x03, 0x11, 0xd0, 0x23, 0x33, 0x35, 0xf0, 0x89, 0xe0,
+ 0x43, 0x00, 0xcc, 0xf0,
+ 0x10, 0x22, 0x00, 0xee, 0xef, 0x11, 0x01, 0xdd, 0x00, 0x77, 0x12, 0x00,
+ 0xe0, 0xde, 0xee, 0x22,
+ 0x55, 0xdd, 0xbc, 0x12, 0x11, 0xfe, 0xcc, 0xff, 0x21, 0x12, 0xfe, 0xdc,
+ 0xee, 0x00, 0x64, 0x00,
+ 0xda, 0xff, 0x0f, 0xcd, 0xff, 0x22, 0x00, 0xbc, 0xdd, 0x0f, 0x01, 0xf0,
+ 0x0f, 0x12, 0x12, 0xff,
+ 0xff, 0x10, 0xdc, 0xaa, 0xfe, 0x00, 0x54, 0x0e, 0xba, 0x00, 0x10, 0xcc,
+ 0x22, 0x76, 0x0f, 0xdc,
+ 0xf0, 0x31, 0x12, 0xed, 0xee, 0x43, 0x22, 0x00, 0xfe, 0x12, 0x44, 0xed,
+ 0xfd, 0x22, 0x0f, 0x0d,
+ 0x54, 0x0f, 0xd9, 0x21, 0x21, 0xef, 0x00, 0xdf, 0x8a, 0x00, 0x34, 0x00,
+ 0xf0, 0x21, 0x33, 0x00,
+ 0xde, 0xe0, 0x20, 0x43, 0x34, 0x11, 0xbd, 0xf0, 0x67, 0x23, 0xee, 0xee,
+ 0x01, 0x45, 0x11, 0xde,
+ 0xce, 0x11, 0x12, 0x00, 0x33, 0x11, 0xbb, 0xdd, 0x00, 0x64, 0x25, 0x00,
+ 0xee, 0x00, 0x00, 0x23,
+ 0x00, 0xf0, 0x00, 0xd0, 0xde, 0x22, 0x56, 0xef, 0xef, 0x53, 0x00, 0xdc,
+ 0xee, 0x21, 0x77, 0x00,
+ 0xfe, 0x00, 0x21, 0x0f, 0x10, 0x42, 0xed, 0xda, 0x32, 0x76, 0x10, 0xef,
+ 0xff, 0x11, 0x43, 0x00,
+ 0x00, 0x01, 0xe0, 0xef, 0x22, 0x01, 0xee, 0xf0, 0xf0, 0xef, 0x01, 0x01,
+ 0x00, 0x54, 0x00, 0xa8,
+ 0xff, 0x32, 0x23, 0xff, 0xef, 0x9b, 0xee, 0x45, 0x55, 0x00, 0xde, 0xee,
+ 0x11, 0x22, 0xf0, 0xf0,
+ 0x11, 0x11, 0x12, 0xef, 0xbb, 0x01, 0x01, 0xef, 0x23, 0x12, 0xcd, 0xf0,
+ 0x57, 0x55, 0x00, 0xcc,
+ 0x00, 0x43, 0x00, 0xee, 0x00, 0x00, 0x0f, 0x66, 0x00, 0xdc, 0x00, 0x52,
+ 0x00, 0xfd, 0x01, 0x44,
+ 0xfe, 0xeb, 0x00, 0x00, 0x20, 0x43, 0x00, 0xed, 0x10, 0x0f, 0xba, 0x21,
+ 0x54, 0x0f, 0xff, 0x10,
+ 0x0f, 0xed, 0x12, 0x10, 0xcb, 0x33, 0x65, 0xff, 0xdd, 0xff, 0x22, 0x01,
+ 0xdd, 0x00, 0x12, 0xf0,
+ 0xdd, 0x00, 0x02, 0xdd, 0xba, 0x00, 0x0f, 0x12, 0x32, 0xbc, 0xec, 0x21,
+ 0x65, 0x00, 0xdd, 0xcc,
+ 0x00, 0x35, 0x53, 0xff, 0xdd, 0x01, 0x23, 0xff, 0x99, 0x00, 0x23, 0x00,
+ 0xef, 0xee, 0xff, 0x00,
+ 0x00, 0xec, 0xcc, 0x00, 0x32, 0xdc, 0x9b, 0x00, 0x21, 0x22, 0x0f, 0xde,
+ 0x00, 0x00, 0xdc, 0x00,
+ 0x76, 0x10, 0xde, 0xf0, 0x00, 0x11, 0xce, 0xed, 0xf0, 0x12, 0x01, 0xfe,
+ 0xcc, 0xee, 0x22, 0x67,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x33, 0xf0, 0xbd, 0x37,
+ 0x76, 0xf0, 0xdd, 0xef,
+ 0x00, 0x43, 0x01, 0x00, 0x01, 0xee, 0xf0, 0x67, 0x00, 0xdd, 0x00, 0x00,
+ 0x10, 0x00, 0xfe, 0xdd,
+ 0x42, 0x77, 0xff, 0xfe, 0x10, 0x11, 0xed, 0xff, 0x77, 0x00, 0x0e, 0x0f,
+ 0xfe, 0x0f, 0x22, 0x31,
+ 0x0e, 0x00, 0xff, 0xed, 0x12, 0x55, 0xdd, 0xcc, 0x23, 0x34, 0xee, 0xcd,
+ 0x0f, 0x00, 0x00, 0xec,
+ 0x00, 0x11, 0xbc, 0x10, 0x77, 0x10, 0xff, 0x00, 0x13, 0x21, 0xf0, 0xf0,
+ 0x01, 0xdf, 0xde, 0x36,
+ 0x54, 0xf0, 0xad, 0xee, 0x00, 0x11, 0x01, 0x45, 0x45, 0x0f, 0xcd, 0xff,
+ 0x01, 0x22, 0x01, 0xff,
+ 0xdd, 0xed, 0x46, 0x23, 0xbd, 0xef, 0x23, 0x35, 0xef, 0xbd, 0x00, 0x34,
+ 0x10, 0xdd, 0x22, 0x21,
+ 0xaa, 0x00, 0x42, 0xff, 0xff, 0x44, 0x00, 0xfe, 0xee, 0x00, 0x46, 0x32,
+ 0xf0, 0xf0, 0x01, 0x01,
+ 0x21, 0x32, 0x12, 0x56, 0x01, 0xcf, 0x10, 0x64, 0x24, 0x11, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x44, 0x43, 0x0f, 0xed, 0x11, 0x44, 0xfd, 0xdc, 0x21, 0x22, 0xff, 0xca,
+ 0xfe, 0x11, 0x64, 0x00,
+ 0xfe, 0x0f, 0x00, 0x01, 0x66, 0xff, 0xbb, 0xff, 0x00, 0x12, 0x00, 0x00,
+ 0x00, 0xaa, 0xf0, 0x21,
+ 0x00, 0xef, 0x00, 0xf0, 0xee, 0x23, 0x0f, 0xdc, 0x00, 0x62, 0x11, 0xeb,
+ 0xba, 0xfe, 0x0e, 0x20,
+ 0x72, 0x0e, 0xb8, 0x0f, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x22, 0x00,
+ 0xdf, 0xdd, 0x45, 0x75, 0x00, 0xee, 0xee, 0x33, 0x57, 0x00, 0x00, 0xf0,
+ 0x00, 0x12, 0x22, 0x00,
+ 0x01, 0x23, 0xcd, 0xdd, 0x34, 0x22, 0x9c, 0xff, 0x23, 0x35, 0x21, 0x00,
+ 0xde, 0xf0, 0x34, 0x11,
+ 0x00, 0x02, 0x01, 0xcf, 0x22, 0x54, 0x01, 0xf1, 0xf0, 0xf0, 0x00, 0x77,
+ 0xf0, 0xa9, 0x33, 0x44,
+ 0x00, 0xdd, 0xed, 0x00, 0x64, 0x12, 0x0e, 0xec, 0xfe, 0xed, 0x33, 0x56,
+ 0xff, 0xff, 0x11, 0x00,
+ 0xdd, 0x01, 0x32, 0xee, 0xf0, 0x22, 0xfe, 0xbd, 0x01, 0x12, 0x0f, 0x00,
+ 0x12, 0x0d, 0xa8, 0xfd,
+ 0xf0, 0x12, 0x66, 0x00, 0xdc, 0xef, 0x0f, 0x01, 0x00, 0xee, 0xf0, 0x00,
+ 0xde, 0x32, 0x45, 0xbf,
+ 0xdd, 0xcc, 0x13, 0x23, 0xbb, 0xf0, 0x00, 0xf0, 0x02, 0xf0, 0xba, 0xee,
+ 0x00, 0x00, 0xff, 0x22,
+ 0x11, 0xee, 0x00, 0x12, 0x56, 0xdf, 0x88, 0xdf, 0x21, 0x53, 0x11, 0x00,
+ 0xfe, 0xed, 0xff, 0x00,
+ 0x1f, 0x10, 0x32, 0x21, 0xdc, 0xaa, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xdf,
+ 0xff, 0x00, 0x21, 0x76,
+ 0x11, 0xee, 0xfc, 0x0f, 0x20, 0x43, 0x22, 0x22, 0xfe, 0xcb, 0x00, 0x43,
+ 0x12, 0x0f, 0xcc, 0xf0,
+ 0xf0, 0xde, 0xdf, 0x02, 0x00, 0x88, 0xee, 0x11, 0x34, 0x00, 0xdf, 0xf0,
+ 0xef, 0xdd, 0x00, 0x45,
+ 0x43, 0x12, 0x21, 0xef, 0xac, 0x01, 0x11, 0x01, 0x77, 0x25, 0xee, 0xde,
+ 0x11, 0x21, 0x00, 0x30,
+ 0x32, 0xef, 0xdd, 0x0d, 0x1f, 0x0d, 0x0f, 0x72, 0x10, 0x0c, 0xea, 0x9b,
+ 0xff, 0x33, 0x22, 0xf0,
+ 0xff, 0xdd, 0xed, 0xff, 0xf0, 0x23, 0x34, 0xdf, 0xbc, 0x01, 0x00, 0x9b,
+ 0xfe, 0x00, 0x25, 0x00,
+ 0xf0, 0x01, 0x32, 0x44, 0x23, 0xff, 0xde, 0xdf, 0xe0, 0x00, 0x66, 0x22,
+ 0xff, 0xf0, 0x01, 0x01,
+ 0x12, 0xe0, 0xac, 0x15, 0x11, 0xde, 0xcd, 0x14, 0x45, 0xf0, 0xce, 0xee,
+ 0xf0, 0x65, 0x01, 0xce,
+ 0xff, 0x01, 0x00, 0x00, 0x14, 0x10, 0xff, 0x00, 0xfe, 0xec, 0x50, 0x2f,
+ 0x1e, 0x63, 0x23, 0x0c,
+ 0xfa, 0x0f, 0x54, 0x34, 0x0f, 0xec, 0x0f, 0x20, 0x31, 0x21, 0x00, 0x0f,
+ 0xfd, 0x00, 0x54, 0x0f,
+ 0xda, 0x0f, 0x30, 0x30, 0x31, 0x01, 0x73, 0x56, 0x00, 0xff, 0x00, 0x00,
+ 0xdf, 0x01, 0x47, 0x00,
+ 0x00, 0xff, 0xce, 0x21, 0x33, 0x00, 0x0f, 0xed, 0xde, 0x64, 0x34, 0xdd,
+ 0xbb, 0x22, 0x33, 0xdd,
+ 0xdd, 0x23, 0x45, 0x33, 0xdf, 0x89, 0xe0, 0x43, 0x34, 0x00, 0xf0, 0x00,
+ 0x00, 0xde, 0x11, 0x43,
+ 0xff, 0x00, 0x44, 0x00, 0xdd, 0xf0, 0x01, 0x00, 0x0f, 0x65, 0x23, 0x00,
+ 0x23, 0xf0, 0xcb, 0x33,
+ 0x43, 0xf0, 0xff, 0x00, 0x26, 0x32, 0xcf, 0x00, 0x41, 0x32, 0x11, 0xee,
+ 0x98, 0xff, 0x54, 0x23,
+ 0xee, 0xdd, 0x21, 0x23, 0xed, 0xff, 0x24, 0x01, 0xef, 0x00, 0xf0, 0x01,
+ 0x55, 0xef, 0xab, 0xef,
+ 0x00, 0xf0, 0x02, 0x22, 0x00, 0x02, 0x14, 0xde, 0x9b, 0x00, 0x55, 0x01,
+ 0x0f, 0x00, 0x12, 0x21,
+ 0x01, 0x01, 0x25, 0x01, 0xe0, 0xd0, 0x00, 0x10, 0xed, 0x32, 0x54, 0xcb,
+ 0xdd, 0x1f, 0x72, 0x56,
+ 0x0f, 0xea, 0xee, 0x10, 0x31, 0x0f, 0x0f, 0x00, 0xce, 0xff, 0x10, 0x11,
+ 0x00, 0xcc, 0xbc, 0x01,
+ 0x32, 0x1f, 0x41, 0x0e, 0xe9, 0x00, 0x63, 0x21, 0x11, 0x32, 0x0f, 0xef,
+ 0xf0, 0xdd, 0x00, 0x36,
+ 0xae, 0x00, 0x35, 0xde, 0x8b, 0xef, 0x01, 0x12, 0x00, 0x00, 0x00, 0xdd,
+ 0xf0, 0xf0, 0xf0, 0x03,
+ 0xf0, 0xac, 0xc9, 0x00, 0x14, 0xde, 0xac, 0x01, 0x12, 0x00, 0x00, 0x0f,
+ 0x0f, 0x12, 0x12, 0x0c,
+ 0xca, 0xff, 0x72, 0x34, 0x0e, 0xeb, 0x00, 0x0f, 0xdd, 0x20, 0x53, 0x0e,
+ 0x00, 0x00, 0xba, 0x00,
+ 0x12, 0x00, 0xde, 0xdf, 0xee, 0x00, 0x13, 0x00, 0xaa, 0xee, 0xf0, 0x0f,
+ 0x00, 0xdc, 0xdd, 0x00,
+ 0x0f, 0xde, 0xf0, 0xff, 0xae, 0xff, 0x45, 0x44, 0x00, 0xed, 0xcb, 0x10,
+ 0x34, 0x21, 0x22, 0x00,
+ 0xf0, 0x12, 0x00, 0xd0, 0xf0, 0x55, 0x33, 0x01, 0xbe, 0xf0, 0x55, 0x00,
+ 0xac, 0x01, 0x14, 0x11,
+ 0xf0, 0xee, 0xcd, 0x00, 0x16, 0xe0, 0xef, 0x01, 0xf0, 0xe0, 0x00, 0xee,
+ 0x88, 0xfe, 0x21, 0x1f,
+ 0xfd, 0xfd, 0xfe, 0x10, 0x51, 0xeb, 0xdc, 0x42, 0x22, 0xdc, 0xef, 0x0f,
+ 0x10, 0x52, 0x00, 0x0f,
+ 0x10, 0x10, 0xfd, 0xef, 0x45, 0x76, 0x11, 0x00, 0xef, 0x00, 0x02, 0x23,
+ 0x56, 0x00, 0xcf, 0xff,
+ 0x00, 0x00, 0xf0, 0x11, 0x10, 0x00, 0x21, 0xfe, 0xdc, 0x11, 0x53, 0x43,
+ 0x21, 0x0e, 0xca, 0xff,
+ 0x24, 0x77, 0x00, 0xf0, 0xf0, 0xef, 0x01, 0x34, 0x22, 0x00, 0xd0, 0x00,
+ 0x35, 0x74, 0x32, 0x00,
+ 0xde, 0xf0, 0x00, 0x10, 0x77, 0x43, 0x0f, 0xee, 0x10, 0x23, 0x0f, 0xdb,
+ 0x10, 0x74, 0x11, 0x0f,
+ 0xff, 0xf0, 0x00, 0x23, 0x33, 0x00, 0xfe, 0x11, 0x21, 0x20, 0x44, 0x44,
+ 0x00, 0x10, 0x0e, 0xda,
+ 0x31, 0x77, 0x10, 0x01, 0x33, 0x00, 0xdf, 0x01, 0x76, 0x00, 0x00, 0x33,
+ 0x11, 0x00, 0xe0, 0xd0,
+ 0x00, 0x77, 0x21, 0xf0, 0x00, 0x00, 0x00, 0x32, 0x01, 0x12, 0x21, 0xce,
+ 0xdc, 0x31, 0x63, 0x00,
+ 0xed, 0xed, 0x0f, 0x1f, 0xeb, 0xbc, 0x21, 0x21, 0xcb, 0x00, 0x54, 0x00,
+ 0xda, 0x00, 0x41, 0x20,
+ 0x00, 0x0f, 0xec, 0x10, 0x72, 0x00, 0xeb, 0x0f, 0x22, 0x20, 0xdf, 0xef,
+ 0xdd, 0x0f, 0x71, 0x11,
+ 0x0f, 0xfe, 0x12, 0x0c, 0xb8, 0x0f, 0x53, 0x11, 0x0e, 0x00, 0x00, 0x00,
+ 0x4d, 0x00, 0x38, 0x00,
+ 0xe7, 0x60, 0x88, 0x26, 0x52, 0x67, 0x71, 0x2c, 0xfc, 0x60, 0xe9, 0x77,
+ 0x26, 0x9e, 0xdd, 0xef,
+ 0xdd, 0xbc, 0x11, 0x35, 0xee, 0xee, 0xf0, 0xce, 0xf0, 0xf0, 0xbb, 0x00,
+ 0x35, 0xe0, 0xbe, 0x00,
+ 0xf0, 0xdf, 0xf0, 0x03, 0x13, 0x00, 0xef, 0xff, 0xff, 0x55, 0x23, 0x13,
+ 0x00, 0xec, 0x51, 0x23,
+ 0xfc, 0x00, 0x00, 0xcb, 0x44, 0x53, 0xec, 0xfe, 0xf0, 0xf0, 0x03, 0x24,
+ 0x00, 0xd0, 0xbf, 0xde,
+ 0xf2, 0x37, 0x14, 0x00, 0xd0, 0xb0, 0xde, 0xee, 0x75, 0x44, 0x0f, 0xde,
+ 0x00, 0x12, 0x00, 0x23,
+ 0x01, 0xbd, 0x00, 0x57, 0xf0, 0xdc, 0x01, 0x32, 0x00, 0x00, 0xf0, 0xcc,
+ 0xbb, 0xde, 0x10, 0x32,
+ 0xcb, 0xac, 0x00, 0x22, 0xff, 0xdd, 0x11, 0x01, 0xdf, 0x00, 0x00, 0xdd,
+ 0x03, 0xf1, 0x89, 0xf0,
+ 0x01, 0x00, 0xee, 0xf0, 0xf0, 0xef, 0xed, 0x0f, 0x20, 0x21, 0xfd, 0xc8,
+ 0x60, 0x42, 0xeb, 0xcc,
+ 0x00, 0x2f, 0x0f, 0x00, 0x0d, 0xed, 0xfe, 0xee, 0x10, 0xfd, 0x98, 0xfe,
+ 0x10, 0x41, 0x10, 0x00,
+ 0x0f, 0x0d, 0xdb, 0x30, 0x64, 0x00, 0x0f, 0xff, 0x00, 0x45, 0xf0, 0x9c,
+ 0x00, 0x24, 0x11, 0xf0,
+ 0xf0, 0xff, 0xee, 0x11, 0x65, 0x00, 0xed, 0x00, 0x11, 0x00, 0x01, 0x13,
+ 0x00, 0x01, 0xf0, 0xe0,
+ 0x14, 0x23, 0xcf, 0xf0, 0x47, 0x02, 0xc0, 0xf2, 0x35, 0x00, 0xff, 0x73,
+ 0x26, 0xff, 0xff, 0x30,
+ 0x00, 0x0e, 0x61, 0x43, 0x0d, 0x0c, 0x33, 0x20, 0xd8, 0x40, 0x43, 0x00,
+ 0x20, 0x21, 0x31, 0x00,
+ 0xdd, 0xcd, 0x43, 0x67, 0x00, 0xed, 0xdc, 0xee, 0x00, 0x30, 0x43, 0x32,
+ 0xff, 0xaa, 0x00, 0x00,
+ 0x00, 0x00, 0x43, 0x13, 0x00, 0xf0, 0xca, 0x00, 0x35, 0x11, 0x00, 0x01,
+ 0xe0, 0xdf, 0x00, 0x44,
+ 0xe0, 0x9e, 0x00, 0x02, 0x11, 0x02, 0x00, 0xbb, 0x12, 0x46, 0xf0, 0xdf,
+ 0x01, 0xf0, 0xe0, 0x45,
+ 0x43, 0x00, 0xae, 0xed, 0x02, 0x02, 0x02, 0x02, 0xef, 0xef, 0x00, 0x64,
+ 0x0e, 0xd8, 0x10, 0x31,
+ 0x00, 0x0f, 0x10, 0xee, 0xe0, 0xf0, 0xf0, 0x01, 0x00, 0x30, 0x40, 0x0f,
+ 0xaa, 0x00, 0x63, 0x1e,
+ 0x32, 0x77, 0x05, 0x00, 0x0f, 0x0f, 0x20, 0x57, 0x11, 0xff, 0x00, 0xf0,
+ 0xf0, 0x03, 0x00, 0xff,
+ 0x01, 0x45, 0x00, 0xbe, 0xee, 0x00, 0x32, 0x11, 0x00, 0x12, 0x11, 0xee,
+ 0xf0, 0x36, 0x00, 0xcf,
+ 0x00, 0x13, 0x00, 0x9e, 0xee, 0x26, 0x55, 0xff, 0xdd, 0x22, 0x65, 0x00,
+ 0xff, 0x11, 0x00, 0x1f,
+ 0x42, 0x10, 0x0c, 0xec, 0xfe, 0x41, 0x22, 0xc9, 0xac, 0x00, 0x32, 0x00,
+ 0xf0, 0xdd, 0xbc, 0x01,
+ 0x22, 0xed, 0x0f, 0xee, 0xdb, 0x32, 0x00, 0xaa, 0x20, 0x22, 0xfe, 0xef,
+ 0x22, 0x01, 0xf0, 0xef,
+ 0x00, 0x65, 0x01, 0xee, 0xef, 0x00, 0x56, 0x22, 0x00, 0xdf, 0xdd, 0x54,
+ 0x22, 0xe0, 0x00, 0xf0,
+ 0x00, 0x12, 0xf0, 0xf3, 0xf1, 0x9c, 0xdb, 0x00, 0x36, 0x00, 0xe0, 0x00,
+ 0xe0, 0xad, 0xef, 0x23,
+ 0x46, 0xd0, 0xae, 0x00, 0x02, 0x00, 0xed, 0x0f, 0xf0, 0x12, 0x55, 0x00,
+ 0xfc, 0x0f, 0x31, 0x10,
+ 0x0d, 0xfd, 0x42, 0x77, 0x11, 0xfd, 0xda, 0x00, 0x32, 0xff, 0xfe, 0x20,
+ 0x00, 0x0e, 0x0e, 0xeb,
+ 0x0f, 0x72, 0x40, 0xfd, 0xec, 0x00, 0x00, 0xed, 0xfd, 0x34, 0x00, 0xff,
+ 0x53, 0xff, 0x88, 0xfe,
+ 0x11, 0x33, 0x00, 0xfc, 0xee, 0x00, 0x1f, 0x10, 0x10, 0xfd, 0x10, 0x31,
+ 0xff, 0xce, 0xdf, 0xff,
+ 0x66, 0x00, 0xab, 0xef, 0x01, 0xf0, 0x02, 0x27, 0x01, 0xf0, 0xe0, 0xff,
+ 0xe0, 0x00, 0x44, 0x75,
+ 0x11, 0x00, 0xff, 0x00, 0x10, 0x01, 0x11, 0xee, 0xff, 0x77, 0x01, 0xce,
+ 0x02, 0x46, 0x00, 0xc0,
+ 0xff, 0xf0, 0x11, 0x11, 0xff, 0xef, 0x12, 0x24, 0x00, 0xfe, 0x20, 0x10,
+ 0xad, 0x00, 0x57, 0x00,
+ 0xf0, 0x00, 0xf0, 0xee, 0xf1, 0x25, 0x33, 0xd0, 0x8c, 0x0f, 0xef, 0xed,
+ 0x11, 0x12, 0xf0, 0x01,
+ 0x00, 0xfb, 0x10, 0x0e, 0x88, 0x00, 0x65, 0x00, 0xff, 0x0f, 0x21, 0x00,
+ 0xef, 0x02, 0x33, 0x00,
+ 0xff, 0x01, 0x13, 0xdd, 0xde, 0x25, 0x01, 0xce, 0x0e, 0x75, 0x42, 0x0f,
+ 0x0c, 0xfd, 0x10, 0x43,
+ 0x12, 0x21, 0x0f, 0xf9, 0x10, 0x43, 0xef, 0x9a, 0xff, 0x0f, 0x11, 0x31,
+ 0x00, 0x0e, 0x1f, 0x4f,
+ 0x0b, 0xec, 0x20, 0x62, 0x20, 0x31, 0x10, 0xfd, 0xfe, 0x0e, 0xee, 0x12,
+ 0x24, 0xdd, 0xbe, 0xe0,
+ 0xc0, 0x05, 0x32, 0xfd, 0x46, 0x76, 0xef, 0xcc, 0xef, 0x23, 0x34, 0xf0,
+ 0xde, 0xf0, 0xf0, 0x22,
+ 0x23, 0xcf, 0xe0, 0x35, 0x00, 0xc0, 0x33, 0x77, 0x00, 0xef, 0xf0, 0x33,
+ 0xf0, 0x9c, 0x21, 0x45,
+ 0x00, 0x0e, 0x00, 0xfe, 0x00, 0x1f, 0x0e, 0x20, 0x1f, 0x0f, 0x0f, 0xee,
+ 0xbc, 0xeb, 0x20, 0x63,
+ 0x00, 0xe0, 0xee, 0xeb, 0xdb, 0xfe, 0x63, 0x13, 0xfd, 0xee, 0x43, 0x22,
+ 0xdb, 0xde, 0x44, 0x32,
+ 0xe0, 0x00, 0x36, 0x10, 0xe0, 0x32, 0x74, 0x00, 0xf1, 0x12, 0x11, 0x00,
+ 0x01, 0xe0, 0x23, 0x33,
+ 0x00, 0x13, 0x21, 0x88, 0xcd, 0x32, 0x65, 0xff, 0xed, 0x00, 0x11, 0x01,
+ 0x0f, 0xef, 0xe0, 0xe0,
+ 0x04, 0xf2, 0x8c, 0xec, 0x03, 0x25, 0x00, 0xcf, 0xed, 0xf0, 0x21, 0x23,
+ 0xff, 0xa8, 0x00, 0x11,
+ 0x21, 0x00, 0x00, 0xee, 0xee, 0x11, 0xcd, 0xed, 0x00, 0x0f, 0x0f, 0xdd,
+ 0x98, 0x0e, 0x0f, 0x00,
+ 0x63, 0x0e, 0xd8, 0x0f, 0x10, 0x30, 0x20, 0x11, 0x00, 0xed, 0xef, 0x20,
+ 0xff, 0xbe, 0x01, 0xee,
+ 0xee, 0x22, 0xf0, 0xd0, 0x01, 0x67, 0x22, 0x0f, 0xa9, 0xff, 0x11, 0x00,
+ 0x31, 0x44, 0xf0, 0xef,
+ 0x00, 0x10, 0xcc, 0xde, 0x35, 0x44, 0xcf, 0xbe, 0x01, 0x24, 0x00, 0xef,
+ 0xf0, 0xef, 0x00, 0xe0,
+ 0xed, 0x75, 0x32, 0x0f, 0x30, 0x00, 0xed, 0xdc, 0x32, 0x76, 0x00, 0xee,
+ 0xff, 0x32, 0x43, 0x0e,
+ 0x10, 0x20, 0x0c, 0xfe, 0x10, 0x31, 0x52, 0x33, 0xfc, 0xdb, 0x32, 0x66,
+ 0x00, 0x00, 0x31, 0xff,
+ 0x22, 0x44, 0xbc, 0xde, 0x57, 0x53, 0x00, 0x00, 0xff, 0xef, 0x34, 0x22,
+ 0xf0, 0xf0, 0xe0, 0x01,
+ 0x56, 0x11, 0xf0, 0xcd, 0xfe, 0x00, 0x11, 0x22, 0x00, 0xee, 0xef, 0xf1,
+ 0x27, 0x32, 0xf0, 0xa0,
+ 0xe0, 0xe0, 0xc0, 0xe1, 0xf2, 0xef, 0xdd, 0x54, 0x35, 0xcc, 0xee, 0x20,
+ 0x00, 0xd9, 0x71, 0x53,
+ 0x00, 0xfd, 0x11, 0x11, 0x0f, 0x1f, 0x00, 0xfb, 0xfe, 0x20, 0x0e, 0x0e,
+ 0x0f, 0x0e, 0xed, 0xd9,
+ 0x71, 0x64, 0x0f, 0xec, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x1f, 0xec, 0x00,
+ 0x00, 0x9b, 0xdd, 0x12,
+ 0x54, 0x0f, 0xca, 0x00, 0x12, 0x00, 0x0f, 0x00, 0xf0, 0xcd, 0xef, 0xf0,
+ 0x00, 0xff, 0xe0, 0xcc,
+ 0xde, 0xf0, 0xd0, 0x9b, 0xf0, 0x15, 0x01, 0xf0, 0x01, 0xd0, 0xd0, 0x05,
+ 0x12, 0x00, 0x0f, 0xee,
+ 0x11, 0x77, 0x40, 0xff, 0x10, 0x33, 0x10, 0xee, 0xde, 0x75, 0x11, 0xee,
+ 0xef, 0xf0, 0xff, 0xf0,
+ 0xe0, 0xf0, 0x0f, 0xed, 0xbb, 0x00, 0x24, 0x43, 0x0f, 0xfc, 0x40, 0x63,
+ 0x15, 0x10, 0x0d, 0x00,
+ 0x45, 0x21, 0x10, 0x00, 0xdc, 0x22, 0x66, 0xff, 0xee, 0x00, 0xf0, 0xce,
+ 0xff, 0x11, 0xff, 0xf0,
+ 0x00, 0xb9, 0xfe, 0x00, 0x0f, 0x1f, 0x0e, 0x89, 0xee, 0x00, 0x22, 0x00,
+ 0xdd, 0xf0, 0x02, 0x03,
+ 0xef, 0xcf, 0xce, 0x05, 0x26, 0xe0, 0xaf, 0x00, 0x00, 0xff, 0xee, 0x02,
+ 0x12, 0x11, 0xff, 0xfe,
+ 0x0e, 0x0f, 0xeb, 0x00, 0x75, 0x10, 0xcd, 0x00, 0xee, 0x88, 0xff, 0x00,
+ 0x00, 0x0f, 0xff, 0x0d,
+ 0xfd, 0x0f, 0x11, 0x20, 0x0c, 0xec, 0x71, 0x33, 0x0d, 0x20, 0x34, 0x10,
+ 0x10, 0x43, 0x12, 0xfd,
+ 0xe9, 0x31, 0x76, 0x11, 0x21, 0x33, 0x11, 0x00, 0x11, 0x52, 0x0f, 0xfe,
+ 0x24, 0x55, 0x00, 0x10,
+ 0x33, 0xf0, 0xef, 0xe1, 0x26, 0x32, 0xc0, 0xcf, 0xbf, 0xf0, 0x27, 0x12,
+ 0xcf, 0x00, 0x21, 0x00,
+ 0x0f, 0x40, 0x01, 0x00, 0x41, 0x54, 0x24, 0x21, 0x00, 0x21, 0x23, 0x11,
+ 0x00, 0x21, 0x01, 0x04,
+ 0x67, 0x22, 0xff, 0xef, 0x0e, 0xfd, 0xde, 0xd1, 0x02, 0x00, 0x1e, 0x1c,
+ 0x70, 0x66, 0x00, 0x0c,
+ 0x00, 0x10, 0x20, 0x11, 0x00, 0x0d, 0x53, 0x35, 0x00, 0x13, 0x23, 0xa9,
+ 0xee, 0x21, 0x46, 0x00,
+ 0xf0, 0x30, 0x20, 0xde, 0xef, 0x76, 0x31, 0xed, 0xef, 0x20, 0x12, 0xff,
+ 0xff, 0x00, 0x01, 0x56,
+ 0xe0, 0x8f, 0x00, 0x02, 0xf0, 0xf0, 0xf2, 0xf0, 0xf0, 0x00, 0x00, 0x0e,
+ 0x25, 0x00, 0x01, 0x24,
+ 0xef, 0xcd, 0x74, 0x12, 0xca, 0x00, 0x16, 0xf0, 0xce, 0x00, 0xef, 0xf0,
+ 0x45, 0x00, 0xae, 0x00,
+ 0x12, 0x10, 0x10, 0x10, 0x21, 0x23, 0x11, 0x43, 0x43, 0x0f, 0x10, 0x22,
+ 0x43, 0x2e, 0x0c, 0x0e,
+ 0xfa, 0x21, 0x66, 0x00, 0x02, 0x35, 0x10, 0xf0, 0xe0, 0xef, 0xf0, 0x43,
+ 0x74, 0x21, 0xed, 0xca,
+ 0x00, 0x10, 0x00, 0x10, 0x42, 0x01, 0xf0, 0xf0, 0xef, 0x24, 0x55, 0x00,
+ 0xfe, 0x64, 0x11, 0x0f,
+ 0x00, 0x0f, 0xef, 0x23, 0x35, 0xef, 0xde, 0x62, 0x21, 0x0f, 0x0e, 0xed,
+ 0xff, 0x37, 0x64, 0x0f,
+ 0x0e, 0xfc, 0xff, 0x30, 0x0d, 0xdd, 0x30, 0x1f, 0xb8, 0xf0, 0x20, 0xf0,
+ 0xcc, 0xff, 0xff, 0x11,
+ 0x42, 0xcf, 0xcc, 0x21, 0x23, 0xbd, 0xef, 0x03, 0x07, 0xe1, 0x8f, 0xff,
+ 0x03, 0xf3, 0xe0, 0xf2,
+ 0x04, 0xe2, 0xae, 0xfd, 0xf0, 0xe1, 0x17, 0x01, 0xdd, 0xf0, 0x57, 0x00,
+ 0xbd, 0x0f, 0x13, 0x22,
+ 0x0f, 0xf0, 0xef, 0xcf, 0x02, 0xf0, 0xcd, 0x03, 0xf0, 0xb8, 0x00, 0x23,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x22, 0xee, 0xea, 0x71, 0x31, 0xda, 0xff, 0x32, 0x00, 0xca, 0xff, 0x1f,
+ 0x10, 0xed, 0xcd, 0x1f,
+ 0x0e, 0xab, 0x0e, 0x2f, 0x0c, 0xfe, 0xff, 0xec, 0x3f, 0x4f, 0xdb, 0xde,
+ 0x3f, 0x1e, 0x0e, 0x71,
+ 0x20, 0xa9, 0xff, 0xf0, 0x00, 0x20, 0x00, 0xdf, 0xff, 0xde, 0xbc, 0xf0,
+ 0x13, 0xf0, 0xcc, 0x0f,
+ 0xed, 0xcd, 0xde, 0xab, 0xff, 0x24, 0x00, 0xbb, 0xf0, 0x00, 0xee, 0x00,
+ 0x44, 0x00, 0xd0, 0xfe,
+ 0xfe, 0x22, 0x13, 0xdf, 0xf0, 0x03, 0xe2, 0xd0, 0xf0, 0x23, 0xac, 0xef,
+ 0x16, 0x43, 0x01, 0x8a,
+ 0xee, 0x25, 0x42, 0xee, 0xee, 0x01, 0x11, 0x00, 0x1f, 0x01, 0x13, 0x26,
+ 0x31, 0x00, 0x00, 0x53,
+ 0x11, 0xdc, 0x14, 0x76, 0xf0, 0x00, 0x30, 0xdf, 0xde, 0x44, 0x53, 0x00,
+ 0xff, 0xf0, 0xe0, 0x01,
+ 0x21, 0xec, 0xde, 0x32, 0x22, 0xeb, 0xdf, 0x10, 0x21, 0xcc, 0xdd, 0x77,
+ 0x63, 0xff, 0xf0, 0x12,
+ 0x11, 0x24, 0x23, 0x02, 0xe0, 0xd2, 0x45, 0x01, 0x00, 0x33, 0x00, 0x11,
+ 0x64, 0x10, 0x00, 0x1f,
+ 0x0e, 0x00, 0x00, 0xe1, 0xee, 0xfb, 0x3f, 0x0d, 0xba, 0x8b, 0xee, 0x00,
+ 0xed, 0x0f, 0x00, 0x0c,
+ 0xdc, 0xfe, 0x10, 0x2f, 0xdb, 0xde, 0x70, 0x62, 0x0d, 0xfd, 0x20, 0x1e,
+ 0x0b, 0x43, 0x22, 0xea,
+ 0x00, 0x41, 0x00, 0x00, 0x10, 0xe0, 0x11, 0x66, 0x01, 0x11, 0x31, 0x00,
+ 0xf0, 0x03, 0x57, 0x01,
+ 0xe1, 0xe1, 0xf1, 0x02, 0xf1, 0xb1, 0xf1, 0xf5, 0x02, 0xd0, 0xa0, 0xf0,
+ 0x13, 0x00, 0xf0, 0xf0,
+ 0x23, 0x10, 0xa8, 0x00, 0x10, 0x32, 0x21, 0xee, 0xde, 0x11, 0x02, 0x11,
+ 0x11, 0xdd, 0x30, 0x63,
+ 0xb8, 0xfc, 0x41, 0x20, 0xeb, 0x0f, 0x30, 0x0e, 0x0f, 0x30, 0x3f, 0x71,
+ 0x32, 0xf0, 0xf0, 0x00,
+ 0x24, 0x31, 0x10, 0x31, 0x77, 0x11, 0x0e, 0x21, 0x44, 0xf0, 0xf0, 0x77,
+ 0x21, 0xfe, 0x01, 0x33,
+ 0xef, 0xdc, 0x22, 0x54, 0x00, 0xeb, 0x20, 0x40, 0x0f, 0xfd, 0x01, 0x31,
+ 0x10, 0x10, 0x24, 0x01,
+ 0xc0, 0xff, 0x33, 0x14, 0x82, 0xd0, 0xd4, 0x17, 0x00, 0xa0, 0xef, 0xe0,
+ 0x00, 0x01, 0xcf, 0xcd,
+ 0x03, 0xf1, 0xdc, 0x00, 0xbb, 0xdd, 0xf1, 0xd0, 0xeb, 0xde, 0x8a, 0x00,
+ 0x02, 0xfe, 0xdb, 0x10,
+ 0x31, 0x00, 0xef, 0xff, 0x10, 0x22, 0x00, 0x0f, 0x0d, 0x73, 0x12, 0xeb,
+ 0x21, 0x53, 0x0c, 0xfc,
+ 0x21, 0x22, 0x02, 0x14, 0x31, 0x00, 0x52, 0x14, 0xff, 0x32, 0x64, 0x0e,
+ 0x00, 0x13, 0xfd, 0xeb,
+ 0x0e, 0xf0, 0xec, 0xca, 0x0f, 0x30, 0xe0, 0xbe, 0x0f, 0x00, 0x01, 0xf0,
+ 0x04, 0x01, 0xce, 0x20,
+ 0x77, 0x11, 0x00, 0x12, 0x00, 0x20, 0x45, 0x22, 0x11, 0x33, 0x02, 0x15,
+ 0x74, 0x31, 0x21, 0x21,
+ 0x33, 0x24, 0x31, 0x41, 0x30, 0x32, 0x74, 0x20, 0x0d, 0x30, 0x33, 0x00,
+ 0x10, 0x34, 0x30, 0x20,
+ 0x45, 0x31, 0x0f, 0x60, 0x33, 0x11, 0x36, 0x00, 0xdd, 0x64, 0x44, 0x00,
+ 0x00, 0x13, 0x03, 0xf0,
+ 0x02, 0x17, 0x12, 0xf0, 0x00, 0x43, 0x55, 0x02, 0xff, 0xff, 0x31, 0x44,
+ 0x12, 0x01, 0x01, 0xd0,
+ 0xd2, 0x26, 0xd0, 0x8f, 0x01, 0x02, 0x12, 0xef, 0xe0, 0xf0, 0xcd, 0x0c,
+ 0x50, 0x4f, 0x1c, 0x10,
+ 0x11, 0x30, 0x72, 0x21, 0x01, 0x27, 0x12, 0xf0, 0x00, 0x00, 0x32, 0xfe,
+ 0x0d, 0x41, 0xfb, 0xaa,
+ 0x00, 0x20, 0xeb, 0xee, 0x42, 0xff, 0xa9, 0xfe, 0x00, 0x00, 0x0e, 0x0f,
+ 0x1f, 0xfc, 0xcb, 0x0f,
+ 0x1f, 0x1e, 0x0e, 0xfe, 0x0e, 0x2e, 0xdd, 0xff, 0xcc, 0xde, 0x62, 0x35,
+ 0xce, 0xac, 0xfe, 0xcd,
+ 0xef, 0x04, 0xd0, 0xad, 0xee, 0xff, 0xec, 0xeb, 0xdf, 0xf1, 0xe0, 0xce,
+ 0x00, 0x26, 0x10, 0x00,
+ 0x01, 0x22, 0x00, 0xe0, 0x03, 0x74, 0x00, 0xee, 0x04, 0x03, 0xcc, 0x00,
+ 0x15, 0xae, 0xff, 0x21,
+ 0x20, 0x0d, 0x00, 0x13, 0x23, 0x1b, 0x2d, 0x1e, 0x20, 0x31, 0x12, 0xdf,
+ 0xd0, 0xe0, 0x02, 0xd0,
+ 0x89, 0x13, 0x03, 0x8b, 0x00, 0x23, 0x00, 0xfe, 0xf3, 0x03, 0x00, 0x03,
+ 0x07, 0xe1, 0xbf, 0xdd,
+ 0x12, 0x00, 0x88, 0xfd, 0x12, 0x00, 0xfe, 0x22, 0xfd, 0xd9, 0x20, 0xf0,
+ 0xef, 0xef, 0xcf, 0x00,
+ 0x02, 0xbe, 0xee, 0xe0, 0xbf, 0xe0, 0xef, 0xde, 0xcc, 0x01, 0x06, 0xaf,
+ 0xed, 0x01, 0x12, 0x12,
+ 0x00, 0xbd, 0xf0, 0xf1, 0xdb, 0xf0, 0x04, 0xbd, 0xde, 0xe0, 0xed, 0xc8,
+ 0xfd, 0xfd, 0x0e, 0x0e,
+ 0xfd, 0xfc, 0x0d, 0xec, 0xeb, 0x3f, 0x60, 0x0d, 0x0a, 0xfe, 0x0e, 0x1e,
+ 0x70, 0x3e, 0xfd, 0x0e,
+ 0x0d, 0x0b, 0x2f, 0x61, 0x0f, 0xfd, 0x00, 0x13, 0x33, 0x20, 0x23, 0x47,
+ 0x13, 0x01, 0x03, 0x33,
+ 0x02, 0x00, 0x45, 0x34, 0xf2, 0xf2, 0x21, 0x50, 0xfe, 0xbf, 0xc1, 0xb0,
+ 0x0e, 0x10, 0x01, 0x15,
+ 0x20, 0x08, 0xff, 0x10, 0x32, 0x41, 0x21, 0xf0, 0x90, 0xf0, 0x35, 0x12,
+ 0x12, 0x01, 0xcc, 0xd0,
+ 0x03, 0x01, 0xfe, 0x0f, 0x75, 0x20, 0x0c, 0xfe, 0x0f, 0x2e, 0x71, 0x11,
+ 0xeb, 0xfe, 0x00, 0x0e,
+ 0x0b, 0x30, 0x64, 0x22, 0x10, 0x0c, 0x0d, 0x62, 0x34, 0x10, 0x11, 0x35,
+ 0x41, 0x1f, 0x30, 0x30,
+ 0x10, 0x2f, 0x42, 0x12, 0x3f, 0x5c, 0x1c, 0x00, 0x36, 0x21, 0x10, 0x30,
+ 0x52, 0x00, 0xae, 0x02,
+ 0xe4, 0xf1, 0x27, 0x34, 0xd0, 0xaf, 0x02, 0x03, 0x03, 0x03, 0x36, 0x32,
+ 0xe0, 0xff, 0x43, 0x44,
+ 0x00, 0x10, 0x22, 0xf0, 0xd0, 0xf3, 0xd4, 0xa0, 0x01, 0x13, 0xe1, 0xa1,
+ 0xe5, 0x05, 0xd0, 0xf0,
+ 0x14, 0x03, 0xa0, 0xf1, 0x14, 0x44, 0x00, 0x00, 0x52, 0x22, 0x12, 0x33,
+ 0x10, 0x2e, 0x66, 0x22,
+ 0x10, 0x22, 0x10, 0x1f, 0x54, 0x13, 0x01, 0x26, 0x00, 0x10, 0x01, 0x01,
+ 0x98, 0x00, 0x94, 0x00,
+ 0xbf, 0x42, 0xca, 0x43, 0x9a, 0x3d, 0x8e, 0x41, 0x9a, 0xff, 0x03, 0x00,
+ 0x2f, 0x33, 0xe0, 0xab,
+ 0x00, 0x13, 0xed, 0x0d, 0x23, 0x24, 0x02, 0xe0, 0xd9, 0xe0, 0x41, 0x74,
+ 0x20, 0xce, 0xfe, 0x11,
+ 0x23, 0x00, 0xe0, 0x1f, 0x10, 0x00, 0x9c, 0x0f, 0x31, 0x01, 0x00, 0x06,
+ 0xec, 0xcb, 0x21, 0x32,
+ 0xfe, 0xf0, 0x51, 0xf0, 0xaa, 0x00, 0x24, 0x0f, 0x0c, 0x01, 0xf3, 0xef,
+ 0x0e, 0x21, 0x31, 0xe0,
+ 0xf1, 0x22, 0xee, 0xe0, 0x45, 0x10, 0xbe, 0xd2, 0x14, 0x3e, 0xca, 0xe0,
+ 0x22, 0x10, 0xff, 0x62,
+ 0x00, 0xdd, 0x74, 0x22, 0xfd, 0xe0, 0x47, 0x00, 0xcb, 0xf0, 0x42, 0x01,
+ 0xce, 0x00, 0x32, 0xda,
+ 0x00, 0x53, 0xd0, 0xba, 0x21, 0x12, 0x0e, 0x10, 0x12, 0xef, 0xff, 0x22,
+ 0x11, 0xdc, 0x21, 0x40,
+ 0xaf, 0xf0, 0x12, 0x21, 0x0c, 0xdb, 0x51, 0x12, 0xdc, 0xd0, 0x36, 0x00,
+ 0x2f, 0x40, 0xce, 0xef,
+ 0x43, 0x00, 0xdc, 0x00, 0x10, 0x20, 0x20, 0xef, 0xd1, 0xe0, 0x01, 0x60,
+ 0xfe, 0x06, 0x45, 0xed,
+ 0xd0, 0x23, 0x12, 0xed, 0x02, 0x44, 0xad, 0xee, 0x12, 0x3d, 0x0a, 0xa0,
+ 0x03, 0x00, 0x0f, 0x66,
+ 0x00, 0xba, 0x00, 0x21, 0x03, 0x00, 0x0f, 0x2f, 0xff, 0x01, 0xf4, 0x00,
+ 0x42, 0xfe, 0xde, 0x44,
+ 0x46, 0xdf, 0xaa, 0x00, 0x40, 0x03, 0x01, 0xee, 0xcb, 0x11, 0x31, 0xf0,
+ 0x32, 0x33, 0x8a, 0xff,
+ 0x00, 0x23, 0x10, 0x0f, 0x0f, 0xee, 0xf2, 0x13, 0x41, 0xda, 0xf0, 0x52,
+ 0x01, 0xcf, 0x10, 0x32,
+ 0x0e, 0xed, 0x01, 0x25, 0x01, 0xe0, 0x2e, 0x10, 0xe0, 0xf0, 0xbc, 0x0f,
+ 0x21, 0x01, 0x00, 0xf0,
+ 0x0d, 0x0f, 0xf1, 0x20, 0x61, 0x07, 0xb4, 0xfc, 0x30, 0x20, 0xc0, 0x10,
+ 0x0e, 0xda, 0x14, 0x45,
+ 0xde, 0xcc, 0x30, 0x00, 0x02, 0x11, 0x00, 0x10, 0x2e, 0x0e, 0xf1, 0xcf,
+ 0xe0, 0xd2, 0xfe, 0x70,
+ 0x40, 0x8d, 0x07, 0x34, 0xe9, 0xe0, 0x21, 0x42, 0xce, 0xdd, 0x22, 0x11,
+ 0x01, 0x00, 0x2f, 0x1b,
+ 0x20, 0x14, 0xf0, 0x00, 0x4f, 0xdb, 0x00, 0x72, 0x12, 0xaf, 0x10, 0x2e,
+ 0x0d, 0x26, 0xe1, 0xcd,
+ 0x10, 0x36, 0x00, 0xe0, 0xdf, 0x1f, 0x21, 0x02, 0xc1, 0x00, 0x0f, 0x53,
+ 0xef, 0xde, 0xf0, 0xe5,
+ 0x21, 0xec, 0x0e, 0x72, 0xe1, 0xbf, 0x0c, 0x21, 0x44, 0x00, 0xdb, 0xf1,
+ 0x34, 0x0f, 0x3f, 0x11,
+ 0x9e, 0xf0, 0x13, 0x52, 0xd9, 0xe0, 0x43, 0x23, 0xda, 0xff, 0x00, 0x33,
+ 0x0f, 0x1f, 0x31, 0xaf,
+ 0xfd, 0x12, 0x54, 0xfb, 0xd0, 0x10, 0x10, 0xef, 0xd0, 0x04, 0x2f, 0x2e,
+ 0x74, 0x00, 0xdf, 0xe0,
+ 0x20, 0x20, 0x0e, 0x47, 0x01, 0xcf, 0x20, 0x30, 0xd8, 0x01, 0x32, 0xc0,
+ 0xfe, 0x31, 0xf1, 0x00,
+ 0x20, 0x0d, 0x90, 0xdd, 0x00, 0x77, 0x00, 0x0b, 0x00, 0x14, 0xe0, 0xbe,
+ 0x0f, 0x00, 0x12, 0x00,
+ 0xe0, 0xe0, 0x11, 0x53, 0xc9, 0xce, 0x22, 0x25, 0xed, 0x00, 0x51, 0x00,
+ 0xbd, 0x11, 0x14, 0x0f,
+ 0x0e, 0x10, 0x01, 0x12, 0x01, 0xe1, 0xbf, 0x0f, 0x23, 0x24, 0x00, 0xd9,
+ 0x00, 0x54, 0x0e, 0x0d,
+ 0xf0, 0x43, 0x1e, 0xdc, 0xf0, 0x10, 0x30, 0x20, 0xe0, 0xce, 0x12, 0x77,
+ 0xf0, 0xa8, 0x0f, 0x42,
+ 0x02, 0xd0, 0x10, 0x0d, 0xf2, 0x11, 0x00, 0x1d, 0x0f, 0x10, 0x34, 0xc1,
+ 0xff, 0x2e, 0x65, 0xe2,
+ 0xef, 0xfc, 0x30, 0x1f, 0xcc, 0xef, 0x13, 0x36, 0x10, 0x0e, 0xdf, 0xe0,
+ 0x41, 0x24, 0xc0, 0xdf,
+ 0x54, 0x22, 0x00, 0xec, 0x9d, 0x11, 0x47, 0x02, 0xdc, 0x10, 0x01, 0xdf,
+ 0x40, 0x42, 0x00, 0x1e,
+ 0x02, 0xf4, 0xed, 0xeb, 0x11, 0xc0, 0xed, 0x71, 0x43, 0xbb, 0xff, 0x14,
+ 0x10, 0x0d, 0x0f, 0x02,
+ 0x23, 0xed, 0xde, 0x17, 0x21, 0xee, 0x01, 0x00, 0xec, 0x40, 0x23, 0xe2,
+ 0xaf, 0xec, 0x11, 0x21,
+ 0xd0, 0xf0, 0x30, 0x73, 0xf2, 0xbd, 0x25, 0x43, 0xe9, 0xf0, 0x01, 0x13,
+ 0x0e, 0x10, 0xfe, 0xfd,
+ 0xfe, 0x04, 0x31, 0xcb, 0xe0, 0x21, 0x61, 0x0d, 0xff, 0x04, 0xef, 0xf0,
+ 0x36, 0x70, 0x0b, 0xce,
+ 0x13, 0x35, 0x0f, 0xef, 0x00, 0x0f, 0x00, 0xc1, 0xd1, 0x10, 0x55, 0x00,
+ 0x0d, 0x0e, 0xb0, 0xf5,
+ 0xfd, 0x0c, 0xff, 0x30, 0x42, 0xef, 0xcb, 0xfd, 0xff, 0x65, 0x23, 0x0d,
+ 0x2f, 0x10, 0xc0, 0xee,
+ 0x37, 0x01, 0xaf, 0x00, 0x42, 0xeb, 0x00, 0x00, 0xe1, 0xf1, 0x01, 0x10,
+ 0x20, 0xcd, 0xfe, 0x11,
+ 0x47, 0x01, 0xc0, 0xdd, 0x0f, 0x74, 0x10, 0xca, 0x11, 0x44, 0xfe, 0xde,
+ 0x13, 0x10, 0x0f, 0x20,
+ 0x33, 0xde, 0xef, 0x77, 0x10, 0xbb, 0x00, 0x02, 0x10, 0x1d, 0x11, 0x00,
+ 0xcf, 0x00, 0x12, 0x00,
+ 0x0e, 0x32, 0x02, 0x9b, 0x0f, 0x10, 0x15, 0xf0, 0xde, 0x02, 0x10, 0x2d,
+ 0x31, 0xe1, 0xa0, 0x03,
+ 0x24, 0x4d, 0xfb, 0xf2, 0x01, 0x41, 0x10, 0xde, 0x15, 0x30, 0xaa, 0xff,
+ 0x12, 0x43, 0xdc, 0xbf,
+ 0x11, 0x01, 0x00, 0x1f, 0x10, 0x0f, 0x00, 0x06, 0x32, 0x00, 0xba, 0x10,
+ 0x10, 0x22, 0x02, 0x9e,
+ 0x0a, 0x00, 0x33, 0x01, 0xe0, 0xad, 0xfc, 0x23, 0x34, 0x0f, 0xf0, 0xf0,
+ 0xde, 0x42, 0x33, 0xa8,
+ 0x0f, 0x31, 0xf1, 0xe0, 0x04, 0x0e, 0x1e, 0x20, 0x02, 0xd1, 0x00, 0x20,
+ 0x40, 0xd9, 0x00, 0x72,
+ 0x10, 0xdc, 0xf0, 0xf0, 0xf4, 0x70, 0x1b, 0xdd, 0xf0, 0x23, 0x20, 0x02,
+ 0x32, 0xd1, 0xbb, 0x1f,
+ 0x60, 0x02, 0x14, 0x04, 0xf0, 0xcd, 0x10, 0x64, 0x00, 0xcb, 0x01, 0x33,
+ 0x00, 0xe1, 0x02, 0x0d,
+ 0x0e, 0x10, 0x11, 0xf1, 0xe0, 0x02, 0xfa, 0xcd, 0x10, 0x40, 0x11, 0xb2,
+ 0xcc, 0x0f, 0x54, 0x04,
+ 0xfe, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x42, 0xfe, 0xdb, 0x24, 0x14, 0xfe,
+ 0xfd, 0x4d, 0x0b, 0x13,
+ 0x77, 0x00, 0xed, 0xe1, 0x44, 0x10, 0xaa, 0x01, 0x42, 0x0f, 0xcd, 0x10,
+ 0x26, 0x0f, 0xce, 0xff,
+ 0x41, 0x22, 0x00, 0xf0, 0x00, 0x0d, 0x32, 0x24, 0xe0, 0xcf, 0x01, 0x20,
+ 0xcc, 0x0f, 0x00, 0x1f,
+ 0xff, 0xe1, 0x05, 0xed, 0xdc, 0x71, 0x02, 0xe0, 0x31, 0x13, 0xd0, 0xcc,
+ 0x01, 0x16, 0x62, 0x00,
+ 0xdc, 0xde, 0x01, 0x00, 0x41, 0x24, 0x0e, 0xfb, 0x10, 0xf0, 0xc0, 0x32,
+ 0x76, 0xee, 0xad, 0x11,
+ 0x14, 0x2f, 0xff, 0xbd, 0xf1, 0x02, 0x02, 0x20, 0xf0, 0xed, 0x20, 0x34,
+ 0x01, 0x07, 0x11, 0x0f,
+ 0xed, 0x0e, 0x0d, 0x41, 0x22, 0xfe, 0x4d, 0x61, 0xe2, 0xee, 0xf8, 0x2e,
+ 0x72, 0x03, 0x10, 0xf0,
+ 0xf2, 0xf0, 0x0e, 0x0b, 0x51, 0x00, 0xea, 0xe2, 0x06, 0x00, 0x8b, 0x00,
+ 0x00, 0x42, 0x00, 0xcf,
+ 0xf0, 0x11, 0x20, 0x01, 0x34, 0xdd, 0xde, 0x03, 0x20, 0x0d, 0x1f, 0x15,
+ 0x44, 0xde, 0x0d, 0x73,
+ 0x34, 0xc0, 0xf0, 0x00, 0x03, 0x00, 0x0b, 0x10, 0xb1, 0xce, 0x00, 0x50,
+ 0x0d, 0x0d, 0xf4, 0x01,
+ 0x0b, 0xfc, 0xe0, 0x30, 0x11, 0xf2, 0x22, 0x08, 0x8e, 0x01, 0x02, 0xf1,
+ 0x0f, 0x1e, 0x52, 0xdf,
+ 0xfb, 0x34, 0x44, 0xdf, 0xdc, 0x00, 0x20, 0x11, 0x30, 0x41, 0xc3, 0xa0,
+ 0x27, 0x00, 0xdb, 0x11,
+ 0x52, 0x0f, 0xee, 0x10, 0xfe, 0x00, 0x06, 0x00, 0x10, 0x50, 0xf0, 0xff,
+ 0xfd, 0x00, 0x03, 0x00,
+ 0xf0, 0x63, 0xee, 0xa9, 0x11, 0x41, 0xee, 0xcc, 0x33, 0x0f, 0xfd, 0x02,
+ 0x00, 0x0d, 0x25, 0x23,
+ 0x00, 0x00, 0x0c, 0xc0, 0xe0, 0x0e, 0x71, 0x27, 0xe0, 0xe3, 0x01, 0x0d,
+ 0xfb, 0xbe, 0xef, 0x25,
+ 0x73, 0x0d, 0xeb, 0xe0, 0x00, 0x0d, 0x10, 0x41, 0xf0, 0xfe, 0xde, 0x00,
+ 0x73, 0x00, 0xcb, 0x17,
+ 0x12, 0x0f, 0x0f, 0x0d, 0xee, 0x13, 0x47, 0xf0, 0xde, 0x00, 0x02, 0x40,
+ 0x10, 0x2e, 0x10, 0xc0,
+ 0xf0, 0x02, 0xf4, 0x00, 0x3c, 0x2f, 0x42, 0xe5, 0xc1, 0x0f, 0xfe, 0xdf,
+ 0x40, 0x70, 0x22, 0xcf,
+ 0xef, 0x17, 0x20, 0xca, 0xf0, 0x13, 0x41, 0x00, 0x89, 0xf0, 0x11, 0x31,
+ 0xdf, 0xf1, 0x10, 0x10,
+ 0x30, 0x1f, 0x00, 0x0e, 0x13, 0x57, 0xf1, 0xcf, 0x0f, 0x01, 0x51, 0x00,
+ 0xd0, 0x03, 0x22, 0x1d,
+ 0xcc, 0x10, 0x77, 0x00, 0x0d, 0x01, 0x01, 0x0f, 0x01, 0x01, 0xb8, 0x00,
+ 0x52, 0x00, 0xee, 0xef,
+ 0x0f, 0x00, 0x00, 0x03, 0x0e, 0xbb, 0x10, 0x43, 0x02, 0xee, 0x0d, 0x37,
+ 0x01, 0xbe, 0x0e, 0x00,
+ 0x32, 0xf0, 0xbe, 0x00, 0x33, 0x10, 0x0b, 0x22, 0xe0, 0xad, 0x12, 0x13,
+ 0x0f, 0x1f, 0x0f, 0x0f,
+ 0xfd, 0x0f, 0x67, 0xd3, 0xc8, 0x10, 0x30, 0x01, 0xe1, 0x21, 0x02, 0xaf,
+ 0x00, 0x35, 0x0b, 0xee,
+ 0x02, 0x14, 0x00, 0xff, 0xbb, 0xfe, 0x2f, 0x70, 0x43, 0xd0, 0xf0, 0x00,
+ 0x0f, 0x0a, 0x22, 0x01,
+ 0x10, 0x11, 0xf1, 0x01, 0xef, 0x0f, 0x61, 0x01, 0x01, 0x46, 0x01, 0x9f,
+ 0xfd, 0x36, 0x22, 0xee,
+ 0xff, 0x21, 0xce, 0xee, 0x14, 0xf2, 0xbf, 0x33, 0x2f, 0xb8, 0xfe, 0x01,
+ 0x24, 0xf0, 0xde, 0x00,
+ 0x53, 0xf1, 0xcc, 0x2e, 0x32, 0x12, 0xed, 0xff, 0x14, 0x14, 0xff, 0x1a,
+ 0x70, 0x20, 0xf0, 0x00,
+ 0xf4, 0x00, 0x10, 0xce, 0xff, 0x2f, 0x32, 0x80, 0xf0, 0x02, 0x0d, 0xf8,
+ 0x20, 0x53, 0x00, 0x0c,
+ 0x00, 0x00, 0x34, 0x50, 0xee, 0xf0, 0xf1, 0x16, 0x00, 0xcb, 0x20, 0x71,
+ 0xe0, 0xe0, 0x1f, 0x10,
+ 0x0f, 0xdb, 0x01, 0x76, 0x00, 0xfe, 0xe0, 0xf1, 0xf0, 0x10, 0x30, 0xe0,
+ 0xe3, 0x02, 0xb8, 0xf0,
+ 0x20, 0x32, 0x01, 0xdf, 0x3d, 0x10, 0xb0, 0x00, 0x00, 0xe0, 0x55, 0x42,
+ 0xcb, 0xcf, 0x10, 0x13,
+ 0x00, 0xcc, 0x23, 0x24, 0xcd, 0x0e, 0x21, 0xef, 0xdd, 0x23, 0x15, 0x00,
+ 0x44, 0xf0, 0x8e, 0x0f,
+ 0x30, 0x11, 0xfd, 0xf2, 0x02, 0xeb, 0x2c, 0x3f, 0x2c, 0xef, 0x00, 0x26,
+ 0x50, 0x00, 0xab, 0xe0,
+ 0x44, 0x22, 0xfe, 0xef, 0x10, 0x00, 0xf0, 0x31, 0x60, 0x00, 0x1d, 0x21,
+ 0x03, 0x00, 0x0d, 0x00,
+ 0x06, 0xb1, 0x11, 0x00, 0x8b, 0x0f, 0x10, 0x24, 0x03, 0xfe, 0xd9, 0xef,
+ 0x10, 0x32, 0xe0, 0xd0,
+ 0x40, 0x50, 0x14, 0xe2, 0xae, 0x00, 0x00, 0x53, 0x01, 0x01, 0xdf, 0x13,
+ 0x24, 0x0a, 0xfc, 0x0f,
+ 0x51, 0x02, 0xe2, 0xe0, 0xee, 0x1b, 0x50, 0xf0, 0x07, 0x03, 0x9d, 0xfc,
+ 0x21, 0x3f, 0x0e, 0xf2,
+ 0xf4, 0x00, 0x0d, 0xed, 0xfe, 0x33, 0x44, 0x01, 0xde, 0xec, 0xef, 0xce,
+ 0x02, 0x77, 0x00, 0x01,
+ 0x02, 0xee, 0xfc, 0x01, 0xe0, 0xe2, 0x63, 0x3f, 0x2c, 0x01, 0x12, 0xe0,
+ 0xa0, 0x27, 0x34, 0xec,
+ 0x0e, 0x01, 0xa1, 0xf1, 0x00, 0x40, 0x0e, 0xcc, 0xf0, 0x10, 0x4f, 0x10,
+ 0xed, 0xfd, 0x06, 0x33,
+ 0x10, 0x51, 0x0f, 0xbb, 0x10, 0x32, 0x02, 0xd0, 0xf5, 0xcf, 0xfd, 0x00,
+ 0x3f, 0x1f, 0xf3, 0xa7,
+ 0xff, 0x0e, 0xf0, 0x11, 0x2c, 0x2b, 0x10, 0xe0, 0xff, 0x3f, 0x41, 0x11,
+ 0xe0, 0xee, 0x00, 0x12,
+ 0x9e, 0xcb, 0x12, 0x24, 0x2f, 0x30, 0xb1, 0xac, 0x0e, 0x40, 0x12, 0xf2,
+ 0xd0, 0x00, 0x3d, 0x02,
+ 0xc1, 0xec, 0x1e, 0x1b, 0xf0, 0xf7, 0x57, 0x20, 0xfe, 0xc0, 0x21, 0xff,
+ 0x0c, 0x64, 0xf1, 0xe0,
+ 0x51, 0x00, 0xcb, 0x01, 0x46, 0xff, 0xbd, 0x21, 0x11, 0x00, 0x10, 0x00,
+ 0xf0, 0xf0, 0xed, 0x0d,
+ 0x2d, 0x00, 0x06, 0x31, 0xc1, 0xd1, 0x0f, 0x4d, 0xe0, 0x8f, 0x03, 0x07,
+ 0x20, 0x21, 0x00, 0x00,
+ 0x3f, 0x00, 0x00, 0x00, 0x23, 0xdd, 0xea, 0x71, 0x77, 0xf1, 0xde, 0xfc,
+ 0xf0, 0x12, 0x52, 0xf0,
+ 0xce, 0x0f, 0x00, 0x1c, 0xee, 0x03, 0x57, 0x00, 0x0e, 0xf2, 0xe0, 0x1e,
+ 0x41, 0xee, 0xed, 0x26,
+ 0x21, 0xfe, 0x00, 0x10, 0xf2, 0xe0, 0x0e, 0x20, 0xff, 0xbe, 0x20, 0x0e,
+ 0xe0, 0x06, 0x32, 0xed,
+ 0x9b, 0x10, 0x45, 0x00, 0x20, 0x51, 0xe0, 0xdb, 0x00, 0xf3, 0xd1, 0xf1,
+ 0x00, 0x70, 0x10, 0xbc,
+ 0x00, 0xe1, 0xf1, 0x20, 0x3e, 0x0c, 0xda, 0x50, 0x41, 0xef, 0xfb, 0x41,
+ 0x01, 0xff, 0x0f, 0x42,
+ 0x03, 0xf3, 0xde, 0x08, 0x30, 0x40, 0xe0, 0x37, 0x30, 0x90, 0xfe, 0x11,
+ 0x22, 0x00, 0xc0, 0x0f,
+ 0x3d, 0xcf, 0xe2, 0x57, 0x52, 0xef, 0xed, 0x01, 0xff, 0xed, 0x44, 0x21,
+ 0xcf, 0xeb, 0xe0, 0x24,
+ 0x22, 0xfd, 0xfc, 0xe0, 0xc2, 0x22, 0x63, 0xfc, 0xdf, 0x14, 0x51, 0x0d,
+ 0x1d, 0x03, 0xf3, 0x11,
+ 0x21, 0xfb, 0xec, 0x10, 0x02, 0x02, 0x10, 0xf0, 0x8e, 0x02, 0x00, 0xff,
+ 0x0f, 0x33, 0x00, 0xf2,
+ 0x27, 0x77, 0x22, 0xc8, 0xf0, 0x21, 0x10, 0x10, 0x4f, 0x00, 0xef, 0x01,
+ 0x02, 0x1f, 0xfe, 0xee,
+ 0x60, 0x32, 0xc1, 0xad, 0x0e, 0x01, 0x1e, 0x0f, 0x47, 0xd1, 0xb0, 0x0d,
+ 0x21, 0x12, 0xf3, 0x01,
+ 0x21, 0x0f, 0xfb, 0x00, 0x46, 0x33, 0xb0, 0x0c, 0xe0, 0x00, 0x12, 0x0d,
+ 0xfc, 0x03, 0xd1, 0xdd,
+ 0x30, 0x53, 0xea, 0x9d, 0x01, 0x05, 0x21, 0x20, 0x30, 0xcc, 0xaf, 0x01,
+ 0x04, 0x0f, 0x00, 0x13,
+ 0xec, 0xef, 0x25, 0x01, 0xdd, 0x0d, 0x73, 0x21, 0xfe, 0xfc, 0x04, 0x33,
+ 0x0d, 0xfc, 0x2f, 0x61,
+ 0xe1, 0xe0, 0x31, 0x40, 0x0c, 0xce, 0x0e, 0xf0, 0x14, 0x31, 0x0b, 0x1f,
+ 0x34, 0x25, 0xdf, 0x8f,
+ 0x10, 0x0f, 0x0c, 0x21, 0x35, 0xd0, 0xbe, 0x00, 0xf1, 0x54, 0x00, 0xda,
+ 0xe0, 0x72, 0x13, 0xde,
+ 0xf0, 0x00, 0xef, 0xf0, 0x17, 0x31, 0x0f, 0xef, 0xf0, 0xe0, 0xd0, 0x32,
+ 0x75, 0x3f, 0x0e, 0xec,
+ 0xf0, 0x20, 0x0f, 0x4f, 0x0e, 0xac, 0xde, 0xf3, 0x05, 0x00, 0xde, 0x0d,
+ 0x64, 0x11, 0xcc, 0xe0,
+ 0x01, 0x30, 0x52, 0x23, 0x0c, 0xed, 0xcc, 0x00, 0x34, 0x0d, 0xec, 0x02,
+ 0xe3, 0xde, 0x10, 0x11,
+ 0xac, 0xff, 0x01, 0x35, 0x23, 0x35, 0x01, 0xcd, 0x1f, 0x63, 0x17, 0x63,
+ 0x0f, 0xb8, 0x00, 0x20,
+ 0x01, 0x00, 0x02, 0xee, 0xff, 0x2f, 0x3f, 0x00, 0xe0, 0xde, 0x51, 0x33,
+ 0xca, 0xbf, 0x00, 0x30,
+ 0x1e, 0xe2, 0xd5, 0xfe, 0xcc, 0x10, 0x62, 0x04, 0xc0, 0x0f, 0x12, 0x2f,
+ 0xfc, 0xc0, 0x13, 0x32,
+ 0x01, 0xe3, 0x0b, 0xeb, 0x10, 0x71, 0x01, 0xdc, 0xd0, 0x24, 0x42, 0x0b,
+ 0xfe, 0x00, 0xe0, 0x12,
+ 0x71, 0x0f, 0xdf, 0xf1, 0x12, 0x61, 0x1f, 0x0b, 0xf1, 0x03, 0xcd, 0x03,
+ 0x27, 0x1e, 0xfb, 0x01,
+ 0x34, 0xf0, 0x80, 0x0d, 0x00, 0x21, 0x02, 0xf1, 0xf2, 0x00, 0x1d, 0x2a,
+ 0x21, 0xe3, 0xe4, 0x11,
+ 0x71, 0x1f, 0x99, 0xff, 0xf0, 0x22, 0x11, 0x13, 0x00, 0xfa, 0x0e, 0x2f,
+ 0x20, 0xd2, 0xf2, 0x33,
+ 0x50, 0x0e, 0xdd, 0xff, 0xf0, 0x22, 0x47, 0x03, 0x05, 0xb0, 0x9c, 0x00,
+ 0x31, 0x02, 0xf1, 0x02,
+ 0x40, 0x0d, 0xc0, 0x33, 0x41, 0x0d, 0xc0, 0x06, 0x2f, 0x0b, 0xff, 0x0f,
+ 0x00, 0x00, 0xed, 0xde,
+ 0x13, 0xf0, 0xd8, 0x4f, 0xf0, 0xa0, 0xf3, 0x14, 0x5f, 0x1c, 0xe0, 0xf3,
+ 0x36, 0x62, 0xfe, 0xed,
+ 0xfd, 0x00, 0x02, 0xf2, 0xf0, 0x21, 0x32, 0xff, 0xd8, 0xfe, 0x11, 0x65,
+ 0x0f, 0xec, 0xe0, 0xa0,
+ 0xf0, 0x20, 0x10, 0x11, 0x10, 0xe0, 0x0e, 0x70, 0x12, 0xf6, 0x02, 0x10,
+ 0x3f, 0xf0, 0x9c, 0xe0,
+ 0x02, 0x45, 0x20, 0xfd, 0xcc, 0xe0, 0x00, 0x46, 0x10, 0xfd, 0xb0, 0x0f,
+ 0x20, 0x20, 0x1d, 0x00,
+ 0x20, 0xfd, 0xc0, 0x05, 0xf1, 0x3f, 0x5e, 0xed, 0x05, 0x05, 0x0f, 0xac,
+ 0x20, 0x72, 0x04, 0xf0,
+ 0xe0, 0x00, 0x11, 0x0c, 0xd0, 0x35, 0x51, 0xe0, 0xc0, 0xf0, 0x01, 0x01,
+ 0x27, 0x00, 0x13, 0x00,
+ 0x74, 0xf4, 0x19, 0xc5, 0x7e, 0xf2, 0x69, 0xc3, 0xf9, 0x8f, 0xee, 0x16,
+ 0x03, 0xe0, 0xeb, 0xec,
+ 0xf0, 0x02, 0x44, 0xf2, 0xe2, 0xaf, 0x0d, 0x53, 0x02, 0xfc, 0x2e, 0x4e,
+ 0x10, 0x07, 0x0f, 0x3d,
+ 0x30, 0x0e, 0xcb, 0x11, 0x34, 0xbe, 0xcd, 0xf0, 0xf4, 0x00, 0x41, 0x01,
+ 0xa0, 0xfc, 0x21, 0x77,
+ 0x0e, 0xdc, 0xf0, 0x12, 0x34, 0x1e, 0xec, 0x00, 0x43, 0x00, 0x0d, 0x0f,
+ 0x00, 0x90, 0x01, 0x44,
+ 0x10, 0xd4, 0xdf, 0xfc, 0x3f, 0x50, 0xf2, 0xf5, 0x03, 0xfd, 0xdf, 0x16,
+ 0x22, 0xfd, 0xdb, 0x71,
+ 0x32, 0x02, 0xd1, 0xee, 0x0a, 0x20, 0x01, 0xf2, 0x00, 0x20, 0x8a, 0xdf,
+ 0xe0, 0x10, 0x0f, 0xe0,
+ 0x01, 0x05, 0x01, 0xd0, 0xde, 0x10, 0x1f, 0x10, 0x76, 0x11, 0xae, 0xfc,
+ 0x00, 0x25, 0x00, 0x10,
+ 0x1f, 0xde, 0xdf, 0x42, 0x53, 0x00, 0xd2, 0xdd, 0x3c, 0x50, 0x00, 0x0d,
+ 0x2b, 0x20, 0x30, 0x21,
+ 0xd1, 0xd0, 0x7d, 0x3e, 0x33, 0xe3, 0xa0, 0x03, 0x2b, 0xc8, 0x0d, 0x34,
+ 0xf4, 0xc1, 0x1e, 0x1d,
+ 0x0e, 0xf0, 0x14, 0x30, 0x51, 0x10, 0x0c, 0xf0, 0x00, 0x04, 0x01, 0x0e,
+ 0xfe, 0x35, 0x91, 0xaf,
+ 0x1e, 0x52, 0x00, 0xe0, 0x03, 0x06, 0xef, 0xee, 0x20, 0x33, 0x00, 0x10,
+ 0x0c, 0x01, 0xe6, 0xbf,
+ 0x0d, 0x30, 0x10, 0xc2, 0xcf, 0x09, 0x10, 0x1f, 0x03, 0xe4, 0xe3, 0x00,
+ 0x3b, 0x70, 0x02, 0xf2,
+ 0xe0, 0x0d, 0x4f, 0x40, 0x95, 0xee, 0x1b, 0x50, 0x0e, 0xd1, 0x14, 0x1d,
+ 0x2e, 0xff, 0xbe, 0x12,
+ 0x33, 0x23, 0x27, 0x03, 0xde, 0xcf, 0x0f, 0x0e, 0x33, 0x15, 0x8f, 0xef,
+ 0x20, 0x00, 0xfd, 0xfe,
+ 0x31, 0x50, 0x04, 0xf5, 0x01, 0x30, 0xfc, 0xdf, 0x16, 0x20, 0xef, 0xcb,
+ 0x30, 0x41, 0xf1, 0xf1,
+ 0x00, 0x1e, 0x0e, 0xc1, 0x14, 0x33, 0x00, 0x4c, 0x10, 0xa2, 0xd2, 0x00,
+ 0x2c, 0xdc, 0xb0, 0x00,
+ 0x61, 0x03, 0xdf, 0x98, 0x0d, 0x10, 0x10, 0x15, 0x04, 0xde, 0xdb, 0xff,
+ 0x00, 0x03, 0x0f, 0x5f,
+ 0x10, 0x21, 0xf0, 0xbd, 0x10, 0x20, 0x30, 0x13, 0x52, 0xe8, 0xbd, 0x0f,
+ 0x12, 0x00, 0x0f, 0xde,
+ 0x01, 0x34, 0x03, 0xfe, 0x2c, 0x30, 0xc1, 0xf4, 0x05, 0xc0, 0xe1, 0x30,
+ 0x70, 0x22, 0x21, 0xe0,
+ 0xb0, 0x01, 0x0e, 0x18, 0xef, 0x00, 0x75, 0x20, 0xca, 0x01, 0x02, 0x0f,
+ 0xbe, 0x20, 0x23, 0x10,
+ 0xde, 0x00, 0x00, 0xf0, 0xd0, 0xff, 0xed, 0x0e, 0x20, 0x77, 0x46, 0xce,
+ 0xf0, 0x00, 0x43, 0x44,
+ 0xef, 0xdd, 0x10, 0x4f, 0x10, 0xe2, 0xf4, 0xe0, 0xf8, 0x00, 0x0f, 0x20,
+ 0xe2, 0xe0, 0x00, 0x1f,
+ 0x00, 0x03, 0x70, 0xed, 0xef, 0x26, 0x34, 0xee, 0xdd, 0xf0, 0xc3, 0x20,
+ 0x7f, 0x00, 0x01, 0xfc,
+ 0xfe, 0x00, 0x50, 0x15, 0x02, 0x0d, 0x3c, 0x0f, 0xe0, 0x10, 0x24, 0xaf,
+ 0xfa, 0xf0, 0xcf, 0x00,
+ 0x44, 0xde, 0x9c, 0x02, 0x26, 0xf0, 0x0f, 0x40, 0x00, 0xd2, 0x11, 0x0d,
+ 0xbc, 0x01, 0x54, 0x20,
+ 0x0f, 0xd0, 0xef, 0x10, 0x73, 0x31, 0xdf, 0xdb, 0xfe, 0x20, 0x41, 0x06,
+ 0xcf, 0x0d, 0x0f, 0x1e,
+ 0x20, 0x00, 0x01, 0x00, 0x0b, 0xf0, 0x0f, 0x42, 0x64, 0x03, 0xa1, 0x04,
+ 0x00, 0x2a, 0x02, 0x12,
+ 0xf0, 0x0f, 0xf0, 0xc0, 0x00, 0x40, 0x0f, 0xde, 0x01, 0x47, 0x06, 0xdf,
+ 0xff, 0x2f, 0x21, 0xe2,
+ 0xef, 0x0f, 0xd3, 0x05, 0x00, 0xbc, 0xbd, 0x00, 0x53, 0x12, 0x1d, 0x4d,
+ 0x32, 0x05, 0xb2, 0x00,
+ 0x0a, 0x40, 0x10, 0xf3, 0xcf, 0x0e, 0x0c, 0xdf, 0xaf, 0x04, 0x33, 0x11,
+ 0xf1, 0xdf, 0x3e, 0x61,
+ 0x05, 0x04, 0xf1, 0x0d, 0x0c, 0x3d, 0x61, 0x05, 0x10, 0xea, 0xee, 0x00,
+ 0x11, 0x31, 0x3f, 0xdf,
+ 0xc2, 0xe5, 0x01, 0x30, 0xec, 0xd0, 0x03, 0x53, 0xcf, 0xfd, 0x20, 0x10,
+ 0x0e, 0x7d, 0x21, 0xd4,
+ 0xf2, 0x0d, 0xeb, 0x04, 0x57, 0xe0, 0xde, 0xe0, 0xbf, 0x02, 0x71, 0x0c,
+ 0xce, 0xfc, 0xfc, 0x30,
+ 0x47, 0xf0, 0xa0, 0xff, 0x0e, 0x0f, 0x00, 0x34, 0x03, 0x00, 0xec, 0xe0,
+ 0xe1, 0x0f, 0xf0, 0xd3,
+ 0x02, 0x70, 0x1e, 0xf0, 0xd2, 0x20, 0x0d, 0x10, 0x36, 0x02, 0xdd, 0x0b,
+ 0x2f, 0x20, 0x14, 0x10,
+ 0x7c, 0x2d, 0xfd, 0x0f, 0x42, 0x07, 0xb1, 0xdd, 0x2d, 0x71, 0x53, 0xef,
+ 0x0d, 0x0e, 0xfe, 0xd5,
+ 0x46, 0x40, 0x1f, 0xee, 0x00, 0x04, 0x0f, 0xdf, 0x21, 0x66, 0x00, 0xde,
+ 0xff, 0x00, 0x12, 0x01,
+ 0xe4, 0xe0, 0x10, 0x35, 0xcd, 0xcf, 0x10, 0x45, 0x1f, 0xbe, 0xef, 0x10,
+ 0x50, 0x00, 0xbf, 0xfe,
+ 0xf0, 0x1f, 0x31, 0x05, 0xeb, 0xdd, 0xf0, 0x11, 0x45, 0xff, 0xed, 0x00,
+ 0x03, 0x52, 0x03, 0x9d,
+ 0x08, 0x30, 0x44, 0xd2, 0xbf, 0x0c, 0x1f, 0x20, 0x11, 0xe0, 0xdc, 0x0f,
+ 0x1f, 0x71, 0x13, 0xff,
+ 0xf3, 0x17, 0x0e, 0xff, 0xf0, 0x02, 0x41, 0x23, 0x32, 0x0d, 0xbf, 0x04,
+ 0x03, 0x4c, 0xfc, 0xdd,
+ 0xfc, 0x10, 0x52, 0x06, 0xc0, 0xd0, 0xed, 0x10, 0x0d, 0x09, 0xf0, 0x33,
+ 0x33, 0xde, 0xbd, 0xe0,
+ 0xfb, 0x10, 0xf2, 0x05, 0x40, 0xcf, 0xbe, 0x40, 0x40, 0x13, 0xe0, 0xd0,
+ 0xe0, 0xf3, 0x21, 0x71,
+ 0x30, 0xee, 0xdc, 0x00, 0x10, 0x21, 0xe2, 0xd4, 0x05, 0x0f, 0x0b, 0xc0,
+ 0xf0, 0x2f, 0x4d, 0x61,
+ 0xf4, 0xc0, 0x00, 0x4d, 0xe8, 0xec, 0x41, 0x12, 0xf0, 0xdf, 0x1f, 0x30,
+ 0x00, 0xdf, 0xbe, 0xcf,
+ 0x0c, 0x5d, 0x12, 0xd7, 0x07, 0x20, 0x4f, 0x0f, 0x00, 0x00, 0x34, 0x33,
+ 0xff, 0xfa, 0xf0, 0x10,
+ 0x50, 0x10, 0xf2, 0x84, 0x0f, 0xfd, 0x0f, 0x40, 0x10, 0x04, 0xb0, 0xfd,
+ 0xfa, 0x21, 0x54, 0x00,
+ 0xcd, 0x00, 0xf0, 0x11, 0x30, 0x00, 0x03, 0xb3, 0xfe, 0x0e, 0x06, 0x02,
+ 0x23, 0xfe, 0xdd, 0x63,
+ 0x46, 0x33, 0x02, 0xee, 0xfc, 0x2f, 0x30, 0x0f, 0xd0, 0xce, 0x11, 0x01,
+ 0x0c, 0x0c, 0xe0, 0xb0,
+ 0xf3, 0xf1, 0xe1, 0xc0, 0xef, 0xd9, 0xf0, 0x51, 0x23, 0xed, 0x0d, 0x50,
+ 0x2b, 0x0d, 0xe2, 0xf7,
+ 0xf3, 0xff, 0x2d, 0xef, 0x8e, 0xfe, 0xdd, 0x12, 0x77, 0x66, 0xfe, 0xfe,
+ 0x00, 0x30, 0x0e, 0x01,
+ 0x04, 0x00, 0x0e, 0x20, 0xf1, 0xee, 0x0e, 0x11, 0xe6, 0x00, 0x4f, 0xcd,
+ 0xd5, 0x43, 0xff, 0xbc,
+ 0xff, 0x01, 0x51, 0x01, 0xb3, 0x00, 0x1d, 0x10, 0xf2, 0xbc, 0xec, 0x10,
+ 0x2e, 0xfc, 0x02, 0x23,
+ 0x6e, 0x0a, 0x10, 0x0c, 0x00, 0xe0, 0xf5, 0x01, 0x7f, 0x20, 0xf1, 0xce,
+ 0x0d, 0x04, 0x24, 0xcf,
+ 0x0d, 0x50, 0x2d, 0xef, 0xf6, 0x02, 0x31, 0x01, 0x01, 0x0e, 0xbc, 0xf3,
+ 0x07, 0x13, 0xf0, 0xbd,
+ 0xff, 0xf0, 0xd2, 0xd2, 0x12, 0x71, 0x1e, 0xed, 0x04, 0x33, 0x08, 0x2d,
+ 0x62, 0x16, 0x00, 0xed,
+ 0x0f, 0x30, 0x03, 0x00, 0xfe, 0xca, 0xe0, 0x00, 0x32, 0x90, 0xca, 0xf0,
+ 0x00, 0x23, 0x03, 0x00,
+ 0xbb, 0x10, 0x40, 0x31, 0x03, 0x00, 0x0c, 0x0f, 0x10, 0x02, 0xdd, 0xfd,
+ 0x71, 0x74, 0xe0, 0xee,
+ 0x01, 0x07, 0x02, 0x1f, 0x0d, 0xf1, 0xf1, 0xf0, 0x0e, 0xf0, 0x01, 0x4f,
+ 0x7f, 0x24, 0x01, 0xbc,
+ 0x00, 0x04, 0x00, 0x10, 0x1f, 0x08, 0xf0, 0x26, 0x01, 0xcf, 0xce, 0x0f,
+ 0x00, 0x02, 0x0f, 0x0d,
+ 0xed, 0x10, 0x37, 0xc2, 0xbd, 0x0e, 0x00, 0xf2, 0xf4, 0xed, 0xcd, 0xc0,
+ 0x23, 0x67, 0x02, 0xbc,
+ 0x0e, 0x01, 0x32, 0x12, 0xf0, 0xde, 0xfb, 0x20, 0x75, 0x00, 0xef, 0x00,
+ 0xf0, 0x0e, 0x10, 0x01,
+ 0xf0, 0x2e, 0x7d, 0x4e, 0x01, 0xc2, 0x00, 0x0c, 0x1e, 0x1e, 0x02, 0x15,
+ 0xe0, 0xc0, 0x00, 0x00,
+ 0x1a, 0xef, 0x00, 0x54, 0x00, 0xff, 0x4b, 0x70, 0x01, 0x01, 0xf0, 0x00,
+ 0x52, 0x02, 0x0d, 0xcd,
+ 0x07, 0x16, 0x21, 0xe0, 0xd1, 0x02, 0xfd, 0xed, 0x01, 0x01, 0x01, 0x1e,
+ 0xd9, 0xbe, 0x00, 0x54,
+ 0x2f, 0x0d, 0x01, 0x06, 0xf0, 0xf1, 0x0f, 0xdd, 0x00, 0x13, 0x81, 0xd1,
+ 0x04, 0x11, 0x0e, 0xcf,
+ 0x12, 0x77, 0x00, 0x0e, 0xe0, 0x10, 0x55, 0x2f, 0x0b, 0xe0, 0x00, 0x00,
+ 0x1c, 0xe0, 0x30, 0x25,
+ 0xb0, 0xef, 0xf0, 0x02, 0x1f, 0x0e, 0xd1, 0x23, 0x75, 0x30, 0xcc, 0xdf,
+ 0x01, 0x55, 0x10, 0x0d,
+ 0xef, 0x0f, 0xf0, 0x14, 0x21, 0x0f, 0x1c, 0x00, 0xf7, 0x00, 0x1f, 0xfd,
+ 0x20, 0x43, 0x45, 0x00,
+ 0x9d, 0x0e, 0x20, 0x23, 0x11, 0xee, 0x8e, 0x00, 0x24, 0x6f, 0x0b, 0xdf,
+ 0xe0, 0x00, 0x34, 0x00,
+ 0xf1, 0xe0, 0x0d, 0xe9, 0xce, 0xc1, 0x05, 0x32, 0xbf, 0xab, 0x00, 0x00,
+ 0x10, 0x11, 0x00, 0x13,
+ 0x01, 0xfd, 0x0d, 0x5f, 0xfe, 0x0c, 0x4e, 0x11, 0x04, 0xcc, 0xfd, 0x01,
+ 0x01, 0x0c, 0x0e, 0xf3,
+ 0xb0, 0xf8, 0x01, 0x52, 0xe1, 0xde, 0x3d, 0x73, 0x03, 0x00, 0x0d, 0x0b,
+ 0xf0, 0x07, 0x63, 0x00,
+ 0xef, 0xef, 0x00, 0x00, 0x11, 0x02, 0xf0, 0x00, 0x13, 0x0c, 0xec, 0xee,
+ 0xf0, 0x0e, 0x5f, 0x30,
+ 0xf2, 0xe4, 0x21, 0xcc, 0xce, 0x00, 0x55, 0x11, 0x11, 0x00, 0xd0, 0x06,
+ 0x32, 0x50, 0xf0, 0xb0,
+ 0xf0, 0x17, 0x62, 0x02, 0xd0, 0x11, 0x32, 0x3e, 0xea, 0x9e, 0x00, 0x25,
+ 0x21, 0xcd, 0xdc, 0x00,
+ 0x71, 0x02, 0xff, 0xed, 0xf3, 0x07, 0x22, 0xff, 0xed, 0x1f, 0x1f, 0x0f,
+ 0x03, 0x13, 0x0f, 0x10,
+ 0x32, 0x28, 0x7d, 0x10, 0xe1, 0xc1, 0x20, 0x31, 0xf0, 0xd0, 0x0f, 0x0f,
+ 0xdd, 0x77, 0x44, 0xed,
+ 0xa9, 0x01, 0x01, 0x11, 0x0f, 0x0e, 0xf0, 0x0f, 0x2f, 0xfe, 0xd2, 0x24,
+ 0x41, 0x32, 0xf0, 0xd0,
+ 0x0b, 0x30, 0x45, 0xe3, 0xa1, 0xee, 0x1e, 0x3f, 0xee, 0xef, 0x00, 0x00,
+ 0x04, 0x41, 0xee, 0xbb,
+ 0x1d, 0x60, 0x01, 0x12, 0x0f, 0xc8, 0xf0, 0x23, 0x70, 0x0e, 0xee, 0xdf,
+ 0x0d, 0x00, 0x24, 0x34,
+ 0xe0, 0xed, 0xff, 0x00, 0x03, 0x77, 0x43, 0xfc, 0xe0, 0x24, 0x32, 0x4e,
+ 0x0f, 0x0f, 0xf0, 0xd0,
+ 0xf7, 0x02, 0x01, 0xd0, 0x8d, 0xcf, 0xf0, 0x05, 0x22, 0x00, 0x3f, 0x0b,
+ 0x00, 0xf0, 0x1d, 0x5c,
+ 0x00, 0x12, 0x04, 0x61, 0x0d, 0xea, 0xe0, 0x01, 0x02, 0xe1, 0x02, 0x1f,
+ 0xdf, 0x00, 0x0e, 0x8d,
+ 0x07, 0x06, 0x30, 0x50, 0x10, 0x0f, 0x1e, 0x62, 0x01, 0x00, 0x00, 0x21,
+ 0x3d, 0xea, 0xe0, 0x02,
+ 0xd0, 0x01, 0x21, 0x50, 0x1c, 0xfc, 0xad, 0xe1, 0xd7, 0x01, 0x30, 0x6f,
+ 0x1b, 0x00, 0xf0, 0xd2,
+ 0x12, 0x21, 0x0f, 0x0e, 0x1f, 0x40, 0xc0, 0xb5, 0xf2, 0x00, 0x1f, 0x1e,
+ 0xce, 0x00, 0x57, 0x16,
+ 0x10, 0xfb, 0xf0, 0xc0, 0xc0, 0x00, 0x30, 0x31, 0xa0, 0xdc, 0xf0, 0x10,
+ 0x11, 0xe1, 0xde, 0x0f,
+ 0x41, 0x27, 0xe2, 0xff, 0xfe, 0xa0, 0xf0, 0x00, 0xe2, 0xc0, 0xfc, 0x2f,
+ 0x20, 0xd0, 0x91, 0xef,
+ 0x21, 0x77, 0x22, 0x0c, 0x00, 0x21, 0x10, 0x1e, 0x00, 0x03, 0x10, 0x09,
+ 0x30, 0x01, 0xa2, 0xe0,
+ 0xfe, 0x1b, 0x30, 0x0f, 0xef, 0xc0, 0x72, 0x51, 0x0b, 0x00, 0xf2, 0x27,
+ 0x10, 0x0e, 0x01, 0x32,
+ 0x00, 0x8e, 0xff, 0x02, 0x07, 0xe1, 0xdc, 0x0f, 0x32, 0x02, 0x00, 0xcd,
+ 0x20, 0x21, 0x00, 0xdd,
+ 0x00, 0x32, 0x0d, 0xbc, 0x02, 0x24, 0x2f, 0xdb, 0xde, 0x01, 0x44, 0xe4,
+ 0x80, 0xff, 0x10, 0xed,
+ 0xcd, 0x0e, 0x52, 0x06, 0x12, 0xf3, 0xf0, 0x0b, 0x0d, 0x1d, 0x70, 0x20,
+ 0x10, 0xf3, 0xe0, 0xdb,
+ 0x1d, 0x00, 0x03, 0x12, 0x06, 0x23, 0x4d, 0xc8, 0x8f, 0xf2, 0x03, 0x20,
+ 0x0d, 0x10, 0x20, 0x00,
+ 0xd0, 0x00, 0x1d, 0x3d, 0x2f, 0x1e, 0x00, 0xd3, 0xf7, 0xb0, 0xfc, 0xf0,
+ 0x30, 0x53, 0xc0, 0xcc,
+ 0x03, 0x05, 0x0f, 0x0c, 0x20, 0xe1, 0x00, 0x71, 0x13, 0x10, 0x0b, 0x00,
+ 0x10, 0xb0, 0xd0, 0x03,
+ 0x10, 0x58, 0x00, 0xe2, 0x05, 0x20, 0xff, 0xff, 0x22, 0x95, 0x90, 0x0d,
+ 0x00, 0x02, 0xfe, 0x0f,
+ 0x01, 0xf2, 0x0c, 0x2d, 0x73, 0x57, 0x00, 0xfb, 0xde, 0x0f, 0x00, 0x32,
+ 0x11, 0x0e, 0xc0, 0xd0,
+ 0xf0, 0xeb, 0x00, 0x0f, 0xd0, 0xe1, 0x42, 0x5e, 0x2e, 0x0f, 0x2c, 0x60,
+ 0x37, 0x07, 0xc0, 0x0d,
+ 0x00, 0x51, 0x01, 0xe2, 0xe1, 0xee, 0x00, 0x31, 0x50, 0xfc, 0x00, 0xd2,
+ 0xef, 0x02, 0x66, 0x0e,
+ 0xcb, 0x00, 0x10, 0x21, 0x00, 0x0e, 0x00, 0x00, 0x10, 0x03, 0x17, 0x04,
+ 0x00, 0x1f, 0x10, 0x90,
+ 0xe3, 0xd3, 0x10, 0x3e, 0x00, 0x20, 0x71, 0x13, 0xfe, 0x09, 0x20, 0xf0,
+ 0xb0, 0x0d, 0x4f, 0xf0,
+ 0xd3, 0xf5, 0x0f, 0xed, 0xf1, 0xe7, 0xd1, 0xee, 0x1e, 0x20, 0x82, 0xc0,
+ 0xfd, 0x18, 0x4f, 0x30,
+ 0x02, 0x02, 0x40, 0xec, 0xcd, 0x0f, 0x72, 0x15, 0x24, 0x01, 0xfe, 0xdd,
+ 0x00, 0x44, 0xf0, 0xeb,
+ 0x10, 0x62, 0x00, 0x0f, 0x2d, 0x50, 0x00, 0x02, 0xff, 0xed, 0xdc, 0xe1,
+ 0x35, 0x30, 0x8e, 0xd0,
+ 0x03, 0xe0, 0x0a, 0x4d, 0x23, 0xf5, 0xe0, 0x10, 0x6f, 0xfd, 0xde, 0xff,
+ 0xf3, 0xf4, 0x02, 0x23,
+ 0x4f, 0x0a, 0x9e, 0xfd, 0x0f, 0x22, 0x57, 0x13, 0x00, 0x0c, 0x0e, 0x0e,
+ 0xf0, 0x05, 0x01, 0xf0,
+ 0xcd, 0x00, 0x0f, 0x3e, 0x00, 0xf0, 0xe0, 0x20, 0x31, 0xf3, 0xae, 0x1b,
+ 0x70, 0x57, 0xf5, 0xdf,
+ 0xfe, 0xf0, 0xf4, 0x01, 0x21, 0x0f, 0xae, 0xf1, 0x00, 0x31, 0x46, 0x22,
+ 0xe1, 0xf0, 0xfc, 0x0d,
+ 0x60, 0x20, 0xf0, 0xdf, 0xe0, 0x0d, 0x61, 0x02, 0x0a, 0xcc, 0xfe, 0xf3,
+ 0x24, 0x02, 0xfe, 0xfc,
+ 0x0f, 0x02, 0x16, 0x00, 0xde, 0x1f, 0x71, 0x62, 0xff, 0xd0, 0xf4, 0x1f,
+ 0x4d, 0x13, 0x05, 0xcf,
+ 0x0b, 0x10, 0x11, 0x14, 0x00, 0x1e, 0x00, 0xd0, 0x03, 0x01, 0x10, 0x5d,
+ 0x3b, 0x10, 0xd7, 0xd2,
+ 0x0e, 0x2e, 0x7f, 0x50, 0xee, 0xc2, 0xf0, 0x22, 0x20, 0x00, 0xeb, 0xe1,
+ 0x06, 0x22, 0x50, 0xcc,
+ 0xbd, 0x01, 0x15, 0x00, 0xeb, 0xf0, 0x01, 0x02, 0x0f, 0xbc, 0x0e, 0xf0,
+ 0x11, 0x12, 0xe0, 0xfe,
+ 0xe2, 0xe6, 0x00, 0x4c, 0x2f, 0xb0, 0xd5, 0xe1, 0xe2, 0xef, 0x0c, 0x70,
+ 0x70, 0xe0, 0xd0, 0x00,
+ 0x31, 0x42, 0x00, 0x30, 0x00, 0xef, 0xe0, 0x30, 0x57, 0x00, 0xb8, 0x0f,
+ 0xff, 0x02, 0x01, 0xae,
+ 0x0d, 0x2f, 0x0e, 0xf1, 0x02, 0x2f, 0x08, 0x1e, 0x70, 0x32, 0x00, 0xef,
+ 0x22, 0x47, 0x01, 0xfe,
+ 0xff, 0x10, 0x04, 0xf0, 0xef, 0xbf, 0x00, 0x05, 0xf0, 0xcd, 0xe0, 0x23,
+ 0x71, 0x30, 0xe0, 0xf0,
+ 0xfb, 0x00, 0x00, 0x00, 0xfe, 0xce, 0xc4, 0xf2, 0x0d, 0x1a, 0x22, 0x04,
+ 0xd1, 0xb2, 0xd0, 0xe0,
+ 0x4d, 0x41, 0x05, 0xf2, 0x02, 0x0f, 0xe8, 0x0f, 0x40, 0x70, 0x24, 0x20,
+ 0xef, 0xff, 0x0e, 0x30,
+ 0x42, 0xf1, 0x8e, 0xf1, 0x04, 0x20, 0x0e, 0xf0, 0xe1, 0xf4, 0x00, 0x7b,
+ 0x20, 0x10, 0xf0, 0xf0,
+ 0x10, 0x17, 0x65, 0x10, 0x0b, 0xee, 0xff, 0x01, 0x05, 0x00, 0xef, 0x00,
+ 0x10, 0x24, 0xd0, 0x90,
+ 0xff, 0xf0, 0x20, 0x50, 0x00, 0xf1, 0x00, 0x1e, 0x2f, 0x00, 0x01, 0x0c,
+ 0x1c, 0x50, 0x10, 0x0c,
+ 0xff, 0xe0, 0x8d, 0xcb, 0xf0, 0x02, 0x05, 0x10, 0x0e, 0xa2, 0xe6, 0xcf,
+ 0x1c, 0x20, 0x11, 0xf4,
+ 0xd0, 0xed, 0x3f, 0x61, 0x04, 0xdd, 0xfb, 0x00, 0x22, 0x42, 0x0f, 0x0c,
+ 0xed, 0xc0, 0xe1, 0xd0,
+ 0xb9, 0xff, 0x3f, 0x71, 0xff, 0xcb, 0x00, 0x01, 0x42, 0x20, 0x1d, 0x0f,
+ 0xf0, 0x07, 0x56, 0x3e,
+ 0x0e, 0xd0, 0xf1, 0x02, 0x00, 0xd0, 0x0e, 0x02, 0x03, 0xa0, 0x01, 0x01,
+ 0x23, 0x00, 0x3a, 0x00,
+ 0x57, 0x19, 0x8c, 0x09, 0x84, 0x1b, 0xeb, 0x0b, 0x65, 0x23, 0x0f, 0xdb,
+ 0xff, 0x0e, 0x40, 0x50,
+ 0x11, 0x00, 0x00, 0xfd, 0xd0, 0xd3, 0xe7, 0x32, 0x70, 0x30, 0xb3, 0xe5,
+ 0x00, 0x1e, 0x0e, 0x32,
+ 0x24, 0xc2, 0xef, 0x09, 0x20, 0x50, 0x22, 0x00, 0x1f, 0x40, 0x05, 0xa0,
+ 0xef, 0xee, 0x02, 0x02,
+ 0xf2, 0xfe, 0xde, 0xbf, 0x00, 0x0d, 0x00, 0xc7, 0xf1, 0x1e, 0x7e, 0x3e,
+ 0x10, 0xf6, 0xc3, 0x10,
+ 0x4b, 0x2e, 0x00, 0xf1, 0xee, 0xfd, 0x05, 0x76, 0x20, 0xfb, 0xd0, 0x00,
+ 0x30, 0x00, 0x02, 0x1f,
+ 0x1e, 0xdf, 0x9e, 0x00, 0x12, 0x10, 0x0f, 0x1e, 0xe0, 0xad, 0xec, 0x0e,
+ 0x0f, 0x1c, 0x1e, 0x17,
+ 0x27, 0x03, 0x0e, 0x2d, 0x21, 0xb4, 0xd0, 0x90, 0xe0, 0x0d, 0x30, 0x73,
+ 0x01, 0xef, 0xff, 0x0f,
+ 0x2f, 0x30, 0x2f, 0x0e, 0x02, 0x17, 0x16, 0x0d, 0xed, 0xce, 0xb0, 0xe5,
+ 0xf1, 0xde, 0xfb, 0x1f,
+ 0xff, 0xf0, 0x73, 0x30, 0x1f, 0x40, 0x31, 0x23, 0xf2, 0xc5, 0x00, 0xfd,
+ 0x32, 0x14, 0xc0, 0xce,
+ 0xef, 0xe4, 0xa3, 0xf0, 0x0d, 0xcf, 0xfc, 0x32, 0x77, 0x14, 0x20, 0x00,
+ 0x1d, 0x40, 0x00, 0x22,
+ 0x00, 0x0d, 0x0e, 0x0c, 0x1d, 0x31, 0xc7, 0x8f, 0xfd, 0x00, 0x30, 0x05,
+ 0xf2, 0xd2, 0xe2, 0x12,
+ 0x40, 0x0c, 0xf0, 0xde, 0xff, 0xd0, 0xe0, 0x1d, 0x7c, 0x76, 0x02, 0xed,
+ 0x0c, 0x00, 0x33, 0x25,
+ 0x22, 0x00, 0xdd, 0x0f, 0x0e, 0x3e, 0x3e, 0x1d, 0x0f, 0xa2, 0xc7, 0xf0,
+ 0x5d, 0x73, 0x57, 0xf2,
+ 0xdd, 0xfc, 0x10, 0x32, 0x21, 0xe1, 0xcf, 0xf0, 0x03, 0x04, 0x00, 0xef,
+ 0xce, 0xef, 0x0f, 0x0a,
+ 0x0e, 0x00, 0xe1, 0xd5, 0x1d, 0x5c, 0x00, 0x02, 0x10, 0x4d, 0x20, 0xae,
+ 0xca, 0xdf, 0x1e, 0x20,
+ 0x16, 0xbf, 0xdd, 0xf0, 0x04, 0x42, 0x1d, 0xe1, 0xe7, 0x01, 0x0f, 0xed,
+ 0x10, 0x73, 0x55, 0x00,
+ 0x11, 0xf1, 0x00, 0x00, 0x15, 0x12, 0x0d, 0x2e, 0x01, 0xb4, 0xde, 0xfa,
+ 0x0f, 0xfe, 0xc0, 0x01,
+ 0x30, 0x78, 0x40, 0x10, 0x00, 0xe2, 0xee, 0x2f, 0x7e, 0x20, 0x04, 0x00,
+ 0xf1, 0xf0, 0x0e, 0xf0,
+ 0x05, 0x43, 0xec, 0xcd, 0xe1, 0x07, 0x22, 0x0e, 0xef, 0xdf, 0x00, 0x13,
+ 0x74, 0x70, 0x0f, 0xfe,
+ 0xd0, 0xf7, 0xff, 0xfc, 0x0e, 0x00, 0x00, 0x03, 0xe3, 0xcf, 0xce, 0xef,
+ 0x1f, 0x21, 0xd0, 0xaf,
+ 0x06, 0x41, 0x0d, 0x2b, 0x20, 0x34, 0x01, 0x0e, 0x1a, 0x50, 0x00, 0xd0,
+ 0xbe, 0x01, 0x44, 0x51,
+ 0x0f, 0xcf, 0xf0, 0xf1, 0x07, 0xe1, 0xe0, 0x1c, 0x3f, 0x00, 0x02, 0x30,
+ 0xfe, 0x00, 0x00, 0x3e,
+ 0x4b, 0x3e, 0x00, 0xc3, 0xf1, 0x50, 0x60, 0x00, 0xae, 0xee, 0x03, 0xf6,
+ 0x1f, 0x2f, 0x04, 0xe2,
+ 0xed, 0x0f, 0x4d, 0xeb, 0x01, 0x65, 0x31, 0x1f, 0x0d, 0x0f, 0xd0, 0x05,
+ 0x10, 0x49, 0x0f, 0xb1,
+ 0xc3, 0x02, 0x1d, 0x1d, 0xc1, 0xc7, 0xe1, 0xe0, 0x2e, 0x52, 0x02, 0xd1,
+ 0xd2, 0x0f, 0x5c, 0x42,
+ 0x13, 0x0d, 0x0a, 0xe3, 0x13, 0x70, 0x1c, 0xf0, 0xc0, 0x00, 0x0c, 0xdc,
+ 0xef, 0x1d, 0x20, 0xfd,
+ 0x99, 0x0e, 0xef, 0x00, 0x40, 0x1c, 0x00, 0x05, 0x14, 0x20, 0x0c, 0x2f,
+ 0x61, 0x16, 0x11, 0xff,
+ 0xd0, 0x0f, 0x00, 0xf0, 0xf3, 0xff, 0x0f, 0x0d, 0x0f, 0x20, 0x16, 0xf0,
+ 0x6d, 0x70, 0x10, 0x10,
+ 0x03, 0xf0, 0xe9, 0x20, 0x43, 0x11, 0x10, 0xb0, 0xc1, 0xf0, 0xf0, 0xe0,
+ 0xd1, 0x00, 0x5e, 0x04,
+ 0xf7, 0xe4, 0x2e, 0x50, 0x00, 0x00, 0xf2, 0xf4, 0x00, 0x1c, 0x20, 0xe0,
+ 0xd4, 0x71, 0x10, 0xd0,
+ 0xa0, 0x03, 0x00, 0x2a, 0x00, 0xf5, 0xb1, 0xe1, 0xf0, 0x49, 0x0f, 0xf0,
+ 0x02, 0x33, 0x2f, 0xec,
+ 0xdd, 0x1e, 0x72, 0x60, 0xf0, 0xf1, 0x01, 0x00, 0x4f, 0x11, 0x14, 0xff,
+ 0xfc, 0x03, 0x37, 0xd0,
+ 0xae, 0x0e, 0x21, 0x01, 0x0d, 0xdf, 0x00, 0x14, 0x10, 0x3b, 0x31, 0x42,
+ 0x28, 0x2d, 0xf0, 0x90,
+ 0x01, 0x01, 0x22, 0x52, 0xff, 0xcd, 0xf1, 0xd2, 0xe0, 0xed, 0x04, 0x07,
+ 0x00, 0xfe, 0xae, 0xf0,
+ 0x1f, 0x73, 0x67, 0x00, 0xc0, 0x00, 0xf0, 0x11, 0x22, 0x0d, 0xdc, 0x00,
+ 0xf8, 0x0e, 0x0f, 0x10,
+ 0x00, 0x0c, 0xef, 0xe1, 0x36, 0x40, 0xdd, 0xe2, 0x64, 0x62, 0x00, 0xec,
+ 0xf0, 0x10, 0x33, 0x20,
+ 0x0e, 0xd0, 0xd0, 0xd0, 0x00, 0x23, 0x57, 0xf5, 0xcf, 0xee, 0x01, 0x13,
+ 0x51, 0x12, 0xee, 0xca,
+ 0x31, 0x74, 0x1e, 0x0c, 0xcf, 0x00, 0x02, 0x01, 0xf0, 0x4f, 0x20, 0xeb,
+ 0x9f, 0xf0, 0xf5, 0x02,
+ 0x40, 0x1b, 0xf0, 0xe2, 0x0f, 0x0d, 0x10, 0x14, 0x63, 0x10, 0x0d, 0xeb,
+ 0xfd, 0x10, 0x76, 0x13,
+ 0xf1, 0xdd, 0x0f, 0x02, 0x01, 0xfe, 0x0e, 0xe0, 0xf3, 0x03, 0xf0, 0x11,
+ 0x7e, 0x18, 0x10, 0x12,
+ 0x04, 0x00, 0x0f, 0x0e, 0x0f, 0x53, 0x02, 0xd0, 0xfc, 0x1e, 0x0e, 0x05,
+ 0x24, 0x01, 0xcf, 0xfb,
+ 0x0f, 0x0e, 0xde, 0x8f, 0xc2, 0x07, 0x21, 0xf0, 0xac, 0xff, 0xcf, 0xf0,
+ 0x11, 0x61, 0x10, 0x0d,
+ 0xe0, 0xdd, 0xec, 0x0e, 0x13, 0x37, 0x03, 0x0c, 0xee, 0xb0, 0x07, 0x10,
+ 0x61, 0x00, 0x0f, 0x0e,
+ 0xef, 0xe0, 0x03, 0x67, 0x30, 0xfb, 0xb0, 0x00, 0x00, 0x00, 0xf4, 0x0e,
+ 0xfd, 0x10, 0x0f, 0xef,
+ 0xf0, 0x2f, 0x3d, 0x20, 0x25, 0xf0, 0x0e, 0x7e, 0x60, 0x12, 0x04, 0xd0,
+ 0x20, 0x50, 0x04, 0x00,
+ 0x0f, 0x2c, 0x02, 0x27, 0x43, 0x0d, 0xde, 0x11, 0xe3, 0xae, 0xff, 0x11,
+ 0x71, 0x10, 0xdb, 0xe0,
+ 0xf0, 0x03, 0x10, 0x1d, 0x1b, 0xef, 0xb0, 0xf0, 0xd3, 0xf7, 0x17, 0x4e,
+ 0x0e, 0xb0, 0x03, 0xe2,
+ 0xe0, 0xdf, 0x10, 0x7f, 0x1f, 0x0e, 0x0e, 0xfe, 0x35, 0x56, 0x10, 0xef,
+ 0x0f, 0x10, 0xd2, 0xdf,
+ 0x2d, 0x23, 0xf7, 0xd2, 0xf0, 0xfd, 0xd0, 0x70, 0x71, 0x3e, 0x0c, 0xff,
+ 0x03, 0x25, 0x30, 0x30,
+ 0x2b, 0x00, 0xf0, 0x80, 0xf2, 0x01, 0x22, 0x30, 0x0e, 0xc4, 0xd2, 0x0e,
+ 0x0a, 0x0e, 0x12, 0x17,
+ 0x40, 0x10, 0xfe, 0xaf, 0x00, 0xd2, 0xf0, 0x0f, 0x0a, 0x50, 0x32, 0x01,
+ 0xfe, 0xeb, 0x2f, 0x30,
+ 0x03, 0xb0, 0xfd, 0x0f, 0x01, 0xa2, 0xcf, 0xed, 0xe1, 0xd4, 0xb3, 0xf0,
+ 0xcc, 0xf0, 0x4f, 0x3e,
+ 0x04, 0xc7, 0xe5, 0x0f, 0x30, 0x2f, 0x2f, 0x4f, 0xc0, 0x90, 0xfd, 0x0c,
+ 0xef, 0x0a, 0xfe, 0xfd,
+ 0xdf, 0xcc, 0xfe, 0x20, 0x50, 0x1c, 0x2f, 0x31, 0x22, 0xf2, 0x07, 0x24,
+ 0x5e, 0x2f, 0x40, 0x01,
+ 0xf2, 0x01, 0x10, 0x1b, 0xde, 0xb0, 0xfd, 0x0f, 0x50, 0x07, 0x00, 0x30,
+ 0x4f, 0x02, 0xb2, 0xe5,
+ 0x00, 0x2c, 0x0c, 0xc0, 0x03, 0x64, 0x00, 0xbc, 0x0f, 0xe0, 0x01, 0xf1,
+ 0x04, 0x00, 0x6f, 0x20,
+ 0xe2, 0xb0, 0x13, 0x25, 0x31, 0x20, 0x00, 0xff, 0x00, 0x10, 0xec, 0xe9,
+ 0x30, 0x73, 0x04, 0xa1,
+ 0xf0, 0x0f, 0xf1, 0x15, 0x23, 0xe1, 0xc0, 0xff, 0x0f, 0x27, 0x30, 0xec,
+ 0xaf, 0xf0, 0xe4, 0x10,
+ 0x4e, 0x1b, 0x00, 0xf0, 0x00, 0x03, 0x6f, 0x4c, 0x0f, 0xee, 0x00, 0x02,
+ 0x06, 0x21, 0x3d, 0x3e,
+ 0xf0, 0xa0, 0xf1, 0xff, 0x0e, 0x10, 0xf0, 0xbf, 0x0d, 0xef, 0x0f, 0x5e,
+ 0x31, 0x02, 0xc0, 0x08,
+ 0x0f, 0x2f, 0x14, 0x24, 0x0f, 0x9b, 0xe0, 0x17, 0x41, 0x0f, 0xdc, 0xe1,
+ 0xe3, 0xe1, 0x01, 0x70,
+ 0x2d, 0x10, 0x02, 0xf0, 0xfd, 0x0f, 0x21, 0x00, 0xd0, 0x11, 0x40, 0x0a,
+ 0xbf, 0x03, 0x03, 0xea,
+ 0xee, 0xcf, 0x00, 0x90, 0xef, 0x0f, 0x6f, 0x2e, 0xfc, 0xbf, 0x03, 0x05,
+ 0x20, 0x20, 0x10, 0xf5,
+ 0xd7, 0x03, 0x20, 0x2d, 0x0f, 0x10, 0xf2, 0x01, 0x31, 0x00, 0x30, 0x77,
+ 0x50, 0x0c, 0xff, 0x10,
+ 0x10, 0x21, 0x1f, 0x41, 0x21, 0x12, 0x14, 0xf0, 0xbd, 0xdc, 0x0f, 0x20,
+ 0xb2, 0x91, 0xf8, 0xff,
+ 0x1f, 0x0e, 0xd0, 0x0e, 0x24, 0x33, 0x0f, 0x20, 0x76, 0x34, 0x0f, 0xed,
+ 0x02, 0x02, 0xdf, 0xfd,
+ 0xe1, 0x12, 0x35, 0xf3, 0x03, 0x70, 0x4d, 0x00, 0xe2, 0x67, 0x30, 0x2d,
+ 0x02, 0x22, 0x00, 0xbf,
+ 0xe0, 0x02, 0x0b, 0x5e, 0xfd, 0xe9, 0xef, 0xdd, 0xce, 0x10, 0x47, 0x30,
+ 0xdd, 0xf0, 0x33, 0x42,
+ 0x0c, 0xe2, 0xd7, 0x80, 0xee, 0xf0, 0xe5, 0x00, 0x0c, 0x2f, 0x00, 0xd1,
+ 0xf2, 0x30, 0x6f, 0x1e,
+ 0x0f, 0x00, 0xe0, 0x3d, 0x1e, 0x10, 0xe0, 0x9c, 0xd0, 0x07, 0x02, 0x0d,
+ 0x3e, 0x23, 0xb7, 0xb2,
+ 0x00, 0x02, 0x53, 0x0d, 0xbb, 0xf0, 0xe2, 0x03, 0x45, 0x00, 0x0b, 0xf0,
+ 0x30, 0x21, 0xc0, 0xf0,
+ 0x00, 0x40, 0x21, 0x0f, 0xeb, 0x0f, 0x3d, 0x7c, 0x32, 0x01, 0xcd, 0xf9,
+ 0xe1, 0x34, 0x71, 0x0d,
+ 0x0e, 0x01, 0x24, 0xf0, 0xd0, 0x22, 0x42, 0x0f, 0x0c, 0xc0, 0x10, 0x2f,
+ 0x0c, 0xe0, 0x22, 0x34,
+ 0x1e, 0xf9, 0xa0, 0xe2, 0xd4, 0xe0, 0xd0, 0x84, 0xf1, 0xed, 0x2e, 0xff,
+ 0xbf, 0xe1, 0xd3, 0x00,
+ 0x00, 0x08, 0x40, 0x30, 0x3c, 0x2f, 0x62, 0x27, 0x10, 0x1d, 0x3f, 0xe0,
+ 0xce, 0x01, 0x24, 0x21,
+ 0xce, 0x9d, 0xde, 0xe0, 0xf0, 0x05, 0x73, 0x10, 0xff, 0xde, 0x0d, 0x10,
+ 0x37, 0x06, 0xfc, 0x0e,
+ 0x30, 0x03, 0xb1, 0xee, 0xeb, 0x1f, 0x71, 0x14, 0xee, 0xcc, 0x00, 0x12,
+ 0x33, 0x20, 0xff, 0xf0,
+ 0x10, 0x62, 0x03, 0xed, 0xee, 0x04, 0x10, 0xec, 0xd0, 0x5f, 0x6e, 0x0e,
+ 0xe4, 0xe6, 0x31, 0x50,
+ 0xfd, 0xcf, 0x01, 0x00, 0xff, 0xf3, 0x27, 0x00, 0xaa, 0x00, 0x00, 0xf2,
+ 0xd3, 0x22, 0x60, 0x2f,
+ 0x0a, 0xe0, 0x04, 0x03, 0x11, 0x00, 0x30, 0xff, 0xbc, 0x0c, 0xe0, 0xf1,
+ 0x00, 0x0c, 0xec, 0x8f,
+ 0xff, 0x00, 0x13, 0x0c, 0x2a, 0x10, 0xe0, 0xe3, 0x00, 0x1f, 0x1e, 0x72,
+ 0x31, 0xe1, 0xce, 0x0d,
+ 0x12, 0x47, 0x36, 0x4e, 0x0e, 0xdf, 0xf0, 0x01, 0x02, 0x00, 0x0c, 0x51,
+ 0x34, 0x50, 0x1c, 0xfe,
+ 0xbf, 0x03, 0x03, 0x31, 0x50, 0xf8, 0xdf, 0xe0, 0x03, 0x24, 0xd0, 0xdf,
+ 0x0f, 0x20, 0x14, 0xa0,
+ 0xcf, 0xef, 0x10, 0x21, 0x41, 0x0f, 0x40, 0x07, 0x06, 0x00, 0x6f, 0x1f,
+ 0xff, 0xd0, 0x01, 0xd3,
+ 0x0f, 0x00, 0x01, 0xf2, 0xa1, 0xc4, 0xd3, 0xf2, 0x03, 0x0c, 0x0a, 0x3f,
+ 0x41, 0x03, 0x03, 0xf0,
+ 0x09, 0xe0, 0x70, 0x40, 0x0e, 0x0e, 0x3f, 0x0f, 0x1e, 0x3c, 0x0f, 0x05,
+ 0x72, 0x40, 0xed, 0xe3,
+ 0x56, 0x2f, 0xee, 0xf2, 0x14, 0x10, 0xce, 0xcd, 0x00, 0x41, 0x1d, 0x0a,
+ 0xee, 0x2e, 0x30, 0x32,
+ 0x21, 0x0e, 0x2c, 0x5f, 0xfd, 0x9e, 0xc0, 0xf2, 0xf3, 0x0f, 0x24, 0x07,
+ 0xde, 0x8d, 0xf0, 0x07,
+ 0x51, 0x00, 0x00, 0x0f, 0x0f, 0x20, 0x02, 0xe2, 0x20, 0x1c, 0xef, 0xb0,
+ 0xff, 0x0e, 0x1d, 0xeb,
+ 0xd1, 0xe5, 0x05, 0x01, 0x0d, 0x0b, 0x2e, 0x20, 0x01, 0xae, 0xff, 0x57,
+ 0x53, 0x0e, 0x1c, 0x10,
+ 0x01, 0xc2, 0xf2, 0x00, 0x00, 0xf2, 0xf2, 0x00, 0x1c, 0x0c, 0x61, 0x02,
+ 0xe0, 0x0d, 0x62, 0x53,
+ 0x05, 0x13, 0xfe, 0x08, 0xe0, 0xf0, 0x02, 0x42, 0x42, 0xff, 0xab, 0xf0,
+ 0xe3, 0x0e, 0x1e, 0x00,
+ 0x35, 0x11, 0xdf, 0xbd, 0x0f, 0x1f, 0x50, 0x37, 0x12, 0x20, 0xf0, 0xf0,
+ 0x00, 0x3d, 0x1f, 0xee,
+ 0xb0, 0x00, 0xd2, 0xf3, 0xfc, 0xca, 0xf1, 0xf5, 0x04, 0x41, 0x00, 0x00,
+ 0xc0, 0x01, 0xf5, 0x32,
+ 0x6e, 0x39, 0x40, 0x22, 0x32, 0x00, 0xab, 0x1f, 0x50, 0x20, 0x00, 0xd0,
+ 0x14, 0x50, 0x02, 0x03,
+ 0xf1, 0xcb, 0xed, 0xd0, 0xf5, 0x02, 0x30, 0xdb, 0x8f, 0xff, 0xe1, 0xe0,
+ 0x0e, 0x0b, 0x00, 0xe0,
+ 0x30, 0x0f, 0xef, 0x30, 0x72, 0xf1, 0xcc, 0x0d, 0x20, 0x14, 0xd2, 0x21,
+ 0x51, 0xe0, 0xb0, 0xeb,
+ 0xf0, 0x00, 0x23, 0x47, 0xf2, 0xbf, 0x0d, 0x01, 0x62, 0x10, 0x01, 0x00,
+ 0xfb, 0xf0, 0x03, 0x01,
+ 0x0a, 0xce, 0xde, 0xef, 0xfe, 0x0f, 0x42, 0x41, 0x08, 0xcd, 0x0f, 0x03,
+ 0x34, 0x20, 0x70, 0x3f,
+ 0x01, 0xd3, 0xfe, 0x45, 0x54, 0x0d, 0x0a, 0xf0, 0x20, 0x43, 0x02, 0xbe,
+ 0x0b, 0x2f, 0x1e, 0x01,
+ 0xd2, 0xf3, 0x01, 0x13, 0x2d, 0xcd, 0xe0, 0xd3, 0xd7, 0xc4, 0x3f, 0x4e,
+ 0xbc, 0xce, 0xe0, 0xd5,
+ 0x02, 0x1f, 0x4e, 0x0f, 0xd0, 0x11, 0x11, 0x02, 0x32, 0x72, 0x7f, 0x12,
+ 0x07, 0x34, 0x0c, 0xdc,
+ 0xc0, 0x02, 0xe5, 0x20, 0x3f, 0x00, 0xe3, 0x01, 0xff, 0xf0, 0x24, 0x70,
+ 0x20, 0x45, 0x10, 0x10,
+ 0xe0, 0xcf, 0xfe, 0x0b, 0x5e, 0x40, 0x15, 0xef, 0xfd, 0x32, 0x24, 0xbe,
+ 0xed, 0x00, 0x21, 0x54,
+ 0x01, 0xfe, 0xef, 0x05, 0xd2, 0xde, 0xff, 0x24, 0x72, 0x5d, 0xf0, 0xe6,
+ 0x00, 0x0e, 0xfe, 0x0d,
+ 0x5c, 0x10, 0xfd, 0xdb, 0x0e, 0x2f, 0xfc, 0xbb, 0xdf, 0xe0, 0x17, 0x22,
+ 0x10, 0xbe, 0xbe, 0xe1,
+ 0xf7, 0x02, 0xe0, 0xce, 0x0e, 0x10, 0x30, 0x10, 0x10, 0x30, 0xfe, 0xbd,
+ 0x0e, 0x1e, 0x0a, 0xdf,
+ 0xd2, 0xa4, 0xff, 0xcb, 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x72, 0x3e, 0x0c,
+ 0xae, 0x00, 0x00, 0x32,
+ 0x32, 0x0f, 0x00, 0x0e, 0x08, 0xf0, 0xe5, 0x11, 0x0c, 0xfe, 0x0e, 0xff,
+ 0x8f, 0x00, 0x12, 0x10,
+ 0x1a, 0x0f, 0x11, 0x63, 0x31, 0x3f, 0xfe, 0xbd, 0xff, 0xd7, 0xd4, 0x32,
+ 0x70, 0x0f, 0xee, 0xe4,
+ 0xf4, 0x11, 0x20, 0x0f, 0xfd, 0x0e, 0x71, 0x23, 0xe5, 0x13, 0x63, 0x1d,
+ 0x0c, 0x04, 0x13, 0x01,
+ 0xf0, 0xca, 0x00, 0xe0, 0xc3, 0xb3, 0x01, 0xf0, 0x11, 0x17, 0x01, 0xbf,
+ 0xe0, 0x04, 0xf2, 0x00,
+ 0xff, 0xec, 0xfc, 0x0e, 0x00, 0x57, 0x4f, 0x0b, 0x00, 0x60, 0x0f, 0x0d,
+ 0xef, 0x46, 0x62, 0x00,
+ 0x00, 0xde, 0x00, 0x20, 0x00, 0x1f, 0x01, 0xe1, 0xfe, 0x20, 0x3c, 0xbc,
+ 0xec, 0x01, 0x22, 0x40,
+ 0x00, 0x4b, 0x3f, 0xd0, 0xc4, 0xc2, 0xfd, 0x3f, 0x43, 0xf2, 0x8c, 0xec,
+ 0x01, 0x06, 0x30, 0x01,
+ 0xef, 0xef, 0x01, 0x36, 0x11, 0x21, 0x1f, 0x2d, 0x5e, 0x00, 0x45, 0x14,
+ 0x00, 0xcb, 0xfe, 0xf0,
+ 0xee, 0x90, 0xf0, 0xf2, 0x25, 0x40, 0xfd, 0xbe, 0xd0, 0xf6, 0x01, 0x0f,
+ 0x0f, 0x0f, 0x1f, 0x10,
+ 0x11, 0xd3, 0xc0, 0x29, 0x40, 0x50, 0x12, 0x00, 0x12, 0x30, 0x00, 0x00,
+ 0x50, 0x33, 0x0b, 0x1f,
+ 0x42, 0x37, 0x30, 0xcd, 0xa0, 0x0e, 0x60, 0x11, 0x0f, 0xe0, 0x27, 0x24,
+ 0x0f, 0xcf, 0x00, 0x31,
+ 0x20, 0x10, 0xd1, 0xef, 0xdd, 0x80, 0xff, 0xfa, 0x0f, 0x01, 0x34, 0x4f,
+ 0x3d, 0x1e, 0x1d, 0x05,
+ 0x05, 0xf4, 0x00, 0x60, 0x2b, 0xe0, 0xc0, 0x04, 0xb0, 0xff, 0xf0, 0x12,
+ 0x10, 0xdd, 0xe1, 0x27,
+ 0x71, 0x1f, 0x0d, 0x00, 0x00, 0x00, 0x11, 0x5f, 0x3b, 0x5f, 0x10, 0x0f,
+ 0x00, 0x22, 0x13, 0x37,
+ 0x32, 0xdf, 0x4d, 0x01, 0x93, 0xc1, 0xe0, 0xce, 0xfe, 0xee, 0xb1, 0x02,
+ 0x0d, 0x4b, 0x00, 0xdf,
+ 0x0c, 0x4e, 0x3d, 0x3d, 0x00, 0xe7, 0xce, 0x09, 0x20, 0x10, 0xf1, 0xc0,
+ 0xce, 0xb0, 0xf0, 0xf3,
+ 0xed, 0xe0, 0x47, 0x13, 0xbf, 0xe0, 0xf3, 0x20, 0x73, 0x25, 0xf0, 0xe1,
+ 0x22, 0x20, 0x1a, 0x40,
+ 0x00, 0xcc, 0xdf, 0x02, 0x16, 0x00, 0xee, 0xcf, 0xfe, 0x00, 0x05, 0xb2,
+ 0xc0, 0xfa, 0x30, 0x2f,
+ 0x1f, 0x3f, 0x72, 0x11, 0x2f, 0x3c, 0x3e, 0x00, 0x22, 0x11, 0x0f, 0x2e,
+ 0x1f, 0xe0, 0xe4, 0x0f,
+ 0x52, 0x27, 0xe0, 0xe2, 0xf2, 0xbf, 0x09, 0xef, 0xb0, 0xd1, 0x01, 0x01,
+ 0x14, 0x00, 0x1a, 0x00,
+ 0x5e, 0x34, 0xc4, 0x2e, 0x21, 0x34, 0x69, 0x2e, 0xe3, 0x27, 0x72, 0x00,
+ 0xaf, 0x00, 0xfd, 0x09,
+ 0x0e, 0xcf, 0x04, 0x65, 0x3f, 0x1d, 0xfe, 0xc0, 0x02, 0x21, 0x10, 0x0f,
+ 0x0e, 0xe3, 0xe4, 0x00,
+ 0x0d, 0xa8, 0xef, 0x00, 0x41, 0x00, 0xd1, 0xc2, 0x0f, 0x4d, 0x1f, 0x0f,
+ 0x16, 0xf5, 0xc0, 0xf0,
+ 0x1b, 0x3f, 0xe0, 0xd3, 0xe2, 0x1d, 0x0d, 0xf0, 0x20, 0x51, 0x41, 0x51,
+ 0x1e, 0x12, 0x37, 0x02,
+ 0xef, 0xee, 0x22, 0x66, 0x01, 0xde, 0xbb, 0xcf, 0xd0, 0x12, 0x20, 0x3f,
+ 0xe9, 0xef, 0x40, 0x20,
+ 0xd0, 0xa1, 0x01, 0x61, 0x1f, 0x00, 0x04, 0xe4, 0x02, 0x11, 0x12, 0xd2,
+ 0x9f, 0x0d, 0x00, 0x22,
+ 0x00, 0xd0, 0xd1, 0x37, 0x71, 0x2f, 0x0c, 0x02, 0xf0, 0xf9, 0xee, 0xf0,
+ 0x01, 0xc0, 0xca, 0x0e,
+ 0x2e, 0xff, 0xb1, 0xe1, 0xee, 0x0f, 0x32, 0x14, 0xed, 0xec, 0x20, 0x72,
+ 0x3f, 0x0e, 0xdf, 0xf1,
+ 0x07, 0x77, 0x11, 0x2e, 0x0d, 0xff, 0x0f, 0x30, 0x62, 0x00, 0xff, 0xef,
+ 0x0f, 0x7e, 0x00, 0x01,
+ 0xf3, 0xeb, 0x0c, 0xf1, 0x17, 0x11, 0xef, 0xdb, 0x00, 0x12, 0x25, 0x00,
+ 0xd1, 0xef, 0x10, 0x7f,
+ 0x7e, 0xf0, 0xe0, 0x00, 0x21, 0x03, 0xe2, 0x0f, 0xfb, 0x10, 0x34, 0x01,
+ 0x91, 0xf5, 0x11, 0x12,
+ 0x02, 0xd4, 0xc0, 0xee, 0xe0, 0x04, 0x07, 0x00, 0xc3, 0x91, 0xff, 0xfc,
+ 0x1f, 0x10, 0x13, 0x45,
+ 0x20, 0x0c, 0xef, 0x5f, 0x40, 0x1d, 0x20, 0x24, 0x15, 0x0e, 0xdb, 0x20,
+ 0x61, 0x12, 0x00, 0x01,
+ 0xef, 0x10, 0x60, 0x10, 0x12, 0x13, 0x18, 0x0c, 0x20, 0xff, 0x10, 0x73,
+ 0xe1, 0x8d, 0x00, 0x10,
+ 0x2c, 0xd9, 0xef, 0xf0, 0x35, 0x30, 0x1e, 0xe0, 0xf3, 0xf0, 0xfd, 0x00,
+ 0x02, 0x43, 0x00, 0xa0,
+ 0xd0, 0xf1, 0xf3, 0x0e, 0x2d, 0x5f, 0x0e, 0xab, 0x00, 0x11, 0x50, 0x08,
+ 0xee, 0xd0, 0xf4, 0x00,
+ 0x30, 0x6f, 0xf1, 0xb3, 0xf2, 0xe0, 0xe4, 0xff, 0xfa, 0xf0, 0xef, 0xee,
+ 0x12, 0x25, 0x3e, 0x7d,
+ 0x01, 0x00, 0xe3, 0x75, 0x21, 0xf0, 0xf2, 0x00, 0x19, 0x0f, 0x00, 0xf4,
+ 0x0f, 0x2c, 0x3f, 0x2e,
+ 0x20, 0x10, 0xfe, 0x6c, 0x73, 0x13, 0xe4, 0xd7, 0x04, 0x20, 0xed, 0xc0,
+ 0x00, 0x02, 0x05, 0x10,
+ 0x0e, 0x9d, 0x0e, 0x44, 0x47, 0x0e, 0xfd, 0x00, 0x42, 0x03, 0xfd, 0xdc,
+ 0x02, 0x04, 0x2e, 0x1c,
+ 0xf0, 0x01, 0x05, 0x01, 0xf1, 0xd0, 0xcc, 0xd0, 0xef, 0x01, 0x43, 0xc0,
+ 0xb1, 0x14, 0x30, 0x2f,
+ 0xec, 0x20, 0x22, 0x02, 0x56, 0x71, 0x1d, 0x1d, 0x22, 0x17, 0xf2, 0xdf,
+ 0xee, 0x00, 0x42, 0x14,
+ 0xcf, 0x00, 0xff, 0xfd, 0x0a, 0x90, 0xd0, 0xb1, 0xec, 0xec, 0x51, 0x21,
+ 0x0f, 0xcb, 0xe0, 0x0f,
+ 0x30, 0x2f, 0xdd, 0xef, 0x5f, 0x0d, 0xac, 0x00, 0x13, 0x05, 0x00, 0xe2,
+ 0x14, 0x01, 0xec, 0xee,
+ 0x00, 0xf2, 0xd0, 0x07, 0x72, 0x54, 0x0f, 0xeb, 0xcf, 0x00, 0x52, 0x33,
+ 0x1e, 0xea, 0xc0, 0x04,
+ 0x13, 0x0e, 0xbd, 0x0e, 0xf0, 0x00, 0x02, 0xe3, 0xdf, 0xfa, 0x30, 0x3e,
+ 0x4e, 0x10, 0x06, 0xd0,
+ 0x30, 0x7f, 0x4e, 0x0c, 0xc0, 0x00, 0x65, 0x00, 0x0e, 0x10, 0x04, 0xef,
+ 0xcc, 0x00, 0x40, 0x22,
+ 0x35, 0xf0, 0xc0, 0x00, 0x11, 0x00, 0xfd, 0xb0, 0x00, 0x04, 0xe0, 0xf3,
+ 0x03, 0x70, 0x09, 0xdd,
+ 0x00, 0x44, 0x20, 0xfe, 0xcc, 0x13, 0x24, 0x01, 0xe0, 0xfc, 0x0f, 0x42,
+ 0xe1, 0x8e, 0xfd, 0x04,
+ 0x21, 0x1e, 0x0c, 0x22, 0x37, 0x01, 0xf1, 0x00, 0xfe, 0xe1, 0x03, 0x36,
+ 0x74, 0x00, 0xb0, 0x0d,
+ 0x31, 0x32, 0x14, 0xef, 0xfb, 0x6f, 0x3f, 0x0e, 0xde, 0x15, 0x43, 0x00,
+ 0xdd, 0x10, 0x45, 0xe0,
+ 0xc0, 0x12, 0x35, 0x00, 0xed, 0xba, 0xe0, 0x0f, 0xf1, 0x11, 0x30, 0xce,
+ 0xec, 0x70, 0x32, 0xff,
+ 0xad, 0xf0, 0x00, 0x0d, 0xff, 0xf2, 0x07, 0x02, 0xad, 0x0f, 0xf1, 0x25,
+ 0xf0, 0x00, 0x33, 0x2f,
+ 0x0d, 0xc1, 0x02, 0x0e, 0x2e, 0x04, 0xf7, 0xbf, 0xfd, 0x0e, 0x20, 0x00,
+ 0x90, 0x0b, 0xfd, 0x2d,
+ 0x40, 0xcf, 0xa0, 0x05, 0x12, 0x0d, 0xdb, 0x00, 0x04, 0x11, 0xfd, 0x9d,
+ 0x02, 0x03, 0x00, 0x2a,
+ 0xec, 0xfe, 0x32, 0x71, 0x2e, 0x0c, 0x01, 0xd3, 0x0f, 0x1c, 0x40, 0x20,
+ 0x0f, 0xd9, 0xc0, 0x00,
+ 0x52, 0x3f, 0x1c, 0x0e, 0x0f, 0x25, 0x05, 0xd0, 0xde, 0x10, 0xe3, 0x85,
+ 0xd0, 0xef, 0x1f, 0x40,
+ 0x10, 0xe1, 0x01, 0x72, 0x20, 0x2d, 0x00, 0xe0, 0xf8, 0xff, 0x21, 0x77,
+ 0x20, 0xf0, 0xfd, 0x01,
+ 0x15, 0xd2, 0xbf, 0xef, 0xe1, 0x12, 0x01, 0xef, 0x8e, 0x0f, 0xf3, 0x03,
+ 0x02, 0xdf, 0xe8, 0x0f,
+ 0x0f, 0x43, 0x27, 0x10, 0x10, 0xfd, 0xa0, 0x00, 0x2d, 0x20, 0x33, 0x07,
+ 0x8e, 0xfe, 0x10, 0x40,
+ 0x10, 0x03, 0x10, 0x0d, 0xe0, 0x12, 0x61, 0x0a, 0x0f, 0x11, 0xd3, 0xbc,
+ 0x2d, 0x60, 0x0f, 0xef,
+ 0xfd, 0x15, 0x42, 0xfb, 0xdc, 0x10, 0x05, 0x00, 0xf2, 0xcc, 0x01, 0x77,
+ 0x0e, 0xdf, 0xf0, 0xf0,
+ 0x63, 0x23, 0xed, 0xca, 0x00, 0x21, 0x12, 0x00, 0x00, 0x20, 0x0f, 0xec,
+ 0x00, 0x52, 0x06, 0xff,
+ 0xde, 0x00, 0xff, 0xe0, 0x90, 0xff, 0x15, 0x0f, 0xcc, 0x11, 0x02, 0xce,
+ 0x10, 0x34, 0xde, 0x0f,
+ 0x21, 0x0f, 0x0f, 0x76, 0x30, 0xe0, 0xab, 0x01, 0x21, 0xf0, 0xee, 0x10,
+ 0x44, 0x11, 0x0e, 0xef,
+ 0x3f, 0x50, 0x01, 0x22, 0x14, 0xfd, 0x0e, 0x67, 0x02, 0xea, 0x00, 0x63,
+ 0xef, 0xcd, 0x23, 0x01,
+ 0x0e, 0x11, 0x00, 0xe0, 0x0f, 0x0e, 0x01, 0x30, 0x0b, 0xf0, 0x00, 0xf1,
+ 0x13, 0x44, 0x30, 0xea,
+ 0xbf, 0xf0, 0x02, 0x35, 0xbf, 0xe0, 0x02, 0x00, 0xce, 0x00, 0x9d, 0x01,
+ 0x05, 0x20, 0x0e, 0xef,
+ 0x11, 0x21, 0x75, 0x30, 0x13, 0x00, 0xf8, 0x42, 0x42, 0xed, 0xd0, 0x00,
+ 0x00, 0x75, 0x00, 0xec,
+ 0xf0, 0x23, 0x00, 0xfd, 0xe1, 0xe5, 0xef, 0xfd, 0x11, 0x03, 0xa1, 0xed,
+ 0x09, 0x5f, 0x0e, 0x44,
+ 0xf0, 0xe0, 0x2f, 0x00, 0xfe, 0xe0, 0x9d, 0x10, 0x41, 0xd0, 0xbf, 0x06,
+ 0x33, 0x0f, 0xf0, 0xee,
+ 0x0f, 0x11, 0x23, 0x0e, 0xfb, 0x41, 0x04, 0x11, 0xfe, 0x10, 0x46, 0x01,
+ 0xd0, 0x8b, 0x00, 0x44,
+ 0x22, 0xef, 0xac, 0xff, 0xf1, 0x04, 0xd0, 0x0f, 0x10, 0x0d, 0xef, 0x11,
+ 0x57, 0x00, 0xdc, 0x0f,
+ 0x50, 0x32, 0x00, 0xed, 0x30, 0x41, 0x00, 0x23, 0x10, 0x0c, 0xff, 0x0e,
+ 0x01, 0x25, 0x10, 0x0f,
+ 0xfd, 0xbf, 0x02, 0x27, 0xc1, 0x90, 0x2e, 0x2b, 0xcd, 0xf1, 0x06, 0x11,
+ 0x0f, 0xcd, 0xfe, 0xe0,
+ 0x04, 0x45, 0xcf, 0xef, 0x11, 0x21, 0x10, 0xdf, 0xdd, 0x70, 0x1c, 0x0e,
+ 0x31, 0xe3, 0xd2, 0xef,
+ 0x38, 0x71, 0x5f, 0xee, 0x33, 0x25, 0xf0, 0xaf, 0x10, 0x10, 0x0c, 0xd0,
+ 0xb2, 0xcd, 0x09, 0x11,
+ 0x12, 0x01, 0xc0, 0xfe, 0x30, 0x52, 0xff, 0xee, 0x04, 0x35, 0x31, 0x0f,
+ 0xfe, 0x04, 0x32, 0x2f,
+ 0xa9, 0xcf, 0x23, 0x55, 0x0e, 0xde, 0xf0, 0xde, 0x20, 0x20, 0x32, 0x30,
+ 0x0c, 0xdd, 0x22, 0x75,
+ 0xf0, 0xcb, 0x00, 0x04, 0x0f, 0xcd, 0xe0, 0x00, 0x64, 0x01, 0xf0, 0xf0,
+ 0x12, 0x12, 0xff, 0xfe,
+ 0x05, 0x55, 0x00, 0xde, 0xee, 0xde, 0xff, 0x02, 0x66, 0x40, 0x1d, 0x0e,
+ 0xce, 0x0f, 0x0e, 0x34,
+ 0x22, 0xbe, 0x0e, 0xec, 0xbe, 0x00, 0xc2, 0xee, 0x0f, 0x0f, 0x34, 0xb0,
+ 0xfc, 0x12, 0x1c, 0x00,
+ 0x37, 0x43, 0x50, 0x0c, 0xde, 0x12, 0x35, 0x30, 0x11, 0x00, 0xff, 0x99,
+ 0xff, 0x00, 0x45, 0x10,
+ 0xff, 0xcd, 0x0f, 0x1f, 0x21, 0x34, 0x11, 0x2f, 0x00, 0xfd, 0xd1, 0x04,
+ 0x00, 0x9d, 0x0f, 0x11,
+ 0x23, 0x0f, 0xcc, 0x0e, 0x7d, 0x30, 0x35, 0x27, 0xef, 0xad, 0x00, 0x01,
+ 0xf1, 0xf1, 0x03, 0x55,
+ 0x01, 0x90, 0xfe, 0x01, 0x05, 0x01, 0x10, 0xf0, 0x02, 0x02, 0xe0, 0xeb,
+ 0x37, 0x22, 0x8c, 0xff,
+ 0x0f, 0x33, 0x11, 0xdf, 0xb0, 0x01, 0x53, 0x0f, 0x0c, 0x00, 0x00, 0x3f,
+ 0x2e, 0x36, 0x33, 0x10,
+ 0xed, 0xca, 0x10, 0x34, 0x32, 0x00, 0xac, 0x0e, 0x01, 0xe0, 0x11, 0x41,
+ 0x00, 0xec, 0xfc, 0x4f,
+ 0x60, 0x03, 0xf0, 0x11, 0x30, 0x19, 0xe0, 0x80, 0xfd, 0x00, 0xe0, 0x03,
+ 0x25, 0xff, 0xfe, 0x00,
+ 0xfd, 0x0e, 0x32, 0x77, 0x02, 0xec, 0xcf, 0x00, 0x0f, 0x52, 0x23, 0xfe,
+ 0xdd, 0xf0, 0x09, 0x00,
+ 0x62, 0x05, 0xef, 0xdf, 0x00, 0x01, 0xe1, 0xee, 0xd0, 0xb1, 0xe2, 0x10,
+ 0x40, 0x14, 0xd3, 0xd0,
+ 0xde, 0x1d, 0x31, 0x07, 0x12, 0x3c, 0xfb, 0xe0, 0x52, 0x67, 0x10, 0xed,
+ 0xba, 0x00, 0x40, 0x21,
+ 0x00, 0x00, 0x12, 0x10, 0xee, 0x00, 0x60, 0x14, 0x10, 0xf0, 0x02, 0xe1,
+ 0xe0, 0xff, 0xdd, 0xde,
+ 0xf0, 0x54, 0x36, 0x00, 0x0c, 0x70, 0x40, 0xf1, 0xe0, 0x21, 0x77, 0x00,
+ 0xd0, 0x0f, 0x20, 0x51,
+ 0x02, 0x00, 0xdc, 0xfc, 0x00, 0xf1, 0x05, 0x41, 0x00, 0x2c, 0x12, 0xd0,
+ 0xa1, 0x03, 0x1e, 0x09,
+ 0xb0, 0xf1, 0x05, 0x22, 0xee, 0xee, 0x73, 0x10, 0xc9, 0x21, 0x54, 0x00,
+ 0x0f, 0x0e, 0xe0, 0x13,
+ 0x34, 0x0f, 0x9d, 0x00, 0xf0, 0xf2, 0x11, 0x0d, 0xea, 0xe1, 0x22, 0x2f,
+ 0x0b, 0xff, 0xed, 0x22,
+ 0x42, 0xfe, 0x0f, 0x21, 0xe0, 0x2e, 0x6e, 0xcd, 0xb0, 0xf2, 0xb8, 0x0e,
+ 0x14, 0x33, 0x0f, 0xfc,
+ 0x04, 0xd0, 0x88, 0x21, 0x74, 0x00, 0xcc, 0x00, 0x10, 0x13, 0x00, 0xff,
+ 0x00, 0x0e, 0x31, 0x01,
+ 0xd0, 0x33, 0x13, 0xda, 0xce, 0x00, 0x14, 0x01, 0xbf, 0x00, 0xfd, 0xee,
+ 0xf0, 0xef, 0x1f, 0x72,
+ 0x24, 0xfa, 0x00, 0x01, 0x0c, 0xf0, 0x77, 0x00, 0xde, 0x00, 0x52, 0x01,
+ 0xff, 0xcd, 0x14, 0x00,
+ 0x0d, 0x0e, 0x01, 0x56, 0x00, 0xfb, 0xf0, 0x13, 0x00, 0x1f, 0x2f, 0x11,
+ 0x32, 0xf1, 0x90, 0xfd,
+ 0x0f, 0x00, 0x20, 0x11, 0xe0, 0xcb, 0x00, 0x42, 0xf0, 0xfd, 0x00, 0x01,
+ 0x02, 0x10, 0xcb, 0x32,
+ 0x77, 0x32, 0xac, 0x00, 0xf0, 0x23, 0x34, 0xe0, 0xfd, 0x32, 0x10, 0x10,
+ 0x02, 0x0f, 0xfd, 0xda,
+ 0xf0, 0x15, 0x00, 0x11, 0x63, 0x01, 0x00, 0xb0, 0x0c, 0x52, 0x27, 0xf0,
+ 0xb0, 0x0d, 0x30, 0x21,
+ 0x23, 0x10, 0xda, 0xe0, 0x1e, 0x52, 0x34, 0xd0, 0x89, 0xf0, 0x20, 0x12,
+ 0xef, 0xdc, 0x20, 0x54,
+ 0x00, 0xed, 0xce, 0x12, 0x24, 0x20, 0x0e, 0xff, 0xd1, 0x00, 0xf2, 0xd0,
+ 0x80, 0x00, 0x26, 0x42,
+ 0x0f, 0xed, 0xff, 0x03, 0x46, 0xef, 0xfd, 0xed, 0xeb, 0x22, 0xf2, 0xc0,
+ 0x65, 0x3f, 0xca, 0xdf,
+ 0xff, 0x21, 0x01, 0xf0, 0x01, 0xa0, 0xed, 0x00, 0x00, 0x1f, 0x01, 0xe0,
+ 0xd0, 0xee, 0x04, 0x57,
+ 0x00, 0x9a, 0x00, 0x41, 0x03, 0x00, 0x0d, 0xe0, 0x20, 0x30, 0x50, 0x21,
+ 0x0e, 0xfd, 0x0c, 0xf0,
+ 0xf0, 0x0e, 0x4f, 0x35, 0x01, 0xad, 0x0d, 0xb0, 0xd2, 0x00, 0x0f, 0x3f,
+ 0x00, 0xf5, 0x22, 0x0b,
+ 0xb9, 0x10, 0x43, 0x30, 0x3f, 0x0d, 0xef, 0x03, 0x33, 0x23, 0x40, 0xd0,
+ 0x07, 0xe7, 0x8e, 0x0d,
+ 0x22, 0x76, 0x00, 0xef, 0xde, 0x01, 0x73, 0x12, 0x0f, 0xff, 0xf1, 0x00,
+ 0xee, 0x00, 0xf0, 0xe6,
+ 0xde, 0xbc, 0x01, 0xd0, 0xe0, 0xde, 0x01, 0x22, 0x0e, 0xed, 0x57, 0x17,
+ 0x0f, 0x0d, 0x00, 0x73,
+ 0x22, 0x10, 0x0f, 0x00, 0xbb, 0x00, 0x40, 0x54, 0x0f, 0xdc, 0x00, 0x31,
+ 0x53, 0xfd, 0xed, 0x13,
+ 0x31, 0x13, 0x1f, 0xec, 0xcd, 0x00, 0x01, 0x03, 0xf1, 0xdd, 0xc8, 0x00,
+ 0x00, 0xbe, 0x0f, 0x43,
+ 0x47, 0x04, 0x00, 0x0b, 0xe0, 0x10, 0x50, 0x03, 0xe0, 0xcc, 0x00, 0x0e,
+ 0x20, 0x74, 0x21, 0xff,
+ 0xbd, 0x0f, 0x00, 0xf0, 0x0f, 0xf2, 0x01, 0x01, 0xd2, 0xef, 0xd8, 0x0f,
+ 0xf0, 0xb0, 0xef, 0x46,
+ 0x23, 0xdf, 0xee, 0xef, 0xfd, 0xd0, 0x17, 0x21, 0x8f, 0xfd, 0x00, 0x51,
+ 0x54, 0x0e, 0xed, 0x00,
+ 0x31, 0x44, 0x00, 0x1d, 0x11, 0x03, 0x00, 0x04, 0x10, 0x1c, 0x0c, 0xb1,
+ 0xe1, 0x00, 0x46, 0x1f,
+ 0x0d, 0x0e, 0x20, 0x5e, 0x10, 0x44, 0x02, 0x00, 0x77, 0x22, 0xdb, 0xbe,
+ 0xeb, 0x76, 0x34, 0xdd,
+ 0xbd, 0x01, 0x34, 0x10, 0xed, 0xf0, 0xe1, 0x00, 0x10, 0x10, 0x21, 0x02,
+ 0xbf, 0x0e, 0x11, 0x01,
+ 0xf0, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0x54, 0x47, 0xff, 0xee, 0x30, 0x43,
+ 0x36, 0xf0, 0xdf, 0xed,
+ 0x00, 0x65, 0x02, 0xe0, 0xec, 0x00, 0x51, 0x11, 0xe0, 0xde, 0x10, 0x4e,
+ 0x51, 0x16, 0xdd, 0xde,
+ 0x01, 0x00, 0xe0, 0xfe, 0x51, 0x02, 0xdb, 0xb0, 0x10, 0x00, 0xed, 0x12,
+ 0x00, 0x0c, 0x0d, 0x14,
+ 0x66, 0x00, 0xde, 0x0f, 0x00, 0x00, 0x71, 0x00, 0x0d, 0xeb, 0x01, 0x16,
+ 0x20, 0x0f, 0xee, 0x04,
+ 0x23, 0xc1, 0x8c, 0xf0, 0x00, 0x03, 0x01, 0xd0, 0xed, 0x10, 0x00, 0xfa,
+ 0xf0, 0x01, 0xad, 0x3f,
+ 0x64, 0x14, 0xf0, 0xec, 0xff, 0x32, 0x32, 0xe0, 0xbe, 0x00, 0x30, 0x30,
+ 0x25, 0xd0, 0xbb, 0x20,
+ 0x60, 0xff, 0xeb, 0x00, 0x37, 0xf0, 0xcd, 0x00, 0x42, 0x00, 0xe0, 0x0c,
+ 0x11, 0xf2, 0xf2, 0x52,
+ 0x0e, 0xbc, 0xdf, 0xff, 0x10, 0x41, 0x0f, 0xe1, 0xfc, 0xe8, 0x73, 0x77,
+ 0x0f, 0xcd, 0x00, 0x23,
+ 0x00, 0xff, 0x10, 0x01, 0xfe, 0x03, 0x0c, 0x0f, 0x00, 0x0d, 0x20, 0x46,
+ 0xdf, 0xbb, 0x20, 0x32,
+ 0xe0, 0xd0, 0xd0, 0xcf, 0xf0, 0xce, 0x14, 0x55, 0xdd, 0x0e, 0x22, 0x35,
+ 0xc0, 0xef, 0x53, 0x10,
+ 0x0d, 0xee, 0x23, 0x24, 0x10, 0xff, 0xeb, 0x73, 0x41, 0xde, 0xff, 0xeb,
+ 0xfe, 0x44, 0x42, 0xed,
+ 0xcc, 0x12, 0x24, 0xf0, 0xcd, 0x0f, 0x21, 0x10, 0xef, 0xe0, 0x00, 0xc1,
+ 0x16, 0x50, 0xbd, 0xda,
+ 0x24, 0x54, 0x00, 0x0e, 0xee, 0x00, 0x13, 0x00, 0x30, 0x31, 0xff, 0xbb,
+ 0x00, 0x10, 0x00, 0xd0,
+ 0x11, 0x5f, 0xd8, 0x00, 0x23, 0xcf, 0xac, 0x00, 0x44, 0x01, 0xed, 0xde,
+ 0x20, 0x12, 0x00, 0x02,
+ 0xac, 0x00, 0x11, 0x10, 0x1f, 0xef, 0x14, 0x55, 0x00, 0xe0, 0xea, 0xee,
+ 0x20, 0x65, 0x31, 0x01,
+ 0xce, 0xee, 0x00, 0x20, 0x03, 0x21, 0xed, 0x00, 0xfe, 0xfd, 0xfe, 0x20,
+ 0x24, 0x0f, 0x7f, 0x3d,
+ 0x33, 0x44, 0xe9, 0x00, 0x10, 0xe0, 0xde, 0x0f, 0x42, 0xe1, 0x8b, 0xdf,
+ 0x13, 0x34, 0x13, 0xcb,
+ 0xce, 0x22, 0x46, 0x12, 0x00, 0x0f, 0xe0, 0x02, 0x31, 0x02, 0xb0, 0xba,
+ 0x12, 0x04, 0xbd, 0xfe,
+ 0x65, 0x12, 0xec, 0xae, 0x14, 0x22, 0xfd, 0xf0, 0xf0, 0x02, 0x34, 0x0f,
+ 0x00, 0x14, 0x21, 0x0f,
+ 0x1f, 0xee, 0xdf, 0x63, 0x36, 0x00, 0x0d, 0xbb, 0x10, 0x72, 0x12, 0xfa,
+ 0x00, 0x02, 0x0f, 0xfe,
+ 0x10, 0x23, 0x0f, 0xca, 0x00, 0x43, 0x00, 0xde, 0xde, 0x0d, 0x70, 0x04,
+ 0xf0, 0xdf, 0x0e, 0x30,
+ 0x0e, 0xc0, 0x37, 0x04, 0x0d, 0x0f, 0x42, 0x01, 0xf0, 0xed, 0xdf, 0x44,
+ 0x10, 0xca, 0xfe, 0x21,
+ 0x11, 0xc0, 0xae, 0x01, 0x31, 0x0e, 0xe0, 0xd3, 0xf0, 0x77, 0x37, 0xe0,
+ 0x9d, 0x00, 0xf1, 0x22,
+ 0x10, 0xf0, 0xe1, 0xf0, 0x00, 0xef, 0xcb, 0xff, 0x01, 0x00, 0x30, 0x0f,
+ 0xfc, 0xf0, 0x20, 0x77,
+ 0x4f, 0xff, 0xe0, 0xf1, 0x1e, 0x2f, 0x42, 0x02, 0x8a, 0x0d, 0x10, 0x10,
+ 0xfd, 0xdc, 0x14, 0x35,
+ 0x10, 0x1f, 0x0e, 0x20, 0x76, 0x30, 0xf0, 0xef, 0x11, 0x31, 0x01, 0x01,
+ 0x1e, 0x00, 0x13, 0x00,
+ 0x60, 0xcd, 0x46, 0xcb, 0xaf, 0xcc, 0x6b, 0xcb, 0xff, 0x37, 0x72, 0x42,
+ 0x05, 0x03, 0x12, 0x10,
+ 0xec, 0xee, 0x03, 0xf1, 0x0e, 0x12, 0x30, 0xa8, 0xca, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xfe, 0xe0,
+ 0x54, 0xb0, 0xde, 0xe0, 0xd1, 0x07, 0xaf, 0xfe, 0x45, 0x21, 0xf0, 0x11,
+ 0x13, 0xff, 0xbb, 0x00,
+ 0x41, 0x42, 0xec, 0x00, 0x46, 0x11, 0x00, 0x1e, 0xcc, 0xce, 0x75, 0x33,
+ 0xcb, 0xce, 0x00, 0x22,
+ 0x10, 0x20, 0x0f, 0xae, 0x11, 0x02, 0x00, 0x1c, 0x01, 0xf1, 0xd1, 0xfe,
+ 0xed, 0x0e, 0x10, 0x33,
+ 0xbb, 0xed, 0x34, 0x54, 0x1f, 0x0b, 0x11, 0x23, 0x00, 0x13, 0x42, 0x98,
+ 0x0f, 0x04, 0x31, 0xef,
+ 0xce, 0x00, 0x01, 0xe0, 0x00, 0xe0, 0x1f, 0x32, 0x0d, 0xff, 0x10, 0xff,
+ 0xed, 0xf1, 0xb0, 0x02,
+ 0x74, 0x0e, 0xba, 0xf0, 0x03, 0x02, 0x2d, 0x0d, 0x00, 0xd1, 0xe4, 0x47,
+ 0x53, 0xf9, 0xdf, 0x21,
+ 0x74, 0x00, 0xec, 0xf2, 0x00, 0x00, 0x31, 0x0f, 0xde, 0xef, 0xee, 0x72,
+ 0x43, 0xfe, 0x02, 0xff,
+ 0x09, 0x30, 0x33, 0x00, 0xfd, 0xbd, 0xf0, 0x04, 0x13, 0x0f, 0x0e, 0xe1,
+ 0x03, 0x31, 0x42, 0x37,
+ 0x00, 0xf0, 0xde, 0x0e, 0x63, 0x67, 0x0e, 0xed, 0x0f, 0xf0, 0x00, 0x10,
+ 0xcb, 0xcc, 0x23, 0x32,
+ 0xb3, 0x06, 0x01, 0xdb, 0xcf, 0x42, 0x56, 0x00, 0x0f, 0x02, 0x11, 0xbb,
+ 0x21, 0x77, 0x00, 0xbb,
+ 0x00, 0x33, 0x0f, 0x00, 0x00, 0xfe, 0x10, 0x33, 0xde, 0xff, 0x01, 0x31,
+ 0xdf, 0xbf, 0x00, 0x12,
+ 0x20, 0xcc, 0x00, 0x42, 0xee, 0xed, 0x25, 0x00, 0x0e, 0x01, 0xff, 0xdc,
+ 0x13, 0x12, 0xb0, 0xf0,
+ 0x06, 0x0f, 0x20, 0x21, 0x8b, 0xdf, 0x43, 0x76, 0x0f, 0xec, 0xf0, 0x0e,
+ 0x21, 0x12, 0x00, 0x10,
+ 0xdd, 0xdf, 0x01, 0xe1, 0xef, 0x23, 0x21, 0xaa, 0xef, 0x00, 0x04, 0x11,
+ 0x1e, 0xed, 0x9d, 0x00,
+ 0x02, 0x22, 0x10, 0x1e, 0x15, 0x01, 0x30, 0xca, 0x0f, 0x00, 0xef, 0x04,
+ 0x64, 0xf0, 0xaa, 0xff,
+ 0x20, 0x65, 0xff, 0xce, 0x00, 0x31, 0xff, 0x00, 0x10, 0xef, 0xdd, 0x00,
+ 0x65, 0x0e, 0x0d, 0x10,
+ 0x00, 0x0f, 0x47, 0x20, 0xde, 0xfd, 0xf0, 0x01, 0x15, 0xe0, 0xce, 0x33,
+ 0x75, 0x00, 0xde, 0x00,
+ 0x34, 0x64, 0xde, 0x0d, 0x63, 0x00, 0x0e, 0xdd, 0x10, 0x35, 0xee, 0xdd,
+ 0x00, 0x14, 0xf0, 0xaf,
+ 0xfe, 0xe0, 0x03, 0xcf, 0x00, 0xe4, 0xf1, 0x02, 0x00, 0xd3, 0x01, 0xf8,
+ 0x1c, 0x76, 0x61, 0xf0,
+ 0xf0, 0x10, 0x40, 0x10, 0x00, 0x00, 0x24, 0x20, 0xed, 0x01, 0x34, 0x4f,
+ 0xdc, 0xac, 0x12, 0x13,
+ 0x00, 0xeb, 0x10, 0x10, 0x10, 0xee, 0xef, 0x51, 0x00, 0xfe, 0x00, 0x30,
+ 0xe3, 0xd6, 0xcd, 0xed,
+ 0xf0, 0xe0, 0x77, 0x75, 0xdd, 0xe0, 0x0f, 0x0e, 0x11, 0x72, 0x02, 0x0d,
+ 0x0e, 0xe0, 0x01, 0x00,
+ 0x0c, 0x0d, 0x10, 0x07, 0x03, 0xce, 0xfc, 0x22, 0x11, 0xad, 0xdc, 0x35,
+ 0x10, 0x89, 0xf0, 0x03,
+ 0x0f, 0x0e, 0xf0, 0x02, 0x00, 0x1f, 0x00, 0x10, 0xf2, 0xff, 0x41, 0x00,
+ 0xf1, 0x00, 0x40, 0x1f,
+ 0x34, 0xf0, 0x57, 0x23, 0xde, 0x88, 0xff, 0x00, 0x65, 0x01, 0xed, 0xfe,
+ 0x31, 0x12, 0x10, 0x0e,
+ 0x2f, 0x72, 0x03, 0x0f, 0x0d, 0x1f, 0x0f, 0x25, 0x01, 0xcd, 0xfb, 0xf2,
+ 0x02, 0xe3, 0x21, 0x77,
+ 0x02, 0xde, 0xdc, 0x20, 0x41, 0x10, 0xfd, 0xf0, 0xff, 0xce, 0x01, 0x30,
+ 0xfc, 0x01, 0x33, 0xcd,
+ 0xe0, 0x17, 0x02, 0x8c, 0xef, 0x17, 0x43, 0xf0, 0xbc, 0x02, 0x22, 0x01,
+ 0x42, 0xba, 0xed, 0x77,
+ 0x23, 0xdb, 0x10, 0x12, 0xff, 0x0f, 0x40, 0x02, 0xff, 0x0f, 0x10, 0x00,
+ 0xf0, 0x13, 0xf0, 0x8a,
+ 0x00, 0x00, 0x12, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0x0f, 0x0d, 0x20, 0x66,
+ 0x0f, 0xaa, 0x01, 0x21,
+ 0x00, 0x00, 0xcc, 0x11, 0x44, 0x00, 0xff, 0xff, 0xff, 0x34, 0x22, 0xcd,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0xbd, 0x01, 0x22, 0x1f, 0x0e, 0xe3, 0x03, 0x3e, 0x1f, 0xaf, 0xe2, 0x17,
+ 0x23, 0xfd, 0xca, 0xcd,
+ 0xfd, 0x13, 0x15, 0xe0, 0x00, 0x0f, 0xfc, 0x21, 0x76, 0x10, 0xdf, 0xcd,
+ 0x33, 0x76, 0x00, 0xec,
+ 0x00, 0x44, 0x00, 0xdf, 0x00, 0x20, 0xfd, 0xb0, 0xee, 0x22, 0x45, 0xfd,
+ 0xdd, 0x11, 0x43, 0x0e,
+ 0xeb, 0x42, 0x10, 0xf0, 0x01, 0x20, 0xfe, 0xff, 0x35, 0xaf, 0xdb, 0x01,
+ 0x33, 0xd0, 0x01, 0x00,
+ 0x31, 0x4f, 0x00, 0x75, 0x2e, 0xb8, 0x00, 0x42, 0x01, 0x0e, 0xdd, 0xff,
+ 0x21, 0x63, 0xda, 0xef,
+ 0x00, 0x55, 0xf0, 0xcd, 0x00, 0x13, 0xf0, 0xd0, 0x03, 0x22, 0xff, 0xdb,
+ 0x01, 0x63, 0x00, 0xf0,
+ 0xfb, 0x10, 0x75, 0x00, 0x1f, 0x0f, 0xff, 0xef, 0x00, 0x26, 0x10, 0xed,
+ 0xd0, 0xd0, 0xf0, 0xff,
+ 0x0e, 0x75, 0x10, 0x9e, 0x0e, 0x12, 0x33, 0x02, 0x11, 0xa8, 0x0c, 0x77,
+ 0x00, 0xbe, 0x00, 0x21,
+ 0x01, 0x0e, 0x02, 0xf0, 0xee, 0x21, 0x11, 0x00, 0x20, 0x00, 0xee, 0x00,
+ 0x13, 0x0f, 0x00, 0xde,
+ 0x0d, 0x0e, 0x22, 0x37, 0xbe, 0xdc, 0x00, 0x02, 0x0f, 0xee, 0x74, 0x01,
+ 0xee, 0xeb, 0x22, 0x23,
+ 0xca, 0xee, 0x42, 0x02, 0xf0, 0xef, 0x0f, 0x10, 0x53, 0xe0, 0x0f, 0x53,
+ 0xf0, 0xa8, 0x00, 0x45,
+ 0x21, 0xf0, 0xee, 0x01, 0xf0, 0xef, 0x01, 0x43, 0xeb, 0x9d, 0x01, 0x45,
+ 0xfe, 0xd9, 0x11, 0x62,
+ 0xff, 0x0f, 0x0f, 0x00, 0x30, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0xed, 0xe0,
+ 0x02, 0x24, 0xde, 0xf0,
+ 0x12, 0x31, 0x77, 0x31, 0xce, 0x00, 0x30, 0x35, 0x21, 0x9f, 0xea, 0x10,
+ 0x54, 0x00, 0xbe, 0x0f,
+ 0x22, 0x00, 0xee, 0x00, 0x07, 0x10, 0xdf, 0xd0, 0x21, 0x04, 0xae, 0xee,
+ 0x01, 0x00, 0x0f, 0x20,
+ 0x44, 0x51, 0x11, 0xfc, 0x00, 0x64, 0x1f, 0xfd, 0x04, 0x33, 0xfe, 0xec,
+ 0xfe, 0x00, 0x22, 0xe0,
+ 0x0f, 0xfd, 0xfe, 0xdb, 0x41, 0x45, 0xed, 0xdc, 0x74, 0x42, 0xed, 0xff,
+ 0x03, 0x35, 0xee, 0xaa,
+ 0x00, 0x22, 0x21, 0xce, 0xfe, 0x02, 0x25, 0x0e, 0xfc, 0x11, 0x01, 0xb0,
+ 0x0e, 0x75, 0x21, 0xf0,
+ 0xdb, 0x11, 0x42, 0xef, 0xde, 0x21, 0x45, 0xde, 0xce, 0x11, 0x22, 0x00,
+ 0xfd, 0xf1, 0x04, 0xb0,
+ 0xfc, 0xbe, 0x01, 0x15, 0xff, 0xce, 0x00, 0x31, 0xf0, 0xbc, 0x00, 0x44,
+ 0x00, 0x0d, 0x12, 0x10,
+ 0xec, 0x11, 0x26, 0xf0, 0x00, 0x10, 0x0f, 0xaf, 0xcc, 0xf0, 0x34, 0x55,
+ 0xfe, 0xcb, 0x10, 0x31,
+ 0x30, 0x00, 0x50, 0x44, 0x0f, 0xcd, 0x22, 0x55, 0x0f, 0xdf, 0x00, 0x04,
+ 0x0f, 0xee, 0xf0, 0x02,
+ 0x31, 0xfe, 0x34, 0x53, 0x0e, 0xec, 0x30, 0x32, 0xf2, 0xbc, 0x0f, 0x00,
+ 0x3f, 0xf9, 0xef, 0x31,
+ 0x00, 0x8c, 0x10, 0x24, 0xe0, 0xc0, 0xde, 0xe2, 0x47, 0x03, 0x8b, 0x00,
+ 0x03, 0xfe, 0xf0, 0x22,
+ 0x0f, 0xeb, 0x63, 0x01, 0x0f, 0x20, 0x0f, 0xff, 0x33, 0x20, 0x20, 0xf1,
+ 0xc0, 0x01, 0x01, 0x0f,
+ 0x0d, 0xc2, 0xd0, 0xe0, 0xda, 0xa8, 0x0f, 0x63, 0x23, 0xdc, 0xdb, 0x10,
+ 0x60, 0x02, 0x0f, 0xef,
+ 0x00, 0x32, 0x00, 0x0d, 0x0f, 0xf2, 0xe0, 0x14, 0x10, 0xef, 0x10, 0x41,
+ 0x00, 0x05, 0x11, 0xcd,
+ 0x01, 0x67, 0x0f, 0xdf, 0x00, 0xe2, 0xee, 0x0f, 0x31, 0x15, 0xa0, 0x88,
+ 0x0f, 0x11, 0x11, 0xfe,
+ 0xcd, 0x00, 0x02, 0xff, 0xb9, 0x00, 0x32, 0xef, 0xf0, 0x22, 0x12, 0x00,
+ 0x03, 0x01, 0x10, 0xec,
+ 0x53, 0x05, 0x00, 0x02, 0xed, 0x30, 0x74, 0x34, 0xbb, 0xed, 0x00, 0x22,
+ 0x53, 0xed, 0xce, 0x0d,
+ 0x0f, 0x75, 0x01, 0xea, 0x00, 0x10, 0x20, 0x00, 0x02, 0x44, 0xff, 0xcb,
+ 0x00, 0x00, 0x12, 0x00,
+ 0xdf, 0xfe, 0x43, 0x56, 0xee, 0xec, 0x51, 0x33, 0xf0, 0xdd, 0x10, 0x22,
+ 0xea, 0x0f, 0x43, 0x34,
+ 0xed, 0xce, 0x21, 0x04, 0x8e, 0xff, 0x25, 0x13, 0xef, 0xcd, 0x12, 0x24,
+ 0x10, 0x0f, 0x11, 0x55,
+ 0xff, 0xec, 0x00, 0x32, 0x53, 0xfe, 0xfd, 0x11, 0x14, 0xfc, 0xcc, 0x01,
+ 0x44, 0x01, 0xed, 0xdd,
+ 0x10, 0x01, 0x00, 0x02, 0xcf, 0x88, 0x11, 0x23, 0x12, 0xdd, 0xde, 0x01,
+ 0xd0, 0x42, 0x12, 0xea,
+ 0x01, 0x65, 0xee, 0xfe, 0x41, 0x20, 0x11, 0x54, 0x00, 0xda, 0xd0, 0x31,
+ 0x63, 0xff, 0xdc, 0x01,
+ 0x42, 0xde, 0xab, 0x00, 0x01, 0x21, 0x10, 0xfe, 0xe0, 0xee, 0x00, 0x64,
+ 0xf0, 0xf0, 0xf0, 0x0b,
+ 0xee, 0x21, 0x22, 0xee, 0xaf, 0x00, 0x00, 0xf8, 0x21, 0x11, 0xbf, 0x0f,
+ 0x36, 0x32, 0x1e, 0xee,
+ 0xbe, 0x26, 0x32, 0x00, 0xde, 0xf0, 0x10, 0x0f, 0xff, 0xc0, 0xbf, 0x0e,
+ 0x21, 0x2f, 0x0e, 0xda,
+ 0xef, 0x20, 0x20, 0x0d, 0x7f, 0x75, 0xe1, 0xef, 0x0e, 0x11, 0x47, 0xe1,
+ 0xcd, 0x0f, 0x12, 0x0f,
+ 0xce, 0x24, 0x35, 0x00, 0x1d, 0x52, 0x22, 0xfd, 0x21, 0x57, 0x02, 0x0d,
+ 0xfe, 0x00, 0x00, 0x01,
+ 0xbf, 0xec, 0x00, 0x02, 0xaf, 0xe8, 0x01, 0x25, 0xd0, 0xbe, 0x01, 0x02,
+ 0x0d, 0xbf, 0x24, 0x33,
+ 0xcd, 0xec, 0x33, 0x53, 0x00, 0xfe, 0x10, 0x12, 0x04, 0x0f, 0x0d, 0x37,
+ 0x10, 0xbd, 0x0f, 0x42,
+ 0x14, 0x1f, 0x0c, 0x1f, 0x22, 0x00, 0xee, 0xcf, 0x11, 0x41, 0x54, 0x13,
+ 0xed, 0xa8, 0x0f, 0x01,
+ 0x33, 0x11, 0xed, 0xfd, 0xf1, 0xd0, 0xec, 0x34, 0x33, 0xad, 0xeb, 0x21,
+ 0x32, 0x00, 0xb0, 0x0e,
+ 0x33, 0x71, 0xfe, 0xda, 0x11, 0x20, 0xed, 0xdc, 0x77, 0x04, 0xcb, 0xf0,
+ 0x20, 0x01, 0xd0, 0x0f,
+ 0x11, 0xef, 0xdd, 0x00, 0x64, 0xff, 0xdd, 0xff, 0x12, 0x75, 0x1e, 0xec,
+ 0x03, 0x02, 0x00, 0x00,
+ 0x0f, 0x02, 0xd1, 0xcc, 0x01, 0x03, 0xef, 0xeb, 0x32, 0x67, 0xde, 0xbc,
+ 0x21, 0x42, 0x00, 0x10,
+ 0x1f, 0x20, 0x20, 0x10, 0xf0, 0x3e, 0x72, 0x22, 0xeb, 0x01, 0x24, 0x30,
+ 0xce, 0x22, 0x42, 0xee,
+ 0xf2, 0xf5, 0x13, 0xfe, 0xb9, 0x11, 0x53, 0x0f, 0xec, 0x00, 0x42, 0xff,
+ 0xea, 0x00, 0x54, 0xfe,
+ 0xce, 0x00, 0x52, 0x02, 0xbd, 0x00, 0x05, 0xe2, 0xf0, 0xf0, 0x14, 0x12,
+ 0x00, 0xbf, 0x0d, 0x00,
+ 0x41, 0x31, 0x0e, 0x2d, 0x1e, 0x2f, 0x67, 0x27, 0xf1, 0xbd, 0x10, 0x23,
+ 0xe0, 0xcc, 0x11, 0x36,
+ 0x00, 0xee, 0x00, 0xf0, 0xfd, 0x41, 0x44, 0xf0, 0xcb, 0xff, 0x00, 0x40,
+ 0x02, 0x0f, 0x1f, 0x10,
+ 0xf0, 0xbb, 0x0e, 0x12, 0x01, 0xf0, 0x00, 0x00, 0xdc, 0xcb, 0x72, 0x54,
+ 0xff, 0xdd, 0x13, 0x02,
+ 0x00, 0x32, 0x10, 0xe1, 0xcf, 0x00, 0x10, 0x00, 0xe0, 0xdd, 0xa8, 0x14,
+ 0x47, 0xbe, 0xdd, 0x10,
+ 0x32, 0xf0, 0xaf, 0xfe, 0xf1, 0x11, 0x00, 0xff, 0xba, 0xf0, 0xee, 0x02,
+ 0x77, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x0f, 0xbc, 0x00, 0x00, 0x23, 0x00, 0xdd,
+ 0x0f, 0x00, 0x10, 0x1e,
+ 0x0d, 0x00, 0x21, 0x20, 0x42, 0x32, 0xee, 0xbd, 0x01, 0x67, 0x03, 0xcf,
+ 0x00, 0x00, 0xea, 0xff,
+ 0x23, 0x02, 0x99, 0x00, 0x51, 0x01, 0x1f, 0x0d, 0x11, 0x11, 0x21, 0x11,
+ 0x1c, 0x0f, 0x00, 0xde,
+ 0xcb, 0x02, 0x02, 0xdb, 0x2f, 0x00, 0xde, 0x80, 0xe0, 0xf7, 0x01, 0x21,
+ 0x52, 0xf0, 0xdf, 0x00,
+ 0x02, 0x01, 0x37, 0xee, 0xdd, 0x42, 0x00, 0x9f, 0x00, 0x55, 0x01, 0xfa,
+ 0xef, 0x00, 0x53, 0x00,
+ 0xe0, 0x10, 0x01, 0x0d, 0xf0, 0x04, 0xff, 0x8c, 0x02, 0x22, 0x0d, 0xf1,
+ 0xf0, 0x0e, 0x10, 0x22,
+ 0x04, 0x00, 0x0f, 0xfb, 0x1d, 0x74, 0x27, 0xe0, 0xbe, 0x10, 0x21, 0xf0,
+ 0xec, 0x00, 0xf4, 0xff,
+ 0xfd, 0x30, 0x77, 0x01, 0xad, 0x0b, 0x02, 0x45, 0x0f, 0xcd, 0x00, 0x31,
+ 0x11, 0xe0, 0xee, 0x0f,
+ 0xfd, 0x52, 0x25, 0xf0, 0xcc, 0xfe, 0x10, 0x10, 0x20, 0x33, 0xe2, 0xbb,
+ 0x0f, 0x11, 0x43, 0x57,
+ 0xf0, 0xdf, 0xde, 0x00, 0x26, 0xe0, 0x9d, 0x00, 0x01, 0x01, 0x12, 0xff,
+ 0xdc, 0x00, 0x20, 0x3e,
+ 0x22, 0x00, 0xed, 0xed, 0x0e, 0x3d, 0x73, 0x67, 0xde, 0xda, 0x00, 0x63,
+ 0x02, 0xed, 0xed, 0x01,
+ 0x42, 0xf0, 0xea, 0x00, 0x03, 0x21, 0x63, 0x13, 0x0f, 0x1e, 0x1e, 0x3f,
+ 0x15, 0x12, 0xee, 0x02,
+ 0x22, 0xdf, 0x88, 0xee, 0x35, 0xf0, 0xac, 0x00, 0x04, 0xd0, 0xde, 0x00,
+ 0x33, 0x31, 0xe0, 0x00,
+ 0x21, 0xf0, 0x00, 0xe0, 0x3f, 0x72, 0x40, 0xe0, 0x03, 0xec, 0x0b, 0x20,
+ 0x75, 0x11, 0x00, 0x00,
+ 0xef, 0x01, 0x00, 0x20, 0x42, 0x02, 0xee, 0x0e, 0x09, 0x0d, 0x50, 0x11,
+ 0x22, 0xf2, 0xbd, 0x2e,
+ 0x34, 0xe2, 0xb9, 0xec, 0x01, 0x67, 0x03, 0xdb, 0xff, 0x10, 0x00, 0xd0,
+ 0x0e, 0x73, 0x65, 0xed,
+ 0xfe, 0x10, 0x22, 0x13, 0x20, 0xfc, 0xe0, 0xe4, 0xdf, 0x0f, 0x00, 0x1f,
+ 0xf0, 0xd0, 0xe2, 0x9c,
+ 0xe9, 0x00, 0x43, 0xf0, 0x9e, 0x0f, 0xff, 0x01, 0x00, 0xeb, 0x33, 0x34,
+ 0xdd, 0xec, 0x21, 0x32,
+ 0x00, 0x01, 0x46, 0xe0, 0x8f, 0xd0, 0x02, 0x01, 0xfe, 0xff, 0x14, 0x02,
+ 0x98, 0xfe, 0x30, 0x20,
+ 0x20, 0x20, 0x22, 0x1f, 0x1a, 0x0f, 0x70, 0x63, 0x04, 0x00, 0xe0, 0x02,
+ 0x42, 0x10, 0x00, 0xf6,
+ 0xc0, 0xff, 0x10, 0x33, 0x12, 0xed, 0x0d, 0x50, 0x0d, 0x10, 0x7f, 0x47,
+ 0x34, 0xfb, 0xdd, 0x00,
+ 0x64, 0x00, 0xde, 0xff, 0x01, 0x04, 0xab, 0xf0, 0x00, 0x02, 0xcd, 0xec,
+ 0x03, 0x04, 0x00, 0x1c,
+ 0x10, 0x52, 0x01, 0xf0, 0xff, 0x01, 0x00, 0x01, 0x43, 0xee, 0xdf, 0x25,
+ 0x20, 0x03, 0x0d, 0xf0,
+ 0xe3, 0xe4, 0x52, 0x3e, 0x0d, 0x47, 0x57, 0xff, 0x2f, 0x51, 0xde, 0xfb,
+ 0x40, 0x00, 0x00, 0x00,
+ 0xf0, 0xdd, 0xbc, 0x20, 0x40, 0xf0, 0xcf, 0x00, 0x0c, 0x43, 0x37, 0xbe,
+ 0xdd, 0xe0, 0x02, 0x44,
+ 0xff, 0x00, 0x00, 0xf0, 0xe5, 0x32, 0x7f, 0x0c, 0x00, 0x46, 0x00, 0xad,
+ 0xfd, 0x35, 0x31, 0xae,
+ 0xee, 0x00, 0x00, 0x0f, 0xba, 0xf0, 0x00, 0x13, 0xcd, 0x0e, 0x22, 0x34,
+ 0x10, 0xff, 0xef, 0x12,
+ 0x55, 0x24, 0x00, 0xff, 0xcf, 0x01, 0x11, 0xf0, 0xa1, 0xff, 0x01, 0x00,
+ 0xc8, 0x0c, 0x32, 0x21,
+ 0xed, 0xee, 0x43, 0x31, 0xad, 0x00, 0x27, 0x1f, 0x0e, 0x20, 0x11, 0x24,
+ 0x00, 0xdc, 0x00, 0x00,
+ 0x61, 0x30, 0x00, 0x30, 0xe0, 0xca, 0x63, 0x44, 0xfe, 0xec, 0x00, 0x50,
+ 0x23, 0x00, 0x0d, 0x53,
+ 0xf1, 0xfb, 0xfe, 0x20, 0x12, 0xef, 0xcf, 0x07, 0x14, 0xce, 0xad, 0x03,
+ 0x14, 0x24, 0xee, 0xdf,
+ 0x23, 0x33, 0x1e, 0x40, 0x00, 0xcd, 0x0c, 0x31, 0x75, 0x30, 0xee, 0x04,
+ 0x12, 0x0d, 0xdc, 0x00,
+ 0x00, 0x02, 0xa0, 0xef, 0x07, 0xef, 0xcb, 0x11, 0x52, 0xf0, 0xb0, 0xfb,
+ 0x00, 0x33, 0x33, 0x20,
+ 0xdd, 0xab, 0x00, 0x21, 0x55, 0x00, 0xef, 0x0e, 0x13, 0x32, 0xeb, 0x0f,
+ 0x11, 0x23, 0xbd, 0xdc,
+ 0x13, 0x10, 0xcc, 0xff, 0x12, 0x25, 0xdf, 0x1e, 0x3d, 0x30, 0x73, 0xed,
+ 0xcc, 0x01, 0x35, 0x0e,
+ 0xab, 0x11, 0x22, 0xce, 0xbb, 0x01, 0x22, 0x0f, 0x0e, 0xfe, 0x00, 0x03,
+ 0x24, 0x12, 0x0d, 0xea,
+ 0x31, 0x74, 0x21, 0xf1, 0xcd, 0x00, 0xe1, 0xcf, 0xf1, 0xa0, 0xfb, 0x01,
+ 0x33, 0x20, 0x00, 0xdd,
+ 0x88, 0x00, 0x30, 0x32, 0x00, 0xdf, 0xdb, 0xff, 0x00, 0x46, 0x00, 0xff,
+ 0xff, 0xdd, 0x00, 0x21,
+ 0x00, 0x54, 0x63, 0xf0, 0xda, 0x10, 0x52, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x1b, 0x00, 0x18, 0x00,
+ 0x5a, 0x0c, 0xe6, 0x00, 0x78, 0x0c, 0x4e, 0x02, 0x52, 0x37, 0x00, 0xea,
+ 0x10, 0x40, 0x21, 0x01,
+ 0xbd, 0xfc, 0x23, 0xf3, 0x8b, 0xcd, 0x01, 0x27, 0xf0, 0xbf, 0x00, 0xf0,
+ 0xf1, 0x02, 0x23, 0x1f,
+ 0x0d, 0xe0, 0xe0, 0x11, 0x46, 0x62, 0x00, 0xfe, 0x00, 0x11, 0x15, 0xf0,
+ 0xcd, 0x12, 0x77, 0x11,
+ 0x0f, 0xfb, 0x00, 0x33, 0x62, 0x00, 0x0e, 0xff, 0xee, 0x0f, 0x01, 0x14,
+ 0xfe, 0xcb, 0xf0, 0xf0,
+ 0x02, 0x11, 0xfe, 0xdb, 0x21, 0x41, 0x0f, 0x2f, 0x42, 0xdd, 0xc9, 0x62,
+ 0x24, 0xd0, 0xcc, 0xee,
+ 0x01, 0x34, 0x11, 0xbf, 0xdc, 0x00, 0x61, 0x23, 0x00, 0xed, 0xce, 0x00,
+ 0x37, 0x30, 0xdb, 0xef,
+ 0x31, 0xd0, 0xa0, 0x0d, 0x01, 0x20, 0xef, 0xef, 0x00, 0x20, 0x42, 0x00,
+ 0xfb, 0x74, 0x15, 0xdf,
+ 0x9d, 0xf0, 0x05, 0x11, 0xee, 0xcf, 0x01, 0xd0, 0x02, 0x10, 0x0a, 0x2f,
+ 0x31, 0x00, 0xfb, 0x40,
+ 0x75, 0x40, 0xee, 0x2f, 0x32, 0x14, 0x00, 0x1f, 0x52, 0x13, 0xf1, 0xed,
+ 0xec, 0x50, 0x44, 0x10,
+ 0xf0, 0xef, 0x0f, 0x00, 0x2f, 0x00, 0x21, 0x09, 0x4e, 0x71, 0x04, 0xf0,
+ 0xdd, 0xff, 0x35, 0x12,
+ 0xee, 0xc0, 0xde, 0xab, 0x03, 0xe1, 0x14, 0xf0, 0x8a, 0xf1, 0x23, 0x21,
+ 0x20, 0x23, 0xe0, 0x00,
+ 0x20, 0x0c, 0x11, 0x65, 0x01, 0xde, 0xfd, 0xff, 0x13, 0x66, 0x23, 0xff,
+ 0xcb, 0x01, 0x32, 0x00,
+ 0xe3, 0x02, 0x0e, 0x1f, 0x30, 0x21, 0x61, 0x20, 0x2f, 0xfd, 0xb9, 0xdc,
+ 0xfd, 0x0e, 0x61, 0xdc,
+ 0xf0, 0x00, 0x20, 0x44, 0x0f, 0xc8, 0x00, 0x40, 0x03, 0x0f, 0x10, 0x1f,
+ 0x0d, 0x02, 0x27, 0xa0,
+ 0xdc, 0x32, 0x34, 0xef, 0xfe, 0x60, 0x44, 0x23, 0xc0, 0xc9, 0xf0, 0x20,
+ 0x21, 0xd0, 0x8e, 0xff,
+ 0x00, 0x0f, 0xfe, 0xbc, 0x0f, 0x00, 0x03, 0xf1, 0x26, 0x24, 0xf0, 0xdb,
+ 0x00, 0x43, 0x41, 0x01,
+ 0xd0, 0xde, 0xff, 0x55, 0x41, 0xdd, 0xdf, 0x44, 0x21, 0xcb, 0xfe, 0x32,
+ 0x52, 0xdf, 0xec, 0xe0,
+ 0x03, 0xef, 0xec, 0x1f, 0x70, 0x14, 0xe0, 0xca, 0x10, 0x53, 0x22, 0xfd,
+ 0xee, 0xf1, 0x02, 0xf0,
+ 0x56, 0x00, 0xeb, 0xef, 0x30, 0x13, 0x00, 0xfd, 0x2e, 0x6d, 0x32, 0x20,
+ 0xff, 0x0f, 0x54, 0x20,
+ 0x0e, 0x20, 0xcf, 0xb8, 0xf0, 0x16, 0x20, 0xee, 0xcf, 0xe0, 0x02, 0xf1,
+ 0xee, 0x10, 0x26, 0x20,
+ 0x0f, 0xfe, 0x51, 0x13, 0x8e, 0x0f, 0x05, 0x10, 0xfb, 0x00, 0x11, 0x02,
+ 0xc0, 0xfe, 0x01, 0xe0,
+ 0xfe, 0x36, 0x31, 0xce, 0xff, 0x21, 0x24, 0xed, 0xfd, 0x73, 0x55, 0xd0,
+ 0xcc, 0xed, 0x00, 0x23,
+ 0x01, 0xce, 0x21, 0x13, 0xea, 0x00, 0x61, 0x36, 0x00, 0xed, 0x00, 0xe2,
+ 0x20, 0x20, 0xf0, 0x8e,
+ 0x00, 0xe1, 0xf0, 0x07, 0x60, 0x00, 0x1f, 0x22, 0x00, 0xcc, 0x0e, 0x20,
+ 0x44, 0xff, 0xfc, 0x00,
+ 0x0c, 0x1e, 0x31, 0xdf, 0x9b, 0x00, 0x23, 0x02, 0x11, 0x34, 0x0d, 0xcd,
+ 0x00, 0x0f, 0xec, 0x24,
+ 0x05, 0x8b, 0xe0, 0x42, 0x03, 0xbd, 0x00, 0x02, 0xff, 0xef, 0xef, 0x15,
+ 0x36, 0x00, 0xfe, 0xde,
+ 0xe0, 0x90, 0xfc, 0x01, 0x40, 0xfc, 0xff, 0x12, 0x20, 0xb9, 0x0f, 0x42,
+ 0x65, 0xfe, 0xee, 0xf1,
+ 0x32, 0x22, 0x0f, 0x10, 0x40, 0xdc, 0xee, 0x20, 0x24, 0x74, 0x1d, 0x0b,
+ 0x00, 0x32, 0x14, 0xce,
+ 0x0f, 0x32, 0x00, 0x8d, 0xf0, 0x04, 0x00, 0xe0, 0x10, 0xf0, 0xfe, 0xed,
+ 0xd1, 0x07, 0x33, 0x00,
+ 0x00, 0x23, 0x10, 0xef, 0x8c, 0x03, 0x57, 0x02, 0xec, 0xde, 0x00, 0x12,
+ 0x77, 0x30, 0xef, 0xdb,
+ 0x21, 0x53, 0x02, 0x1f, 0x0d, 0x11, 0x43, 0x00, 0xed, 0x00, 0x15, 0xff,
+ 0x9c, 0x0f, 0xf1, 0x00,
+ 0xef, 0xef, 0x22, 0x53, 0x0d, 0x0d, 0x05, 0x11, 0x20, 0x43, 0x37, 0xdd,
+ 0xab, 0x00, 0x32, 0x20,
+ 0x01, 0xce, 0xff, 0x04, 0x2f, 0xe9, 0x10, 0x73, 0x01, 0xcf, 0x00, 0x10,
+ 0x0f, 0xef, 0x01, 0x02,
+ 0xe0, 0xfb, 0xee, 0xfd, 0xfd, 0x11, 0x01, 0xcf, 0xff, 0xbc, 0x32, 0x77,
+ 0x14, 0xcc, 0x00, 0x06,
+ 0xe0, 0xbd, 0x00, 0x00, 0x02, 0xd0, 0xf0, 0x0d, 0x00, 0x30, 0x20, 0xeb,
+ 0x00, 0x41, 0x55, 0xef,
+ 0xde, 0x10, 0x71, 0x24, 0x00, 0xed, 0x11, 0x46, 0x10, 0xef, 0x0f, 0x51,
+ 0x02, 0x0f, 0x22, 0x33,
+ 0x01, 0x30, 0xeb, 0x00, 0x75, 0x32, 0x1f, 0xdc, 0xf0, 0x22, 0x20, 0x1b,
+ 0x30, 0x11, 0xd0, 0x00,
+ 0x4f, 0x00, 0xaf, 0xdf, 0xee, 0xe0, 0xef, 0x03, 0xfc, 0x88, 0xc0, 0x33,
+ 0x23, 0x0f, 0xcd, 0x00,
+ 0x21, 0x44, 0x0e, 0x0b, 0xaf, 0x02, 0x27, 0x10, 0x10, 0xef, 0xbd, 0xf1,
+ 0x27, 0x01, 0x00, 0x01,
+ 0x0f, 0xdf, 0x10, 0x74, 0x63, 0x0f, 0xff, 0x0d, 0x10, 0x34, 0x00, 0xee,
+ 0x03, 0xfa, 0xdd, 0xfe,
+ 0xf1, 0xce, 0xda, 0x00, 0x41, 0x30, 0xdd, 0xfc, 0x00, 0x73, 0x47, 0xff,
+ 0xed, 0x11, 0x12, 0x21,
+ 0x00, 0x00, 0x44, 0x02, 0x8d, 0xdb, 0x43, 0x33, 0xee, 0xde, 0x03, 0x20,
+ 0xf8, 0xef, 0xc0, 0x00,
+ 0x32, 0x11, 0x8e, 0xcb, 0x00, 0x00, 0xf0, 0x00, 0x12, 0xee, 0xbd, 0x24,
+ 0x44, 0x11, 0x10, 0xef,
+ 0xdc, 0x00, 0x33, 0x32, 0xf0, 0xaa, 0xe0, 0x02, 0x03, 0xe0, 0xde, 0xbb,
+ 0xe0, 0x20, 0x21, 0xf4,
+ 0xad, 0x0c, 0x22, 0x63, 0x0e, 0xf9, 0x00, 0x22, 0x23, 0x00, 0xf0, 0x0f,
+ 0x31, 0xe2, 0xb0, 0xee,
+ 0x0d, 0x10, 0x32, 0x57, 0x0f, 0x0a, 0x50, 0x32, 0x0f, 0x1d, 0x2d, 0x0d,
+ 0x10, 0x31, 0x10, 0x1c,
+ 0x32, 0xe3, 0x00, 0x50, 0x04, 0xb1, 0x01, 0x04, 0x06, 0xbf, 0xdf, 0x03,
+ 0x27, 0x64, 0x0f, 0xee,
+ 0x13, 0x32, 0x0e, 0x40, 0x32, 0xf0, 0xe3, 0x21, 0x51, 0x02, 0xb8, 0xec,
+ 0x01, 0xf0, 0xd3, 0xe2,
+ 0xbe, 0x0c, 0x00, 0x54, 0x00, 0xdf, 0xe0, 0x00, 0x41, 0x21, 0x10, 0xee,
+ 0xe1, 0x01, 0xd9, 0xde,
+ 0xe1, 0xf3, 0xf0, 0x0b, 0x62, 0x34, 0xde, 0x0f, 0x33, 0x64, 0x11, 0x00,
+ 0x1f, 0x25, 0x30, 0x0f,
+ 0xf0, 0x8c, 0xdd, 0x0e, 0x2c, 0xfd, 0x0f, 0x12, 0xf0, 0xe0, 0x47, 0x23,
+ 0x98, 0xea, 0x01, 0x11,
+ 0x30, 0x21, 0xc0, 0xbe, 0x10, 0x20, 0x1e, 0xf0, 0xde, 0xcf, 0x01, 0x22,
+ 0x00, 0x72, 0x02, 0xfd,
+ 0xfe, 0x33, 0x00, 0xca, 0x13, 0x27, 0xc3, 0xff, 0x0f, 0xfe, 0x8f, 0xd0,
+ 0xe0, 0x00, 0x15, 0x03,
+ 0xaa, 0xfe, 0x10, 0x1f, 0x30, 0x24, 0xf0, 0xce, 0xc9, 0x00, 0x23, 0x10,
+ 0x00, 0x0d, 0xf0, 0xdf,
+ 0xbe, 0xee, 0x23, 0x36, 0xef, 0x0e, 0x41, 0x21, 0x20, 0x72, 0x33, 0x2e,
+ 0x0a, 0x01, 0x10, 0x71,
+ 0x31, 0xf9, 0x00, 0x32, 0x01, 0x9d, 0x0e, 0x02, 0xf0, 0x0e, 0xf1, 0xc3,
+ 0xf1, 0x04, 0x04, 0xe0,
+ 0xdc, 0xdf, 0xf2, 0x02, 0xd3, 0x06, 0x32, 0x3e, 0x0d, 0xe1, 0xc3, 0xf3,
+ 0x47, 0x50, 0x20, 0x55,
+ 0x14, 0xcc, 0x0f, 0x53, 0x37, 0x0f, 0xad, 0x00, 0x34, 0x11, 0xef, 0x00,
+ 0x10, 0x00, 0xdd, 0x0f,
+ 0x00, 0x20, 0x03, 0xdc, 0xbd, 0x00, 0x32, 0x01, 0xcd, 0xfb, 0x01, 0x55,
+ 0x00, 0xee, 0xbb, 0x20,
+ 0x76, 0x00, 0xde, 0x0f, 0xf0, 0x00, 0x01, 0x10, 0x10, 0x11, 0xdd, 0xde,
+ 0x00, 0x66, 0x00, 0xb9,
+ 0x00, 0x00, 0x32, 0x20, 0x0e, 0xcb, 0x00, 0x32, 0xe0, 0xce, 0xf0, 0x01,
+ 0x53, 0x00, 0x00, 0x00,
+ 0xee, 0x44, 0x10, 0xb8, 0xfe, 0x12, 0x01, 0xc0, 0xfe, 0x11, 0x01, 0x9d,
+ 0xff, 0x02, 0xe0, 0xf1,
+ 0x17, 0x13, 0xba, 0xef, 0x0f, 0x73, 0x35, 0xff, 0xed, 0x11, 0x53, 0x12,
+ 0x0e, 0x20, 0x10, 0xe0,
+ 0x00, 0x12, 0x46, 0x12, 0xfe, 0xed, 0x0e, 0x10, 0x31, 0x54, 0x32, 0xca,
+ 0x1e, 0x72, 0x20, 0xe1,
+ 0x01, 0xed, 0x0b, 0x23, 0x04, 0xe0, 0xce, 0x03, 0x26, 0x00, 0xbe, 0xdf,
+ 0xde, 0x23, 0x74, 0x30,
+ 0x00, 0xcf, 0xec, 0x02, 0x64, 0x00, 0x0f, 0x00, 0x0b, 0xf0, 0x06, 0x02,
+ 0x9d, 0xfe, 0x25, 0x33,
+ 0xed, 0xcb, 0x11, 0x34, 0x33, 0x30, 0xef, 0xed, 0x42, 0x23, 0x32, 0x20,
+ 0x0d, 0x01, 0xef, 0x0c,
+ 0xfc, 0x9a, 0x00, 0x00, 0x10, 0xfd, 0xdb, 0x00, 0x64, 0xf0, 0xee, 0x72,
+ 0x12, 0x0f, 0xf2, 0x06,
+ 0x10, 0xfd, 0xef, 0x30, 0x62, 0x01, 0x00, 0xed, 0x02, 0x62, 0x0a, 0xcb,
+ 0x00, 0x24, 0x01, 0xd0,
+ 0xff, 0xfe, 0xbf, 0xef, 0x11, 0x00, 0xc9, 0xd0, 0xfe, 0xcf, 0x00, 0x23,
+ 0x03, 0x2f, 0x10, 0x37,
+ 0x43, 0x22, 0xde, 0xdd, 0x0f, 0x72, 0x04, 0xc0, 0xed, 0xee, 0xec, 0x22,
+ 0x77, 0x00, 0xdd, 0xdc,
+ 0xd0, 0x34, 0x20, 0x10, 0x2e, 0x00, 0x33, 0x01, 0xbd, 0x32, 0x65, 0xec,
+ 0xdc, 0x00, 0x01, 0x11,
+ 0xf0, 0x02, 0x44, 0xce, 0xaa, 0x00, 0x02, 0x30, 0x10, 0x2d, 0x4f, 0x20,
+ 0x0e, 0x1e, 0x3e, 0x5d,
+ 0x3d, 0x29, 0x0f, 0x00, 0xfe, 0x21, 0x77, 0x23, 0x8a, 0x00, 0x02, 0x01,
+ 0x11, 0xef, 0xef, 0x00,
+ 0x36, 0x10, 0xed, 0xdd, 0x01, 0x22, 0x10, 0x21, 0xe0, 0x8c, 0x02, 0x16,
+ 0x10, 0xdc, 0xd0, 0x00,
+ 0xf2, 0xff, 0x30, 0x75, 0xc0, 0xef, 0xf0, 0x00, 0x01, 0xd0, 0xf1, 0x04,
+ 0xbd, 0xdc, 0x32, 0x62,
+ 0xfd, 0xd9, 0x0f, 0x51, 0x01, 0x0f, 0x1f, 0x42, 0x27, 0xd0, 0xc0, 0x31,
+ 0x45, 0x0f, 0xad, 0x00,
+ 0x14, 0x12, 0x00, 0x0f, 0x1e, 0x00, 0xeb, 0xef, 0x00, 0x22, 0x25, 0x50,
+ 0xdd, 0xce, 0x11, 0x66,
+ 0x11, 0xef, 0xcc, 0x10, 0x10, 0xf0, 0x0f, 0x4d, 0x2d, 0x30, 0xc0, 0x98,
+ 0x0e, 0x33, 0x24, 0x00,
+ 0x0f, 0x10, 0x42, 0x00, 0x00, 0xde, 0x0f, 0x14, 0xf0, 0x8c, 0xbf, 0x01,
+ 0x23, 0x01, 0xf0, 0xcc,
+ 0xf0, 0xdf, 0x02, 0xf7, 0xf1, 0x0f, 0x0d, 0xee, 0x12, 0x46, 0x31, 0x0e,
+ 0xda, 0xee, 0x00, 0x01,
+ 0xe2, 0x50, 0x5d, 0x20, 0xec, 0xad, 0x02, 0x17, 0x03, 0x1c, 0x2e, 0x20,
+ 0x21, 0x50, 0x00, 0x0e,
+ 0x1c, 0x71, 0x23, 0x10, 0xfc, 0x00, 0x01, 0xf1, 0x02, 0xf0, 0xb0, 0xff,
+ 0xef, 0xe6, 0x17, 0xf1,
+ 0x8e, 0xdd, 0x0f, 0x10, 0x27, 0x21, 0xe0, 0xee, 0x01, 0x22, 0x00, 0x00,
+ 0x11, 0x32, 0x40, 0x0c,
+ 0x3f, 0x52, 0x13, 0x00, 0x12, 0x55, 0x1f, 0x0c, 0x10, 0x00, 0x07, 0x45,
+ 0x00, 0xfd, 0x01, 0x02,
+ 0x00, 0xcc, 0x20, 0x22, 0x80, 0xfd, 0x20, 0x72, 0x0f, 0xfb, 0xf0, 0x16,
+ 0x42, 0xf0, 0xee, 0x00,
+ 0x23, 0x35, 0xe0, 0xcf, 0x20, 0x0d, 0xdd, 0xed, 0xdf, 0x30, 0x35, 0xcd,
+ 0xb8, 0xff, 0x40, 0x74,
+ 0x20, 0xde, 0xfe, 0x00, 0x34, 0x21, 0xce, 0xdc, 0x02, 0x03, 0xec, 0x9d,
+ 0xef, 0x00, 0xef, 0x03,
+ 0x57, 0x00, 0x20, 0x0e, 0x00, 0x10, 0x20, 0x15, 0xf0, 0xae, 0x0f, 0x01,
+ 0xe0, 0xcd, 0x00, 0x03,
+ 0xec, 0xf0, 0xd0, 0xc0, 0x12, 0x40, 0x00, 0x00, 0x1f, 0x3f, 0x72, 0x67,
+ 0x17, 0x12, 0xed, 0xfd,
+ 0xf0, 0x03, 0x35, 0x1f, 0x0d, 0x00, 0x03, 0xb0, 0x00, 0x33, 0x30, 0x0e,
+ 0x41, 0x36, 0xef, 0x8b,
+ 0x00, 0x10, 0x20, 0x2f, 0x12, 0xd0, 0x8d, 0x0f, 0x15, 0x22, 0xfe, 0xfe,
+ 0x0e, 0x0e, 0x14, 0x77,
+ 0x00, 0xeb, 0x00, 0x0e, 0xc0, 0x01, 0x15, 0x0f, 0xdd, 0xde, 0xc0, 0xf0,
+ 0x36, 0x72, 0x0f, 0xbb,
+ 0x11, 0x32, 0x01, 0x00, 0x02, 0xf1, 0x01, 0xef, 0x10, 0x14, 0xfe, 0x00,
+ 0x73, 0x35, 0xfe, 0xc9,
+ 0x00, 0x50, 0x20, 0x00, 0xf0, 0x0f, 0x0d, 0xff, 0xff, 0xf0, 0xc0, 0x11,
+ 0x53, 0x0f, 0xcc, 0x23,
+ 0x57, 0x14, 0x0f, 0x1f, 0x0f, 0x2d, 0x1f, 0x43, 0xf4, 0x8d, 0x0f, 0xee,
+ 0xfc, 0xe1, 0x03, 0x10,
+ 0x0f, 0x0c, 0xbf, 0xff, 0x0d, 0x0b, 0x00, 0xf0, 0x0e, 0x0d, 0xc0, 0xed,
+ 0xbc, 0x06, 0x44, 0xff,
+ 0xbc, 0x12, 0x57, 0x11, 0x0e, 0xdd, 0x01, 0x31, 0x11, 0xff, 0xed, 0xf0,
+ 0x00, 0xcd, 0xd0, 0xf2,
+ 0x01, 0xcd, 0x88, 0xe0, 0x37, 0x01, 0xee, 0xdf, 0xf0, 0x02, 0x1f, 0x63,
+ 0x03, 0x1d, 0x0e, 0x02,
+ 0x00, 0xdc, 0x33, 0x47, 0x32, 0x0f, 0xfc, 0x10, 0x50, 0x40, 0x0f, 0x1c,
+ 0x61, 0x12, 0x1c, 0x0c,
+ 0x2d, 0x20, 0x45, 0x00, 0x0e, 0x0e, 0xe1, 0x01, 0xe0, 0x67, 0x22, 0xe0,
+ 0xdf, 0x22, 0x32, 0xf0,
+ 0xe2, 0x74, 0x10, 0x1f, 0xfc, 0xf1, 0xd0, 0xc0, 0x36, 0x40, 0xcb, 0xcf,
+ 0x00, 0x35, 0x22, 0x33,
+ 0xbc, 0xdd, 0x0f, 0x62, 0x05, 0xe0, 0xef, 0x01, 0x00, 0xee, 0xe2, 0xc0,
+ 0xed, 0x2d, 0x10, 0xbd,
+ 0x01, 0x77, 0x00, 0xed, 0x22, 0x57, 0x01, 0xdd, 0xec, 0x12, 0x44, 0x03,
+ 0xee, 0xec, 0x10, 0x23,
+ 0x0f, 0xef, 0x50, 0x32, 0xdc, 0xde, 0x01, 0x36, 0x61, 0xfe, 0xca, 0xf0,
+ 0x01, 0x01, 0xef, 0xdd,
+ 0x32, 0x22, 0x0d, 0x1c, 0x60, 0x22, 0xee, 0xbc, 0x1e, 0x00, 0x21, 0x20,
+ 0xdb, 0x9b, 0x00, 0x56,
+ 0x01, 0x0e, 0xef, 0x00, 0x20, 0x35, 0x31, 0x0f, 0xbf, 0xff, 0xdf, 0x02,
+ 0xf1, 0xbf, 0x00, 0xe4,
+ 0xff, 0xdc, 0xff, 0xe0, 0xb1, 0xf1, 0x02, 0x0d, 0xba, 0x12, 0x77, 0x10,
+ 0x0f, 0xee, 0x01, 0xe0,
+ 0xee, 0x0f, 0x0e, 0xc0, 0x01, 0xf2, 0x88, 0xef, 0x23, 0x21, 0x0b, 0xef,
+ 0x53, 0x33, 0x0d, 0x1c,
+ 0x53, 0x21, 0x00, 0x21, 0xff, 0xfb, 0x00, 0x01, 0xfd, 0x01, 0x45, 0xef,
+ 0xac, 0x00, 0x0f, 0x33,
+ 0x02, 0xed, 0xb2, 0x05, 0x02, 0xff, 0xee, 0x01, 0x13, 0xbf, 0xd0, 0xee,
+ 0x33, 0x77, 0x03, 0xfa,
+ 0x00, 0x61, 0x00, 0x11, 0x14, 0x02, 0x00, 0xf0, 0x13, 0x36, 0x00, 0xc0,
+ 0xd0, 0x04, 0x0f, 0x0d,
+ 0x2f, 0x51, 0x00, 0xfa, 0x50, 0x1f, 0xdd, 0x00, 0x23, 0x00, 0xce, 0xac,
+ 0xf0, 0x27, 0x67, 0xef,
+ 0xbc, 0x00, 0x35, 0x00, 0xff, 0xe0, 0xff, 0x0f, 0x0f, 0x10, 0x00, 0x00,
+ 0xe0, 0x0f, 0xfe, 0xd0,
+ 0xd0, 0xff, 0x74, 0x23, 0xdd, 0xef, 0x43, 0x21, 0x30, 0x0e, 0x0b, 0x00,
+ 0xcc, 0xca, 0x00, 0x00,
+ 0x11, 0x72, 0x10, 0xfa, 0x00, 0x44, 0x10, 0x00, 0x40, 0x21, 0x8c, 0xeb,
+ 0x01, 0x02, 0x00, 0xf0,
+ 0xee, 0xcc, 0xcd, 0x03, 0x35, 0xfe, 0xdd, 0xe1, 0x03, 0x11, 0x54, 0x53,
+ 0x00, 0xfc, 0x0f, 0x22,
+ 0x25, 0x00, 0x00, 0x61, 0x12, 0x1f, 0xfe, 0xe0, 0x01, 0x01, 0x12, 0x65,
+ 0x01, 0x10, 0x2d, 0x08,
+ 0x30, 0x76, 0x10, 0xde, 0xdd, 0x00, 0x26, 0x10, 0x00, 0x10, 0x20, 0xf0,
+ 0x90, 0x01, 0x00, 0x23,
+ 0x1f, 0xcb, 0x0e, 0x11, 0x55, 0x00, 0xec, 0x0e, 0x00, 0x42, 0x03, 0xf0,
+ 0xbc, 0xf0, 0x04, 0x22,
+ 0x00, 0xa0, 0x00, 0x15, 0x35, 0x00, 0x0e, 0xce, 0x00, 0x72, 0x23, 0x42,
+ 0x00, 0xcd, 0x00, 0x42,
+ 0x1f, 0x0e, 0xc8, 0x0f, 0x00, 0x26, 0x1f, 0xed, 0xd0, 0xcf, 0x10, 0x00,
+ 0x0f, 0x00, 0x30, 0x42,
+ 0x02, 0x34, 0x76, 0x30, 0x10, 0x13, 0xf0, 0xdb, 0x30, 0x42, 0xff, 0xed,
+ 0xcf, 0xfd, 0x72, 0x00,
+ 0xc8, 0xb9, 0x12, 0x33, 0xfd, 0xdf, 0xff, 0xf0, 0x02, 0x02, 0xbe, 0xdd,
+ 0x01, 0x01, 0xad, 0x01,
+ 0x27, 0x00, 0xde, 0xf0, 0x05, 0x41, 0x32, 0x0f, 0x9a, 0x11, 0x44, 0x0f,
+ 0xcd, 0x00, 0x21, 0x02,
+ 0xff, 0xfc, 0xf0, 0x00, 0xdd, 0xff, 0x23, 0x02, 0xd0, 0xdd, 0xff, 0xf0,
+ 0x57, 0x37, 0xbe, 0xcf,
+ 0x21, 0x46, 0xff, 0xdd, 0xe0, 0x00, 0x11, 0x34, 0xde, 0xdb, 0x50, 0x62,
+ 0x01, 0x2f, 0x0e, 0xfe,
+ 0xed, 0x21, 0x72, 0x53, 0x00, 0xfa, 0xee, 0x00, 0x12, 0x20, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x78, 0x22, 0xf3, 0x32, 0x04, 0x21, 0xc7, 0x33, 0x12, 0xd2, 0xb0, 0xdc,
+ 0x0f, 0x77, 0x01, 0xdc,
+ 0x0f, 0x24, 0x62, 0xfd, 0xfa, 0x00, 0x00, 0x11, 0x02, 0xcd, 0xef, 0xe1,
+ 0xe4, 0x35, 0x73, 0xdf,
+ 0xbc, 0x00, 0xf1, 0x00, 0xd0, 0xcd, 0xfc, 0xf0, 0x25, 0x32, 0x0f, 0x0c,
+ 0x30, 0x11, 0x01, 0x12,
+ 0x00, 0x46, 0x0e, 0xbb, 0x11, 0x32, 0x34, 0xf0, 0x8e, 0xfb, 0x22, 0x00,
+ 0xf1, 0xf0, 0x44, 0x52,
+ 0x00, 0xff, 0xde, 0x00, 0x33, 0x67, 0x0f, 0xdd, 0xf0, 0xf0, 0x00, 0x31,
+ 0xdd, 0xac, 0x0f, 0x00,
+ 0x04, 0xe0, 0x41, 0x45, 0xfe, 0xdc, 0x0f, 0x1f, 0x2f, 0x1d, 0x73, 0x45,
+ 0x0e, 0x08, 0x0f, 0x0f,
+ 0x42, 0x12, 0x21, 0x41, 0x00, 0x00, 0xc1, 0xe0, 0xdf, 0xcc, 0xce, 0xff,
+ 0xe0, 0xc0, 0xd2, 0xec,
+ 0xde, 0xcc, 0xab, 0x03, 0xf4, 0x11, 0x42, 0xf0, 0xbb, 0x16, 0x12, 0x10,
+ 0x00, 0xde, 0xec, 0xcf,
+ 0x0f, 0x02, 0xe1, 0xaa, 0x0f, 0x10, 0x51, 0x32, 0x3e, 0x0b, 0x13, 0x42,
+ 0x10, 0x1c, 0x0f, 0x70,
+ 0x24, 0x0d, 0xed, 0x00, 0x10, 0xe8, 0xce, 0x00, 0x14, 0x11, 0xd0, 0xbd,
+ 0xef, 0x22, 0x36, 0xd0,
+ 0xaf, 0x01, 0x02, 0xfe, 0x00, 0x3f, 0x00, 0xe1, 0x00, 0xcb, 0x20, 0x75,
+ 0x30, 0xfe, 0x17, 0x42,
+ 0xf0, 0x0e, 0x31, 0xf2, 0xd1, 0xf2, 0x8c, 0xf0, 0x24, 0x20, 0xee, 0x30,
+ 0x73, 0x1e, 0xe8, 0xf0,
+ 0x11, 0x64, 0x10, 0xfe, 0xef, 0x00, 0x15, 0x12, 0x00, 0xdf, 0xee, 0x11,
+ 0x23, 0xd0, 0xdf, 0xe1,
+ 0x00, 0x2e, 0x1e, 0x10, 0x57, 0x10, 0xfb, 0x10, 0x3e, 0x61, 0xff, 0xdb,
+ 0xe0, 0x10, 0x02, 0x00,
+ 0xbb, 0xde, 0x10, 0x44, 0xe0, 0xf0, 0x20, 0x0f, 0xff, 0xce, 0x0f, 0x75,
+ 0x02, 0x0e, 0xea, 0xdf,
+ 0x10, 0x52, 0x13, 0x20, 0x20, 0xff, 0xee, 0x42, 0xf3, 0x99, 0xee, 0x01,
+ 0xf2, 0xce, 0xce, 0x01,
+ 0x00, 0xd0, 0xd8, 0xd0, 0xee, 0xf0, 0x43, 0x74, 0x2e, 0x30, 0x35, 0x00,
+ 0xe1, 0x76, 0x20, 0xf0,
+ 0xff, 0xdf, 0x01, 0x16, 0xdf, 0xdf, 0xe0, 0x00, 0x41, 0xff, 0xff, 0x00,
+ 0x41, 0x53, 0x31, 0x30,
+ 0x0f, 0xf4, 0xe4, 0x0f, 0x23, 0x32, 0xcc, 0xa8, 0xff, 0x00, 0x02, 0x00,
+ 0x0e, 0x2e, 0x2e, 0x20,
+ 0xff, 0xfd, 0x10, 0x09, 0x20, 0x20, 0xde, 0x00, 0x61, 0x02, 0xac, 0xed,
+ 0x00, 0x37, 0x47, 0xe0,
+ 0xc0, 0x00, 0x12, 0x11, 0x00, 0x10, 0xf0, 0x00, 0x12, 0x64, 0x11, 0x01,
+ 0x0c, 0xcb, 0x33, 0x53,
+ 0xec, 0xfb, 0x00, 0x20, 0x52, 0x01, 0xdd, 0xee, 0x00, 0x72, 0x20, 0xea,
+ 0x01, 0x04, 0xfe, 0x0f,
+ 0x44, 0x12, 0x00, 0xf0, 0x13, 0x20, 0x12, 0xed, 0xeb, 0x1e, 0x0c, 0xce,
+ 0xf1, 0xf0, 0xa8, 0xf0,
+ 0x00, 0x22, 0xe0, 0xcd, 0xc0, 0xc1, 0x03, 0x26, 0xff, 0x8c, 0xff, 0x01,
+ 0x30, 0xf0, 0xe1, 0x0f,
+ 0xda, 0xff, 0x20, 0x76, 0x41, 0xef, 0xfc, 0x00, 0x00, 0x20, 0x22, 0x02,
+ 0x8c, 0xff, 0x0f, 0x0d,
+ 0xc0, 0x00, 0xeb, 0xdc, 0x11, 0x27, 0xef, 0xef, 0x01, 0x63, 0x22, 0x30,
+ 0xf3, 0xd0, 0xf0, 0x24,
+ 0x42, 0xf0, 0xde, 0xcb, 0xcc, 0x00, 0x63, 0x23, 0x0d, 0x09, 0x00, 0x4f,
+ 0x42, 0x10, 0x0c, 0x00,
+ 0x30, 0x31, 0x05, 0x00, 0xfd, 0x20, 0x03, 0xed, 0xbb, 0xf0, 0xf0, 0x42,
+ 0x20, 0x0f, 0x62, 0x12,
+ 0x00, 0x11, 0x27, 0x02, 0x12, 0x00, 0x0c, 0xf0, 0x51, 0x47, 0xf2, 0xbd,
+ 0x0f, 0x11, 0x01, 0xd0,
+ 0x14, 0x11, 0xdd, 0xdd, 0x53, 0x27, 0xcf, 0xac, 0xf0, 0xf3, 0x00, 0xed,
+ 0xfd, 0x0f, 0x63, 0x17,
+ 0x00, 0xdd, 0xed, 0x0f, 0x20, 0x41, 0x03, 0x25, 0x33, 0xee, 0x8a, 0x00,
+ 0x23, 0x12, 0xdd, 0xbc,
+ 0x03, 0x35, 0x42, 0xff, 0xdb, 0x00, 0x31, 0x42, 0x10, 0x20, 0x10, 0xed,
+ 0xce, 0x21, 0x11, 0xad,
+ 0xe9, 0xe0, 0x0e, 0x10, 0x12, 0x04, 0xcf, 0xfb, 0x00, 0x7f, 0x2f, 0xf0,
+ 0xfe, 0x32, 0x32, 0x0f,
+ 0x00, 0xe0, 0xc9, 0x10, 0x11, 0x33, 0x21, 0x20, 0xfd, 0xff, 0x23, 0x07,
+ 0x12, 0xad, 0xef, 0x01,
+ 0x01, 0xa0, 0x00, 0xe3, 0xe0, 0xfd, 0xf0, 0xf2, 0xdd, 0xb8, 0x11, 0x12,
+ 0xc0, 0x04, 0x10, 0xb8,
+ 0xe0, 0xe0, 0x02, 0xe0, 0x8b, 0xd0, 0x10, 0x20, 0x13, 0x20, 0xfa, 0x20,
+ 0x62, 0x0f, 0xfe, 0x40,
+ 0x30, 0x12, 0x1f, 0x3f, 0x30, 0x20, 0x66, 0x00, 0xab, 0x00, 0xf0, 0x11,
+ 0x02, 0xef, 0x00, 0x03,
+ 0xff, 0xec, 0x0e, 0xe0, 0x13, 0x73, 0x1f, 0x3e, 0x00, 0xee, 0x05, 0x31,
+ 0x00, 0xf1, 0x06, 0x34,
+ 0xd3, 0xb0, 0xe1, 0x00, 0x00, 0x20, 0x24, 0xdf, 0x9b, 0x00, 0x36, 0x2f,
+ 0xeb, 0x01, 0x73, 0x20,
+ 0x0f, 0xe0, 0x00, 0xf0, 0x00, 0x01, 0xc3, 0x02, 0x1f, 0x30, 0x06, 0x9c,
+ 0xed, 0xff, 0x13, 0x26,
+ 0x00, 0xdf, 0xdf, 0xee, 0x02, 0x57, 0x00, 0xbe, 0x0e, 0x10, 0x10, 0x2e,
+ 0x0f, 0x0e, 0x0d, 0x3d,
+ 0x0f, 0xac, 0xec, 0x22, 0x57, 0x06, 0xff, 0xee, 0xce, 0x00, 0x24, 0x10,
+ 0xff, 0x0f, 0x0f, 0x10,
+ 0x3f, 0x70, 0x5f, 0x0d, 0xf0, 0x13, 0x2f, 0xf8, 0x12, 0x64, 0x00, 0xba,
+ 0xf0, 0x00, 0xdf, 0x0e,
+ 0xce, 0xfe, 0xf0, 0x00, 0xf0, 0x0f, 0xfc, 0x00, 0x35, 0x23, 0x24, 0x44,
+ 0xe0, 0xde, 0xe0, 0x10,
+ 0x77, 0x51, 0xe0, 0xff, 0x0f, 0x10, 0x32, 0x0f, 0x0d, 0xff, 0x30, 0x77,
+ 0x44, 0xee, 0xdf, 0x21,
+ 0x02, 0xf0, 0x26, 0x41, 0xbe, 0xeb, 0x21, 0x43, 0x00, 0xef, 0xfd, 0x10,
+ 0x31, 0x10, 0x0c, 0x11,
+ 0x63, 0xef, 0xfc, 0x01, 0xe0, 0xfe, 0x22, 0x53, 0x0f, 0xbb, 0x11, 0x00,
+ 0x00, 0x0e, 0x47, 0x04,
+ 0xf0, 0x00, 0x03, 0x0f, 0x20, 0x35, 0x33, 0xd0, 0xaf, 0xfd, 0x00, 0x24,
+ 0x34, 0xef, 0x88, 0x00,
+ 0x10, 0x21, 0x00, 0x0d, 0xef, 0xf0, 0x32, 0x43, 0x2f, 0x1f, 0x77, 0x00,
+ 0x0d, 0xdf, 0x24, 0x44,
+ 0xfe, 0x10, 0x65, 0xfe, 0xfe, 0x01, 0x24, 0x44, 0x10, 0x3e, 0x0d, 0xae,
+ 0x0f, 0x10, 0x20, 0x0f,
+ 0xfc, 0xed, 0xdc, 0xbd, 0xf0, 0x07, 0x00, 0x8b, 0xe0, 0xf3, 0xe0, 0xce,
+ 0x02, 0x12, 0xfe, 0xdf,
+ 0x00, 0x01, 0x3e, 0x30, 0x33, 0xf0, 0x0c, 0x00, 0x1f, 0x33, 0x15, 0x00,
+ 0x0e, 0xc9, 0xe0, 0x00,
+ 0x01, 0xfe, 0xbc, 0xfe, 0xdb, 0x01, 0x15, 0xef, 0xff, 0x61, 0x17, 0xf0,
+ 0xb0, 0x00, 0x21, 0x12,
+ 0x03, 0xde, 0xac, 0x01, 0x54, 0x0f, 0xe9, 0xf0, 0x30, 0x40, 0x00, 0xfe,
+ 0xe1, 0x21, 0x51, 0x0f,
+ 0xee, 0xee, 0x02, 0x23, 0x20, 0x08, 0xde, 0xff, 0x41, 0x20, 0x41, 0x1f,
+ 0x0c, 0xbd, 0xfe, 0x57,
+ 0x22, 0xfe, 0x00, 0x41, 0xe0, 0xf0, 0x52, 0x36, 0xf0, 0x9b, 0x00, 0x11,
+ 0x11, 0x13, 0x0f, 0xcf,
+ 0xed, 0xe0, 0x04, 0x54, 0xef, 0xbb, 0x00, 0x22, 0x01, 0xce, 0xfe, 0x00,
+ 0x00, 0xd0, 0x20, 0x40,
+ 0xfd, 0xde, 0x00, 0xe0, 0x15, 0x23, 0xec, 0x89, 0x00, 0x13, 0x56, 0x00,
+ 0xcd, 0x00, 0x31, 0x23,
+ 0x10, 0x0f, 0xf0, 0x14, 0x51, 0x00, 0xe0, 0x16, 0x30, 0xe0, 0xd0, 0x20,
+ 0x14, 0x9e, 0xba, 0x00,
+ 0x00, 0x00, 0x42, 0xfd, 0xdb, 0x00, 0x53, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x53, 0x0f, 0xeb, 0x0f,
+ 0x21, 0x41, 0x0c, 0xeb, 0xff, 0x40, 0x32, 0x20, 0x0c, 0xe0, 0xe0, 0x00,
+ 0x46, 0x11, 0x01, 0xc0,
+ 0xfe, 0xd1, 0xbf, 0xca, 0xe0, 0x0f, 0xae, 0xbb, 0x0f, 0x02, 0x06, 0x01,
+ 0xd0, 0xee, 0xd0, 0x00,
+ 0x25, 0x00, 0xb0, 0xf2, 0x01, 0x0f, 0x0b, 0xde, 0x0f, 0x7f, 0x30, 0x30,
+ 0x22, 0x0c, 0x0c, 0x5e,
+ 0x43, 0x24, 0xef, 0xdd, 0x20, 0x41, 0x10, 0x21, 0x13, 0xab, 0xed, 0xff,
+ 0xef, 0x0c, 0x1c, 0x0e,
+ 0xde, 0xf0, 0x67, 0x34, 0xeb, 0x0f, 0x20, 0x62, 0x14, 0xdf, 0xde, 0x23,
+ 0x64, 0x11, 0xe0, 0xde,
+ 0xf0, 0x03, 0x12, 0x47, 0x22, 0xbd, 0xed, 0x01, 0x43, 0x24, 0x10, 0x1c,
+ 0x0e, 0xbe, 0x03, 0x77,
+ 0x03, 0x0c, 0xdf, 0x2f, 0x21, 0x13, 0xf0, 0xe1, 0xf2, 0x12, 0x02, 0x13,
+ 0x55, 0x01, 0xfe, 0xef,
+ 0x01, 0xf0, 0x24, 0x44, 0xfc, 0xad, 0x10, 0x56, 0x01, 0x00, 0xfd, 0xeb,
+ 0x10, 0x32, 0x22, 0x0f,
+ 0xdb, 0xee, 0x30, 0x10, 0xed, 0x8b, 0xef, 0x00, 0x05, 0x10, 0x0d, 0xef,
+ 0xf0, 0xff, 0x00, 0x76,
+ 0x10, 0x11, 0x2f, 0x3f, 0x22, 0xd1, 0xd0, 0x1c, 0x1f, 0x0e, 0x0f, 0xbd,
+ 0x0c, 0xe1, 0x17, 0x01,
+ 0xfe, 0x0d, 0xd0, 0x25, 0x00, 0xbe, 0xef, 0xf0, 0x01, 0x0f, 0xdd, 0x02,
+ 0x07, 0x73, 0x02, 0xdd,
+ 0xdb, 0x02, 0x52, 0x33, 0x22, 0x0f, 0xba, 0x00, 0x10, 0x10, 0x10, 0x01,
+ 0xc3, 0x01, 0x0f, 0xd0,
+ 0x06, 0x01, 0xd1, 0xe0, 0x02, 0x76, 0x00, 0xeb, 0x12, 0x64, 0x00, 0x0d,
+ 0xac, 0x0f, 0x24, 0x20,
+ 0x0d, 0xef, 0xf0, 0x0f, 0x1d, 0x20, 0x31, 0x0d, 0xde, 0x34, 0x22, 0x1a,
+ 0x4e, 0x1f, 0x00, 0xf2,
+ 0x9e, 0xf0, 0x07, 0xf4, 0x11, 0x43, 0x00, 0xdf, 0x01, 0x11, 0xef, 0x0e,
+ 0x35, 0x22, 0x00, 0x1f,
+ 0x10, 0xdc, 0xcb, 0x30, 0x50, 0x0b, 0xf0, 0xf2, 0x00, 0x4d, 0x2f, 0x37,
+ 0xf2, 0xbf, 0x1f, 0x53,
+ 0x26, 0xde, 0xfd, 0x01, 0x54, 0x11, 0x0e, 0x0e, 0x43, 0x43, 0x0f, 0x10,
+ 0x04, 0xed, 0xdc, 0x11,
+ 0x30, 0xe8, 0xbc, 0x01, 0xd0, 0xc0, 0xad, 0xf0, 0xff, 0xcd, 0x01, 0xf7,
+ 0x05, 0xe0, 0xcc, 0xe0,
+ 0x01, 0x22, 0x50, 0x1f, 0x00, 0xb0, 0x0e, 0x1d, 0x0e, 0x0e, 0x0c, 0x2f,
+ 0x0c, 0x32, 0x77, 0x0f,
+ 0xba, 0x00, 0x00, 0x33, 0xe0, 0xbe, 0xfe, 0xf0, 0x25, 0x00, 0xae, 0xf0,
+ 0xf0, 0xf4, 0x01, 0x00,
+ 0x00, 0x14, 0x12, 0x00, 0xed, 0x54, 0x34, 0x0c, 0xdd, 0x2f, 0x74, 0x23,
+ 0x00, 0xf9, 0xde, 0x10,
+ 0x31, 0x23, 0x20, 0xef, 0xfd, 0x41, 0x30, 0xff, 0x0c, 0x51, 0x35, 0x20,
+ 0xfd, 0x10, 0x20, 0x0e,
+ 0x20, 0x21, 0x54, 0x10, 0x0b, 0x12, 0x41, 0x12, 0x76, 0x44, 0xf0, 0xed,
+ 0xff, 0x01, 0x46, 0xe0,
+ 0xc0, 0x02, 0xe0, 0xd0, 0xcd, 0x00, 0x42, 0x04, 0xdf, 0xfe, 0xeb, 0xff,
+ 0x22, 0x42, 0xfd, 0xde,
+ 0xf0, 0xd1, 0xcc, 0xfc, 0x20, 0x41, 0xf1, 0xbf, 0xfd, 0xde, 0xec, 0x0f,
+ 0x55, 0x22, 0xfc, 0x12,
+ 0x77, 0x24, 0x0e, 0x30, 0x02, 0xdf, 0xe0, 0x14, 0x41, 0xff, 0xef, 0xf1,
+ 0xcf, 0xfe, 0x32, 0x00,
+ 0xd8, 0x0d, 0x20, 0x70, 0x22, 0xfd, 0xbd, 0x00, 0x24, 0x10, 0xe9, 0xcf,
+ 0xe0, 0xf1, 0x01, 0x74,
+ 0x0e, 0xf8, 0x00, 0x20, 0x52, 0x00, 0x0c, 0x22, 0x22, 0xff, 0xed, 0x02,
+ 0x01, 0x10, 0x00, 0x00,
+ 0xf2, 0x24, 0x11, 0x00, 0xef, 0x9c, 0x0e, 0xef, 0xe1, 0xe1, 0xe9, 0xa0,
+ 0xe1, 0xe2, 0xcf, 0xee,
+ 0xcf, 0xf4, 0xf5, 0x0d, 0xcd, 0xf0, 0x04, 0x04, 0x2e, 0x3a, 0x0e, 0xfd,
+ 0x00, 0x51, 0x30, 0x1c,
+ 0x40, 0x03, 0x22, 0x24, 0x21, 0x13, 0x00, 0xe9, 0xef, 0x00, 0x71, 0x33,
+ 0x0b, 0xec, 0x0f, 0x11,
+ 0x22, 0x0f, 0xab, 0xff, 0x10, 0x75, 0x21, 0xee, 0xec, 0x23, 0x43, 0xf0,
+ 0xf0, 0xff, 0xce, 0x12,
+ 0x47, 0x23, 0x00, 0xac, 0x00, 0xf0, 0x14, 0x35, 0xfe, 0xab, 0x00, 0x23,
+ 0x10, 0x01, 0x0f, 0xde,
+ 0x0f, 0x20, 0x40, 0x05, 0xf0, 0x0e, 0x43, 0xd0, 0x9e, 0xf0, 0xf2, 0x06,
+ 0x01, 0xef, 0xf0, 0x00,
+ 0x21, 0x01, 0x10, 0x2c, 0x60, 0x04, 0x11, 0x00, 0x0e, 0x12, 0x13, 0x13,
+ 0x24, 0x20, 0xca, 0xcc,
+ 0xf0, 0xff, 0xed, 0xdd, 0xf0, 0x20, 0x09, 0xcd, 0x0f, 0x00, 0xf0, 0x35,
+ 0xf1, 0x8d, 0xf0, 0x27,
+ 0x51, 0x00, 0x01, 0xff, 0x0e, 0x11, 0x74, 0x10, 0x1a, 0x0e, 0xef, 0x0e,
+ 0x20, 0x0e, 0xdd, 0x00,
+ 0x00, 0x01, 0xb0, 0x11, 0x26, 0xcd, 0xab, 0xf0, 0x00, 0xf2, 0xff, 0xd9,
+ 0xf0, 0x11, 0x42, 0x01,
+ 0xf0, 0xee, 0x13, 0x55, 0x0f, 0x11, 0x21, 0xff, 0x00, 0x44, 0x00, 0x02,
+ 0x23, 0x20, 0xca, 0xdf,
+ 0x55, 0x65, 0x00, 0xff, 0x01, 0xe0, 0xf0, 0x21, 0x41, 0x24, 0x00, 0x00,
+ 0x0d, 0x0c, 0xee, 0x2f,
+ 0x61, 0x0e, 0xd0, 0x00, 0xfc, 0x0e, 0x00, 0x25, 0x1f, 0xe9, 0xff, 0x10,
+ 0x74, 0x43, 0xfe, 0xdc,
+ 0x01, 0x33, 0x25, 0x0f, 0xdd, 0x00, 0x45, 0x02, 0xf1, 0xe2, 0xd0, 0xcb,
+ 0x00, 0x30, 0xe0, 0xf1,
+ 0x00, 0x41, 0x00, 0x30, 0x0b, 0x0e, 0xfe, 0x65, 0x13, 0xed, 0xcd, 0x23,
+ 0x14, 0x0f, 0xf0, 0x00,
+ 0x00, 0x77, 0x55, 0x00, 0xeb, 0xf1, 0x53, 0x33, 0x0f, 0xed, 0x00, 0x00,
+ 0x34, 0x20, 0x21, 0xed,
+ 0xbb, 0x00, 0x1f, 0x0e, 0x0c, 0x10, 0xf1, 0x80, 0xee, 0xfd, 0x00, 0x04,
+ 0xb0, 0xef, 0xe4, 0xe6,
+ 0xf0, 0xe0, 0xed, 0xdc, 0x00, 0x73, 0x02, 0x0f, 0x3d, 0x2f, 0x1c, 0x0c,
+ 0xed, 0xee, 0x0d, 0x77,
+ 0x35, 0xf0, 0xbb, 0xf0, 0x02, 0x22, 0x10, 0xde, 0xdf, 0x01, 0x00, 0xae,
+ 0xf0, 0xe0, 0x03, 0x20,
+ 0xff, 0x01, 0xf0, 0x37, 0x76, 0x00, 0xf0, 0x0e, 0x2f, 0x00, 0x00, 0x02,
+ 0x30, 0xfc, 0xcc, 0xde,
+ 0xf0, 0x01, 0x30, 0x50, 0xd0, 0xce, 0xff, 0x99, 0x01, 0x57, 0x00, 0x1f,
+ 0xee, 0x0e, 0x0f, 0x40,
+ 0x15, 0x1f, 0xec, 0xef, 0x30, 0x52, 0x0e, 0xf1, 0x03, 0xdd, 0x22, 0x77,
+ 0x15, 0xdd, 0xf0, 0x30,
+ 0x33, 0x0f, 0xce, 0xd0, 0x00, 0x13, 0x10, 0x1e, 0x00, 0xbf, 0xde, 0xdf,
+ 0x02, 0xef, 0xdd, 0xd1,
+ 0xae, 0xfe, 0x00, 0x11, 0xdb, 0xa9, 0x00, 0x20, 0x23, 0xf0, 0xed, 0x10,
+ 0x53, 0x13, 0x20, 0xcd,
+ 0xfb, 0x46, 0x42, 0x00, 0x01, 0x22, 0x23, 0x10, 0xe0, 0xee, 0xce, 0xd0,
+ 0x12, 0x37, 0x33, 0x22,
+ 0xd0, 0x0f, 0x31, 0xec, 0xba, 0x31, 0x44, 0x00, 0xfc, 0xbf, 0x00, 0x30,
+ 0xe0, 0xbd, 0xe0, 0x01,
+ 0x02, 0x14, 0x20, 0xcc, 0xec, 0x41, 0x77, 0x41, 0x0f, 0x0d, 0x00, 0x1e,
+ 0x1d, 0x30, 0x30, 0x1c,
+ 0x1a, 0x51, 0x44, 0xef, 0xcc, 0xe0, 0x05, 0xf1, 0xc0, 0xc0, 0xdd, 0xb0,
+ 0xe3, 0xe2, 0x9a, 0xfe,
+ 0xf1, 0xf0, 0xf0, 0xee, 0x05, 0x21, 0x0e, 0x0c, 0xf0, 0x10, 0x35, 0x21,
+ 0x0f, 0x1e, 0x3f, 0x40,
+ 0xfe, 0xd0, 0xc0, 0x24, 0x20, 0x0a, 0xf0, 0x20, 0x71, 0x12, 0x11, 0x0e,
+ 0x2c, 0x5d, 0xfb, 0x13,
+ 0x32, 0x1f, 0x2d, 0xff, 0xeb, 0xee, 0xdd, 0xff, 0x44, 0x03, 0xdf, 0xfd,
+ 0x14, 0x34, 0xde, 0xde,
+ 0x03, 0x47, 0x16, 0xff, 0xff, 0x41, 0xe1, 0xc0, 0x30, 0x41, 0xf0, 0xbd,
+ 0xed, 0x0f, 0x72, 0x47,
+ 0x04, 0xfe, 0xef, 0x10, 0x45, 0x01, 0xf0, 0xbd, 0x00, 0x05, 0x21, 0x00,
+ 0xef, 0x10, 0x21, 0x01,
+ 0xe0, 0x1f, 0x43, 0x47, 0x20, 0x11, 0x00, 0xd1, 0xe1, 0xd0, 0xff, 0x00,
+ 0xde, 0x0f, 0x63, 0xfa,
+ 0xcf, 0x20, 0x40, 0x08, 0xde, 0x10, 0x0f, 0xde, 0x30, 0x76, 0x20, 0xbb,
+ 0xef, 0x00, 0x03, 0xf0,
+ 0x00, 0x0f, 0xff, 0x31, 0x55, 0x0f, 0xed, 0x30, 0x73, 0x10, 0x21, 0x0e,
+ 0xdc, 0x0f, 0x01, 0x32,
+ 0xcb, 0xee, 0x00, 0x00, 0xf0, 0x02, 0x47, 0x05, 0x8b, 0xdf, 0x10, 0x42,
+ 0x00, 0xbf, 0xff, 0x00,
+ 0x01, 0x20, 0x0e, 0xf0, 0xfe, 0x14, 0x33, 0xfc, 0x0d, 0x67, 0x33, 0xef,
+ 0xbc, 0x00, 0x02, 0x02,
+ 0xe0, 0xee, 0xe1, 0x05, 0xe3, 0xcf, 0xac, 0x00, 0x27, 0x31, 0xf0, 0xdf,
+ 0x0f, 0x72, 0x11, 0x2f,
+ 0xff, 0xee, 0x2f, 0x30, 0x0f, 0x0d, 0xfa, 0xad, 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x41, 0xd9, 0xfd, 0xe3, 0x55, 0xd9, 0x2f, 0xe4, 0xfe, 0xd8, 0x0f, 0x74,
+ 0x33, 0xf0, 0xd0, 0x1d,
+ 0x51, 0x03, 0x00, 0xf1, 0x00, 0xed, 0x23, 0x77, 0x23, 0xea, 0xf0, 0x21,
+ 0x43, 0x02, 0xdc, 0xdd,
+ 0x01, 0x25, 0xef, 0x8a, 0x00, 0x01, 0x10, 0xe0, 0xee, 0x00, 0x01, 0x20,
+ 0x40, 0x30, 0x01, 0x56,
+ 0x63, 0x02, 0x1f, 0x0e, 0xe0, 0x11, 0x34, 0x33, 0xfd, 0xfd, 0x2f, 0x0a,
+ 0x00, 0x0e, 0x00, 0x20,
+ 0x54, 0x01, 0xbc, 0xdd, 0x04, 0x54, 0xf0, 0xde, 0xdf, 0xd0, 0xc1, 0xe1,
+ 0xd0, 0xe1, 0xe2, 0xbb,
+ 0xc9, 0xf0, 0x01, 0x62, 0x10, 0x0e, 0x2f, 0x11, 0x0f, 0x1c, 0x4f, 0xf9,
+ 0xde, 0x30, 0x31, 0xb0,
+ 0xbd, 0xfb, 0x12, 0x33, 0xfc, 0xce, 0xf0, 0xc2, 0xf3, 0xd0, 0xf1, 0xf3,
+ 0x9b, 0xdb, 0xf0, 0x25,
+ 0x31, 0x00, 0x00, 0x62, 0x00, 0x10, 0x02, 0x67, 0x01, 0xfd, 0x00, 0x23,
+ 0x00, 0xec, 0x00, 0xf0,
+ 0xff, 0xe0, 0xbb, 0x10, 0x32, 0x43, 0xe0, 0xec, 0x0f, 0x70, 0x40, 0x1c,
+ 0x0d, 0x30, 0x57, 0x03,
+ 0x0d, 0xdc, 0x10, 0x0e, 0x00, 0x24, 0xd0, 0xce, 0x00, 0x72, 0x03, 0x27,
+ 0x04, 0x11, 0x00, 0xf0,
+ 0x63, 0x27, 0x00, 0xcd, 0x00, 0x05, 0x00, 0xff, 0xee, 0x1f, 0x0e, 0xb0,
+ 0xe0, 0xce, 0xdc, 0x0f,
+ 0x76, 0x01, 0xdd, 0xcd, 0x00, 0x20, 0x02, 0x00, 0xfe, 0xeb, 0x02, 0x77,
+ 0xf0, 0xed, 0xfe, 0xff,
+ 0x63, 0x33, 0x01, 0x02, 0xe2, 0xf2, 0x05, 0x51, 0x00, 0x00, 0xc0, 0xee,
+ 0x03, 0x32, 0xf9, 0x20,
+ 0x64, 0x00, 0x0b, 0xff, 0x00, 0x30, 0x20, 0x0e, 0x00, 0x20, 0x01, 0xef,
+ 0xd0, 0xd3, 0xbd, 0x0f,
+ 0x03, 0xed, 0x89, 0xf0, 0x10, 0x55, 0x1f, 0x0d, 0x1f, 0x10, 0x0d, 0x51,
+ 0x0f, 0x1b, 0x21, 0x15,
+ 0x21, 0x01, 0xe2, 0xf6, 0xf0, 0x9c, 0xe0, 0xe1, 0xd1, 0xc0, 0xf1, 0xe0,
+ 0xca, 0xce, 0xd0, 0xee,
+ 0xce, 0x10, 0x24, 0x31, 0xfd, 0xcd, 0xf0, 0x02, 0x27, 0x01, 0x00, 0x2f,
+ 0x0f, 0xed, 0xff, 0x43,
+ 0x01, 0xb9, 0xee, 0x20, 0x34, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x40, 0x3c,
+ 0x0a, 0x2e, 0x73, 0x72,
+ 0xfb, 0xfe, 0x00, 0x00, 0x00, 0x2e, 0x23, 0x04, 0xbc, 0xfd, 0x02, 0x07,
+ 0x33, 0x10, 0xcd, 0xed,
+ 0x00, 0x45, 0x22, 0x00, 0x0e, 0x1f, 0x1f, 0x00, 0x43, 0x34, 0x0e, 0xdc,
+ 0xb0, 0xf4, 0xf2, 0xcf,
+ 0x0e, 0x11, 0x15, 0xf2, 0x9f, 0xea, 0xee, 0xe0, 0x22, 0x52, 0x0f, 0xe0,
+ 0x37, 0x35, 0xde, 0xbf,
+ 0x00, 0x65, 0x11, 0xf0, 0xef, 0x00, 0x12, 0x21, 0xfe, 0x0e, 0xf0, 0x0e,
+ 0x0f, 0x0f, 0x1e, 0x10,
+ 0x10, 0x02, 0xd1, 0x8a, 0x0e, 0xee, 0x0e, 0x03, 0x26, 0x00, 0xed, 0x0f,
+ 0x40, 0x00, 0xec, 0xdf,
+ 0x01, 0x77, 0x35, 0x0f, 0xdd, 0x1f, 0x31, 0x40, 0x52, 0x32, 0xfd, 0xd8,
+ 0xf0, 0x1e, 0x60, 0x0e,
+ 0x0f, 0xbc, 0x0f, 0x02, 0x15, 0x0f, 0xde, 0xce, 0xf1, 0x01, 0xf2, 0xdf,
+ 0xb9, 0xef, 0xf0, 0xf0,
+ 0xe1, 0xef, 0x0e, 0x73, 0x25, 0x00, 0xdd, 0x01, 0x57, 0x24, 0x0f, 0xff,
+ 0x20, 0x72, 0x03, 0x02,
+ 0xe0, 0xfe, 0xee, 0xf0, 0x25, 0x34, 0xd0, 0xe0, 0x13, 0x0f, 0x2e, 0x20,
+ 0x01, 0x00, 0xfc, 0x51,
+ 0x54, 0xf9, 0xfe, 0x1f, 0x10, 0xf0, 0x0f, 0xfd, 0xdc, 0x00, 0x24, 0x00,
+ 0xdf, 0xef, 0x17, 0x52,
+ 0xfd, 0xdc, 0x00, 0x77, 0x73, 0x00, 0xff, 0x0f, 0xfe, 0x12, 0x35, 0x00,
+ 0xfc, 0xf1, 0x23, 0x00,
+ 0xde, 0xfe, 0x00, 0x00, 0x54, 0xfe, 0xdd, 0xfc, 0x01, 0x12, 0x22, 0x00,
+ 0x0d, 0x06, 0x02, 0xee,
+ 0x00, 0x27, 0x74, 0x10, 0xef, 0xff, 0x00, 0x61, 0x31, 0x43, 0x00, 0xfc,
+ 0x00, 0x10, 0x2f, 0x1a,
+ 0x00, 0x30, 0xf3, 0x8f, 0xf0, 0xfe, 0xed, 0x01, 0x17, 0x01, 0xbe, 0x0d,
+ 0xf1, 0xf0, 0xd0, 0xf0,
+ 0xab, 0xdb, 0xf0, 0x03, 0x00, 0x0d, 0x1e, 0xdc, 0x23, 0x35, 0xfd, 0x2e,
+ 0x61, 0x0f, 0xd9, 0xfd,
+ 0x0e, 0x64, 0x01, 0xef, 0xe0, 0xee, 0xdf, 0x13, 0x37, 0xe0, 0xb0, 0x00,
+ 0xff, 0x0f, 0x11, 0xf0,
+ 0x0f, 0x72, 0x32, 0xfe, 0xeb, 0x02, 0x45, 0x12, 0x33, 0xf0, 0xab, 0xff,
+ 0xf1, 0x05, 0x21, 0xbd,
+ 0xdc, 0xee, 0x00, 0x1f, 0x1f, 0xfe, 0xd0, 0x01, 0x23, 0x00, 0xf0, 0x01,
+ 0x42, 0x21, 0x0d, 0xb8,
+ 0x10, 0x30, 0x1f, 0xdc, 0x00, 0x70, 0x1f, 0x10, 0x02, 0x20, 0x10, 0x23,
+ 0x05, 0x45, 0x23, 0x21,
+ 0xf2, 0xcf, 0xfd, 0x23, 0x35, 0xff, 0xee, 0x0f, 0x0d, 0xea, 0xcf, 0xf1,
+ 0xe0, 0x10, 0x23, 0xf0,
+ 0x9d, 0xd8, 0xee, 0x26, 0x31, 0xaf, 0xed, 0x00, 0x0f, 0x0f, 0x0e, 0x30,
+ 0x2f, 0x00, 0x54, 0x00,
+ 0xcd, 0xef, 0x37, 0x44, 0x00, 0xdf, 0xd2, 0xe1, 0x13, 0x60, 0x37, 0x00,
+ 0xdc, 0x00, 0x31, 0x10,
+ 0x41, 0x00, 0x0f, 0x2f, 0x01, 0x15, 0x11, 0xee, 0xe0, 0x15, 0xf1, 0x8e,
+ 0xcd, 0x25, 0x23, 0x00,
+ 0xa8, 0x00, 0xf0, 0x10, 0x10, 0x1f, 0x0e, 0x40, 0x44, 0x0f, 0x0f, 0x40,
+ 0x22, 0x1e, 0xfb, 0xe0,
+ 0x0e, 0x43, 0x02, 0x21, 0x00, 0xcb, 0xd0, 0xef, 0xa0, 0xe5, 0x01, 0xef,
+ 0xed, 0xcf, 0xef, 0xc0,
+ 0xe2, 0xbd, 0xe8, 0xff, 0x00, 0x01, 0xbf, 0x0f, 0x13, 0x44, 0x0f, 0xed,
+ 0xf0, 0x16, 0x44, 0xe0,
+ 0xcd, 0x0f, 0x20, 0x00, 0xcf, 0xdb, 0x20, 0x70, 0x32, 0x0f, 0x1d, 0x0c,
+ 0x50, 0x46, 0x11, 0xfd,
+ 0x0d, 0x1e, 0x10, 0x0f, 0xf0, 0xe0, 0xf0, 0xee, 0xec, 0xee, 0xee, 0xce,
+ 0xfe, 0xf0, 0x26, 0x43,
+ 0x10, 0x32, 0x20, 0x10, 0x54, 0x36, 0x24, 0x0f, 0xdc, 0x01, 0x73, 0x01,
+ 0xdf, 0x00, 0xf2, 0x01,
+ 0x00, 0xfd, 0xee, 0x02, 0x67, 0x23, 0x10, 0x12, 0x00, 0xbd, 0x0f, 0x35,
+ 0xf1, 0xc2, 0x13, 0x35,
+ 0x22, 0xdf, 0xab, 0x03, 0xf3, 0xe1, 0x01, 0x67, 0x0f, 0x0e, 0x21, 0x34,
+ 0x00, 0xed, 0xfe, 0x00,
+ 0x10, 0xed, 0xfd, 0x14, 0xfd, 0xb8, 0xf0, 0xf0, 0x0e, 0x51, 0x46, 0x00,
+ 0xdd, 0x10, 0x32, 0x30,
+ 0xfc, 0xce, 0xef, 0x00, 0x12, 0x12, 0x40, 0x11, 0x1e, 0xdd, 0x32, 0x67,
+ 0x22, 0x0f, 0xd9, 0xff,
+ 0x31, 0x74, 0x00, 0xde, 0xcc, 0x11, 0x41, 0xf0, 0xd0, 0xfe, 0x01, 0x01,
+ 0x54, 0x00, 0xca, 0xef,
+ 0x00, 0x13, 0xee, 0x0b, 0x0f, 0x3f, 0x20, 0x23, 0x00, 0x02, 0xf3, 0xef,
+ 0xca, 0x02, 0x13, 0xb2,
+ 0xf3, 0xe3, 0x03, 0x22, 0x99, 0xab, 0x00, 0x01, 0x05, 0x31, 0xe0, 0xfd,
+ 0x01, 0x33, 0x12, 0xf0,
+ 0xdb, 0x30, 0x40, 0x10, 0xf0, 0x00, 0x0e, 0x2f, 0x0d, 0xc9, 0xef, 0xe0,
+ 0x41, 0x53, 0x0d, 0xec,
+ 0x24, 0x75, 0x00, 0x0f, 0x31, 0x33, 0x33, 0x20, 0x0f, 0x0d, 0x0e, 0xec,
+ 0x20, 0x20, 0xf0, 0xe2,
+ 0xde, 0xcb, 0x00, 0x11, 0x1f, 0xca, 0x00, 0xf3, 0x0f, 0x1f, 0x10, 0xda,
+ 0xf0, 0xff, 0xdf, 0x10,
+ 0x36, 0x00, 0xf0, 0xf3, 0x00, 0x00, 0x23, 0x77, 0x11, 0x0f, 0x30, 0x44,
+ 0x11, 0xf0, 0x1c, 0x72,
+ 0x22, 0x0f, 0xea, 0x00, 0x02, 0x30, 0xf2, 0xd1, 0x8c, 0xed, 0xf2, 0x07,
+ 0x33, 0xcf, 0xcd, 0x01,
+ 0x01, 0xcd, 0xda, 0xf1, 0x02, 0xeb, 0x00, 0x51, 0x00, 0x0f, 0x2e, 0x20,
+ 0x30, 0x0e, 0xfc, 0x10,
+ 0x10, 0x00, 0xee, 0xeb, 0xba, 0xdf, 0x00, 0xc0, 0xc0, 0x0e, 0x2f, 0x00,
+ 0xb1, 0xf0, 0x00, 0xfe,
+ 0x47, 0x17, 0xbf, 0xfe, 0x00, 0x62, 0x10, 0xef, 0xee, 0x15, 0x42, 0x00,
+ 0xef, 0x00, 0xe1, 0xc1,
+ 0x02, 0x44, 0x20, 0x0e, 0x3f, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0c, 0x1b,
+ 0x3f, 0x62, 0x02, 0xef,
+ 0x0e, 0x30, 0x50, 0x0b, 0x1b, 0x00, 0x02, 0x11, 0x20, 0x20, 0x01, 0x00,
+ 0x04, 0x25, 0x10, 0x31,
+ 0x74, 0x02, 0xf0, 0xfe, 0x32, 0x37, 0x12, 0x21, 0x31, 0x20, 0xdd, 0xaf,
+ 0xee, 0x03, 0xf2, 0xb8,
+ 0xfe, 0xe1, 0x04, 0xef, 0xab, 0x00, 0x0f, 0xfd, 0x0e, 0x1f, 0x41, 0x46,
+ 0x20, 0xda, 0xcf, 0x10,
+ 0x53, 0x11, 0xf0, 0xc0, 0xe1, 0xf0, 0x03, 0x03, 0x1f, 0x0d, 0xf0, 0x65,
+ 0x42, 0x01, 0x1e, 0x1f,
+ 0x52, 0x22, 0x10, 0xd9, 0xf0, 0x03, 0x13, 0x12, 0xff, 0xab, 0xf0, 0xf3,
+ 0x03, 0xef, 0xc8, 0x0f,
+ 0x64, 0xf1, 0xcc, 0xdd, 0x0f, 0x22, 0x40, 0xfc, 0xff, 0x21, 0x20, 0x43,
+ 0x53, 0x2e, 0x1b, 0x30,
+ 0x33, 0x00, 0x1f, 0x30, 0x00, 0x00, 0x06, 0xe1, 0xa0, 0xdc, 0x01, 0xf4,
+ 0xe0, 0xba, 0xbf, 0xee,
+ 0x01, 0x04, 0x40, 0xdc, 0xbb, 0x10, 0x21, 0x01, 0xdf, 0xd0, 0x00, 0xf1,
+ 0x02, 0x12, 0xc0, 0xcc,
+ 0xe1, 0xc3, 0x00, 0xb8, 0x0f, 0x00, 0x30, 0x41, 0x0e, 0x0e, 0x51, 0x01,
+ 0x1c, 0x20, 0x46, 0x20,
+ 0x00, 0xf0, 0x10, 0x60, 0x00, 0x00, 0xfa, 0xce, 0x00, 0x11, 0x30, 0x0b,
+ 0xf1, 0x02, 0xbf, 0xfc,
+ 0xe0, 0x03, 0x47, 0x42, 0x10, 0x0d, 0x22, 0x42, 0x54, 0x20, 0xfc, 0xdf,
+ 0x0f, 0x10, 0x23, 0xeb,
+ 0xbe, 0xe0, 0xe0, 0xf2, 0xc6, 0xc0, 0xef, 0xe0, 0xf0, 0x12, 0x13, 0xf0,
+ 0x51, 0x36, 0x0f, 0xda,
+ 0xf0, 0x32, 0x54, 0x00, 0xd0, 0x0f, 0xf0, 0xf1, 0xf5, 0x12, 0x01, 0x01,
+ 0x10, 0x2f, 0x0e, 0xff,
+ 0x50, 0x11, 0xca, 0xef, 0xef, 0xfd, 0xff, 0x36, 0x31, 0xce, 0xde, 0xf0,
+ 0x01, 0x44, 0x0f, 0xf0,
+ 0x36, 0x40, 0x00, 0xb9, 0x00, 0x20, 0x40, 0xee, 0xf0, 0x31, 0xd0, 0x0c,
+ 0x21, 0x72, 0x21, 0x0e,
+ 0x0c, 0x0d, 0xed, 0x33, 0x4f, 0x1e, 0x21, 0x0e, 0xc9, 0x8e, 0xff, 0x00,
+ 0xf0, 0xeb, 0xce, 0x0f,
+ 0x04, 0x32, 0x0e, 0xec, 0xfc, 0x20, 0x30, 0x33, 0x25, 0x11, 0x31, 0x73,
+ 0x02, 0xde, 0xd0, 0xf6,
+ 0x01, 0x02, 0xef, 0xb0, 0x00, 0x05, 0x45, 0x01, 0xdd, 0xee, 0x31, 0x55,
+ 0x00, 0x02, 0xf0, 0xff,
+ 0x0f, 0x20, 0x51, 0x0f, 0xdc, 0x01, 0x12, 0x09, 0xed, 0x3f, 0x60, 0x0f,
+ 0xc8, 0x00, 0x03, 0x11,
+ 0xe0, 0xbe, 0x12, 0x23, 0x35, 0x53, 0x0f, 0x0d, 0x21, 0x53, 0x42, 0x11,
+ 0x1f, 0x0e, 0x0e, 0x1d,
+ 0x0f, 0x13, 0xe1, 0xd1, 0xe2, 0xe1, 0xf1, 0xc0, 0xde, 0x0e, 0x47, 0x40,
+ 0xe0, 0xeb, 0x00, 0x20,
+ 0x3f, 0x20, 0x10, 0x00, 0x13, 0x27, 0xf1, 0xcf, 0x0e, 0x22, 0x47, 0x31,
+ 0x20, 0x10, 0x50, 0x12,
+ 0x1f, 0x4e, 0x21, 0x34, 0xff, 0x99, 0x10, 0x12, 0x21, 0x03, 0xcd, 0x9b,
+ 0x00, 0x04, 0x10, 0xff,
+ 0xed, 0x13, 0x03, 0xfd, 0xbb, 0xff, 0xff, 0x0f, 0xff, 0x01, 0x43, 0x00,
+ 0x88, 0x0d, 0xf0, 0x00,
+ 0x10, 0x0d, 0xe0, 0x05, 0x0d, 0xfd, 0x00, 0x3f, 0x40, 0x36, 0xd0, 0xad,
+ 0xf0, 0x12, 0x37, 0x10,
+ 0xcc, 0xf1, 0x32, 0x22, 0xe0, 0xdc, 0x31, 0x73, 0x0f, 0xda, 0x00, 0x10,
+ 0x52, 0x01, 0xd0, 0xf0,
+ 0xf1, 0xf1, 0x01, 0x00, 0xf0, 0xcb, 0xcd, 0x01, 0x05, 0xad, 0xfb, 0x00,
+ 0x0e, 0xdf, 0xfe, 0x00,
+ 0x21, 0x00, 0x10, 0x60, 0x2f, 0x10, 0xf4, 0x17, 0x41, 0x1f, 0x1e, 0x00,
+ 0xde, 0xfe, 0x34, 0x46,
+ 0x00, 0xfe, 0xff, 0x20, 0x36, 0x20, 0x40, 0x41, 0x02, 0x01, 0x12, 0x31,
+ 0x20, 0xd1, 0xae, 0xe8,
+ 0xbf, 0xfe, 0xff, 0xef, 0x00, 0x12, 0xeb, 0xad, 0x00, 0x20, 0x2f, 0x0e,
+ 0x0f, 0x32, 0x37, 0xff,
+ 0xbe, 0xee, 0xed, 0x32, 0x37, 0xb0, 0xcf, 0xef, 0x00, 0x53, 0x26, 0x0f,
+ 0xed, 0x00, 0x77, 0x21,
+ 0x00, 0x10, 0x11, 0x11, 0x0f, 0xfe, 0xf0, 0x01, 0x01, 0xe4, 0xd3, 0xd0,
+ 0xbd, 0xf0, 0x05, 0x00,
+ 0xbd, 0xee, 0x02, 0x57, 0x05, 0xee, 0xed, 0xfd, 0x1f, 0x70, 0x14, 0x10,
+ 0x0d, 0xfd, 0x20, 0x71,
+ 0x26, 0x10, 0x00, 0x23, 0x51, 0x0c, 0xde, 0xe0, 0x10, 0x34, 0x10, 0xac,
+ 0xd9, 0xfe, 0x23, 0x43,
+ 0xbd, 0xc8, 0xf0, 0x00, 0x01, 0x00, 0x00, 0xe0, 0x02, 0xe0, 0xed, 0xdf,
+ 0xde, 0xef, 0xf4, 0xe1,
+ 0xe0, 0xff, 0xdd, 0xdf, 0x0f, 0x3f, 0x50, 0x12, 0x06, 0x11, 0x1e, 0x5f,
+ 0x30, 0x00, 0xec, 0x1c,
+ 0x2e, 0x51, 0x23, 0x1d, 0x0a, 0xf0, 0x20, 0x1d, 0x1c, 0x1f, 0x21, 0x13,
+ 0xde, 0xac, 0xf0, 0xf5,
+ 0x15, 0xfd, 0xcb, 0x01, 0x32, 0x13, 0x50, 0x34, 0x20, 0x0d, 0x0f, 0x60,
+ 0x33, 0x43, 0x06, 0xe0,
+ 0xdf, 0xfc, 0xd0, 0x01, 0x05, 0xe0, 0xbd, 0x02, 0x03, 0x00, 0x00, 0x34,
+ 0x42, 0x11, 0xfe, 0xfc,
+ 0x12, 0x01, 0x0f, 0x2f, 0x44, 0x35, 0x00, 0xce, 0xe0, 0x17, 0x34, 0xd0,
+ 0x02, 0xf0, 0xad, 0xff,
+ 0x02, 0x22, 0x31, 0x01, 0xf0, 0x98, 0x0e, 0x00, 0x0d, 0x30, 0x00, 0x02,
+ 0xff, 0x01, 0x24, 0x1f,
+ 0xe8, 0xe0, 0x20, 0x74, 0x00, 0x0f, 0x00, 0xe0, 0xda, 0x0f, 0x41, 0x62,
+ 0x00, 0xfe, 0x0e, 0x31,
+ 0x25, 0x23, 0x23, 0x4f, 0x0c, 0x00, 0x20, 0xff, 0xfd, 0x13, 0x05, 0xcb,
+ 0xac, 0x0d, 0x00, 0x13,
+ 0x0d, 0xcd, 0xf1, 0x16, 0x41, 0xfe, 0xec, 0x20, 0x76, 0x10, 0xc0, 0xec,
+ 0x00, 0x00, 0xff, 0x01,
+ 0xf1, 0xe0, 0x10, 0x21, 0xe3, 0xbf, 0xf0, 0x07, 0x55, 0xf0, 0xad, 0x02,
+ 0x12, 0x0f, 0xc0, 0x0f,
+ 0xff, 0xdd, 0x0e, 0x23, 0x77, 0x00, 0xee, 0x10, 0x11, 0x20, 0x0c, 0xd0,
+ 0x00, 0x15, 0x10, 0xd0,
+ 0xbe, 0x03, 0x11, 0x0c, 0xfb, 0x01, 0x53, 0x42, 0x44, 0x42, 0x1e, 0x08,
+ 0x30, 0x43, 0x00, 0x10,
+ 0x11, 0xfe, 0xad, 0x10, 0x15, 0x0f, 0xba, 0x00, 0x00, 0x20, 0xdd, 0xc0,
+ 0x11, 0x46, 0x00, 0xff,
+ 0xf0, 0xed, 0xdf, 0xd1, 0xe0, 0x10, 0x53, 0x00, 0xfe, 0xed, 0x00, 0x26,
+ 0x62, 0x34, 0x41, 0x12,
+ 0x10, 0x11, 0x35, 0x20, 0x43, 0x24, 0x00, 0x9a, 0xdd, 0x00, 0x14, 0xf0,
+ 0xce, 0x00, 0x00, 0xf0,
+ 0x22, 0x05, 0xd0, 0x00, 0x12, 0x02, 0xef, 0x9b, 0x01, 0xe3, 0xfe, 0xf0,
+ 0xfd, 0xb8, 0xed, 0xf0,
+ 0xef, 0xfc, 0x20, 0x2f, 0xff, 0x10, 0x53, 0x11, 0xf8, 0xef, 0x00, 0x00,
+ 0x00, 0xfc, 0xbf, 0x0f,
+ 0xe0, 0xbe, 0xef, 0x00, 0x01, 0x75, 0x0f, 0xfc, 0xf0, 0x17, 0x43, 0x12,
+ 0xed, 0xde, 0x35, 0x22,
+ 0xe1, 0xd1, 0xf0, 0xde, 0x0e, 0x44, 0x52, 0xee, 0xfe, 0x21, 0x2d, 0x4e,
+ 0x10, 0x00, 0xac, 0x01,
+ 0x17, 0x01, 0x0d, 0xce, 0x20, 0x1d, 0x0d, 0x04, 0x23, 0x0d, 0x4b, 0x2f,
+ 0x31, 0x32, 0xea, 0x00,
+ 0x41, 0x22, 0x34, 0xf0, 0x03, 0xf4, 0x00, 0x13, 0x42, 0x0f, 0x02, 0x35,
+ 0xe1, 0xf3, 0xff, 0xec,
+ 0x10, 0x00, 0x11, 0xe0, 0xa8, 0xee, 0xef, 0x00, 0xe0, 0x03, 0x0d, 0xaa,
+ 0x00, 0x24, 0x0f, 0xdd,
+ 0x30, 0x74, 0x00, 0xec, 0xfe, 0x10, 0x61, 0x22, 0x00, 0xde, 0xe9, 0xf1,
+ 0x24, 0x42, 0x00, 0x0f,
+ 0x30, 0x22, 0x11, 0x43, 0x05, 0x21, 0x22, 0xf0, 0xcc, 0xff, 0xe0, 0xc1,
+ 0xe3, 0x14, 0xfd, 0x8a,
+ 0xff, 0xf0, 0x15, 0x43, 0xfd, 0xdb, 0x11, 0x44, 0x0e, 0x0d, 0x10, 0x51,
+ 0x11, 0x02, 0x00, 0xbd,
+ 0x0b, 0x01, 0x44, 0x00, 0xd0, 0x21, 0x76, 0x21, 0x02, 0x1e, 0xeb, 0x00,
+ 0x00, 0x20, 0xdc, 0x1f,
+ 0x32, 0x01, 0x80, 0xea, 0xcf, 0x00, 0x35, 0x00, 0xdf, 0xe0, 0xff, 0xe0,
+ 0xdd, 0xbe, 0xcc, 0xe0,
+ 0x00, 0xe0, 0xd0, 0xef, 0xed, 0x0d, 0x00, 0x52, 0x01, 0xff, 0x00, 0x47,
+ 0x30, 0xfe, 0xfe, 0x40,
+ 0x1f, 0x2e, 0x32, 0x32, 0x0b, 0x0e, 0x41, 0xe1, 0xe2, 0x47, 0x2f, 0xec,
+ 0xc0, 0x02, 0x14, 0xb0,
+ 0x0f, 0x11, 0x00, 0xdd, 0xff, 0x3f, 0x2d, 0x1e, 0x20, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x5a, 0x13, 0x5a, 0x0b, 0x36, 0x13, 0xa8, 0x0c, 0x34, 0x00, 0x0c, 0xef,
+ 0x12, 0x35, 0xe0, 0xbd,
+ 0xcc, 0xf3, 0x04, 0xee, 0xde, 0x04, 0x04, 0xf0, 0xcc, 0x00, 0x42, 0x36,
+ 0x40, 0x31, 0x01, 0x55,
+ 0x00, 0xae, 0x0e, 0x01, 0xe0, 0x02, 0x37, 0xdf, 0xbe, 0x03, 0x25, 0xff,
+ 0xdf, 0x00, 0x03, 0xfd,
+ 0x30, 0x77, 0x52, 0xff, 0xdb, 0x0f, 0x0f, 0xff, 0xdf, 0x0f, 0x31, 0x33,
+ 0xee, 0x8b, 0x01, 0xf0,
+ 0x03, 0x33, 0x20, 0x08, 0xf0, 0x23, 0x0f, 0x00, 0x50, 0x11, 0x0d, 0xef,
+ 0x30, 0x2e, 0x10, 0x24,
+ 0xee, 0xfa, 0x60, 0x34, 0x01, 0xcf, 0xfa, 0x21, 0x22, 0xcc, 0xab, 0x00,
+ 0x0f, 0x41, 0x01, 0xdc,
+ 0xce, 0x1f, 0x21, 0x02, 0x0f, 0x0f, 0x01, 0x00, 0x02, 0x31, 0x01, 0xf0,
+ 0xc2, 0xf6, 0xe0, 0x00,
+ 0x22, 0x07, 0x41, 0xd0, 0x8f, 0x00, 0x01, 0xf4, 0x24, 0x40, 0xe1, 0xf0,
+ 0xfe, 0xde, 0x02, 0x40,
+ 0x0b, 0xfe, 0x13, 0x34, 0xfe, 0xa8, 0x00, 0x60, 0x00, 0xff, 0xcf, 0x03,
+ 0x25, 0x0f, 0x00, 0x32,
+ 0xff, 0xcc, 0x13, 0x54, 0x0f, 0xfd, 0x55, 0x42, 0x02, 0x00, 0x10, 0x0d,
+ 0x00, 0x57, 0x13, 0x0c,
+ 0xff, 0xe1, 0x04, 0x01, 0x0e, 0xde, 0x0e, 0x74, 0x03, 0xdc, 0xf0, 0x11,
+ 0xfe, 0xdc, 0x31, 0x56,
+ 0x00, 0x0c, 0x1f, 0x0f, 0xe0, 0x31, 0x02, 0x0e, 0x21, 0x03, 0x14, 0x42,
+ 0x33, 0x05, 0x02, 0xf3,
+ 0xff, 0x0b, 0x11, 0x73, 0x22, 0xfe, 0xfa, 0xff, 0xdf, 0x00, 0x32, 0x02,
+ 0xfa, 0x10, 0x04, 0x03,
+ 0x01, 0xce, 0xdf, 0xcf, 0xf0, 0xf1, 0x12, 0xd0, 0xba, 0xdc, 0xed, 0x3f,
+ 0x0e, 0xbe, 0x10, 0x23,
+ 0xde, 0xdb, 0xdf, 0x0e, 0x43, 0x15, 0xd0, 0x00, 0x54, 0x0e, 0x2e, 0xed,
+ 0xd8, 0x0e, 0x00, 0x10,
+ 0x10, 0xdf, 0x0c, 0x64, 0x37, 0xf0, 0xb0, 0x0f, 0x01, 0x24, 0x00, 0x2e,
+ 0x0f, 0xe0, 0xe0, 0x00,
+ 0x2d, 0x1f, 0x12, 0x11, 0xfd, 0xce, 0xf1, 0xd1, 0xf4, 0x03, 0x15, 0xe0,
+ 0xad, 0xee, 0xed, 0xea,
+ 0x0f, 0x3f, 0x3d, 0x2f, 0x10, 0xff, 0x1f, 0x10, 0x00, 0x15, 0x55, 0x00,
+ 0xef, 0xff, 0x25, 0x22,
+ 0x01, 0x00, 0x3f, 0xed, 0xcd, 0x20, 0x74, 0x46, 0x10, 0x01, 0x01, 0x03,
+ 0x10, 0x0b, 0x00, 0xe1,
+ 0xbf, 0xf0, 0xf0, 0xd0, 0xb8, 0xed, 0xf0, 0x00, 0x21, 0xdd, 0xf0, 0x33,
+ 0xfd, 0xea, 0x00, 0x30,
+ 0x24, 0xde, 0xcc, 0x00, 0x1f, 0x20, 0x0e, 0xf0, 0x0f, 0xdb, 0x00, 0x54,
+ 0x22, 0x32, 0x44, 0x26,
+ 0x22, 0x10, 0x0f, 0xe1, 0x04, 0xcf, 0xe0, 0x12, 0x26, 0xcd, 0xac, 0x0f,
+ 0xf0, 0xe1, 0xef, 0x00,
+ 0x67, 0x23, 0xfe, 0xad, 0x00, 0x05, 0x22, 0x11, 0xff, 0xcb, 0x00, 0x32,
+ 0x22, 0xf0, 0x0c, 0x30,
+ 0x20, 0xff, 0x00, 0x63, 0x44, 0x13, 0x10, 0x0e, 0x3d, 0x20, 0x10, 0xfe,
+ 0xc8, 0xde, 0xe0, 0x0f,
+ 0x0e, 0x9a, 0xdf, 0x00, 0x00, 0xe3, 0xd0, 0xe0, 0xb0, 0xcf, 0xfe, 0x00,
+ 0xd0, 0xde, 0xbd, 0xdc,
+ 0x0f, 0x11, 0x13, 0xd0, 0xd9, 0xf0, 0x0f, 0x41, 0x36, 0x00, 0x00, 0x0f,
+ 0x20, 0x3f, 0x5e, 0x1d,
+ 0x2d, 0x4f, 0x1e, 0x5e, 0x1e, 0x0c, 0xf0, 0xdf, 0xdf, 0x12, 0x15, 0xe0,
+ 0xd1, 0xee, 0xfb, 0xef,
+ 0x00, 0x05, 0x32, 0x3e, 0x3e, 0x0f, 0x2c, 0x5e, 0x22, 0x47, 0x22, 0xfe,
+ 0xde, 0x03, 0x46, 0x23,
+ 0xd0, 0x8e, 0xef, 0xf0, 0x02, 0x00, 0xfe, 0xd0, 0x47, 0x36, 0x0f, 0x1f,
+ 0x3f, 0x40, 0x42, 0x12,
+ 0x00, 0xe1, 0x02, 0x02, 0x1e, 0xf8, 0xcf, 0xd0, 0xf1, 0xf1, 0xe2, 0x34,
+ 0x20, 0xed, 0xf1, 0x17,
+ 0x11, 0x01, 0xdf, 0x0f, 0x43, 0x00, 0xad, 0xee, 0x11, 0x22, 0xe8, 0xfb,
+ 0x21, 0x00, 0x00, 0x62,
+ 0x31, 0x21, 0xfe, 0x00, 0x33, 0x12, 0x12, 0x20, 0x21, 0xf0, 0xdb, 0x0d,
+ 0x40, 0x77, 0x10, 0x0e,
+ 0x00, 0x10, 0x24, 0x88, 0xfd, 0x77, 0x03, 0xdc, 0x00, 0x20, 0x01, 0xef,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0d, 0xe0, 0x01, 0x0f, 0xec, 0x10, 0x10, 0x11, 0xf0, 0xe0, 0x53, 0x33,
+ 0x32, 0xfe, 0xad, 0x00,
+ 0xf0, 0xf2, 0x37, 0x00, 0xb0, 0xff, 0x00, 0xad, 0xf1, 0xf2, 0x00, 0x17,
+ 0x04, 0xe0, 0xcd, 0x0f,
+ 0x50, 0x1f, 0xb9, 0xff, 0xf0, 0x10, 0x35, 0xdf, 0x9d, 0x00, 0x12, 0x25,
+ 0xf0, 0xaf, 0x00, 0x12,
+ 0x11, 0x02, 0x0f, 0xeb, 0x10, 0x43, 0x2d, 0x2e, 0x40, 0x42, 0x27, 0x40,
+ 0xfe, 0x1e, 0x64, 0x01,
+ 0x01, 0x02, 0xf0, 0xed, 0xdb, 0x00, 0x0f, 0xda, 0xe0, 0x01, 0x01, 0x10,
+ 0x0f, 0xff, 0xf0, 0xee,
+ 0x00, 0x77, 0x00, 0x00, 0x22, 0xdd, 0xdc, 0xf0, 0xef, 0xdf, 0x1f, 0x77,
+ 0x12, 0xfd, 0x00, 0x62,
+ 0x07, 0x00, 0x21, 0x21, 0x11, 0x0f, 0x30, 0x33, 0x25, 0xe0, 0xdd, 0xfd,
+ 0x01, 0x01, 0xdf, 0x47,
+ 0x23, 0xe0, 0xde, 0xbd, 0xd0, 0xc1, 0xf1, 0x00, 0x37, 0x07, 0x8f, 0xcb,
+ 0x10, 0x01, 0xf0, 0xee,
+ 0x00, 0xef, 0x00, 0x1f, 0xed, 0xf0, 0x00, 0x00, 0x60, 0x0e, 0xfa, 0xf0,
+ 0x51, 0x23, 0xed, 0xb9,
+ 0x00, 0x00, 0xf0, 0x9f, 0x00, 0x01, 0x02, 0x22, 0x00, 0xdf, 0x34, 0x55,
+ 0x12, 0x30, 0xfb, 0x02,
+ 0x00, 0x10, 0x21, 0x00, 0x02, 0xd3, 0xb0, 0xe1, 0x88, 0xec, 0x06, 0x10,
+ 0x0f, 0xe0, 0x22, 0x50,
+ 0xdd, 0x0f, 0x70, 0x00, 0xeb, 0x00, 0x1f, 0x30, 0x00, 0xd0, 0x01, 0x01,
+ 0x02, 0x04, 0x00, 0x3f,
+ 0x00, 0xc0, 0x14, 0x74, 0x00, 0x0d, 0x00, 0x46, 0x10, 0xfc, 0x02, 0x05,
+ 0x00, 0x00, 0x10, 0x20,
+ 0x11, 0xbf, 0xdf, 0xf1, 0x36, 0x31, 0xee, 0x9a, 0xf0, 0x00, 0xf0, 0x00,
+ 0x40, 0x22, 0xf0, 0xcc,
+ 0xec, 0x10, 0x4f, 0x20, 0x1e, 0x2d, 0x0d, 0x0c, 0x0d, 0x65, 0x34, 0xfb,
+ 0xcf, 0x00, 0x11, 0x57,
+ 0x02, 0xd0, 0x00, 0x00, 0x01, 0x00, 0xf0, 0xb0, 0xff, 0x10, 0x42, 0x00,
+ 0xa8, 0xfe, 0x00, 0x23,
+ 0x54, 0xf0, 0x00, 0x02, 0x03, 0xad, 0x25, 0xc8, 0x01, 0x77, 0xee, 0xfe,
+ 0x11, 0x11, 0x00, 0xef,
+ 0x30, 0x51, 0xf0, 0x00, 0xee, 0xed, 0x67, 0x22, 0xee, 0xef, 0x1f, 0x42,
+ 0x02, 0xfe, 0xef, 0x21,
+ 0x0f, 0xcb, 0x11, 0x0f, 0xae, 0x00, 0x35, 0xdd, 0xde, 0x01, 0x00, 0x14,
+ 0xf0, 0xb9, 0x23, 0x10,
+ 0xe0, 0xde, 0x00, 0x10, 0xbf, 0x0f, 0x00, 0xe0, 0x00, 0xfc, 0xde, 0x76,
+ 0x21, 0xce, 0x0e, 0x22,
+ 0x20, 0x00, 0x10, 0x23, 0x0f, 0x0c, 0xcf, 0x1f, 0x42, 0xd0, 0x9c, 0x05,
+ 0x20, 0xe0, 0x00, 0x45,
+ 0x0e, 0xfd, 0x15, 0x20, 0xec, 0xdf, 0x50, 0x75, 0x1f, 0xec, 0xf0, 0x13,
+ 0x11, 0x0f, 0x0d, 0xed,
+ 0x47, 0x12, 0xae, 0xff, 0x12, 0x02, 0x0d, 0x00, 0x13, 0xcf, 0xdd, 0x01,
+ 0x67, 0x32, 0xfb, 0xb0,
+ 0x00, 0x10, 0x03, 0xfe, 0x12, 0x13, 0xa8, 0x00, 0x21, 0xe0, 0x12, 0x0e,
+ 0x10, 0x46, 0xe0, 0xbd,
+ 0x01, 0x23, 0x31, 0xe0, 0x00, 0xe1, 0xcc, 0xf0, 0x00, 0x55, 0x0f, 0xd8,
+ 0x40, 0x22, 0xbf, 0xee,
+ 0x31, 0x42, 0x10, 0x21, 0x9e, 0x00, 0x04, 0x0e, 0x0e, 0x00, 0x44, 0xf0,
+ 0x88, 0x21, 0x33, 0xf0,
+ 0xed, 0x10, 0x10, 0x21, 0x00, 0xde, 0x00, 0x37, 0x20, 0xdf, 0xfd, 0x22,
+ 0x20, 0x0f, 0x0e, 0x20,
+ 0xde, 0xa8, 0xff, 0x51, 0x01, 0xcc, 0xde, 0x00, 0x12, 0x31, 0xce, 0xfe,
+ 0x03, 0x44, 0x45, 0x00,
+ 0x10, 0x10, 0x0f, 0x00, 0x03, 0x03, 0x9f, 0xc9, 0x00, 0x03, 0x23, 0xed,
+ 0xcd, 0x00, 0x26, 0x10,
+ 0x00, 0x20, 0x3f, 0x31, 0xf0, 0xab, 0x1e, 0x54, 0x02, 0xdc, 0xbf, 0x02,
+ 0xf1, 0xf0, 0xee, 0x03,
+ 0x14, 0xee, 0xce, 0x13, 0x41, 0xfa, 0x20, 0x70, 0x45, 0x0e, 0x10, 0x57,
+ 0x00, 0xfe, 0x12, 0x10,
+ 0x23, 0x14, 0xba, 0x01, 0x20, 0x02, 0x00, 0x67, 0x89, 0xde, 0x77, 0x10,
+ 0xcd, 0x21, 0x02, 0x10,
+ 0xee, 0x0f, 0x01, 0x23, 0xfe, 0xfe, 0x01, 0x21, 0x02, 0xec, 0xf0, 0x0f,
+ 0x11, 0x33, 0xdd, 0x00,
+ 0xf0, 0xf0, 0x44, 0x20, 0xef, 0xef, 0x00, 0x24, 0x30, 0xe0, 0x0f, 0x10,
+ 0x51, 0x41, 0xdb, 0xde,
+ 0x44, 0x11, 0x0e, 0x01, 0x11, 0xf2, 0xa1, 0xee, 0x0e, 0x67, 0x00, 0xc0,
+ 0xfd, 0xfe, 0x04, 0x20,
+ 0xfc, 0x00, 0xdb, 0x0f, 0x00, 0x23, 0x00, 0xdb, 0x9f, 0xff, 0x14, 0x62,
+ 0xef, 0xec, 0x14, 0x10,
+ 0xdd, 0xef, 0x20, 0x62, 0x01, 0xca, 0x0f, 0x0f, 0x21, 0x31, 0xee, 0xfe,
+ 0x77, 0x23, 0xed, 0x01,
+ 0x35, 0x0e, 0xe0, 0x21, 0xf0, 0xef, 0xcf, 0x00, 0x21, 0xd0, 0x9d, 0x01,
+ 0xe0, 0xdc, 0xcc, 0x02,
+ 0x77, 0xf0, 0xda, 0x11, 0x20, 0x00, 0xf0, 0xe0, 0x1e, 0x20, 0xf1, 0x01,
+ 0x00, 0xde, 0xc0, 0xcf,
+ 0x34, 0x77, 0xff, 0xe0, 0x21, 0x00, 0x20, 0x41, 0x20, 0x20, 0x0e, 0x0d,
+ 0x74, 0x32, 0xfd, 0x13,
+ 0x11, 0xfe, 0xcf, 0x05, 0x77, 0xc0, 0xfb, 0x01, 0xf0, 0x03, 0xdf, 0xd9,
+ 0xf0, 0x11, 0x70, 0xff,
+ 0xcd, 0x21, 0x01, 0xfc, 0x00, 0x40, 0x0f, 0x00, 0x23, 0xbc, 0x00, 0x44,
+ 0x0e, 0xf0, 0x00, 0x00,
+ 0xf2, 0x15, 0x53, 0x1e, 0xfd, 0xf0, 0x13, 0x64, 0xed, 0xef, 0x37, 0x01,
+ 0xdd, 0x00, 0xf1, 0xab,
+ 0xff, 0x04, 0x33, 0xde, 0xe0, 0x25, 0x34, 0x8f, 0xab, 0x00, 0x24, 0x10,
+ 0xff, 0x00, 0x0f, 0x00,
+ 0x01, 0x42, 0x10, 0x10, 0x32, 0x0f, 0xff, 0x37, 0x61, 0x0f, 0xed, 0xee,
+ 0x20, 0x64, 0x26, 0xf0,
+ 0xdb, 0x0f, 0x00, 0xee, 0x00, 0x52, 0x8b, 0xfd, 0x47, 0xd0, 0xcb, 0x43,
+ 0x00, 0xde, 0xe0, 0x10,
+ 0x43, 0xee, 0xf0, 0x02, 0xdb, 0x21, 0x32, 0xce, 0xde, 0x10, 0x41, 0x01,
+ 0xe0, 0xff, 0x0e, 0x01,
+ 0x13, 0xfc, 0x0f, 0x73, 0x20, 0xfe, 0xf0, 0xd8, 0x74, 0x0f, 0xd8, 0x63,
+ 0x00, 0xce, 0x10, 0x21,
+ 0x02, 0xff, 0xfd, 0x00, 0x25, 0x10, 0xde, 0xed, 0x52, 0x33, 0x00, 0xca,
+ 0x00, 0x01, 0x20, 0x32,
+ 0x00, 0xdf, 0xe0, 0xbf, 0xff, 0x47, 0x32, 0xad, 0x00, 0x01, 0xff, 0x45,
+ 0x00, 0xdc, 0x00, 0x30,
+ 0x31, 0x12, 0xef, 0xee, 0x20, 0x52, 0xde, 0xd0, 0x77, 0x12, 0xdd, 0xd0,
+ 0x10, 0x42, 0x03, 0xbf,
+ 0xfc, 0x00, 0xf2, 0x25, 0x0f, 0x00, 0x33, 0x88, 0x10, 0x32, 0xf0, 0x14,
+ 0xec, 0xdd, 0x55, 0x21,
+ 0x00, 0x9b, 0x00, 0x22, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0xff, 0x11,
+ 0x42, 0x0f, 0xfe, 0x01,
+ 0x46, 0x00, 0x10, 0xff, 0xff, 0x10, 0x10, 0x41, 0xf1, 0x8d, 0x0e, 0x01,
+ 0x05, 0x10, 0x1d, 0x02,
+ 0xf0, 0xec, 0x20, 0xac, 0xfd, 0x36, 0xed, 0xcc, 0x10, 0x21, 0x20, 0xef,
+ 0xfe, 0x33, 0x23, 0x40,
+ 0x00, 0xd9, 0x53, 0x57, 0x00, 0xff, 0x10, 0xd0, 0x9e, 0x00, 0xef, 0xfd,
+ 0x03, 0x33, 0xdc, 0xce,
+ 0x0f, 0x01, 0x12, 0x21, 0x22, 0xe0, 0x10, 0xbc, 0x00, 0x07, 0x9e, 0x01,
+ 0xf4, 0x9b, 0xfe, 0xf0,
+ 0x16, 0xee, 0xba, 0x77, 0x00, 0xcc, 0x21, 0x22, 0x10, 0xf0, 0x0e, 0x42,
+ 0x00, 0xf0, 0x0f, 0xff,
+ 0x10, 0x21, 0x01, 0xe0, 0xfe, 0x00, 0x34, 0x00, 0xcc, 0xe0, 0x21, 0x45,
+ 0x10, 0x0d, 0xe0, 0x10,
+ 0x61, 0xf1, 0xdd, 0xfe, 0x00, 0x20, 0x01, 0x12, 0x20, 0xfd, 0x00, 0x13,
+ 0xc8, 0x20, 0x32, 0xc0,
+ 0xae, 0x01, 0x27, 0x20, 0x20, 0x10, 0xe0, 0x02, 0x62, 0x21, 0x42, 0x1f,
+ 0xf8, 0xdf, 0x20, 0x75,
+ 0x21, 0xf0, 0xbc, 0x01, 0x12, 0x0f, 0xcf, 0x02, 0x07, 0x00, 0xee, 0x00,
+ 0xf0, 0x8e, 0x00, 0x01,
+ 0x34, 0x0e, 0xca, 0x00, 0x11, 0x32, 0xf0, 0xdd, 0xff, 0xdd, 0x03, 0x01,
+ 0x89, 0xbf, 0x21, 0x34,
+ 0xff, 0xcd, 0x0d, 0x00, 0x33, 0x02, 0x0e, 0xd9, 0x11, 0x50, 0x00, 0xcf,
+ 0x0e, 0x53, 0x13, 0x00,
+ 0xff, 0x13, 0x10, 0x0d, 0x17, 0x47, 0xae, 0x0f, 0x02, 0xf0, 0xff, 0x01,
+ 0xef, 0xde, 0xf0, 0xf4,
+ 0x0e, 0x0a, 0x41, 0x43, 0x30, 0x0e, 0xfe, 0xd0, 0x30, 0x6f, 0x10, 0xe2,
+ 0xc0, 0x02, 0xe0, 0xcd,
+ 0xdc, 0xe0, 0x04, 0x02, 0xcd, 0x16, 0x73, 0x2e, 0x1f, 0x30, 0x1f, 0x65,
+ 0x21, 0x0b, 0x20, 0x22,
+ 0xff, 0xf1, 0x03, 0x03, 0xe1, 0xaf, 0xf2, 0x07, 0xf2, 0x8b, 0x00, 0xf2,
+ 0x00, 0x0e, 0x00, 0x22,
+ 0x3d, 0xe8, 0x00, 0x42, 0x20, 0xfa, 0xef, 0x30, 0x71, 0x10, 0x01, 0x32,
+ 0xef, 0xbc, 0x00, 0x0f,
+ 0x21, 0x16, 0xee, 0x8d, 0x24, 0x33, 0x0e, 0xeb, 0x00, 0x34, 0x0f, 0xee,
+ 0x22, 0x72, 0x02, 0xbe,
+ 0xb8, 0x32, 0x67, 0xde, 0xdd, 0x34, 0x00, 0xff, 0xff, 0xf0, 0x23, 0x10,
+ 0x0e, 0xe0, 0xef, 0x42,
+ 0x56, 0xff, 0xee, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x42, 0xee, 0xaa,
+ 0x54, 0x0f, 0xbb, 0x22,
+ 0x32, 0xf0, 0xf0, 0x0e, 0x01, 0xf0, 0xff, 0x20, 0xf0, 0xcd, 0x00, 0xdc,
+ 0x01, 0x21, 0x0f, 0x00,
+ 0xde, 0xde, 0x21, 0x67, 0x04, 0x0d, 0x01, 0xd0, 0x9e, 0x11, 0x0f, 0xfc,
+ 0xe0, 0xee, 0xcf, 0xe9,
+ 0x00, 0x22, 0xdd, 0x31, 0x72, 0x0d, 0x35, 0x00, 0x00, 0x52, 0xfe, 0xff,
+ 0x21, 0x03, 0xf0, 0xbb,
+ 0x01, 0x45, 0x98, 0xf0, 0x43, 0xef, 0xeb, 0x21, 0x11, 0x32, 0x00, 0xef,
+ 0x10, 0x1f, 0x31, 0x00,
+ 0xc0, 0x0e, 0x20, 0x02, 0x04, 0xe0, 0x8c, 0xee, 0xff, 0x03, 0x27, 0xdd,
+ 0x40, 0x62, 0xef, 0xff,
+ 0x34, 0xfd, 0xdc, 0x02, 0x77, 0x00, 0xfd, 0xdf, 0xf0, 0x10, 0x24, 0x12,
+ 0x00, 0xcb, 0x00, 0x44,
+ 0xef, 0xff, 0xf0, 0x00, 0x43, 0xde, 0xe0, 0x01, 0x53, 0x22, 0xfd, 0xde,
+ 0x00, 0x50, 0x22, 0xe0,
+ 0xcb, 0x0f, 0x75, 0xfd, 0xd9, 0x01, 0x10, 0xfe, 0xd0, 0x0f, 0xe0, 0x00,
+ 0x31, 0x14, 0x00, 0x0d,
+ 0x34, 0x76, 0x10, 0x11, 0x10, 0x0f, 0x0e, 0x20, 0x77, 0x52, 0xda, 0xf0,
+ 0x01, 0x10, 0xf0, 0xcf,
+ 0xee, 0x32, 0xef, 0x0e, 0x77, 0xde, 0xab, 0x11, 0x33, 0x0f, 0xcb, 0x00,
+ 0x11, 0x32, 0x00, 0xfd,
+ 0x00, 0x23, 0x00, 0xbe, 0x10, 0x14, 0x21, 0x00, 0x01, 0xff, 0xbd, 0x0f,
+ 0x20, 0x06, 0xcd, 0x00,
+ 0x44, 0xdc, 0xf0, 0x54, 0xdf, 0x0e, 0x00, 0x00, 0x04, 0x63, 0xfe, 0x98,
+ 0x00, 0x01, 0x01, 0x00,
+ 0xdc, 0xf0, 0x03, 0x52, 0x00, 0xbc, 0x02, 0x32, 0x00, 0x0e, 0x22, 0x01,
+ 0x0f, 0x40, 0x47, 0x00,
+ 0xfd, 0x10, 0x2f, 0x00, 0x13, 0x23, 0x00, 0x01, 0xf4, 0x25, 0xf0, 0x8e,
+ 0xff, 0x22, 0x57, 0x03,
+ 0xe9, 0xe0, 0x1f, 0x10, 0x51, 0x00, 0x20, 0xfe, 0xee, 0x00, 0x34, 0x01,
+ 0x9e, 0xfd, 0x24, 0x13,
+ 0xac, 0xff, 0x03, 0x11, 0xfe, 0x0c, 0xfe, 0x0e, 0x67, 0x11, 0x10, 0x10,
+ 0x41, 0xde, 0xcb, 0x10,
+ 0x35, 0x01, 0xd0, 0x0f, 0x01, 0x33, 0xee, 0xdd, 0xcf, 0x23, 0x00, 0x77,
+ 0x40, 0xaa, 0x01, 0x32,
+ 0xf0, 0xfd, 0xe0, 0x13, 0x00, 0xfe, 0x00, 0x22, 0xee, 0xed, 0x20, 0x1f,
+ 0x31, 0x8f, 0xe8, 0x0f,
+ 0x00, 0x34, 0xf0, 0xbb, 0x00, 0x00, 0x11, 0xf0, 0xdf, 0x2f, 0x3e, 0xdf,
+ 0x10, 0x70, 0x10, 0x0e,
+ 0x00, 0x34, 0x77, 0x03, 0xfc, 0xe0, 0x07, 0x10, 0x00, 0x00, 0xd0, 0xcf,
+ 0xf0, 0xcd, 0x01, 0x01,
+ 0xae, 0xf9, 0xfe, 0x22, 0x52, 0x00, 0xef, 0x0f, 0x00, 0x67, 0x02, 0xcd,
+ 0x00, 0x00, 0x02, 0xef,
+ 0xa9, 0x00, 0x00, 0x02, 0xff, 0x10, 0x0f, 0xf0, 0x13, 0x77, 0xd9, 0x10,
+ 0x77, 0x1e, 0xcf, 0x53,
+ 0x0f, 0xff, 0x00, 0xef, 0x11, 0x22, 0x0f, 0xde, 0x00, 0x00, 0x01, 0x01,
+ 0x17, 0x00, 0x31, 0x00,
+ 0x1e, 0x21, 0x79, 0x24, 0x9a, 0x21, 0x8d, 0x24, 0x00, 0x67, 0xef, 0xf0,
+ 0x00, 0xad, 0x33, 0xfe,
+ 0x0d, 0x67, 0xee, 0xfc, 0x42, 0x01, 0xde, 0x31, 0x0f, 0xeb, 0x75, 0x00,
+ 0xee, 0x0f, 0x13, 0x01,
+ 0x1f, 0x0d, 0xf0, 0x34, 0x00, 0xdd, 0xdf, 0x32, 0x77, 0x0f, 0xbd, 0x02,
+ 0x01, 0xf0, 0x0f, 0x00,
+ 0x23, 0xe0, 0xca, 0x02, 0x42, 0xd0, 0xfd, 0xe0, 0xef, 0x77, 0x01, 0xbd,
+ 0x01, 0x35, 0x00, 0xef,
+ 0x01, 0x10, 0x10, 0x00, 0x30, 0x24, 0x40, 0x6f, 0xfd, 0xd0, 0x13, 0x73,
+ 0x0b, 0xe0, 0x11, 0x11,
+ 0xfe, 0xdb, 0xf1, 0x00, 0xff, 0xeb, 0xde, 0xfe, 0x13, 0x32, 0x88, 0xff,
+ 0x00, 0x00, 0x76, 0xfe,
+ 0xcd, 0x35, 0xff, 0x00, 0x01, 0xde, 0x11, 0x0f, 0xce, 0x13, 0x0e, 0xee,
+ 0x01, 0x8b, 0x00, 0x43,
+ 0x00, 0xc9, 0x00, 0x43, 0x13, 0x0d, 0xdd, 0x44, 0x13, 0xdd, 0xec, 0x21,
+ 0x10, 0x11, 0x00, 0x0e,
+ 0xee, 0xe0, 0x00, 0x20, 0xd9, 0x21, 0x76, 0x1f, 0xce, 0x01, 0x42, 0x00,
+ 0x1f, 0x0f, 0xf0, 0x21,
+ 0x64, 0xed, 0xdc, 0x33, 0x32, 0xbe, 0xcd, 0x02, 0x26, 0xf0, 0xce, 0x32,
+ 0x57, 0xce, 0xfe, 0x10,
+ 0x24, 0x41, 0xdd, 0xfd, 0x53, 0x04, 0xb8, 0x00, 0x75, 0xee, 0xff, 0x11,
+ 0x11, 0x01, 0xde, 0x00,
+ 0x42, 0xf0, 0xef, 0x0f, 0x00, 0x10, 0x24, 0x11, 0xff, 0xcd, 0x11, 0x24,
+ 0x00, 0xdf, 0xcc, 0x11,
+ 0x11, 0x62, 0x02, 0xea, 0xf0, 0x1f, 0x31, 0x21, 0x00, 0x0d, 0x73, 0x24,
+ 0xfd, 0xff, 0x36, 0x43,
+ 0x00, 0xce, 0x22, 0x26, 0x0f, 0xbe, 0x00, 0x44, 0x00, 0xdb, 0xf0, 0x00,
+ 0x00, 0x52, 0x0e, 0xcb,
+ 0x01, 0x31, 0x00, 0xf0, 0x00, 0xbe, 0xfd, 0x00, 0x07, 0xf0, 0x9a, 0x42,
+ 0x01, 0xde, 0x0e, 0x42,
+ 0x02, 0x00, 0x0c, 0xd0, 0x21, 0x43, 0x10, 0x34, 0x00, 0xb9, 0x11, 0xe0,
+ 0xcd, 0x33, 0x10, 0x00,
+ 0x8c, 0xde, 0x33, 0x00, 0xff, 0x01, 0x98, 0x11, 0x23, 0xf0, 0xf0, 0xdc,
+ 0xf1, 0x12, 0x20, 0x00,
+ 0xaf, 0x0f, 0xef, 0x10, 0x02, 0x00, 0x0e, 0x40, 0x17, 0x01, 0x00, 0x60,
+ 0x00, 0xfb, 0x11, 0x65,
+ 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf0, 0xed, 0x23, 0x00, 0x0e, 0x37, 0x10,
+ 0xbc, 0x32, 0x73, 0x0f,
+ 0x0c, 0xef, 0xfd, 0x12, 0x57, 0x00, 0xce, 0x00, 0xf0, 0x00, 0x0f, 0xed,
+ 0x25, 0x33, 0xff, 0xcb,
+ 0x52, 0x00, 0x00, 0x30, 0x0e, 0xee, 0x00, 0x43, 0x44, 0xf0, 0xee, 0x73,
+ 0x07, 0x88, 0xff, 0x67,
+ 0x00, 0xac, 0x22, 0x01, 0x0f, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x0f,
+ 0x00, 0xf3, 0x00, 0x00, 0x10, 0xee, 0xf2, 0x02, 0x42, 0xc8, 0x88, 0x33,
+ 0x12, 0xcb, 0x00, 0x21,
+ 0xf0, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x20, 0x00, 0xdf, 0x0f, 0x20, 0x22,
+ 0xdf, 0x20, 0x10, 0xe0,
+ 0x64, 0x00, 0xbc, 0x00, 0x27, 0x00, 0x8b, 0x22, 0x24, 0x0e, 0xde, 0xf0,
+ 0x31, 0x22, 0xad, 0x10,
+ 0x13, 0x0f, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0x03, 0x34, 0xbd, 0xff, 0x01,
+ 0x14, 0xea, 0xcf, 0x20,
+ 0x32, 0xbe, 0xd8, 0x31, 0x32, 0x10, 0x40, 0xcf, 0x0f, 0x73, 0x00, 0xe0,
+ 0x11, 0x56, 0x00, 0xfe,
+ 0xef, 0x10, 0x34, 0x00, 0xbb, 0x01, 0x12, 0xf0, 0xee, 0x02, 0x23, 0xeb,
+ 0xe0, 0x22, 0x40, 0x01,
+ 0x01, 0x53, 0x0a, 0xaa, 0x31, 0x23, 0xdc, 0x00, 0x42, 0xef, 0xdc, 0x42,
+ 0x21, 0xf0, 0x00, 0x4f,
+ 0xef, 0x10, 0x32, 0x42, 0xed, 0xac, 0x24, 0x53, 0x0f, 0xdb, 0xf0, 0x10,
+ 0xef, 0xd0, 0x37, 0x00,
+ 0x9c, 0x00, 0x15, 0x0f, 0xf0, 0x00, 0x00, 0xe0, 0xef, 0x20, 0x00, 0xc0,
+ 0x75, 0xf0, 0xff, 0xff,
+ 0xed, 0x46, 0x10, 0x42, 0x01, 0xcc, 0x22, 0x11, 0x40, 0x45, 0xee, 0x88,
+ 0x22, 0x42, 0xde, 0x0f,
+ 0x00, 0x00, 0x34, 0xac, 0x00, 0x21, 0x00, 0xf0, 0x00, 0xee, 0x00, 0x35,
+ 0x0f, 0xce, 0x0f, 0x01,
+ 0x11, 0x00, 0xfe, 0x01, 0x13, 0xbb, 0xef, 0x00, 0x54, 0x01, 0xed, 0xdd,
+ 0x21, 0x66, 0xfd, 0xcd,
+ 0x10, 0x13, 0x23, 0x00, 0xca, 0x00, 0x31, 0x00, 0xf0, 0x02, 0x00, 0xed,
+ 0x12, 0x10, 0xcb, 0x44,
+ 0x00, 0xde, 0xed, 0xe0, 0x74, 0x00, 0xcb, 0x11, 0x13, 0x00, 0xfc, 0xf0,
+ 0x04, 0x20, 0x2f, 0x50,
+ 0xe1, 0xab, 0x32, 0x23, 0xdc, 0x0f, 0x23, 0xff, 0x9a, 0x12, 0x11, 0x01,
+ 0x01, 0xec, 0xce, 0x77,
+ 0x00, 0x0f, 0x10, 0xdf, 0x10, 0x30, 0xf0, 0xe1, 0xee, 0xf0, 0x11, 0xfd,
+ 0x01, 0x04, 0xf0, 0x34,
+ 0xdf, 0xdf, 0x2f, 0x1d, 0x54, 0x36, 0x20, 0xef, 0x01, 0x11, 0xfe, 0xbe,
+ 0xdf, 0xe1, 0xf1, 0xf0,
+ 0x11, 0xdd, 0x88, 0x0e, 0x10, 0x54, 0xf0, 0xf9, 0x10, 0x00, 0x1f, 0x31,
+ 0x11, 0x31, 0x03, 0x01,
+ 0x31, 0x00, 0x05, 0x23, 0x11, 0xcf, 0xfd, 0x00, 0x00, 0x03, 0x0e, 0x2b,
+ 0x41, 0x22, 0xfe, 0xc9,
+ 0x10, 0x64, 0x00, 0xce, 0x10, 0x12, 0xf0, 0xba, 0x00, 0x01, 0xec, 0xef,
+ 0x10, 0x10, 0x20, 0xef,
+ 0xed, 0x75, 0x11, 0xdd, 0x32, 0x45, 0xce, 0xf0, 0x34, 0xfe, 0xf0, 0x43,
+ 0x0e, 0x0c, 0xf0, 0x30,
+ 0x3f, 0xa9, 0x00, 0xe2, 0xf0, 0x0d, 0x34, 0xf2, 0x8f, 0xec, 0xe0, 0x27,
+ 0x01, 0x8e, 0x00, 0x02,
+ 0x0d, 0x00, 0x04, 0x0e, 0x1d, 0x0f, 0xed, 0x00, 0x22, 0x55, 0x12, 0x00,
+ 0x32, 0x55, 0x13, 0x0f,
+ 0xfe, 0x00, 0x63, 0x13, 0x04, 0xf0, 0x0c, 0x32, 0x04, 0x0e, 0x0e, 0x12,
+ 0x56, 0xfe, 0xe0, 0x35,
+ 0x53, 0x10, 0x0e, 0x00, 0xe0, 0xfd, 0x0e, 0xdc, 0x54, 0x33, 0xb9, 0xff,
+ 0xfe, 0x10, 0x21, 0xf0,
+ 0x02, 0x23, 0x50, 0xc8, 0xfb, 0x22, 0x62, 0x00, 0xcc, 0x00, 0x45, 0x00,
+ 0xbd, 0x00, 0x12, 0xf1,
+ 0xde, 0x11, 0x02, 0xee, 0x02, 0x25, 0x0f, 0x61, 0x12, 0xee, 0xf9, 0x10,
+ 0x51, 0x23, 0x32, 0xee,
+ 0xcb, 0x32, 0x24, 0x10, 0xd0, 0xdf, 0xe0, 0x20, 0xff, 0x8d, 0xf0, 0x47,
+ 0x00, 0xba, 0x00, 0x30,
+ 0x11, 0xce, 0x0e, 0xf0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xf0, 0xef, 0x0f,
+ 0xfe, 0x43, 0x57, 0xfe,
+ 0x9c, 0x13, 0x35, 0x0f, 0xdd, 0xef, 0x00, 0x02, 0x20, 0x44, 0x03, 0xdc,
+ 0x0d, 0x54, 0x25, 0xfe,
+ 0x0f, 0x41, 0x02, 0xce, 0xcc, 0x10, 0x02, 0xe0, 0x03, 0x9d, 0xc8, 0x0f,
+ 0x14, 0x02, 0xde, 0xff,
+ 0x0e, 0x9c, 0x00, 0x13, 0x34, 0x1e, 0xec, 0xd0, 0x32, 0x00, 0x00, 0x74,
+ 0x12, 0xfd, 0x03, 0x35,
+ 0x20, 0x0d, 0x22, 0x12, 0xcb, 0x0f, 0x0e, 0x03, 0xf2, 0xbd, 0x10, 0x47,
+ 0xef, 0xe0, 0xd0, 0xce,
+ 0x02, 0x77, 0xfe, 0xcb, 0x42, 0x11, 0xde, 0x2f, 0x50, 0x11, 0xfd, 0xe0,
+ 0x10, 0x0f, 0xee, 0x01,
+ 0x22, 0x54, 0x11, 0xee, 0xd8, 0x00, 0x71, 0x11, 0x0e, 0x0d, 0x22, 0x77,
+ 0xf1, 0xec, 0x01, 0x00,
+ 0x01, 0xee, 0xde, 0x01, 0xf2, 0x02, 0x04, 0xb0, 0xda, 0x01, 0x43, 0xae,
+ 0xdb, 0xf0, 0x14, 0x52,
+ 0x00, 0x0f, 0xdf, 0x02, 0x55, 0x11, 0x13, 0x0f, 0x0c, 0xe0, 0x34, 0x74,
+ 0x0f, 0xdc, 0x00, 0x10,
+ 0x20, 0x01, 0x10, 0xcd, 0xf0, 0x26, 0x0e, 0xce, 0x01, 0x43, 0x00, 0xb9,
+ 0xe0, 0x20, 0x40, 0x00,
+ 0xae, 0xfc, 0x00, 0x55, 0x00, 0xef, 0xec, 0x00, 0x02, 0xf0, 0xfd, 0xf0,
+ 0xe0, 0xfe, 0x31, 0x76,
+ 0xcd, 0xff, 0x02, 0x1e, 0xe8, 0x00, 0x43, 0x10, 0xff, 0xe0, 0xff, 0x0f,
+ 0xfe, 0xf0, 0x57, 0x21,
+ 0xbc, 0x00, 0x11, 0xff, 0x30, 0x32, 0xcc, 0xf0, 0x62, 0xf0, 0xdb, 0x63,
+ 0x12, 0x0d, 0xe0, 0xf1,
+ 0x00, 0x00, 0x12, 0x54, 0x01, 0xcb, 0xfe, 0x12, 0x23, 0xe0, 0xbf, 0x00,
+ 0x12, 0x21, 0x00, 0xe0,
+ 0xff, 0x00, 0x10, 0x30, 0x27, 0x00, 0xfe, 0xff, 0x0d, 0x0f, 0x74, 0x0f,
+ 0xea, 0xff, 0xff, 0x34,
+ 0x74, 0x00, 0xde, 0x32, 0x14, 0xbf, 0xf0, 0x27, 0x73, 0xf0, 0xdd, 0x10,
+ 0x02, 0x00, 0xde, 0xfd,
+ 0x0f, 0x0e, 0x0d, 0x00, 0x12, 0x10, 0x0c, 0x1d, 0x77, 0x53, 0xff, 0x14,
+ 0x00, 0xfe, 0xed, 0x24,
+ 0x77, 0x00, 0xdd, 0x11, 0x11, 0x23, 0x12, 0x0d, 0x45, 0x10, 0xed, 0xe1,
+ 0x65, 0x33, 0xec, 0xcd,
+ 0x11, 0x32, 0x01, 0xf0, 0xee, 0xed, 0xdc, 0xce, 0xbb, 0x13, 0x33, 0xda,
+ 0x8e, 0x00, 0x37, 0x10,
+ 0xce, 0x0f, 0x22, 0x00, 0x00, 0x02, 0x61, 0xff, 0xfd, 0x0e, 0x0c, 0x11,
+ 0x00, 0x0c, 0x53, 0xfe,
+ 0xfd, 0x37, 0x11, 0xde, 0xcf, 0xff, 0xff, 0xae, 0x05, 0x02, 0x0d, 0xcf,
+ 0x0d, 0xcf, 0x02, 0x57,
+ 0xe2, 0xc9, 0xff, 0x02, 0x42, 0x0e, 0xcd, 0xf0, 0xf3, 0xe0, 0x0e, 0x11,
+ 0xfe, 0xf0, 0x57, 0x10,
+ 0x01, 0xfe, 0x50, 0x52, 0x12, 0x12, 0x11, 0x0d, 0x00, 0x2f, 0x12, 0x23,
+ 0xdb, 0xf2, 0x37, 0x01,
+ 0xf0, 0x02, 0xfd, 0xfd, 0x76, 0x00, 0xf0, 0x10, 0x53, 0xfe, 0xdd, 0x11,
+ 0x54, 0x0c, 0xde, 0x00,
+ 0x1f, 0x0d, 0x00, 0x57, 0x01, 0xca, 0xef, 0x31, 0x65, 0x00, 0xfd, 0xf0,
+ 0x44, 0x01, 0xde, 0xde,
+ 0x21, 0x01, 0xe0, 0xbe, 0x00, 0x22, 0xf0, 0x0c, 0x60, 0x27, 0x0f, 0xed,
+ 0x22, 0x77, 0x00, 0xcc,
+ 0x01, 0x23, 0xf0, 0xbd, 0x03, 0x22, 0xd0, 0xfd, 0x23, 0x03, 0xea, 0xce,
+ 0x00, 0x33, 0x20, 0xcb,
+ 0x1f, 0x71, 0x01, 0xfe, 0xed, 0x0e, 0x0e, 0xfd, 0xe0, 0x11, 0x57, 0x04,
+ 0xee, 0x9a, 0xf0, 0x10,
+ 0x20, 0x11, 0xf0, 0xce, 0x2f, 0x30, 0xf1, 0xf0, 0xef, 0x0b, 0x13, 0x36,
+ 0x00, 0x00, 0x30, 0x11,
+ 0xd0, 0xf2, 0x42, 0xff, 0xce, 0x02, 0xfd, 0xde, 0xe2, 0xee, 0xfc, 0xf0,
+ 0xcd, 0x00, 0xf1, 0xed,
+ 0x15, 0x37, 0xbe, 0xbc, 0x00, 0x20, 0x22, 0xe0, 0x00, 0x0e, 0xfc, 0x21,
+ 0x55, 0x0f, 0x0c, 0x01,
+ 0x24, 0x1f, 0x30, 0x41, 0x12, 0x10, 0x01, 0x44, 0xe1, 0xf0, 0x11, 0xee,
+ 0xaa, 0x00, 0x03, 0x00,
+ 0xff, 0xe3, 0x0f, 0x0b, 0x10, 0x64, 0x00, 0x10, 0x3e, 0x23, 0x11, 0x0b,
+ 0x3d, 0x2f, 0x65, 0x00,
+ 0xd9, 0x0f, 0x0e, 0x2e, 0x63, 0x01, 0x0e, 0x1e, 0x52, 0x10, 0xf0, 0x06,
+ 0x33, 0xeb, 0xd0, 0xf1,
+ 0xe1, 0xe1, 0x8b, 0xf0, 0xff, 0xf0, 0x01, 0xcd, 0x01, 0x24, 0xff, 0x0f,
+ 0x27, 0x67, 0xdf, 0xef,
+ 0xef, 0x00, 0x03, 0x1f, 0xff, 0xf0, 0x14, 0x0e, 0x2f, 0x75, 0x42, 0xed,
+ 0xf0, 0x33, 0x21, 0x0f,
+ 0x1d, 0x21, 0x01, 0x22, 0x66, 0xf0, 0xbd, 0x0d, 0x01, 0xf0, 0xec, 0x02,
+ 0x24, 0xef, 0xc0, 0x0d,
+ 0xfd, 0x36, 0x01, 0x00, 0x0c, 0x0c, 0x11, 0x42, 0x00, 0xdc, 0xde, 0x00,
+ 0xf3, 0x0f, 0x5f, 0xfd,
+ 0xcd, 0x11, 0xfe, 0xdc, 0x35, 0x1f, 0xeb, 0xd0, 0x02, 0xe0, 0x10, 0x00,
+ 0xfa, 0xde, 0xff, 0xf0,
+ 0x23, 0x00, 0xfc, 0x23, 0x00, 0x01, 0x02, 0x0f, 0xf0, 0x0e, 0xf0, 0xf1,
+ 0xce, 0xed, 0xf4, 0xff,
+ 0xc8, 0x0f, 0x53, 0x01, 0x1e, 0x53, 0x17, 0x00, 0xed, 0x00, 0x75, 0x00,
+ 0xde, 0x0f, 0xf0, 0x12,
+ 0x00, 0xbe, 0xfe, 0xed, 0x13, 0x12, 0xfc, 0xde, 0x43, 0x43, 0x0a, 0x0d,
+ 0xfc, 0xf0, 0x34, 0x77,
+ 0xef, 0xdd, 0x21, 0x02, 0xdf, 0x01, 0x44, 0x00, 0x11, 0x22, 0xee, 0xef,
+ 0x23, 0x43, 0xeb, 0xcc,
+ 0xff, 0x10, 0x01, 0xcb, 0xfe, 0x10, 0x00, 0xcf, 0xdb, 0x0f, 0x71, 0x14,
+ 0x00, 0xff, 0xfd, 0x10,
+ 0x35, 0xf0, 0xb0, 0x46, 0x31, 0xcd, 0xe0, 0x12, 0x23, 0x00, 0x66, 0x34,
+ 0xdf, 0xcb, 0x31, 0x73,
+ 0x10, 0x00, 0x0f, 0xed, 0x0f, 0x00, 0x22, 0x23, 0x00, 0x88, 0xee, 0x00,
+ 0x03, 0x03, 0xef, 0xca,
+ 0x10, 0x24, 0x21, 0x00, 0xfb, 0xd0, 0x50, 0x30, 0x21, 0x1f, 0x20, 0x00,
+ 0xde, 0x0f, 0xfe, 0x0f,
+ 0x31, 0x04, 0x8e, 0x0e, 0x01, 0xf0, 0x06, 0x2f, 0xed, 0xe2, 0xe0, 0xde,
+ 0x20, 0x51, 0xef, 0xca,
+ 0xde, 0x00, 0x57, 0x03, 0xe0, 0xec, 0x00, 0x01, 0x33, 0xdd, 0xdd, 0x41,
+ 0x13, 0xed, 0xf0, 0x32,
+ 0x0e, 0xfe, 0x37, 0x67, 0xee, 0x00, 0x73, 0x33, 0xff, 0xfe, 0x23, 0x11,
+ 0xfd, 0x00, 0x33, 0xfd,
+ 0xde, 0x23, 0x57, 0x03, 0xae, 0x0f, 0x12, 0x27, 0x01, 0xf0, 0x0e, 0x52,
+ 0x00, 0xc8, 0x20, 0x50,
+ 0x00, 0x00, 0x00, 0x0d, 0x30, 0xed, 0xf0, 0x14, 0x00, 0xf0, 0xc0, 0x01,
+ 0x02, 0x21, 0xd5, 0xb0,
+ 0xdc, 0xdd, 0xed, 0xee, 0xee, 0x0f, 0x67, 0x01, 0xfc, 0x10, 0x61, 0x00,
+ 0x12, 0x47, 0x12, 0x04,
+ 0x10, 0xdc, 0x01, 0x24, 0xe0, 0xf0, 0xde, 0xcf, 0x10, 0x63, 0x0f, 0xed,
+ 0x12, 0x2f, 0xe8, 0x10,
+ 0x71, 0x01, 0xed, 0x2f, 0x74, 0xed, 0xdb, 0x22, 0x02, 0x0f, 0xca, 0xe0,
+ 0x00, 0xdf, 0x00, 0x21,
+ 0xdf, 0xcc, 0x00, 0x33, 0x21, 0xdc, 0x0e, 0x74, 0x21, 0xcc, 0x11, 0x55,
+ 0x00, 0xff, 0xf0, 0x02,
+ 0x22, 0x11, 0x0f, 0xeb, 0xe0, 0x25, 0x73, 0xed, 0xec, 0x02, 0x01, 0xcf,
+ 0xee, 0x24, 0x00, 0x89,
+ 0xff, 0x01, 0xd0, 0x10, 0x32, 0x00, 0xbd, 0x00, 0x01, 0x10, 0x11, 0x10,
+ 0x1d, 0x0c, 0xcc, 0x12,
+ 0x22, 0x00, 0x04, 0x00, 0xe1, 0x0e, 0x10, 0x37, 0x01, 0xf2, 0x33, 0x01,
+ 0x0d, 0x9a, 0x00, 0x01,
+ 0x1d, 0x0d, 0x02, 0xd4, 0x10, 0x20, 0xd0, 0xf0, 0x47, 0x00, 0xee, 0x26,
+ 0xe0, 0x9a, 0x00, 0x50,
+ 0x12, 0x0f, 0x1f, 0x20, 0x0e, 0x1f, 0x30, 0x0e, 0x20, 0x63, 0x23, 0x11,
+ 0xed, 0x0e, 0x27, 0x13,
+ 0x10, 0x0f, 0xca, 0xbf, 0xf0, 0x0e, 0xe0, 0xf0, 0xcf, 0x02, 0xdf, 0xf0,
+ 0xf6, 0xbf, 0xf0, 0x14,
+ 0x12, 0xff, 0xae, 0xf0, 0xf7, 0x01, 0x01, 0xf1, 0xbd, 0xfa, 0x20, 0x76,
+ 0x21, 0x02, 0xfe, 0xff,
+ 0x10, 0x12, 0x43, 0x32, 0xed, 0x00, 0x65, 0x0e, 0xff, 0x00, 0x12, 0xef,
+ 0x0f, 0x20, 0xdb, 0xde,
+ 0x12, 0x02, 0x0e, 0xff, 0xbc, 0xed, 0x00, 0x3f, 0xfb, 0xc0, 0x00, 0x4d,
+ 0x0b, 0xcc, 0xcd, 0x00,
+ 0x12, 0x00, 0x0e, 0xed, 0xba, 0xfe, 0x00, 0xe0, 0x01, 0x27, 0xff, 0x9b,
+ 0x00, 0x20, 0x32, 0x00,
+ 0xea, 0xb0, 0x00, 0x10, 0x72, 0x04, 0x0e, 0xcd, 0x01, 0x23, 0x00, 0x0f,
+ 0x0e, 0xfe, 0x00, 0x0e,
+ 0xcb, 0x0f, 0x22, 0x55, 0x0f, 0xff, 0x02, 0x12, 0x02, 0x17, 0x01, 0xef,
+ 0xff, 0x26, 0x00, 0x9f,
+ 0xfc, 0x00, 0xe0, 0x00, 0x50, 0xec, 0xcc, 0x22, 0x67, 0x00, 0x0e, 0xdf,
+ 0x20, 0x44, 0x00, 0xee,
+ 0xff, 0x45, 0x10, 0xee, 0xf0, 0xf1, 0x00, 0x41, 0xff, 0xef, 0x46, 0x21,
+ 0xe0, 0xfe, 0x54, 0x14,
+ 0xef, 0xcc, 0x01, 0x12, 0xae, 0xff, 0x0f, 0x1e, 0xed, 0xf0, 0x00, 0x1f,
+ 0x72, 0x26, 0xff, 0x01,
+ 0x37, 0x40, 0xf1, 0xe0, 0xf1, 0x00, 0x66, 0x11, 0xfe, 0xee, 0x40, 0x10,
+ 0x53, 0x25, 0x0f, 0x5f,
+ 0x11, 0x12, 0xfd, 0xe0, 0x24, 0x12, 0xeb, 0xce, 0xdf, 0x00, 0x16, 0xd0,
+ 0xb0, 0xcd, 0xee, 0x12,
+ 0x02, 0xed, 0x00, 0x13, 0x30, 0x1f, 0x2d, 0x0d, 0x41, 0x25, 0x21, 0xed,
+ 0xdb, 0x20, 0x52, 0xec,
+ 0xb9, 0x11, 0x43, 0xfe, 0xdc, 0x01, 0x10, 0xff, 0xde, 0x32, 0x77, 0x1f,
+ 0xcd, 0x01, 0x02, 0xfe,
+ 0xf0, 0xe0, 0xaa, 0xed, 0x00, 0x15, 0x10, 0xd0, 0xe1, 0xcd, 0xee, 0x11,
+ 0x45, 0x00, 0xcd, 0xf0,
+ 0xb0, 0xf0, 0x0e, 0x20, 0x0f, 0xff, 0x45, 0x54, 0x10, 0x10, 0x44, 0x12,
+ 0x10, 0x01, 0x02, 0x0e,
+ 0x36, 0x32, 0xce, 0x10, 0x31, 0x00, 0xd2, 0xb0, 0x10, 0x66, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x13, 0xd6, 0xc0, 0xd8, 0x86, 0xd5, 0x41, 0xd7, 0x0e, 0x11, 0x0e, 0xfb,
+ 0x21, 0x73, 0x0d, 0x0e,
+ 0x21, 0x16, 0x10, 0xc9, 0xbe, 0x01, 0x43, 0x10, 0xf0, 0xde, 0x00, 0x77,
+ 0x00, 0xef, 0xfd, 0x00,
+ 0x0d, 0x00, 0x10, 0x0e, 0x2d, 0x00, 0xd1, 0x01, 0x20, 0x00, 0xf7, 0xe1,
+ 0xf2, 0x03, 0xe1, 0xf3,
+ 0x9e, 0xed, 0x14, 0x0d, 0x01, 0x67, 0xff, 0xfe, 0x00, 0x2e, 0x0f, 0x57,
+ 0x00, 0x0f, 0xf0, 0x02,
+ 0x10, 0x00, 0x00, 0xba, 0xf0, 0x50, 0x23, 0xdf, 0xde, 0x0d, 0xfd, 0xeb,
+ 0xac, 0xf0, 0x23, 0x0d,
+ 0xa9, 0x01, 0x11, 0x10, 0x33, 0xef, 0xd9, 0x11, 0x52, 0x00, 0x20, 0x00,
+ 0xfc, 0xf0, 0x12, 0x04,
+ 0xd0, 0xdd, 0x00, 0x12, 0x24, 0xd0, 0xb2, 0x01, 0x1f, 0x0b, 0xd0, 0xbe,
+ 0xcb, 0x24, 0x32, 0xb9,
+ 0xdd, 0xf0, 0x44, 0x21, 0x00, 0xe0, 0xcb, 0x10, 0x55, 0x00, 0x0d, 0x22,
+ 0xe0, 0xaf, 0x0c, 0x11,
+ 0x43, 0xff, 0x00, 0x31, 0xe0, 0x22, 0x45, 0xfe, 0xef, 0x01, 0xe3, 0x23,
+ 0x00, 0xed, 0xcd, 0x10,
+ 0x33, 0x00, 0xda, 0xf0, 0x01, 0x00, 0x11, 0x21, 0x35, 0x30, 0x00, 0x1f,
+ 0x0f, 0xfb, 0x52, 0x63,
+ 0x0c, 0x0e, 0x32, 0x0f, 0x2a, 0xfd, 0x00, 0x30, 0xee, 0xfb, 0xf0, 0x21,
+ 0x74, 0x00, 0x00, 0x00,
+ 0xef, 0xee, 0x00, 0xf2, 0xcf, 0x0e, 0xe0, 0xaa, 0xe0, 0x01, 0xe0, 0xf6,
+ 0xb0, 0xec, 0x23, 0x45,
+ 0xe0, 0xce, 0x02, 0x11, 0x00, 0x00, 0x00, 0xdc, 0x11, 0x63, 0x00, 0x10,
+ 0x47, 0x21, 0xfe, 0xff,
+ 0x21, 0x75, 0x11, 0x0f, 0xf0, 0x02, 0x21, 0x34, 0x01, 0x89, 0xe0, 0x22,
+ 0x0f, 0xee, 0x01, 0x00,
+ 0xf0, 0x00, 0x01, 0x1d, 0x50, 0x22, 0x13, 0x02, 0xba, 0xec, 0x20, 0x77,
+ 0x0f, 0xcc, 0xf0, 0xf0,
+ 0xff, 0x00, 0x01, 0x0f, 0xdd, 0xd0, 0x10, 0x64, 0x32, 0x1f, 0xc8, 0xff,
+ 0x10, 0x52, 0x00, 0x01,
+ 0xde, 0xdc, 0xe0, 0xe0, 0x14, 0x00, 0x9c, 0x01, 0x45, 0xff, 0xed, 0x20,
+ 0x22, 0xff, 0xbb, 0x21,
+ 0x55, 0x00, 0xdd, 0x01, 0x13, 0x01, 0xdf, 0xdf, 0x01, 0x15, 0xff, 0xef,
+ 0xff, 0xd0, 0x3e, 0x40,
+ 0xbb, 0xdd, 0x33, 0x01, 0x0d, 0x00, 0x0f, 0xda, 0x02, 0x03, 0xec, 0x31,
+ 0x04, 0xcb, 0x41, 0x72,
+ 0x11, 0xfe, 0xff, 0x14, 0x00, 0xec, 0xff, 0x23, 0x34, 0xd1, 0xe0, 0xf0,
+ 0x05, 0x20, 0x00, 0x0c,
+ 0x0f, 0xfd, 0x20, 0x0f, 0xe9, 0xff, 0xdd, 0xed, 0xfe, 0xf0, 0x03, 0xf1,
+ 0xbb, 0x14, 0x37, 0x00,
+ 0xbe, 0xf1, 0x03, 0xf0, 0x30, 0x71, 0x33, 0x0e, 0x0e, 0x1f, 0x53, 0x16,
+ 0x20, 0x21, 0x24, 0xee,
+ 0xd0, 0x46, 0x11, 0xf0, 0xe0, 0xad, 0xde, 0x13, 0x47, 0xf1, 0xcf, 0xec,
+ 0x0f, 0xf0, 0x04, 0x00,
+ 0x0e, 0xf0, 0xce, 0x20, 0x54, 0xec, 0xfd, 0x55, 0x31, 0xec, 0xed, 0x32,
+ 0x43, 0xfd, 0x00, 0xbf,
+ 0xd9, 0xe0, 0x40, 0x24, 0xdd, 0xcf, 0x0f, 0xd0, 0x53, 0x44, 0x10, 0x2d,
+ 0xdf, 0x0e, 0x23, 0x11,
+ 0x23, 0xcc, 0x88, 0xfe, 0x05, 0x12, 0xff, 0xef, 0xf0, 0xd0, 0x0e, 0x20,
+ 0x45, 0x00, 0xee, 0x40,
+ 0x1d, 0x20, 0x63, 0xfe, 0xff, 0x46, 0x23, 0xef, 0x22, 0x34, 0xb0, 0xfd,
+ 0x15, 0x24, 0x10, 0xff,
+ 0x00, 0xe0, 0x00, 0x00, 0x11, 0x14, 0x30, 0x1f, 0x01, 0x31, 0x57, 0x20,
+ 0xf0, 0xe0, 0x00, 0x6e,
+ 0x27, 0x30, 0xdd, 0x11, 0x54, 0xee, 0xca, 0xde, 0xef, 0x21, 0x13, 0xe0,
+ 0xbb, 0xff, 0xf0, 0x40,
+ 0x35, 0x10, 0xec, 0xef, 0x31, 0x62, 0x00, 0xfe, 0xe0, 0xe1, 0x31, 0x21,
+ 0xe1, 0xb1, 0xf0, 0x23,
+ 0x67, 0x06, 0xd0, 0xdd, 0xf0, 0x43, 0x53, 0x10, 0x0c, 0x00, 0x02, 0x0e,
+ 0x1a, 0x20, 0x63, 0x00,
+ 0xeb, 0x00, 0x12, 0x10, 0x3f, 0xdf, 0xb0, 0x10, 0x2f, 0x03, 0xe0, 0xbb,
+ 0xfe, 0xde, 0xcf, 0xed,
+ 0xdb, 0x00, 0x0e, 0xe0, 0x56, 0x30, 0xfd, 0x01, 0x56, 0x1f, 0xfe, 0x30,
+ 0x53, 0x03, 0x21, 0xf1,
+ 0xcc, 0x01, 0xf4, 0xdf, 0xbe, 0xe0, 0xf4, 0x04, 0x0d, 0x9a, 0x22, 0x22,
+ 0x0f, 0xee, 0xfe, 0x00,
+ 0x71, 0x0f, 0xd8, 0xfe, 0x01, 0x25, 0xcf, 0xee, 0x11, 0xd1, 0xbf, 0xfe,
+ 0x00, 0x23, 0x10, 0xca,
+ 0xdf, 0x00, 0x62, 0x11, 0xff, 0x0f, 0x05, 0x21, 0x01, 0x33, 0x02, 0xbb,
+ 0xe0, 0x10, 0x33, 0xdf,
+ 0xec, 0x00, 0xdc, 0x10, 0x36, 0xf0, 0xdf, 0x01, 0xf0, 0xf0, 0x00, 0xf0,
+ 0x44, 0x33, 0xfc, 0x51,
+ 0x37, 0x10, 0x1e, 0x4e, 0x20, 0x62, 0x1e, 0x08, 0xfe, 0x31, 0x10, 0xe0,
+ 0xac, 0x31, 0x45, 0x00,
+ 0x00, 0x01, 0x0e, 0x22, 0x10, 0xbf, 0xdd, 0x0f, 0x22, 0xef, 0xa8, 0xff,
+ 0xf0, 0xf1, 0x9d, 0xfe,
+ 0xf4, 0x07, 0x21, 0xe0, 0xcd, 0xe1, 0x01, 0x13, 0x22, 0xfe, 0xde, 0x10,
+ 0x20, 0x0e, 0x40, 0x77,
+ 0x16, 0xee, 0x10, 0x30, 0x23, 0x12, 0xf1, 0xde, 0xff, 0x33, 0x02, 0xd0,
+ 0x34, 0x0f, 0xd9, 0xdf,
+ 0x00, 0x0f, 0x22, 0x55, 0x0f, 0xdc, 0x20, 0x50, 0x02, 0xab, 0x0e, 0x00,
+ 0x2e, 0xff, 0xf0, 0xe0,
+ 0xfb, 0xe0, 0x00, 0xcc, 0xbd, 0x10, 0x12, 0xf0, 0xce, 0x0f, 0x43, 0x04,
+ 0x02, 0x0d, 0xd8, 0xf0,
+ 0x10, 0x44, 0xdc, 0xcd, 0x11, 0xe0, 0xdd, 0x0e, 0x23, 0x54, 0x10, 0x21,
+ 0xe2, 0xe0, 0x2f, 0x43,
+ 0xe0, 0xc1, 0xf2, 0x01, 0x00, 0x0e, 0x12, 0x14, 0xc9, 0xcf, 0x23, 0x12,
+ 0xfd, 0x31, 0x03, 0xff,
+ 0x1f, 0x45, 0x0f, 0x89, 0x00, 0x12, 0x00, 0xed, 0xde, 0x12, 0x0f, 0xfb,
+ 0xf0, 0x11, 0x5f, 0x10,
+ 0x47, 0x22, 0x00, 0x00, 0x73, 0x04, 0x00, 0x00, 0xed, 0xed, 0x0f, 0x45,
+ 0xf0, 0xdd, 0x02, 0x67,
+ 0x00, 0x1e, 0x00, 0x0e, 0xde, 0x10, 0x24, 0x00, 0xdf, 0xcb, 0xf0, 0x15,
+ 0x30, 0xee, 0xd0, 0xcf,
+ 0x02, 0x22, 0x67, 0x22, 0x0f, 0x0f, 0x23, 0x21, 0x10, 0x74, 0x20, 0x1c,
+ 0x01, 0x00, 0x0d, 0x23,
+ 0x77, 0x01, 0xfe, 0x0d, 0x00, 0x25, 0x02, 0xce, 0xff, 0x01, 0x02, 0xb0,
+ 0x02, 0x11, 0xdd, 0xef,
+ 0xfd, 0xff, 0xdf, 0xdc, 0x12, 0x30, 0x0d, 0x37, 0xe0, 0xc0, 0x40, 0x40,
+ 0xf0, 0xeb, 0xff, 0x40,
+ 0x32, 0x00, 0xeb, 0x10, 0xed, 0xbb, 0x00, 0x0f, 0x0c, 0xff, 0xff, 0x22,
+ 0x74, 0x26, 0x00, 0x9a,
+ 0x00, 0x11, 0x33, 0xef, 0xcb, 0xef, 0x00, 0x00, 0xf0, 0xdf, 0x20, 0x01,
+ 0xbb, 0x00, 0x13, 0x10,
+ 0xf0, 0xee, 0xff, 0xf0, 0x13, 0x01, 0xee, 0x32, 0x67, 0x00, 0xce, 0x02,
+ 0x04, 0x10, 0x32, 0x24,
+ 0x00, 0xf0, 0x12, 0x35, 0xfc, 0x0f, 0x73, 0x00, 0x13, 0x26, 0xf0, 0x00,
+ 0x35, 0x00, 0x0e, 0x0e,
+ 0x75, 0x44, 0xf0, 0xec, 0xf0, 0x20, 0x32, 0x00, 0xee, 0xcd, 0xdb, 0x20,
+ 0x51, 0x00, 0xe0, 0x0c,
+ 0x00, 0x11, 0x52, 0x01, 0xfe, 0xcd, 0x00, 0x23, 0x2c, 0xfb, 0xcf, 0xc0,
+ 0x01, 0x0f, 0x2f, 0x10,
+ 0xae, 0xeb, 0x06, 0x64, 0x00, 0x00, 0xf2, 0xcf, 0x10, 0x34, 0x10, 0x13,
+ 0x00, 0xc8, 0xef, 0x20,
+ 0x52, 0x11, 0x01, 0x0d, 0x0f, 0x64, 0x14, 0xee, 0xfd, 0x00, 0x04, 0x01,
+ 0xf0, 0xde, 0xae, 0xfe,
+ 0x01, 0xed, 0xb8, 0x1e, 0x10, 0xfc, 0x01, 0x33, 0x00, 0x1f, 0x62, 0x00,
+ 0x0d, 0x12, 0x14, 0x26,
+ 0xef, 0xef, 0x00, 0xf0, 0xbd, 0xdf, 0xff, 0xcd, 0xd1, 0x04, 0x0f, 0xc8,
+ 0xf0, 0x56, 0x20, 0xff,
+ 0xd0, 0x10, 0x00, 0x0f, 0x00, 0xce, 0xad, 0xfd, 0x00, 0x00, 0x22, 0x27,
+ 0xed, 0xee, 0x34, 0x22,
+ 0x10, 0x0d, 0x21, 0x36, 0x00, 0xe0, 0x20, 0x40, 0x00, 0xfe, 0x00, 0x2f,
+ 0x0d, 0xb0, 0x35, 0x32,
+ 0xeb, 0xe0, 0x46, 0xe0, 0xdf, 0xdf, 0xcf, 0x10, 0x25, 0xf0, 0xbf, 0xde,
+ 0x01, 0x35, 0x4f, 0x0e,
+ 0x40, 0x31, 0x43, 0x31, 0x2e, 0x7c, 0x1f, 0x20, 0x16, 0x30, 0xfb, 0xdf,
+ 0x10, 0x30, 0xfe, 0x0f,
+ 0x31, 0xef, 0xee, 0x65, 0x21, 0xed, 0xe0, 0x23, 0x03, 0xdd, 0xbd, 0xf5,
+ 0xf3, 0x8a, 0xff, 0x01,
+ 0x00, 0xce, 0x00, 0x12, 0xef, 0xf3, 0x26, 0x01, 0x12, 0x21, 0x0e, 0x24,
+ 0x67, 0x00, 0xdc, 0xbe,
+ 0x0f, 0x44, 0x12, 0x00, 0xfd, 0x00, 0x33, 0x03, 0x00, 0x20, 0x1d, 0x0e,
+ 0x47, 0x77, 0x00, 0x00,
+ 0x00, 0xe0, 0xff, 0x00, 0x00, 0xfe, 0xe1, 0xf2, 0x00, 0x1d, 0x0f, 0x33,
+ 0x0d, 0xb8, 0x00, 0x52,
+ 0x12, 0x0f, 0x1e, 0x0f, 0xdf, 0xde, 0x02, 0x20, 0xbb, 0xf0, 0xff, 0xe8,
+ 0xbf, 0x00, 0x25, 0x0f,
+ 0xfd, 0x00, 0x4f, 0x20, 0x30, 0xe1, 0xff, 0x0e, 0xcd, 0xda, 0xf0, 0x53,
+ 0x47, 0xf0, 0xbd, 0x00,
+ 0xf1, 0x01, 0x00, 0xe0, 0xf0, 0xf2, 0xee, 0x1f, 0x03, 0xf0, 0xf1, 0x03,
+ 0xbd, 0xfd, 0x01, 0x12,
+ 0x10, 0x23, 0x00, 0xcb, 0x10, 0x0e, 0xfa, 0x0f, 0x3f, 0x40, 0xb0, 0xda,
+ 0x00, 0x20, 0xe1, 0xe0,
+ 0x00, 0x02, 0x17, 0x12, 0xd0, 0x0e, 0x30, 0x61, 0x01, 0x36, 0x41, 0xdc,
+ 0xee, 0x1f, 0x30, 0x10,
+ 0xdf, 0xae, 0x0d, 0x26, 0x63, 0xfe, 0xdc, 0x0f, 0xf1, 0x00, 0xef, 0xef,
+ 0x0e, 0xeb, 0x00, 0x34,
+ 0xde, 0xbc, 0x00, 0x10, 0x54, 0x24, 0xff, 0x00, 0x57, 0x00, 0x20, 0x12,
+ 0x21, 0x30, 0x43, 0xef,
+ 0xb9, 0x00, 0x31, 0x02, 0xef, 0x00, 0x21, 0xd0, 0xf4, 0x34, 0x20, 0xce,
+ 0xf2, 0x06, 0xed, 0x20,
+ 0x55, 0xd0, 0xcd, 0x1f, 0x32, 0xff, 0xcd, 0xff, 0x00, 0x02, 0xff, 0x10,
+ 0x65, 0x00, 0xea, 0x00,
+ 0x10, 0x0f, 0x50, 0x23, 0x0e, 0xfa, 0xef, 0xcd, 0xed, 0x32, 0x54, 0xdc,
+ 0xee, 0x02, 0xf3, 0x13,
+ 0x23, 0xeb, 0xef, 0x21, 0x46, 0x00, 0xcf, 0xbc, 0x0f, 0xff, 0xfd, 0x1f,
+ 0x43, 0x04, 0xef, 0x2c,
+ 0x52, 0x13, 0x02, 0xff, 0xee, 0x57, 0x24, 0xf0, 0xab, 0x00, 0x21, 0xf1,
+ 0xe0, 0xde, 0x00, 0x12,
+ 0x00, 0x02, 0x55, 0x13, 0xdd, 0x22, 0x24, 0x20, 0x30, 0x27, 0x10, 0xf0,
+ 0xef, 0x10, 0x43, 0x02,
+ 0xe0, 0xeb, 0x42, 0x44, 0xf0, 0xc0, 0x1e, 0x2e, 0x31, 0x35, 0x31, 0x0c,
+ 0xca, 0x0f, 0x10, 0x41,
+ 0x10, 0xbb, 0xdf, 0x00, 0x20, 0x52, 0x10, 0x1f, 0x01, 0xc0, 0xf0, 0x10,
+ 0xe0, 0xf0, 0x03, 0xec,
+ 0x01, 0x27, 0xd0, 0xad, 0x00, 0x04, 0x21, 0x22, 0x13, 0x00, 0x34, 0x5f,
+ 0xfb, 0x02, 0x76, 0x00,
+ 0xec, 0xfd, 0x11, 0x63, 0xff, 0xff, 0x0f, 0x0e, 0x12, 0x36, 0xcd, 0x00,
+ 0x15, 0x0f, 0xdd, 0xf0,
+ 0x00, 0x40, 0xe0, 0xbd, 0x1d, 0x0d, 0x0d, 0x0f, 0xee, 0x01, 0x11, 0x10,
+ 0x25, 0xf0, 0xfe, 0x77,
+ 0x04, 0xef, 0x00, 0x01, 0xe0, 0x1f, 0x10, 0xaf, 0xea, 0x01, 0x33, 0x1f,
+ 0xef, 0xd0, 0xfd, 0xef,
+ 0x02, 0x54, 0x20, 0xfe, 0xcb, 0x01, 0x01, 0xde, 0xfd, 0xa8, 0xfd, 0x00,
+ 0x00, 0xf0, 0x14, 0x11,
+ 0xd0, 0xf0, 0x01, 0x33, 0xe1, 0xcf, 0x00, 0x53, 0x0b, 0x0f, 0x12, 0x00,
+ 0x09, 0xf0, 0x00, 0x33,
+ 0xbc, 0xde, 0x14, 0x01, 0xf0, 0xe5, 0x22, 0xfe, 0xbd, 0x11, 0x27, 0xf0,
+ 0xdf, 0xef, 0x30, 0x63,
+ 0x00, 0xeb, 0x00, 0x31, 0x54, 0x00, 0x21, 0x1f, 0x1e, 0x1f, 0x41, 0x44,
+ 0x1f, 0x3c, 0x10, 0x0d,
+ 0x30, 0x60, 0xf8, 0xef, 0x01, 0x31, 0x10, 0x32, 0x03, 0x00, 0xce, 0xde,
+ 0xda, 0xe0, 0x31, 0xce,
+ 0x8a, 0x0f, 0x00, 0xfe, 0xf0, 0xe2, 0xf3, 0x0f, 0x01, 0x17, 0xf3, 0xd0,
+ 0x0e, 0xd0, 0x24, 0x77,
+ 0xf0, 0xa9, 0x00, 0xf0, 0x00, 0x40, 0x01, 0xe0, 0x1f, 0x23, 0x22, 0x22,
+ 0x13, 0xf1, 0xcf, 0x00,
+ 0x67, 0x12, 0xff, 0xff, 0x10, 0x1d, 0x0c, 0x00, 0x40, 0x01, 0xbb, 0x0f,
+ 0x30, 0xfe, 0xf0, 0x25,
+ 0x00, 0xe0, 0x00, 0xe0, 0xab, 0xff, 0x01, 0x0f, 0xfa, 0xc0, 0xed, 0x20,
+ 0x11, 0xcc, 0xee, 0xfe,
+ 0xef, 0x03, 0x66, 0xfe, 0xfe, 0x00, 0x00, 0x04, 0x00, 0xdb, 0xf0, 0x1f,
+ 0x0f, 0x10, 0x1e, 0x33,
+ 0x24, 0xdd, 0xe0, 0x27, 0x01, 0xd0, 0x10, 0x33, 0xd0, 0xdf, 0x0e, 0x63,
+ 0x03, 0xeb, 0xef, 0x0f,
+ 0x1f, 0x3f, 0x00, 0xbe, 0xc8, 0xff, 0x12, 0x64, 0xfd, 0xcc, 0x11, 0x26,
+ 0xf0, 0xcc, 0xe0, 0x10,
+ 0x00, 0x00, 0x01, 0x10, 0x60, 0x26, 0x11, 0x00, 0x3f, 0x01, 0x11, 0x40,
+ 0x54, 0x10, 0xfe, 0xcb,
+ 0x10, 0x33, 0xee, 0xcc, 0x31, 0x22, 0xfe, 0x01, 0xf1, 0xd0, 0x01, 0x11,
+ 0xd0, 0xd0, 0xed, 0x00,
+ 0x05, 0xf0, 0xba, 0x00, 0x20, 0x00, 0x02, 0x44, 0x62, 0x02, 0x25, 0x52,
+ 0x00, 0xeb, 0x01, 0x55,
+ 0x11, 0x1f, 0x0f, 0xde, 0xff, 0x21, 0x12, 0xfc, 0x00, 0x54, 0xf0, 0xef,
+ 0x12, 0x11, 0x02, 0xd2,
+ 0xe1, 0x02, 0x04, 0x11, 0x0f, 0xbb, 0xfd, 0xef, 0x13, 0x31, 0xec, 0xff,
+ 0x10, 0xec, 0xf1, 0x57,
+ 0x12, 0xed, 0x2f, 0x30, 0x01, 0x32, 0x11, 0x10, 0xe8, 0xcd, 0x00, 0x40,
+ 0x12, 0xbc, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf1, 0x02, 0x08, 0xae, 0x0f, 0x20, 0x32, 0xf0, 0xb8, 0xdf,
+ 0x0f, 0x30, 0xef, 0x00,
+ 0xf0, 0xd0, 0xfe, 0x03, 0x27, 0xf1, 0xbf, 0x0f, 0xf0, 0xd1, 0xef, 0x0e,
+ 0x11, 0x21, 0x10, 0xec,
+ 0x00, 0x01, 0x37, 0x53, 0x00, 0xfd, 0xe1, 0x37, 0x32, 0x22, 0x21, 0x01,
+ 0x02, 0x14, 0x1f, 0xec,
+ 0x01, 0x65, 0x11, 0x0e, 0xee, 0x42, 0x46, 0x00, 0x00, 0xdf, 0x0e, 0xf0,
+ 0x44, 0x51, 0xee, 0xd9,
+ 0xf0, 0x2f, 0x10, 0x00, 0xee, 0x0d, 0x51, 0x30, 0x11, 0x00, 0xbf, 0x0c,
+ 0x22, 0x45, 0xde, 0xbc,
+ 0x00, 0x02, 0x00, 0xdf, 0xeb, 0xf0, 0xc0, 0xe1, 0x02, 0x10, 0x21, 0x77,
+ 0x05, 0xff, 0x0f, 0x10,
+ 0x22, 0x63, 0x00, 0x0d, 0xee, 0x10, 0x03, 0x00, 0x0f, 0xfc, 0xe0, 0xf1,
+ 0x27, 0x31, 0xe1, 0xb0,
+ 0x20, 0x22, 0xed, 0xca, 0x21, 0x43, 0x0e, 0xfc, 0x0f, 0x1a, 0x00, 0x40,
+ 0x00, 0xbe, 0x00, 0x02,
+ 0xf0, 0x01, 0x47, 0x00, 0xe0, 0xc2, 0xdf, 0x00, 0xf0, 0xaa, 0x0f, 0x0f,
+ 0x01, 0xf0, 0xcd, 0x0e,
+ 0xe1, 0xe0, 0xbc, 0x13, 0x11, 0xeb, 0xdf, 0xdd, 0xde, 0x21, 0x43, 0x0f,
+ 0xcd, 0xeb, 0x00, 0x24,
+ 0x54, 0x11, 0xed, 0x02, 0x77, 0x11, 0xff, 0xfd, 0x22, 0x31, 0x00, 0x00,
+ 0x73, 0x1c, 0xfd, 0xfe,
+ 0x1f, 0x0e, 0xef, 0xf5, 0xe0, 0xdc, 0xbe, 0x03, 0x05, 0xdf, 0xb0, 0x00,
+ 0x14, 0x03, 0xef, 0xd9,
+ 0x00, 0x43, 0x52, 0x0f, 0xe9, 0x00, 0x71, 0x20, 0x00, 0x45, 0x00, 0xec,
+ 0x20, 0x52, 0x21, 0x00,
+ 0x0f, 0x10, 0x21, 0x00, 0xcc, 0x0c, 0xf0, 0x02, 0x20, 0x30, 0xde, 0xbb,
+ 0x11, 0x33, 0xf0, 0xf1,
+ 0xef, 0xe0, 0xd0, 0xc0, 0x01, 0x0d, 0xcf, 0x06, 0xb0, 0xcb, 0x02, 0x03,
+ 0x00, 0x00, 0x01, 0xdc,
+ 0xcb, 0x43, 0x64, 0x00, 0xdb, 0x10, 0x10, 0x10, 0x11, 0x12, 0xf1, 0xde,
+ 0x22, 0x77, 0x12, 0xe0,
+ 0x00, 0x11, 0x31, 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x51, 0x12, 0x1e, 0x12,
+ 0x03, 0xe9, 0x11, 0x33,
+ 0xdf, 0x00, 0x12, 0x15, 0xf0, 0xfb, 0xe0, 0x01, 0x10, 0x0e, 0xeb, 0xde,
+ 0x10, 0x12, 0xdf, 0xfd,
+ 0xee, 0xdd, 0xf0, 0x0f, 0x0d, 0x45, 0x30, 0xfd, 0x0d, 0x3d, 0xf8, 0x10,
+ 0x41, 0x00, 0xbd, 0xee,
+ 0x03, 0x03, 0x0f, 0x8b, 0xf1, 0xf6, 0xe0, 0x01, 0x02, 0xd0, 0x2f, 0x42,
+ 0xf0, 0xef, 0x2d, 0x76,
+ 0x20, 0xd9, 0xff, 0x10, 0x01, 0xe0, 0xae, 0xfd, 0xe1, 0x01, 0xc0, 0xfd,
+ 0xf0, 0x04, 0xf0, 0x00,
+ 0x00, 0x20, 0xf0, 0xe0, 0x1f, 0x7f, 0x12, 0x0f, 0xec, 0x37, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc3, 0x13, 0x6f, 0x19, 0xad, 0x14, 0x19, 0x1a, 0x00, 0x67, 0x11, 0x20,
+ 0xed, 0xdc, 0x00, 0x10,
+ 0x1f, 0xfb, 0x01, 0x11, 0xde, 0xee, 0x02, 0x0e, 0xb8, 0x00, 0x13, 0x10,
+ 0x0e, 0xff, 0xab, 0x10,
+ 0x13, 0x0c, 0x1f, 0x20, 0x14, 0xe0, 0xf0, 0x01, 0x14, 0x67, 0x21, 0xd0,
+ 0xed, 0x21, 0x54, 0x00,
+ 0x01, 0x0f, 0x0c, 0xe0, 0x00, 0x12, 0x61, 0x01, 0xdf, 0x13, 0x26, 0x00,
+ 0xf0, 0x17, 0x01, 0xb0,
+ 0x0f, 0x12, 0x01, 0xce, 0xdd, 0x10, 0x44, 0x1e, 0xdb, 0xef, 0x51, 0x00,
+ 0xe9, 0x00, 0x33, 0x40,
+ 0x00, 0x0f, 0xde, 0x0f, 0x65, 0x24, 0x0e, 0xac, 0x00, 0x10, 0x00, 0xef,
+ 0xde, 0x0f, 0x0d, 0xfe,
+ 0xe0, 0x22, 0x33, 0x0f, 0xe8, 0x3f, 0x30, 0x11, 0x20, 0x43, 0x20, 0x00,
+ 0xef, 0xfe, 0xff, 0x01,
+ 0x04, 0xe0, 0xbe, 0xee, 0x00, 0x01, 0x32, 0x33, 0x24, 0xde, 0xba, 0x21,
+ 0x53, 0x00, 0xfa, 0xf0,
+ 0x15, 0x00, 0xce, 0xf0, 0xf2, 0xe2, 0xd0, 0x10, 0x34, 0xf1, 0xf4, 0x42,
+ 0x00, 0xed, 0x42, 0x57,
+ 0xf1, 0xe0, 0x51, 0x21, 0x0f, 0x00, 0x03, 0x0f, 0xec, 0x00, 0x31, 0x30,
+ 0x1b, 0x20, 0x11, 0xfb,
+ 0x0f, 0x3e, 0x0d, 0xed, 0xea, 0x20, 0x56, 0xef, 0xbd, 0x11, 0x12, 0x0f,
+ 0xe0, 0xf1, 0x00, 0xfe,
+ 0x00, 0x00, 0x2d, 0x57, 0xf1, 0xad, 0x0f, 0x01, 0x21, 0x03, 0x47, 0x04,
+ 0xdd, 0x0f, 0x31, 0x23,
+ 0xfe, 0x0e, 0x72, 0x0f, 0xdc, 0x23, 0x22, 0x0b, 0xe0, 0x32, 0x11, 0x0e,
+ 0xde, 0x00, 0x14, 0x00,
+ 0xdc, 0xde, 0x1f, 0x61, 0x10, 0x0d, 0xff, 0x0f, 0x0c, 0xfc, 0x10, 0x24,
+ 0xe1, 0xac, 0x0e, 0x37,
+ 0x47, 0xf0, 0xd0, 0xff, 0x11, 0x21, 0x21, 0x00, 0xbc, 0x00, 0xe0, 0xe1,
+ 0x00, 0x30, 0xcd, 0xcc,
+ 0xdd, 0xf0, 0x03, 0xdd, 0xee, 0x00, 0x10, 0x0d, 0x01, 0x04, 0xfe, 0xfe,
+ 0x20, 0x02, 0xf9, 0xe0,
+ 0x10, 0x22, 0xf1, 0xd3, 0x00, 0xeb, 0xfe, 0xf2, 0x14, 0x53, 0x0d, 0x0d,
+ 0x20, 0x2e, 0x0c, 0x30,
+ 0x00, 0xe1, 0xd0, 0xd0, 0xec, 0xd0, 0x07, 0xf4, 0xa0, 0xdc, 0x02, 0x04,
+ 0xff, 0xed, 0x10, 0x32,
+ 0x10, 0x30, 0x40, 0x30, 0x0c, 0x3f, 0x54, 0x57, 0x01, 0xed, 0x00, 0x24,
+ 0x51, 0x01, 0x0f, 0x1f,
+ 0x20, 0x0f, 0x52, 0x1f, 0xe8, 0x0a, 0x22, 0x40, 0xf0, 0xdf, 0xde, 0x01,
+ 0x54, 0xde, 0xbd, 0x12,
+ 0x14, 0x00, 0xde, 0xee, 0xe0, 0xb0, 0xdc, 0xcc, 0xde, 0x01, 0x47, 0xf0,
+ 0xbe, 0x00, 0x0f, 0x00,
+ 0xe2, 0x32, 0x54, 0xef, 0xce, 0x00, 0x45, 0xf0, 0xed, 0x00, 0x26, 0x20,
+ 0x31, 0x12, 0x02, 0x41,
+ 0x00, 0xe0, 0x01, 0x63, 0x12, 0x00, 0x1f, 0x21, 0x10, 0x0e, 0xfc, 0x00,
+ 0x0c, 0xec, 0xee, 0x10,
+ 0x77, 0x05, 0x0d, 0xdf, 0xf0, 0xf0, 0xf1, 0xf0, 0xee, 0xec, 0xdf, 0xef,
+ 0xfe, 0x00, 0xfe, 0xea,
+ 0xed, 0x0d, 0xff, 0x31, 0x32, 0xff, 0xec, 0xfe, 0x0c, 0x00, 0xe0, 0x10,
+ 0x47, 0x01, 0xbf, 0xfe,
+ 0x01, 0x11, 0xd0, 0xe2, 0x26, 0x32, 0xe0, 0xcd, 0x13, 0x57, 0xff, 0x0e,
+ 0x10, 0x62, 0x11, 0x1f,
+ 0xfd, 0xcc, 0xfe, 0xff, 0xeb, 0xab, 0xff, 0x03, 0x03, 0xd9, 0xbf, 0x01,
+ 0x01, 0x00, 0x10, 0x01,
+ 0x23, 0x31, 0x21, 0x40, 0x2f, 0x0c, 0x32, 0x57, 0x12, 0x20, 0xeb, 0x00,
+ 0x72, 0x02, 0x00, 0x33,
+ 0x0f, 0xed, 0x13, 0x00, 0xfd, 0xee, 0xde, 0xee, 0x00, 0xee, 0xc9, 0xff,
+ 0x22, 0x31, 0xcc, 0xff,
+ 0x10, 0x24, 0x34, 0x00, 0x00, 0x11, 0x22, 0x33, 0xd1, 0xe0, 0x04, 0x77,
+ 0x12, 0x0f, 0xfd, 0x02,
+ 0x20, 0x0c, 0x76, 0x32, 0xed, 0xdd, 0x21, 0x32, 0x13, 0x00, 0xdd, 0x02,
+ 0x47, 0xf2, 0xc0, 0x0f,
+ 0x02, 0xd0, 0xd0, 0x00, 0x10, 0x02, 0xfc, 0xff, 0x20, 0x11, 0x0d, 0xfa,
+ 0x00, 0x2f, 0x1f, 0x10,
+ 0x14, 0x24, 0x34, 0x01, 0xdf, 0xff, 0x22, 0x13, 0xfe, 0xde, 0x20, 0x30,
+ 0xe8, 0xaf, 0x0d, 0x0f,
+ 0x0f, 0xed, 0xec, 0xfe, 0x31, 0x35, 0x0e, 0xce, 0x0e, 0x51, 0x00, 0xdc,
+ 0x00, 0x35, 0x0f, 0xea,
+ 0xf0, 0x0f, 0xbf, 0xee, 0x01, 0x25, 0xd0, 0xcc, 0xf0, 0x33, 0x42, 0xdf,
+ 0xf0, 0x22, 0x21, 0x00,
+ 0x0c, 0x0e, 0xe0, 0x07, 0x22, 0xad, 0x00, 0x05, 0x13, 0x0f, 0xd1, 0x16,
+ 0x21, 0x12, 0x21, 0x01,
+ 0x01, 0x21, 0x31, 0x32, 0x21, 0x3f, 0x0e, 0xfe, 0x06, 0x41, 0x1e, 0xfe,
+ 0xdd, 0x0f, 0x25, 0x44,
+ 0x0e, 0xfb, 0x10, 0x32, 0x00, 0x0e, 0xc8, 0xf0, 0x50, 0x10, 0xcd, 0xff,
+ 0x20, 0x22, 0xff, 0xdf,
+ 0x00, 0x0f, 0x00, 0xe2, 0x0e, 0xee, 0x24, 0x04, 0x0f, 0xf0, 0xff, 0x0f,
+ 0x20, 0x16, 0x00, 0xff,
+ 0xff, 0xf0, 0x67, 0x35, 0xff, 0xef, 0xf0, 0x10, 0x34, 0x00, 0xff, 0xfe,
+ 0x33, 0x03, 0xcb, 0xed,
+ 0x33, 0x54, 0xfe, 0xfc, 0x00, 0x20, 0x21, 0x40, 0x11, 0x13, 0xde, 0xd9,
+ 0xf0, 0x0f, 0x01, 0xd0,
+ 0xaa, 0xf0, 0x24, 0x11, 0xf0, 0xf0, 0x00, 0x30, 0x13, 0xe0, 0xcd, 0xec,
+ 0xef, 0xf0, 0xfc, 0xbb,
+ 0xdd, 0xe0, 0xf0, 0xef, 0xb8, 0xf0, 0xf0, 0xe0, 0xee, 0x11, 0x65, 0x0f,
+ 0xee, 0x25, 0x41, 0xff,
+ 0xe0, 0x21, 0x00, 0xeb, 0x31, 0x65, 0x00, 0xff, 0x0f, 0x10, 0x0e, 0x30,
+ 0x72, 0x22, 0x0f, 0x10,
+ 0x22, 0x00, 0xdd, 0xe0, 0xae, 0xd9, 0x00, 0xcf, 0xff, 0xd0, 0xe0, 0xcf,
+ 0xf0, 0x03, 0x22, 0x0f,
+ 0x30, 0x33, 0x32, 0x12, 0x77, 0x10, 0x0e, 0x0f, 0x11, 0x34, 0x31, 0xf2,
+ 0xea, 0xde, 0x31, 0x54,
+ 0x20, 0x30, 0x10, 0x3e, 0x62, 0x35, 0xfe, 0xb9, 0x00, 0x33, 0x20, 0xde,
+ 0xdf, 0x10, 0x00, 0xf0,
+ 0x01, 0xcd, 0x1f, 0x35, 0xaf, 0xed, 0x03, 0x37, 0xdf, 0x99, 0x00, 0xf0,
+ 0x03, 0x0f, 0xe0, 0x01,
+ 0xef, 0x0e, 0x1f, 0x21, 0x46, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xd1, 0xe0,
+ 0x20, 0x03, 0xdd, 0x12,
+ 0x27, 0x01, 0x33, 0x20, 0x0e, 0x00, 0x42, 0x40, 0x43, 0x37, 0x40, 0xef,
+ 0xec, 0x21, 0x55, 0x00,
+ 0xcd, 0xff, 0x02, 0x36, 0x11, 0xef, 0xbf, 0x00, 0xf2, 0x01, 0x01, 0x10,
+ 0x0b, 0xdf, 0x1f, 0x1f,
+ 0xea, 0x00, 0x61, 0x00, 0x0b, 0xe0, 0x30, 0x0f, 0xac, 0xee, 0x12, 0x01,
+ 0xec, 0x00, 0x73, 0x00,
+ 0xbe, 0x00, 0xf1, 0xfc, 0xef, 0x12, 0x27, 0x00, 0xd0, 0x00, 0x02, 0xfd,
+ 0x00, 0x35, 0x2e, 0x10,
+ 0x45, 0xee, 0xec, 0x00, 0xe2, 0xcf, 0xb9, 0xdf, 0xe0, 0xe0, 0xc0, 0xf0,
+ 0xbd, 0xfe, 0x03, 0x47,
+ 0x31, 0x10, 0x0e, 0x00, 0x64, 0x00, 0x2d, 0x10, 0x1e, 0xfe, 0x11, 0x36,
+ 0x01, 0xff, 0xf0, 0xd0,
+ 0xf1, 0x35, 0x21, 0xd0, 0xfd, 0x73, 0x12, 0xe8, 0xdc, 0x00, 0x2f, 0x0e,
+ 0x0f, 0x3e, 0xd0, 0xc0,
+ 0x10, 0x0f, 0xff, 0x47, 0x04, 0x8e, 0x0e, 0x03, 0x02, 0x10, 0x00, 0x02,
+ 0xda, 0xe0, 0x30, 0x76,
+ 0x20, 0x1f, 0x0d, 0xdf, 0x43, 0x37, 0x20, 0x00, 0xd0, 0x00, 0x23, 0x01,
+ 0xb0, 0x0f, 0xf2, 0xf1,
+ 0xce, 0x00, 0x17, 0x00, 0xbf, 0xfe, 0x0f, 0x00, 0x42, 0x21, 0x20, 0x46,
+ 0x30, 0xef, 0xed, 0x33,
+ 0xff, 0xca, 0xf0, 0xff, 0x22, 0x24, 0x00, 0x10, 0x10, 0xf2, 0x02, 0x20,
+ 0xf9, 0xe0, 0x52, 0x21,
+ 0xb9, 0xdf, 0x20, 0x20, 0xfe, 0xac, 0x11, 0x12, 0xfd, 0xfd, 0x24, 0x20,
+ 0xef, 0x0e, 0x21, 0x56,
+ 0x11, 0xff, 0xcd, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xf2, 0xf0, 0xfe, 0xed,
+ 0x22, 0x62, 0x00, 0x37,
+ 0x02, 0x00, 0x0e, 0xfe, 0x12, 0x03, 0xcb, 0xce, 0xf2, 0xd5, 0xe1, 0xf1,
+ 0xdf, 0xce, 0xef, 0x07,
+ 0x57, 0x20, 0xf0, 0x11, 0x70, 0x22, 0x10, 0x01, 0x0f, 0x2f, 0x10, 0x11,
+ 0xf0, 0x14, 0x1f, 0xb8,
+ 0x00, 0x22, 0xf0, 0xae, 0x1f, 0x33, 0x41, 0x0f, 0xd9, 0x0f, 0x30, 0x31,
+ 0xff, 0xdc, 0x10, 0x21,
+ 0x02, 0xfe, 0xec, 0x33, 0x43, 0xde, 0xac, 0x00, 0x23, 0x0f, 0x10, 0x02,
+ 0xed, 0xdb, 0xf0, 0x03,
+ 0x37, 0x10, 0x10, 0x00, 0xfe, 0xf1, 0x14, 0x20, 0x20, 0x23, 0x32, 0x12,
+ 0x0e, 0x0e, 0x10, 0xfd,
+ 0xe9, 0x00, 0x0f, 0x30, 0xf2, 0xcc, 0xee, 0x20, 0x74, 0x11, 0x0e, 0x14,
+ 0x02, 0xfe, 0x1d, 0x42,
+ 0x26, 0xff, 0xdc, 0x01, 0x03, 0x16, 0x00, 0x11, 0x00, 0xc0, 0xf2, 0x24,
+ 0x11, 0xde, 0xbc, 0xef,
+ 0xff, 0xeb, 0xee, 0x00, 0xed, 0xee, 0x31, 0xf2, 0xbe, 0xfd, 0xff, 0xed,
+ 0xfe, 0x01, 0x07, 0xf0,
+ 0xdd, 0xf0, 0x03, 0x00, 0xeb, 0x0e, 0x20, 0x20, 0x73, 0x13, 0x0b, 0x00,
+ 0x01, 0x23, 0x12, 0x32,
+ 0x13, 0x01, 0xac, 0x0f, 0x24, 0x00, 0xce, 0xec, 0xed, 0xcd, 0xcd, 0xf0,
+ 0x06, 0x00, 0x88, 0x00,
+ 0x15, 0x21, 0xff, 0xff, 0x32, 0x20, 0x00, 0x42, 0x00, 0x0d, 0x20, 0x60,
+ 0x00, 0x0f, 0x12, 0x00,
+ 0x0d, 0x57, 0x21, 0xf0, 0x0f, 0x23, 0x66, 0x20, 0x0f, 0xed, 0xff, 0x30,
+ 0x63, 0x0d, 0xd8, 0x0f,
+ 0x40, 0xf2, 0xbc, 0x0f, 0x31, 0xd2, 0xce, 0x0f, 0xd0, 0x00, 0xf1, 0xd0,
+ 0xfc, 0xdd, 0xdc, 0x00,
+ 0x0e, 0x01, 0xf3, 0xef, 0x0d, 0x0e, 0xff, 0x27, 0x02, 0xf0, 0xf3, 0x13,
+ 0xee, 0xbf, 0xf1, 0x02,
+ 0xff, 0x00, 0x47, 0x00, 0x0d, 0x13, 0x11, 0x1e, 0x50, 0x47, 0x21, 0x33,
+ 0x21, 0xbc, 0xfc, 0x21,
+ 0x36, 0x10, 0xde, 0xef, 0xe0, 0xef, 0x22, 0x23, 0xef, 0xcd, 0x00, 0x02,
+ 0x25, 0x0f, 0x0c, 0x22,
+ 0x00, 0x88, 0xfc, 0x11, 0x20, 0xef, 0xfe, 0x10, 0xee, 0xdf, 0x0f, 0xe0,
+ 0xef, 0xee, 0x22, 0x02,
+ 0xbc, 0x00, 0x27, 0x01, 0xb0, 0x11, 0x00, 0xea, 0xf0, 0x63, 0x00, 0x00,
+ 0x10, 0x45, 0xee, 0x0c,
+ 0x42, 0x35, 0xe0, 0x0e, 0x00, 0xe1, 0xe0, 0xbc, 0xce, 0x00, 0xdf, 0xbb,
+ 0xf0, 0x00, 0xdf, 0xdb,
+ 0xf0, 0x01, 0x11, 0x63, 0x21, 0x02, 0x42, 0x34, 0x00, 0x12, 0x21, 0x2c,
+ 0x0c, 0x13, 0x67, 0x00,
+ 0xce, 0x00, 0x01, 0x04, 0x20, 0xfc, 0xf0, 0x10, 0x42, 0x1f, 0xea, 0xff,
+ 0x10, 0x40, 0xeb, 0xcf,
+ 0x52, 0x03, 0xfd, 0xde, 0x23, 0x02, 0xd4, 0xe4, 0x03, 0xcd, 0x0d, 0x10,
+ 0x47, 0x32, 0x00, 0xda,
+ 0x30, 0x73, 0x22, 0x11, 0x0f, 0x0e, 0x03, 0x43, 0xf0, 0x03, 0x01, 0x02,
+ 0x47, 0x11, 0xf0, 0xac,
+ 0x00, 0x03, 0x0e, 0xcd, 0x00, 0x0f, 0xf1, 0x13, 0x01, 0x00, 0x33, 0x0d,
+ 0x00, 0x25, 0x2f, 0xfd,
+ 0x20, 0x25, 0x10, 0x32, 0x0f, 0xb8, 0x00, 0x13, 0x33, 0x0f, 0xef, 0x01,
+ 0x14, 0xee, 0xe0, 0x23,
+ 0x10, 0xd9, 0xde, 0xfe, 0xef, 0x0e, 0x1e, 0x3d, 0x0d, 0xfd, 0x0d, 0x20,
+ 0x0e, 0xec, 0x11, 0x42,
+ 0xdb, 0xf0, 0x1f, 0x10, 0xe0, 0xdf, 0x00, 0x0a, 0xcc, 0xf0, 0x00, 0x20,
+ 0x10, 0x33, 0xfd, 0xdb,
+ 0x02, 0x35, 0x33, 0x00, 0xe2, 0x33, 0xef, 0xab, 0xe0, 0x00, 0x03, 0xed,
+ 0xd1, 0x17, 0x24, 0x00,
+ 0xcd, 0xe0, 0x04, 0x02, 0x34, 0x73, 0x12, 0x11, 0x00, 0x34, 0x20, 0x0e,
+ 0xcc, 0x00, 0x42, 0x10,
+ 0x0c, 0xc0, 0x02, 0x01, 0xfe, 0xfd, 0x00, 0x05, 0x31, 0x10, 0xc8, 0xfd,
+ 0x31, 0x73, 0x0f, 0xec,
+ 0x10, 0x40, 0xfd, 0xed, 0x20, 0x31, 0x00, 0xdd, 0xde, 0x23, 0x01, 0x0e,
+ 0xf2, 0x35, 0x00, 0xab,
+ 0xff, 0xf0, 0x12, 0x35, 0x20, 0xf0, 0x01, 0xe0, 0x10, 0x52, 0x07, 0x00,
+ 0x00, 0x00, 0x24, 0x00,
+ 0x0f, 0x11, 0x00, 0xe0, 0xc8, 0xef, 0x10, 0x10, 0x0f, 0x00, 0x01, 0x00,
+ 0x62, 0x15, 0x10, 0x00,
+ 0xfb, 0x00, 0x15, 0x32, 0xf0, 0xbc, 0xed, 0x12, 0x54, 0x01, 0xcd, 0x20,
+ 0x21, 0xef, 0xee, 0xf2,
+ 0xd3, 0xcb, 0xff, 0x11, 0xbd, 0xb8, 0xed, 0x03, 0x00, 0xab, 0x00, 0x01,
+ 0xdf, 0xfe, 0x22, 0x11,
+ 0xff, 0xfe, 0x00, 0x0d, 0xfd, 0x67, 0x44, 0x0f, 0x0e, 0x02, 0x10, 0x1e,
+ 0x44, 0x23, 0x11, 0x0c,
+ 0xfd, 0x22, 0x67, 0x0f, 0xfe, 0x10, 0x30, 0xe0, 0xab, 0x00, 0x01, 0xde,
+ 0xfe, 0xb0, 0xf0, 0xf0,
+ 0xbe, 0xe9, 0x02, 0x26, 0x00, 0xce, 0x21, 0x22, 0x20, 0x20, 0x20, 0x11,
+ 0x00, 0x6f, 0x20, 0x00,
+ 0x10, 0x27, 0x11, 0x00, 0x00, 0x42, 0x33, 0xdd, 0x30, 0x77, 0x34, 0x0d,
+ 0xed, 0x01, 0x31, 0x00,
+ 0x40, 0x1e, 0xec, 0xbd, 0x02, 0x13, 0x10, 0xde, 0xbb, 0xfe, 0xe0, 0xfe,
+ 0xf0, 0x07, 0x00, 0x00,
+ 0x0e, 0xca, 0xd0, 0x01, 0x01, 0xee, 0xd0, 0x00, 0xd1, 0xf1, 0x01, 0xe0,
+ 0xf1, 0xe2, 0xd0, 0xf2,
+ 0x24, 0x61, 0x00, 0x20, 0x11, 0x0f, 0xea, 0x20, 0x63, 0x24, 0x11, 0x00,
+ 0x1d, 0x22, 0x47, 0x22,
+ 0x0f, 0x00, 0x00, 0xf3, 0x13, 0x13, 0xdb, 0xef, 0x46, 0x12, 0x00, 0x00,
+ 0x32, 0x0f, 0x0e, 0x24,
+ 0x01, 0xcd, 0xfd, 0x40, 0x00, 0xb8, 0x0c, 0x62, 0xf0, 0xec, 0xff, 0x0f,
+ 0xff, 0xde, 0x00, 0x13,
+ 0x00, 0xbc, 0x01, 0x10, 0xee, 0xe0, 0x01, 0x1d, 0x10, 0x00, 0xdd, 0x0d,
+ 0x1d, 0x01, 0x57, 0x06,
+ 0xbe, 0xed, 0x12, 0x34, 0xdf, 0xef, 0x00, 0xf1, 0xe0, 0xce, 0xde, 0xee,
+ 0x0e, 0xcc, 0xdf, 0x10,
+ 0xff, 0xa9, 0xff, 0x00, 0x25, 0x10, 0x20, 0x11, 0x21, 0x23, 0x43, 0x31,
+ 0x00, 0x1d, 0x0c, 0xff,
+ 0x20, 0x12, 0xef, 0xcc, 0x01, 0x35, 0x20, 0xda, 0xf0, 0x42, 0x21, 0xfd,
+ 0x0d, 0x10, 0xfe, 0xf0,
+ 0x00, 0x20, 0x0f, 0x00, 0xa0, 0xdb, 0x0f, 0xff, 0xfe, 0xf1, 0x02, 0xfc,
+ 0x0f, 0x13, 0x77, 0x12,
+ 0x0d, 0x0e, 0x00, 0x43, 0x25, 0x20, 0x02, 0x03, 0x00, 0xdf, 0xef, 0xf2,
+ 0x06, 0x00, 0xd0, 0xf2,
+ 0x23, 0x10, 0x00, 0x04, 0x10, 0xf0, 0xdb, 0xee, 0x00, 0x20, 0xf1, 0x07,
+ 0x10, 0xe0, 0xde, 0x0f,
+ 0x21, 0x53, 0x00, 0xfd, 0x17, 0x51, 0xee, 0x0d, 0x23, 0x64, 0xff, 0x00,
+ 0x03, 0x22, 0xfb, 0xef,
+ 0x13, 0x01, 0xe9, 0x02, 0x42, 0xbc, 0xfc, 0x01, 0x22, 0x1e, 0xfc, 0xf0,
+ 0xef, 0x0e, 0x00, 0x00,
+ 0xf0, 0xf0, 0xf0, 0xeb, 0x0f, 0x3f, 0xf1, 0x02, 0x0d, 0x2d, 0x41, 0x11,
+ 0x0e, 0x2e, 0x43, 0x15,
+ 0xff, 0xfd, 0x05, 0x41, 0x00, 0xf1, 0xe3, 0x01, 0xfe, 0xfe, 0xbe, 0x00,
+ 0xf1, 0xed, 0xcb, 0x04,
+ 0xe5, 0xd0, 0xef, 0x01, 0x24, 0xdf, 0x04, 0x53, 0xff, 0xff, 0x12, 0x55,
+ 0x20, 0x00, 0x2f, 0x11,
+ 0x21, 0xf0, 0xff, 0xfd, 0x10, 0x27, 0x02, 0xfd, 0xbc, 0x23, 0x43, 0x0f,
+ 0x0c, 0x0e, 0x3e, 0x2f,
+ 0x41, 0x10, 0x0e, 0x3c, 0x20, 0x22, 0xd9, 0xde, 0xf0, 0x00, 0xe0, 0xde,
+ 0xdc, 0xce, 0xf0, 0x47,
+ 0x32, 0xf0, 0xdb, 0x30, 0x42, 0x10, 0x12, 0x22, 0x00, 0xfe, 0xe0, 0xf3,
+ 0x17, 0xfe, 0xbf, 0x00,
+ 0x22, 0x22, 0x1f, 0x0b, 0x00, 0x46, 0x20, 0xed, 0xdc, 0x30, 0x73, 0x00,
+ 0xde, 0x02, 0x21, 0x0e,
+ 0x00, 0x77, 0xf2, 0xff, 0x23, 0x44, 0xfe, 0xeb, 0x00, 0x23, 0x30, 0x21,
+ 0x45, 0x00, 0xa0, 0x00,
+ 0x23, 0xf0, 0xad, 0x00, 0xfe, 0xf1, 0xe0, 0xfb, 0xef, 0xed, 0xca, 0xee,
+ 0xee, 0xee, 0xf1, 0x00,
+ 0xfd, 0x00, 0x02, 0xf0, 0xef, 0xfd, 0x02, 0x45, 0x0f, 0x0c, 0x43, 0x12,
+ 0x0b, 0x2e, 0x52, 0x02,
+ 0x00, 0x12, 0x0e, 0x0f, 0x03, 0x02, 0xde, 0x0e, 0x25, 0xf0, 0x9d, 0x03,
+ 0x35, 0x0f, 0xcc, 0xf0,
+ 0xf1, 0xce, 0x0d, 0xf1, 0x01, 0x00, 0xf0, 0xd0, 0xf0, 0xff, 0x32, 0x57,
+ 0x02, 0x32, 0x10, 0x0d,
+ 0xf0, 0x56, 0x20, 0xff, 0xff, 0x20, 0x45, 0x10, 0x0f, 0xee, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc5, 0x14, 0x33, 0x1d, 0x1f, 0x14, 0x13, 0x1c, 0x32, 0x54, 0x22, 0x00,
+ 0x0e, 0x0f, 0x1e, 0x0d,
+ 0xfc, 0x21, 0x33, 0xcb, 0xcc, 0xef, 0x00, 0xef, 0xcb, 0xfd, 0xde, 0x0e,
+ 0x44, 0x34, 0x00, 0xfb,
+ 0xdf, 0x11, 0x13, 0xbe, 0xde, 0xee, 0xe0, 0xd1, 0xe6, 0xd0, 0xbb, 0xf0,
+ 0x04, 0x22, 0x10, 0x0e,
+ 0x00, 0x20, 0x74, 0x1f, 0xfd, 0x00, 0x43, 0x02, 0x15, 0x01, 0xed, 0xdc,
+ 0x44, 0x35, 0xdf, 0xef,
+ 0x00, 0x55, 0x31, 0x00, 0x00, 0x11, 0x0f, 0x0f, 0x57, 0x21, 0xfe, 0xdc,
+ 0x22, 0x22, 0xf0, 0xbc,
+ 0x00, 0xff, 0xdf, 0x0d, 0x0e, 0xed, 0x00, 0xfe, 0xca, 0xf0, 0xe0, 0xff,
+ 0xec, 0xd0, 0x0f, 0xf0,
+ 0xc0, 0xea, 0x00, 0x20, 0x00, 0x0d, 0x44, 0x45, 0xfe, 0xed, 0x42, 0x56,
+ 0x00, 0x01, 0x01, 0xc0,
+ 0x10, 0x11, 0x00, 0x9c, 0xfd, 0x00, 0xed, 0xed, 0x00, 0x10, 0x00, 0xdd,
+ 0xc8, 0xdf, 0xf0, 0x00,
+ 0x00, 0xfe, 0xd1, 0x03, 0x00, 0x12, 0x01, 0x32, 0x23, 0x43, 0x25, 0x00,
+ 0xfc, 0x00, 0x76, 0x20,
+ 0xfc, 0xe0, 0x11, 0x12, 0x20, 0x0e, 0x10, 0x12, 0xf0, 0xfe, 0x44, 0x10,
+ 0xfe, 0xdf, 0x0e, 0x0b,
+ 0xef, 0x11, 0x23, 0xd0, 0xf0, 0xfc, 0xdd, 0x00, 0x17, 0x01, 0xcd, 0x00,
+ 0x53, 0x12, 0x13, 0x45,
+ 0x0f, 0x0e, 0x53, 0x26, 0x11, 0x02, 0x21, 0xef, 0xcc, 0x12, 0x03, 0xdc,
+ 0xcf, 0x14, 0x46, 0x00,
+ 0x00, 0xe1, 0x22, 0x30, 0xfe, 0xfe, 0x0f, 0xea, 0x00, 0x12, 0x00, 0xef,
+ 0x0e, 0x15, 0x52, 0xfd,
+ 0xca, 0x21, 0x35, 0x10, 0x22, 0x21, 0xee, 0xcd, 0x24, 0x32, 0xee, 0xbc,
+ 0x24, 0x53, 0xff, 0xdd,
+ 0x0d, 0xff, 0x23, 0x75, 0x0e, 0xdd, 0x0f, 0x30, 0xfc, 0xed, 0x00, 0x11,
+ 0xe8, 0xde, 0x0f, 0x01,
+ 0xc0, 0xfb, 0x0f, 0x10, 0x1f, 0x0e, 0x10, 0x66, 0x00, 0x0d, 0xff, 0xff,
+ 0x00, 0x30, 0x12, 0xf1,
+ 0xf1, 0x0e, 0xfe, 0xf0, 0x03, 0xff, 0xee, 0xe1, 0xe7, 0x02, 0x23, 0x00,
+ 0xae, 0xf0, 0xf0, 0xf5,
+ 0x13, 0x12, 0xff, 0xee, 0x00, 0x35, 0x11, 0x24, 0x11, 0x21, 0x57, 0x00,
+ 0xdf, 0x00, 0x23, 0xf1,
+ 0xdd, 0xf0, 0xf3, 0x00, 0xec, 0xf0, 0x21, 0x20, 0x0d, 0x0e, 0x31, 0x44,
+ 0x2f, 0x1b, 0x41, 0x11,
+ 0x0d, 0x0d, 0x41, 0x10, 0x0c, 0xde, 0xfb, 0xfe, 0x00, 0x10, 0xfc, 0xcd,
+ 0x0c, 0x11, 0x33, 0x46,
+ 0x21, 0xf1, 0xf1, 0x02, 0x22, 0x44, 0x02, 0xcf, 0xc9, 0xf0, 0xf1, 0x01,
+ 0xfd, 0xcc, 0x01, 0x65,
+ 0x11, 0x00, 0x12, 0x32, 0xf0, 0xf0, 0x00, 0x01, 0x02, 0xe0, 0xef, 0xbb,
+ 0xed, 0x00, 0x63, 0x0d,
+ 0xfa, 0x31, 0x23, 0x30, 0x36, 0x22, 0x21, 0xfe, 0x0e, 0x32, 0x05, 0xdf,
+ 0xe0, 0xe0, 0xf0, 0xd0,
+ 0xbd, 0xc9, 0xde, 0x00, 0x23, 0xf0, 0xaa, 0xf0, 0xdd, 0xef, 0xfe, 0x02,
+ 0x02, 0xac, 0x0f, 0xf0,
+ 0xf4, 0xdb, 0xee, 0x31, 0x44, 0xff, 0xdc, 0x50, 0x43, 0x13, 0x20, 0xfc,
+ 0x0e, 0x40, 0x57, 0x01,
+ 0x10, 0x1f, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x0d, 0xff, 0x00, 0xf4, 0xdf,
+ 0xcb, 0xfe, 0xde, 0xf3,
+ 0xe5, 0xcd, 0xba, 0x00, 0x00, 0xd2, 0xe0, 0x01, 0x10, 0x00, 0x74, 0x25,
+ 0x10, 0x0f, 0x2f, 0x32,
+ 0x11, 0x0f, 0x0f, 0x46, 0x12, 0x10, 0x00, 0x22, 0x22, 0x11, 0x02, 0x32,
+ 0x51, 0x1f, 0x00, 0x12,
+ 0x55, 0x1f, 0xf9, 0x00, 0x11, 0x00, 0xdd, 0xcc, 0xef, 0x22, 0x22, 0xbc,
+ 0xdb, 0xf0, 0x00, 0x00,
+ 0x02, 0x11, 0xef, 0xe0, 0x00, 0xf0, 0xf3, 0xf0, 0xe0, 0x9b, 0xf0, 0xf0,
+ 0xfd, 0xed, 0x23, 0x34,
+ 0x00, 0x02, 0x66, 0x10, 0x10, 0x11, 0x20, 0x01, 0xdb, 0x00, 0x66, 0x00,
+ 0xdd, 0x01, 0x02, 0x01,
+ 0x01, 0x52, 0x0f, 0xdb, 0x33, 0x77, 0x33, 0x01, 0x20, 0xfe, 0xe0, 0x53,
+ 0x13, 0x0e, 0xfe, 0x15,
+ 0x00, 0xec, 0xb0, 0x00, 0x13, 0x34, 0xfd, 0xec, 0x00, 0xcb, 0xcc, 0xff,
+ 0x32, 0x11, 0xc9, 0x00,
+ 0x1f, 0xdf, 0xdc, 0x11, 0x10, 0xe0, 0xdd, 0x10, 0x32, 0x36, 0xe0, 0xb0,
+ 0xfe, 0x00, 0xff, 0xce,
+ 0x01, 0x57, 0x00, 0xfd, 0xf0, 0xd1, 0xbd, 0xed, 0x00, 0x22, 0x00, 0x02,
+ 0xf2, 0xdf, 0xfc, 0xdf,
+ 0x03, 0x03, 0xdb, 0xcc, 0xce, 0x0e, 0x02, 0x34, 0xed, 0x0f, 0x65, 0x13,
+ 0x22, 0x0f, 0x1d, 0x56,
+ 0x12, 0x0e, 0xec, 0x01, 0x10, 0x01, 0xcf, 0x0c, 0x0f, 0x21, 0x13, 0xff,
+ 0xfd, 0x0f, 0xea, 0xf0,
+ 0x23, 0x11, 0xd9, 0xef, 0x21, 0x11, 0x02, 0xdd, 0xdb, 0xff, 0x30, 0x12,
+ 0xef, 0xcd, 0x0f, 0x31,
+ 0x43, 0x27, 0x32, 0x21, 0x0f, 0xef, 0x12, 0x25, 0x44, 0xf0, 0xbf, 0x00,
+ 0x0d, 0xce, 0x00, 0x00,
+ 0x04, 0x14, 0x11, 0x00, 0x0f, 0x00, 0x57, 0x02, 0xad, 0x0e, 0x04, 0x10,
+ 0xed, 0x00, 0x00, 0xe0,
+ 0xd0, 0x31, 0x23, 0x0b, 0x0e, 0x65, 0x12, 0x01, 0x32, 0x0f, 0x1d, 0x33,
+ 0x47, 0xe0, 0xef, 0x10,
+ 0x34, 0xff, 0xdd, 0xdf, 0x12, 0x44, 0x00, 0xfd, 0x04, 0x21, 0xa8, 0xec,
+ 0x02, 0x20, 0x00, 0x0e,
+ 0x10, 0xee, 0xdf, 0x1e, 0x10, 0xfc, 0xee, 0x0f, 0x1d, 0x35, 0x32, 0x01,
+ 0x42, 0x43, 0xfa, 0xdc,
+ 0x20, 0x54, 0x10, 0xff, 0xee, 0x00, 0xe0, 0xf0, 0xcd, 0x13, 0x26, 0xd0,
+ 0xe1, 0x04, 0xbe, 0x00,
+ 0xf0, 0xe0, 0x26, 0x33, 0xb0, 0xdd, 0xdf, 0x11, 0x16, 0x00, 0x0e, 0x03,
+ 0x36, 0x30, 0x00, 0x11,
+ 0x65, 0xff, 0xfe, 0xf1, 0x22, 0x00, 0x02, 0x20, 0x00, 0x20, 0x10, 0xf0,
+ 0xdc, 0x53, 0x10, 0xe8,
+ 0x0f, 0x61, 0x01, 0x0d, 0x0e, 0x40, 0x20, 0x0e, 0xe8, 0xde, 0x00, 0x30,
+ 0x02, 0x0f, 0xce, 0xff,
+ 0x00, 0x04, 0x22, 0x20, 0x13, 0xfd, 0xec, 0x22, 0x34, 0x0f, 0xef, 0x00,
+ 0xfd, 0xe0, 0xf0, 0xe0,
+ 0x01, 0x23, 0x37, 0x01, 0xd0, 0x1e, 0x76, 0x11, 0xfe, 0xdd, 0x21, 0x12,
+ 0x0d, 0xdc, 0x00, 0x00,
+ 0x0f, 0x44, 0x55, 0x0f, 0x0e, 0x42, 0x17, 0x31, 0x32, 0x11, 0x2f, 0x10,
+ 0x31, 0x33, 0x00, 0xce,
+ 0xbd, 0xff, 0xfe, 0xce, 0xfe, 0xe2, 0xf0, 0xde, 0xf1, 0xb0, 0xca, 0x0f,
+ 0x01, 0xf0, 0xdc, 0xfe,
+ 0x10, 0x0d, 0xfd, 0x0e, 0xdd, 0x0e, 0x21, 0xf0, 0xdd, 0x0e, 0x0f, 0x02,
+ 0x27, 0x42, 0x0f, 0xcb,
+ 0x20, 0x73, 0x12, 0x00, 0x2e, 0x10, 0x00, 0xfd, 0xf0, 0x14, 0x21, 0xef,
+ 0xe1, 0xf3, 0xef, 0xf0,
+ 0xce, 0xbd, 0xf2, 0x05, 0x0f, 0xcb, 0xf0, 0x0f, 0x12, 0x12, 0x00, 0xfa,
+ 0xf0, 0x65, 0x11, 0x0f,
+ 0x10, 0x24, 0x31, 0x00, 0xee, 0x0f, 0xf0, 0x10, 0x14, 0x33, 0x31, 0xf0,
+ 0xdf, 0x0f, 0x02, 0x40,
+ 0x11, 0x23, 0x23, 0x00, 0xfb, 0x20, 0x62, 0x00, 0x1a, 0xec, 0xff, 0xfe,
+ 0xff, 0x0d, 0x00, 0x0c,
+ 0xbe, 0xff, 0xd0, 0x27, 0x54, 0xf0, 0xbe, 0xf0, 0xef, 0xff, 0x0f, 0x03,
+ 0x00, 0x98, 0x00, 0x00,
+ 0x0f, 0xeb, 0x21, 0x64, 0x0f, 0xff, 0x01, 0x33, 0x12, 0xff, 0xfe, 0x00,
+ 0x05, 0x11, 0xf0, 0xad,
+ 0xee, 0x01, 0x45, 0x00, 0xff, 0x0e, 0x42, 0x23, 0x57, 0x21, 0x10, 0x00,
+ 0x32, 0x25, 0x31, 0xf0,
+ 0xbc, 0x23, 0x01, 0xcd, 0xcc, 0x01, 0x00, 0xf0, 0xf2, 0xd2, 0xb8, 0x0e,
+ 0x00, 0x10, 0x0e, 0xde,
+ 0x0c, 0x00, 0x42, 0x00, 0xea, 0x00, 0x00, 0xe0, 0xc0, 0xed, 0x10, 0x43,
+ 0x03, 0xb2, 0x02, 0x20,
+ 0x0a, 0xef, 0x00, 0x53, 0x00, 0xfd, 0xec, 0x00, 0x10, 0xff, 0xee, 0xef,
+ 0xdf, 0xcf, 0x11, 0x04,
+ 0xf0, 0xbb, 0xdd, 0x00, 0x05, 0xed, 0xbb, 0x00, 0x33, 0x00, 0xcc, 0x0f,
+ 0x32, 0x65, 0x10, 0x10,
+ 0x00, 0x31, 0x35, 0x00, 0x0e, 0x01, 0x31, 0x10, 0x00, 0xff, 0xfd, 0x1f,
+ 0x0e, 0xf0, 0x05, 0x0f,
+ 0xfe, 0x11, 0x35, 0xf0, 0xdd, 0xef, 0xff, 0x00, 0x10, 0x10, 0x10, 0xfc,
+ 0xf0, 0x0f, 0x50, 0x22,
+ 0x04, 0xfe, 0xed, 0x37, 0x33, 0x10, 0x34, 0x30, 0xf1, 0xf0, 0xf1, 0x03,
+ 0x10, 0xeb, 0x02, 0x26,
+ 0x0f, 0xbc, 0x01, 0x24, 0x20, 0xfd, 0xf1, 0x24, 0x21, 0xff, 0x01, 0x24,
+ 0xff, 0xdc, 0xf0, 0xff,
+ 0xed, 0xee, 0x0f, 0x00, 0x02, 0x12, 0x10, 0x00, 0x20, 0x33, 0x44, 0x22,
+ 0x02, 0x01, 0x32, 0x32,
+ 0x21, 0x23, 0xff, 0xc9, 0x00, 0x13, 0xff, 0xfb, 0x01, 0x13, 0xcf, 0xfe,
+ 0x0f, 0x00, 0x03, 0x11,
+ 0xd8, 0x0e, 0x10, 0x0e, 0x1d, 0x0e, 0x40, 0x00, 0xfd, 0x0d, 0xfc, 0x0e,
+ 0x00, 0x10, 0x34, 0x00,
+ 0xcb, 0xef, 0x20, 0x1f, 0x10, 0xf1, 0xbd, 0x0d, 0x02, 0xe0, 0x00, 0x34,
+ 0x11, 0xe2, 0x27, 0x14,
+ 0x00, 0xe0, 0xe0, 0x00, 0x02, 0xd0, 0x9d, 0x00, 0x17, 0x00, 0xcf, 0x0f,
+ 0x01, 0x03, 0xff, 0x21,
+ 0x45, 0x01, 0x16, 0x42, 0x01, 0xd0, 0xff, 0xff, 0xf0, 0x01, 0x02, 0x10,
+ 0x0c, 0x2d, 0x30, 0x14,
+ 0x1f, 0xfc, 0x0f, 0x61, 0x12, 0x0a, 0x0f, 0x22, 0x22, 0x53, 0x0d, 0xd8,
+ 0x0f, 0x10, 0x0f, 0x0f,
+ 0x1f, 0x1f, 0xcc, 0x01, 0x22, 0x52, 0x0f, 0x01, 0x17, 0x10, 0xfe, 0xf0,
+ 0x03, 0xdf, 0xcc, 0x23,
+ 0x36, 0xcf, 0xdc, 0x01, 0x02, 0xde, 0x00, 0x30, 0x01, 0x02, 0x37, 0x10,
+ 0xcf, 0xfe, 0x00, 0x02,
+ 0x01, 0x00, 0xc8, 0x00, 0x60, 0x24, 0x00, 0x0f, 0x0f, 0x41, 0x36, 0x20,
+ 0x42, 0x30, 0x01, 0xcf,
+ 0x0e, 0x11, 0xdf, 0xcc, 0xf0, 0xd2, 0xcf, 0xdb, 0xe0, 0xef, 0xbe, 0x00,
+ 0xe0, 0xd0, 0x00, 0xcb,
+ 0xcc, 0x0f, 0xf0, 0x0f, 0xcc, 0xe0, 0x0d, 0xec, 0x01, 0xf1, 0xe0, 0x11,
+ 0x00, 0x0d, 0x23, 0x32,
+ 0x30, 0x55, 0x2f, 0xfb, 0x32, 0x52, 0x0e, 0x40, 0x12, 0xff, 0xfd, 0x01,
+ 0x00, 0xed, 0xc0, 0x04,
+ 0xe2, 0xf0, 0xfc, 0xde, 0xf1, 0x04, 0xcd, 0xa8, 0x0f, 0x20, 0x04, 0x10,
+ 0xff, 0xfe, 0xf0, 0x02,
+ 0x52, 0x01, 0x23, 0x01, 0x23, 0x00, 0x02, 0x11, 0x02, 0x57, 0x12, 0xff,
+ 0x0f, 0x00, 0x11, 0x64,
+ 0x13, 0x0c, 0xfe, 0x36, 0x52, 0x00, 0xea, 0x00, 0x40, 0x22, 0x0e, 0xed,
+ 0x00, 0x30, 0xfd, 0xff,
+ 0x12, 0xe0, 0xb9, 0xee, 0xf1, 0x02, 0x00, 0xf2, 0x04, 0xe0, 0xcc, 0xe0,
+ 0xfe, 0xfc, 0xcc, 0xef,
+ 0x12, 0x00, 0xfa, 0x10, 0x52, 0x02, 0x02, 0xf0, 0x00, 0x12, 0x36, 0x11,
+ 0xef, 0xce, 0x12, 0x33,
+ 0x22, 0xfe, 0xca, 0x0f, 0x1f, 0x41, 0x33, 0x13, 0x0f, 0x21, 0x57, 0x25,
+ 0x10, 0x51, 0x33, 0x00,
+ 0xcf, 0x11, 0x02, 0x1f, 0x12, 0x14, 0xff, 0xdd, 0xec, 0xee, 0xff, 0xf1,
+ 0xf0, 0x00, 0x2e, 0x0f,
+ 0x00, 0xdd, 0x0e, 0x0f, 0x1e, 0xee, 0xdc, 0x0e, 0x0d, 0xcb, 0x00, 0x22,
+ 0x10, 0xcc, 0xfd, 0xcd,
+ 0x00, 0x36, 0x20, 0xdd, 0xff, 0x22, 0x21, 0xdc, 0xfe, 0x14, 0xf1, 0xdc,
+ 0xf0, 0xf1, 0xcd, 0xdc,
+ 0xe0, 0x05, 0xf1, 0xde, 0xf0, 0x04, 0x0f, 0xda, 0xee, 0xd0, 0x0f, 0x21,
+ 0x20, 0x10, 0x21, 0x1e,
+ 0x0e, 0x20, 0x43, 0x46, 0x00, 0x00, 0x01, 0x02, 0xfc, 0x0f, 0x11, 0x10,
+ 0xf0, 0xed, 0xfb, 0x02,
+ 0x01, 0xcc, 0xfe, 0x11, 0x03, 0xd0, 0x11, 0x0d, 0xfb, 0xef, 0x00, 0x1e,
+ 0x10, 0x20, 0xfa, 0xdf,
+ 0x44, 0x65, 0xfe, 0xee, 0xf0, 0x11, 0x00, 0x00, 0x15, 0x41, 0xf0, 0x00,
+ 0x42, 0x01, 0xcb, 0x0f,
+ 0x63, 0xf2, 0xdd, 0x00, 0x13, 0x13, 0x02, 0xae, 0xfc, 0xf1, 0x27, 0x10,
+ 0xe0, 0x10, 0x13, 0xe0,
+ 0xee, 0x21, 0x00, 0xea, 0xcf, 0x00, 0x33, 0x00, 0xbb, 0x00, 0x66, 0x10,
+ 0x0f, 0x00, 0x57, 0x00,
+ 0x2f, 0x00, 0x22, 0x00, 0xde, 0x00, 0x44, 0x00, 0xf0, 0xbe, 0x00, 0x02,
+ 0xe0, 0xfe, 0x22, 0x11,
+ 0xec, 0xde, 0xfe, 0x20, 0x30, 0xfb, 0xfe, 0x50, 0x0f, 0x0d, 0xf0, 0x1e,
+ 0x0f, 0x0f, 0xfc, 0xcd,
+ 0xe0, 0x34, 0x32, 0x1d, 0x0c, 0x00, 0x1e, 0xfc, 0x2f, 0x54, 0x00, 0xdf,
+ 0x12, 0x45, 0xf0, 0xbe,
+ 0x00, 0x07, 0xf2, 0xd0, 0xcf, 0x00, 0xe1, 0x0e, 0x00, 0xee, 0xfd, 0x02,
+ 0x25, 0x00, 0x02, 0x01,
+ 0xf4, 0xf4, 0x02, 0x00, 0xd0, 0xf3, 0x17, 0x02, 0x00, 0xfe, 0x0f, 0x01,
+ 0x21, 0x10, 0x2b, 0x51,
+ 0x12, 0x0e, 0xfb, 0x10, 0x23, 0x01, 0x31, 0x40, 0xea, 0xcd, 0x21, 0x20,
+ 0x0e, 0x2e, 0x1b, 0x0e,
+ 0x0f, 0x50, 0x10, 0xfc, 0xce, 0x1f, 0x0f, 0x00, 0x44, 0x36, 0xef, 0xef,
+ 0x00, 0x02, 0x00, 0x00,
+ 0x10, 0x00, 0xe1, 0x03, 0xe0, 0xef, 0xed, 0xf0, 0x03, 0xef, 0xcc, 0x01,
+ 0x77, 0x02, 0x0f, 0x00,
+ 0x11, 0x12, 0x10, 0x30, 0x1c, 0x0d, 0x56, 0x34, 0xfe, 0x30, 0x50, 0xff,
+ 0x00, 0x35, 0x44, 0x11,
+ 0x20, 0x00, 0x13, 0xff, 0xcd, 0xff, 0xf0, 0x04, 0xd0, 0xbc, 0x00, 0xe0,
+ 0xdc, 0xdf, 0x01, 0xd0,
+ 0xe0, 0xeb, 0x9d, 0x0d, 0xf0, 0xf1, 0x00, 0x00, 0xea, 0xff, 0x0e, 0x10,
+ 0xfe, 0x00, 0x12, 0x1f,
+ 0x0d, 0xdd, 0x22, 0x55, 0x20, 0x1e, 0x12, 0x23, 0x0e, 0x40, 0x12, 0x20,
+ 0x22, 0x02, 0xf1, 0xbb,
+ 0xee, 0xf0, 0xd6, 0xe2, 0xff, 0xff, 0xf0, 0xf2, 0x02, 0x0e, 0xc9, 0x10,
+ 0x41, 0x00, 0xfc, 0x00,
+ 0x11, 0x10, 0x01, 0x01, 0x03, 0xf0, 0xd0, 0x13, 0x24, 0xe0, 0xfd, 0x05,
+ 0x04, 0x00, 0xfe, 0x00,
+ 0x21, 0x67, 0x00, 0x0d, 0xff, 0x00, 0x54, 0x20, 0x1f, 0x00, 0x0e, 0xfc,
+ 0x00, 0x65, 0x10, 0x0b,
+ 0xbe, 0x11, 0x13, 0x00, 0x0e, 0xf0, 0xa8, 0x0f, 0xf1, 0x00, 0xf0, 0x0e,
+ 0x02, 0x0e, 0xdc, 0x00,
+ 0x40, 0xfc, 0xe0, 0x11, 0x00, 0xeb, 0xd0, 0x11, 0x14, 0xe0, 0xba, 0x00,
+ 0x03, 0x01, 0xde, 0xfe,
+ 0x00, 0x01, 0x33, 0x45, 0x0e, 0xdc, 0x11, 0x44, 0x10, 0x00, 0x12, 0x22,
+ 0x0e, 0xf0, 0x17, 0x53,
+ 0x22, 0x22, 0xfe, 0xef, 0x01, 0xf0, 0x1e, 0x45, 0x23, 0xf0, 0xec, 0x0f,
+ 0x20, 0xe1, 0xb0, 0x0f,
+ 0x01, 0x0d, 0xfc, 0x00, 0xf0, 0xee, 0xff, 0xff, 0xdb, 0x0f, 0x20, 0x0f,
+ 0xed, 0xf0, 0xf2, 0xdb,
+ 0xec, 0xf0, 0xf0, 0x03, 0x42, 0x0d, 0x0f, 0x20, 0x0e, 0xed, 0x1f, 0x30,
+ 0x0e, 0x12, 0xf5, 0xad,
+ 0xfc, 0xdf, 0xed, 0xe3, 0xf3, 0xcf, 0xec, 0xf0, 0xf0, 0x0f, 0xfe, 0x00,
+ 0x30, 0x0d, 0x0e, 0x00,
+ 0x20, 0x33, 0x21, 0x10, 0x33, 0x01, 0xee, 0x14, 0x57, 0x12, 0xee, 0xee,
+ 0x00, 0x44, 0xf0, 0xdb,
+ 0x00, 0x52, 0x24, 0xdd, 0xdc, 0x00, 0x0f, 0x10, 0x44, 0x13, 0x00, 0xb9,
+ 0xf0, 0x20, 0x42, 0x2f,
+ 0x0f, 0x10, 0x01, 0x10, 0x10, 0x12, 0x11, 0xfd, 0xdf, 0x03, 0x00, 0x02,
+ 0x27, 0x20, 0xe0, 0x02,
+ 0x01, 0x00, 0x00, 0x44, 0x23, 0xf0, 0xee, 0xef, 0x12, 0x01, 0xeb, 0xdf,
+ 0x32, 0x26, 0xdf, 0x01,
+ 0x01, 0xdf, 0xee, 0x47, 0x11, 0xdc, 0xdf, 0x20, 0x21, 0x0e, 0x10, 0x31,
+ 0x10, 0x0e, 0x20, 0x54,
+ 0x35, 0x10, 0xef, 0x33, 0x37, 0xd0, 0xcd, 0x10, 0x34, 0xf0, 0xcf, 0xed,
+ 0x11, 0x12, 0x00, 0xeb,
+ 0xf0, 0x23, 0x40, 0xef, 0x0f, 0x71, 0x0f, 0xdc, 0x0f, 0x2c, 0x1e, 0xfd,
+ 0x10, 0x2f, 0xdb, 0xee,
+ 0xed, 0xd9, 0x0e, 0xe0, 0x20, 0x53, 0x12, 0xfe, 0xcb, 0x20, 0x44, 0x10,
+ 0xdd, 0xf0, 0x46, 0x02,
+ 0xf0, 0xac, 0x00, 0x01, 0xe0, 0xe1, 0x01, 0xff, 0xf0, 0x01, 0x06, 0x11,
+ 0x00, 0xe0, 0x05, 0xf0,
+ 0xe0, 0x00, 0xf2, 0x02, 0x05, 0x20, 0xec, 0xde, 0x05, 0x02, 0x00, 0x0e,
+ 0x00, 0x23, 0x22, 0x01,
+ 0x0d, 0x01, 0x57, 0x02, 0x0f, 0xfd, 0x00, 0x00, 0x21, 0x11, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x7b, 0xdd, 0x37, 0xe8, 0x89, 0xdd, 0x40, 0xe7, 0x0e, 0x10, 0x50, 0x0d,
+ 0x3f, 0x44, 0xfc, 0xec,
+ 0x0f, 0x43, 0x32, 0xda, 0x00, 0x31, 0x00, 0x0e, 0x20, 0x57, 0x00, 0xce,
+ 0x0e, 0xf1, 0x00, 0xff,
+ 0x22, 0x02, 0xe1, 0xf0, 0xe1, 0xf1, 0xdd, 0xca, 0xe0, 0xf0, 0x02, 0x04,
+ 0x0f, 0xde, 0x01, 0x77,
+ 0x01, 0x00, 0x0e, 0x30, 0x02, 0xfe, 0x21, 0x44, 0x21, 0x00, 0xda, 0x10,
+ 0x64, 0x01, 0x20, 0x12,
+ 0x12, 0x00, 0xf0, 0x00, 0x30, 0x0e, 0xad, 0xf1, 0xf2, 0xfd, 0xcc, 0x00,
+ 0xd0, 0xcc, 0xe0, 0xde,
+ 0xd0, 0xde, 0xc9, 0xcf, 0x0f, 0x00, 0xd0, 0x01, 0x40, 0x0b, 0xce, 0x01,
+ 0x43, 0x0e, 0xe8, 0xce,
+ 0x00, 0x63, 0x33, 0x1f, 0x0c, 0x20, 0x44, 0x0f, 0x0f, 0x40, 0x04, 0x00,
+ 0xff, 0xe0, 0x0f, 0xce,
+ 0x03, 0x13, 0xef, 0xba, 0xff, 0x00, 0x22, 0x10, 0xee, 0x00, 0x0f, 0x0b,
+ 0xef, 0x11, 0x56, 0xf0,
+ 0xcf, 0x00, 0x05, 0x00, 0xfe, 0xe2, 0x57, 0x12, 0xdd, 0xf0, 0x43, 0x53,
+ 0xec, 0xee, 0x30, 0x65,
+ 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x11, 0x33, 0x20, 0x0d, 0xff, 0x0f, 0x23,
+ 0x46, 0x10, 0xde, 0xb9,
+ 0x10, 0x11, 0x10, 0xef, 0xff, 0x00, 0xce, 0xed, 0xdd, 0x11, 0x13, 0x00,
+ 0xd0, 0x13, 0x0d, 0xeb,
+ 0x02, 0x25, 0xff, 0xcc, 0x01, 0x02, 0xee, 0xfe, 0xef, 0xfe, 0xfe, 0x34,
+ 0x56, 0x00, 0xde, 0x00,
+ 0x20, 0x53, 0x25, 0x11, 0x01, 0xf0, 0x0d, 0xff, 0x14, 0x45, 0x00, 0x20,
+ 0x22, 0x02, 0x11, 0x42,
+ 0x01, 0x26, 0x42, 0xc0, 0x00, 0x61, 0xf5, 0x00, 0x01, 0xef, 0x0f, 0xff,
+ 0xfd, 0x11, 0x00, 0xef,
+ 0xe0, 0xf1, 0x2f, 0x0c, 0xd0, 0x01, 0x1f, 0x10, 0x40, 0xdb, 0xdc, 0x20,
+ 0x10, 0xee, 0xec, 0xed,
+ 0xac, 0x0e, 0x33, 0x15, 0xff, 0xda, 0x00, 0x33, 0x00, 0xf0, 0x0e, 0xde,
+ 0x03, 0xc1, 0xbb, 0xfe,
+ 0xd1, 0x00, 0xc0, 0xdd, 0xeb, 0x00, 0x20, 0x20, 0x10, 0x00, 0x1f, 0x20,
+ 0x33, 0x24, 0x1f, 0x0c,
+ 0xff, 0x11, 0x46, 0x0e, 0xcb, 0x00, 0x53, 0x14, 0xff, 0xdc, 0x00, 0x43,
+ 0x21, 0xcd, 0xfd, 0x01,
+ 0xe2, 0xf0, 0x00, 0x0e, 0xba, 0xff, 0x01, 0x23, 0xdd, 0xeb, 0x00, 0x00,
+ 0x20, 0x40, 0x15, 0x0e,
+ 0xed, 0x01, 0x23, 0x32, 0x0d, 0xd0, 0x03, 0x11, 0x0f, 0x0e, 0x02, 0x02,
+ 0x02, 0x01, 0x3f, 0xea,
+ 0x00, 0x62, 0x02, 0xf0, 0x02, 0xe1, 0x00, 0xf2, 0x05, 0xee, 0x9c, 0xf0,
+ 0x04, 0x00, 0xf0, 0xfe,
+ 0x0e, 0xf1, 0x06, 0x20, 0x20, 0x20, 0x2f, 0x00, 0x10, 0x10, 0x11, 0x26,
+ 0x30, 0x00, 0x10, 0xfd,
+ 0xf0, 0x44, 0x32, 0x02, 0x02, 0x33, 0x10, 0x00, 0x03, 0x52, 0x12, 0xe0,
+ 0xc0, 0x0f, 0x01, 0x11,
+ 0x00, 0xee, 0xd0, 0x01, 0x0e, 0xfc, 0x20, 0x40, 0x01, 0x0d, 0x0d, 0x20,
+ 0xfc, 0xde, 0x20, 0x40,
+ 0xc9, 0xbc, 0xf0, 0x22, 0x42, 0x00, 0x0f, 0x00, 0x23, 0x10, 0xfb, 0xdc,
+ 0x40, 0x12, 0xd0, 0xff,
+ 0x32, 0x21, 0xff, 0x8c, 0x0f, 0xf3, 0x05, 0x12, 0x00, 0xe2, 0x01, 0xe0,
+ 0xf1, 0xf2, 0x02, 0x01,
+ 0xcf, 0xf0, 0xf4, 0x33, 0xfb, 0xad, 0x13, 0x27, 0x10, 0xf1, 0xf1, 0x11,
+ 0x20, 0xf2, 0xf1, 0x20,
+ 0x42, 0xfd, 0xed, 0x20, 0x0c, 0x0c, 0x02, 0x52, 0xeb, 0xff, 0x21, 0x0e,
+ 0x1b, 0x52, 0x11, 0x00,
+ 0x09, 0x2f, 0x30, 0x70, 0xd0, 0xe0, 0x70, 0x41, 0xab, 0x1e, 0x11, 0x03,
+ 0xf0, 0x02, 0x01, 0x0e,
+ 0xfd, 0xff, 0x01, 0x14, 0x11, 0xe1, 0xe0, 0x01, 0x34, 0x0e, 0x99, 0x00,
+ 0x11, 0x02, 0x21, 0x11,
+ 0xff, 0x03, 0x23, 0x33, 0x47, 0x00, 0x0f, 0x0d, 0x20, 0x32, 0x01, 0x02,
+ 0x63, 0x21, 0xed, 0x0f,
+ 0x11, 0x56, 0x02, 0x00, 0x10, 0x64, 0xf0, 0xed, 0xf0, 0x04, 0xf0, 0xec,
+ 0xbd, 0x00, 0xcd, 0xdc,
+ 0x0f, 0xee, 0xf1, 0xf4, 0xd0, 0xcd, 0xfc, 0x20, 0x02, 0xf0, 0x0e, 0x2e,
+ 0xdc, 0xfc, 0x1f, 0x73,
+ 0x00, 0xf8, 0xee, 0x10, 0x31, 0x01, 0x10, 0x00, 0x53, 0x25, 0xef, 0xde,
+ 0x11, 0x03, 0x23, 0x02,
+ 0xd0, 0x0f, 0xcd, 0xfe, 0x0f, 0xdc, 0x0f, 0x00, 0x22, 0x11, 0x01, 0x10,
+ 0x2f, 0xf0, 0xcf, 0x23,
+ 0x36, 0x00, 0xcc, 0xd1, 0x13, 0xef, 0xab, 0x01, 0x24, 0xf0, 0xed, 0xe0,
+ 0x45, 0x32, 0xf0, 0xde,
+ 0x1f, 0x40, 0x34, 0x30, 0x01, 0x00, 0x01, 0x01, 0xfd, 0xff, 0x00, 0x22,
+ 0xee, 0xf1, 0x14, 0x40,
+ 0x2d, 0xf0, 0x00, 0x50, 0xfd, 0xf9, 0x00, 0x54, 0x0f, 0xdd, 0x10, 0xee,
+ 0xde, 0x20, 0x03, 0xce,
+ 0xdc, 0x0e, 0xf0, 0x1f, 0x10, 0xee, 0xdc, 0x0e, 0x00, 0xf0, 0x0f, 0xfe,
+ 0xcb, 0xfe, 0x01, 0x56,
+ 0xf0, 0xef, 0x00, 0x31, 0x04, 0x01, 0x02, 0x20, 0xf0, 0xfe, 0xef, 0x00,
+ 0x04, 0x62, 0x10, 0x02,
+ 0x01, 0x0f, 0x31, 0x17, 0x12, 0x32, 0x10, 0x1d, 0x03, 0x16, 0x21, 0xfe,
+ 0xdf, 0x20, 0x22, 0xf0,
+ 0x02, 0xf0, 0xb8, 0xf0, 0x00, 0x02, 0xcd, 0xdf, 0x13, 0x21, 0xed, 0x0b,
+ 0x00, 0xec, 0x0d, 0x00,
+ 0x20, 0x41, 0xde, 0xa9, 0x30, 0x00, 0xe1, 0x3e, 0x00, 0xe5, 0x01, 0xff,
+ 0xda, 0xaf, 0x0f, 0x00,
+ 0xf2, 0xdf, 0xfb, 0xc0, 0xc0, 0xed, 0x1f, 0x10, 0xde, 0x00, 0x16, 0x41,
+ 0x10, 0xce, 0x00, 0x64,
+ 0x02, 0x0e, 0xf9, 0xf0, 0x54, 0x10, 0xcf, 0x3e, 0x02, 0xf2, 0x00, 0x21,
+ 0x23, 0xd2, 0x16, 0x42,
+ 0xfe, 0xcb, 0x00, 0x01, 0x30, 0x51, 0xff, 0xdc, 0x0f, 0x4e, 0x10, 0x23,
+ 0x03, 0xe0, 0xcb, 0xe0,
+ 0x23, 0x51, 0xfe, 0xef, 0xf0, 0x03, 0x11, 0x3e, 0x0e, 0x22, 0x47, 0x00,
+ 0xec, 0x20, 0x43, 0x00,
+ 0xf2, 0x23, 0xe0, 0xed, 0x56, 0x12, 0xbf, 0xef, 0x00, 0x36, 0xf0, 0xcc,
+ 0xf0, 0x03, 0x00, 0x00,
+ 0xff, 0xed, 0x33, 0x03, 0x22, 0x54, 0x02, 0x0f, 0xec, 0xf0, 0x40, 0x19,
+ 0x00, 0xe0, 0x30, 0x5f,
+ 0xff, 0xee, 0x20, 0x25, 0x13, 0xf0, 0x00, 0x34, 0x23, 0xdf, 0x04, 0x34,
+ 0x00, 0x0f, 0x0e, 0xf0,
+ 0x00, 0x0f, 0x0b, 0x10, 0x31, 0x02, 0xdf, 0x0d, 0x30, 0x02, 0x00, 0x12,
+ 0x33, 0xe9, 0xee, 0xdd,
+ 0x10, 0x64, 0xec, 0xdd, 0x0e, 0x10, 0x1e, 0x0e, 0xdf, 0x10, 0x67, 0x11,
+ 0xff, 0xcc, 0x10, 0x11,
+ 0xf1, 0x01, 0x01, 0xe0, 0xe0, 0x0d, 0xf0, 0xf0, 0xf0, 0x02, 0x26, 0xf1,
+ 0xcf, 0x00, 0xe0, 0x03,
+ 0x57, 0x01, 0xee, 0xdf, 0x12, 0x11, 0xd0, 0xe0, 0x00, 0x14, 0x02, 0xf2,
+ 0x00, 0xf0, 0x07, 0x72,
+ 0x0d, 0x9e, 0x11, 0x15, 0x10, 0x00, 0xf0, 0x1e, 0x0d, 0xee, 0x00, 0x16,
+ 0x31, 0x0e, 0xfc, 0x00,
+ 0x43, 0x30, 0x2f, 0x4e, 0xec, 0x00, 0x74, 0x20, 0x0c, 0x10, 0x47, 0x00,
+ 0xfc, 0xf0, 0xf1, 0xef,
+ 0x0e, 0x11, 0x01, 0xf0, 0xe0, 0xe0, 0x0f, 0xdb, 0xdf, 0x11, 0x13, 0xdc,
+ 0xd0, 0x04, 0xbe, 0x0d,
+ 0xf0, 0x01, 0xf2, 0x03, 0x0f, 0x0e, 0x14, 0x45, 0x01, 0x00, 0x2f, 0x10,
+ 0x10, 0x20, 0x31, 0x64,
+ 0x00, 0x0b, 0x12, 0x42, 0x00, 0xf0, 0x04, 0x56, 0xf0, 0xf0, 0xfd, 0xe0,
+ 0x00, 0xe0, 0xac, 0x00,
+ 0x02, 0xfe, 0xb9, 0xf0, 0xe0, 0x03, 0xed, 0xdc, 0xcf, 0xdf, 0x0e, 0x11,
+ 0xf0, 0xee, 0x0d, 0x0d,
+ 0x1a, 0x20, 0x21, 0x0f, 0x0d, 0x2f, 0x10, 0xf0, 0x02, 0x46, 0x32, 0x21,
+ 0xfe, 0xdc, 0x10, 0x12,
+ 0x23, 0x00, 0xd0, 0x0b, 0x0e, 0x10, 0x1f, 0x0f, 0xcd, 0xed, 0xf0, 0x01,
+ 0x07, 0x31, 0x01, 0x00,
+ 0x13, 0x02, 0x0f, 0xcb, 0x00, 0x11, 0x01, 0x01, 0xf0, 0xef, 0x00, 0x23,
+ 0x14, 0x0e, 0xf2, 0x57,
+ 0x14, 0xee, 0x0e, 0xf0, 0x00, 0x22, 0x33, 0x42, 0x1f, 0xa8, 0x0e, 0x01,
+ 0x33, 0x30, 0x00, 0x00,
+ 0x00, 0xef, 0x0e, 0x51, 0x0f, 0xfe, 0x01, 0x33, 0x0c, 0x0e, 0x13, 0x33,
+ 0xfe, 0xbf, 0xea, 0xee,
+ 0x00, 0x11, 0xde, 0xf0, 0x00, 0x10, 0x01, 0xff, 0xd8, 0xef, 0x21, 0x32,
+ 0x00, 0xf0, 0xff, 0xbb,
+ 0xf0, 0x21, 0x24, 0x00, 0xe0, 0x21, 0x54, 0xf0, 0x0d, 0x01, 0x43, 0x02,
+ 0xb0, 0x20, 0x61, 0xf5,
+ 0xf0, 0x3f, 0x02, 0x02, 0xdd, 0x00, 0x47, 0x32, 0xf1, 0xe2, 0xf0, 0x21,
+ 0x20, 0xf0, 0x05, 0x31,
+ 0x0f, 0x00, 0x10, 0x02, 0x02, 0x0e, 0xdc, 0xbe, 0x1e, 0x01, 0xb2, 0x10,
+ 0x10, 0x10, 0x0c, 0xfe,
+ 0xfa, 0xff, 0x40, 0x73, 0x00, 0xc8, 0x0f, 0x00, 0x11, 0x00, 0xdc, 0x12,
+ 0x00, 0xb0, 0x0e, 0xef,
+ 0x0f, 0xef, 0xde, 0xe0, 0xef, 0xff, 0xee, 0xdf, 0x0f, 0xff, 0xb8, 0xf0,
+ 0x20, 0x43, 0xde, 0x10,
+ 0x77, 0x00, 0x20, 0xed, 0x0f, 0x11, 0x30, 0x13, 0x10, 0x00, 0xdd, 0xec,
+ 0x12, 0x43, 0xb0, 0xf1,
+ 0x24, 0x00, 0xc9, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x23, 0x00, 0xb8, 0x00,
+ 0xf0, 0xff, 0x12, 0x00,
+ 0xcf, 0xfd, 0xf2, 0x24, 0x0f, 0xd8, 0x10, 0x41, 0x11, 0x1f, 0x0f, 0x43,
+ 0x43, 0x04, 0xde, 0x0d,
+ 0x3f, 0x00, 0x03, 0xe0, 0xed, 0x00, 0x00, 0x10, 0x25, 0xcf, 0xfe, 0x01,
+ 0x02, 0xf2, 0xce, 0xf0,
+ 0xe0, 0xf3, 0x05, 0x01, 0xf0, 0xdb, 0x11, 0x12, 0x10, 0x00, 0x20, 0x30,
+ 0x11, 0x1f, 0x09, 0x10,
+ 0x30, 0x30, 0x24, 0x00, 0xd0, 0x00, 0x13, 0x24, 0x23, 0x35, 0x03, 0xcd,
+ 0xfe, 0x02, 0x32, 0x20,
+ 0x2e, 0x01, 0x23, 0x10, 0x1e, 0xfc, 0xf1, 0x24, 0x11, 0xff, 0xd0, 0xff,
+ 0xf1, 0x14, 0x32, 0x20,
+ 0xf8, 0x8e, 0x00, 0x10, 0x30, 0x0d, 0xcd, 0x0e, 0x00, 0x20, 0xfd, 0xfe,
+ 0x11, 0x43, 0x12, 0x24,
+ 0x0e, 0x0c, 0xfe, 0x0d, 0x01, 0x00, 0xf0, 0x00, 0xe0, 0xed, 0xdf, 0x00,
+ 0xe0, 0xd0, 0xd1, 0xf1,
+ 0x17, 0x24, 0x0f, 0xbf, 0x20, 0x22, 0xff, 0xe1, 0x34, 0xf0, 0xdc, 0x02,
+ 0x04, 0xf0, 0xf0, 0x11,
+ 0x04, 0xf1, 0xce, 0xfe, 0xf2, 0xf0, 0x00, 0x12, 0x24, 0x1d, 0x0a, 0x0f,
+ 0x2f, 0x31, 0x11, 0xff,
+ 0x2e, 0x1d, 0x2f, 0x42, 0x10, 0x0d, 0x1f, 0x1f, 0x2f, 0x2e, 0x4e, 0x22,
+ 0x14, 0x11, 0x33, 0xfd,
+ 0xec, 0x00, 0x0f, 0xfe, 0xe0, 0x01, 0x01, 0x03, 0x0f, 0xef, 0x10, 0x00,
+ 0xe2, 0x01, 0x00, 0xf0,
+ 0xce, 0xdf, 0x01, 0x05, 0x11, 0x00, 0xd0, 0x21, 0x25, 0xee, 0xdd, 0x77,
+ 0x63, 0x0e, 0xff, 0x00,
+ 0x10, 0x31, 0x23, 0x14, 0x0e, 0xff, 0x0f, 0x11, 0x00, 0xf3, 0x05, 0xfe,
+ 0xf2, 0xf4, 0xe1, 0xec,
+ 0xee, 0xf0, 0x02, 0x13, 0xfd, 0xbb, 0x0f, 0xf0, 0xf0, 0xe1, 0xdf, 0xed,
+ 0xff, 0xfc, 0xfd, 0xef,
+ 0x21, 0x10, 0x2e, 0x10, 0x10, 0x21, 0x0e, 0xfa, 0xe0, 0xf1, 0xf1, 0xf0,
+ 0x10, 0x23, 0x31, 0xfd,
+ 0xdd, 0x10, 0x33, 0x10, 0x0e, 0x10, 0xff, 0x00, 0x10, 0x04, 0x00, 0xde,
+ 0xcb, 0xe0, 0xf2, 0xdf,
+ 0x00, 0x37, 0x12, 0xf0, 0xef, 0x0f, 0x0e, 0xe0, 0x32, 0x41, 0xed, 0xdd,
+ 0x01, 0x25, 0x43, 0xf0,
+ 0xcf, 0x14, 0x00, 0xde, 0xe0, 0xf0, 0xaf, 0x00, 0x72, 0xe2, 0x01, 0x10,
+ 0x0c, 0x0e, 0x0e, 0x24,
+ 0x25, 0x51, 0xf0, 0xef, 0x00, 0x20, 0x01, 0x03, 0x00, 0x0b, 0xf0, 0x20,
+ 0x00, 0x00, 0x61, 0x01,
+ 0xca, 0x0e, 0xfe, 0x00, 0x00, 0x0f, 0xdc, 0x0e, 0x00, 0xff, 0x2a, 0xfe,
+ 0xc0, 0x10, 0x2f, 0xed,
+ 0xf0, 0xee, 0xfb, 0xe0, 0x23, 0x05, 0xbf, 0x00, 0x21, 0x02, 0xd0, 0xee,
+ 0x21, 0x26, 0x00, 0x0d,
+ 0x00, 0x10, 0x35, 0x41, 0x10, 0x0f, 0x22, 0xf1, 0xe0, 0x57, 0x03, 0x01,
+ 0x01, 0x01, 0x00, 0x03,
+ 0x33, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x2d, 0x01, 0xd0, 0xcc, 0x00, 0x14,
+ 0xeb, 0xbf, 0x11, 0x10,
+ 0x00, 0x00, 0x0d, 0x21, 0x22, 0xfd, 0xed, 0xfb, 0x0f, 0x00, 0xe1, 0xff,
+ 0xd9, 0xff, 0x30, 0x01,
+ 0xc1, 0x0e, 0xbd, 0xfe, 0xfd, 0xde, 0x20, 0xff, 0xac, 0x11, 0x02, 0xda,
+ 0xeb, 0xc0, 0x20, 0x32,
+ 0xe0, 0xcf, 0x00, 0x21, 0x54, 0x01, 0x00, 0x12, 0x74, 0xff, 0xfe, 0x10,
+ 0x31, 0x00, 0x00, 0x20,
+ 0x00, 0x02, 0x00, 0xf3, 0xf4, 0x13, 0x10, 0xec, 0xcf, 0xfa, 0x01, 0x53,
+ 0x00, 0xca, 0x00, 0x20,
+ 0x20, 0x00, 0xef, 0x0f, 0x11, 0x14, 0x00, 0xfd, 0x0f, 0x33, 0x02, 0x00,
+ 0x2d, 0x01, 0x56, 0x11,
+ 0x10, 0x0f, 0xfe, 0xf0, 0x22, 0x00, 0xa0, 0x00, 0x41, 0xe1, 0xdf, 0x11,
+ 0x27, 0x12, 0xa0, 0x0e,
+ 0x13, 0xf1, 0xdf, 0xed, 0x24, 0x13, 0xfd, 0x00, 0x21, 0xfc, 0x0f, 0x2e,
+ 0x10, 0x13, 0x00, 0x1c,
+ 0x1e, 0x50, 0x35, 0x01, 0xee, 0x10, 0x35, 0x00, 0xbe, 0x00, 0x21, 0x02,
+ 0x03, 0xf0, 0x10, 0x0d,
+ 0x00, 0x00, 0x10, 0x33, 0x45, 0x01, 0x00, 0x20, 0x1e, 0xe2, 0x04, 0xf0,
+ 0x0f, 0x40, 0xff, 0xbe,
+ 0x01, 0x43, 0xff, 0xf9, 0x0f, 0x00, 0x0f, 0x1e, 0x31, 0xff, 0xce, 0x2e,
+ 0x0e, 0xeb, 0xff, 0x2f,
+ 0x30, 0xf3, 0x15, 0x0e, 0xda, 0x10, 0x32, 0x0f, 0xac, 0x01, 0x03, 0x00,
+ 0xed, 0xdd, 0x01, 0xf3,
+ 0xc2, 0xe0, 0x00, 0x02, 0x15, 0x21, 0xe4, 0x40, 0x10, 0x02, 0x04, 0xfe,
+ 0xec, 0x01, 0x25, 0x11,
+ 0xf1, 0xe1, 0x01, 0xcf, 0x00, 0xf5, 0xe0, 0xcf, 0x0f, 0xef, 0x00, 0x55,
+ 0x11, 0x0e, 0xfe, 0x41,
+ 0x35, 0x10, 0x0c, 0x31, 0x11, 0x00, 0x0f, 0x30, 0x1f, 0x1d, 0x52, 0x02,
+ 0x0d, 0xeb, 0x60, 0x36,
+ 0x11, 0x0f, 0xff, 0x00, 0x40, 0xe0, 0xed, 0xee, 0x00, 0x00, 0xef, 0xee,
+ 0x0d, 0x0e, 0xed, 0xdd,
+ 0x11, 0x16, 0xae, 0xed, 0x04, 0xe2, 0xd0, 0x00, 0x01, 0xe0, 0x12, 0x42,
+ 0xff, 0xac, 0x13, 0x77,
+ 0x10, 0xee, 0x20, 0x3f, 0xf0, 0x04, 0x11, 0x32, 0x00, 0x02, 0x01, 0xf3,
+ 0xf1, 0x04, 0xf2, 0xdf,
+ 0xf0, 0x00, 0xdc, 0x01, 0x00, 0xee, 0xec, 0x0e, 0x0d, 0xbc, 0xcd, 0x2f,
+ 0x30, 0xa1, 0x0f, 0xfa,
+ 0xff, 0xe0, 0x02, 0x01, 0x0e, 0xfb, 0x00, 0x20, 0x12, 0x00, 0x0e, 0x2e,
+ 0x0f, 0xdc, 0x1f, 0x10,
+ 0x20, 0x0f, 0x11, 0x33, 0x40, 0xf0, 0xd1, 0x10, 0x1c, 0xe0, 0x03, 0x01,
+ 0x0e, 0x0d, 0xc1, 0x12,
+ 0x00, 0xae, 0xfb, 0x0f, 0x03, 0x36, 0x01, 0x20, 0x32, 0x00, 0x01, 0x10,
+ 0x20, 0xf2, 0xe2, 0x12,
+ 0x43, 0x01, 0xbe, 0xfb, 0xf0, 0x01, 0x02, 0xf3, 0xe0, 0xfd, 0xff, 0xff,
+ 0x33, 0x73, 0x0e, 0xeb,
+ 0x11, 0x33, 0x20, 0x10, 0x02, 0x22, 0x12, 0xfd, 0xdc, 0xfd, 0x43, 0x14,
+ 0xf0, 0x0f, 0x1f, 0x30,
+ 0x01, 0x10, 0x0e, 0xdf, 0x0f, 0x00, 0xee, 0x0f, 0x0c, 0xcb, 0xe0, 0x40,
+ 0x22, 0xef, 0xec, 0x0f,
+ 0x0f, 0x01, 0x04, 0x02, 0xf0, 0xcf, 0x0f, 0x21, 0x00, 0xc0, 0x11, 0x77,
+ 0xf0, 0xeb, 0x00, 0x40,
+ 0x13, 0x11, 0x10, 0x0f, 0xf0, 0x10, 0x11, 0x36, 0x12, 0x20, 0xdf, 0xe0,
+ 0x25, 0x02, 0xe0, 0xfe,
+ 0xdf, 0x10, 0x56, 0x13, 0x10, 0xe0, 0x00, 0xf0, 0xfe, 0x42, 0xe1, 0x90,
+ 0x33, 0x34, 0xbc, 0x0b,
+ 0xf0, 0x21, 0x22, 0xf0, 0x0e, 0x3e, 0x0f, 0x10, 0x2e, 0xe0, 0x01, 0x0e,
+ 0xff, 0xbf, 0xec, 0xfd,
+ 0xfd, 0xef, 0xe0, 0x33, 0x0c, 0x8a, 0x00, 0x00, 0x00, 0x0d, 0x01, 0x00,
+ 0xcc, 0x0d, 0xff, 0xdf,
+ 0xee, 0xef, 0x00, 0x0f, 0xd0, 0x00, 0x10, 0x20, 0x24, 0x41, 0x21, 0x0d,
+ 0x3f, 0x43, 0x27, 0x20,
+ 0x0f, 0xce, 0x00, 0xf0, 0x00, 0xef, 0xcf, 0x02, 0x12, 0xef, 0xbc, 0x0d,
+ 0x0f, 0xef, 0x0f, 0x10,
+ 0x35, 0xe0, 0xed, 0x1f, 0x03, 0xf1, 0x02, 0xf2, 0xcf, 0x0b, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x88, 0x13, 0xa4, 0x0f, 0xc4, 0x14, 0x10, 0x11, 0x42, 0x01, 0xef, 0x4e,
+ 0x1e, 0x22, 0x31, 0xf0,
+ 0x22, 0x20, 0x01, 0x12, 0xd0, 0xe0, 0xf0, 0xcf, 0x0f, 0x11, 0xf1, 0xef,
+ 0xfe, 0x02, 0x12, 0xef,
+ 0xf1, 0x01, 0x00, 0xe0, 0xf0, 0x0f, 0x00, 0x14, 0x0f, 0xed, 0x01, 0x2e,
+ 0x00, 0x33, 0x23, 0x00,
+ 0x10, 0x30, 0xfe, 0xef, 0x11, 0x11, 0x22, 0x02, 0x05, 0xf0, 0x00, 0x24,
+ 0x00, 0x00, 0x33, 0x10,
+ 0x10, 0x20, 0x30, 0x34, 0x21, 0x12, 0x00, 0xfc, 0x11, 0x25, 0xe0, 0xdf,
+ 0xfd, 0xe0, 0xf3, 0xf2,
+ 0x01, 0x1f, 0x0d, 0x00, 0x00, 0x0d, 0x10, 0x20, 0x2e, 0x21, 0x0f, 0x0a,
+ 0xee, 0xfd, 0x20, 0x45,
+ 0x00, 0x0d, 0xbd, 0x01, 0x34, 0x01, 0xbc, 0xee, 0x00, 0x10, 0xdb, 0xff,
+ 0xf0, 0xf1, 0x01, 0xde,
+ 0xdf, 0x23, 0x24, 0x12, 0x03, 0xf0, 0x04, 0x30, 0x00, 0x05, 0x13, 0xef,
+ 0xe0, 0xe1, 0xf0, 0xdc,
+ 0xcd, 0xf1, 0x07, 0x01, 0xe0, 0x00, 0xfe, 0xde, 0x02, 0x12, 0x32, 0x00,
+ 0x2f, 0x1f, 0x3c, 0x0e,
+ 0x41, 0x12, 0x10, 0x2d, 0x0f, 0x0e, 0x00, 0x30, 0x3f, 0x0f, 0x24, 0x42,
+ 0x0f, 0x3d, 0x43, 0x33,
+ 0x00, 0x0f, 0x00, 0x00, 0x0b, 0x0f, 0xee, 0xe0, 0xf0, 0x23, 0x02, 0xce,
+ 0xff, 0xe0, 0x00, 0xbf,
+ 0x02, 0xf6, 0xf0, 0x02, 0xc0, 0xdb, 0x00, 0x31, 0x44, 0x0e, 0xfd, 0x2f,
+ 0x40, 0x41, 0x57, 0x13,
+ 0x10, 0x0e, 0x0f, 0x12, 0x52, 0x05, 0x00, 0x03, 0x20, 0xf0, 0x01, 0xd0,
+ 0xde, 0x01, 0x33, 0x02,
+ 0xfe, 0xda, 0xff, 0x0f, 0x20, 0x15, 0x11, 0xfe, 0xcb, 0xd0, 0x12, 0x10,
+ 0xde, 0xd0, 0xf0, 0xf0,
+ 0xf1, 0xed, 0x0d, 0x00, 0x1d, 0xff, 0x0e, 0x12, 0x64, 0x00, 0x2d, 0x00,
+ 0xe0, 0xea, 0x10, 0x32,
+ 0xf0, 0xef, 0x0d, 0x12, 0x37, 0x00, 0xdf, 0xcd, 0xef, 0x00, 0x01, 0xe0,
+ 0xf0, 0xf0, 0x00, 0xe0,
+ 0xcd, 0xea, 0x12, 0x43, 0x12, 0xf0, 0x03, 0x20, 0x20, 0x21, 0x34, 0x00,
+ 0xf0, 0xd0, 0x01, 0x00,
+ 0x00, 0xff, 0xcb, 0xdf, 0x01, 0x15, 0xff, 0xde, 0xee, 0xe0, 0x25, 0x42,
+ 0x20, 0x20, 0x2f, 0x10,
+ 0x23, 0x00, 0x22, 0x13, 0x01, 0xf0, 0xcd, 0x0e, 0x01, 0x02, 0x12, 0x03,
+ 0x0e, 0x0a, 0x00, 0xf0,
+ 0x40, 0x20, 0x00, 0x0e, 0x2d, 0x0c, 0x0e, 0xea, 0xde, 0x20, 0x41, 0xf0,
+ 0xdd, 0x0e, 0xee, 0xec,
+ 0xcf, 0xe0, 0x03, 0x00, 0x0f, 0xde, 0x0f, 0x00, 0x21, 0xf0, 0x0f, 0x10,
+ 0x0e, 0xf0, 0x02, 0x34,
+ 0x24, 0x12, 0xff, 0xed, 0xff, 0x11, 0x55, 0x13, 0x13, 0xf0, 0xef, 0x25,
+ 0x12, 0x02, 0xe0, 0xf2,
+ 0x23, 0x11, 0x01, 0x00, 0xee, 0xfc, 0x33, 0x52, 0xff, 0xef, 0x00, 0x00,
+ 0x30, 0x0e, 0x01, 0xe2,
+ 0x0f, 0x20, 0x00, 0xcf, 0x01, 0x01, 0x0f, 0xee, 0xf0, 0x0c, 0x0e, 0x00,
+ 0xff, 0xdb, 0x0e, 0x1f,
+ 0x0e, 0xf0, 0xdd, 0x0f, 0x00, 0xe0, 0xf1, 0xdc, 0xbb, 0xff, 0xf0, 0x0f,
+ 0xbe, 0xdb, 0x0e, 0xef,
+ 0xfe, 0x0f, 0x10, 0x00, 0x20, 0x24, 0x44, 0x23, 0x23, 0x20, 0x21, 0x44,
+ 0x02, 0xf0, 0x13, 0x0f,
+ 0x1e, 0x00, 0xef, 0xed, 0xfe, 0x00, 0xf1, 0x01, 0x10, 0xe1, 0x02, 0x01,
+ 0x00, 0x0e, 0x10, 0x13,
+ 0x00, 0xed, 0xff, 0x31, 0x10, 0x00, 0x00, 0xdd, 0xfc, 0xfd, 0x20, 0x32,
+ 0x22, 0x10, 0x32, 0x00,
+ 0x10, 0x20, 0x04, 0x35, 0x00, 0xcd, 0x11, 0x03, 0x00, 0xc0, 0x00, 0x00,
+ 0x24, 0xde, 0xbc, 0x01,
+ 0x37, 0xc0, 0xe0, 0x00, 0x21, 0x00, 0x0f, 0x03, 0x31, 0xfd, 0xfe, 0x20,
+ 0x34, 0x0e, 0x0b, 0x00,
+ 0x42, 0x02, 0xfe, 0x10, 0x40, 0xff, 0xec, 0x23, 0x22, 0x00, 0xe0, 0x0e,
+ 0x00, 0x01, 0x00, 0xf2,
+ 0x14, 0x31, 0x10, 0xf0, 0x0e, 0x30, 0x13, 0x13, 0x46, 0x20, 0xdf, 0xde,
+ 0x11, 0x56, 0x01, 0xff,
+ 0xfe, 0x00, 0xe1, 0x0e, 0x01, 0x20, 0x10, 0x00, 0x01, 0x2e, 0x2c, 0x1f,
+ 0x21, 0x12, 0x1d, 0xfc,
+ 0xdd, 0x0c, 0x0e, 0x0f, 0xef, 0xe0, 0x02, 0x1f, 0xff, 0xcb, 0xf0, 0x01,
+ 0xe0, 0xca, 0x00, 0x01,
+ 0xd0, 0xed, 0x21, 0x25, 0x02, 0x00, 0x11, 0x00, 0x13, 0x12, 0x13, 0x33,
+ 0x03, 0xd0, 0xd0, 0x10,
+ 0x33, 0xf1, 0xd1, 0xe0, 0xcd, 0xf1, 0x17, 0x00, 0xef, 0xef, 0xe0, 0x0f,
+ 0x02, 0xf2, 0x00, 0x4f,
+ 0x10, 0x32, 0x11, 0xfe, 0x20, 0x31, 0x22, 0x10, 0x00, 0xfe, 0x00, 0x30,
+ 0x44, 0x22, 0x0f, 0xcc,
+ 0x4f, 0x30, 0x34, 0x41, 0x1e, 0x0e, 0x1f, 0x0d, 0x0e, 0xfe, 0xfe, 0x00,
+ 0x04, 0xdf, 0xbd, 0x0f,
+ 0xd0, 0xd0, 0xbc, 0xef, 0x02, 0xf0, 0xf0, 0x00, 0xd9, 0x10, 0x32, 0x21,
+ 0x30, 0x0e, 0xee, 0x0f,
+ 0x42, 0x37, 0x01, 0x22, 0x12, 0xfe, 0x00, 0x04, 0x44, 0x00, 0x0f, 0xe0,
+ 0x32, 0x21, 0x00, 0xf0,
+ 0x14, 0x32, 0xf0, 0xc8, 0x0f, 0x0f, 0x00, 0x00, 0x05, 0x0f, 0xcc, 0xdf,
+ 0xf0, 0x00, 0xdf, 0xcf,
+ 0xf0, 0x00, 0xcf, 0xed, 0x0f, 0xfd, 0x10, 0x11, 0x12, 0x20, 0xdd, 0xfd,
+ 0x43, 0x47, 0x0f, 0xec,
+ 0x0f, 0x10, 0x31, 0xf0, 0xee, 0x22, 0x12, 0x10, 0x00, 0xe0, 0xef, 0x00,
+ 0xcd, 0xee, 0x01, 0x00,
+ 0xe0, 0x00, 0x0e, 0x00, 0x20, 0x02, 0x14, 0x21, 0x11, 0x13, 0x13, 0x03,
+ 0x12, 0x43, 0x03, 0xef,
+ 0xec, 0x00, 0x13, 0xe0, 0xba, 0x0f, 0xe0, 0x00, 0x00, 0x01, 0xf1, 0xe0,
+ 0xfd, 0x00, 0x20, 0x31,
+ 0x45, 0x34, 0x20, 0x0f, 0xff, 0x00, 0x10, 0x10, 0xee, 0xf0, 0x01, 0x02,
+ 0x10, 0x2e, 0x02, 0x11,
+ 0xfd, 0x0d, 0x12, 0x54, 0x00, 0x0e, 0x0e, 0x00, 0x12, 0xfe, 0xfa, 0xef,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x10, 0xed, 0xdd, 0x01, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f,
+ 0x10, 0x34, 0x01, 0xed,
+ 0x00, 0x33, 0x31, 0x12, 0x20, 0xfd, 0xee, 0x02, 0x57, 0x12, 0x00, 0xd0,
+ 0xef, 0xd0, 0x01, 0x05,
+ 0xf1, 0xef, 0xf0, 0xf1, 0xe0, 0x31, 0x11, 0x00, 0x03, 0x3f, 0x1f, 0x1e,
+ 0x44, 0x26, 0x00, 0x01,
+ 0x20, 0x01, 0x00, 0x0e, 0xed, 0x00, 0x01, 0x1f, 0x12, 0x00, 0xfc, 0xee,
+ 0x21, 0x45, 0x01, 0x1f,
+ 0xea, 0xdf, 0x10, 0x0d, 0xf0, 0xe0, 0xe0, 0xec, 0xee, 0xcd, 0xeb, 0xde,
+ 0xed, 0xce, 0xfe, 0xcc,
+ 0xfe, 0x0e, 0xf2, 0x01, 0x10, 0xfe, 0xef, 0x0f, 0x31, 0x54, 0x15, 0x31,
+ 0x00, 0xf0, 0x1f, 0x30,
+ 0x2e, 0x0f, 0xf0, 0x13, 0x22, 0xfd, 0xdc, 0xef, 0xee, 0x03, 0xf4, 0xd2,
+ 0xd0, 0xff, 0xdc, 0xf0,
+ 0x23, 0x55, 0x00, 0xfe, 0xcd, 0x0e, 0x0d, 0x0e, 0x0e, 0x10, 0xff, 0x01,
+ 0x01, 0x0e, 0xff, 0x03,
+ 0x34, 0x02, 0x00, 0x2e, 0x21, 0x02, 0x20, 0x0e, 0x00, 0x11, 0xf0, 0xec,
+ 0x01, 0xf1, 0x01, 0x10,
+ 0xcf, 0xf0, 0xf0, 0xe1, 0xee, 0xf0, 0x14, 0x11, 0x0f, 0x10, 0x13, 0xff,
+ 0xeb, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x01, 0x12, 0xe0, 0x01, 0x22, 0x0f, 0xfe, 0x00, 0x22, 0x35,
+ 0x30, 0x00, 0x02, 0x43,
+ 0x21, 0x00, 0x01, 0x14, 0x11, 0x10, 0x10, 0x0e, 0xcf, 0x13, 0x56, 0x0f,
+ 0x0f, 0xf0, 0x10, 0x06,
+ 0x00, 0x01, 0x10, 0x0e, 0x00, 0xef, 0x12, 0x23, 0x22, 0x0d, 0xce, 0x0f,
+ 0x2e, 0x41, 0x14, 0x1f,
+ 0xfe, 0xdb, 0x0d, 0x0e, 0x10, 0x0e, 0x0d, 0xde, 0x00, 0x02, 0xff, 0x0f,
+ 0x00, 0x11, 0xdc, 0xbb,
+ 0x0f, 0xfe, 0x11, 0x21, 0xe0, 0xf0, 0xe0, 0xf0, 0x10, 0x12, 0x03, 0xf2,
+ 0xe1, 0xf2, 0x37, 0x22,
+ 0xef, 0xd0, 0xf0, 0x13, 0x12, 0xef, 0xd8, 0xe0, 0x0f, 0x00, 0x13, 0xe0,
+ 0xde, 0xdf, 0x0f, 0x0f,
+ 0xf1, 0xf2, 0x31, 0x30, 0x10, 0x11, 0x30, 0x52, 0x01, 0x0c, 0x10, 0x10,
+ 0x20, 0x0c, 0x2f, 0x41,
+ 0x13, 0x01, 0x20, 0x4f, 0x53, 0x00, 0x0a, 0x00, 0x32, 0xf1, 0x03, 0x21,
+ 0xf0, 0xde, 0xe0, 0xef,
+ 0xcd, 0xe0, 0xd1, 0xf0, 0xda, 0x00, 0x02, 0x00, 0x0f, 0x1f, 0xfd, 0xff,
+ 0x20, 0x22, 0x33, 0x23,
+ 0x13, 0x00, 0x00, 0x20, 0x02, 0x04, 0x22, 0x00, 0xff, 0x44, 0x43, 0x1f,
+ 0x0f, 0x01, 0x33, 0x10,
+ 0x0f, 0x01, 0x02, 0x01, 0x00, 0xf1, 0x22, 0xdd, 0xca, 0xf0, 0x14, 0x00,
+ 0xed, 0xee, 0x00, 0x02,
+ 0x1f, 0x00, 0xef, 0xfe, 0x00, 0x0f, 0xf1, 0x21, 0x1e, 0xfd, 0x00, 0x20,
+ 0x0f, 0x01, 0x13, 0x21,
+ 0x02, 0x0d, 0xd9, 0x10, 0x30, 0xe2, 0xff, 0x0f, 0x0f, 0xdf, 0x00, 0xf0,
+ 0xff, 0x00, 0xc0, 0xfe,
+ 0xe0, 0xeb, 0xed, 0x00, 0x27, 0x31, 0xff, 0xd0, 0x20, 0x11, 0x12, 0x02,
+ 0xf2, 0xf1, 0x01, 0x24,
+ 0x42, 0xfe, 0xde, 0x0f, 0x00, 0x0f, 0x1e, 0x0d, 0xcd, 0x0f, 0x03, 0x14,
+ 0xf2, 0xef, 0xde, 0xf0,
+ 0x00, 0x02, 0x01, 0x42, 0x15, 0x20, 0x00, 0x0d, 0xee, 0xff, 0x10, 0x04,
+ 0x11, 0x02, 0xee, 0xfe,
+ 0x21, 0x24, 0x00, 0xed, 0x20, 0x52, 0x0f, 0x0b, 0x0e, 0x20, 0x21, 0x20,
+ 0xfa, 0xee, 0x0e, 0x0f,
+ 0xdf, 0xff, 0xf2, 0xf0, 0xc8, 0x00, 0x00, 0xef, 0xf0, 0x00, 0x02, 0x1f,
+ 0x0c, 0x0e, 0x2e, 0x0f,
+ 0x33, 0x24, 0xef, 0x0f, 0xf2, 0xf0, 0x04, 0x03, 0x00, 0xe0, 0x14, 0x01,
+ 0x01, 0x03, 0xe0, 0x12,
+ 0x22, 0x34, 0x12, 0x0f, 0xfe, 0x01, 0xf2, 0x01, 0x00, 0x00, 0xf1, 0xf1,
+ 0x00, 0x01, 0x41, 0x01,
+ 0x01, 0xe0, 0x1f, 0x10, 0x0e, 0xf0, 0x24, 0x02, 0x1f, 0xfb, 0xdf, 0xee,
+ 0x12, 0x45, 0x00, 0x00,
+ 0x01, 0x00, 0x1e, 0xfc, 0xde, 0x0d, 0xeb, 0x0f, 0xed, 0xde, 0xff, 0xef,
+ 0xdc, 0xef, 0xee, 0xcd,
+ 0xed, 0xdc, 0xfe, 0xdf, 0x00, 0x21, 0x02, 0x11, 0xff, 0x0b, 0x0f, 0x21,
+ 0x12, 0x02, 0x13, 0x41,
+ 0x11, 0x30, 0x03, 0x33, 0x00, 0x01, 0x01, 0x22, 0xf0, 0xec, 0x00, 0x04,
+ 0xf0, 0xc1, 0xff, 0x02,
+ 0x12, 0xdb, 0xde, 0x10, 0x33, 0x11, 0x0d, 0x0e, 0x10, 0x1e, 0x0d, 0x01,
+ 0x23, 0x0f, 0xed, 0x0f,
+ 0x2f, 0x11, 0x04, 0x00, 0x2e, 0x22, 0x01, 0xcf, 0x10, 0x64, 0x03, 0xff,
+ 0xef, 0x0e, 0xf1, 0x03,
+ 0x03, 0x02, 0xe0, 0xee, 0x01, 0x00, 0x00, 0xfd, 0xf1, 0x03, 0x21, 0x20,
+ 0x12, 0x10, 0x0e, 0xda,
+ 0x00, 0x24, 0x20, 0x00, 0xff, 0xfe, 0x00, 0xff, 0x00, 0x32, 0x10, 0x0e,
+ 0x0e, 0x0e, 0x11, 0x32,
+ 0x25, 0x21, 0x20, 0x10, 0xfd, 0xf0, 0x04, 0x03, 0x02, 0x0e, 0xdd, 0x00,
+ 0x00, 0x03, 0x15, 0x31,
+ 0x11, 0x00, 0x00, 0x54, 0x00, 0x10, 0x25, 0x20, 0xf0, 0xee, 0x00, 0x21,
+ 0x00, 0x0f, 0x0f, 0x2f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x0d, 0xdd, 0xfc, 0xfd, 0xee, 0x0f,
+ 0x12, 0xff, 0xfc, 0xf0,
+ 0xe1, 0xec, 0xfc, 0xf0, 0x00, 0xf0, 0x1d, 0x00, 0x02, 0x00, 0x00, 0x04,
+ 0x23, 0xf1, 0xe2, 0xf2,
+ 0x12, 0x12, 0x22, 0x01, 0xd1, 0xf1, 0x12, 0x21, 0x0f, 0xec, 0xe1, 0xf1,
+ 0xdf, 0xdf, 0xf0, 0x03,
+ 0x03, 0xe0, 0x02, 0x0f, 0x01, 0x14, 0x1e, 0x0c, 0x10, 0x23, 0x22, 0x20,
+ 0x32, 0x00, 0xfc, 0xee,
+ 0x3f, 0x52, 0x24, 0x10, 0x21, 0x43, 0x32, 0x11, 0x20, 0x0f, 0xfe, 0x00,
+ 0x01, 0x00, 0xe0, 0xfc,
+ 0xff, 0xde, 0xfe, 0xde, 0xcf, 0xfc, 0xf0, 0x0f, 0xfd, 0xef, 0x00, 0x32,
+ 0x11, 0xff, 0xdc, 0xee,
+ 0xef, 0x23, 0x57, 0x00, 0xed, 0xf0, 0x01, 0x02, 0x14, 0x12, 0x10, 0x02,
+ 0x21, 0x22, 0x11, 0x21,
+ 0x46, 0x21, 0x22, 0x0f, 0x0f, 0x1d, 0x00, 0xd2, 0x05, 0x0f, 0xda, 0xef,
+ 0xe0, 0xef, 0xf0, 0xf0,
+ 0xef, 0xfd, 0xf0, 0xfe, 0xee, 0x0e, 0x10, 0x00, 0xf0, 0x0f, 0x0c, 0x0e,
+ 0x00, 0x13, 0x44, 0x0e,
+ 0xdc, 0x00, 0x02, 0x24, 0x0e, 0x00, 0x13, 0x00, 0xfc, 0xef, 0x0e, 0xec,
+ 0x00, 0x03, 0x2f, 0x0e,
+ 0xff, 0xf0, 0x01, 0x00, 0xde, 0xf0, 0x01, 0x13, 0x12, 0x13, 0x00, 0xf0,
+ 0xd0, 0x00, 0x32, 0xef,
+ 0xd0, 0x00, 0x34, 0x34, 0x10, 0xec, 0xe0, 0x00, 0x31, 0x01, 0xf0, 0xff,
+ 0xf0, 0xce, 0x00, 0x01,
+ 0x21, 0x00, 0xef, 0x0e, 0x00, 0x11, 0x43, 0x00, 0x12, 0x12, 0x00, 0xfd,
+ 0xf0, 0x01, 0x03, 0x10,
+ 0xff, 0xfe, 0x00, 0x20, 0x01, 0x31, 0x30, 0x20, 0x21, 0x21, 0x0f, 0x0f,
+ 0x10, 0x25, 0x10, 0xfe,
+ 0xed, 0xf0, 0xff, 0xdc, 0xf0, 0xf1, 0x00, 0xed, 0xfe, 0x00, 0x00, 0x00,
+ 0x52, 0x1f, 0x0e, 0x10,
+ 0x0d, 0xee, 0x46, 0x42, 0x02, 0x0f, 0xbc, 0xf0, 0xff, 0x00, 0x05, 0x10,
+ 0x0f, 0xe0, 0x00, 0x11,
+ 0x11, 0xe0, 0x00, 0x04, 0x14, 0x00, 0xef, 0x05, 0x02, 0xd0, 0x0e, 0x0e,
+ 0x00, 0xee, 0x01, 0x25,
+ 0x20, 0x1f, 0x20, 0x35, 0x00, 0x2f, 0x12, 0x22, 0x15, 0x11, 0x00, 0x00,
+ 0x20, 0x02, 0x10, 0xf0,
+ 0xfd, 0x10, 0x31, 0x00, 0x0c, 0x10, 0x44, 0xec, 0xcd, 0xfd, 0xdb, 0xfe,
+ 0xff, 0xf0, 0xcf, 0xcb,
+ 0xff, 0xee, 0xfd, 0xcd, 0xf0, 0xdd, 0xee, 0x0e, 0x0d, 0x0f, 0x00, 0x0e,
+ 0x1f, 0x41, 0x11, 0x00,
+ 0x0f, 0x00, 0x15, 0x21, 0x00, 0x11, 0x25, 0xfe, 0x00, 0x23, 0x02, 0xe0,
+ 0xee, 0xf0, 0xf0, 0xed,
+ 0xf0, 0x01, 0x04, 0xff, 0xcb, 0x00, 0x02, 0x10, 0x0d, 0x10, 0x11, 0xe0,
+ 0xeb, 0xfe, 0x00, 0x21,
+ 0xf0, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x23, 0x10, 0x0f, 0xdf, 0x23,
+ 0x24, 0x0f, 0xfd, 0x1f,
+ 0xfe, 0xee, 0x02, 0x13, 0xef, 0xee, 0x00, 0x02, 0x00, 0x0f, 0xd0, 0x00,
+ 0x21, 0xff, 0xff, 0x00,
+ 0x01, 0x0f, 0x0f, 0x0f, 0x11, 0x00, 0xde, 0xf0, 0x01, 0x00, 0x01, 0x33,
+ 0x23, 0x1f, 0x0d, 0x01,
+ 0x04, 0x31, 0x22, 0x22, 0x22, 0x0f, 0xff, 0x20, 0x25, 0x11, 0x00, 0x02,
+ 0xef, 0xca, 0x10, 0x25,
+ 0x31, 0x10, 0x11, 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x0f, 0x0f, 0xee,
+ 0x00, 0x22, 0x23, 0x12,
+ 0xfe, 0xdd, 0x10, 0x22, 0x10, 0x11, 0x02, 0x1f, 0xfb, 0xef, 0xfe, 0x0d,
+ 0x0b, 0x00, 0x21, 0x11,
+ 0xeb, 0xcd, 0x0d, 0x10, 0xf0, 0xd0, 0xf1, 0xe0, 0x0f, 0x00, 0xe0, 0xff,
+ 0xf0, 0x01, 0x13, 0x30,
+ 0x00, 0xf0, 0xc0, 0x11, 0x34, 0x10, 0xdf, 0xee, 0x11, 0x37, 0x01, 0xf0,
+ 0xdf, 0xe0, 0xd0, 0xee,
+ 0xbe, 0xf0, 0x01, 0xe4, 0x00, 0xf0, 0x0e, 0x20, 0x10, 0x1c, 0x21, 0x43,
+ 0x0e, 0x3e, 0x52, 0x10,
+ 0x0e, 0x20, 0x02, 0x12, 0x31, 0x21, 0x00, 0x30, 0x24, 0x33, 0x10, 0x00,
+ 0x00, 0x00, 0x1f, 0x23,
+ 0x01, 0xed, 0xef, 0x00, 0x0e, 0xfc, 0xee, 0x02, 0xe2, 0xef, 0xed, 0xff,
+ 0xdf, 0x0e, 0x00, 0x21,
+ 0x14, 0x0f, 0xee, 0x00, 0x20, 0x44, 0x12, 0x0f, 0xdf, 0x00, 0x43, 0x27,
+ 0x20, 0xff, 0xff, 0x10,
+ 0x42, 0x35, 0x21, 0x00, 0x22, 0x10, 0x00, 0x0e, 0xf1, 0xf1, 0x01, 0x04,
+ 0xf0, 0xdc, 0xee, 0xe0,
+ 0x13, 0x0f, 0xb8, 0x00, 0x20, 0x10, 0x11, 0x00, 0x10, 0x0d, 0x00, 0x22,
+ 0x00, 0x0f, 0x01, 0x16,
+ 0x10, 0x0f, 0x0f, 0xcd, 0x00, 0x30, 0x05, 0x0f, 0xfe, 0x0e, 0x00, 0x00,
+ 0x1d, 0x00, 0x00, 0xff,
+ 0xef, 0xfe, 0xfd, 0xe2, 0x02, 0xe2, 0xef, 0xdc, 0xf0, 0xe1, 0x00, 0x10,
+ 0x24, 0x12, 0xdf, 0xfd,
+ 0x20, 0x33, 0x00, 0xcf, 0x00, 0x14, 0xf1, 0x00, 0x00, 0x0d, 0x00, 0x13,
+ 0x00, 0x10, 0x10, 0xe0,
+ 0xdd, 0xfd, 0x32, 0x13, 0x02, 0x02, 0xf0, 0xee, 0xfe, 0x00, 0x24, 0x02,
+ 0xe1, 0xee, 0x0c, 0x00,
+ 0x21, 0x01, 0xe0, 0x00, 0x10, 0x1f, 0x10, 0x42, 0x12, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb1, 0x1a, 0x5f, 0x28, 0x58, 0x1a, 0x4e, 0x27, 0x0d, 0xec, 0x0e, 0x20,
+ 0x23, 0x0f, 0xed, 0xfe,
+ 0xfd, 0x0a, 0xde, 0xff, 0x10, 0x20, 0x11, 0x01, 0x00, 0x0f, 0x0d, 0x0f,
+ 0x11, 0x12, 0x0f, 0xfc,
+ 0x10, 0x0e, 0xe0, 0x00, 0x11, 0x00, 0xde, 0x00, 0x12, 0x13, 0x01, 0xe2,
+ 0x05, 0x33, 0x01, 0x00,
+ 0xe1, 0x01, 0xe0, 0x00, 0x03, 0x34, 0xf0, 0xec, 0x00, 0xe1, 0xec, 0x00,
+ 0x33, 0xd0, 0xf0, 0x0f,
+ 0x31, 0x14, 0x22, 0x12, 0x11, 0x0f, 0x0f, 0x10, 0x22, 0x10, 0x11, 0x00,
+ 0x0e, 0x00, 0x02, 0x0f,
+ 0x0f, 0xe0, 0xf0, 0x00, 0x11, 0x02, 0xdc, 0xec, 0x00, 0x10, 0xfd, 0xdc,
+ 0xee, 0xdb, 0xee, 0xdf,
+ 0xfd, 0xe0, 0xee, 0x00, 0xca, 0xee, 0xf0, 0x00, 0x10, 0x11, 0x10, 0x00,
+ 0x0d, 0x4f, 0x00, 0x12,
+ 0x10, 0x03, 0x13, 0x12, 0x22, 0x11, 0x02, 0x01, 0x02, 0x02, 0xf1, 0x02,
+ 0xe0, 0xca, 0xf0, 0x10,
+ 0x03, 0x00, 0x20, 0xfc, 0xdf, 0x0e, 0x21, 0x21, 0x11, 0xf0, 0x0b, 0x00,
+ 0x1f, 0x1e, 0x00, 0x00,
+ 0xe0, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x22, 0x04, 0xfe, 0xf0, 0x11, 0x42,
+ 0x14, 0x00, 0xe0, 0x00,
+ 0x01, 0x11, 0x00, 0xdd, 0xdf, 0x02, 0x14, 0x10, 0xf0, 0xff, 0xff, 0xf0,
+ 0x00, 0x01, 0x02, 0xff,
+ 0x0f, 0x2f, 0x1f, 0x21, 0x03, 0x00, 0x31, 0x0e, 0x1d, 0x10, 0x0f, 0xfe,
+ 0x00, 0x34, 0x10, 0xfa,
+ 0x00, 0x13, 0x00, 0x00, 0x02, 0x01, 0x10, 0x0f, 0x03, 0x03, 0x00, 0x02,
+ 0x0e, 0xe1, 0x02, 0x20,
+ 0x33, 0x23, 0x1f, 0x00, 0x33, 0x0d, 0xf0, 0x23, 0x45, 0x00, 0xef, 0x01,
+ 0x44, 0x00, 0xde, 0x10,
+ 0x01, 0x20, 0x02, 0x1f, 0xed, 0x00, 0x0e, 0x1f, 0x0d, 0x1e, 0x1d, 0x0e,
+ 0x0f, 0x30, 0xfd, 0xca,
+ 0x00, 0x00, 0xe0, 0xe0, 0xce, 0x01, 0xd0, 0x00, 0xf0, 0x0e, 0xff, 0xef,
+ 0x0e, 0x51, 0x33, 0x00,
+ 0xdf, 0x00, 0x14, 0x32, 0xf1, 0xd0, 0x01, 0x03, 0x04, 0xf4, 0x00, 0xf1,
+ 0xd0, 0xb8, 0xe0, 0x11,
+ 0x02, 0xef, 0xef, 0x00, 0x20, 0x0f, 0x00, 0x10, 0x40, 0x02, 0x10, 0x00,
+ 0x20, 0x22, 0x32, 0x01,
+ 0xf0, 0x00, 0x55, 0x11, 0x10, 0x20, 0x00, 0xff, 0x12, 0x46, 0x00, 0x0e,
+ 0x20, 0x10, 0x00, 0xc0,
+ 0x0f, 0xfe, 0xfc, 0xfc, 0xff, 0xf0, 0x0f, 0x01, 0x10, 0xed, 0xdc, 0xec,
+ 0x0f, 0xf0, 0x15, 0x31,
+ 0xe0, 0xdd, 0xec, 0xf0, 0x00, 0x34, 0x01, 0xce, 0x22, 0x45, 0x00, 0x00,
+ 0xef, 0x35, 0x54, 0x00,
+ 0x1f, 0x12, 0x00, 0xe3, 0x25, 0x22, 0x0d, 0xfb, 0xd0, 0xf0, 0x01, 0xf0,
+ 0xfc, 0xee, 0x00, 0xdd,
+ 0xfd, 0x0e, 0x10, 0x21, 0x04, 0x0d, 0xfc, 0x00, 0x00, 0x20, 0x0e, 0x00,
+ 0x02, 0x0f, 0x0f, 0x01,
+ 0xf0, 0xcc, 0x10, 0x21, 0x03, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x20, 0x10,
+ 0x00, 0x1e, 0x0e, 0xee,
+ 0xfe, 0x00, 0xf2, 0xe0, 0x01, 0xf0, 0xdf, 0xde, 0x03, 0x01, 0x13, 0x01,
+ 0xef, 0xfd, 0x0f, 0x13,
+ 0x20, 0x0f, 0xf1, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x14, 0x20, 0x12,
+ 0x01, 0xdd, 0xed, 0xfe,
+ 0xf0, 0x04, 0x00, 0x23, 0x12, 0xef, 0xdb, 0xf0, 0x0f, 0x21, 0x22, 0x11,
+ 0x11, 0x10, 0x1f, 0x00,
+ 0x01, 0x22, 0x01, 0x2f, 0x00, 0x20, 0x11, 0x02, 0x02, 0x11, 0x22, 0x0e,
+ 0xda, 0x10, 0x20, 0x02,
+ 0x01, 0x01, 0x0f, 0x09, 0xff, 0xf0, 0x00, 0x02, 0x10, 0x21, 0xf0, 0x0e,
+ 0x1f, 0x00, 0x00, 0x0e,
+ 0x30, 0xf0, 0xfb, 0x0f, 0xfe, 0x01, 0x24, 0x11, 0x10, 0xe0, 0xef, 0x11,
+ 0x01, 0x01, 0x03, 0x00,
+ 0xff, 0x01, 0x00, 0xd0, 0x02, 0x03, 0xee, 0xec, 0xff, 0xf1, 0x02, 0xf2,
+ 0x04, 0x20, 0x00, 0xf0,
+ 0x01, 0xe0, 0x00, 0x03, 0x45, 0x11, 0x20, 0x30, 0x21, 0x20, 0x22, 0x35,
+ 0xee, 0x10, 0x31, 0x23,
+ 0x20, 0x00, 0xf1, 0x01, 0x00, 0x1e, 0xfe, 0xfd, 0xe0, 0x13, 0x12, 0xfc,
+ 0xec, 0xec, 0xdc, 0xef,
+ 0x0e, 0xce, 0xff, 0xdd, 0xec, 0xef, 0xee, 0x00, 0xdc, 0x0e, 0x0e, 0xef,
+ 0xfe, 0x10, 0x30, 0x20,
+ 0x10, 0x0f, 0xf1, 0x22, 0x03, 0xdf, 0x00, 0x03, 0x23, 0x01, 0x01, 0x02,
+ 0x00, 0x02, 0x03, 0x1f,
+ 0xfc, 0xe0, 0xff, 0x02, 0x52, 0x0f, 0xef, 0xed, 0xf0, 0x01, 0xfe, 0xee,
+ 0x00, 0x10, 0xf0, 0xee,
+ 0x00, 0x00, 0xdd, 0x0f, 0x20, 0x22, 0xf0, 0xde, 0x21, 0x22, 0x01, 0xf0,
+ 0xff, 0x11, 0x24, 0x00,
+ 0xf0, 0xef, 0xfd, 0x1f, 0x0f, 0x00, 0xf0, 0xdf, 0x00, 0x00, 0x00, 0x10,
+ 0x02, 0xf0, 0xf1, 0x0f,
+ 0x0f, 0x00, 0xf1, 0xf0, 0xfd, 0x21, 0x12, 0x10, 0x0c, 0xff, 0x20, 0x10,
+ 0x02, 0x01, 0x25, 0x00,
+ 0x00, 0x00, 0x0e, 0xe0, 0x02, 0x56, 0x12, 0x10, 0x00, 0x00, 0x10, 0x22,
+ 0x04, 0x10, 0xfe, 0xfc,
+ 0xf0, 0x04, 0x10, 0x24, 0x12, 0x20, 0x10, 0x1f, 0xff, 0x00, 0x16, 0x11,
+ 0x11, 0x0f, 0xf0, 0x23,
+ 0x10, 0xed, 0xff, 0x02, 0x11, 0x0f, 0xfd, 0x0f, 0x20, 0x00, 0x23, 0x01,
+ 0x0c, 0x0c, 0xfe, 0x0f,
+ 0x20, 0xf0, 0x0f, 0xcc, 0xef, 0x0f, 0x00, 0xe0, 0xdd, 0xfe, 0x0e, 0xf0,
+ 0x0e, 0x2e, 0x10, 0x0d,
+ 0x42, 0x36, 0xff, 0xbe, 0x01, 0x01, 0x01, 0xe2, 0xf2, 0xe1, 0xd1, 0x01,
+ 0xf2, 0xef, 0xdd, 0xdf,
+ 0xf0, 0x12, 0x0f, 0x0e, 0xf0, 0x13, 0x0f, 0x0f, 0x10, 0x0f, 0x00, 0x1f,
+ 0x20, 0x02, 0x0f, 0x1f,
+ 0x31, 0x13, 0x20, 0x20, 0x32, 0x36, 0x20, 0x00, 0x0f, 0x21, 0x54, 0x10,
+ 0x01, 0xf1, 0x02, 0x30,
+ 0x00, 0xf0, 0xfe, 0xed, 0x0d, 0xf0, 0x00, 0xdd, 0xf0, 0xf0, 0x01, 0x21,
+ 0xed, 0xbe, 0x01, 0xf0,
+ 0x00, 0x1f, 0x41, 0x01, 0xcb, 0x0f, 0x41, 0x34, 0x10, 0x1e, 0x10, 0x12,
+ 0x14, 0x21, 0x02, 0x02,
+ 0x12, 0x00, 0x03, 0x11, 0x11, 0xf2, 0x00, 0x44, 0xff, 0x0e, 0x0f, 0xfd,
+ 0xf2, 0x04, 0x00, 0x0b,
+ 0xe0, 0xf0, 0xf0, 0xf0, 0x02, 0x20, 0x00, 0x10, 0x30, 0x00, 0xed, 0x1f,
+ 0x20, 0x00, 0x2f, 0x12,
+ 0x00, 0x00, 0x12, 0xf0, 0xf0, 0xec, 0x10, 0x11, 0x01, 0x11, 0x02, 0x2f,
+ 0x0d, 0xf0, 0x0e, 0x2f,
+ 0x00, 0x00, 0xff, 0xbd, 0xff, 0xdf, 0x00, 0x24, 0xe3, 0xbd, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0xfd,
+ 0x0f, 0x33, 0x11, 0x11, 0x23, 0x00, 0xcc, 0x10, 0x03, 0x01, 0x00, 0xe0,
+ 0x00, 0x11, 0x12, 0x01,
+ 0x11, 0xf1, 0xfe, 0xea, 0x00, 0x1f, 0x43, 0x04, 0xf0, 0xed, 0xee, 0xff,
+ 0x00, 0x01, 0xf2, 0xf0,
+ 0x02, 0xf0, 0x0f, 0x20, 0x31, 0x00, 0x0e, 0xfe, 0x01, 0x00, 0x1c, 0x10,
+ 0x12, 0xf2, 0xde, 0x0d,
+ 0x10, 0x23, 0x00, 0xf0, 0xfd, 0x00, 0x00, 0x0c, 0x1e, 0x20, 0x20, 0x0d,
+ 0x0e, 0x00, 0x10, 0x0f,
+ 0x0d, 0xfe, 0x22, 0x32, 0xed, 0xfe, 0x02, 0xf1, 0xee, 0x1e, 0x32, 0x12,
+ 0xe0, 0x03, 0x12, 0xf0,
+ 0xff, 0xe0, 0xf0, 0xdf, 0x01, 0x26, 0x11, 0x01, 0xcf, 0xff, 0x00, 0x20,
+ 0x03, 0xf3, 0xef, 0xfe,
+ 0x00, 0x21, 0x12, 0xe0, 0xef, 0x00, 0x10, 0x00, 0x10, 0x10, 0x24, 0x21,
+ 0x21, 0x0f, 0x0f, 0xfe,
+ 0x22, 0x46, 0x00, 0xf0, 0x11, 0x22, 0xff, 0xde, 0x0f, 0xe0, 0x00, 0x23,
+ 0xfe, 0xce, 0x0f, 0x2e,
+ 0xdc, 0xde, 0xfc, 0xf0, 0xdd, 0xeb, 0xde, 0x0d, 0xff, 0xdf, 0x0f, 0x1e,
+ 0x0f, 0x10, 0x0c, 0xee,
+ 0x11, 0x44, 0x00, 0x0d, 0x23, 0x02, 0xdd, 0xfe, 0xf1, 0x07, 0x11, 0xe0,
+ 0xee, 0x01, 0x13, 0x02,
+ 0x12, 0x02, 0x33, 0xfc, 0xdd, 0x00, 0x20, 0x23, 0x01, 0x00, 0xce, 0x0d,
+ 0x0e, 0x0e, 0xfd, 0xdf,
+ 0xfe, 0x02, 0x53, 0x10, 0xfc, 0xfe, 0x00, 0x43, 0x02, 0xf0, 0x00, 0x21,
+ 0x44, 0xfd, 0xde, 0x13,
+ 0x20, 0x13, 0x11, 0xf1, 0xde, 0x0f, 0xe1, 0xf1, 0xf0, 0xfe, 0xf0, 0xf0,
+ 0x01, 0x13, 0x04, 0x23,
+ 0x0e, 0xda, 0x00, 0x10, 0x10, 0x0e, 0x00, 0x64, 0x00, 0x0b, 0x10, 0x1f,
+ 0x1f, 0x12, 0x05, 0x0f,
+ 0xdc, 0x01, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x0e, 0x10, 0x13, 0x01, 0x1f,
+ 0x31, 0x12, 0x01, 0x00,
+ 0x0f, 0x10, 0x02, 0x02, 0x04, 0xf0, 0x00, 0x04, 0x22, 0x10, 0x01, 0x01,
+ 0x02, 0x45, 0x1f, 0xfd,
+ 0xff, 0x00, 0x55, 0x01, 0x10, 0x31, 0x00, 0xfe, 0x0d, 0xff, 0x00, 0x12,
+ 0x21, 0x13, 0x21, 0x00,
+ 0xfb, 0xef, 0x0e, 0xfe, 0xcc, 0xec, 0x0f, 0x00, 0x1e, 0xf0, 0x01, 0xde,
+ 0x0d, 0x0f, 0x2f, 0x0f,
+ 0x10, 0x01, 0x23, 0x0f, 0x20, 0x00, 0xe0, 0xd0, 0x01, 0xf3, 0xf1, 0xdf,
+ 0xd0, 0xf3, 0xe0, 0x04,
+ 0x10, 0x01, 0xf0, 0x02, 0xed, 0x00, 0x10, 0x20, 0x00, 0x0e, 0xf0, 0x01,
+ 0x23, 0x0f, 0xfd, 0xf1,
+ 0xf2, 0xe0, 0x24, 0x20, 0x10, 0x34, 0x23, 0x21, 0x01, 0x23, 0x10, 0x20,
+ 0x1d, 0x30, 0x24, 0x01,
+ 0x03, 0x00, 0x0e, 0x0f, 0x0e, 0xef, 0xf1, 0x02, 0x0f, 0xda, 0xff, 0xee,
+ 0xff, 0x0e, 0x00, 0x04,
+ 0xfd, 0xda, 0xff, 0x0e, 0x22, 0x22, 0x00, 0xdd, 0x1f, 0x20, 0x12, 0x00,
+ 0xe0, 0x13, 0x14, 0x00,
+ 0x0f, 0xed, 0x04, 0x44, 0x01, 0x13, 0x11, 0xfd, 0xff, 0x02, 0x04, 0x21,
+ 0x0f, 0x00, 0x0f, 0xed,
+ 0xef, 0x0e, 0x0e, 0xf0, 0x13, 0x1e, 0x0c, 0xff, 0x2f, 0x10, 0x10, 0x00,
+ 0xe0, 0x10, 0xf0, 0xef,
+ 0x0d, 0xff, 0xf0, 0x02, 0x00, 0x00, 0x1e, 0x30, 0xff, 0xf0, 0x22, 0x22,
+ 0x10, 0x0e, 0x10, 0x22,
+ 0x22, 0xee, 0xe0, 0x03, 0x00, 0xde, 0xde, 0xed, 0xfe, 0xe0, 0xf0, 0xe1,
+ 0xf0, 0xef, 0x0e, 0x00,
+ 0x33, 0x00, 0x10, 0x00, 0xe0, 0x00, 0x32, 0x13, 0xf0, 0xe0, 0xf0, 0xe0,
+ 0xfe, 0xe0, 0xef, 0xff,
+ 0x0f, 0x01, 0x23, 0x00, 0x31, 0x00, 0x00, 0x20, 0x21, 0x01, 0x03, 0x00,
+ 0xf0, 0x0f, 0x10, 0xf0,
+ 0xfe, 0xf1, 0x01, 0x00, 0x2f, 0x0e, 0x10, 0x44, 0x11, 0x10, 0x11, 0x01,
+ 0x0e, 0xff, 0x00, 0x01,
+ 0xe3, 0x12, 0x31, 0x00, 0x00, 0x0d, 0xef, 0x01, 0x23, 0x1d, 0xfd, 0x0f,
+ 0x1f, 0x0c, 0xff, 0x03,
+ 0x26, 0x00, 0xfd, 0x0e, 0x00, 0x02, 0x42, 0x13, 0x2f, 0x0d, 0xdc, 0x00,
+ 0x2f, 0x10, 0x12, 0x02,
+ 0xfe, 0xff, 0xf0, 0x0e, 0xd0, 0xf1, 0xf2, 0x02, 0xdf, 0x00, 0x02, 0xe0,
+ 0xd0, 0x01, 0x1f, 0xef,
+ 0xe0, 0x11, 0x02, 0x00, 0xf2, 0x24, 0x10, 0xff, 0x00, 0x10, 0x12, 0x11,
+ 0x33, 0x22, 0x30, 0x22,
+ 0x00, 0x00, 0x00, 0x44, 0x22, 0x11, 0x31, 0x00, 0x00, 0x01, 0x22, 0x0f,
+ 0xcd, 0x0e, 0xfe, 0x01,
+ 0x23, 0xdc, 0xed, 0xec, 0xed, 0x0e, 0xff, 0xeb, 0xdd, 0xed, 0x00, 0x00,
+ 0xda, 0xef, 0x00, 0x21,
+ 0x0f, 0xec, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x20, 0x23, 0xf0, 0xff, 0x02,
+ 0xf2, 0xe0, 0xf0, 0x03,
+ 0x04, 0x20, 0x01, 0x24, 0x11, 0x10, 0x00, 0xcc, 0xfd, 0x00, 0x44, 0xf0,
+ 0xdc, 0xf0, 0x0f, 0xdd,
+ 0xfd, 0xf1, 0xe0, 0x00, 0x24, 0x10, 0xed, 0x0f, 0x00, 0x20, 0x10, 0xff,
+ 0xfd, 0x00, 0x02, 0x12,
+ 0x0f, 0xff, 0x0e, 0xf0, 0x00, 0xf2, 0xe0, 0x00, 0x05, 0x10, 0x00, 0xdf,
+ 0xff, 0xed, 0xef, 0x00,
+ 0x33, 0x00, 0x0e, 0x0e, 0x0f, 0x00, 0x20, 0x00, 0x22, 0xfe, 0x0f, 0x42,
+ 0x01, 0xcf, 0x0f, 0x22,
+ 0x01, 0x0f, 0xd0, 0x00, 0x10, 0x01, 0x04, 0x00, 0x0e, 0x10, 0x42, 0x12,
+ 0x12, 0x23, 0x21, 0x00,
+ 0x0d, 0xef, 0x01, 0x37, 0x11, 0x01, 0x00, 0xe0, 0xff, 0xfe, 0x00, 0x02,
+ 0x47, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x12, 0x11, 0x10, 0x0e, 0x10, 0x02, 0x34, 0x00, 0xfe,
+ 0xf0, 0xff, 0x20, 0x23,
+ 0x00, 0x03, 0x22, 0xfe, 0xd9, 0x1f, 0x10, 0xff, 0xde, 0x0f, 0x0f, 0x0f,
+ 0xee, 0x0e, 0x1d, 0x0e,
+ 0x0e, 0x12, 0x32, 0x00, 0xfe, 0xfe, 0x0f, 0x00, 0xf0, 0xff, 0x02, 0xe1,
+ 0xe0, 0xe1, 0xd0, 0xcd,
+ 0xfe, 0xe0, 0xe1, 0x03, 0x00, 0x10, 0x00, 0x12, 0x0e, 0xde, 0x21, 0x12,
+ 0x10, 0x00, 0x00, 0xef,
+ 0x00, 0x02, 0x00, 0xed, 0x10, 0x32, 0x02, 0x41, 0x44, 0x10, 0x21, 0x54,
+ 0x01, 0x00, 0x30, 0x02,
+ 0x33, 0x02, 0x01, 0x10, 0xf0, 0xdf, 0xfe, 0xe0, 0x00, 0x04, 0x0f, 0xec,
+ 0x00, 0xde, 0xe9, 0xf0,
+ 0x0f, 0x31, 0x12, 0xff, 0x0e, 0xfd, 0x00, 0x25, 0x12, 0x0d, 0x0d, 0x22,
+ 0x21, 0x12, 0x11, 0x10,
+ 0x00, 0x1f, 0x10, 0x00, 0x11, 0x15, 0x14, 0x00, 0x01, 0xdf, 0x0f, 0x11,
+ 0x02, 0xe4, 0x00, 0x20,
+ 0xfd, 0xee, 0x0f, 0x0f, 0x10, 0x32, 0x24, 0x10, 0xf0, 0x00, 0x0f, 0x01,
+ 0x00, 0xf0, 0xfe, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x2f, 0x0e, 0x0f, 0x2f, 0x40, 0x13, 0x0f, 0x20,
+ 0x00, 0x13, 0x23, 0x0f,
+ 0x0e, 0x00, 0x03, 0xdf, 0x0f, 0xe0, 0xfe, 0xee, 0xdd, 0xed, 0xf0, 0xe0,
+ 0x0f, 0x00, 0x00, 0xf0,
+ 0xe0, 0x00, 0xf3, 0x11, 0x12, 0x0e, 0xef, 0xf0, 0x00, 0xf1, 0x02, 0xee,
+ 0x0d, 0xf0, 0x01, 0x02,
+ 0x01, 0xfd, 0xee, 0xf0, 0x01, 0x32, 0x44, 0x03, 0x00, 0xef, 0x10, 0x00,
+ 0x0e, 0x10, 0x0e, 0xf1,
+ 0x00, 0xed, 0xfd, 0x00, 0x00, 0x02, 0x20, 0xee, 0xf0, 0x02, 0x32, 0x00,
+ 0x0f, 0x00, 0xe0, 0xed,
+ 0x00, 0x01, 0x10, 0xff, 0x01, 0x11, 0xfc, 0x00, 0x20, 0x03, 0xfe, 0x0e,
+ 0x20, 0x00, 0x11, 0xff,
+ 0x0b, 0x00, 0x20, 0x20, 0x0f, 0x0e, 0x10, 0x33, 0x11, 0x0f, 0x0e, 0x00,
+ 0x20, 0xf0, 0xf1, 0x00,
+ 0x0c, 0xfe, 0x12, 0x13, 0xef, 0xff, 0x12, 0x04, 0xff, 0xcd, 0x00, 0xf1,
+ 0xf5, 0x02, 0x02, 0xff,
+ 0xdd, 0x00, 0x01, 0xf0, 0xff, 0xe1, 0xf0, 0x0f, 0x0f, 0xfe, 0x00, 0x11,
+ 0x32, 0x00, 0x00, 0x1f,
+ 0x20, 0x35, 0x12, 0x11, 0x13, 0x00, 0x00, 0x0f, 0x10, 0x10, 0xe0, 0x03,
+ 0x13, 0x00, 0x0f, 0x0f,
+ 0xff, 0x0e, 0x02, 0xe3, 0xfe, 0x0d, 0xff, 0x0e, 0xfc, 0xff, 0x0e, 0xfd,
+ 0xec, 0x0e, 0xfc, 0xdd,
+ 0x0e, 0xf0, 0x12, 0x0e, 0xfc, 0xee, 0x00, 0x11, 0x00, 0x02, 0xf3, 0x00,
+ 0x1d, 0x00, 0x01, 0x03,
+ 0xf0, 0xe1, 0xe1, 0xe0, 0x00, 0x00, 0x22, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00,
+ 0x02, 0xf0, 0xff, 0x0d, 0xed, 0x0f, 0x10, 0x22, 0x12, 0x00, 0x0c, 0x0f,
+ 0x40, 0x21, 0xe0, 0x0e,
+ 0x22, 0x22, 0x00, 0xee, 0x11, 0x04, 0x00, 0xdf, 0x02, 0xe4, 0xe0, 0xee,
+ 0xff, 0x00, 0xe0, 0x00,
+ 0x21, 0xfd, 0x0c, 0x10, 0x21, 0x0f, 0x0e, 0x54, 0x25, 0x00, 0xff, 0xf0,
+ 0x00, 0x21, 0xf0, 0xe0,
+ 0x0e, 0xfe, 0x10, 0x22, 0x00, 0x0e, 0x0e, 0x0f, 0x10, 0x00, 0x00, 0x30,
+ 0x01, 0x13, 0x03, 0x12,
+ 0x00, 0xff, 0x00, 0xf0, 0xe1, 0x03, 0x00, 0x03, 0x33, 0x0f, 0x00, 0xf0,
+ 0x10, 0x12, 0x24, 0x10,
+ 0x10, 0x00, 0x23, 0x03, 0x22, 0x0e, 0xee, 0x02, 0x41, 0x00, 0x00, 0x11,
+ 0x00, 0x10, 0x35, 0x10,
+ 0x0e, 0xee, 0x12, 0x36, 0xf0, 0xe0, 0xfb, 0x0f, 0x0f, 0x00, 0xfe, 0x0e,
+ 0x1e, 0x0f, 0xfd, 0x10,
+ 0x21, 0x0e, 0xfd, 0xf0, 0x13, 0x21, 0x01, 0xce, 0x00, 0xff, 0xf0, 0xee,
+ 0x00, 0x02, 0x00, 0x03,
+ 0xdf, 0xfd, 0xe0, 0xe0, 0x00, 0xf0, 0x11, 0x26, 0x00, 0xd0, 0x00, 0x00,
+ 0xe0, 0x02, 0x1e, 0xfe,
+ 0xf0, 0x03, 0x21, 0x00, 0xfb, 0xf0, 0x10, 0x34, 0x10, 0x14, 0x43, 0x20,
+ 0x12, 0x10, 0x23, 0x01,
+ 0x02, 0x34, 0x21, 0x0d, 0xf0, 0x01, 0x01, 0xe0, 0xfe, 0xef, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x71, 0xf0, 0x78, 0xf2, 0xef, 0xef, 0x45, 0xf1, 0xff, 0xce, 0x00, 0x00,
+ 0x00, 0xdd, 0xf8, 0xff,
+ 0x30, 0x11, 0xf0, 0x10, 0x2f, 0xfc, 0xef, 0x20, 0x33, 0x00, 0xf0, 0xf0,
+ 0x01, 0x0e, 0x00, 0x00,
+ 0xf2, 0x01, 0x00, 0x00, 0x13, 0x01, 0x01, 0x03, 0x0f, 0x0d, 0x00, 0x02,
+ 0x23, 0x10, 0x00, 0x10,
+ 0x10, 0xe0, 0xfe, 0xff, 0x00, 0x1f, 0x0f, 0xf0, 0x00, 0x00, 0xee, 0xfc,
+ 0x00, 0x0e, 0x10, 0x02,
+ 0x00, 0x01, 0x00, 0x1f, 0x1d, 0x0d, 0x31, 0x24, 0x11, 0x00, 0x1d, 0x11,
+ 0x01, 0xe0, 0x1f, 0x24,
+ 0x05, 0x00, 0xfd, 0xcd, 0xf0, 0xf0, 0xf1, 0xf2, 0xff, 0xfc, 0xf0, 0x11,
+ 0x02, 0xf0, 0x00, 0xff,
+ 0xee, 0xf0, 0x10, 0x02, 0x00, 0x00, 0xe0, 0xee, 0xef, 0x00, 0x0f, 0x00,
+ 0x02, 0x01, 0xe0, 0x00,
+ 0xf1, 0xff, 0xfd, 0x00, 0x03, 0x34, 0x13, 0x11, 0x0d, 0x0f, 0x0f, 0x40,
+ 0x00, 0x11, 0x03, 0x20,
+ 0xee, 0xff, 0x00, 0xf0, 0x00, 0x23, 0x01, 0x10, 0x21, 0x10, 0x00, 0x00,
+ 0x0f, 0x02, 0x20, 0x0e,
+ 0xfe, 0x0f, 0x01, 0xf3, 0x12, 0x22, 0xff, 0xed, 0x00, 0xf1, 0x01, 0x00,
+ 0x03, 0x2f, 0xfb, 0xff,
+ 0x1f, 0x30, 0x0e, 0x12, 0x35, 0x30, 0x00, 0xfd, 0xf0, 0x21, 0x13, 0x11,
+ 0x00, 0xec, 0x0d, 0x1f,
+ 0x20, 0xee, 0xee, 0x0f, 0x02, 0x02, 0x00, 0xe0, 0xf0, 0xf0, 0xe3, 0xe0,
+ 0xf1, 0xe1, 0xe0, 0x0f,
+ 0x00, 0x02, 0xef, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x32, 0x25, 0x21, 0x0f,
+ 0x10, 0x00, 0x23, 0x23,
+ 0x34, 0x01, 0x10, 0x11, 0x12, 0x1f, 0x0e, 0x00, 0x22, 0x00, 0x20, 0x23,
+ 0x01, 0x01, 0x20, 0xfc,
+ 0xef, 0x13, 0x01, 0xfd, 0xed, 0xfe, 0xed, 0x10, 0x0e, 0xda, 0xed, 0x0f,
+ 0x0f, 0xfd, 0xff, 0xf0,
+ 0x00, 0x0e, 0x0d, 0xff, 0xef, 0x00, 0x00, 0xf1, 0x04, 0x21, 0x0e, 0x0f,
+ 0x11, 0xf2, 0xf0, 0xe0,
+ 0x02, 0x0f, 0xde, 0xff, 0xe0, 0x13, 0x02, 0x02, 0x12, 0x00, 0x00, 0x00,
+ 0x0e, 0x01, 0xf0, 0xec,
+ 0x0f, 0x11, 0x00, 0xfe, 0xeb, 0x0f, 0x11, 0x01, 0xff, 0x00, 0x20, 0x0e,
+ 0x10, 0x00, 0x14, 0xee,
+ 0x0e, 0xf0, 0x02, 0xe1, 0x00, 0xe1, 0xf0, 0xf0, 0xef, 0xef, 0xef, 0xed,
+ 0x01, 0x35, 0x1f, 0xfc,
+ 0x00, 0x10, 0x31, 0x00, 0x00, 0x00, 0x0f, 0x23, 0x25, 0xff, 0xcf, 0x0e,
+ 0x02, 0x01, 0x0d, 0x0d,
+ 0x1f, 0x00, 0x01, 0x22, 0x2f, 0x0f, 0x30, 0x00, 0xf1, 0x06, 0x21, 0x12,
+ 0x00, 0xef, 0xff, 0x02,
+ 0x15, 0x21, 0x00, 0xdc, 0xe0, 0x01, 0x43, 0x02, 0x00, 0x20, 0x12, 0x0f,
+ 0x10, 0x11, 0x0f, 0xf0,
+ 0x02, 0x25, 0x00, 0x0f, 0x00, 0x01, 0xf1, 0x0f, 0x11, 0x12, 0x0e, 0x00,
+ 0x13, 0x25, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0xfd, 0xfe, 0x00, 0x31, 0x00, 0x0e, 0x0b, 0x0e,
+ 0x0f, 0x00, 0x1e, 0x00,
+ 0x22, 0x0d, 0xdb, 0x20, 0x13, 0xff, 0xdc, 0xfd, 0xe0, 0x0f, 0x0f, 0x20,
+ 0xf0, 0xd1, 0xf0, 0xf1,
+ 0xf0, 0xee, 0xdd, 0xe0, 0x01, 0xc0, 0x02, 0x02, 0xf0, 0xed, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x10, 0x10, 0x00, 0x11, 0x33, 0x03, 0x10, 0x11, 0x12, 0x22, 0x42,
+ 0x10, 0x22, 0x35, 0x30,
+ 0x00, 0x00, 0x32, 0xf0, 0xf1, 0x02, 0xef, 0xed, 0x02, 0xf3, 0xce, 0xeb,
+ 0xf1, 0x01, 0x10, 0xd9,
+ 0xff, 0x10, 0x3f, 0x0f, 0x21, 0x12, 0x0e, 0x0e, 0x11, 0x23, 0x01, 0x10,
+ 0x10, 0x01, 0x11, 0x00,
+ 0x1e, 0x0f, 0x12, 0x02, 0x1e, 0x0f, 0x1f, 0x0f, 0x01, 0x03, 0x06, 0x11,
+ 0x10, 0x00, 0x02, 0xf0,
+ 0xf0, 0x03, 0x11, 0x00, 0xfe, 0x0e, 0x01, 0x20, 0xff, 0xff, 0x00, 0x11,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x04, 0x11, 0x12, 0x00, 0x31, 0x0e, 0x0c, 0x00, 0x20, 0x22, 0x32, 0x0e,
+ 0x2f, 0x0f, 0x00, 0xfe,
+ 0x11, 0x22, 0x01, 0x00, 0xe0, 0xe0, 0x01, 0x01, 0xff, 0xce, 0x0f, 0xf0,
+ 0x0f, 0xef, 0x10, 0x00,
+ 0xfe, 0x02, 0x10, 0xdc, 0xe0, 0xe0, 0xf0, 0x01, 0xf2, 0xee, 0x0e, 0x02,
+ 0x03, 0x02, 0x10, 0xe0,
+ 0xff, 0x01, 0x10, 0xe0, 0xec, 0xef, 0xff, 0x00, 0x12, 0x31, 0x01, 0x01,
+ 0x30, 0x0f, 0xfd, 0x10,
+ 0x40, 0x00, 0x02, 0x11, 0xdc, 0xfe, 0xf1, 0x01, 0x0e, 0xdc, 0x02, 0x02,
+ 0x20, 0xfe, 0xf0, 0x04,
+ 0x10, 0x0d, 0xf0, 0xff, 0xde, 0x12, 0x34, 0xfd, 0xde, 0x01, 0x00, 0xf0,
+ 0x01, 0x33, 0x11, 0x00,
+ 0x0d, 0x0f, 0x1e, 0x10, 0x20, 0x10, 0x20, 0x20, 0x21, 0x22, 0xef, 0x0e,
+ 0x30, 0x0f, 0x01, 0x10,
+ 0xfe, 0x0f, 0xf0, 0x00, 0x1e, 0x00, 0x00, 0xef, 0xf1, 0x05, 0x11, 0xd0,
+ 0xde, 0xef, 0xf2, 0xf2,
+ 0xef, 0xce, 0xf0, 0x00, 0x00, 0x0d, 0xee, 0x00, 0x00, 0x10, 0x23, 0x10,
+ 0x11, 0x21, 0x10, 0x00,
+ 0xcd, 0x0f, 0xf2, 0x26, 0x41, 0x00, 0xf1, 0xf0, 0x00, 0x22, 0x13, 0x0e,
+ 0x1e, 0x32, 0x16, 0x11,
+ 0x01, 0x11, 0x0e, 0xec, 0x01, 0x02, 0xfe, 0xee, 0x0f, 0xee, 0x0e, 0xfd,
+ 0xda, 0xf0, 0x10, 0x30,
+ 0xdd, 0xfe, 0xfd, 0xfe, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x2f, 0x0f, 0x0f,
+ 0xdd, 0x00, 0x12, 0x00,
+ 0xf1, 0x00, 0x00, 0xd1, 0xc0, 0xfe, 0xc0, 0x01, 0xd0, 0x00, 0xf0, 0x07,
+ 0x31, 0x00, 0x0e, 0xff,
+ 0xfe, 0x0e, 0x40, 0x03, 0x0f, 0x1e, 0x21, 0x21, 0x0f, 0xec, 0x00, 0x12,
+ 0x00, 0x02, 0x23, 0x20,
+ 0x0f, 0xef, 0x10, 0x00, 0x01, 0x03, 0x00, 0xfa, 0x00, 0x01, 0x00, 0xe0,
+ 0x0f, 0xf0, 0x0f, 0x00,
+ 0x02, 0xe0, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x13, 0x04, 0x12,
+ 0x00, 0x1c, 0xf0, 0x0f,
+ 0x1f, 0x20, 0x10, 0x0f, 0x0f, 0x1f, 0x10, 0x0d, 0x1f, 0x10, 0x24, 0x01,
+ 0xf2, 0x03, 0x01, 0xfe,
+ 0xde, 0xf3, 0x15, 0x00, 0x0f, 0xf0, 0x02, 0x10, 0x10, 0x10, 0x13, 0x11,
+ 0x20, 0x20, 0x00, 0x02,
+ 0x23, 0xe0, 0xfe, 0x02, 0x02, 0x11, 0x14, 0x13, 0x01, 0x00, 0x01, 0xff,
+ 0x0c, 0x0e, 0x0f, 0x55,
+ 0x13, 0x10, 0x0d, 0x0e, 0x10, 0x10, 0x01, 0x00, 0x0d, 0x00, 0x33, 0x11,
+ 0x0e, 0xdb, 0x0f, 0xfe,
+ 0x0f, 0x41, 0x01, 0x0c, 0xfe, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xee,
+ 0xf0, 0x00, 0x02, 0x13,
+ 0xf0, 0xcf, 0x00, 0x0e, 0xe0, 0xd0, 0xdf, 0xf0, 0x0f, 0xfe, 0xee, 0xf0,
+ 0x03, 0x12, 0x12, 0x21,
+ 0x01, 0x0f, 0x00, 0x21, 0xf0, 0x00, 0x11, 0x32, 0x10, 0x10, 0x00, 0x24,
+ 0x12, 0x00, 0x13, 0x42,
+ 0x01, 0x01, 0x15, 0x11, 0xe0, 0x01, 0x01, 0xee, 0xdd, 0xf0, 0x0f, 0xe0,
+ 0x01, 0xfd, 0xdc, 0x0f,
+ 0x10, 0x23, 0x10, 0x10, 0x0e, 0xca, 0x0f, 0x00, 0x11, 0x20, 0xef, 0xfe,
+ 0x00, 0x12, 0x1f, 0x0e,
+ 0x0f, 0xfe, 0x0f, 0x20, 0x22, 0x00, 0x1f, 0x00, 0x20, 0x02, 0x00, 0x02,
+ 0x01, 0x02, 0xf2, 0x01,
+ 0x00, 0xf0, 0xe0, 0xed, 0xf0, 0x20, 0x01, 0x0e, 0xff, 0x01, 0x00, 0x11,
+ 0x1f, 0x00, 0x10, 0x00,
+ 0xfe, 0xef, 0x10, 0x11, 0x1f, 0x00, 0x20, 0x02, 0x1e, 0x0f, 0x10, 0x0d,
+ 0xff, 0x00, 0x20, 0x01,
+ 0x12, 0x11, 0x02, 0x00, 0x0f, 0x12, 0x00, 0xe1, 0x00, 0xee, 0x00, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00,
+ 0xff, 0xed, 0xf0, 0x20, 0x10, 0xd0, 0xee, 0xf0, 0xe1, 0x02, 0x00, 0x0f,
+ 0xef, 0xff, 0x00, 0x03,
+ 0x11, 0x0e, 0x0f, 0x00, 0x00, 0x01, 0xb0, 0x00, 0xee, 0xfe, 0xff, 0x01,
+ 0x33, 0x00, 0x00, 0x34,
+ 0x43, 0x0f, 0x1c, 0x22, 0x12, 0x11, 0x12, 0x0f, 0xfd, 0xff, 0x1e, 0x01,
+ 0x02, 0x02, 0xf0, 0x0e,
+ 0x1e, 0x00, 0x13, 0x12, 0x00, 0x10, 0x23, 0xfe, 0xdc, 0x0f, 0x00, 0x03,
+ 0x12, 0x02, 0xee, 0xed,
+ 0xe0, 0x22, 0x24, 0x00, 0xff, 0x0d, 0x1e, 0x10, 0x10, 0x1f, 0x20, 0x24,
+ 0x22, 0x0e, 0x0d, 0x00,
+ 0x53, 0x02, 0x10, 0x0c, 0xf0, 0x00, 0xfb, 0xef, 0x10, 0x00, 0xf1, 0x01,
+ 0x01, 0xe0, 0xde, 0xef,
+ 0xef, 0xd1, 0x02, 0xe0, 0xf2, 0x00, 0xf0, 0xfe, 0xff, 0x00, 0x02, 0x10,
+ 0x1f, 0x10, 0x11, 0x00,
+ 0x10, 0x01, 0x01, 0xf0, 0x00, 0x01, 0x32, 0x02, 0x13, 0x10, 0x14, 0x43,
+ 0x02, 0x1e, 0xfd, 0x11,
+ 0x33, 0x10, 0x00, 0x00, 0x0e, 0x1c, 0x13, 0x32, 0xf0, 0xfd, 0xf0, 0xfd,
+ 0xfd, 0xef, 0xff, 0xfe,
+ 0xfe, 0x00, 0x11, 0x0d, 0xf9, 0xe0, 0x0e, 0x00, 0xee, 0x00, 0x21, 0x21,
+ 0x1f, 0x00, 0xf2, 0x00,
+ 0x02, 0x0f, 0xff, 0xd0, 0x04, 0x02, 0xd0, 0xef, 0xd0, 0xde, 0xfd, 0xed,
+ 0xf0, 0xf2, 0x11, 0x43,
+ 0x13, 0x0f, 0x09, 0xf0, 0x11, 0x00, 0x00, 0x10, 0x11, 0xfc, 0x0e, 0xfe,
+ 0xef, 0x01, 0x13, 0x00,
+ 0x0e, 0xe0, 0xf0, 0x10, 0x00, 0xe0, 0x1f, 0x12, 0x01, 0xdd, 0xef, 0xff,
+ 0x00, 0x00, 0xe0, 0xec,
+ 0x00, 0x00, 0x15, 0x21, 0xe0, 0x0f, 0x00, 0x01, 0x0f, 0xee, 0x0d, 0xf0,
+ 0x24, 0x33, 0x01, 0x0c,
+ 0xdd, 0x00, 0x10, 0x42, 0x11, 0x0d, 0x0c, 0x10, 0x02, 0x22, 0x23, 0x00,
+ 0xf0, 0x00, 0x15, 0x01,
+ 0xf0, 0xd1, 0xf0, 0xee, 0x00, 0x11, 0x11, 0x00, 0x44, 0x12, 0xfd, 0xfe,
+ 0x20, 0x20, 0x35, 0xf0,
+ 0x00, 0x01, 0x01, 0xf1, 0xff, 0xff, 0xf0, 0x01, 0x23, 0xf2, 0x01, 0x12,
+ 0x01, 0x22, 0x00, 0xda,
+ 0x00, 0x00, 0x13, 0x33, 0x1f, 0xfe, 0x02, 0x21, 0x00, 0x10, 0x00, 0x10,
+ 0x0f, 0x2f, 0x00, 0x0f,
+ 0x0c, 0x00, 0x0d, 0x1e, 0x30, 0x10, 0x00, 0xfc, 0xde, 0x1f, 0x20, 0x10,
+ 0x0f, 0xee, 0xf1, 0x02,
+ 0x01, 0x0e, 0xec, 0xde, 0xef, 0x02, 0x02, 0xde, 0xed, 0xbe, 0xfd, 0xdf,
+ 0xdf, 0xf0, 0xf0, 0x01,
+ 0x15, 0x10, 0xfd, 0x0f, 0x02, 0x22, 0x30, 0x23, 0x20, 0x10, 0x20, 0x44,
+ 0x0f, 0xe0, 0x03, 0x34,
+ 0x42, 0x01, 0x02, 0x35, 0x11, 0x01, 0x01, 0x0f, 0xdd, 0x00, 0x10, 0x21,
+ 0x01, 0xdf, 0xf0, 0xff,
+ 0x0f, 0xfe, 0xf0, 0xf0, 0x04, 0x00, 0x10, 0x0d, 0xcd, 0x0d, 0x00, 0x31,
+ 0x00, 0x0d, 0x01, 0x20,
+ 0x10, 0x20, 0x12, 0x21, 0x10, 0x0e, 0x0f, 0x10, 0x32, 0x13, 0x01, 0x31,
+ 0x00, 0x0e, 0x01, 0x02,
+ 0xf0, 0xf0, 0x01, 0xf1, 0xef, 0x00, 0xe0, 0x00, 0x12, 0x25, 0xf0, 0x02,
+ 0x00, 0x0f, 0x0e, 0xfe,
+ 0xff, 0x01, 0x43, 0x01, 0x00, 0xfd, 0x0d, 0x10, 0x44, 0x24, 0x00, 0xfd,
+ 0x20, 0x32, 0x01, 0x00,
+ 0x00, 0xfd, 0x0f, 0x00, 0x21, 0x10, 0x0e, 0x00, 0x32, 0x12, 0x01, 0xef,
+ 0xfd, 0x00, 0x00, 0xf3,
+ 0xf0, 0x0e, 0xf0, 0xfe, 0xef, 0xdf, 0x10, 0x21, 0x01, 0xdf, 0xee, 0xef,
+ 0x00, 0xe0, 0xf2, 0xe0,
+ 0x13, 0x13, 0x00, 0xdd, 0xef, 0xf0, 0xfe, 0x00, 0x00, 0xf0, 0x0f, 0x0e,
+ 0xee, 0x0f, 0x0f, 0x0f,
+ 0x32, 0x10, 0x01, 0x22, 0x00, 0x0d, 0x02, 0x65, 0x00, 0xea, 0x00, 0x00,
+ 0xff, 0xdf, 0x10, 0x23,
+ 0x00, 0xca, 0x00, 0x22, 0xf0, 0xe0, 0x02, 0x31, 0xff, 0xee, 0xf0, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0xee, 0x11, 0x24, 0x00, 0x00, 0x0f, 0x42, 0x13, 0x2f, 0xfe,
+ 0x0f, 0x40, 0x0f, 0x20,
+ 0x00, 0x30, 0x10, 0x10, 0x12, 0x00, 0x0c, 0xf0, 0x00, 0xff, 0xf0, 0x00,
+ 0x00, 0xf0, 0xe0, 0x02,
+ 0xe0, 0xd0, 0x0f, 0xe0, 0xef, 0x0f, 0xf0, 0xff, 0xee, 0xfe, 0x01, 0x25,
+ 0x1f, 0xfe, 0xf0, 0x00,
+ 0xef, 0xec, 0x00, 0x02, 0x33, 0x10, 0x00, 0x00, 0x02, 0x04, 0x32, 0xf0,
+ 0x0f, 0x01, 0x35, 0x13,
+ 0x00, 0xfd, 0xfe, 0x12, 0x33, 0x00, 0x0e, 0xf0, 0x12, 0x11, 0x14, 0x00,
+ 0xfe, 0xed, 0xfe, 0x00,
+ 0xf1, 0xee, 0xfb, 0x0f, 0x10, 0x20, 0x0c, 0xfe, 0x0f, 0x1d, 0x0e, 0x0d,
+ 0x0f, 0x22, 0x01, 0x00,
+ 0xd0, 0x01, 0x01, 0xe0, 0xef, 0xf1, 0xc0, 0xec, 0xef, 0xf0, 0xf0, 0xee,
+ 0xf0, 0xff, 0xde, 0xdf,
+ 0x11, 0x44, 0x01, 0xf0, 0xff, 0x00, 0x23, 0x10, 0x0f, 0x0e, 0x11, 0x01,
+ 0x00, 0xfc, 0x0f, 0x30,
+ 0x13, 0x10, 0x0f, 0x34, 0x02, 0x0f, 0x00, 0x20, 0x0e, 0x0e, 0x31, 0x01,
+ 0xde, 0xfe, 0x0f, 0xfd,
+ 0xe0, 0x0f, 0xef, 0x01, 0x04, 0x01, 0xd0, 0xfe, 0xf0, 0xf1, 0x00, 0x03,
+ 0x33, 0x0e, 0xca, 0x00,
+ 0x40, 0x30, 0x10, 0x00, 0x31, 0x10, 0x02, 0x30, 0x1f, 0xff, 0xdf, 0x00,
+ 0x22, 0x01, 0x00, 0xef,
+ 0x01, 0x04, 0x01, 0x10, 0x0e, 0xef, 0x0f, 0x10, 0x11, 0x12, 0x24, 0x12,
+ 0x01, 0x10, 0x00, 0x00,
+ 0xf1, 0x02, 0xf0, 0x00, 0x11, 0x02, 0x0f, 0xff, 0xf0, 0x13, 0x02, 0x10,
+ 0x14, 0x10, 0x10, 0x14,
+ 0xf1, 0x0e, 0xff, 0x0f, 0x30, 0x01, 0x00, 0x00, 0x10, 0x0e, 0x21, 0x33,
+ 0x20, 0x0e, 0x0f, 0x00,
+ 0x00, 0x03, 0x0f, 0x3e, 0x0c, 0xee, 0x0f, 0x43, 0x01, 0x0c, 0x0f, 0x0d,
+ 0x00, 0x10, 0x21, 0x01,
+ 0xf1, 0x02, 0x00, 0xef, 0xed, 0xf2, 0xf2, 0xee, 0xf0, 0x01, 0xf0, 0xbb,
+ 0xff, 0xee, 0xef, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x10, 0x22, 0x12, 0x00, 0x33, 0x00, 0x10, 0x10, 0x11,
+ 0x13, 0x24, 0x00, 0x20,
+ 0x11, 0xef, 0xee, 0x03, 0x35, 0x11, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x01,
+ 0xf1, 0xf1, 0x00, 0x0f,
+ 0x01, 0x00, 0xf0, 0xee, 0xfe, 0x01, 0xf0, 0xff, 0xee, 0x00, 0x00, 0xdb,
+ 0x00, 0x01, 0x1f, 0x0c,
+ 0x10, 0x0f, 0x20, 0x32, 0x10, 0x1d, 0x00, 0x2f, 0x1f, 0x00, 0x0e, 0x01,
+ 0x01, 0x21, 0x00, 0x0e,
+ 0x0f, 0xf0, 0xf0, 0x04, 0x01, 0x01, 0x0e, 0xdd, 0xf2, 0x01, 0xf1, 0x12,
+ 0x32, 0xff, 0x0f, 0x01,
+ 0x00, 0xef, 0xfd, 0x0d, 0xf0, 0x10, 0x41, 0x00, 0xee, 0x00, 0x00, 0x00,
+ 0x12, 0x21, 0x20, 0x02,
+ 0x01, 0x0f, 0x00, 0x0e, 0xfe, 0x00, 0x11, 0x22, 0x00, 0xfd, 0x00, 0x22,
+ 0x11, 0x00, 0x00, 0xef,
+ 0x02, 0xf1, 0xf1, 0x00, 0x0f, 0x00, 0x0e, 0xce, 0xf0, 0x11, 0x44, 0x10,
+ 0xff, 0xac, 0x00, 0x00,
+ 0xf0, 0x00, 0xe2, 0x10, 0x00, 0xff, 0xd0, 0xf0, 0xfe, 0x00, 0x01, 0xfd,
+ 0xdf, 0x12, 0x00, 0x01,
+ 0x00, 0x0f, 0x0f, 0x0f, 0x11, 0x37, 0x20, 0x01, 0x10, 0x1f, 0x0e, 0x0f,
+ 0x02, 0x33, 0x12, 0x0d,
+ 0x0d, 0x00, 0x00, 0x00, 0x01, 0x24, 0x12, 0x00, 0xfe, 0x01, 0x23, 0x00,
+ 0xfd, 0xe0, 0xef, 0xfd,
+ 0x0e, 0x02, 0x01, 0x01, 0xfe, 0xd0, 0xf1, 0x12, 0x10, 0x00, 0x01, 0x25,
+ 0x31, 0x00, 0xfc, 0xfd,
+ 0x30, 0x51, 0x01, 0x11, 0x30, 0x10, 0x0c, 0x01, 0x00, 0x10, 0x10, 0x02,
+ 0xd0, 0x00, 0x01, 0xe0,
+ 0xed, 0xff, 0xe0, 0x02, 0xee, 0xfe, 0xf0, 0x10, 0x00, 0xdf, 0xfc, 0x00,
+ 0x01, 0x01, 0x0f, 0xf0,
+ 0xf0, 0x03, 0x11, 0xde, 0xec, 0xf0, 0x00, 0x45, 0x01, 0x21, 0x0f, 0x00,
+ 0x13, 0x31, 0x0e, 0x0f,
+ 0x24, 0x33, 0x03, 0x00, 0x01, 0x0f, 0x2f, 0x11, 0x03, 0x01, 0x00, 0x00,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0x0c, 0xdf, 0x10, 0x20, 0x0b, 0x0f, 0x10, 0x0f, 0x2f, 0xfd, 0x00, 0x2f,
+ 0x0d, 0x00, 0x02, 0xf1,
+ 0xdd, 0x01, 0x12, 0x00, 0xff, 0xf0, 0x02, 0xf1, 0xd0, 0x10, 0x0e, 0xbd,
+ 0xed, 0xf0, 0x02, 0x01,
+ 0x00, 0x20, 0xcb, 0xff, 0xf0, 0xf1, 0x02, 0x11, 0x23, 0x00, 0x0b, 0xef,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0d, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x23, 0x0f, 0xdd, 0x00, 0x2f, 0x00,
+ 0x0f, 0x03, 0x02, 0xfd,
+ 0xfc, 0xee, 0xdf, 0x01, 0x02, 0x05, 0x00, 0xdf, 0xdf, 0x0f, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x8c, 0x11, 0x68, 0x09, 0xce, 0x12, 0x6f, 0x0a, 0x00, 0xf1, 0x00, 0x00,
+ 0x0e, 0x0e, 0x10, 0x32,
+ 0x22, 0x2f, 0x1f, 0x10, 0x00, 0x02, 0x12, 0x10, 0xfd, 0xe0, 0x00, 0x10,
+ 0x03, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0x01, 0xf0, 0x00, 0x11, 0x01, 0x20,
+ 0x21, 0x00, 0x01, 0x13,
+ 0xfe, 0xfd, 0x01, 0x22, 0xe0, 0xf1, 0x00, 0x00, 0x03, 0x02, 0x00, 0xe0,
+ 0xe1, 0x13, 0x23, 0x13,
+ 0x10, 0x0d, 0xed, 0x00, 0x00, 0x12, 0x01, 0x1f, 0x31, 0x23, 0x01, 0x0f,
+ 0xff, 0x1e, 0x10, 0x00,
+ 0x00, 0x20, 0x30, 0x00, 0x0a, 0x20, 0x1f, 0x10, 0x1e, 0x2e, 0x00, 0x10,
+ 0x01, 0x01, 0x02, 0x00,
+ 0xf0, 0xed, 0xe0, 0xdf, 0xdd, 0xdd, 0xee, 0xff, 0xff, 0xed, 0xcd, 0xf0,
+ 0xef, 0x0f, 0xec, 0xef,
+ 0xdf, 0x02, 0x26, 0x00, 0x00, 0x11, 0x30, 0x22, 0x12, 0x00, 0xf0, 0x00,
+ 0x31, 0x32, 0x11, 0x10,
+ 0x0f, 0x00, 0x05, 0x32, 0x12, 0x22, 0x01, 0xf0, 0x02, 0x22, 0x03, 0x31,
+ 0xfd, 0xdc, 0x00, 0x00,
+ 0x00, 0x0f, 0xff, 0xed, 0xf0, 0xe0, 0xe1, 0xf1, 0xf2, 0x00, 0xde, 0xfe,
+ 0x00, 0x30, 0x20, 0x31,
+ 0x00, 0x0f, 0x5f, 0x20, 0x2f, 0x00, 0x21, 0x31, 0x00, 0xff, 0xf0, 0x00,
+ 0xf0, 0x01, 0x03, 0x01,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0xf0, 0xf1, 0x01, 0x02,
+ 0x00, 0x0f, 0x23, 0x00,
+ 0xbe, 0x0f, 0x0e, 0x22, 0x34, 0x02, 0x0e, 0xfd, 0x00, 0x32, 0x23, 0x22,
+ 0x00, 0xf0, 0x0f, 0x33,
+ 0x11, 0x0f, 0xfc, 0xff, 0x0f, 0x23, 0x00, 0x0c, 0x20, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0x03, 0x21,
+ 0x00, 0x00, 0xee, 0xf0, 0x02, 0xee, 0xf0, 0xf0, 0xf0, 0xfe, 0xf0, 0x03,
+ 0xed, 0xdf, 0x00, 0xf0,
+ 0xf1, 0x01, 0xe0, 0x0e, 0xe1, 0x03, 0x0f, 0xfd, 0xef, 0x0f, 0x00, 0x02,
+ 0xf0, 0x00, 0xfd, 0xdc,
+ 0x0f, 0x0f, 0x0f, 0x1f, 0x34, 0x12, 0x00, 0x0c, 0xf0, 0x20, 0x31, 0x11,
+ 0x00, 0xfc, 0x00, 0x20,
+ 0xf0, 0xff, 0xf0, 0x10, 0x12, 0xff, 0xdf, 0xf0, 0x00, 0xe0, 0x00, 0x02,
+ 0xff, 0x0d, 0x00, 0x02,
+ 0xf2, 0xf0, 0x23, 0x10, 0xec, 0x01, 0x01, 0x02, 0x14, 0x01, 0x20, 0x00,
+ 0x1f, 0x0d, 0x0e, 0x20,
+ 0x2f, 0x21, 0x53, 0x11, 0x0f, 0x0e, 0x00, 0x13, 0x02, 0xf0, 0x0f, 0xde,
+ 0xff, 0xf0, 0xe0, 0x0f,
+ 0x00, 0x20, 0xff, 0xed, 0xed, 0x00, 0x01, 0x10, 0x0f, 0xde, 0xf0, 0xef,
+ 0xf0, 0xf1, 0x01, 0x00,
+ 0x01, 0xf0, 0xff, 0xda, 0x00, 0x10, 0x23, 0x21, 0x0e, 0x0f, 0x21, 0x12,
+ 0x00, 0xe1, 0x12, 0x24,
+ 0x03, 0x24, 0xe0, 0xff, 0xf0, 0xf0, 0x00, 0x03, 0x30, 0x0d, 0x00, 0x02,
+ 0x02, 0x00, 0x0e, 0xfd,
+ 0x00, 0x40, 0x01, 0x1f, 0xfe, 0xee, 0x0f, 0x20, 0x2f, 0x0c, 0x00, 0x0f,
+ 0xe0, 0x00, 0x10, 0x0e,
+ 0xe0, 0xf0, 0x0f, 0xf0, 0xe0, 0x01, 0xf1, 0xfe, 0xeb, 0xcf, 0xde, 0xff,
+ 0x01, 0x04, 0x10, 0xff,
+ 0xdd, 0xe0, 0xee, 0xe0, 0x00, 0x01, 0x02, 0x03, 0x01, 0x00, 0x0d, 0x00,
+ 0x0f, 0x1e, 0x2f, 0x30,
+ 0x10, 0x23, 0x12, 0x20, 0x30, 0x0f, 0xef, 0x00, 0x32, 0x01, 0x10, 0x0f,
+ 0xdd, 0x00, 0x0d, 0xef,
+ 0xff, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0xce, 0x01, 0xf3, 0xf0, 0x01, 0x00,
+ 0xf0, 0x02, 0x30, 0xff,
+ 0xed, 0x10, 0x41, 0x33, 0x30, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xfd,
+ 0x0f, 0x01, 0xf4, 0x01,
+ 0x02, 0x20, 0x0f, 0xff, 0x20, 0x12, 0x21, 0x00, 0x0f, 0x00, 0xf2, 0x00,
+ 0x0e, 0x01, 0x45, 0x00,
+ 0xf0, 0xf0, 0x01, 0xf0, 0xf1, 0x02, 0x02, 0xf0, 0x10, 0x03, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x34, 0x01, 0x00, 0xf0, 0x02, 0x00, 0xf0, 0xff, 0xfd, 0x0e, 0x12,
+ 0x56, 0x10, 0x0f, 0xee,
+ 0x00, 0x3d, 0x10, 0x20, 0x53, 0x10, 0x0d, 0x00, 0x12, 0x30, 0x30, 0x02,
+ 0x00, 0x00, 0xfe, 0x00,
+ 0x00, 0x10, 0x00, 0xd2, 0x00, 0xec, 0x0f, 0xff, 0xdc, 0xdf, 0x01, 0xf1,
+ 0xe0, 0xf0, 0xfe, 0xff,
+ 0x00, 0x00, 0xe0, 0xfe, 0xee, 0xf0, 0x0e, 0x00, 0x33, 0x00, 0x32, 0x33,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x11, 0x13, 0x14, 0x00, 0x00, 0xf1, 0x04, 0xf0, 0xe0, 0x00, 0x33,
+ 0x11, 0x11, 0xf0, 0xee,
+ 0xf0, 0x12, 0x01, 0xf0, 0xed, 0xee, 0xe0, 0x03, 0xc0, 0xe0, 0x0f, 0xfe,
+ 0x0f, 0xdf, 0x00, 0x10,
+ 0x40, 0x00, 0x2d, 0x2f, 0x1b, 0x30, 0x20, 0x00, 0x23, 0x10, 0x1e, 0xfd,
+ 0xed, 0x00, 0x02, 0x00,
+ 0x01, 0x31, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0xde, 0x00,
+ 0x00, 0x02, 0xf0, 0xed,
+ 0x00, 0xf0, 0x11, 0x10, 0xed, 0xee, 0x11, 0x45, 0x01, 0xf0, 0x0d, 0x10,
+ 0x24, 0x21, 0xf0, 0xef,
+ 0x0e, 0x20, 0x01, 0x01, 0xf0, 0x0e, 0x0f, 0x00, 0x40, 0xf0, 0xeb, 0x00,
+ 0x22, 0x21, 0x01, 0x01,
+ 0x33, 0x00, 0xef, 0xf1, 0xf0, 0xff, 0x01, 0x31, 0xe0, 0xdd, 0x00, 0xff,
+ 0xf0, 0x02, 0x01, 0x00,
+ 0x0c, 0xe0, 0x00, 0x01, 0xf2, 0xef, 0x00, 0x01, 0xff, 0xde, 0x01, 0x03,
+ 0x0f, 0xed, 0x00, 0x00,
+ 0xfe, 0x00, 0x15, 0x10, 0xee, 0xee, 0x0f, 0x42, 0x13, 0xff, 0xf0, 0x10,
+ 0x22, 0x42, 0x00, 0x10,
+ 0x2f, 0x0f, 0x00, 0x11, 0x1f, 0x2f, 0x00, 0x11, 0x03, 0xe0, 0x02, 0xff,
+ 0x0d, 0xf0, 0x00, 0x11,
+ 0xd0, 0xf0, 0xf0, 0xf1, 0x10, 0x00, 0x0d, 0xe0, 0xf0, 0xef, 0x00, 0x01,
+ 0x30, 0x10, 0x03, 0x41,
+ 0x00, 0x1d, 0x11, 0x42, 0x23, 0x01, 0x00, 0xee, 0x00, 0x43, 0xf0, 0xee,
+ 0x10, 0x0f, 0xde, 0x00,
+ 0x10, 0xff, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xf1, 0xee, 0xed, 0xfe, 0xdd,
+ 0xfd, 0x02, 0x15, 0x0f,
+ 0x0d, 0xef, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x10, 0x23, 0x00, 0x21, 0x11,
+ 0x12, 0xf0, 0xe1, 0x02,
+ 0x00, 0x00, 0x20, 0x14, 0x03, 0x00, 0xf0, 0x00, 0x10, 0x14, 0x1f, 0x10,
+ 0x00, 0x0e, 0xed, 0x13,
+ 0x43, 0x1e, 0x0c, 0x00, 0x00, 0x20, 0x10, 0x10, 0x0d, 0x00, 0x0e, 0x00,
+ 0x02, 0x45, 0xf0, 0x00,
+ 0x00, 0x0e, 0xfe, 0xe0, 0xee, 0x00, 0x23, 0x00, 0xfd, 0xf0, 0x00, 0xf0,
+ 0xdd, 0x00, 0xf0, 0xf0,
+ 0xf0, 0x03, 0x01, 0xce, 0xdc, 0xdc, 0xdf, 0xef, 0xfe, 0xf0, 0x02, 0x12,
+ 0x2e, 0x0d, 0x0d, 0x1f,
+ 0x31, 0x22, 0x01, 0x0f, 0xf0, 0x0f, 0x2f, 0xff, 0x00, 0x03, 0x02, 0x00,
+ 0xfd, 0xed, 0xfe, 0x00,
+ 0x10, 0x00, 0x01, 0xf1, 0x00, 0xef, 0xff, 0xf0, 0xe1, 0xd0, 0xd0, 0x01,
+ 0x20, 0xe0, 0xff, 0x00,
+ 0x00, 0x00, 0x31, 0x20, 0x00, 0x20, 0x32, 0x00, 0x2f, 0x00, 0xef, 0x00,
+ 0x10, 0xf0, 0xd0, 0x00,
+ 0x02, 0x00, 0x01, 0x10, 0x02, 0x10, 0x01, 0x20, 0x32, 0x21, 0x0f, 0xff,
+ 0x10, 0x00, 0xe0, 0x00,
+ 0x01, 0x11, 0x00, 0xf0, 0x03, 0xf0, 0xf0, 0x0f, 0x00, 0x11, 0x01, 0x00,
+ 0x00, 0x04, 0x32, 0x13,
+ 0x00, 0xdb, 0xf0, 0x00, 0xf2, 0x04, 0x21, 0xff, 0xef, 0x01, 0x01, 0x00,
+ 0xdc, 0x00, 0x30, 0x00,
+ 0x10, 0x20, 0x2d, 0x30, 0x01, 0x00, 0x32, 0x32, 0x20, 0x30, 0x1f, 0x00,
+ 0x0e, 0x10, 0x21, 0x10,
+ 0x10, 0xfe, 0xfd, 0x01, 0x00, 0xee, 0xfe, 0xfd, 0xff, 0xf0, 0x01, 0xbe,
+ 0xfe, 0xef, 0x0e, 0xdc,
+ 0xef, 0x0f, 0x00, 0xdf, 0xf0, 0x0f, 0xdd, 0xff, 0xef, 0x00, 0xf0, 0x02,
+ 0x14, 0x53, 0x01, 0x0d,
+ 0xf0, 0xf0, 0x25, 0x42, 0x34, 0x10, 0x00, 0xfe, 0x11, 0x35, 0x01, 0x21,
+ 0x01, 0x0f, 0x10, 0x12,
+ 0x02, 0x00, 0xfd, 0x01, 0x00, 0xe0, 0xfe, 0xf1, 0xe3, 0xf1, 0xde, 0xed,
+ 0x0f, 0xff, 0xde, 0x00,
+ 0x33, 0x13, 0x33, 0x3f, 0x0c, 0x10, 0x20, 0x1f, 0x20, 0x00, 0x2e, 0x10,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x01, 0x01, 0x22, 0x31, 0x13, 0x01, 0x00, 0xdf, 0xfe, 0x11, 0x12,
+ 0x0e, 0x0f, 0xff, 0x00,
+ 0xf0, 0xef, 0xf0, 0x11, 0x35, 0x02, 0x00, 0x01, 0xfe, 0x11, 0x34, 0xf0,
+ 0xef, 0x00, 0x42, 0x13,
+ 0x0f, 0x1f, 0xfc, 0xfe, 0x00, 0x12, 0x33, 0x0e, 0xfe, 0x10, 0x31, 0x13,
+ 0x10, 0xfe, 0xfe, 0x00,
+ 0x32, 0x00, 0x00, 0x1e, 0xf0, 0x01, 0xf0, 0x00, 0xef, 0xfe, 0x11, 0x23,
+ 0xf0, 0xd0, 0xed, 0xf0,
+ 0x14, 0x00, 0xed, 0x01, 0xf3, 0xe0, 0x00, 0xff, 0xec, 0x0e, 0xf0, 0xf2,
+ 0xf1, 0xf0, 0xee, 0xff,
+ 0x00, 0x11, 0xff, 0xfe, 0x00, 0xf2, 0x00, 0x0e, 0xfd, 0x0f, 0x30, 0x00,
+ 0xf0, 0x20, 0x2d, 0x1f,
+ 0x20, 0x12, 0x11, 0x0e, 0x0f, 0x11, 0x00, 0xee, 0x00, 0x02, 0xf0, 0xe1,
+ 0x00, 0xf0, 0xfe, 0xf0,
+ 0x02, 0x01, 0x01, 0x10, 0x00, 0xfe, 0xe0, 0x00, 0x00, 0x01, 0xf0, 0x02,
+ 0x13, 0x0d, 0xff, 0xef,
+ 0x01, 0x13, 0x45, 0x20, 0x10, 0x2f, 0x00, 0x32, 0x13, 0x1e, 0x1c, 0x00,
+ 0x0d, 0x00, 0x31, 0x14,
+ 0x01, 0xde, 0xde, 0x0f, 0x00, 0x00, 0xf2, 0xf1, 0x00, 0x0f, 0xce, 0x0d,
+ 0xfe, 0xef, 0x0f, 0x0e,
+ 0x00, 0x00, 0xec, 0x0f, 0x10, 0x0f, 0xf0, 0xf1, 0x01, 0x20, 0xf0, 0xf0,
+ 0x00, 0x11, 0x11, 0x00,
+ 0xf0, 0xf2, 0x03, 0x0f, 0x00, 0x01, 0xe2, 0x00, 0x01, 0x11, 0x02, 0x00,
+ 0x02, 0x35, 0x00, 0xde,
+ 0xfd, 0x10, 0x22, 0x1f, 0xfc, 0xf0, 0x22, 0x22, 0x10, 0x0e, 0xe0, 0x00,
+ 0x00, 0x00, 0x20, 0x00,
+ 0x10, 0x0f, 0xef, 0x0f, 0x20, 0x20, 0x10, 0x0c, 0xdf, 0x0d, 0x00, 0xf0,
+ 0xe3, 0x00, 0x00, 0xef,
+ 0xf1, 0xd0, 0xce, 0xff, 0xef, 0xe0, 0xde, 0xed, 0xff, 0xef, 0xfd, 0xe0,
+ 0x01, 0xf1, 0x0f, 0x1f,
+ 0x30, 0x13, 0x22, 0x01, 0x10, 0x00, 0x00, 0x30, 0x0d, 0x0f, 0x1f, 0x31,
+ 0x21, 0x20, 0x0e, 0x0e,
+ 0x10, 0x01, 0xf0, 0xe0, 0x0f, 0x21, 0x00, 0xcf, 0xef, 0x0f, 0xff, 0xf0,
+ 0xfd, 0xf1, 0x10, 0xf0,
+ 0xef, 0x0f, 0x01, 0x01, 0x41, 0x22, 0x00, 0xd0, 0x13, 0x23, 0x3f, 0x0f,
+ 0xec, 0xff, 0x00, 0xf1,
+ 0x00, 0x0f, 0x02, 0x22, 0x01, 0x00, 0x23, 0x22, 0x10, 0x00, 0x10, 0x14,
+ 0x0f, 0xff, 0x00, 0x12,
+ 0x11, 0xfe, 0xed, 0x0f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x00, 0xef, 0x22,
+ 0x12, 0xf0, 0x04, 0x20,
+ 0x00, 0xe2, 0xf0, 0xff, 0xed, 0x02, 0x02, 0xdf, 0x00, 0x00, 0x12, 0x00,
+ 0x11, 0x01, 0xf0, 0x0f,
+ 0x30, 0x0f, 0x20, 0x00, 0x2e, 0x30, 0x20, 0x10, 0x30, 0x42, 0x12, 0x23,
+ 0x20, 0x00, 0x0e, 0x0e,
+ 0x10, 0x55, 0xf0, 0xf0, 0x00, 0x00, 0x21, 0x0f, 0xee, 0x11, 0x02, 0x0e,
+ 0xde, 0x00, 0xf0, 0xd0,
+ 0xec, 0xf0, 0xfe, 0xd0, 0xef, 0xef, 0x10, 0x0d, 0xde, 0xed, 0x00, 0x30,
+ 0x01, 0xf0, 0x10, 0x11,
+ 0x11, 0x11, 0x01, 0x12, 0x0f, 0xde, 0x22, 0x35, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0xf0, 0x0e,
+ 0x01, 0x15, 0x01, 0xf2, 0xf0, 0xfe, 0xef, 0x03, 0x02, 0xcf, 0xef, 0x00,
+ 0xe2, 0xef, 0xfd, 0xef,
+ 0xfe, 0x00, 0x00, 0x20, 0x1e, 0x2e, 0x11, 0x20, 0x21, 0x20, 0x20, 0x0d,
+ 0x0c, 0x10, 0x10, 0xff,
+ 0xdd, 0x0f, 0x43, 0x02, 0x1f, 0x00, 0x01, 0x02, 0x11, 0x00, 0x0d, 0x01,
+ 0xf0, 0xfe, 0x00, 0xfe,
+ 0xf0, 0x00, 0x00, 0xf0, 0xfd, 0xde, 0x00, 0x27, 0x31, 0x00, 0xd0, 0x1f,
+ 0x10, 0xf3, 0x00, 0x00,
+ 0x1f, 0x1e, 0x00, 0x11, 0x00, 0xf0, 0xfc, 0x00, 0x21, 0x33, 0xe0, 0x0d,
+ 0x11, 0x12, 0x11, 0x22,
+ 0x0f, 0xff, 0xfe, 0xf0, 0x00, 0x10, 0x02, 0xff, 0x0f, 0x0f, 0xfe, 0xfe,
+ 0x14, 0x24, 0x01, 0x00,
+ 0xfd, 0xff, 0x00, 0xf0, 0x03, 0x20, 0xf1, 0xf0, 0xfd, 0x01, 0x00, 0xee,
+ 0xff, 0xff, 0xff, 0xe1,
+ 0x02, 0x03, 0xf0, 0xe0, 0xee, 0x01, 0x22, 0x00, 0xf0, 0x0e, 0xfe, 0x0e,
+ 0x0e, 0x10, 0x30, 0x0f,
+ 0x20, 0x02, 0x22, 0x03, 0xff, 0x0f, 0x10, 0x12, 0x00, 0x03, 0x21, 0x01,
+ 0xfe, 0x0f, 0x20, 0x0e,
+ 0xdd, 0x00, 0x10, 0x14, 0x22, 0x00, 0xfe, 0xdf, 0xee, 0xf0, 0x00, 0x21,
+ 0xff, 0xf0, 0xef, 0x00,
+ 0x01, 0xf0, 0x0e, 0x00, 0x25, 0x31, 0x11, 0x10, 0x12, 0x11, 0x21, 0x00,
+ 0x1f, 0x10, 0x00, 0x00,
+ 0x00, 0x30, 0xf0, 0xf0, 0x00, 0x1f, 0xf0, 0xe0, 0x01, 0x03, 0x00, 0xee,
+ 0x0d, 0xff, 0xff, 0xdc,
+ 0x0f, 0x1f, 0x0e, 0x00, 0x0f, 0x0d, 0xee, 0xdc, 0x00, 0x21, 0x23, 0x10,
+ 0x01, 0x01, 0xf2, 0xf1,
+ 0x00, 0xed, 0x01, 0x22, 0x05, 0xff, 0xef, 0xf0, 0x00, 0x22, 0x00, 0x01,
+ 0x10, 0x00, 0x24, 0x44,
+ 0x00, 0xfe, 0x00, 0x0d, 0xf1, 0x35, 0x1f, 0x1f, 0x10, 0x00, 0xfe, 0x0e,
+ 0x11, 0x54, 0x01, 0x10,
+ 0x00, 0xeb, 0x01, 0x30, 0x01, 0x00, 0x22, 0x20, 0x00, 0x00, 0xe0, 0x12,
+ 0x0f, 0xed, 0xe0, 0xff,
+ 0xef, 0x01, 0x03, 0xe0, 0xcb, 0xdf, 0xee, 0x0f, 0xed, 0xdf, 0x00, 0x10,
+ 0xf0, 0xec, 0xff, 0xfe,
+ 0xfe, 0x00, 0x35, 0x00, 0xee, 0x0e, 0x00, 0x1f, 0x00, 0x12, 0x00, 0x0e,
+ 0x0f, 0x0f, 0x20, 0x00,
+ 0xe0, 0x00, 0x02, 0x10, 0xff, 0xdd, 0x00, 0x44, 0xf0, 0xbd, 0x01, 0x10,
+ 0x00, 0xfd, 0xf0, 0xef,
+ 0xef, 0x01, 0x24, 0x00, 0xed, 0x01, 0x11, 0x13, 0x01, 0x01, 0x0e, 0x0f,
+ 0x21, 0x00, 0x0e, 0xee,
+ 0x00, 0x00, 0x00, 0x31, 0x01, 0x01, 0x02, 0xf1, 0x01, 0x33, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x0f,
+ 0xff, 0x10, 0x0e, 0x0e, 0x10, 0x00, 0x00, 0x02, 0x13, 0x11, 0x00, 0x02,
+ 0x11, 0x12, 0x25, 0x01,
+ 0xf0, 0xef, 0x00, 0xff, 0x00, 0x00, 0xf3, 0xee, 0xfe, 0xf0, 0x02, 0xf0,
+ 0xf1, 0x00, 0xf0, 0x26,
+ 0x00, 0x0e, 0x00, 0x0e, 0x10, 0x10, 0x20, 0x10, 0x20, 0x30, 0x10, 0x1f,
+ 0x00, 0x10, 0x20, 0x56,
+ 0x1f, 0xff, 0x0e, 0x01, 0x43, 0x03, 0x00, 0x1d, 0x1d, 0xfe, 0x00, 0x31,
+ 0xe0, 0xdc, 0x00, 0x00,
+ 0xfd, 0x9b, 0x0f, 0xef, 0x00, 0x02, 0xde, 0xec, 0x00, 0x0f, 0xdf, 0xff,
+ 0x00, 0xfe, 0x00, 0xe0,
+ 0x00, 0x10, 0x01, 0xf2, 0x01, 0x14, 0x32, 0x0d, 0xfe, 0x35, 0x33, 0x0f,
+ 0x00, 0x40, 0x22, 0x12,
+ 0x21, 0x01, 0x00, 0x12, 0xf1, 0xf0, 0xf2, 0xf1, 0xf0, 0x02, 0xe2, 0x01,
+ 0xde, 0xec, 0xff, 0x00,
+ 0xde, 0xff, 0x00, 0x10, 0x20, 0x00, 0x20, 0x21, 0xf0, 0xf0, 0x11, 0x20,
+ 0x42, 0x10, 0x0e, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x21, 0xee, 0xdd, 0x77, 0x32, 0xcb, 0x22, 0x12, 0x0f,
+ 0x0f, 0xff, 0x01, 0x12,
+ 0x0f, 0xee, 0x00, 0x33, 0x12, 0xdf, 0xed, 0x00, 0x11, 0x02, 0xf1, 0x14,
+ 0x10, 0xee, 0x01, 0x24,
+ 0x00, 0xe0, 0x00, 0x11, 0x20, 0x0e, 0x01, 0x11, 0x1f, 0x0e, 0x1f, 0x10,
+ 0x33, 0x00, 0xe0, 0x10,
+ 0x21, 0x22, 0x1f, 0xfd, 0xe0, 0x30, 0x13, 0xff, 0xfc, 0x00, 0x11, 0x13,
+ 0x00, 0xfe, 0xf0, 0xfe,
+ 0x01, 0x13, 0x00, 0xff, 0xcc, 0x00, 0xf3, 0x21, 0x11, 0xee, 0xe0, 0x00,
+ 0xf0, 0xcd, 0x01, 0x24,
+ 0xff, 0xbd, 0x01, 0xe2, 0x00, 0xed, 0xef, 0x10, 0x2f, 0x0f, 0x0f, 0x32,
+ 0x11, 0x1d, 0x0c, 0x0d,
+ 0xf0, 0x20, 0x12, 0x00, 0x00, 0x03, 0xe0, 0x0d, 0xee, 0x0f, 0x00, 0x12,
+ 0x23, 0x0e, 0xfc, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0xe1, 0x02, 0x01, 0xf0, 0xff, 0xe0, 0xf1,
+ 0xef, 0x00, 0x00, 0xf1,
+ 0x02, 0x01, 0x00, 0x0f, 0x2e, 0x0d, 0xf0, 0x46, 0x32, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x18, 0x17, 0x77, 0x18, 0xbc, 0x16, 0xd3, 0x17, 0x00, 0x1f, 0x20, 0x32,
+ 0x12, 0xed, 0xfe, 0x01,
+ 0x11, 0x11, 0x00, 0xe0, 0x00, 0xf0, 0x02, 0xff, 0xee, 0x00, 0x0f, 0x00,
+ 0xef, 0x0d, 0x0d, 0x1e,
+ 0x0c, 0x0d, 0xe0, 0x20, 0xf0, 0xee, 0x0f, 0x20, 0x01, 0xe2, 0x02, 0xf1,
+ 0xf0, 0xff, 0x0f, 0x01,
+ 0x00, 0xf0, 0x00, 0x12, 0x00, 0x00, 0xfe, 0x0f, 0xef, 0x02, 0x15, 0x21,
+ 0x03, 0xe0, 0xe0, 0x02,
+ 0x01, 0xe0, 0xff, 0x00, 0x20, 0x2e, 0x00, 0x0f, 0xfd, 0x10, 0x32, 0x20,
+ 0x11, 0x1f, 0x00, 0x01,
+ 0x00, 0x10, 0x11, 0x00, 0x0e, 0x31, 0x11, 0x01, 0x1f, 0x0f, 0xf1, 0xff,
+ 0xfe, 0x0e, 0xcd, 0xf1,
+ 0x17, 0xd0, 0xcd, 0x01, 0xde, 0xcd, 0xee, 0x01, 0xf2, 0xef, 0xf0, 0x0d,
+ 0xfd, 0xff, 0x00, 0xef,
+ 0x0e, 0x02, 0x22, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x33, 0x0f, 0xfc, 0x30,
+ 0x20, 0x20, 0x0f, 0x00,
+ 0x41, 0x00, 0xee, 0x31, 0x0f, 0xce, 0x10, 0x10, 0x02, 0xf0, 0xed, 0xff,
+ 0xf0, 0x01, 0x0f, 0xef,
+ 0x00, 0x00, 0x0d, 0xef, 0xfe, 0x12, 0x33, 0x22, 0x00, 0xf0, 0xf0, 0x00,
+ 0xf0, 0x22, 0x24, 0xef,
+ 0xfe, 0x11, 0x12, 0x23, 0x00, 0xff, 0x0e, 0x01, 0x32, 0x00, 0x0f, 0x20,
+ 0x13, 0x00, 0xde, 0x00,
+ 0x31, 0x10, 0xfe, 0x13, 0x13, 0xfe, 0xff, 0x02, 0x03, 0x10, 0x00, 0xf0,
+ 0x03, 0x02, 0x20, 0x00,
+ 0x00, 0xef, 0xff, 0x02, 0xe3, 0xf0, 0x11, 0x00, 0xd0, 0xdc, 0xf0, 0x01,
+ 0x20, 0x01, 0x34, 0x00,
+ 0x0f, 0x00, 0x20, 0x11, 0x2f, 0x0e, 0x2e, 0x20, 0x35, 0x21, 0x00, 0x0e,
+ 0x20, 0x20, 0x21, 0x23,
+ 0x20, 0x10, 0x22, 0x12, 0x21, 0x21, 0xff, 0x00, 0x30, 0x01, 0xf1, 0xef,
+ 0xff, 0x0f, 0xdd, 0xdf,
+ 0xf0, 0x00, 0xe0, 0xfd, 0xde, 0x00, 0xfc, 0x00, 0x01, 0xff, 0x0e, 0x00,
+ 0x10, 0x0f, 0x11, 0x00,
+ 0xdd, 0xee, 0x00, 0x00, 0x11, 0x22, 0xff, 0xf0, 0x03, 0x21, 0x00, 0x1e,
+ 0x23, 0x22, 0x01, 0x12,
+ 0x23, 0x00, 0xe0, 0xd0, 0x04, 0xd0, 0xd0, 0xe0, 0x02, 0xe0, 0xdd, 0x22,
+ 0xf0, 0xcd, 0x01, 0x20,
+ 0x00, 0x0e, 0xfd, 0x21, 0x11, 0x10, 0x0f, 0x0f, 0x10, 0x0e, 0x00, 0x21,
+ 0x0f, 0x00, 0x31, 0x00,
+ 0xfc, 0xff, 0x10, 0x01, 0x00, 0x20, 0x22, 0x2f, 0xfd, 0x00, 0x00, 0x00,
+ 0x00, 0x22, 0xf0, 0x0e,
+ 0xf0, 0xfd, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xdd, 0xef, 0x24, 0x05, 0x00,
+ 0xe0, 0x00, 0x00, 0x12,
+ 0x11, 0x00, 0xed, 0x10, 0x14, 0x20, 0x0d, 0xfd, 0x00, 0x00, 0x23, 0x10,
+ 0x0f, 0xec, 0xf0, 0x10,
+ 0x35, 0x01, 0x00, 0x13, 0x00, 0x00, 0xdb, 0xff, 0x10, 0x31, 0x02, 0xf0,
+ 0x2f, 0x0e, 0xfd, 0x02,
+ 0x11, 0x00, 0x00, 0x0f, 0xf1, 0xf1, 0x12, 0x01, 0x01, 0xe1, 0xff, 0xff,
+ 0x01, 0x01, 0xdf, 0xdc,
+ 0x02, 0xf1, 0x00, 0xfe, 0xed, 0x10, 0x12, 0x1f, 0x1e, 0x12, 0x10, 0x00,
+ 0x00, 0x0e, 0xf0, 0x03,
+ 0x03, 0x0e, 0xff, 0x00, 0xee, 0x0f, 0xf0, 0x11, 0x32, 0x10, 0x23, 0x10,
+ 0x00, 0x1f, 0x20, 0x00,
+ 0xf0, 0x20, 0x11, 0x00, 0xe0, 0xe0, 0xff, 0xf0, 0xe0, 0xce, 0xfd, 0x02,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0xff, 0x10, 0x32, 0x1f, 0x0e, 0x0f, 0x01, 0x33, 0x33, 0x10, 0x10, 0x11,
+ 0x01, 0x14, 0x11, 0x01,
+ 0xf0, 0x0e, 0xf0, 0xf0, 0xe2, 0x01, 0x12, 0x10, 0x0e, 0xff, 0xfe, 0xfd,
+ 0xfd, 0x10, 0x0e, 0x2f,
+ 0x30, 0xf0, 0x00, 0xfd, 0xdc, 0x00, 0x0f, 0xfd, 0x00, 0x01, 0xd0, 0xee,
+ 0x00, 0x12, 0x11, 0x0d,
+ 0xf0, 0x11, 0x0e, 0x0f, 0x12, 0x24, 0x23, 0xe0, 0xdc, 0x00, 0x17, 0x00,
+ 0xcd, 0x13, 0x10, 0x0f,
+ 0x00, 0xf0, 0x25, 0x20, 0x21, 0x00, 0xf0, 0x00, 0x32, 0x22, 0x00, 0xee,
+ 0x00, 0x0f, 0x1f, 0x1f,
+ 0x33, 0x33, 0xed, 0xfe, 0x53, 0x1f, 0x0e, 0x12, 0x25, 0x20, 0x01, 0x01,
+ 0x03, 0xde, 0xfd, 0x00,
+ 0xd1, 0xe0, 0xde, 0xed, 0xff, 0xf1, 0x00, 0xdd, 0xfb, 0xee, 0x10, 0x2f,
+ 0x00, 0xf0, 0xf0, 0xf0,
+ 0xee, 0xf0, 0xee, 0x0f, 0xef, 0xe0, 0xf0, 0xcc, 0x00, 0x1f, 0x00, 0x1f,
+ 0x0e, 0x10, 0x21, 0x11,
+ 0x20, 0x20, 0x0d, 0x0f, 0x10, 0x02, 0xe2, 0x01, 0x01, 0xff, 0xdc, 0xf0,
+ 0x04, 0xff, 0xfe, 0x00,
+ 0x00, 0xf0, 0x00, 0xff, 0x20, 0x00, 0xd0, 0x0e, 0x00, 0x11, 0x23, 0x01,
+ 0x00, 0xf0, 0xf1, 0x00,
+ 0x00, 0x0f, 0xf0, 0x01, 0x01, 0x10, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0x20,
+ 0x01, 0x00, 0x0f, 0x20,
+ 0x01, 0x10, 0x10, 0x12, 0x22, 0x02, 0x20, 0x00, 0xff, 0x00, 0x0f, 0xff,
+ 0x03, 0x23, 0x01, 0x01,
+ 0x02, 0x00, 0xf0, 0xf0, 0xf0, 0x12, 0x12, 0xff, 0xdc, 0xe0, 0x04, 0xf0,
+ 0xef, 0x0f, 0x0e, 0xfd,
+ 0xe0, 0x10, 0x03, 0x21, 0x21, 0x0e, 0x00, 0x00, 0x10, 0x0f, 0x21, 0x44,
+ 0x10, 0x0c, 0x0e, 0x10,
+ 0x31, 0x44, 0x23, 0x20, 0x0e, 0x2e, 0x00, 0x00, 0x31, 0x24, 0x0f, 0xfe,
+ 0x23, 0xdd, 0xcc, 0x00,
+ 0x02, 0xfe, 0xbc, 0x00, 0xfe, 0xef, 0xff, 0xf0, 0x00, 0xff, 0xed, 0xe0,
+ 0x0f, 0x10, 0xff, 0xef,
+ 0x11, 0x14, 0x0e, 0xcb, 0x0f, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x20, 0x46,
+ 0x00, 0x21, 0x22, 0x01,
+ 0x22, 0x34, 0x11, 0x0e, 0xee, 0xe0, 0x01, 0xf2, 0xdf, 0xee, 0x00, 0x02,
+ 0xf1, 0xe1, 0x00, 0xfd,
+ 0x00, 0x10, 0x02, 0x22, 0xfe, 0xec, 0x02, 0x31, 0x00, 0x0d, 0xfe, 0x00,
+ 0x10, 0x01, 0x32, 0x22,
+ 0x00, 0x00, 0x10, 0x1f, 0x00, 0x20, 0x21, 0x33, 0x0f, 0x0f, 0x00, 0x00,
+ 0x10, 0x10, 0x11, 0x00,
+ 0x10, 0x00, 0xff, 0x00, 0x0f, 0xe0, 0x22, 0x14, 0x00, 0x00, 0xe0, 0xef,
+ 0xe0, 0xf0, 0x01, 0x00,
+ 0x23, 0x13, 0x10, 0x12, 0x20, 0xee, 0xed, 0x20, 0x10, 0x00, 0x00, 0x12,
+ 0x01, 0x32, 0x00, 0x0d,
+ 0x0f, 0xf0, 0x00, 0x13, 0x12, 0x10, 0x31, 0x02, 0xff, 0xfd, 0xfe, 0x01,
+ 0x31, 0x00, 0x30, 0x0e,
+ 0xdc, 0xef, 0x0f, 0x12, 0x22, 0xf0, 0xee, 0xf0, 0x01, 0x03, 0x01, 0xf0,
+ 0xed, 0xf0, 0xf1, 0x03,
+ 0xf0, 0xd0, 0xfc, 0xef, 0x0f, 0xfd, 0xee, 0x11, 0x35, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x20, 0x0f,
+ 0x0f, 0x01, 0x00, 0xff, 0xfc, 0x00, 0x0f, 0xee, 0x00, 0xef, 0x0e, 0x10,
+ 0x10, 0x22, 0x22, 0x01,
+ 0x10, 0x02, 0x10, 0xfe, 0xf0, 0x00, 0x00, 0xc0, 0xef, 0xe0, 0x01, 0x01,
+ 0xf1, 0xf2, 0xf0, 0xf0,
+ 0xff, 0x0f, 0xfb, 0x01, 0x75, 0x0f, 0xfe, 0x23, 0x10, 0x0f, 0x00, 0x00,
+ 0x23, 0x23, 0x00, 0xf0,
+ 0x02, 0x23, 0x12, 0xdf, 0xfe, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x20, 0x0f,
+ 0x0f, 0x11, 0xfe, 0xfb,
+ 0x00, 0x2f, 0x10, 0x00, 0xef, 0x0f, 0x10, 0x00, 0xfd, 0xfd, 0xfe, 0xe0,
+ 0x0f, 0xff, 0x00, 0x0f,
+ 0x2f, 0xfe, 0xf0, 0x15, 0x22, 0x00, 0xcf, 0x00, 0x02, 0xf0, 0xf1, 0x00,
+ 0xf2, 0xf0, 0x0f, 0xef,
+ 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x03, 0x30, 0xf1, 0x02, 0xf2, 0x01, 0x00,
+ 0x11, 0x0f, 0xfd, 0x0e,
+ 0x0d, 0x10, 0x32, 0x10, 0x0f, 0x10, 0x40, 0x11, 0x12, 0x12, 0x23, 0x34,
+ 0xf0, 0xee, 0xff, 0xf0,
+ 0x02, 0xf0, 0xef, 0x0f, 0xee, 0xdb, 0xfe, 0xef, 0xf0, 0x02, 0x00, 0x0d,
+ 0xe0, 0x00, 0xe0, 0xff,
+ 0xf0, 0xe0, 0x00, 0x0d, 0xdb, 0xef, 0xfe, 0xe0, 0x02, 0xee, 0xfd, 0x10,
+ 0x00, 0x0f, 0x10, 0x55,
+ 0x12, 0x10, 0x0d, 0x11, 0x32, 0xfe, 0x0f, 0x1f, 0x10, 0x0f, 0xef, 0x0e,
+ 0xef, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x11, 0x0e, 0xde, 0x00, 0x10, 0x10, 0x12, 0x00, 0xff, 0x10,
+ 0x33, 0xe0, 0x0f, 0x00,
+ 0x02, 0x00, 0xf1, 0x03, 0x02, 0x01, 0x01, 0xe0, 0x00, 0xfd, 0x00, 0x00,
+ 0x20, 0x00, 0x01, 0xff,
+ 0x1f, 0x51, 0x01, 0xf1, 0x32, 0xef, 0x00, 0x54, 0x01, 0x10, 0xef, 0xef,
+ 0x0f, 0x10, 0x33, 0x00,
+ 0xef, 0x0f, 0xf0, 0x15, 0x12, 0xf0, 0x00, 0xf0, 0x03, 0xe0, 0xd0, 0xff,
+ 0xef, 0x00, 0x00, 0x00,
+ 0x0f, 0xef, 0x0f, 0x22, 0x00, 0xf0, 0x1f, 0x20, 0x10, 0x32, 0x13, 0x20,
+ 0x01, 0x00, 0x54, 0x00,
+ 0x0e, 0x0c, 0x21, 0x52, 0x13, 0x12, 0x1f, 0x20, 0x20, 0x33, 0x13, 0x1f,
+ 0x10, 0x20, 0xf0, 0x02,
+ 0x02, 0x01, 0xe0, 0xed, 0xff, 0x0f, 0xde, 0xee, 0xe0, 0xfe, 0x00, 0x0f,
+ 0xfd, 0x00, 0x01, 0xf0,
+ 0xef, 0x0d, 0x0f, 0x20, 0x00, 0xfc, 0xee, 0xfd, 0x00, 0x01, 0x02, 0x10,
+ 0x00, 0x01, 0x14, 0x00,
+ 0x00, 0x03, 0x20, 0x01, 0x12, 0x02, 0xf0, 0xce, 0xfe, 0xf0, 0x01, 0x02,
+ 0x00, 0xf1, 0xd1, 0x03,
+ 0x03, 0xe0, 0x0c, 0xf0, 0x00, 0x01, 0x00, 0x0e, 0x00, 0xed, 0x0d, 0x10,
+ 0x21, 0x00, 0x01, 0x10,
+ 0x10, 0x0e, 0xff, 0x01, 0x11, 0x21, 0x23, 0x20, 0xff, 0xfd, 0x20, 0x3f,
+ 0x1e, 0xec, 0x0f, 0x0f,
+ 0x1f, 0x21, 0x02, 0x01, 0xf0, 0x0f, 0xe0, 0xf0, 0x00, 0x12, 0x03, 0xf1,
+ 0x00, 0xdd, 0x00, 0x00,
+ 0xff, 0x0e, 0x00, 0x11, 0x34, 0x01, 0x00, 0x10, 0x00, 0xde, 0xee, 0x47,
+ 0x00, 0xae, 0x11, 0x11,
+ 0xfe, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x10, 0x1f, 0x0f, 0x02, 0x34,
+ 0x10, 0x00, 0x00, 0x0e,
+ 0x00, 0xf1, 0xf0, 0xfc, 0x0f, 0x0e, 0xef, 0x32, 0x12, 0xe0, 0x02, 0x22,
+ 0xf1, 0x00, 0xde, 0x00,
+ 0x13, 0x00, 0xe0, 0x00, 0xff, 0xff, 0xef, 0x0e, 0xee, 0x0f, 0x23, 0x11,
+ 0x0f, 0xde, 0x10, 0x25,
+ 0x11, 0x01, 0xdf, 0x20, 0x12, 0xdc, 0xfe, 0x0f, 0x0f, 0x00, 0x10, 0x11,
+ 0x21, 0x00, 0x00, 0x11,
+ 0x12, 0x10, 0x02, 0x00, 0x00, 0x02, 0x02, 0xf0, 0x0f, 0xcd, 0xed, 0x0f,
+ 0x0f, 0xee, 0xff, 0x13,
+ 0x10, 0x00, 0x10, 0x0f, 0x0e, 0x0f, 0x00, 0x03, 0x42, 0x01, 0x01, 0x0f,
+ 0x00, 0x01, 0x02, 0x12,
+ 0x01, 0x00, 0x00, 0xf1, 0x04, 0x11, 0x00, 0x00, 0x01, 0x12, 0x0e, 0x0f,
+ 0xff, 0x0f, 0x20, 0x10,
+ 0x0e, 0x0f, 0xfb, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xff, 0x0d,
+ 0x0f, 0x0f, 0x10, 0x0f,
+ 0xfe, 0xed, 0x00, 0x31, 0x11, 0x01, 0x22, 0x00, 0x00, 0xd0, 0x03, 0xf0,
+ 0xed, 0x00, 0x01, 0xf1,
+ 0xf1, 0x00, 0xe0, 0x03, 0x10, 0x0f, 0xe0, 0x00, 0x21, 0x02, 0x24, 0x11,
+ 0x00, 0x0f, 0x10, 0x31,
+ 0x00, 0xff, 0x22, 0x00, 0x2f, 0x20, 0x0e, 0xee, 0x31, 0x45, 0x00, 0x02,
+ 0x21, 0x54, 0x02, 0xed,
+ 0xff, 0x12, 0x00, 0xff, 0x00, 0xe0, 0xf0, 0x0f, 0xed, 0xdd, 0xf0, 0x12,
+ 0x21, 0xed, 0xcc, 0x11,
+ 0x13, 0xed, 0xed, 0xff, 0x0f, 0xef, 0xee, 0xee, 0xed, 0x0f, 0xfd, 0x00,
+ 0xee, 0xee, 0x00, 0x44,
+ 0x01, 0x00, 0x1e, 0x0f, 0x0e, 0x11, 0x12, 0x00, 0xfe, 0x0f, 0x0f, 0x11,
+ 0x01, 0xcf, 0xfe, 0x00,
+ 0x03, 0x00, 0xff, 0xff, 0x01, 0x11, 0xf1, 0x0f, 0x0e, 0x0f, 0x00, 0x30,
+ 0x00, 0xef, 0x00, 0x02,
+ 0xf0, 0xff, 0x01, 0x01, 0xdf, 0x00, 0xe2, 0x13, 0x00, 0xfe, 0x0e, 0x03,
+ 0x00, 0x1f, 0x1f, 0x00,
+ 0x10, 0x2f, 0x0e, 0x00, 0xf0, 0x11, 0x24, 0x12, 0x1f, 0x00, 0x01, 0x01,
+ 0x01, 0x00, 0x10, 0x1e,
+ 0x11, 0x22, 0x01, 0x00, 0xf1, 0xf1, 0x01, 0x10, 0xf0, 0xe1, 0xf2, 0x01,
+ 0xf1, 0xe0, 0x0f, 0xed,
+ 0xff, 0xee, 0xff, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0xfe, 0x01, 0x25,
+ 0x32, 0x00, 0x0f, 0x1f,
+ 0x11, 0x12, 0x32, 0x00, 0x1d, 0x0d, 0x0d, 0x10, 0x42, 0x22, 0x10, 0x21,
+ 0x00, 0x42, 0x13, 0x20,
+ 0xf0, 0x01, 0x01, 0xf1, 0x00, 0x0e, 0xed, 0x00, 0xff, 0xff, 0xdf, 0x0f,
+ 0xe0, 0xfd, 0xed, 0xf0,
+ 0x00, 0x01, 0xf1, 0x0e, 0xfe, 0xfd, 0xdf, 0x0f, 0x00, 0x00, 0x0e, 0x10,
+ 0x01, 0x10, 0x00, 0x02,
+ 0x02, 0x11, 0x11, 0x12, 0x10, 0x02, 0x01, 0x02, 0xf0, 0x01, 0x0f, 0xf0,
+ 0xef, 0x02, 0x13, 0x00,
+ 0xfe, 0xdf, 0x00, 0x11, 0xf0, 0xfe, 0x02, 0x00, 0x11, 0x11, 0x0e, 0xde,
+ 0x1f, 0x00, 0x10, 0x31,
+ 0x02, 0xff, 0x00, 0x02, 0x00, 0x00, 0x0f, 0x22, 0x33, 0x10, 0x20, 0x10,
+ 0x10, 0x1f, 0xfd, 0x10,
+ 0x20, 0x12, 0x0f, 0x00, 0x10, 0x01, 0xf1, 0x02, 0x10, 0x0f, 0x0f, 0xf0,
+ 0x03, 0x12, 0x00, 0x0d,
+ 0x0e, 0xff, 0x10, 0x22, 0x01, 0xf2, 0x12, 0x00, 0x00, 0x01, 0xe1, 0x01,
+ 0xe0, 0x01, 0x00, 0xf0,
+ 0x11, 0x00, 0xdd, 0x21, 0x32, 0x20, 0x10, 0x1f, 0xff, 0x00, 0x31, 0x01,
+ 0x01, 0x21, 0x22, 0x00,
+ 0x0f, 0x0f, 0xef, 0x0f, 0x20, 0x0d, 0xff, 0xfe, 0xff, 0x00, 0x01, 0x22,
+ 0x00, 0x00, 0xe0, 0xff,
+ 0xe0, 0x13, 0x01, 0xef, 0x0f, 0xff, 0xef, 0x0e, 0x01, 0xf0, 0x0f, 0x00,
+ 0xf1, 0x01, 0xf0, 0x0f,
+ 0x00, 0xff, 0xf0, 0x00, 0x20, 0x2f, 0x00, 0xff, 0x00, 0x0d, 0x2e, 0x0f,
+ 0x1e, 0x10, 0x12, 0x02,
+ 0x00, 0xef, 0xf0, 0x12, 0x22, 0xd0, 0xee, 0xf0, 0x01, 0x02, 0x00, 0xec,
+ 0xef, 0x00, 0x0f, 0xde,
+ 0x00, 0x01, 0x12, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x11, 0x11, 0x10,
+ 0x12, 0x10, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x12, 0x02, 0xf1, 0x02, 0x02, 0x02, 0x00, 0x20, 0x00,
+ 0x02, 0x11, 0x0f, 0xfe,
+ 0x2f, 0x1f, 0xfe, 0x0e, 0x20, 0xfe, 0x00, 0x00, 0x00, 0x0e, 0xee, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0b,
+ 0xff, 0x00, 0x1e, 0x0f, 0x1f, 0x0e, 0x01, 0x32, 0x11, 0x02, 0x01, 0xf0,
+ 0xde, 0xf0, 0xf2, 0xef,
+ 0x00, 0x01, 0xf2, 0xe0, 0xd0, 0x0f, 0x00, 0x00, 0xfd, 0xce, 0x00, 0x02,
+ 0x13, 0x12, 0x12, 0x00,
+ 0x0f, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x10, 0x1e, 0x0f, 0x00, 0x12, 0x20,
+ 0x12, 0x22, 0x10, 0x11,
+ 0x01, 0x00, 0x02, 0x11, 0x23, 0x0e, 0x0f, 0xdf, 0x00, 0x12, 0x00, 0xeb,
+ 0x00, 0xef, 0x0f, 0xf0,
+ 0xf0, 0xee, 0xff, 0xef, 0xfe, 0xdc, 0xfe, 0xe0, 0x00, 0xf0, 0xee, 0x0e,
+ 0xff, 0xee, 0x00, 0x0f,
+ 0x0f, 0x00, 0x12, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x22, 0x1f,
+ 0xfa, 0x00, 0x20, 0x00,
+ 0xf0, 0x00, 0x00, 0x0e, 0x10, 0x00, 0xef, 0x10, 0x22, 0x00, 0x0e, 0x00,
+ 0x10, 0x21, 0x03, 0x00,
+ 0x00, 0xff, 0xee, 0xf0, 0x03, 0x13, 0xe0, 0xe0, 0xf1, 0x02, 0x01, 0x00,
+ 0x00, 0xfe, 0x00, 0x12,
+ 0x21, 0x11, 0x10, 0xfd, 0xff, 0x00, 0x31, 0x0f, 0x0f, 0x11, 0x11, 0x00,
+ 0x00, 0x35, 0x10, 0x10,
+ 0x00, 0x0f, 0xf0, 0x12, 0x22, 0x10, 0x02, 0x00, 0xdf, 0x02, 0x00, 0xc0,
+ 0x01, 0x11, 0xf0, 0xe0,
+ 0xed, 0xf0, 0xf0, 0xff, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x21,
+ 0x01, 0x00, 0x23, 0x33,
+ 0x00, 0x10, 0x00, 0x20, 0x21, 0x33, 0x2f, 0x0e, 0x3f, 0x30, 0x12, 0x12,
+ 0x31, 0x21, 0x21, 0x23,
+ 0x22, 0x01, 0xf0, 0x02, 0x01, 0x0f, 0xfe, 0xee, 0xf0, 0x01, 0x12, 0x00,
+ 0xfc, 0xf0, 0xfe, 0xef,
+ 0xff, 0xff, 0x00, 0x12, 0x10, 0x0f, 0xdc, 0xfd, 0xff, 0x0e, 0x00, 0x1e,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xef, 0x00, 0x0f, 0x00, 0xf0, 0x05, 0x22, 0xe0, 0xff, 0x02, 0x02,
+ 0xfe, 0xee, 0x00, 0x14,
+ 0x01, 0xf0, 0xfe, 0xff, 0xdf, 0x01, 0x01, 0xf1, 0xe0, 0x00, 0xf0, 0x0f,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x01, 0x31, 0x0e, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0x0f, 0x22, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xa6, 0xed, 0x88, 0xf3, 0x86, 0xed, 0x56, 0xf3, 0x00, 0x10, 0x11, 0xff,
+ 0x0f, 0x0e, 0x0f, 0x20,
+ 0x00, 0x00, 0xf0, 0x00, 0x0e, 0x10, 0x10, 0xff, 0x00, 0x00, 0x02, 0x01,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x10, 0xf1, 0xf2, 0xf0, 0xf0, 0x01, 0x02, 0x02, 0x0f,
+ 0x0f, 0xf0, 0xee, 0x00,
+ 0x10, 0x22, 0x10, 0x11, 0x20, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0xfe, 0x00,
+ 0x21, 0x13, 0x12, 0x01,
+ 0x00, 0xdd, 0x0f, 0x0f, 0x10, 0x0e, 0xe0, 0x00, 0x01, 0x21, 0x10, 0x0f,
+ 0xee, 0x10, 0x0f, 0xff,
+ 0x02, 0x33, 0xf0, 0x0f, 0xf1, 0xe1, 0x02, 0xf1, 0xff, 0xfe, 0x01, 0x00,
+ 0xf0, 0xff, 0x0f, 0x00,
+ 0x01, 0x0e, 0x00, 0x20, 0x00, 0x20, 0x01, 0x01, 0x0f, 0x00, 0x20, 0x02,
+ 0x00, 0xf1, 0x01, 0xe0,
+ 0x00, 0xff, 0x00, 0x11, 0x00, 0xff, 0x00, 0x02, 0x10, 0xee, 0xfd, 0x01,
+ 0x00, 0x00, 0x01, 0x0e,
+ 0xfe, 0x01, 0xf0, 0xf0, 0x00, 0x10, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x34,
+ 0x10, 0xf0, 0x0f, 0x11,
+ 0x01, 0xf4, 0x01, 0x02, 0xde, 0x0f, 0x02, 0x10, 0x01, 0x11, 0x21, 0x00,
+ 0x02, 0x1f, 0x0d, 0x0e,
+ 0x10, 0x13, 0x10, 0xe0, 0x0d, 0xff, 0xfe, 0xfd, 0xfe, 0x0d, 0x0f, 0x20,
+ 0x0f, 0x1f, 0x1f, 0x1f,
+ 0x10, 0x0e, 0x10, 0x0e, 0x10, 0x10, 0x01, 0xd0, 0x03, 0x10, 0xe0, 0xef,
+ 0xf0, 0xf0, 0xdf, 0x00,
+ 0x01, 0x12, 0xf0, 0x0f, 0x00, 0x03, 0x11, 0xf1, 0xf0, 0xff, 0x00, 0x00,
+ 0xf0, 0x13, 0x11, 0x10,
+ 0x10, 0x21, 0x12, 0x10, 0x00, 0x0f, 0x0f, 0x10, 0x12, 0x32, 0x20, 0x02,
+ 0x11, 0x00, 0x22, 0x01,
+ 0x00, 0x23, 0x10, 0x0f, 0x01, 0xf1, 0x02, 0x00, 0x01, 0x00, 0xfc, 0xdd,
+ 0x00, 0x10, 0xef, 0xff,
+ 0x00, 0xfe, 0xff, 0xee, 0xf0, 0x0e, 0x00, 0x00, 0xfe, 0xfd, 0x0f, 0xee,
+ 0x0f, 0x00, 0xf0, 0xf0,
+ 0xfe, 0x0f, 0xde, 0x00, 0x10, 0x00, 0xed, 0x00, 0x12, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0x02, 0x00, 0xff, 0xff, 0x10, 0x00, 0x0f, 0x00, 0xee, 0x00,
+ 0x11, 0x34, 0x12, 0xfe,
+ 0xcc, 0x01, 0x01, 0xe0, 0x01, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x02, 0x00,
+ 0x02, 0x20, 0xff, 0x0e,
+ 0x00, 0x00, 0x20, 0x12, 0xfd, 0xfd, 0x01, 0x22, 0x01, 0x00, 0x20, 0x10,
+ 0x13, 0x10, 0x21, 0x11,
+ 0x03, 0x10, 0x01, 0x00, 0x00, 0x10, 0x0f, 0x00, 0xe0, 0xf0, 0x02, 0x00,
+ 0xde, 0xf0, 0xf0, 0xdd,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0xf0, 0x0f, 0xff, 0x00, 0x00,
+ 0xf0, 0x00, 0x21, 0x00,
+ 0x1f, 0x0f, 0x20, 0x10, 0x35, 0x30, 0x10, 0x1f, 0x20, 0x34, 0x20, 0x1f,
+ 0x0f, 0x01, 0x22, 0x23,
+ 0x10, 0x10, 0x00, 0xf0, 0xfd, 0x01, 0x03, 0x12, 0x22, 0x00, 0xf0, 0xee,
+ 0xff, 0xff, 0xdd, 0x0e,
+ 0xff, 0x0e, 0xfe, 0xf0, 0x01, 0xfe, 0xfe, 0x0e, 0x00, 0x0d, 0x00, 0x02,
+ 0x00, 0xff, 0x11, 0x01,
+ 0x00, 0x01, 0xf0, 0xe0, 0x11, 0x22, 0x00, 0xed, 0xf1, 0x02, 0x32, 0x11,
+ 0xf0, 0x00, 0xf1, 0x00,
+ 0xf0, 0xff, 0xee, 0x00, 0x12, 0xf0, 0xe0, 0xef, 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x11, 0x33, 0x11,
+ 0x10, 0x00, 0x00, 0x01, 0x30, 0x00, 0xf0, 0x1f, 0x1f, 0x11, 0x02, 0x22,
+ 0x11, 0x00, 0x20, 0x01,
+ 0x0f, 0x10, 0x12, 0x21, 0x0f, 0xda, 0x00, 0x31, 0x21, 0x00, 0xe0, 0x1f,
+ 0x10, 0x0e, 0xf0, 0x00,
+ 0x10, 0x13, 0x33, 0x02, 0xef, 0x00, 0x00, 0xe1, 0xf1, 0xd0, 0x0f, 0x01,
+ 0x01, 0xf1, 0x01, 0x00,
+ 0xff, 0x0f, 0x30, 0x01, 0x20, 0x10, 0x20, 0x24, 0x12, 0x11, 0x11, 0xed,
+ 0xdd, 0x00, 0x00, 0x21,
+ 0x01, 0x32, 0x0f, 0x0d, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x0d, 0x0f,
+ 0x0f, 0x0f, 0xf0, 0xf0,
+ 0xe0, 0x0f, 0x02, 0xf0, 0xf2, 0xd0, 0x0f, 0x00, 0x03, 0x0f, 0x00, 0x0e,
+ 0xef, 0xef, 0xff, 0x0f,
+ 0x2f, 0x0f, 0x0f, 0x21, 0x01, 0x11, 0x11, 0x11, 0x31, 0xfe, 0xff, 0x0f,
+ 0x10, 0x10, 0x01, 0x01,
+ 0x10, 0xff, 0xdc, 0xf0, 0xf1, 0xf1, 0x02, 0x00, 0xfc, 0xf1, 0xf1, 0xe0,
+ 0xff, 0x00, 0x20, 0xf0,
+ 0xef, 0x0e, 0x00, 0x00, 0x10, 0xee, 0x00, 0x0f, 0xf0, 0x00, 0x04, 0x10,
+ 0x00, 0x01, 0x12, 0x10,
+ 0x10, 0x00, 0x02, 0x22, 0x02, 0xe1, 0x00, 0xfd, 0x0f, 0x00, 0x22, 0x24,
+ 0x01, 0x00, 0x03, 0x01,
+ 0x21, 0xff, 0xee, 0x01, 0x21, 0xfd, 0xec, 0x0f, 0x0f, 0xfe, 0x0e, 0x1f,
+ 0x0d, 0x20, 0x10, 0x0f,
+ 0x0f, 0x10, 0x22, 0x10, 0x00, 0x1f, 0x11, 0x00, 0x00, 0xef, 0xf0, 0x00,
+ 0xee, 0xfe, 0x00, 0xe0,
+ 0xe0, 0x00, 0x02, 0xf0, 0xf0, 0xf0, 0xff, 0x0f, 0xe1, 0x14, 0x00, 0xef,
+ 0xee, 0xff, 0xf0, 0xef,
+ 0x00, 0xf0, 0x10, 0x21, 0x01, 0x11, 0x01, 0x00, 0x03, 0x21, 0x20, 0x00,
+ 0x10, 0x00, 0x32, 0x11,
+ 0x01, 0x10, 0x30, 0x02, 0x01, 0x13, 0x10, 0xf0, 0x00, 0x00, 0x21, 0x00,
+ 0xee, 0xee, 0xf0, 0x00,
+ 0xed, 0x0e, 0xee, 0xfe, 0xff, 0xfe, 0xef, 0xff, 0x0f, 0x00, 0xf0, 0xf0,
+ 0xfe, 0xee, 0xfd, 0xff,
+ 0x00, 0x10, 0xff, 0x00, 0xff, 0xf0, 0x00, 0x20, 0x0d, 0xcd, 0x00, 0x11,
+ 0x02, 0x22, 0x0f, 0xff,
+ 0x0f, 0x10, 0x1f, 0x1f, 0x10, 0x0e, 0x00, 0x1e, 0x0f, 0xff, 0x01, 0x33,
+ 0x01, 0xf0, 0x00, 0x01,
+ 0x02, 0x00, 0x00, 0x03, 0x00, 0xf0, 0xf0, 0x00, 0xe0, 0xed, 0x01, 0x01,
+ 0x01, 0x00, 0x0f, 0x02,
+ 0x12, 0x01, 0x00, 0xff, 0x00, 0x00, 0x1e, 0x0f, 0x0f, 0x21, 0x22, 0x00,
+ 0x00, 0x1e, 0x21, 0x01,
+ 0x11, 0x32, 0x13, 0x10, 0x00, 0xe0, 0x12, 0x00, 0xff, 0x00, 0x00, 0xf3,
+ 0x00, 0xee, 0x00, 0xe0,
+ 0xef, 0xf0, 0xff, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x02, 0x20, 0x2e, 0x20, 0x20, 0x20, 0x25, 0x42, 0x12, 0x31, 0x10, 0x1e,
+ 0x00, 0x0f, 0x10, 0x20,
+ 0x11, 0x00, 0x21, 0x00, 0x01, 0x03, 0x01, 0xf0, 0x12, 0x22, 0x01, 0xff,
+ 0xff, 0x00, 0x0e, 0xff,
+ 0x22, 0x0e, 0xec, 0x00, 0xfe, 0xfe, 0xff, 0x00, 0x10, 0x10, 0x0e, 0xf0,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0xec, 0x00, 0x33, 0xf0, 0xff, 0x01, 0x10, 0xef, 0xfd, 0x02,
+ 0xf2, 0x01, 0x01, 0x03,
+ 0x00, 0xe0, 0xf0, 0xf0, 0xee, 0xff, 0xf0, 0xf0, 0xff, 0xdd, 0xf0, 0x02,
+ 0xf1, 0x00, 0x30, 0x13,
+ 0x00, 0x10, 0x11, 0x00, 0x0f, 0x0f, 0x10, 0x10, 0x0e, 0x00, 0xf0, 0x02,
+ 0x20, 0x0e, 0x0e, 0x10,
+ 0x14, 0x00, 0x00, 0x22, 0x12, 0x00, 0x0b, 0xf0, 0xfd, 0xfe, 0x1f, 0x32,
+ 0x00, 0x10, 0x11, 0x0f,
+ 0xef, 0xe0, 0x11, 0x13, 0x01, 0x01, 0xf0, 0x01, 0xf1, 0x00, 0xf1, 0xe0,
+ 0xfd, 0x0f, 0x0f, 0x10,
+ 0x00, 0x03, 0x10, 0x0e, 0x1f, 0x22, 0x03, 0x00, 0xf0, 0x00, 0xf0, 0x12,
+ 0x01, 0xf0, 0x0e, 0xef,
+ 0x0e, 0x00, 0x20, 0x10, 0x1f, 0x30, 0x0f, 0xf0, 0x10, 0x12, 0x10, 0x12,
+ 0x01, 0xee, 0xfd, 0xef,
+ 0x00, 0x01, 0x20, 0x0e, 0xd0, 0x00, 0x04, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x02, 0x11,
+ 0x00, 0xee, 0x0f, 0x10, 0x0f, 0x20, 0x0f, 0xf0, 0x11, 0x21, 0x1f, 0x00,
+ 0xf0, 0x01, 0x01, 0x02,
+ 0x22, 0x01, 0xdf, 0x00, 0x10, 0xff, 0x00, 0xe0, 0x00, 0x02, 0x0f, 0x0e,
+ 0xdf, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x01, 0x0f, 0xee, 0xf0, 0x0e, 0x0f, 0xfe, 0xef, 0x0e, 0x00,
+ 0x02, 0x01, 0x01, 0x10,
+ 0x00, 0x01, 0x34, 0x11, 0x0f, 0xff, 0x00, 0x02, 0xf0, 0x00, 0x02, 0x00,
+ 0x03, 0x21, 0x00, 0xfe,
+ 0x02, 0x02, 0x01, 0x00, 0x00, 0xf0, 0x0e, 0x0f, 0x0f, 0xec, 0x0f, 0x2f,
+ 0x1f, 0x1e, 0x0d, 0x1e,
+ 0x20, 0x01, 0x21, 0x00, 0x0d, 0x00, 0x0f, 0x0f, 0x20, 0x01, 0x11, 0x0f,
+ 0xee, 0xef, 0x0e, 0x0f,
+ 0xf0, 0x02, 0x01, 0xf0, 0xf0, 0x01, 0x01, 0x03, 0x01, 0xff, 0xee, 0x01,
+ 0x02, 0x00, 0xc0, 0x0f,
+ 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x22, 0x11, 0x11, 0x11, 0x00, 0x33,
+ 0x01, 0x20, 0x23, 0x20,
+ 0x12, 0x01, 0x10, 0x1e, 0x00, 0xf0, 0x03, 0x22, 0x13, 0x11, 0x00, 0x00,
+ 0xf0, 0xff, 0x00, 0x10,
+ 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0xef, 0x0f, 0x00, 0x0e, 0xee, 0x0f, 0xf0,
+ 0xed, 0xf0, 0x00, 0xff,
+ 0x0f, 0xed, 0xfe, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0xf0, 0xfe,
+ 0xef, 0x00, 0x00, 0xf2,
+ 0xf0, 0x0f, 0x0d, 0x00, 0x01, 0x21, 0x00, 0x0e, 0x0f, 0x0e, 0xdb, 0x00,
+ 0x00, 0x12, 0x24, 0x00,
+ 0xf0, 0xff, 0x01, 0x02, 0x02, 0x00, 0x10, 0xef, 0xfe, 0xf1, 0xf0, 0x00,
+ 0x00, 0xe0, 0xff, 0xfe,
+ 0xf0, 0x01, 0x13, 0x12, 0x01, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x20, 0x23,
+ 0x1f, 0x0e, 0x10, 0x2e,
+ 0xff, 0x00, 0x12, 0x22, 0x33, 0x10, 0x00, 0x02, 0x01, 0xf0, 0xf0, 0x11,
+ 0x11, 0x00, 0xf0, 0xee,
+ 0xff, 0xee, 0xe0, 0x00, 0xed, 0x00, 0x01, 0x01, 0xf1, 0xf1, 0x00, 0xde,
+ 0x0f, 0x0f, 0xe0, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01, 0x31, 0x10, 0x1e, 0x21, 0x21, 0x21, 0x10, 0x21,
+ 0x21, 0x11, 0x11, 0x10,
+ 0x10, 0x12, 0x10, 0x01, 0x00, 0x00, 0xf1, 0x13, 0x22, 0x00, 0x21, 0x02,
+ 0x11, 0x01, 0x00, 0x0e,
+ 0x0d, 0xef, 0x1e, 0x10, 0x00, 0xf0, 0xff, 0xee, 0x0e, 0xff, 0xe0, 0x0e,
+ 0x00, 0x00, 0x02, 0xff,
+ 0x0e, 0x0f, 0x0f, 0x00, 0x0f, 0x20, 0x01, 0x00, 0x00, 0xf0, 0x10, 0x00,
+ 0x01, 0xf0, 0xe0, 0x02,
+ 0x02, 0x00, 0xf0, 0xef, 0x00, 0xf0, 0xf0, 0x0f, 0xe0, 0x0f, 0xff, 0xdf,
+ 0xed, 0x00, 0x12, 0x00,
+ 0x11, 0x21, 0x02, 0x12, 0x34, 0x00, 0x00, 0x1d, 0x00, 0x10, 0x12, 0x00,
+ 0x13, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x02, 0x01, 0x31, 0x10, 0x00, 0x00, 0x20, 0x0e, 0x10, 0x20,
+ 0x1f, 0x0e, 0x0f, 0x00,
+ 0x11, 0x13, 0x00, 0x00, 0xff, 0xef, 0x12, 0x14, 0x00, 0xe0, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x10, 0x12, 0x02, 0x00, 0xe0, 0x0f, 0x02, 0x24, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x1f,
+ 0x00, 0x01, 0x11, 0x30, 0x0f, 0xee, 0x00, 0x31, 0x00, 0x10, 0x0f, 0x1e,
+ 0x0f, 0x01, 0x33, 0x00,
+ 0xee, 0xfb, 0x00, 0xf0, 0x00, 0xef, 0x00, 0xf0, 0xf0, 0xf1, 0xf0, 0xee,
+ 0xe0, 0x00, 0x14, 0x0f,
+ 0xf0, 0x1e, 0x10, 0x0f, 0x0e, 0x2f, 0x10, 0x21, 0x10, 0x10, 0x01, 0xf0,
+ 0xf0, 0x00, 0x12, 0x12,
+ 0x01, 0xf0, 0xef, 0x00, 0xf0, 0xf0, 0x1f, 0x30, 0xff, 0x0f, 0xf0, 0xff,
+ 0x00, 0x00, 0xef, 0xf0,
+ 0x01, 0x01, 0xff, 0xef, 0x02, 0x00, 0xee, 0x0e, 0xf0, 0x0e, 0xff, 0xfe,
+ 0x0f, 0xe0, 0x23, 0x11,
+ 0x0f, 0xff, 0xf0, 0x01, 0x34, 0x12, 0x22, 0x0f, 0xe0, 0x00, 0x00, 0x01,
+ 0x21, 0x01, 0x00, 0x12,
+ 0x02, 0xf0, 0xf0, 0x01, 0xf1, 0x01, 0x00, 0xef, 0x00, 0x0e, 0x00, 0x20,
+ 0x2f, 0x10, 0x0d, 0x0f,
+ 0x0d, 0x00, 0x30, 0x0f, 0x20, 0x10, 0x00, 0x00, 0x0e, 0xf0, 0x00, 0x01,
+ 0x22, 0x0e, 0xdd, 0x00,
+ 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x0f, 0xe0, 0xff, 0xf0, 0xef, 0x00,
+ 0xe0, 0xee, 0x00, 0xe1,
+ 0xe1, 0xe0, 0xff, 0xfe, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x12, 0x10, 0x22,
+ 0x0f, 0x00, 0x35, 0x21,
+ 0xf0, 0x00, 0x32, 0x12, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x03, 0x10,
+ 0x00, 0x33, 0x00, 0xef,
+ 0x0f, 0x20, 0x22, 0x0e, 0xcc, 0x10, 0x00, 0xfd, 0x0f, 0x00, 0x0f, 0xed,
+ 0xff, 0xe0, 0xed, 0xfe,
+ 0xf0, 0x00, 0x00, 0x0d, 0xef, 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0xfe, 0xff,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xef, 0xfe, 0x0e, 0x10, 0x10, 0x20, 0x10, 0x10, 0x00, 0x0e, 0x10,
+ 0x0f, 0xff, 0xef, 0x21,
+ 0x03, 0x02, 0x21, 0x01, 0xf0, 0xf0, 0x11, 0x00, 0x00, 0x10, 0x03, 0x0f,
+ 0x0f, 0xf0, 0xff, 0x00,
+ 0xf0, 0xf0, 0x01, 0xf1, 0xf2, 0xf1, 0xf1, 0xff, 0xfe, 0x00, 0x12, 0x00,
+ 0x20, 0x10, 0x1e, 0x0e,
+ 0x20, 0x0f, 0x30, 0x23, 0x00, 0x0e, 0x11, 0x22, 0x01, 0x03, 0x22, 0x01,
+ 0xf2, 0x0e, 0xff, 0x0f,
+ 0x00, 0xf0, 0xf0, 0xff, 0x00, 0x01, 0xf0, 0xf1, 0xf1, 0x00, 0xe1, 0xf0,
+ 0x00, 0xe0, 0x00, 0x00,
+ 0x00, 0x02, 0x02, 0x20, 0x0f, 0x00, 0x00, 0x20, 0x40, 0x12, 0x21, 0x00,
+ 0x1f, 0x1f, 0x11, 0x34,
+ 0x11, 0x21, 0x00, 0x00, 0x10, 0x12, 0x00, 0x11, 0x00, 0x01, 0x10, 0x00,
+ 0x11, 0x22, 0x02, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f, 0xfe, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x0c, 0xde,
+ 0x00, 0x20, 0x02, 0x00,
+ 0xff, 0x00, 0x0e, 0x0d, 0xfe, 0x10, 0x00, 0x00, 0x31, 0x12, 0x00, 0xec,
+ 0xff, 0x00, 0x13, 0x00,
+ 0x0f, 0xf0, 0xc0, 0x00, 0xf1, 0xe0, 0xf1, 0x00, 0xe0, 0xeb, 0xf0, 0x01,
+ 0x00, 0xdf, 0xfe, 0x00,
+ 0x10, 0xf0, 0xee, 0x00, 0x12, 0x23, 0x00, 0x02, 0x00, 0xff, 0x00, 0x31,
+ 0x02, 0x11, 0x00, 0x10,
+ 0x0f, 0xfe, 0xff, 0x10, 0x20, 0x12, 0x12, 0x0e, 0xff, 0x10, 0x00, 0x11,
+ 0x21, 0x21, 0xfd, 0xef,
+ 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0xed, 0x0f, 0x00, 0xf0, 0x01, 0x03,
+ 0x01, 0x0f, 0x0f, 0x0f,
+ 0xf1, 0x01, 0x02, 0x0f, 0x10, 0x00, 0x13, 0xff, 0xef, 0xfe, 0x00, 0x03,
+ 0x12, 0x1f, 0x0d, 0xff,
+ 0x00, 0x00, 0x00, 0x23, 0x10, 0x23, 0x00, 0xee, 0x0e, 0x0f, 0x10, 0x20,
+ 0x00, 0x0e, 0xff, 0x00,
+ 0x11, 0x12, 0x00, 0x00, 0x0e, 0xe0, 0x01, 0x03, 0xef, 0xee, 0x01, 0x01,
+ 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x10, 0x1f, 0x00, 0x0f, 0x21, 0x00, 0x00, 0x12, 0x10, 0x10, 0x1f,
+ 0x00, 0xe1, 0x01, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x20, 0x35, 0x10, 0x00,
+ 0xf0, 0xf1, 0x02, 0xf0,
+ 0xf0, 0x0d, 0xe0, 0xfe, 0xff, 0xf0, 0xff, 0x00, 0x10, 0x0f, 0xdc, 0x00,
+ 0x0f, 0xff, 0x00, 0x11,
+ 0x00, 0xfe, 0x02, 0x22, 0x0e, 0xee, 0x01, 0x22, 0x00, 0x01, 0x33, 0x00,
+ 0xff, 0x01, 0x12, 0x10,
+ 0xf1, 0xe0, 0xf0, 0x01, 0xf1, 0x00, 0xe0, 0xf0, 0x00, 0xf0, 0x01, 0x11,
+ 0x10, 0x0d, 0x2f, 0x1d,
+ 0x0e, 0x20, 0x10, 0x22, 0x0f, 0x1e, 0x0d, 0x0e, 0xff, 0x00, 0x2f, 0x0f,
+ 0x20, 0xf0, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x02, 0xe0, 0x00, 0xdf,
+ 0xf0, 0xff, 0xef, 0xfe,
+ 0x01, 0xf1, 0xe0, 0x01, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x00, 0x0e, 0xef,
+ 0x00, 0x41, 0x01, 0x11,
+ 0x22, 0x24, 0x10, 0x00, 0x12, 0x00, 0x10, 0x23, 0x01, 0x00, 0x00, 0x11,
+ 0x01, 0x01, 0x01, 0x01,
+ 0x0f, 0x10, 0x31, 0x00, 0x01, 0x21, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x1e,
+ 0x00, 0x00, 0x00, 0xe0,
+ 0x0f, 0xec, 0xff, 0xee, 0x00, 0x01, 0x11, 0x00, 0x0e, 0xef, 0x00, 0xfd,
+ 0xed, 0xf0, 0xf0, 0x01,
+ 0x00, 0x0d, 0xe0, 0xfc, 0xee, 0xf0, 0x00, 0x10, 0x11, 0x11, 0x0e, 0xff,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xef, 0xec, 0xf0, 0x12, 0x01, 0x10, 0x01, 0x00, 0xf0, 0x0e, 0x01, 0x12,
+ 0x01, 0x11, 0x01, 0xf0,
+ 0xf0, 0x0f, 0xef, 0xf0, 0x02, 0x01, 0xff, 0xee, 0xef, 0xf0, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xab, 0x0e, 0xdf, 0x09, 0xca, 0x0f, 0x8c, 0x0a, 0x00, 0x10, 0x20, 0x10,
+ 0x00, 0x20, 0x00, 0x0f,
+ 0x11, 0x43, 0x11, 0x00, 0xde, 0x00, 0x31, 0x00, 0x00, 0x10, 0x0f, 0x10,
+ 0x12, 0xff, 0xf0, 0x02,
+ 0x00, 0x00, 0xef, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0x00, 0xff, 0xfd, 0xee,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x12, 0x30, 0x00, 0x00, 0x03, 0x10, 0x10, 0x0e, 0x00, 0x00, 0x11, 0xff,
+ 0x0d, 0x12, 0x23, 0x22,
+ 0x21, 0x01, 0x12, 0x22, 0x01, 0x10, 0x10, 0x01, 0x23, 0x00, 0x13, 0x10,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x02, 0x10, 0xfc, 0xef, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x00,
+ 0xff, 0xed, 0x0e, 0x00, 0x20, 0x00, 0x10, 0x00, 0x11, 0x01, 0x01, 0xe0,
+ 0x10, 0x22, 0xe0, 0xd0,
+ 0xfe, 0xdf, 0xee, 0xf0, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xf0, 0x00, 0x00,
+ 0xff, 0xfe, 0x00, 0xf1,
+ 0x01, 0x02, 0x02, 0x22, 0xf0, 0xee, 0x02, 0x12, 0x10, 0x11, 0x21, 0x23,
+ 0x00, 0x10, 0x00, 0x20,
+ 0x01, 0x10, 0x00, 0xff, 0x00, 0x21, 0x12, 0x00, 0xff, 0x0f, 0x00, 0x21,
+ 0x11, 0x21, 0x0f, 0x00,
+ 0x00, 0x1f, 0x1f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x03, 0x10, 0x00,
+ 0x04, 0x00, 0x00, 0xee, 0x00, 0x02, 0x12, 0xf0, 0xff, 0x00, 0x00, 0xf0,
+ 0x03, 0x10, 0x00, 0x0e,
+ 0x22, 0x20, 0x00, 0x11, 0x23, 0x21, 0x0e, 0xfe, 0x0d, 0x00, 0x20, 0x1f,
+ 0x00, 0x00, 0xee, 0x00,
+ 0x12, 0x10, 0x00, 0xf0, 0xf1, 0x0f, 0xe0, 0x0e, 0xde, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x0e,
+ 0x0f, 0xff, 0x10, 0x21, 0x11, 0x00, 0x00, 0x12, 0x00, 0x10, 0x02, 0x00,
+ 0xff, 0x0e, 0xf0, 0x0f,
+ 0xf0, 0x00, 0x32, 0x12, 0x10, 0xf0, 0xf0, 0x10, 0x21, 0x02, 0x10, 0x02,
+ 0xf0, 0x0f, 0xfe, 0xcf,
+ 0x0e, 0xe0, 0xee, 0x00, 0xff, 0x00, 0xf0, 0xff, 0x00, 0xef, 0x00, 0x10,
+ 0x00, 0xf0, 0x0e, 0xfe,
+ 0x0f, 0xf0, 0x10, 0x11, 0x00, 0x00, 0x00, 0x14, 0x10, 0x02, 0x13, 0x00,
+ 0x00, 0xf0, 0x00, 0x02,
+ 0x03, 0x13, 0x00, 0xef, 0xee, 0x0f, 0xf0, 0x00, 0x11, 0x22, 0x01, 0x0e,
+ 0x00, 0x00, 0x2e, 0x10,
+ 0x10, 0x02, 0x1f, 0x0e, 0x0d, 0x00, 0x0f, 0x10, 0x10, 0x0e, 0x0e, 0x00,
+ 0x11, 0x00, 0x10, 0x31,
+ 0x01, 0x01, 0x00, 0x0d, 0xe0, 0x00, 0xf0, 0x00, 0xff, 0xdd, 0xfd, 0xf0,
+ 0xf0, 0xe0, 0x00, 0xe0,
+ 0xf0, 0xee, 0x00, 0x01, 0xf0, 0x02, 0xf0, 0x02, 0x00, 0xdd, 0x00, 0xec,
+ 0x00, 0x02, 0x0f, 0x21,
+ 0x25, 0x00, 0x01, 0x00, 0x02, 0x03, 0x10, 0x13, 0x22, 0x11, 0xf0, 0x00,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x2e, 0x00, 0x0f, 0x11, 0x00, 0x00, 0x0c, 0x00, 0xff, 0x01, 0x21, 0xff,
+ 0xef, 0x0f, 0x00, 0xfd,
+ 0xee, 0xec, 0x00, 0xe0, 0x11, 0x00, 0x0f, 0xdd, 0x0f, 0x11, 0x01, 0xfe,
+ 0x0d, 0x01, 0xff, 0xee,
+ 0x10, 0x01, 0xfe, 0xef, 0x10, 0x0f, 0x1f, 0x01, 0x00, 0xff, 0x00, 0x10,
+ 0x00, 0xf0, 0x10, 0x00,
+ 0x0e, 0x00, 0xf0, 0x1f, 0x21, 0x11, 0x02, 0x00, 0xe0, 0x11, 0x23, 0x00,
+ 0xdf, 0x00, 0x00, 0x02,
+ 0x00, 0xff, 0xf1, 0x02, 0xf0, 0xdd, 0xe0, 0x0f, 0xff, 0xf0, 0x00, 0x00,
+ 0x11, 0x10, 0x44, 0x00,
+ 0x10, 0x10, 0x2f, 0x10, 0x0e, 0x20, 0x21, 0x11, 0xff, 0x0e, 0x10, 0x00,
+ 0x11, 0x03, 0x01, 0x01,
+ 0x01, 0x02, 0x01, 0xff, 0xef, 0xe0, 0x02, 0x12, 0x00, 0xdc, 0xee, 0xf0,
+ 0x01, 0x00, 0xf0, 0x02,
+ 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x22, 0x20, 0x00, 0x0f, 0x10, 0x10,
+ 0x00, 0x11, 0x0e, 0xec,
+ 0x10, 0x44, 0x22, 0x00, 0x14, 0x22, 0x00, 0x01, 0x21, 0x00, 0x00, 0x02,
+ 0x11, 0x10, 0x00, 0xfe,
+ 0x0f, 0xf0, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x23,
+ 0x10, 0x0d, 0x1f, 0x10,
+ 0x0c, 0xde, 0x00, 0x2f, 0x20, 0x00, 0x10, 0x00, 0x01, 0x03, 0x21, 0x00,
+ 0xfe, 0xff, 0x0e, 0xef,
+ 0x00, 0x00, 0xf0, 0x00, 0xde, 0xed, 0xfd, 0xf0, 0x00, 0xe0, 0x03, 0x11,
+ 0xf0, 0xee, 0xe0, 0xef,
+ 0xf0, 0xdd, 0x00, 0x00, 0xf1, 0x0f, 0xff, 0x00, 0x20, 0x12, 0x13, 0x01,
+ 0x10, 0x10, 0x12, 0x12,
+ 0x01, 0x00, 0x20, 0x11, 0x00, 0xfe, 0x01, 0x00, 0xfe, 0x00, 0x30, 0x00,
+ 0xee, 0x10, 0x33, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x1f,
+ 0x00, 0xf0, 0x00, 0x11,
+ 0x10, 0x11, 0x02, 0xf1, 0xf0, 0xff, 0xe0, 0x00, 0x03, 0x10, 0xfe, 0xec,
+ 0x00, 0xf0, 0x12, 0x10,
+ 0x00, 0x1f, 0x10, 0x11, 0x0f, 0x00, 0x23, 0x22, 0x00, 0x0e, 0x0f, 0x0f,
+ 0xef, 0x00, 0x13, 0x0e,
+ 0x0e, 0xef, 0x00, 0x0f, 0x01, 0x03, 0x10, 0x02, 0xf1, 0x02, 0x0e, 0xee,
+ 0x01, 0x11, 0x00, 0xfd,
+ 0x10, 0x11, 0x0f, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x10, 0x11, 0x00, 0xf0,
+ 0x01, 0x20, 0x00, 0x00,
+ 0x0f, 0xee, 0x00, 0x11, 0x12, 0x11, 0x11, 0x01, 0x12, 0x01, 0xf2, 0x01,
+ 0x12, 0x00, 0x01, 0x00,
+ 0xcd, 0xfd, 0xff, 0x00, 0x01, 0xf0, 0xed, 0x00, 0x00, 0x00, 0x0e, 0xef,
+ 0x10, 0x01, 0x00, 0x00,
+ 0xfe, 0xf0, 0xfd, 0x00, 0x00, 0x2f, 0x00, 0x0e, 0xf0, 0x00, 0x13, 0x13,
+ 0x11, 0xff, 0xe0, 0x12,
+ 0x13, 0xf0, 0xee, 0x01, 0x02, 0x00, 0x01, 0xd0, 0x0f, 0x0f, 0xf0, 0x10,
+ 0x0f, 0x0e, 0x00, 0x11,
+ 0x30, 0x00, 0x1e, 0x10, 0x10, 0x10, 0x0e, 0x0d, 0x0f, 0x0e, 0x20, 0x11,
+ 0x10, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x10, 0x21, 0x01, 0x00, 0xf1, 0x0f, 0xf0, 0xfe, 0xf0, 0xfe,
+ 0xde, 0xf0, 0x01, 0x01,
+ 0xe0, 0xff, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0x12, 0x11, 0x00, 0x00, 0x0e,
+ 0xef, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x21, 0x02, 0xf0, 0x12, 0x12, 0x00, 0x13, 0x34, 0x01, 0x01,
+ 0x11, 0x01, 0x0f, 0x0f,
+ 0x1f, 0x1f, 0x0f, 0x00, 0x22, 0x00, 0x00, 0x00, 0x12, 0x0f, 0x0f, 0x00,
+ 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0x00, 0x0f, 0xef, 0xfd, 0x00, 0x0f, 0x0f, 0xff, 0xf0, 0xff,
+ 0x21, 0x10, 0xff, 0xed,
+ 0xff, 0xff, 0x0f, 0xf0, 0x00, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0xe0, 0xfd,
+ 0xff, 0x00, 0xed, 0x00,
+ 0x02, 0x01, 0x11, 0x00, 0x0f, 0xed, 0x10, 0x0f, 0x00, 0x00, 0x11, 0x12,
+ 0xf0, 0x01, 0x02, 0x01,
+ 0x00, 0xe0, 0x00, 0xe0, 0x01, 0xe0, 0x01, 0x00, 0xef, 0xde, 0x00, 0x01,
+ 0x0f, 0x0f, 0x00, 0x01,
+ 0x31, 0x22, 0x21, 0x00, 0x20, 0x0e, 0xff, 0x20, 0x01, 0x00, 0x10, 0x0d,
+ 0xee, 0x10, 0x11, 0x15,
+ 0x20, 0x01, 0xd0, 0x0e, 0x00, 0xe0, 0x00, 0x02, 0x10, 0xf0, 0xee, 0x0f,
+ 0xee, 0xf0, 0xfe, 0x00,
+ 0x0f, 0xf0, 0x00, 0x10, 0x02, 0x00, 0x11, 0x01, 0x00, 0x20, 0x00, 0xef,
+ 0x00, 0xff, 0x00, 0x01,
+ 0x21, 0x00, 0x0f, 0x00, 0x10, 0x35, 0x10, 0x12, 0x20, 0x12, 0x10, 0x11,
+ 0x13, 0x13, 0x01, 0x00,
+ 0x01, 0xff, 0xff, 0x0e, 0x01, 0x13, 0x11, 0x0f, 0x11, 0x00, 0xfe, 0x0e,
+ 0x00, 0x0e, 0x30, 0x11,
+ 0x10, 0x0e, 0xfd, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x00, 0x01, 0x02, 0x00,
+ 0x12, 0x1f, 0x0f, 0x0f,
+ 0xff, 0xfe, 0xfe, 0x01, 0x22, 0x00, 0xec, 0xe0, 0x0f, 0x00, 0xd1, 0x01,
+ 0xf0, 0xef, 0xde, 0x00,
+ 0x01, 0xe0, 0xf0, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x10, 0x01, 0x21, 0x02,
+ 0x21, 0x02, 0x11, 0x02,
+ 0x01, 0x01, 0x02, 0x20, 0x00, 0x10, 0x0f, 0x31, 0xf1, 0xff, 0x00, 0x01,
+ 0x20, 0x00, 0x0f, 0x20,
+ 0x02, 0x00, 0x11, 0x21, 0x10, 0x00, 0x00, 0x0e, 0x0f, 0x10, 0x10, 0x00,
+ 0x00, 0x0f, 0xfe, 0x00,
+ 0x13, 0x01, 0x02, 0x00, 0xfe, 0x03, 0x04, 0x0f, 0xef, 0x0e, 0xf1, 0x02,
+ 0x11, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x10, 0x23, 0x23, 0x00, 0x10, 0x10, 0x10, 0x00,
+ 0x00, 0x10, 0x0d, 0xf0,
+ 0x0f, 0x00, 0x20, 0xee, 0x0f, 0x01, 0x00, 0xff, 0xf0, 0x00, 0x11, 0x01,
+ 0x00, 0xe0, 0x0e, 0x0f,
+ 0xfe, 0x00, 0x0f, 0x00, 0x0f, 0xde, 0x0e, 0x00, 0x11, 0x00, 0x00, 0x01,
+ 0x02, 0x00, 0x1f, 0x0f,
+ 0x00, 0x40, 0x02, 0x01, 0x10, 0x01, 0x11, 0xff, 0x01, 0x22, 0x01, 0xe0,
+ 0x12, 0x10, 0x00, 0xf1,
+ 0x00, 0xf0, 0x00, 0xfe, 0xf0, 0x00, 0x10, 0xef, 0xfe, 0x00, 0xf1, 0xff,
+ 0x00, 0x0e, 0xef, 0xff,
+ 0x00, 0xfe, 0xf0, 0x00, 0x0e, 0xfe, 0xfe, 0x00, 0x22, 0x11, 0x00, 0x00,
+ 0xf0, 0x00, 0x11, 0x02,
+ 0xf1, 0x04, 0x23, 0x00, 0x00, 0xde, 0x00, 0x01, 0x11, 0xf1, 0x00, 0xe0,
+ 0x00, 0x31, 0xf0, 0xee,
+ 0x00, 0x00, 0x10, 0x11, 0x00, 0x2f, 0x00, 0x01, 0x20, 0x00, 0x2e, 0x0e,
+ 0x00, 0x20, 0x00, 0x21,
+ 0x00, 0x1f, 0x0f, 0x1f, 0x00, 0x00, 0x11, 0x01, 0x00, 0x0d, 0xdf, 0x00,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0xe0, 0xf0, 0xed, 0xef, 0xff, 0xef, 0x01, 0x00, 0xfe, 0xf0, 0x00, 0x00,
+ 0xdf, 0x00, 0x00, 0x0f,
+ 0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x02, 0x04, 0x10, 0x01, 0x01, 0xf0, 0x02,
+ 0x23, 0x23, 0x11, 0x00,
+ 0x1e, 0x20, 0x00, 0x01, 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x10,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x0c, 0x00, 0x10, 0x0e, 0x0f, 0x00, 0xff, 0x0e, 0xff, 0xff, 0xf0, 0x00,
+ 0x00, 0xff, 0xfe, 0x00,
+ 0x23, 0x00, 0xed, 0xee, 0x0f, 0x10, 0x00, 0x0d, 0xfe, 0xf0, 0x00, 0x00,
+ 0x00, 0xe0, 0x00, 0xf0,
+ 0xff, 0xee, 0x00, 0x01, 0x22, 0x00, 0x0e, 0x2f, 0x0f, 0x00, 0x2f, 0x00,
+ 0x12, 0x11, 0xf0, 0xe1,
+ 0x01, 0x01, 0xe0, 0x02, 0x02, 0xf0, 0xef, 0xef, 0xff, 0xf1, 0x00, 0x00,
+ 0xf0, 0x10, 0x1f, 0x00,
+ 0x01, 0x20, 0x00, 0x10, 0x2f, 0x10, 0x00, 0x11, 0x10, 0x10, 0x00, 0x10,
+ 0x0f, 0x00, 0x10, 0x11,
+ 0x10, 0x00, 0x02, 0x01, 0xf0, 0xff, 0x00, 0x03, 0x00, 0xf0, 0x00, 0x00,
+ 0x02, 0xef, 0x0f, 0x0f,
+ 0xf0, 0xf0, 0x01, 0x11, 0xf0, 0x00, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x11, 0x01, 0x11, 0x0f,
+ 0x0e, 0x00, 0x0f, 0x20, 0x21, 0x00, 0x10, 0x23, 0x21, 0x00, 0xf0, 0x02,
+ 0x32, 0x03, 0x02, 0x00,
+ 0x13, 0x00, 0xf0, 0x00, 0x0f, 0x0e, 0x00, 0x13, 0x0f, 0xfd, 0x00, 0x22,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x20, 0x10, 0x12, 0x10, 0x00, 0x1f, 0x20, 0x0f, 0x0f, 0x00, 0x0e, 0x0f,
+ 0x22, 0x11, 0xff, 0xfd,
+ 0x0f, 0x20, 0x12, 0x00, 0xef, 0xfe, 0x0f, 0x01, 0xe0, 0x0f, 0x0f, 0x0e,
+ 0xef, 0xdf, 0x0f, 0xdf,
+ 0xed, 0xf1, 0xe0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x24,
+ 0x01, 0x01, 0xff, 0x00, 0x13, 0x00, 0x11, 0x10, 0x01, 0x02, 0x10, 0x12,
+ 0x00, 0xfd, 0x00, 0x00,
+ 0x10, 0x00, 0x10, 0x12, 0x10, 0x00, 0x0e, 0x0f, 0x0f, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x02, 0x12,
+ 0x00, 0xfd, 0xdf, 0x0f, 0x00, 0xf0, 0xf0, 0x01, 0x13, 0x10, 0x0e, 0xde,
+ 0x0f, 0xff, 0x01, 0x22,
+ 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xf0, 0x23, 0x12, 0x10, 0x11, 0x0e, 0xfe,
+ 0x00, 0x10, 0x11, 0x11,
+ 0x00, 0xfd, 0xf0, 0x01, 0x01, 0x01, 0x0f, 0x00, 0x01, 0x01, 0x00, 0xee,
+ 0x12, 0x12, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x12, 0xf0, 0xfe, 0x0f, 0xed, 0xff, 0xfe,
+ 0x00, 0x11, 0x12, 0x20,
+ 0x0f, 0x1f, 0x00, 0x00, 0x22, 0x32, 0x00, 0x00, 0x02, 0xf0, 0xff, 0x00,
+ 0x13, 0x24, 0x00, 0xde,
+ 0x00, 0xf0, 0x02, 0x31, 0xe0, 0x00, 0x0f, 0x00, 0x01, 0x01, 0xfe, 0xf0,
+ 0x01, 0x0f, 0xdb, 0xf0,
+ 0x00, 0x00, 0x01, 0xef, 0x0e, 0xef, 0x0e, 0x0e, 0xff, 0x10, 0x10, 0x01,
+ 0x20, 0x00, 0x00, 0xf0,
+ 0xff, 0x00, 0x01, 0xf2, 0x01, 0x03, 0x00, 0xee, 0xf0, 0x01, 0x02, 0xf0,
+ 0x0e, 0x01, 0x00, 0x0f,
+ 0x00, 0xf0, 0x0e, 0x00, 0x10, 0x20, 0x00, 0xfe, 0x00, 0x20, 0x00, 0x30,
+ 0x21, 0x0f, 0xff, 0x10,
+ 0x20, 0x11, 0x00, 0x1f, 0x0f, 0x1f, 0x00, 0x1f, 0x10, 0x11, 0x00, 0xf1,
+ 0x01, 0x10, 0xef, 0xf0,
+ 0x00, 0x00, 0x00, 0xe0, 0xee, 0xdc, 0x00, 0x02, 0x11, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0xe0, 0x00, 0x01, 0xf3, 0x00, 0xe0, 0x0e, 0x00, 0xf2, 0x0f,
+ 0x01, 0x33, 0x01, 0x22,
+ 0x22, 0x00, 0x01, 0x20, 0x12, 0x12, 0x00, 0xf0, 0x10, 0x0f, 0xff, 0x0f,
+ 0x00, 0x00, 0x00, 0x20,
+ 0x22, 0x01, 0x10, 0x01, 0x10, 0x00, 0x00, 0xfe, 0x0f, 0x11, 0x00, 0xef,
+ 0x0d, 0x00, 0x01, 0x0f,
+ 0x0d, 0x00, 0x01, 0x00, 0xff, 0xfd, 0xfe, 0xfe, 0xfe, 0x00, 0x10, 0xe0,
+ 0x00, 0x00, 0xdd, 0xee,
+ 0xf0, 0x00, 0xee, 0xff, 0x00, 0x0f, 0x10, 0x0e, 0xff, 0x01, 0x10, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1,
+ 0x03, 0x00, 0xf0, 0xdf, 0x01, 0xe0, 0xf0, 0xf0, 0x01, 0xe1, 0x01, 0xf0,
+ 0x0f, 0x00, 0x12, 0x11,
+ 0x00, 0x00, 0x00, 0x1e, 0x0f, 0x1f, 0x0f, 0x00, 0x11, 0x21, 0x00, 0xff,
+ 0x0e, 0x00, 0x11, 0x01,
+ 0x02, 0x20, 0x00, 0x00, 0xf1, 0x00, 0xfe, 0x0f, 0x0f, 0x1f, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0xf1,
+ 0x01, 0xee, 0xfe, 0xf0, 0x00, 0xf2, 0x00, 0xe0, 0x00, 0x10, 0x01, 0x00,
+ 0xfe, 0x0e, 0x00, 0x20,
+ 0x12, 0x1f, 0x0f, 0x0f, 0x00, 0x13, 0x22, 0x01, 0x01, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0x13, 0x21,
+ 0x01, 0x11, 0x01, 0x00, 0x01, 0x02, 0x31, 0x13, 0x0f, 0xef, 0x0f, 0x00,
+ 0xee, 0x11, 0x23, 0x0f,
+ 0xfc, 0x0f, 0x10, 0x1f, 0x21, 0x00, 0x21, 0x00, 0x0d, 0x0f, 0x11, 0x11,
+ 0x0f, 0xf0, 0x10, 0x00,
+ 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0f, 0xed, 0x00, 0x02, 0x11,
+ 0x00, 0xee, 0xee, 0xe0,
+ 0xf0, 0xef, 0xdf, 0x0f, 0xdf, 0xf0, 0xff, 0x00, 0x00, 0x02, 0x01, 0x10,
+ 0x0f, 0x10, 0x01, 0x0f,
+ 0x00, 0x00, 0x03, 0x01, 0x01, 0x13, 0x0e, 0xe1, 0x00, 0x00, 0x03, 0x12,
+ 0x31, 0x02, 0x21, 0x00,
+ 0xfe, 0x00, 0x20, 0x31, 0x0f, 0x0f, 0x10, 0x00, 0x10, 0x22, 0x00, 0xed,
+ 0x12, 0x21, 0xf0, 0xff,
+ 0x02, 0x32, 0x01, 0xfd, 0xff, 0x00, 0xf1, 0xff, 0xf0, 0x00, 0x10, 0x11,
+ 0x01, 0x00, 0x00, 0x10,
+ 0x13, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x34, 0x11,
+ 0xf0, 0x0e, 0x0f, 0x0f,
+ 0x1f, 0x21, 0x22, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x10, 0x10, 0xf0, 0xff,
+ 0xfe, 0xff, 0x00, 0x0e,
+ 0xf0, 0x02, 0x0f, 0x00, 0xff, 0x00, 0x12, 0xff, 0x0f, 0x0e, 0xee, 0xff,
+ 0x0f, 0x00, 0xf0, 0x0e,
+ 0xff, 0x10, 0x11, 0x00, 0x10, 0x22, 0x23, 0x00, 0x12, 0x00, 0x21, 0xf1,
+ 0xff, 0xff, 0x00, 0x01,
+ 0x33, 0x00, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x10, 0x12, 0x00, 0xf0, 0x11,
+ 0x00, 0xdd, 0x11, 0x00,
+ 0xdb, 0x00, 0xfe, 0xe0, 0x00, 0x0e, 0xdc, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x0e, 0x00, 0x22, 0x01,
+ 0x00, 0x00, 0x11, 0xf0, 0xef, 0x00, 0x01, 0xf0, 0xe3, 0x01, 0xff, 0xf0,
+ 0x02, 0x10, 0x11, 0x03,
+ 0x00, 0x00, 0xf0, 0x00, 0x11, 0x0f, 0x0f, 0x10, 0x00, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3b, 0x17, 0x17, 0x1a, 0x23, 0x17, 0x83, 0x19, 0x00, 0x1f, 0x10, 0x10,
+ 0x10, 0x11, 0x21, 0x00,
+ 0x0e, 0x10, 0x10, 0x00, 0x1f, 0x00, 0x23, 0x0f, 0xee, 0x0f, 0x00, 0x10,
+ 0x00, 0xf1, 0xfe, 0xfe,
+ 0xfe, 0x00, 0xff, 0xee, 0x0f, 0x0f, 0xff, 0xff, 0xf0, 0xf0, 0x02, 0x00,
+ 0xfe, 0xdf, 0xff, 0x0f,
+ 0xff, 0xef, 0x13, 0x04, 0xf0, 0xee, 0xf0, 0xf0, 0xf0, 0x00, 0x12, 0x01,
+ 0x01, 0x02, 0x00, 0x02,
+ 0x10, 0x12, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x0e, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x10, 0x01, 0x0f, 0x0f, 0x20, 0x0e, 0x00, 0x01, 0x22, 0x00, 0xfc, 0x00,
+ 0x0f, 0x0d, 0xef, 0xff,
+ 0x10, 0x12, 0x00, 0xff, 0xef, 0xfd, 0x0e, 0x02, 0x01, 0x00, 0xf0, 0xee,
+ 0x0f, 0x0e, 0xf0, 0xf0,
+ 0xf0, 0xfe, 0x0f, 0x0f, 0x0e, 0x0f, 0x01, 0x21, 0x12, 0x00, 0x00, 0x20,
+ 0x01, 0xe0, 0x00, 0x0f,
+ 0xf0, 0xf1, 0xef, 0x00, 0xe1, 0xf2, 0xf0, 0xe0, 0x01, 0xff, 0xf0, 0x10,
+ 0x21, 0x12, 0x11, 0x00,
+ 0x1e, 0x10, 0x1f, 0xfd, 0x0f, 0xff, 0x20, 0x13, 0x00, 0x11, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x20,
+ 0x10, 0x01, 0x0f, 0x0f, 0x0f, 0x21, 0x0f, 0x10, 0x0f, 0xf1, 0xf0, 0x00,
+ 0x03, 0x03, 0x00, 0xe1,
+ 0x01, 0xf0, 0xdf, 0xf0, 0x00, 0x01, 0x10, 0xfd, 0x00, 0x22, 0x01, 0x10,
+ 0x0e, 0x00, 0x10, 0x13,
+ 0x0f, 0x0f, 0x31, 0x03, 0x11, 0x34, 0xff, 0xff, 0xf0, 0x00, 0x11, 0x00,
+ 0x11, 0x10, 0x01, 0x01,
+ 0x12, 0x02, 0x01, 0x11, 0x12, 0x0f, 0xf0, 0x11, 0x00, 0xf0, 0x00, 0x0e,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x33, 0x00, 0x1f, 0x11, 0x22, 0x00, 0x0d, 0x21, 0x24, 0x00, 0x0e, 0x0e,
+ 0x00, 0x40, 0x00, 0xfe,
+ 0x0f, 0x0d, 0x10, 0x34, 0x00, 0xfe, 0x01, 0x10, 0xf0, 0xfd, 0xf0, 0x0f,
+ 0xff, 0xee, 0xff, 0xe0,
+ 0xed, 0xed, 0xef, 0xed, 0x0f, 0xf0, 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x00, 0xde, 0x01,
+ 0x12, 0x01, 0x00, 0xff, 0xef, 0x00, 0x04, 0x21, 0xf0, 0xf0, 0x01, 0x23,
+ 0x21, 0x21, 0x00, 0x00,
+ 0x1f, 0x20, 0x00, 0x21, 0x00, 0xf0, 0x00, 0x0e, 0x0f, 0x00, 0x22, 0x02,
+ 0x01, 0xf0, 0xfe, 0x01,
+ 0x01, 0x00, 0xfd, 0xf0, 0x01, 0x00, 0xee, 0x0f, 0xff, 0x00, 0x1f, 0x00,
+ 0x02, 0x32, 0xfe, 0xff,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x20, 0x0f, 0xff, 0x00, 0x11,
+ 0x20, 0x00, 0x0f, 0x0f,
+ 0x22, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x03, 0x10, 0xf1,
+ 0xe0, 0xfd, 0x00, 0x00,
+ 0xef, 0x01, 0x24, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0xff, 0x10, 0x0e, 0x0e,
+ 0xf0, 0x0e, 0xfe, 0x10,
+ 0x02, 0x20, 0x22, 0x00, 0x0f, 0x00, 0x0f, 0x01, 0x12, 0x34, 0x01, 0xee,
+ 0xfe, 0x01, 0x01, 0x24,
+ 0x00, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0xfe,
+ 0xf0, 0x0f, 0x0f, 0x0f,
+ 0xef, 0xff, 0xee, 0x0e, 0xf0, 0xfe, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x10,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x0f, 0xfe, 0x00, 0xef, 0xf0, 0xe0, 0x01, 0x12, 0xf1, 0x01, 0xe0,
+ 0x00, 0xf0, 0x02, 0x10,
+ 0x00, 0xff, 0x00, 0x0e, 0x0f, 0x10, 0x10, 0x10, 0x0e, 0x10, 0x00, 0x0f,
+ 0x0f, 0x02, 0x54, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x1f, 0x10, 0x21, 0x10, 0x10, 0x00, 0x0f, 0xff,
+ 0x10, 0x20, 0x00, 0xf0,
+ 0xf0, 0xf0, 0xff, 0x00, 0xe1, 0x00, 0x10, 0xf0, 0xfd, 0xff, 0x01, 0x21,
+ 0x00, 0xe0, 0x0f, 0x1f,
+ 0xf0, 0xef, 0x01, 0x01, 0x00, 0xf0, 0x03, 0xe0, 0x0e, 0x00, 0xe1, 0x01,
+ 0x44, 0x00, 0xee, 0x00,
+ 0x10, 0x11, 0x01, 0x12, 0x22, 0x11, 0x00, 0x12, 0x00, 0xf1, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0xff,
+ 0xf0, 0x23, 0x20, 0x00, 0x10, 0x11, 0x00, 0x1f, 0x10, 0x22, 0x11, 0x00,
+ 0xff, 0xed, 0x0f, 0x10,
+ 0x10, 0xed, 0x0f, 0x00, 0xfe, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0xdd, 0x00, 0xfe, 0xed,
+ 0x0f, 0xfd, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0xfe, 0xed, 0x0f, 0x11, 0x22,
+ 0x00, 0xf2, 0xf0, 0xe0,
+ 0x01, 0xf0, 0xed, 0xe0, 0x00, 0xef, 0xe0, 0x01, 0x01, 0xf2, 0x00, 0x00,
+ 0x01, 0x01, 0x20, 0x10,
+ 0x00, 0x00, 0x00, 0x30, 0xf0, 0xf0, 0x00, 0x0f, 0xfe, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x21, 0x10,
+ 0x00, 0x10, 0x20, 0x00, 0xfe, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0xf2, 0xf0, 0x00, 0x00,
+ 0x00, 0xe0, 0xfe, 0x00, 0x00, 0xf0, 0x01, 0x11, 0xfe, 0xfe, 0x0f, 0x10,
+ 0x12, 0x11, 0x00, 0x0e,
+ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x12, 0x01,
+ 0x12, 0x01, 0x00, 0xf0,
+ 0x01, 0x03, 0x13, 0x22, 0x01, 0xfe, 0x00, 0x01, 0x12, 0x21, 0x01, 0xe0,
+ 0x0f, 0x1f, 0xfd, 0xfe,
+ 0x00, 0x22, 0x01, 0x00, 0x1f, 0x10, 0x01, 0x1f, 0x0e, 0x00, 0x20, 0x10,
+ 0x11, 0x10, 0x1f, 0x10,
+ 0x20, 0x00, 0x1f, 0x0e, 0xff, 0x00, 0x01, 0x23, 0xf0, 0x01, 0xf0, 0xed,
+ 0xff, 0x0e, 0xe0, 0x00,
+ 0x0f, 0xee, 0x00, 0x0f, 0xde, 0x0f, 0xe0, 0x00, 0x00, 0xf0, 0x01, 0xf0,
+ 0x00, 0x0f, 0xf2, 0x02,
+ 0x20, 0x01, 0xce, 0x0f, 0x01, 0x00, 0xe1, 0x00, 0x11, 0x01, 0xf1, 0x02,
+ 0x11, 0x01, 0x01, 0x42,
+ 0x10, 0x00, 0x10, 0x20, 0x20, 0x12, 0x00, 0x21, 0xfe, 0xff, 0x00, 0x00,
+ 0x11, 0x01, 0x11, 0x00,
+ 0xf1, 0x00, 0x0e, 0x00, 0x12, 0x12, 0x10, 0x0f, 0x0e, 0xef, 0x00, 0x10,
+ 0x00, 0x11, 0x02, 0x23,
+ 0x0f, 0xdf, 0xff, 0x00, 0xe0, 0x0e, 0x00, 0x02, 0x00, 0x10, 0x1f, 0x0e,
+ 0x22, 0x23, 0x1f, 0x20,
+ 0x00, 0xfe, 0x00, 0x34, 0x11, 0x00, 0x10, 0x00, 0xfe, 0xff, 0x00, 0x0f,
+ 0x01, 0x01, 0x00, 0xfe,
+ 0x00, 0xd0, 0x0f, 0x20, 0xf1, 0x00, 0xff, 0xee, 0x00, 0x00, 0x00, 0x1f,
+ 0x10, 0x0f, 0xee, 0xfe,
+ 0x0f, 0xf0, 0x00, 0x10, 0x10, 0x11, 0x11, 0x01, 0x01, 0xf0, 0x00, 0x11,
+ 0x11, 0x01, 0x10, 0x02,
+ 0x11, 0x13, 0x21, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x24, 0x11, 0x00, 0xff,
+ 0x00, 0x1e, 0x00, 0xf1,
+ 0x0f, 0xed, 0xfe, 0x00, 0x0e, 0x0f, 0xe0, 0xf0, 0xed, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xee,
+ 0x00, 0x10, 0x10, 0x01, 0x01, 0xf0, 0xf0, 0xf1, 0xe0, 0xfe, 0xf0, 0x05,
+ 0x10, 0xe0, 0x01, 0x02,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x11, 0x00, 0x22, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x10, 0x11, 0x11, 0x11, 0x10, 0x21, 0x10, 0x1f, 0x0e, 0x10, 0x10, 0x01,
+ 0x10, 0x00, 0xff, 0x0e,
+ 0x00, 0x01, 0xf0, 0x00, 0xed, 0x0e, 0xef, 0x0f, 0x10, 0x0e, 0x10, 0xfd,
+ 0x01, 0x00, 0xf0, 0xef,
+ 0xfd, 0xdf, 0x00, 0xe0, 0x00, 0xf2, 0xff, 0xf0, 0xef, 0x00, 0xf0, 0xf0,
+ 0xff, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0xe0, 0x00, 0x13, 0x00, 0x01, 0x04, 0x20, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x0f,
+ 0x1f, 0x10, 0x10, 0x00, 0x01, 0x1f, 0x1e, 0x11, 0x13, 0x10, 0x0f, 0xfe,
+ 0x00, 0x20, 0xff, 0xfe,
+ 0x10, 0x32, 0x0f, 0xee, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x03, 0x00, 0xfc,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0xdd, 0x10, 0x0e, 0x0e, 0xfd, 0x0e, 0x00, 0x12, 0x00, 0x12, 0x00, 0xee,
+ 0x0f, 0x01, 0x02, 0xf0,
+ 0xe0, 0x00, 0xfe, 0xf0, 0xf0, 0x01, 0x00, 0xff, 0x00, 0xde, 0x00, 0x01,
+ 0xf0, 0x01, 0x01, 0x12,
+ 0x00, 0x10, 0xf0, 0x00, 0x01, 0x10, 0x0f, 0x20, 0x00, 0x00, 0x10, 0x00,
+ 0xfe, 0xfe, 0x10, 0x12,
+ 0x10, 0x10, 0x10, 0x00, 0x00, 0x21, 0x23, 0x00, 0x0f, 0x0f, 0xf0, 0x0f,
+ 0x00, 0x02, 0x01, 0x00,
+ 0x00, 0xef, 0xf0, 0x01, 0xf2, 0x00, 0xf0, 0xe0, 0x10, 0x00, 0xf0, 0x0f,
+ 0x00, 0x10, 0x11, 0x22,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x23, 0x0f, 0x0f, 0x00, 0x23, 0x02, 0x10,
+ 0x00, 0x22, 0x01, 0x0f,
+ 0x00, 0x14, 0x00, 0x0e, 0xf2, 0x23, 0x00, 0xff, 0xff, 0x00, 0x03, 0x0f,
+ 0x00, 0x02, 0x13, 0x00,
+ 0x0e, 0x00, 0x0f, 0x00, 0x02, 0x10, 0x00, 0x0f, 0x01, 0x11, 0x10, 0x1e,
+ 0x10, 0x20, 0x11, 0x20,
+ 0x10, 0x20, 0x10, 0x20, 0x21, 0x10, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
+ 0x00, 0xfd, 0xfe, 0x10,
+ 0x00, 0xef, 0x1e, 0xfe, 0xed, 0x00, 0x0f, 0xdd, 0x00, 0x00, 0xf0, 0xf0,
+ 0xee, 0xf0, 0xef, 0xf0,
+ 0xf0, 0xf1, 0x01, 0x01, 0x00, 0xdf, 0xf0, 0x01, 0x00, 0xef, 0x00, 0x00,
+ 0x23, 0x01, 0x01, 0xf1,
+ 0x00, 0x10, 0x33, 0x11, 0x21, 0x01, 0x21, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x0f, 0xf0, 0xf2, 0x00,
+ 0x01, 0xef, 0x10, 0x10, 0xf0, 0xfd, 0x01, 0x01, 0x10, 0x10, 0x00, 0xff,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0xef, 0x0f, 0x00, 0x0c, 0xff, 0x00, 0x01,
+ 0x32, 0x10, 0x0e, 0x20,
+ 0x35, 0x00, 0x0f, 0x0f, 0x01, 0x02, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0xf1,
+ 0x01, 0x12, 0x00, 0xf0,
+ 0x0f, 0xf2, 0x02, 0x02, 0x0f, 0xef, 0x01, 0x10, 0x00, 0xef, 0x10, 0x10,
+ 0xfe, 0x0e, 0x00, 0x10,
+ 0x12, 0x0f, 0x00, 0x0f, 0x0f, 0xfd, 0xee, 0x20, 0x11, 0x12, 0x02, 0x00,
+ 0x0f, 0xf0, 0x00, 0x03,
+ 0x21, 0x12, 0x0f, 0xff, 0x01, 0x31, 0x01, 0x00, 0x02, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x0e, 0x00, 0xe0, 0x00, 0x0f, 0xdd, 0x0f, 0x00, 0x10, 0xfd,
+ 0xfe, 0x0f, 0x00, 0x22,
+ 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x01, 0xe2, 0x00, 0xf0, 0xfd, 0xe0,
+ 0xfe, 0x00, 0xf1, 0xe0,
+ 0x0f, 0x00, 0x00, 0xef, 0x00, 0x22, 0x00, 0x11, 0x01, 0x00, 0x0d, 0x00,
+ 0x00, 0xf0, 0x11, 0x11,
+ 0x0f, 0xff, 0x10, 0x00, 0x31, 0x00, 0x21, 0x21, 0x1f, 0x10, 0x22, 0x01,
+ 0x10, 0x01, 0x10, 0x0f,
+ 0xf0, 0x0e, 0x00, 0x00, 0x00, 0x22, 0x00, 0xfe, 0xfe, 0xff, 0x0f, 0x00,
+ 0x03, 0x21, 0x00, 0xfe,
+ 0x00, 0xf0, 0xfe, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xef, 0x11,
+ 0x11, 0x11, 0x00, 0xf0,
+ 0x00, 0xf1, 0xf1, 0x02, 0x10, 0x0f, 0xe0, 0x01, 0x00, 0x01, 0xe1, 0x01,
+ 0x21, 0x00, 0x00, 0x0f,
+ 0x00, 0x14, 0x00, 0x33, 0x10, 0x00, 0xf0, 0x0f, 0x1f, 0x20, 0x12, 0x11,
+ 0x00, 0xec, 0x00, 0x00,
+ 0x12, 0x32, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x10, 0x01, 0x00, 0xf0, 0x00,
+ 0x0d, 0xf0, 0x0e, 0x0f,
+ 0x1f, 0x0d, 0xef, 0x1f, 0x1e, 0x00, 0x0f, 0xf0, 0x00, 0xef, 0xff, 0x0f,
+ 0x01, 0xef, 0xee, 0xf0,
+ 0x00, 0xff, 0xf0, 0xff, 0xf0, 0xfe, 0xe0, 0x00, 0x02, 0x00, 0x00, 0xf0,
+ 0x01, 0xe1, 0x00, 0xff,
+ 0xf1, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x01, 0x1f, 0x1f, 0x00, 0x2f,
+ 0x00, 0xf0, 0x12, 0x00,
+ 0x0d, 0x00, 0xff, 0x0f, 0x01, 0x43, 0x00, 0xff, 0x0f, 0x0f, 0x1f, 0x0f,
+ 0xff, 0x00, 0x11, 0x00,
+ 0xf1, 0x02, 0x00, 0x00, 0xee, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xff,
+ 0x00, 0x11, 0x0f, 0x0f,
+ 0x0f, 0x10, 0x00, 0x03, 0x21, 0xf0, 0xff, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x03, 0x00, 0x10, 0x32,
+ 0x02, 0xf0, 0x01, 0x33, 0x02, 0xe0, 0xf0, 0x02, 0x22, 0xf0, 0xef, 0x02,
+ 0x01, 0x10, 0xff, 0x0f,
+ 0x01, 0x00, 0xf1, 0x00, 0x2f, 0x11, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x0f,
+ 0x20, 0x0e, 0x00, 0x30,
+ 0x22, 0x33, 0x0f, 0x0f, 0x10, 0x20, 0x0f, 0x11, 0x22, 0x00, 0xf0, 0x0e,
+ 0xfe, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x0e, 0x00, 0xee, 0x0f, 0x01, 0x01, 0x0f, 0x0f, 0xef,
+ 0xef, 0x00, 0xfe, 0xe0,
+ 0xff, 0x00, 0xf0, 0xd0, 0x00, 0x02, 0x01, 0xf0, 0xf0, 0x00, 0x00, 0xf0,
+ 0xf0, 0x00, 0x12, 0x02,
+ 0x11, 0xf0, 0x0f, 0x00, 0x02, 0x32, 0x10, 0x11, 0x21, 0x01, 0x20, 0x01,
+ 0x01, 0x20, 0x01, 0x0f,
+ 0xff, 0x00, 0x01, 0x10, 0x12, 0x01, 0x10, 0x00, 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x12, 0x00, 0x00,
+ 0xff, 0x00, 0x02, 0x0f, 0xcd, 0x00, 0x10, 0x00, 0xee, 0x0f, 0x00, 0x0e,
+ 0x10, 0x24, 0x10, 0x21,
+ 0x0f, 0x0e, 0x01, 0x31, 0x02, 0x21, 0x10, 0x01, 0xfd, 0xfe, 0x00, 0x00,
+ 0x12, 0x10, 0x00, 0x21,
+ 0x01, 0xe0, 0x00, 0x23, 0x00, 0x00, 0xd0, 0x0e, 0x00, 0x00, 0xee, 0xf0,
+ 0x0f, 0x0e, 0xed, 0x00,
+ 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x30, 0x01, 0xef, 0x0f, 0x10, 0x00, 0xf2,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x23, 0x20, 0x01, 0x00, 0x13, 0x00, 0x20, 0x01, 0x00,
+ 0x11, 0x01, 0x01, 0xff,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xfd, 0xf0, 0x00, 0x00, 0xfd, 0x00,
+ 0x0e, 0x0f, 0x00, 0xff,
+ 0xfe, 0x00, 0x02, 0x00, 0xed, 0x01, 0x01, 0x00, 0x00, 0x03, 0x00, 0xed,
+ 0xff, 0xf0, 0xe0, 0x00,
+ 0x02, 0x01, 0xf0, 0xff, 0x01, 0xf0, 0xf0, 0x00, 0x01, 0x33, 0x10, 0x00,
+ 0xf0, 0x0e, 0x00, 0x02,
+ 0x0f, 0x0f, 0x00, 0x12, 0x23, 0x0f, 0xff, 0x01, 0x21, 0x10, 0x00, 0x10,
+ 0x10, 0x22, 0x0f, 0xf0,
+ 0x00, 0x30, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0xff, 0xed,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x0f, 0xee, 0xf0, 0x0e, 0xe0, 0x0f, 0xf0, 0x00, 0xde, 0xf0, 0xf0,
+ 0xf0, 0xfe, 0x10, 0x01,
+ 0x00, 0xed, 0x00, 0xe0, 0x03, 0x12, 0x00, 0xf2, 0xf0, 0xff, 0xe0, 0x01,
+ 0xf2, 0x01, 0x02, 0x0f,
+ 0x0f, 0x00, 0x11, 0x33, 0xfe, 0x00, 0x40, 0x02, 0x0e, 0x10, 0x30, 0xe0,
+ 0x0f, 0x00, 0x11, 0x0f,
+ 0xde, 0x10, 0x01, 0x11, 0x11, 0x11, 0x00, 0xff, 0x11, 0x11, 0x0f, 0x0c,
+ 0x0f, 0xff, 0x00, 0x10,
+ 0x0f, 0x0f, 0x0e, 0x01, 0x01, 0x0e, 0xfe, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x0f, 0x0e, 0xe0, 0x0f,
+ 0xff, 0x00, 0xfe, 0xef, 0xff, 0x01, 0x01, 0xff, 0x00, 0xf2, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0xff, 0xf0, 0x0f, 0xf0, 0xff, 0x01, 0x01, 0xef, 0x00, 0x33, 0x00, 0xfd,
+ 0x00, 0x11, 0x32, 0x11,
+ 0x00, 0x00, 0x2f, 0xfe, 0xfe, 0x10, 0x22, 0x10, 0x00, 0x01, 0x0f, 0x00,
+ 0x20, 0x02, 0x00, 0x00,
+ 0xf0, 0x01, 0xf0, 0x02, 0x10, 0x02, 0xff, 0xfe, 0xed, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x02, 0x10,
+ 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x1f, 0x10, 0x0f, 0x00, 0x13,
+ 0x10, 0x11, 0x11, 0x00,
+ 0x1f, 0x11, 0x02, 0x21, 0x12, 0x02, 0x23, 0x00, 0xee, 0xe0, 0x02, 0x00,
+ 0x01, 0xf0, 0x00, 0x11,
+ 0xef, 0xff, 0x01, 0x01, 0xf0, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x2e, 0x01, 0x20,
+ 0x00, 0x01, 0x22, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10, 0x30, 0x13, 0x11,
+ 0x1e, 0x0d, 0x0f, 0x00,
+ 0x30, 0x0e, 0x0f, 0x20, 0x00, 0xfe, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0x0e,
+ 0xcd, 0x0f, 0x00, 0xf0,
+ 0xdf, 0x00, 0xde, 0x0e, 0xef, 0xe0, 0xff, 0xf1, 0x02, 0x02, 0xf0, 0x0f,
+ 0xf0, 0xe0, 0x02, 0x10,
+ 0xf0, 0xf0, 0x00, 0x11, 0x00, 0xf0, 0x01, 0x13, 0x10, 0x12, 0x01, 0x10,
+ 0x00, 0x21, 0x00, 0x03,
+ 0x11, 0x10, 0x10, 0x00, 0xee, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc7, 0xf1, 0x0e, 0xee, 0x8f, 0xf1, 0xab, 0xed, 0x00, 0xff, 0x02, 0x02,
+ 0x0f, 0xdd, 0x0f, 0x00,
+ 0x01, 0x01, 0xe0, 0x0f, 0x0e, 0x0d, 0xff, 0x00, 0x00, 0x20, 0x0f, 0x11,
+ 0x10, 0x11, 0x00, 0x1f,
+ 0x10, 0x00, 0x0f, 0x0f, 0x10, 0x12, 0x00, 0x0f, 0x01, 0x01, 0x00, 0x01,
+ 0x01, 0x23, 0x00, 0xf0,
+ 0x02, 0x00, 0x0f, 0xf0, 0x00, 0x24, 0xf0, 0xf0, 0xff, 0x00, 0x00, 0x0e,
+ 0xfe, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xf0, 0x00, 0x0e,
+ 0x01, 0x10, 0x00, 0xe0,
+ 0x00, 0x22, 0x22, 0x01, 0x00, 0x02, 0x11, 0x01, 0x22, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0xff, 0x0f,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0x1e,
+ 0x00, 0x02, 0x0f, 0x0d,
+ 0xf0, 0x0e, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xfe, 0x00, 0xf0,
+ 0x00, 0xf0, 0xfe, 0xee,
+ 0x00, 0xf0, 0xff, 0x01, 0x00, 0x0f, 0xef, 0x00, 0x02, 0x10, 0x01, 0x00,
+ 0xff, 0x00, 0x0f, 0x10,
+ 0x02, 0x21, 0x02, 0x00, 0x0d, 0x10, 0x11, 0x21, 0x00, 0x10, 0x11, 0x12,
+ 0x00, 0x10, 0x11, 0x11,
+ 0x10, 0x21, 0x01, 0xf0, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x0e, 0x00, 0x0e,
+ 0x00, 0x00, 0xff, 0xf1,
+ 0x11, 0x01, 0x00, 0x0f, 0x00, 0xed, 0xf0, 0x0f, 0x00, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0x12, 0x01,
+ 0x00, 0xf0, 0x00, 0xde, 0x01, 0x02, 0xf1, 0xf2, 0x02, 0xff, 0xff, 0xf0,
+ 0xff, 0x00, 0x00, 0x10,
+ 0x21, 0x01, 0x11, 0x12, 0x22, 0x21, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0x03, 0xf0, 0x00,
+ 0x0f, 0xff, 0x00, 0x12, 0x20, 0x01, 0x00, 0x10, 0x20, 0x00, 0x0f, 0x1f,
+ 0x1f, 0xff, 0x00, 0x1f,
+ 0x0e, 0x10, 0x00, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0xf0, 0x0d, 0xee, 0x0e,
+ 0xed, 0x10, 0x01, 0x01,
+ 0xef, 0xfe, 0xf0, 0xef, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xe0, 0xf0, 0x01,
+ 0x01, 0xf0, 0xf0, 0xff,
+ 0xdd, 0xfe, 0x01, 0xf2, 0x02, 0x00, 0xfd, 0xf0, 0x00, 0x21, 0x00, 0x10,
+ 0x10, 0x11, 0x31, 0xff,
+ 0x0e, 0x01, 0x20, 0x0f, 0x00, 0x0f, 0xf0, 0x10, 0x00, 0x0f, 0xf0, 0x00,
+ 0x02, 0x10, 0x11, 0x00,
+ 0xee, 0xf0, 0x00, 0x10, 0xf0, 0x0e, 0xf0, 0x00, 0x0f, 0x02, 0x00, 0xed,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x11, 0xfe, 0xf0, 0x0f, 0x1f, 0x00, 0x20, 0x01, 0x12, 0x10,
+ 0x12, 0x00, 0x00, 0x12,
+ 0x01, 0x12, 0x12, 0x11, 0x00, 0xe2, 0x00, 0x01, 0x02, 0x00, 0xe0, 0x02,
+ 0x00, 0x00, 0xdf, 0x00,
+ 0x01, 0x00, 0x0e, 0xf0, 0x00, 0x11, 0x11, 0x01, 0x10, 0x20, 0x0f, 0x0f,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0x21, 0x21, 0xfe, 0x00, 0x20, 0x10, 0x10, 0x10, 0x20,
+ 0x10, 0x00, 0x00, 0x30,
+ 0x0e, 0x0f, 0x00, 0x00, 0xef, 0x00, 0x20, 0xf0, 0xef, 0x00, 0x0f, 0xef,
+ 0xee, 0x0e, 0xf0, 0xef,
+ 0x00, 0xf0, 0x0f, 0xe0, 0xf0, 0x01, 0xf1, 0x00, 0xff, 0x00, 0xf0, 0x00,
+ 0xf3, 0x00, 0x01, 0x02,
+ 0x0f, 0x0e, 0xdf, 0x00, 0x20, 0x01, 0x01, 0x03, 0x10, 0x11, 0x01, 0x22,
+ 0x00, 0x10, 0x21, 0x01,
+ 0x10, 0x00, 0x12, 0x12, 0x21, 0x0f, 0xed, 0x01, 0x11, 0x12, 0x00, 0x0f,
+ 0xf0, 0x00, 0x02, 0x0f,
+ 0xfe, 0x02, 0x01, 0x0f, 0xef, 0x0f, 0xff, 0xfd, 0x01, 0x22, 0x00, 0x0f,
+ 0x0f, 0x1f, 0x0f, 0x1f,
+ 0x10, 0x20, 0x00, 0x00, 0x0f, 0x0f, 0x21, 0x03, 0x11, 0x11, 0x00, 0xff,
+ 0x00, 0x01, 0x11, 0x11,
+ 0x13, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x1f, 0x00, 0x03, 0xf0, 0xff, 0x0f,
+ 0xef, 0x00, 0x00, 0xef,
+ 0x0e, 0x00, 0xff, 0xfd, 0x0f, 0x00, 0x11, 0x33, 0x0f, 0x00, 0x10, 0xff,
+ 0xed, 0x00, 0xf1, 0x02,
+ 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x02, 0x1f, 0x10, 0x00, 0x12, 0x10,
+ 0x11, 0x21, 0x01, 0x00,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x02, 0x22, 0x00, 0xed, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x00, 0x20, 0x0f,
+ 0xee, 0x00, 0x0f, 0x00, 0x01, 0x03, 0x00, 0xdd, 0xf0, 0xf0, 0xf0, 0xf0,
+ 0x00, 0x00, 0x01, 0x0f,
+ 0xef, 0x00, 0x00, 0xe0, 0x00, 0x10, 0xe0, 0x0f, 0xf0, 0xf0, 0xe1, 0x01,
+ 0x12, 0x00, 0x10, 0x0f,
+ 0x10, 0x00, 0x0f, 0x10, 0x14, 0x21, 0x00, 0xff, 0xff, 0x01, 0x22, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x20, 0x02, 0x10, 0x20, 0x10, 0x00, 0x0f, 0xfd, 0xf0, 0x10, 0x00, 0x10,
+ 0x00, 0x0f, 0xe0, 0x0f,
+ 0x00, 0x0f, 0x0f, 0xfe, 0xfe, 0x0f, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0xfe,
+ 0x0e, 0xde, 0x0f, 0xf1,
+ 0x01, 0x03, 0xf0, 0xf0, 0xe0, 0xff, 0xe0, 0x0f, 0xf1, 0xf1, 0xf0, 0x00,
+ 0x11, 0x00, 0x01, 0xf1,
+ 0x00, 0x0f, 0x00, 0x11, 0x10, 0x01, 0x12, 0x01, 0x00, 0x2f, 0x00, 0x01,
+ 0x00, 0x00, 0x0e, 0xf0,
+ 0xf0, 0x10, 0x24, 0x0f, 0x0f, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10,
+ 0x0e, 0x00, 0x00, 0x21,
+ 0x10, 0x00, 0x0f, 0x1f, 0x0f, 0xff, 0x00, 0x10, 0xff, 0x0f, 0xf1, 0x01,
+ 0x00, 0xfd, 0x0f, 0xff,
+ 0x0e, 0x10, 0x00, 0x01, 0xf0, 0xff, 0x0f, 0xef, 0xf0, 0xf0, 0xf0, 0xe0,
+ 0x00, 0x00, 0xe0, 0x00,
+ 0xf0, 0xe1, 0x00, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0xff, 0x00, 0x11,
+ 0x22, 0x12, 0x0f, 0x0f,
+ 0x00, 0x10, 0x10, 0x00, 0x21, 0x11, 0x00, 0x0f, 0x10, 0x11, 0x11, 0x00,
+ 0xe0, 0x0f, 0x10, 0x10,
+ 0x01, 0x01, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0x00, 0x21, 0xf0, 0xf0, 0x00,
+ 0xf1, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x01, 0x10, 0x12, 0x10, 0x11,
+ 0x22, 0x00, 0x11, 0x22,
+ 0x12, 0x10, 0x00, 0x00, 0x21, 0x01, 0xe0, 0x13, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0xe2, 0x00,
+ 0xff, 0xef, 0x00, 0x11, 0xfe, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0x10, 0x02,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x22, 0x20, 0x00, 0x20, 0x10, 0x30,
+ 0x10, 0x10, 0x1e, 0x20,
+ 0x10, 0x30, 0x00, 0x10, 0x31, 0xff, 0xfc, 0xf0, 0x00, 0x0d, 0xff, 0xff,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0xed, 0xff, 0x0f, 0xff, 0xef, 0xf0, 0x00, 0x02, 0xf0, 0xd0, 0xf0, 0xef,
+ 0x00, 0x00, 0xd1, 0x00,
+ 0x00, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x13, 0x0f, 0xf0, 0x00, 0xf1, 0x01,
+ 0x24, 0x21, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x11, 0x10, 0x10, 0x01, 0x00, 0x0e, 0x00, 0x12, 0x03,
+ 0x02, 0xff, 0xdd, 0x00,
+ 0x00, 0xe1, 0xff, 0x00, 0x02, 0x10, 0x0f, 0xff, 0xff, 0x10, 0x0e, 0x0e,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x0e, 0x0e, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x33, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x11, 0x11, 0xf2, 0x00, 0x11, 0x00, 0x02, 0x00,
+ 0xe0, 0xff, 0x00, 0x10,
+ 0x00, 0xf1, 0x01, 0x0e, 0xff, 0xfe, 0x0e, 0xfe, 0xff, 0x10, 0x20, 0x12,
+ 0x11, 0x00, 0xff, 0xf0,
+ 0x0f, 0x00, 0x02, 0x0f, 0x00, 0x00, 0x01, 0x02, 0x10, 0x11, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x12,
+ 0x10, 0x00, 0x02, 0x20, 0x00, 0xee, 0xff, 0x00, 0x12, 0x00, 0x0e, 0x00,
+ 0x0e, 0x01, 0x01, 0x0f,
+ 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xe0, 0x0f, 0xff,
+ 0xfe, 0x00, 0x00, 0xe0,
+ 0x1f, 0x00, 0xef, 0x00, 0xf0, 0xef, 0x0f, 0xf0, 0x0f, 0xef, 0xf0, 0xfe,
+ 0xf0, 0x00, 0xf1, 0xff,
+ 0x0f, 0x01, 0x00, 0xf1, 0x01, 0x20, 0x33, 0x00, 0x00, 0x0f, 0x00, 0x33,
+ 0x00, 0x01, 0x22, 0x0f,
+ 0x0f, 0x20, 0x13, 0x00, 0x10, 0x10, 0x00, 0x21, 0x02, 0x01, 0x00, 0x00,
+ 0x10, 0x0d, 0xf0, 0x00,
+ 0x00, 0x10, 0x10, 0x0e, 0xfe, 0xfe, 0x00, 0x0e, 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0xf0, 0x10,
+ 0x13, 0x00, 0xed, 0xe0, 0xff, 0x01, 0x00, 0xee, 0x01, 0x01, 0xf0, 0xff,
+ 0x00, 0xf0, 0x01, 0x33,
+ 0xf0, 0xf0, 0x0f, 0xf0, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+ 0x10, 0x12, 0x12, 0xf1,
+ 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x32, 0x00, 0x20, 0x0f, 0x0f, 0x1f, 0x10, 0x10, 0x0f, 0x1f, 0x0f, 0x0d,
+ 0xef, 0x0e, 0x00, 0x01,
+ 0x0e, 0x0e, 0xee, 0x10, 0x02, 0x00, 0x00, 0xee, 0xd0, 0xfd, 0xe0, 0xf0,
+ 0x02, 0xe0, 0xf2, 0xee,
+ 0xee, 0xfe, 0xff, 0xf1, 0x00, 0xf1, 0x00, 0xee, 0x00, 0x00, 0xe0, 0x0f,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xff, 0x10, 0x12, 0x20, 0x0f, 0x10, 0x11, 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x12, 0x00, 0x0d,
+ 0xde, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x1f, 0xf0, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0xe0, 0x00,
+ 0xed, 0x00, 0xf0, 0x00, 0x0f, 0x1f, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x00,
+ 0x10, 0x00, 0x20, 0x03,
+ 0x12, 0x01, 0x12, 0x10, 0x00, 0xef, 0x01, 0x11, 0x12, 0x01, 0x00, 0xf1,
+ 0x00, 0x00, 0x03, 0x02,
+ 0x02, 0x0f, 0x00, 0xdf, 0x0f, 0x00, 0xf0, 0x00, 0x02, 0x00, 0x0d, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x11, 0x02, 0x22, 0x00, 0x00, 0xff, 0x00, 0x0e, 0x10, 0x20, 0x31,
+ 0x22, 0x00, 0x0e, 0x10,
+ 0x32, 0x10, 0x10, 0x10, 0x0f, 0x10, 0x20, 0x00, 0xf0, 0xfe, 0x0f, 0x0f,
+ 0x0f, 0xee, 0xef, 0x10,
+ 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0xff, 0x00, 0xf1, 0xef,
+ 0xe0, 0x0f, 0xf0, 0xff,
+ 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x11, 0xf0, 0xf0, 0x02, 0x11, 0x01,
+ 0x00, 0xe0, 0x00, 0x10,
+ 0x10, 0x00, 0x10, 0x22, 0x22, 0x00, 0x10, 0x11, 0x02, 0x11, 0x12, 0x12,
+ 0x0f, 0xf0, 0xf1, 0x00,
+ 0x00, 0xdd, 0x01, 0x12, 0x00, 0xfd, 0xf0, 0x11, 0x00, 0x0f, 0x10, 0x0f,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x0e, 0xe0, 0x1f, 0x0f, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x11, 0x00, 0xfe,
+ 0x0f, 0x0f, 0x21, 0x23,
+ 0x12, 0x03, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x01, 0x10, 0x0e,
+ 0xfe, 0x12, 0x01, 0x11,
+ 0x00, 0xfe, 0xff, 0x00, 0xf0, 0x0e, 0xf0, 0xff, 0x00, 0x0f, 0x0f, 0xef,
+ 0x0f, 0x00, 0x01, 0x22,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x00, 0xf0,
+ 0x0f, 0x21, 0x01, 0x02,
+ 0x00, 0x10, 0x00, 0x21, 0x10, 0x02, 0x20, 0x10, 0x0e, 0xee, 0x00, 0x32,
+ 0x00, 0x0f, 0xff, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xf0, 0x10, 0x00, 0xf0, 0x03,
+ 0x0f, 0xee, 0x00, 0xef,
+ 0x00, 0xf0, 0x00, 0xff, 0xf0, 0x01, 0x01, 0x0e, 0xff, 0xdd, 0x00, 0x01,
+ 0x01, 0xf0, 0x01, 0xf1,
+ 0xf0, 0xed, 0xf0, 0x00, 0x01, 0x01, 0x11, 0x11, 0x10, 0x00, 0x11, 0x11,
+ 0x10, 0x00, 0x12, 0x0f,
+ 0x0f, 0xf0, 0x01, 0x22, 0x02, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x21,
+ 0x12, 0x0f, 0xff, 0x0f,
+ 0x20, 0x0f, 0x10, 0x0f, 0x0f, 0xff, 0x0d, 0x0f, 0xff, 0x0f, 0x10, 0x00,
+ 0xff, 0x0f, 0xff, 0xfe,
+ 0x00, 0xff, 0xf0, 0x0f, 0x00, 0xe0, 0xff, 0xff, 0xf0, 0xee, 0xf0, 0x00,
+ 0x01, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x0f, 0x00, 0x11,
+ 0x04, 0x10, 0x01, 0x00, 0x10, 0xf0, 0xee, 0x12, 0x22, 0x11, 0x00, 0x0d,
+ 0x00, 0x00, 0xff, 0x10,
+ 0x11, 0x01, 0x21, 0x00, 0x00, 0x01, 0x0f, 0x1f, 0x20, 0x0f, 0x1f, 0x00,
+ 0x10, 0x00, 0x0e, 0xfe,
+ 0x10, 0x0f, 0x00, 0x0e, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x00, 0xee, 0x00,
+ 0xe0, 0xf0, 0xee, 0x00,
+ 0xe0, 0x00, 0x00, 0xde, 0xff, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0xf0, 0x01,
+ 0x00, 0xf0, 0x00, 0xff,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x31, 0x01, 0x10, 0x10, 0x23, 0x22,
+ 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x0e, 0x00, 0x0f, 0x10, 0x03, 0x10, 0x00, 0x00, 0xf0, 0x00, 0xf1,
+ 0x01, 0x00, 0x00, 0xff,
+ 0xde, 0xf0, 0x00, 0xf0, 0xff, 0x0f, 0x00, 0x1f, 0x00, 0x10, 0x01, 0x10,
+ 0x12, 0x10, 0x00, 0x01,
+ 0x31, 0x12, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x15, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x12,
+ 0x12, 0x11, 0x00, 0xf1, 0x00, 0xe0, 0x00, 0x0e, 0xe0, 0xf0, 0x00, 0xff,
+ 0x00, 0x0e, 0xf0, 0xf1,
+ 0x02, 0x00, 0x10, 0x0f, 0xf0, 0x12, 0x03, 0x10, 0x10, 0x10, 0x00, 0x1f,
+ 0x00, 0x20, 0x20, 0x02,
+ 0x20, 0x20, 0x00, 0x20, 0x20, 0x0f, 0x21, 0x20, 0x11, 0x1e, 0x1e, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x0e,
+ 0x00, 0x00, 0xee, 0xff, 0xfe, 0x0f, 0x11, 0x11, 0x00, 0xdf, 0x0e, 0xef,
+ 0x00, 0xe0, 0xe0, 0xfe,
+ 0xf0, 0xff, 0xf0, 0xe0, 0xf1, 0x01, 0x03, 0xf0, 0xe0, 0x00, 0x00, 0x00,
+ 0x03, 0x10, 0x0f, 0xfd,
+ 0x00, 0x00, 0x00, 0x11, 0x21, 0x02, 0x02, 0x00, 0x0f, 0x00, 0x11, 0x24,
+ 0x13, 0x00, 0xff, 0x0e,
+ 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x02, 0x10, 0xf0, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x1f, 0x0f,
+ 0x0e, 0xf0, 0x10, 0x10, 0x0f, 0x10, 0x0e, 0x1f, 0x0e, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x33, 0x02, 0x10, 0x01, 0x10, 0x0f, 0xf0, 0x01, 0x13, 0x00,
+ 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x11, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x0f,
+ 0x0f, 0x0f, 0x0e, 0x00,
+ 0x01, 0x02, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x0e, 0x11, 0x01, 0x01,
+ 0x00, 0x10, 0x00, 0xf2, 0x0f, 0xef, 0x00, 0x01, 0x11, 0x11, 0x10, 0xff,
+ 0x0f, 0x1f, 0x00, 0x0f,
+ 0x0f, 0x20, 0x11, 0x01, 0x01, 0x10, 0x00, 0xff, 0xf0, 0x10, 0x00, 0x00,
+ 0x0f, 0x01, 0x03, 0x1f,
+ 0x0d, 0xde, 0x00, 0x0e, 0x0e, 0xef, 0xf0, 0x00, 0x12, 0x00, 0xce, 0x00,
+ 0x01, 0xe0, 0xee, 0xff,
+ 0xff, 0xe0, 0x0f, 0x00, 0xef, 0xff, 0x00, 0x10, 0x0f, 0x10, 0x02, 0x00,
+ 0x44, 0x00, 0x00, 0x11,
+ 0x01, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x12, 0x01, 0x20,
+ 0x01, 0x00, 0x1f, 0x00,
+ 0x1f, 0x00, 0x21, 0x01, 0x0f, 0x0f, 0x10, 0x0f, 0x0e, 0xf0, 0x0f, 0x0e,
+ 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xef, 0xff, 0x0f, 0xe0,
+ 0x0e, 0x00, 0x04, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0xf0, 0xff,
+ 0x00, 0x01, 0xf0, 0x01,
+ 0x01, 0x11, 0x01, 0x01, 0x00, 0x02, 0x01, 0x01, 0xff, 0x00, 0x10, 0x13,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x20, 0x01, 0xff, 0x10, 0x11, 0x00, 0x20, 0x00, 0x20, 0x20, 0x0e,
+ 0x1e, 0x10, 0x10, 0x2f,
+ 0x00, 0x0d, 0x0e, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0xfe, 0xf0, 0xf0, 0x0f,
+ 0x00, 0xe0, 0xf0, 0xf0,
+ 0xee, 0xff, 0xef, 0xf0, 0xe0, 0xfe, 0xee, 0xe0, 0x00, 0x11, 0xf0, 0xf0,
+ 0xf0, 0xe0, 0x00, 0x00,
+ 0x0f, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0x20, 0x11, 0x00, 0x10,
+ 0x12, 0x21, 0x10, 0x0f,
+ 0x0f, 0xef, 0x10, 0x00, 0x21, 0x11, 0x01, 0xff, 0x00, 0xff, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x8d, 0x07, 0x9e, 0x04, 0xe1, 0x07, 0x33, 0x05, 0x00, 0xf1, 0xf0, 0x00,
+ 0xef, 0xfe, 0xfe, 0x00,
+ 0x00, 0xfd, 0xf0, 0x00, 0x00, 0x22, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10,
+ 0x00, 0x11, 0x02, 0x11,
+ 0x10, 0xff, 0x00, 0x11, 0x00, 0x01, 0x01, 0x10, 0x00, 0x02, 0x03, 0x20,
+ 0x01, 0xf1, 0x02, 0x10,
+ 0x01, 0x10, 0xf0, 0x01, 0x00, 0xe0, 0x0f, 0xff, 0x00, 0x02, 0xf0, 0xfe,
+ 0xef, 0x0f, 0x01, 0x12,
+ 0x00, 0x00, 0x01, 0x01, 0x02, 0x10, 0x10, 0x11, 0x10, 0x0f, 0x00, 0x21,
+ 0x10, 0x11, 0x10, 0x0f,
+ 0x1f, 0x00, 0x20, 0x0f, 0x11, 0x21, 0x10, 0x00, 0x1f, 0x0e, 0x00, 0x20,
+ 0x00, 0x10, 0x0f, 0x0d,
+ 0xf0, 0xf0, 0x00, 0x0e, 0x00, 0x11, 0x00, 0xf1, 0xf0, 0xfd, 0xf0, 0xf0,
+ 0xf0, 0x0f, 0xf0, 0xf0,
+ 0xe1, 0xf0, 0x00, 0xef, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x10, 0x0d, 0xf1,
+ 0x01, 0x00, 0x00, 0x02, 0x02, 0x10, 0x13, 0x10, 0x00, 0x01, 0x01, 0x12,
+ 0x10, 0x00, 0xef, 0x00,
+ 0x00, 0x12, 0x00, 0x00, 0xf0, 0xff, 0x01, 0x00, 0x01, 0x10, 0x0e, 0xf0,
+ 0x0f, 0x0f, 0xff, 0x0f,
+ 0x10, 0x1f, 0x0e, 0x00, 0x0f, 0x0e, 0x11, 0x00, 0x0f, 0x00, 0x1e, 0x00,
+ 0x01, 0x20, 0x00, 0x11,
+ 0x01, 0x00, 0x33, 0x10, 0xf1, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x20, 0xf0, 0xee, 0x0f, 0x0f, 0x02, 0x11,
+ 0x00, 0xef, 0x00, 0xfe,
+ 0x0f, 0xe0, 0x00, 0x10, 0x02, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x0f, 0xf0,
+ 0x02, 0x00, 0x02, 0x01,
+ 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x31, 0x01, 0x20, 0x0f,
+ 0x20, 0x21, 0x00, 0xfd,
+ 0x00, 0x02, 0x00, 0x00, 0x01, 0x22, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x0f,
+ 0xe0, 0x10, 0x02, 0xe0, 0xfe, 0xf0, 0xef, 0x00, 0xf1, 0xf1, 0xf0, 0xf0,
+ 0x00, 0xf0, 0xff, 0xee,
+ 0x00, 0xff, 0x0f, 0xfe, 0x00, 0x11, 0x12, 0x00, 0x12, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x02, 0x00,
+ 0x22, 0x00, 0xd0, 0x10, 0x00, 0x0f, 0x01, 0x23, 0x13, 0x20, 0xf0, 0x0f,
+ 0x00, 0x20, 0x01, 0x11,
+ 0x11, 0x0f, 0x0f, 0x0d, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x0d, 0x00, 0xf0,
+ 0x00, 0x0e, 0x0f, 0xff,
+ 0x0f, 0x0e, 0x0f, 0xee, 0x00, 0xf0, 0x0f, 0xef, 0xff, 0x0f, 0x00, 0xff,
+ 0x01, 0x02, 0x01, 0x01,
+ 0x10, 0x00, 0xff, 0xee, 0x00, 0x02, 0x10, 0x00, 0xdf, 0x00, 0x01, 0x00,
+ 0xf0, 0x01, 0x12, 0xff,
+ 0x00, 0xff, 0x00, 0x03, 0x12, 0x02, 0x10, 0xfd, 0x01, 0x01, 0x11, 0x00,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0x00, 0x12, 0x00, 0x0f, 0x1f, 0x00, 0x2f, 0x2f, 0x00, 0x20,
+ 0x10, 0x11, 0x1f, 0x0e,
+ 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0x01, 0x00, 0xe0, 0x0e, 0xf0, 0x0f,
+ 0x00, 0x02, 0x10, 0xfd,
+ 0xdf, 0x00, 0xf1, 0xf0, 0xee, 0xf0, 0x00, 0xf0, 0xf1, 0xf0, 0xee, 0x00,
+ 0x0f, 0xef, 0x00, 0x0f,
+ 0x01, 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x0e, 0x01, 0x23, 0x00, 0x00, 0x21,
+ 0x12, 0x0f, 0x10, 0x00,
+ 0x1e, 0x10, 0x02, 0x20, 0x01, 0x00, 0xf2, 0x01, 0x10, 0x0f, 0xe0, 0xff,
+ 0x0f, 0xe0, 0x00, 0xf0,
+ 0xff, 0x00, 0x00, 0x0e, 0x10, 0x0f, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x01,
+ 0x01, 0x10, 0x00, 0x12,
+ 0x0f, 0xff, 0x00, 0x11, 0x20, 0x12, 0x01, 0x11, 0x22, 0x01, 0x00, 0x01,
+ 0x11, 0x01, 0x02, 0x00,
+ 0x12, 0x10, 0x00, 0xe0, 0xf0, 0x0f, 0x00, 0x0f, 0xee, 0x00, 0x00, 0x01,
+ 0x02, 0x00, 0xee, 0xf0,
+ 0x00, 0x00, 0xf0, 0xf0, 0xf2, 0x00, 0x10, 0x10, 0x01, 0x01, 0x21, 0x20,
+ 0x00, 0x00, 0x00, 0x2e,
+ 0x00, 0x01, 0x22, 0x11, 0x10, 0x10, 0x10, 0x00, 0x2f, 0x0f, 0x30, 0x10,
+ 0x1e, 0x20, 0x1f, 0x0f,
+ 0x20, 0x0f, 0x0e, 0x10, 0x00, 0xfe, 0xff, 0xff, 0x00, 0x13, 0x00, 0xde,
+ 0xff, 0xe0, 0x00, 0x00,
+ 0x0e, 0xe0, 0xf1, 0xf1, 0xf0, 0xee, 0x00, 0xf0, 0x01, 0xe1, 0x00, 0xef,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x02, 0x00, 0x0e, 0x10, 0x0f, 0xf0, 0x03, 0x11, 0x10, 0x02, 0x01,
+ 0x00, 0x11, 0x02, 0xf2,
+ 0xfe, 0x0f, 0x00, 0xf1, 0x11, 0xf0, 0x00, 0x00, 0x01, 0x12, 0xff, 0x0f,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x0f, 0x0e, 0xef, 0x1e, 0x10, 0x11, 0x10, 0x00, 0x0f,
+ 0x0e, 0x0f, 0x10, 0x11,
+ 0x00, 0x10, 0x02, 0x00, 0x1e, 0x01, 0x11, 0x00, 0x01, 0x01, 0x00, 0x01,
+ 0x02, 0x00, 0xf1, 0x01,
+ 0x00, 0x0e, 0x01, 0x23, 0x00, 0x0f, 0xf0, 0x10, 0x10, 0xf0, 0xfd, 0x00,
+ 0x10, 0x00, 0xf0, 0x01,
+ 0x01, 0x10, 0xfe, 0xef, 0x0f, 0x11, 0x01, 0x11, 0x01, 0xf0, 0xf1, 0x12,
+ 0x00, 0x00, 0x0e, 0xf0,
+ 0x01, 0xff, 0xff, 0xff, 0x10, 0x01, 0x00, 0x0f, 0x0f, 0xef, 0x10, 0x11,
+ 0x01, 0x1f, 0x1f, 0x01,
+ 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1e, 0xff, 0x0f, 0x00, 0x22, 0x11,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x0f, 0xff, 0x00, 0x12, 0x00, 0xf0, 0xf0, 0x0e, 0xe0, 0xef, 0x00, 0xee,
+ 0x00, 0xe0, 0x0f, 0xff,
+ 0x00, 0xef, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0xf1, 0xf0, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x02, 0x21, 0x01, 0x11,
+ 0x11, 0x00, 0x00, 0x1f,
+ 0x00, 0x10, 0x0f, 0x20, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x1f, 0x10, 0x12,
+ 0xff, 0xfe, 0x01, 0x00,
+ 0x10, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0x00, 0x01, 0x11, 0x00,
+ 0xe0, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x02, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x02, 0xf0, 0x00, 0x01, 0xf0, 0xf0, 0x02, 0x01, 0x00, 0xf0, 0x02, 0x02,
+ 0x01, 0x00, 0x01, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x01, 0x22, 0x00, 0x0e, 0x1f, 0x10, 0x20, 0x00,
+ 0x30, 0x20, 0x1f, 0x20,
+ 0x00, 0x1e, 0x0f, 0x1f, 0x00, 0x10, 0x00, 0xff, 0x0e, 0xff, 0x00, 0xf0,
+ 0x00, 0xfe, 0x0f, 0x01,
+ 0xf0, 0x00, 0xf0, 0xe0, 0xfd, 0xf0, 0xf0, 0xdd, 0xf0, 0xf1, 0xe0, 0xe0,
+ 0x0f, 0xf0, 0xfe, 0xe0,
+ 0x0f, 0x00, 0x10, 0x01, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x0f, 0x1f, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x14, 0x20, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x01, 0x01, 0xe0, 0x0f,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xe1, 0xff, 0xfd, 0xff, 0x00, 0x02, 0x10, 0x11, 0x00, 0xe0, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x20, 0xfe, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x00, 0x10, 0x22, 0x03,
+ 0x00, 0x10, 0x02, 0x02,
+ 0x00, 0x10, 0x00, 0x01, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x01, 0x01, 0x00,
+ 0xff, 0xf0, 0xf1, 0x01,
+ 0x00, 0xff, 0xf0, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x22, 0x01, 0x21,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x20, 0x01, 0x1f, 0x1e, 0x00, 0x20, 0x10,
+ 0x10, 0x1f, 0x0e, 0x20,
+ 0x10, 0x00, 0x20, 0x01, 0x10, 0x00, 0x1f, 0xfe, 0xff, 0x00, 0xef, 0x10,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x02, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0x00, 0xe0, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x11, 0x10, 0x01, 0x01, 0xe0, 0x00, 0x00, 0xf2, 0x00,
+ 0x0f, 0x21, 0x02, 0xf0,
+ 0x01, 0x02, 0x11, 0x0f, 0xff, 0xef, 0x01, 0x12, 0x12, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0xfe, 0x0f, 0x0f, 0xfd, 0x0f, 0x00, 0x1f, 0x00, 0x0e, 0x00,
+ 0x12, 0x10, 0x00, 0x0e,
+ 0x00, 0x10, 0x0f, 0x11, 0x11, 0x10, 0x01, 0x00, 0x10, 0x10, 0x00, 0x01,
+ 0xf2, 0x00, 0x01, 0x12,
+ 0x01, 0xe0, 0x00, 0x20, 0x00, 0x01, 0x00, 0x0f, 0x2f, 0x00, 0x21, 0x00,
+ 0xe0, 0x0f, 0x00, 0x1f,
+ 0x00, 0xef, 0x00, 0x0f, 0xf0, 0x01, 0xe0, 0x00, 0x00, 0x01, 0x01, 0x00,
+ 0xff, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0x00, 0x22, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x1f, 0x00, 0x10, 0x20, 0x00, 0x11, 0x10, 0x10, 0x0f, 0x00, 0x0f, 0x11,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0xe0, 0x0f, 0xef, 0xf0,
+ 0xff, 0xe0, 0xff, 0x00,
+ 0xf0, 0x01, 0xf0, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe,
+ 0xf0, 0xf0, 0x01, 0xf0,
+ 0xff, 0x00, 0xf1, 0xf0, 0x00, 0x01, 0x12, 0x10, 0x02, 0x10, 0x00, 0x10,
+ 0x12, 0x00, 0x11, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x21, 0x00, 0x00, 0x1f,
+ 0x10, 0x00, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0f, 0xfe, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0x0f, 0xee, 0x00,
+ 0xf0, 0x0f, 0xff, 0x00,
+ 0x01, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x01, 0x0f, 0xee, 0x10, 0x02, 0x10,
+ 0x00, 0xf0, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0x01, 0x02, 0x01, 0x01, 0x00, 0xf0, 0xf0, 0xf1, 0x01, 0x01,
+ 0x02, 0xf0, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x01, 0x11, 0x00, 0x01, 0x10, 0x1f, 0x00, 0x0e,
+ 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x0f, 0x10, 0x1f, 0x10, 0x0f, 0x10, 0x1f, 0x00, 0xfe, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0xfe,
+ 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xee, 0xff, 0xff,
+ 0xef, 0xe0, 0x0f, 0xee,
+ 0xf0, 0x00, 0x02, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xf0, 0x00, 0x20, 0x0f,
+ 0x11, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x11, 0x21, 0x00, 0x00, 0x02, 0x21, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x11, 0xf0, 0xf0, 0xff, 0xee, 0x0f, 0x00, 0x00, 0x00, 0x01, 0xff,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x20, 0x01, 0x00, 0x10, 0x21, 0x13, 0x10, 0xf0, 0x00,
+ 0x11, 0x12, 0x00, 0x01,
+ 0x11, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x02, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0xf1, 0x11,
+ 0x01, 0x00, 0x10, 0x02, 0x10, 0x00, 0x10, 0x00, 0x2f, 0x00, 0x30, 0x00,
+ 0x20, 0x11, 0x20, 0x0e,
+ 0x10, 0x30, 0x00, 0x00, 0x20, 0x1f, 0x1e, 0x10, 0x0e, 0x20, 0x0f, 0xff,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xe0, 0x0f, 0xf1, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xef, 0xee, 0xf0, 0x0f,
+ 0xf0, 0xee, 0x01, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x11, 0x01,
+ 0x01, 0xf2, 0x00, 0x01, 0xf1, 0x00, 0xf0, 0xf0, 0x02, 0x01, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x1e, 0x00, 0x21,
+ 0x00, 0x0f, 0x0e, 0x0f, 0x00, 0x2f, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x01, 0x02,
+ 0x00, 0x0f, 0xe0, 0x00, 0x20, 0x01, 0x00, 0x22, 0x00, 0x00, 0x0e, 0x10,
+ 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x11, 0x00, 0xfe, 0xf1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x00, 0xf0,
+ 0x0f, 0xf0, 0x0f, 0x01, 0x01, 0x00, 0x00, 0xef, 0xf0, 0xfe, 0x0f, 0xe0,
+ 0x10, 0x01, 0x00, 0xfe,
+ 0x00, 0x0f, 0x00, 0x10, 0x11, 0x11, 0x0f, 0x0f, 0x00, 0x20, 0x1f, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x10, 0x23, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0xf1, 0xf0,
+ 0xf0, 0x0e, 0xef, 0xfe,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x1f, 0x00, 0xef, 0x00, 0x01, 0x00,
+ 0x00, 0xef, 0x00, 0xff,
+ 0xe0, 0x00, 0xf0, 0x00, 0xe0, 0x00, 0xf1, 0x00, 0x00, 0x12, 0x10, 0x01,
+ 0x31, 0x01, 0xf0, 0x10,
+ 0x11, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0x00, 0x10,
+ 0x0f, 0x0f, 0x20, 0x00,
+ 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00,
+ 0x00, 0xef, 0x0f, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0xf2, 0x00, 0xf1, 0x01, 0xf0, 0xe0,
+ 0x01, 0xf1, 0x02, 0xf1,
+ 0xf1, 0xf1, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x10, 0x11, 0x10, 0x00,
+ 0x11, 0x10, 0x20, 0x10,
+ 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x31, 0x0f, 0x0f, 0x2f, 0x10, 0x00, 0x1e,
+ 0x0f, 0x0d, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xef, 0xff, 0xff, 0xef, 0x00, 0xe0,
+ 0xee, 0x00, 0xee, 0xef,
+ 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xf0, 0xff, 0x10,
+ 0x0e, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x21, 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x21, 0x01, 0x00,
+ 0xff, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0xe0, 0x0f, 0x01,
+ 0x00, 0xf1, 0xf0, 0x0f,
+ 0x0f, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x11, 0x10, 0x0f, 0x21, 0x00,
+ 0x11, 0x00, 0x0f, 0x01,
+ 0x00, 0x12, 0x00, 0x01, 0xf0, 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x02, 0x00, 0xf0, 0x01, 0x01,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x0f, 0x00,
+ 0x12, 0x10, 0x20, 0x0f,
+ 0x0f, 0x30, 0x00, 0x1f, 0x10, 0x10, 0x1f, 0x00, 0x0e, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x02, 0x10, 0x00, 0xe0, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0xef, 0x00,
+ 0xf0, 0xf0, 0x01, 0x01, 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x02, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0xf0, 0x01, 0x02, 0x00, 0xf0, 0xf0, 0x02, 0xf2, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x01, 0x00, 0x0e, 0x0f, 0x00, 0xf0, 0xfe, 0xff, 0x0f, 0x00,
+ 0x00, 0x00, 0x1f, 0x0e,
+ 0x1f, 0x0f, 0x1f, 0x10, 0x0f, 0x10, 0x00, 0x00, 0x22, 0x00, 0x01, 0x01,
+ 0xf0, 0x0f, 0xf0, 0x11,
+ 0x02, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x21, 0x00,
+ 0xf1, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0e, 0xf0, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0xe0, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0f, 0xf0, 0xe0, 0x00, 0x02, 0x00, 0xf0, 0x0e, 0xe0, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x10, 0x1f, 0x10, 0x10,
+ 0x10, 0x0f, 0x1f, 0x11,
+ 0x10, 0x10, 0x00, 0x00, 0x12, 0x01, 0x01, 0x11, 0x00, 0xee, 0x01, 0xf0,
+ 0x00, 0x00, 0x00, 0xfe,
+ 0xf0, 0x00, 0xff, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0xf0, 0x00,
+ 0x10, 0x00, 0xff, 0xf0,
+ 0xff, 0xff, 0x00, 0xf0, 0x00, 0xfe, 0x01, 0xe2, 0x00, 0x00, 0xe0, 0x01,
+ 0x00, 0x20, 0x01, 0x00,
+ 0x12, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x9c, 0x0d, 0x11, 0x11, 0xb1, 0x0d, 0x7d, 0x10, 0x00, 0x11, 0x00, 0x0d,
+ 0x10, 0x11, 0x00, 0x1e,
+ 0x1f, 0x0f, 0x1f, 0x0f, 0x00, 0x00, 0x0e, 0xf0, 0x10, 0x00, 0xf0, 0xff,
+ 0x0e, 0xff, 0xff, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x0e, 0x00, 0x1f, 0x10, 0x00, 0xff, 0x00, 0x02,
+ 0x00, 0xfe, 0x00, 0x02,
+ 0x00, 0x0e, 0xf0, 0xf1, 0x00, 0x00, 0xf0, 0xf2, 0x01, 0xf1, 0x01, 0x01,
+ 0x01, 0xf1, 0x01, 0xe0,
+ 0x00, 0xf2, 0x01, 0x11, 0x12, 0x00, 0x0f, 0xf0, 0x0f, 0x11, 0x00, 0x10,
+ 0x11, 0x00, 0x10, 0x00,
+ 0x0f, 0x10, 0x0e, 0x00, 0x0e, 0x2f, 0x1f, 0x10, 0x11, 0x21, 0x0f, 0x0f,
+ 0x20, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0xef, 0x00, 0x01, 0xef, 0x0f, 0xff, 0xff, 0xef,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0xf0, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x0f, 0xf0, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x04, 0x00, 0x11, 0x10, 0x00, 0x01, 0x10,
+ 0x0f, 0x1f, 0x10, 0x01,
+ 0x21, 0xee, 0xff, 0x00, 0x01, 0xf0, 0xf0, 0xff, 0x00, 0xff, 0xe0, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f,
+ 0x0f, 0x00, 0x1f, 0x00, 0x22, 0x10, 0x00, 0x00, 0x11, 0x01, 0x02, 0x22,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x12, 0x01, 0x10, 0x01, 0x00, 0x0e, 0x00, 0xf0, 0x01, 0x21,
+ 0x00, 0x00, 0xf0, 0x02,
+ 0x10, 0x0f, 0xfe, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x02, 0x00,
+ 0xf0, 0xf1, 0x00, 0xf0,
+ 0x00, 0xf1, 0x01, 0x00, 0x00, 0x11, 0x10, 0x00, 0x10, 0x11, 0x20, 0x10,
+ 0x10, 0x10, 0x1f, 0x10,
+ 0x10, 0x01, 0x30, 0x00, 0x10, 0x0e, 0x20, 0x0e, 0x10, 0x10, 0x10, 0x0f,
+ 0x10, 0x00, 0x00, 0xef,
+ 0x0f, 0x00, 0x10, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0xef,
+ 0x0f, 0x0f, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0xf1, 0xf0, 0x0f, 0xe0, 0x03, 0x11, 0x01, 0xf0, 0x02, 0x00,
+ 0x01, 0x0f, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xef, 0x0e, 0x0f, 0x00, 0xf0, 0x0f,
+ 0x1f, 0x10, 0x00, 0x0f,
+ 0x2f, 0x00, 0x0f, 0x10, 0x0f, 0x00, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x01, 0x10, 0x01, 0x10, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x00, 0x21,
+ 0x01, 0xf0, 0x0f, 0x01,
+ 0x01, 0x01, 0x10, 0x10, 0x00, 0xff, 0x00, 0x20, 0x00, 0x21, 0x01, 0xf1,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0xef, 0x00, 0x00, 0xef, 0x00, 0xf0, 0x0f, 0xf0,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xfe, 0x00, 0x10, 0x00, 0x10, 0x0e, 0xff, 0x0f, 0x20,
+ 0x00, 0x11, 0x11, 0x10,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x11, 0x00, 0x01, 0x00, 0xf1, 0x0f, 0x0f,
+ 0x0f, 0x00, 0xf0, 0x0f,
+ 0x10, 0x12, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xe0, 0x0f, 0x00,
+ 0xff, 0xf0, 0x00, 0xf0,
+ 0x00, 0xff, 0xf0, 0xff, 0xf0, 0x01, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x11, 0x11,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x20,
+ 0x00, 0x00, 0x1f, 0x10,
+ 0x1f, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x20, 0xf0,
+ 0xff, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x0e, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x10, 0xff,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xff, 0xef, 0x00, 0x01, 0xf1,
+ 0x03, 0xf0, 0xf0, 0x02,
+ 0xf1, 0x02, 0xf0, 0x02, 0xf0, 0x0f, 0x00, 0xf2, 0x01, 0x00, 0x12, 0x11,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x11, 0x30, 0x00, 0x0f, 0x20, 0x0f, 0x10, 0x1e, 0x00, 0x20, 0x10,
+ 0x11, 0x20, 0x0f, 0x1f,
+ 0x0f, 0x00, 0xff, 0x0f, 0xff, 0x00, 0xee, 0x00, 0x00, 0xef, 0x0f, 0x00,
+ 0xe0, 0xf0, 0xff, 0x0f,
+ 0xef, 0x00, 0xf0, 0xff, 0x0f, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x0e, 0xf0,
+ 0x0f, 0x10, 0x00, 0x01,
+ 0x00, 0x01, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x11,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0xf1, 0xf0, 0x00, 0xf0, 0xf0,
+ 0xf0, 0x0f, 0xff, 0x00,
+ 0x0e, 0x00, 0x10, 0x11, 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x11, 0x00,
+ 0x10, 0x00, 0xff, 0x00, 0x10, 0x01, 0x11, 0x01, 0x00, 0x10, 0x01, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x01, 0xf0, 0x02, 0x01,
+ 0x10, 0xf1, 0xf0, 0x00,
+ 0x02, 0xf0, 0xf0, 0x01, 0x00, 0x0e, 0xf0, 0x01, 0x10, 0x21, 0x01, 0x20,
+ 0x01, 0x00, 0x1f, 0x00,
+ 0x10, 0x21, 0x00, 0x10, 0x0f, 0x0f, 0x2f, 0x00, 0x0f, 0x0f, 0x20, 0x00,
+ 0x00, 0x0e, 0x10, 0x01,
+ 0x10, 0x00, 0x01, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x0f, 0xef, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xfe, 0xf0, 0x11, 0x00, 0x02, 0x00, 0xff, 0xf0, 0x00,
+ 0xff, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0xf2, 0x01, 0x00, 0xf0, 0xf1, 0xf0, 0x01, 0x02,
+ 0xf0, 0x01, 0x00, 0x10,
+ 0x00, 0x0e, 0x00, 0x01, 0x00, 0x1e, 0x10, 0xf0, 0x0f, 0x00, 0x0e, 0xf0,
+ 0x0f, 0xf0, 0x00, 0x1e,
+ 0x10, 0x0f, 0x10, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x01, 0x00, 0x00, 0x01, 0x11, 0x01, 0x00, 0x0e, 0x10, 0x02, 0x00, 0xf0,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x20, 0x00, 0xfe, 0x00, 0x20, 0x00, 0x00, 0x01,
+ 0x21, 0xf0, 0x00, 0x00,
+ 0xf0, 0xf0, 0x01, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0xf0, 0xff, 0xff, 0x00,
+ 0x01, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x0e, 0x10, 0x00, 0x10,
+ 0x00, 0x22, 0x11, 0x10, 0x00, 0xff, 0x10, 0x01, 0x00, 0x00, 0x01, 0x1f,
+ 0x0f, 0xf0, 0xf1, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xe0,
+ 0x0f, 0x00, 0x00, 0xe1,
+ 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xe0, 0x00, 0xff, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0x01, 0x01, 0x11, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x0f,
+ 0x00, 0x11, 0x10, 0x20,
+ 0x00, 0x00, 0x1f, 0x00, 0x0f, 0x1f, 0x00, 0x1f, 0x11, 0x00, 0x00, 0xf0,
+ 0xfe, 0x0e, 0xe0, 0x10,
+ 0x0f, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0x00, 0x20, 0x0f, 0xff,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x02, 0xf2, 0xf1,
+ 0x02, 0xf1, 0x01, 0xf2, 0x00, 0x01, 0xe0, 0xf0, 0x01, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x01, 0x20,
+ 0x00, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x10, 0x10, 0x1f, 0x00,
+ 0x1f, 0x10, 0x00, 0x20,
+ 0x0f, 0x00, 0x20, 0x0e, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0xff, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0xf0,
+ 0x00, 0xef, 0x0f, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0xff, 0x00, 0xef, 0x0f,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0x02, 0x10, 0x0e, 0x00, 0x02, 0x00, 0x20, 0x01, 0x00, 0xf0, 0x0f,
+ 0x01, 0x10, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x0f, 0xfe, 0xf0, 0x00, 0xf0,
+ 0xf1, 0x00, 0x0f, 0x0f,
+ 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0x00, 0xff, 0x00, 0xf2, 0x02, 0x20,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x00, 0x20, 0x10, 0x21, 0x10, 0x0f, 0x1f, 0x10, 0x0f, 0x10, 0x10, 0x11,
+ 0x00, 0x1f, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x1f, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x10, 0x00, 0x0e,
+ 0xf0, 0x00, 0xfe, 0xe0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0xff, 0x00, 0x01,
+ 0xf0, 0x00, 0x02, 0x00, 0x01, 0x01, 0xf1, 0x01, 0xf1, 0x01, 0x00, 0x00,
+ 0xf0, 0xf1, 0x00, 0xf1,
+ 0x01, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x02, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+ 0xef, 0x00, 0x10, 0x0f,
+ 0x10, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x12, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x10, 0x0f, 0x11, 0x00,
+ 0x12, 0x00, 0x10, 0x01,
+ 0x11, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0x00, 0xe1, 0x00, 0x0f, 0xe0, 0x00,
+ 0xff, 0xf0, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0xff, 0x0f, 0x00,
+ 0x00, 0x11, 0x10, 0x01, 0x00, 0x10, 0x1f, 0x00, 0x10, 0x1f, 0x10, 0x02,
+ 0x10, 0x00, 0x0f, 0xf0,
+ 0x01, 0x11, 0x01, 0x00, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x0e, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xe0, 0x00, 0xfe, 0xf0, 0x00, 0x01, 0x01, 0xf0, 0xff, 0x0f, 0xef, 0x00,
+ 0xf0, 0xff, 0x00, 0x02,
+ 0xf0, 0x00, 0xe0, 0x00, 0x10, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x01, 0x10, 0x0f, 0x0f, 0x00, 0x10,
+ 0x01, 0x01, 0x10, 0x0e,
+ 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x20, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xfe,
+ 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0xf0, 0x00, 0x11, 0x00,
+ 0xf2, 0x00, 0x00, 0x00,
+ 0xe1, 0x02, 0xf1, 0xf0, 0x00, 0xf1, 0xf0, 0xf1, 0x01, 0xf0, 0x02, 0x01,
+ 0xf0, 0xf1, 0xf1, 0x00,
+ 0x12, 0x01, 0x00, 0x20, 0x11, 0x00, 0x00, 0x2f, 0x00, 0x0f, 0x10, 0x20,
+ 0x01, 0x1f, 0x1f, 0x10,
+ 0x0f, 0x00, 0x20, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0e,
+ 0x00, 0x00, 0xee, 0x00,
+ 0x00, 0xff, 0x00, 0xf0, 0xfe, 0xff, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0xef,
+ 0x0f, 0x0f, 0xe0, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x00, 0xe0, 0x00,
+ 0x00, 0x00, 0xe0, 0x00,
+ 0xf0, 0x0e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x01, 0x10, 0x11, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x02, 0x10, 0x00, 0xf2, 0x00, 0xf1, 0x01, 0x00, 0xf0, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0x01,
+ 0x10, 0x20, 0x00, 0x10, 0x1f, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x0e, 0xf0,
+ 0x01, 0x10, 0x10, 0x0f, 0x10, 0x0f, 0x00, 0x12, 0x0f, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xe0, 0x0f, 0x00, 0x01, 0x00, 0xfe, 0x00, 0x00, 0x10, 0x0e, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0xe0, 0x00, 0x02, 0x00, 0x00, 0xf2, 0xf0, 0x01, 0x01, 0xe0, 0x00,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x1f, 0x00, 0xfe, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x20, 0x01, 0x01,
+ 0x10, 0x00, 0xf0, 0x00, 0x11, 0x00, 0xe0, 0xff, 0x00, 0xe0, 0x01, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x01, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0e, 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x30, 0x01, 0x0f, 0x00, 0x00, 0x10, 0x10, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x01, 0xf1, 0x00, 0x11, 0x10, 0xf0, 0x00, 0xf1, 0x00, 0x21, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x02,
+ 0x0f, 0xf0, 0xff, 0xf0,
+ 0x00, 0xe0, 0x00, 0xf1, 0x00, 0xe0, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x01,
+ 0x11, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x2f, 0x00, 0xf0, 0x00, 0x10,
+ 0x0f, 0x1f, 0x0f, 0x0f,
+ 0x00, 0x0e, 0x0e, 0xf0, 0xff, 0x0f, 0x00, 0x1f, 0x00, 0x11, 0xf0, 0xf0,
+ 0x01, 0xf0, 0x01, 0x01,
+ 0x00, 0x00, 0xf1, 0x01, 0xf1, 0xf0, 0x01, 0x00, 0xf1, 0xf1, 0xf1, 0xf1,
+ 0xf1, 0x01, 0x01, 0xf0,
+ 0xf0, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x20, 0x0f, 0x0f, 0x10,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x10, 0x0e, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x2f,
+ 0x0f, 0x00, 0x0f, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0xef, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0xff, 0x0f,
+ 0xf0, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x11, 0x00, 0x01,
+ 0x0f, 0x00, 0x00, 0x00, 0x11, 0x01, 0xf1, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x02, 0x00, 0x11, 0x02,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x11, 0x10, 0x11, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x10,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x10, 0x11, 0x00, 0x1f, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x20, 0x01, 0x10,
+ 0x00, 0x0e, 0xff, 0x00,
+ 0x00, 0xff, 0x00, 0x1f, 0x00, 0x0f, 0xf0, 0xf0, 0x0e, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x02, 0xf0, 0x00, 0x02, 0x00,
+ 0xf0, 0x00, 0x01, 0x01,
+ 0x01, 0x01, 0xf0, 0x0f, 0xf0, 0x01, 0x00, 0x02, 0x00, 0xf0, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0e, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3a, 0xfc, 0xb9, 0xfa, 0x57, 0xfc, 0x99, 0xfa, 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x01, 0x21,
+ 0x01, 0x00, 0x02, 0xff,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xef,
+ 0x00, 0x10, 0x0f, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x20, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x11, 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xe0,
+ 0x0e, 0x01, 0xe0, 0x00,
+ 0x0f, 0xf0, 0x00, 0xe0, 0x00, 0x00, 0x11, 0x00, 0xf1, 0x00, 0x01, 0x11,
+ 0x00, 0x1f, 0x0f, 0x00,
+ 0x10, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x20, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x0f,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0x10, 0x00, 0x0d, 0xf0, 0x00, 0x10, 0x10, 0x01, 0x0f, 0x00, 0x0f, 0x0f,
+ 0xf0, 0x00, 0x01, 0xf0,
+ 0xf0, 0x01, 0xf0, 0x02, 0xf0, 0x00, 0xf2, 0xe0, 0x00, 0xf1, 0x02, 0xf1,
+ 0x01, 0x02, 0xf0, 0xff,
+ 0x00, 0x02, 0x10, 0x00, 0x01, 0x00, 0x01, 0x10, 0x11, 0x00, 0x0f, 0x0f,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x10, 0x00, 0x10, 0x1e, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x0e,
+ 0x00, 0x10, 0x0f, 0x0f,
+ 0xef, 0x0f, 0xfe, 0x00, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0xef, 0x0f,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x12, 0x00, 0xf1,
+ 0x00, 0x00, 0x11, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0xfe, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x01, 0x12, 0x11, 0x00,
+ 0x10, 0x10, 0x0f, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x01,
+ 0xe0, 0x0f, 0x11, 0x00,
+ 0xf1, 0xf0, 0x10, 0x01, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x01,
+ 0x10, 0x01, 0x00, 0xf1,
+ 0x00, 0x1f, 0x10, 0x01, 0x10, 0x11, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x12, 0x00, 0x00,
+ 0x0e, 0x00, 0x01, 0x00,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x0f, 0x00, 0x0f, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x01, 0xf0, 0x01, 0xf0, 0xf1, 0x00, 0xf0, 0x01, 0xf0, 0x00,
+ 0x00, 0x10, 0x03, 0x00,
+ 0xf0, 0xf0, 0x00, 0x00, 0x01, 0x01, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x10, 0x00, 0x0f, 0xf0, 0x10, 0x0f, 0x10, 0x12, 0x00,
+ 0xfe, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x1f, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x01, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0xf1, 0x00,
+ 0x01, 0x0f, 0x00, 0x0f,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x01,
+ 0x21, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0xf1, 0x00, 0x0e, 0xe0, 0xf0,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xef, 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x01, 0xe0, 0x00, 0x10, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x1f, 0x10, 0x10, 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00,
+ 0x1f, 0x0f, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x00, 0x1f, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0xf1, 0xf0, 0x00,
+ 0xf0, 0xf1, 0x00, 0x01, 0xe0, 0x02, 0x00, 0x01, 0xe0, 0x01, 0xf0, 0x01,
+ 0xf0, 0xf1, 0x01, 0x00,
+ 0x02, 0xf0, 0x00, 0x11, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x10,
+ 0x02, 0x0f, 0x00, 0x1f,
+ 0x00, 0x00, 0xff, 0x10, 0x20, 0x01, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x10,
+ 0x00, 0x1f, 0x00, 0x20,
+ 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xfe, 0x00, 0xf0, 0x00, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x01, 0xf0, 0x01,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x01, 0x00, 0x01, 0x00, 0x01, 0xff, 0x10, 0x00, 0x11,
+ 0x00, 0x0f, 0x10, 0x11,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x10, 0x0f, 0xef, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0xff,
+ 0x01, 0x00, 0xf2, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x20, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x21, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x1f, 0x00, 0x10, 0x0e, 0x00, 0xf0,
+ 0x0f, 0x20, 0x00, 0xff,
+ 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x01,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x01, 0xe0, 0x01, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x00, 0x00,
+ 0xf0, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x01, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x1f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0xff, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x0e, 0x0f, 0x00, 0x1f, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x10,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x12, 0x10, 0x00, 0x00,
+ 0x00, 0x02, 0x10, 0x01,
+ 0x11, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xe0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0xe0, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0xf0, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0xff,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x02, 0x20, 0x00, 0xf0, 0x00, 0x01, 0x11, 0x10, 0x00, 0x00, 0xff, 0x00,
+ 0x10, 0x1f, 0x00, 0x0f,
+ 0x10, 0x0f, 0x00, 0x1f, 0x10, 0x00, 0x00, 0x0f, 0x20, 0xff, 0x00, 0x00,
+ 0x0f, 0x00, 0x0e, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0x01,
+ 0xf1, 0x01, 0xe0, 0x00,
+ 0xf1, 0x01, 0xf0, 0x00, 0xf1, 0x01, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00,
+ 0xf0, 0x02, 0x00, 0x11,
+ 0x00, 0x10, 0x00, 0x1f, 0x00, 0x10, 0x1f, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x1f, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x0f, 0x0e, 0xf0, 0x00,
+ 0x0f, 0xff, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0xfe, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x11, 0x00, 0x00, 0xf1, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x21, 0x01, 0x10,
+ 0x00, 0x1f, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x20, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00, 0x01, 0xf0, 0xf1, 0x00, 0x01, 0x00, 0x01, 0xf0,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x20, 0x01,
+ 0xf1, 0x00, 0x00, 0x10,
+ 0x11, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x20, 0x00, 0x0e, 0x00, 0x0f, 0x1f, 0x00, 0x0f, 0x1f,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x1f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xff, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0xf0, 0xf2, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xf0, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0xf0, 0x02, 0x10, 0x0e, 0x00,
+ 0xf0, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x01, 0x10,
+ 0x1f, 0x00, 0x00, 0x00,
+ 0xff, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x11, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0xf1, 0x00, 0xf0, 0xf0, 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x0e, 0x10, 0x00, 0x10, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x01, 0x10, 0x11, 0x12,
+ 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0xf1,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x1f, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x1f, 0x00,
+ 0x0f, 0x10, 0x1f, 0x0f,
+ 0x10, 0x1f, 0x00, 0x10, 0x1f, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x10,
+ 0x0f, 0x00, 0xfe, 0xf0,
+ 0x00, 0x1f, 0x0f, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0x01, 0xe0, 0x01, 0x01,
+ 0x00, 0xe0, 0x00, 0x01,
+ 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf0, 0x02, 0xf0, 0x01, 0x01, 0xf0,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x20, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x10,
+ 0x11, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x0f, 0x00, 0x1f, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0x01, 0xf0, 0xf1, 0x00, 0xf0, 0x00, 0x11, 0x12, 0x01, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x00, 0x01,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x11, 0x10, 0x01, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x0f, 0x0f, 0x1e,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x20,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0xf0, 0x01, 0x00, 0xf1, 0xf0, 0x00, 0x02, 0x00, 0x00, 0xf1, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0xf0, 0x0e, 0x00,
+ 0x10, 0x01, 0x0f, 0x00, 0x1f, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x20, 0x01,
+ 0xf1, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x11, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0xff, 0x00, 0xff, 0x0e,
+ 0x00, 0xf0, 0xff, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x11, 0x10, 0x01, 0x20, 0x00,
+ 0x01, 0x00, 0x20, 0x10,
+ 0x01, 0x10, 0x00, 0x1f, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0xf1, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x11, 0x10, 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x02, 0x10, 0x1f,
+ 0x00, 0x00, 0xff, 0x1f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,
+ 0x0f, 0x10, 0x0f, 0x10,
+ 0x0f, 0x00, 0x10, 0x0e, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x01, 0xf1, 0xf0,
+ 0x00, 0x01, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0xf1, 0x01, 0xe0, 0x01, 0x00,
+ 0xe2, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x11, 0x11, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x10, 0x10, 0x00, 0x0f, 0xff, 0x00, 0x0f, 0x00, 0x1e, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0e, 0x0f, 0x00, 0x0f, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x11, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0xf0,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xe9, 0xfd, 0xc7, 0xfa, 0x57, 0xfe, 0x1d, 0xfb, 0x00, 0x10, 0x01, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x00, 0x00, 0x02, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x10,
+ 0x11, 0x0f, 0xf0, 0x0e,
+ 0x00, 0xf1, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x01, 0x01, 0xf0, 0xf0, 0xf0,
+ 0x00, 0x11, 0x00, 0x02,
+ 0x00, 0x00, 0x0f, 0x00, 0x20, 0x01, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0x10, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x01, 0x10, 0x1e, 0x00, 0x00, 0x1f,
+ 0x00, 0x1f, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0xf1, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x20, 0x01,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x10, 0x00, 0x0f,
+ 0x10, 0x0f, 0x0f, 0x00,
+ 0x10, 0x0f, 0x00, 0x10, 0x01, 0x10, 0x0f, 0x00, 0xf1, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x01,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0xff, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x0e, 0xe0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x20, 0x01, 0x00, 0x10,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x11, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0xff, 0x01, 0x00, 0x00, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x21, 0x00,
+ 0x1e, 0x00, 0x10, 0x10, 0x0f, 0x0f, 0x20, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0xfe, 0x00, 0x0f, 0x10, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0xf0,
+ 0xf0, 0x02, 0xf0, 0x00,
+ 0xf1, 0xf0, 0x01, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0xf0, 0x01,
+ 0x00, 0x10, 0x01, 0xf0,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x0f, 0xf0, 0x00, 0x0f, 0x10, 0x00,
+ 0x1f, 0x10, 0x0f, 0xf0,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x1f, 0x00, 0xff, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x02, 0xf0, 0x0e, 0xf0,
+ 0x01, 0x00, 0xf0, 0x0f,
+ 0xf0, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x01, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x20, 0x00,
+ 0x00, 0x0f, 0x01, 0x10,
+ 0x00, 0x0f, 0x10, 0xf0, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x02, 0x00, 0xfe,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x01, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0xf0,
+ 0x0e, 0x10, 0x10, 0x1f,
+ 0x00, 0x0f, 0x0f, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0xf1, 0x00, 0x01, 0xf0,
+ 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xff, 0x00, 0x01, 0x11, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf0,
+ 0x01, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0x0f, 0x10, 0x00, 0x00,
+ 0x20, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x01, 0x11, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xff, 0xf0, 0xff, 0x00,
+ 0xff, 0x00, 0xff, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x01, 0x20, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x0f, 0x00, 0xe1, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf1, 0x00,
+ 0x01, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x1f, 0x00, 0x00, 0x10,
+ 0x0f, 0x1f, 0x10, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00, 0xf0, 0xf1, 0x00, 0xf2, 0x00, 0xf0,
+ 0xf0, 0x00, 0xf2, 0x00,
+ 0x00, 0x01, 0xf0, 0x00, 0x11, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x00,
+ 0x0f, 0x0f, 0x10, 0x0f,
+ 0x0f, 0x0f, 0x10, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0xf0, 0xff, 0x00, 0xf1,
+ 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x10,
+ 0x01, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x10, 0x10, 0x00, 0x10,
+ 0x00, 0x11, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf0, 0xf1,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x10, 0x10, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x01,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x1f, 0x00,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x1e, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x10,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf2, 0x00, 0x00, 0x10, 0x0f, 0xe0, 0x00, 0xf1, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0xff, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x10, 0x0f, 0x1f, 0x10, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xe0,
+ 0x0f, 0x0f, 0x00, 0xf0,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x0f, 0x10, 0x11, 0x00, 0x00, 0x11, 0x01, 0x00, 0x0f,
+ 0x10, 0x02, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xe1, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x0f, 0xff, 0xf0, 0x00,
+ 0x00, 0xe0, 0x00, 0xf0,
+ 0xff, 0xf0, 0x02, 0xf0, 0xff, 0x00, 0x00, 0x01, 0x10, 0x0e, 0x00, 0x01,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x10, 0x02, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x10, 0x10, 0x0e, 0x00,
+ 0x20, 0x00, 0x20, 0x0f,
+ 0x0f, 0x10, 0x0f, 0x10, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01, 0xf0, 0xff, 0x00, 0x01, 0xe0, 0x01, 0x01, 0xf0,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x10, 0x11, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x0f, 0x0f, 0x10, 0x10, 0x00, 0x0e, 0x00, 0x0f, 0x0f, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0xf0, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xf0, 0x00,
+ 0x1f, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x10, 0x10,
+ 0x01, 0x0f, 0x10, 0x20,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0xff, 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x01, 0xf0, 0x00, 0xff, 0x01, 0x11, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0xf0, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x0e, 0x10, 0x10, 0x0f, 0x10, 0x0f, 0x10, 0x0f, 0x0f, 0x10, 0x00,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0xe1, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10, 0x10,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0xf0, 0x01, 0x10, 0x10,
+ 0x0f, 0x00, 0x10, 0x10,
+ 0x10, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xe0, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01,
+ 0x10, 0x21, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x10, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf0, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x11, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x01,
+ 0x10, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x10, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x21, 0x00,
+ 0x1f, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0x1f, 0x0f, 0xf0,
+ 0x00, 0x01, 0x00, 0x0f, 0xff, 0xf0, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0xf0, 0x01, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0xff, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0xff, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0xef, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x11, 0x00, 0x20, 0x00,
+ 0x00, 0x10, 0x00, 0x10, 0x02, 0x1f, 0xf0, 0x0f, 0xf0, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0xe0, 0x0f, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x20, 0x00, 0x01,
+ 0xf0, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0xf1, 0xf0, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x1f, 0x10, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1f, 0x10,
+ 0x00, 0x01, 0x00, 0x1e,
+ 0x00, 0x00, 0x00, 0x0f, 0x10, 0x0f, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x02, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0xf2, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x0f, 0x00, 0x00, 0xe1, 0x01, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x20, 0x00, 0x10, 0x00, 0x10, 0x0f, 0x0f, 0xf0, 0x00, 0x20, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x10,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x01, 0x00, 0x10, 0x10, 0x00,
+ 0xf0, 0x00, 0x01, 0x11,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
+ 0x00, 0xf1, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x00, 0xf1, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xff,
+ 0x00, 0x20, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0xf0, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0xf1, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x01, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x04, 0x03, 0xf2, 0x05, 0x47, 0x03, 0xe1, 0x05, 0x00, 0x00, 0x20, 0x00,
+ 0x01, 0x20, 0x1f, 0x00,
+ 0x20, 0x00, 0x0f, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xff, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x01, 0xf0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00,
+ 0x0e, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0x0f, 0x00, 0x1f,
+ 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x01, 0x01,
+ 0x00, 0xf1, 0x01, 0x00,
+ 0xf0, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x10, 0x0f,
+ 0x00, 0x00, 0x20, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xe1, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x11, 0x10, 0x10,
+ 0x01, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xef, 0x00, 0x0f, 0x10,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x22,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0xff, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x0f, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0,
+ 0x01, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x01, 0x0f,
+ 0xe0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x0f, 0xe0, 0x01, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x20, 0x00, 0x10,
+ 0x00, 0x11, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x0f,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x0e, 0xe0, 0x11, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x01, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x10, 0x00,
+ 0xf0, 0x11, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x10, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x0f, 0x10, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x00,
+ 0xf1, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x11, 0x10,
+ 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x20, 0x00, 0x10, 0x12, 0x00, 0x10, 0x02, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x10, 0x0f, 0x10, 0x01,
+ 0x00, 0x1e, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf0, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01,
+ 0xf0, 0xff, 0x00, 0x00,
+ 0xf0, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x0e, 0x02, 0x00,
+ 0x1f, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x0f, 0xf0, 0x01, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0xf0, 0x01,
+ 0x00, 0x0f, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x0f, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0xff, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xef, 0x00, 0x01,
+ 0xf1, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0x10,
+ 0x01, 0x20, 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xf0, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x01, 0xf1, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10,
+ 0xf1, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0x0f, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf1, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xef,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x11,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x10, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0xf1, 0x00, 0xf2, 0xf0, 0x00, 0xf0, 0x01, 0x01, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0x00, 0x00,
+ 0x0e, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x0f, 0x00, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x20, 0x00, 0x00, 0x0f, 0x00, 0x20, 0x02, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0xf0, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x1f, 0x00, 0xf1,
+ 0x00, 0x00, 0x21, 0x00,
+ 0xf0, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0xf1, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x11, 0x10, 0x01, 0x10, 0x10, 0x01, 0x10, 0x00, 0x0f, 0x21,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0xf0,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x0f, 0xf0, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x10,
+ 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x01, 0x10, 0x01, 0xf0, 0x0f, 0xf0, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0xf0,
+ 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x11,
+ 0x00, 0x0f, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x0f, 0xf0, 0x00,
+ 0x0f, 0x10, 0x00, 0x0f,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0xf0, 0x0f, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x10, 0x0f,
+ 0x00, 0xf0, 0x00, 0x20,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0xf0,
+ 0x01, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0xf1, 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x02, 0x1f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x01, 0x10, 0x0f,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x0f, 0xf0, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x00, 0x1e,
+ 0x00, 0xf1, 0xf0, 0x0f,
+ 0x1f, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x01, 0x00,
+ 0xf0, 0x00, 0x20, 0xf0,
+ 0x01, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x02, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x0f, 0x10, 0x10, 0x00, 0xf0, 0x00, 0x21, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x10, 0x01,
+ 0xf1, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x2f, 0x00,
+ 0x02, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x1f, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0xff, 0x01, 0x10, 0x11, 0x00, 0x01, 0x00,
+ 0xff, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x0f, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x01, 0xf1, 0x00, 0x00,
+ 0xf1, 0x01, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x7f, 0x00, 0x77, 0xff, 0x8d, 0x00, 0x3d, 0xff, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x2f, 0xf0, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0xff, 0x01,
+ 0x10, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0xff, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x00, 0x21, 0x00, 0x0f, 0x00, 0x00, 0x20, 0x00, 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0xe0, 0x00, 0x00, 0x0e, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xf0, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x01,
+ 0x10, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0xff, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0xe0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1f,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x20, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x10, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf1, 0x00, 0xff, 0x00, 0xf0, 0x01, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x01, 0xf0, 0x0f, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0xf0, 0x01,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x0f, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xf1,
+ 0x00, 0x0f, 0x00, 0xf1, 0xf0, 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x1f, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x10, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x0f, 0x0f, 0x00, 0x21, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x1f, 0x00, 0xf0, 0x00, 0xf0, 0x0f,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x00,
+ 0xf0, 0x01, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00,
+ 0x11, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0xf0, 0x10, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x20, 0x0f, 0xf0, 0x00, 0x1f, 0x00, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0xf1, 0x00, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0xf0,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0xf0, 0x0f,
+ 0x10, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x11, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x1f,
+ 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xff, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0xf0, 0x00, 0x10,
+ 0x00, 0xe0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x11, 0x01, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x0e, 0x00,
+ 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0xf0,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x01, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x1f, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00,
+ 0xff, 0x00, 0x11, 0x00,
+ 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x21, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0x01, 0x10,
+ 0xf0, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0xf1,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x01, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xff, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x01,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x10, 0x0f, 0x10, 0x00, 0x11,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf1,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x1f,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0xf0,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f,
+ 0x10, 0x0f, 0x10, 0x00,
+ 0x00, 0x10, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x0f, 0xf0, 0x00, 0x0f, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x01, 0x00, 0x00,
+ 0x0f, 0xf1, 0x00, 0x01, 0x10, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x0e, 0x00, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x01, 0x0f, 0x00, 0x1f, 0x00, 0x00, 0x1f, 0x00, 0x02, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x01, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0xff,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0xf0, 0xf0, 0x00, 0x10,
+ 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x00, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1,
+ 0x00, 0x0f, 0x10, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x02, 0x00, 0x1f,
+ 0x00, 0x02, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x0e, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0x1f, 0x00, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x1f, 0x00, 0x00, 0x11, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x01, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0xff,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x10, 0x00, 0x11, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x51, 0xfc, 0x95, 0xf8, 0x41, 0xfc, 0xb6, 0xf8, 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x1f,
+ 0x00, 0xf1, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x0f, 0x00, 0x10, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x20,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x01,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x01, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00,
+ 0x11, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0xf0,
+ 0x00, 0xf0, 0xf0, 0x00,
+ 0x0f, 0x00, 0xf1, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x20, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x10, 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x0f,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x01, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x10,
+ 0x00, 0x01, 0xf0, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0xf1, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x1f, 0x0f, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x1f,
+ 0x00, 0x10, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0xf1, 0x00, 0x11, 0x00,
+ 0x00, 0x1f, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x01, 0xf0, 0x00,
+ 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00,
+ 0x01, 0x01, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x01, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x11, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x10, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x1f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x01,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0xe0, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x00, 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0xf0, 0x00, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x1f, 0x00, 0x01, 0x00, 0x10, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x1f,
+ 0x00, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00,
+ 0x01, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x11,
+ 0x00, 0x10, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x11, 0x00, 0x00, 0xf0, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x10, 0x00, 0x1f,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf0, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x10, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x10, 0xf0, 0x00, 0x00, 0x01, 0x00,
+ 0xf1, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x0f, 0x10, 0x10,
+ 0x00, 0x0f, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x0f, 0xe0, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x01, 0xf0,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00,
+ 0x01, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0xf0, 0x0f, 0xf0,
+ 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf1, 0x00, 0x1e, 0x10, 0x01, 0x00, 0x0f, 0x1f, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf1, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x0e, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf1, 0xf0,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xe0, 0x0f, 0x10, 0x00, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x1f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0xff, 0x00, 0x02, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xf0,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf0, 0xff, 0x0f, 0x00,
+ 0x01, 0x00, 0xf0, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0xf0, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xc9, 0xff, 0x3c, 0x00, 0xcc, 0xff, 0x43, 0x00, 0x00, 0x10, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0xf0,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x0f, 0xf0,
+ 0x00, 0x01, 0x10, 0x0f, 0xe0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x10, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0, 0xf1,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x10,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x0f, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x10, 0x0f, 0xf0, 0x00,
+ 0x0f, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x11, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x0f, 0x01, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x1f, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x01, 0x10, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0xf1,
+ 0xf0, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xff, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x1f, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x0f, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x10,
+ 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0xf0, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0xf0, 0x01, 0x10,
+ 0x00, 0xff, 0xf0, 0x01,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x01, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x01,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0xf0, 0x0f,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x0f,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x01, 0x00, 0xff, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00,
+ 0x00, 0x01, 0x00, 0x1f,
+ 0x00, 0xf0, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0xf0, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x01, 0x11, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x0f, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x00, 0xf0,
+ 0x0f, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x10, 0x10, 0x01, 0x00, 0xfe,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xff, 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x10, 0x0f, 0xf0,
+ 0xf1, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0x0e, 0x00, 0x01, 0xf0, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x0f,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0xff, 0x00, 0x00, 0x1f,
+ 0x00, 0xf0, 0x01, 0xf0, 0x0e, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x01, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x01, 0x10, 0x0f,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f,
+ 0x00, 0xff, 0x00, 0x01,
+ 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf0,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x10, 0x01, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x00, 0xf0, 0x01, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xb0, 0xff, 0xe7, 0xfe, 0xa9, 0xff, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0xff, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0e, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x01,
+ 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x0f,
+ 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x10, 0x00, 0x0f, 0xf0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xff, 0x00, 0x01, 0x10, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0xff, 0x00, 0x11, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x0f, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0xf0, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x01, 0xf0, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x10, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x01, 0x00, 0x10, 0x0f, 0xf0, 0x01, 0xf0, 0x0f, 0x10, 0x01, 0x00, 0x0f,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf1, 0x00, 0x2f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0xff, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x10, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x10, 0x01, 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x20, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x0f, 0x01,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x1f, 0x00,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x1f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x1f, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00,
+ 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x0f, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x0f, 0x00, 0x10, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10,
+ 0xf0, 0x01, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x10, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x0f, 0x10, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0e,
+ 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x11, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0xf0, 0x11, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00,
+ 0x11, 0x00, 0xf0, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xff,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x0f, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x01, 0x10, 0x0f,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x1f, 0x00,
+ 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0xf0, 0x01, 0x00, 0x10, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x0f,
+ 0xf0, 0x01, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x0f, 0x10, 0x00, 0xf0,
+ 0x01, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x01,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf1,
+ 0x00, 0x1f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0xff,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0xf1, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0e, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0xf1, 0x00,
+ 0x00, 0x1f, 0x00, 0xf1, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x10, 0x00,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xf1, 0x00,
+ 0x0f, 0x00, 0xf1, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xf0,
+ 0x01, 0x10, 0x0f, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0xf0,
+ 0x00, 0x10, 0x00, 0x01, 0xf0, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x01, 0x00, 0x10,
+ 0x0f, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x11, 0x00, 0xff,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf1, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0x01,
+ 0x10, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0,
+ 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0xf0, 0x00, 0x01, 0x10, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x3b, 0xfe, 0x38, 0xfe, 0x41, 0xfe, 0x56, 0xfe, 0x00, 0xfe, 0xf0, 0x0f,
+ 0xff, 0xf0, 0x0e, 0xf0,
+ 0x0f, 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f,
+ 0x00, 0xff, 0xff, 0x0f,
+ 0xf0, 0x0f, 0xf0, 0x0e, 0xf0, 0x0f, 0x00, 0xfe, 0x00, 0xf0, 0x0f, 0xff,
+ 0x0f, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xff, 0x00,
+ 0xff, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00,
+ 0x11, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x11, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x10, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x01, 0x01, 0x00, 0x11,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x01, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x11, 0x01, 0x10, 0x00,
+ 0x00, 0x11, 0x00, 0x10,
+ 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x10, 0x01, 0x10, 0x00, 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x0f, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xff, 0x00, 0xf0, 0x0f, 0x0f,
+ 0xf0, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0xf0, 0x00, 0x0f, 0x0f,
+ 0xf0, 0xf0, 0x0f, 0x00,
+ 0xff, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0xf0,
+ 0x00, 0x00, 0xff, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xf1, 0x00,
+ 0xff, 0x00, 0xf0, 0x01,
+ 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x01,
+ 0xf0, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x10, 0x01, 0x00, 0x10,
+ 0x10, 0x01, 0x10, 0x00, 0x10, 0x10, 0x01, 0x10, 0x11, 0x00, 0x10, 0x11,
+ 0x00, 0x11, 0x00, 0x11,
+ 0x10, 0x01, 0x11, 0x10, 0x00, 0x12, 0x00, 0x11, 0x10, 0x01, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x01,
+ 0x10, 0x01, 0x11, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x01, 0x11, 0x00,
+ 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x01, 0x10, 0x01, 0x00,
+ 0xf0, 0x01, 0x11, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0xf0, 0x01,
+ 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0xf1, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0f, 0xf0,
+ 0x0f, 0xff, 0x00, 0xff,
+ 0x0f, 0xf0, 0x0f, 0x00, 0xfe, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f,
+ 0x0f, 0xff, 0x00, 0xff,
+ 0x00, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x0f,
+ 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x00, 0xf0,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10,
+ 0x01, 0x00, 0x11, 0x00,
+ 0x00, 0x11, 0x00, 0x10, 0x00, 0x01, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xf0,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x0f, 0x00, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x01, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x10, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x10, 0x01, 0x10, 0x00, 0x10,
+ 0x01, 0x10, 0x00, 0x10,
+ 0x01, 0x11, 0x10, 0x00, 0x00, 0x11, 0x00, 0x11, 0x01, 0x10, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x11,
+ 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x10, 0x01, 0x10, 0x00,
+ 0x01, 0x11, 0x00, 0x00,
+ 0x11, 0x10, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x00, 0x10, 0x01, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x1f, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x00, 0xf0, 0x0f, 0x00,
+ 0xff, 0x00, 0x00, 0xff, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0,
+ 0x00, 0xff, 0x0f, 0x0f,
+ 0xf0, 0x00, 0xff, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xff, 0x0f, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xff,
+ 0x0f, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x0f, 0xf0, 0x00, 0x0f, 0x0f, 0xf0, 0x00, 0xff, 0x00,
+ 0x0f, 0xf0, 0x00, 0x0f,
+ 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0x14, 0x00, 0x2f, 0x00, 0x1b, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0xf0,
+ 0x0f, 0x00, 0x0f, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0xf1, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf1, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x10, 0x11, 0x00, 0x00, 0x00, 0x11, 0x10, 0x01, 0x00,
+ 0x00, 0x10, 0x11, 0x00,
+ 0x01, 0x10, 0x00, 0x00, 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x01, 0x10, 0x00,
+ 0x01, 0x10, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x00, 0xf1, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x01,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0xff,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x0f, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x0f,
+ 0x0f, 0xf0, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0x00, 0x00,
+ 0xff, 0x0f, 0x00, 0x00,
+ 0xff, 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xff, 0x00, 0x0f, 0x00, 0xf0,
+ 0x0f, 0x00, 0xf0, 0x0f,
+ 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0xf0, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0xf1, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x11, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x0f,
+ 0x00, 0x01, 0x00, 0xf0, 0x00, 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x0f, 0x10,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10,
+ 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00,
+ 0x0f, 0xf0, 0x00, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x0f, 0x00,
+ 0x00, 0xff, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x0f,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x11,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x0f, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x1f, 0x00,
+ 0xf1, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x10,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x1f, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x10, 0x05, 0x05,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xf6, 0xff, 0xc8, 0xff, 0xf7, 0xff, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x01, 0x00, 0x0f, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x01, 0xf0,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x11,
+ 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xf0, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x01, 0x10, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf1, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf0, 0x01, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x01, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11,
+ 0x00, 0x00, 0x0f, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x11, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf0,
+ 0x01, 0x00, 0x0f, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf1, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x01, 0x00, 0x0f, 0x00, 0x00, 0xf1, 0x00, 0x10, 0x0f, 0x00,
+ 0x00, 0x01, 0x00, 0xf0,
+ 0x00, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf1, 0x00, 0x0f,
+ 0x10, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0xf0,
+ 0x0f, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x0f, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x0f, 0xf0, 0x00, 0x01, 0x10, 0x00, 0xff,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x10, 0x0f, 0xf0, 0x00, 0x01, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x0f, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x1f, 0x00, 0x01,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x11, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x01, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0xf1,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x0f,
+ 0x00, 0x11, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x01, 0x00, 0x0f,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x0f, 0x00,
+ 0x11, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x10, 0x01, 0xf0, 0x0f,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x0f, 0x10, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0xf0, 0x00, 0x01,
+ 0x10, 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0xf1, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x0f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x0f, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0xff, 0x00,
+ 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x10, 0x00, 0xf0, 0x00, 0x01, 0x10, 0x00, 0x00, 0xff, 0x00, 0x11, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x01, 0x00, 0xf0, 0x00,
+ 0x10, 0x00, 0x0f, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0xf0, 0x00, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0xf0, 0x0f, 0x10, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00,
+ 0xf0, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0f, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0xf1, 0x00, 0x1f,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x10, 0x00, 0x00, 0xf0, 0x06, 0x06,
+ 0x10, 0x00, 0x10, 0x00,
+ 0xd1, 0xff, 0xc4, 0xff, 0xd2, 0xff, 0xc6, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xfe, 0xef, 0x0e, 0xef,
+ 0xfe, 0xff, 0xee, 0xfe, 0xff, 0xee, 0xfe, 0xef, 0xfd, 0xff, 0xee, 0xfe,
+ 0xee, 0xfe, 0xfe, 0xee,
+ 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xee, 0xfe, 0xfe, 0xfd,
+ 0xef, 0x0d, 0xee, 0xfe,
+ 0xfe, 0xfd, 0xfe, 0xfe, 0xee, 0x0e, 0xed, 0x0f, 0xed, 0xff, 0xfd, 0xff,
+ 0xfe, 0xfe, 0xee, 0x0f,
+ 0xee, 0x0e, 0xef, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xf0, 0x0f, 0xef, 0x00, 0xff, 0xf0, 0x00, 0xff, 0xf0, 0x00, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x00,
+ 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x11, 0x00, 0x10, 0x01, 0x10, 0x10,
+ 0x01, 0x10, 0x10, 0x01,
+ 0x10, 0x10, 0x01, 0x10, 0x11, 0x00, 0x10, 0x01, 0x11, 0x10, 0x00, 0x11,
+ 0x01, 0x10, 0x00, 0x11,
+ 0x01, 0x10, 0x00, 0x01, 0x11, 0x00, 0x11, 0x00, 0x01, 0x11, 0x00, 0x11,
+ 0x00, 0x01, 0x11, 0x00,
+ 0x01, 0x10, 0x01, 0x01, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01,
+ 0x00, 0x01, 0x00, 0x11,
+ 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00,
+ 0x01, 0x10, 0x00, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x01, 0x00,
+ 0x10, 0x00, 0x01, 0x10,
+ 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x11,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x10, 0x01, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x10, 0x10, 0x00, 0x00,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x00, 0x10, 0x11, 0x00, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x01, 0x10,
+ 0x10, 0x11, 0x00, 0x10,
+ 0x11, 0x10, 0x01, 0x10, 0x10, 0x01, 0x11, 0x10, 0x00, 0x11, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x11,
+ 0x00, 0x01, 0x10, 0x01, 0x11, 0x00, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x0f, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
+ 0x0f, 0x00, 0x10, 0x0f,
+ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xff, 0x00, 0xf0, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00,
+ 0xf0, 0x0f, 0xf0, 0x00,
+ 0xff, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x0f, 0xe0, 0x0f,
+ 0xf0, 0x00, 0xff, 0xf0,
+ 0x0f, 0xf0, 0xff, 0x00, 0xff, 0x00, 0xef, 0x00, 0x0f, 0xef, 0x00, 0xf0,
+ 0x0e, 0xe0, 0x00, 0xff,
+ 0x0f, 0xe0, 0x0f, 0xf0, 0xff, 0x00, 0xef, 0x00, 0xf0, 0xff, 0xf0, 0x00,
+ 0xef, 0x00, 0xf0, 0xf0,
+ 0xff, 0x00, 0xf0, 0xf0, 0xf0, 0x0f, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x00,
+ 0xf0, 0x00, 0xf0, 0xf0,
+ 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x0f, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x10, 0x01, 0x10,
+ 0x00, 0x01, 0x10, 0x10, 0x01, 0x00, 0x10, 0x11, 0x00, 0x00, 0x10, 0x11,
+ 0x00, 0x00, 0x10, 0x10,
+ 0x01, 0x00, 0x10, 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x11, 0x00,
+ 0x10, 0x00, 0x10, 0x11,
+ 0x00, 0x10, 0x10, 0x01, 0x10, 0x10, 0x00, 0x21, 0x00, 0x10, 0x11, 0x10,
+ 0x10, 0x01, 0x20, 0x00,
+ 0x11, 0x10, 0x00, 0x21, 0x00, 0x10, 0x01, 0x20, 0x00, 0x11, 0x00, 0x11,
+ 0x10, 0x00, 0x11, 0x00,
+ 0x11, 0x00, 0x11, 0x00, 0x10, 0x01, 0x01, 0x10, 0x00, 0x01, 0x10, 0x01,
+ 0x00, 0x01, 0x10, 0x00,
+ 0x01, 0x01, 0x00, 0x10, 0x01, 0x00, 0x01, 0x00, 0x01, 0x10, 0x01, 0x00,
+ 0x01, 0x00, 0x01, 0x00,
+ 0x11, 0x00, 0xf1, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x01,
+ 0x00, 0x00, 0x01, 0x10,
+ 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff,
+ 0x00, 0x0f, 0xf0, 0x00,
+ 0x0f, 0xf0, 0x0f, 0x00, 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00,
+ 0xff, 0x0f, 0xf0, 0x0f,
+ 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x0f,
+ 0xf0, 0x0e, 0xf0, 0x0f,
+ 0xff, 0x0f, 0xff, 0x0f, 0xf0, 0x0e, 0xf0, 0x0e, 0xf0, 0x0f, 0xff, 0x0f,
+ 0xff, 0x0f, 0xf0, 0x0e,
+ 0xf0, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0xff, 0x00, 0xff, 0x0f, 0xf0, 0x0f,
+ 0xf0, 0x0f, 0xf0, 0x0f,
+ 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x0f,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0,
+ 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00,
+ 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+};
+
+#endif /* WAVEDATA_H */
diff --git a/usr/src/cmd/audio/mixerctl/Makefile b/usr/src/cmd/audio/mixerctl/Makefile
index 258b75f792..bc800eb4a6 100644
--- a/usr/src/cmd/audio/mixerctl/Makefile
+++ b/usr/src/cmd/audio/mixerctl/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Makefile for cmd/audio/mixerctl
PROG= mixerctl
diff --git a/usr/src/cmd/audio/mixerctl/mixerctl.c b/usr/src/cmd/audio/mixerctl/mixerctl.c
index 16509a5b71..2449003649 100644
--- a/usr/src/cmd/audio/mixerctl/mixerctl.c
+++ b/usr/src/cmd/audio/mixerctl/mixerctl.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,680 +19,1181 @@
* CDDL HEADER END
*/
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <strings.h>
+#include <locale.h>
+#include <libintl.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <sys/param.h>
+#include <sys/soundcard.h>
+
+#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
+#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
+#endif
+
+#define _(s) gettext(s)
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024
+#endif
+
+#define AUDIO_CTRL_STEREO_LEFT(v) ((uint8_t)((v) & 0xff))
+#define AUDIO_CTRL_STEREO_RIGHT(v) ((uint8_t)(((v) >> 8) & 0xff))
+#define AUDIO_CTRL_STEREO_VAL(l, r) (((l) & 0xff) | (((r) & 0xff) << 8))
+
/*
- * mixerctl command:
- * mixerctl [-a|-d dev] [-iv] [-e|-o]
- *
- * NOTE: Option D is not documented, it is for debugging.
+ * Column display information
+ * All are related to the types enumerated in col_t and any change should be
+ * reflected in the corresponding indices and offsets for all the variables
+ * accordingly. Most tweaks to the display can be done by adjusting the
+ * values here.
*/
-#include <stdio.h>
-#include <stdlib.h> /* getopt() */
-#include <errno.h> /* errno */
-#include <strings.h> /* strrchr(), strcpy(), strcat(), strerror() */
-#include <locale.h> /* setlocale() */
-#include <libintl.h> /* textdomain(), gettext() */
-#include <sys/types.h> /* open(), fstat() */
-#include <sys/stat.h> /* open(), fstat() */
-#include <fcntl.h> /* open() */
-#include <unistd.h> /* close(), ioctl() */
-#include <stropts.h> /* ioctl() */
-#include <ctype.h> /* isdigit() */
-#include <dirent.h> /* opendir(), readdir(), closedir() */
-#include <sys/audioio.h>
-#include <sys/mixer.h>
-
-#define GETOPT "ad:iveoD"
-
-#define DEFAULT_DEVICE "/dev/audioctl"
-#define CONTROL "ctl"
-
-#define SOUND_DIR "/dev/sound"
-#define DOT "."
-#define DOTDOT ".."
-#define SLASH "/"
-
-#define ENV "AUDIODEV"
-
-#define AUX1 "AUX1"
-#define AUX2 "AUX2"
-#define CD "CD"
-#define HDPHONE "HDPHONE"
-#define LINE "LINE"
-#define LOOPBACK "CODEC LOOPBACK"
-#define MIC "MIC"
-#define NONE "NONE"
-#define SPDIF "SPDIF"
-#define SPEAKER "SPKR"
-#define SUNVTSLB "SunVTS LOOPBACK"
-#define UNKNOWN "UNKNOWN"
-#define SEPARATOR "|"
-
-#define ALL_PLAY_PORTS (AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT|\
- AUDIO_SPDIF_OUT|AUDIO_AUX1_OUT|AUDIO_AUX2_OUT)
-#define ALL_REC_PORTS (AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CD|\
- AUDIO_SPDIF_IN|AUDIO_AUX1_IN|AUDIO_AUX2_IN|\
- AUDIO_CODEC_LOOPB_IN|AUDIO_SUNVTS)
-
-#define BUF_SIZE 128
-#define PPORT_STR_SIZE 30
-
-#define NOT_SUPPORTED (-1)
-
-typedef struct info {
- char *pgm;
- char *opt;
- char *device;
- int all;
- int debug;
- int disable;
- int enable;
- int info;
- int verbose;
-} info_t;
-
-/* local functions */
-static int doit(info_t *, char *);
-static void pport2str(uint_t, char *);
-static void rport2str(uint_t, char *);
+/* types of columns displayed */
+typedef enum { COL_DV = 0, COL_NM, COL_VAL, COL_TYP, COL_SEL} col_t;
-int
-main(const int argc, char * const *argv)
+/* corresponding sizes of columns; does not include trailing null */
+#define COL_DV_SZ 16
+#define COL_NM_SZ 24
+#define COL_VAL_SZ 10
+#define COL_TYP_SZ 8
+#define COL_SEL_SZ 20
+#define COL_MAX_SZ 64
+
+/* corresponding sizes of columns, indexed by col_t value */
+static int col_sz[] = {
+ COL_DV_SZ, COL_NM_SZ, COL_VAL_SZ, COL_TYP_SZ, COL_SEL_SZ
+};
+
+/* used by callers of the printing function */
+typedef struct col_prt {
+ char *col_dv;
+ char *col_nm;
+ char *col_val;
+ char *col_typ;
+ char *col_sel;
+} col_prt_t;
+
+/* columns displayed in order with vopt = 0 */
+static int col_dpy[] = {COL_DV, COL_NM, COL_VAL, COL_SEL};
+static int col_dpy_len = sizeof (col_dpy) / sizeof (*col_dpy);
+
+/* tells the printing function what members to use; follows col_dpy[] */
+static size_t col_dpy_prt[] = {
+ offsetof(col_prt_t, col_dv),
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val),
+ offsetof(col_prt_t, col_sel)
+};
+
+/* columns displayed in order with vopt = 1 */
+static int col_dpy_vopt[] = { COL_NM, COL_VAL, COL_TYP, COL_SEL};
+static int col_dpy_vopt_len = sizeof (col_dpy_vopt) / sizeof (*col_dpy_vopt);
+
+/* tells the printing function what members to use; follows col_dpy_vopt[] */
+static size_t col_dpy_prt_vopt[] = {
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val),
+ offsetof(col_prt_t, col_typ),
+ offsetof(col_prt_t, col_sel)
+};
+
+/* columns displayed in order with tofile = 1 */
+static int col_dpy_tofile[] = { COL_NM, COL_VAL};
+static int col_dpy_tofile_len = sizeof (col_dpy_tofile) /
+ sizeof (*col_dpy_tofile);
+
+/* tells the printing function what members to use; follows col_dpy_tofile[] */
+static size_t col_dpy_prt_tofile[] = {
+ offsetof(col_prt_t, col_nm),
+ offsetof(col_prt_t, col_val)
+};
+
+
+/*
+ * mixer and control accounting
+ */
+
+typedef struct cinfo {
+ oss_mixext ci;
+ oss_mixer_enuminfo *enump;
+} cinfo_t;
+
+typedef struct mlist {
+ oss_card_info cdi;
+ oss_mixerinfo mi;
+
+ int cmax;
+ cinfo_t *controls;
+
+ int mfd;
+
+ struct mlist *nextp;
+} mlist_t;
+
+
+/*PRINTFLIKE1*/
+static void
+msg(char *fmt, ...)
{
- DIR *dirp;
- struct dirent *dp;
- info_t info;
- char dev_buffer[BUF_SIZE];
- int c;
- int errflag = 0;
+ va_list ap;
- (void) setlocale(LC_ALL, "");
+ va_start(ap, fmt);
+ (void) vprintf(fmt, ap);
+ va_end(ap);
+}
-#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
-#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
-#endif
- (void) textdomain(TEXT_DOMAIN);
+/*PRINTFLIKE1*/
+static void
+warn(char *fmt, ...)
+{
+ va_list ap;
- /* make sure info structure is zeroed out */
- (void) memset(&info, 0, sizeof (info));
+ va_start(ap, fmt);
+ (void) vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
- if (info.pgm = strrchr(argv[0], '/')) {
- ++info.pgm;
- } else {
- info.pgm = argv[0];
- }
- info.opt = GETOPT;
+static void
+mixers_free(mlist_t **mlistpp)
+{
+ mlist_t *mlp = *mlistpp;
+ mlist_t *nextp;
+ int i;
- /* check for options, they're listed at the top */
- while ((c = getopt(argc, argv, info.opt)) != EOF) {
- switch (c) {
- case 'a': info.all++; break;
- case 'd': (void) strcpy(dev_buffer, optarg);
- info.device = dev_buffer;
- break;
- case 'e': info.enable++; break;
- case 'o': info.disable++; break;
- case 'i': info.info++; break;
- case 'v': info.verbose++; break;
- case 'D': info.debug++; break;
- default: errflag++; break;
+ while (mlp != NULL) {
+ nextp = mlp->nextp;
+
+ for (i = 0; i < mlp->cmax; i++) {
+ if (mlp->controls[i].enump != NULL)
+ free(mlp->controls[i].enump);
}
+
+ if (mlp->mfd >= 0)
+ (void) close(mlp->mfd);
+
+ free(mlp);
+ mlp = nextp;
}
- /* now we do some checks to make sure we haven't done anything bad */
- if (errflag || (info.all && info.device) ||
- (info.enable && info.disable) || optind != argc) {
- (void) fprintf(stderr,
- gettext("usage: %s [-a|-d dev] [-iv] [-e|-o]\n"),
- info.pgm);
- return (1);
+ *mlistpp = NULL;
+}
+
+
+/*
+ * adds to the end of mlistpp and returns a pointer to the new entry
+ */
+static mlist_t *
+mlist_addnew(mlist_t **mlistpp)
+{
+ mlist_t *p;
+ mlist_t *mlp = calloc(1, sizeof (*mlp));
+
+ mlp->cdi.card = -1;
+ mlp->mi.dev = -1;
+ mlp->mfd = -1;
+
+ if (*mlistpp == NULL)
+ *mlistpp = mlp;
+ else {
+ for (p = *mlistpp; p->nextp != NULL; p = p->nextp) {}
+
+ p->nextp = mlp;
+ }
+ return (mlp);
+}
+
+
+/*
+ * cinfop->enump needs to be present
+ * idx should be: >= 0 to < cinfop->ci.maxvalue
+ */
+static char *
+get_enum_str(cinfo_t *cinfop, int idx)
+{
+ int sz = sizeof (*cinfop->ci.enum_present) * 8;
+
+ if (cinfop->ci.enum_present[idx / sz] & (1 << (idx % sz)))
+ return (cinfop->enump->strings + cinfop->enump->strindex[idx]);
+
+ return (NULL);
+}
+
+
+/*
+ * caller fills in mlistp->mi.devnode; func fills in the rest
+ */
+static int
+mlist_getinfo(mlist_t *mlistp)
+{
+ int mfd = -1;
+ int rv = -1;
+ int i;
+ char *mpath = mlistp->mi.devnode;
+ cinfo_t *cinfop;
+
+ mfd = open(mpath, O_RDWR);
+ if (mfd < 0) {
+ rv = errno;
+ perror(_("Error opening mixer"));
+ goto OUT;
}
+ mlistp->mfd = mfd;
- /* make sure we have something to do */
- if (!info.disable && !info.enable && !info.info && !info.verbose) {
- info.info++;
+ if (ioctl(mfd, SNDCTL_CARDINFO, &mlistp->cdi) < 0) {
+ rv = errno;
+ perror(_("Error getting card info"));
+ goto OUT;
}
- /* if "all" then we loop, otherwise we just take care of business */
- if (info.all) {
- /*
- * Devices in /dev/sound are in the form of:
- * dev_number{function}
- *
- * Currently there are only entries like /dev/sound/0 (audio
- * device) and /dev/sound/0ctl (audio control device).
- */
- if ((dirp = opendir(SOUND_DIR)) == NULL) {
- (void) fprintf(stderr, gettext(
- "Couldn't open directory %s: %s\n"), SOUND_DIR,
- strerror(errno));
- return (1);
+ mlistp->cmax = -1;
+ if (ioctl(mfd, SNDCTL_MIX_NREXT, &mlistp->cmax) < 0) {
+ rv = errno;
+ perror(_("Error getting control count"));
+ goto OUT;
+ }
+
+ mlistp->controls = calloc(mlistp->cmax, sizeof (*mlistp->controls));
+
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
+
+ cinfop->ci.dev = -1;
+ cinfop->ci.ctrl = i;
+
+ if (ioctl(mfd, SNDCTL_MIX_EXTINFO, &cinfop->ci) < 0) {
+ rv = errno;
+ perror(_("Error getting control info"));
+ goto OUT;
}
- while ((dp = readdir(dirp)) != NULL) {
- char *cp = dp->d_name;
+ if (cinfop->ci.type == MIXT_ENUM) {
+ cinfop->enump = calloc(1, sizeof (*cinfop->enump));
+ cinfop->enump->dev = -1;
+ cinfop->enump->ctrl = cinfop->ci.ctrl;
- /* skip . and .. */
- if (strcmp(cp, DOT) == 0 || strcmp(cp, DOTDOT) == 0) {
- if (info.debug) {
- (void) printf(gettext("Skipping %s\n"),
- cp);
- }
- continue;
+ if (ioctl(mfd, SNDCTL_MIX_ENUMINFO,
+ cinfop->enump) < 0) {
+ rv = errno;
+ perror(_("Error getting enum info"));
+ goto OUT;
}
+ }
+ }
- /* go past the device number */
- while (isdigit(*cp)) {
- cp++;
- }
+ rv = 0;
- /* if next char is NULL then not an audio ctl device */
- if (*cp == '\0') {
- if (info.debug) {
- (void) printf(gettext("Skipping %s\n"),
- dp->d_name);
- }
- continue;
- }
+OUT:
+ if (rv != 0) {
+ (void) close(mfd);
+ mlistp->mfd = -1;
+ }
+ return (rv);
+}
- if (strcmp(cp, CONTROL) == 0) {
- /* we've got a control device, so call it */
- (void) strcpy(dev_buffer, SOUND_DIR);
- (void) strcat(dev_buffer, SLASH);
- (void) strcat(dev_buffer, dp->d_name);
- if (info.debug) {
- (void) printf(gettext(
- "Found device: %s\n"), dev_buffer);
- }
+static int
+mixers_getinfo(char *devname, mlist_t **mlistpp)
+{
+ int rv = -1;
+ int fd = -1;
+ int i;
+ oss_sysinfo si;
+ oss_mixerinfo mi;
+ mlist_t *mlp;
+ char *mdef;
- /* we don't bother with the return code */
- (void) doit(&info, dev_buffer);
- }
+ mdef = devname ? devname : "/dev/mixer";
+
+ if ((fd = open(mdef, O_RDWR)) < 0) {
+ rv = errno;
+ warn(_("Error opening mixer\n"));
+ goto OUT;
+ }
+
+ if (devname == NULL) {
+ if (ioctl(fd, SNDCTL_SYSINFO, &si) < 0) {
+ rv = errno;
+ perror(_("Error getting system information"));
+ goto OUT;
}
- (void) closedir(dirp);
+ for (i = 0; i < si.nummixers; i++) {
+ mi.dev = i;
+ if (ioctl(fd, SNDCTL_MIXERINFO, &mi) != 0)
+ continue;
+
+ mi.dev = -1;
+ mlp = mlist_addnew(mlistpp);
+ mlp->mi = mi;
+
+ rv = mlist_getinfo(mlp);
+ if (rv != 0)
+ goto OUT;
+ }
} else {
- /* make sure we've got a good device */
- if (info.device == NULL) {
- if ((info.device = getenv(ENV)) == NULL) {
- if (info.debug) {
- (void) printf(gettext(
- "using default device: %s\n"),
- DEFAULT_DEVICE);
- }
- info.device = DEFAULT_DEVICE;
- } else {
- /* using ENV value, so get it */
- (void) strcpy(dev_buffer, info.device);
- info.device = dev_buffer;
- if (info.debug) {
- (void) printf(gettext(
- "using ENV device: %s\n"),
- info.device);
- }
- }
+ mi.dev = -1;
+ if (ioctl(fd, SNDCTL_MIXERINFO, &mi) != 0) {
+ rv = errno;
+ perror(_("Error getting mixer information"));
+ goto OUT;
}
- /* we have a device, make sure it is a control device */
- if (strspn(CONTROL, info.device) != strlen(CONTROL)) {
- (void) strcpy(dev_buffer, info.device);
- (void) strcat(dev_buffer, CONTROL);
- info.device = dev_buffer;
+ mi.dev = -1;
+ mlp = mlist_addnew(mlistpp);
+ mlp->mi = mi;
+
+ rv = mlist_getinfo(mlp);
+ if (rv != 0)
+ goto OUT;
+ }
+
+ rv = 0;
+
+OUT:
+ if (fd >= 0)
+ (void) close(fd);
+ return (rv);
+}
+
+
+static void
+mixers_prt_mlist(FILE *sfp, int tofile, mlist_t *mlistp)
+{
+ oss_card_info *cdip = &mlistp->cdi;
+
+ if (tofile) {
+ (void) fprintf(sfp, "# Device: %s\n", mlistp->mi.devnode);
+ (void) fprintf(sfp, "# Name = %s\n", cdip->shortname);
+ (void) fprintf(sfp, "# Config = %s\n", cdip->longname);
+
+ if (strlen(cdip->hw_info)) {
+ (void) fprintf(sfp, "# HW Info = %s",
+ cdip->hw_info);
}
- if (info.debug) {
- (void) printf(
- gettext("calling doit(%s)\n"), info.device);
+ (void) fprintf(sfp, "#\n");
+ } else {
+ msg(_("Device: %s\n"), mlistp->mi.devnode);
+ msg(_(" Name = %s\n"), cdip->shortname);
+ msg(_(" Config = %s\n"), cdip->longname);
+
+ if (strlen(cdip->hw_info)) {
+ msg(_(" HW Info = %s"), cdip->hw_info);
}
- return (doit(&info, info.device));
+
+ msg("\n");
}
+}
- return (0);
-} /* main() */
+static char *
+ctype_str(int type)
+{
+ switch (type) {
+ case MIXT_DEVROOT:
+ return (_("root"));
+ case MIXT_ONOFF:
+ return (_("boolean"));
+ case MIXT_ENUM:
+ return (_("enum"));
+ case MIXT_MONOSLIDER:
+ return (_("mono"));
+ case MIXT_STEREOSLIDER:
+ return (_("stereo"));
+ case MIXT_MARKER:
+ return (_("marker"));
+ case MIXT_GROUP:
+ return (_("group"));
+ default:
+ return (_("unknown"));
+ }
+}
+
-/*
- * doit()
- *
- * Description:
- * This routine does all the real work
- *
- * Arguments:
- * info_t *info Program info
- * char *dev Device
- *
- * Returns:
- * 1 Error
- * 0 Okay
- */
static int
-doit(info_t *info, char *dev)
+ctype_valid(int type)
{
- audio_device_t dev_info;
- audio_info_t audio_info;
- struct stat buf;
- char *pencoding;
- char *rencoding;
- char pport_buf[BUF_SIZE];
- char rport_buf[BUF_SIZE];
- int fd;
- int mode;
- int new_mode;
- int rc = 0;
-
- /* first, make sure the device is there */
- if ((fd = open(dev, O_RDONLY)) < 0) {
- /* return a meaningful error message if possible */
- switch (errno) {
- case EPERM :
- case EACCES :
- (void) fprintf(stderr,
- gettext("%s: device %s permission denied\n"),
- info->pgm, dev);
- break;
- case ENOENT :
- case ENXIO :
- case ENODEV :
- (void) fprintf(stderr,
- gettext("%s: device %s does not exist\n"),
- info->pgm, dev);
- break;
- default:
- (void) fprintf(stderr,
- gettext("%s: device %s not available\n"),
- info->pgm, dev);
- break;
- }
+ switch (type) {
+ case MIXT_ONOFF:
+ case MIXT_ENUM:
+ case MIXT_MONOSLIDER:
+ case MIXT_STEREOSLIDER:
return (1);
+ default:
+ return (0);
}
+}
- /* make sure it is a special device */
- if (fstat(fd, &buf) < 0) {
- (void) fprintf(stderr,
- gettext("%s: fstat() of %s failed\n"), info->pgm, dev);
- (void) close(fd);
- return (1);
+
+static void
+mixers_prt_ctl_line(FILE *sfp, int tofile, col_prt_t *colp, int vopt)
+{
+ int i;
+ size_t *col_prtp;
+ int *col_dpyp;
+ int col_cnt;
+ int col_type;
+ int width;
+ char *colstr;
+ char cbuf[COL_MAX_SZ + 1];
+ char line[128];
+ char *colsep = " ";
+
+ if (tofile) {
+ col_prtp = col_dpy_prt_tofile;
+ col_dpyp = col_dpy_tofile;
+ col_cnt = col_dpy_tofile_len;
+ } else if (vopt) {
+ col_prtp = col_dpy_prt_vopt;
+ col_dpyp = col_dpy_vopt;
+ col_cnt = col_dpy_vopt_len;
+ } else {
+ col_prtp = col_dpy_prt;
+ col_dpyp = col_dpy;
+ col_cnt = col_dpy_len;
}
- if (!S_ISCHR(buf.st_mode)) {
- (void) fprintf(stderr,
- gettext("%s: %s is not a character special device\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
+
+ line[0] = '\0';
+
+ for (i = 0; i < col_cnt; i++) {
+ col_type = col_dpyp[i];
+ width = col_sz[col_type];
+ colstr = *(char **)(((size_t)colp) + col_prtp[i]);
+
+ (void) snprintf(cbuf, sizeof (cbuf), "%- *s",
+ width > 0 ? width : 1,
+ (colstr == NULL) ? "" : colstr);
+
+ (void) strlcat(line, cbuf, sizeof (line));
+ if (i < col_cnt - 1)
+ (void) strlcat(line, colsep, sizeof (line));
}
- /* if verbose or info wanted, we get the device info */
- if (info->verbose || info->info) {
- if (ioctl(fd, AUDIO_GETDEV, &dev_info) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: AUDIO_GETDEV ioctl() for device %s failed\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
- }
+ (void) fprintf(sfp, "%s\n", line);
+}
- (void) printf(gettext("Device %s:\n"), dev);
- (void) printf(gettext(" Name = %s\n"), dev_info.name);
- (void) printf(gettext(" Version = %s\n"), dev_info.version);
- (void) printf(gettext(" Config = %s\n"), dev_info.config);
- }
-
- /* get the mixer mode, if there is a mixer */
- if (ioctl(fd, AUDIO_MIXERCTL_GET_MODE, &mode) < 0) {
- (void) printf(
- gettext("\n%s doesn't support the audio mixer function\n"),
- dev);
- mode = NOT_SUPPORTED;
- } else if (!info->enable && !info->disable) {
- (void) printf(gettext("\nAudio mixer for %s is %s\n"),
- dev, (mode == AM_MIXER_MODE ?
- gettext("enabled") : gettext("disabled")));
- } else if (info->enable) {
- new_mode = AM_MIXER_MODE;
- if (mode != AM_MIXER_MODE) {
- if (ioctl(fd, AUDIO_MIXERCTL_SET_MODE, &new_mode) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: couldn't enable audio mixer for %s\n"),
- info->pgm, dev);
- rc = 1;
- }
- }
- if (!rc) {
- (void) printf(gettext(
- "Audio mixer for %s is enabled\n"), dev);
- }
+
+static void
+mixers_prt_ctl_hdr(FILE *sfp, int tofile, int vopt)
+{
+ col_prt_t col;
+
+ if (tofile) {
+ col.col_nm = _("#CONTROL");
+ col.col_val = _("VALUE");
} else {
- /* sanity check */
- if (!info->disable) {
- (void) fprintf(stderr,
- gettext("%s: program error #1\n"), info->pgm);
- rc = 1;
- } else if (mode != AM_COMPAT_MODE) {
- new_mode = AM_COMPAT_MODE;
- if (ioctl(fd, AUDIO_MIXERCTL_SET_MODE, &new_mode) < 0) {
- (void) fprintf(stderr, gettext("%s: "
- "couldn't disable audio mixer for %s\n"),
- info->pgm, dev);
- rc = 1;
- }
- }
- if (!rc) {
- (void) printf(gettext(
- "Audio mixer for %s is disabled\n"), dev);
- }
+ col.col_dv = _("DEVICE");
+ col.col_nm = _("CONTROL");
+ col.col_val = _("VALUE");
+ col.col_typ = _("TYPE");
+ col.col_sel = _("POSSIBLE");
}
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
+}
- /* only for verbose do we get the device's info_t structure */
- if (info->verbose) {
- if (ioctl(fd, AUDIO_GETINFO, &audio_info) < 0) {
- (void) fprintf(stderr, gettext(
- "%s: AUDIO_GETINFO ioctl() for device %s failed\n"),
- info->pgm, dev);
- (void) close(fd);
- return (1);
- }
- switch (audio_info.play.encoding) {
- case AUDIO_ENCODING_ULAW:
- pencoding = gettext("u-law");
- break;
- case AUDIO_ENCODING_ALAW:
- pencoding = gettext("A-law");
- break;
- case AUDIO_ENCODING_LINEAR:
- pencoding = gettext("linear");
- break;
- default:
- pencoding = gettext("UNKNOWN");
- break;
- }
+static int
+mixers_prt_cinfo(FILE *sfp, int tofile, mlist_t *mlistp, cinfo_t *cinfop,
+ int vopt)
+{
+ int mfd = mlistp->mfd;
+ char *devnm = mlistp->cdi.shortname;
+ oss_mixer_value cval;
+ char *str;
+ int i;
+ int idx = -1;
+ int rv = -1;
+ char valbuf[COL_VAL_SZ + 1];
+ char selbuf[COL_SEL_SZ + 1];
+ col_prt_t col;
- switch (audio_info.record.encoding) {
- case AUDIO_ENCODING_ULAW:
- rencoding = gettext("u-law");
- break;
- case AUDIO_ENCODING_ALAW:
- rencoding = gettext("A-law");
- break;
- case AUDIO_ENCODING_LINEAR:
- rencoding = gettext("linear");
- break;
- default:
- rencoding = gettext("UNKNOWN");
- break;
- }
+ cval.dev = -1;
+ cval.ctrl = cinfop->ci.ctrl;
- (void) printf(
- gettext("Sample Rate\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.sample_rate, audio_info.record.sample_rate);
- (void) printf(gettext("Channels\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.channels, audio_info.record.channels);
- (void) printf(
- gettext("Precision\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.precision, audio_info.record.precision);
- (void) printf(gettext("Encoding\n Play\t\t%u (%s)\n"),
- audio_info.play.encoding, pencoding);
- (void) printf(gettext(" Record\t%u (%s)\n"),
- audio_info.record.encoding, rencoding);
- (void) printf(gettext("Gain\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.gain, audio_info.record.gain);
- (void) printf(gettext("Balance\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.balance, audio_info.record.balance);
- pport2str(audio_info.play.port, pport_buf),
- rport2str(audio_info.record.port, rport_buf),
- (void) printf(
- gettext("Port\n Play\t\t0x%08x %s\n Record\t0x%08x %s\n"),
- audio_info.play.port, pport_buf,
- audio_info.record.port, rport_buf);
- pport2str(audio_info.play.avail_ports, pport_buf),
- rport2str(audio_info.record.avail_ports, rport_buf),
- (void) printf(
- gettext("Avail Ports\n Play\t\t0x%08x %s\n"
- " Record\t0x%08x %s\n"),
- audio_info.play.avail_ports, pport_buf,
- audio_info.record.avail_ports, rport_buf);
- pport2str(audio_info.play.mod_ports, pport_buf),
- rport2str(audio_info.record.mod_ports, rport_buf),
- (void) printf(
- gettext("Mod Ports\n Play\t\t0x%08x %s\n"
- " Record\t0x%08x %s\n"),
- audio_info.play.mod_ports, pport_buf,
- audio_info.record.mod_ports, rport_buf);
- (void) printf(gettext("Samples\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.samples, audio_info.record.samples);
- (void) printf(gettext("Active\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.active, audio_info.record.active);
- (void) printf(gettext("Pause\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.pause, audio_info.record.pause);
- (void) printf(gettext("Error\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.error, audio_info.record.error);
- (void) printf(gettext("EOF Count\n Play\t\t%u\n"),
- audio_info.play.eof);
- (void) printf(gettext("Waiting\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.waiting, audio_info.record.waiting);
- (void) printf(gettext("Open\n Play\t\t%u\n Record\t%u\n"),
- audio_info.play.open, audio_info.record.open);
- (void) printf(gettext("HW Features\t\t0x%08x\n"),
- audio_info.hw_features);
- if (audio_info.hw_features & AUDIO_HWFEATURE_PLAY) {
- (void) printf(gettext(" PLAY\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_RECORD) {
- (void) printf(gettext(" RECORD\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_DUPLEX) {
- (void) printf(gettext(" DUPLEX\n"));
+ if (ctype_valid(cinfop->ci.type)) {
+ if (ioctl(mfd, SNDCTL_MIX_READ, &cval) < 0) {
+ rv = errno;
+ perror(_("Error reading control\n"));
+ return (rv);
}
- if (audio_info.hw_features & AUDIO_HWFEATURE_MSCODEC) {
- (void) printf(gettext(" MULTI-STREAM CODEC\n"));
- }
- if (audio_info.hw_features & AUDIO_HWFEATURE_IN2OUT) {
- (void) printf(gettext(" INPUT TO OUTPUT LOOPBACK\n"));
+ } else {
+ /* if verbose, then continue to display the "pseudo" ctrls */
+ if (vopt < 2 || tofile)
+ return (0);
+ }
+
+ /*
+ * convert the control value into a string
+ */
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ (void) snprintf(valbuf, sizeof (valbuf), "%s",
+ cval.value ? _("on") : _("off"));
+ break;
+
+ case MIXT_MONOSLIDER:
+ (void) snprintf(valbuf, sizeof (valbuf), "%d",
+ cval.value & 0xff);
+ break;
+
+ case MIXT_STEREOSLIDER:
+ (void) snprintf(valbuf, sizeof (valbuf), "%d:%d",
+ (int)AUDIO_CTRL_STEREO_LEFT(cval.value),
+ (int)AUDIO_CTRL_STEREO_RIGHT(cval.value));
+ break;
+
+ case MIXT_ENUM:
+ str = get_enum_str(cinfop, cval.value);
+ if (str == NULL) {
+ warn(_("Bad enum index %d for control '%s'\n"),
+ cval.value, cinfop->ci.extname);
+ return (EINVAL);
}
- (void) printf(gettext("SW Features\t\t0x%08x\n"),
- audio_info.sw_features);
- if (audio_info.sw_features & AUDIO_SWFEATURE_MIXER) {
- (void) printf(gettext(" MIXER\n"));
+
+ (void) snprintf(valbuf, sizeof (valbuf), "%s", str);
+ break;
+
+ default:
+ (void) snprintf(valbuf, sizeof (valbuf), "-");
+ }
+
+ /*
+ * possible control values (range/selection)
+ */
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ (void) snprintf(selbuf, sizeof (selbuf), _("on,off"));
+ break;
+
+ case MIXT_MONOSLIDER:
+ (void) snprintf(selbuf, sizeof (selbuf), "%d-%d",
+ cinfop->ci.minvalue, cinfop->ci.maxvalue);
+ break;
+ case MIXT_STEREOSLIDER:
+ (void) snprintf(selbuf, sizeof (selbuf), "%d-%d:%d-%d",
+ cinfop->ci.minvalue, cinfop->ci.maxvalue,
+ cinfop->ci.minvalue, cinfop->ci.maxvalue);
+ break;
+
+ case MIXT_ENUM:
+ /*
+ * display the first choice on the same line, then display
+ * the rest on multiple lines
+ */
+ selbuf[0] = 0;
+ for (i = 0; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if ((strlen(str) + 1 + strlen(selbuf)) >=
+ sizeof (selbuf)) {
+ break;
+ }
+ if (strlen(selbuf)) {
+ (void) strlcat(selbuf, ",", sizeof (selbuf));
+ }
+
+ (void) strlcat(selbuf, str, sizeof (selbuf));
}
- (void) printf(gettext("SW Features Enabled\t0x%08x\n"),
- audio_info.sw_features_enabled);
- if (audio_info.sw_features_enabled & AUDIO_SWFEATURE_MIXER) {
- (void) printf(gettext(" MIXER\n"));
+ idx = i;
+ break;
+
+ default:
+ (void) snprintf(selbuf, sizeof (selbuf), "-");
+ }
+
+ col.col_dv = devnm;
+ col.col_nm = strlen(cinfop->ci.extname) ?
+ cinfop->ci.extname : cinfop->ci.id;
+ while (strchr(col.col_nm, '_') != NULL) {
+ col.col_nm = strchr(col.col_nm, '_') + 1;
+ }
+ col.col_val = valbuf;
+ col.col_typ = ctype_str(cinfop->ci.type);
+ col.col_sel = selbuf;
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
+
+ /* print leftover enum value selections */
+ while ((!tofile) && (idx >= 0) && (idx < cinfop->ci.maxvalue)) {
+ selbuf[0] = 0;
+ for (i = idx; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if ((strlen(str) + 1 + strlen(selbuf)) >=
+ sizeof (selbuf)) {
+ break;
+ }
+ if (strlen(selbuf)) {
+ (void) strlcat(selbuf, ",", sizeof (selbuf));
+ }
+
+ (void) strlcat(selbuf, str, sizeof (selbuf));
}
+ idx = i;
+ col.col_dv = NULL;
+ col.col_nm = NULL;
+ col.col_val = NULL;
+ col.col_typ = NULL;
+ col.col_sel = selbuf;
+ mixers_prt_ctl_line(sfp, tofile, &col, vopt);
}
- (void) close(fd);
+ return (0);
+}
- (void) printf("\n");
- return (rc);
+static int
+mixers_prt_controls(FILE *sfp, int tofile, mlist_t *mlistp, char *cname,
+ int vopt)
+{
+ cinfo_t *cinfop;
+ char *n;
+ int i;
+ int rv;
+ int rval = 0;
-} /* doit() */
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
-/*
- * pport2str()
- *
- * Description:
- * Convert the play port bit map into strings. This makes the port number
- * a bit more readable. The returned string is in parenthesis and always
- * has 30 valid characters for spacing.
- *
- * Arguments:
- * uint port The port to convert
- * char *buf The storage to put the string into
- *
- * Returns:
- * void
- */
-static void
-pport2str(uint_t port, char *buf)
+ n = cinfop->ci.extname;
+ while (strchr(n, '_') != NULL) {
+ n = strchr(n, '_') + 1;
+ }
+ if (cname != NULL && strcmp(cname, n) != 0)
+ continue;
+
+ rv = mixers_prt_cinfo(sfp, tofile, mlistp, cinfop, vopt);
+ if (rv != 0)
+ rval = rv;
+ }
+
+ return (rval);
+}
+
+
+static int
+mixers_sav_prt(FILE *sfp, int tofile, mlist_t *mlistp, char *cname,
+ int eopt, int lopt, int vopt)
{
- int sep = 0;
+ mlist_t *mlp;
+ int rv;
+ int rval = 0;
+
+ for (mlp = mlistp; mlp != NULL; mlp = mlp->nextp) {
+
+ if ((mlp->mi.enabled == 0) && (vopt == NULL))
+ continue;
- (void) strcpy(buf, gettext("("));
+ if ((lopt) || (vopt) || (tofile))
+ mixers_prt_mlist(sfp, tofile, mlp);
- if (port & AUDIO_SPEAKER) {
- (void) strcat(buf, gettext(SPEAKER));
- sep++;
+ if (eopt)
+ msg(_("Audio mixer for %s is enabled\n"),
+ mlp->mi.devnode);
+
+ if ((lopt || eopt) && !tofile)
+ continue;
+
+ if ((mlistp->cmax > 0) && (vopt || (mlp == mlistp)))
+ mixers_prt_ctl_hdr(sfp, tofile, vopt);
+ rv = mixers_prt_controls(sfp, tofile, mlp, cname, vopt);
+ if (rv != 0)
+ rval = rv;
+
+ if (vopt)
+ msg("\n");
}
- if (port & AUDIO_HEADPHONE) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ return (rval);
+}
+
+static int
+mixers_save(mlist_t *mlistp, char *sstr, int ovopt, int vopt)
+{
+ FILE *sfp;
+ int fp;
+ int retval;
+ struct stat sbuf;
+
+ if (stat(sstr, &sbuf) == 0) {
+ if (!ovopt) {
+ warn(_("Would over write existing file [%s]\n"), sstr);
+ return (EINVAL);
} else {
- sep++;
+ if (unlink(sstr)) {
+ retval = errno;
+ perror(_("Failed to unlink existing file"));
+ return (retval);
+ }
}
- (void) strcat(buf, gettext(HDPHONE));
}
- if (port & AUDIO_LINE_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(LINE));
+
+ if ((fp = open(sstr, O_WRONLY|O_CREAT|O_EXCL, 0666)) == 0) {
+ retval = errno;
+ perror(_("Failed to create file"));
+ return (retval);
}
- if (port & AUDIO_SPDIF_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ sfp = fdopen(fp, "w");
+ if (sfp == NULL)
+ return (errno);
+ retval = mixers_sav_prt(sfp, 1, mlistp, NULL, 0, 0, vopt);
+ if (fclose(sfp))
+ return (errno);
+ return (retval);
+}
+
+static int
+mixers_set_cinfo(mlist_t *mlistp, cinfo_t *cinfop, char *wstr, int vopt)
+{
+ int mfd = mlistp->mfd;
+ oss_mixer_value cval;
+ int wlen = strlen(wstr);
+ int lval, rval;
+ char *lstr, *rstr;
+ char *str;
+ int i;
+ int rv = -1;
+
+ cval.dev = -1;
+ cval.ctrl = cinfop->ci.ctrl;
+ cval.value = 0;
+
+ switch (cinfop->ci.type) {
+ case MIXT_ONOFF:
+ cval.value = (strncmp(_("on"), wstr, wlen) == 0) ? 1 : 0;
+ break;
+
+ case MIXT_MONOSLIDER:
+ cval.value = atoi(wstr);
+ break;
+
+ case MIXT_STEREOSLIDER:
+ lstr = wstr;
+ rstr = strchr(wstr, ':');
+ if (rstr != NULL) {
+ *rstr = '\0';
+ rstr++;
+
+ rval = atoi(rstr);
+ lval = atoi(lstr);
+
+ rstr--;
+ *rstr = ':';
} else {
- sep++;
+ lval = atoi(lstr);
+ rval = lval;
}
- (void) strcat(buf, gettext(SPDIF));
- }
- if (port & AUDIO_AUX1_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ cval.value = AUDIO_CTRL_STEREO_VAL(lval, rval);
+ break;
+
+ case MIXT_ENUM:
+ for (i = 0; i < cinfop->ci.maxvalue; i++) {
+ str = get_enum_str(cinfop, i);
+ if (str == NULL)
+ continue;
+
+ if (strncmp(wstr, str, wlen) == 0) {
+ cval.value = i;
+ break;
+ }
}
- (void) strcat(buf, gettext(AUX1));
- }
- if (port & AUDIO_AUX2_OUT) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (i >= cinfop->ci.maxvalue) {
+ warn(_("Invalid enumeration value"));
+ return (EINVAL);
}
- (void) strcat(buf, gettext(AUX2));
+ break;
+
+ default:
+ warn(_("Unsupported control type\n"));
+ return (EINVAL);
}
- if (port & ~ALL_PLAY_PORTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(UNKNOWN));
+
+ if (vopt) {
+ msg(_("%s: '%s' set to '%s'\n"), mlistp->cdi.shortname,
+ cinfop->ci.extname, wstr);
}
- if (sep == 0) {
- (void) strcat(buf, gettext(NONE));
+ if (ioctl(mfd, SNDCTL_MIX_WRITE, &cval) < 0) {
+ rv = errno;
+ perror(_("Error writing control"));
+ return (rv);
}
- (void) strcat(buf, gettext(")"));
+ rv = 0;
+ return (rv);
+}
-} /* pport2str() */
-/*
- * rport2str()
- *
- * Description:
- * Convert the record port bit map into strings. This makes the port
- * number a bit more readable. The returned string in parenthesis.
- *
- * Arguments:
- * uint port The port to convert
- * char *buf The storage to put the string into
- *
- * Returns:
- * void
- */
-static void
-rport2str(uint_t port, char *buf)
+static int
+mixers_set_controls(mlist_t *mlistp, char *cname, char *wstr, int vopt)
{
- int sep = 0;
+ cinfo_t *cinfop;
+ char *n;
+ int i;
+ int rv;
+ int rval = 0;
- (void) strcpy(buf, gettext("("));
+ /*
+ * Note errors that occur but continue on to the next control;
+ * XXX
+ * we allow multiple controls with the same name
+ */
+ for (i = 0; i < mlistp->cmax; i++) {
+ cinfop = &mlistp->controls[i];
+ n = cinfop->ci.extname;
+ while (strchr(n, '_') != NULL) {
+ n = strchr(n, '_') + 1;
+ }
+ if (cname != NULL && strcmp(cname, n) != 0)
+ continue;
- if (port & AUDIO_MICROPHONE) {
- (void) strcat(buf, gettext(MIC));
- sep++;
+ rv = mixers_set_cinfo(mlistp, cinfop, wstr, vopt);
+ if (rv != 0)
+ rval = rv;
}
- if (port & AUDIO_LINE_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
- }
- (void) strcat(buf, gettext(LINE));
+
+ return (rval);
+}
+
+
+static int
+mixers_set(mlist_t *mlistp, char *cname, char *wstr, int vopt)
+{
+ mlist_t *mlp;
+ int rv;
+ int rval = 0;
+
+ /*
+ * Note errors that occur but continue on to the next mixer; this is
+ * to allow us to specify a single control to set on all mixers,
+ * if such a control is available on the mixer
+ */
+ for (mlp = mlistp; mlp != NULL; mlp = mlp->nextp) {
+
+ rv = mixers_set_controls(mlp, cname, wstr, vopt);
+ if (rv != 0)
+ rval = rv;
}
- if (port & AUDIO_CD) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ return (rval);
+}
+
+static int
+mixers_restore(mlist_t *mlistp, char *sstr, int vopt)
+{
+ FILE *sfp;
+ int retval = 0;
+ int rv;
+ int lineno = 0;
+ char linebuf[PATH_MAX];
+ char *col_nm, *col_val;
+
+ sfp = fopen(sstr, "r");
+ if (sfp == NULL)
+ return (errno);
+
+ while (fgets(linebuf, sizeof (linebuf), sfp) != NULL) {
+ lineno++;
+ if (linebuf[strlen(linebuf) - 1] != '\n') {
+ warn(_("Warning: line too long at line %d\n"), lineno);
+ /* read in the rest of the line and discard it */
+ while (fgets(linebuf, sizeof (linebuf), sfp) != NULL &&
+ (linebuf[strlen(linebuf) - 1] != '\n')) {
+ continue;
+ }
+ continue;
}
- (void) strcat(buf, gettext(CD));
- }
- if (port & AUDIO_SPDIF_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+ /* now we have a good line ... */
+ col_nm = strtok(linebuf, " \t\n");
+ /* skip comments and blank lines */
+ if ((col_nm == NULL) || (col_nm[0] == '#')) {
+ continue;
}
- (void) strcat(buf, gettext(SPDIF));
- }
- if (port & AUDIO_AUX1_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+ col_val = strtok(NULL, " \t\n");
+ if ((col_val == NULL) || (*col_val == 0)) {
+ warn(_("Warning: missing value at line %d\n"), lineno);
+ continue;
}
- (void) strcat(buf, gettext(AUX1));
+
+ rv = mixers_set(mlistp, col_nm, col_val, vopt);
+ if (rv)
+ retval = rv;
}
- if (port & AUDIO_AUX2_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (fclose(sfp))
+ return (errno);
+ return (retval);
+}
+
+
+static void
+help(void)
+{
+#define HELP_STR _( \
+"mixerctl [ -d <device> | -a ] [ -f ] [ -s <file> | -r <file> ]\n" \
+"mixerctl [ -d <device> | -a ] [ -Civ ]\n" \
+"mixerctl [ -d <device> | -a ] [ -v ] -c <ctrl> [ -w <value> ]\n" \
+"\n" \
+" -d <device> = audio device path\n" \
+" -s <file> = save control settings to file\n" \
+" -r <file> = restore control settings from file\n" \
+" -f force overwrite of existing control settings file\n" \
+" -a process all audio devices\n" \
+" -C dump all audio controls\n" \
+" -i list audio device info\n" \
+" -v verbose output; also affects output for -w;\n" \
+" multiple uses increase verbosity\n" \
+" -c <ctrl> = control name\n" \
+" -w <value> = control value\n" \
+" {integer} for mono; {integer:integer} for stereo;\n" \
+" {string} for enum; {on|off} for boolean\n" \
+"\n" \
+" without arguments, device info for all devices will be listed\n")
+
+ (void) fprintf(stderr, HELP_STR);
+}
+
+
+#define strstarts(s, prefix) strncmp(s, prefix, strlen(prefix))
+
+int
+main(int argc, char **argv)
+{
+ int rv = -1;
+ int opt;
+ char *dstr = NULL;
+ char *cstr = NULL;
+ char *wstr = NULL;
+ char *sstr = NULL;
+ int aopt = 0;
+ int iopt = 0;
+ int vopt = 0;
+ int eopt = 0;
+ int oopt = 0;
+ int Copt = 0;
+ int sopt = 0;
+ int ropt = 0;
+ int ovopt = 0;
+ mlist_t *mlistp = NULL;
+
+ (void) setlocale(LC_ALL, "");
+ (void) textdomain(TEXT_DOMAIN);
+
+ while ((opt = getopt(argc, argv, "Cd:c:w:fs:r:ivhaeo")) != EOF) {
+ switch (opt) {
+ case 'C':
+ Copt++;
+ break;
+ case 'a':
+ aopt++;
+ break;
+ case 'e':
+ eopt++;
+ break;
+ case 'f':
+ ovopt++;
+ break;
+ case 'o':
+ oopt++;
+ break;
+ case 'd':
+ dstr = optarg;
+ break;
+
+ case 'c':
+ cstr = strdup(optarg);
+ break;
+ case 'w':
+ wstr = strdup(optarg);
+ break;
+ case 's':
+ sopt++;
+ sstr = strdup(optarg);
+ break;
+ case 'r':
+ ropt++;
+ sstr = strdup(optarg);
+ break;
+ case 'i':
+ iopt++;
+ break;
+ case 'v':
+ vopt++;
+ break;
+ case 'h':
+ help();
+ rv = 0;
+ goto OUT;
+ default:
+ help();
+ rv = EINVAL;
+ goto OUT;
}
- (void) strcat(buf, gettext(AUX2));
}
- if (port & AUDIO_CODEC_LOOPB_IN) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
- } else {
- sep++;
+
+ if (((eopt || oopt) && (Copt || sopt || ropt)) ||
+ (Copt && cstr) ||
+ ((Copt || cstr) && (sopt || ropt)) ||
+ (aopt && dstr) ||
+ (sopt && ropt)) {
+ warn(_("Illegal combination of options.\n"));
+ rv = EINVAL;
+ goto OUT;
+ }
+
+ if ((Copt) && (dstr == NULL)) {
+ /* asume -a when dumping controls with -C */
+ aopt++;
+ }
+
+ if ((!aopt) && (dstr == NULL)) {
+ /* if no mixer specified, assume a default */
+ dstr = getenv("AUDIODEV");
+ if (dstr == NULL) {
+ dstr = "/dev/audio";
}
- (void) strcat(buf, gettext(LOOPBACK));
}
- if (port & AUDIO_SUNVTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+
+ if (oopt) {
+ /* legacy option, nuke it */
+ warn(_("Cannot disable audio mixer\n"));
+ rv = EINVAL;
+ goto OUT;
+ }
+
+ if (dstr != NULL) {
+ char scratch[MAXPATHLEN + 1];
+ char *s;
+ char *bn;
+ int num = -1;
+ /*
+ * User may have specified:
+ *
+ * /dev/dsp[<num>]
+ * /dev/mixer[<num>]
+ * /dev/audio[<num>9]
+ * /dev/audioctl[<num>]
+ * /dev/sound/<num>{,ctl,dsp,mixer}
+ * /dev/sound/<driver>:<num>{,ctl,dsp,mixer}
+ *
+ * We want to deal only with SADA names though.
+ */
+
+ if (strcmp(dstr, "/dev/mixer") == 0) {
+ /* /dev/mixer node doesn't point to real hw */
+ dstr = "/dev/dsp";
+ }
+ if ((bn = strrchr(dstr, '/')) != NULL) {
+ bn++;
} else {
- sep++;
+ bn = dstr;
}
- (void) strcat(buf, gettext(SUNVTSLB));
- }
- if (port & ~ALL_REC_PORTS) {
- if (sep) {
- (void) strcat(buf, gettext(SEPARATOR));
+ if ((strstarts(dstr, "/dev/sound/") == 0) &&
+ ((strrchr(dstr, ':')) != NULL)) {
+ char *colon;
+ int n;
+
+ (void) strlcpy(scratch, dstr, sizeof (scratch));
+ colon = strrchr(scratch, ':');
+ colon++;
+ n = atoi(colon);
+ *colon = '\0';
+ (void) snprintf(colon,
+ sizeof (scratch) - strlen(scratch), "%dmixer", n);
+
+ dstr = strdup(scratch);
+
+ } else if ((strcmp(dstr, "/dev/audio") == 0) ||
+ (strcmp(dstr, "/dev/audioctl") == 0) ||
+ (strcmp(dstr, "/dev/dsp") == 0)) {
+ /* "default" device, read the link */
+ if (readlink(dstr, scratch, sizeof (scratch)) >= 0) {
+ if ((s = strchr(scratch, '/')) != NULL) {
+ num = atoi(s + 1);
+ }
+ }
+
+ } else if ((strstarts(dstr, "/dev/sound/") == 0) &&
+ (isdigit(bn[0]))) {
+ num = atoi(bn);
+ }
+ if (num >= 0) {
+ /* Convert SADA name to OSS name */
+ (void) snprintf(scratch, sizeof (scratch),
+ "/dev/mixer%d", num);
+ dstr = strdup(scratch);
} else {
- sep++;
+ dstr = strdup(dstr);
}
- (void) strcat(buf, gettext(UNKNOWN));
}
- if (sep == 0) {
- (void) strcat(buf, gettext(NONE));
+ if (wstr != NULL && cstr == NULL) {
+ warn(_("Control value specified without name\n"));
+ rv = EINVAL;
+ goto OUT;
}
- (void) strcat(buf, gettext(")"));
+ if ((cstr == NULL) && (Copt == 0) && (eopt == 0) &&
+ (ropt == 0) && (sopt == 0)) {
+ iopt = 1;
+ }
+
+ rv = mixers_getinfo(dstr, &mlistp);
+ if (rv != 0)
+ goto OUT;
+
+ if (wstr != NULL) {
+ rv = mixers_set(mlistp, cstr, wstr, vopt);
+ goto OUT;
+ }
+
+ if (ropt) {
+ rv = mixers_restore(mlistp, sstr, vopt);
+ goto OUT;
+ }
+
+ if (sopt) {
+ rv = mixers_save(mlistp, sstr, ovopt, vopt);
+ goto OUT;
+ }
+
+ rv = mixers_sav_prt(stdout, 0, mlistp, cstr, eopt, iopt, vopt);
+ if (rv != 0)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ if (dstr != NULL)
+ free(dstr);
+ if (cstr != NULL)
+ free(cstr);
+ if (wstr != NULL)
+ free(wstr);
+ if (sstr != NULL)
+ free(sstr);
-} /* rport2str() */
+ mixers_free(&mlistp);
+ return (rv);
+}
diff --git a/usr/src/cmd/devfsadm/audio_link.c b/usr/src/cmd/devfsadm/audio_link.c
index 6b3e08a66f..9552b0aa4e 100644
--- a/usr/src/cmd/devfsadm/audio_link.c
+++ b/usr/src/cmd/devfsadm/audio_link.c
@@ -19,19 +19,22 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <regex.h>
#include <devfsadm.h>
#include <strings.h>
+#include <ctype.h>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
+#include <syslog.h>
#include <bsm/devalloc.h>
+#include <sys/audio.h>
+#include <sys/soundcard.h>
+#include <unistd.h>
#define MAX_AUDIO_LINK 100
#define RE_SIZE 64
@@ -39,13 +42,18 @@
extern int system_labeled;
static void check_audio_link(char *secondary_link,
- const char *primary_link_format);
+ const char *primary_link_format);
+
static int audio_process(di_minor_t minor, di_node_t node);
+static int sndstat_process(di_minor_t minor, di_node_t node);
static devfsadm_create_t audio_cbt[] = {
{ "audio", "ddi_audio", NULL,
- TYPE_EXACT, ILEVEL_0, audio_process
- }
+ TYPE_EXACT, ILEVEL_0, audio_process
+ },
+ { "pseudo", "ddi_pseudo", "audio",
+ TYPE_EXACT|DRV_EXACT, ILEVEL_0, sndstat_process
+ },
};
DEVFSADM_CREATE_INIT_V0(audio_cbt);
@@ -55,54 +63,49 @@ DEVFSADM_CREATE_INIT_V0(audio_cbt);
* because recurse_dev_re() would not work.
*/
static devfsadm_remove_t audio_remove_cbt[] = {
- { "audio",
- "^audio(ctl)?$",
- RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
+ /*
+ * Secondary links.
+ */
+
+ /* /dev/audio, /dev/audioctl, /dev/dsp */
+ { "audio", "^(audio|audioctl|dsp)$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^sound/[0-9]+.*$",
- RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ /* /dev/mixer0, /dev/dsp0 */
+ { "audio", "^(mixer|dsp)[0-9]+$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/mgt$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
+ /* /dev/sound/0, 0ctl */
+ { "audio", "^sound/[0-9]+(ctl)?$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/aux/0(ctl)?$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
+ /* /dev/mixer */
+ { "pseudo", "^(mixer)$",
+ RM_POST|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_link
},
- { "audio",
- "^isdn/[0-9]+/(nt)|(te)/((dtrace)|(mgt)|(b1)|(b2)|(d))$",
- RM_PRE, ILEVEL_0, devfsadm_rm_all
- }
-};
-DEVFSADM_REMOVE_INIT_V0(audio_remove_cbt);
-
-static regex_t isdn_re;
+ /*
+ * Primary links.
+ */
-#define ISDN_RE "((nt)|(te)|(aux))\\,((0)|(0ctl)|(d)|(b1)|(b2)|(mgt)|(dtrace))"
-#define F 1
-#define S 5
+ /* /dev/sndstat */
+ { "pseudo", "^sndstat$",
+ RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ },
+ /* /dev/sound/audio810:0, 0ctl, etc */
+ { "audio", "^sound/.*:[0-9]+(ctl|dsp|mixer)?$",
+ RM_PRE|RM_HOT|RM_ALWAYS, ILEVEL_0, devfsadm_rm_all
+ },
+};
-int
-minor_init(void)
-{
- if (0 != regcomp(&isdn_re, ISDN_RE, REG_EXTENDED)) {
- devfsadm_errprint("SUNW_audio_link: minor_init: regular "
- "expression bad: '%s'\n", ISDN_RE);
- return (DEVFSADM_FAILURE);
- } else {
- return (DEVFSADM_SUCCESS);
- }
-}
+DEVFSADM_REMOVE_INIT_V0(audio_remove_cbt);
int
minor_fini(void)
{
- regfree(&isdn_re);
check_audio_link("audio", "sound/%d");
check_audio_link("audioctl", "sound/%dctl");
+ check_audio_link("dsp", "dsp%d");
return (DEVFSADM_SUCCESS);
}
@@ -111,6 +114,82 @@ minor_fini(void)
pm[pos].rm_eo - pm[pos].rm_so); \
to[pm[pos].rm_eo - pm[pos].rm_so] = 0;
+static void
+send_number(long num)
+{
+ char buf[PATH_MAX+1];
+
+ /*
+ * This is not safe with -r.
+ */
+ if (strcmp(devfsadm_root_path(), "/") != 0)
+ return;
+
+ (void) snprintf(buf, sizeof (buf), "/dev/mixer%ld", num);
+ if (device_exists(buf)) {
+ int fd;
+
+ if ((fd = open(buf, O_RDWR)) < 0)
+ return;
+
+ (void) ioctl(fd, SNDCTL_SUN_SEND_NUMBER, &num);
+ (void) close(fd);
+ devfsadm_print(CHATTY_MID,
+ "sent devnum audio %ld to %s\n", num, buf);
+ }
+}
+
+static void
+send_all(void)
+{
+ /*
+ * This module traverses /dev/sound to look for nodes that
+ * have been previously created.
+ */
+ finddevhdl_t fh;
+ const char *path;
+
+ /*
+ * This is not safe with -r.
+ */
+ if ((strcmp(devfsadm_root_path(), "/") == 0) &&
+ (finddev_readdir("/dev", &fh) == 0)) {
+ static int doneit = 0;
+
+ while ((!doneit) && ((path = finddev_next(fh)) != NULL)) {
+ long num;
+ char *ep;
+ if ((strncmp(path, "mixer", 5) != 0) ||
+ (!isdigit(path[5]))) {
+ continue;
+ }
+ num = strtol(path + 5, &ep, 10);
+ send_number(num);
+ }
+ finddev_close(fh);
+ doneit = 1;
+ }
+}
+
+static int
+sndstat_process(di_minor_t minor, di_node_t node)
+{
+ char *mn;
+
+ mn = di_minor_name(minor);
+
+ /*
+ * "Special" handling for /dev/sndstat and /dev/mixer.
+ */
+ if (strcmp(mn, "sound,sndstat0") == 0) {
+ (void) devfsadm_mklink("sndstat", node, minor, 0);
+ (void) devfsadm_secondary_link("mixer", "sndstat", 0);
+ send_all();
+ }
+
+ return (DEVFSADM_CONTINUE);
+}
+
/*
* This function is called for every audio node.
* Calls enumerate to assign a logical unit id, and then
@@ -120,113 +199,167 @@ static int
audio_process(di_minor_t minor, di_node_t node)
{
int flags = 0;
- char path[PATH_MAX + 1];
+ char devpath[PATH_MAX + 1];
+ char newpath[PATH_MAX + 1];
char *buf;
char *mn;
- char m1[10];
- char m2[10];
- char *devfspath;
+ char *tmp;
+ char *ep;
char re_string[RE_SIZE+1];
devfsadm_enumerate_t rules[1] = {NULL};
- regmatch_t pmatch[12];
- char *au_mn;
+ if (system_labeled)
+ flags = DA_ADD|DA_AUDIO;
mn = di_minor_name(minor);
- if ((devfspath = di_devfs_path(node)) == NULL) {
+ if ((tmp = di_devfs_path(node)) == NULL) {
return (DEVFSADM_CONTINUE);
}
- (void) strcpy(path, devfspath);
- (void) strcat(path, ":");
- (void) strcat(path, mn);
- di_devfs_path_free(devfspath);
-
- if (strstr(mn, "sound,") != NULL) {
- (void) snprintf(re_string, RE_SIZE, "%s", "^sound$/^([0-9]+)");
- } else {
- (void) strcpy(re_string, "isdn/([0-9]+)");
- }
+ (void) snprintf(devpath, sizeof (devpath), "%s:%s", tmp, mn);
+ di_devfs_path_free(tmp);
/*
- * We want a match against the physical path
- * without the minor name component.
+ * "Special" handling for /dev/sndstat and /dev/mixer.
*/
- rules[0].re = re_string;
- rules[0].subexp = 1;
- rules[0].flags = MATCH_ADDR;
+ if (strcmp(mn, "sound,sndstat0") == 0) {
+ (void) strlcpy(newpath, "sound/sndstat", sizeof (newpath));
- /*
- * enumerate finds the logical audio id, and stuffs
- * it in buf
- */
- if (devfsadm_enumerate_int(path, 0, &buf, rules, 1)) {
+ (void) devfsadm_mklink(newpath, node, minor, flags);
+ (void) devfsadm_secondary_link("sndstat", newpath, flags);
+ (void) devfsadm_secondary_link("mixer", newpath, flags);
+ send_all();
return (DEVFSADM_CONTINUE);
}
- path[0] = '\0';
+ if (strncmp(mn, "sound,", 6) == 0) {
+ char base[PATH_MAX + 1];
+ char linksrc[PATH_MAX + 1];
+ char linkdst[PATH_MAX + 1];
+ long num;
+ long inst;
+ int i;
+ char *driver;
+
+ /* strlen("sound,") */
+ (void) strlcpy(base, mn + 6, sizeof (base));
+ mn = base;
+
+ driver = di_driver_name(node);
+
+ /* if driver name override in minor name */
+ if ((tmp = strchr(mn, ',')) != NULL) {
+ driver = mn;
+ *tmp = '\0';
+ mn = tmp + 1;
+ }
- if (strstr(mn, "sound,") != NULL) {
- (void) strcpy(path, "sound/");
- (void) strcat(path, buf);
+ /* skip past "audio" portion of the minor name */
+ if (strncmp(mn, "audio", 5) == 0) {
+ mn += 5;
+ }
- /* if this is a minor node, tack on the correct suffix */
- au_mn = strchr(mn, ',');
- if (strcmp(++au_mn, "audio") != 0) {
+ /* parse the instance number */
+ for (i = strlen(mn); i; i--) {
+ if (!isdigit(mn[i - 1]))
+ break;
+ }
+ inst = strtol(mn + i, &ep, 10);
+ mn[i] = 0; /* lop off the instance number */
+
+ /*
+ * First we create a node with the driver under /dev/sound.
+ * Note that "instance numbers" used by the audio framework
+ * are guaranteed to be unique for each driver.
+ */
+ (void) snprintf(newpath, sizeof (newpath), "sound/%s:%d%s",
+ driver, inst, mn);
+ (void) devfsadm_mklink(newpath, node, minor, flags);
+
+ /*
+ * The rest of this logic is a gross simplification that
+ * is made possible by the fact that each audio node will
+ * have several different minors associated with it. Rather
+ * processing each node separately, we just create the links
+ * all at once.
+ *
+ * This reduces the chances of the various links being out
+ * of sync with each other.
+ */
+ if (strcmp(mn, "mixer") != 0) {
+ return (DEVFSADM_CONTINUE);
+ }
- /*
- * audioctl is a special case. It is handled
- * by stripping off the audio from the node name
- */
- if (strcmp(au_mn, "audioctl") == 0)
- au_mn = strstr(au_mn, "ctl");
- (void) strcat(path, au_mn);
+ /*
+ * Its the control node, so create the various
+ * secondary links.
+ */
+
+ /*
+ * We want a match against the physical path
+ * without the minor name component.
+ */
+ (void) snprintf(re_string, RE_SIZE, "%s", "^mixer([0-9]+)");
+ rules[0].re = re_string;
+ rules[0].subexp = 1;
+ rules[0].flags = MATCH_ALL;
+
+ /*
+ * enumerate finds the logical audio id, and stuffs
+ * it in buf
+ */
+ (void) strlcpy(devpath, newpath, sizeof (devpath));
+ if (devfsadm_enumerate_int(devpath, 0, &buf, rules, 1)) {
+ return (DEVFSADM_CONTINUE);
}
- }
+ num = strtol(buf, &ep, 10);
+ free(buf);
- if (regexec(&isdn_re, mn, sizeof (pmatch) / sizeof (pmatch[0]),
- pmatch, 0) == 0) {
- COPYSUB(m1, mn, pmatch, F);
- COPYSUB(m2, mn, pmatch, S);
- (void) strcpy(path, "isdn/");
- (void) strcat(path, buf);
- (void) strcat(path, "/");
- (void) strcat(path, m1);
- (void) strcat(path, "/");
- (void) strcat(path, m2);
- }
+ /* /dev/sound/0 */
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ld",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "sound/%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
- if (strstr("mgt,mgt", mn) != NULL) {
- (void) strcpy(path, "isdn/");
- (void) strcat(path, buf);
- (void) strcat(path, "/mgt");
- }
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ldctl",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "sound/%ldctl", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
+
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%lddsp",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "dsp%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
- free(buf);
+ (void) snprintf(linksrc, sizeof (linksrc), "sound/%s:%ldmixer",
+ driver, inst);
+ (void) snprintf(linkdst, sizeof (linkdst), "mixer%ld", num);
+ (void) devfsadm_secondary_link(linkdst, linksrc, flags);
+
+ /* Send control number */
+ send_number(num);
- if (path[0] == '\0') {
- devfsadm_errprint("SUNW_audio_link: audio_process: can't find"
- " match for'%s'\n", mn);
return (DEVFSADM_CONTINUE);
}
- if (system_labeled)
- flags = DA_ADD|DA_AUDIO;
+ if (strncmp(mn, "internal,", 9) == 0) {
+ /* we don't set up internal nodes in /dev */
+ return (DEVFSADM_CONTINUE);
+ }
- (void) devfsadm_mklink(path, node, minor, flags);
+ devfsadm_errprint("SUNW_audio_link: can't find match for'%s'\n", mn);
return (DEVFSADM_CONTINUE);
}
-
static void
-check_audio_link(char *secondary_link, const char *primary_link_format)
+check_audio_link(char *secondary, const char *primary_format)
{
- char primary_link[PATH_MAX + 1];
+ char primary[PATH_MAX + 1];
int i;
int flags = 0;
/* if link is present, return */
- if (devfsadm_link_valid(secondary_link) == DEVFSADM_TRUE) {
+ if (devfsadm_link_valid(secondary) == DEVFSADM_TRUE) {
return;
}
@@ -234,10 +367,11 @@ check_audio_link(char *secondary_link, const char *primary_link_format)
flags = DA_ADD|DA_AUDIO;
for (i = 0; i < MAX_AUDIO_LINK; i++) {
- (void) sprintf(primary_link, primary_link_format, i);
- if (devfsadm_link_valid(primary_link) == DEVFSADM_TRUE) {
- (void) devfsadm_secondary_link(secondary_link,
- primary_link, flags);
+ (void) sprintf(primary, primary_format, i);
+ if (devfsadm_link_valid(primary) == DEVFSADM_TRUE) {
+ /* we read link to get it to the master "real" link */
+ (void) devfsadm_secondary_link(secondary,
+ primary, flags);
break;
}
}
diff --git a/usr/src/cmd/mdb/Makefile.common b/usr/src/cmd/mdb/Makefile.common
index bb341fdc8f..109b110645 100644
--- a/usr/src/cmd/mdb/Makefile.common
+++ b/usr/src/cmd/mdb/Makefile.common
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# MDB modules used for debugging user processes that every ISA's build
@@ -52,7 +52,6 @@ COMMON_MODULES_PROC_32BIT = \
#
COMMON_MODULES_KVM = \
arp \
- audiosup \
cpc \
crypto \
dtrace \
diff --git a/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c b/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c
deleted file mode 100644
index ab98383de7..0000000000
--- a/usr/src/cmd/mdb/common/modules/audiosup/audiosup.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <mdb/mdb_modapi.h>
-#include <sys/types.h>
-#include <sys/audio/audio_trace.h>
-
-typedef struct audiotrace_walk_data {
- uintptr_t aw_bufstart;
- uintptr_t aw_bufend;
- int aw_cnt;
-} audiotrace_walk_data_t;
-
-int
-audiotrace_walk_init(mdb_walk_state_t *wsp)
-{
- size_t size;
- uint_t seq, pos;
- GElf_Sym sym;
- audio_trace_buf_t *buffer;
- audio_trace_buf_t atb[2];
- audiotrace_walk_data_t *aw;
-
- if (mdb_readvar(&size, "audio_tb_siz") == -1) {
- mdb_warn("failed to read 'audio_tb_siz'");
- return (WALK_ERR);
- }
-
- if (size == 0)
- return (WALK_DONE);
-
- if (mdb_lookup_by_name("audio_trace_buffer", &sym) == -1) {
- mdb_warn("failed to find 'audio_trace_buffer'");
- return (WALK_ERR);
- }
-
- buffer = (audio_trace_buf_t *)(uintptr_t)sym.st_value;
-
- if (mdb_readvar(&seq, "audio_tb_seq") == -1) {
- mdb_warn("failed to read 'audio_tb_seq'");
- return (WALK_ERR);
- }
-
- if (mdb_readvar(&pos, "audio_tb_pos") == -1) {
- mdb_warn("failed to read 'audio_tb_pos'");
- return (WALK_ERR);
- }
-
- /* by default start the walk with the first buffer entry */
- wsp->walk_addr = (uintptr_t)buffer;
-
- if (seq > size && pos > 0) {
- /* start the walk with the oldest buffer entry */
-
- if (mdb_vread(&atb, sizeof (atb),
- (uintptr_t)(buffer + pos - 1)) == -1) {
- mdb_warn("failed to read audio_trace_buf_t at %p",
- buffer + pos - 1);
- return (WALK_ERR);
- }
-
- if (atb[1].atb_seq < atb[0].atb_seq)
- wsp->walk_addr = (uintptr_t)(buffer + pos);
- }
-
- aw = mdb_alloc(sizeof (audiotrace_walk_data_t), UM_SLEEP);
- aw->aw_bufstart = (uintptr_t)buffer;
- aw->aw_bufend = (uintptr_t)(buffer + size);
- aw->aw_cnt = MIN(seq, size);
- wsp->walk_data = aw;
-
- return (WALK_NEXT);
-}
-
-int
-audiotrace_walk_step(mdb_walk_state_t *wsp)
-{
- uintptr_t addr = wsp->walk_addr;
- audiotrace_walk_data_t *aw = wsp->walk_data;
- audio_trace_buf_t atb;
-
- if (aw->aw_cnt == 0)
- return (WALK_DONE);
-
- aw->aw_cnt--;
- wsp->walk_addr += sizeof (audio_trace_buf_t);
-
- if (wsp->walk_addr >= aw->aw_bufend)
- wsp->walk_addr = aw->aw_bufstart;
-
- if (mdb_vread(&atb, sizeof (atb), addr) == -1) {
- mdb_warn("failed to read audio_trace_buf_t at %p", addr);
- return (WALK_DONE);
- }
-
- return (wsp->walk_callback(addr, &atb, wsp->walk_cbdata));
-}
-
-void
-audiotrace_walk_fini(mdb_walk_state_t *wsp)
-{
- mdb_free(wsp->walk_data, sizeof (audiotrace_walk_data_t));
-}
-
-
-/*ARGSUSED*/
-int
-audiotrace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
-{
- int count;
- uint_t seq;
- const mdb_arg_t *argp = &argv[0];
- audio_trace_buf_t atb;
- char str[256];
-
- if (!(flags & DCMD_ADDRSPEC)) {
- if (mdb_walk_dcmd("audiotrace", "audiotrace", argc, argv)
- == -1) {
- mdb_warn("can't walk audio trace buffer entries");
- return (DCMD_ERR);
- }
- return (DCMD_OK);
- }
-
- if (argc > 1)
- return (DCMD_USAGE);
-
- /*
- * Specifying an address and a count at the same time doesn't make
- * sense.
- */
- if (argc == 1 && !(flags & DCMD_LOOP))
- return (DCMD_USAGE);
-
- if (DCMD_HDRSPEC(flags))
- mdb_printf("%<u>%6s %?s %-40s%</u>\n",
- "SEQNO", "DATA", "COMMENT");
-
- if (mdb_vread(&atb, sizeof (atb), addr) == -1) {
- mdb_warn("failed to read audiotrace_t at %p", addr);
- return (DCMD_ERR);
- }
-
- if (argc == 1) {
- /*
- * Display the last 'count' entries only. Skip any other
- * entries.
- */
- if (mdb_readvar(&seq, "audio_tb_seq") == -1) {
- mdb_warn("failed to read 'audio_tb_seq'");
- return (DCMD_ERR);
- }
-
- if (argp->a_type == MDB_TYPE_IMMEDIATE)
- count = argp->a_un.a_val;
- else
- count = mdb_strtoull(argp->a_un.a_str);
-
- if (atb.atb_seq < seq - count)
- return (DCMD_OK);
- }
-
- if (mdb_readstr(str, sizeof (str), (uintptr_t)atb.atb_comment) == -1) {
- mdb_warn("failed to read string at %p", atb.atb_comment);
- return (DCMD_ERR);
- }
-
- mdb_printf("%6d %?x %s\n", atb.atb_seq, atb.atb_data, str);
-
- return (DCMD_OK);
-}
-
-void
-audiotrace_help(void)
-{
- mdb_printf(
- "If count is specified ::audiotrace prints the specified\n"
- "number of entries from the logical end of the trace buffer.\n");
-}
-
-/*
- * MDB module linkage
- */
-static const mdb_dcmd_t dcmds[] = {
- { "audiotrace", "?[count]", "display audio trace buffer entries",
- audiotrace, audiotrace_help },
- { NULL }
-};
-
-static const mdb_walker_t walkers[] = {
- { "audiotrace", "walk audio trace buffer entries", audiotrace_walk_init,
- audiotrace_walk_step, audiotrace_walk_fini },
- { NULL }
-};
-
-static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, walkers };
-
-const mdb_modinfo_t *
-_mdb_init(void)
-{
- return (&modinfo);
-}
diff --git a/usr/src/cmd/svc/milestone/Makefile b/usr/src/cmd/svc/milestone/Makefile
index df0e542f76..d727a17ebb 100644
--- a/usr/src/cmd/svc/milestone/Makefile
+++ b/usr/src/cmd/svc/milestone/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -60,7 +60,8 @@ MAINMILESTONES= \
MAINMANIFESTS= $(MAINMILESTONES:%=$(ROOTSVCMILESTONE)/%)
SYSDEVSVCS= \
- devices-local.xml
+ devices-local.xml \
+ devices-audio.xml
SYSDEVMANIFESTS= $(SYSDEVSVCS:%=$(ROOTSVCSYSTEMDEVICE)/%)
@@ -94,6 +95,7 @@ MANIFEST= $(FSSVCS) $(NETSVCS) $(MAINMILESTONES) $(SYSTEMSVCS) \
SVCMETHOD=\
boot-archive \
console-login \
+ devices-audio \
devices-local \
fs-local \
fs-minimal \
diff --git a/usr/src/cmd/svc/milestone/devices-audio b/usr/src/cmd/svc/milestone/devices-audio
new file mode 100644
index 0000000000..74c2457588
--- /dev/null
+++ b/usr/src/cmd/svc/milestone/devices-audio
@@ -0,0 +1,44 @@
+#!/sbin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+
+. /lib/svc/share/smf_include.sh
+
+smf_is_globalzone || exit $SMF_EXIT_OK
+
+#
+# In order to populate the initial startup mapping of devfs links to
+# the audio subsystem (necessary to properly report numbers in
+# /dev/sndstat and in the OSS sysinfo ioctls -- thank you Linux!) we
+# need to run some code at boot. We key this off of the handler in
+# devfsadm for the audio node(s).
+#
+# Additionally, we need to make sure the streams audio module is
+# loaded so that the symbolic links are properly created for STREAMs
+# devices and point to a reasonable device node.
+#
+/usr/sbin/devfsadm -i audio
+/usr/sbin/devfsadm -i austr
+exit $SMF_EXIT_OK
diff --git a/usr/src/cmd/svc/milestone/devices-audio.xml b/usr/src/cmd/svc/milestone/devices-audio.xml
new file mode 100644
index 0000000000..48dee7299e
--- /dev/null
+++ b/usr/src/cmd/svc/milestone/devices-audio.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0'?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ Use is subject to license terms.
+
+ CDDL HEADER START
+
+ The contents of this file are subject to the terms of the
+ Common Development and Distribution License (the "License").
+ You may not use this file except in compliance with the License.
+
+ You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ or http://www.opensolaris.org/os/licensing.
+ See the License for the specific language governing permissions
+ and limitations under the License.
+
+ When distributing Covered Code, include this CDDL HEADER in each
+ file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ If applicable, add the following below this CDDL HEADER, with the
+ fields enclosed by brackets "[]" replaced with your own identifying
+ information: Portions Copyright [yyyy] [name of copyright owner]
+
+ CDDL HEADER END
+
+ NOTE: This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade. Make customizations in a different
+ file.
+
+ Service manifest for audio.
+-->
+
+<service_bundle type='manifest' name='SUNWcsr:devices-audio'>
+
+<service
+ name='system/device/audio'
+ type='service'
+ version='1'>
+
+ <create_default_instance enabled='true' />
+
+ <single_instance/>
+
+ <!--
+ We don't really ndeed devices, just /usr. However this
+ avoids thrashing in devfsadm.
+ -->
+ <dependency
+ name='devices'
+ grouping='require_all'
+ restart_on='none'
+ type='service'>
+ <service_fmri value='svc:/milestone/devices' />
+ </dependency>
+
+ <dependent
+ name='devices_audio_multi-user'
+ grouping='require_all'
+ restart_on='none'>
+ <service_fmri value='svc:/milestone/multi-user' />
+ </dependent>
+
+ <exec_method
+ type='method'
+ name='start'
+ exec='/lib/svc/method/devices-audio'
+ timeout_seconds='30' />
+
+ <exec_method
+ type='method'
+ name='stop'
+ exec=':true'
+ timeout_seconds='1' />
+
+ <property_group name='startd' type='framework'>
+ <propval name='duration' type='astring' value='transient' />
+ </property_group>
+
+ <stability value='Evolving' />
+
+ <template>
+ <common_name>
+ <loctext xml:lang='C'>
+ Solaris audio device configuration.
+ </loctext>
+ </common_name>
+ </template>
+</service>
+
+</service_bundle>
diff --git a/usr/src/pkgdefs/SUNWad810/Makefile b/usr/src/pkgdefs/SUNWad810/Makefile
index 057f909322..9811a569cb 100644
--- a/usr/src/pkgdefs/SUNWad810/Makefile
+++ b/usr/src/pkgdefs/SUNWad810/Makefile
@@ -19,19 +19,19 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
DATAFILES += i.preserve
.KEEP_STATE:
-all: $(FILES) depend postinstall preremove
+all: $(FILES) depend
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWad810/postinstall b/usr/src/pkgdefs/SUNWad810/postinstall.tmpl
index 27f0fcd2e2..acee80b819 100644
--- a/usr/src/pkgdefs/SUNWad810/postinstall
+++ b/usr/src/pkgdefs/SUNWad810/postinstall.tmpl
@@ -20,52 +20,31 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# SUNWad810 postinstall script
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-
-#
-# Audio810(7d) driver had been released before solaris had
-# update_drv(1M) command so that we have to manually add
-# aliases via echo(1).
-#
-update_driver() {
- driver=$1
- aliases=$2
- for alias in ${aliases}
- do
- egrep "^${driver}[ ]+${alias}" ${BASEDIR}/etc/driver_aliases>/dev/null 2>&1
- if [ $? -ne 0 ]
- then
- echo "${driver} ${alias}" >> ${BASEDIR}/etc/driver_aliases
- fi
- done
-}
-
-EXIT=0
+include drv_utils
I810_ALIASES="\
\"pci1022,7445\" \
\"pci1022,746d\" \
+ \"pci1039,7012\" \
+ \"pci8086,2415\" \
+ \"pci8086,2425\" \
+ \"pci8086,2445\" \
\"pci8086,2485\" \
\"pci8086,24c5\" \
\"pci8086,24d5\" \
\"pci8086,266e\" \
+ \"pci8086,25a6\" \
+ \"pci8086,2698\" \
\"pci8086,27de\" \
+ \"pci8086,7195\" \
+ \"pci10de,1b1\" \
\"pci10de,6a\" \
+ \"pci10de,8a\" \
\"pci10de,da\" \
\"pci10de,ea\" \
\"pci10de,59\" \
@@ -73,16 +52,4 @@ I810_ALIASES="\
\"pci10de,26b\" \
"
-case "${ARCH}" in
- i386)
- not_installed audio810
- if [ $? -ne 0 ]
- then
- add_drv -b "${BASEDIR}" -i "${I810_ALIASES}" -n audio810 || EXIT=1
- else
- update_driver audio810 "${I810_ALIASES}" || EXIT=1
- fi
- ;;
-esac
-
-exit ${EXIT}
+pkg_drvadd -i "${I810_ALIASES}" audio810 || exit 1
diff --git a/usr/src/pkgdefs/SUNWad810/preremove b/usr/src/pkgdefs/SUNWad810/preremove
deleted file mode 100644
index 6a075b1a8c..0000000000
--- a/usr/src/pkgdefs/SUNWad810/preremove
+++ /dev/null
@@ -1,52 +0,0 @@
-#! /bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWad810 preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-EXIT=0
-
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
-
-case "${ARCH}" in
- i386)
- installed audio810 || rem_drv -b ${BASEDIR} audio810 || EXIT=1
- ;;
-esac
-
-exit ${EXIT}
diff --git a/usr/src/cmd/mdb/intel/ia32/audiosup/Makefile b/usr/src/pkgdefs/SUNWad810/preremove.tmpl
index 6e7a229eaa..4b1e20cc4e 100644
--- a/usr/src/cmd/mdb/intel/ia32/audiosup/Makefile
+++ b/usr/src/pkgdefs/SUNWad810/preremove.tmpl
@@ -1,10 +1,10 @@
+#! /bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,16 +20,11 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
+# SUNWad810 preremove script
-MODULE = audiosup.so
-MDBTGT = kvm
+include drv_utils
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../Makefile.ia32
-include ../../../Makefile.module
+pkg_drvrem audio810 || exit 1
diff --git a/usr/src/pkgdefs/SUNWadixp/Makefile b/usr/src/pkgdefs/SUNWadixp/Makefile
index 10ffbabe4d..c131ff1b31 100644
--- a/usr/src/pkgdefs/SUNWadixp/Makefile
+++ b/usr/src/pkgdefs/SUNWadixp/Makefile
@@ -18,20 +18,19 @@
#
# CDDL HEADER END
#
-
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
.KEEP_STATE:
-all: $(FILES) depend postinstall preremove
+all: $(FILES) depend
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWadixp/postinstall b/usr/src/pkgdefs/SUNWadixp/postinstall.tmpl
index 5e82d6ebfd..018ca2b1a7 100644
--- a/usr/src/pkgdefs/SUNWadixp/postinstall
+++ b/usr/src/pkgdefs/SUNWadixp/postinstall.tmpl
@@ -21,33 +21,21 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# SUNWadixp postinstall script
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-EXIT=0
-
-case "${ARCH}" in
- i386)
- not_installed audioixp|| \
- add_drv -b "${BASEDIR}" \
- -i '"pci1002,4370" "pci1002,4341"' \
- -n audioixp || \
- EXIT=1
+include drv_utils
- ;;
-esac
-
-exit ${EXIT}
+#
+# We could probably also do SB600, pci1002,4382, but we don't have any
+# hardware to confirm with.
+#
+IXP_ALIASES="\
+ \"pci1002,4370\" \
+ \"pci1002,4361\" \
+ \"pci1002,4341\" \
+ "
+
+pkg_drvadd -i "${IXP_ALIASES}" audioixp || exit 1
diff --git a/usr/src/cmd/mdb/intel/amd64/audiosup/Makefile b/usr/src/pkgdefs/SUNWadixp/preremove.tmpl
index d31cbe9363..d5e761cbad 100644
--- a/usr/src/cmd/mdb/intel/amd64/audiosup/Makefile
+++ b/usr/src/pkgdefs/SUNWadixp/preremove.tmpl
@@ -1,10 +1,10 @@
+#! /bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,17 +20,11 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
+# SUNWadixp preremove script
-MODULE = audiosup.so
-MDBTGT = kvm
+include drv_utils
-MODSRCS = audiosup.c
-
-include ../../../../Makefile.cmd
-include ../../../../Makefile.cmd.64
-include ../../Makefile.amd64
-include ../../../Makefile.module
+pkg_drvrem audioixp || exit 1
diff --git a/usr/src/pkgdefs/SUNWauda/prototype_com b/usr/src/pkgdefs/SUNWauda/prototype_com
index 582e28748c..0006160282 100644
--- a/usr/src/pkgdefs/SUNWauda/prototype_com
+++ b/usr/src/pkgdefs/SUNWauda/prototype_com
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,10 +19,8 @@
# CDDL HEADER END
#
#
-# Copyright (c) 1999-2001 by Sun Microsystems, Inc.
-# All rights reserved.
-#
-#pragma ident "%Z%%M% %I% %E% SMI"
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
@@ -49,5 +46,6 @@ d none usr/bin 755 root bin
f none usr/bin/audioplay 555 root bin
f none usr/bin/audiorecord 555 root bin
f none usr/bin/audioconvert 555 root bin
+f none usr/bin/audiotest 555 root bin
d none usr/sbin 755 root bin
f none usr/sbin/mixerctl 555 root bin
diff --git a/usr/src/pkgdefs/SUNWaudd/Makefile b/usr/src/pkgdefs/SUNWaudd/Makefile
index 2f359c8e57..c6aee2f3cc 100644
--- a/usr/src/pkgdefs/SUNWaudd/Makefile
+++ b/usr/src/pkgdefs/SUNWaudd/Makefile
@@ -19,16 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
include ../Makefile.com
+TMPLFILES += postinstall preremove
DATAFILES += depend
-LICENSEFILES += $(OSBL)
.KEEP_STATE:
@@ -36,3 +34,4 @@ all: $(FILES)
install: all pkg
include ../Makefile.targ
+include ../Makefile.prtarg
diff --git a/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl b/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
index f265f0f084..b7d9bb4c46 100644
--- a/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
+++ b/usr/src/pkgdefs/SUNWaudd/pkginfo.tmpl
@@ -20,11 +20,9 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
#
# This required package information file describes characteristics of the
@@ -36,7 +34,7 @@ NAME="Audio Drivers"
ARCH="ISA"
VERSION="ONVERS,REV=0.0.0"
CATEGORY="system"
-DESC="SunOS audio device drivers using the new audio driver architecture"
+DESC="SunOS audio device drivers"
SUNW_PRODNAME="SunOS"
SUNW_PRODVERS="RELEASE/VERSION"
SUNW_PKGTYPE="root"
diff --git a/usr/src/pkgdefs/SUNWaudd/postinstall b/usr/src/pkgdefs/SUNWaudd/postinstall
deleted file mode 100644
index 93f2039cdb..0000000000
--- a/usr/src/pkgdefs/SUNWaudd/postinstall
+++ /dev/null
@@ -1,69 +0,0 @@
-#! /bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-
-#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWaudd postinstall script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
-
-not_installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- return $?
-}
-
-EXIT=0
-
-case "${ARCH}" in
- sparc)
- not_installed audiocs || \
- add_drv -b ${BASEDIR} -i '"SUNW,CS4231"' -n audiocs || EXIT=1
-
- not_installed audioens || \
- add_drv -b "${BASEDIR}" \
- -i '"pci1274,1371" "pci1274,5880"' \
- -n audioens || \
- EXIT=1
-
- not_installed audiots || \
- add_drv -b ${BASEDIR} -i '"pci10b9,5451"' -n audiots || EXIT=1
-
- not_installed audio1575 || \
- add_drv -b ${BASEDIR} -i '"pci10b9,5455"' -n audio1575 || EXIT=1
- ;;
- i386)
- not_installed audioens || \
- add_drv -b "${BASEDIR}" \
- -i '"pci1274,1371" "pci1274,5880"' \
- -n audioens || \
- EXIT=1
-
- ;;
-esac
-
-exit ${EXIT}
diff --git a/usr/src/pkgdefs/SUNWaudd/preremove b/usr/src/pkgdefs/SUNWaudd/postinstall.tmpl
index f646f7ecfa..1077780acb 100644
--- a/usr/src/pkgdefs/SUNWaudd/preremove
+++ b/usr/src/pkgdefs/SUNWaudd/postinstall.tmpl
@@ -21,37 +21,28 @@
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWaudd preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
+# SUNWaudd postinstall script
+include drv_utils
EXIT=0
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
+# common drivers first
+pkg_drvadd -n -m '* 0666 root sys' audio || EXIT=1
+pkg_drvadd -n austr || EXIT=1
+pkg_drvadd -n -i '"pci1274,1371" "pci1274,5880"' audioens || EXIT=1
+pkg_drvadd -n -i '"pci1274,5000"' audiopci || EXIT=1
case "${ARCH}" in
- sparc)
- installed audiocs || rem_drv -b ${BASEDIR} audiocs || EXIT=1
- installed audioens || rem_drv -b ${BASEDIR} audioens || EXIT=1
- installed audiots || rem_drv -b ${BASEDIR} audiots || EXIT=1
- installed audio1575 || rem_drv -b ${BASEDIR} audio1575 || EXIT=1
+ sparc)
+
+ pkg_drvadd -n -i '"SUNW,CS4231"' audiocs || EXIT=1
+ pkg_drvadd -n -i '"pci10b9,5451"' audiots || EXIT=1
+ pkg_drvadd -n -i '"pci10b9,5455"' audio1575 || EXIT=1
;;
- i386)
- installed audioens || rem_drv -b ${BASEDIR} audioens || EXIT=1
+ i386)
;;
esac
diff --git a/usr/src/pkgdefs/SUNWadixp/preremove b/usr/src/pkgdefs/SUNWaudd/preremove.tmpl
index a81ab22365..670212c5de 100644
--- a/usr/src/pkgdefs/SUNWadixp/preremove
+++ b/usr/src/pkgdefs/SUNWaudd/preremove.tmpl
@@ -21,32 +21,27 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# SUNWadixp preremove script
-
-PATH=/usr/bin:/usr/sbin:${PATH}
-export PATH
+# SUNWaudd preremove script
+include drv_utils
EXIT=0
-installed() {
- driver=$1
- grep "^${driver} " $BASEDIR/etc/name_to_major > /dev/null 2>&1
- if [ "$?" -eq 0 ]; then
- return 1
- else
- return 0
- fi
-}
-
case "${ARCH}" in
- i386)
- installed audioixp|| rem_drv -b ${BASEDIR} audioixp || EXIT=1
+ sparc)
+ pkg_drvrem audiocs || EXIT=1
+ pkg_drvrem audiots || EXIT=1
+ pkg_drvrem audio1575 || EXIT=1
+ ;;
+ i386)
;;
esac
+pkg_drvrem audioens || EXIT=1
+pkg_drvrem audiopci || EXIT=1
+pkg_drvrem austr || EXIT=1
+pkg_drvrem audio || EXIT=1
+
exit ${EXIT}
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_com b/usr/src/pkgdefs/SUNWaudd/prototype_com
index 8f3468eb41..628b244651 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_com
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_com
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 1999-2003 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -49,4 +46,7 @@ i preremove
d none kernel 755 root sys
d none kernel/misc 755 root sys
d none kernel/drv 755 root sys
+f none kernel/drv/audio.conf 644 root sys
f none kernel/drv/audioens.conf 644 root sys
+f none kernel/drv/audiopci.conf 644 root sys
+f none kernel/drv/austr.conf 644 root sys
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_i386 b/usr/src/pkgdefs/SUNWaudd/prototype_i386
index 11b7f9c956..2e8ec83faa 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_i386
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_i386
@@ -18,12 +18,11 @@
#
# CDDL HEADER END
#
+
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -47,13 +46,13 @@
#
d none kernel/misc/amd64 755 root sys
d none kernel/drv/amd64 755 root sys
-f none kernel/misc/amsrc1 755 root sys
-f none kernel/misc/amsrc2 755 root sys
-f none kernel/misc/audiosup 755 root sys
-f none kernel/misc/mixer 755 root sys
+f none kernel/misc/ac97 755 root sys
+f none kernel/drv/audio 755 root sys
f none kernel/drv/audioens 755 root sys
-f none kernel/misc/amd64/amsrc1 755 root sys
-f none kernel/misc/amd64/amsrc2 755 root sys
-f none kernel/misc/amd64/audiosup 755 root sys
-f none kernel/misc/amd64/mixer 755 root sys
+f none kernel/drv/audiopci 755 root sys
+f none kernel/drv/austr 755 root sys
+f none kernel/misc/amd64/ac97 755 root sys
+f none kernel/drv/amd64/audio 755 root sys
f none kernel/drv/amd64/audioens 755 root sys
+f none kernel/drv/amd64/audiopci 755 root sys
+f none kernel/drv/amd64/austr 755 root sys
diff --git a/usr/src/pkgdefs/SUNWaudd/prototype_sparc b/usr/src/pkgdefs/SUNWaudd/prototype_sparc
index b74cce5a43..d47f7d6d53 100644
--- a/usr/src/pkgdefs/SUNWaudd/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWaudd/prototype_sparc
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -48,12 +46,12 @@ f none kernel/drv/audiocs.conf 644 root sys
f none kernel/drv/audiots.conf 644 root sys
f none kernel/drv/audio1575.conf 644 root sys
d none kernel/drv/sparcv9 755 root sys
+f none kernel/drv/sparcv9/audio 755 root sys
f none kernel/drv/sparcv9/audiocs 755 root sys
f none kernel/drv/sparcv9/audioens 755 root sys
+f none kernel/drv/sparcv9/audiopci 755 root sys
f none kernel/drv/sparcv9/audiots 755 root sys
f none kernel/drv/sparcv9/audio1575 755 root sys
+f none kernel/drv/sparcv9/austr 755 root sys
d none kernel/misc/sparcv9 755 root sys
-f none kernel/misc/sparcv9/amsrc1 755 root sys
-f none kernel/misc/sparcv9/amsrc2 755 root sys
-f none kernel/misc/sparcv9/audiosup 755 root sys
-f none kernel/misc/sparcv9/mixer 755 root sys
+f none kernel/misc/sparcv9/ac97 755 root sys
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_com b/usr/src/pkgdefs/SUNWaudh/prototype_com
index f8b1084510..992b63d102 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_com
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_com
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -45,20 +43,16 @@ i depend
#
d none usr 755 root sys
d none usr/include 755 root bin
+d none usr/include/audio 755 root bin
+f none usr/include/audio/au.h 644 root bin
d none usr/include/sys 755 root bin
f none usr/include/sys/audio.h 644 root bin
f none usr/include/sys/audioio.h 644 root bin
-f none usr/include/sys/audiovar.h 644 root bin
f none usr/include/sys/mixer.h 644 root bin
+f none usr/include/sys/soundcard.h 644 root bin
d none usr/include/sys/audio 755 root bin
-d none usr/include/audio 755 root bin
-f none usr/include/audio/au.h 644 root bin
f none usr/include/sys/audio/ac97.h 644 root bin
-f none usr/include/sys/audio/am_src1.h 644 root bin
-f none usr/include/sys/audio/audioens.h 644 root bin
-f none usr/include/sys/audio/audio_apm.h 644 root bin
-f none usr/include/sys/audio/audio_mixer.h 644 root bin
-f none usr/include/sys/audio/audio_src.h 644 root bin
-f none usr/include/sys/audio/audio_support.h 644 root bin
-f none usr/include/sys/audio/audio_trace.h 644 root bin
+f none usr/include/sys/audio/audio_common.h 644 root bin
+f none usr/include/sys/audio/audio_driver.h 644 root bin
+f none usr/include/sys/audio/audio_oss.h 644 root bin
f none usr/include/sys/audio/g711.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_i386 b/usr/src/pkgdefs/SUNWaudh/prototype_i386
index 7050a4f45d..08f9663c82 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_i386
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_i386
@@ -20,11 +20,9 @@
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -46,7 +44,3 @@
#
# SUNWaudh
#
-f none usr/include/sys/audio/audio810.h 644 root bin
-f none usr/include/sys/audio/audiohd.h 644 root bin
-f none usr/include/sys/audio/audioixp.h 644 root bin
-f none usr/include/sys/audio/audiovia823x.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudh/prototype_sparc b/usr/src/pkgdefs/SUNWaudh/prototype_sparc
index 5c59192742..0e3250562d 100644
--- a/usr/src/pkgdefs/SUNWaudh/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWaudh/prototype_sparc
@@ -20,11 +20,9 @@
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -44,7 +42,3 @@
#
# SUNWaudh
#
-f none usr/include/sys/audio/audio_4231.h 644 root bin
-f none usr/include/sys/audio/audiots.h 644 root bin
-f none usr/include/sys/audio/audio1575.h 644 root bin
-f none usr/include/sys/audio/am_src2.h 644 root bin
diff --git a/usr/src/pkgdefs/SUNWaudiohd/postinstall b/usr/src/pkgdefs/SUNWaudiohd/postinstall
index e02d59e4f5..77af8bf454 100644
--- a/usr/src/pkgdefs/SUNWaudiohd/postinstall
+++ b/usr/src/pkgdefs/SUNWaudiohd/postinstall
@@ -20,10 +20,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
#
# SUNWaudiohd postinstall script
@@ -55,6 +54,7 @@ AUDIOHD_ALIASES="\
\"pci8086,2668\" \
\"pci10de,371\" \
\"pciclass,0403\" \
+ \"pciexclass,0403\"\
"
case "${ARCH}" in
diff --git a/usr/src/pkgdefs/SUNWcsr/prototype_com b/usr/src/pkgdefs/SUNWcsr/prototype_com
index d3bbcae315..1d3ca9cf52 100644
--- a/usr/src/pkgdefs/SUNWcsr/prototype_com
+++ b/usr/src/pkgdefs/SUNWcsr/prototype_com
@@ -349,6 +349,7 @@ d none lib/svc/method 0755 root bin
f none lib/svc/method/boot-archive 0555 root bin
f none lib/svc/method/boot-archive-update 0555 root bin
f none lib/svc/method/console-login 0555 root bin
+f none lib/svc/method/devices-audio 0555 root bin
f none lib/svc/method/devices-local 0555 root bin
f none lib/svc/method/fs-local 0555 root bin
f none lib/svc/method/fs-minimal 0555 root bin
@@ -531,6 +532,7 @@ d none var/svc/manifest/system 755 root sys
f manifest var/svc/manifest/system/boot-archive.xml 0444 root sys
f manifest var/svc/manifest/system/boot-archive-update.xml 0444 root sys
d none var/svc/manifest/system/device 755 root sys
+f manifest var/svc/manifest/system/device/devices-audio.xml 0444 root sys
f manifest var/svc/manifest/system/device/devices-local.xml 0444 root sys
f manifest var/svc/manifest/system/device/mpxio-upgrade.xml 0444 root sys
d none var/svc/manifest/system/filesystem 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWmdb/prototype_i386 b/usr/src/pkgdefs/SUNWmdb/prototype_i386
index fb1a898f13..09e244c11c 100644
--- a/usr/src/pkgdefs/SUNWmdb/prototype_i386
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_i386
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -57,7 +57,6 @@ f none usr/platform/i86xpv/lib/mdb/kvm/xpv_psm.so 555 root sys
f none usr/platform/i86xpv/lib/mdb/kvm/xpv_uppc.so 555 root sys
d none usr/lib/mdb/kvm/amd64 755 root sys
f none usr/lib/mdb/kvm/amd64/arp.so 555 root sys
-f none usr/lib/mdb/kvm/amd64/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpc.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpu.generic.so 555 root sys
f none usr/lib/mdb/kvm/amd64/cpu_ms.AuthenticAMD.15.so 555 root sys
@@ -91,7 +90,6 @@ f none usr/lib/mdb/kvm/amd64/uhci.so 555 root sys
f none usr/lib/mdb/kvm/amd64/usba.so 555 root sys
f none usr/lib/mdb/kvm/amd64/sockfs.so 555 root sys
f none usr/lib/mdb/kvm/arp.so 555 root sys
-f none usr/lib/mdb/kvm/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/cpc.so 555 root sys
f none usr/lib/mdb/kvm/cpu.generic.so 555 root sys
f none usr/lib/mdb/kvm/cpu_ms.AuthenticAMD.15.so 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdb/prototype_sparc b/usr/src/pkgdefs/SUNWmdb/prototype_sparc
index eae343b703..8724dadf21 100644
--- a/usr/src/pkgdefs/SUNWmdb/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWmdb/prototype_sparc
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -38,7 +38,6 @@ f none usr/bin/sparcv9/mdb 555 root bin
l none usr/bin/sparcv9/adb=../../../usr/bin/sparcv9/mdb
d none usr/lib/mdb/kvm/sparcv9 755 root sys
f none usr/lib/mdb/kvm/sparcv9/arp.so 555 root sys
-f none usr/lib/mdb/kvm/sparcv9/audiosup.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/cpc.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/crypto.so 555 root sys
f none usr/lib/mdb/kvm/sparcv9/genunix.so 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdbr/prototype_i386 b/usr/src/pkgdefs/SUNWmdbr/prototype_i386
index 662f4cb1e3..bc503a6419 100644
--- a/usr/src/pkgdefs/SUNWmdbr/prototype_i386
+++ b/usr/src/pkgdefs/SUNWmdbr/prototype_i386
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -27,7 +27,6 @@
d none kernel/kmdb/amd64 755 root sys
f none kernel/kmdb/amd64/arp 555 root sys
-f none kernel/kmdb/amd64/audiosup 555 root sys
f none kernel/kmdb/amd64/cpc 555 root sys
f none kernel/kmdb/amd64/cpu.generic 555 root sys
f none kernel/kmdb/amd64/cpu_ms.AuthenticAMD.15 555 root sys
@@ -60,7 +59,6 @@ f none kernel/kmdb/amd64/ufs 555 root sys
f none kernel/kmdb/amd64/uhci 555 root sys
f none kernel/kmdb/amd64/usba 555 root sys
f none kernel/kmdb/arp 555 root sys
-f none kernel/kmdb/audiosup 555 root sys
f none kernel/kmdb/cpc 555 root sys
f none kernel/kmdb/cpu.generic 555 root sys
f none kernel/kmdb/cpu_ms.AuthenticAMD.15 555 root sys
diff --git a/usr/src/pkgdefs/SUNWmdbr/prototype_sparc b/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
index 0e3e805552..d290db813d 100644
--- a/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWmdbr/prototype_sparc
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -27,7 +27,6 @@
#
d none kernel/kmdb/sparcv9 755 root sys
f none kernel/kmdb/sparcv9/arp 555 root sys
-f none kernel/kmdb/sparcv9/audiosup 555 root sys
f none kernel/kmdb/sparcv9/cpc 555 root sys
f none kernel/kmdb/sparcv9/crypto 555 root sys
f none kernel/kmdb/sparcv9/genunix 555 root sys
diff --git a/usr/src/pkgdefs/SUNWtsg/prototype_com b/usr/src/pkgdefs/SUNWtsg/prototype_com
index ce19bf8603..c1c0897e0f 100644
--- a/usr/src/pkgdefs/SUNWtsg/prototype_com
+++ b/usr/src/pkgdefs/SUNWtsg/prototype_com
@@ -19,11 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
# and their location on the development machine when building the package.
@@ -76,14 +74,17 @@ e devallocdefs etc/security/tsol/devalloc_defaults 0644 root sys
# Device clean scripts for the window system.
#
d none etc/security/lib 755 root sys
-f none etc/security/lib/audio_clean_wrapper 555 root sys
-s none etc/security/lib/audio_clean_wrapper.windowing=./audio_clean_wrapper
+s none etc/security/lib/audio_clean.windowing=./audio_clean
f none etc/security/lib/disk_clean 555 root sys
s none etc/security/lib/disk_clean.windowing=./disk_clean
s none etc/security/lib/st_clean.windowing=./st_clean
f none etc/security/lib/wdwmsg 555 root sys
f none etc/security/lib/wdwwrapper 555 root sys
#
+# Directory for saved audio settings
+#
+d none etc/security/audio 755 root sys
+#
# smf glue
d none lib 755 root bin
d none lib/svc 755 root bin
diff --git a/usr/src/pkgdefs/SUNWusb/prototype_i386 b/usr/src/pkgdefs/SUNWusb/prototype_i386
index 3f11cdcf2c..f838cda4e1 100644
--- a/usr/src/pkgdefs/SUNWusb/prototype_i386
+++ b/usr/src/pkgdefs/SUNWusb/prototype_i386
@@ -23,7 +23,6 @@
# Use is subject to license terms.
#
-
#
# This required package information file contains a list of package contents.
# The 'pkgmk' command uses this file to identify the contents of a package
@@ -48,7 +47,6 @@
#
# SUNWusb
#
-f none kernel/dacf/usb_ac_dacf 0755 root sys
f none kernel/drv/uhci 0755 root sys
f none kernel/drv/ohci 0755 root sys
f none kernel/drv/ehci 0755 root sys
@@ -72,7 +70,6 @@ f none kernel/strmod/usbkbm 0755 root sys
f none kernel/strmod/usbms 0755 root sys
f none kernel/strmod/usb_ah 0755 root sys
d none kernel/dacf/amd64 0755 root sys
-f none kernel/dacf/amd64/usb_ac_dacf 0755 root sys
d none kernel/drv/amd64 0755 root sys
f none kernel/drv/amd64/uhci 0755 root sys
f none kernel/drv/amd64/ohci 0755 root sys
diff --git a/usr/src/pkgdefs/SUNWusb/prototype_sparc b/usr/src/pkgdefs/SUNWusb/prototype_sparc
index 032085ff5a..afe299a46b 100644
--- a/usr/src/pkgdefs/SUNWusb/prototype_sparc
+++ b/usr/src/pkgdefs/SUNWusb/prototype_sparc
@@ -48,7 +48,6 @@
# SUNWusb
#
d none kernel/dacf/sparcv9 0755 root sys
-f none kernel/dacf/sparcv9/usb_ac_dacf 0755 root sys
d none kernel/drv/sparcv9 0755 root sys
f none kernel/drv/sparcv9/ohci 0755 root sys
f none kernel/drv/sparcv9/ehci 0755 root sys
diff --git a/usr/src/pkgdefs/etc/exception_list_sparc b/usr/src/pkgdefs/etc/exception_list_sparc
index ac70d0ee47..b78baab717 100644
--- a/usr/src/pkgdefs/etc/exception_list_sparc
+++ b/usr/src/pkgdefs/etc/exception_list_sparc
@@ -822,21 +822,6 @@ kernel/drv/usbskel.conf sparc
#
usr/include/sys/libdevid.h sparc
#
-# amd 8111 audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audio810 sparc
-kernel/drv/audio810.conf sparc
-#
-# High definition audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audiohd sparc
-kernel/drv/audiohd.conf sparc
-#
-# VIA VT823x audio driver doesn't ship in sparc platform.
-#
-kernel/drv/sparcv9/audiovia823x sparc
-kernel/drv/audiovia823x.conf sparc
-#
# The following files are installed in the proto area by the build of
# libprtdiag. libprtdiag contains interfaces which are all private.
# Only the shared object is shipped.
diff --git a/usr/src/tools/findunref/exception_list.open b/usr/src/tools/findunref/exception_list.open
index 8d70459071..1d0c7a43b5 100644
--- a/usr/src/tools/findunref/exception_list.open
+++ b/usr/src/tools/findunref/exception_list.open
@@ -20,7 +20,7 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
@@ -117,11 +117,6 @@
./src/*.ref
#
-# Ignore warlock-related goop; not used during a nightly.
-#
-./src/uts/sparc/amsrc*/main.c
-
-#
# Ignore internal test directories and test programs.
#
*/tests
@@ -250,7 +245,6 @@
./src/uts/sparc/si3124/Makefile
./src/uts/sparc/nv_sata/Makefile
./src/uts/sparc/ahci/Makefile
-./src/uts/sparc/audioixp/Makefile
#
# Ignore uttrack.c. It is provided as part of the standard
diff --git a/usr/src/tools/scripts/bfu.sh b/usr/src/tools/scripts/bfu.sh
index ee62f02801..58614feb6d 100644
--- a/usr/src/tools/scripts/bfu.sh
+++ b/usr/src/tools/scripts/bfu.sh
@@ -302,6 +302,7 @@ superfluous_nonglobal_zone_files="
kernel
lib/libmeta.so
lib/libmeta.so.1
+ lib/svc/method/devices-audio
lib/svc/method/fc-fabric
lib/svc/method/iscsi-initiator
lib/svc/method/npivconfig
@@ -379,6 +380,7 @@ superfluous_nonglobal_zone_files="
var/svc/manifest/platform/sun4u/sf880drd.xml
var/svc/manifest/platform/sun4v
var/svc/manifest/system/cvc.xml
+ var/svc/manifest/system/device/devices-audio.xml
var/svc/manifest/system/device/devices-fc-fabric.xml
var/svc/manifest/system/dumpadm.xml
var/svc/manifest/system/filesystem/rmvolmgr.xml
@@ -963,6 +965,33 @@ nfsmapid_cfg() {
}
#
+# Detect Boomer audio framework; used to emit a notice at the end of BFU
+# telling the user to run update_audio to complete the upgrade.
+#
+BOOMER_PRESENT_SYS=false
+BOOMER_PRESENT_BFU=false
+BOOMER_DRIVERS="audio austr"
+
+check_boomer_sys() {
+ typeset root=$1
+ typeset n2m=$root/etc/name_to_major
+ typeset drv
+
+ for drv in $BOOMER_DRIVERS; do
+ if ! grep -w $drv $n2m > /dev/null 2>&1; then
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+check_boomer_bfu() {
+ $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null |
+ grep devices-audio.xml > /dev/null 2>&1
+}
+
+#
# Define global variables
#
CALL_DEVID_DESTROY=""
@@ -1646,6 +1675,16 @@ smf_cleanup_vt() {
)
}
+smf_cleanup_boomer() {
+ (
+ smf_delete_manifest var/src/manifest/system/devices-audio.xml
+ cd $root
+ rm -f lib/svc/method/devices-audio
+
+ /tmp/bfubin/svccfg delete -f svc:/system/device/audio
+ )
+}
+
old_mfst_dir="var/svc/manifest.orig"
new_mfst_dir="var/svc/manifest"
@@ -1980,6 +2019,13 @@ smf_apply_conf () {
smf_cleanup_vt
fi
+ #
+ # Remove the Boomer audio service when BFUing to legacy audio bits
+ #
+ if ! check_boomer_bfu && [ $zone = global ]; then
+ smf_cleanup_boomer
+ fi
+
print "Disabling unneeded inetd.conf entries ..."
smf_inetd_disable
smf_tftp_reinstall
@@ -6679,7 +6725,6 @@ mondo_loop() {
$root/kernel/misc/consconfig \
$root/kernel/misc/dada \
$root/kernel/misc/des \
- $root/kernel/misc/diaudio \
$root/kernel/misc/fctl \
$root/kernel/misc/fssnap_if \
$root/kernel/misc/gld \
@@ -7035,6 +7080,64 @@ mondo_loop() {
fi
#
+ # Remove obsolete audio bits. The SADA modules are removed as
+ # no driver uses them any more. We don't ship certain device
+ # private headers anymore, as well as headers for the now
+ # obsolete (and never documented) legacy audio driver API.
+ #
+ rm -f $usr/include/sys/audiovar.h
+ rm -f $usr/include/sys/audio/am_src1.h
+ rm -f $usr/include/sys/audio/am_src2.h
+ rm -f $usr/include/sys/audio/audio1575.h
+ rm -f $usr/include/sys/audio/audio810.h
+ rm -f $usr/include/sys/audio/audioens.h
+ rm -f $usr/include/sys/audio/audiohd.h
+ rm -f $usr/include/sys/audio/audioixp.h
+ rm -f $usr/include/sys/audio/audiots.h
+ rm -f $usr/include/sys/audio/audiovia823x.h
+ rm -f $usr/include/sys/audio/audio_4231.h
+ rm -f $usr/include/sys/audio/audio_apm.h
+ rm -f $usr/include/sys/audio/audio_mixer.h
+ rm -f $usr/include/sys/audio/audio_src.h
+ rm -f $usr/include/sys/audio/audio_support.h
+ rm -f $usr/include/sys/audio/audio_trace.h
+ rm -f $root/kernel/misc/amsrc1
+ rm -f $root/kernel/misc/amsrc2
+ rm -f $root/kernel/misc/audiosup
+ rm -f $root/kernel/misc/diaudio
+ rm -f $root/kernel/misc/mixer
+ rm -f $root/kernel/misc/amd64/amsrc1
+ rm -f $root/kernel/misc/amd64/amsrc2
+ rm -f $root/kernel/misc/amd64/audiosup
+ rm -f $root/kernel/misc/amd64/diaudio
+ rm -f $root/kernel/misc/amd64/mixer
+ rm -f $root/kernel/misc/sparcv9/amsrc1
+ rm -f $root/kernel/misc/sparcv9/amsrc2
+ rm -f $root/kernel/misc/sparcv9/audiosup
+ rm -f $root/kernel/misc/sparcv9/diaudio
+ rm -f $root/kernel/misc/sparcv9/mixer
+
+ #
+ # Determine whether to emit update_audio notice or not
+ #
+ check_boomer_sys $root && BOOMER_PRESENT_SYS=true
+ check_boomer_bfu && BOOMER_PRESENT_BFU=true
+
+ # Cleanup audio devlinks when bfu'ing back to legacy audio bits.
+ # We also cleanup devlinks the first time when upgrading from legacy
+ # to Boomer bits in the update_audio script
+ #
+ if $BOOMER_PRESENT_SYS && ! $BOOMER_PRESENT_BFU; then
+ rm -f $root/dev/mixer*
+ rm -f $root/dev/sndstat*
+ rm -f $root/dev/audio*
+ rm -f $root/dev/dsp*
+ rm -f $root/dev/sound/*
+
+ touch $root/reconfigure
+ fi
+
+ #
# Diskless clients have already extracted /usr so don't delete this
# Non-global zones never extracts /usr so don't delete these
#
@@ -8220,6 +8323,17 @@ mondo_loop() {
$epilogue || print "WARNING: $epilogue failed with code $?"
fi
+ #
+ # Emit notice about upgrading the audio sub-system
+ #
+ if $BOOMER_PRESENT_BFU && ! $BOOMER_PRESENT_SYS; then
+ print
+ print "NOTICE: you must run the 'update_audio' script (from"
+ print "${GATE}/public/bin) to complete the upgrade of "
+ print "the audio sub-system"
+ print
+ fi
+
((seconds = SECONDS))
((min = seconds / 60))
((sec = seconds % 60))
diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files
index e39f3c4273..c94490f6e5 100644
--- a/usr/src/uts/common/Makefile.files
+++ b/usr/src/uts/common/Makefile.files
@@ -418,16 +418,31 @@ DCPC_OBJS += dcpc.o
#
IPP_OBJS += ippctl.o
+AUDIO_OBJS += audio_client.o audio_ddi.o audio_engine.o \
+ audio_fltdata.o audio_format.o audio_ctrl.o \
+ audio_grc3.o audio_output.o audio_input.o \
+ audio_oss.o audio_sun.o
+
+AUSTR_OBJS += austr.o
+
+AUDIOENS_OBJS += audioens.o
+
AUDIOVIA823X_OBJS += audiovia823x.o
+AUDIO1575_OBJS += audio1575.o
+
AUDIO810_OBJS += audio810.o
AUDIOHD_OBJS += audiohd.o
AUDIOIXP_OBJS += audioixp.o
+AUDIOPCI_OBJS += audiopci.o
+
AUDIOTS_OBJS += audiots.o
+AC97_OBJS += ac97.o ac97_ad.o ac97_alc.o ac97_cmi.o
+
CARDBUS_OBJS += cardbus.o cardbus_hp.o cardbus_cfg.o
CONSKBD_OBJS += conskbd.o
@@ -669,9 +684,7 @@ USBVC_OBJS += usbvc.o usbvc_v4l2.o
HIDPARSER_OBJS += hidparser.o
-USB_AC_OBJS += usb_ac.o
-
-USB_AC_DACF_OBJS += usb_ac_dacf.o
+USB_AC_OBJS += usb_ac.o audio_shim.o
USB_AS_OBJS += usb_as.o
@@ -1446,12 +1459,6 @@ KSSL_OBJS += kssl.o ksslioctl.o ksslapi.o ksslrec.o
# misc. modules
#
-AMSRC2_OBJS += am_src2.o
-
-AUDIO_SUP_OBJS += audio_support.o
-
-MIXER_OBJS += am_main.o am_ad.o am_ioctl.o
-
C2AUDIT_OBJS += adr.o audit.o audit_event.o audit_io.o \
audit_path.o audit_start.o audit_syscalls.o audit_token.o \
audit_mem.o audit_zone.o
diff --git a/usr/src/uts/common/Makefile.rules b/usr/src/uts/common/Makefile.rules
index c78620958b..0aa7d11769 100644
--- a/usr/src/uts/common/Makefile.rules
+++ b/usr/src/uts/common/Makefile.rules
@@ -532,31 +532,43 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/atu/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/impl/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/ac97/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audioens/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audio1575/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audio810/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/framework/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiohd/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/sada/mixer/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audioixp/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiopci/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiots/%.c
+ $(COMPILE.c) -o $@ $<
+ $(CTFCONVERT_O)
+
+$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/audio/drv/audiovia823x/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
@@ -1695,25 +1707,34 @@ $(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/ath/%.c
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/atu/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/impl/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/ac97/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audio1575/%.c
+ @($(LHEAD) $(LINT.c) $< $(LTAIL))
+
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audio810/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/mixer/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audioens/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/framework/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiohd/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audioixp/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiopci/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiots/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/audio/drv/audiovia823x/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
$(LINTS_DIR)/%.ln: $(UTSBASE)/common/io/bge/%.c
diff --git a/usr/src/uts/common/brand/lx/io/lx_audio.c b/usr/src/uts/common/brand/lx/io/lx_audio.c
index 8f80c61853..957e3de108 100644
--- a/usr/src/uts/common/brand/lx/io/lx_audio.c
+++ b/usr/src/uts/common/brand/lx/io/lx_audio.c
@@ -1086,30 +1086,14 @@ lxa_audio_getinfo(lxa_state_t *lxa_state, intptr_t arg, int mode)
static int
lxa_mixer_ai_from_lh(ldi_handle_t lh, audio_info_t *ai)
{
- am_control_t *actl;
- int rv, ch_count, junk;
+ int rv, junk;
ASSERT((lh != NULL) && (ai != NULL));
- /* get the number of channels for the underlying device */
- if ((rv = ldi_ioctl(lh, AUDIO_GET_NUM_CHS,
- (intptr_t)&ch_count, FKIOCTL, kcred, &junk)) != 0)
- return (rv);
-
- /* allocate the am_control_t structure */
- actl = kmem_alloc(AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count), KM_SLEEP);
-
/* get the device state and channel state */
- if ((rv = ldi_ioctl(lh, AUDIO_MIXERCTL_GETINFO,
- (intptr_t)actl, FKIOCTL, kcred, &junk)) != 0) {
- kmem_free(actl, AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count));
- return (rv);
- }
+ rv = ldi_ioctl(lh, AUDIO_GETINFO, (intptr_t)ai, FKIOCTL, kcred, &junk);
- /* return the audio_info structure */
- *ai = actl->dev_info;
- kmem_free(actl, AUDIO_MIXER_CTL_STRUCT_SIZE(ch_count));
- return (0);
+ return (rv);
}
static int
@@ -1199,18 +1183,8 @@ lxa_mixer_set_common(lxa_state_t *lxa_state, int cmd, intptr_t arg, int mode)
break;
}
- /*
- * we're going to cheat here. normally the
- * MIXERCTL_SETINFO ioctl take am_control_t and the
- * AUDIO_SETINFO takes an audio_info_t. as it turns
- * out the first element in a am_control_t is an
- * audio_info_t. also, the rest of the am_control_t
- * structure is normally ignored for a MIXERCTL_SETINFO
- * ioctl. so here we'll try to fall back to the code
- * that handles AUDIO_SETINFO ioctls.
- */
- return (lxa_audio_setinfo(lxa_state, AUDIO_MIXERCTL_SETINFO,
- (intptr_t)&ai, FKIOCTL));
+ return (lxa_audio_setinfo(lxa_state, AUDIO_SETINFO, (intptr_t)&ai,
+ FKIOCTL));
}
static int
@@ -1665,6 +1639,7 @@ lxa_read(dev_t dev, struct uio *uiop, cred_t *credp)
{
lxa_state_t *lxa_state;
minor_t minor = getminor(dev);
+ int rv;
/* get the handle for this device */
if (mod_hash_find(lxa_state_hash, (mod_hash_key_t)(uintptr_t)minor,
@@ -1683,7 +1658,13 @@ lxa_read(dev_t dev, struct uio *uiop, cred_t *credp)
return (EBADF);
/* pass the request on */
- return (ldi_read(lxa_state->lxas_idev_lh, uiop, kcred));
+ while (uiop->uio_resid != 0) {
+ rv = ldi_read(lxa_state->lxas_idev_lh, uiop, kcred);
+ if ((rv != 0) || (uiop->uio_fmode & (FNONBLOCK|FNDELAY))) {
+ break;
+ }
+ }
+ return (rv);
}
static int
@@ -1692,6 +1673,7 @@ lxa_write(dev_t dev, struct uio *uiop, cred_t *credp)
{
lxa_state_t *lxa_state;
minor_t minor = getminor(dev);
+ int rv;
/* get the handle for this device */
if (mod_hash_find(lxa_state_hash, (mod_hash_key_t)(uintptr_t)minor,
@@ -1710,7 +1692,13 @@ lxa_write(dev_t dev, struct uio *uiop, cred_t *credp)
return (EBADF);
/* pass the request on */
- return (ldi_write(lxa_state->lxas_odev_lh, uiop, kcred));
+ while (uiop->uio_resid != 0) {
+ rv = ldi_write(lxa_state->lxas_odev_lh, uiop, kcred);
+ if ((rv != 0) || (uiop->uio_fmode & (FNONBLOCK|FNDELAY))) {
+ break;
+ }
+ }
+ return (rv);
}
static int
diff --git a/usr/src/uts/common/io/audio/ac97/ac97.c b/usr/src/uts/common/io/audio/ac97/ac97.c
new file mode 100644
index 0000000000..783e1d1efe
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97.c
@@ -0,0 +1,1974 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+/*
+ * This is the initial value for many controls. This is
+ * a 75% level.
+ */
+#define INIT_VAL_MAIN ((75 << 8) | 75)
+#define INIT_VAL_ST ((75 << 8) | 75)
+#define INIT_VAL_MN 75
+#define INIT_IGAIN_ST ((50 << 8) | 50)
+#define INIT_IGAIN_MN 50
+
+/*
+ * In AC'97 v2.3, the registers are carved up as follows:
+ *
+ * Audio Base Registers: 0x00 - 0x26
+ * Audio Extended Registers: 0x28 - 0x3A
+ * Modem Extended Registers: 0x3C - 0x58
+ * Vendor Reserved Registers: 0x5A - 0x5F
+ * Page Registers: 0x60 - 0x6F
+ * Vendor Reserved Registers: 0x70 - 0x7A
+ * Vendor ID Registers: 0x7C - 0x7F
+ *
+ * We only need to shadow the normal audio registers by default.
+ * TBD: Handling of codec-specific registers in vendor reserved space.
+ * We cannot necessarily meaningfully shadow them.
+ */
+#define LAST_SHADOW_REG 0x3A
+#define NUM_SHADOW ((LAST_SHADOW_REG / sizeof (uint16_t)) + 1)
+#define SHADOW(ac, reg) ((ac)->shadow[((reg) / sizeof (uint16_t))])
+
+/*
+ * Record source selection.
+ */
+#define INPUT_MIC 0
+#define INPUT_CD 1
+#define INPUT_VIDEO 2
+#define INPUT_AUXIN 3
+#define INPUT_LINEIN 4
+#define INPUT_STEREOMIX 5
+#define INPUT_MONOMIX 6
+#define INPUT_PHONE 7
+
+static const char *ac97_insrcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_VIDEO,
+ AUDIO_PORT_AUX1IN,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_STEREOMIX,
+ AUDIO_PORT_MONOMIX,
+ AUDIO_PORT_PHONE,
+ NULL,
+};
+
+/*
+ * Per audio device state structure
+ */
+struct ac97 {
+ dev_info_t *dip; /* DDI device instance */
+ audio_dev_t *d;
+ void *private; /* drivers devc */
+ ac97_rd_t rd; /* drivers port read routine */
+ ac97_wr_t wr; /* drivers port write routine */
+ char name[128]; /* driver instance name */
+
+ uint16_t shadow[NUM_SHADOW];
+
+ boolean_t suspended; /* true if suspended */
+ kt_did_t resumer; /* resumer if suspended */
+ uint32_t flags;
+#define AC97_FLAG_AMPLIFIER (1 << 0) /* ext. amp on by default */
+#define AC97_FLAG_MICBOOST (1 << 1) /* micboost on by default */
+#define AC97_FLAG_SPEAKER (1 << 2) /* mono out on by default */
+
+#define AC97_FLAG_AUX_HP (1 << 4) /* possible uses for AUX_OUT */
+#define AC97_FLAG_AUX_4CH (1 << 5)
+#define AC97_FLAG_AUX_LVL (1 << 6)
+#define AC97_FLAG_SPEAKER_OK (1 << 7) /* expose mono out */
+#define AC97_FLAG_NO_HEADPHONE (1 << 8) /* do not expose headphone */
+#define AC97_FLAG_NO_CDROM (1 << 9) /* do not expose CDROM */
+#define AC97_FLAG_NO_PHONE (1 << 10) /* do not expose phone in */
+#define AC97_FLAG_NO_VIDEO (1 << 11) /* do not expose video in */
+#define AC97_FLAG_NO_AUXIN (1 << 12) /* do not expose aux in */
+#define AC97_FLAG_NO_AUXOUT (1 << 13) /* do not expose aux out */
+#define AC97_FLAG_NO_LINEIN (1 << 14) /* do not expose linein */
+#define AC97_FLAG_NO_MIC (1 << 15) /* do not expose mic */
+
+ uint32_t vid; /* Vendor ID for CODEC */
+ uint16_t caps;
+
+ void (*codec_init)(ac97_t *);
+ void (*codec_reset)(ac97_t *);
+
+ kmutex_t ac_lock;
+ list_t ctrls;
+
+ uint64_t inputs;
+};
+
+struct modlmisc ac97_modlmisc = {
+ &mod_miscops,
+ "Audio Codec '97 Support"
+};
+
+struct modlinkage ac97_modlinkage = {
+ MODREV_1,
+ { &ac97_modlmisc, NULL }
+};
+
+int
+_init(void)
+{
+ return (mod_install(&ac97_modlinkage));
+}
+
+int
+_fini(void)
+{
+ return (mod_install(&ac97_modlinkage));
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&ac97_modlinkage, modinfop));
+}
+
+
+#if 0
+/*
+ * The following table, and the code to scale it, works in percentages.
+ * This may be convenient for humans, but it would be faster if the table
+ * entries were rescaled to 256. (Division by 100 is painful. Divison by
+ * 256 is trivial.)
+ */
+static const char ac97_val_cvt[101] = {
+ 0, 0, 3, 7, 10, 13, 16, 19,
+ 21, 23, 26, 28, 30, 32, 34, 35,
+ 37, 39, 40, 42, 43, 45, 46, 47,
+ 49, 50, 51, 52, 53, 55, 56, 57,
+ 58, 59, 60, 61, 62, 63, 64, 65,
+ 65, 66, 67, 68, 69, 70, 70, 71,
+ 72, 73, 73, 74, 75, 75, 76, 77,
+ 77, 78, 79, 79, 80, 81, 81, 82,
+ 82, 83, 84, 84, 85, 85, 86, 86,
+ 87, 87, 88, 88, 89, 89, 90, 90,
+ 91, 91, 92, 92, 93, 93, 94, 94,
+ 95, 95, 96, 96, 96, 97, 97, 98,
+ 98, 98, 99, 99, 100
+};
+#endif
+
+/*
+ * This code has three main functions. All related to converting
+ * a standard controls value to hardware specific values. All
+ * Standard passed in values are 0-100 as in percent.
+ *
+ * First it takes a value passed in as volume or gain and
+ * converts to attenuation or gain correspondingly. Since this is
+ * what the hardware needs.
+ *
+ * Second it adjusts the value passed in to compensate for the none
+ * linear nature of human hearing, sound loudness, sensitivity. It
+ * converts the linear value to a logarithmic value. This gives users
+ * the perception that the controls are linear.
+ *
+ * Third it converts the value to the number of bits that a hardware
+ * register needs to be.
+ *
+ * On input the following are supplied:
+ * left - The gain or volume in percent for left channel.
+ * right - The gain or volume in percent for right channel.
+ * bits - The number of bits the hardware needs. If this value
+ * is negetive then right and left are gain else they
+ * are volume.
+ *
+ * On return the following is returned:
+ *
+ * bit: 15 8 7 0
+ * ----------------------------------
+ * | left channel | right channel |
+ * ----------------------------------
+ * ( each channel is "bits" wide )
+ */
+uint16_t
+ac97_val_scale(int left, int right, int bits)
+{
+ ASSERT(left <= 100);
+ ASSERT(right <= 100);
+
+ if (bits < 0) { /* This is gain not ATTN */
+ left = 100 - left;
+ right = 100 - right;
+ bits = -bits;
+ }
+
+#if 0
+ /*
+ * 4Front's code used a table to smooth the transitions
+ * somewhat. Without this change, the volume levels adjusted
+ * near the top of the table seem to have less effect. Its
+ * hard to notice a volume change from 100 to 95, without the
+ * val_cvt table, for example. However, the scaling has an
+ * ugly side effect, which is at the default volumes (75%), we
+ * wind up having the level set too high for some
+ * codec/amplifier combinations.
+ *
+ * Legacy Sun code didn't have this table, and some
+ * qualitative testing shows that it isn't really necessary.
+ */
+ left = 100 - ac97_val_cvt[left];
+ right = 100 - ac97_val_cvt[right];
+#else
+ left = 100 - left;
+ right = 100 - right;
+#endif
+ return (((left * ((1 << bits) - 1) / 100) << 8) |
+ (right * ((1 << bits) - 1) / 100));
+}
+
+uint16_t
+ac97_mono_scale(int val, int bits)
+{
+ ASSERT(val <= 100);
+
+ if (bits < 0) { /* This is gain not ATTN */
+ bits = -bits;
+ } else {
+ val = 100 - val; /* convert to attenuation */
+ }
+ return (val * ((1 << bits) - 1) / 100);
+}
+
+
+audio_dev_t *
+ac97_get_dev(ac97_t *ac)
+{
+ return (ac->d);
+}
+
+int
+ac97_get_prop(ac97_t *ac, char *prop, int defval)
+{
+ int rv;
+
+ rv = ddi_prop_get_int(DDI_DEV_T_ANY, ac->dip, DDI_PROP_DONTPASS,
+ prop, defval);
+ return (rv);
+}
+
+/*
+ * This calls the Hardware drivers access write routine
+ * to write to a device register.
+ */
+#define WR(r, v) (ac)->wr((ac)->private, (r), (v))
+#define RD(r) (ac)->rd((ac)->private, (r))
+
+/*
+ * Probe routines for optional controls
+ *
+ * These routines each probe one aspect of hardware
+ * for controls presents.
+ * If the control is present these routines should
+ * return none zero.
+ */
+
+/*
+ * Is the named register implemented? This routine saves and
+ * restores the original value, and relies on the fact that the
+ * registers (if implemented) will have at least one bit that acts
+ * as a mute (0x8000, 0x8080), so we can probe "silently".
+ *
+ * The probe logic is suggested by the AC'97 2.3 spec. (Unimplemented
+ * registers are required to return zero to facilitate this sort of
+ * detection.)
+ */
+static int
+ac97_probe_reg(ac97_t *ac, uint8_t reg)
+{
+ uint16_t val;
+ int rv = 0;
+
+ /* get the original value */
+ val = RD(reg);
+ WR(reg, 0xffff);
+ if (RD(reg) != 0) {
+ rv = 1;
+ }
+ /* restore the original value */
+ WR(reg, val);
+ return (rv);
+}
+
+/*
+ * Does this device have bass/treble controls?
+ */
+static int
+ac97_probe_tone(ac97_t *ac)
+{
+ /* Bass/Treble contols present */
+ if (ac->caps & RR_BASS_TREBLE)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * If there is a loudness switch?
+ */
+static int
+ac97_probe_loud(ac97_t *ac)
+{
+ /* loudness contol present */
+ if (ac->caps & RR_LOUDNESS_SUPPORT)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a mono-mic input volume control?
+ */
+static int
+ac97_probe_mmic(ac97_t *ac)
+{
+ /* mono mic present */
+ if (ac->caps & RR_DEDICATED_MIC)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a simulated stereo switch?
+ */
+static int
+ac97_probe_stsim(ac97_t *ac)
+{
+ /* simulated stereocontol present */
+ if (ac->caps & RR_PSEUDO_STEREO)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a PC beeper input volume control?
+ */
+static int
+ac97_probe_pcbeep(ac97_t *ac)
+{
+ return (ac97_probe_reg(ac, AC97_PC_BEEP_REGISTER));
+}
+
+/*
+ * Does this device have AUX output port volume control?
+ */
+static int
+ac97_probe_rear(ac97_t *ac)
+{
+ if (ac->flags & AC97_FLAG_AUX_4CH)
+ return (1);
+ else
+ return (0);
+
+}
+
+/*
+ * Does this device have a mic?
+ */
+static int
+ac97_probe_mic(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_MIC)) &&
+ (ac97_probe_reg(ac, AC97_MIC_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_MIC);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * If this device has an AUX output port is it used for headphones?
+ */
+static int
+ac97_probe_headphone(ac97_t *ac)
+{
+ /* headphone control present */
+ if ((ac->flags & AC97_FLAG_AUX_HP) &&
+ !(ac->flags & AC97_FLAG_NO_HEADPHONE)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have AUX output port volume control?
+ */
+static int
+ac97_probe_auxout(ac97_t *ac)
+{
+ /* ALT PCM control present */
+ if ((ac->flags & AC97_FLAG_AUX_LVL) &&
+ !(ac->flags & AC97_FLAG_NO_AUXOUT)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have an AUX input port volume control?
+ */
+static int
+ac97_probe_auxin(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_AUXIN)) &&
+ (ac97_probe_reg(ac, AC97_AUX_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_AUXIN);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a phone input port with a volume control?
+ */
+static int
+ac97_probe_phone(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_PHONE)) &&
+ (ac97_probe_reg(ac, AC97_PHONE_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_PHONE);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a mono output port with volume control?
+ */
+static int
+ac97_probe_mono(ac97_t *ac)
+{
+ if (!(ac->flags & AC97_FLAG_SPEAKER_OK)) {
+ return (0);
+ }
+ if (ac97_probe_reg(ac, AC97_MONO_MASTER_VOLUME_REGISTER)) {
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a line input port with volume control?
+ */
+static int
+ac97_probe_linein(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_LINEIN)) &&
+ (ac97_probe_reg(ac, AC97_LINE_IN_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_LINEIN);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a cdrom input port with volume control?
+ */
+static int
+ac97_probe_cdrom(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_CDROM)) &&
+ (ac97_probe_reg(ac, AC97_CD_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_CD);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a video input port with volume control?
+ */
+static int
+ac97_probe_video(ac97_t *ac)
+{
+ if ((!(ac->flags & AC97_FLAG_NO_VIDEO)) &&
+ (ac97_probe_reg(ac, AC97_VIDEO_VOLUME_REGISTER))) {
+ ac->inputs |= (1U << INPUT_VIDEO);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Does this device have a 3D sound enhancement?
+ */
+static int
+ac97_probe_3d(ac97_t *ac)
+{
+ /* 3D control present */
+ if (ac->caps & RR_3D_STEREO_ENHANCE_MASK)
+ return (1);
+ else
+ return (0);
+}
+
+static int
+ac97_probe_3d_impl(ac97_t *ac, uint16_t mask)
+{
+ int rv = 0;
+ uint16_t val;
+
+ if ((ac->caps & RR_3D_STEREO_ENHANCE_MASK) == 0)
+ return (0);
+
+ /* get the original value */
+ val = RD(AC97_THREE_D_CONTROL_REGISTER);
+ WR(AC97_THREE_D_CONTROL_REGISTER, mask);
+ if ((RD(AC97_THREE_D_CONTROL_REGISTER) & mask) != 0) {
+ rv = 1;
+ }
+ /* restore the original value */
+ WR(AC97_THREE_D_CONTROL_REGISTER, val);
+ return (rv);
+}
+
+static int
+ac97_probe_3d_depth(ac97_t *ac)
+{
+ return (ac97_probe_3d_impl(ac, TDCR_DEPTH_MASK));
+}
+
+static int
+ac97_probe_3d_center(ac97_t *ac)
+{
+ return (ac97_probe_3d_impl(ac, TDCR_CENTER_MASK));
+}
+
+/*
+ * Does this device have a center output port with volume control?
+ */
+static int
+ac97_probe_center(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* center volume present */
+ if (val & EAR_CDAC)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Does this device have a LFE (Sub-woofer) output port with
+ * a volume control?
+ */
+static int
+ac97_probe_lfe(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* We have LFE control */
+ if (val & EAR_LDAC)
+ return (1);
+ else
+ return (0);
+
+}
+
+/*
+ * Are we a multichannel codec?
+ */
+static int
+ac97_probe_front(ac97_t *ac)
+{
+ uint16_t val;
+
+ val = RD(AC97_EXTENDED_AUDIO_REGISTER);
+
+ /* Are any of the Surround, Center, or LFE dacs present? */
+ if (val & (EAR_SDAC | EAR_CDAC | EAR_LDAC))
+ return (1);
+ else
+ return (0);
+}
+
+static int
+ac97_probe_lineout(ac97_t *ac)
+{
+ /* if not multichannel, then use "lineout" instead of "front" label */
+ return (!ac97_probe_front(ac));
+}
+
+static const char *ac97_mics[] = {
+ AUDIO_PORT_MIC1,
+ AUDIO_PORT_MIC2,
+ NULL,
+};
+
+static const char *ac97_monos[] = {
+ AUDIO_PORT_MONOMIX,
+ AUDIO_PORT_MIC,
+ NULL
+};
+
+/*
+ * This calls the Hardware drivers access write routine
+ * to write to a device register.
+ */
+void
+ac97_wr(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
+ SHADOW(ac, reg) = val;
+ }
+
+ /*
+ * Don't touch hardware _unless_ if we are suspended, unless we
+ * are in the process of resuming.
+ */
+ if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
+ ac->wr(ac->private, reg, val);
+ }
+}
+
+/*
+ * This obtains the shadowed value of a register. If the register is
+ * out of range, zero is returned.
+ *
+ * To read a hardware register, use the RD() macro above.
+ */
+uint16_t
+ac97_rd(ac97_t *ac, uint8_t reg)
+{
+ if ((reg < LAST_SHADOW_REG) && (reg > 0)) {
+ return (SHADOW(ac, reg));
+ }
+ if ((!ac->suspended) || (ac->resumer == ddi_get_kt_did())) {
+ return (ac->rd(ac->private, reg));
+ }
+ return (0);
+}
+
+/*
+ * This calls the hardware driver's access read/write routine
+ * to set bits in a device register.
+ */
+void
+ac97_set(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ ac97_wr(ac, reg, ac->rd(ac->private, reg) | val);
+}
+
+/*
+ * This calls the hardware driver's access read/write routine
+ * to clear bits in a device register.
+ */
+void
+ac97_clr(ac97_t *ac, uint8_t reg, uint16_t val)
+{
+ ac97_wr(ac, reg, ac->rd(ac->private, reg) & ~val);
+}
+
+/*
+ * Look for a control attached to this device based
+ * on its control number.
+ *
+ * If this control number is found the per controls state
+ * structure is returned.
+ */
+ac97_ctrl_t *
+ac97_control_find(ac97_t *ac, const char *name)
+{
+ ac97_ctrl_t *ctrl;
+ list_t *l = &ac->ctrls;
+
+ /* Validate that ctrlnum is real and usable */
+ mutex_enter(&ac->ac_lock);
+ for (ctrl = list_head(l); ctrl; ctrl = list_next(l, ctrl)) {
+ if (strcmp(ctrl->actrl_name, name) == 0) {
+ mutex_exit(&ac->ac_lock);
+ return (ctrl);
+ }
+ }
+ mutex_exit(&ac->ac_lock);
+ return (NULL);
+}
+
+/*
+ * This will update all the codec registers from the shadow table.
+ */
+static void
+ac97_restore(ac97_t *ac)
+{
+ /*
+ * If we are restoring previous settings, just reload from the
+ * shadowed settings.
+ */
+ for (int i = 2; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
+ ac->wr(ac->private, i, SHADOW(ac, i));
+ }
+
+ /*
+ * Then go and do the controls. This is important because some of
+ * the controls might use registers that aren't shadowed. Doing it
+ * a second time also may help guarantee that it all works.
+ */
+ for (ac97_ctrl_t *ctrl = list_head(&ac->ctrls); ctrl;
+ ctrl = list_next(&ac->ctrls, ctrl)) {
+ ctrl->actrl_write_fn(ctrl, ctrl->actrl_value);
+ }
+}
+
+/*
+ * This will update all the hardware controls to the initial values at
+ * start of day.
+ */
+static void
+ac97_init_values(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ mutex_enter(&ac->ac_lock);
+ for (ctrl = list_head(&ac->ctrls); ctrl;
+ ctrl = list_next(&ac->ctrls, ctrl)) {
+ ctrl->actrl_value = ctrl->actrl_initval;
+ ctrl->actrl_write_fn(ctrl, ctrl->actrl_initval);
+ }
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Select the input source for recording. This is the set routine
+ * for the control AUDIO_CONTROL_INPUTS.
+ */
+static void
+ac97_insrc_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t set_val;
+
+ set_val = ddi_ffs(value & 0xffff);
+ if ((set_val > 0) && (set_val <= 8)) {
+ set_val--;
+ ac97_wr(ac, AC97_RECORD_SELECT_CTRL_REGISTER,
+ set_val | (set_val << 8));
+ }
+}
+
+static void
+ac97_gpr_toggle(ac97_ctrl_t *ctrl, int bit, uint64_t onoff)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t v;
+
+ v = SHADOW(ac, AC97_GENERAL_PURPOSE_REGISTER);
+ if (onoff) {
+ v |= bit;
+ } else {
+ v &= ~bit;
+ }
+ ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, v);
+}
+
+static void
+ac97_3donoff_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_3D_STEREO_ENHANCE, value);
+}
+
+static void
+ac97_loudness_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_BASS_BOOST, value);
+}
+
+static void
+ac97_loopback_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_LPBK, value);
+}
+
+/*
+ * This will set simulated stereo control to on or off.
+ */
+static void
+ac97_stsim_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_ST, value);
+}
+
+/*
+ * This will set mic select control to mic1=0 or mic2=1.
+ */
+static void
+ac97_selmic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_MS_MIC2, value & 2);
+}
+
+/*
+ * This will set mono source select control to mix=0 or mic=1.
+ */
+static void
+ac97_monosrc_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_gpr_toggle(ctrl, GPR_MONO_MIC_IN, value & 2);
+}
+
+static void
+ac97_stereo_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t left, right;
+ uint16_t mute;
+
+ left = (value >> 8) & 0xff;
+ right = value & 0xff;
+ mute = value ? 0 : ctrl->actrl_muteable;
+
+ ac97_wr(ac, reg, ac97_val_scale(left, right, ctrl->actrl_bits) | mute);
+}
+
+static void
+ac97_mono_set(ac97_ctrl_t *ctrl, uint64_t value, uint8_t reg, int shift)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t val;
+ uint16_t mute, v;
+ uint16_t mask;
+
+ val = value & 0xff;
+ mute = val ? 0 : ctrl->actrl_muteable;
+
+ mask = ctrl->actrl_muteable |
+ (((1 << ABS(ctrl->actrl_bits)) - 1) << shift);
+
+ v = SHADOW(ac, reg);
+ v &= ~mask; /* clear all of our bits, preserve others */
+
+ /* now set the mute bit, and volume bits */
+ v |= mute;
+ v |= (ac97_mono_scale(val, ctrl->actrl_bits) << shift);
+
+ ac97_wr(ac, reg, v);
+}
+
+static void
+ac97_master_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ value = value | (value << 8);
+ ac97_stereo_set(ctrl, value, AC97_PCM_OUT_VOLUME_REGISTER);
+}
+
+static void
+ac97_lineout_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_MASTER_VOLUME_REGISTER);
+}
+
+static void
+ac97_surround_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_EXTENDED_LRS_VOLUME_REGISTER);
+}
+
+static void
+ac97_aux1out_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
+}
+
+static void
+ac97_headphone_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_HEADPHONE_VOLUME_REGISTER);
+}
+
+static void
+ac97_cd_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_CD_VOLUME_REGISTER);
+}
+
+static void
+ac97_video_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_VIDEO_VOLUME_REGISTER);
+}
+
+static void
+ac97_auxin_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_AUX_VOLUME_REGISTER);
+}
+
+static void
+ac97_linein_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_LINE_IN_VOLUME_REGISTER);
+}
+
+/*
+ * This will set mono mic gain control.
+ */
+static void
+ac97_monomic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_RECORD_GAIN_MIC_REGISTER, 0);
+}
+
+static void
+ac97_phone_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_PHONE_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_mic_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MIC_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_speaker_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MONO_MASTER_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_pcbeep_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_PC_BEEP_REGISTER, 1);
+}
+
+static void
+ac97_recgain_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_stereo_set(ctrl, value, AC97_RECORD_GAIN_REGISTER);
+}
+
+static void
+ac97_center_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
+}
+
+static void
+ac97_lfe_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 8);
+}
+
+static void
+ac97_bass_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 8);
+}
+
+static void
+ac97_treble_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_mono_set(ctrl, value, AC97_MASTER_TONE_CONTROL_REGISTER, 0);
+}
+
+static void
+ac97_3ddepth_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ /*
+ * XXX: This is all wrong... 3D depth/center cannot necessarily
+ * be scaled, because the technology in use may vary. We
+ * need more information about each of the options available
+ * to do the right thing.
+ */
+ ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 0);
+}
+
+static void
+ac97_3dcent_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ /*
+ * XXX: This is all wrong... 3D depth/center cannot necessarily
+ * be scaled, because the technology in use may vary. We
+ * need more information about each of the options available
+ * to do the right thing.
+ */
+ ac97_mono_set(ctrl, value, AC97_THREE_D_CONTROL_REGISTER, 8);
+}
+
+static void
+ac97_micboost_set(ac97_ctrl_t *ctrl, uint64_t value)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint16_t v;
+
+ v = SHADOW(ac, AC97_MIC_VOLUME_REGISTER);
+ if (value) {
+ v |= MICVR_20dB_BOOST;
+ } else {
+ v &= ~MICVR_20dB_BOOST;
+ }
+ ac97_wr(ac, AC97_MIC_VOLUME_REGISTER, v);
+}
+
+/*
+ * This will return the stored value for any control that has been set.
+ * Note this does not return the actual hardware value from a port. But
+ * instead returns the cached value from the last write to the hardware
+ * port.
+ *
+ * arg - This control structure for this control.
+ * value - This is a pointer to the location to put the
+ * controls value.
+ *
+ * On success zero is returned.
+ */
+static int
+ac97_control_get(void *arg, uint64_t *value)
+{
+ ac97_ctrl_t *ctrl = arg;
+ ac97_t *ac = ctrl->actrl_ac97;
+
+ mutex_enter(&ac->ac_lock);
+ *value = ctrl->actrl_value;
+ mutex_exit(&ac->ac_lock);
+
+ return (0);
+}
+
+static int
+ac97_control_set(void *arg, uint64_t value)
+{
+ ac97_ctrl_t *ctrl = arg;
+ ac97_t *ac = ctrl->actrl_ac97;
+ uint8_t v1, v2;
+
+ /* a bit of quick checking */
+ switch (ctrl->actrl_type) {
+ case AUDIO_CTRL_TYPE_STEREO:
+ v1 = (value >> 8) & 0xff;
+ v2 = value & 0xff;
+ if ((v1 < ctrl->actrl_minval) || (v1 > ctrl->actrl_maxval) ||
+ (v2 < ctrl->actrl_minval) || (v2 > ctrl->actrl_maxval) ||
+ (value > 0xffff)) {
+ return (EINVAL);
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_ENUM:
+ if ((value & ~ctrl->actrl_minval) !=
+ (ctrl->actrl_maxval & ~ctrl->actrl_minval)) {
+ return (EINVAL);
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ if ((value < ctrl->actrl_minval) ||
+ (value > ctrl->actrl_maxval)) {
+ return (EINVAL);
+ }
+ break;
+ }
+
+ mutex_enter(&ac->ac_lock);
+ ctrl->actrl_value = value;
+ ctrl->actrl_write_fn(ctrl, value);
+ mutex_exit(&ac->ac_lock);
+
+ return (0);
+}
+
+/*
+ * This simply sets a flag to block calls to the underlying
+ * hardware driver to get or set hardware controls. This is usually
+ * called just before a power down of devices. Once this gets called any
+ * calls to set controls will not touch the real hardware. But
+ * since all control updates are always saved in soft registers it
+ * is a simple mater to update the hardware with the latest values
+ * on resume which also unblocks calls to the hardware controls.
+ */
+void
+ac97_suspend(ac97_t *ac)
+{
+ mutex_enter(&ac->ac_lock);
+
+ /* This will prevent any new operations from starting! */
+ ac->suspended = B_TRUE;
+ ac->resumer = 0;
+
+ /* XXX - should we powerdown codec's here?? */
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Reset the analog codec hardware
+ *
+ * Reset all analog AC97 hardware, input ADC's, output DAC's and MIXER.
+ * Wait a resonable amount of time for hardware to become ready.
+ */
+static void
+ac97_analog_reset(ac97_t *ac)
+{
+ uint16_t tmp;
+ int wait = 1000; /* delay for up to 1s */
+
+ /* Clear stale data and resync register accesses */
+ tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
+
+ /* reset the codec */
+ WR(AC97_RESET_REGISTER, 0);
+ tmp = RD(AC97_RESET_REGISTER);
+
+ /* power up */
+ WR(AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
+
+ /* Wait for ADC/DAC/MIXER to become ready */
+ while (wait--) {
+ /* 1 msec delay */
+ drv_usecwait(1000);
+
+ /* If all ready - end delay */
+ tmp = RD(AC97_POWERDOWN_CTRL_STAT_REGISTER);
+ SHADOW(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER) = tmp;
+ if ((tmp & PCSR_POWERD_UP) == PCSR_POWERD_UP) {
+ return;
+ }
+ }
+
+ audio_dev_warn(ac->d, "AC'97 analog powerup timed out");
+}
+
+/*
+ * This is the internal hardware reset routine.
+ * It has no locking and we must be locked before it is
+ * called!
+ *
+ * This will reset and re-initialize the device.
+ * It has two modes of operation that affect how it handles
+ * all controls.
+ *
+ * It re-initializes the device and reloads values with
+ * last updated versions.
+ */
+static void
+ac97_hw_reset(ac97_t *ac)
+{
+ /*
+ * Fully Power up the device
+ */
+ if (ac->flags & AC97_FLAG_AMPLIFIER) {
+ /* power up - external amp powerd up */
+ ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, 0);
+ } else {
+ /* power up - external amp powered down */
+ ac97_wr(ac, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_EAPD);
+ }
+
+ ac97_wr(ac, AC97_GENERAL_PURPOSE_REGISTER, 0);
+
+ switch (ac->vid) {
+ case AC97_CODEC_STAC9708:
+#if 0
+ /* non-inverted phase */
+ /* ac97_rd(ac, AC97_VENDOR_REGISTER_11) & ~0x8); */
+#endif
+ WR(AC97_VENDOR_REGISTER_11, 8);
+ break;
+
+ case AC97_CODEC_EM28028:
+ ac97_wr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
+ (ac97_rd(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER) &
+ ~3800) | 0xE0);
+ break;
+
+ case AC97_CODEC_AD1886:
+ /* jack sense */
+ WR(AC97_VENDOR_REGISTER_13,
+ (RD(AC97_VENDOR_REGISTER_13) & ~0xEF) | 0x10);
+ break;
+
+ case AC97_CODEC_AD1888:
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+#if 0
+ /* GED: This looks fishy to me, so I'm nuking it for now */
+ /* headphone/aux volume (?) */
+ ac97_wr(ac, AC97_HEADPHONE_VOLUME_REGISTER, 0x0808);
+#endif
+ break;
+
+ case AC97_CODEC_AD1980:
+#if 0
+ /* set jacksense to mute line if headphone is plugged */
+ WR(AC97_VENDOR_REGISTER_13,
+ (RD(AC97_VENDOR_REGISTER_13) & ~0xe00) | 0x400);
+#endif
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+ break;
+
+ case AC97_CODEC_AD1985:
+ WR(AC97_VENDOR_REGISTER_15, 0xC420);
+ break;
+
+ case AC97_CODEC_WM9704:
+ /* enable I2S */
+ WR(AC97_VENDOR_REGISTER_01, RD(AC97_VENDOR_REGISTER_01) | 0x80);
+ break;
+
+ case AC97_CODEC_VT1612A:
+ case AC97_CODEC_VT1617A:
+ case AC97_CODEC_VT1616:
+ /* Turn off Center, Surround, and LFE DACs */
+ ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER,
+ EASCR_PRI | EASCR_PRJ | EASCR_PRK);
+ WR(AC97_VENDOR_REGISTER_01, 0x0230);
+ break;
+
+ case AC97_CODEC_YMF753:
+ /* set TX8 + 3AWE */
+ WR(AC97_VENDOR_REGISTER_07, RD(AC97_VENDOR_REGISTER_07) | 0x9);
+ break;
+
+ default:
+ break;
+ }
+
+ /* call codec specific reset hook */
+ if (ac->codec_reset != NULL) {
+ ac->codec_reset(ac);
+ }
+
+ /* Turn off variable sampling rate support */
+ ac97_clr(ac, AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
+}
+
+/*
+ * This will reset and re-initialize the device.
+ * It has two modes of operation that affect how it handles
+ * all controls.
+ *
+ * It re-initializes the device and then can either reset
+ * all controls back to their initial values or it can
+ * re-load all controls with their last updated values.
+ *
+ * initval - If this is none zero then all controls will
+ * be restored to their initial values.
+ */
+void
+ac97_reset(ac97_t *ac)
+{
+ /* If we are about to suspend so no point in going on */
+ mutex_enter(&ac->ac_lock);
+ if (ac->suspended) {
+ mutex_exit(&ac->ac_lock);
+ return;
+ }
+ ac97_analog_reset(ac);
+ ac97_hw_reset(ac);
+ ac97_restore(ac);
+
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * Given the need to resume the hardware this reloads the base hardware
+ * and then takes the stored values for each control and sends them
+ * to the hardware again.
+ */
+void
+ac97_resume(ac97_t *ac)
+{
+
+ /*
+ * This should only be called when already suspended.
+ * this takes us out of suspend state after it brings the
+ * controls back to life.
+ */
+ ASSERT(ac->suspended);
+ mutex_enter(&ac->ac_lock);
+ ac->resumer = ddi_get_kt_did();
+
+ /* We simply call reset since the operation is the same */
+ ac97_analog_reset(ac);
+ ac97_hw_reset(ac);
+ ac97_restore(ac);
+
+ ac->resumer = 0;
+ ac->suspended = B_FALSE;
+ mutex_exit(&ac->ac_lock);
+}
+
+
+/*
+ * Register a control -- if it fails, it will generate a message to
+ * syslog, but the driver muddles on. (Failure to register a control
+ * should never occur, and is generally benign if it happens.)
+ */
+void
+ac97_alloc_control(ac97_t *ac, ac97_ctrl_probe_t *cpt)
+{
+ ac97_ctrl_t *ctrl;
+ audio_ctrl_desc_t ctrl_des;
+
+ ASSERT(ac);
+ ASSERT(ac->d);
+
+ ctrl = kmem_zalloc(sizeof (ac97_ctrl_t), KM_SLEEP);
+
+ bzero(&ctrl_des, sizeof (ctrl_des));
+ ctrl_des.acd_name = cpt->cp_name;
+ ctrl_des.acd_minvalue = cpt->cp_minval;
+ ctrl_des.acd_maxvalue = cpt->cp_maxval;
+ ctrl_des.acd_type = cpt->cp_type;
+ ctrl_des.acd_flags = cpt->cp_flags;
+ if (cpt->cp_enum) {
+ for (int e = 0; e < 64; e++) {
+ if (cpt->cp_enum[e] == NULL)
+ break;
+ ctrl_des.acd_enum[e] = cpt->cp_enum[e];
+ }
+ }
+
+ ctrl->actrl_ac97 = ac;
+ /*
+ * Warning for extended controls this field gets changed
+ * by audio_dev_add_control() to be a unique value.
+ */
+ ctrl->actrl_minval = cpt->cp_minval;
+ ctrl->actrl_maxval = cpt->cp_maxval;
+ ctrl->actrl_initval = cpt->cp_initval;
+ ctrl->actrl_muteable = cpt->cp_muteable;
+ ctrl->actrl_write_fn = cpt->cp_write_fn;
+ ctrl->actrl_bits = cpt->cp_bits;
+ ctrl->actrl_type = cpt->cp_type;
+ ctrl->actrl_name = cpt->cp_name;
+
+ /* Register control with framework */
+ ctrl->actrl_ctrl = audio_dev_add_control(ac->d, &ctrl_des,
+ ac97_control_get, ac97_control_set, ctrl);
+ if (!ctrl->actrl_ctrl) {
+ audio_dev_warn(ac->d, "AC97 %s alloc failed", cpt->cp_name);
+ kmem_free(ctrl, sizeof (ac97_ctrl_t));
+ return;
+ }
+
+ /*
+ * Not that it can not be referenced until in is in the
+ * list. So again by adding to the list last we avoid the need
+ * for control locks.
+ */
+ mutex_enter(&ac->ac_lock);
+ list_insert_tail(&ac->ctrls, ctrl);
+ mutex_exit(&ac->ac_lock);
+}
+
+/*
+ * De-Register and free up a control
+ *
+ * Note ctrl_lock read write must be held for writing when calling
+ * this function
+ */
+void
+ac97_free_control(ac97_ctrl_t *ctrl)
+{
+ ac97_t *ac = ctrl->actrl_ac97;
+
+ mutex_enter(&ac->ac_lock);
+ list_remove(&ac->ctrls, ctrl);
+ mutex_exit(&ac->ac_lock);
+
+ audio_dev_del_control(ctrl->actrl_ctrl);
+ kmem_free(ctrl, sizeof (ac97_ctrl_t));
+}
+
+/*
+ * This is the master list of all controls known and handled by
+ * the AC97 framework. This is the list used to probe, allocate
+ * and configure controls. If a control is not in this list it
+ * will not be handled. If a control is in this list but does not
+ * have a probe routine then it will always be included. If a
+ * control in list has a probe routine then it must return true
+ * for that control to be included.
+ */
+
+#define MONCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_MONITOR)
+#define PLAYCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_REC)
+#define T3DCTL (AC97_FLAGS | AUDIO_CTRL_FLAG_3D)
+#define TONECTL (AC97_FLAGS | AUDIO_CTRL_FLAG_TONE)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+
+ac97_ctrl_probe_t ctrl_probe_tbl[] = {
+
+ /* Master PCM Volume */
+ {AUDIO_CTRL_ID_VOLUME, INIT_VAL_MAIN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ PCMVOL, PCMOVR_MUTE, ac97_master_set, NULL, 5},
+
+ /* LINE out volume */
+ {AUDIO_CTRL_ID_LINEOUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_lineout, 6},
+
+ /* Front volume */
+ {AUDIO_CTRL_ID_FRONT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_lineout_set, ac97_probe_front, 6},
+
+ /* 4CH out volume (has one of three possible uses, first use) */
+ {AUDIO_CTRL_ID_SURROUND, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_surround_set, ac97_probe_rear, 6},
+
+ /* ALT out volume (has one of three possible uses, second use) */
+ {AUDIO_CTRL_ID_HEADPHONE, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_headphone_set, ac97_probe_headphone, 6},
+
+ /* ALT out volume (has one of three possible uses, third use) */
+ {AUDIO_CTRL_ID_AUX1OUT, INIT_VAL_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MAINVOL, 0x8080, ac97_aux1out_set, ac97_probe_auxout, 6},
+
+ /* center out volume */
+ {AUDIO_CTRL_ID_CENTER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, EXLFEVR_CENTER_MUTE, ac97_center_set, ac97_probe_center, 6},
+
+ /* LFE out volume (sub-woofer) */
+ {AUDIO_CTRL_ID_LFE, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, EXLFEVR_LFE_MUTE, ac97_lfe_set, ac97_probe_lfe, 6},
+
+ /* MONO out volume */
+ {AUDIO_CTRL_ID_SPEAKER, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MAINVOL, MMVR_MUTE, ac97_speaker_set, ac97_probe_mono, 6},
+
+ /* Record in GAIN */
+ {AUDIO_CTRL_ID_RECGAIN, INIT_IGAIN_ST, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ RECVOL, RGR_MUTE, ac97_recgain_set, NULL, -4},
+
+ /* MIC in volume */
+ {AUDIO_CTRL_ID_MIC, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, MICVR_MUTE, ac97_mic_set, ac97_probe_mic, 5},
+
+ /* LINE in volume */
+ {AUDIO_CTRL_ID_LINEIN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, LIVR_MUTE, ac97_linein_set, ac97_probe_linein, 5},
+
+ /* CD in volume */
+ {AUDIO_CTRL_ID_CD, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, CDVR_MUTE, ac97_cd_set, ac97_probe_cdrom, 5},
+
+ /* VIDEO in volume */
+ {AUDIO_CTRL_ID_VIDEO, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, VIDVR_MUTE, ac97_video_set, ac97_probe_video, 5},
+
+ /* AUX in volume */
+ {AUDIO_CTRL_ID_AUX1IN, 0, 0, 100, AUDIO_CTRL_TYPE_STEREO,
+ MONVOL, AUXVR_MUTE, ac97_auxin_set, ac97_probe_auxin, 5},
+
+ /* PHONE in volume */
+ {AUDIO_CTRL_ID_PHONE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ MONVOL, PVR_MUTE, ac97_phone_set, ac97_probe_phone, 5},
+
+ /* PC BEEPER in volume (motherboard speaker pins) */
+ {AUDIO_CTRL_ID_BEEP, INIT_VAL_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ AC97_RW, PCBR_MUTE, ac97_pcbeep_set, ac97_probe_pcbeep, 4},
+
+ /* BASS out level (note, zero is hardware bypass) */
+ {AUDIO_CTRL_ID_BASS, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ TONECTL, 0, ac97_bass_set, ac97_probe_tone, 4},
+
+ /* TREBLE out level (note, zero is hardware bypass) */
+ {AUDIO_CTRL_ID_TREBLE, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ TONECTL, 0, ac97_treble_set, ac97_probe_tone, 4},
+
+ /* Loudness on/off switch */
+ {AUDIO_CTRL_ID_LOUDNESS, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ TONECTL, 0, ac97_loudness_set, ac97_probe_loud, 0},
+
+ /* 3D depth out level */
+ {AUDIO_CTRL_ID_3DDEPTH, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ T3DCTL, 0, ac97_3ddepth_set, ac97_probe_3d_depth, 4},
+
+ /* 3D center out level */
+ {AUDIO_CTRL_ID_3DCENT, 0, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ T3DCTL, 0, ac97_3dcent_set, ac97_probe_3d_center, 4},
+
+ /* 3D enhance on/off switch */
+ {AUDIO_CTRL_ID_3DENHANCE, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ T3DCTL, 0, ac97_3donoff_set, ac97_probe_3d, 0},
+
+ /* MIC BOOST switch */
+ {AUDIO_CTRL_ID_MICBOOST, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ RECCTL, 0, ac97_micboost_set, ac97_probe_mic, 0},
+
+ /* Loopback on/off switch */
+ {AUDIO_CTRL_ID_LOOPBACK, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_RW, 0, ac97_loopback_set, NULL, 0},
+
+ /*
+ * The following selectors *must* come after the others, as they rely
+ * on the probe results of other controls.
+ */
+ /* record src select (only one port at a time) */
+ {AUDIO_CTRL_ID_RECSRC, (1U << INPUT_MIC), 0, 0, AUDIO_CTRL_TYPE_ENUM,
+ RECCTL, 0, ac97_insrc_set, NULL, 0, ac97_insrcs},
+
+ /* Start of non-standard private controls */
+
+ /* Simulated stereo on/off switch */
+ {AUDIO_CTRL_ID_STEREOSIM, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_RW, 0, ac97_stsim_set, ac97_probe_stsim, 0},
+
+ /* mono MIC GAIN */
+ {AUDIO_CTRL_ID_MICGAIN, INIT_IGAIN_MN, 0, 100, AUDIO_CTRL_TYPE_MONO,
+ RECCTL, RGMR_MUTE, ac97_monomic_set, ac97_probe_mmic, -4},
+
+ /* MIC select switch 0=mic1 1=mic2 */
+ {AUDIO_CTRL_ID_MICSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
+ RECCTL, 0, ac97_selmic_set, ac97_probe_mic, 0, ac97_mics},
+
+ /* MONO out src select 0=mix 1=mic */
+ {AUDIO_CTRL_ID_SPKSRC, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM,
+ AC97_RW, 0, ac97_monosrc_set, ac97_probe_mono, 0, ac97_monos},
+
+ {NULL}
+};
+
+/*
+ * Probe all possible controls and register existing
+ * ones and set initial values
+ *
+ * Returns zero on success
+ */
+static int
+ac97_probeinit_ctrls(ac97_t *ac, int vol_bits, int enh_bits)
+{
+ ac97_ctrl_probe_t *cpt;
+ ac97_ctrl_probe_t my_cpt;
+
+ ASSERT(ac);
+
+ /*
+ * Set some ports which are always present.
+ */
+ ac->inputs = (1U << INPUT_STEREOMIX) | (1U << INPUT_MONOMIX);
+ for (cpt = &ctrl_probe_tbl[0]; cpt->cp_name != NULL; cpt++) {
+ bcopy(cpt, &my_cpt, sizeof (my_cpt));
+
+ if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_RECSRC) == 0) {
+ my_cpt.cp_minval |= ac->inputs;
+ my_cpt.cp_maxval |= ac->inputs;
+ }
+
+ if (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_MICBOOST) == 0) {
+ if (ac->flags & AC97_FLAG_MICBOOST)
+ my_cpt.cp_initval = 1;
+ }
+
+ if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_FRONT) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_HEADPHONE) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SURROUND) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_SPEAKER) == 0)) {
+ my_cpt.cp_bits = vol_bits;
+ }
+
+ if ((strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DDEPTH) == 0) ||
+ (strcmp(my_cpt.cp_name, AUDIO_CTRL_ID_3DCENT) == 0)) {
+ my_cpt.cp_bits = enh_bits;
+ }
+
+ if (!my_cpt.cp_probe || my_cpt.cp_probe(ac)) {
+ ac97_alloc_control(ac, &my_cpt);
+ }
+ }
+
+ if (ac->codec_init != NULL) {
+ ac->codec_init(ac);
+ }
+
+ return (0);
+}
+
+/*
+ * Allocate an AC97 instance for use by a hardware driver.
+ *
+ * returns an allocated and initialize ac97 structure.
+ */
+ac97_t *
+ac97_alloc(dev_info_t *dip, ac97_rd_t rd, ac97_wr_t wr, void *priv)
+{
+ ac97_t *ac;
+
+ ac = kmem_zalloc(sizeof (ac97_t), KM_SLEEP);
+ ac->dip = dip;
+ ac->rd = rd;
+ ac->wr = wr;
+ ac->private = priv;
+
+ list_create(&ac->ctrls, sizeof (struct ac97_ctrl),
+ offsetof(struct ac97_ctrl, actrl_linkage));
+
+ mutex_init(&ac->ac_lock, NULL, MUTEX_DRIVER, NULL);
+
+#define PROP_FLAG(prop, flag, def) \
+ if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, \
+ (prop), (def))) { \
+ ac->flags |= (flag); \
+ } else { \
+ ac->flags &= ~(flag); \
+ }
+
+ /*
+ * Engage the external amplifier by default, suppress with
+ * a property of the form "ac97-amplifier=0".
+ */
+ PROP_FLAG(AC97_PROP_AMPLIFIER, AC97_FLAG_AMPLIFIER, 1);
+
+ /*
+ * We cannot necessarily know if the headphone jack is present
+ * or not. There's a technique to probe the codec for
+ * headphone support, but many vendors seem to simply hang the
+ * headphone jack on the line out circuit, and have some kind
+ * of jack sense detection to enable or disable it by default.
+ * None of this is visible in the AC'97 registers.
+ *
+ * We cannot do much about it, but what we can do is offer users
+ * a way to suppress the option for a headphone port. Users and
+ * administrators can then set a flag in the driver.conf to suppress
+ * the option from display.
+ *
+ * It turns out that this problem exists for other signals as
+ * well.
+ */
+ PROP_FLAG(AC97_PROP_NO_HEADPHONE, AC97_FLAG_NO_HEADPHONE, 0);
+ PROP_FLAG(AC97_PROP_NO_AUXOUT, AC97_FLAG_NO_AUXOUT, 0);
+ PROP_FLAG(AC97_PROP_NO_CDROM, AC97_FLAG_NO_CDROM, 0);
+ PROP_FLAG(AC97_PROP_NO_AUXIN, AC97_FLAG_NO_AUXIN, 0);
+ PROP_FLAG(AC97_PROP_NO_VIDEO, AC97_FLAG_NO_VIDEO, 0);
+ PROP_FLAG(AC97_PROP_NO_LINEIN, AC97_FLAG_NO_LINEIN, 0);
+ PROP_FLAG(AC97_PROP_NO_MIC, AC97_FLAG_NO_MIC, 0);
+
+ /*
+ * Most SPARC systems use the AC97 monoaural output for the
+ * built-in speaker. On these systems, we want to expose and
+ * enable the built-in speaker by default.
+ *
+ * On most x86 systems, the mono output is not connected to
+ * anything -- the AC'97 spec makes it pretty clear that the
+ * output was actually intended for use with speaker phones.
+ * So on those systems, we really don't want to activate the
+ * speaker -- we don't even want to expose it's presence
+ * normally.
+ *
+ * However, there could be an exception to the rule here. To
+ * facilitate this, we allow for the presence of the property
+ * to indicate that the speaker should be exposed. Whether it
+ * is enabled by default or not depends on the value of the
+ * property. (Generally on SPARC, we enable by default. On
+ * other systems we do not.)
+ */
+#ifdef __sparc
+ ac->flags |= AC97_FLAG_SPEAKER_OK;
+ PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 1);
+#else
+ if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ AC97_PROP_SPEAKER)) {
+ ac->flags |= AC97_FLAG_SPEAKER_OK;
+ PROP_FLAG(AC97_PROP_SPEAKER, AC97_FLAG_SPEAKER, 0);
+ }
+#endif
+
+ /*
+ * Enable microphone boost (20dB normally) by default?
+ */
+ PROP_FLAG(AC97_PROP_MICBOOST, AC97_FLAG_MICBOOST, 0);
+
+ return (ac);
+}
+
+/*
+ * Free an AC97 instance.
+ */
+void
+ac97_free(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /* Clear out any controls that are still attached */
+ while ((ctrl = list_head(&ac->ctrls)) != NULL) {
+ ac97_free_control(ctrl);
+ }
+
+ list_destroy(&ac->ctrls);
+ mutex_destroy(&ac->ac_lock);
+ kmem_free(ac, sizeof (ac97_t));
+}
+
+static struct vendor {
+ unsigned id;
+ const char *name;
+} vendors[] = {
+ { AC97_VENDOR_ADS, "Analog Devices" },
+ { AC97_VENDOR_AKM, "Asahi Kasei" },
+ { AC97_VENDOR_ALC, "Realtek" },
+ { AC97_VENDOR_ALG, "Avance Logic" },
+ { AC97_VENDOR_CMI, "C-Media" },
+ { AC97_VENDOR_CRY, "Cirrus Logic" },
+ { AC97_VENDOR_CXT, "Conexant" },
+ { AC97_VENDOR_ESS, "ESS Technology" },
+ { AC97_VENDOR_EV, "Ectiva" },
+ { AC97_VENDOR_ICE, "ICEnsemble" },
+ { AC97_VENDOR_ST, "SigmaTel" },
+ { AC97_VENDOR_TRA, "TriTech", },
+ { AC97_VENDOR_VIA, "VIA Technologies" },
+ { AC97_VENDOR_WML, "Wolfson" },
+ { AC97_VENDOR_YMH, "Yamaha" },
+ { 0, NULL },
+};
+
+static struct codec {
+ unsigned id;
+ const char *name;
+ int enh_bits;
+ void (*init)(ac97_t *ac);
+ void (*reset)(ac97_t *ac);
+} codecs[] = {
+ { AC97_CODEC_AK4540, "AK4540" },
+ { AC97_CODEC_STAC9700, "STAC9700" },
+ { AC97_CODEC_STAC9701, "STAC9701" },
+ { AC97_CODEC_STAC9701_2, "STAC9701" },
+ { AC97_CODEC_STAC9704, "STAC9704" },
+ { AC97_CODEC_STAC9705, "STAC9705" },
+ { AC97_CODEC_STAC9721, "STAC9721" },
+ { AC97_CODEC_STAC9708, "STAC9708", 2 },
+ { AC97_CODEC_STAC9744, "STAC9744" },
+ { AC97_CODEC_STAC9750, "STAC9750", 3 },
+ { AC97_CODEC_STAC9752, "STAC9752", 3 },
+ { AC97_CODEC_STAC9756, "STAC9756", 3 },
+ { AC97_CODEC_STAC9758, "STAC9758", 3 },
+ { AC97_CODEC_STAC9766, "STAC9766", 3 },
+ { AC97_CODEC_TR28028, "TR28028" },
+ { AC97_CODEC_TR28028_2, "TR28028" },
+ { AC97_CODEC_TR28023, "TR28023" },
+ { AC97_CODEC_TR28023_2, "TR28023" },
+ { AC97_CODEC_EM28028, "EM28028" },
+ { AC97_CODEC_CX20468, "CX20468" },
+ { AC97_CODEC_CX20468_2, "CX20468" },
+ { AC97_CODEC_CX20468_21, "CX20468-21" },
+ { AC97_CODEC_CS4297, "CS4297" },
+ { AC97_CODEC_CS4297A, "CS4297A" },
+ { AC97_CODEC_CS4294, "CS4294" },
+ { AC97_CODEC_CS4299, "CS4299" },
+ { AC97_CODEC_CS4202, "CS4202" },
+ { AC97_CODEC_CS4205, "CS4205" },
+ { AC97_CODEC_AD1819B, "AD1819B" },
+ { AC97_CODEC_AD1881, "AD1881" },
+ { AC97_CODEC_AD1881A, "AD1881A" },
+ { AC97_CODEC_AD1885, "AD1885" },
+ { AC97_CODEC_AD1886, "AD1886" },
+ { AC97_CODEC_AD1887, "AD1887" },
+ { AC97_CODEC_AD1888, "AD1888" },
+ { AC97_CODEC_AD1980, "AD1980" },
+ { AC97_CODEC_AD1981, "AD1981" }, /* no data sheet */
+ { AC97_CODEC_AD1981A, "AD1981A", 0, ad1981a_init },
+ { AC97_CODEC_AD1981B, "AD1981B", 0, ad1981b_init },
+ { AC97_CODEC_AD1985, "AD1985" },
+ { AC97_CODEC_WM9701A, "WM9701A" },
+ { AC97_CODEC_WM9703, "WM9703" },
+ { AC97_CODEC_WM9704, "WM9704" },
+ { AC97_CODEC_ES1921, "ES1921" },
+ { AC97_CODEC_ICE1232, "ICE1232/VT1611A" },
+ { AC97_CODEC_VT1612A, "VT1612A" },
+ { AC97_CODEC_VT1616, "VT1616" },
+ { AC97_CODEC_VT1616A, "VT1616A" },
+ { AC97_CODEC_VT1617A, "VT1617A" },
+ { AC97_CODEC_VT1618, "VT1618" },
+ { AC97_CODEC_ALC100, "ALC100", 2 },
+ { AC97_CODEC_ALC200P, "ALC200P", 2 },
+ { AC97_CODEC_ALC202, "ALC202", 2 },
+ { AC97_CODEC_ALC203, "ALC203", 2 },
+ { AC97_CODEC_ALC250, "ALC250", 2 },
+ { AC97_CODEC_ALC250_2, "ALC250", 2 },
+ { AC97_CODEC_ALC650, "ALC650", 2, alc650_init },
+ { AC97_CODEC_ALC655, "ALC655", 2, alc650_init },
+ { AC97_CODEC_ALC658, "ALC658", 2, alc650_init },
+ { AC97_CODEC_ALC850, "ALC850", 2, alc850_init },
+ { AC97_CODEC_EV1938, "EV1938" },
+ { AC97_CODEC_CMI9738, "CMI9738", 0, cmi9738_init },
+ { AC97_CODEC_CMI9739, "CMI9739", 0, cmi9739_init },
+ { AC97_CODEC_CMI9780, "CMI9780" },
+ { AC97_CODEC_CMI9761, "CMI9761A", 0, cmi9761_init },
+ { AC97_CODEC_CMI9761_2, "CMI9761B", 0, cmi9761_init },
+ { AC97_CODEC_CMI9761_3, "CMI9761A+", 0, cmi9761_init },
+ { AC97_CODEC_YMF743, "YMF743" },
+ { AC97_CODEC_YMF753, "YMF753" },
+ { 0, NULL }
+};
+
+/*
+ * Init the actual hardware related to a previously
+ * allocated instance of an AC97 device.
+ *
+ * Return zero on success.
+ */
+int
+ac97_init(ac97_t *ac, struct audio_dev *d)
+{
+ uint32_t vid1, vid2;
+ const char *name = NULL;
+ const char *vendor = NULL;
+ int enh_bits;
+ int vol_bits;
+ uint32_t flags;
+ char nmbuf[128];
+ char buf[128];
+
+ /* Save audio framework instance structure */
+ ac->d = d;
+
+ ac97_analog_reset(ac);
+
+ vid1 = RD(AC97_VENDOR_ID1_REGISTER);
+ vid2 = RD(AC97_VENDOR_ID2_REGISTER);
+
+ if (vid1 == 0xffff) {
+ audio_dev_warn(d, "AC'97 codec unresponsive");
+ return (-1);
+ }
+
+ ac->vid = (vid1 << 16) | vid2;
+
+ /*
+ * Find out kind of codec we have and set any special case
+ * settings needed.
+ */
+ for (int i = 0; codecs[i].id; i++) {
+ if (ac->vid == codecs[i].id) {
+ name = codecs[i].name;
+ enh_bits = codecs[i].enh_bits;
+ ac->codec_init = codecs[i].init;
+ break;
+ }
+ }
+ for (int i = 0; vendors[i].id; i++) {
+ if ((ac->vid & 0xffffff00) == vendors[i].id) {
+ vendor = vendors[i].name;
+ break;
+ }
+ }
+ if (name == NULL) {
+ (void) snprintf(nmbuf, sizeof (nmbuf), "0x%04x%04x",
+ vid1, vid2);
+ name = nmbuf;
+ }
+ if (vendor == NULL) {
+ vendor = "Unknown";
+ }
+
+ /*
+ * Populate the initial shadow table.
+ */
+ for (int i = 0; i < LAST_SHADOW_REG; i += sizeof (uint16_t)) {
+ SHADOW(ac, i) = RD(i);
+ }
+
+ ac->caps = RD(AC97_RESET_REGISTER);
+
+ enh_bits = 4;
+ vol_bits = 6;
+ flags = 0;
+
+ /* detect the bit width of the master volume controls */
+ WR(AC97_MASTER_VOLUME_REGISTER, 0x20);
+ if ((RD(AC97_MASTER_VOLUME_REGISTER) & 0x1f) == 0x1f) {
+ vol_bits = 5;
+ }
+
+ /*
+ * AC'97 2.3 spec indicates three possible uses for AUX_OUT
+ * (aka LNLVL_OUT aka HP_OUT). We have to figure out which one
+ * is in use.
+ */
+ if (ac->caps & RR_HEADPHONE_SUPPORT) {
+ /* it looks like it is probably headphones */
+ if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
+ /* it is implemented */
+ ac->flags |= AC97_FLAG_AUX_HP;
+ }
+ }
+
+ /*
+ * If not a headphone, is it 4CH_OUT (surround?)
+ */
+ if ((!(ac->flags & AC97_FLAG_AUX_HP)) &&
+ (RD(AC97_EXTENDED_AUDIO_REGISTER) & EAR_SDAC)) {
+ if (ac97_probe_reg(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER)) {
+ ac->flags |= AC97_FLAG_AUX_4CH;
+ }
+ }
+
+ /*
+ * If neither, then maybe its an auxiliary line level output?
+ */
+ if (!(ac->flags & (AC97_FLAG_AUX_HP | AC97_FLAG_AUX_4CH))) {
+ if (ac97_probe_reg(ac, AC97_HEADPHONE_VOLUME_REGISTER)) {
+ ac->flags |= AC97_FLAG_AUX_LVL;
+ }
+ }
+
+ ac->flags |= flags;
+ (void) snprintf(ac->name, sizeof (ac->name), "%s %s", vendor, name);
+
+ (void) snprintf(buf, sizeof (buf), "AC'97 codec: %s", ac->name);
+ audio_dev_add_info(d, buf);
+
+ cmn_err(CE_CONT, "?%s#%d: AC'97 codec id %s (%x, caps %x)\n",
+ ddi_driver_name(ac->dip), ddi_get_instance(ac->dip),
+ ac->name, ac->vid, ac->caps);
+
+ /*
+ * Probe and register all known controls with framework
+ */
+ if (ac97_probeinit_ctrls(ac, vol_bits, enh_bits)) {
+ audio_dev_warn(d, "AC97 controls init failed");
+
+ /* XXX - need to free all controls registered? */
+ return (-1);
+ }
+
+ ac97_hw_reset(ac);
+ ac97_init_values(ac);
+
+ return (0);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_ad.c b/usr/src/uts/common/io/audio/ac97/ac97_ad.c
new file mode 100644
index 0000000000..1faddcb6fa
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_ad.c
@@ -0,0 +1,257 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * ADS (Analog Devices) codec extensions.
+ */
+
+/*
+ * TODO:
+ *
+ * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
+ * line-out jack. So far we haven't found which vendors don't
+ * do that. So we assume that all vendors swap the surr-out
+ * and the line-out outputs. So we need swap the two outputs.
+ *
+ * Historically we internally processed the "ad198x-swap-output"
+ * property. If someday some vendors do not swap the outputs, we would
+ * set "ad198x-swap-output = 0" in the driver.conf file, and unload
+ * and reload the driver (or reboot).
+ *
+ * TODO:
+ *
+ * Since we don't have access (at present) to any such systems, we have
+ * not implemented this swapping property. Once we can test it, we will
+ * add it. This is noted as CR 6819556.
+ *
+ * The old code did this:
+ *
+ * if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
+ * DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
+ * statep->swap_out = B_TRUE;
+ * (void) audioixp_read_ac97(statep, CODEC_AD_REG_MISC, &tmp);
+ * (void) audioixp_write_ac97(statep,
+ * CODEC_AD_REG_MISC,
+ * tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+#define ADS_EQ_CTRL_REGISTER 0x60
+#define AECR_EQM 0x8000 /* disable EQ */
+#define AECR_SYM 0x0080
+
+#define ADS_EQ_DATA_REGISTER 0x62
+
+#define ADS_MIXER_ADC_IGAIN_REGISTER 0x64
+#define AMADIR_LEFT_MASK 0x0f00
+#define AMADIR_RIGHT_MASK 0x000f
+#define AMADIR_MXM 0x8000
+
+#define ADS_JS_INTS_STATUS_REGISTER 0x72
+#define AJISR_JS0INT 0x0001
+#define AJISR_JS1INT 0x0002
+#define AJISR_JS0ST 0x0004
+#define AJISR_JS1ST 0x0008
+#define AJISR_JS0MD 0x0010
+#define AJISR_JS1MD 0x0020
+#define AJISR_JS0TMR 0x0040
+#define AJISR_JS1TMR 0x0080
+#define AJISR_JS0EQB 0x0100
+#define AJISR_JS1EQB 0x0200
+#define AJISR_JSMT_MASK 0x1c00
+#define AJISR_JSMT_NONE 0x0000
+#define AJISR_JSMT_HP_LNOUT 0x0400 /* hp mutes line out */
+#define AJISR_JSMT_HP_BOTH 0x0800 /* hp mutes both mono & line */
+#define AJISR_JSMT_LNOUT_MONO 0x1000 /* lineout mutes mono */
+#define AJISR_JSMT_ALL 0x1800 /* all JS muting enabled */
+
+#define ADS_SERIAL_CFG_REGISTER 0x74
+#define ASCR_SPLNK 0x0001
+#define ASCR_SPDZ 0x0002
+#define ASCR_SPAL 0x0004
+#define ASCR_INTS 0x0010
+#define ASCR_CHEN 0x0100
+#define ASCR_REGM0 0x1000
+#define ASCR_REGM1 0x2000
+#define ASCR_REGM2 0x4000
+#define ASCR_SLOT16 0x8000
+
+#define ADS_MISC_CFG_REGISTER 0x76
+#define AMCR_MBG_MASK 0x0003
+#define AMCR_MBG_20dB 0x0000
+#define AMCR_MBG_10dB 0x0001
+#define AMCR_MBG_30dB 0x0002
+#define AMCR_VREFD 0x0004
+#define AMCR_VREFH 0x0008
+#define AMCR_MADST 0x0010 /* AD1981B */
+#define AMCR_SRU 0x0010 /* AD1980 */
+#define AMCR_LOSEL 0x0020 /* AD1980 */
+#define AMCR_2CMIC 0x0040
+#define AMCR_MADPD 0x0080 /* AD1981B */
+#define AMCR_SPRD 0x0080 /* AD1980 */
+#define AMCR_DMIX_6TO2 0x0100 /* AD1980 */
+#define AMCR_DMIX_FORCE 0x0200 /* AD1980 */
+#define AMCR_FMXE 0x0200 /* AD1981B */
+#define AMCR_HPSEL 0x0400 /* AD1980 */
+#define AMCR_CLDIS 0x0800 /* AD1980 */
+#define AMCR_LODIS 0x1000 /* AD1980 */
+#define AMCR_DAM 0x0800 /* AD1981B */
+#define AMCR_MSPLT 0x2000
+#define AMCR_AC97NC 0x4000 /* AD1980 */
+#define AMCR_DACZ 0x8000
+
+static void
+ads_set_micboost(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+ uint16_t v;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1:
+ /* 0db */
+ ac97_clr(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ break;
+ case 0x2:
+ /* 10dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_10dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ case 0x4:
+ /* 20dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_20dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ case 0x8:
+ /* 30dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ v = ac97_rd(ac, ADS_MISC_CFG_REGISTER);
+ v &= ~AMCR_MBG_MASK;
+ v |= AMCR_MBG_30dB;
+ ac97_wr(ac, ADS_MISC_CFG_REGISTER, v);
+ break;
+ }
+}
+
+static void
+ads_set_micsrc(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1: /* mic1 */
+ ac97_clr(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_clr(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ case 0x2: /* mic2 */
+ ac97_clr(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_set(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ case 0x4: /* stereo - ms bit clear to allow MIC1 to be mixed */
+ ac97_set(ac, ADS_MISC_CFG_REGISTER, AMCR_2CMIC);
+ ac97_clr(ac, AC97_GENERAL_PURPOSE_REGISTER, GPR_MS_MIC2);
+ break;
+ }
+}
+
+static void
+ads_setup_micsrc(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+ static const char *values[] = {
+ AUDIO_PORT_MIC1,
+ AUDIO_PORT_MIC2,
+ AUDIO_PORT_STEREO,
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICSRC, 1, 0x7, 0x7, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, ads_set_micsrc,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICSRC);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+static void
+ads_setup_micboost(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ static const char *values[] = {
+ AUDIO_VALUE_OFF, /* 0dB */
+ AUDIO_VALUE_LOW, /* 10dB */
+ AUDIO_VALUE_MEDIUM, /* 20dB */
+ AUDIO_VALUE_HIGH, /* 30dB */
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICBOOST, 1, 0xf, 0xf, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, ads_set_micboost,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICBOOST);
+ if (ctrl) {
+ if (ctrl->actrl_initval) {
+ /* 20dB by default */
+ cpt.cp_initval = 2;
+ }
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+void
+ad1981a_init(ac97_t *ac)
+{
+ ads_setup_micboost(ac);
+}
+
+void
+ad1981b_init(ac97_t *ac)
+{
+ ads_setup_micboost(ac);
+ ads_setup_micsrc(ac); /* this part can use a mic array */
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_alc.c b/usr/src/uts/common/io/audio/ac97/ac97_alc.c
new file mode 100644
index 0000000000..1c621c5094
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_alc.c
@@ -0,0 +1,219 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * ALC (Realtek/Advance Logic) codec extensions.
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+#define ALC_DATA_FLOW_CTRL_REGISTER 0x6a
+#define ADFC_SPDIFIN_EN 0x8000
+#define ADFC_SPDIFIN_MON_EN 0x4000
+#define ADFC_SPDIF_OUT_MASK 0x3000
+#define ADFC_SPDIF_OUT_ACLINK 0x0000
+#define ADFC_SPDIF_OUT_ADC 0x1000
+#define ADFC_SPDIF_OUT_BYPASS 0x2000
+#define ADFC_PCM_SPDIFIN 0x0800
+#define ADFC_BACK_SURROUND 0x0400 /* ALC850 only */
+#define ADFC_CENTER_LFE 0x0400 /* ALC650 series */
+#define ADFC_MIC 0x0000
+#define ADFC_SURROUND 0x0200
+#define ADFC_LINEIN 0x0000
+#define ADFC_FRONT_MIC_MONO_OUT 0x0100 /* ALC850 */
+#define ADFC_ANALOG_INPUT_PASS_CLFE 0x0020
+#define ADFC_ANALOG_INPUT_PASS_SURROUND 0x0010
+#define ADFC_SURROUND_MIRROR 0x0001
+
+#define ALC_SURROUND_DAC_REGISTER 0x64
+#define ASD_SURROUND_MUTE 0x8000
+#define ASD_SURR_LEFT_VOL 0x1f00
+#define ASD_SURR_RIGHT_VOL 0x001f
+
+#define ALC_CEN_LFE_DAC_REGISTER 0x66
+#define ACLD_CEN_LFE_MUTE 0x8000
+#define ACLD_LFE_VOL 0x1f00
+#define ACLD_CEN_VOL 0x001f
+
+#define ALC_MISC_CTRL_REGISTER 0x7a
+#define AMC_XTLSEL 0x8000
+#define AMC_VREFOUT_DIS 0x1000
+#define AMC_INDEP_MUTE_CTRL 0x0800
+#define AMC_JD2_SURR_CEN_LFE 0x0008
+#define AMC_JD1_SURR_CEN_LFE 0x0004
+#define AMC_PIN47_SPDIF 0x0002
+#define AMC_PIN47_EAPD 0x0000
+#define AMC_JD0_SURR_CEN_LFE 0x0001
+
+static void
+alc650_set_linein_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_SURROUND);
+ } else {
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_SURROUND);
+ }
+}
+
+static void
+alc650_set_mic_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_MISC_CTRL_REGISTER, AMC_VREFOUT_DIS);
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_CENTER_LFE);
+ } else {
+ ac97_clr(ac, ALC_MISC_CTRL_REGISTER, AMC_VREFOUT_DIS);
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_CENTER_LFE);
+ }
+}
+
+#if 0
+static void
+alc850_set_auxin_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_BACK_SURROUND);
+ } else {
+ ac97_clr(ac, ALC_DATA_FLOW_CTRL_REGISTER, ADFC_BACK_SURROUND);
+ }
+}
+#endif
+
+static void
+alc650_set_pcm(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+ uint16_t adj_value;
+ uint16_t mute;
+ uint8_t vol;
+
+ /* limit input values to 16 bits and split to right and left */
+ vol = value & 0xff;
+
+ /* If this control is mute-able than set as muted if needed */
+ mute = vol ? 0 : ASD_SURROUND_MUTE;
+ adj_value = ac97_val_scale(vol, vol, 5) | mute;
+
+ /* select page 0 */
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0);
+ /* adjust all three PCM volumes */
+ ac97_wr(ac, AC97_PCM_OUT_VOLUME_REGISTER, adj_value);
+ ac97_wr(ac, ALC_SURROUND_DAC_REGISTER, adj_value);
+ ac97_wr(ac, ALC_CEN_LFE_DAC_REGISTER, adj_value);
+}
+
+static const char *alc_linein_funcs[] = {
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_SURROUND,
+ NULL
+};
+
+static const char *alc_mic_funcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CENLFE,
+ NULL
+};
+
+static ac97_ctrl_probe_t alc650_linein_func_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, alc650_set_linein_func, NULL, 0, alc_linein_funcs
+};
+static ac97_ctrl_probe_t alc650_mic_func_cpt = {
+ AUDIO_CTRL_ID_JACK2, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, alc650_set_mic_func, NULL, 0, alc_mic_funcs
+};
+
+static void
+alc_pcm_override(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /* override master PCM volume function */
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_VOLUME);
+ if (ctrl != NULL) {
+ ctrl->actrl_write_fn = alc650_set_pcm;
+ }
+}
+
+void
+alc650_init(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ bcopy(&alc650_linein_func_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&alc650_mic_func_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_MIC_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ alc_pcm_override(ac);
+}
+
+void
+alc850_init(ac97_t *ac)
+{
+ /*
+ * NB: We could probably enable 7.1 here using the AUXIN source,
+ * but there are a few details still missing from the data sheet.
+ * (Such as, how is volume from the back-surround DAC managed?,
+ * and what SDATA slots are the back surround delivered on?)
+ *
+ * Also, the AC'97 controllers themselves don't necessarily support
+ * 7.1, so we'd have to figure out how to coordinate detection
+ * with the controller. 5.1 should be good enough for now.
+ *
+ * Unlike other products, ALC850 has separate pins for 5.1 data,
+ * so jack retasking isn't needed. However, it can retask
+ * some jacks, but we don't have full details for that right
+ * now. We've not seen it on any systems (yet) where this was
+ * necessary, though.
+ */
+
+ alc_pcm_override(ac);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_cmi.c b/usr/src/uts/common/io/audio/ac97/ac97_cmi.c
new file mode 100644
index 0000000000..50351cb08c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_cmi.c
@@ -0,0 +1,311 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * CMI (C-Media) codec extensions.
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include "ac97_impl.h"
+
+/*
+ * C-Media 9739 part is weird. Instead of having independent volume
+ * controls for each of the channels, it uses a single master volume
+ * and just provides mute support for the other bits. It does this
+ * for PCM volume as well, so we can't use it either. Ugh. It also
+ * has an optional 30 dB mic boost. Apparently the 9761 behaves in
+ * much the same fashion as the 9739.
+ *
+ * C-Media 9738 is a more or less typical 4CH device according to the
+ * datasheet. It however supports jack retasking allowing the line in
+ * jack to function as a surround output. Google suggests that the
+ * volume controls on this part are about as busted as on the other
+ * parts. So, we just use synthetic volume for it.
+ *
+ * C-Media 9780 is largely a mystery (ENODATASHEET).
+ */
+
+
+#define CMI_TASK_REGISTER 0x5A /* 9738 jack retasking */
+#define CTR_F2R 0x2000 /* front routed to rear */
+#define CTR_S2LNI 0x0400 /* surround to line in */
+
+#define CMI_MULTICH_REGISTER 0x64 /* 9739 and 9761a */
+#define CMR_PCBSW 0x8000 /* PC Beep volume bypass */
+#define CMR_P47 0x4000 /* configure P47 function */
+#define CMR_REFCTL 0x2000 /* enable vref output */
+#define CMR_CLCTL 0x1000 /* center/lfe output enable */
+#define CMR_S2LNI 0x0400 /* surround to line in */
+#define CMR_MIX2S 0x0200 /* analog input pass to surround */
+#define CMR_BSTSEL 0x0001 /* micboost use 30dB */
+
+static void
+cmi_set_micboost(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ switch (value) {
+ case 0x1:
+ /* 0db */
+ ac97_clr(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ case 0x2:
+ /* 20dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ case 0x4:
+ /* 30dB */
+ ac97_set(ac, AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_BSTSEL);
+ break;
+ }
+}
+
+static void
+cmi_set_linein_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
+ } else {
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_S2LNI);
+ }
+}
+
+static void
+cmi_set_mic_func(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ if (value & 2) {
+ ac97_set(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
+ } else {
+ ac97_clr(ac, CMI_MULTICH_REGISTER, CMR_CLCTL);
+ }
+}
+
+static void
+cmi_setup_micboost(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ static const char *values[] = {
+ AUDIO_VALUE_OFF, /* 0dB */
+ AUDIO_VALUE_MEDIUM, /* 20dB */
+ AUDIO_VALUE_HIGH, /* 30dB */
+ NULL
+ };
+ ac97_ctrl_probe_t cpt = {
+ AUDIO_CTRL_ID_MICBOOST, 1, 0xf, 0xf, AUDIO_CTRL_TYPE_ENUM,
+ AC97_FLAGS | AUDIO_CTRL_FLAG_REC, 0, cmi_set_micboost,
+ NULL, 0, values };
+
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_MICBOOST);
+ if (ctrl) {
+ if (ctrl->actrl_initval) {
+ /* 20dB by default */
+ cpt.cp_initval = 1;
+ }
+ ac97_free_control(ctrl);
+ }
+
+ ac97_alloc_control(ac, &cpt);
+}
+
+static const char *cmi_linein_funcs[] = {
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_SURROUND,
+ NULL
+};
+
+static const char *cmi_mic_funcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_CENLFE,
+ NULL
+};
+
+static void
+cmi_setup_jack_funcs(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ ac97_ctrl_probe_t linein_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_linein_func, NULL, 0, cmi_linein_funcs
+ };
+ ac97_ctrl_probe_t mic_cpt = {
+ AUDIO_CTRL_ID_JACK2, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_mic_func, NULL, 0, cmi_mic_funcs
+ };
+
+ bcopy(&linein_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&mic_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_MIC_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+}
+
+static void
+cmi_set_linein_func_9738(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ if (value & 2) {
+ ac97_set(ac, CMI_TASK_REGISTER, CTR_S2LNI);
+ } else {
+ ac97_clr(ac, CMI_TASK_REGISTER, CTR_S2LNI);
+ }
+}
+
+static void
+cmi_set_spread_9738(ac97_ctrl_t *actrl, uint64_t value)
+{
+ ac97_t *ac = actrl->actrl_ac97;
+
+ if (value) {
+ ac97_set(ac, CMI_TASK_REGISTER, CTR_F2R);
+ } else {
+ ac97_clr(ac, CMI_TASK_REGISTER, CTR_F2R);
+ }
+}
+
+static void
+cmi_setup_jack_func_9738(ac97_t *ac)
+{
+ ac97_ctrl_probe_t cp;
+ int ival;
+
+ ac97_ctrl_probe_t linein_cpt = {
+ AUDIO_CTRL_ID_JACK1, 1, 3, 3, AUDIO_CTRL_TYPE_ENUM, AC97_FLAGS,
+ 0, cmi_set_linein_func_9738, NULL, 0, cmi_linein_funcs
+ };
+ ac97_ctrl_probe_t spread_cpt = {
+ AUDIO_CTRL_ID_SPREAD, 0, 0, 1, AUDIO_CTRL_TYPE_BOOLEAN,
+ AC97_FLAGS, 0, cmi_set_spread_9738,
+ };
+
+ bcopy(&linein_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_LINEIN_FUNC, 0);
+ if ((ival >= 1) && (ival <= 2)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+
+ bcopy(&spread_cpt, &cp, sizeof (cp));
+ ival = ac97_get_prop(ac, AC97_PROP_SPREAD, -1);
+ if ((ival >= 0) && (ival <= 1)) {
+ cp.cp_initval = ival;
+ }
+ ac97_alloc_control(ac, &cp);
+}
+
+
+static void
+cmi_setup_volume(ac97_t *ac)
+{
+ ac97_ctrl_t *ctrl;
+
+ /*
+ * These CMI parts seem to be really weird. They don't have
+ * *any* functioning volume controls on them (mute only) apart
+ * from the record and monitor sources (excluding PCM). I
+ * don't understand why not. We just eliminate all of the
+ * volume controls and replace with a soft volume control.
+ * Its not an ideal situation, but I don't know what else I
+ * can do about it.
+ */
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_VOLUME);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_FRONT);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_SURROUND);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_CENTER);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+ ctrl = ac97_control_find(ac, AUDIO_CTRL_ID_LFE);
+ if (ctrl) {
+ ac97_free_control(ctrl);
+ }
+
+ /* make sure we have disabled mute and attenuation on physical ctrls */
+ ac97_wr(ac, AC97_INTERRUPT_PAGING_REGISTER, 0); /* select page 0 */
+ ac97_wr(ac, AC97_PCM_OUT_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_MASTER_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_EXTENDED_C_LFE_VOLUME_REGISTER, 0);
+ ac97_wr(ac, AC97_EXTENDED_LRS_VOLUME_REGISTER, 0);
+
+ (void) audio_dev_add_soft_volume(ac97_get_dev(ac));
+}
+
+void
+cmi9739_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_micboost(ac);
+ cmi_setup_jack_funcs(ac);
+}
+
+void
+cmi9761_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_micboost(ac);
+ cmi_setup_jack_funcs(ac);
+}
+
+void
+cmi9738_init(ac97_t *ac)
+{
+ cmi_setup_volume(ac);
+ cmi_setup_jack_func_9738(ac);
+}
diff --git a/usr/src/uts/common/io/audio/ac97/ac97_impl.h b/usr/src/uts/common/io/audio/ac97/ac97_impl.h
new file mode 100644
index 0000000000..073707c0d9
--- /dev/null
+++ b/usr/src/uts/common/io/audio/ac97/ac97_impl.h
@@ -0,0 +1,113 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AC97_IMPL_H
+#define _SYS_AC97_IMPL_H
+
+typedef struct ac97_ctrl ac97_ctrl_t;
+typedef void (*ac97_set_t)(ac97_ctrl_t *, uint64_t);
+
+/*
+ * Per control state
+ */
+struct ac97_ctrl {
+ list_node_t actrl_linkage; /* For private cntrls list */
+ struct ac97 *actrl_ac97;
+ int actrl_bits; /* Port width */
+ uint32_t actrl_type; /* control type */
+ const char *actrl_name; /* control's name */
+ audio_ctrl_t *actrl_ctrl; /* control framework handle */
+ ac97_set_t actrl_write_fn; /* control write function */
+ uint64_t actrl_minval; /* MIN value for control */
+ uint64_t actrl_maxval; /* MAX value for control */
+ uint64_t actrl_value; /* current value in port */
+ uint64_t actrl_initval; /* initial value in port */
+ uint16_t actrl_muteable; /* if muteable, bits to do it */
+};
+
+/*
+ * Function Type used on controls that are optional
+ * This will return non-zero if the control should be
+ * installed and configured.
+ */
+typedef int (*cp_probe_t)(ac97_t *ac);
+
+
+/*
+ * This is used to enumerate and probe all controls that are
+ * supported and configurable on AC97 hardware
+ */
+typedef struct ac97_ctrl_probe {
+ const char *cp_name; /* name of control */
+ uint64_t cp_initval; /* Initial value for control */
+ uint64_t cp_minval; /* MIN value for control */
+ uint64_t cp_maxval; /* MAX value for control */
+ uint32_t cp_type; /* Type of control */
+ uint32_t cp_flags; /* control type flags */
+ uint16_t cp_muteable; /* Mute bit mask */
+ ac97_set_t cp_write_fn; /* control write function */
+ cp_probe_t cp_probe; /* Probe if control exists */
+ int cp_bits; /* Bits for volume controls */
+ const char **cp_enum; /* Enumeration value */
+} ac97_ctrl_probe_t;
+
+typedef struct ac97_hooks {
+ void (*h_detach)(ac97_t *);
+ void (*h_reset)(ac97_t *);
+ void (*h_restore)(ac97_t *);
+} ac97_hooks_t;
+
+/*
+ * These are the flags for most of our controls
+ */
+#define AC97_RW (AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE)
+#define AC97_FLAGS (AC97_RW | AUDIO_CTRL_FLAG_POLL)
+
+void ac97_wr(ac97_t *, uint8_t, uint16_t);
+uint16_t ac97_rd(ac97_t *, uint8_t);
+void ac97_clr(ac97_t *, uint8_t, uint16_t);
+void ac97_set(ac97_t *, uint8_t, uint16_t);
+void ac97_alloc_control(ac97_t *, ac97_ctrl_probe_t *);
+void ac97_free_control(ac97_ctrl_t *);
+ac97_ctrl_t *ac97_control_find(ac97_t *, const char *);
+uint16_t ac97_val_scale(int left, int right, int bits);
+uint16_t ac97_mono_scale(int val, int bits);
+audio_dev_t *ac97_get_dev(ac97_t *);
+int ac97_get_prop(ac97_t *, char *, int);
+
+/* Codec specific initializations */
+
+void ad1981a_init(ac97_t *);
+void ad1981b_init(ac97_t *);
+
+void alc650_init(ac97_t *);
+void alc850_init(ac97_t *);
+
+void cmi9738_init(ac97_t *);
+void cmi9739_init(ac97_t *);
+void cmi9761_init(ac97_t *);
+
+#endif /* _SYS_AC97_IMPL_H */
diff --git a/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c
new file mode 100644
index 0000000000..6820d7fd57
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.c
@@ -0,0 +1,1952 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audio1575 Audio Driver
+ *
+ * The driver is primarily targeted at providing audio support for
+ * those systems which use the Uli M1575 audio core.
+ *
+ * The M1575 audio core, in AC'97 controller mode, has independent
+ * channels for PCM in, PCM out, mic in, modem in, and modem out.
+ *
+ * The AC'97 controller is a PCI bus master with scatter/gather
+ * support. Each channel has a DMA engine. Currently, we use only
+ * the PCM in and PCM out channels. Each DMA engine uses one buffer
+ * descriptor list. And the buffer descriptor list is an array of up
+ * to 32 entries, each of which describes a data buffer. Each entry
+ * contains a pointer to a data buffer, control bits, and the length
+ * of the buffer being pointed to, where the length is expressed as
+ * the number of samples. This, combined with the 16-bit sample size,
+ * gives the actual physical length of the buffer.
+ *
+ * TODO: System power management is not yet supported by the driver.
+ *
+ * NOTE:
+ * This driver depends on the drv/audio, misc/ac97
+ * modules being loaded first.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audio1575.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audio1575_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audio1575_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audio1575_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audio1575_close(void *);
+static int audio1575_start(void *);
+static void audio1575_stop(void *);
+static int audio1575_format(void *);
+static int audio1575_channels(void *);
+static int audio1575_rate(void *);
+static uint64_t audio1575_count(void *);
+static void audio1575_sync(void *, unsigned);
+static size_t audio1575_qlen(void *);
+
+static audio_engine_ops_t audio1575_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audio1575_open,
+ audio1575_close,
+ audio1575_start,
+ audio1575_stop,
+ audio1575_count,
+ audio1575_format,
+ audio1575_channels,
+ audio1575_rate,
+ audio1575_sync,
+ audio1575_qlen
+};
+
+/*
+ * interrupt handler
+ */
+static uint_t audio1575_intr(caddr_t, caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audio1575_attach(dev_info_t *);
+static int audio1575_resume(dev_info_t *);
+static int audio1575_detach(dev_info_t *);
+static int audio1575_suspend(dev_info_t *);
+
+static int audio1575_alloc_port(audio1575_state_t *, int);
+static void audio1575_free_port(audio1575_port_t *);
+static void audio1575_start_port(audio1575_port_t *);
+static void audio1575_stop_port(audio1575_port_t *);
+static void audio1575_reset_port(audio1575_port_t *);
+static void audio1575_update_port(audio1575_port_t *);
+
+static int audio1575_setup_intr(audio1575_state_t *);
+static int audio1575_codec_sync(audio1575_state_t *);
+static void audio1575_write_ac97(void *, uint8_t, uint16_t);
+static uint16_t audio1575_read_ac97(void *, uint8_t);
+static int audio1575_chip_init(audio1575_state_t *);
+static int audio1575_map_regs(audio1575_state_t *);
+static void audio1575_unmap_regs(audio1575_state_t *);
+static void audio1575_dma_stop(audio1575_state_t *);
+static void audio1575_pci_enable(audio1575_state_t *);
+static void audio1575_pci_disable(audio1575_state_t *);
+
+static void audio1575_destroy(audio1575_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/*
+ * DDI Structures
+ */
+
+
+/* Device operations structure */
+static struct dev_ops audio1575_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audio1575_ddi_attach, /* devo_attach */
+ audio1575_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ ddi_quiesce_not_supported, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audio1575_modldrv = {
+ &mod_driverops, /* drv_modops */
+ M1575_MOD_NAME, /* drv_linkinfo */
+ &audio1575_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audio1575_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audio1575_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x000000000000ffffLL, /* DMA counter register - 64 bits */
+ 0x0000000000000008LL, /* DMA address align must be 8-bytes */
+ 0x0000003c, /* 1 through 64 byte burst sizes */
+ 0x00000008, /* min xfer DMA size BDList entry */
+ 0x00000000000ffffLL, /* max xfer size, 64K */
+ 0x000000000001fffLL, /* seg, set to PAGESIZE */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000008, /* granularity of device minxfer */
+ 0 /* DMA flags use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x000000000001fffeLL, /* DMA counter register - 16 bits */
+ 0x0000000000000004LL, /* DMA address align 2-byte boundary */
+ 0x0000003c, /* 1 through 60 byte burst sizes */
+ 0x00000004, /* min xfer DMA size BDList entry */
+ 0x000000000001ffffLL, /* max xfer size, 64K */
+ 0x000000000001ffffLL, /* seg, set to 64K */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000004, /* granularity of device minxfer */
+ 0 /* DMA flags use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audio1575_dev_ops, M1575_NAME);
+
+ if ((error = mod_install(&audio1575_modlinkage)) != 0) {
+ audio_fini_ops(&audio1575_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* clean up ops */
+ audio_fini_ops(&audio1575_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audio1575_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audio1575_ddi_attach()
+ *
+ * Description:
+ * Implements the DDI attach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio1575_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audio1575_attach(dip));
+
+ case DDI_RESUME:
+ return (audio1575_resume(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_ddi_detach()
+ *
+ * Description:
+ * Implements the detach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio1575_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audio1575_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audio1575_suspend(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * Each of buffer descriptor has a field IOC(interrupt on completion)
+ * When both this and the IOC bit of correspondent dma control register
+ * is set, it means that the controller should issue an interrupt upon
+ * completion of this buffer. Note that in the clearing of the interrupts
+ * below that the PCM IN and PCM out interrupts ar cleared by their
+ * respective control registers and not by writing a '1' to the INTRSR
+ * the interrupt status register. Only CPRINTR,SPINTR,and GPIOINTR
+ * require a '1' written to the INTRSR register to clear those
+ * interrupts. See comments below.
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audio1575_intr(caddr_t arg, caddr_t dontcare)
+{
+ audio1575_state_t *statep = (void *)arg;
+ uint32_t intrsr;
+ uint8_t index;
+ audio1575_port_t *consume = NULL;
+ audio1575_port_t *produce = NULL;
+
+ _NOTE(ARGUNUSED(dontcare));
+
+ mutex_enter(&statep->lock);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+
+ /* check if device is interrupting */
+ if (intrsr == 0) {
+ if (statep->ksp) {
+ /* increment the spurious ino5 interrupt cnt */
+ M1575_KIOP(statep)->intrs[KSTAT_INTR_SPURIOUS]++;
+ }
+
+ mutex_exit(&statep->lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->ksp) {
+ M1575_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ /*
+ * The Uli M1575 generates an interrupt for each interrupt
+ * type. therefore we only process one interrupt type
+ * per invocation of the audio1575_intr() routine.
+ * WARNING: DO NOT attempt to optimize this by looping
+ * until the INTRSR register is clear as this will
+ * generate spurious ino5 interrupts.
+ */
+ if (GET16(M1575_PCMISR_REG) & M1575_PCMISR_BCIS) {
+ /* Clear PCM IN interrupt */
+ PUT16(M1575_PCMISR_REG, M1575_SR_CLR);
+ /*
+ * Note: This interrupt is not cleared by writing a '1'
+ * to the M1575_INTRSR_REG according to the M1575 Super I/O
+ * data sheet on page 189.
+ */
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = GET8(M1575_PCMICIV_REG);
+ index = (index - 1) % M1575_BD_NUMS;
+ PUT8(M1575_PCMILVIV_REG, index);
+ produce = statep->ports[M1575_REC];
+
+ } else if (GET16(M1575_PCMOSR_REG) & M1575_PCMOSR_BCIS) {
+ /* Clear PCM OUT interrupt */
+ PUT16(M1575_PCMOSR_REG, M1575_SR_CLR);
+ /*
+ * Note: This interrupt is not cleared by writing a '1'
+ * to the M1575_INTRSR_REG according to the M1575 Super I/O
+ * data sheet on page 189.
+ */
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = GET8(M1575_PCMOCIV_REG);
+ index = (index - 1) % M1575_BD_NUMS;
+ PUT8(M1575_PCMOLVIV_REG, index);
+ consume = statep->ports[M1575_PLAY];
+
+ } else {
+ /* Clear other interrupts (there should not be any) */
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ }
+
+ mutex_exit(&statep->lock);
+
+ if (produce) {
+ audio_engine_produce(produce->engine);
+ }
+ if (consume) {
+ audio_engine_consume(consume->engine);
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * audio1575_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audio1575_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audio1575_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = M1575_BD_NUMS;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->lock);
+ audio1575_reset_port(port);
+ mutex_exit(&port->statep->lock);
+
+ return (0);
+}
+
+
+/*
+ * audio1575_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audio1575_close(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ audio1575_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->lock);
+}
+
+/*
+ * audio1575_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audio1575_stop(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ if (port->started) {
+ audio1575_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->lock);
+}
+
+/*
+ * audio1575_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audio1575_start(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+
+ mutex_enter(&statep->lock);
+ if (!port->started) {
+ audio1575_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->lock);
+ return (0);
+}
+
+/*
+ * audio1575_format()
+ *
+ * Description:
+ * Called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE
+ */
+static int
+audio1575_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audio1575_channels()
+ *
+ * Description:
+ * Called by the framework to query the channels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Number of channels for the device
+ */
+static int
+audio1575_channels(void *arg)
+{
+ audio1575_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audio1575_rate()
+ *
+ * Description:
+ * Called by the framework to query the sample rate for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audio1575_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audio1575_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audio1575_count(void *arg)
+{
+ audio1575_port_t *port = arg;
+ audio1575_state_t *statep = port->statep;
+ uint64_t val;
+
+ mutex_enter(&statep->lock);
+ audio1575_update_port(port);
+ val = port->count + port->picb;
+ mutex_exit(&statep->lock);
+
+ return (val);
+}
+
+/*
+ * audio1575_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audio1575_sync(void *arg, unsigned nframes)
+{
+ audio1575_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audio1575_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audio1575_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+
+/*
+ * audio1575_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to start.
+ */
+static void
+audio1575_start_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == M1575_REC) {
+ /* ULi says do fifo resets here */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+ PUT8(M1575_PCMICR_REG, M1575_PCMICR_IOCE);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMISTART);
+ } else {
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_IOCE);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOSTART);
+ }
+}
+
+/*
+ * audio1575_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to stop.
+ */
+static void
+audio1575_stop_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == M1575_REC) {
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+ } else {
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ }
+}
+
+/*
+ * audio1575_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audio1575_port_t *port Port of DMA engine to reset.
+ */
+static void
+audio1575_reset_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->lock));
+
+ port->civ = 0;
+ port->picb = 0;
+
+ if (statep->suspended)
+ return;
+
+ if (port->num == M1575_REC) {
+ /* Uli FIFO madness ... */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMIRST);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+
+ PUT8(M1575_PCMICR_REG, 0);
+ PUT8(M1575_PCMICR_REG, M1575_CR_RR | M1575_CR_IOCE);
+
+ PUT32(M1575_PCMIBDBAR_REG, port->bdl_paddr);
+ PUT8(M1575_PCMILVIV_REG, M1575_BD_NUMS - 1);
+
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMIPAUSE);
+
+ } else {
+
+ /* Uli FIFO madness ... */
+ SET32(M1575_FIFOCR1_REG, M1575_FIFOCR1_PCMORST);
+ SET32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+
+ PUT8(M1575_PCMOCR_REG, 0);
+ PUT8(M1575_PCMOCR_REG, M1575_CR_RR | M1575_CR_IOCE);
+
+ PUT32(M1575_PCMOBDBAR_REG, port->bdl_paddr);
+ PUT8(M1575_PCMOLVIV_REG, M1575_BD_NUMS - 1);
+
+ CLR32(M1575_DMACR_REG, M1575_DMACR_PCMOPAUSE);
+ }
+}
+
+/*
+ * audio1575_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audio1575_port_t *port The port to update.
+ */
+static void
+audio1575_update_port(audio1575_port_t *port)
+{
+ audio1575_state_t *statep = port->statep;
+ uint8_t civ;
+ uint16_t picb;
+ unsigned n;
+ int civoff;
+ int picoff;
+
+ if (port->num == M1575_REC) {
+ civoff = M1575_PCMICIV_REG;
+ picoff = M1575_PCMIPICB_REG;
+ } else {
+ civoff = M1575_PCMOCIV_REG;
+ picoff = M1575_PCMOPICB_REG;
+ }
+
+ if (statep->suspended) {
+ civ = 0;
+ picb = 0;
+ } else {
+ /*
+ * We read the position counters, but we're careful to avoid
+ * the situation where the position counter resets at the end
+ * of a buffer.
+ */
+ for (int i = 0; i < 2; i++) {
+ civ = GET8(civoff);
+ picb = GET16(picoff);
+ if (GET8(civoff) == civ) {
+ /*
+ * Chip did not start a new index, so
+ * the picb is valid.
+ */
+ break;
+ }
+ }
+ if (civ >= port->civ) {
+ n = civ - port->civ;
+ } else {
+ n = civ + (M1575_BD_NUMS - port->civ);
+ }
+ port->count += (n * port->fragfr);
+ }
+ port->civ = civ;
+ port->picb = picb;
+}
+
+/*
+ * audio1575_attach()
+ *
+ * Description:
+ * Attach an instance of the audio1575 driver. This routine does the
+ * device dependent attach tasks. When it is completed, it registers
+ * with the audio framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio1575_attach(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+ audio_dev_t *adev;
+ uint32_t devid;
+ const char *name;
+ const char *rev;
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
+ statep->dip = dip;
+
+ /*
+ * We want the micboost enabled by default as well.
+ */
+ ddi_prop_update_int(DDI_DEV_T_NONE, dip, AC97_PROP_MICBOOST, 1);
+
+ /* allocate common audio dev structure */
+ adev = audio_dev_alloc(dip, 0);
+ if (adev == NULL) {
+ audio_dev_warn(NULL, "unable to allocate audio dev");
+ goto error;
+ }
+ statep->adev = adev;
+
+ /* map in the audio registers */
+ if (audio1575_map_regs(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ if (audio1575_setup_intr(statep) != DDI_SUCCESS) {
+ /* message already noted */
+ goto error;
+ }
+
+ /* Enable PCI I/O and Memory Spaces */
+ audio1575_pci_enable(statep);
+
+ devid = (pci_config_get16(statep->pcih, PCI_CONF_VENID) << 16) |
+ pci_config_get16(statep->pcih, PCI_CONF_DEVID);
+ switch (devid) {
+ case 0x10b95455:
+ name = "Uli M1575 AC'97";
+ rev = "M5455";
+ break;
+ default:
+ name = "Uli AC'97";
+ rev = "Unknown";
+ break;
+ }
+ /* set device information -- this should check PCI config space */
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, rev);
+
+
+ /* allocate port structures */
+ if ((audio1575_alloc_port(statep, M1575_PLAY) != DDI_SUCCESS) ||
+ (audio1575_alloc_port(statep, M1575_REC) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ statep->ac97 = ac97_alloc(dip, audio1575_read_ac97,
+ audio1575_write_ac97, statep);
+ ASSERT(statep->ac97 != NULL);
+
+ if (audio1575_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to init chip");
+ goto error;
+ }
+
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(M1575_NAME,
+ ddi_get_instance(dip), M1575_NAME, "controller",
+ KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+ /* Enable PCI Interrupts */
+ pci_config_put8(statep->pcih, M1575_PCIMISC_REG, M1575_PCIMISC_INTENB);
+
+ /* enable audio interrupts */
+ if (ddi_intr_enable(statep->ih) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_intr_enable() failure");
+ goto error;
+ }
+
+ /* register with the framework */
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audio1575_destroy(statep);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_detach()
+ *
+ * Description:
+ * Detach an instance of the audio1575 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio1575_detach(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio1575_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audio1575_setup_intr()
+ *
+ * Description:
+ * This routine initializes the audio driver's interrupt handle and
+ * mutex.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Interrupt handle & mutex initialized
+ * DDI_FAILURE Interrupt handle & mutex not initialized
+ */
+int
+audio1575_setup_intr(audio1575_state_t *statep)
+{
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ uint_t ipri;
+ int actual;
+ int rv;
+ int itype;
+ int count;
+ ddi_intr_handle_t ih = NULL;
+
+ dip = statep->dip;
+ adev = statep->adev;
+
+ /* get supported interrupt types */
+ rv = ddi_intr_get_supported_types(dip, &itype);
+ if ((rv != DDI_SUCCESS) || (!(itype & DDI_INTR_TYPE_FIXED))) {
+ audio_dev_warn(adev, "Fixed type interrupts not supported");
+ return (DDI_FAILURE);
+ }
+
+ /* make sure we only have one fixed type interrupt */
+ rv = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
+ if ((rv != DDI_SUCCESS) || (count != 1)) {
+ audio_dev_warn(adev, "No fixed interrupts");
+ return (DDI_FAILURE);
+ }
+
+ rv = ddi_intr_alloc(statep->dip, &ih, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_STRICT);
+ if ((rv != DDI_SUCCESS) || (actual != 1)) {
+ audio_dev_warn(adev, "Can't alloc interrupt handle");
+ return (DDI_FAILURE);
+ }
+
+ /* test for a high level interrupt */
+ if (ddi_intr_get_pri(ih, &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "Can't get interrupt priority");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+ if (ipri >= ddi_intr_get_hilevel_pri()) {
+ audio_dev_warn(adev, "Unsupported high level interrupt");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(ih, audio1575_intr, statep, NULL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(adev, "Can't add interrupt handler");
+ (void) ddi_intr_free(ih);
+ return (DDI_FAILURE);
+ }
+
+ statep->ih = ih;
+ mutex_init(&statep->lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio1575_alloc_port(audio1575_state_t *statep, int num)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ audio_dev_t *adev;
+ audio1575_port_t *port;
+ uint32_t *kaddr;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ statep->ports[num] = port;
+ port->num = num;
+ port->statep = statep;
+ port->started = B_FALSE;
+
+ if (num == M1575_REC) {
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = 2;
+ } else {
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ /* XXX: possibly support multichannel! */
+ port->nchan = 2;
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, M1575_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < M1575_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, M1575_INTS);
+ port->intrs = M1575_INTS;
+ } else if (port->intrs > M1575_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, M1575_INTS);
+ port->intrs = M1575_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 32 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a shorter BD list.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = M1575_ROUNDUP(port->fragfr, M1575_MOD_SIZE);
+ port->samp_size = port->fragfr * port->nchan * 2;
+ port->samp_size *= M1575_BD_NUMS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wire up the BD list. We do this *before* binding the BD list
+ * so that we don't have to do an extra ddi_dma_sync.
+ */
+ paddr = port->samp_paddr;
+ kaddr = (void *)port->bdl_kaddr;
+ for (int i = 0; i < M1575_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, kaddr, paddr);
+ kaddr++;
+
+ /* set size in frames, and enable IOC interrupt */
+ ddi_put32(port->bdl_acch, kaddr,
+ ((port->fragfr * port->nchan) | (1U << 31)));
+ kaddr++;
+
+ paddr += (port->fragfr * port->nchan * 2);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ port->engine = audio_engine_alloc(&audio1575_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audio810_port_t *port The port structure for a DMA engine.
+ */
+static void
+audio1575_free_port(audio1575_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audio1575_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio1575_map_regs(audio1575_state_t *statep)
+{
+ dev_info_t *dip = statep->dip;
+
+ /* Check for fault management capabilities */
+ if (DDI_FM_ACC_ERR_CAP(ddi_fm_capable(dip))) {
+ dev_attr.devacc_attr_access = DDI_FLAGERR_ACC;
+ }
+
+ /* map the M1575 Audio PCI Cfg Space */
+ if (pci_config_setup(dip, &statep->pcih) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "PCI config map failure");
+ goto error;
+ }
+
+ /* map the M1575 Audio registers in PCI IO Space */
+ if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE, &statep->regsp,
+ 0, 0, &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "Audio IO mapping failure");
+ goto error;
+ }
+ return (DDI_SUCCESS);
+
+error:
+ audio1575_unmap_regs(statep);
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ */
+static void
+audio1575_unmap_regs(audio1575_state_t *statep)
+{
+ if (statep->regsh) {
+ ddi_regs_map_free(&statep->regsh);
+ }
+
+ if (statep->pcih) {
+ pci_config_teardown(&statep->pcih);
+ }
+}
+
+/*
+ * audio1575_chip_init()
+ *
+ * Description:
+ * This routine initializes the M1575 AC97 audio controller and the AC97
+ * codec. The AC97 codec registers are programmed from codec_shadow[].
+ * If we are not doing a restore, we initialize codec_shadow[], otherwise
+ * we use the current values of shadow. This routine expects that the
+ * PCI IO and Memory spaces have been mapped and enabled already.
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ * restore from codec_shadow[]
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audio1575_chip_init(audio1575_state_t *statep)
+{
+ uint32_t ssr;
+ uint32_t rtsr;
+ uint32_t intrsr;
+ int i;
+ int j;
+ uint8_t clk_detect;
+ clock_t ticks;
+ ddi_acc_handle_t pcih;
+
+ /*
+ * clear the interrupt control and status register
+ * READ/WRITE/READ workaround required
+ * for buggy hardware
+ */
+
+ PUT32(M1575_INTRCR_REG, 0);
+ (void) GET32(M1575_INTRCR_REG);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ (void) GET32(M1575_INTRSR_REG);
+
+ ticks = drv_usectohz(M1575_LOOP_CTR);
+
+ /*
+ * SADA only supports stereo, so we set the channel bits
+ * to "00" to select 2 channels.
+ * will also set the following:
+ *
+ * Disable double rate enable
+ * no SPDIF output selected
+ * 16 bit audio record mode
+ * 16 bit pcm out mode
+ * PCM Out 6 chan mode FL FR CEN BL BR LFE
+ * PCM Out 2 channel mode (00)
+ */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Reset the AC97 Codec and default to 2 channel 16 bit mode */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ delay(ticks<<1);
+
+ /* Read the System Status Reg */
+ ssr = GET32(M1575_SSR_REG);
+
+ /* make sure and release the blocked reset bit */
+ if (ssr & M1575_SSR_RSTBLK) {
+ SET32(M1575_INTFCR_REG, M1575_INTFCR_RSTREL);
+ delay(ticks);
+
+ /* Read the System Status Reg */
+ ssr = GET32(M1575_SSR_REG);
+
+ /* make sure and release the blocked reset bit */
+ if (ssr & M1575_SSR_RSTBLK) {
+ return (DDI_FAILURE);
+ }
+
+ /* Reset the controller */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ delay(ticks);
+ }
+
+ /* according AC'97 spec, wait for codec reset */
+ for (j = 0; j < M1575_LOOP_CTR; j++) {
+ if ((GET32(M1575_SCR_REG) & M1575_SCR_COLDRST) == 0) {
+ break;
+ }
+ delay(ticks);
+ }
+
+ /* codec reset failed */
+ if (j >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev,
+ "failure to reset codec");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wait for FACRDY First codec ready. The hardware can
+ * provide the state of
+ * codec ready bit on SDATA_IN[0] and as reflected in
+ * the Recv Tag Slot Reg.
+ */
+ rtsr = GET32(M1575_RTSR_REG);
+ if (rtsr & M1575_RTSR_FACRDY) {
+ break;
+ } else { /* reset the status and wait for new status to set */
+ rtsr |= M1575_RTSR_FACRDY;
+ PUT32(M1575_RTSR_REG, rtsr);
+ drv_usecwait(10);
+ }
+ }
+
+ /* if we could not reset the AC97 codec then report failure */
+ if (i >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev,
+ "no codec ready signal received");
+ return (DDI_FAILURE);
+ }
+
+ /* Magic code from ULi to Turn on the AC_LINK clock */
+ pcih = statep->pcih;
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 4);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ (void) pci_config_get8(pcih, M1575_PCIACD_REG);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 2);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ clk_detect = pci_config_get8(pcih, M1575_PCIACD_REG);
+
+ if (clk_detect != 1) {
+ audio_dev_warn(statep->adev, "No AC97 Clock Detected");
+ return (DDI_FAILURE);
+ }
+
+ /* Magic code from Uli to Init FIFO1 and FIFO2 */
+ PUT32(M1575_FIFOCR1_REG, 0x81818181);
+ PUT32(M1575_FIFOCR2_REG, 0x81818181);
+ PUT32(M1575_FIFOCR3_REG, 0x81818181);
+
+ /* Make sure that PCM in and PCM out are enabled */
+ SET32(M1575_INTFCR_REG, (M1575_INTFCR_PCMIENB | M1575_INTFCR_PCMOENB));
+
+ audio1575_dma_stop(statep);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_dma_stop()
+ *
+ * Description:
+ * This routine is used to put each DMA engine into the quiet state.
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_dma_stop(audio1575_state_t *statep)
+{
+ uint32_t intrsr;
+ int i;
+
+ if (statep->regsh == NULL) {
+ return;
+ }
+
+ /* pause bus master (needed for the following reset register) */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+
+ SET32(M1575_DMACR_REG, M1575_DMACR_PAUSE_ALL);
+ if (GET32(M1575_DMACR_REG) & M1575_DMACR_PAUSE_ALL) {
+ break;
+ }
+ drv_usecwait(10);
+ }
+
+ if (i >= M1575_LOOP_CTR) {
+ audio_dev_warn(statep->adev, "failed to stop DMA");
+ return;
+ }
+
+ /* Pause bus master (needed for the following reset register) */
+ PUT8(M1575_PCMICR_REG, 0);
+ PUT8(M1575_PCMOCR_REG, 0);
+ PUT8(M1575_MICICR_REG, 0);
+ PUT8(M1575_CSPOCR_REG, 0);
+ PUT8(M1575_PCMI2CR_RR, 0);
+ PUT8(M1575_MICI2CR_RR, 0);
+
+ /* Reset the bus master registers for all DMA engines */
+ PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
+ PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
+ PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
+ PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
+ PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
+ PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
+
+ /* Reset FIFOS */
+ PUT32(M1575_FIFOCR1_REG, 0x81818181);
+ PUT32(M1575_FIFOCR2_REG, 0x81818181);
+ PUT32(M1575_FIFOCR3_REG, 0x81818181);
+
+ /* Clear Interrupts */
+ SET16(M1575_PCMISR_REG, M1575_SR_CLR);
+ SET16(M1575_PCMOSR_REG, M1575_SR_CLR);
+ SET16(M1575_MICISR_REG, M1575_SR_CLR);
+ SET16(M1575_CSPOSR_REG, M1575_SR_CLR);
+ SET16(M1575_PCMI2SR_REG, M1575_SR_CLR);
+ SET16(M1575_MICI2SR_REG, M1575_SR_CLR);
+
+ /*
+ * clear the interrupt control and status register
+ * READ/WRITE/READ workaround required
+ * for buggy hardware
+ */
+
+ PUT32(M1575_INTRCR_REG, 0);
+ (void) GET32(M1575_INTRCR_REG);
+
+ intrsr = GET32(M1575_INTRSR_REG);
+ PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
+ (void) GET32(M1575_INTRSR_REG);
+}
+
+/*
+ * audio1575_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audio1575_codec_sync(audio1575_state_t *statep)
+{
+ /* do the Uli Shuffle ... */
+ for (int i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Read the semaphore, and loop till we own it */
+ if ((GET32(M1575_CASR_REG) & 1) == 0) {
+ for (int j = 0; j < M1575_LOOP_CTR; j++) {
+ /* Wait for CWRSUCC 0x8 */
+ if (GET32(M1575_CSPSR_REG) &
+ M1575_CSPSR_SUCC) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(1);
+ }
+ }
+ drv_usecwait(10);
+ }
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio1575_write_ac97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audio1575_write_ac97(void *arg, uint8_t reg, uint16_t data)
+{
+ audio1575_state_t *statep = arg;
+ int i;
+
+ mutex_enter(&statep->ac_lock);
+
+ if (audio1575_codec_sync(statep) != DDI_SUCCESS) {
+ mutex_exit(&statep->ac_lock);
+ return;
+ }
+
+ /* write the data to WRITE to the lo word of the CPR register */
+ PUT16(M1575_CPR_REG, data);
+
+ /* write the address to WRITE to the hi word of the CPR register */
+ PUT16(M1575_CPR_REG+2, reg);
+
+ /* wait until command is completed sucessfully */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Wait for Write Ready 0x01 */
+ if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_WRRDY) {
+ break;
+ }
+ drv_usecwait(1);
+ }
+
+ mutex_exit(&statep->ac_lock);
+
+ if (i < M1575_LOOP_CTR) {
+ (void) audio1575_read_ac97(statep, reg);
+ }
+}
+
+/*
+ * audio1575_read_ac97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register. It also updates codec_shadow[]
+ * with the register value.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * Value of AC97 register. (0xffff in failure situations).
+ */
+static uint16_t
+audio1575_read_ac97(void *arg, uint8_t reg)
+{
+ audio1575_state_t *statep = arg;
+ uint16_t addr = 0;
+ uint16_t data = 0xffff;
+ int i;
+
+ mutex_enter(&statep->ac_lock);
+ if ((audio1575_codec_sync(statep)) != DDI_SUCCESS) {
+ mutex_exit(&statep->ac_lock);
+ return (data);
+ }
+
+ /*
+ * at this point we have the CASR semaphore
+ * and the codec is r/w ready
+ * OR in the READ opcode into the address field
+ */
+
+ addr = (reg | M1575_CPR_READ);
+
+ /* write the address to READ to the hi word of the CPR register */
+ PUT16(M1575_CPR_REG+2, addr);
+
+ /* wait until command is completed sucessfully */
+ for (i = 0; i < M1575_LOOP_CTR; i++) {
+ /* Wait for Read Ready 0x02 */
+ if (GET32(M1575_CSPSR_REG) & M1575_CSPSR_RDRDY) {
+ break;
+ }
+ drv_usecwait(1);
+ }
+
+ if (i < M1575_LOOP_CTR) {
+ /* read back the data and address */
+ data = GET16(M1575_SPR_REG);
+ addr = GET16(M1575_SPR_REG+2);
+ if (addr != reg) {
+ data = 0xffff;
+ }
+ }
+
+ mutex_exit(&statep->ac_lock);
+ return (data);
+}
+
+/*
+ * audio1575_pci_enable()
+ *
+ * Description:
+ * This routine Enables all PCI IO and MEMORY accesses
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_pci_enable(audio1575_state_t *statep)
+{
+ uint16_t pcics_reg;
+
+ pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
+}
+
+/*
+ * audio1575_pci_disable()
+ *
+ * Description:
+ * This routine Disables all PCI IO and MEMORY accesses
+ *
+ * Arguments:
+ * audio1575_state_t *statep The device's state structure
+ */
+static void
+audio1575_pci_disable(audio1575_state_t *statep)
+{
+ uint16_t pcics_reg;
+
+ if (statep->pcih == NULL)
+ return;
+ pcics_reg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM, pcics_reg);
+}
+
+/*
+ * audio1575_resume()
+ *
+ * Description:
+ * Resume operation of the device after sleeping or hibernating.
+ * Note that this should never fail, even if hardware goes wonky,
+ * because the current PM framework will panic if it does.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was resumed
+ */
+static int
+audio1575_resume(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+ audio_dev_t *adev;
+
+ /* we've already allocated the state structure so get ptr */
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+ ASSERT(!mutex_owned(&statep->lock));
+
+ if (audio1575_chip_init(statep) != DDI_SUCCESS) {
+ /*
+ * Note that PM gurus say we should return
+ * success here. Failure of audio shouldn't
+ * be considered FATAL to the system. The
+ * upshot is that audio will not progress.
+ */
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ /* allow ac97 operations again */
+ ac97_resume(statep->ac97);
+
+ mutex_enter(&statep->lock);
+
+ ASSERT(statep->suspended);
+ statep->suspended = B_FALSE;
+
+ for (int i = 0; i < M1575_NUM_PORTS; i++) {
+
+ audio1575_port_t *port = statep->ports[i];
+
+ if (port != NULL) {
+ /* reset framework DMA engine buffer */
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+
+ /* reset and initialize hardware ports */
+ audio1575_reset_port(port);
+ if (port->started) {
+ audio1575_start_port(port);
+ } else {
+ audio1575_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&statep->lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_suspend()
+ *
+ * Description:
+ * Suspend an instance of the audio1575 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was suspended
+ */
+static int
+audio1575_suspend(dev_info_t *dip)
+{
+ audio1575_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ ac97_suspend(statep->ac97);
+
+ mutex_enter(&statep->lock);
+
+ statep->suspended = B_TRUE;
+
+ /*
+ * stop all DMA operations
+ */
+ audio1575_dma_stop(statep);
+
+ mutex_exit(&statep->lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio1575_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audio1575_state_t *state The device soft state.
+ *
+ * Returns:
+ * None
+ */
+void
+audio1575_destroy(audio1575_state_t *statep)
+{
+ ddi_acc_handle_t pcih;
+
+ /* stop DMA engines */
+ audio1575_dma_stop(statep);
+
+ if (statep->regsh != NULL) {
+ /* reset the codec */
+ PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
+ }
+
+ if ((pcih = statep->pcih) != NULL) {
+ /* turn off the AC_LINK clock */
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 4);
+ pci_config_put8(pcih, M1575_PCIACD_REG, 0);
+ }
+
+ /* Disable PCI I/O and Memory Spaces */
+ audio1575_pci_disable(statep);
+
+ if (statep->ih != NULL) {
+ (void) ddi_intr_disable(statep->ih);
+ (void) ddi_intr_remove_handler(statep->ih);
+ (void) ddi_intr_free(statep->ih);
+ mutex_destroy(&statep->lock);
+ mutex_destroy(&statep->ac_lock);
+ }
+
+ if (statep->ksp != NULL) {
+ kstat_delete(statep->ksp);
+ }
+
+ audio1575_free_port(statep->ports[M1575_PLAY]);
+ audio1575_free_port(statep->ports[M1575_REC]);
+
+ audio1575_unmap_regs(statep);
+
+ if (statep->ac97 != NULL) {
+ ac97_free(statep->ac97);
+ }
+
+ if (statep->adev != NULL) {
+ audio_dev_free(statep->adev);
+ }
+
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf
index 78b15ccbeb..cb3986c128 100644
--- a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.conf
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audio1575 audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -58,17 +46,3 @@ mixer-mode=1;
play-interrupts=175;
record-interrupts=175;
-
-#
-# uncomment the cdrom=1 to enable the CDROM analog input in the
-# audio1575 driver .
-#
-#cdrom=1;
-#
-#
-# Uncomment reset-configuration to cause the audio1575 driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
-
diff --git a/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h
new file mode 100644
index 0000000000..efdfb46cf6
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio1575/audio1575.h
@@ -0,0 +1,468 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef AUDIO1575_H
+#define AUDIO1575_H
+
+/*
+ * Header file for the audio1575 device driver
+ */
+
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define M1575_DEV_NAME "SUNW,audio1575"
+#define M1575_DEV_CONFIG "onboard1"
+#define M1575_DEV_VERSION "a"
+
+/*
+ * Driver supported configuration information
+ */
+#define M1575_NAME "audio1575"
+#define M1575_MOD_NAME "M1575 audio driver"
+
+#define M1575_INTS (175) /* default interrupt rate */
+#define M1575_MIN_INTS (25) /* minimum interrupt rate */
+#define M1575_MAX_INTS (5000) /* maximum interrupt rate */
+
+/*
+ * Implementation specific header file for the audio1575 device driver.
+ */
+
+/* Misc. defines */
+#define M1575_CONFIG_DEVICE_ID M1575_IDNUM
+#define M1575_CONFIG_VENDOR_ID (0x10b9)
+#define M1575_CONFIG_SUBSYSTEM_ID M1575_IDNUM
+#define M1575_CONFIG_SUBSYSTEM_VENDOR_ID M1575_CONFIG_VENDOR_ID
+#define M1575_AUDIO_PCICFG_SPACE (0)
+#define M1575_AUDIO_IO_SPACE (1)
+#define M1575_AUDIO_MEM_SPACE (2)
+
+#define M1575_LOOP_CTR (100)
+
+/* Gain and attenuation shift values */
+#define M1575_GAIN_SHIFT3 (3)
+#define M1575_GAIN_SHIFT4 (4)
+#define M1575_BYTE_SHIFT (8)
+
+/* audio direction */
+#define M1575_PLAY (0)
+#define M1575_REC (1)
+
+#define M1575_DMA_PCM_IN (1)
+#define M1575_DMA_PCM_OUT (2)
+
+/* last AC97 saved register */
+#define M1575_LAST_AC_REG (0x3a)
+
+/* Restore audio flags */
+#define M1575_INIT_RESTORE (0)
+#define M1575_INIT_NO_RESTORE ~M1575_INIT_RESTORE
+
+/* AC97 codec shadow reg to index macro */
+#define M1575_CODEC_REG(r) ((r) >> 1)
+
+/* play and record sample buffer counts */
+#define M1575_PLAY_BUFS (2)
+#define M1575_PLAY_BUF_MSK (M1575_PLAY_BUFS - 1)
+#define M1575_REC_BUFS (4)
+#define M1575_REC_BUF_MSK (M1575_REC_BUFS - 1)
+
+/* Buffer Descriptor List defines */
+#define M1575_BD_NUMS (32)
+#define M1575_NUM_PORTS (2)
+#define M1575_MOD_SIZE (16)
+
+/* default buffer size */
+#define M1575_BSIZE (8*1024)
+#define M1575_MOD_SIZE (16)
+#define M1575_PLAY_BUF_SZ (1024)
+#define M1575_RECORD_BUF_SZ (1024)
+#define M1575_BUF_MIN (512)
+#define M1575_BUF_MAX (8192)
+
+/* kstat interrupt counter define */
+#define M1575_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+#define M1575_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+
+/* PCI CFG SPACE REGISTERS for Audio (Device 29, Function 0) */
+#define M1575_PCIPMR_REG 0x42 /* Power Capabilities 16 */
+#define M1575_PCIPMCSR_REG 0x44 /* Power Cmd & Status 16 */
+#define M1575_PCISCCR_REG 0x48 /* System Cfg Cntrl 16 */
+#define M1575_PCIAPMUCR1_REG 0x54 /* Add. PMU Cntrl Reg 8 */
+#define M1575_PCISCRR_REG 0x57 /* Scratch Reg 8 */
+#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
+#define M1575_PCIGCC_REG 0x59 /* Global Clk Control 16 */
+#define M1575_PCIACD_REG 0x5C /* AC97 Codec Detect 8 */
+#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
+#define M1575_PCIGCLK_REG 0x59 /* Misc Reg 8 */
+#define M1575_PCIMSICTRL_REG 0x62 /* MSI Control Reg 16 */
+#define M1575_PCIMSIADDR_REG 0x64 /* MSI Address Reg 32 */
+#define M1575_PCIMSIDATA_REG 0x68 /* MSI Data Reg 16 */
+#define M1575_PCIMSIMASK_REG 0x6C /* MSI Data Reg 32 */
+#define M1575_PCIMSIPEND_REG 0x70 /* MSI Pend Reg 32 */
+
+/* Bit definitions for PCI AC97 Clk detect Reg */
+#define M1575_PCIACD_CLKDET 0x01
+#define M1575_PCIMISC_INTENB 0x40
+#define M1575_PCIINT_LINE 0x05
+
+/* Base Line Audio I/O Memory Registers */
+#define M1575_SCR_REG 0x00 /* System Control Reg 32 */
+#define M1575_SSR_REG 0x04 /* System System Reg 32 */
+#define M1575_DMACR_REG 0x08 /* DMA Control Reg 32 */
+#define M1575_FIFOCR1_REG 0x0C /* FIFO 1 Control Reg 32 */
+#define M1575_INTFCR_REG 0x10 /* Interface Ctrl Reg 32 */
+#define M1575_INTRCR_REG 0x14 /* Interrupt Ctrl Reg 32 */
+#define M1575_INTRSR_REG 0x18 /* Interrupt Status Reg 32 */
+#define M1575_FIFOCR2_REG 0x1C /* FIFO 2 Control Reg 32 */
+#define M1575_CPR_REG 0x20 /* Cmd Port Reg 32 */
+#define M1575_SPR_REG 0x24 /* Status Port Reg 32 */
+#define M1575_FIFOCR3_REG 0x2C /* FIFO 3 Control Reg 32 */
+#define M1575_TTSR_REG 0x30 /* Tx Tag Slot Reg 32 */
+#define M1575_RTSR_REG 0x34 /* Rx Tag Slot Reg 32 */
+#define M1575_CSPSR_REG 0x38 /* CSP Status Reg 32 */
+#define M1575_CASR_REG 0x3C /* Codec Access Sem Reg 32 */
+
+/* PCM IN Registers */
+#define M1575_PCMIBDBAR_REG 0x40 /* 32 */
+#define M1575_PCMICIV_REG 0x44 /* 8 */
+#define M1575_PCMILVIV_REG 0x45 /* 8 */
+#define M1575_PCMISR_REG 0x46 /* 16 */
+#define M1575_PCMIPICB_REG 0x48 /* 16 */
+#define M1575_PCMICR_REG 0x4B /* 8 */
+
+/* PCM OUT Registers */
+#define M1575_PCMOBDBAR_REG 0x50 /* 32 */
+#define M1575_PCMOCIV_REG 0x54 /* 8 */
+#define M1575_PCMOLVIV_REG 0x55 /* 8 */
+#define M1575_PCMOSR_REG 0x56 /* 16 */
+#define M1575_PCMOPICB_REG 0x58 /* 16 */
+#define M1575_PCMOCR_REG 0x5B /* 8 */
+
+/* MIC In Registers */
+#define M1575_MICIBDBAR_REG 0x60 /* 32 */
+#define M1575_MICICIV_REG 0x64 /* 8 */
+#define M1575_MICILVIV_REG 0x65 /* 8 */
+#define M1575_MICISR_REG 0x66 /* 16 */
+#define M1575_MICIPICB_REG 0x68 /* 16 */
+#define M1575_MICICR_REG 0x6B /* 8 */
+
+/* SPIDOF Registers */
+#define M1575_CSPOBDBAR_REG 0x70 /* 32 */
+#define M1575_CSPOCIV_REG 0x74 /* 8 */
+#define M1575_CSPOLVIV_REG 0x75 /* 8 */
+#define M1575_CSPOSR_REG 0x76 /* 16 */
+#define M1575_CSPOPICB_REG 0x78 /* 16 */
+#define M1575_CSPOCR_REG 0x7B /* 8 */
+
+/* PCM IN2 Registers */
+#define M1575_PCMI2BDBAR_REG 0xd0 /* 32 */
+#define M1575_PCMI2CIV_REG 0xd4 /* 8 */
+#define M1575_PCMI2LVIV_REG 0xd5 /* 8 */
+#define M1575_PCMI2SR_REG 0xd6 /* 16 */
+#define M1575_PCMI2PICB_REG 0xd8 /* 16 */
+#define M1575_PCMI2CR_REG 0xdB /* 8 */
+
+/* MIC2 IN2 Registers */
+#define M1575_MICI2BDBAR_REG 0xe0 /* 32 */
+#define M1575_MICI2CIV_REG 0xe4 /* 8 */
+#define M1575_MICI2LVIV_REG 0xe5 /* 8 */
+#define M1575_MICI2SR_REG 0xe6 /* 16 */
+#define M1575_MICI2PICB_REG 0xe8 /* 16 */
+#define M1575_MICI2CR_REG 0xeB /* 8 */
+
+/* Bits of FIFO Control Register1 */
+#define M1575_FIFOCR1_CSPORST 0x80000000 /* SPDIF Out Reset */
+#define M1575_FIFOCR1_MICIRST 0x00800000 /* MIC In Reset */
+#define M1575_FIFOCR1_PCMORST 0x00008000 /* PCM Out Reset */
+#define M1575_FIFOCR1_PCMIRST 0x00000080 /* PCM In Reset */
+
+/* Bits of FIFO Control Register2 */
+#define M1575_FIFOCR2_SPORST 0x80000000 /* SPDIF Out FIFO Reset */
+#define M1575_FIFOCR2_SPIRST 0x00800000 /* SPDIF In FIFO Reset */
+#define M1575_FIFOCR2_LFEORST 0x00008000 /* LFE Out FIFO Reset */
+#define M1575_FIFOCR2_CENORST 0x00000080 /* CENTER Out Reset */
+
+/* Bits of FIFO Control Register3 */
+#define M1575_FIFOCR3_PCMI2RST 0x00800000 /* PCM In2 FIFO Reset */
+#define M1575_FIFOCR3_MICI2RST 0x00008000 /* MIC In2 FIFO Reset */
+#define M1575_FIFOCR3_I2SIRST 0x00000080 /* I2S In FIFO Reset */
+
+/* Bits of DMA Control Register */
+#define M1575_DMACR_PCMISTART 0x00000001
+#define M1575_DMACR_PCMOSTART 0x00000002
+#define M1575_DMACR_MICISTART 0x00000004
+#define M1575_DMACR_CSPOSTART 0x00000008
+#define M1575_DMACR_CENOSTART 0x00000010
+#define M1575_DMACR_LFEOSTART 0x00000020
+#define M1575_DMACR_SPISTART 0x00000040
+#define M1575_DMACR_SPOSTART 0x00000080
+#define M1575_DMACR_I2SISTART 0x00000100
+#define M1575_DMACR_PCMI2START 0x00000200
+#define M1575_DMACR_MICI2START 0x00000400
+#define M1575_DMACR_PCMIPAUSE 0x00010000
+#define M1575_DMACR_PCMOPAUSE 0x00020000
+#define M1575_DMACR_MICIPAUSE 0x00040000
+#define M1575_DMACR_CSPOPAUSE 0x00080000
+#define M1575_DMACR_CENOPAUSE 0x00100000
+#define M1575_DMACR_LFEOPAUSE 0x00200000
+#define M1575_DMACR_SPIPAUSE 0x00400000
+#define M1575_DMACR_SPOPAUSE 0x00800000
+#define M1575_DMACR_I2SIPAUSE 0x01000000
+#define M1575_DMACR_PCMI2PAUSE 0x02000000
+#define M1575_DMACR_MICI2PAUSE 0x04000000
+
+#define M1575_DMACR_PAUSE_ALL 0x07ff0000
+
+/* Bits of INTRSR Interrupt Status Register */
+#define M1575_INTRSR_GPIOINTR 0x0000002
+#define M1575_INTRSR_SPRINTR 0x0000020
+#define M1575_INTRSR_CPRINTR 0x0000080
+#define M1575_INTRSR_PCMIINTR 0x0010000
+#define M1575_INTRSR_PCMOINTR 0x0020000
+#define M1575_INTRSR_MICIINTR 0x0040000
+#define M1575_INTRSR_CSPOINTR 0x0080000
+#define M1575_INTRSR_CENOINTR 0x0100000
+#define M1575_INTRSR_LFEOINTR 0x0200000
+#define M1575_INTRSR_SPIINTR 0x0400000
+#define M1575_INTRSR_SPOINTR 0x0800000
+#define M1575_INTRSR_I2SIINTR 0x1000000
+#define M1575_INTRSR_PCMI2INTR 0x2000000
+#define M1575_INTRSR_MICI2INTR 0x4000000
+
+#define M1575_INTR_MASK (M1575_INTRSR_GPIOINTR |\
+ M1575_INTRSR_SPRINTR |\
+ M1575_INTRSR_CPRINTR |\
+ M1575_INTRSR_PCMIINTR |\
+ M1575_INTRSR_PCMOINTR |\
+ M1575_INTRSR_MICIINTR |\
+ M1575_INTRSR_CSPOINTR |\
+ M1575_INTRSR_CENOINTR |\
+ M1575_INTRSR_LFEOINTR |\
+ M1575_INTRSR_SPIINTR |\
+ M1575_INTRSR_SPOINTR |\
+ M1575_INTRSR_I2SIINTR |\
+ M1575_INTRSR_PCMI2INTR|\
+ M1575_INTRSR_MICI2INTR)
+
+#define M1575_UNUSED_INTR_MASK (M1575_INTRSR_GPIOINTR |\
+ M1575_INTRSR_SPRINTR |\
+ M1575_INTRSR_CPRINTR |\
+ M1575_INTRSR_MICIINTR |\
+ M1575_INTRSR_CSPOINTR |\
+ M1575_INTRSR_CENOINTR |\
+ M1575_INTRSR_LFEOINTR |\
+ M1575_INTRSR_SPIINTR |\
+ M1575_INTRSR_SPOINTR |\
+ M1575_INTRSR_I2SIINTR |\
+ M1575_INTRSR_PCMI2INTR|\
+ M1575_INTRSR_MICI2INTR)
+
+/* Defines a generic clear for all MIC and PCM Status Registers */
+#define M1575_SR_CLR 0x001e
+#define M1575_SR_DMACS 0x0001
+
+/* Defines a generic RESET for all MIC and PCM Control Registers */
+#define M1575_CR_IOCE 0x10
+#define M1575_CR_RR 0x02
+
+/* Bits of PCM In Status Register */
+#define M1575_PCMISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_PCMISR_CELV 0x02
+#define M1575_PCMISR_LVBCI 0x04
+#define M1575_PCMISR_BCIS 0x08
+#define M1575_PCMISR_FIFOE 0x10
+
+/* Bits in PCM In Control Register */
+#define M1575_PCMICR_RR 0x02 /* Reset */
+#define M1575_PCMICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_PCMICR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits of PCM Out Status Register */
+#define M1575_PCMOSR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_PCMOSR_CELV 0x02
+#define M1575_PCMOSR_LVBCI 0x04
+#define M1575_PCMOSR_BCIS 0x08
+#define M1575_PCMOSR_FIFOE 0x10
+
+/* Bits in PCM Out Control Register */
+#define M1575_PCMOCR_RR 0x02 /* Reset */
+#define M1575_PCMOCR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_PCMOCR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits of MIC In Status Register */
+#define M1575_MICISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
+#define M1575_MICISR_CELV 0x02
+#define M1575_MICISR_LVBCI 0x04
+#define M1575_MICISR_BCIS 0x08
+#define M1575_MICISR_FIFOE 0x10
+
+/* Bits in PCM In Control Register */
+#define M1575_MICICR_RR 0x02 /* Reset */
+#define M1575_MICICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
+#define M1575_MICICR_IOCE 0x10 /* Intr On Completion Enable */
+
+/* Bits in System Control Register */
+#define M1575_SCR_WARMRST 0x00000001
+#define M1575_SCR_COLDRST 0x00000002
+#define M1575_SCR_DRENT 0x40000000
+#define M1575_SCR_MSTRST 0x80000000
+
+/* Bits in System Status Register */
+#define M1575_SSR_RSTBLK 0x00000002
+#define M1575_SSR_FACCS_MSK 0x00000018
+#define M1575_SSR_SCID 0x00000040
+
+/* Bits in Command Port Register */
+#define M1575_CPR_ACSCS 0x0100 /* Audio Codec for cmd 1=codec 2 */
+#define M1575_CPR_READ 0x0080
+
+/* Bits in Cmd Status Port Register */
+#define M1575_CSPSR_SUCC 0x08 /* cmd successful */
+#define M1575_CSPSR_RDRDY 0x02 /* ready for read cmd */
+#define M1575_CSPSR_WRRDY 0x01 /* ready for write cmd */
+#define M1575_PCMI2CR_RR 0x02 /* Reset */
+#define M1575_MICI2CR_RR 0x02 /* Reset */
+#define M1575_CSPOCR_RR 0x02 /* Reset */
+
+/* Bits in Interface Control Register */
+#define M1575_INTFCR_RSTREL 0x02000000
+#define M1575_INTFCR_RSTBLK 0x00200000
+#define M1575_INTFCR_MICENB 0x00100000
+#define M1575_INTFCR_PCMIENB 0x00080000
+#define M1575_INTFCR_MICI2ENB 0x00040000
+#define M1575_INTFCR_PCMI2ENB 0x00020000
+#define M1575_INTFCR_MICI2SEL 0x00008000
+#define M1575_INTFCR_MICISEL 0x00004000
+#define M1575_INTFCR_PCMOENB 0x00000002
+
+#define M1575_INTRCR_CPRINTR 0x00000080
+#define M1575_INTRCR_SPRINTR 0x00000020
+#define M1575_INTRCR_GPIOINTR 0x00000002
+
+/* Bits of Recv Tag Slot Register */
+#define M1575_RTSR_SACRDY 0x20u /* 2nd Audio Codec Rdy */
+#define M1575_RTSR_FACRDY 0x80u /* 1st Audio Codec Rdy */
+
+/* Semaphore busy */
+#define M1575_CASR_SEMBSY 0x80000000
+
+/*
+ * buffer descripter list entry, see M1575 datasheet
+ */
+#define IOC 0x8000
+#define BUP 0x4000
+
+struct m1575_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t buf_len; /* the number of samples */
+ uint16_t buf_cmd;
+};
+typedef struct m1575_bd_entry m1575_bd_entry_t;
+
+struct audio1575_port {
+ struct audio1575_state *statep;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ int num;
+ unsigned intrs;
+ unsigned fragfr;
+ uint64_t count;
+ uint8_t nchan;
+
+ uint8_t civ;
+ uint16_t picb;
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audio1575_port audio1575_port_t;
+
+
+/*
+ * audio1575_state_t per instance state and operation data
+ */
+struct audio1575_state {
+ kmutex_t lock; /* intr mutex */
+ kmutex_t ac_lock; /* ac'97 mutex */
+ dev_info_t *dip; /* dev instance ptr */
+ audio_dev_t *adev; /* audio handle */
+ ac97_t *ac97; /* ac'97 handle */
+ audio1575_port_t *ports[2]; /* DMA engines */
+
+ ddi_intr_handle_t ih; /* intr handle */
+
+ ddi_acc_handle_t pcih; /* pci config space */
+
+ ddi_acc_handle_t regsh; /* audio i/o regs */
+ caddr_t regsp; /* base of i/o regs */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ boolean_t suspended; /* if DDI_SUSPENDed */
+};
+typedef struct audio1575_state audio1575_state_t;
+
+/* audio i/o register macros */
+#define GET8(reg) \
+ ddi_get8(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define GET16(reg) \
+ ddi_get16(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define GET32(reg) \
+ ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define PUT8(reg, val) \
+ ddi_put8(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define PUT16(reg, val) \
+ ddi_put16(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define PUT32(reg, val) \
+ ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define SET8(reg, bit) PUT8(reg, GET8(reg) | (bit))
+#define SET16(reg, bit) PUT16(reg, GET16(reg) | (bit))
+#define SET32(reg, bit) PUT32(reg, GET32(reg) | (bit))
+#define CLR8(reg, bit) PUT8(reg, GET8(reg) & ~(bit))
+#define CLR16(reg, bit) PUT16(reg, GET16(reg) & ~(bit))
+#define CLR32(reg, bit) PUT32(reg, GET32(reg) & ~(bit))
+
+
+#endif /* AUDIO1575_H */
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.c b/usr/src/uts/common/io/audio/drv/audio810/audio810.c
new file mode 100644
index 0000000000..9d186df9e0
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.c
@@ -0,0 +1,1971 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audio810 Audio Driver
+ *
+ * The driver is primarily targeted at providing audio support for the
+ * W1100z and W2100z systems, which use the AMD 8111 audio core and
+ * the Realtek ALC 655 codec. The ALC 655 chip supports only fixed 48k
+ * sample rate. However, the audio core of AMD 8111 is completely
+ * compatible to the Intel ICHx chips (Intel 8x0 chipsets), so the
+ * driver can work for the ICHx. We only support the 48k maximum
+ * rate, since we only have a single PCM out channel.
+ *
+ * The AMD 8111 audio core, as an AC'97 controller, has independent
+ * channels for PCM in, PCM out, mic in, modem in, and modem out.
+ * The AC'97 controller is a PCI bus master with scatter/gather
+ * support. Each channel has a DMA engine. Currently, we use only
+ * the PCM in and PCM out channels. Each DMA engine uses one buffer
+ * descriptor list. And the buffer descriptor list is an array of up
+ * to 32 entries, each of which describes a data buffer. Each entry
+ * contains a pointer to a data buffer, control bits, and the length
+ * of the buffer being pointed to, where the length is expressed as
+ * the number of samples. This, combined with the 16-bit sample size,
+ * gives the actual physical length of the buffer.
+ *
+ * A workaround for the AD1980 and AD1985 codec:
+ * Most vendors connect the surr-out of the codecs to the line-out jack.
+ * So far we haven't found which vendors don't do that. So we assume that
+ * all vendors swap the surr-out and the line-out outputs. So we need swap
+ * the two outputs. But we still internally process the
+ * "ad198x-swap-output" property. If someday some vendors do not swap the
+ * outputs, we would set "ad198x-swap-output = 0" in the
+ * /kernel/drv/audio810.conf file, and unload and reload the audio810
+ * driver (or reboot).
+ *
+ * NOTE:
+ * This driver depends on the drv/audio and misc/ac97
+ * modules being loaded first.
+ */
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audio810.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audio810_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audio810_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audio810_ddi_quiesce(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audio810_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audio810_close(void *);
+static int audio810_start(void *);
+static void audio810_stop(void *);
+static int audio810_format(void *);
+static int audio810_channels(void *);
+static int audio810_rate(void *);
+static uint64_t audio810_count(void *);
+static void audio810_sync(void *, unsigned);
+static size_t audio810_qlen(void *);
+
+static audio_engine_ops_t audio810_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audio810_open,
+ audio810_close,
+ audio810_start,
+ audio810_stop,
+ audio810_count,
+ audio810_format,
+ audio810_channels,
+ audio810_rate,
+ audio810_sync,
+ audio810_qlen
+};
+
+/*
+ * interrupt handler
+ */
+static uint_t audio810_intr(caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audio810_attach(dev_info_t *);
+static int audio810_resume(dev_info_t *);
+static int audio810_detach(dev_info_t *);
+static int audio810_suspend(dev_info_t *);
+
+static int audio810_alloc_port(audio810_state_t *, int, uint8_t);
+static void audio810_start_port(audio810_port_t *);
+static void audio810_stop_port(audio810_port_t *);
+static void audio810_reset_port(audio810_port_t *);
+static void audio810_update_port(audio810_port_t *);
+static int audio810_codec_sync(audio810_state_t *);
+static void audio810_write_ac97(void *, uint8_t, uint16_t);
+static uint16_t audio810_read_ac97(void *, uint8_t);
+static int audio810_map_regs(dev_info_t *, audio810_state_t *);
+static void audio810_unmap_regs(audio810_state_t *);
+static void audio810_stop_dma(audio810_state_t *);
+static int audio810_chip_init(audio810_state_t *);
+static void audio810_destroy(audio810_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
+static char *audio810_name = I810_NAME;
+
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audio810_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audio810_ddi_attach, /* devo_attach */
+ audio810_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audio810_ddi_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audio810_modldrv = {
+ &mod_driverops, /* drv_modops */
+ I810_MOD_NAME, /* drv_linkinfo */
+ &audio810_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audio810_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audio810_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0000ffff, /* count_max */
+ 8, /* align, BDL must be aligned on a 8-byte boundary */
+ 0x3c, /* burstsize */
+ 8, /* minxfer, set to the size of a BDlist entry */
+ 0x0000ffff, /* maxxfer */
+ 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
+ 1, /* sgllen, there's no scatter-gather list */
+ 8, /* granular, set to the value of minxfer */
+ 0 /* flags, use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0001ffff, /* count_max */
+ 4, /* align, data buffer is aligned on a 4-byte boundary */
+ 0x3c, /* burstsize */
+ 4, /* minxfer, set to the size of a sample data */
+ 0x0001ffff, /* maxxfer */
+ 0x0001ffff, /* seg */
+ 1, /* sgllen, no scatter-gather */
+ 4, /* granular, set to the value of minxfer */
+ 0, /* flags, use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audio810_dev_ops, I810_NAME);
+
+ if ((error = mod_install(&audio810_modlinkage)) != 0) {
+ audio_fini_ops(&audio810_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audio810_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* clean up ops */
+ audio_fini_ops(&audio810_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audio810_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audio810_ddi_attach()
+ *
+ * Description:
+ * Implements the DDI attach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio810_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audio810_attach(dip));
+
+ case DDI_RESUME:
+ return (audio810_resume(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_ddi_detach()
+ *
+ * Description:
+ * Implements the detach(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio810_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audio810_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audio810_suspend(dip));
+ }
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_ddi_quiesce()
+ *
+ * Description:
+ * Implements the quiesce(9e) entry point.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was quiesced
+ * DDI_FAILURE The driver couldn't be quiesced
+ */
+static int
+audio810_ddi_quiesce(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ if ((statep = ddi_get_driver_private(dip)) == NULL)
+ return (DDI_FAILURE);
+
+ audio810_stop_dma(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * Each of buffer descriptor has a field IOC(interrupt on completion)
+ * When both this and the IOC bit of correspondent dma control register
+ * is set, it means that the controller should issue an interrupt upon
+ * completion of this buffer.
+ * (AMD 8111 hypertransport I/O hub data sheet. 3.8.3 page 71)
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audio810_intr(caddr_t arg)
+{
+ audio810_state_t *statep;
+ uint16_t gsr;
+
+ statep = (void *)arg;
+ mutex_enter(&statep->inst_lock);
+
+ if (statep->suspended) {
+ mutex_exit(&statep->inst_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ gsr = I810_BM_GET32(I810_REG_GSR);
+
+ /* check if device is interrupting */
+ if ((gsr & I810_GSR_USE_INTR) == 0) {
+ mutex_exit(&statep->inst_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ for (int pnum = 0; pnum < I810_NUM_PORTS; pnum++) {
+ audio810_port_t *port;
+ uint8_t regoff, index;
+
+ port = statep->ports[pnum];
+ if (port == NULL) {
+ continue;
+ }
+ regoff = port->regoff;
+
+ if (!(I810_BM_GET8(port->stsoff) & I810_BM_SR_BCIS))
+ continue;
+
+ /* update the LVI -- we just set it to the current value - 1 */
+ index = I810_BM_GET8(regoff + I810_OFFSET_CIV);
+ index = (index - 1) % I810_BD_NUMS;
+
+ I810_BM_PUT8(regoff + I810_OFFSET_LVI, index);
+
+ /* clear any interrupt */
+ I810_BM_PUT8(port->stsoff,
+ I810_BM_SR_LVBCI | I810_BM_SR_BCIS | I810_BM_SR_FIFOE);
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->ksp) {
+ I810_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&statep->inst_lock);
+
+ /* notify the framework */
+ if (gsr & I810_GSR_INTR_PIN) {
+ audio_engine_produce(statep->ports[I810_PCM_IN]->engine);
+ }
+ if (gsr & I810_GSR_INTR_POUT) {
+ audio_engine_consume(statep->ports[I810_PCM_OUT]->engine);
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * audio810_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audio810_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audio810_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrag;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->inst_lock);
+ audio810_reset_port(port);
+ mutex_exit(&port->statep->inst_lock);
+
+ return (0);
+}
+
+/*
+ * audio810_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audio810_close(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ audio810_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audio810_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audio810_stop(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (port->started) {
+ audio810_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audio810_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audio810_start(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (!port->started) {
+ audio810_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->inst_lock);
+ return (0);
+}
+
+/*
+ * audio810_format()
+ *
+ * Description:
+ * This is called by the framework to query the format of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Format of the device (fixed at AUDIO_FORMAT_S16_LE)
+ */
+static int
+audio810_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audio810_channels()
+ *
+ * Description:
+ * This is called by the framework to query the num channels of
+ * the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 0 number of channels for device
+ */
+static int
+audio810_channels(void *arg)
+{
+ audio810_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audio810_rate()
+ *
+ * Description:
+ * This is called by the framework to query the rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Rate of device (fixed at 48000 Hz)
+ */
+static int
+audio810_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audio810_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audio810_count(void *arg)
+{
+ audio810_port_t *port = arg;
+ audio810_state_t *statep = port->statep;
+ uint64_t val;
+ uint16_t picb;
+ uint64_t count;
+ uint8_t nchan;
+
+ mutex_enter(&statep->inst_lock);
+ audio810_update_port(port);
+ count = port->count;
+ picb = port->picb;
+ nchan = port->nchan;
+ mutex_exit(&statep->inst_lock);
+
+ if (statep->quirk == QUIRK_SIS7012) {
+ val = count + picb / (2 * nchan);
+ } else {
+ val = count + (picb / nchan);
+ }
+
+ return (val);
+}
+
+/*
+ * audio810_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audio810_sync(void *arg, unsigned nframes)
+{
+ audio810_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audio810_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audio810_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audio810_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to start.
+ */
+static void
+audio810_start_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t cr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR);
+ cr |= I810_BM_CR_IOCE;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+ cr |= I810_BM_CR_RUN;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+}
+
+/*
+ * audio810_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to stop.
+ */
+static void
+audio810_stop_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t cr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ cr = I810_BM_GET8(port->regoff + I810_OFFSET_CR);
+ cr &= ~I810_BM_CR_RUN;
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, cr);
+}
+
+/*
+ * audio810_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audio810_port_t *port Port of DMA engine to reset.
+ */
+static void
+audio810_reset_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint32_t gcr;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ port->civ = 0;
+ port->picb = 0;
+
+ if (statep->suspended)
+ return;
+
+ /*
+ * Make sure we put once in stereo, to ensure we always start from
+ * front left.
+ */
+ if (port->num == I810_PCM_OUT) {
+
+ if (statep->quirk == QUIRK_SIS7012) {
+ /*
+ * SiS 7012 needs its own special multichannel config.
+ */
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ gcr &= ~I810_GCR_SIS_CHANNELS_MASK;
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ switch (statep->maxch) {
+ case 2:
+ gcr |= I810_GCR_SIS_2_CHANNELS;
+ break;
+ case 4:
+ gcr |= I810_GCR_SIS_4_CHANNELS;
+ break;
+ case 6:
+ gcr |= I810_GCR_SIS_6_CHANNELS;
+ break;
+ }
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ /*
+ * SiS 7012 has special unmute bit.
+ */
+ I810_BM_PUT8(I810_REG_SISCTL, I810_SISCTL_UNMUTE);
+
+ } else {
+
+ /*
+ * All other devices work the same.
+ */
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ gcr &= ~I810_GCR_CHANNELS_MASK;
+
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+
+ switch (statep->maxch) {
+ case 2:
+ gcr |= I810_GCR_2_CHANNELS;
+ break;
+ case 4:
+ gcr |= I810_GCR_4_CHANNELS;
+ break;
+ case 6:
+ gcr |= I810_GCR_6_CHANNELS;
+ break;
+ }
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+ delay(drv_usectohz(50000)); /* 50 msec */
+ }
+ }
+
+ /*
+ * Perform full reset of the engine, but leave it turned off.
+ */
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, 0);
+ I810_BM_PUT8(port->regoff + I810_OFFSET_CR, I810_BM_CR_RST);
+
+ /* program the offset of the BD list */
+ I810_BM_PUT32(port->regoff + I810_OFFSET_BD_BASE, port->bdl_paddr);
+
+ /* we set the last index to the full count -- all buffers are valid */
+ I810_BM_PUT8(port->regoff + I810_OFFSET_LVI, I810_BD_NUMS - 1);
+}
+
+/*
+ * audio810_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audio810_port_t *port The port to update.
+ */
+static void
+audio810_update_port(audio810_port_t *port)
+{
+ audio810_state_t *statep = port->statep;
+ uint8_t regoff = port->regoff;
+ uint8_t civ;
+ uint16_t picb;
+ unsigned n;
+
+ if (statep->suspended) {
+ civ = 0;
+ picb = 0;
+ } else {
+ /*
+ * We read the position counters, but we're careful to avoid
+ * the situation where the position counter resets at the end
+ * of a buffer.
+ */
+ for (int i = 0; i < 2; i++) {
+ civ = I810_BM_GET8(regoff + I810_OFFSET_CIV);
+ picb = I810_BM_GET16(port->picboff);
+ if (I810_BM_GET8(regoff + I810_OFFSET_CIV) == civ) {
+ /*
+ * Chip did not start a new index,
+ * so the picb is valid.
+ */
+ break;
+ }
+ }
+
+ if (civ >= port->civ) {
+ n = civ - port->civ;
+ } else {
+ n = civ + (I810_BD_NUMS - port->civ);
+ }
+ port->count += (n * port->fragfr);
+ }
+ port->civ = civ;
+ port->picb = picb;
+}
+
+/*
+ * audio810_attach()
+ *
+ * Description:
+ * Attach an instance of the audio810 driver. This routine does the
+ * device dependent attach tasks, and registers with the audio framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audio810_attach(dev_info_t *dip)
+{
+ uint16_t cmdreg;
+ audio810_state_t *statep;
+ audio_dev_t *adev;
+ ddi_acc_handle_t pcih;
+ uint32_t devid;
+ uint32_t gsr;
+ const char *name;
+ const char *vers;
+ uint8_t nch;
+ int maxch;
+
+ /* we don't support high level interrupts in the driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN, "!%s: unsupported high level interrupt",
+ audio810_name);
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
+
+ /* get iblock cookie information */
+ if (ddi_get_iblock_cookie(dip, 0, &statep->iblock) != DDI_SUCCESS) {
+ cmn_err(CE_WARN, "!%s: cannot get iblock cookie",
+ audio810_name);
+ kmem_free(statep, sizeof (*statep));
+ return (DDI_FAILURE);
+ }
+ mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->iblock);
+ mutex_init(&statep->ac_lock, NULL, MUTEX_DRIVER, statep->iblock);
+
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "!%s: unable to allocate audio dev",
+ audio810_name);
+ goto error;
+ }
+ statep->adev = adev;
+ statep->dip = dip;
+
+ /* map in the registers, allocate DMA buffers, etc. */
+ if (audio810_map_regs(dip, statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ /* set PCI command register */
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "pci conf mapping failed");
+ goto error;
+ }
+ cmdreg = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_config_put16(pcih, PCI_CONF_COMM,
+ cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
+ devid = pci_config_get16(pcih, PCI_CONF_VENID);
+ devid <<= 16;
+ devid |= pci_config_get16(pcih, PCI_CONF_DEVID);
+ pci_config_teardown(&pcih);
+
+ /*
+ * Override "max-channels" property to prevent configuration
+ * of 4 or 6 (or possibly even 8!) channel audio. The default
+ * is to support as many channels as the hardware can do.
+ *
+ * (Hmmm... perhaps this should be driven in the common
+ * framework. The framework could even offer simplistic upmix
+ * and downmix for various standard configs.)
+ */
+ maxch = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "max-channels", 8);
+ if (maxch < 2) {
+ maxch = 2;
+ }
+
+ gsr = I810_BM_GET32(I810_REG_GSR);
+ if (gsr & I810_GSR_CAP6CH) {
+ nch = 6;
+ } else if (gsr & I810_GSR_CAP4CH) {
+ nch = 4;
+ } else {
+ nch = 2;
+ }
+
+ statep->maxch = (uint8_t)min(nch, maxch);
+ statep->maxch &= ~1;
+ name = "Unknown AC'97";
+ vers = "";
+
+ statep->quirk = QUIRK_NONE;
+ switch (devid) {
+ case 0x80862415:
+ name = "Intel AC'97";
+ vers = "ICH";
+ break;
+ case 0x80862425:
+ name = "Intel AC'97";
+ vers = "ICH0";
+ break;
+ case 0x80867195:
+ name = "Intel AC'97";
+ vers = "440MX";
+ break;
+ case 0x80862445:
+ name = "Intel AC'97";
+ vers = "ICH2";
+ break;
+ case 0x80862485:
+ name = "Intel AC'97";
+ vers = "ICH3";
+ break;
+ case 0x808624C5:
+ name = "Intel AC'97";
+ vers = "ICH4";
+ break;
+ case 0x808624D5:
+ name = "Intel AC'97";
+ vers = "ICH5";
+ break;
+ case 0x8086266E:
+ name = "Intel AC'97";
+ vers = "ICH6";
+ break;
+ case 0x808627DE:
+ name = "Intel AC'97";
+ vers = "ICH7";
+ break;
+ case 0x808625A6:
+ name = "Intel AC'97";
+ vers = "6300ESB";
+ break;
+ case 0x80862698:
+ name = "Intel AC'97";
+ vers = "ESB2";
+ break;
+ case 0x10397012:
+ name = "SiS AC'97";
+ vers = "7012";
+ statep->quirk = QUIRK_SIS7012;
+ break;
+ case 0x10de01b1: /* nForce */
+ name = "NVIDIA AC'97";
+ vers = "MCP1";
+ break;
+ case 0x10de006a: /* nForce 2 */
+ name = "NVIDIA AC'97";
+ vers = "MCP2";
+ break;
+ case 0x10de00da: /* nForce 3 */
+ name = "NVIDIA AC'97";
+ vers = "MCP3";
+ break;
+ case 0x10de00ea:
+ name = "NVIDIA AC'97";
+ vers = "CK8S";
+ break;
+ case 0x10de0059:
+ name = "NVIDIA AC'97";
+ vers = "CK804";
+ break;
+ case 0x10de008a:
+ name = "NVIDIA AC'97";
+ vers = "CK8";
+ break;
+ case 0x10de003a: /* nForce 4 */
+ name = "NVIDIA AC'97";
+ vers = "MCP4";
+ break;
+ case 0x10de026b:
+ name = "NVIDIA AC'97";
+ vers = "MCP51";
+ break;
+ case 0x1022746d:
+ name = "AMD AC'97";
+ vers = "8111";
+ break;
+ case 0x10227445:
+ name = "AMD AC'97";
+ vers = "AMD768";
+ break;
+ }
+ /* set device information */
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, vers);
+
+ /* allocate port structures */
+ if ((audio810_alloc_port(statep, I810_PCM_OUT, statep->maxch) !=
+ DDI_SUCCESS) ||
+ (audio810_alloc_port(statep, I810_PCM_IN, 2) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ /* allocate ac97 handle */
+ statep->ac97 = ac97_alloc(dip, audio810_read_ac97, audio810_write_ac97,
+ statep);
+ if (statep->ac97 == NULL) {
+ audio_dev_warn(adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ /* initialize audio controller and AC97 codec */
+ if (audio810_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to init chip");
+ goto error;
+ }
+
+ /* initialize the AC'97 part */
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(I810_NAME, ddi_get_instance(dip),
+ I810_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, &statep->iblock,
+ NULL, audio810_intr, (caddr_t)statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "bad interrupt specification");
+ goto error;
+ }
+ statep->intr_added = B_TRUE;
+
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audio810_destroy(statep);
+
+ return (DDI_FAILURE);
+}
+
+
+/*
+ * audio810_resume()
+ *
+ * Description:
+ * Resume operation of the device after sleeping or hibernating.
+ * Note that this should never fail, even if hardware goes wonky,
+ * because the current PM framework will panic if it does.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was resumed.
+ */
+static int
+audio810_resume(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+ audio_dev_t *adev;
+
+ /* this should always be valid */
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+
+ ASSERT(statep != NULL);
+ ASSERT(dip == statep->dip);
+
+ /* Restore the audio810 chip's state */
+ if (audio810_chip_init(statep) != DDI_SUCCESS) {
+ /*
+ * Note that PM gurus say we should return
+ * success here. Failure of audio shouldn't
+ * be considered FATAL to the system. The
+ * upshot is that audio will not progress.
+ */
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ /* allow ac97 operations again */
+ ac97_resume(statep->ac97);
+
+ mutex_enter(&statep->inst_lock);
+
+ ASSERT(statep->suspended);
+ statep->suspended = B_FALSE;
+
+ for (int i = 0; i < I810_NUM_PORTS; i++) {
+
+ audio810_port_t *port = statep->ports[i];
+
+ if (port != NULL) {
+ /* reset framework DMA engine buffer */
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+
+ /* reset and initialize hardware ports */
+ audio810_reset_port(port);
+ if (port->started) {
+ audio810_start_port(port);
+ } else {
+ audio810_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&statep->inst_lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_detach()
+ *
+ * Description:
+ * Detach an instance of the audio810 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audio810_detach(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ /* don't detach us if we are still in use */
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio810_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_suspend()
+ *
+ * Description:
+ * Suspend an instance of the audio810 driver, in preparation for
+ * sleep or hibernation.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was suspended
+ */
+static int
+audio810_suspend(dev_info_t *dip)
+{
+ audio810_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ ac97_suspend(statep->ac97);
+
+ mutex_enter(&statep->inst_lock);
+
+ ASSERT(statep->suspended == B_FALSE);
+
+ statep->suspended = B_TRUE; /* stop new ops */
+
+ /* stop DMA engines */
+ audio810_stop_dma(statep);
+
+ mutex_exit(&statep->inst_lock);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio810_alloc_port(audio810_state_t *statep, int num, uint8_t nchan)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ char *nfprop;
+ audio_dev_t *adev;
+ audio810_port_t *port;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+ i810_bd_entry_t *bdentry;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ statep->ports[num] = port;
+ port->statep = statep;
+ port->started = B_FALSE;
+ port->nchan = nchan;
+ port->num = num;
+
+ switch (num) {
+ case I810_PCM_IN:
+ prop = "record-interrupts";
+ nfprop = "record-fragments";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->regoff = I810_BASE_PCM_IN;
+ break;
+ case I810_PCM_OUT:
+ prop = "play-interrupts";
+ nfprop = "play-fragments";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ port->regoff = I810_BASE_PCM_OUT;
+ break;
+ default:
+ audio_dev_warn(adev, "bad port number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * SiS 7012 swaps status and picb registers.
+ */
+ if (statep->quirk == QUIRK_SIS7012) {
+ port->stsoff = port->regoff + I810_OFFSET_PICB;
+ port->picboff = port->regoff + I810_OFFSET_SR;
+ } else {
+ port->stsoff = port->regoff + I810_OFFSET_SR;
+ port->picboff = port->regoff + I810_OFFSET_PICB;
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, I810_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < I810_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, I810_INTS);
+ port->intrs = I810_INTS;
+ } else if (port->intrs > I810_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, I810_INTS);
+ port->intrs = I810_INTS;
+ }
+
+ port->nfrag = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, nfprop, I810_NFRAGS);
+
+ /*
+ * Note that fragments must divide evenly into I810_BD_NUMS (32).
+ */
+ if (port->nfrag <= 4) {
+ port->nfrag = 4;
+ } else if (port->nfrag <= 8) {
+ port->nfrag = 8;
+ } else if (port->nfrag <= 16) {
+ port->nfrag = 16;
+ } else {
+ port->nfrag = I810_BD_NUMS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 32 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a shorter BD list.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = I810_ROUNDUP(port->fragfr, I810_MOD_SIZE);
+ port->fragsz = port->fragfr * port->nchan * 2;
+ port->samp_size = port->fragsz * port->nfrag;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc (%d) failed: %d",
+ port->samp_size, rc);
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (i810_bd_entry_t) * I810_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ /*
+ * Wire up the BD list.
+ */
+ paddr = port->samp_paddr;
+ bdentry = (void *)port->bdl_kaddr;
+ for (int i = 0; i < I810_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, &bdentry->buf_base, paddr);
+ /*
+ * SiS 7012 counts samples in bytes, all other count
+ * in words.
+ */
+ ddi_put16(port->bdl_acch, &bdentry->buf_len,
+ statep->quirk == QUIRK_SIS7012 ? port->fragsz :
+ port->fragsz / 2);
+ ddi_put16(port->bdl_acch, &bdentry->buf_cmd,
+ BUF_CMD_IOC | BUF_CMD_BUP);
+ paddr += port->fragsz;
+ if ((i % port->nfrag) == (port->nfrag - 1)) {
+ /* handle wrap */
+ paddr = port->samp_paddr;
+ }
+ bdentry++;
+ }
+ (void) ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ port->engine = audio_engine_alloc(&audio810_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audio810_port_t *port The port structure for a DMA engine.
+ */
+static void
+audio810_free_port(audio810_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audio810_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audio810_map_regs(dev_info_t *dip, audio810_state_t *statep)
+{
+ uint_t nregs = 0;
+ int *regs_list;
+ int i;
+ int pciBar1 = 0;
+ int pciBar2 = 0;
+ int pciBar3 = 0;
+ int pciBar4 = 0;
+
+ /* check the "reg" property to get the length of memory-mapped I/O */
+ if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "reg", (int **)&regs_list, &nregs) != DDI_PROP_SUCCESS) {
+ audio_dev_warn(statep->adev, "inquire regs property failed");
+ goto error;
+ }
+ /*
+ * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10
+ * and 0x14 BAR separately for native audio mixer BAR and native bus
+ * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5,
+ * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for
+ * higher performance access to the controller register. All features
+ * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14
+ * BAR) capabilities obsolete. However, these controller maintain the
+ * I/O BAR capability to allow for the reuse of legacy code maintaining
+ * backward compatibility. The I/O BAR is disabled unless system BIOS
+ * enables the simultaneous backward compatible capability on the 0x41
+ * register.
+ *
+ * When I/O BAR is enabled, the value of "reg" property should be like
+ * this,
+ * phys_hi phys_mid phys_lo size_hi size_lo
+ * --------------------------------------------------------
+ * 0000fd00 00000000 00000000 00000000 00000000
+ * 0100fd10 00000000 00000000 00000000 00000100
+ * 0100fd14 00000000 00000000 00000000 00000040
+ * 0200fd18 00000000 00000000 00000000 00000200
+ * 0200fd1c 00000000 00000000 00000000 00000100
+ *
+ * When I/O BAR is disabled, the "reg" property of the device node does
+ * not consist of the description for the I/O BAR. The following example
+ * illustrates the vaule of "reg" property,
+ *
+ * phys_hi phys_mid phys_lo size_hi size_lo
+ * --------------------------------------------------------
+ * 0000fd00 00000000 00000000 00000000 00000000
+ * 0200fd18 00000000 00000000 00000000 00000200
+ * 0200fd1c 00000000 00000000 00000000 00000100
+ *
+ * If the hardware has memory-mapped I/O access, first try to use
+ * this facility, otherwise we will try I/O access.
+ */
+ for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) {
+ switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) {
+ case 0x10:
+ pciBar1 = i;
+ break;
+ case 0x14:
+ pciBar2 = i;
+ break;
+ case 0x18:
+ pciBar3 = i;
+ break;
+ case 0x1c:
+ pciBar4 = i;
+ break;
+ default: /* we don't care others */
+ break;
+ }
+ }
+
+ if ((pciBar3 != 0) && (pciBar4 != 0)) {
+ /* map audio mixer registers */
+ if ((ddi_regs_map_setup(dip, pciBar3, &statep->am_regs_base, 0,
+ 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "memory am mapping failed");
+ goto error;
+ }
+
+ /* map bus master register */
+ if ((ddi_regs_map_setup(dip, pciBar4, &statep->bm_regs_base, 0,
+ 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "memory bm mapping failed");
+ goto error;
+ }
+
+ } else if ((pciBar1 != 0) && (pciBar2 != 0)) {
+ /* map audio mixer registers */
+ if ((ddi_regs_map_setup(dip, pciBar1, &statep->am_regs_base, 0,
+ 0, &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "I/O am mapping failed");
+ goto error;
+ }
+
+ /* map bus master register */
+ if ((ddi_regs_map_setup(dip, pciBar2, &statep->bm_regs_base, 0,
+ 0, &dev_attr, &statep->bm_regs_handle)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "I/O bm mapping failed");
+ goto error;
+ }
+ } else {
+ audio_dev_warn(statep->adev, "map_regs() pci BAR error");
+ goto error;
+ }
+
+ ddi_prop_free(regs_list);
+
+ return (DDI_SUCCESS);
+
+error:
+ if (nregs > 0) {
+ ddi_prop_free(regs_list);
+ }
+ audio810_unmap_regs(statep);
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ */
+static void
+audio810_unmap_regs(audio810_state_t *statep)
+{
+ if (statep->bm_regs_handle) {
+ ddi_regs_map_free(&statep->bm_regs_handle);
+ }
+
+ if (statep->am_regs_handle) {
+ ddi_regs_map_free(&statep->am_regs_handle);
+ }
+}
+
+/*
+ * audio810_chip_init()
+ *
+ * Description:
+ * This routine initializes the AMD 8111 audio controller.
+ * codec.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audio810_chip_init(audio810_state_t *statep)
+{
+ uint32_t gcr;
+ uint32_t gsr;
+ uint32_t codec_ready;
+ int loop;
+ clock_t ticks;
+
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ ticks = drv_usectohz(100);
+
+ /*
+ * Clear the channels bits for now. We'll set them later in
+ * reset port.
+ */
+ if (statep->quirk == QUIRK_SIS7012) {
+ gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_SIS_CHANNELS_MASK);
+ } else {
+ gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK);
+ }
+
+ /*
+ * Datasheet(ICH5, document number of Intel: 252751-001):
+ * 3.6.5.5(page 37)
+ * if reset bit(bit1) is "0", driver must set it
+ * to "1" to de-assert the AC_RESET# signal in AC
+ * link, thus completing a cold reset. But if the
+ * bit is "1", then a warm reset is required.
+ */
+ gcr |= (gcr & I810_GCR_COLD_RST) == 0 ?
+ I810_GCR_COLD_RST:I810_GCR_WARM_RST;
+ I810_BM_PUT32(I810_REG_GCR, gcr);
+
+ /* according AC'97 spec, wait for codec reset */
+ for (loop = 6000; --loop >= 0; ) {
+ delay(ticks);
+ gcr = I810_BM_GET32(I810_REG_GCR);
+ if ((gcr & I810_GCR_WARM_RST) == 0) {
+ break;
+ }
+ }
+
+ /* codec reset failed */
+ if (loop < 0) {
+ audio_dev_warn(statep->adev, "Failed to reset codec");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Wait for codec ready. The hardware can provide the state of
+ * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2]
+ */
+ codec_ready =
+ I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY;
+ for (loop = 7000; --loop >= 0; ) {
+ delay(ticks);
+ gsr = I810_BM_GET32(I810_REG_GSR);
+ if ((gsr & codec_ready) != 0) {
+ break;
+ }
+ }
+ if (loop < 0) {
+ audio_dev_warn(statep->adev, "No codec ready signal received");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ audio810_stop_dma(statep);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audio810_stop_dma()
+ *
+ * Description:
+ * This routine is used to put each DMA engine into the quiet state.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ */
+static void
+audio810_stop_dma(audio810_state_t *statep)
+{
+ if (statep->bm_regs_handle == NULL) {
+ return;
+ }
+ /* pause bus master (needed for the following reset register) */
+ I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, 0x0);
+ I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, 0x0);
+ I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, 0x0);
+
+ /* and then reset the bus master registers for a three DMA engines */
+ I810_BM_PUT8(I810_BASE_PCM_IN + I810_OFFSET_CR, I810_BM_CR_RST);
+ I810_BM_PUT8(I810_BASE_PCM_OUT + I810_OFFSET_CR, I810_BM_CR_RST);
+ I810_BM_PUT8(I810_BASE_MIC + I810_OFFSET_CR, I810_BM_CR_RST);
+}
+
+
+/*
+ * audio810_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audio810_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audio810_codec_sync(audio810_state_t *statep)
+{
+ int i;
+ uint16_t casr;
+
+ for (i = 0; i < 300; i++) {
+ casr = I810_BM_GET8(I810_REG_CASR);
+ if ((casr & 1) == 0) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(10);
+ }
+
+ return (DDI_FAILURE);
+}
+
+/*
+ * audio810_write_ac97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audio810_write_ac97(void *arg, uint8_t reg, uint16_t data)
+{
+ audio810_state_t *statep = arg;
+
+ mutex_enter(&statep->ac_lock);
+ if (audio810_codec_sync(statep) == DDI_SUCCESS) {
+ I810_AM_PUT16(reg, data);
+ }
+ mutex_exit(&statep->ac_lock);
+
+ (void) audio810_read_ac97(statep, reg);
+}
+
+/*
+ * audio810_read_ac97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * The register value.
+ */
+static uint16_t
+audio810_read_ac97(void *arg, uint8_t reg)
+{
+ audio810_state_t *statep = arg;
+ uint16_t val = 0xffff;
+
+ mutex_enter(&statep->ac_lock);
+ if (audio810_codec_sync(statep) == DDI_SUCCESS) {
+ val = I810_AM_GET16(reg);
+ }
+ mutex_exit(&statep->ac_lock);
+ return (val);
+}
+
+/*
+ * audio810_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audio810_state_t *state The device soft state.
+ */
+void
+audio810_destroy(audio810_state_t *statep)
+{
+ /* stop DMA engines */
+ audio810_stop_dma(statep);
+
+ if (statep->intr_added) {
+ ddi_remove_intr(statep->dip, 0, NULL);
+ }
+
+ if (statep->ksp) {
+ kstat_delete(statep->ksp);
+ }
+
+ for (int i = 0; i < I810_NUM_PORTS; i++) {
+ audio810_free_port(statep->ports[i]);
+ }
+
+ audio810_unmap_regs(statep);
+
+ if (statep->ac97)
+ ac97_free(statep->ac97);
+
+ if (statep->adev)
+ audio_dev_free(statep->adev);
+
+ mutex_destroy(&statep->inst_lock);
+ mutex_destroy(&statep->ac_lock);
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.conf b/usr/src/uts/common/io/audio/drv/audio810/audio810.conf
new file mode 100644
index 0000000000..1041a2a8d1
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.conf
@@ -0,0 +1,97 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audio810 audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audio810
+# driver enforces a maximum and minimum count.
+#
+# It should also be understood that not all interrupt rates are legal.
+# The hardware is restricted to DMA buffers being allocated on certain
+# boundaries. If those boundaries are violated the driver will not be
+# loaded and an error message is entered into the messages log
+#
+# play-interrupts=250;
+# record-interrupts=250;
+
+#
+# The presence of the ac97-speaker property enables the use of a monoaural
+# output, normally intended for use with a speaker phone. Most systems
+# do not connect this to anything. The value of the property indicates
+# whether the speaker will be enabled by default or not.
+#
+# ac97-speaker=0;
+
+#
+# Uncomment ac97-micboost below to enable the use of a 20dB microphone boost.
+#
+# ac97-micboost=1;
+
+#
+# Uncomment properties below to suppress the AC'97 outputs that are
+# supported by the codec, but not connected to anything. Note
+# that the headphone feature in particular is commonly implemented as
+# an alternate output for the line out, and uses that with jack detection
+# instead of the codec's headphone feature.
+#
+# We don't allow diabling the lineout -- that's such a fundamental
+# part of ac97 that we doubt any vendor isn't using it.
+#
+# ac97-no-headphone=1;
+# ac97-no-auxout=1;
+
+#
+# Uncomment properties below to suppress the AC'97 inputs that are
+# supported by the codec, but not connected to anything. Note that
+# CDROM input support is mandatory in AC'97, so all codecs implement
+# it, even though many systems may not even have a CDROM installed.
+#
+# Generally, you can count on a linein and mic jack being present,
+# although some Toshiba models have been seen that lack a line-level
+# input jack.
+#
+# ac97-no-cdrom=1;
+# ac97-no-auxin=1;
+# ac97-no-video=1;
+# ac97-no-phone=1;
+# ac97-no-linein=1;
+# ac97-no-mic=1;
+
+#
+# Uncomment ac97-amplifier below to power down the external
+# amplifier. Most hardware doesn't need this property. But some
+# devices, such as some Sony Vaio laptops, need to set this property to
+# 0 to correct the inverted polarity of the external amplifier device.
+#
+# ac97-amplifier=0;
diff --git a/usr/src/uts/common/io/audio/drv/audio810/audio810.h b/usr/src/uts/common/io/audio/drv/audio810/audio810.h
new file mode 100644
index 0000000000..65917f0d02
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audio810/audio810.h
@@ -0,0 +1,267 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO810_H_
+#define _AUDIO810_H_
+
+/*
+ * Header file for the audio810 device driver
+ */
+
+/*
+ * Driver supported configuration information
+ */
+#define I810_NAME "audio810"
+#define I810_MOD_NAME "audio810 audio driver"
+
+#define I810_INTS (175) /* default interrupt rate */
+#define I810_MIN_INTS (24) /* minimum interrupt rate */
+#define I810_MAX_INTS (5000) /* maximum interrupt rate */
+#define I810_NFRAGS (8) /* default # fragments */
+
+/*
+ * Misc. defines
+ */
+
+#define I810_BD_NUMS (32)
+#define I810_NUM_PORTS (2)
+#define I810_MOD_SIZE (16)
+
+#define I810_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+#define I810_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+/* The size of each entry of "reg" property is 5 integers */
+#define I810_INTS_PER_REG_PROP 5
+
+/* offset from the base of specified DMA engine */
+#define I810_OFFSET_BD_BASE (0x00)
+#define I810_OFFSET_CIV (0x04)
+#define I810_OFFSET_LVI (0x05)
+#define I810_OFFSET_SR (0x06)
+#define I810_OFFSET_PICB (0x08)
+#define I810_OFFSET_PIV (0x0A)
+#define I810_OFFSET_CR (0x0B)
+
+/* DMA engine offset from base */
+#define I810_BASE_PCM_IN (0x00)
+#define I810_BASE_PCM_OUT (0x10)
+#define I810_BASE_MIC (0x20)
+
+#define I810_REG_GCR 0x2C
+#define I810_REG_GSR 0x30
+#define I810_REG_CASR 0x34
+#define I810_REG_SISCTL 0x4C /* SiS 7012 control */
+
+/* bits of bus master status register */
+#define I810_BM_SR_DCH 0x01
+#define I810_BM_SR_CELV 0x02
+#define I810_BM_SR_LVBCI 0x04
+#define I810_BM_SR_BCIS 0x08
+#define I810_BM_SR_FIFOE 0x10
+
+/* bits of bus master control register */
+#define I810_BM_CR_RUN 0x01
+#define I810_BM_CR_RST 0x02
+#define I810_BM_CR_LVBIE 0x04
+#define I810_BM_CR_FEIE 0x08
+#define I810_BM_CR_IOCE 0x10
+
+#define I810_BM_CR_PAUSE 0x00
+
+/*
+ * Global Control Register
+ */
+#define I810_GCR_GPIE 0x00000001
+#define I810_GCR_COLD_RST 0x00000002
+#define I810_GCR_WARM_RST 0x00000004
+#define I810_GCR_ACLINK_OFF 0x00000008
+#define I810_GCR_PRI_INTR_ENABLE 0x00000010
+#define I810_GCR_SEC_INTR_ENABLE 0x00000020
+
+/* For ICH2 or more, bit21:20 is the PCM 4/6-channel enable bits */
+#define I810_GCR_2_CHANNELS (0 << 20)
+#define I810_GCR_4_CHANNELS (1 << 20)
+#define I810_GCR_6_CHANNELS (2 << 20)
+#define I810_GCR_CHANNELS_MASK (3 << 20)
+/* SiS 7012 has its own flags here */
+#define I810_GCR_SIS_2_CHANNELS (0 << 6)
+#define I810_GCR_SIS_4_CHANNELS (1 << 6)
+#define I810_GCR_SIS_6_CHANNELS (2 << 6)
+#define I810_GCR_SIS_CHANNELS_MASK (3 << 6)
+
+
+/*
+ * Global Status Register
+ */
+#define I810_GSR_TRI_READY 0x10000000 /* for ICH4/5 */
+#define I810_GSR_CAP8CH 0x00400000
+#define I810_GSR_CAP6CH 0x00200000
+#define I810_GSR_CAP4CH 0x00100000
+#define I810_GSR_READ_COMPL 0x00008000
+#define I810_GSR_INTR_SEC_RESUME 0x00000800
+#define I810_GSR_INTR_PRI_RESUME 0x00000400
+#define I810_GSR_SEC_READY 0x00000200
+#define I810_GSR_PRI_READY 0x00000100
+#define I810_GSR_INTR_MIC 0x00000080
+#define I810_GSR_INTR_POUT 0x00000040
+#define I810_GSR_INTR_PIN 0x00000020
+#define I810_GSR_INTR_MO 0x00000004
+#define I810_GSR_INTR_MI 0x00000002
+#define I810_GSR_INTR_GSI 0x00000001
+#define I810_GSR_USE_INTR 0x00000060 /* PCM-IN ,PCM-OUT */
+
+/*
+ * SiS Control Register
+ */
+#define I810_SISCTL_UNMUTE 0x01
+
+/*
+ * Macro for AD1980 codec
+ */
+#define AD1980_VID1 0x4144
+#define AD1980_VID2 0x5370
+#define AD1985_VID2 0x5375
+#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
+#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
+#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
+#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
+
+#define I810_PCM_IN 0
+#define I810_PCM_OUT 1
+
+struct audio810_port {
+ struct audio810_state *statep;
+ int num;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ uint64_t count;
+ uint8_t nfrag;
+ uint8_t nchan;
+
+ uint8_t regoff;
+ uint8_t stsoff; /* status offset */
+ uint8_t picboff; /* picb offset */
+ uint8_t civ;
+ uint16_t picb;
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audio810_port audio810_port_t;
+
+/*
+ * buffer descripter list entry, sees datasheet
+ */
+struct i810_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t buf_len; /* the number of samples */
+ uint16_t buf_cmd;
+};
+typedef struct i810_bd_entry i810_bd_entry_t;
+#define BUF_CMD_BUP 0x4000
+#define BUF_CMD_IOC 0x8000
+
+typedef enum i810_quirk {
+ QUIRK_NONE = 0,
+ QUIRK_SIS7012, /* weird registers and such */
+} i810_quirk_t;
+
+/*
+ * audio810_state_t -per instance state and operation data
+ */
+struct audio810_state {
+ kmutex_t inst_lock; /* state protection lock */
+ kmutex_t ac_lock;
+ ddi_iblock_cookie_t iblock;
+ dev_info_t *dip; /* used by audio810_getinfo() */
+ audio_dev_t *adev;
+ ac97_t *ac97;
+ audio810_port_t *ports[2];
+
+ ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
+ ddi_acc_handle_t bm_regs_handle; /* for bus master register */
+ caddr_t am_regs_base; /* base of audio mixer regs */
+ caddr_t bm_regs_base; /* base of bus master regs */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ boolean_t intr_added;
+ boolean_t suspended; /* suspend/resume state */
+ uint8_t maxch;
+ i810_quirk_t quirk;
+};
+typedef struct audio810_state audio810_state_t;
+
+/*
+ * Useful bit twiddlers
+ */
+#define I810_BM_GET8(reg) \
+ ddi_get8(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_GET16(reg) \
+ ddi_get16(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_GET32(reg) \
+ ddi_get32(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)))
+
+#define I810_BM_PUT8(reg, val) \
+ ddi_put8(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_BM_PUT16(reg, val) \
+ ddi_put16(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_BM_PUT32(reg, val) \
+ ddi_put32(statep->bm_regs_handle, \
+ (void *)((char *)statep->bm_regs_base + (reg)), (val))
+
+#define I810_AM_GET16(reg) \
+ ddi_get16(statep->am_regs_handle, \
+ (void *)((char *)statep->am_regs_base + (reg)))
+
+#define I810_AM_PUT16(reg, val) \
+ ddi_put16(statep->am_regs_handle, \
+ (void *)((char *)statep->am_regs_base + (reg)), (val))
+
+#endif /* _AUDIO810_H_ */
diff --git a/usr/src/uts/common/io/audio/drv/audioens/audioens.c b/usr/src/uts/common/io/audio/drv/audioens/audioens.c
new file mode 100644
index 0000000000..f5220f5229
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.c
@@ -0,0 +1,1458 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Creative/Ensoniq AudioPCI97 driver (ES1371/ES1373)
+ *
+ * This driver is used with the original Ensoniq AudioPCI97 card and many
+ * PCI based Sound Blaster cards by Creative Technologies. For example
+ * Sound Blaster PCI128 and Creative/Ectiva EV1938.
+ */
+
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include <sys/note.h>
+#include <sys/pci.h>
+#include "audioens.h"
+
+/*
+ * The original OSS driver used a single duplex engine and a separate
+ * playback only engine. Instead, we expose three engines, one for input
+ * and two for output.
+ */
+
+/*
+ * Set the latency to 32, 64, 96, 128 clocks - some APCI97 devices exhibit
+ * garbled audio in some cases and setting the latency to higer values fixes it
+ * Values: 32, 64, 96, 128 - Default: 64 (or defined by bios)
+ */
+int audioens_latency = 0;
+
+/*
+ * Enable SPDIF port on SoundBlaster 128D or Sound Blaster Digital-4.1 models
+ * Values: 1=Enable 0=Disable Default: 0
+ */
+int audioens_spdif = 0;
+
+/*
+ * Note: Latest devices can support SPDIF with AC3 pass thru.
+ * However, in order to do this, one of the two DMA engines must be
+ * dedicated to this, which would prevent the card from supporting 4
+ * channel audio. For now we don't bother with the AC3 pass through
+ * mode, and instead just focus on 4 channel support. In the future,
+ * this could be selectable via a property.
+ */
+
+#define ENSONIQ_VENDOR_ID 0x1274
+#define CREATIVE_VENDOR_ID 0x1102
+#define ECTIVA_VENDOR_ID 0x1102
+#define ENSONIQ_ES1371 0x1371
+#define ENSONIQ_ES5880 0x8001
+#define ENSONIQ_ES5880A 0x8002
+#define ENSONIQ_ES5880B 0x5880
+#define ECTIVA_ES1938 0x8938
+
+#define DEFRATE 48000
+#define DEFINTS 75
+#define DRVNAME "audioens"
+
+typedef struct audioens_port
+{
+ /* Audio parameters */
+ boolean_t trigger;
+ boolean_t suspended;
+
+ int speed;
+
+ int num;
+#define PORT_DAC 0
+#define PORT_ADC 1
+#define PORT_MAX PORT_ADC
+
+ caddr_t kaddr;
+ uint32_t paddr;
+ ddi_acc_handle_t acch;
+ ddi_dma_handle_t dmah;
+ int nchan;
+ unsigned fragfr;
+ unsigned nfrags;
+ unsigned nframes;
+ unsigned frameno;
+ uint64_t count;
+
+ struct audioens_dev *dev;
+ audio_engine_t *engine;
+} audioens_port_t;
+
+typedef struct audioens_dev
+{
+ audio_dev_t *osdev;
+ kmutex_t mutex;
+ uint16_t devid;
+ uint8_t revision;
+ dev_info_t *dip;
+ boolean_t enabled;
+
+
+ int pintrs;
+ int rintrs;
+
+ kstat_t *ksp;
+
+ audioens_port_t port[PORT_MAX + 1];
+
+ ac97_t *ac97;
+
+ caddr_t regs;
+ ddi_acc_handle_t acch;
+ ddi_intr_handle_t ihandle[1];
+} audioens_dev_t;
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * The hardware appears to be able to address up to 16-bits worth of longwords,
+ * giving a total address space of 256K. Note, however, that we will restrict
+ * this further when we do fragment and memory allocation. At its very highest
+ * clock rate (48 kHz) and sample size (16-bit stereo), and lowest interrupt
+ * rate (32 Hz), we only need 6000 bytes per fragment.
+ *
+ * So with an allocated buffer size of 64K, we can support at least 10 frags,
+ * which is more than enough. (The legacy Sun driver used only 2 fragments.)
+ */
+#define AUDIOENS_BUF_LEN (65536)
+
+static ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_VERSION, /* dma_attr_version */
+ 0x0, /* dma_attr_addr_lo */
+ 0xffffffffU, /* dma_attr_addr_hi */
+ 0x3ffff, /* dma_attr_count_max */
+ 0x8, /* dma_attr_align */
+ 0x7f, /* dma_attr_burstsizes */
+ 0x1, /* dma_attr_minxfer */
+ 0x3ffff, /* dma_attr_maxxfer */
+ 0x3ffff, /* dma_attr_seg */
+ 0x1, /* dma_attr_sgllen */
+ 0x1, /* dma_attr_granular */
+ 0 /* dma_attr_flags */
+};
+
+#define GET8(dev, offset) \
+ ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
+#define GET16(dev, offset) \
+ ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
+#define GET32(dev, offset) \
+ ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
+#define PUT8(dev, offset, v) \
+ ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
+#define PUT16(dev, offset, v) \
+ ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
+#define PUT32(dev, offset, v) \
+ ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
+
+#define CLR8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) & ~(v))
+#define SET8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) | (v))
+#define CLR32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) & ~(v))
+#define SET32(dev, offset, v) PUT32(dev, offset, GET32(dev, offset) | (v))
+
+#define KSINTR(dev) ((kstat_intr_t *)((dev)->ksp->ks_data))
+
+static void audioens_init_hw(audioens_dev_t *);
+static void audioens_init_port(audioens_port_t *);
+static void audioens_start_port(audioens_port_t *);
+static void audioens_stop_port(audioens_port_t *);
+static void audioens_update_port(audioens_port_t *);
+
+static uint16_t
+audioens_rd97(void *dev_, uint8_t wAddr)
+{
+ audioens_dev_t *dev = dev_;
+ int i, dtemp;
+
+ mutex_enter(&dev->mutex);
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ /* wait for WIP to go away saving the current state for later */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if ((dtemp & (1UL << 30)) == 0)
+ break;
+ }
+
+ /* write addr w/data=0 and assert read request ... */
+ PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | (1UL << 23));
+
+ /* now wait for the data (RDY) */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if (dtemp & (1UL << 31))
+ break;
+ }
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ mutex_exit(&dev->mutex);
+
+ return (dtemp & 0xffff);
+}
+
+static void
+audioens_wr97(void *dev_, uint8_t wAddr, uint16_t wData)
+{
+ audioens_dev_t *dev = dev_;
+ int i, dtemp;
+
+ mutex_enter(&dev->mutex);
+ /* wait for WIP to go away */
+ for (i = 0; i < 0x100UL; ++i) {
+ dtemp = GET32(dev, CONC_dCODECCTL_OFF);
+ if ((dtemp & (1UL << 30)) == 0)
+ break;
+ }
+
+ PUT32(dev, CONC_dCODECCTL_OFF, ((int)wAddr << 16) | wData);
+
+ mutex_exit(&dev->mutex);
+}
+
+static unsigned short
+SRCRegRead(audioens_dev_t *dev, unsigned short reg)
+{
+ int i, dtemp;
+
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ /* wait for ready */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ /* assert a read request */
+ PUT32(dev, CONC_dSRCIO_OFF, (dtemp & SRC_CTLMASK) | ((int)reg << 25));
+
+ /* now wait for the data */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ return ((unsigned short) dtemp);
+}
+
+static void
+SRCRegWrite(audioens_dev_t *dev, unsigned short reg, unsigned short val)
+{
+ int i, dtemp;
+ int writeval;
+
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ /* wait for ready */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ dtemp = GET32(dev, CONC_dSRCIO_OFF);
+ if ((dtemp & SRC_BUSY) == 0)
+ break;
+ }
+
+ /* assert the write request */
+ writeval = (dtemp & SRC_CTLMASK) | SRC_WENABLE |
+ ((int)reg << 25) | val;
+ PUT32(dev, CONC_dSRCIO_OFF, writeval);
+}
+
+static void
+SRCSetRate(audioens_dev_t *dev, unsigned char base, unsigned short rate)
+{
+ int i, freq, dtemp;
+ unsigned short N, truncM, truncStart;
+
+ if (base != SRC_ADC_BASE) {
+ /* freeze the channel */
+ dtemp = (base == SRC_DAC1_BASE) ?
+ SRC_DAC1FREEZE : SRC_DAC2FREEZE;
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF,
+ (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) | dtemp);
+
+ /* calculate new frequency and write it - preserve accum */
+ freq = ((int)rate << 16) / 3000U;
+ SRCRegWrite(dev, (unsigned short) base + SRC_INT_REGS_OFF,
+ (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
+ & 0x00ffU) | ((unsigned short) (freq >> 6) & 0xfc00));
+ SRCRegWrite(dev, (unsigned short) base + SRC_VFREQ_FRAC_OFF,
+ (unsigned short) freq >> 1);
+
+ /* un-freeze the channel */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i)
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ PUT32(dev, CONC_dSRCIO_OFF,
+ (GET32(dev, CONC_dSRCIO_OFF) & SRC_CTLMASK) & ~dtemp);
+ } else {
+ /* derive oversample ratio */
+ N = rate / 3000U;
+ if (N == 15 || N == 13 || N == 11 || N == 9)
+ --N;
+
+ /* truncate the filter and write n/trunc_start */
+ truncM = (21 * N - 1) | 1;
+ if (rate >= 24000U) {
+ if (truncM > 239)
+ truncM = 239;
+ truncStart = (239 - truncM) >> 1;
+
+ SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
+ (truncStart << 9) | (N << 4));
+ } else {
+ if (truncM > 119)
+ truncM = 119;
+ truncStart = (119 - truncM) >> 1;
+
+ SRCRegWrite(dev, base + SRC_TRUNC_N_OFF,
+ 0x8000U | (truncStart << 9) | (N << 4));
+ }
+
+ /* calculate new frequency and write it - preserve accum */
+ freq = ((48000UL << 16) / rate) * N;
+ SRCRegWrite(dev, base + SRC_INT_REGS_OFF,
+ (SRCRegRead(dev, (unsigned short) base + SRC_INT_REGS_OFF)
+ & 0x00ff) | ((unsigned short) (freq >> 6) & 0xfc00));
+ SRCRegWrite(dev, base + SRC_VFREQ_FRAC_OFF,
+ (unsigned short) freq >> 1);
+
+ SRCRegWrite(dev, SRC_ADC_VOL_L, N << 8);
+ SRCRegWrite(dev, SRC_ADC_VOL_R, N << 8);
+ }
+}
+
+static void
+SRCInit(audioens_dev_t *dev)
+{
+ int i;
+
+ /* Clear all SRC RAM then init - keep SRC disabled until done */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF, SRC_DISABLE);
+
+ for (i = 0; i < 0x80; ++i)
+ SRCRegWrite(dev, (unsigned short) i, 0U);
+
+ SRCRegWrite(dev, SRC_DAC1_BASE + SRC_TRUNC_N_OFF, 16 << 4);
+ SRCRegWrite(dev, SRC_DAC1_BASE + SRC_INT_REGS_OFF, 16 << 10);
+ SRCRegWrite(dev, SRC_DAC2_BASE + SRC_TRUNC_N_OFF, 16 << 4);
+ SRCRegWrite(dev, SRC_DAC2_BASE + SRC_INT_REGS_OFF, 16 << 10);
+ SRCRegWrite(dev, SRC_DAC1_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC1_VOL_R, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC2_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_DAC2_VOL_R, 1 << 12);
+ SRCRegWrite(dev, SRC_ADC_VOL_L, 1 << 12);
+ SRCRegWrite(dev, SRC_ADC_VOL_R, 1 << 12);
+
+ /* default some rates */
+ SRCSetRate(dev, SRC_DAC1_BASE, 48000);
+ SRCSetRate(dev, SRC_DAC2_BASE, 48000);
+ SRCSetRate(dev, SRC_ADC_BASE, 48000);
+
+ /* now enable the whole deal */
+ for (i = 0; i < SRC_IOPOLL_COUNT; ++i) {
+ if (!(GET32(dev, CONC_dSRCIO_OFF) & SRC_BUSY))
+ break;
+ }
+ PUT32(dev, CONC_dSRCIO_OFF, 0);
+}
+
+static void
+audioens_writemem(audioens_dev_t *dev, uint32_t page, uint32_t offs,
+ uint32_t data)
+{
+ /* Select memory page */
+ PUT32(dev, CONC_bMEMPAGE_OFF, page);
+ PUT32(dev, offs, data);
+}
+
+static uint32_t
+audioens_readmem(audioens_dev_t *dev, uint32_t page, uint32_t offs)
+{
+ PUT32(dev, CONC_bMEMPAGE_OFF, page); /* Select memory page */
+ return (GET32(dev, offs));
+}
+
+static uint_t
+audioens_intr(caddr_t arg1, caddr_t arg2)
+{
+ audioens_dev_t *dev = (void *)arg1;
+ int stats;
+ int tmp;
+ unsigned char ackbits = 0;
+ audioens_port_t *port;
+ audio_engine_t *do_dac, *do_adc;
+
+ _NOTE(ARGUNUSED(arg2));
+
+ /*
+ * NB: The old audioens didn't report spurious interrupts. On
+ * a system with shared interrupts (typical!) there will
+ * normally be lots of these (each time the "other" device
+ * interrupts).
+ *
+ * Also, because of the way the interrupt chain handling
+ * works, reporting of spurious interrupts is probably not
+ * terribly useful.
+ *
+ * However, we can count interrupts where the master interrupt
+ * bit is set but none of the ackbits that we are prepared to
+ * process is set. That is probably useful.
+ */
+ mutex_enter(&dev->mutex);
+ if (!dev->enabled) {
+
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ stats = GET32(dev, CONC_dSTATUS_OFF);
+
+ if (!(stats & CONC_STATUS_PENDING)) { /* No interrupt pending */
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ do_dac = do_adc = NULL;
+
+ /* DAC1 (synth) interrupt */
+ if (stats & CONC_STATUS_DAC1INT) {
+
+ ackbits |= CONC_SERCTL_DAC1IE;
+ port = &dev->port[PORT_DAC];
+ if (port->trigger) {
+ do_dac = port->engine;
+ }
+ }
+
+ /* DAC2 interrupt */
+ if (stats & CONC_STATUS_DAC2INT) {
+
+ ackbits |= CONC_SERCTL_DAC2IE;
+ }
+
+ /* ADC interrupt */
+ if (stats & CONC_STATUS_ADCINT) {
+
+ ackbits |= CONC_SERCTL_ADCIE;
+ port = &dev->port[PORT_ADC];
+
+ if (port->trigger) {
+ do_adc = port->engine;
+ }
+ }
+
+ /* UART interrupt - we shouldn't get this! */
+ if (stats & CONC_STATUS_UARTINT) {
+ uint8_t uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ while (uart_stat & CONC_UART_RXRDY)
+ uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ }
+
+ /* Ack the interrupt */
+ tmp = GET8(dev, CONC_bSERCTL_OFF);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp & (~ackbits)); /* Clear bits */
+ PUT8(dev, CONC_bSERCTL_OFF, tmp | ackbits); /* Turn them back on */
+
+ if (dev->ksp) {
+ if (ackbits == 0) {
+ KSINTR(dev)->intrs[KSTAT_INTR_SPURIOUS]++;
+ } else {
+ KSINTR(dev)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&dev->mutex);
+
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ if (do_adc)
+ audio_engine_produce(do_adc);
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+static int
+audioens_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ /* hardware can also do AUDIO_FORMAT_U8, but no need for it */
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+static int
+audioens_channels(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+static int
+audioens_rate(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->speed);
+}
+
+static void
+audioens_init_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+ unsigned tmp;
+
+ if (port->suspended)
+ return;
+
+ switch (port->num) {
+ case PORT_DAC:
+ /* Set physical address of the DMA buffer */
+ audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_dDAC1PADDR_OFF,
+ port->paddr);
+ audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_dDAC2PADDR_OFF,
+ port->paddr + (port->nframes * sizeof (int16_t) * 2));
+
+ /* Set DAC rate */
+ SRCSetRate(dev, SRC_DAC1_BASE, port->speed);
+ SRCSetRate(dev, SRC_DAC2_BASE, port->speed);
+
+ /* Configure the channel setup - SPDIF only uses front */
+ tmp = GET32(dev, CONC_dSTATUS_OFF);
+ tmp &= ~(CONC_STATUS_SPKR_MASK | CONC_STATUS_SPDIF_MASK);
+ tmp |= CONC_STATUS_SPKR_4CH | CONC_STATUS_SPDIF_P1;
+ PUT32(dev, CONC_dSTATUS_OFF, tmp);
+
+ /* Set format */
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+ SET8(dev, CONC_bSERFMT_OFF,
+ CONC_PCM_DAC1_16BIT | CONC_PCM_DAC2_16BIT |
+ CONC_PCM_DAC1_STEREO | CONC_PCM_DAC2_STEREO);
+
+ /* Set the frame count */
+ audioens_writemem(dev, CONC_DAC1CTL_PAGE, CONC_wDAC1FC_OFF,
+ port->nframes - 1);
+ audioens_writemem(dev, CONC_DAC2CTL_PAGE, CONC_wDAC2FC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wDAC1IC_OFF, port->fragfr - 1);
+ PUT16(dev, CONC_wDAC2IC_OFF, port->fragfr - 1);
+ break;
+
+ case PORT_ADC:
+ /* Set physical address of the DMA buffer */
+ audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_dADCPADDR_OFF,
+ port->paddr);
+
+ /* Set ADC rate */
+ SRCSetRate(dev, SRC_ADC_BASE, port->speed);
+
+ /* Set format - for input we only support 16 bit input */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_ADC_16BIT;
+ tmp |= CONC_PCM_ADC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audioens_writemem(dev, CONC_ADCCTL_PAGE, CONC_wADCFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wADCIC_OFF, port->fragfr - 1);
+
+ break;
+ }
+
+ port->frameno = 0;
+}
+
+static int
+audioens_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+ int intrs;
+
+ _NOTE(ARGUNUSED(flag));
+
+ mutex_enter(&dev->mutex);
+
+ if (port->num == PORT_ADC) {
+ intrs = dev->rintrs;
+ } else {
+ intrs = dev->pintrs;
+ }
+
+ /* interrupt at least at 25 Hz, and not more than 250 Hz */
+ intrs = min(250, max(25, intrs));
+
+ port->fragfr = (port->speed / intrs);
+ port->nfrags = AUDIOENS_BUF_LEN /
+ (port->fragfr * port->nchan * sizeof (int16_t));
+ port->nfrags = max(4, min(port->nfrags, 1024));
+ port->nframes = port->nfrags * port->fragfr;
+ port->trigger = B_FALSE;
+ port->count = 0;
+
+ audioens_init_port(port);
+
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrags;
+ *bufp = port->kaddr;
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audioens_start_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+
+ if (!port->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ SET8(dev, CONC_bDEVCTL_OFF,
+ CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DAC1IE);
+ break;
+ case PORT_ADC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static void
+audioens_stop_port(audioens_port_t *port)
+{
+ audioens_dev_t *dev = port->dev;
+
+ if (!port->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ CLR8(dev, CONC_bDEVCTL_OFF,
+ CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_DAC1_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DAC1IE);
+ break;
+ case PORT_ADC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static int
+audioens_start(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (!port->trigger) {
+ port->trigger = B_TRUE;
+ audioens_start_port(port);
+ }
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audioens_stop(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (port->trigger) {
+ port->trigger = B_FALSE;
+ audioens_stop_port(port);
+ }
+ mutex_exit(&dev->mutex);
+}
+
+static void
+audioens_update_port(audioens_port_t *port)
+{
+ uint32_t page, offs;
+ int frameno, n;
+
+ switch (port->num) {
+ case PORT_DAC:
+ page = CONC_DAC1CTL_PAGE;
+ offs = CONC_wDAC1FC_OFF;
+ break;
+
+ case PORT_ADC:
+ page = CONC_ADCCTL_PAGE;
+ offs = CONC_wADCFC_OFF;
+ break;
+ }
+
+ /*
+ * Note that the current frame counter is in the high nybble.
+ */
+ frameno = audioens_readmem(port->dev, page, offs) >> 16;
+ n = frameno >= port->frameno ?
+ frameno - port->frameno :
+ frameno + port->nframes - port->frameno;
+ port->frameno = frameno;
+ port->count += n;
+}
+
+static uint64_t
+audioens_count(void *arg)
+{
+ audioens_port_t *port = arg;
+ audioens_dev_t *dev = port->dev;
+ uint64_t val;
+
+ mutex_enter(&dev->mutex);
+ if (!port->suspended) {
+ audioens_update_port(port);
+ }
+ val = port->count;
+ mutex_exit(&dev->mutex);
+ return (val);
+}
+
+static void
+audioens_close(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ audioens_stop(port);
+}
+
+static void
+audioens_sync(void *arg, unsigned nframes)
+{
+ audioens_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(nframes));
+
+ if (port->num == PORT_ADC) {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORCPU);
+ } else {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+ }
+}
+
+static size_t
+audioens_qlen(void *arg)
+{
+ audioens_port_t *port = arg;
+
+ return (port->fragfr);
+}
+
+static void
+audioens_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr)
+{
+ audioens_port_t *port = arg;
+
+ if ((port->num == PORT_DAC) && (chan >= 2)) {
+ *offset = (port->nframes * 2) + (chan % 2);
+ *incr = 2;
+ } else {
+ *offset = chan;
+ *incr = 2;
+ }
+}
+
+audio_engine_ops_t audioens_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audioens_open,
+ audioens_close,
+ audioens_start,
+ audioens_stop,
+ audioens_count,
+ audioens_format,
+ audioens_channels,
+ audioens_rate,
+ audioens_sync,
+ audioens_qlen,
+ audioens_chinfo
+};
+
+void
+audioens_init_hw(audioens_dev_t *dev)
+{
+ int tmp;
+
+ if ((dev->devid == ENSONIQ_ES5880) ||
+ (dev->devid == ENSONIQ_ES5880A) ||
+ (dev->devid == ENSONIQ_ES5880B) ||
+ (dev->devid == 0x1371 && dev->revision == 7) ||
+ (dev->devid == 0x1371 && dev->revision >= 9)) {
+
+ /* Have a ES5880 so enable the codec manually */
+ tmp = GET8(dev, CONC_bINTSUMM_OFF) & 0xff;
+ tmp |= 0x20;
+ PUT8(dev, CONC_bINTSUMM_OFF, tmp);
+ for (int i = 0; i < 2000; i++)
+ drv_usecwait(10);
+ }
+
+ SRCInit(dev);
+
+#if 0
+ PUT8(dev, CONC_bSERCTL_OFF, 0x00);
+ PUT8(dev, CONC_bNMIENA_OFF, 0x00); /* NMI off */
+ PUT8(dev, CONC_wNMISTAT_OFF, 0x00); /* PUT8? */
+#endif
+
+ /*
+ * Turn on CODEC (UART and joystick left disabled)
+ */
+ tmp = GET32(dev, CONC_bDEVCTL_OFF) & 0xff;
+ tmp &= ~(CONC_DEVCTL_PCICLK_DS | CONC_DEVCTL_XTALCLK_DS);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bUARTCSTAT_OFF, 0x00);
+
+ /* Perform AC97 codec warm reset */
+ tmp = GET8(dev, CONC_bMISCCTL_OFF) & 0xff;
+ PUT8(dev, CONC_bMISCCTL_OFF, tmp | CONC_MISCCTL_SYNC_RES);
+ drv_usecwait(200);
+ PUT8(dev, CONC_bMISCCTL_OFF, tmp);
+ drv_usecwait(200);
+
+ if (dev->revision >= 4) {
+ /* XXX: enable SPDIF - PCM only for now */
+ if (audioens_spdif) {
+ /* enable SPDIF */
+ PUT32(dev, 0x04, GET32(dev, 0x04) | (1 << 18));
+ /* SPDIF out = data from DAC */
+ PUT32(dev, 0x00, GET32(dev, 0x00) | (1 << 26));
+ CLR32(dev, CONC_dSPDIF_OFF, CONC_SPDIF_AC3);
+
+ } else {
+ /* disable spdif out */
+ PUT32(dev, 0x04, GET32(dev, 0x04) & ~(1 << 18));
+ PUT32(dev, 0x00, GET32(dev, 0x00) & ~(1 << 26));
+ }
+
+ /* we want to run each channel independently */
+ CLR32(dev, CONC_dSTATUS_OFF, CONC_STATUS_ECHO);
+ }
+
+ dev->enabled = B_TRUE;
+}
+
+static int
+audioens_init(audioens_dev_t *dev)
+{
+
+ audioens_init_hw(dev);
+
+ /*
+ * On this hardware, we want to disable the internal speaker by
+ * default, if it exists. (We don't have a speakerphone on any
+ * of these cards, and no SPARC hardware uses it either!)
+ */
+ ddi_prop_update_int(DDI_DEV_T_NONE, dev->dip, AC97_PROP_SPEAKER, 0);
+
+ /*
+ * Init mixer
+ */
+
+ dev->ac97 = ac97_alloc(dev->dip, audioens_rd97, audioens_wr97, dev);
+ if (dev->ac97 == NULL)
+ return (DDI_FAILURE);
+
+ if (ac97_init(dev->ac97, dev->osdev) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ dev->pintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "play-interrupts", DEFINTS);
+
+ dev->rintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "record-interrupts", DEFINTS);
+
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audioens_port_t *port;
+ unsigned caps;
+ unsigned dmaflags;
+ size_t rlen;
+ ddi_dma_cookie_t c;
+ unsigned ccnt;
+
+ port = &dev->port[i];
+ port->dev = dev;
+
+ switch (i) {
+ case PORT_DAC:
+ port->nchan = 4;
+ port->speed = 48000;
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ break;
+
+ case PORT_ADC:
+ port->nchan = 2;
+ port->speed = 48000;
+ caps = ENGINE_INPUT_CAP;
+ dmaflags = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ break;
+ }
+
+ port->num = i;
+
+ /*
+ * Allocate DMA resources.
+ */
+
+ if (ddi_dma_alloc_handle(dev->dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->dmah) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma handle allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ if (ddi_dma_mem_alloc(port->dmah, AUDIOENS_BUF_LEN, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->kaddr,
+ &rlen, &port->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma memory allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ /* ensure that the buffer is zeroed out properly */
+ bzero(port->kaddr, rlen);
+ if (ddi_dma_addr_bind_handle(port->dmah, NULL, port->kaddr,
+ AUDIOENS_BUF_LEN, dmaflags, DDI_DMA_SLEEP, NULL,
+ &c, &ccnt) != DDI_DMA_MAPPED) {
+ audio_dev_warn(dev->osdev,
+ "port %d: dma binding failed", i);
+ return (DDI_FAILURE);
+ }
+ port->paddr = c.dmac_address;
+
+ /*
+ * Allocate and configure audio engine.
+ */
+ port->engine = audio_engine_alloc(&audioens_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(dev->osdev,
+ "port %d: audio_engine_alloc failed", i);
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(dev->osdev, port->engine);
+ }
+
+ /*
+ * Set up kstats for interrupt reporting.
+ */
+ dev->ksp = kstat_create(ddi_driver_name(dev->dip),
+ ddi_get_instance(dev->dip), ddi_driver_name(dev->dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (dev->ksp != NULL) {
+ kstat_install(dev->ksp);
+ }
+
+ if (audio_dev_register(dev->osdev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev,
+ "unable to register with audio framework");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audioens_setup_interrupts(audioens_dev_t *dev)
+{
+ int actual;
+ uint_t ipri;
+
+ if ((ddi_intr_alloc(dev->dip, dev->ihandle, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) ||
+ (actual != 1)) {
+ audio_dev_warn(dev->osdev, "can't alloc intr handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(dev->ihandle[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't determine intr priority");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(dev->ihandle[0], audioens_intr, dev,
+ NULL) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't add intr handler");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+void
+audioens_destroy(audioens_dev_t *dev)
+{
+ int i;
+
+ if (dev->ihandle[0] != NULL) {
+ (void) ddi_intr_disable(dev->ihandle[0]);
+ (void) ddi_intr_remove_handler(dev->ihandle[0]);
+ (void) ddi_intr_free(dev->ihandle[0]);
+ mutex_destroy(&dev->mutex);
+ }
+
+ if (dev->ksp != NULL) {
+ kstat_delete(dev->ksp);
+ }
+
+ /* free up ports, including DMA resources for ports */
+ for (i = 0; i <= PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+
+ if (port->paddr != 0)
+ (void) ddi_dma_unbind_handle(port->dmah);
+ if (port->acch != NULL)
+ ddi_dma_mem_free(&port->acch);
+ if (port->dmah != NULL)
+ ddi_dma_free_handle(&port->dmah);
+
+ if (port->engine != NULL) {
+ audio_dev_remove_engine(dev->osdev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ }
+
+ if (dev->acch != NULL) {
+ ddi_regs_map_free(&dev->acch);
+ }
+
+ if (dev->ac97) {
+ ac97_free(dev->ac97);
+ }
+
+ if (dev->osdev != NULL) {
+ audio_dev_free(dev->osdev);
+ }
+
+ kmem_free(dev, sizeof (*dev));
+}
+
+int
+audioens_attach(dev_info_t *dip)
+{
+ uint16_t pci_command, vendor, device;
+ uint8_t revision;
+ audioens_dev_t *dev;
+ ddi_acc_handle_t pcih;
+ const char *chip_name;
+ const char *chip_vers;
+
+ dev = kmem_zalloc(sizeof (*dev), KM_SLEEP);
+ dev->dip = dip;
+ ddi_set_driver_private(dip, dev);
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "pci_config_setup failed");
+ kmem_free(dev, sizeof (*dev));
+ return (DDI_FAILURE);
+ }
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+ revision = pci_config_get8(pcih, PCI_CONF_REVID);
+
+ if ((vendor != ENSONIQ_VENDOR_ID && vendor != CREATIVE_VENDOR_ID) ||
+ (device != ENSONIQ_ES1371 && device != ENSONIQ_ES5880 &&
+ device != ENSONIQ_ES5880A && device != ECTIVA_ES1938 &&
+ device != ENSONIQ_ES5880B))
+ goto err_exit;
+
+ chip_name = "AudioPCI97";
+ chip_vers = "unknown";
+
+ switch (device) {
+ case ENSONIQ_ES1371:
+ chip_name = "AudioPCI97";
+ switch (revision) {
+ case 0x02:
+ case 0x09:
+ default:
+ chip_vers = "ES1371";
+ break;
+ case 0x04:
+ case 0x06:
+ case 0x08:
+ chip_vers = "ES1373";
+ break;
+ case 0x07:
+ chip_vers = "ES5880";
+ break;
+ }
+ break;
+
+ case ENSONIQ_ES5880:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880";
+ break;
+ case ENSONIQ_ES5880A:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880A";
+ break;
+ case ENSONIQ_ES5880B:
+ chip_name = "SB PCI128";
+ chip_vers = "ES5880B";
+ break;
+
+ case ECTIVA_ES1938:
+ chip_name = "AudioPCI";
+ chip_vers = "ES1938";
+ break;
+ }
+
+ dev->revision = revision;
+ dev->devid = device;
+
+ dev->osdev = audio_dev_alloc(dip, 0);
+ if (dev->osdev == NULL) {
+ goto err_exit;
+ }
+
+ audio_dev_set_description(dev->osdev, chip_name);
+ audio_dev_set_version(dev->osdev, chip_vers);
+
+ /* set the PCI latency */
+ if ((audioens_latency == 32) || (audioens_latency == 64) ||
+ (audioens_latency == 96))
+ pci_config_put8(pcih, PCI_CONF_LATENCY_TIMER,
+ audioens_latency);
+
+ /* activate the device */
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ /* map registers */
+ if (ddi_regs_map_setup(dip, 1, &dev->regs, 0, 0, &acc_attr,
+ &dev->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't map registers");
+ goto err_exit;
+ }
+
+ if (audioens_setup_interrupts(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't register interrupts");
+ goto err_exit;
+ }
+
+ /* This allocates and configures the engines */
+ if (audioens_init(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->osdev, "can't init device");
+ goto err_exit;
+ }
+
+ (void) ddi_intr_enable(dev->ihandle[0]);
+
+ pci_config_teardown(&pcih);
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+err_exit:
+ pci_config_teardown(&pcih);
+
+ audioens_destroy(dev);
+
+ return (DDI_FAILURE);
+}
+
+int
+audioens_detach(audioens_dev_t *dev)
+{
+ int tmp;
+
+ /* first unregister us from the DDI framework, might be busy */
+ if (audio_dev_unregister(dev->osdev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ mutex_enter(&dev->mutex);
+
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ dev->enabled = B_FALSE;
+
+ mutex_exit(&dev->mutex);
+
+ audioens_destroy(dev);
+
+ return (DDI_SUCCESS);
+}
+
+/*ARGSUSED*/
+static int
+audioens_resume(audioens_dev_t *dev)
+{
+ /* ask framework to reset/relocate engine data */
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audio_engine_reset(dev->port[i].engine);
+ }
+
+ /* reinitialize hardware */
+ audioens_init_hw(dev);
+
+ /* restore AC97 state */
+ ac97_resume(dev->ac97);
+
+ /* restart ports */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i < PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+ port->suspended = B_FALSE;
+ audioens_init_port(port);
+ /* possibly start it up if was going when we suspended */
+ if (port->trigger) {
+ audioens_start_port(port);
+
+ }
+ }
+ mutex_exit(&dev->mutex);
+ for (int i = 0; i < PORT_MAX; i++) {
+ audioens_port_t *port = &dev->port[i];
+ /* signal callbacks on resume */
+ if (!port->trigger)
+ continue;
+ if (port->num == PORT_ADC) {
+ audio_engine_produce(port->engine);
+ } else {
+ audio_engine_consume(port->engine);
+ }
+ }
+ return (DDI_SUCCESS);
+}
+
+/*ARGSUSED*/
+static int
+audioens_suspend(audioens_dev_t *dev)
+{
+ /*
+ * Stop all engines/DMA data.
+ */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audioens_stop_port(&dev->port[i]);
+ audioens_update_port(&dev->port[i]);
+ dev->port[i].suspended = B_TRUE;
+ }
+ dev->enabled = B_FALSE;
+ mutex_exit(&dev->mutex);
+
+ /*
+ * Framework needs to save off AC'97 state.
+ */
+ ac97_suspend(dev->ac97);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audioens_quiesce(dev_info_t *dip)
+{
+ audioens_dev_t *dev;
+ uint8_t tmp;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* This disables all DMA engines and interrupts */
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DAC2IE | CONC_SERCTL_DAC1IE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC2_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_DAC1_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ return (DDI_SUCCESS);
+}
+
+
+static int
+audioens_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audioens_dev_t *dev;
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audioens_attach(dip));
+
+ case DDI_RESUME:
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+ return (audioens_resume(dev));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int
+audioens_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audioens_dev_t *dev;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audioens_detach(dev));
+
+ case DDI_SUSPEND:
+ return (audioens_suspend(dev));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int audioens_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audioens_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+
+static struct dev_ops audioens_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audioens_ddi_attach, /* attach */
+ audioens_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audioens_quiesce, /* quiesce */
+};
+
+static struct modldrv audioens_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Ensoniq 1371/1373 Audio", /* linkinfo */
+ &audioens_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audioens_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audioens_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audioens_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audioens_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf b/usr/src/uts/common/io/audio/drv/audioens/audioens.conf
index 3ec17d2cbc..7e116fffb6 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.conf
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.conf
@@ -19,51 +19,35 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# Configuration file for the audio810 audio driver.
+# Configuration file for the audioens audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# Uncomment cdrom to enable the audio810 driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
-
-#
# play-interrupts sets the number of interrupts per second when playing.
# This affects the resolution of various things, such as sample counts.
# record-interrupts does the same for record interrupts.
#
# These may be tuned to get more accurate information by increasing the
# count. However, the larger the interrupts per second the larger the
-# load on the system. So use this capability cautiously. The audio810
+# load on the system. So use this capability cautiously. The audioens
# driver enforces a maximum and minimum count.
#
# It should also be understood that not all interrupt rates are legal.
# The hardware is restricted to DMA buffers being allocated on certain
-# boundaries. If those boundaries are violated the driver will not be
-# loaded and an error message is entered into the messages log
+# boundaries. If those boundaries are violated then the value specified
+# will be ignored.
#
-play-interrupts=175;
-record-interrupts=175;
+play-interrupts=75;
+record-interrupts=75;
#
-# Uncomment reset-configuration to cause the audio810 driver's state to
+# Uncomment reset-configuration to cause the audioens driver's state to
# be reset to the default when the driver is loaded. Otherwise this state
# is retained across driver unload/reload cycles, but not across reboots.
#
#reset-configuration=1;
-
-#
-# Uncomment ac97-invert-amp to power down/up external amplifier. Most
-# hardware does't need this property. But some devices, such as some
-# Sony Vaio laptops need to set this property to 1 to correct the
-# inverted polarity of the external amplifier device.
-#
-# ac97-invert-amp=1;
diff --git a/usr/src/uts/common/io/audio/drv/audioens/audioens.h b/usr/src/uts/common/io/audio/drv/audioens/audioens.h
new file mode 100644
index 0000000000..6097e076db
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioens/audioens.h
@@ -0,0 +1,210 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Definitions for the Creative/Ensoniq AudioPCI97 driver.
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#ifndef _AUDIOENS_H
+#define _AUDIOENS_H
+
+/* CONCERT PCI-SIG defines */
+#define CONC_PCI_VENDID 0x1274U
+#define CONC_PCI_DEVID 0x1371U
+
+/* Concert97 direct register offset defines */
+#define CONC_bDEVCTL_OFF 0x00 /* Device control/enable */
+#define CONC_bMISCCTL_OFF 0x01 /* Miscellaneous control */
+#define CONC_bGPIO_OFF 0x02 /* General purpose I/O control */
+#define CONC_bJOYCTL_OFF 0x03 /* Joystick control (decode) */
+#define CONC_dSTATUS_OFF 0x04 /* long status register */
+#define CONC_bINTSUMM_OFF 0x07 /* Interrupt summary status */
+#define CONC_bUARTDATA_OFF 0x08 /* UART data R/W - read clears RX int */
+#define CONC_bUARTCSTAT_OFF 0x09 /* UART control and status */
+#define CONC_bUARTTEST_OFF 0x0a /* UART test control reg */
+#define CONC_bMEMPAGE_OFF 0x0c /* Memory page select */
+#define CONC_dSRCIO_OFF 0x10 /* I/O ctl/stat/data for SRC RAM */
+#define CONC_dCODECCTL_OFF 0x14 /* CODEC control - dword read/write */
+#define CONC_wNMISTAT_OFF 0x18 /* Legacy NMI status */
+#define CONC_bNMIENA_OFF 0x1a /* Legacy NMI enable */
+#define CONC_bNMICTL_OFF 0x1b /* Legacy control */
+#define CONC_dSPDIF_OFF 0x1c /* SPDIF status control */
+#define CONC_bSERFMT_OFF 0x20 /* Serial device control */
+#define CONC_bSERCTL_OFF 0x21 /* Serial device format */
+#define CONC_bSKIPC_OFF 0x22 /* DAC skip count reg */
+#define CONC_wDAC1IC_OFF 0x24 /* Synth int count in sample frames */
+#define CONC_wDAC1CIC_OFF 0x26 /* Synth current int count */
+#define CONC_wDAC2IC_OFF 0x28 /* DAC int count in sample frames */
+#define CONC_wDAC2CIC_OFF 0x2a /* DAC current int count */
+#define CONC_wADCIC_OFF 0x2c /* ADC int count in sample frames */
+#define CONC_wADCCIC_OFF 0x2e /* ADC current int count */
+#define CONC_MEMBASE_OFF 0x30 /* Memory window base - 16 byte window */
+
+/* Concert memory page-banked register offset defines */
+#define CONC_dDAC1PADDR_OFF 0x30 /* Synth host frame PCI phys addr */
+#define CONC_wDAC1FC_OFF 0x34 /* Synth host frame count in DWORDS */
+#define CONC_wDAC1CFC_OFF 0x36 /* Synth host current frame count */
+#define CONC_dDAC2PADDR_OFF 0x38 /* DAC host frame PCI phys addr */
+#define CONC_wDAC2FC_OFF 0x3c /* DAC host frame count in DWORDS */
+#define CONC_wDAC2CFC_OFF 0x3e /* DAC host current frame count */
+#define CONC_dADCPADDR_OFF 0x30 /* ADC host frame PCI phys addr */
+#define CONC_wADCFC_OFF 0x34 /* ADC host frame count in DWORDS */
+#define CONC_wADCCFC_OFF 0x36 /* ADC host current frame count */
+
+/* Concert memory page number defines */
+#define CONC_DAC1RAM_PAGE 0x00 /* Synth host/serial I/F RAM */
+#define CONC_DAC2RAM_PAGE 0x04 /* DAC host/serial I/F RAM */
+#define CONC_ADCRAM_PAGE 0x08 /* ADC host/serial I/F RAM */
+#define CONC_DAC1CTL_PAGE 0x0c /* Page bank for synth host control */
+#define CONC_DAC2CTL_PAGE 0x0c /* Page bank for DAC host control */
+#define CONC_ADCCTL_PAGE 0x0d /* Page bank for ADC host control */
+#define CONC_FIFO0_PAGE 0x0e /* page 0 of UART "FIFO" (rx stash) */
+#define CONC_FIFO1_PAGE 0x0f /* page 1 of UART "FIFO" (rx stash) */
+
+/* SPDIF defines - only newer chips */
+#define CONC_SPDIF_CLKACCURACY 0x00000000U /* normal mode */
+#define CONC_SPDIF_SR48KHZ 0x02000000U /* 48KHZ clock, must be set */
+#define CONC_SPDIF_CHNO_MASK 0x00f00000U /* channel number */
+#define CONC_SPDIF_SRCNO_MASK 0x000f0000U /* source number */
+#define CONC_SPDIF_L 0x00008000U /* 0 = commercial original */
+#define CONC_SPDIF_CATCODE 0x00007f00U /* category code */
+#define CONC_SPDIF_EMPHASIS 0x00000008U /* 2 ch, 50/15 usec preemph */
+#define CONC_SPDIF_COPY 0x00000004U /* copy permitted */
+#define CONC_SPDIF_AC3 0x00000002U /* data is not pcm (AC3) */
+
+/* PCM format defines */
+#define CONC_PCM_DAC1_STEREO 0x01
+#define CONC_PCM_DAC1_16BIT 0x02
+#define CONC_PCM_DAC2_STEREO 0x04
+#define CONC_PCM_DAC2_16BIT 0x08
+#define CONC_PCM_ADC_STEREO 0x10
+#define CONC_PCM_ADC_16BIT 0x20
+
+/* Device Control defines */
+#define CONC_DEVCTL_PCICLK_DS 0x01 /* PCI Clock Disable */
+#define CONC_DEVCTL_XTALCLK_DS 0x02 /* Crystal Clock Disable */
+#define CONC_DEVCTL_JSTICK_EN 0x04 /* Joystick Enable */
+#define CONC_DEVCTL_UART_EN 0x08 /* UART Enable */
+#define CONC_DEVCTL_ADC_EN 0x10 /* ADC Enable (record) */
+#define CONC_DEVCTL_DAC2_EN 0x20 /* DAC2 Enable (playback) */
+#define CONC_DEVCTL_DAC1_EN 0x40 /* DAC1 Enabale (synth) */
+
+/* Misc Control defines */
+#define CONC_MISCCTL_PDLEV_D0 0x00 /* These bits reflect the */
+#define CONC_MISCCTL_PDLEV_D1 0x01 /* power down state of */
+#define CONC_MISCCTL_PDLEV_D2 0x02 /* the part */
+#define CONC_MISCCTL_PDLEV_D3 0x03 /* */
+#define CONC_MISCCTL_CCBINTRM_EN 0x04 /* CCB module interrupt mask */
+
+#define CONC_MISCCTL_SYNC_RES 0x40 /* for AC97 warm reset */
+
+/* Serial Control defines */
+#define CONC_SERCTL_DAC1IE 0x01 /* playback interrupt enable P1_INT_EN */
+#define CONC_SERCTL_DAC2IE 0x02 /* playback interrupt enable P2_INT_EN */
+#define CONC_SERCTL_ADCIE 0x04 /* record interrupt enable R1_INT_EN */
+#define CONC_SERCTL_DAC1PAUSE 0x08 /* playback pause */
+#define CONC_SERCTL_DAC2PAUSE 0x10 /* playback pause */
+#define CONC_SERCTL_ADCLOOP 0x80
+#define CONC_SERCTL_DAC2LOOP 0x40
+#define CONC_SERCTL_DAC1LOOP 0x20
+
+/* Interrupt Status defines */
+#define CONC_STATUS_ADCINT 0x00000001 /* A/D interrupt pending */
+#define CONC_STATUS_DAC2INT 0x00000002 /* DAC2 interrupt pending */
+#define CONC_STATUS_DAC1INT 0x00000004 /* DAC1 interrupt pending */
+#define CONC_STATUS_UARTINT 0x00000008 /* UART interrupt pending */
+#define CONC_STATUS_PENDING 0x80000000 /* any interrupt pending */
+#define CONC_STATUS_SPDIF_MASK 0x18000000
+#define CONC_STATUS_SPDIF_P1P2 0x00000000
+#define CONC_STATUS_SPDIF_P1 0x08000000
+#define CONC_STATUS_SPDIF_P2 0x10000000
+#define CONC_STATUS_SPDIF_REC 0x18000000
+#define CONC_STATUS_ECHO 0x04000000
+#define CONC_STATUS_SPKR_MASK 0x03000000
+#define CONC_STATUS_SPKR_2CH 0x00000000
+#define CONC_STATUS_SPKR_4CH 0x01000000
+#define CONC_STATUS_SPKR_P1 0x02000000
+#define CONC_STATUS_SPKR_P2 0x03000000
+#define CONC_STATUS_EN_SPDIF 0x00040000
+
+/* JOYCTL register defines */
+#define CONC_JOYCTL_200 0x00
+#define CONC_JOYCTL_208 0x01
+#define CONC_JOYCTL_210 0x02
+#define CONC_JOYCTL_218 0x03
+#define CONC_JOYCTL_SPDIFEN_B 0x04
+#define CONC_JOYCTL_RECEN_B 0x08
+
+/* UARTCSTAT register masks */
+#define CONC_UART_RXRDY 0x01
+#define CONC_UART_TXRDY 0x02
+#define CONC_UART_TXINT 0x04
+#define CONC_UART_RXINT 0x80
+
+#define CONC_UART_CTL 0x03
+#define CONC_UART_TXINTEN 0x20
+#define CONC_UART_RXINTEN 0x80
+
+/* defines for the CONCERT97 Sample Rate Converters */
+
+/* register/base equates for the SRC RAM */
+#define SRC_DAC1_FIFO 0x00
+#define SRC_DAC2_FIFO 0x20
+#define SRC_ADC_FIFO 0x40
+#define SRC_ADC_VOL_L 0x6c
+#define SRC_ADC_VOL_R 0x6d
+#define SRC_DAC1_BASE 0x70
+#define SRC_DAC2_BASE 0x74
+#define SRC_ADC_BASE 0x78
+#define SRC_DAC1_VOL_L 0x7c
+#define SRC_DAC1_VOL_R 0x7d
+#define SRC_DAC2_VOL_L 0x7e
+#define SRC_DAC2_VOL_R 0x7f
+
+#define SRC_TRUNC_N_OFF 0x00
+#define SRC_INT_REGS_OFF 0x01
+#define SRC_ACCUM_FRAC_OFF 0x02
+#define SRC_VFREQ_FRAC_OFF 0x03
+
+
+/* miscellaneous control defines */
+#define SRC_IOPOLL_COUNT 0x20000UL
+#define SRC_WENABLE (1UL << 24)
+#define SRC_BUSY (1UL << 23)
+#define SRC_DISABLE (1UL << 22)
+#define SRC_DAC1FREEZE (1UL << 21)
+#define SRC_DAC2FREEZE (1UL << 20)
+#define SRC_ADCFREEZE (1UL << 19)
+#define SRC_CTLMASK 0x00780000UL
+
+#endif /* _AUDIOENS_H */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c
index 7ea73cd696..0b3b5dfee8 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.c
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.c
@@ -23,66 +23,23 @@
* Use is subject to license terms.
*/
-/*
- * The audiohd driver provides functionality for playing audio on
- * the nVidia MCP55 high-definition audio controller with Realtek
- * ALC88x codec. This enables basic audio functionality for Sun's
- * 2006 line of new workstations and PCs, which are MCP55-based
- * with Realtek ALC88x codec. Due to short time constraints on the
- * production of this software kernel module, we used a minimalistic
- * approach to provide audio functionality for just the nVidia HD
- * audio controller and the Realtek ALC880, ALC883 and ALC885
- * codecs. Certainly, the driver may work and attach to Intel
- * High-Definition audio devices which have same the Realtek Codec.
- *
- * HD audio supports multiple streams, each of which can act as an
- * independent device. However, we just support two streams: the
- * first input stream for recording, and the first output stream
- * for playback. And because ALC880 doesn't support sample rates
- * below 48K (except 44.1K), this driver just supports 48K sample
- * rate in compatible mode.
- *
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/conf.h>
-#include <sys/devops.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
+#include <sys/audio/audio_driver.h>
#include <sys/note.h>
#include <sys/pci.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/audiohd.h>
-#include <sys/audio/impl/audiohd_impl.h>
+#include "audiohd.h"
+#define DEFINTS 175
+#define DRVNAME "audiohd"
/*
* Module linkage routines for the kernel
*/
-static int audiohd_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
+
static int audiohd_attach(dev_info_t *, ddi_attach_cmd_t);
static int audiohd_detach(dev_info_t *, ddi_detach_cmd_t);
static int audiohd_quiesce(dev_info_t *);
static int audiohd_resume(audiohd_state_t *);
static int audiohd_suspend(audiohd_state_t *);
-/*
- * Entry point routine prototypes
- */
-static int audiohd_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audiohd_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audiohd_ad_start_play(audiohdl_t, int);
-static int audiohd_ad_start_record(audiohdl_t, int);
-static void audiohd_ad_pause_play(audiohdl_t, int);
-static void audiohd_ad_stop_play(audiohdl_t, int);
-static void audiohd_ad_stop_record(audiohdl_t, int);
-
/* interrupt handler */
static uint_t audiohd_intr(caddr_t);
@@ -99,68 +56,26 @@ static void audiohd_stop_dma(audiohd_state_t *);
static void audiohd_disable_intr(audiohd_state_t *);
static int audiohd_create_codec(audiohd_state_t *);
static void audiohd_build_path(audiohd_state_t *);
-static int audiohd_init_ports(audiohd_state_t *);
static void audiohd_destroy_codec(audiohd_state_t *);
-static int audiohd_reset_stream(audiohd_state_t *, int);
-static int audiohd_fill_pbuf(audiohd_state_t *);
-static void audiohd_refill_pbuf(audiohd_state_t *);
-static void audiohd_preset_rbuf(audiohd_state_t *);
-static void audiohd_get_rbuf(audiohd_state_t *);
-static int audiohd_set_gain(audiohd_state_t *, int, int, int);
-static int audiohd_set_port(audiohd_state_t *, int, int);
-static void audiohd_mute_outputs(audiohd_state_t *, boolean_t);
-static int audiohd_set_monitor_gain(audiohd_state_t *, int);
static int audiohd_alloc_dma_mem(audiohd_state_t *, audiohd_dma_t *,
size_t, ddi_dma_attr_t *, uint_t);
static void audiohd_finish_output_path(hda_codec_t *codec);
-static void audiohd_finish_input_path(hda_codec_t *codec);
-static void audiohd_finish_monitor_path(hda_codec_t *codec);
-
static uint32_t audioha_codec_verb_get(void *, uint8_t,
uint8_t, uint16_t, uint8_t);
static uint32_t audioha_codec_4bit_verb_get(void *, uint8_t,
uint8_t, uint16_t, uint16_t);
static int audiohd_reinit_hda(audiohd_state_t *);
-static void audiohd_set_busy(audiohd_state_t *);
-static void audiohd_set_idle(audiohd_state_t *);
static int audiohd_response_from_codec(audiohd_state_t *statep,
uint32_t *resp, uint32_t *respex);
static void audiohd_restore_codec_gpio(audiohd_state_t *statep);
static void audiohd_change_speaker_state(audiohd_state_t *statep, int on);
-/* anchor for soft state structures */
-static void *audiohd_statep;
-
-/* driver name */
-static char *audiohd_name = AUDIOHD_NAME;
-
-static uint_t audiohd_mixer_srs[] = {
- AUDIOHD_SAMPR5510, AUDIOHD_SAMPR48000, 0
-};
-
-static uint_t audiohd_comp_srs[] = {
- AUDIOHD_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audiohd_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audiohd_mixer_srs
-};
-
-static am_ad_sample_rates_t audiohd_comp_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audiohd_comp_srs
-};
-
-static uint_t audiohd_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audiohd_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
+static int audiohd_allocate_port(audiohd_state_t *statep);
+static void audiohd_free_port(audiohd_state_t *statep);
+static void audiohd_restore_path(audiohd_state_t *statep);
+static int audiohd_add_controls(audiohd_state_t *statep);
+static void audiohd_get_channels(audiohd_state_t *statep);
+static void audiohd_init_path(audiohd_state_t *statep);
+static void audiohd_del_controls(audiohd_state_t *statep);
static ddi_device_acc_attr_t hda_dev_accattr = {
DDI_DEVICE_ATTR_V0,
@@ -168,222 +83,120 @@ static ddi_device_acc_attr_t hda_dev_accattr = {
DDI_STRICTORDER_ACC
};
-/* STREAMS driver id and limit value struct */
-static struct module_info audiohd_modinfo = {
- AUDIOHD_IDNUM,
- AUDIOHD_NAME,
- AUDIOHD_MINPACKET,
- AUDIOHD_MAXPACKET,
- AUDIOHD_HIWATER,
- AUDIOHD_LOWATER,
-};
-
-/* STREAMS queue processing procedures structures for read queue */
-static struct qinit audiohd_rqueue = {
- audio_sup_rput,
- audio_sup_rsvc,
- audio_sup_open,
- audio_sup_close,
- NULL,
- &audiohd_modinfo,
+static const char *audiohd_dtypes[] = {
+ AUDIO_PORT_LINEOUT,
+ AUDIO_PORT_SPEAKER,
+ AUDIO_PORT_HEADPHONES,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_SPDIFOUT,
+ AUDIO_PORT_DIGOUT,
+ AUDIO_PORT_MODEM,
+ AUDIO_PORT_HANDSET,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_AUX1IN,
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_PHONE,
+ AUDIO_PORT_SPDIFIN,
+ AUDIO_PORT_DIGIN,
+ AUDIO_PORT_NONE, /* reserved port, don't use */
+ AUDIO_PORT_OTHER,
NULL,
};
-/* STREAMS queue processing procedures structures for write queue */
-static struct qinit audiohd_wqueue = {
- audio_sup_wput,
- audio_sup_wsvc,
- NULL,
- NULL,
- NULL,
- &audiohd_modinfo,
- NULL
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audiohd_streamtab = {
- &audiohd_rqueue,
- &audiohd_wqueue,
- NULL,
- NULL,
-};
-
-/* Entry points structure */
-static struct cb_ops audiohd_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audiohd_streamtab, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audiohd_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audiohd_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify */
- nulldev, /* devo_probe */
- audiohd_attach, /* devo_attach */
- audiohd_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audiohd_cb_ops, /* devo_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- audiohd_quiesce, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audiohd_modldrv = {
- &mod_driverops, /* drv_modops */
- AUDIOHD_MOD_NAME, /* drv_linkinfo */
- &audiohd_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audiohd_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audiohd_modldrv, /* ml_linkage */
- NULL /* NULL */
-};
-
-
-/*
- * Audio driver ops vector for mixer
- */
-static am_ad_entry_t audiohd_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audiohd_ad_set_config, /* ad_set_config() */
- audiohd_ad_set_format, /* ad_set_format() */
- audiohd_ad_start_play, /* ad_start_play() */
- audiohd_ad_pause_play, /* ad_pause_play() */
- audiohd_ad_stop_play, /* ad_stop_play() */
- audiohd_ad_start_record, /* ad_start_record() */
- audiohd_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-static const uint_t g_outport[] = {
- AUDIO_LINE_OUT,
- AUDIO_SPEAKER,
- AUDIO_HEADPHONE,
- AUDIO_AUX1_OUT,
- AUDIO_AUX2_OUT
+enum {
+ CTL_VOLUME = 0,
+ CTL_FRONT,
+ CTL_SPEAKER,
+ CTL_HEADPHONE,
+ CTL_REAR,
+ CTL_CENTER,
+ CTL_SURROUND,
+ CTL_LFE,
+ CTL_IGAIN,
+ CTL_LINEIN,
+ CTL_MIC,
+ CTL_CD,
+ CTL_MONGAIN,
+ CTL_MONSRC,
+ CTL_RECSRC
};
-
-int
-_init(void)
-{
- int error;
-
- if ((error = ddi_soft_state_init(&audiohd_statep,
- sizeof (audiohd_state_t), 1)) != 0) {
- return (error);
- }
-
- if ((error = mod_install(&audiohd_modlinkage)) != 0) {
- ddi_soft_state_fini(&audiohd_statep);
- }
-
- return (error);
-
-} /* _init() */
-
-
-int
-_fini(void)
-{
- int error;
-
- if ((error = mod_remove(&audiohd_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audiohd_statep);
-
- return (0);
-
-} /* _fini() */
-
-
-int
-_info(struct modinfo *modinfop)
+static void
+audiohd_set_chipset_info(audiohd_state_t *statep)
{
- int error;
+ uint32_t devid;
+ const char *name;
+ const char *vers;
- error = mod_info(&audiohd_modlinkage, modinfop);
+ devid = pci_config_get16(statep->hda_pci_handle, PCI_CONF_VENID);
+ devid <<= 16;
+ devid |= pci_config_get16(statep->hda_pci_handle, PCI_CONF_DEVID);
- return (error);
-
-} /* _info() */
-
-
-int
-audiohd_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audiohd_state_t *statep;
- int instance;
- int error;
+ name = AUDIOHD_DEV_CONFIG;
+ vers = AUDIOHD_DEV_VERSION;
- ATRACE("in audiohd_getinfo()", dip);
- error = DDI_FAILURE;
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((statep = ddi_get_soft_state(audiohd_statep,
- instance)) != NULL) {
- *result = statep->hda_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
+ switch (devid) {
+ case 0x80862668:
+ name = "Intel HD Audio";
+ vers = "ICH6";
break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
+ case 0x808627d8:
+ name = "Intel HD Audio";
+ vers = "ICH7";
break;
-
- default:
+ case 0x8086284b:
+ name = "Intel HD Audio";
+ vers = "ICH8";
+ break;
+ case 0x8086293e:
+ name = "Intel HD Audio";
+ vers = "ICH9";
+ break;
+ case 0x10de0371:
+ name = "NVIDIA HD Audio";
+ vers = "MCP55";
+ break;
+ case 0x10de03f0:
+ name = "NVIDIA HD Audio";
+ vers = "MCP61A";
+ break;
+ case 0x10de026c:
+ name = "NVIDIA HD Audio";
+ vers = "6151";
+ break;
+ case 0x10de03e4:
+ name = "NVIDIA HD Audio";
+ vers = "MCP61";
+ break;
+ case 0x10de044a:
+ name = "NVIDIA HD Audio";
+ vers = "MCP65";
+ break;
+ case 0x10de055c:
+ name = "NVIDIA HD Audio";
+ vers = "MCP67";
+ break;
+ case 0x1002437b:
+ name = "ATI HD Audio";
+ vers = "SB450";
+ break;
+ case 0x10024383:
+ name = "ATI HD Audio";
+ vers = "SB600";
+ break;
+ case 0x11063288:
+ name = "VIA HD Audio";
+ vers = "HDA";
break;
}
+ /* set device information */
+ audio_dev_set_description(statep->adev, name);
+ audio_dev_set_version(statep->adev, vers);
+}
- return (error);
-
-} /* audiohd_getinfo() */
-
-/*
- * audiohd_attach()
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-int
+static int
audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
- audio_sup_reg_data_t data;
audiohd_state_t *statep;
int instance;
@@ -393,8 +206,7 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
break;
case DDI_RESUME:
- ATRACE("audiohd_attach() DDI_RESUME", NULL);
- statep = ddi_get_soft_state(audiohd_statep, instance);
+ statep = ddi_get_driver_private(dip);
ASSERT(statep != NULL);
return (audiohd_resume(statep));
@@ -404,93 +216,54 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
/* High-level interrupt isn't supported by this driver */
if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() unsupported high level interrupt",
- audiohd_name, instance);
+ cmn_err(CE_WARN,
+ "unsupported high level interrupt");
return (DDI_FAILURE);
}
- if (ddi_soft_state_zalloc(audiohd_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() softstate alloc failed",
- audiohd_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() no softstate",
- audiohd_name, instance);
- goto err_attach_exit1;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->hda_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audiohd_attach() audio_sup_register() failed",
- audiohd_name, instance);
- goto err_attach_exit2;
- }
-
- /* save private state */
- audio_sup_set_private(statep->hda_ahandle, statep);
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ ddi_set_driver_private(dip, statep);
/* interrupt cookie and initialize mutex */
if (audiohd_init_state(statep, dip) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() audiohd_init_state failed");
+ cmn_err(CE_NOTE,
+ "audiohd_init_state failed");
goto err_attach_exit3;
}
/* Set PCI command register to enable bus master and memeory I/O */
if (audiohd_init_pci(statep, &hda_dev_accattr) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init pci regs");
+ audio_dev_warn(statep->adev,
+ "couldn't init pci regs");
goto err_attach_exit4;
}
+ audiohd_set_chipset_info(statep);
+
if (audiohd_init_controller(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init controller");
+ audio_dev_warn(statep->adev,
+ "couldn't init controller");
goto err_attach_exit5;
}
if (audiohd_create_codec(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't create codec");
+ audio_dev_warn(statep->adev,
+ "couldn't create codec");
goto err_attach_exit6;
}
audiohd_build_path(statep);
- if (audiohd_init_ports(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_attach() couldn't init ports");
- goto err_attach_exit7;
- }
-
- /*
- * This is a workaround. ALC880 doesn't support 8k sample rate,
- * but solaris requires hardware to be set to 8K by default. This
- * checking is performed in am_attach(). To overcome this flaw,
- * we have to set default sample to 48K before calling am_attach().
- * After we fix bug 6363625 in near future, we will change this
- * and set sample rate to 8K by default.
- */
- statep->hda_info_defaults.play.sample_rate = audiohd_comp_srs[0];
- statep->hda_info_defaults.record.sample_rate = audiohd_comp_srs[0];
-
- if (am_attach(statep->hda_ahandle, cmd, &statep->hda_ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!attach() am_attach() failed");
+ audiohd_get_channels(statep);
+ if (audiohd_allocate_port(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "allocate port failure");
goto err_attach_exit7;
}
-
+ audiohd_init_path(statep);
/* set up kernel statistics */
- if ((statep->hda_ksp = kstat_create(AUDIOHD_NAME, instance,
- AUDIOHD_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ if ((statep->hda_ksp = kstat_create(DRVNAME, instance,
+ DRVNAME, "controller", KSTAT_TYPE_INTR, 1,
KSTAT_FLAG_PERSISTENT)) != NULL) {
kstat_install(statep->hda_ksp);
}
@@ -502,23 +275,38 @@ audiohd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
if (ddi_add_intr(dip, 0, &statep->hda_intr_cookie,
(ddi_idevice_cookie_t *)NULL, audiohd_intr, (caddr_t)statep) !=
DDI_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!attach() bad interrupt specification ");
+ audio_dev_warn(statep->adev,
+ "bad interrupt specification ");
goto err_attach_exit8;
}
+
+ /*
+ * Register audio controls.
+ */
+ if (audiohd_add_controls(statep) == DDI_FAILURE) {
+ audio_dev_warn(statep->adev,
+ "unable to allocate controls");
+ goto err_attach_exit9;
+ }
+ if (audio_dev_register(statep->adev) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev,
+ "unable to register with framework");
+ goto err_attach_exit9;
+ }
ddi_report_dev(dip);
/* enable interrupt */
AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
AUDIOHD_INTCTL_BIT_GIE |
- AUDIOHD_INTCTL_BIT_CIE |
AUDIOHD_INTCTL_BIT_SIE);
return (DDI_SUCCESS);
+err_attach_exit9:
+ audiohd_del_controls(statep);
err_attach_exit8:
if (statep->hda_ksp)
kstat_delete(statep->hda_ksp);
- (void) am_detach(statep->hda_ahandle, DDI_DETACH);
+ audiohd_free_port(statep);
err_attach_exit7:
audiohd_destroy_codec(statep);
@@ -531,40 +319,23 @@ err_attach_exit5:
err_attach_exit4:
mutex_destroy(&statep->hda_mutex);
- cv_destroy(&statep->hda_cv);
err_attach_exit3:
- (void) audio_sup_unregister(statep->hda_ahandle);
+ (void) audio_dev_unregister(statep->adev);
err_attach_exit2:
err_attach_exit1:
- ddi_soft_state_free(audiohd_statep, instance);
return (DDI_FAILURE);
+}
-} /* audiohd_attach() */
-
-/*
- * audiohd_detach()
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-int
+static int
audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
audiohd_state_t *statep;
- int instance;
- instance = ddi_get_instance(dip);
-
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- return (DDI_FAILURE);
- }
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
switch (cmd) {
case DDI_DETACH:
@@ -576,6 +347,8 @@ audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
default:
return (DDI_FAILURE);
}
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
mutex_enter(&statep->hda_mutex);
audiohd_stop_dma(statep);
@@ -584,1143 +357,1488 @@ audiohd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
ddi_remove_intr(dip, 0, statep->hda_intr_cookie);
if (statep->hda_ksp)
kstat_delete(statep->hda_ksp);
- (void) am_detach(statep->hda_ahandle, DDI_DETACH);
+ audiohd_free_port(statep);
audiohd_destroy_codec(statep);
+ audiohd_del_controls(statep);
audiohd_fini_controller(statep);
audiohd_fini_pci(statep);
mutex_destroy(&statep->hda_mutex);
- cv_destroy(&statep->hda_cv);
- (void) audio_sup_unregister(statep->hda_ahandle);
- ddi_soft_state_free(audiohd_statep, instance);
-
+ if (statep->adev)
+ audio_dev_free(statep->adev);
+ kmem_free(statep, sizeof (*statep));
return (DDI_SUCCESS);
+}
+
+static struct dev_ops audiohd_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audiohd_attach, /* attach */
+ audiohd_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audiohd_quiesce, /* quiesce */
+};
-} /* audiohd_detach() */
+static struct modldrv audiohd_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "AudioHD", /* linkinfo */
+ &audiohd_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audiohd_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiohd_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audiohd_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audiohd_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
/*
- * quiesce(9E) entry point.
- *
- * This function is called when the system is single-threaded at high
- * PIL with preemption disabled. Therefore, this function must not be
- * blocked.
- *
- * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
- * DDI_FAILURE indicates an error condition and should almost never happen.
+ * Audio routines
*/
+
static int
-audiohd_quiesce(dev_info_t *dip)
+audiohd_engine_format(void *arg)
{
- audiohd_state_t *statep;
- int instance;
+ _NOTE(ARGUNUSED(arg));
- instance = ddi_get_instance(dip);
+ return (AUDIO_FORMAT_S16_LE);
+}
- if ((statep = ddi_get_soft_state(audiohd_statep, instance)) == NULL) {
- return (DDI_SUCCESS);
- }
+static int
+audiohd_engine_channels(void *arg)
+{
+ audiohd_port_t *port = arg;
- audiohd_stop_dma(statep);
- audiohd_disable_intr(statep);
+ return (port->nchan);
+}
- return (DDI_SUCCESS);
+static int
+audiohd_engine_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
}
+
/*
- * audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
- * Description:
- * This routine is used to change the widget power betwen D0 and D2.
- * D0 is fully on; D2 allows the lowest possible power consuming state
- * from which it can return to the fully on state: D0.
+ * get the max channels the hardware supported
*/
static void
-audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+audiohd_get_channels(audiohd_state_t *statep)
+{
+ int i;
+ uint8_t maxp, assoc;
+
+ maxp = 2;
+ for (i = 0; i < AUDIOHD_MAX_ASSOC; i++) {
+ if (maxp < statep->chann[i]) {
+ maxp = statep->chann[i];
+ assoc = i;
+ }
+ }
+ statep->pchan = maxp;
+ statep->assoc = assoc;
+ /* for record, support stereo so far */
+ statep->rchan = 2;
+}
+static void
+audiohd_init_play_path(audiohd_path_t *path)
{
+ int i;
+ uint32_t ctrl;
+ uint8_t ctrl8;
+ uint8_t nchann;
+ audiohd_widget_t *widget;
+ audiohd_pin_t *pin;
+ wid_t wid;
+ audiohd_pin_color_t color;
+
+ audiohd_state_t *statep = path->statep;
+ hda_codec_t *codec = path->codec;
+
+ /* enable SPDIF output */
+ for (i = 0; i < path->pin_nums; i++) {
+ wid = path->pin_wid[i];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPDIF_OUT) {
+ ctrl = audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_GET_SPDIF_CTL,
+ 0);
+ ctrl |= AUDIOHD_SPDIF_ON;
+ ctrl8 = ctrl &
+ AUDIOHD_SPDIF_MASK;
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_SPDIF_LCL,
+ ctrl8);
+ }
+ }
+ wid = path->pin_wid[0];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+
+ /* two channels supported */
+ if (pin->device == DTYPE_SPEAKER ||
+ pin->assoc != statep->assoc) {
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ statep->port[PORT_DAC]->index <<
+ AUDIOHD_PLAY_TAG_OFF);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 |
+ statep->pchan - 1);
+ /* multichannel supported */
+ } else {
+ color = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ switch (color) {
+ case AUDIOHD_PIN_BLACK:
+ nchann = statep->pchan - 2;
+ break;
+ case AUDIOHD_PIN_ORANGE:
+ nchann = 2;
+ break;
+ case AUDIOHD_PIN_GREY:
+ nchann = 4;
+ break;
+ case AUDIOHD_PIN_GREEN:
+ nchann = 0;
+ break;
+ default:
+ nchann = 0;
+ break;
+ }
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ statep->port[PORT_DAC]->index <<
+ AUDIOHD_PLAY_TAG_OFF |
+ nchann);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 |
+ statep->pchan - 1);
+ }
+}
+static void
+audiohd_init_record_path(audiohd_path_t *path)
+{
+ audiohd_state_t *statep = path->statep;
+ hda_codec_t *codec = path->codec;
int i;
wid_t wid;
- hda_codec_t *codec;
+ audiohd_pin_t *pin;
audiohd_widget_t *widget;
- /* Change power to D2 */
- if (off) {
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- for (wid = codec->first_wid; wid <= codec->last_wid;
- wid++) {
- widget = codec->widget[wid];
- if (widget->widget_cap &
- AUDIOHD_WIDCAP_PWRCTRL) {
- (void) audioha_codec_verb_get(statep,
- codec->index, wid,
- AUDIOHDC_VERB_SET_POWER_STATE,
- AUDIOHD_PW_D2);
- }
- }
+ for (i = 0; i < path->pin_nums; i++) {
+ wid = path->pin_wid[i];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ /*
+ * Since there is no SPDIF input device available for test,
+ * we will use this code in the future to support SPDIF input
+ */
+#if 0
+ if (pin->device == DTYPE_SPDIF_IN) {
+ ctrl = audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_GET_SPDIF_CTL,
+ 0);
+ ctrl |= AUDIOHD_SPDIF_ON;
+ ctrl8 = ctrl &
+ AUDIOHD_SPDIF_MASK;
+ (void) audioha_codec_verb_get(
+ statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_SPDIF_LCL,
+ ctrl8);
+ statep->inmask |= (1U << DTYPE_SPDIF_IN);
}
- /* Change power to D0 */
- } else {
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- for (wid = codec->first_wid; wid <= codec->last_wid;
- wid++) {
- widget = codec->widget[wid];
- if (widget->widget_cap &
- AUDIOHD_WIDCAP_PWRCTRL) {
- (void) audioha_codec_verb_get(statep,
- codec->index, wid,
- AUDIOHDC_VERB_SET_POWER_STATE,
- AUDIOHD_PW_D0);
- }
- }
+#endif
+ if (pin->device == DTYPE_MIC_IN) {
+ if (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_FIXED)
+ statep->port[PORT_ADC]->index = path->tag;
+ }
+ if ((pin->device == DTYPE_LINE_IN) ||
+ (pin->device == DTYPE_CD) ||
+ (pin->device == DTYPE_MIC_IN)) {
+ statep->inmask |= (1U << pin->device);
}
}
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_STREAM_CHANN,
+ path->tag <<
+ AUDIOHD_REC_TAG_OFF);
+ (void) audioha_codec_4bit_verb_get(statep,
+ codec->index,
+ path->adda_wid,
+ AUDIOHDC_VERB_SET_CONV_FMT,
+ AUDIOHD_FMT_PCM << 4 | statep->rchan - 1);
+
}
-/*
- * audiohd_restore_path()
- * Description:
- * This routine is used to restore the path on the codec.
- */
static void
-audiohd_restore_path(audiohd_state_t *statep)
+audiohd_init_path(audiohd_state_t *statep)
{
- int i;
- hda_codec_t *codec;
+ int i;
+ audiohd_path_t *path;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
continue;
- audiohd_finish_output_path(statep->codec[i]);
- audiohd_finish_input_path(statep->codec[i]);
- audiohd_finish_monitor_path(statep->codec[i]);
+ switch (path->path_type) {
+ case PLAY:
+ audiohd_init_play_path(path);
+ break;
+ case RECORD:
+ audiohd_init_record_path(path);
+ break;
+ default:
+ break;
+ }
}
+ statep->in_port = 0;
}
-/*
- * restore_play_and_record()
- */
-static void
-audiohd_restore_play_and_record(audiohd_state_t *statep)
+static int
+audiohd_reset_port(audiohd_port_t *port)
{
- uint64_t sbd_phys_addr;
- uint_t regbase;
+ uint16_t regbase;
+ audiohd_state_t *statep;
+ uint8_t bTmp;
+ int i;
+
+ regbase = port->regoff;
+ statep = port->statep;
+
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ /* stop stream */
+ bTmp &= ~AUDIOHD_REG_RIRBSIZE;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ /* wait 40us for stream to stop as HD spec */
+ drv_usecwait(40);
+
+ /* reset stream */
+ bTmp |= AUDIOHDR_SD_CTL_SRST;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
+ /* Empirical testing time, which works well */
+ drv_usecwait(50);
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ bTmp &= AUDIOHDR_SD_CTL_SRST;
+ if (bTmp)
+ break;
+ }
+
+ if (!bTmp) {
+ audio_dev_warn(statep->adev, "Failed to reset stream %d",
+ port->index);
+ return (AUDIO_FAILURE);
+ }
+
+ /* Empirical testing time, which works well */
+ drv_usecwait(300);
+
+ /* exit reset stream */
+ bTmp &= ~AUDIOHDR_SD_CTL_SRST;
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+
+ for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
+ /* Empircal testing time */
+ drv_usecwait(50);
+ bTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
+ bTmp &= AUDIOHDR_SD_CTL_SRST;
+ if (!bTmp)
+ break;
+ }
+
+ if (bTmp) {
+ audio_dev_warn(statep->adev,
+ "Failed to exit reset state for"
+ " stream %d, bTmp=0x%02x", port->index, bTmp);
+ return (AUDIO_FAILURE);
+ }
- regbase = statep->hda_play_regbase;
- sbd_phys_addr = statep->hda_dma_play_bd.ad_paddr;
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
+ (uint32_t)port->bdl_paddr);
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
+ (uint32_t)(port->bdl_paddr >> 32));
AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
AUDIOHD_BDLE_NUMS - 1);
AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS);
+ port->samp_size * AUDIOHD_BDLE_NUMS);
AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_play_format);
+ port->format << 4 | port->nchan - 1);
/* clear status */
AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
AUDIOHDR_SD_STS_BCIS | AUDIOHDR_SD_STS_FIFOE |
AUDIOHDR_SD_STS_DESE);
- /* set playback stream tag */
+ /* set stream tag */
AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
AUDIOHD_PLAY_CTL_OFF,
- (statep->hda_play_stag) << AUDIOHD_PLAY_TAG_OFF);
-
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_SRUN);
- }
+ (port->index) << AUDIOHD_PLAY_TAG_OFF);
- regbase = statep->hda_record_regbase;
- sbd_phys_addr = statep->hda_dma_record_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_record_format);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS);
+ return (AUDIO_SUCCESS);
+}
+static int
+audiohd_engine_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
+ _NOTE(ARGUNUSED(flag));
- /* set stream tag to 1 */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_REC_CTL_OFF,
- statep->hda_record_stag << AUDIOHD_REC_TAG_OFF);
+ mutex_enter(&statep->hda_mutex);
+ (void) audiohd_reset_port(port);
+ mutex_exit(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_SRUN);
- }
+ port->started = B_FALSE;
+ port->count = 0;
+ port->curpos = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = AUDIOHD_BDLE_NUMS;
+ *bufp = port->samp_kaddr;
+ return (0);
}
-/*
- * audiohd_reset_pins_ur_cap()
- * Description:
- * Enable the unsolicited response of the pins which have the unsolicited
- * response capability
- */
+
static void
-audiohd_reset_pins_ur_cap(audiohd_state_t *statep)
+audiohd_start_port(audiohd_port_t *port)
{
- hda_codec_t *codec;
- audiohd_pin_t *pin;
- audiohd_widget_t *widget;
- uint32_t urctrl;
- int i;
+ audiohd_state_t *statep = port->statep;
- for (i = 0; i <= AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (!codec)
- continue;
- pin = codec->first_pin;
- while (pin) {
- /* enable the unsolicited response of the pin */
- widget = codec->widget[pin->wid];
- if ((widget->widget_cap &
- (AUDIOHD_URCAP_MASK) &&
- (pin->cap & AUDIOHD_DTCCAP_MASK)) &&
- ((pin->device == DTYPE_LINEOUT) ||
- (pin->device == DTYPE_SPDIF_OUT) ||
- (pin->device == DTYPE_HP_OUT) ||
- (pin->device == DTYPE_MIC_IN))) {
- urctrl = (uint8_t)(1 <<
- (AUDIOHD_UR_ENABLE_OFF - 1));
- urctrl |= (pin->wid & AUDIOHD_UR_TAG_MASK);
- (void) audioha_codec_verb_get(statep,
- codec->index,
- pin->wid,
- AUDIOHDC_VERB_SET_URCTRL, urctrl);
- }
- pin = pin->next;
- }
+ ASSERT(mutex_owned(&statep->hda_mutex));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
}
+
+ /* Enable interrupt and start DMA */
+ AUDIOHD_REG_SET8(port->regoff + AUDIOHD_SDREG_OFFSET_CTL,
+ AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
}
+
static void
-audiohd_restore_codec_gpio(audiohd_state_t *statep)
+audiohd_stop_port(audiohd_port_t *port)
{
- int i;
- wid_t wid;
- hda_codec_t *codec;
-
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- wid = codec->wid_afg;
-
- /*
- * GPIO controls which are laptop specific workarounds and
- * might be changed. Some laptops use GPIO, so we need to
- * enable and set the GPIO correctly.
- */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DIREC, AUDIOHDC_GPIO_DIRECT);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
-
- /* power-up audio function group */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_POWER_STATE, 0);
+ audiohd_state_t *statep = port->statep;
+ ASSERT(mutex_owned(&statep->hda_mutex));
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
}
+ AUDIOHD_REG_SET8(port->regoff + AUDIOHD_SDREG_OFFSET_CTL, 0);
}
-/*
- * audiohd_resume()
- */
+
static int
-audiohd_resume(audiohd_state_t *statep)
+audiohd_engine_start(void *arg)
{
- uint_t regbase;
- uint8_t rirbsts;
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
mutex_enter(&statep->hda_mutex);
- statep->suspended = B_FALSE;
- /* Restore the hda state */
- if (audiohd_reinit_hda(statep) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_resume() hda reinit failed");
- mutex_exit(&statep->hda_mutex);
- return (DDI_SUCCESS);
+ if (!port->started) {
+ audiohd_start_port(port);
+ port->started = B_TRUE;
+ port->triggered = B_TRUE;
}
- /* reset to enable the capability of unsolicited response for pin */
- audiohd_reset_pins_ur_cap(statep);
- /* Enable interrupt */
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
- AUDIOHD_INTCTL_BIT_GIE |
- AUDIOHD_INTCTL_BIT_SIE);
- /* clear the unsolicited response interrupt */
- rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
- AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
mutex_exit(&statep->hda_mutex);
+ return (0);
+}
- /* Resume playing and recording */
- if (audio_sup_restore_state(statep->hda_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_resume() audioh restore failed");
- audiohd_disable_intr(statep);
- audiohd_stop_dma(statep);
- }
- audiohd_restore_play_and_record(statep);
- /* Enable interrupt and start DMA for play */
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- regbase = statep->hda_play_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
- }
+static void
+audiohd_engine_stop(void *arg)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
- /* Enable interrupt and start DMA for record */
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- regbase = statep->hda_record_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
- }
- /* set widget power to D0 */
- audiohd_change_widget_power_state(statep, AUDIOHD_PW_ON);
mutex_enter(&statep->hda_mutex);
- cv_broadcast(&statep->hda_cv); /* wake up entry points */
+ if (port->started) {
+ audiohd_stop_port(port);
+ }
+ port->started = B_FALSE;
mutex_exit(&statep->hda_mutex);
+}
- return (DDI_SUCCESS);
-} /* audiohd_resume */
+static void
+audiohd_update_port(audiohd_port_t *port)
+{
+ int pos;
+ uint32_t len;
+ audiohd_state_t *statep = port->statep;
-/*
- * audiohd_suspend()
- */
-static int
-audiohd_suspend(audiohd_state_t *statep)
+ pos = AUDIOHD_REG_GET32(port->regoff + AUDIOHD_SDREG_OFFSET_LPIB);
+ pos &= AUDIOHD_POS_MASK;
+ if (pos > port->curpos)
+ len = (pos - port->curpos) & AUDIOHD_POS_MASK;
+ else {
+ len = pos + port->samp_size * AUDIOHD_BDLE_NUMS - port->curpos;
+ len &= AUDIOHD_POS_MASK;
+ }
+ port->curpos += len;
+ if (port->curpos >= port->samp_size * AUDIOHD_BDLE_NUMS)
+ port->curpos -= port->samp_size * AUDIOHD_BDLE_NUMS;
+
+ port->len = len;
+ port->count += len / (port->nchan * 2);
+
+
+}
+
+static uint64_t
+audiohd_engine_count(void *arg)
{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
+ uint64_t val;
+
mutex_enter(&statep->hda_mutex);
- statep->suspended = B_TRUE;
- /* wait for current operations to complete */
- while (statep->hda_busy_cnt != 0)
- cv_wait(&statep->hda_cv, &statep->hda_mutex);
-
- if (audio_sup_save_state(statep->hda_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "audiohd_suspend() audio save failed");
- statep->suspended = B_FALSE;
- cv_broadcast(&statep->hda_cv);
- mutex_exit(&statep->hda_mutex);
- return (DDI_FAILURE);
- }
+ audiohd_update_port(port);
+ val = port->count;
+ mutex_exit(&statep->hda_mutex);
+ return (val);
+}
- /* set widget power to D2 */
- audiohd_change_widget_power_state(statep, AUDIOHD_PW_OFF);
- /* Disable h/w */
- audiohd_disable_intr(statep);
- audiohd_stop_dma(statep);
+static void
+audiohd_engine_close(void *arg)
+{
+ audiohd_port_t *port = arg;
+ audiohd_state_t *statep = port->statep;
+
+ mutex_enter(&statep->hda_mutex);
+ audiohd_stop_port(port);
+ port->started = B_FALSE;
+ port->triggered = B_FALSE;
mutex_exit(&statep->hda_mutex);
+}
- return (DDI_SUCCESS);
-} /* audiohd_suspend */
+static void
+audiohd_engine_sync(void *arg, unsigned nframes)
+{
+ audiohd_port_t *port = arg;
-/*
- * audiohd_disable_pin()
- */
-static int
-audiohd_disable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, port->curpos,
+ port->len, port->sync_dir);
+
+}
+
+static size_t
+audiohd_engine_qlen(void *arg)
{
- AUDIOHD_DISABLE_PIN_OUT(statep, caddr, wid);
- return (AUDIO_SUCCESS);
+ audiohd_port_t *port = arg;
+
+ return (port->fragfr);
}
-/*
- * audiohd_enable_pin()
- */
+audio_engine_ops_t audiohd_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audiohd_engine_open,
+ audiohd_engine_close,
+ audiohd_engine_start,
+ audiohd_engine_stop,
+ audiohd_engine_count,
+ audiohd_engine_format,
+ audiohd_engine_channels,
+ audiohd_engine_rate,
+ audiohd_engine_sync,
+ audiohd_engine_qlen,
+};
+
static int
-audiohd_enable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+audiohd_get_value(void *arg, uint64_t *val)
{
- AUDIOHD_ENABLE_PIN_OUT(statep, caddr, wid);
- return (AUDIO_SUCCESS);
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+
+ mutex_enter(&statep->hda_mutex);
+ *val = pc->val;
+ mutex_exit(&statep->hda_mutex);
+ return (0);
}
-/*
- * audiohd_change_speaker_state()
- */
+
static void
-audiohd_change_speaker_state(audiohd_state_t *statep, int on)
+audiohd_set_output_gain(audiohd_state_t *statep)
{
- hda_codec_t *codec;
- audiohd_ostream_t *ostream;
- audiohd_widget_t *widget;
- audiohd_pin_t *pin;
- int i, j;
-
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i]) {
- codec = statep->codec[i];
- break;
+ int i, j;
+ uint64_t val = statep->controls[CTL_VOLUME]->val;
+ audiohd_path_t *path;
+ uint_t tmp;
+ uint8_t lgain = val;
+ uint8_t rgain = val;
+
+ statep->hda_play_lgain = lgain;
+ statep->hda_play_rgain = rgain;
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type == RECORD)
+ continue;
+ if (path->gain_wid) {
+ tmp = lgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir | tmp);
+ tmp = rgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir | tmp);
+ continue;
}
- }
- if (!codec)
- return;
- if (on) {
- ostream = codec->ostream;
- while (ostream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- widget = codec->widget[ostream->pin_wid[j]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPEAKER) {
- (void) audiohd_enable_pin(statep,
- codec->index, pin->wid);
- }
+ for (j = 0; j < path->pin_nums; j++) {
+ audiohd_widget_t *w;
+ audiohd_pin_t *pin;
+ wid_t wid;
+
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)w->priv;
+ if (pin->gain_wid) {
+ tmp = lgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = rgain * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
}
- ostream = ostream->next_stream;
}
+ }
+}
- } else {
- ostream = codec->ostream;
- while (ostream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- widget = codec->widget[ostream->pin_wid[j]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPEAKER) {
- (void) audiohd_disable_pin(statep,
- codec->index, pin->wid);
- }
+static void
+audiohd_set_pin_volume(audiohd_state_t *statep, audiohda_device_type_t type)
+{
+ int i, j;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ wid_t wid;
+ audiohd_pin_t *pin;
+ hda_codec_t *codec;
+ uint8_t l, r;
+ uint64_t val;
+ uint_t tmp;
+ audiohd_ctrl_t *control;
+
+ switch (type) {
+ case DTYPE_LINEOUT:
+ control = statep->controls[CTL_FRONT];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_SPEAKER:
+ control = statep->controls[CTL_SPEAKER];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_HP_OUT:
+ control = statep->controls[CTL_HEADPHONE];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_CD:
+ control = statep->controls[CTL_CD];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_LINE_IN:
+ control = statep->controls[CTL_LINEIN];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ case DTYPE_MIC_IN:
+ control = statep->controls[CTL_MIC];
+ if (control == NULL)
+ return;
+ val = control->val;
+ break;
+ }
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if ((pin->device == type) && pin->gain_wid) {
+ tmp = l * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = r * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
}
- ostream = ostream->next_stream;
}
}
}
-/*
- * audiohd_select_mic()
- *
- * Description:
- * This funciton is used for the recording path which has a selector
- * as the sumwidget. We select the external MIC if it is plugged into the
- * MIC jack, otherwise the internal integrated MIC is selected.
- */
+
+
static void
-audiohd_select_mic(audiohd_state_t *statep, uint8_t index,
-uint8_t id, int select)
+audiohd_set_pin_volume_by_color(audiohd_state_t *statep,
+ audiohd_pin_color_t color)
{
+ int i, j;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ wid_t wid;
+ audiohd_pin_t *pin;
hda_codec_t *codec;
- audiohd_istream_t *istream;
- audiohd_widget_t *widget, *sumwgt;
+ uint8_t l, r;
+ uint64_t val;
+ uint_t tmp;
+ audiohd_pin_color_t clr;
+ audiohd_ctrl_t *control;
+
+ switch (color) {
+ case AUDIOHD_PIN_BLACK:
+ control = statep->controls[CTL_REAR];
+ if (control == NULL)
+ return;
+ val = control->val;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ break;
+ case AUDIOHD_PIN_ORANGE:
+ control = statep->controls[CTL_CENTER];
+ if (control == NULL)
+ return;
+ l = control->val;
+ control = statep->controls[CTL_LFE];
+ if (control == NULL)
+ return;
+ r = control->val;
+ break;
+ case AUDIOHD_PIN_GREY:
+ control = statep->controls[CTL_SURROUND];
+ if (control == NULL)
+ return;
+ val = control->val;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ break;
+ }
+
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ clr = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ if ((clr == color) && pin->gain_wid) {
+ tmp = l * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT | path->gain_dir |
+ tmp);
+ tmp = r * path->gain_bits / 100;
+ (void) audioha_codec_4bit_verb_get(statep,
+ path->codec->index,
+ path->gain_wid,
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT | path->gain_dir |
+ tmp);
+ }
+ }
+ }
+}
+
+static int
+audiohd_set_input_pin(audiohd_state_t *statep)
+{
+ uint64_t val;
audiohd_pin_t *pin;
- int i;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ int i, j;
wid_t wid;
- codec = statep->codec[index];
- if (codec == NULL)
- return;
- istream = codec->istream;
- sumwgt = codec->widget[istream->sum_wid];
- while (istream && sumwgt && (sumwgt->type == WTYPE_AUDIO_SEL)) {
- if (select) {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- pin->wid == id &&
- (((pin->config >> AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_JACK)) {
- (void) audioha_codec_verb_get(statep,
- index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
- statep->hda_record_stag = istream->rtag;
- return;
- }
- }
- } else {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
+ val = statep->controls[CTL_RECSRC]->val;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != RECORD)
+ continue;
+ switch ((ddi_ffs(val & 0xffff)) - 1) {
+ case DTYPE_LINE_IN:
+ case DTYPE_MIC_IN:
+ case DTYPE_CD:
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- (((pin->config >> AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)) {
- (void) audioha_codec_verb_get(statep,
- index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
- statep->hda_record_stag = istream->rtag;
- return;
+ if ((1U << pin->device) == val) {
+ AUDIOHD_ENABLE_PIN_IN(statep,
+ path->codec->index,
+ pin->wid);
+ statep->in_port = pin->device;
+ } else if (statep->in_port == pin->device) {
+ AUDIOHD_DISABLE_PIN_IN(statep,
+ path->codec->index,
+ pin->wid);
}
}
- }
- istream = istream->next_stream;
- if (istream == NULL)
break;
- sumwgt = codec->widget[istream->sum_wid];
+ default:
+ break;
+ }
+ break;
}
- /*
- * If the input istream > 1, we should set the the record stream tag
- * repectively. All the input streams sharing one tag may make the
- * record sound distorted.
- */
- if (codec->nistream > 1) {
- istream = codec->istream;
- while (istream) {
- if (select) {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- pin->wid == id &&
- (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_JACK)) {
- statep->hda_record_stag =
- istream->rtag;
- return;
- }
- }
- } else {
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- widget = codec->widget[wid];
- if (widget == NULL)
- return;
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_MIC_IN &&
- (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)) {
- statep->hda_record_stag =
- istream->rtag;
- return;
- }
- }
+ return (DDI_SUCCESS);
+}
+
+static void
+audiohd_set_pin_monitor_gain(hda_codec_t *codec, audiohd_state_t *statep,
+ uint_t caddr, audiohd_pin_t *pin, uint64_t gain)
+{
+ int i, k;
+ uint_t ltmp, rtmp;
+ audiohd_widget_t *widget;
+ uint8_t l, r;
+
+ l = (gain & 0xff00) >> 8;
+ r = (gain & 0xff);
+
+ for (k = 0; k < pin->num; k++) {
+ ltmp = l * pin->mg_gain[k] / 100;
+ rtmp = r * pin->mg_gain[k] / 100;
+ widget = codec->widget[pin->mg_wid[k]];
+ if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_OUTPUT) {
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT|
+ pin->mg_dir[k] | ltmp);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT|
+ pin->mg_dir[k] | rtmp);
+ } else if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_INPUT) {
+ for (i = 0; i < widget->used; i++) {
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_RIGHT|
+ widget->selmon[i]<<
+ AUDIOHDC_AMP_SET_INDEX_OFFSET |
+ pin->mg_dir[k] | rtmp);
+ (void) audioha_codec_4bit_verb_get(
+ statep,
+ caddr,
+ pin->mg_wid[k],
+ AUDIOHDC_VERB_SET_AMP_MUTE,
+ AUDIOHDC_AMP_SET_LEFT|
+ widget->selmon[i]<<
+ AUDIOHDC_AMP_SET_INDEX_OFFSET |
+ pin->mg_dir[k] | ltmp);
}
- istream = istream->next_stream;
}
}
}
-/*
- * audiohd_pin_sense()
- *
- * Description
- *
- * When the earphone is plugged into the jack associtated with the pin
- * complex, we disable the built in speaker. When the earphone is plugged
- * out of the jack, we enable the built in speaker.
- */
+
static void
-audiohd_pin_sense(audiohd_state_t *statep, uint32_t resp, uint32_t respex)
+audiohd_set_monitor_gain(audiohd_state_t *statep)
{
- uint8_t index;
- uint8_t id;
- uint32_t rs;
- audiohd_widget_t *widget;
+ int i, j;
+ audiohd_path_t *path;
+ uint_t caddr;
+ audiohd_widget_t *w;
+ wid_t wid;
audiohd_pin_t *pin;
- hda_codec_t *codec;
+ audiohd_ctrl_t *ctrl;
+ uint64_t val;
- index = respex & AUDIOHD_RIRB_CODEC_MASK;
- id = resp >> (AUDIOHD_RIRB_WID_OFF - 1);
-
- codec = statep->codec[index];
- if (codec == NULL)
- return;
- widget = codec->widget[id];
- if (widget == NULL)
+ ctrl = statep->controls[CTL_MONGAIN];
+ if (ctrl == NULL)
return;
+ val = ctrl->val;
- rs = audioha_codec_verb_get(statep, index, id,
- AUDIOHDC_VERB_GET_PIN_SENSE, 0);
- if (rs >> (AUDIOHD_PIN_PRES_OFF - 1) & 1) {
- /* A MIC is plugged in, we select the MIC as input */
- if ((widget->type == WTYPE_PIN) &&
- (pin = (audiohd_pin_t *)widget->priv) &&
- (pin->device == DTYPE_MIC_IN)) {
- audiohd_select_mic(statep, index, id, 1);
- return;
- }
- /* output pin is plugged */
- audiohd_change_speaker_state(statep, AUDIOHD_SP_OFF);
- } else {
- /*
- * A MIC is unplugged, we select the built in MIC
- * as input.
- */
- if ((widget->type == WTYPE_PIN) &&
- (pin = (audiohd_pin_t *)widget->priv) &&
- (pin->device == DTYPE_MIC_IN)) {
- audiohd_select_mic(statep, index, id, 0);
- return;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (path == NULL || path->path_type != PLAY)
+ continue;
+ caddr = path->codec->index;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)w->priv;
+ audiohd_set_pin_monitor_gain(path->codec, statep,
+ caddr, pin, val);
}
- /* output pin is unplugged */
- audiohd_change_speaker_state(statep, AUDIOHD_SP_ON);
}
}
-/*
- * audiohd_intr()
- *
- * Description
- *
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audiohd_intr(caddr_t arg)
+
+static void
+audiohd_restore_volume(audiohd_state_t *statep)
{
- audiohd_state_t *statep = (audiohd_state_t *)arg;
- uint32_t status;
- uint32_t regbase;
- uint32_t resp, respex;
- uint8_t sdstatus, rirbsts;
- int i, ret;
+ audiohd_set_pin_volume(statep, DTYPE_LINEOUT);
+ audiohd_set_pin_volume(statep, DTYPE_SPEAKER);
+ audiohd_set_pin_volume(statep, DTYPE_HP_OUT);
- mutex_enter(&statep->hda_mutex);
- if (statep->suspended) {
- mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_UNCLAIMED);
- }
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_BLACK);
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_GREY);
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
+}
+static void
+audiohd_configure_output(audiohd_state_t *statep)
+{
+ audiohd_set_output_gain(statep);
+}
+static void
+audiohd_configure_input(audiohd_state_t *statep)
+{
+ (void) audiohd_set_input_pin(statep);
+ audiohd_set_monitor_gain(statep);
+ audiohd_set_pin_volume(statep, DTYPE_LINE_IN);
+ audiohd_set_pin_volume(statep, DTYPE_CD);
+ audiohd_set_pin_volume(statep, DTYPE_MIC_IN);
+}
+static int
+audiohd_set_volume(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- status = AUDIOHD_REG_GET32(AUDIOHD_REG_INTSTS);
- if (status == 0) {
- mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_UNCLAIMED);
- }
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, status);
+ val &= 0xff;
+ if (val > 100)
+ return (EINVAL);
- /*
- * unsolicited response from pins, maybe something plugged in or out
- * of the jack.
- */
- if (status & AUDIOHD_CIS_MASK) {
- /* clear the unsolicited response interrupt */
- rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
- AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
- /*
- * We have to wait and try several times to make sure the
- * unsolicited response is generated by our pins.
- * we need to make it work for audiohd spec 0.9, which is
- * just a draft version and requires more time to wait.
- */
- for (i = 0; i < AUDIOHD_TEST_TIMES; i++) {
- ret = audiohd_response_from_codec(statep, &resp,
- &respex);
- if ((ret == AUDIO_SUCCESS) &&
- (respex & AUDIOHD_RIRB_UR_MASK)) {
- /*
- * A pin may generate more than one ur rirb,
- * we only need handle one of them, and clear
- * the other ones
- */
- statep->hda_rirb_rp =
- AUDIOHD_REG_GET16(AUDIOHD_REG_RIRBWP) &
- AUDIOHD_RIRB_WPMASK;
- break;
- }
- drv_usecwait(30);
- }
- if ((ret == AUDIO_SUCCESS) &&
- (respex & AUDIOHD_RIRB_UR_MASK))
- audiohd_pin_sense(statep, resp, respex);
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_configure_output(statep);
+ mutex_exit(&statep->hda_mutex);
- /* stream intr */
- for (i = 0; i < statep->hda_streams_nums; i++) {
- if ((status & (1<<i)) == 0)
- continue;
+ return (0);
+}
- regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * i;
- sdstatus = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_STS);
+static int
+audiohd_set_recsrc(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- /* clear intrs */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS, sdstatus);
+ if (val & ~(statep->inmask))
+ return (EINVAL);
- if ((sdstatus & AUDIOHDR_SD_STS_DESE) != 0) {
- /*
- * fatal error. Hardware will clear run bit. So,
- * we need to shutdown the stream
- */
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!audiohd_intr() fatal error, shutdown "
- "stream %d", i);
-
- if (i == statep->hda_input_streams) {
- /* playback */
- mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- mutex_enter(&statep->hda_mutex);
- statep->hda_flags &= ~(AUDIOHD_PLAY_EMPTY |
- AUDIOHD_PLAY_STARTED);
- continue;
- } else if (i == 0) { /* recording */
- statep->hda_flags &= ~(AUDIOHD_RECORD_STARTED);
- continue;
- }
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_configure_input(statep);
+ mutex_exit(&statep->hda_mutex);
+ return (0);
+}
- /* Buffer Complete Intr */
- if (sdstatus & AUDIOHDR_SD_STS_BCIS)
- if (i < statep->hda_input_streams) {
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED)
- audiohd_get_rbuf(statep);
- } else if (statep->hda_flags & AUDIOHD_PLAY_STARTED)
- audiohd_refill_pbuf(statep);
- }
+static int
+audiohd_set_rear(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- /* update the kernel interrupt statistics */
- if (statep->hda_ksp) {
- ((kstat_intr_t *)
- (statep->hda_ksp->ks_data))->intrs[KSTAT_INTR_HARD]++;
- }
+ if (val & ~0xffff)
+ return (EINVAL);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_BLACK);
mutex_exit(&statep->hda_mutex);
- return (DDI_INTR_CLAIMED);
-} /* audiohd_intr() */
+ return (0);
+}
-/*
- * audiohd_ad_start_play()
- *
- * Description:
- * This routine starts the first output stream of hardware
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
static int
-audiohd_ad_start_play(audiohdl_t ahandle, int stream)
+audiohd_set_center(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint64_t sbd_phys_addr;
- uint8_t cTmp;
- uint_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+
+ val &= 0xff;
- ATRACE_32("audiohd_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ if (val > 100)
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_PLAY_STARTED) {
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
- }
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
+ mutex_exit(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- if (statep->hda_flags & AUDIOHD_PLAY_PAUSED) {
- cTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
- statep->hda_flags |= AUDIOHD_PLAY_STARTED;
- statep->hda_flags &= ~AUDIOHD_PLAY_PAUSED;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- cTmp | AUDIOHDR_SD_CTL_SRUN);
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
- }
+ return (0);
+}
- if (audiohd_reset_stream(statep, statep->hda_input_streams)
- != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!start_play() failed to reset play stream");
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
- }
+static int
+audiohd_set_surround(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- statep->hda_flags |= AUDIOHD_PLAY_STARTED;
+ if (val & ~0xffff)
+ return (EINVAL);
- if (audiohd_fill_pbuf(statep) != AUDIO_SUCCESS) {
- mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
- }
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- sbd_phys_addr = statep->hda_dma_play_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS);
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_GREY);
+ mutex_exit(&statep->hda_mutex);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_play_format);
+ return (0);
+}
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_BCIS | AUDIOHDR_SD_STS_FIFOE |
- AUDIOHDR_SD_STS_DESE);
+static int
+audiohd_set_lfe(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
- /* set playback stream tag */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_PLAY_CTL_OFF,
- (statep->hda_play_stag) << AUDIOHD_PLAY_TAG_OFF);
+ val &= 0xff;
- /* Enable interrupt and start DMA */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
+ if (val > 100)
+ return (EINVAL);
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume_by_color(statep, AUDIOHD_PIN_ORANGE);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
-} /* audiohd_ad_start_play() */
-
-
-/*
- * audiohd_ad_set_config()
- */
+ return (0);
+}
static int
-audiohd_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
+audiohd_set_speaker(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- int rc = AUDIO_SUCCESS;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- ATRACE_32("audiohd_ad_set_config() stream", stream);
- ATRACE_32("audiohd_ad_set_config() command", command);
- ATRACE_32("audiohd_ad_set_config() dir", dir);
- ATRACE_32("audiohd_ad_set_config() arg1", arg1);
- ATRACE_32("audiohd_ad_set_config() arg2", arg2);
+ if (val & ~0xffff)
+ return (EINVAL);
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audiohd_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audiohd_set_port(statep, dir, arg1);
- break;
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_SPEAKER);
+ mutex_exit(&statep->hda_mutex);
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audiohd_set_monitor_gain(statep, arg1);
- break;
+ return (0);
+}
+static int
+audiohd_set_front(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- audiohd_mute_outputs(statep, arg1);
- break;
+ if (val & ~0xffff)
+ return (EINVAL);
- case AM_MIC_BOOST:
- break;
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("audiohd_ad_set_config() unsupported command",
- command);
- break;
- }
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_LINEOUT);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-
- return (rc);
-} /* audiohd_ad_set_config */
-
-/*
- * audiohd_ad_set_format()
- *
- * Description
- * currently, only 48k sample rate, 16-bit precision,
- * 2-channel format is supported.
- */
-/*ARGSUSED*/
+ return (0);
+}
static int
-audiohd_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
+audiohd_set_headphone(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
- hda_codec_t *codec;
- uint_t caddr;
- int i;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- /*
- * we will support other format later. For the time being,
- * AUDIOHD_FMT_PCMOUT is used for 48k-16bit-2channel.
- */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_HP_OUT);
+ mutex_exit(&statep->hda_mutex);
- if (dir == AUDIO_PLAY) {
- statep->hda_psample_rate = sample_rate;
- statep->hda_pchannels = channels;
- statep->hda_pprecision = precision;
- statep->hda_play_format = AUDIOHD_FMT_PCMOUT;
+ return (0);
+}
+static int
+audiohd_set_linein(void *arg, uint64_t val)
+{
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i] == NULL)
- continue;
- codec = statep->codec[i];
- caddr = codec->index;
- ostream = codec->ostream;
- while (ostream) {
- if (ostream->in_use == 0)
- break;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, ostream->dac_wid,
- AUDIOHDC_VERB_SET_CONV_FMT,
- AUDIOHD_FMT_PCMOUT);
- ostream = ostream->next_stream;
- }
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- statep->hda_csample_rate = sample_rate;
- statep->hda_cchannels = channels;
- statep->hda_cprecision = precision;
- statep->hda_record_format = AUDIOHD_FMT_PCMIN;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i] == NULL)
- continue;
- codec = statep->codec[i];
- caddr = codec->index;
- istream = codec->istream;
- while (istream) {
- if (istream->in_use == 0)
- break;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, istream->adc_wid,
- AUDIOHDC_VERB_SET_CONV_FMT,
- AUDIOHD_FMT_PCMOUT);
- istream = istream->next_stream;
- }
- }
- }
+ if (val & ~0xffff)
+ return (EINVAL);
- mutex_exit(&statep->hda_mutex);
- return (AUDIO_SUCCESS);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
-} /* audiohd_ad_set_format() */
+ mutex_enter(&statep->hda_mutex);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_LINE_IN);
+ mutex_exit(&statep->hda_mutex);
+ return (0);
+}
-/*
- * audiohd_ad_pause_play()
- */
-/*ARGSUSED*/
-static void
-audiohd_ad_pause_play(audiohdl_t ahandle, int stream)
+static int
+audiohd_set_mic(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint32_t regbase;
- uint8_t cTmp;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- cTmp = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_CTL);
- cTmp &= ~AUDIOHDR_SD_CTL_SRUN;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, cTmp);
- statep->hda_flags &= ~AUDIOHD_PLAY_STARTED;
- statep->hda_flags |= AUDIOHD_PLAY_PAUSED;
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_MIC_IN);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-} /* audiohd_ad_pause_play() */
+ return (0);
+}
-/*
- * audiohd_ad_stop_play()
- */
-/*ARGSUSED*/
-static void
-audiohd_ad_stop_play(audiohdl_t ahandle, int stream)
+static int
+audiohd_set_cd(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint32_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ if (val & ~0xffff)
+ return (EINVAL);
+
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_play_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &=
- ~(AUDIOHD_PLAY_EMPTY | AUDIOHD_PLAY_STARTED);
+ pc->val = val;
+ audiohd_set_pin_volume(statep, DTYPE_CD);
mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-} /* audiohd_ad_stop_play() */
+ return (0);
+}
-/*
- * audiohd_ad_start_record()
- */
-/*ARGSUSED*/
static int
-audiohd_ad_start_record(audiohdl_t ahandle, int stream)
+audiohd_set_mongain(void *arg, uint64_t val)
{
- audiohd_state_t *statep;
- uint64_t sbd_phys_addr;
- uint_t regbase;
+ audiohd_ctrl_t *pc = arg;
+ audiohd_state_t *statep = pc->statep;
+ uint8_t l, r;
+
+ if (val & ~0xffff)
+ return (EINVAL);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ l = (val & 0xff00) >> 8;
+ r = (val & 0xff);
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
- audiohd_set_busy(statep);
mutex_enter(&statep->hda_mutex);
- if (statep->hda_flags & AUDIOHD_RECORD_STARTED) {
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
+ pc->val = val;
+ audiohd_configure_input(statep);
+ mutex_exit(&statep->hda_mutex);
+
+ return (0);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+
+static audiohd_ctrl_t *
+audiohd_alloc_ctrl(audiohd_state_t *statep, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ audiohd_ctrl_t *pc;
+
+ pc = kmem_zalloc(sizeof (*pc), KM_SLEEP);
+ pc->statep = statep;
+ pc->num = num;
+
+ bzero(&desc, sizeof (desc));
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiohd_set_volume;
+ break;
+
+ case CTL_FRONT:
+ desc.acd_name = AUDIO_CTRL_ID_FRONT;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_front;
+ break;
+
+ case CTL_SPEAKER:
+ desc.acd_name = AUDIO_CTRL_ID_SPEAKER;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_speaker;
+ break;
+
+ case CTL_HEADPHONE:
+ desc.acd_name = AUDIO_CTRL_ID_HEADPHONE;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_headphone;
+ break;
+
+ case CTL_REAR:
+ desc.acd_name = AUDIO_CTRL_ID_REAR;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_rear;
+ break;
+
+ case CTL_CENTER:
+ desc.acd_name = AUDIO_CTRL_ID_CENTER;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_center;
+ break;
+
+ case CTL_SURROUND:
+ desc.acd_name = AUDIO_CTRL_ID_SURROUND;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_surround;
+ break;
+
+ case CTL_LFE:
+ desc.acd_name = AUDIO_CTRL_ID_LFE;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiohd_set_lfe;
+ break;
+
+ case CTL_LINEIN:
+ desc.acd_name = AUDIO_CTRL_ID_LINEIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_linein;
+ break;
+
+ case CTL_MIC:
+ desc.acd_name = AUDIO_CTRL_ID_MIC;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_mic;
+ break;
+
+ case CTL_CD:
+ desc.acd_name = AUDIO_CTRL_ID_CD;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiohd_set_cd;
+ break;
+
+ case CTL_MONGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_MONGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MONVOL;
+ fn = audiohd_set_mongain;
+ break;
+
+ case CTL_RECSRC:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = statep->inmask;
+ desc.acd_maxvalue = statep->inmask;
+ desc.acd_flags = RECCTL;
+ for (int i = 0; audiohd_dtypes[i]; i++) {
+ desc.acd_enum[i] = audiohd_dtypes[i];
+ }
+ fn = audiohd_set_recsrc;
+ break;
}
- if (audiohd_reset_stream(statep, 0) != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!start_record() failed to reset record stream");
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_FAILURE);
+ pc->val = val;
+ pc->ctrl = audio_dev_add_control(statep->adev, &desc,
+ audiohd_get_value, fn, pc);
+
+ return (pc);
+}
+
+static void
+audiohd_free_ctrl(audiohd_ctrl_t *pc)
+{
+ if (pc == NULL)
+ return;
+ if (pc->ctrl)
+ audio_dev_del_control(pc->ctrl);
+ kmem_free(pc, sizeof (*pc));
+}
+
+static void
+audiohd_del_controls(audiohd_state_t *statep)
+{
+ int i;
+ for (i = 0; i < CTRL_NUM; i++) {
+ if (statep->controls[i])
+ audiohd_free_ctrl(statep->controls[i]);
}
+}
- audiohd_preset_rbuf(statep);
- statep->hda_rbuf_pos = 0;
- regbase = statep->hda_record_regbase;
- sbd_phys_addr = statep->hda_dma_record_bd.ad_paddr;
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPL,
- (uint32_t)sbd_phys_addr);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_BDLPU,
- (uint32_t)(sbd_phys_addr >> 32));
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_FORMAT,
- statep->hda_record_format);
- AUDIOHD_REG_SET16(regbase + AUDIOHD_SDREG_OFFSET_LVI,
- AUDIOHD_BDLE_NUMS - 1);
- AUDIOHD_REG_SET32(regbase + AUDIOHD_SDREG_OFFSET_CBL,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS);
+static int
+audiohd_add_controls(audiohd_state_t *statep)
+{
+ int i, j;
+ audiohd_path_t *path;
+ wid_t wid;
+ audiohd_pin_t *pin;
+ audiohd_widget_t *widget;
+ hda_codec_t *codec;
+ audiohd_pin_color_t clr;
- /* clear status */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
+#define ADD_CTRL(ID, VAL) \
+ if (statep->controls[ID] == NULL) \
+ statep->controls[ID] = audiohd_alloc_ctrl(statep, ID, VAL);\
+ if (statep->controls[ID] == NULL) { \
+ audio_dev_warn(statep->adev, \
+ "Unable to allocate %s control", #ID); \
+ return (DDI_FAILURE); \
+ }
- /* set stream tag to 1 */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL +
- AUDIOHD_REC_CTL_OFF,
- statep->hda_record_stag << AUDIOHD_REC_TAG_OFF);
- statep->hda_flags |= AUDIOHD_RECORD_STARTED;
+ ADD_CTRL(CTL_VOLUME, 0x4b);
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path)
+ continue;
+ codec = path->codec;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_LINEOUT) {
+ ADD_CTRL(CTL_FRONT, 0x4b4b);
+ } else if (pin->device == DTYPE_SPEAKER) {
+ ADD_CTRL(CTL_SPEAKER, 0x4b4b);
+ } else if (pin->device == DTYPE_HP_OUT) {
+ ADD_CTRL(CTL_HEADPHONE, 0x4b4b);
+ } else if (pin->device == DTYPE_LINE_IN) {
+ ADD_CTRL(CTL_LINEIN, 0x3232);
+ } else if (pin->device == DTYPE_MIC_IN) {
+ ADD_CTRL(CTL_MIC, 0x3232);
+ } else if (pin->device == DTYPE_CD) {
+ ADD_CTRL(CTL_CD, 0x3232);
+ }
+ clr = (pin->config >> AUDIOHD_PIN_CLR_OFF) &
+ AUDIOHD_PIN_CLR_MASK;
+ if (clr == AUDIOHD_PIN_BLACK &&
+ pin->device != DTYPE_HP_OUT &&
+ pin->device != DTYPE_MIC_IN) {
+ ADD_CTRL(CTL_REAR, 0x4b4b);
+ } else if (clr == AUDIOHD_PIN_ORANGE) {
+ ADD_CTRL(CTL_CENTER, 0x4b);
+ ADD_CTRL(CTL_LFE, 0x4b);
+ } else if (clr == AUDIOHD_PIN_GREY) {
+ ADD_CTRL(CTL_SURROUND, 0x4b4b);
+ }
+ }
+ }
- /* start DMA */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL,
- AUDIOHDR_SD_CTL_INTS | AUDIOHDR_SD_CTL_SRUN);
+ if (!statep->monitor_unsupported) {
+ ADD_CTRL(CTL_MONGAIN, 0);
+ }
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
- return (AUDIO_SUCCESS);
+ ADD_CTRL(CTL_RECSRC, (1U << DTYPE_MIC_IN));
-} /* audiohd_ad_start_record() */
+ audiohd_configure_output(statep);
+ audiohd_configure_input(statep);
+ return (DDI_SUCCESS);
+}
/*
- * audiohd_ad_stop_record()
+ * quiesce(9E) entry point.
+ *
+ * This function is called when the system is single-threaded at high
+ * PIL with preemption disabled. Therefore, this function must not be
+ * blocked.
+ *
+ * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
+ * DDI_FAILURE indicates an error condition and should almost never happen.
*/
-/*ARGSUSED*/
-static void
-audiohd_ad_stop_record(audiohdl_t ahandle, int stream)
+static int
+audiohd_quiesce(dev_info_t *dip)
{
- audiohd_state_t *statep;
- uint32_t regbase;
+ audiohd_state_t *statep;
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
+ statep = ddi_get_driver_private(dip);
- audiohd_set_busy(statep);
- mutex_enter(&statep->hda_mutex);
- regbase = statep->hda_record_regbase;
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &= ~(AUDIOHD_RECORD_STARTED);
- mutex_exit(&statep->hda_mutex);
- audiohd_set_idle(statep);
-
-} /* audiohd_ad_stop_play */
+ audiohd_stop_dma(statep);
+ audiohd_disable_intr(statep);
+ return (DDI_SUCCESS);
+}
/*
* audiohd_init_state()
*
@@ -1733,158 +1851,36 @@ audiohd_ad_stop_record(audiohdl_t ahandle, int stream)
static int
audiohd_init_state(audiohd_state_t *statep, dev_info_t *dip)
{
- int pints, rints, mode;
+ audio_dev_t *adev;
statep->hda_dip = dip;
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", AUDIOHD_INTS);
- if (pints > AUDIOHD_MAX_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, AUDIOHD_INTS);
- pints = AUDIOHD_INTS;
- } else if (pints < AUDIOHD_MIN_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, AUDIOHD_INTS);
- pints = AUDIOHD_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", AUDIOHD_INTS);
- if (rints > AUDIOHD_MAX_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, AUDIOHD_INTS);
- rints = AUDIOHD_INTS;
- } else if (rints < AUDIOHD_MIN_INTS) {
- audio_sup_log(statep->hda_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- rints, AUDIOHD_INTS);
- rints = AUDIOHD_INTS;
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "unable to allocate audio dev");
+ return (AUDIO_FAILURE);
}
+ statep->adev = adev;
- statep->hda_pint_freq = pints;
- statep->hda_rint_freq = rints;
- statep->hda_pbuf_size = (AUDIOHD_SAMPLER_MAX * AUDIOHD_MAX_CHANNELS *
- AUDIOHD_MAX_PRECISION / 8) / pints;
- statep->hda_pbuf_size = (statep->hda_pbuf_size +
- AUDIOHD_BDLE_BUF_ALIGN - 1) & ~(AUDIOHD_BDLE_BUF_ALIGN - 1);
- statep->hda_rbuf_size = (AUDIOHD_SAMPLER_MAX * AUDIOHD_MAX_CHANNELS *
- AUDIOHD_MAX_PRECISION / 8) / rints;
- statep->hda_rbuf_size = (statep->hda_rbuf_size +
- AUDIOHD_BDLE_BUF_ALIGN - 1) & ~(AUDIOHD_BDLE_BUF_ALIGN - 1);
-
- /* fill in the device default state */
- statep->hda_info_defaults.play.sample_rate = AUDIOHD_DEFAULT_SR;
- statep->hda_info_defaults.play.channels = AUDIOHD_DEFAULT_CH;
- statep->hda_info_defaults.play.precision = AUDIOHD_DEFAULT_PREC;
- statep->hda_info_defaults.play.encoding = AUDIOHD_DEFAULT_ENC;
- statep->hda_info_defaults.play.gain = AUDIOHD_DEFAULT_PGAIN;
- statep->hda_info_defaults.play.buffer_size = AUDIOHD_BSIZE;
- statep->hda_info_defaults.play.balance = AUDIOHD_DEFAULT_BAL;
-
- statep->hda_info_defaults.record.sample_rate = AUDIOHD_DEFAULT_SR;
- statep->hda_info_defaults.record.channels = AUDIOHD_DEFAULT_CH;
- statep->hda_info_defaults.record.precision = AUDIOHD_DEFAULT_PREC;
- statep->hda_info_defaults.record.encoding = AUDIOHD_DEFAULT_ENC;
- statep->hda_info_defaults.record.gain = AUDIOHD_DEFAULT_RGAIN;
- statep->hda_info_defaults.record.buffer_size = AUDIOHD_BSIZE;
- statep->hda_info_defaults.record.balance = AUDIOHD_DEFAULT_BAL;
-
- statep->hda_info_defaults.monitor_gain = AUDIOHD_DEFAULT_MONITOR_GAIN;
- statep->hda_info_defaults.output_muted = B_FALSE;
- statep->hda_info_defaults.ref_cnt = B_FALSE;
- statep->hda_info_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->hda_info_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- statep->hda_psample_rate =
- statep->hda_info_defaults.play.sample_rate;
- statep->hda_pchannels =
- statep->hda_info_defaults.play.channels;
- statep->hda_pprecision =
- statep->hda_info_defaults.play.precision;
- statep->hda_play_format = AUDIOHD_FMT_PCMOUT;
-
- statep->hda_csample_rate =
- statep->hda_info_defaults.record.sample_rate;
- statep->hda_cchannels =
- statep->hda_info_defaults.record.channels;
- statep->hda_cprecision =
- statep->hda_info_defaults.record.precision;
- statep->hda_record_format = AUDIOHD_FMT_PCMIN;
-
-
- /*
- * fill in the ad_info structure
- */
- statep->hda_ad_info.ad_mode = mode;
- statep->hda_ad_info.ad_int_vers = AM_VERSION;
- statep->hda_ad_info.ad_add_mode = NULL;
- statep->hda_ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->hda_ad_info.ad_defaults = &statep->hda_info_defaults;
- statep->hda_ad_info.ad_play_comb = audiohd_combinations;
- statep->hda_ad_info.ad_rec_comb = audiohd_combinations;
- statep->hda_ad_info.ad_entry = &audiohd_entry;
- statep->hda_ad_info.ad_dev_info = &statep->hda_dev_info;
- statep->hda_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->hda_ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->hda_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->hda_ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->hda_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->hda_ad_info.ad_play.ad_mixer_srs = audiohd_mixer_sample_rates;
- statep->hda_ad_info.ad_play.ad_compat_srs = audiohd_comp_sample_rates;
- statep->hda_ad_info.ad_play.ad_conv = &am_src2;
- statep->hda_ad_info.ad_play.ad_sr_info = NULL;
- statep->hda_ad_info.ad_play.ad_chs = audiohd_channels;
- statep->hda_ad_info.ad_play.ad_int_rate = pints;
- statep->hda_ad_info.ad_play.ad_max_chs = AUDIOHD_MAX_OUT_CHANNELS;
- statep->hda_ad_info.ad_play.ad_bsize = AUDIOHD_BSIZE;
-
- /* record capabilities */
- statep->hda_ad_info.ad_record.ad_mixer_srs = audiohd_mixer_sample_rates;
- statep->hda_ad_info.ad_record.ad_compat_srs = audiohd_comp_sample_rates;
- statep->hda_ad_info.ad_record.ad_conv = &am_src2;
- statep->hda_ad_info.ad_record.ad_sr_info = NULL;
- statep->hda_ad_info.ad_record.ad_chs = audiohd_channels;
- statep->hda_ad_info.ad_record.ad_int_rate = rints;
- statep->hda_ad_info.ad_record.ad_max_chs = AUDIOHD_MAX_IN_CHANNELS;
- statep->hda_ad_info.ad_record.ad_bsize = AUDIOHD_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(statep->hda_dev_info.name, AUDIOHD_DEV_NAME);
- (void) strcpy(statep->hda_dev_info.config, AUDIOHD_DEV_CONFIG);
- (void) strcpy(statep->hda_dev_info.version, AUDIOHD_DEV_VERSION);
+ /* set device information */
+ audio_dev_set_description(adev, AUDIOHD_DEV_CONFIG);
+ audio_dev_set_version(adev, AUDIOHD_DEV_VERSION);
if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->hda_intr_cookie) !=
DDI_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
+ audio_dev_warn(statep->adev,
+ "cannot get iblock cookie");
+ goto error;
}
- statep->hda_busy_cnt = 0;
mutex_init(&statep->hda_mutex, NULL,
MUTEX_DRIVER, statep->hda_intr_cookie);
- cv_init(&statep->hda_cv, NULL, CV_DRIVER, NULL);
- statep->hda_outputs_muted = B_FALSE;
statep->hda_rirb_rp = 0;
return (AUDIO_SUCCESS);
-
+error:
+ if (statep->adev != NULL)
+ audio_dev_free(statep->adev);
+ return (AUDIO_FAILURE);
} /* audiohd_init_state() */
/*
@@ -1901,18 +1897,18 @@ audiohd_init_pci(audiohd_state_t *statep, ddi_device_acc_attr_t *acc_attr)
uint16_t vid;
uint8_t cTmp;
dev_info_t *dip = statep->hda_dip;
- audiohdl_t ahandle = statep->hda_ahandle;
+ audio_dev_t *ahandle = statep->adev;
if (pci_config_setup(dip, &statep->hda_pci_handle) == DDI_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() pci config mapping failed");
+ audio_dev_warn(ahandle,
+ "pci config mapping failed");
goto err_init_pci_exit1;
}
if (ddi_regs_map_setup(dip, 1, &statep->hda_reg_base, 0,
0, acc_attr, &statep->hda_reg_handle) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() memory I/O mapping failed");
+ audio_dev_warn(ahandle,
+ "memory I/O mapping failed");
goto err_init_pci_exit2;
}
@@ -2068,8 +2064,8 @@ audiohd_reset_controller(audiohd_state_t *statep)
}
if ((gctl & AUDIOHDR_GCTL_CRST) != 0) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!reset_controller() failed to enter reset state");
+ audio_dev_warn(statep->adev,
+ "failed to enter reset state");
return (AUDIO_FAILURE);
}
@@ -2088,17 +2084,14 @@ audiohd_reset_controller(audiohd_state_t *statep)
}
if ((gctl & AUDIOHDR_GCTL_CRST) == 0) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!reset_controller() failed to exit reset state");
+ audio_dev_warn(statep->adev,
+ "failed to exit reset state");
return (AUDIO_FAILURE);
}
/* HD spec requires to wait 250us at least. we use 500us */
drv_usecwait(500);
- ATRACE_32("in reset_controller: mask is",
- AUDIOHD_REG_GET16(AUDIOHD_REG_STATESTS));
-
/* enable unsolicited response */
AUDIOHD_REG_SET32(AUDIOHD_REG_GCTL,
gctl | AUDIOHDR_GCTL_URESPE);
@@ -2121,12 +2114,12 @@ audiohd_alloc_dma_mem(audiohd_state_t *statep, audiohd_dma_t *pdma,
ddi_dma_cookie_t cookie;
uint_t count;
dev_info_t *dip = statep->hda_dip;
- audiohdl_t ahandle = statep->hda_ahandle;
+ audio_dev_t *ahandle = statep->adev;
if (ddi_dma_alloc_handle(dip, dma_attr_p, DDI_DMA_SLEEP,
- (caddr_t)0, &pdma->ad_dmahdl) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_hanlde failed");
+ NULL, &pdma->ad_dmahdl) != DDI_SUCCESS) {
+ audio_dev_warn(ahandle,
+ "ddi_dma_alloc_handle failed");
goto error_alloc_dma_exit1;
}
@@ -2135,29 +2128,19 @@ audiohd_alloc_dma_mem(audiohd_state_t *statep, audiohd_dma_t *pdma,
DDI_DMA_SLEEP, NULL,
(caddr_t *)&pdma->ad_vaddr, &pdma->ad_real_sz,
&pdma->ad_acchdl) != DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc failed");
+ audio_dev_warn(ahandle,
+ "ddi_dma_mem_alloc failed");
goto error_alloc_dma_exit2;
}
if (ddi_dma_addr_bind_handle(pdma->ad_dmahdl, NULL,
(caddr_t)pdma->ad_vaddr, pdma->ad_real_sz, dma_flags,
DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_DMA_MAPPED) {
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle failed");
+ audio_dev_warn(ahandle,
+ "ddi_dma_addr_bind_handle failed");
goto error_alloc_dma_exit3;
}
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(pdma->ad_dmahdl);
- audio_sup_log(ahandle, CE_WARN,
- "!map_regs() addr_bind_handle failed, cookies > 1");
- goto error_alloc_dma_exit3;
- }
pdma->ad_paddr = (uint64_t)(cookie.dmac_laddress);
pdma->ad_req_sz = memsize;
@@ -2242,7 +2225,9 @@ audiohd_reinit_hda(audiohd_state_t *statep)
audiohd_restore_codec_gpio(statep);
audiohd_restore_path(statep);
- return (audiohd_init_ports(statep));
+ audiohd_init_path(statep);
+
+ return (AUDIO_SUCCESS);
} /* audiohd_reinit_hda */
/*
@@ -2292,13 +2277,11 @@ audiohd_init_controller(audiohd_state_t *statep)
statep->hda_streams_nums = statep->hda_input_streams +
statep->hda_output_streams;
- statep->hda_record_stag = 1;
- statep->hda_play_stag = statep->hda_input_streams + 1;
+
statep->hda_record_regbase = AUDIOHD_REG_SD_BASE;
statep->hda_play_regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN *
statep->hda_input_streams;
- ATRACE_16("GCAP = ", gcap);
/* stop all dma before starting to reset controller */
audiohd_stop_dma(statep);
@@ -2309,8 +2292,8 @@ audiohd_init_controller(audiohd_state_t *statep)
/* check codec */
statep->hda_codec_mask = AUDIOHD_REG_GET16(AUDIOHD_REG_STATESTS);
if (! statep->hda_codec_mask) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() no codec exists");
+ audio_dev_warn(statep->adev,
+ "no codec exists");
goto err_init_ctlr_exit1;
}
@@ -2319,8 +2302,8 @@ audiohd_init_controller(audiohd_state_t *statep)
AUDIOHD_CDBIO_CORB_LEN, &dma_attr,
DDI_DMA_WRITE | DDI_DMA_STREAMING);
if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for CORB");
+ audio_dev_warn(statep->adev,
+ "failed to alloc DMA for CORB");
goto err_init_ctlr_exit1;
}
@@ -2329,50 +2312,11 @@ audiohd_init_controller(audiohd_state_t *statep)
AUDIOHD_CDBIO_RIRB_LEN, &dma_attr,
DDI_DMA_READ | DDI_DMA_STREAMING);
if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for RIRB");
+ audio_dev_warn(statep->adev,
+ "failed to alloc DMA for RIRB");
goto err_init_ctlr_exit2;
}
- /* allocate DMA for data buffer of playback stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_play_buf,
- statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for playback buf");
- goto err_init_ctlr_exit3;
- }
-
- /* allocate DMA for data buffer of recording stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_record_buf,
- statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_READ | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for recording buf");
- goto err_init_ctlr_exit4;
- }
-
- /* allocate DMA for buffer descriptor list of playback stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_play_bd,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for playback BDL");
- goto err_init_ctlr_exit5;
- }
-
- /* allocate DMA for buffer descriptor list of recording stream */
- retval = audiohd_alloc_dma_mem(statep, &statep->hda_dma_record_bd,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, &dma_attr,
- DDI_DMA_WRITE | DDI_DMA_STREAMING);
- if (retval != AUDIO_SUCCESS) {
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!init_controller() failed to alloc DMA for record BDL");
- goto err_init_ctlr_exit6;
- }
AUDIOHD_REG_SET32(AUDIOHD_REG_SYNC, 0); /* needn't sync stream */
@@ -2399,15 +2343,6 @@ audiohd_init_controller(audiohd_state_t *statep)
return (AUDIO_SUCCESS);
-err_init_ctlr_exit6:
- audiohd_release_dma_mem(&(statep->hda_dma_play_bd));
-
-err_init_ctlr_exit5:
- audiohd_release_dma_mem(&(statep->hda_dma_record_buf));
-
-err_init_ctlr_exit4:
- audiohd_release_dma_mem(&(statep->hda_dma_play_buf));
-
err_init_ctlr_exit3:
audiohd_release_dma_mem(&(statep->hda_dma_rirb));
@@ -2431,10 +2366,6 @@ audiohd_fini_controller(audiohd_state_t *statep)
audiohd_stop_dma(statep);
audiohd_release_dma_mem(&statep->hda_dma_rirb);
audiohd_release_dma_mem(&statep->hda_dma_corb);
- audiohd_release_dma_mem(&statep->hda_dma_play_buf);
- audiohd_release_dma_mem(&statep->hda_dma_record_buf);
- audiohd_release_dma_mem(&statep->hda_dma_record_bd);
- audiohd_release_dma_mem(&statep->hda_dma_play_bd);
} /* audiohd_fini_controller() */
@@ -2460,9 +2391,6 @@ audiohd_get_conns_from_entry(hda_codec_t *codec, audiohd_widget_t *widget,
if (widget->nconns == 0) {
if (input_wid < codec->first_wid ||
(input_wid > codec->last_wid)) {
- ATRACE_32(
- "collection list out of range",
- widget->wid_wid);
break;
}
widget->avail_conn[widget->nconns++] =
@@ -2474,9 +2402,6 @@ audiohd_get_conns_from_entry(hda_codec_t *codec, audiohd_widget_t *widget,
AUDIOHD_MAX_CONN);
if (k < codec->first_wid ||
(k > codec->last_wid)) {
- ATRACE_32(
- "collection out of range",
- widget->wid_wid);
break;
} else {
num = widget->nconns;
@@ -2545,9 +2470,6 @@ audiohd_get_conns(hda_codec_t *codec, wid_t wid)
input_wid = entry & prop.mask_wid;
if ((input_wid < codec->first_wid) ||
(input_wid > codec->last_wid)) {
- ATRACE("node input out of range:", NULL);
- ATRACE_32("node:", wid);
- ATRACE_32("input:", input_wid);
return;
}
widget->avail_conn[0] = input_wid;
@@ -2602,10 +2524,7 @@ audiohd_get_pin_config(audiohd_widget_t *widget)
pin->config = config;
pin->num = 0;
pin->finish = 0;
- /*
- * get the voltage reference state supported by the pin
- * from high level to low level
- */
+
vrefbits = (cap >> AUDIOHD_PIN_VREF_OFF) & AUDIOHD_PIN_VREF_MASK;
if (vrefbits & AUDIOHD_PIN_VREF_L1)
pin->vrefvalue = 0x5;
@@ -2761,10 +2680,8 @@ audiohd_create_widgets(hda_codec_t *codec)
audiohd_get_pin_config(widget);
break;
case WTYPE_BEEP:
- ATRACE("Get a beep widget", NULL);
break;
default:
- ATRACE("Unknown widget", NULL);
break;
}
}
@@ -2788,6 +2705,231 @@ audiohd_destroy_widgets(hda_codec_t *codec)
} /* audiohd_destroy_widgets() */
+static void
+audiohd_set_codec_info(hda_codec_t *codec)
+{
+ char buf[256];
+
+ switch (codec->vid) {
+ case 0x10ec0260:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC260");
+ break;
+ case 0x10ec0262:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC262");
+ break;
+ case 0x10ec0268:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC268");
+ break;
+ case 0x10ec0662:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC662");
+ break;
+ case 0x10ec861:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC861");
+ break;
+ case 0x10ec0862:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC862");
+ break;
+ case 0x10ec0880:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC880");
+ break;
+ case 0x10ec0882:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC882");
+ break;
+ case 0x10ec0883:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC883");
+ break;
+ case 0x10ec0885:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC885");
+ break;
+ case 0x10ec0888:
+ (void) snprintf(buf, sizeof (buf), "Realtek HD codec: ALC888");
+ break;
+ case 0x13f69880:
+ (void) snprintf(buf, sizeof (buf), "CMedia HD codec: CMI19880");
+ break;
+ case 0x434d4980:
+ (void) snprintf(buf, sizeof (buf), "CMedia HD codec: CMI19880");
+ break;
+ case 0x11d41981:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1981");
+ break;
+ case 0x11d41983:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1983");
+ break;
+ case 0x11d41984:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1984");
+ break;
+ case 0x11d41986:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1986A");
+ break;
+ case 0x11d41988:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1988A");
+ break;
+ case 0x11d4198b:
+ (void) snprintf(buf, sizeof (buf),
+ "Analog Devices HD codec: AD1988B");
+ break;
+ case 0x83847690:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9200");
+ break;
+ case 0x838476a0:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9205");
+ break;
+ case 0x838476a1:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9205D");
+ break;
+ case 0x838476a2:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9204");
+ break;
+ case 0x838476a3:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9204D");
+ break;
+ case 0x83847880:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 A1");
+ break;
+ case 0x83847882:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 A2");
+ break;
+ case 0x83847680:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221 A1");
+ break;
+ case 0x83847681:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9220 D");
+ break;
+ case 0x83847682:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221");
+ break;
+ case 0x83847683:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9221D");
+ break;
+ case 0x83847610:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230XN");
+ break;
+ case 0x83847611:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230DN");
+ break;
+ case 0x83847612:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230XT");
+ break;
+ case 0x83847613:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9230DT");
+ break;
+ case 0x83847614:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9229X");
+ break;
+ case 0x83847615:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9229D");
+ break;
+ case 0x83847616:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9228X");
+ break;
+ case 0x83847617:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9228D");
+ break;
+ case 0x83847618:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9227X");
+ break;
+ case 0x83847619:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9227D");
+ break;
+ case 0x838476a4:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9255");
+ break;
+ case 0x838476a5:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9255D");
+ break;
+ case 0x838476a6:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9254");
+ break;
+ case 0x838476a7:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9254D");
+ break;
+ case 0x83847620:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274");
+ break;
+ case 0x83847621:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274D");
+ break;
+ case 0x83847622:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9273X");
+ break;
+ case 0x83847623:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9273D");
+ break;
+ case 0x83847624:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9272X");
+ break;
+ case 0x83847625:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9272D");
+ break;
+ case 0x83847626:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9271X");
+ break;
+ case 0x83847627:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9271D");
+ break;
+ case 0x83847628:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274X5NH");
+ break;
+ case 0x83847629:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9274D5NH");
+ break;
+ case 0x83847662:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9872AK");
+ break;
+ case 0x83847664:
+ (void) snprintf(buf, sizeof (buf),
+ "Sigmatel HD codec: STAC9872K");
+ break;
+ default:
+ (void) snprintf(buf, sizeof (buf),
+ "Unkown HD codec");
+ break;
+
+ }
+ audio_dev_add_info(codec->soft_statep->adev, buf);
+}
/*
* audiohd_create_codec()
*
@@ -2851,19 +2993,6 @@ audiohd_create_codec(audiohd_state_t *statep)
}
ASSERT(codec->wid_afg == wid);
- /*
- * GPIO controls which are laptop specific workarounds and
- * might be changed. Some laptops use GPIO, so we need to
- * enable and set the GPIO correctly.
- */
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DIREC, AUDIOHDC_GPIO_DIRECT);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
- (void) audioha_codec_verb_get(statep, i, wid,
- AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
/* power-up audio function group */
(void) audioha_codec_verb_get(statep, i, wid,
@@ -2891,13 +3020,31 @@ audiohd_create_codec(audiohd_state_t *statep)
/*
* We output the codec information to syslog
*/
- ATRACE_32("codec = ", codec->index);
- ATRACE_32("vid = ", codec->vid);
- ATRACE_32("rev = ", codec->revid);
-
statep->codec[i] = codec;
codec->soft_statep = statep;
+ audiohd_set_codec_info(codec);
(void) audiohd_create_widgets(codec);
+
+ /* work around for Sony VAIO laptop with specific codec */
+ if ((codec->vid == AUDIOHD_CODECID_SONY1) ||
+ (codec->vid == AUDIOHD_CODECID_SONY2))
+ continue;
+ else
+ statep->gpio_direct = AUDIOHDC_GPIO_DIRECT;
+ /*
+ * GPIO controls which are laptop specific workarounds and
+ * might be changed. Some laptops use GPIO, so we need to
+ * enable and set the GPIO correctly.
+ */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DIREC, statep->gpio_direct);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
+
}
return (AUDIO_SUCCESS);
@@ -2913,34 +3060,12 @@ audiohd_create_codec(audiohd_state_t *statep)
static void
audiohd_destroy_codec(audiohd_state_t *statep)
{
- audiohd_ostream_t *ostream, *nostream;
- audiohd_istream_t *istream, *nistream;
+ int i;
audiohd_pin_t *pin, *npin;
- for (int i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
if (statep->codec[i]) {
audiohd_destroy_widgets(statep->codec[i]);
-
- /*
- * free output streams
- */
- ostream = statep->codec[i]->ostream;
- while (ostream) {
- nostream = ostream;
- ostream = ostream->next_stream;
- kmem_free(nostream, sizeof (audiohd_ostream_t));
- }
-
- /*
- * free input streams
- */
- istream = statep->codec[i]->istream;
- while (istream) {
- nistream = istream;
- istream = istream->next_stream;
- kmem_free(nistream, sizeof (audiohd_istream_t));
- }
-
/*
* free pins
*/
@@ -2991,6 +3116,7 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
if (widget == NULL)
return (uint32_t)(AUDIO_FAILURE);
+
/*
* If exclusive is true, we try to find a path which doesn't
* share any widget with other paths.
@@ -3011,7 +3137,6 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
wdac = widget->wid_wid;
- ATRACE_32("(DAC:", widget->wid_wid);
break;
case WTYPE_AUDIO_MIX:
@@ -3028,8 +3153,6 @@ audiohd_find_dac(hda_codec_t *codec, wid_t wid,
widget->selconn = i;
wdac = retval;
}
- ATRACE_32("widget:", widget->wid_wid);
- ATRACE_32("type:", widget->type);
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
@@ -3062,10 +3185,13 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
{
audiohd_pin_t *pin;
audiohd_widget_t *widget, *wdac;
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
wid_t wid;
+ audiohd_state_t *statep;
int i;
+ statep = codec->soft_statep;
+
for (pin = codec->first_pin; pin; pin = pin->next) {
if ((pin->cap & AUDIOHD_PIN_CAP_MASK) == 0)
continue;
@@ -3096,29 +3222,25 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
*/
if (wid == (wid_t)AUDIO_FAILURE)
continue;
- ostream = (audiohd_ostream_t *)
- kmem_zalloc(sizeof (audiohd_ostream_t),
+ if (pin->device != DTYPE_SPEAKER)
+ statep->chann[pin->assoc] += 2;
+ path = (audiohd_path_t *)
+ kmem_zalloc(sizeof (audiohd_path_t),
KM_SLEEP);
- ostream->dac_wid = wid;
- ostream->pin_wid[0] = widget->wid_wid;
- ostream->pin_nums = 1;
+ path->adda_wid = wid;
+ path->pin_wid[0] = widget->wid_wid;
+ path->pin_nums = 1;
+ path->path_type = PLAY;
+ path->codec = codec;
+ path->statep = statep;
wdac = codec->widget[wid];
- wdac->priv = ostream;
+ wdac->priv = path;
pin->adc_dac_wid = wid;
pin->finish = 1;
- ATRACE_32("widget:", widget->wid_wid);
- ATRACE_32("type:", widget->type);
widget->path_flags |= AUDIOHD_PATH_DAC;
widget->out_weight++;
widget->selconn = i;
- if (codec->ostream == NULL)
- codec->ostream = ostream;
- else {
- audiohd_ostream_t *p = codec->ostream;
- while (p->next_stream)
- p = p->next_stream;
- p->next_stream = ostream;
- }
+ statep->path[statep->pathnum++] = path;
break;
}
}
@@ -3138,14 +3260,17 @@ audiohd_do_build_output_path(hda_codec_t *codec, int mixer, int *mnum,
static void
audiohd_build_output_path(hda_codec_t *codec)
{
- audiohd_pin_t *pin;
int mnum = 0;
+ uint8_t mixer_allow = 1;
+ /* work around for hp mini 1000 laptop */
+ if (codec->vid == AUDIOHD_CODECID_HP)
+ mixer_allow = 0;
/* search an exclusive mixer widget path. This is preferred */
- audiohd_do_build_output_path(codec, 1, &mnum, 1, 0);
+ audiohd_do_build_output_path(codec, mixer_allow, &mnum, 1, 0);
/* search a shared mixer widget path for the remained pins */
- audiohd_do_build_output_path(codec, 1, &mnum, 0, 0);
+ audiohd_do_build_output_path(codec, mixer_allow, &mnum, 0, 0);
/* search an exclusive widget path without mixer for the remained pin */
audiohd_do_build_output_path(codec, 0, &mnum, 1, 0);
@@ -3153,22 +3278,6 @@ audiohd_build_output_path(hda_codec_t *codec)
/* search a shared widget path without mixer for the remained pin */
audiohd_do_build_output_path(codec, 0, &mnum, 0, 0);
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((pin->cap & AUDIOHD_PIN_CAP_MASK) == 0) {
- continue;
- }
- if ((pin->config & AUDIOHD_PIN_CONF_MASK) ==
- AUDIOHD_PIN_NO_CONN)
- continue;
- if ((pin->device != DTYPE_LINEOUT) &&
- (pin->device != DTYPE_SPEAKER) &&
- (pin->device != DTYPE_SPDIF_OUT) &&
- (pin->device != DTYPE_HP_OUT))
- continue;
- if (!pin->finish) {
- ATRACE_32("pin has no output path:", pin->wid);
- }
- }
} /* audiohd_build_output_path */
/*
@@ -3180,18 +3289,21 @@ audiohd_build_output_path(hda_codec_t *codec)
static void
audiohd_build_output_amp(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *w, *widget, *wpin, *wdac;
audiohd_pin_t *pin;
wid_t wid;
int weight;
- int i;
+ int i, j;
uint32_t gain;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == RECORD ||
+ path->codec != codec)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
wpin = codec->widget[wid];
pin = (audiohd_pin_t *)wpin->priv;
weight = wpin->out_weight;
@@ -3262,16 +3374,16 @@ audiohd_build_output_amp(hda_codec_t *codec)
* all output pins of this stream to be used for the
* whole stream
*/
- if (ostream->pin_nums == 1) {
- ostream->mute_wid = pin->mute_wid;
- ostream->mute_dir = pin->mute_dir;
- ostream->gain_wid = pin->gain_wid;
- ostream->gain_dir = pin->gain_dir;
- ostream->gain_bits = pin->gain_bits;
+ if (path->pin_nums == 1) {
+ path->mute_wid = pin->mute_wid;
+ path->mute_dir = pin->mute_dir;
+ path->gain_wid = pin->gain_wid;
+ path->gain_dir = pin->gain_dir;
+ path->gain_bits = pin->gain_bits;
} else {
- wdac = codec->widget[ostream->dac_wid];
+ wdac = codec->widget[path->adda_wid];
weight = wdac->out_weight;
- wid = ostream->pin_wid[0];
+ wid = path->pin_wid[0];
w = codec->widget[wid];
while (w && w->out_weight != weight) {
wid = w->avail_conn[w->selconn];
@@ -3283,15 +3395,15 @@ audiohd_build_output_amp(hda_codec_t *codec)
while (widget) {
if (widget->outamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
- ostream->mute_wid = widget->wid_wid;
- ostream->mute_dir =
+ path->mute_wid = widget->wid_wid;
+ path->mute_dir =
AUDIOHDC_AMP_SET_OUTPUT;
break;
}
if (widget->inamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
- ostream->mute_wid = widget->wid_wid;
- ostream->mute_dir =
+ path->mute_wid = widget->wid_wid;
+ path->mute_dir =
AUDIOHDC_AMP_SET_INPUT;
break;
}
@@ -3308,29 +3420,28 @@ audiohd_build_output_amp(hda_codec_t *codec)
gain = (widget->outamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS);
if (gain && gain > pin->gain_bits) {
- ostream->gain_dir =
+ path->gain_dir =
AUDIOHDC_AMP_SET_OUTPUT;
- ostream->gain_bits = gain;
- ostream->gain_wid = widget->wid_wid;
+ path->gain_bits = gain;
+ path->gain_wid = widget->wid_wid;
}
gain = widget->inamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS;
if (gain && (gain > pin->gain_bits) &&
(widget->type != WTYPE_AUDIO_MIX)) {
- ostream->gain_dir =
+ path->gain_dir =
AUDIOHDC_AMP_SET_INPUT;
- ostream->gain_bits = gain;
- ostream->gain_wid = widget->wid_wid;
+ path->gain_bits = gain;
+ path->gain_wid = widget->wid_wid;
}
if (widget->selconn == AUDIOHD_NULL_CONN)
break;
wid = widget->avail_conn[widget->selconn];
widget = codec->widget[wid];
}
- ostream->gain_bits >>= AUDIOHD_GAIN_OFF;
+ path->gain_bits >>= AUDIOHD_GAIN_OFF;
}
- ostream = ostream->next_stream;
}
} /* audiohd_build_output_amp */
@@ -3345,17 +3456,19 @@ static void
audiohd_finish_output_path(hda_codec_t *codec)
{
audiohd_state_t *statep = codec->soft_statep;
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget;
audiohd_pin_t *pin;
uint_t caddr = codec->index;
wid_t wid;
- int i;
+ int i, j;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (!path || path->path_type != PLAY || path->codec != codec)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
widget = codec->widget[wid];
pin = (audiohd_pin_t *)widget->priv;
{
@@ -3432,7 +3545,6 @@ audiohd_finish_output_path(hda_codec_t *codec)
widget = codec->widget[wid];
}
}
- ostream = ostream->next_stream;
}
} /* audiohd_finish_output_path() */
@@ -3449,7 +3561,7 @@ audiohd_finish_output_path(hda_codec_t *codec)
*/
static int
audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
- int depth, audiohd_istream_t *istream)
+ int depth, audiohd_path_t *path)
{
audiohd_widget_t *widget = codec->widget[wid];
audiohd_pin_t *pin;
@@ -3491,9 +3603,8 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
case DTYPE_AUX:
widget->path_flags |= AUDIOHD_PATH_ADC;
widget->in_weight++;
- istream->pin_wid[istream->pin_nums++] = wid;
- pin->adc_dac_wid = istream->adc_wid;
- ATRACE_32("Pin in:", wid);
+ path->pin_wid[path->pin_nums++] = wid;
+ pin->adc_dac_wid = path->adda_wid;
return (AUDIO_SUCCESS);
}
break;
@@ -3507,7 +3618,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
widget->selconn = 0;
retval = audiohd_find_input_pins(codec,
widget->avail_conn[0],
- allowmixer, depth + 1, istream);
+ allowmixer, depth + 1, path);
if (retval != AUDIO_FAILURE) {
widget->path_flags |= AUDIOHD_PATH_ADC;
widget->in_weight++;
@@ -3524,12 +3635,12 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
for (int i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
widget->avail_conn[i], 0, depth + 1,
- istream);
+ path);
if (retval != AUDIO_FAILURE) {
widget->in_weight++;
- num = istream->pin_nums - 1;
- istream->sum_selconn[num] = i;
- istream->sum_wid = wid;
+ num = path->pin_nums - 1;
+ path->sum_selconn[num] = i;
+ path->sum_wid = wid;
widget->path_flags |=
AUDIOHD_PATH_ADC;
if (widget->selconn ==
@@ -3540,7 +3651,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
}
/* return SUCCESS if we found at least one input path */
- if (istream->pin_nums > 0)
+ if (path->pin_nums > 0)
retval = AUDIO_SUCCESS;
} else {
/*
@@ -3550,7 +3661,7 @@ audiohd_find_input_pins(hda_codec_t *codec, wid_t wid, int allowmixer,
for (i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
widget->avail_conn[i], 0, depth + 1,
- istream);
+ path);
if (retval != AUDIO_FAILURE) {
widget->selconn = i;
widget->path_flags |= AUDIOHD_PATH_ADC;
@@ -3577,11 +3688,12 @@ static void
audiohd_build_input_path(hda_codec_t *codec)
{
audiohd_widget_t *widget;
- audiohd_istream_t *istream = NULL;
+ audiohd_path_t *path = NULL;
wid_t wid;
int i;
int retval;
uint8_t rtag = 0;
+ audiohd_state_t *statep = codec->soft_statep;
for (wid = codec->first_wid; wid <= codec->last_wid; wid++) {
@@ -3591,13 +3703,13 @@ audiohd_build_input_path(hda_codec_t *codec)
if (!widget || widget->type != WTYPE_AUDIO_IN)
continue;
- if (istream == NULL)
- istream = kmem_zalloc(sizeof (audiohd_istream_t),
+ if (path == NULL)
+ path = kmem_zalloc(sizeof (audiohd_path_t),
KM_SLEEP);
else
- bzero(istream, sizeof (audiohd_istream_t));
+ bzero(path, sizeof (audiohd_port_t));
- istream->adc_wid = wid;
+ path->adda_wid = wid;
/*
* Is there any ADC widget which has more than one input ??
@@ -3611,28 +3723,23 @@ audiohd_build_input_path(hda_codec_t *codec)
*/
for (i = 0; i < widget->nconns; i++) {
retval = audiohd_find_input_pins(codec,
- widget->avail_conn[i], 1, 0, istream);
+ widget->avail_conn[i], 1, 0, path);
if (retval == AUDIO_SUCCESS) {
- istream->rtag = ++rtag;
+ path->codec = codec;
+ path->statep = statep;
+ path->path_type = RECORD;
+ path->tag = ++rtag;
codec->nistream++;
- if (codec->istream) {
- audiohd_istream_t *p =
- codec->istream;
- while (p->next_stream)
- p = p->next_stream;
- p->next_stream = istream;
- } else {
- codec->istream = istream;
- }
+ statep->path[statep->pathnum++] = path;
widget->selconn = i;
- widget->priv = istream;
- istream = NULL;
+ widget->priv = path;
+ path = NULL;
break;
}
}
}
- if (istream)
- kmem_free(istream, sizeof (audiohd_istream_t));
+ if (path)
+ kmem_free(path, sizeof (audiohd_path_t));
} /* audiohd_build_input_path */
/*
@@ -3644,18 +3751,22 @@ audiohd_build_input_path(hda_codec_t *codec)
static void
audiohd_build_input_amp(hda_codec_t *codec)
{
- audiohd_istream_t *istream;
+ audiohd_path_t *path;
audiohd_widget_t *wsum, *wadc, *w;
audiohd_pin_t *pin;
uint_t gain;
wid_t wid;
- int i;
+ int i, j;
int weight;
- istream = codec->istream;
- while (istream) {
- wid = istream->adc_wid;
- wadc = codec->widget[wid];
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == PLAY ||
+ path->codec != codec)
+ continue;
+
+ wid = path->adda_wid;
+ wadc = path->codec->widget[wid];
weight = wadc->in_weight;
/*
@@ -3665,21 +3776,21 @@ audiohd_build_input_amp(hda_codec_t *codec)
w = wadc;
while (w) {
if (w->outamp_cap & AUDIOHDC_AMP_CAP_MUTE_CAP) {
- istream->mute_wid = w->wid_wid;
- istream->mute_dir = AUDIOHDC_AMP_SET_OUTPUT;
+ path->mute_wid = w->wid_wid;
+ path->mute_dir = AUDIOHDC_AMP_SET_OUTPUT;
break;
}
if ((w->inamp_cap & AUDIOHDC_AMP_CAP_MUTE_CAP) &&
- (w->wid_wid != istream->sum_wid)) {
- istream->mute_wid = w->wid_wid;
- istream->mute_dir = AUDIOHDC_AMP_SET_INPUT;
+ (w->wid_wid != path->sum_wid)) {
+ path->mute_wid = w->wid_wid;
+ path->mute_dir = AUDIOHDC_AMP_SET_INPUT;
break;
}
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
if (w && w->in_weight != weight)
break;
}
@@ -3692,39 +3803,38 @@ audiohd_build_input_amp(hda_codec_t *codec)
gain = 0;
while (w) {
gain = (w->outamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS);
- if (gain && gain > istream->gain_bits) {
- istream->gain_dir = AUDIOHDC_AMP_SET_OUTPUT;
- istream->gain_bits = gain;
- istream->gain_wid = w->wid_wid;
+ if (gain && gain > path->gain_bits) {
+ path->gain_dir = AUDIOHDC_AMP_SET_OUTPUT;
+ path->gain_bits = gain;
+ path->gain_wid = w->wid_wid;
}
gain = w->inamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS;
- if (gain && (gain > istream->gain_bits) &&
- (w->wid_wid != istream->sum_wid)) {
- istream->gain_dir = AUDIOHDC_AMP_SET_INPUT;
- istream->gain_bits = gain;
- istream->gain_wid = w->wid_wid;
+ if (gain && (gain > path->gain_bits) &&
+ (w->wid_wid != path->sum_wid)) {
+ path->gain_dir = AUDIOHDC_AMP_SET_INPUT;
+ path->gain_bits = gain;
+ path->gain_wid = w->wid_wid;
}
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
- istream->gain_bits >>= AUDIOHD_GAIN_OFF;
+ path->gain_bits >>= AUDIOHD_GAIN_OFF;
/*
* If the input path has one pin only, the mute/amp
* controlling is shared by the whole path and pin
*/
- if (istream->pin_nums == 1) {
- wid = istream->pin_wid[0];
- w = codec->widget[wid];
+ if (path->pin_nums == 1) {
+ wid = path->pin_wid[0];
+ w = path->codec->widget[wid];
pin = (audiohd_pin_t *)w->priv;
- pin->gain_dir = istream->gain_dir;
- pin->gain_bits = istream->gain_bits;
- pin->gain_wid = istream->gain_wid;
- pin->mute_wid = istream->mute_wid;
- pin->mute_dir = istream->mute_dir;
- istream = istream->next_stream;
+ pin->gain_dir = path->gain_dir;
+ pin->gain_bits = path->gain_bits;
+ pin->gain_wid = path->gain_wid;
+ pin->mute_wid = path->mute_wid;
+ pin->mute_dir = path->mute_dir;
continue;
}
@@ -3733,16 +3843,12 @@ audiohd_build_input_amp(hda_codec_t *codec)
* or mixer along the input path, and the sum_wid
* is the widget's node id.
*/
- wid = istream->sum_wid;
- wsum = codec->widget[wid]; /* sum widget */
- if (wsum == NULL) {
- istream = istream->next_stream;
- continue;
- }
+ wid = path->sum_wid;
+ wsum = path->codec->widget[wid]; /* sum widget */
- for (i = 0; i < istream->pin_nums; i++) {
- wid = istream->pin_wid[i];
- w = codec->widget[wid];
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ w = path->codec->widget[wid];
pin = (audiohd_pin_t *)w->priv;
/* find node for mute */
@@ -3750,8 +3856,8 @@ audiohd_build_input_amp(hda_codec_t *codec)
pin->mute_wid = wsum->wid_wid;
pin->mute_dir = AUDIOHDC_AMP_SET_INPUT;
} else {
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[i]];
+ w = path->codec->widget[wid];
while (w) {
if (w->outamp_cap &
AUDIOHDC_AMP_CAP_MUTE_CAP) {
@@ -3771,14 +3877,14 @@ audiohd_build_input_amp(hda_codec_t *codec)
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
}
/* find node for amp controlling */
gain = (wsum->inamp_cap & AUDIOHDC_AMP_CAP_STEP_NUMS);
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[i]];
+ w = path->codec->widget[wid];
while (w) {
gain = (w->outamp_cap &
AUDIOHDC_AMP_CAP_STEP_NUMS);
@@ -3797,11 +3903,10 @@ audiohd_build_input_amp(hda_codec_t *codec)
if (w->selconn == AUDIOHD_NULL_CONN)
break;
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
pin->gain_bits >>= AUDIOHD_GAIN_OFF;
}
- istream = istream->next_stream;
}
} /* audiohd_build_input_amp() */
@@ -3815,17 +3920,20 @@ static void
audiohd_finish_input_path(hda_codec_t *codec)
{
audiohd_state_t *statep = codec->soft_statep;
- audiohd_istream_t *istream;
+ audiohd_path_t *path;
audiohd_widget_t *w, *wsum;
uint_t caddr = codec->index;
wid_t wid;
- int i;
+ int i, j;
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- wid = istream->adc_wid;
- w = codec->widget[wid];
- while (w && (w->wid_wid != istream->sum_wid) &&
+ for (i = 0; i < codec->soft_statep->pathnum; i++) {
+ path = codec->soft_statep->path[i];
+ if (path == NULL || path->path_type == PLAY ||
+ path->codec != codec)
+ continue;
+ wid = path->adda_wid;
+ w = path->codec->widget[wid];
+ while (w && (w->wid_wid != path->sum_wid) &&
(w->type != WTYPE_PIN)) {
if ((w->type == WTYPE_AUDIO_SEL) && (w->nconns > 1))
(void) audioha_codec_verb_get(statep, caddr,
@@ -3851,7 +3959,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
}
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
/*
@@ -3866,8 +3974,8 @@ audiohd_finish_input_path(hda_codec_t *codec)
/*
* deal with multi-pin input devices.
*/
- wid = istream->sum_wid;
- wsum = codec->widget[wid];
+ wid = path->sum_wid;
+ wsum = path->codec->widget[wid];
if (wsum == NULL)
continue;
if (wsum->outamp_cap) {
@@ -3878,25 +3986,25 @@ audiohd_finish_input_path(hda_codec_t *codec)
AUDIOHDC_GAIN_MAX);
}
- for (i = 0; i < istream->pin_nums; i++) {
+ for (j = 0; j < path->pin_nums; j++) {
if (wsum->inamp_cap) {
(void) audioha_codec_4bit_verb_get(statep,
caddr,
wsum->wid_wid, AUDIOHDC_VERB_SET_AMP_MUTE,
AUDIOHDC_AMP_SET_LR_INPUT |
AUDIOHDC_GAIN_MAX |
- (istream->sum_selconn[i] <<
+ (path->sum_selconn[j] <<
AUDIOHDC_AMP_SET_INDEX_OFFSET));
}
if (wsum->type == WTYPE_AUDIO_SEL) {
(void) audioha_codec_verb_get(statep, caddr,
wsum->wid_wid,
AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
+ path->sum_selconn[j]);
}
- wid = wsum->avail_conn[istream->sum_selconn[i]];
- w = codec->widget[wid];
+ wid = wsum->avail_conn[path->sum_selconn[j]];
+ w = path->codec->widget[wid];
while (w && w->type != WTYPE_PIN) {
if ((w->type != WTYPE_AUDIO_MIX) &&
(w->nconns > 1))
@@ -3927,7 +4035,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
AUDIOHDC_AMP_SET_INDEX_OFFSET));
}
wid = w->avail_conn[w->selconn];
- w = codec->widget[wid];
+ w = path->codec->widget[wid];
}
}
} /* end of istream loop */
@@ -3947,7 +4055,7 @@ audiohd_finish_input_path(hda_codec_t *codec)
*/
static int
audiohd_find_inpin_for_monitor(hda_codec_t *codec,
- audiohd_ostream_t *ostream, wid_t id, int mixer)
+ audiohd_path_t *path, wid_t id, int mixer)
{
wid_t wid;
audiohd_widget_t *widget;
@@ -3965,24 +4073,19 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
return (uint32_t)(AUDIO_FAILURE);
switch (pin->device) {
case DTYPE_SPDIF_IN:
- ATRACE("Monitor SPDIF found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_CD:
- ATRACE("Monitor CD found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_LINE_IN:
- ATRACE("Monitor Line in found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_MIC_IN:
- ATRACE("Monitor Mic found!", NULL);
widget->path_flags |= AUDIOHD_PATH_MON;
return (AUDIO_SUCCESS);
case DTYPE_AUX:
widget->path_flags |= AUDIOHD_PATH_MON;
- ATRACE("Monitor AUX found!", NULL);
return (AUDIO_SUCCESS);
default:
return (uint32_t)(AUDIO_FAILURE);
@@ -4006,7 +4109,7 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
AUDIOHD_PATH_DAC)
continue;
if (audiohd_find_inpin_for_monitor(codec,
- ostream,
+ path,
widget->avail_conn[i], mixer) ==
AUDIO_SUCCESS) {
widget->selmon[widget->used++] = i;
@@ -4021,7 +4124,7 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
AUDIOHD_PATH_DAC)
continue;
if (audiohd_find_inpin_for_monitor(codec,
- ostream,
+ path,
widget->avail_conn[i],
mixer) ==
AUDIO_SUCCESS) {
@@ -4055,99 +4158,106 @@ audiohd_find_inpin_for_monitor(hda_codec_t *codec,
static void
audiohd_build_monitor_path(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
- audiohd_widget_t *widget;
- wid_t wid;
- int i, j, k, find;
- int mixernum = 0;
-
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- wid = ostream->pin_wid[i];
- widget = codec->widget[wid];
- k = 0;
-
- while (widget) {
- while (widget && ((widget->type != WTYPE_AUDIO_MIX) ||
- (widget->nconns < 2))) {
- if (widget->selconn == AUDIOHD_NULL_CONN)
- break;
- wid = widget->avail_conn[widget->selconn];
- widget = codec->widget[wid];
- }
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
+ audiohd_state_t *statep = codec->soft_statep;
+ wid_t wid;
+ int i, j, k, l, find;
+ int mixernum = 0;
- /*
- * No mixer in this output path, we cannot build
- * mixer path for this path, skip it, and continue
- * for next output path.
- */
- if (widget == NULL || widget->selconn ==
- AUDIOHD_NULL_CONN) {
- break;
- }
- mixernum++;
- for (j = 0; j < widget->nconns; j++) {
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec ||path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ l = 0;
+ while (widget) {
+ while (widget &&
+ ((widget->type != WTYPE_AUDIO_MIX) ||
+ (widget->nconns < 2))) {
+ if (widget->selconn ==
+ AUDIOHD_NULL_CONN)
+ break;
+ wid =
+ widget->avail_conn[widget->selconn];
+ widget = codec->widget[wid];
+ }
/*
- * this connection must be routined to DAC
- * instead
- * of an input pin widget, we needn't waste
- * time for
- * it
+ * No mixer in this output path, we cannot build
+ * mixer path for this path, skip it,
+ * and continue
+ * for next output path.
*/
- if (widget->selconn == j)
- continue;
- find = 0;
- if (audiohd_find_inpin_for_monitor(codec,
- ostream,
- widget->avail_conn[j], 0) ==
- AUDIO_SUCCESS) {
- ostream->mon_wid[i][k] = wid;
- widget->selmon[widget->used++] = j;
- widget->path_flags |= AUDIOHD_PATH_MON;
- find = 1;
- ATRACE("Exclusive monitor found",
- NULL);
- } else if (
- audiohd_find_inpin_for_monitor(codec,
- ostream,
- widget->avail_conn[j], 1) ==
- AUDIO_SUCCESS) {
- ostream->mon_wid[i][k] = wid;
- widget->selmon[widget->used++] = j;
- widget->path_flags |= AUDIOHD_PATH_MON;
+ if (widget == NULL || widget->selconn ==
+ AUDIOHD_NULL_CONN) {
+ break;
+ }
+ mixernum++;
+ for (k = 0; k < widget->nconns; k++) {
+
+ /*
+ * this connection must be routined
+ * to DAC instead of an input pin
+ * widget, we needn't waste time for
+ * it
+ */
+ if (widget->selconn == k)
+ continue;
+ find = 0;
+ if (audiohd_find_inpin_for_monitor(
+ codec,
+ path,
+ widget->avail_conn[k], 0) ==
+ AUDIO_SUCCESS) {
+ path->mon_wid[j][l] = wid;
+ widget->selmon[widget->used++] =
+ k;
+ widget->path_flags |=
+ AUDIOHD_PATH_MON;
+ find = 1;
+ } else if (
+ audiohd_find_inpin_for_monitor(
+ codec,
+ path,
+ widget->avail_conn[k], 1) ==
+ AUDIO_SUCCESS) {
+ path->mon_wid[j][l] = wid;
+ widget->selmon[widget->used++] =
+ k;
+ widget->path_flags |=
+ AUDIOHD_PATH_MON;
+ find = 1;
- find = 1;
- ATRACE("Share monitor found", NULL);
+ }
}
+ /*
+ * we needn't check widget->selconn here
+ * since this
+ * widget is a selector or mixer, it cannot
+ * be NULL connection.
+ */
+ if (!find) {
+ path->mon_wid[i][l] = 0;
+ widget->path_flags |=
+ AUDIOHD_PATH_NOMON;
+ }
+ wid = widget->avail_conn[widget->selconn];
+ widget = codec->widget[wid];
+ l++;
}
-
- /*
- * we needn't check widget->selconn here since this
- * widget
- * is a selector or mixer, it cannot be NULL connection.
- */
- if (!find) {
- ATRACE_32(
- "No input pin found on this mixer:",
- widget->wid_wid);
- ostream->mon_wid[i][k] = 0;
- widget->path_flags |= AUDIOHD_PATH_NOMON;
- }
- wid = widget->avail_conn[widget->selconn];
- widget = codec->widget[wid];
- k++;
- }
- ostream->maxmixer[i] = k;
+ path->maxmixer[j] = l;
}
- ostream = ostream->next_stream;
}
if (mixernum == 0)
- ATRACE("Monitor unsupported", NULL);
+ statep->monitor_unsupported = B_TRUE;
+ else
+ statep->monitor_unsupported = B_FALSE;
} /* audiohd_build_monitor_path */
/*
@@ -4192,7 +4302,6 @@ audiohd_do_finish_monitor_path(hda_codec_t *codec, audiohd_widget_t *wgt)
(void) audioha_codec_verb_get(statep, caddr,
widget->wid_wid,
AUDIOHDC_VERB_SET_CONN_SEL, widget->selmon[0]);
- ATRACE("Monitor selector exist!", NULL);
}
widget->finish = 1;
if (widget->used == 0)
@@ -4215,16 +4324,19 @@ audiohd_do_finish_monitor_path(hda_codec_t *codec, audiohd_widget_t *wgt)
static void
audiohd_finish_monitor_path(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget;
+ audiohd_state_t *statep = codec->soft_statep;
wid_t wid;
- int i, j;
+ int i, j, k;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- for (j = 0; j < ostream->maxmixer[j]; j++) {
- wid = ostream->mon_wid[i][j];
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec || path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ for (k = 0; k < path->maxmixer[j]; k++) {
+ wid = path->mon_wid[j][k];
if (wid == 0) {
continue;
}
@@ -4232,7 +4344,6 @@ audiohd_finish_monitor_path(hda_codec_t *codec)
audiohd_do_finish_monitor_path(codec, widget);
}
}
- ostream = ostream->next_stream;
}
} /* audiohd_finish_monitor_path */
@@ -4294,20 +4405,23 @@ audiohd_do_build_monitor_amp(hda_codec_t *codec, audiohd_pin_t *pin,
static void
audiohd_build_monitor_amp(hda_codec_t *codec)
{
- audiohd_ostream_t *ostream;
+ audiohd_path_t *path;
audiohd_widget_t *widget, *w;
+ audiohd_state_t *statep = codec->soft_statep;
audiohd_pin_t *pin;
wid_t wid, id;
- int i, j;
+ int i, j, k;
- ostream = codec->ostream;
- while (ostream) {
- for (i = 0; i < ostream->pin_nums; i++) {
- id = ostream->pin_wid[i];
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->codec != codec || path->path_type != PLAY)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ id = path->pin_wid[j];
w = codec->widget[id];
pin = (audiohd_pin_t *)(w->priv);
- for (j = 0; j < ostream->maxmixer[i]; j++) {
- wid = ostream->mon_wid[i][j];
+ for (k = 0; k < path->maxmixer[j]; k++) {
+ wid = path->mon_wid[j][k];
if (!wid)
continue;
widget = codec->widget[wid];
@@ -4315,10 +4429,10 @@ audiohd_build_monitor_amp(hda_codec_t *codec)
widget);
}
}
- ostream = ostream->next_stream;
}
}
+
/*
* audiohd_build_path()
*
@@ -4350,984 +4464,854 @@ audiohd_build_path(audiohd_state_t *statep)
} /* audiohd_build_path */
/*
- * audiohd_init_ports()
- *
- * Description:
- * Since the Solaris framework only supports 5 types of output port,
- * and each type can have only one instance. So we use a global
- * array (g_outport) to hold all output ports, and when the framework
- * has this restriction lifted, we need to reimplement it.
+ * audiohd_allocate_port()
*/
static int
-audiohd_init_ports(audiohd_state_t *statep)
+audiohd_allocate_port(audiohd_state_t *statep)
{
- hda_codec_t *codec;
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
- audiohd_widget_t *widget;
- audiohd_pin_t *pin;
- uint_t inputs, outputs;
- int i;
- uint32_t ctrl;
- uint8_t ctrl8;
+ int i, j;
+ audiohd_port_t *port;
+ int dir;
+ unsigned caps;
+ char *prop;
+ int rc;
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ uint64_t buf_phys_addr;
+ sd_bdle_t *entry;
+ uint16_t gcap;
+ size_t real_size;
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++)
- if (statep->codec[i]) {
- codec = statep->codec[i];
+ adev = statep->adev;
+ dip = statep->hda_dip;
+
+ ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffffffffffffULL, /* addr_hi */
+ 0x00000000ffffffffULL, /* count_max */
+ 128, /* 128-byte alignment as HD spec */
+ 0xfff, /* burstsize */
+ 1, /* minxfer */
+ 0xffffffff, /* maxxfer */
+ 0xffffffff, /* seg */
+ 1, /* sgllen */
+ 1, /* granular */
+ 0 /* flags */
+ };
+
+ gcap = AUDIOHD_REG_GET16(AUDIOHD_REG_GCAP);
+ if ((gcap & AUDIOHDR_GCAP_64OK) == 0)
+ dma_attr.dma_attr_addr_hi = 0xffffffffUL;
+
+ for (i = 0; i < PORT_MAX; i++) {
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ port->started = B_FALSE;
+ port->triggered = B_FALSE;
+ statep->port[i] = port;
+ port->statep = statep;
+ switch (i) {
+ case PORT_ADC:
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = statep->rchan;
+ port->index = 1;
+ port->regoff = AUDIOHD_REG_SD_BASE;
break;
+ case PORT_DAC:
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ port->nchan = statep->pchan;
+ port->index = statep->hda_input_streams + 1;
+ port->regoff = AUDIOHD_REG_SD_BASE +
+ AUDIOHD_REG_SD_LEN *
+ statep->hda_input_streams;
+ break;
+ default:
+ return (DDI_FAILURE);
}
- if (codec == NULL)
- return (DDI_FAILURE);
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, AUDIOHD_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < AUDIOHD_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, AUDIOHD_INTS);
+ port->intrs = AUDIOHD_INTS;
+ } else if (port->intrs > AUDIOHD_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, AUDIOHD_INTS);
+ port->intrs = AUDIOHD_INTS;
+ }
- if (codec->ostream) {
- outputs = 0;
- ostream = codec->ostream;
- while (ostream) {
- ostream->in_use = 1;
- for (i = 0; i < ostream->pin_nums; i++) {
- widget = codec->widget[ostream->pin_wid[i]];
- pin = (audiohd_pin_t *)widget->priv;
- if (pin->device == DTYPE_SPDIF_OUT) {
- ATRACE("SPDIFOUT found!", NULL);
- pin->sada_porttype = AUDIO_SPDIF_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_SPDIF_OUT;
- ctrl = audioha_codec_verb_get(statep,
- codec->index, ostream->dac_wid,
- AUDIOHDC_VERB_GET_SPDIF_CONTROL, 0);
- ctrl |= AUDIOHD_SPDIF_ON;
- ctrl8 = ctrl & AUDIOHD_SPDIF_MASK;
- (void) audioha_codec_verb_get(statep,
- codec->index,
- ostream->dac_wid,
- AUDIOHDC_VERB_SET_SPDIF_LCONTROL,
- ctrl8);
- } else if (pin->device == DTYPE_LINEOUT) {
- pin->sada_porttype = AUDIO_LINE_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_LINE_OUT;
- } else if (pin->device == DTYPE_SPEAKER) {
- pin->sada_porttype = AUDIO_SPEAKER |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_SPEAKER;
-
- } else if (pin->device == DTYPE_HP_OUT) {
- pin->sada_porttype = AUDIO_HEADPHONE |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_HEADPHONE;
- } else {
- pin->sada_porttype = AUDIO_AUX1_OUT |
- AUDIOHD_SADA_OUTPUT;
- outputs |= AUDIO_AUX1_OUT;
- }
- }
- ostream = ostream->next_stream;
+ port->format = AUDIOHD_FMT_PCM;
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = (port->fragfr + AUDIOHD_FRAGFR_ALIGN - 1) & ~
+ (AUDIOHD_FRAGFR_ALIGN - 1);
+ port->samp_size = port->fragfr * port->nchan * 2;
+ port->samp_size = (port->samp_size +
+ AUDIOHD_BDLE_BUF_ALIGN - 1) & ~
+ (AUDIOHD_BDLE_BUF_ALIGN - 1);
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d",
+ rc);
+ goto error_alloc_dma_exit1;
}
- statep->hda_info_defaults.play.port = outputs;
- statep->hda_info_defaults.play.avail_ports = outputs;
- statep->hda_info_defaults.play.mod_ports = outputs;
- statep->hda_out_ports = outputs;
- ostream = codec->ostream;
- while (ostream) {
- if (ostream->in_use == 0)
- break;
- (void) audioha_codec_verb_get(statep, codec->index,
- ostream->dac_wid, AUDIOHDC_VERB_SET_STREAM_CHANN,
- statep->hda_play_stag << AUDIOHD_PLAY_TAG_OFF);
- ostream = ostream->next_stream;
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size *
+ AUDIOHD_BDLE_NUMS,
+ &hda_dev_accattr,
+ DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &real_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ goto error_alloc_dma_exit2;
}
- }
- /*
- * Init input ports. Because solaris supports just one MIC, so we
- * will enable all MICs if applications select MIC as input sources.
- * For others, we do the same.
- */
- inputs = 0;
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- istream->in_use = 1;
- for (i = 0; i < istream->pin_nums; i++) {
- widget = codec->widget[istream->pin_wid[i]];
- pin = (audiohd_pin_t *)widget->priv;
- switch (pin->device) {
- case DTYPE_SPDIF_IN:
- break;
- case DTYPE_MIC_IN:
- inputs |= AUDIO_MICROPHONE;
- pin->sada_porttype = AUDIO_MICROPHONE |
- AUDIOHD_SADA_INPUT;
- if (((pin->config >>
- AUDIOHD_PIN_CONTP_OFF) &
- AUDIOHD_PIN_CONTP_MASK) ==
- AUDIOHD_PIN_CON_FIXED)
- statep->hda_record_stag =
- istream->rtag;
- break;
- case DTYPE_LINE_IN:
- inputs |= AUDIO_LINE_IN;
- pin->sada_porttype = AUDIO_LINE_IN |
- AUDIOHD_SADA_INPUT;
- break;
- case DTYPE_CD:
- inputs |= AUDIO_CD;
- pin->sada_porttype = AUDIO_CD |
- AUDIOHD_SADA_INPUT;
- break;
- case DTYPE_AUX:
- inputs |= AUDIO_AUX1_IN |
- AUDIOHD_SADA_INPUT;
- }
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, real_size, dir,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ goto error_alloc_dma_exit3;
}
- if (inputs & AUDIO_MICROPHONE)
- statep->hda_info_defaults.record.port =
- AUDIO_MICROPHONE;
- else if (inputs & AUDIO_LINE_IN)
- statep->hda_info_defaults.record.port = AUDIO_LINE_IN;
- else if (inputs & AUDIO_CD)
- statep->hda_info_defaults.record.port = AUDIO_CD;
- else if (inputs & AUDIO_AUX1_IN)
- statep->hda_info_defaults.record.port = AUDIO_AUX1_IN;
- else if (inputs & AUDIO_SPDIF_IN)
- statep->hda_info_defaults.record.port = AUDIO_SPDIF_IN;
- else
- statep->hda_info_defaults.record.port = 0;
+ port->samp_paddr = (uint64_t)cookie.dmac_laddress;
- statep->hda_info_defaults.record.avail_ports = inputs;
- statep->hda_info_defaults.record.mod_ports = inputs;
- statep->hda_in_port = 0;
+ /*
+ * now, from here we allocate DMA
+ * memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev,
+ "ddi_dma_alloc_handle(bdlist) failed");
+ goto error_alloc_dma_exit3;
+ }
- (void) audioha_codec_verb_get(statep, codec->index,
- istream->adc_wid, AUDIOHDC_VERB_SET_STREAM_CHANN,
- istream->rtag << AUDIOHD_REC_TAG_OFF);
- }
+ /*
+ * we allocate all buffer descriptors lists in continuous
+ * dma memory.
+ */
+ port->bdl_size = sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &hda_dev_accattr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &real_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev,
+ "ddi_dma_mem_alloc(bdlist) failed");
+ goto error_alloc_dma_exit4;
+ }
- return (DDI_SUCCESS);
-} /* audiohd_init_ports() */
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL,
+ port->bdl_kaddr,
+ real_size, DDI_DMA_WRITE | DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ goto error_alloc_dma_exit5;
+ }
+ port->bdl_paddr = (uint64_t)cookie.dmac_laddress;
-/*
- * audiohd_disable_intr()
- *
- * Description:
- * Disable all possible interrupts.
- */
-static void
-audiohd_disable_intr(audiohd_state_t *statep)
-{
- int i;
- uint32_t base;
+ entry = (sd_bdle_t *)port->bdl_kaddr;
+ buf_phys_addr = port->samp_paddr;
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL, 0);
- base = AUDIOHD_REG_SD_BASE;
- for (i = 0; i < statep->hda_streams_nums; i++) {
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_STS,
- AUDIOHDR_SD_STS_INTRS);
- base += AUDIOHD_REG_SD_LEN;
+ for (j = 0; j < AUDIOHD_BDLE_NUMS; j++) {
+ entry->sbde_addr = buf_phys_addr;
+ entry->sbde_len = port->samp_size;
+ entry->sbde_ioc = 1;
+ buf_phys_addr += port->samp_size;
+ entry++;
+ }
+ (void) ddi_dma_sync(port->bdl_dmah, 0, sizeof (sd_bdle_t) *
+ AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
+ port->curpos = 0;
+
+ port->engine = audio_engine_alloc(&audiohd_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ goto error_alloc_dma_exit5;
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
}
- AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, (uint32_t)(-1));
-} /* audiohd_disable_intr() */
+ return (DDI_SUCCESS);
+error_alloc_dma_exit5:
+ ddi_dma_mem_free(&port->bdl_acch);
+error_alloc_dma_exit4:
+ ddi_dma_free_handle(&port->bdl_dmah);
-/*
- * audiohd_reset_stream()
- *
- * Description:
- * Reset specified stream
- */
-static int
-audiohd_reset_stream(audiohd_state_t *statep, int stream)
-{
- uint32_t base;
- uint8_t bTmp;
- int i;
+error_alloc_dma_exit3:
+ ddi_dma_mem_free(&port->samp_acch);
- base = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * stream;
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
+error_alloc_dma_exit2:
+ ddi_dma_free_handle(&port->samp_dmah);
- /* stop stream */
- bTmp &= ~AUDIOHD_REG_RIRBSIZE;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+error_alloc_dma_exit1:
+ return (AUDIO_FAILURE);
- /* wait 40us for stream to stop as HD spec */
- drv_usecwait(40);
+}
- /* reset stream */
- bTmp |= AUDIOHDR_SD_CTL_SRST;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
+static void
+audiohd_free_port(audiohd_state_t *statep)
+{
+ int i;
+ audiohd_port_t *port;
- for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
- /* Empirical testing time, which works well */
- drv_usecwait(50);
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
- bTmp &= AUDIOHDR_SD_CTL_SRST;
- if (bTmp)
- break;
+ if (statep == NULL) {
+ return;
}
+ for (i = 0; i < PORT_MAX; i++) {
+ port = statep->port[i];
+ if (port == NULL)
+ continue;
+ if (port->engine) {
+ audio_dev_remove_engine(statep->adev,
+ port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->samp_dmah) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ if (port->bdl_dmah) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
- if (!bTmp) {
- audio_sup_log(NULL, CE_WARN, "!Failed to reset stream %d",
- stream);
- return (AUDIO_FAILURE);
+ kmem_free(port, sizeof (audiohd_port_t));
}
+}
- /* Empirical testing time, which works well */
- drv_usecwait(300);
-
- /* exit reset stream */
- bTmp &= ~AUDIOHDR_SD_CTL_SRST;
- AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_CTL, bTmp);
-
- for (i = 0; i < AUDIOHD_RETRY_TIMES; i++) {
- /* Empircal testing time */
- drv_usecwait(50);
- bTmp = AUDIOHD_REG_GET8(base + AUDIOHD_SDREG_OFFSET_CTL);
- bTmp &= AUDIOHDR_SD_CTL_SRST;
- if (!bTmp)
- break;
- }
+/*
+ * audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+ * Description:
+ * This routine is used to change the widget power betwen D0 and D2.
+ * D0 is fully on; D2 allows the lowest possible power consuming state
+ * from which it can return to the fully on state: D0.
+ */
+static void
+audiohd_change_widget_power_state(audiohd_state_t *statep, int off)
+{
+ int i;
+ wid_t wid;
+ hda_codec_t *codec;
+ audiohd_widget_t *widget;
- if (bTmp) {
- audio_sup_log(NULL, CE_WARN,
- "!Failed to exit reset state for"
- " stream %d, bTmp=0x%02x", stream, bTmp);
- return (AUDIO_FAILURE);
+ /* Change power to D2 */
+ if (off) {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ for (wid = codec->first_wid; wid <= codec->last_wid;
+ wid++) {
+ widget = codec->widget[wid];
+ if (widget->widget_cap &
+ AUDIOHD_WIDCAP_PWRCTRL) {
+ (void) audioha_codec_verb_get(statep,
+ codec->index, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE,
+ AUDIOHD_PW_D2);
+ }
+ }
+ }
+ /* Change power to D0 */
+ } else {
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ for (wid = codec->first_wid; wid <= codec->last_wid;
+ wid++) {
+ widget = codec->widget[wid];
+ if (widget->widget_cap &
+ AUDIOHD_WIDCAP_PWRCTRL) {
+ (void) audioha_codec_verb_get(statep,
+ codec->index, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE,
+ AUDIOHD_PW_D0);
+ }
+ }
+ }
}
-
- return (AUDIO_SUCCESS);
-
-} /* audiohd_reset_stream() */
-
+}
/*
- * audiohd_preset_rbuf()
- *
+ * audiohd_restore_path()
* Description:
- * Fill out entries of stream descriptor list for
- * recording.
+ * This routine is used to restore the path on the codec.
*/
static void
-audiohd_preset_rbuf(audiohd_state_t *statep)
+audiohd_restore_path(audiohd_state_t *statep)
{
- sd_bdle_t *entry;
- uint64_t buf_phys_addr;
- int i;
-
- entry = (sd_bdle_t *)(statep->hda_dma_record_bd.ad_vaddr);
- buf_phys_addr = statep->hda_dma_record_buf.ad_paddr;
+ int i;
+ hda_codec_t *codec;
- for (i = 0; i < AUDIOHD_BDLE_NUMS; i++) {
- entry->sbde_addr = buf_phys_addr;
- entry->sbde_len = statep->hda_rbuf_size;
- entry->sbde_ioc = 1;
- buf_phys_addr += statep->hda_rbuf_size;
- entry++;
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ audiohd_finish_output_path(statep->codec[i]);
+ audiohd_finish_input_path(statep->codec[i]);
+ audiohd_finish_monitor_path(statep->codec[i]);
}
-
- (void) ddi_dma_sync(statep->hda_dma_record_bd.ad_dmahdl, 0,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
-
-} /* audiohd_preset_rbuf() */
+}
/*
- * audiohd_fill_pbuf()
- *
- * Description:
- * Get pending audio data, and fill out entries of stream descriptor
- * list for playback. This routine returns AUDIO_FAILURE if it doesn't
- * fill any audio samples to DMA buffers. This can happen:
- * 1) when mixer cannot provide any samples;
- * 2) playback has been stopped during fetching samples;
+ * restore_play_and_record()
*/
-static int
-audiohd_fill_pbuf(audiohd_state_t *statep)
+static void
+audiohd_restore_play_and_record(audiohd_state_t *statep)
{
- uint64_t buf_phys_addr;
- sd_bdle_t *entry;
- char *buf;
- int samples;
- int rs;
int i;
+ audiohd_port_t *port;
- entry = (sd_bdle_t *)(statep->hda_dma_play_bd.ad_vaddr);
- buf = (char *)(statep->hda_dma_play_buf.ad_vaddr);
- buf_phys_addr = statep->hda_dma_play_buf.ad_paddr;
-
- /* assume that 2-channel, 16-bit */
- samples = statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS / 2;
-
- mutex_exit(&statep->hda_mutex);
- rs = am_get_audio(statep->hda_ahandle, buf,
- AUDIO_NO_CHANNEL, samples);
mutex_enter(&statep->hda_mutex);
+ for (i = 0; i < PORT_MAX; i++) {
+ port = statep->port[i];
+ if (port == NULL)
+ continue;
+ if (port != NULL)
+ audio_engine_reset(port->engine);
+ if (port->triggered) {
+ (void) audiohd_reset_port(port);
+ audiohd_start_port(port);
+ } else {
+ audiohd_stop_port(port);
- if (rs == 0) {
- /*
- * If system is busy so that no sample is available, an
- * AUDIO_PLAY_EMPTY flag is set. And we will try to get
- * sample to refill play buffer when we receive an interrupt.
- * Only if we still cannot get sample then, we could stop
- * the playback engine.
- */
- statep->hda_flags |= AUDIOHD_PLAY_EMPTY;
-
- } else if (rs < 0) {
- /*
- * Unknown error occurs, we have to stop playback.
- */
- audio_sup_log(statep->hda_ahandle, CE_WARN,
- "!fill_pbuf() failed to get play sample");
- statep->hda_flags &= ~AUDIOHD_PLAY_STARTED;
- return (AUDIO_FAILURE);
- } else {
-
- (void) ddi_dma_sync(statep->hda_dma_play_buf.ad_dmahdl,
- 0, rs << 2, DDI_DMA_SYNC_FORDEV);
- }
-
- /*
- * Because users can quickly start and stop audio streams, it
- * is possible that playback already stopped before we re-grab
- * mutex. In this case, we dispose fetched samples, and return
- * AUDIO_FAILURE as we didn't get samples.
- */
- if ((statep->hda_flags & AUDIOHD_PLAY_STARTED) == 0) {
- return (AUDIO_FAILURE);
- }
-
- for (i = 0; i < AUDIOHD_BDLE_NUMS; i++) {
- entry->sbde_addr = buf_phys_addr;
- entry->sbde_len = statep->hda_pbuf_size;
- entry->sbde_ioc = 1;
- buf_phys_addr += statep->hda_pbuf_size;
- entry++;
+ }
}
-
- (void) ddi_dma_sync(statep->hda_dma_play_bd.ad_dmahdl, 0,
- sizeof (sd_bdle_t) * AUDIOHD_BDLE_NUMS, DDI_DMA_SYNC_FORDEV);
-
- if (rs == samples)
- statep->hda_pbuf_pos = 0;
- else
- statep->hda_pbuf_pos = (rs << 1);
-
- return (AUDIO_SUCCESS);
-
-} /* audiohd_fill_pbuf() */
-
+ mutex_exit(&statep->hda_mutex);
+}
/*
- * audiohd_refill_pbuf()
- *
+ * audiohd_reset_pins_ur_cap()
* Description:
- * Called by interrupt handler.
+ * Enable the unsolicited response of the pins which have the unsolicited
+ * response capability
*/
static void
-audiohd_refill_pbuf(audiohd_state_t *statep)
+audiohd_reset_pins_ur_cap(audiohd_state_t *statep)
{
- int rs;
- int pos;
- char *buf;
- uint32_t len;
- uint32_t regbase = statep->hda_play_regbase;
-
- buf = (char *)(statep->hda_dma_play_buf.ad_vaddr);
- buf += statep->hda_pbuf_pos;
- pos = AUDIOHD_REG_GET32(regbase + AUDIOHD_SDREG_OFFSET_LPIB);
- pos &= AUDIOHD_POS_MASK;
+ hda_codec_t *codec;
+ audiohd_pin_t *pin;
+ audiohd_widget_t *widget;
+ uint32_t urctrl;
+ int i;
- if (pos > statep->hda_pbuf_pos) {
- len = (pos - statep->hda_pbuf_pos) & AUDIOHD_POS_MASK;
- } else {
- len = statep->hda_pbuf_size * AUDIOHD_BDLE_NUMS -
- statep->hda_pbuf_pos;
- len &= AUDIOHD_POS_MASK;
+ for (i = 0; i <= AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (!codec)
+ continue;
+ pin = codec->first_pin;
+ while (pin) {
+ /* enable the unsolicited response of the pin */
+ widget = codec->widget[pin->wid];
+ if ((widget->widget_cap &
+ (AUDIOHD_URCAP_MASK) &&
+ (pin->cap & AUDIOHD_DTCCAP_MASK)) &&
+ ((pin->device == DTYPE_LINEOUT) ||
+ (pin->device == DTYPE_SPDIF_OUT) ||
+ (pin->device == DTYPE_HP_OUT) ||
+ (pin->device == DTYPE_MIC_IN))) {
+ urctrl = (uint8_t)(1 <<
+ (AUDIOHD_UR_ENABLE_OFF - 1));
+ urctrl |= (pin->wid & AUDIOHD_UR_TAG_MASK);
+ (void) audioha_codec_verb_get(statep,
+ codec->index,
+ pin->wid,
+ AUDIOHDC_VERB_SET_URCTRL, urctrl);
+ }
+ pin = pin->next;
+ }
}
- mutex_exit(&statep->hda_mutex);
- rs = am_get_audio(statep->hda_ahandle, buf,
- AUDIO_NO_CHANNEL, len / 2);
- mutex_enter(&statep->hda_mutex);
+}
+static void
+audiohd_restore_codec_gpio(audiohd_state_t *statep)
+{
+ int i;
+ wid_t wid;
+ hda_codec_t *codec;
+
+ for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
+ codec = statep->codec[i];
+ if (codec == NULL)
+ continue;
+ wid = codec->wid_afg;
- (void) ddi_dma_sync(statep->hda_dma_play_buf.ad_dmahdl,
- statep->hda_pbuf_pos, rs << 2, DDI_DMA_SYNC_FORDEV);
+ /* power-up audio function group */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_POWER_STATE, 0);
- if (rs > 0) {
- statep->hda_flags &= ~AUDIOHD_PLAY_EMPTY;
- statep->hda_pbuf_pos += (rs << 1);
- if (statep->hda_pbuf_pos >= statep->hda_pbuf_size *
- AUDIOHD_BDLE_NUMS)
- statep->hda_pbuf_pos = 0;
- return;
+ /* work around for Sony VAIO laptop with specific codec */
+ if ((codec->vid == AUDIOHD_CODECID_SONY1) ||
+ (codec->vid == AUDIOHD_CODECID_SONY2))
+ continue;
+ /*
+ * GPIO controls which are laptop specific workarounds and
+ * might be changed. Some laptops use GPIO, so we need to
+ * enable and set the GPIO correctly.
+ */
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_MASK, AUDIOHDC_GPIO_ENABLE);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DIREC, statep->gpio_direct);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_STCK, AUDIOHDC_GPIO_DATA_CTRL);
+ (void) audioha_codec_verb_get(statep, i, wid,
+ AUDIOHDC_VERB_SET_GPIO_DATA, AUDIOHDC_GPIO_STCK_CTRL);
}
+}
+/*
+ * audiohd_resume()
+ */
+static int
+audiohd_resume(audiohd_state_t *statep)
+{
+ uint8_t rirbsts;
- /* We didn't get any sample */
- if ((statep->hda_flags & AUDIOHD_PLAY_EMPTY) == 0)
- statep->hda_flags |= AUDIOHD_PLAY_EMPTY;
- else {
- /* once again, we don't get samples, stop it */
- AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_CTL, 0);
- statep->hda_flags &= ~(AUDIOHD_PLAY_EMPTY |
- AUDIOHD_PLAY_STARTED);
-
- /* shutdown the mixer */
+ mutex_enter(&statep->hda_mutex);
+ statep->suspended = B_FALSE;
+ /* Restore the hda state */
+ if (audiohd_reinit_hda(statep) == AUDIO_FAILURE) {
+ audio_dev_warn(statep->adev,
+ "hda reinit failed");
mutex_exit(&statep->hda_mutex);
- am_play_shutdown(statep->hda_ahandle, NULL);
- mutex_enter(&statep->hda_mutex);
+ return (DDI_SUCCESS);
}
+ /* reset to enable the capability of unsolicited response for pin */
+ audiohd_reset_pins_ur_cap(statep);
+ /* Enable interrupt */
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL,
+ AUDIOHD_INTCTL_BIT_GIE |
+ AUDIOHD_INTCTL_BIT_SIE);
+ /* clear the unsolicited response interrupt */
+ rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
+ AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
+ mutex_exit(&statep->hda_mutex);
-} /* audiohd_refill_pbuf() */
+ audiohd_restore_play_and_record(statep);
+ audiohd_configure_output(statep);
+ audiohd_restore_volume(statep);
+ audiohd_configure_input(statep);
+ /* set widget power to D0 */
+ audiohd_change_widget_power_state(statep, AUDIOHD_PW_ON);
+
+ return (DDI_SUCCESS);
+} /* audiohd_resume */
/*
- * audiohd_get_rbuf()
- *
- * Description:
- * Called by interrupt handler.
+ * audiohd_suspend()
*/
-static void
-audiohd_get_rbuf(audiohd_state_t *statep)
+static int
+audiohd_suspend(audiohd_state_t *statep)
{
- uint32_t regbase;
- uint32_t len;
- char *buf;
- int pos;
+ mutex_enter(&statep->hda_mutex);
+ statep->suspended = B_TRUE;
- regbase = statep->hda_record_regbase;
- pos = AUDIOHD_REG_GET32(regbase + AUDIOHD_SDREG_OFFSET_LPIB);
- pos &= AUDIOHD_POS_MASK;
- buf = (char *)statep->hda_dma_record_buf.ad_vaddr;
- buf += statep->hda_rbuf_pos;
+ /* set widget power to D2 */
+ audiohd_change_widget_power_state(statep, AUDIOHD_PW_OFF);
+ /* Disable h/w */
+ audiohd_disable_intr(statep);
+ audiohd_stop_dma(statep);
+ mutex_exit(&statep->hda_mutex);
- if (pos > statep->hda_rbuf_pos) {
- len = (pos - statep->hda_rbuf_pos) & AUDIOHD_POS_MASK;
- mutex_exit(&statep->hda_mutex);
- am_send_audio(statep->hda_ahandle, buf, AUDIO_NO_CHANNEL,
- len / 2);
- mutex_enter(&statep->hda_mutex);
- statep->hda_rbuf_pos += len;
- if (statep->hda_rbuf_pos >= statep->hda_rbuf_size *
- AUDIOHD_BDLE_NUMS)
- statep->hda_rbuf_pos = 0;
- } else {
- len = statep->hda_rbuf_size * AUDIOHD_BDLE_NUMS -
- statep->hda_rbuf_pos;
- mutex_exit(&statep->hda_mutex);
- am_send_audio(statep->hda_ahandle, buf, AUDIO_NO_CHANNEL,
- len / 2);
- mutex_enter(&statep->hda_mutex);
- statep->hda_rbuf_pos = 0;
- }
+ return (DDI_SUCCESS);
+} /* audiohd_suspend */
-} /* audiohd_get_rbuf() */
+/*
+ * audiohd_disable_pin()
+ */
+static int
+audiohd_disable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
+{
+ AUDIOHD_DISABLE_PIN_OUT(statep, caddr, wid);
+ return (AUDIO_SUCCESS);
+}
/*
- * auidohd_set_gain()
- *
- * Description:
- * Set gain value for the path
+ * audiohd_enable_pin()
*/
static int
-audiohd_set_gain(audiohd_state_t *statep, int dir, int gain, int channel)
+audiohd_enable_pin(audiohd_state_t *statep, int caddr, wid_t wid)
{
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
+ AUDIOHD_ENABLE_PIN_OUT(statep, caddr, wid);
+ return (AUDIO_SUCCESS);
+}
+/*
+ * audiohd_change_speaker_state()
+ */
+static void
+audiohd_change_speaker_state(audiohd_state_t *statep, int on)
+{
+ audiohd_path_t *path;
+ audiohd_widget_t *widget;
audiohd_pin_t *pin;
- hda_codec_t *codec;
- uint_t tmp;
- uint_t caddr;
- uint_t val;
- int i;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i]) {
- codec = statep->codec[i];
- break;
- }
- }
- if (codec == NULL)
- return (DDI_FAILURE);
-
- caddr = codec->index;
- if (dir == AUDIO_PLAY) {
- if (channel == 0) { /* left channel */
- val = AUDIOHDC_AMP_SET_LEFT;
- statep->hda_play_lgain = gain;
- } else { /* right channel */
- val = AUDIOHDC_AMP_SET_RIGHT;
- statep->hda_play_rgain = gain;
- }
-
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- if (ostream->in_use == 0)
- break;
-
- if (ostream->gain_wid) {
- tmp = gain * ostream->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | ostream->gain_dir | tmp);
- continue;
- }
- /* We have to set each pin one by one */
- for (i = 0; i < ostream->pin_nums; i++) {
- audiohd_widget_t *w;
- wid_t wid;
+ int i, j;
+ wid_t wid;
- wid = ostream->pin_wid[i];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- if (pin->gain_wid) {
- tmp = gain * pin->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(
- statep, caddr,
- pin->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | pin->gain_dir | tmp);
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != PLAY)
+ continue;
+ if (on) {
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPEAKER) {
+ (void) audiohd_enable_pin(
+ statep,
+ path->codec->index,
+ pin->wid);
}
-
}
- }
- return (DDI_SUCCESS);
- }
-
- if (dir != AUDIO_RECORD)
- return (DDI_FAILURE);
- for (istream = codec->istream; istream;
- istream = istream->next_stream) {
- if (istream->in_use == 0)
- break;
- if (istream->gain_wid) {
- tmp = gain * istream->gain_bits / AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(statep, caddr,
- istream->gain_wid, AUDIOHDC_VERB_SET_AMP_MUTE,
- val | istream->gain_dir | tmp);
} else {
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((statep->hda_in_port |
- AUDIOHD_SADA_OUTPUT) ==
- pin->sada_porttype) {
- tmp = gain * pin->gain_bits /
- AUDIO_MAX_GAIN;
- (void) audioha_codec_4bit_verb_get(
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = path->codec->widget[wid];
+ pin = (audiohd_pin_t *)widget->priv;
+ if (pin->device == DTYPE_SPEAKER) {
+ (void) audiohd_disable_pin(
statep,
- caddr,
- pin->gain_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- val | pin->gain_dir | tmp);
+ path->codec->index,
+ pin->wid);
}
}
}
}
-
- return (DDI_SUCCESS);
-
-} /* audiohd_set_gain() */
-
+}
/*
- * audiohd_set_port()
+ * audiohd_select_mic()
*
* Description:
- *
+ * This function is used for the recording path which has a selector
+ * as the sumwidget. We select the external MIC if it is plugged into the
+ * MIC jack, otherwise the internal integrated MIC is selected.
*/
-static int
-audiohd_set_port(audiohd_state_t *statep, int dir, int port)
+static void
+audiohd_select_mic(audiohd_state_t *statep, uint8_t index,
+uint8_t id, int select)
{
- int i;
- uint_t tmp_port = 0;
- wid_t pin_wid = 0;
- int caddr;
- audiohd_istream_t *istream;
- audiohd_widget_t *w;
- audiohd_pin_t *pin;
hda_codec_t *codec;
+ audiohd_path_t *path;
+ audiohd_widget_t *widget, *sumwgt;
+ audiohd_pin_t *pin;
+ int i, j;
+ wid_t wid;
- codec = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- if (statep->codec[i])
- codec = statep->codec[i];
- }
+ codec = statep->codec[index];
if (codec == NULL)
- return (DDI_FAILURE);
-
- caddr = codec->index;
- if (dir == AUDIO_PLAY) {
- for (i = 0; i < AUDIOHD_PIN_NUMS-1; i++) {
- if (port & g_outport[i]) {
- tmp_port |= g_outport[i];
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT |
- g_outport[i]) ==
- pin->sada_porttype)
- AUDIOHD_ENABLE_PIN_OUT(statep,
- caddr,
- pin->wid);
- pin = pin->next;
- }
- } else if (statep->hda_out_ports & g_outport[i]) {
- tmp_port &= ~(g_outport[i]);
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT |
- g_outport[i]) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_OUT(statep,
- caddr,
- pin->wid);
- pin = pin->next;
+ return;
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (path->codec != codec || path->path_type != RECORD)
+ continue;
+ sumwgt = codec->widget[path->sum_wid];
+ if (path && sumwgt &&
+ (sumwgt->type == WTYPE_AUDIO_SEL)) {
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ if (widget == NULL)
+ return;
+ pin = (audiohd_pin_t *)widget->priv;
+ if (select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ (void) audioha_codec_verb_get(
+ statep,
+ index,
+ path->sum_wid,
+ AUDIOHDC_VERB_SET_CONN_SEL,
+ path->sum_selconn[j]);
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ } else if (!select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ (void) audioha_codec_verb_get(
+ statep,
+ index,
+ path->sum_wid,
+ AUDIOHDC_VERB_SET_CONN_SEL,
+ path->sum_selconn[j]);
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
}
}
+ if (path == NULL)
+ break;
+ sumwgt = codec->widget[path->sum_wid];
}
- if (port & AUDIO_SPDIF_OUT) {
- tmp_port |= AUDIO_SPDIF_OUT;
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT | AUDIO_SPDIF_OUT) ==
- pin->sada_porttype)
- AUDIOHD_ENABLE_PIN_OUT(statep, caddr,
- pin->wid);
- pin = pin->next;
- }
-
- } else if (statep->hda_out_ports & AUDIO_SPDIF_OUT) {
- tmp_port &= ~(AUDIO_SPDIF_OUT);
- pin = codec->first_pin;
- while (pin) {
- if ((AUDIOHD_SADA_OUTPUT | AUDIO_SPDIF_OUT) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_OUT(statep, caddr,
- pin->wid);
- pin = pin->next;
- }
- }
- statep->hda_out_ports = tmp_port;
- return (DDI_SUCCESS);
- }
-
- if (dir != AUDIO_RECORD) {
- return (DDI_FAILURE);
- }
-
- /* now, we handle recording */
- switch (port) {
- case AUDIO_NONE:
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((statep->hda_in_port | AUDIOHD_SADA_INPUT) ==
- pin->sada_porttype)
- AUDIOHD_DISABLE_PIN_IN(statep, caddr, pin->wid);
- }
- tmp_port = 0;
- pin_wid = 0;
- break;
- case AUDIO_MICROPHONE:
- case AUDIO_LINE_IN:
- case AUDIO_CD:
- case AUDIO_AUX1_IN:
- for (pin = codec->first_pin; pin; pin = pin->next) {
- if ((port | AUDIOHD_SADA_INPUT) == pin->sada_porttype) {
- AUDIOHD_ENABLE_PIN_IN(statep, caddr, pin->wid);
- pin_wid = pin->wid;
- } else if ((statep->hda_in_port | AUDIOHD_SADA_INPUT) ==
- pin->sada_porttype) {
- AUDIOHD_DISABLE_PIN_IN(statep, caddr, pin->wid);
- }
- }
- tmp_port = port;
- break;
- default:
- break;
}
- statep->hda_in_port = tmp_port;
-
- /*
- * During path searching, we allow one real selector/mixer
- * in the input path. So, if there is a multi-input selector
- * we must set the right input connection for the selector.
- */
- if (pin_wid == 0)
- return (DDI_SUCCESS);
- w = codec->widget[pin_wid];
- pin = (audiohd_pin_t *)w->priv;
-
- /* find ADC widget */
- w = codec->widget[pin->adc_dac_wid];
-
- istream = (audiohd_istream_t *)w->priv;
-
/*
- * If there is a real selector in this input stream,
- * we select the right one input for the selector.
+ * If the input istream > 1, we should set the record stream tag
+ * respectively. All the input streams sharing one tag may make the
+ * record sound distorted.
*/
- if (istream->sum_wid) {
- w = codec->widget[istream->sum_wid];
- if (w->type == WTYPE_AUDIO_SEL) {
- for (i = 0; i < istream->pin_nums; i++)
- if (istream->pin_wid[i] == pin_wid)
- break;
- if (i > istream->pin_nums) {
- cmn_err(CE_WARN, "bug in istream-pin");
- } else {
- (void) audioha_codec_verb_get(
- statep, codec->index,
- istream->sum_wid,
- AUDIOHDC_VERB_SET_CONN_SEL,
- istream->sum_selconn[i]);
+ if (codec->nistream > 1) {
+ for (i = 0; i < statep->pathnum; i++) {
+ path = statep->path[i];
+ if (!path || path->path_type != RECORD)
+ continue;
+ for (j = 0; j < path->pin_nums; j++) {
+ wid = path->pin_wid[j];
+ widget = codec->widget[wid];
+ if (widget == NULL)
+ return;
+ pin = (audiohd_pin_t *)widget->priv;
+ if (select &&
+ pin->device == DTYPE_MIC_IN &&
+ pin->wid == id &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_JACK)) {
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ } else if (!select &&
+ pin->device == DTYPE_MIC_IN &&
+ (((pin->config >>
+ AUDIOHD_PIN_CONTP_OFF) &
+ AUDIOHD_PIN_CONTP_MASK) ==
+ AUDIOHD_PIN_CON_FIXED)) {
+ statep->port[PORT_ADC]->index =
+ path->tag;
+ return;
+ }
}
}
}
-
- return (DDI_SUCCESS);
-
-} /* audiohd_set_port() */
-
+}
/*
- * audiohd_do_mute_outputs()
+ * audiohd_pin_sense()
*
- * Description:
- * Mute the output path.
+ * Description
+ *
+ * When the earphone is plugged into the jack associtated with the pin
+ * complex, we disable the built in speaker. When the earphone is plugged
+ * out of the jack, we enable the built in speaker.
*/
static void
-audiohd_do_mute_outputs(audiohd_state_t *statep,
- audiohd_ostream_t *ostream, hda_codec_t *codec,
- boolean_t mute)
+audiohd_pin_sense(audiohd_state_t *statep, uint32_t resp, uint32_t respex)
{
- audiohd_widget_t *w;
+ uint8_t index;
+ uint8_t id;
+ uint32_t rs;
+ audiohd_widget_t *widget;
audiohd_pin_t *pin;
- wid_t wid;
- int lgain, rgain;
- int j;
- uint_t lg, rg;
- uint16_t caddr = codec->index;
-
- if (mute == 0) {
- if (ostream->mute_wid) {
- if (ostream->mute_wid ==
- ostream->gain_wid) {
- lgain = statep->hda_play_lgain *
- ostream->gain_bits /
- AUDIO_MAX_GAIN;
- rgain = statep->hda_play_rgain *
- ostream->gain_bits /
- AUDIO_MAX_GAIN;
- } else {
- lgain = AUDIOHDC_GAIN_MAX;
- rgain = AUDIOHDC_GAIN_MAX;
- }
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_LEFT |
- lgain);
- (void) audioha_codec_4bit_verb_get(statep,
- caddr,
- ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_RIGHT |
- rgain);
- } else {
- for (j = 0; j < ostream->pin_nums;
- j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- lg = statep->hda_play_lgain;
- rg = statep->hda_play_rgain;
- pin = (audiohd_pin_t *)w->priv;
- if (pin->mute_wid ==
- pin->gain_wid) {
- lgain =
- lg *
- pin->gain_bits /
- AUDIO_MAX_GAIN;
- rgain =
- rg *
- pin->gain_bits /
- AUDIO_MAX_GAIN;
- } else {
- lgain =
- AUDIOHDC_GAIN_MAX;
- rgain =
- AUDIOHDC_GAIN_MAX;
- }
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_LEFT |
- lgain);
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_RIGHT |
- rgain);
- }
+ hda_codec_t *codec;
+
+ index = respex & AUDIOHD_RIRB_CODEC_MASK;
+ id = resp >> (AUDIOHD_RIRB_WID_OFF - 1);
+
+ codec = statep->codec[index];
+ if (codec == NULL)
+ return;
+ widget = codec->widget[id];
+ if (widget == NULL)
+ return;
+
+ rs = audioha_codec_verb_get(statep, index, id,
+ AUDIOHDC_VERB_GET_PIN_SENSE, 0);
+ if (rs >> (AUDIOHD_PIN_PRES_OFF - 1) & 1) {
+ /* A MIC is plugged in, we select the MIC as input */
+ if ((widget->type == WTYPE_PIN) &&
+ (pin = (audiohd_pin_t *)widget->priv) &&
+ (pin->device == DTYPE_MIC_IN)) {
+ audiohd_select_mic(statep, index, id, 1);
+ return;
}
+ /* output pin is plugged */
+ audiohd_change_speaker_state(statep, AUDIOHD_SP_OFF);
} else {
- if (ostream->mute_wid) {
- (void) audioha_codec_4bit_verb_get(statep,
- caddr, ostream->mute_wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- ostream->mute_dir |
- AUDIOHDC_AMP_SET_LNR |
- AUDIOHDC_AMP_SET_MUTE);
- } else {
- for (j = 0; j < ostream->pin_nums;
- j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->wid,
- AUDIOHDC_VERB_SET_AMP_MUTE,
- pin->mute_dir |
- AUDIOHDC_AMP_SET_LNR |
- AUDIOHDC_AMP_SET_MUTE);
- }
+ /*
+ * A MIC is unplugged, we select the built in MIC
+ * as input.
+ */
+ if ((widget->type == WTYPE_PIN) &&
+ (pin = (audiohd_pin_t *)widget->priv) &&
+ (pin->device == DTYPE_MIC_IN)) {
+ audiohd_select_mic(statep, index, id, 0);
+ return;
}
+ /* output pin is unplugged */
+ audiohd_change_speaker_state(statep, AUDIOHD_SP_ON);
}
-} /* audiohd_do_mute_outputs() */
+}
/*
- * audiohd_mute_outputs()
+ * audiohd_intr()
*
- * Description:
- * Mute all the output streams
+ * Description
+ *
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
*/
-static void
-audiohd_mute_outputs(audiohd_state_t *statep, boolean_t mute)
+static uint_t
+audiohd_intr(caddr_t arg)
{
- audiohd_ostream_t *ostream;
- hda_codec_t *codec;
- int i;
+ audiohd_state_t *statep = (audiohd_state_t *)arg;
+ uint32_t status;
+ uint32_t regbase;
+ uint32_t resp, respex;
+ uint8_t sdstatus, rirbsts;
+ int i, ret;
+ audio_engine_t *do_adc = NULL;
+ audio_engine_t *do_dac = NULL;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- audiohd_do_mute_outputs(statep, ostream, codec, mute);
- }
- }
-} /* audiohd_mute_outputs() */
+ mutex_enter(&statep->hda_mutex);
+ if (statep->suspended) {
+ mutex_exit(&statep->hda_mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
-/*
- * audiohd_set_pin_monitor_gain()
- *
- * Description:
- * Set the gain value for the monitor path.
- */
-static void
-audiohd_set_pin_monitor_gain(hda_codec_t *codec, audiohd_state_t *statep,
- uint_t caddr, audiohd_pin_t *pin, int gain)
-{
- int i, k;
- uint_t tmp;
- audiohd_widget_t *widget;
+ status = AUDIOHD_REG_GET32(AUDIOHD_REG_INTSTS);
+ if (status == 0) {
+ mutex_exit(&statep->hda_mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, status);
- for (k = 0; k < pin->num; k++) {
- tmp = gain * pin->mg_gain[k]/
- AUDIO_MAX_GAIN;
- widget = codec->widget[pin->mg_wid[k]];
- if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_OUTPUT) {
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mg_wid[k],
- AUDIOHDC_VERB_SET_AMP_MUTE,
- AUDIOHDC_AMP_SET_RIGHT|
- AUDIOHDC_AMP_SET_LEFT|
- pin->mg_dir[k] | tmp);
- } else if (pin->mg_dir[k] == AUDIOHDC_AMP_SET_INPUT) {
- for (i = 0; i < widget->used; i++) {
- (void) audioha_codec_4bit_verb_get(
- statep,
- caddr,
- pin->mg_wid[k],
- AUDIOHDC_VERB_SET_AMP_MUTE,
- AUDIOHDC_AMP_SET_RIGHT|
- AUDIOHDC_AMP_SET_LEFT|
- widget->selmon[i]<<
- AUDIOHDC_AMP_SET_INDEX_OFFSET |
- pin->mg_dir[k] | tmp);
+ /*
+ * unsolicited response from pins, maybe something plugged in or out
+ * of the jack.
+ */
+ if (status & AUDIOHD_CIS_MASK) {
+ /* clear the unsolicited response interrupt */
+ rirbsts = AUDIOHD_REG_GET8(AUDIOHD_REG_RIRBSTS);
+ AUDIOHD_REG_SET8(AUDIOHD_REG_RIRBSTS, rirbsts);
+ /*
+ * We have to wait and try several times to make sure the
+ * unsolicited response is generated by our pins.
+ * we need to make it work for audiohd spec 0.9, which is
+ * just a draft version and requires more time to wait.
+ */
+ for (i = 0; i < AUDIOHD_TEST_TIMES; i++) {
+ ret = audiohd_response_from_codec(statep, &resp,
+ &respex);
+ if ((ret == AUDIO_SUCCESS) &&
+ (respex & AUDIOHD_RIRB_UR_MASK)) {
+ /*
+ * A pin may generate more than one ur rirb,
+ * we only need handle one of them, and clear
+ * the other ones
+ */
+ statep->hda_rirb_rp =
+ AUDIOHD_REG_GET16(AUDIOHD_REG_RIRBWP) &
+ AUDIOHD_RIRB_WPMASK;
+ break;
}
}
+ if ((ret == AUDIO_SUCCESS) &&
+ (respex & AUDIOHD_RIRB_UR_MASK)) {
+ audiohd_pin_sense(statep, resp, respex);
+ }
+ }
+
+ /* stream intr */
+ for (i = 0; i < statep->hda_streams_nums; i++) {
+ if ((status & (1<<i)) == 0)
+ continue;
+
+ regbase = AUDIOHD_REG_SD_BASE + AUDIOHD_REG_SD_LEN * i;
+ sdstatus = AUDIOHD_REG_GET8(regbase + AUDIOHD_SDREG_OFFSET_STS);
+
+ /* clear intrs */
+ AUDIOHD_REG_SET8(regbase + AUDIOHD_SDREG_OFFSET_STS, sdstatus);
+ if (i < statep->hda_input_streams)
+ do_adc = statep->port[PORT_ADC]->engine;
+ else
+ do_dac = statep->port[PORT_DAC]->engine;
+ }
+
+ /* update the kernel interrupt statistics */
+ if (statep->hda_ksp) {
+ ((kstat_intr_t *)
+ (statep->hda_ksp->ks_data))->intrs[KSTAT_INTR_HARD]++;
}
-} /* audiohd_set_pin_monitor_gain() */
+
+ mutex_exit(&statep->hda_mutex);
+
+ if (do_adc)
+ audio_engine_produce(do_adc);
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ return (DDI_INTR_CLAIMED);
+} /* audiohd_intr() */
+
/*
- * audiohd_set_monitor_gain()
+ * audiohd_disable_intr()
*
* Description:
- * Set the gain value for the monitor widget control
+ * Disable all possible interrupts.
*/
-static int
-audiohd_set_monitor_gain(audiohd_state_t *statep, int gain)
+static void
+audiohd_disable_intr(audiohd_state_t *statep)
{
- int ret;
- int i, j;
- audiohd_ostream_t *ostream;
- audiohd_pin_t *pin;
- hda_codec_t *codec;
- audiohd_widget_t *w;
- uint_t caddr;
- wid_t wid;
-
- ASSERT(statep);
-
- if (gain > AUDIO_MAX_GAIN)
- gain = AUDIO_MAX_GAIN;
- else if (gain < AUDIO_MIN_GAIN)
- gain = AUDIO_MIN_GAIN;
+ int i;
+ uint32_t base;
- /*
- * Allow to set monitor gain even if no input is selected
- */
- statep->hda_monitor_gain = gain;
- for (i = 0; i < AUDIOHD_CODEC_MAX; i++) {
- codec = statep->codec[i];
- if (codec == NULL)
- continue;
- caddr = codec->index;
- for (ostream = codec->ostream; ostream;
- ostream = ostream->next_stream) {
- for (j = 0; j < ostream->pin_nums; j++) {
- wid = ostream->pin_wid[j];
- w = codec->widget[wid];
- pin = (audiohd_pin_t *)w->priv;
- audiohd_set_pin_monitor_gain(codec, statep,
- caddr, pin, gain);
- }
- }
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTCTL, 0);
+ base = AUDIOHD_REG_SD_BASE;
+ for (i = 0; i < statep->hda_streams_nums; i++) {
+ AUDIOHD_REG_SET8(base + AUDIOHD_SDREG_OFFSET_STS,
+ AUDIOHDR_SD_STS_INTRS);
+ base += AUDIOHD_REG_SD_LEN;
}
+ AUDIOHD_REG_SET32(AUDIOHD_REG_INTSTS, (uint32_t)(-1));
+} /* audiohd_disable_intr() */
- ret = AUDIO_SUCCESS;
- return (ret);
-
-} /* audiohd_set_monitor_gain() */
/*
* audiohd_12bit_verb_to_codec()
@@ -5484,9 +5468,9 @@ audioha_codec_verb_get(void *arg, uint8_t caddr, uint8_t wid,
return (resp);
}
- audio_sup_log(NULL, CE_WARN, "!%s: verb_get() timeout when get "
+ audio_dev_warn(statep->adev, "timeout when get "
" response from codec: wid=%d, verb=0x%04x, param=0x%04x",
- audiohd_name, wid, verb, param);
+ wid, verb, param);
return ((uint32_t)(-1));
@@ -5524,76 +5508,10 @@ audioha_codec_4bit_verb_get(void *arg, uint8_t caddr, uint8_t wid,
return (resp);
}
- audio_sup_log(NULL, CE_WARN, "!%s: 4bit_verb_get() timeout when get "
+ audio_dev_warn(statep->adev, "timeout when get "
" response from codec: wid=%d, verb=0x%04x, param=0x%04x",
- audiohd_name, wid, verb, param);
+ wid, verb, param);
return ((uint32_t)(-1));
} /* audioha_codec_4bit_verb_get() */
-
-/*
- * audiohd_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended. It will also block any routine
- * while a suspend is going on.
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audiohd_state_t *statep The device's state structure
- * Returns:
- * void
- */
-static void
-audiohd_set_busy(audiohd_state_t *statep)
-{
- ASSERT(!mutex_owned(&statep->hda_mutex));
-
- mutex_enter(&statep->hda_mutex);
- /* block if we are suspended */
- while (statep->suspended)
- cv_wait(&statep->hda_cv, &statep->hda_mutex);
- /*
- * OK, we aren't suspended, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(statep->hda_busy_cnt >= 0);
- statep->hda_busy_cnt++;
-
- mutex_exit(&statep->hda_mutex);
-} /* audiohd_set_busy() */
-
-/*
- * audiohd_set_idle()
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * Arguments:
- * audiohd_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiohd_set_idle(audiohd_state_t *statep)
-{
- ASSERT(!mutex_owned(&statep->hda_mutex));
-
- mutex_enter(&statep->hda_mutex);
-
- ASSERT(!statep->suspended);
-
- /* decrement the busy count */
- ASSERT(statep->hda_busy_cnt > 0);
- statep->hda_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (statep->hda_busy_cnt == 0)
- cv_broadcast(&statep->hda_cv);
-
- mutex_exit(&statep->hda_mutex);
-} /* audiohd_set_idle() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf
index 105a8bb513..3b66afc3af 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiohd/audiohd.conf
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.conf
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
#
# Configuration file for the audiohd audio driver.
#
@@ -30,12 +29,6 @@
# may change at any time.
#
-# Uncomment cdrom to enable the audiohd driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
-
-#
# play-interrupts sets the number of interrupts per second when playing.
# This affects the resolution of various things, such as sample counts.
# record-interrupts does the same for record interrupts.
@@ -52,10 +45,3 @@
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audiohd driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/common/sys/audio/impl/audiohd_impl.h b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h
index d05663c0a4..3e12767149 100644
--- a/usr/src/uts/common/sys/audio/impl/audiohd_impl.h
+++ b/usr/src/uts/common/io/audio/drv/audiohd/audiohd.h
@@ -19,25 +19,12 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_AUDIOHD_IMPL_H_
#define _SYS_AUDIOHD_IMPL_H_
-
-#include <sys/types.h>
-#include <sys/thread.h>
-#include <sys/synch.h>
-#include <sys/kstat.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/audiohd.h>
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -49,7 +36,24 @@ extern "C" {
#define AUDIOHD_VID_ATI 0x1002
#define AUDIOHD_VID_NVIDIA 0x10de
+/*
+ * specific codec id used by specific vendors
+ */
+#define AUDIOHD_CODECID_HP 0x111d7608
+#define AUDIOHD_CODECID_SONY1 0x10ec0260
+#define AUDIOHD_CODECID_SONY2 0x10ec0262
+
+#define AUDIO_SUCCESS (0)
+#define AUDIO_FAILURE (-1)
+
+#define AUDIOHD_INTS 50
+#define AUDIOHD_MAX_INTS 1500
+#define AUDIOHD_MIN_INTS 32
+#define AUDIOHD_DEV_CONFIG "onboard1"
+#define AUDIOHD_DEV_VERSION "a"
+
+#define AUDIOHD_FMT_PCM 0x001
/*
* Only for Intel hardware:
* PCI Express traffic class select register in PCI configure space
@@ -90,6 +94,7 @@ extern "C" {
#define AUDIOHD_SP_ON 1
#define AUDIOHD_SP_OFF 0
+#define AUDIOHD_PORT_MAX 15
#define AUDIOHD_CODEC_MAX 16
#define AUDIOHD_MEMIO_LEN 0x4000
@@ -140,6 +145,9 @@ extern "C" {
#define AUDIOHD_PIN_VREF_L4 0x02
#define AUDIOHD_PIN_VREF_OFF 8
#define AUDIOHD_PIN_VREF_MASK 0xff
+#define AUDIOHD_PIN_CLR_MASK 0xf
+#define AUDIOHD_PIN_CLR_OFF 12
+
#define AUDIOHD_VERB_ADDR_OFF 28
#define AUDIOHD_VERB_NID_OFF 20
@@ -163,20 +171,13 @@ extern "C" {
#define AUDIOHD_CODEC_NUM_MASK 0x000000ff
#define AUDIOHD_CODEC_TYPE_MASK 0x000000ff
+#define AUDIOHD_FRAGFR_ALIGN 16
#define AUDIOHD_BDLE_BUF_ALIGN 128
#define AUDIOHD_CMDIO_ENT_MASK 0x00ff /* 256 entries for CORB/RIRB */
#define AUDIOHD_CDBIO_CORB_LEN 1024 /* 256 entries for CORB, 1024B */
#define AUDIOHD_CDBIO_RIRB_LEN 2048 /* 256 entries for RIRB, 2048B */
#define AUDIOHD_BDLE_NUMS 4 /* 4 entires for record/play BD list */
-#define AUDIOHD_MOD_NAME "HD Audio Driver"
-#define AUDIOHD_IDNUM 0x6176
-#define AUDIOHD_NAME "SUNW,audiohd"
-#define AUDIOHD_MINPACKET (0)
-#define AUDIOHD_MAXPACKET (1024)
-#define AUDIOHD_HIWATER (64*1024)
-#define AUDIOHD_LOWATER (32*1024)
-
#define AUDIOHD_PORT_UNMUTE (0xffffffff)
/*
@@ -354,8 +355,8 @@ extern "C" {
#define AUDIOHDC_VERB_SET_EAPD 0x70c
#define AUDIOHDC_VERB_GET_DEFAULT_CONF 0xf1c
-#define AUDIOHDC_VERB_GET_SPDIF_CONTROL 0xf0d
-#define AUDIOHDC_VERB_SET_SPDIF_LCONTROL 0x70d
+#define AUDIOHDC_VERB_GET_SPDIF_CTL 0xf0d
+#define AUDIOHDC_VERB_SET_SPDIF_LCL 0x70d
#define AUDIOHDC_VERB_SET_URCTRL 0x708
#define AUDIOHDC_VERB_GET_PIN_SENSE 0xf09
@@ -524,22 +525,38 @@ enum audiohda_device_type {
DTYPE_OTHER = 0x0f,
};
+enum audiohd_pin_color {
+ AUDIOHD_PIN_UNKNOWN = 0,
+ AUDIOHD_PIN_BLACK,
+ AUDIOHD_PIN_GREY,
+ AUDIOHD_PIN_BLUE,
+ AUDIOHD_PIN_GREEN,
+ AUDIOHD_PIN_RED,
+ AUDIOHD_PIN_ORANGE,
+ AUDIOHD_PIN_YELLOW,
+ AUDIOHD_PIN_PURPLE,
+ AUDIOHD_PIN_PINK,
+ AUDIOHD_PIN_WHITE = 0xe,
+ AUDIOHD_PIN_OTHER = 0xf,
+};
+
+#define CTRL_NUM 15
+
/* values for audiohd_widget.path_flags */
#define AUDIOHD_PATH_DAC (1 << 0)
#define AUDIOHD_PATH_ADC (1 << 1)
#define AUDIOHD_PATH_MON (1 << 2)
#define AUDIOHD_PATH_NOMON (1 << 3)
-
-typedef struct audiohd_ostream audiohd_ostream_t;
-typedef struct audiohd_istream audiohd_istream_t;
+typedef struct audiohd_path audiohd_path_t;
typedef struct audiohd_widget audiohd_widget_t;
-typedef struct audiohd_mixer audiohd_mixer_t;
typedef struct audiohd_state audiohd_state_t;
typedef struct audiohd_pin audiohd_pin_t;
typedef struct hda_codec hda_codec_t;
typedef uint32_t wid_t; /* id of widget */
typedef struct audiohd_entry_prop audiohd_entry_prop_t;
+typedef enum audiohda_device_type audiohda_device_type_t;
+typedef enum audiohd_pin_color audiohd_pin_color_t;
#define AUDIOHD_MAX_WIDGET 128
#define AUDIOHD_MAX_CONN 16
@@ -603,74 +620,84 @@ struct audiohd_widget {
#define AUDIOHD_MAX_MIXER 5
#define AUDIOHD_MAX_PIN 4
-struct audiohd_ostream {
- wid_t dac_wid; /* wid of DAC widget */
- wid_t pin_wid[AUDIOHD_MAX_PINS];
- int pin_nums;
- /*
- * the mixer wid in each ostream path.
- * this is used to build the monitor path
- */
- int mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
- /*
- * The max num of mixer widget on the path of the pin
- */
- int maxmixer[AUDIOHD_MAX_PINS];
- int inuse;
- wid_t mute_wid; /* node used to mute this pin */
- int mute_dir; /* 1: input, 2: output */
- wid_t gain_wid; /* node for gain control */
- int gain_dir; /* _OUTPUT/_INPUT */
- uint32_t gain_bits;
- uint32_t pin_outputs;
- audiohd_ostream_t *next_stream;
- /*
- * this is used to mark the ostream which is now
- * used by sada.
- */
- boolean_t in_use;
-};
+#define PORT_DAC 0
+#define PORT_ADC 1
+#define PORT_MAX 2
+typedef enum {
+ PLAY = 0,
+ RECORD = 1,
+} path_type_t;
-struct audiohd_istream {
- wid_t adc_wid;
+struct audiohd_path {
+ wid_t adda_wid;
- /*
- * wid of sum, which can be a selector or mixer. And all pin
- * widgets whose wid is in pin_wid[] array can route to this
- * sum widget. If there is no such sum, sum_wid is 0, in this
- * case, pin_nums must be 1, that means, this stream has only
- * one pin widget input. But we should remember that sum_wid
- * can be non-zero when pin_nums is 1.
- */
- wid_t sum_wid;
+ wid_t pin_wid[AUDIOHD_MAX_PINS];
+ int sum_selconn[AUDIOHD_MAX_PINS];
+ int mon_wid[AUDIOHD_MAX_PIN][AUDIOHD_MAX_MIXER];
+ int pin_nums;
+ int maxmixer[AUDIOHD_MAX_PINS];
- /*
- * the index of sum widget inputs which can go through the
- * path and arrive input pin widget.
- */
- int sum_selconn[AUDIOHD_MAX_PINS];
+ path_type_t path_type;
- wid_t pin_wid[AUDIOHD_MAX_PINS];
- int pin_nums;
+ wid_t mute_wid;
+ int mute_dir;
+ wid_t gain_wid;
+ int gain_dir;
+ uint32_t gain_bits;
- wid_t mute_wid; /* node used to mute this pin */
- int mute_dir; /* 1: input, 2: output */
- wid_t gain_wid; /* node for gain control */
- int gain_dir; /* _OUTPUT/_INPUT */
- uint32_t gain_bits;
+ uint32_t pin_outputs;
+ uint8_t tag;
- audiohd_istream_t *next_stream;
+ hda_codec_t *codec;
- /*
- * this is used to mark the istream which is now
- * used by sada.
- */
+ wid_t sum_wid;
- boolean_t in_use;
- uint8_t rtag;
+ audiohd_state_t *statep;
};
+typedef struct audiohd_port
+{
+ uint8_t nchan;
+ int index;
+ uint16_t regoff;
+ boolean_t started;
+ boolean_t triggered;
+
+ unsigned fragfr;
+ unsigned nframes;
+ uint64_t count;
+ int curpos;
+ int len;
+ int intrs;
+
+ uint_t format;
+ unsigned sync_dir;
+
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint64_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint64_t bdl_paddr;
+
+ audio_engine_t *engine;
+ audiohd_state_t *statep;
+}audiohd_port_t;
+
+typedef struct audiohd_ctrl
+{
+ audiohd_state_t *statep;
+ audio_ctrl_t *ctrl;
+ uint32_t num;
+ uint64_t val;
+} audiohd_ctrl_t;
+
struct audiohd_pin {
audiohd_pin_t *next;
wid_t wid;
@@ -682,7 +709,6 @@ struct audiohd_pin {
uint8_t vrefvalue; /* value of VRef */
- enum audiohda_device_type device;
uint32_t cap;
uint32_t config;
uint32_t ctrl;
@@ -690,6 +716,8 @@ struct audiohd_pin {
uint32_t seq;
wid_t adc_dac_wid; /* AD/DA wid which can route to this pin */
int no_phys_conn;
+ enum audiohda_device_type device;
+
/*
* mg_dir, mg_gain, mg_wid are used to store the monitor gain control
* widget wid.
@@ -700,20 +728,15 @@ struct audiohd_pin {
int num;
int finish;
- /* this is used for SADA driver only. we should remove it later */
-#define AUDIOHD_SADA_OUTPUT 0x8000
-#define AUDIOHD_SADA_INPUT 0x4000
-#define AUDIOHD_SADA_PORTMASK 0x00ff
- uint_t sada_porttype;
};
typedef struct {
ddi_dma_handle_t ad_dmahdl;
ddi_acc_handle_t ad_acchdl;
- caddr_t ad_vaddr; /* virtual addr */
- uint64_t ad_paddr; /* physical addr */
- size_t ad_req_sz; /* required size of memory */
- size_t ad_real_sz; /* real size of memory */
+ caddr_t ad_vaddr; /* virtual addr */
+ uint64_t ad_paddr; /* physical addr */
+ size_t ad_req_sz; /* required size of memory */
+ size_t ad_real_sz; /* real size of memory */
} audiohd_dma_t;
struct hda_codec {
@@ -735,70 +758,52 @@ struct hda_codec {
/* use wid as index to the array of widget pointers */
audiohd_widget_t *widget[AUDIOHD_MAX_WIDGET];
- audiohd_ostream_t *ostream;
- audiohd_istream_t *istream;
+
+
+ audiohd_port_t *port[AUDIOHD_PORT_MAX];
+ uint8_t portnum;
audiohd_pin_t *first_pin;
};
+#define AUDIOHD_MAX_ASSOC 15
struct audiohd_state {
- audiohdl_t hda_ahandle;
dev_info_t *hda_dip;
kstat_t *hda_ksp;
kmutex_t hda_mutex;
uint32_t hda_flags;
- caddr_t hda_reg_base;
- ddi_acc_handle_t hda_pci_handle;
- ddi_acc_handle_t hda_reg_handle;
- ddi_iblock_cookie_t hda_intr_cookie;
+ caddr_t hda_reg_base;
+ ddi_acc_handle_t hda_pci_handle;
+ ddi_acc_handle_t hda_reg_handle;
+ ddi_iblock_cookie_t hda_intr_cookie;
audiohd_dma_t hda_dma_corb;
audiohd_dma_t hda_dma_rirb;
- audiohd_dma_t hda_dma_play_bd;
- audiohd_dma_t hda_dma_play_buf;
- audiohd_dma_t hda_dma_record_bd;
- audiohd_dma_t hda_dma_record_buf;
- int hda_input_streams; /* # of input stream */
- int hda_output_streams; /* # of output stream */
- int hda_streams_nums; /* # of stream */
- int hda_pbuf_pos; /* play buffer position */
- int hda_rbuf_pos; /* record buffer position */
+
uint8_t hda_rirb_rp; /* read pointer for rirb */
uint16_t hda_codec_mask;
- am_ad_info_t hda_ad_info;
- audio_info_t hda_info_defaults;
- audio_device_t hda_dev_info;
-
- int hda_csamples;
- int hda_psamples;
- int hda_psample_rate;
- int hda_pchannels;
- int hda_pprecision;
- int hda_csample_rate;
- int hda_cchannels;
- int hda_cprecision;
+
+ audio_dev_t *adev;
+
+
int hda_pint_freq; /* play intr frequence */
int hda_rint_freq; /* record intr frequence */
- int hda_pbuf_size; /* play buffer size */
- int hda_rbuf_size; /* record buffer size */
- boolean_t hda_outputs_muted;
+ int hda_input_streams; /* # of input stream */
+ int hda_output_streams; /* # of output stream */
+ int hda_streams_nums; /* # of stream */
+
+ uint_t hda_play_regbase;
+ uint_t hda_record_regbase;
+
+ uint8_t gpio_direct;
- uint_t hda_monitor_gain;
uint_t hda_play_stag; /* tag of playback stream */
uint_t hda_record_stag; /* tag of record stream */
- uint_t hda_play_regbase; /* regbase for play stream */
- uint_t hda_record_regbase; /* regbase for record stream */
uint_t hda_play_lgain; /* left gain for playback */
uint_t hda_play_rgain; /* right gain for playback */
- uint_t hda_record_lgain; /* left gain for recording */
- uint_t hda_record_rgain; /* right gain for recording */
- uint_t hda_play_format;
- uint_t hda_record_format;
- uint_t hda_out_ports; /* active outputs */
- uint_t hda_in_port; /* active inputs */
/*
* Now, for the time being, we add some fields
@@ -809,8 +814,27 @@ struct audiohd_state {
* Suspend/Resume used fields
*/
boolean_t suspended;
- int hda_busy_cnt;
- kcondvar_t hda_cv;
+ boolean_t monitor_unsupported;
+
+ audiohd_path_t *path[AUDIOHD_PORT_MAX];
+ uint8_t pathnum;
+ audiohd_port_t *port[PORT_MAX];
+ uint8_t pchan;
+ uint8_t rchan;
+
+ uint64_t inmask;
+
+ uint_t hda_out_ports;
+ uint_t in_port;
+
+ /*
+ * Controls
+ */
+ audiohd_ctrl_t *controls[CTRL_NUM];
+
+ /* for multichannel */
+ uint8_t chann[AUDIOHD_MAX_ASSOC];
+ uint8_t assoc;
};
diff --git a/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c
new file mode 100644
index 0000000000..9c8b5e8e05
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.c
@@ -0,0 +1,1675 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * audioixp Audio Driver
+ *
+ * This driver supports audio hardware integrated in ATI IXP400 chipset.
+ *
+ * The IXP400 audio core is an AC'97 controller, which has independent
+ * channels for PCM in, PCM out. The AC'97 controller is a PCI bus master
+ * with scatter/gather support. Each channel has a DMA engine. Currently,
+ * we use only the PCM in and PCM out channels. Each DMA engine uses one
+ * buffer descriptor list. Each entry contains a pointer to a data buffer,
+ * status, length of the buffer being pointed to and the pointer to the next
+ * entry. Length of the buffer is in number of bytes. Interrupt will be
+ * triggered each time a entry is processed by hardware.
+ *
+ * System power management is not yet supported by the driver.
+ *
+ * NOTE:
+ * This driver depends on the misc/ac97 and drv/audio modules being
+ * loaded first.
+ */
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audioixp.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audioixp_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audioixp_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audioixp_quiesce(dev_info_t *);
+static int audioixp_resume(dev_info_t *);
+static int audioixp_suspend(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audioixp_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audioixp_close(void *);
+static int audioixp_start(void *);
+static void audioixp_stop(void *);
+static int audioixp_format(void *);
+static int audioixp_channels(void *);
+static int audioixp_rate(void *);
+static uint64_t audioixp_count(void *);
+static void audioixp_sync(void *, unsigned);
+static size_t audioixp_qlen(void *);
+
+static audio_engine_ops_t audioixp_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audioixp_open,
+ audioixp_close,
+ audioixp_start,
+ audioixp_stop,
+ audioixp_count,
+ audioixp_format,
+ audioixp_channels,
+ audioixp_rate,
+ audioixp_sync,
+ audioixp_qlen
+};
+
+
+/*
+ * interrupt handler
+ */
+static uint_t audioixp_intr(caddr_t);
+
+/*
+ * Local Routine Prototypes
+ */
+static int audioixp_attach(dev_info_t *);
+static int audioixp_detach(dev_info_t *);
+static int audioixp_alloc_port(audioixp_state_t *, int);
+static void audioixp_start_port(audioixp_port_t *);
+static void audioixp_stop_port(audioixp_port_t *);
+static void audioixp_reset_port(audioixp_port_t *);
+static void audioixp_update_port(audioixp_port_t *);
+
+static int audioixp_codec_sync(audioixp_state_t *);
+static void audioixp_wr97(void *, uint8_t, uint16_t);
+static uint16_t audioixp_rd97(void *, uint8_t);
+static int audioixp_reset_ac97(audioixp_state_t *);
+static int audioixp_map_regs(audioixp_state_t *);
+static void audioixp_unmap_regs(audioixp_state_t *);
+static int audioixp_chip_init(audioixp_state_t *);
+static void audioixp_destroy(audioixp_state_t *);
+
+/*
+ * Global variables, but used only by this file.
+ */
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audioixp_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audioixp_ddi_attach, /* devo_attach */
+ audioixp_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audioixp_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audioixp_modldrv = {
+ &mod_driverops, /* drv_modops */
+ IXP_MOD_NAME, /* drv_linkinfo */
+ &audioixp_dev_ops, /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audioixp_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audioixp_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+/*
+ * device access attributes for register mapping
+ */
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * DMA attributes of buffer descriptor list
+ */
+static ddi_dma_attr_t bdlist_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0000ffff, /* count_max */
+ 8, /* align, BDL must be aligned on a 8-byte boundary */
+ 0x3c, /* burstsize */
+ 8, /* minxfer, set to the size of a BDlist entry */
+ 0x0000ffff, /* maxxfer */
+ 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
+ 1, /* sgllen, there's no scatter-gather list */
+ 8, /* granular, set to the value of minxfer */
+ 0 /* flags, use virtual address */
+};
+
+/*
+ * DMA attributes of buffers to be used to receive/send audio data
+ */
+static ddi_dma_attr_t sample_buf_dma_attr = {
+ DMA_ATTR_V0,
+ 0, /* addr_lo */
+ 0xffffffff, /* addr_hi */
+ 0x0001fffe, /* count_max */
+ 4, /* align, data buffer is aligned on a 2-byte boundary */
+ 0x3c, /* burstsize */
+ 4, /* minxfer, set to the size of a sample data */
+ 0x0001ffff, /* maxxfer */
+ 0x0001ffff, /* seg */
+ 1, /* sgllen, no scatter-gather */
+ 4, /* granular, set to the value of minxfer */
+ 0, /* flags, use virtual address */
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audioixp_dev_ops, IXP_NAME);
+
+ if ((error = mod_install(&audioixp_modlinkage)) != 0) {
+ audio_fini_ops(&audioixp_dev_ops);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audioixp_modlinkage)) != 0) {
+ return (error);
+ }
+
+ audio_fini_ops(&audioixp_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns information about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audioixp_modlinkage, modinfop));
+}
+
+
+/* ******************* Driver Entry Points ********************************* */
+
+/*
+ * audioixp_ddi_attach()
+ *
+ * Description:
+ * Attach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audioixp_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audioixp_attach(dip));
+
+ /*
+ * now, no suspend/resume supported. we'll do it in the future.
+ */
+ case DDI_RESUME:
+ return (audioixp_resume(dip));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audioixp_ddi_detach()
+ *
+ * Description:
+ * Detach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audioixp_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audioixp_detach(dip));
+
+ /*
+ * now, no suspend/resume supported. we'll do it in the future.
+ */
+ case DDI_SUSPEND:
+ return (audioixp_suspend(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static void
+audioixp_stop_dma(audioixp_state_t *statep)
+{
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+}
+
+static void
+audioixp_disable_intr(audioixp_state_t *statep)
+{
+ PUT32(IXP_AUDIO_INT, GET32(IXP_AUDIO_INT));
+ PUT32(IXP_AUDIO_INT_EN, 0);
+}
+
+/*
+ * quiesce(9E) entry point.
+ *
+ * This function is called when the system is single-threaded at high
+ * PIL with preemption disabled. Therefore, this function must not be blocked.
+ *
+ * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
+ * DDI_FAILURE indicates an error condition and should almost never happen.
+ */
+static int
+audioixp_quiesce(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ /* disable HW interrupt */
+ audioixp_disable_intr(statep);
+
+ /* stop DMA engines */
+ audioixp_stop_dma(statep);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audioixp_suspend(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+ ASSERT(statep != NULL);
+
+ ac97_suspend(statep->ac97);
+ mutex_enter(&statep->inst_lock);
+
+ statep->suspended = B_TRUE;
+
+ audioixp_disable_intr(statep);
+ audioixp_stop_dma(statep);
+
+ mutex_exit(&statep->inst_lock);
+ return (DDI_SUCCESS);
+}
+
+static void
+audioixp_resume_port(audioixp_port_t *port)
+{
+ if (port != NULL) {
+ if (port->engine != NULL) {
+ audio_engine_reset(port->engine);
+ }
+ }
+ audioixp_reset_port(port);
+ if (port->started) {
+ audioixp_start_port(port);
+ } else {
+ audioixp_stop_port(port);
+ }
+}
+
+static int
+audioixp_resume(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+ audio_dev_t *adev;
+ audioixp_port_t *rec_port, *play_port;
+
+ statep = ddi_get_driver_private(dip);
+ adev = statep->adev;
+ ASSERT(statep != NULL);
+
+ if (audioixp_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "DDI_RESUME failed to init chip");
+ return (DDI_SUCCESS);
+ }
+
+ ac97_resume(statep->ac97);
+ mutex_enter(&statep->inst_lock);
+ statep->suspended = B_FALSE;
+
+ rec_port = statep->rec_port;
+ play_port = statep->play_port;
+
+ audioixp_resume_port(rec_port);
+ audioixp_resume_port(play_port);
+
+ mutex_exit(&statep->inst_lock);
+ return (DDI_SUCCESS);
+}
+/*
+ * audioixp_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * There's a hardware pointer which indicate memory location where
+ * the hardware is processing. We check this pointer to decide whether
+ * to handle the buffer and how many buffers should be handled.
+ * Refer to ATI IXP400/450 Register Reference Manual, page 193,194.
+ *
+ * Arguments:
+ * caddr_t arg Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audioixp_intr(caddr_t arg)
+{
+ audioixp_state_t *statep;
+ uint32_t sr;
+ int claimed = DDI_INTR_UNCLAIMED;
+
+ statep = (void *)arg;
+ mutex_enter(&statep->inst_lock);
+
+ sr = GET32(IXP_AUDIO_INT);
+
+ /* PCM in interrupt */
+ if (sr & IXP_AUDIO_INT_IN_DMA) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA);
+ }
+
+ /* PCM out interrupt */
+ if (sr & IXP_AUDIO_INT_OUT_DMA) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA);
+ }
+
+ /* system is too busy to process the input stream, ignore it */
+ if (sr & IXP_AUDIO_INT_IN_DMA_OVERFLOW) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA_OVERFLOW);
+ }
+
+ /* System is too busy, ignore it */
+ if (sr & IXP_AUDIO_INT_OUT_DMA_UNDERFLOW) {
+ claimed = DDI_INTR_CLAIMED;
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA_UNDERFLOW);
+ }
+
+ /* update the kernel interrupt statistics */
+ if ((claimed == DDI_INTR_CLAIMED) && statep->ksp) {
+ IXP_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&statep->inst_lock);
+
+ if (sr & IXP_AUDIO_INT_IN_DMA) {
+ audio_engine_produce(statep->rec_port->engine);
+ }
+ if (sr & IXP_AUDIO_INT_OUT_DMA) {
+ audio_engine_consume(statep->play_port->engine);
+ }
+
+ return (claimed);
+}
+
+/*
+ * audioixp_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audioixp_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audioixp_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(flag));
+
+ port->started = B_FALSE;
+ port->count = 0;
+ port->offset = 0;
+ *fragfrp = port->fragfr;
+ *nfragsp = IXP_BD_NUMS;
+ *bufp = port->samp_kaddr;
+
+ mutex_enter(&port->statep->inst_lock);
+ audioixp_reset_port(port);
+ mutex_exit(&port->statep->inst_lock);
+
+ return (0);
+}
+
+/*
+ * audioixp_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audioixp_close(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ audioixp_stop_port(port);
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audioixp_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audioixp_stop(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (port->started) {
+ audioixp_stop_port(port);
+ }
+ port->started = B_FALSE;
+ mutex_exit(&statep->inst_lock);
+}
+
+/*
+ * audioixp_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audioixp_start(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+
+ mutex_enter(&statep->inst_lock);
+ if (!port->started) {
+ audioixp_start_port(port);
+ port->started = B_TRUE;
+ }
+ mutex_exit(&statep->inst_lock);
+ return (0);
+}
+
+/*
+ * audioixp_format()
+ *
+ * Description:
+ * This is called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE
+ */
+static int
+audioixp_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+/*
+ * audioixp_channels()
+ *
+ * Description:
+ * This is called by the framework to query the channels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Number of channels for the device.
+ */
+static int
+audioixp_channels(void *arg)
+{
+ audioixp_port_t *port = arg;
+
+ return (port->nchan);
+}
+
+/*
+ * audioixp_rate()
+ *
+ * Description:
+ * This is called by the framework to query the rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audioixp_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audioixp_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audioixp_count(void *arg)
+{
+ audioixp_port_t *port = arg;
+ audioixp_state_t *statep = port->statep;
+ uint64_t val;
+
+ mutex_enter(&statep->inst_lock);
+ audioixp_update_port(port);
+ val = port->count;
+ mutex_exit(&statep->inst_lock);
+
+ return (val);
+}
+
+/*
+ * audioixp_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audioixp_sync(void *arg, unsigned nframes)
+{
+ audioixp_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->samp_dmah, 0, 0, port->sync_dir);
+}
+
+/*
+ * audioixp_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audioixp_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+
+/* *********************** Local Routines *************************** */
+
+/*
+ * audioixp_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It also configures the BDL lists properly
+ * for use.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audioixp_alloc_port(audioixp_state_t *statep, int num)
+{
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ unsigned caps;
+ char *prop;
+ audio_dev_t *adev;
+ audioixp_port_t *port;
+ uint32_t paddr;
+ int rc;
+ dev_info_t *dip;
+ audioixp_bd_entry_t *bdentry;
+
+ adev = statep->adev;
+ dip = statep->dip;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ port->statep = statep;
+ port->started = B_FALSE;
+ port->num = num;
+
+ switch (num) {
+ case IXP_REC:
+ statep->rec_port = port;
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ port->nchan = 2;
+ break;
+ case IXP_PLAY:
+ statep->play_port = port;
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->sync_dir = DDI_DMA_SYNC_FORDEV;
+ /* This could possibly be conditionalized */
+ port->nchan = 6;
+ break;
+ default:
+ audio_dev_warn(adev, "bad port number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+
+ port->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, IXP_INTS);
+
+ /* make sure the values are good */
+ if (port->intrs < IXP_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->intrs, IXP_INTS);
+ port->intrs = IXP_INTS;
+ } else if (port->intrs > IXP_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->intrs, IXP_INTS);
+ port->intrs = IXP_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 8 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM.)
+ */
+ port->fragfr = 48000 / port->intrs;
+ port->fragfr = IXP_ROUNDUP(port->fragfr, IXP_MOD_SIZE);
+ port->fragsz = port->fragfr * port->nchan * 2;
+ port->samp_size = port->fragsz * IXP_BD_NUMS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &sample_buf_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->samp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->samp_dmah, port->samp_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->samp_kaddr,
+ &port->samp_size, &port->samp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->samp_dmah, NULL,
+ port->samp_kaddr, port->samp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ port->samp_paddr = cookie.dmac_address;
+
+ /*
+ * now, from here we allocate DMA memory for buffer descriptor list.
+ * we allocate adjacent DMA memory for all DMA engines.
+ */
+ rc = ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->bdl_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * we allocate all buffer descriptors lists in continuous dma memory.
+ */
+ port->bdl_size = sizeof (audioixp_bd_entry_t) * IXP_BD_NUMS;
+ rc = ddi_dma_mem_alloc(port->bdl_dmah, port->bdl_size,
+ &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &port->bdl_kaddr, &port->bdl_size, &port->bdl_acch);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_mem_alloc(bdlist) failed");
+ return (DDI_FAILURE);
+ }
+
+ rc = ddi_dma_addr_bind_handle(port->bdl_dmah, NULL, port->bdl_kaddr,
+ port->bdl_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP,
+ NULL, &cookie, &count);
+ if ((rc != DDI_DMA_MAPPED) || (count != 1)) {
+ audio_dev_warn(adev, "addr_bind_handle failed");
+ return (DDI_FAILURE);
+ }
+ port->bdl_paddr = cookie.dmac_address;
+
+ /*
+ * Wire up the BD list.
+ */
+ paddr = port->samp_paddr;
+ bdentry = (void *)port->bdl_kaddr;
+
+ for (int i = 0; i < IXP_BD_NUMS; i++) {
+
+ /* set base address of buffer */
+ ddi_put32(port->bdl_acch, &bdentry->buf_base, paddr);
+ ddi_put16(port->bdl_acch, &bdentry->status, 0);
+ ddi_put16(port->bdl_acch, &bdentry->buf_len, port->fragsz / 4);
+ ddi_put32(port->bdl_acch, &bdentry->next, port->bdl_paddr +
+ (((i + 1) % IXP_BD_NUMS) * sizeof (audioixp_bd_entry_t)));
+ paddr += port->fragsz;
+ bdentry++;
+ }
+ ddi_dma_sync(port->bdl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ port->engine = audio_engine_alloc(&audioixp_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(adev, port->engine);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audioixp_port_t *port The port structure for a DMA engine.
+ */
+static void
+audioixp_free_port(audioixp_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->engine) {
+ audio_dev_remove_engine(port->statep->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ if (port->bdl_paddr) {
+ (void) ddi_dma_unbind_handle(port->bdl_dmah);
+ }
+ if (port->bdl_acch) {
+ ddi_dma_mem_free(&port->bdl_acch);
+ }
+ if (port->bdl_dmah) {
+ ddi_dma_free_handle(&port->bdl_dmah);
+ }
+ if (port->samp_paddr) {
+ (void) ddi_dma_unbind_handle(port->samp_dmah);
+ }
+ if (port->samp_acch) {
+ ddi_dma_mem_free(&port->samp_acch);
+ }
+ if (port->samp_dmah) {
+ ddi_dma_free_handle(&port->samp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audioixp_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to start.
+ */
+static void
+audioixp_start_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+
+ if (port->num == IXP_REC) {
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN);
+ } else {
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT);
+ }
+}
+
+/*
+ * audioixp_stop_port()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to stop.
+ */
+static void
+audioixp_stop_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /* if suspended, then do nothing else */
+ if (statep->suspended) {
+ return;
+ }
+ if (port->num == IXP_REC) {
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN);
+ } else {
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT);
+ }
+}
+
+/*
+ * audioixp_reset_port()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * audioixp_port_t *port Port of DMA engine to reset.
+ */
+static void
+audioixp_reset_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+
+ ASSERT(mutex_owned(&statep->inst_lock));
+
+ /*
+ * XXX: reset counters.
+ */
+ port->count = 0;
+
+ if (statep->suspended)
+ return;
+
+ /*
+ * Perform full reset of the engine, and enable its interrupts
+ * but leave it turned off.
+ */
+ if (port->num == IXP_REC) {
+ PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_INTER_IN);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+ PUT32(IXP_AUDIO_IN_DMA_LINK_P,
+ port->bdl_paddr | IXP_AUDIO_IN_DMA_LINK_P_EN);
+
+ } else {
+ uint32_t slot = GET32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD);
+ PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_OUT);
+ /* clear all slots */
+ slot &= ~ (IXP_AUDIO_OUT_DMA_SLOT_3 |
+ IXP_AUDIO_OUT_DMA_SLOT_4 |
+ IXP_AUDIO_OUT_DMA_SLOT_5 |
+ IXP_AUDIO_OUT_DMA_SLOT_6 |
+ IXP_AUDIO_OUT_DMA_SLOT_7 |
+ IXP_AUDIO_OUT_DMA_SLOT_8 |
+ IXP_AUDIO_OUT_DMA_SLOT_9 |
+ IXP_AUDIO_OUT_DMA_SLOT_10 |
+ IXP_AUDIO_OUT_DMA_SLOT_11 |
+ IXP_AUDIO_OUT_DMA_SLOT_12);
+ /* enable 6 channel out, unconditional for now */
+ slot |= IXP_AUDIO_OUT_DMA_SLOT_3 |
+ IXP_AUDIO_OUT_DMA_SLOT_4 |
+ IXP_AUDIO_OUT_DMA_SLOT_6 |
+ IXP_AUDIO_OUT_DMA_SLOT_9 |
+ IXP_AUDIO_OUT_DMA_SLOT_7 |
+ IXP_AUDIO_OUT_DMA_SLOT_8;
+
+ PUT32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD, slot);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_INTER_OUT);
+
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ PUT32(IXP_AUDIO_OUT_DMA_LINK_P,
+ port->bdl_paddr | IXP_AUDIO_OUT_DMA_LINK_P_EN);
+ }
+}
+
+/*
+ * audioixp_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audioixp_port_t *port The port to update.
+ */
+static void
+audioixp_update_port(audioixp_port_t *port)
+{
+ audioixp_state_t *statep = port->statep;
+ unsigned regoff;
+ unsigned n;
+ int loop;
+ uint32_t offset;
+ uint32_t paddr;
+
+ if (statep->suspended) {
+ return;
+ }
+ if (port->num == IXP_REC) {
+ regoff = IXP_AUDIO_IN_DMA_DT_CUR;
+ } else {
+ regoff = IXP_AUDIO_OUT_DMA_DT_CUR;
+ }
+
+ /*
+ * Apparently it may take several tries to get an update on the
+ * position. Is this a hardware bug?
+ */
+ for (loop = 100; loop; loop--) {
+ paddr = GET32(regoff);
+
+ /* make sure address is reasonable */
+ if ((paddr < port->samp_paddr) ||
+ (paddr >= (port->samp_paddr + port->samp_size))) {
+ continue;
+ }
+
+ offset = paddr - port->samp_paddr;
+
+ if (offset >= port->offset) {
+ n = offset - port->offset;
+ } else {
+ n = offset + (port->samp_size - port->offset);
+ }
+ port->offset = offset;
+ port->count += (n / (port->nchan * sizeof (uint16_t)));
+ return;
+ }
+
+ audio_dev_warn(statep->adev, "Unable to update count (h/w bug?)");
+}
+
+
+/*
+ * audioixp_map_regs()
+ *
+ * Description:
+ * The registers are mapped in.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audioixp_map_regs(audioixp_state_t *statep)
+{
+ dev_info_t *dip = statep->dip;
+
+ /* map PCI config space */
+ if (pci_config_setup(statep->dip, &statep->pcih) == DDI_FAILURE) {
+ audio_dev_warn(statep->adev, "unable to map PCI config space");
+ return (DDI_FAILURE);
+ }
+
+ /* map audio mixer register */
+ if ((ddi_regs_map_setup(dip, IXP_IO_AM_REGS, &statep->regsp, 0, 0,
+ &dev_attr, &statep->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "unable to map audio registers");
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps control registers.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ */
+static void
+audioixp_unmap_regs(audioixp_state_t *statep)
+{
+ if (statep->regsh) {
+ ddi_regs_map_free(&statep->regsh);
+ }
+
+ if (statep->pcih) {
+ pci_config_teardown(&statep->pcih);
+ }
+}
+
+/*
+ * audioixp_codec_ready()
+ *
+ * Description:
+ * This routine checks the state of codecs. It checks the flag to confirm
+ * that primary codec is ready.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS codec is ready
+ * DDI_FAILURE codec is not ready
+ */
+static int
+audioixp_codec_ready(audioixp_state_t *statep)
+{
+ uint32_t sr;
+
+ PUT32(IXP_AUDIO_INT, 0xffffffff);
+ drv_usecwait(1000);
+
+ sr = GET32(IXP_AUDIO_INT);
+ if (sr & IXP_AUDIO_INT_CODEC0_NOT_READY) {
+ PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC0_NOT_READY);
+ audio_dev_warn(statep->adev, "primary codec not ready");
+
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_codec_sync()
+ *
+ * Description:
+ * Serialize access to the AC97 audio mixer registers.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Ready for an I/O access to the codec
+ * DDI_FAILURE An I/O access is currently in progress, can't
+ * perform another I/O access.
+ */
+static int
+audioixp_codec_sync(audioixp_state_t *statep)
+{
+ int i;
+ uint32_t cmd;
+
+ for (i = 0; i < 300; i++) {
+ cmd = GET32(IXP_AUDIO_OUT_PHY_ADDR_DATA);
+ if (!(cmd & IXP_AUDIO_OUT_PHY_EN)) {
+ return (DDI_SUCCESS);
+ }
+ drv_usecwait(10);
+ }
+
+ audio_dev_warn(statep->adev, "unable to synchronize codec");
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_rd97()
+ *
+ * Description:
+ * Get the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ *
+ * Returns:
+ * Register value.
+ */
+static uint16_t
+audioixp_rd97(void *arg, uint8_t reg)
+{
+ audioixp_state_t *statep = arg;
+ uint32_t value;
+ uint32_t result;
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS)
+ return (0xffff);
+
+ value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC |
+ IXP_AUDIO_OUT_PHY_READ |
+ IXP_AUDIO_OUT_PHY_EN |
+ ((unsigned)reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT);
+ PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS)
+ return (0xffff);
+
+ for (int i = 0; i < 300; i++) {
+ result = GET32(IXP_AUDIO_IN_PHY_ADDR_DATA);
+ if (result & IXP_AUDIO_IN_PHY_READY) {
+ return (result >> IXP_AUDIO_IN_PHY_DATA_SHIFT);
+ }
+ drv_usecwait(10);
+ }
+
+done:
+ audio_dev_warn(statep->adev, "time out reading codec reg %d", reg);
+ return (0xffff);
+}
+
+/*
+ * audioixp_wr97()
+ *
+ * Description:
+ * Set the specific AC97 Codec register.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint8_t reg AC97 register number
+ * uint16_t data The data want to be set
+ */
+static void
+audioixp_wr97(void *arg, uint8_t reg, uint16_t data)
+{
+ audioixp_state_t *statep = arg;
+ uint32_t value;
+
+ if (audioixp_codec_sync(statep) != DDI_SUCCESS) {
+ return;
+ }
+
+ value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC |
+ IXP_AUDIO_OUT_PHY_WRITE |
+ IXP_AUDIO_OUT_PHY_EN |
+ ((unsigned)reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT) |
+ ((unsigned)data << IXP_AUDIO_OUT_PHY_DATA_SHIFT);
+ PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
+
+ (void) audioixp_rd97(statep, reg);
+}
+
+/*
+ * audioixp_reset_ac97()
+ *
+ * Description:
+ * Reset AC97 Codec register.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Reset the codec successfully
+ * DDI_FAILURE Failed to reset the codec
+ */
+static int
+audioixp_reset_ac97(audioixp_state_t *statep)
+{
+ uint32_t cmd;
+ int i;
+
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_POWER_DOWN);
+ drv_usecwait(10);
+
+ /* register reset */
+ SET32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_AC_SOFT_RESET);
+ /* force a read to flush caches */
+ (void) GET32(IXP_AUDIO_CMD);
+
+ drv_usecwait(10);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_AC_SOFT_RESET);
+
+ /* cold reset */
+ for (i = 0; i < 300; i++) {
+ cmd = GET32(IXP_AUDIO_CMD);
+ if (cmd & IXP_AUDIO_CMD_AC_ACTIVE) {
+ cmd |= IXP_AUDIO_CMD_AC_RESET | IXP_AUDIO_CMD_AC_SYNC;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ return (DDI_SUCCESS);
+ }
+ cmd &= ~IXP_AUDIO_CMD_AC_RESET;
+ cmd |= IXP_AUDIO_CMD_AC_SYNC;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ (void) GET32(IXP_AUDIO_CMD);
+ drv_usecwait(10);
+ cmd |= IXP_AUDIO_CMD_AC_RESET;
+ PUT32(IXP_AUDIO_CMD, cmd);
+ drv_usecwait(10);
+ }
+
+ audio_dev_warn(statep->adev, "AC'97 reset timed out");
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_chip_init()
+ *
+ * Description:
+ * This routine initializes ATI IXP audio controller and the AC97
+ * codec.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The hardware was initialized properly
+ * DDI_FAILURE The hardware couldn't be initialized properly
+ */
+static int
+audioixp_chip_init(audioixp_state_t *statep)
+{
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+
+ /* AC97 reset */
+ if (audioixp_reset_ac97(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "AC97 codec reset failed");
+ return (DDI_FAILURE);
+ }
+
+ if (audioixp_codec_ready(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "AC97 codec not ready");
+ return (DDI_FAILURE);
+ }
+
+ /* enable interrupts */
+ PUT32(IXP_AUDIO_INT, 0xffffffff);
+ PUT32(
+ IXP_AUDIO_INT_EN,
+ IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW |
+ IXP_AUDIO_INT_EN_STATUS |
+ IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW);
+ return (DDI_SUCCESS);
+
+} /* audioixp_chip_init() */
+
+/*
+ * audioixp_attach()
+ *
+ * Description:
+ * Attach an instance of the audioixp driver. This routine does
+ * the device dependent attach tasks.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audioixp_attach(dev_info_t *dip)
+{
+ uint16_t cmdeg;
+ audioixp_state_t *statep;
+ audio_dev_t *adev;
+ uint32_t devid;
+ const char *name;
+ const char *rev;
+
+ /* we don't support high level interrupts in the driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN,
+ "!%s%d: unsupported high level interrupt",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the soft state structure */
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ statep->dip = dip;
+ ddi_set_driver_private(dip, statep);
+
+ if (ddi_get_iblock_cookie(dip, 0, &statep->iblock) != DDI_SUCCESS) {
+ cmn_err(CE_WARN,
+ "!%s%d: cannot get iblock cookie",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ kmem_free(statep, sizeof (*statep));
+ return (DDI_FAILURE);
+ }
+ mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->iblock);
+
+ /* allocate framework audio device */
+ if ((adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "!%s%d: unable to allocate audio dev",
+ ddi_driver_name(dip), ddi_get_instance(dip));
+ goto error;
+ }
+ statep->adev = adev;
+
+ /* map in the registers */
+ if (audioixp_map_regs(statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "couldn't map registers");
+ goto error;
+ }
+
+ /* set device information -- this could be smarter */
+ devid = ((pci_config_get16(statep->pcih, PCI_CONF_VENID)) << 16) |
+ pci_config_get16(statep->pcih, PCI_CONF_DEVID);
+
+ name = "ATI AC'97";
+ switch (devid) {
+ case IXP_PCI_ID_200:
+ rev = "IXP150";
+ break;
+ case IXP_PCI_ID_300:
+ rev = "SB300";
+ break;
+ case IXP_PCI_ID_400:
+ if (pci_config_get8(statep->pcih, PCI_CONF_REVID) & 0x80) {
+ rev = "SB450";
+ } else {
+ rev = "SB400";
+ }
+ break;
+ case IXP_PCI_ID_SB600:
+ rev = "SB600";
+ break;
+ default:
+ rev = "Unknown";
+ break;
+ }
+ audio_dev_set_description(adev, name);
+ audio_dev_set_version(adev, rev);
+
+ /* allocate port structures */
+ if ((audioixp_alloc_port(statep, IXP_PLAY) != DDI_SUCCESS) ||
+ (audioixp_alloc_port(statep, IXP_REC) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ statep->ac97 = ac97_alloc(dip, audioixp_rd97, audioixp_wr97, statep);
+ if (statep->ac97 == NULL) {
+ audio_dev_warn(adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ /* set PCI command register */
+ cmdeg = pci_config_get16(statep->pcih, PCI_CONF_COMM);
+ pci_config_put16(statep->pcih, PCI_CONF_COMM,
+ cmdeg | PCI_COMM_IO | PCI_COMM_MAE);
+
+ /* set up kernel statistics */
+ if ((statep->ksp = kstat_create(IXP_NAME, ddi_get_instance(dip),
+ IXP_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(statep->ksp);
+ }
+
+
+ if (audioixp_chip_init(statep) != DDI_SUCCESS) {
+ audio_dev_warn(statep->adev, "failed to init chip");
+ goto error;
+ }
+
+ /* initialize the AC'97 part */
+ if (ac97_init(statep->ac97, adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ac'97 initialization failed");
+ goto error;
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, &statep->iblock, NULL, audioixp_intr,
+ (caddr_t)statep) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "bad interrupt specification");
+ }
+ statep->intr_added = B_TRUE;
+
+ if (audio_dev_register(adev) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "unable to register with framework");
+ goto error;
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audioixp_destroy(statep);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audioixp_detach()
+ *
+ * Description:
+ * Detach an instance of the audioixp driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audioixp_detach(dev_info_t *dip)
+{
+ audioixp_state_t *statep;
+
+ statep = ddi_get_driver_private(dip);
+
+ if (audio_dev_unregister(statep->adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audioixp_destroy(statep);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audioixp_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audioixp_state_t *state The device soft state.
+ */
+void
+audioixp_destroy(audioixp_state_t *statep)
+{
+ if (!statep->suspended) {
+ PUT32(IXP_AUDIO_INT, GET32(IXP_AUDIO_INT));
+ PUT32(IXP_AUDIO_INT_EN, 0);
+
+ /*
+ * put the audio controller into quiet state, everything off
+ */
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT_DMA);
+ CLR32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN_DMA);
+ }
+
+ if (statep->intr_added) {
+ ddi_remove_intr(statep->dip, 0, statep->iblock);
+ }
+ if (statep->ksp) {
+ kstat_delete(statep->ksp);
+ }
+
+ audioixp_free_port(statep->play_port);
+ audioixp_free_port(statep->rec_port);
+
+ audioixp_unmap_regs(statep);
+
+ if (statep->ac97) {
+ ac97_free(statep->ac97);
+ }
+
+ if (statep->adev) {
+ audio_dev_free(statep->adev);
+ }
+
+ mutex_destroy(&statep->inst_lock);
+ kmem_free(statep, sizeof (*statep));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf
index 01efaa0243..c9390e7375 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.conf
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.conf
@@ -19,34 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audioixp audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# The compat mode (mixer disabled) may not work as expected on all systems,
-# please refer to the audioixp(7D) manpage.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
-
-#
-# Uncomment cdrom to enable the audioixp driver to use the CDROM analog
-# input.
-#
-# cdrom=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -65,10 +45,3 @@ mixer-mode=1;
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audioixp driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h
new file mode 100644
index 0000000000..b71f4a866f
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audioixp/audioixp.h
@@ -0,0 +1,286 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIOIXP_H_
+#define _AUDIOIXP_H_
+
+/*
+ * Header file for the audioixp device driver
+ */
+
+#define IXP_DEV_CONFIG "onboard1"
+#define IXP_DEV_VERSION "a"
+
+/*
+ * Driver supported configuration information
+ */
+#define IXP_NAME "audioixp"
+#define IXP_MOD_NAME "ATI IXP audio driver"
+#define IXP_CONFIG_REGS (0) /* PCI configure register */
+#define IXP_IO_AM_REGS (1) /* PCI base register 0x10 */
+
+#define IXP_PLAY 0
+#define IXP_REC 1
+
+#define IXP_ROUNDUP(x, algn) (((x) + ((algn) - 1)) & ~((algn) - 1))
+#define IXP_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+#define IXP_BD_NUMS (8)
+#define IXP_MOD_SIZE (32)
+
+
+/*
+ * PCI configuration registers and bits
+ */
+#define IXP_PCI_ID_200 (0x10024341U)
+#define IXP_PCI_ID_300 (0x10024361U)
+#define IXP_PCI_ID_400 (0x10024370U)
+#define IXP_PCI_ID_SB600 (0x10024382U)
+
+/*
+ * Audio controller registers and bits
+ */
+#define IXP_AUDIO_INT (0x00)
+#define IXP_AUDIO_INT_IN_DMA_OVERFLOW (1U<<0)
+#define IXP_AUDIO_INT_IN_DMA (1U<<1)
+#define IXP_AUDIO_INT_OUT_DMA_UNDERFLOW (1U<<2)
+#define IXP_AUDIO_INT_OUT_DMA (1U<<3)
+#define IXP_AUDIO_INT_CODEC0_NOT_READY (1U<<10)
+#define IXP_AUDIO_INT_CODEC1_NOT_READY (1U<<11)
+#define IXP_AUDIO_INT_CODEC2_NOT_READY (1U<<12)
+#define IXP_AUDIO_INT_NEW_FRAME (1U<<13)
+
+#define IXP_AUDIO_INT_EN (0x04)
+#define IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW (1U<<0)
+#define IXP_AUDIO_INT_EN_STATUS (1U<<1)
+#define IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW (1U<<2)
+#define IXP_AUDIO_INT_EN_CODEC0_NOT_READY (1U<<10)
+#define IXP_AUDIO_INT_EN_CODEC1_NOT_READY (1U<<11)
+#define IXP_AUDIO_INT_EN_CODEC2_NOT_READY (1U<<12)
+#define IXP_AUDIO_INT_EN_NEW_FRAME (1U<<13)
+
+#define IXP_AUDIO_CMD (0x08)
+#define IXP_AUDIO_CMD_POWER_DOWN (1U<<0)
+#define IXP_AUDIO_CMD_EN_IN (1U<<1)
+#define IXP_AUDIO_CMD_EN_OUT (1U<<2)
+#define IXP_AUDIO_CMD_EN_IN_DMA (1U<<8)
+#define IXP_AUDIO_CMD_EN_OUT_DMA (1U<<9)
+#define IXP_AUDIO_CMD_INTER_IN (1U<<21)
+#define IXP_AUDIO_CMD_INTER_OUT (1U<<22)
+#define IXP_AUDIO_CMD_BURST_EN (1U<<25)
+#define IXP_AUDIO_CMD_AC_ACTIVE (1U<<28)
+#define IXP_AUDIO_CMD_AC_SOFT_RESET (1U<<29)
+#define IXP_AUDIO_CMD_AC_SYNC (1U<<30)
+#define IXP_AUDIO_CMD_AC_RESET (1U<<31)
+
+#define IXP_AUDIO_OUT_PHY_ADDR_DATA (0x0c)
+#define IXP_AUDIO_OUT_PHY_PRIMARY_CODEC (0u)
+#define IXP_AUDIO_OUT_PHY_SECOND_CODEC (1u)
+#define IXP_AUDIO_OUT_PHY_THIRD_CODEC (2u)
+#define IXP_AUDIO_OUT_PHY_READ (1u<<2)
+#define IXP_AUDIO_OUT_PHY_WRITE (0u)
+#define IXP_AUDIO_OUT_PHY_EN (1u<<8)
+#define IXP_AUDIO_OUT_PHY_ADDR_SHIFT (9)
+#define IXP_AUDIO_OUT_PHY_ADDR_MASK (0x7fu<<9)
+#define IXP_AUDIO_OUT_PHY_DATA_SHIFT (16)
+#define IXP_AUDIO_OUT_PHY_DATA_MASK (0xffffu<<16)
+
+#define IXP_AUDIO_IN_PHY_ADDR_DATA (0x10)
+#define IXP_AUDIO_IN_PHY_READY (1u<<8)
+#define IXP_AUDIO_IN_PHY_ADDR_SHIFT (9)
+#define IXP_AUDIO_IN_PHY_ADDR_MASK (0x7fu<<9)
+#define IXP_AUDIO_IN_PHY_DATA_SHIFT (16)
+#define IXP_AUDIO_IN_PHY_DATA_MASK (0xffffu<<16)
+
+#define IXP_AUDIO_SLOTREQ (0x14)
+#define IXP_AUDIO_COUNTER (0x18)
+#define IXP_AUDIO_IN_FIFO_THRESHOLD (0x1c)
+#define IXP_AUDIO_IN_DMA_LINK_P (0x20)
+#define IXP_AUDIO_IN_DMA_LINK_P_EN (1u<<0)
+
+#define IXP_AUDIO_IN_DMA_DT_START (0x24)
+#define IXP_AUDIO_IN_DMA_DT_NEXT (0x28)
+#define IXP_AUDIO_IN_DMA_DT_CUR (0x2c)
+#define IXP_AUDIO_IN_DT_SIZE_FIFO_INFO (0x30)
+
+#define IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD (0x34)
+#define IXP_AUDIO_OUT_DMA_SLOT_3 (1U<<0)
+#define IXP_AUDIO_OUT_DMA_SLOT_4 (1U<<1)
+#define IXP_AUDIO_OUT_DMA_SLOT_5 (1U<<2)
+#define IXP_AUDIO_OUT_DMA_SLOT_6 (1U<<3)
+#define IXP_AUDIO_OUT_DMA_SLOT_7 (1U<<4)
+#define IXP_AUDIO_OUT_DMA_SLOT_8 (1U<<5)
+#define IXP_AUDIO_OUT_DMA_SLOT_9 (1U<<6)
+#define IXP_AUDIO_OUT_DMA_SLOT_10 (1U<<7)
+#define IXP_AUDIO_OUT_DMA_SLOT_11 (1U<<8)
+#define IXP_AUDIO_OUT_DMA_SLOT_12 (1U<<9)
+#define IXP_AUDIO_OUT_DMA_THRESHOLD_MASK (0x7fU<<11)
+#define IXP_AUDIO_OUT_DMA_THRESHOLD_SHIFT (11)
+
+#define IXP_AUDIO_OUT_DMA_LINK_P (0x38)
+#define IXP_AUDIO_OUT_DMA_LINK_P_EN (1U<<0)
+
+#define IXP_AUDIO_OUT_DMA_DT_START (0x3c)
+#define IXP_AUDIO_OUT_DMA_DT_NEXT (0x40)
+#define IXP_AUDIO_OUT_DMA_DT_CUR (0x44)
+#define IXP_AUDIO_OUT_DT_SIZE_USED_FREE (0x48)
+#define IXP_AUDIO_SPDIF_CMD (0x4c)
+#define IXP_AUDIO_SPDIF_LINK_P (0x50)
+#define IXP_AUDIO_SPDIF_DT_START (0x54)
+#define IXP_AUDIO_SPDIF_DT_NEXT (0x58)
+#define IXP_AUDIO_SPDIF_DT_CUR (0x5c)
+#define IXP_AUDIO_SPDIF_DT_SIZE_FIFO_INFO (0x60)
+#define IXP_AUDIO_MODEM_MIRROR (0x7c)
+#define IXP_AUDIO_AUDIO_MIRROR (0x80)
+#define IXP_AUDIO_6CH_RECORDER_EN (0x84)
+#define IXP_AUDIO_FIFO_FLUSH (0x88)
+#define IXP_AUDIO_FIFO_FLUSH_OUT (1u<<0)
+#define IXP_AUDIO_FIFO_FLUSH_IN (1u<<1)
+
+#define IXP_AUDIO_OUT_FIFO_INFO (0x8c)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG1 (0x90)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG2 (0x94)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG3 (0x98)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG4 (0x9c)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG5 (0xa0)
+#define IXP_AUDIO_SPDIF_STATUS_BITS_REG6 (0xa4)
+#define IXP_AUDIO_PHY_SEMA (0xa8)
+
+/*
+ * AC97 status and link control registers are located
+ * in PCI configuration space.
+ */
+#define IXP_REG_GSR 0x40
+#define IXP_REG_GCR 0x41
+
+/* AC link interface status register */
+#define IXP_GSR_PRI_READY 0x01
+#define IXP_GSR_SEC_READY 0x04
+#define IXP_GSR_TRI_READY 0x10
+#define IXP_GSR_FOUR_READY 0x20
+
+/* AC link interface control register */
+#define IXP_GCR_ENAC97 0x80
+#define IXP_GCR_RST 0x40
+#define IXP_GCR_RSYNCHI 0x20
+#define IXP_GCR_SDO 0x10
+#define IXP_GCR_VSR 0x08
+#define IXP_GCR_3D_AUDIO_CHANNEL 0x04
+
+/*
+ * Macro for AD1980 codec
+ */
+#define AD1980_VID1 0x4144
+#define AD1980_VID2 0x5370
+#define AD1985_VID2 0x5375
+#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
+#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
+#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
+
+struct audioixp_port {
+ int num;
+ struct audioixp_state *statep;
+ ddi_dma_handle_t samp_dmah;
+ ddi_acc_handle_t samp_acch;
+ size_t samp_size;
+ caddr_t samp_kaddr;
+ uint32_t samp_paddr;
+
+ ddi_dma_handle_t bdl_dmah;
+ ddi_acc_handle_t bdl_acch;
+ size_t bdl_size;
+ caddr_t bdl_kaddr;
+ uint32_t bdl_paddr;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ uint64_t count;
+ uint32_t offset;
+ uint8_t nchan;
+
+ unsigned sync_dir;
+
+ boolean_t started;
+
+ audio_engine_t *engine;
+};
+typedef struct audioixp_port audioixp_port_t;
+
+/*
+ * buffer descriptor list entry, see datasheet
+ */
+struct audioixp_bd_entry {
+ uint32_t buf_base; /* the address of the buffer */
+ uint16_t status; /* status of the buffer */
+ uint16_t buf_len; /* size of the buffer in DWORD */
+ uint32_t next; /* physical addr of next bd_entry */
+};
+typedef struct audioixp_bd_entry audioixp_bd_entry_t;
+
+/*
+ * audioixp_state_t -per instance state and operation data
+ */
+struct audioixp_state {
+ kmutex_t inst_lock; /* state protection lock */
+ ddi_iblock_cookie_t iblock;
+ dev_info_t *dip;
+ audio_dev_t *adev; /* audio handle */
+ ac97_t *ac97;
+ audioixp_port_t *play_port;
+ audioixp_port_t *rec_port;
+
+ ddi_acc_handle_t pcih; /* pci configuration space */
+ ddi_acc_handle_t regsh; /* for audio mixer register */
+ caddr_t regsp; /* base of audio mixer regs */
+
+ boolean_t suspended;
+ boolean_t intr_added;
+ boolean_t swap_out; /* swap line-out and sur-out */
+
+ kstat_t *ksp; /* kernel statistics */
+
+ uint32_t ixp_codec_not_ready_bits; /* for codec detect */
+};
+typedef struct audioixp_state audioixp_state_t;
+
+/*
+ * Useful bit twiddlers
+ */
+#define GET32(reg) \
+ ddi_get32(statep->regsh, (void *)(statep->regsp + (reg)))
+
+#define PUT32(reg, val) \
+ ddi_put32(statep->regsh, (void *)(statep->regsp + (reg)), (val))
+
+#define SET32(reg, val) PUT32(reg, GET32(reg) | ((uint32_t)(val)))
+
+#define CLR32(reg, val) PUT32(reg, GET32(reg) & ~((uint32_t)(val)))
+
+#define IXP_INTS (175) /* default interrupt rate */
+#define IXP_MIN_INTS (24) /* minimum interrupt rate */
+#define IXP_MAX_INTS (500) /* maximum interrupt rate */
+
+#endif /* _AUDIOIXP_H_ */
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c
new file mode 100644
index 0000000000..22b7975535
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.c
@@ -0,0 +1,1736 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Creative/Ensoniq AudioPCI driver (ES1370)
+ *
+ * This driver is used with the original Ensoniq AudioPCI.
+ */
+
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/audio/audio_driver.h>
+#include <sys/note.h>
+#include <sys/pci.h>
+#include "audiopci.h"
+
+/*
+ * The original OSS driver used a single duplex engine and a separate
+ * playback only engine. Instead, we expose three engines, one for input
+ * and two for output.
+ */
+
+#define ENSONIQ_VENDOR_ID 0x1274
+#define CREATIVE_VENDOR_ID 0x1102
+#define ENSONIQ_ES1370 0x5000
+
+#define DEFINTS 75
+#define DRVNAME "audiopci"
+
+#define INPUT_MIC 0
+#define INPUT_LINEIN 1
+#define INPUT_CD 2
+#define INPUT_VIDEO 3
+#define INPUT_PHONE 4
+#define INSRCS 0x1f /* bits 0-4 */
+
+static const char *audiopci_insrcs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_CD,
+ AUDIO_PORT_VIDEO,
+ AUDIO_PORT_PHONE,
+ NULL
+};
+
+typedef struct audiopci_port
+{
+ /* Audio parameters */
+ boolean_t trigger;
+
+ int speed;
+ int fmt;
+
+ int num;
+#define PORT_DAC 0
+#define PORT_SYN 1
+#define PORT_ADC 2
+#define PORT_MAX PORT_ADC
+
+ caddr_t kaddr;
+ uint32_t paddr;
+ ddi_acc_handle_t acch;
+ ddi_dma_handle_t dmah;
+ unsigned fragfr;
+ unsigned nfrags;
+ unsigned nframes;
+ unsigned frameno;
+ uint64_t count;
+
+ struct audiopci_dev *dev;
+ audio_engine_t *engine;
+} audiopci_port_t;
+
+typedef enum {
+ CTL_VOLUME = 0,
+ CTL_FRONT,
+ CTL_MONO,
+ CTL_MIC,
+ CTL_LINE,
+ CTL_CD,
+ CTL_VID,
+ CTL_PHONE,
+ CTL_MICBOOST,
+ CTL_RECSRC,
+ CTL_MONSRC,
+ CTL_NUM /* must be last */
+} audiopci_ctrl_num_t;
+
+typedef struct audiopci_ctrl
+{
+ struct audiopci_dev *dev;
+ audio_ctrl_t *ctrl;
+ audiopci_ctrl_num_t num;
+ uint64_t val;
+} audiopci_ctrl_t;
+
+
+typedef struct audiopci_dev
+{
+ audio_dev_t *adev;
+ kmutex_t mutex;
+ uint16_t devid;
+ dev_info_t *dip;
+ boolean_t enabled;
+ boolean_t suspended;
+
+ int pintrs;
+ int rintrs;
+
+ uint8_t ak_regs[0x20];
+ int micbias;
+
+ /*
+ * Controls
+ */
+ audiopci_ctrl_t controls[CTL_NUM];
+#if 0
+ audiopci_ctrl_t *micbias;
+#endif
+
+ kstat_t *ksp;
+
+ audiopci_port_t port[PORT_MAX + 1];
+
+
+ caddr_t regs;
+ ddi_acc_handle_t acch;
+ ddi_intr_handle_t ihandle[1];
+} audiopci_dev_t;
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * The hardware appears to be able to address up to 16-bits worth of longwords,
+ * giving a total address space of 256K. Note, however, that we will restrict
+ * this further when we do fragment and memory allocation. At its very highest
+ * clock rate (48 kHz) and sample size (16-bit stereo), and lowest interrupt
+ * rate (32 Hz), we only need 6000 bytes per fragment.
+ *
+ * So with an allocated buffer size of 64K, we can support at least 10 frags,
+ * which is more than enough. (The legacy Sun driver used only 2 fragments.)
+ */
+#define AUDIOPCI_BUF_LEN (65536)
+
+static ddi_dma_attr_t dma_attr = {
+ DMA_ATTR_VERSION, /* dma_attr_version */
+ 0x0, /* dma_attr_addr_lo */
+ 0xffffffffU, /* dma_attr_addr_hi */
+ 0x3ffff, /* dma_attr_count_max */
+ 0x8, /* dma_attr_align */
+ 0x7f, /* dma_attr_burstsizes */
+ 0x1, /* dma_attr_minxfer */
+ 0x3ffff, /* dma_attr_maxxfer */
+ 0x3ffff, /* dma_attr_seg */
+ 0x1, /* dma_attr_sgllen */
+ 0x1, /* dma_attr_granular */
+ 0 /* dma_attr_flags */
+};
+
+#define GET8(dev, offset) \
+ ddi_get8(dev->acch, (uint8_t *)(dev->regs + (offset)))
+#define GET16(dev, offset) \
+ ddi_get16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)))
+#define GET32(dev, offset) \
+ ddi_get32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)))
+#define PUT8(dev, offset, v) \
+ ddi_put8(dev->acch, (uint8_t *)(dev->regs + (offset)), v)
+#define PUT16(dev, offset, v) \
+ ddi_put16(dev->acch, (uint16_t *)(void *)(dev->regs + (offset)), v)
+#define PUT32(dev, offset, v) \
+ ddi_put32(dev->acch, (uint32_t *)(void *)(dev->regs + (offset)), v)
+
+#define CLR8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) & ~(v))
+#define SET8(dev, offset, v) PUT8(dev, offset, GET8(dev, offset) | (v))
+#define CLR16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) & ~(v))
+#define SET16(dev, offset, v) PUT16(dev, offset, GET16(dev, offset) | (v))
+
+#define KSINTR(dev) ((kstat_intr_t *)((dev)->ksp->ks_data))
+
+static void audiopci_init_hw(audiopci_dev_t *);
+static void audiopci_init_port(audiopci_port_t *);
+static void audiopci_start_port(audiopci_port_t *);
+static void audiopci_stop_port(audiopci_port_t *);
+static void audiopci_update_port(audiopci_port_t *);
+static uint16_t audiopci_dac_rate(int);
+static int audiopci_add_controls(audiopci_dev_t *);
+static void audiopci_del_controls(audiopci_dev_t *);
+static void audiopci_ak_write(audiopci_dev_t *, uint16_t, uint8_t);
+
+static int
+audiopci_ak_wait(audiopci_dev_t *dev, uint8_t wstat)
+{
+ for (int i = 4000; i; i--) {
+ if (!(GET8(dev, CONC_bCODECSTAT_OFF) & wstat))
+ return (DDI_SUCCESS);
+ drv_usecwait(10);
+ }
+ return (DDI_FAILURE);
+}
+
+static void
+audiopci_ak_idle(audiopci_dev_t *dev)
+{
+ for (int i = 0; i < 5; i++) {
+ if (audiopci_ak_wait(dev, CONC_CSTAT_CSTAT) == DDI_SUCCESS)
+ return;
+ }
+ audio_dev_warn(dev->adev, "timed out waiting for codec to idle");
+}
+
+static void
+audiopci_ak_write(audiopci_dev_t *dev, uint16_t addr, uint8_t data)
+{
+ uint8_t wstat;
+
+ if (dev->suspended)
+ return;
+
+ /* shadow the value */
+ dev->ak_regs[addr] = data;
+
+ wstat = addr == CODEC_RESET_PWRD ? CONC_CSTAT_CWRIP : CONC_CSTAT_CSTAT;
+
+ /* wait for codec to be available */
+ if (audiopci_ak_wait(dev, wstat) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "timeout waiting for codec");
+ }
+
+ PUT16(dev, CONC_wCODECCTL_OFF, (addr << 8) | data);
+}
+
+static void
+audiopci_writemem(audiopci_dev_t *dev, uint32_t page, uint32_t offs,
+ uint32_t data)
+{
+ /* Select memory page */
+ PUT32(dev, CONC_bMEMPAGE_OFF, page);
+ PUT32(dev, offs, data);
+}
+
+static uint32_t
+audiopci_readmem(audiopci_dev_t *dev, uint32_t page, uint32_t offs)
+{
+ PUT32(dev, CONC_bMEMPAGE_OFF, page); /* Select memory page */
+ return (GET32(dev, offs));
+}
+
+static uint_t
+audiopci_intr(caddr_t arg1, caddr_t arg2)
+{
+ audiopci_dev_t *dev = (void *)arg1;
+ int stats;
+ int tmp;
+ unsigned char ackbits = 0;
+ audiopci_port_t *port;
+ audio_engine_t *do_syn, *do_dac, *do_adc;
+
+ _NOTE(ARGUNUSED(arg2));
+
+ /*
+ * NB: The old driver didn't report spurious interrupts. On
+ * a system with shared interrupts (typical!) there will
+ * normally be lots of these (each time the "other" device
+ * interrupts).
+ *
+ * Also, because of the way the interrupt chain handling
+ * works, reporting of spurious interrupts is probably not
+ * terribly useful.
+ *
+ * However, we can count interrupts where the master interrupt
+ * bit is set but none of the ackbits that we are prepared to
+ * process is set. That is probably useful.
+ */
+ mutex_enter(&dev->mutex);
+ if (!dev->enabled) {
+
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ stats = GET32(dev, CONC_dSTATUS_OFF);
+
+ if (!(stats & CONC_INTSTAT_PENDING)) { /* No interrupt pending */
+ mutex_exit(&dev->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ do_syn = do_dac = do_adc = NULL;
+
+ /* synth interrupt */
+ if (stats & CONC_INTSTAT_SYNINT) {
+
+ ackbits |= CONC_SERCTL_SYNIE;
+ port = &dev->port[PORT_SYN];
+ if (port->trigger) {
+ do_syn = port->engine;
+ }
+ }
+
+ /* DAC interrupt */
+ if (stats & CONC_INTSTAT_DACINT) {
+
+ ackbits |= CONC_SERCTL_DACIE;
+ port = &dev->port[PORT_DAC];
+ if (port->trigger) {
+ do_dac = port->engine;
+ }
+ }
+
+ /* ADC interrupt */
+ if (stats & CONC_INTSTAT_ADCINT) {
+
+ ackbits |= CONC_SERCTL_ADCIE;
+ port = &dev->port[PORT_ADC];
+
+ if (port->trigger) {
+ do_adc = port->engine;
+ }
+ }
+
+ /* UART interrupt - we shouldn't get this! */
+ if (stats & CONC_INTSTAT_UARTINT) {
+ uint8_t uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ while (uart_stat & CONC_UART_RXRDY)
+ uart_stat = GET8(dev, CONC_bUARTCSTAT_OFF);
+ }
+
+ /* Ack the interrupt */
+ tmp = GET8(dev, CONC_bSERCTL_OFF);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp & (~ackbits)); /* Clear bits */
+ PUT8(dev, CONC_bSERCTL_OFF, tmp | ackbits); /* Turn them back on */
+
+ if (dev->ksp) {
+ if (ackbits == 0) {
+ KSINTR(dev)->intrs[KSTAT_INTR_SPURIOUS]++;
+ } else {
+ KSINTR(dev)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&dev->mutex);
+
+ if (do_syn)
+ audio_engine_consume(do_syn);
+ if (do_dac)
+ audio_engine_consume(do_dac);
+ if (do_adc)
+ audio_engine_produce(do_adc);
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+
+static int
+audiopci_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+static int
+audiopci_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (2);
+}
+
+static int
+audiopci_rate(void *arg)
+{
+ audiopci_port_t *port = arg;
+
+ return (port->speed);
+}
+
+static void
+audiopci_init_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+ unsigned tmp;
+
+ if (dev->suspended)
+ return;
+
+ switch (port->num) {
+ case PORT_DAC:
+
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_DACCTL_PAGE, CONC_dDACPADDR_OFF,
+ port->paddr);
+
+ /* Set DAC rate */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ /* Set format */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_DAC_16BIT;
+ tmp |= CONC_PCM_DAC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_DACCTL_PAGE, CONC_wDACFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wDACIC_OFF, port->fragfr - 1);
+
+ break;
+
+ case PORT_SYN:
+
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_SYNCTL_PAGE, CONC_dSYNPADDR_OFF,
+ port->paddr);
+
+ /* Set rate - we force to 44.1 kHz */
+ SET8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_SYN_44KHZ);
+
+ /* Set format */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_SYN_16BIT;
+ tmp |= CONC_PCM_SYN_STEREO;
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_SYNCTL_PAGE, CONC_wSYNFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wSYNIC_OFF, port->fragfr - 1);
+
+ break;
+
+ case PORT_ADC:
+ /* Set physical address of the DMA buffer */
+ audiopci_writemem(dev, CONC_ADCCTL_PAGE, CONC_dADCPADDR_OFF,
+ port->paddr);
+
+ /* Set ADC rate */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ /* Set format - for input we only support 16 bit input */
+ tmp = GET8(dev, CONC_bSERFMT_OFF);
+ tmp |= CONC_PCM_ADC_16BIT;
+ tmp |= CONC_PCM_ADC_STEREO;
+
+ PUT8(dev, CONC_bSKIPC_OFF, 0x10);
+
+ PUT8(dev, CONC_bSERFMT_OFF, tmp);
+
+ /* Set the frame count */
+ audiopci_writemem(dev, CONC_ADCCTL_PAGE, CONC_wADCFC_OFF,
+ port->nframes - 1);
+
+ /* Set # of frames between interrupts */
+ PUT16(dev, CONC_wADCIC_OFF, port->fragfr - 1);
+
+ break;
+ }
+
+ port->frameno = 0;
+}
+
+static int
+audiopci_open(void *arg, int flag, unsigned *fragfrp, unsigned *nfragsp,
+ caddr_t *bufp)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+ int intrs;
+
+ _NOTE(ARGUNUSED(flag));
+
+
+ mutex_enter(&dev->mutex);
+ switch (port->num) {
+ case PORT_ADC:
+ intrs = dev->rintrs;
+ break;
+ case PORT_DAC:
+ intrs = dev->pintrs;
+ break;
+ case PORT_SYN:
+ intrs = dev->pintrs;
+ break;
+ }
+
+ /* interrupt at least at 25 Hz, and not more than 250 Hz */
+ intrs = min(250, max(25, intrs));
+
+ /* NB: frame size = 4 (16-bit stereo) */
+ port->fragfr = (port->speed / intrs);
+ port->nfrags = AUDIOPCI_BUF_LEN / (port->fragfr * 4);
+ port->nfrags = max(4, min(port->nfrags, 1024));
+ port->nframes = port->nfrags * port->fragfr;
+ port->trigger = B_FALSE;
+ port->count = 0;
+
+ audiopci_init_port(port);
+
+ *fragfrp = port->fragfr;
+ *nfragsp = port->nfrags;
+ *bufp = port->kaddr;
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audiopci_start_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+
+ if (!dev->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_DAC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DACIE);
+ break;
+ case PORT_SYN:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_SYN_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_SYNIE);
+ break;
+ case PORT_ADC:
+ SET8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ SET8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static void
+audiopci_stop_port(audiopci_port_t *port)
+{
+ audiopci_dev_t *dev = port->dev;
+
+ if (!dev->suspended) {
+ switch (port->num) {
+ case PORT_DAC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_DAC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_DACIE);
+ break;
+ case PORT_SYN:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_SYN_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_SYNIE);
+ break;
+ case PORT_ADC:
+ CLR8(dev, CONC_bDEVCTL_OFF, CONC_DEVCTL_ADC_EN);
+ CLR8(dev, CONC_bSERCTL_OFF, CONC_SERCTL_ADCIE);
+ break;
+ }
+ }
+}
+
+static int
+audiopci_start(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (!port->trigger) {
+ port->trigger = B_TRUE;
+ audiopci_start_port(port);
+ }
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static void
+audiopci_stop(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+
+ mutex_enter(&dev->mutex);
+ if (port->trigger) {
+ port->trigger = B_FALSE;
+ audiopci_stop_port(port);
+ }
+ mutex_exit(&dev->mutex);
+}
+
+static void
+audiopci_update_port(audiopci_port_t *port)
+{
+ uint32_t page, offs;
+ int frameno, n;
+
+ switch (port->num) {
+ case PORT_DAC:
+ page = CONC_DACCTL_PAGE;
+ offs = CONC_wDACFC_OFF;
+ break;
+
+ case PORT_SYN:
+ page = CONC_SYNCTL_PAGE;
+ offs = CONC_wSYNFC_OFF;
+ break;
+
+ case PORT_ADC:
+ page = CONC_ADCCTL_PAGE;
+ offs = CONC_wADCFC_OFF;
+ break;
+ }
+
+ /*
+ * Note that the current frame counter is in the high nybble.
+ */
+ frameno = audiopci_readmem(port->dev, page, offs) >> 16;
+ n = frameno >= port->frameno ?
+ frameno - port->frameno :
+ frameno + port->nframes - port->frameno;
+ port->frameno = frameno;
+ port->count += n;
+}
+
+static uint64_t
+audiopci_count(void *arg)
+{
+ audiopci_port_t *port = arg;
+ audiopci_dev_t *dev = port->dev;
+ uint64_t val;
+
+ mutex_enter(&dev->mutex);
+ if (!dev->suspended) {
+ audiopci_update_port(port);
+ }
+ val = port->count;
+ mutex_exit(&dev->mutex);
+ return (val);
+}
+
+static void
+audiopci_close(void *arg)
+{
+ audiopci_port_t *port = arg;
+
+ audiopci_stop(port);
+}
+
+static void
+audiopci_sync(void *arg, unsigned nframes)
+{
+ audiopci_port_t *port = arg;
+
+ _NOTE(ARGUNUSED(nframes));
+
+ if (port->num == PORT_ADC) {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORCPU);
+ } else {
+ (void) ddi_dma_sync(port->dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+ }
+}
+
+static size_t
+audiopci_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ /*
+ * There is actually a small FIFO with 64 bytes -- 16 samples --
+ * onboard, but it is probably not worth the effort to report it,
+ * and the FIFO will not always be full.
+ */
+ return (0);
+}
+
+audio_engine_ops_t audiopci_engine_ops = {
+ AUDIO_ENGINE_VERSION, /* version number */
+ audiopci_open,
+ audiopci_close,
+ audiopci_start,
+ audiopci_stop,
+ audiopci_count,
+ audiopci_format,
+ audiopci_channels,
+ audiopci_rate,
+ audiopci_sync,
+ audiopci_qlen,
+ NULL,
+};
+
+static uint16_t
+audiopci_dac_rate(int samPerSec)
+{
+ unsigned short usTemp;
+
+ /* samPerSec /= 2; */
+
+ usTemp = (unsigned short) ((DAC_CLOCK_DIVIDE / 8) / samPerSec);
+
+ if (usTemp & 0x00000001) {
+ usTemp >>= 1;
+ usTemp -= 1;
+ } else {
+ usTemp >>= 1;
+ usTemp -= 2;
+ }
+ return (usTemp);
+}
+
+void
+audiopci_init_hw(audiopci_dev_t *dev)
+{
+ int tmp;
+
+ /* setup DAC frequency */
+ PUT16(dev, CONC_wDACRATE_OFF, audiopci_dac_rate(48000));
+
+ CLR8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_CCB_INTRM);
+ SET8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_SYN_44KHZ);
+
+ /* Turn on CODEC (UART and joystick left disabled) */
+ tmp = GET8(dev, CONC_bDEVCTL_OFF);
+ tmp |= CONC_DEVCTL_SERR_DIS;
+ tmp |= CONC_DEVCTL_CODEC_EN;
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ /* Reset the UART */
+ PUT8(dev, CONC_bUARTCSTAT_OFF, 0x00);
+
+ /* Disable NMI */
+ PUT8(dev, CONC_bNMIENA_OFF, 0);
+ PUT16(dev, CONC_wNMISTAT_OFF, 0);
+
+ /* Initialize serial interface */
+ PUT8(dev, CONC_bSERCTL_OFF, 0);
+ PUT8(dev, CONC_bSERFMT_OFF,
+ CONC_PCM_SYN_STEREO | CONC_PCM_SYN_16BIT);
+
+ /* Unmute codec */
+ CLR8(dev, CONC_bMISCCTL_OFF, CONC_MISCCTL_MUTE);
+
+ /* mixer initialization */
+ audiopci_ak_idle(dev);
+
+ /* power/reset down the codec */
+ audiopci_ak_write(dev, CODEC_RESET_PWRD, 0);
+ drv_usecwait(10);
+
+ /* now powerup and bring out of reset */
+ audiopci_ak_write(dev, CODEC_RESET_PWRD, 0x3);
+ audiopci_ak_idle(dev);
+
+ /* enable PLL for DAC2 */
+ audiopci_ak_write(dev, CODEC_CLKSELECT, 0);
+
+ /* select input mixer */
+ audiopci_ak_write(dev, CODEC_ADSELECT, 0);
+
+ /* mark FM for output mixer */
+ audiopci_ak_write(dev, CODEC_OUT_SW1, CODEC_OUT_ENABLE_SYNTH);
+ audiopci_ak_write(dev, CODEC_OUT_SW2, CODEC_OUT_ENABLE_WAVE);
+
+ /* initialize some reasonable values for the WAVE and SYNTH inputs */
+ audiopci_ak_write(dev, CODEC_VOL_WAVE_L, 6);
+ audiopci_ak_write(dev, CODEC_VOL_WAVE_R, 6);
+ audiopci_ak_write(dev, CODEC_VOL_SYNTH_L, 6);
+ audiopci_ak_write(dev, CODEC_VOL_SYNTH_R, 6);
+
+ /* enable microphone phantom power */
+ if (dev->micbias) {
+ SET16(dev, 2, CONC_DEVCTL_MICBIAS);
+ }
+
+ dev->enabled = B_TRUE;
+}
+
+static int
+audiopci_init(audiopci_dev_t *dev)
+{
+ dev->micbias = 1;
+
+ audiopci_init_hw(dev);
+
+ dev->pintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "play-interrupts", DEFINTS);
+
+ dev->rintrs = ddi_prop_get_int(DDI_DEV_T_ANY, dev->dip,
+ DDI_PROP_DONTPASS, "record-interrupts", DEFINTS);
+
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audiopci_port_t *port;
+ unsigned caps;
+ unsigned dmaflags;
+ size_t rlen;
+ ddi_dma_cookie_t c;
+ unsigned ccnt;
+
+ port = &dev->port[i];
+ port->dev = dev;
+
+ switch (i) {
+ case PORT_SYN:
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ port->speed = 44100;
+ break;
+
+ case PORT_DAC:
+ caps = ENGINE_OUTPUT_CAP;
+ dmaflags = DDI_DMA_WRITE | DDI_DMA_CONSISTENT;
+ port->speed = 48000;
+ break;
+
+ case PORT_ADC:
+ caps = ENGINE_INPUT_CAP;
+ dmaflags = DDI_DMA_READ | DDI_DMA_CONSISTENT;
+ port->speed = 48000;
+ break;
+ }
+
+ port->num = i;
+
+ /*
+ * Allocate DMA resources.
+ */
+
+ if (ddi_dma_alloc_handle(dev->dip, &dma_attr, DDI_DMA_SLEEP,
+ NULL, &port->dmah) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma handle allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ if (ddi_dma_mem_alloc(port->dmah, AUDIOPCI_BUF_LEN, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->kaddr,
+ &rlen, &port->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma memory allocation failed", i);
+ return (DDI_FAILURE);
+ }
+ /* ensure that the buffer is zeroed out properly */
+ bzero(port->kaddr, rlen);
+ if (ddi_dma_addr_bind_handle(port->dmah, NULL, port->kaddr,
+ AUDIOPCI_BUF_LEN, dmaflags, DDI_DMA_SLEEP, NULL,
+ &c, &ccnt) != DDI_DMA_MAPPED) {
+ audio_dev_warn(dev->adev,
+ "port %d: dma binding failed", i);
+ return (DDI_FAILURE);
+ }
+ port->paddr = c.dmac_address;
+
+ /*
+ * Allocate and configure audio engine.
+ */
+ port->engine = audio_engine_alloc(&audiopci_engine_ops, caps);
+ if (port->engine == NULL) {
+ audio_dev_warn(dev->adev,
+ "port %d: audio_engine_alloc failed", i);
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->engine, port);
+ audio_dev_add_engine(dev->adev, port->engine);
+ }
+
+ /*
+ * Register audio controls.
+ */
+ if (audiopci_add_controls(dev) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Set up kstats for interrupt reporting.
+ */
+ dev->ksp = kstat_create(ddi_driver_name(dev->dip),
+ ddi_get_instance(dev->dip), ddi_driver_name(dev->dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (dev->ksp != NULL) {
+ kstat_install(dev->ksp);
+ }
+
+ if (audio_dev_register(dev->adev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev,
+ "unable to register with audio framework");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audiopci_setup_interrupts(audiopci_dev_t *dev)
+{
+ int actual;
+ uint_t ipri;
+
+ if ((ddi_intr_alloc(dev->dip, dev->ihandle, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) ||
+ (actual != 1)) {
+ audio_dev_warn(dev->adev, "can't alloc intr handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(dev->ihandle[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't determine intr priority");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(dev->ihandle[0], audiopci_intr, dev,
+ NULL) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't add intr handler");
+ (void) ddi_intr_free(dev->ihandle[0]);
+ dev->ihandle[0] = NULL;
+ return (DDI_FAILURE);
+ }
+
+ mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+
+ return (DDI_SUCCESS);
+}
+
+void
+audiopci_destroy(audiopci_dev_t *dev)
+{
+ int i;
+
+ if (dev->ihandle[0] != NULL) {
+ (void) ddi_intr_disable(dev->ihandle[0]);
+ (void) ddi_intr_remove_handler(dev->ihandle[0]);
+ (void) ddi_intr_free(dev->ihandle[0]);
+ mutex_destroy(&dev->mutex);
+ }
+
+ if (dev->ksp != NULL) {
+ kstat_delete(dev->ksp);
+ }
+
+ /* free up ports, including DMA resources for ports */
+ for (i = 0; i <= PORT_MAX; i++) {
+ audiopci_port_t *port = &dev->port[i];
+
+ if (port->paddr != 0)
+ (void) ddi_dma_unbind_handle(port->dmah);
+ if (port->acch != NULL)
+ ddi_dma_mem_free(&port->acch);
+ if (port->dmah != NULL)
+ ddi_dma_free_handle(&port->dmah);
+
+ if (port->engine != NULL) {
+ audio_dev_remove_engine(dev->adev, port->engine);
+ audio_engine_free(port->engine);
+ }
+ }
+
+ if (dev->acch != NULL) {
+ ddi_regs_map_free(&dev->acch);
+ }
+
+ audiopci_del_controls(dev);
+
+ if (dev->adev != NULL) {
+ audio_dev_free(dev->adev);
+ }
+
+ kmem_free(dev, sizeof (*dev));
+}
+
+static void
+audiopci_stereo(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t lreg)
+{
+ uint8_t lval, rval;
+ uint8_t lmute, rmute;
+ uint64_t val;
+ uint8_t rreg;
+
+ rreg = lreg + 1;
+ val = dev->controls[num].val;
+ lval = (val & 0xff00) >> 8;
+ rval = val & 0xff;
+
+ lmute = lval ? 0 : CODEC_ATT_MUTE;
+ rmute = rval ? 0 : CODEC_ATT_MUTE;
+
+ /* convert to attenuation & apply mute if appropriate */
+ lval = ((((100U - lval) * CODEC_ATT_MAX) / 100) & 0xff) | lmute;
+ rval = ((((100U - rval) * CODEC_ATT_MAX) / 100) & 0xff) | rmute;
+
+ audiopci_ak_write(dev, lreg, lval);
+ audiopci_ak_write(dev, rreg, rval);
+}
+
+static void
+audiopci_mono(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t reg)
+{
+ uint64_t val = (dev->controls[num].val & 0xff);
+ uint8_t mute;
+
+ mute = val ? 0 : CODEC_ATT_MUTE;
+ val = ((((100U - val) * CODEC_ATT_MAX) / 100) & 0xff) | mute;
+
+ audiopci_ak_write(dev, reg, val);
+}
+
+static void
+audiopci_mono8(audiopci_dev_t *dev, audiopci_ctrl_num_t num, uint8_t reg)
+{
+ uint64_t val = (dev->controls[num].val & 0xff);
+ uint8_t mute;
+
+ mute = val ? 0 : CODEC_ATT_MUTE;
+ val = ((((100U - val) * CODEC_ATT_MONO) / 100) & 0xff) | mute;
+
+ audiopci_ak_write(dev, reg, val);
+}
+
+static int
+audiopci_get_value(void *arg, uint64_t *val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ mutex_enter(&dev->mutex);
+ *val = pc->val;
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static void
+audiopci_configure_output(audiopci_dev_t *dev)
+{
+ uint64_t val;
+ uint8_t tmp;
+
+ /* PCM/Wave level */
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_WAVE_L);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_WAVE_R);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_SYNTH_L);
+ audiopci_mono(dev, CTL_VOLUME, CODEC_VOL_SYNTH_R);
+
+ /* front & mono outputs */
+ audiopci_stereo(dev, CTL_FRONT, CODEC_VOL_MASTER_L);
+ audiopci_mono8(dev, CTL_MONO, CODEC_VOL_MONO);
+
+ val = dev->controls[CTL_MONSRC].val;
+
+ /* setup output monitoring as well */
+ tmp = CODEC_OUT_ENABLE_SYNTH;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_OUT_ENABLE_MIC;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_OUT_ENABLE_CD;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_OUT_ENABLE_AUX;
+ audiopci_ak_write(dev, CODEC_OUT_SW1, tmp);
+
+ tmp = CODEC_OUT_ENABLE_WAVE;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_OUT_ENABLE_TV;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_OUT_ENABLE_TAD;
+ audiopci_ak_write(dev, CODEC_OUT_SW2, tmp);
+}
+
+static void
+audiopci_configure_input(audiopci_dev_t *dev)
+{
+ uint64_t val = dev->controls[CTL_RECSRC].val;
+ uint8_t tmp;
+
+ tmp = 0;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_IN_ENABLE_AUX_L;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_IN_ENABLE_CD_L;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_MIC;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_IN_ENABLE_TAD;
+ audiopci_ak_write(dev, CODEC_LIN_SW1, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_LINEIN))
+ tmp |= CODEC_IN_ENABLE_AUX_R;
+ if (val & (1U << INPUT_CD))
+ tmp |= CODEC_IN_ENABLE_CD_R;
+ if (val & (1U << INPUT_PHONE))
+ tmp |= CODEC_IN_ENABLE_TAD;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_MIC;
+ audiopci_ak_write(dev, CODEC_RIN_SW1, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_IN_ENABLE_TV_L;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_TMIC;
+ audiopci_ak_write(dev, CODEC_LIN_SW2, tmp);
+
+ tmp = 0;
+ if (val & (1U << INPUT_VIDEO))
+ tmp |= CODEC_IN_ENABLE_TV_R;
+ if (val & (1U << INPUT_MIC))
+ tmp |= CODEC_IN_ENABLE_TMIC;
+ audiopci_ak_write(dev, CODEC_RIN_SW2, tmp);
+
+ /* configure volumes */
+ audiopci_mono(dev, CTL_MIC, CODEC_VOL_MIC);
+ audiopci_mono(dev, CTL_PHONE, CODEC_VOL_TAD);
+ audiopci_stereo(dev, CTL_LINE, CODEC_VOL_AUX_L);
+ audiopci_stereo(dev, CTL_CD, CODEC_VOL_CD_L);
+ audiopci_stereo(dev, CTL_VID, CODEC_VOL_TV_L);
+
+ /* activate 30dB mic boost */
+ audiopci_ak_write(dev, CODEC_MICBOOST,
+ dev->controls[CTL_MICBOOST].val ? 1 : 0);
+}
+
+static int
+audiopci_set_reclevel(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+ uint8_t l;
+ uint8_t r;
+
+ l = (val & 0xff00) >> 8;
+ r = val & 0xff;
+
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_micboost(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_monsrc(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ if ((val & ~INSRCS) != 0)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_recsrc(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ if ((val & ~INSRCS) != 0)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_input(dev);
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_volume(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ val &= 0xff;
+ if (val > 100)
+ return (EINVAL);
+
+ val = (val & 0xff) | ((val & 0xff) << 8);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+ mutex_exit(&dev->mutex);
+
+ return (0);
+}
+
+static int
+audiopci_set_front(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+ uint8_t l;
+ uint8_t r;
+
+ l = (val & 0xff00) >> 8;
+ r = val & 0xff;
+
+ if ((l > 100) || (r > 100))
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+static int
+audiopci_set_speaker(void *arg, uint64_t val)
+{
+ audiopci_ctrl_t *pc = arg;
+ audiopci_dev_t *dev = pc->dev;
+
+ val &= 0xff;
+
+ if (val > 100)
+ return (EINVAL);
+
+ mutex_enter(&dev->mutex);
+ pc->val = val;
+ audiopci_configure_output(dev);
+
+ mutex_exit(&dev->mutex);
+ return (0);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+
+static void
+audiopci_alloc_ctrl(audiopci_dev_t *dev, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ audiopci_ctrl_t *pc;
+
+ bzero(&desc, sizeof (desc));
+
+ pc = &dev->controls[num];
+ pc->num = num;
+ pc->dev = dev;
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiopci_set_volume;
+ break;
+
+ case CTL_FRONT:
+ desc.acd_name = AUDIO_CTRL_ID_LINEOUT;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiopci_set_front;
+ break;
+
+ case CTL_MONO:
+ desc.acd_name = AUDIO_CTRL_ID_SPEAKER;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MAINVOL;
+ fn = audiopci_set_speaker;
+ break;
+
+ case CTL_MIC:
+ desc.acd_name = AUDIO_CTRL_ID_MIC;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_LINE:
+ desc.acd_name = AUDIO_CTRL_ID_LINEIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_CD:
+ desc.acd_name = AUDIO_CTRL_ID_CD;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_VID:
+ desc.acd_name = AUDIO_CTRL_ID_VIDEO;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_PHONE:
+ desc.acd_name = AUDIO_CTRL_ID_PHONE;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiopci_set_reclevel;
+ break;
+
+ case CTL_RECSRC:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = INSRCS;
+ desc.acd_maxvalue = INSRCS;
+ desc.acd_flags = RECCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiopci_insrcs[i]; i++) {
+ desc.acd_enum[i] = audiopci_insrcs[i];
+ }
+ fn = audiopci_set_recsrc;
+ break;
+
+ case CTL_MONSRC:
+ desc.acd_name = AUDIO_CTRL_ID_MONSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = INSRCS;
+ desc.acd_maxvalue = INSRCS;
+ desc.acd_flags = MONCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiopci_insrcs[i]; i++) {
+ desc.acd_enum[i] = audiopci_insrcs[i];
+ }
+ fn = audiopci_set_monsrc;
+ break;
+
+ case CTL_MICBOOST:
+ desc.acd_name = AUDIO_CTRL_ID_MICBOOST;
+ desc.acd_type = AUDIO_CTRL_TYPE_BOOLEAN;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECCTL;
+ fn = audiopci_set_micboost;
+ break;
+ }
+
+ pc->val = val;
+ pc->ctrl = audio_dev_add_control(dev->adev, &desc,
+ audiopci_get_value, fn, pc);
+}
+
+static int
+audiopci_add_controls(audiopci_dev_t *dev)
+{
+ audiopci_alloc_ctrl(dev, CTL_VOLUME, 75);
+ audiopci_alloc_ctrl(dev, CTL_FRONT, ((75) | (75 << 8)));
+ audiopci_alloc_ctrl(dev, CTL_MONO, 75);
+ audiopci_alloc_ctrl(dev, CTL_MIC, 50);
+ audiopci_alloc_ctrl(dev, CTL_LINE, 0);
+ audiopci_alloc_ctrl(dev, CTL_CD, 0);
+ audiopci_alloc_ctrl(dev, CTL_VID, 0);
+ audiopci_alloc_ctrl(dev, CTL_PHONE, 0);
+ audiopci_alloc_ctrl(dev, CTL_RECSRC, (1U << INPUT_MIC));
+ audiopci_alloc_ctrl(dev, CTL_MONSRC, 0);
+ audiopci_alloc_ctrl(dev, CTL_MICBOOST, 1);
+
+ audiopci_configure_output(dev);
+ audiopci_configure_input(dev);
+
+ return (DDI_SUCCESS);
+}
+
+void
+audiopci_del_controls(audiopci_dev_t *dev)
+{
+ for (int i = 0; i < CTL_NUM; i++) {
+ if (dev->controls[i].ctrl) {
+ audio_dev_del_control(dev->controls[i].ctrl);
+ }
+ }
+}
+
+int
+audiopci_attach(dev_info_t *dip)
+{
+ uint16_t pci_command, vendor, device;
+ audiopci_dev_t *dev;
+ ddi_acc_handle_t pcih;
+
+ dev = kmem_zalloc(sizeof (*dev), KM_SLEEP);
+ dev->dip = dip;
+ ddi_set_driver_private(dip, dev);
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "pci_config_setup failed");
+ kmem_free(dev, sizeof (*dev));
+ return (DDI_FAILURE);
+ }
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+
+ if ((vendor != ENSONIQ_VENDOR_ID && vendor != CREATIVE_VENDOR_ID) ||
+ (device != ENSONIQ_ES1370))
+ goto err_exit;
+
+ dev->devid = device;
+
+ dev->adev = audio_dev_alloc(dip, 0);
+ if (dev->adev == NULL) {
+ goto err_exit;
+ }
+
+ audio_dev_set_description(dev->adev, "AudioPCI");
+ audio_dev_set_version(dev->adev, "ES1370");
+ audio_dev_add_info(dev->adev, "Legacy codec: Asahi Kasei AK4531");
+
+ /* activate the device */
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ /* map registers */
+ if (ddi_regs_map_setup(dip, 1, &dev->regs, 0, 0, &acc_attr,
+ &dev->acch) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't map registers");
+ goto err_exit;
+ }
+
+ if (audiopci_setup_interrupts(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't register interrupts");
+ goto err_exit;
+ }
+
+ /* This allocates and configures the engines */
+ if (audiopci_init(dev) != DDI_SUCCESS) {
+ audio_dev_warn(dev->adev, "can't init device");
+ goto err_exit;
+ }
+
+ (void) ddi_intr_enable(dev->ihandle[0]);
+
+ pci_config_teardown(&pcih);
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+err_exit:
+ pci_config_teardown(&pcih);
+
+ audiopci_destroy(dev);
+
+ return (DDI_FAILURE);
+}
+
+int
+audiopci_detach(audiopci_dev_t *dev)
+{
+ int tmp;
+
+ /* first unregister us from the DDI framework, might be busy */
+ if (audio_dev_unregister(dev->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ mutex_enter(&dev->mutex);
+
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DACIE | CONC_SERCTL_SYNIE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_SYN_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ dev->enabled = B_FALSE;
+
+ mutex_exit(&dev->mutex);
+
+ audiopci_destroy(dev);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_resume(audiopci_dev_t *dev)
+{
+ /* ask framework to reset/relocate engine data */
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audio_engine_reset(dev->port[i].engine);
+ }
+
+ mutex_enter(&dev->mutex);
+ dev->suspended = B_FALSE;
+
+ /* reinitialize hardware */
+ audiopci_init_hw(dev);
+
+ /* restore mixer settings */
+ audiopci_configure_output(dev);
+ audiopci_configure_input(dev);
+
+ /* restart ports */
+ for (int i = 0; i < PORT_MAX; i++) {
+ audiopci_port_t *port = &dev->port[i];
+ audiopci_init_port(port);
+ /* possibly start it up if was going when we suspended */
+ if (port->trigger) {
+ audiopci_start_port(port);
+
+ /* signal callbacks on resume */
+ if (port->num == PORT_ADC) {
+ audio_engine_produce(port->engine);
+ } else {
+ audio_engine_consume(port->engine);
+ }
+ }
+ }
+ mutex_exit(&dev->mutex);
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_suspend(audiopci_dev_t *dev)
+{
+ /*
+ * Stop all engines/DMA data.
+ */
+ mutex_enter(&dev->mutex);
+ for (int i = 0; i <= PORT_MAX; i++) {
+ audiopci_stop_port(&dev->port[i]);
+ audiopci_update_port(&dev->port[i]);
+ }
+ dev->suspended = B_TRUE;
+ dev->enabled = B_FALSE;
+ mutex_exit(&dev->mutex);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audiopci_quiesce(dev_info_t *dip)
+{
+ audiopci_dev_t *dev;
+ uint8_t tmp;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* This disables all DMA engines and interrupts */
+ tmp = GET8(dev, CONC_bSERCTL_OFF) &
+ ~(CONC_SERCTL_DACIE | CONC_SERCTL_SYNIE | CONC_SERCTL_ADCIE);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+ PUT8(dev, CONC_bSERCTL_OFF, tmp);
+
+ tmp = GET8(dev, CONC_bDEVCTL_OFF) &
+ ~(CONC_DEVCTL_DAC_EN | CONC_DEVCTL_ADC_EN | CONC_DEVCTL_SYN_EN);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+ PUT8(dev, CONC_bDEVCTL_OFF, tmp);
+
+ return (DDI_SUCCESS);
+}
+
+
+static int
+audiopci_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audiopci_dev_t *dev;
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audiopci_attach(dip));
+
+ case DDI_RESUME:
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+ return (audiopci_resume(dev));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static int
+audiopci_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audiopci_dev_t *dev;
+
+ if ((dev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audiopci_detach(dev));
+
+ case DDI_SUSPEND:
+ return (audiopci_suspend(dev));
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+static struct dev_ops audiopci_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audiopci_ddi_attach, /* attach */
+ audiopci_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ audiopci_quiesce, /* quiesce */
+};
+
+static struct modldrv audiopci_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Ensoniq 1370 Audio", /* linkinfo */
+ &audiopci_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &audiopci_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiopci_dev_ops, DRVNAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&audiopci_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&audiopci_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf
new file mode 100644
index 0000000000..ca6a4c8726
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.conf
@@ -0,0 +1,46 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audiopci audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audiopci
+# driver enforces a maximum and minimum count.
+#
+# It should also be understood that not all interrupt rates are legal.
+# The hardware is restricted to DMA buffers being allocated on certain
+# boundaries. If those boundaries are violated then the value specified
+# will be ignored.
+#
+play-interrupts=75;
+record-interrupts=75;
diff --git a/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h
new file mode 100644
index 0000000000..c922dc2cc4
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiopci/audiopci.h
@@ -0,0 +1,233 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * Purpose: Definitions for the Creative/Ensoniq AudioPCI97 driver.
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#ifndef _AUDIOPCI_H
+#define _AUDIOPCI_H
+
+/* CONCERT PCI-SIG defines */
+#define CONC_PCI_VENDID 0x1274U
+#define CONC_PCI_DEVID 0x5000U
+
+/* used for the development board only!! */
+#define CONC_DEV_PCI_VENDID 0x1274U
+#define CONC_DEV_PCI_DEVID 0x5000U
+
+
+/*
+ * CONCERT Registers
+ */
+
+#define DAC_CLOCK_DIVIDE 22579200UL /* DAC2 (CODEC) clock divide */
+
+/* Concert direct register offset defines */
+
+#define CONC_bDEVCTL_OFF 0x00 /* Device control/enable */
+#define CONC_bMISCCTL_OFF 0x01 /* Miscellaneous control */
+#define CONC_wDACRATE_OFF 0x02 /* CODEC clock divider for PLL */
+#define CONC_dSTATUS_OFF 0x04 /* long status register */
+#define CONC_bCODECSTAT_OFF 0x05 /* CODEC interface status */
+#define CONC_bUARTDATA_OFF 0x08 /* UART data R/W - read clears RX int */
+#define CONC_bUARTCSTAT_OFF 0x09 /* UART control and status */
+#define CONC_bMEMPAGE_OFF 0x0c /* Memory page select */
+#define CONC_wCODECCTL_OFF 0x10 /* CODEC control - word-write-only */
+#define CONC_wNMISTAT_OFF 0x18 /* Legacy NMI status */
+#define CONC_bNMIENA_OFF 0x1a /* Legacy NMI enable */
+#define CONC_bNMICTL_OFF 0x1b /* Legacy control */
+#define CONC_bSERFMT_OFF 0x20 /* Serial device control */
+#define CONC_bSERCTL_OFF 0x21 /* Serial device format */
+#define CONC_bSKIPC_OFF 0x22 /* Skip counts for DAC (wave) */
+#define CONC_wSYNIC_OFF 0x24 /* Synth int count in sample frames */
+#define CONC_wSYNCIC_OFF 0x26 /* Synth current int count */
+#define CONC_wDACIC_OFF 0x28 /* DAC int count in sample frames */
+#define CONC_wDACCIC_OFF 0x2a /* DAC current int count */
+#define CONC_wADCIC_OFF 0x2c /* ADC int count in sample frames */
+#define CONC_wADCCIC_OFF 0x2e /* ADC current int count */
+#define CONC_MEMBASE_OFF 0x30 /* Memory window base - 16 bytes */
+
+/* Device Control defines */
+#define CONC_DEVCTL_SERR_DIS 0x01 /* internal PCI serr bus enable */
+#define CONC_DEVCTL_CODEC_EN 0x02 /* CoDec Enable */
+#define CONC_DEVCTL_JSTICK_EN 0x04 /* Joystick Enable */
+#define CONC_DEVCTL_UART_EN 0x08 /* UART Enable */
+#define CONC_DEVCTL_ADC_EN 0x10 /* ADC Enable (record) */
+#define CONC_DEVCTL_DAC_EN 0x20 /* DAC Enable (playback) */
+#define CONC_DEVCTL_SYN_EN 0x40 /* Synth Enable */
+#define CONC_DEVCTL_MICBIAS 0x4000L /* mic bias switch */
+
+/* Misc Control defines */
+#define CONC_MISCCTL_MUTE 0x01 /* XTL0 wired to mute */
+#define CONC_MISCCTL_CCB_INTRM 0x04 /* CCB interrupt mask */
+#define CONC_MISCCTL_SYN_5KHZ 0x00 /* synth: 5512 Hz */
+#define CONC_MISCCTL_SYN_11KHZ 0x10 /* synth: 11025 Hz */
+#define CONC_MISCCTL_SYN_22KHZ 0x20 /* synth: 22050 Hz */
+#define CONC_MISCCTL_SYN_44KHZ 0x30 /* synth: 44100 Hz */
+
+/* Interrupt Status defines */
+#define CONC_INTSTAT_ADCINT 0x01 /* A/D interrupt pending bit */
+#define CONC_INTSTAT_DACINT 0x02 /* DAC interrupt pending bit */
+#define CONC_INTSTAT_SYNINT 0x04 /* synth interrupt pending bit */
+#define CONC_INTSTAT_UARTINT 0x08 /* UART interrupt pending bit */
+#define CONC_INTSTAT_PENDING 0x80000000
+ /* this bit set high while'st we have an interrupt */
+
+/* Codec Status defines */
+#define CONC_CSTAT_CSTAT 0x4
+#define CONC_CSTAT_CBUSY 0x2
+#define CONC_CSTAT_CWRIP 0x1
+
+/* SERFMT PCM format defines */
+#define CONC_PCM_SYN_STEREO 0x01
+#define CONC_PCM_SYN_16BIT 0x02
+#define CONC_PCM_DAC_STEREO 0x04
+#define CONC_PCM_DAC_16BIT 0x08
+#define CONC_PCM_ADC_STEREO 0x10
+#define CONC_PCM_ADC_16BIT 0x20
+
+/* Serial Control defines */
+#define CONC_SERCTL_SYNIE 0x01 /* synth int enable */
+#define CONC_SERCTL_DACIE 0x02 /* playback interrupt enable */
+#define CONC_SERCTL_ADCIE 0x04 /* record interrupt enable */
+#define CONC_SERCTL_SYNPAUSE 0x10 /* playback pause */
+
+/* Concert memory page-banked register offset defines */
+#define CONC_dSYNPADDR_OFF 0x30 /* Synth host frame PCI phys addr */
+#define CONC_wSYNFC_OFF 0x34 /* Synth host frame count in DWORDS */
+#define CONC_wSYNCFC_OFF 0x36 /* Synth host current frame count */
+#define CONC_dDACPADDR_OFF 0x38 /* DAC host frame PCI phys addr */
+#define CONC_wDACFC_OFF 0x3c /* DAC host frame count in DWORDS */
+#define CONC_wDACCFC_OFF 0x3e /* DAC host current frame count */
+#define CONC_dADCPADDR_OFF 0x30 /* ADC host frame PCI phys addr */
+#define CONC_wADCFC_OFF 0x34 /* ADC host frame count in DWORDS */
+#define CONC_wADCCFC_OFF 0x36 /* ADC host current frame count */
+
+/* Concert memory page number defines */
+#define CONC_SYNRAM_PAGE 0x00 /* Synth host/serial I/F RAM */
+#define CONC_DACRAM_PAGE 0x04 /* DAC host/serial I/F RAM */
+#define CONC_ADCRAM_PAGE 0x08 /* ADC host/serial I/F RAM */
+#define CONC_SYNCTL_PAGE 0x0c /* Page bank for synth host control */
+#define CONC_DACCTL_PAGE 0x0c /* Page bank for DAC host control */
+#define CONC_ADCCTL_PAGE 0x0d /* Page bank for ADC host control */
+#define CONC_FIFO0_PAGE 0x0e /* page 0 of UART "FIFO" (rx stash) */
+#define CONC_FIFO1_PAGE 0x0f /* page 1 of UART "FIFO" (rx stash) */
+
+/* UARTCSTAT register masks */
+#define CONC_UART_RXRDY 0x01
+#define CONC_UART_TXRDY 0x02
+#define CONC_UART_TXINT 0x04
+#define CONC_UART_RXINT 0x80
+
+#define CONC_UART_CTL 0x03
+#define CONC_UART_TXINTEN 0x20
+#define CONC_UART_RXINTEN 0x80
+
+/*
+ * CODEC register map
+ */
+#define NUMREGS 32 /* total number of registers */
+#define NUMVOLS 16 /* number of vol regs */
+
+/* Source and output volume control defines */
+#define CODEC_VOL_MASTER_L 0x00U /* Master out, left */
+#define CODEC_VOL_MASTER_R 0x01U /* Master out, right */
+#define CODEC_VOL_WAVE_L 0x02U /* Wave DAC, left */
+#define CODEC_VOL_WAVE_R 0x03U /* Wave DAC, right */
+#define CODEC_VOL_SYNTH_L 0x04U /* Synth DAC, left */
+#define CODEC_VOL_SYNTH_R 0x05U /* Synth DAC, right */
+#define CODEC_VOL_CD_L 0x06U /* CD audio, left */
+#define CODEC_VOL_CD_R 0x07U /* CD audio, right */
+#define CODEC_VOL_AUX_L 0x08U /* Aux line source, left */
+#define CODEC_VOL_AUX_R 0x09U /* Aux line source, right */
+#define CODEC_VOL_TV_L 0x0aU /* TV Tuner, left */
+#define CODEC_VOL_TV_R 0x0bU /* TV Tuner, right */
+#define CODEC_VOL_TAD 0x0cU /* TAD monitor, mono */
+#define CODEC_VOL_MONO2 0x0dU /* Unused MONO2 */
+#define CODEC_VOL_MIC 0x0eU /* Mic, mono */
+#define CODEC_VOL_MONO 0x0fU /* Mono out volume */
+
+/* Input bus enable defines -SW1 */
+#define CODEC_IN_ENABLE_MIC 0x01U /* Mic enable, mono */
+#define CODEC_IN_ENABLE_CD_R 0x02U /* CD audio enable, right */
+#define CODEC_IN_ENABLE_CD_L 0x04U /* CD audio enable, left */
+#define CODEC_IN_ENABLE_AUX_R 0x08U /* Aux line source enable, right */
+#define CODEC_IN_ENABLE_AUX_L 0x10U /* Aux line source enable, left */
+#define CODEC_IN_ENABLE_SYNTH_R 0x20U /* Synth DAC enable, right */
+#define CODEC_IN_ENABLE_SYNTH_L 0x40U /* Synth DAC enable, left */
+
+/* Input bus enable defines - SW2 */
+#define CODEC_IN_ENABLE_TAD 0x01U /* TAD monitor enable, mono */
+#define CODEC_IN_ENABLE_MONO2 0x02U /* Unused MONO2 enable, mono */
+#define CODEC_IN_ENABLE_WAVE 0x04U /* Wave DAC enable */
+#define CODEC_IN_ENABLE_TV_R 0x08U /* TV Tuner enable, right */
+#define CODEC_IN_ENABLE_TV_L 0x10U /* TV Tuner enable, left */
+#define CODEC_IN_ENABLE_TMONO2 0x20U /* unboosted MONO2 */
+#define CODEC_IN_ENABLE_TMONO1 0x40U /* unboosted MONO1 */
+#define CODEC_IN_ENABLE_TMIC 0x80U /* unboosted MONO3 (mic) */
+
+/* Output bus enable defines - SW1 */
+#define CODEC_OUT_ENABLE_MIC 0x01U /* Mic enable, mono */
+#define CODEC_OUT_ENABLE_CD 0x06U /* CD audio enable, stereo */
+#define CODEC_OUT_ENABLE_AUX 0x18U /* Aux line source enable, stereo */
+#define CODEC_OUT_ENABLE_SYNTH 0x60U /* Synth DAC enable, stereo */
+
+/* Output bus enable defines - SW2 */
+#define CODEC_OUT_ENABLE_TAD 0x01U /* TAD monitor enable, mono */
+#define CODEC_OUT_ENABLE_MONO2 0x02U /* Unused MONO2 enable, mono */
+#define CODEC_OUT_ENABLE_WAVE 0x0cU /* Wave DAC enable, stereo */
+#define CODEC_OUT_ENABLE_TV 0x30U /* TV Tuner enable, stereo */
+
+/* Volume setting constants */
+#define CODEC_ATT_MUTE 0x80U
+#define CODEC_ATT_MAX 0x1fU
+#define CODEC_ATT_MONO 0x07U
+
+/* Control function defines */
+#define CODEC_CTL_4SPKR 0x00U /* 4-spkr output mode enable */
+#define CODEC_CTL_MICBOOST 0x01U /* Mic boost (+30 dB) enable */
+
+/* Miscellaneous CODEC defines for internal use */
+#define CODEC_OUT_SW1 0x10U
+#define CODEC_OUT_SW2 0x11U
+#define CODEC_LIN_SW1 0x12U
+#define CODEC_RIN_SW1 0x13U
+#define CODEC_LIN_SW2 0x14U
+#define CODEC_RIN_SW2 0x15U
+#define CODEC_RESET_PWRD 0x16U
+#define CODEC_CLKSELECT 0x17U
+#define CODEC_ADSELECT 0x18U
+#define CODEC_MICBOOST 0x19U
+
+#endif /* _AUDIOPCI_H */
diff --git a/usr/src/uts/common/io/audio/drv/audiots/audiots.c b/usr/src/uts/common/io/audio/drv/audiots/audiots.c
new file mode 100644
index 0000000000..4c5a19f87b
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.c
@@ -0,0 +1,2015 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audiots Audio Driver
+ *
+ * This Audio Driver controls the T2 audio core in the ALI M1553
+ * southbridge chip. This chip supports multiple play streams, but just
+ * a single record stream. It also supports wave table synthesis and
+ * hardware MIDI and joystick ports. Unfortunately the MIDI ports are
+ * not available because their pins have been re-assigned to expose
+ * interrupts. We also aren't going to do anything with the joystick
+ * ports. The audio core controls an AC-97 V2.1 Codec.
+ *
+ * The DMA engine uses a single buffer which is large enough to hold
+ * two interrupts worth of data. When it gets to the mid point an
+ * interrupt is generated and data is either sent (for record) or
+ * requested and put in that half of the buffer (for play). When the
+ * second half is played we do the same, but the audio core loops the
+ * pointer back to the beginning.
+ *
+ * The audio core has a bug in silicon that doesn't let it read the AC-97
+ * Codec's register. T2 has provided an algorithm that attempts to read the
+ * the Codec several times. This is probably heuristic and thus isn't
+ * absolutely guaranteed to work. However we do have to place a limit on
+ * the looping, otherwise when we read a valid 0x00 we would never exit
+ * the loop. Unfortunately there is also a problem with writing the AC-97
+ * Codec's registers as well. Thus we read it back to verify the write.
+ *
+ * The AC'97 common code provides shadow state for AC'97 registers for us,
+ * so we only need to read those registers during early startup (primarily
+ * to determine codec id and capabilities.)
+ *
+ * We don't save any of the audio controller registers during normal
+ * operation. When we need to save register state we only have to save
+ * the aram and eram. The rest of the controller state is never modified
+ * from the initial programming. Thus restoring the controller state
+ * can be done from audiots_chip_init() as well.
+ *
+ *
+ * WARNING: The SME birdsnest platform uses a PCI bridge chip between the
+ * CPU and the southbridge containing the audio core. There is
+ * a bug in silicon that causes a bogus parity error. With the mixer
+ * reimplementation project, Bug 4374774, the audio driver is always
+ * set to the best precision and number of channels. Thus when turning
+ * the mixer on and off the only thing that changes is the sample rate.
+ * This change in programming doesn't trigger the silicon error.
+ * Thus the supported channels must always be 2 and the precision
+ * must always be 16-bits. This will keep any future change in the
+ * mixer from exposing this bug.
+ *
+ * Due to a hardware bug, system power management is not supported by this
+ * driver.
+ *
+ * CAUTION: If audio controller state is changed outside of aram
+ * and eram then that information must be saved and restored
+ * during power management shutdown and bringup.
+ *
+ * NOTE: The AC-97 Codec's reset pin is set to PCI reset, so we
+ * can't power down the Codec all the way.
+ *
+ * NOTE: This driver depends on the drv/audio and misc/ac97
+ * modules being loaded first.
+ *
+ * NOTE: Don't OR the ap_stop register to stop a play or record. This
+ * will just stop all active channels because a read of ap_stop
+ * returns ap_start. Just set the ap_stop register with the
+ * channels you want to stop. The same goes for ap_start.
+ *
+ * NOTE: There is a hardware problem with P2 rev motherboards. After
+ * prolonged use, reading the AC97 register will always return
+ * busy. The AC97 register is now useless. Consequently, we are no
+ * longer able to program the Codec. This work around disables
+ * audio when this state is detected. It's not great, but its
+ * better than having audio blasting out at 100% all the time.
+ *
+ * NOTE: Power Management testing has also exposed this AC97 timeout
+ * problem. Management has decided this is too risky for customers
+ * and hence they want power management support removed from the
+ * audio subsystem. All PM support is now removed.
+ */
+
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/pci.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/debug.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+#include "audiots.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audiots_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audiots_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audiots_quiesce(dev_info_t *);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audiots_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audiots_close(void *);
+static int audiots_start(void *);
+static void audiots_stop(void *);
+static int audiots_format(void *);
+static int audiots_channels(void *);
+static int audiots_rate(void *);
+static void audiots_chinfo(void *, int, unsigned *, unsigned *);
+static uint64_t audiots_count(void *);
+static void audiots_sync(void *, unsigned);
+static size_t audiots_qlen(void *);
+
+static audio_engine_ops_t audiots_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audiots_open,
+ audiots_close,
+ audiots_start,
+ audiots_stop,
+ audiots_count,
+ audiots_format,
+ audiots_channels,
+ audiots_rate,
+ audiots_sync,
+ audiots_qlen,
+ audiots_chinfo
+};
+
+/*
+ * Local Routine Prototypes
+ */
+static void audiots_power_up(audiots_state_t *);
+static void audiots_chip_init(audiots_state_t *);
+static uint16_t audiots_get_ac97(void *, uint8_t);
+static void audiots_set_ac97(void *, uint8_t, uint16_t);
+static int audiots_init_state(audiots_state_t *, dev_info_t *);
+static uint_t audiots_intr(caddr_t);
+static int audiots_map_regs(dev_info_t *, audiots_state_t *);
+static void audiots_update_port(audiots_port_t *);
+static void audiots_start_port(audiots_port_t *);
+static void audiots_stop_port(audiots_port_t *);
+static uint16_t audiots_read_ac97(audiots_state_t *, int);
+static void audiots_stop_everything(audiots_state_t *);
+static void audiots_destroy(audiots_state_t *);
+static int audiots_alloc_port(audiots_state_t *, int);
+static void audiots_reset_port(audiots_port_t *);
+
+/*
+ * Global variables, but viewable only by this file.
+ */
+
+/* anchor for soft state structures */
+static void *audiots_statep;
+
+/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
+static char *audiots_name = TS_NAME;
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audiots_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe */
+ audiots_attach, /* devo_attach */
+ audiots_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devo_cb_ops */
+ NULL, /* devo_bus_ops */
+ NULL, /* devo_power */
+ audiots_quiesce, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audiots_modldrv = {
+ &mod_driverops, /* drv_modops */
+ TS_MOD_NAME, /* drv_linkinfo */
+ &audiots_dev_ops /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audiots_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audiots_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/*
+ * NOTE: Grover OBP v4.0.166 and rev G of the ALI Southbridge chip force the
+ * audiots driver to use the upper 2 GB DMA address range. However to maintain
+ * backwards compatibility with older systems/OBP, we're going to try the full
+ * 4 GB DMA range.
+ *
+ * Eventually, this will be set back to using the proper high 2 GB DMA range.
+ */
+
+/* Device attribute structure - full 4 gig address range */
+static ddi_dma_attr_t audiots_attr = {
+ DMA_ATTR_VERSION, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000003fffLL, /* DMA counter register - 16 bits */
+ 0x0000000000000008LL, /* DMA address alignment, 64-bit */
+ 0x0000007f, /* 1 through 64 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x0000000000003fffLL, /* maximum transfer size, 16k */
+ 0x000000000000ffffLL, /* segment boundary, 64k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t ts_acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t ts_regs_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * _init()
+ *
+ * Description:
+ * Driver initialization, called when driver is first loaded.
+ * This is how access is initially given to all the static structures.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int error;
+
+ audio_init_ops(&audiots_dev_ops, TS_NAME);
+
+ /* initialize the soft state */
+ if ((error = ddi_soft_state_init(&audiots_statep,
+ sizeof (audiots_state_t), 1)) != 0) {
+ audio_fini_ops(&audiots_dev_ops);
+ return (error);
+ }
+
+ if ((error = mod_install(&audiots_modlinkage)) != 0) {
+ audio_fini_ops(&audiots_dev_ops);
+ ddi_soft_state_fini(&audiots_statep);
+ }
+
+ return (error);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Module de-initialization, called when the driver is to be unloaded.
+ *
+ * Arguments:
+ * None
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int error;
+
+ if ((error = mod_remove(&audiots_modlinkage)) != 0) {
+ return (error);
+ }
+
+ /* free the soft state internal structures */
+ ddi_soft_state_fini(&audiots_statep);
+
+ /* clean up ops */
+ audio_fini_ops(&audiots_dev_ops);
+
+ return (0);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Module information, returns infomation about the driver.
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ int error;
+
+ error = mod_info(&audiots_modlinkage, modinfop);
+
+ return (error);
+}
+
+
+/*
+ * audiots_attach()
+ *
+ * Description:
+ * Attach an instance of the audiots driver. This routine does the
+ * device dependent attach tasks.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiots_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ switch (cmd) {
+ case DDI_ATTACH:
+ break;
+ case DDI_RESUME:
+
+ /* we've already allocated the state structure so get ptr */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) ==
+ NULL) {
+ /* this will probably panic */
+ cmn_err(CE_WARN,
+ "!%s%d: RESUME get soft state failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ ASSERT(dip == state->ts_dip);
+
+ /* suspend/resume resets the chip, so we have no more faults */
+ if (state->ts_flags & TS_AUDIO_READ_FAILED) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_RESTORED,
+ DDI_DEVICE_FAULT,
+ "check port, gain, balance, and mute settings");
+ /* and clear the fault state flags */
+ state->ts_flags &=
+ ~(TS_AUDIO_READ_FAILED|TS_READ_FAILURE_PRINTED);
+ }
+
+ audiots_power_up(state);
+ audiots_chip_init(state);
+ ac97_resume(state->ts_ac97);
+
+ mutex_enter(&state->ts_lock);
+ /*
+ * Initialize/reset ports. Done under the lock, to
+ * avoid race with interrupt service routine.
+ */
+ state->ts_suspended = B_FALSE;
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ audiots_port_t *port = state->ts_ports[i];
+ if (port != NULL) {
+ /* relocate any streams properly */
+ if (port->tp_engine)
+ audio_engine_reset(port->tp_engine);
+
+ /* do a hardware reset on the port */
+ audiots_reset_port(port);
+ if (port->tp_started) {
+ audiots_start_port(port);
+ } else {
+ audiots_stop_port(port);
+ }
+ }
+ }
+ mutex_exit(&state->ts_lock);
+
+ return (DDI_SUCCESS);
+
+ default:
+ cmn_err(CE_WARN, "!%s%d: attach() unknown command: 0x%x",
+ audiots_name, instance, cmd);
+ return (DDI_FAILURE);
+ }
+
+ /* before we do anything make sure that we haven't had a h/w failure */
+ if (ddi_get_devstate(dip) == DDI_DEVSTATE_DOWN) {
+ cmn_err(CE_WARN, "%s%d: The audio hardware has "
+ "been disabled.", audiots_name, instance);
+ cmn_err(CE_CONT, "Please reboot to restore audio.");
+ return (DDI_FAILURE);
+ }
+
+ /* we don't support high level interrupts in this driver */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ cmn_err(CE_WARN, "!%s%d: unsupported high level interrupt",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ /* allocate the state structure */
+ if (ddi_soft_state_zalloc(audiots_statep, instance) == DDI_FAILURE) {
+ cmn_err(CE_WARN, "!%s%d: soft state allocate failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * WARNING: From here on all errors require that we free memory,
+ * including the state structure.
+ */
+
+ /* get the state structure - cannot fail */
+ state = ddi_get_soft_state(audiots_statep, instance);
+ ASSERT(state != NULL);
+
+ if ((state->ts_adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "unable to allocate audio dev");
+ goto error;
+ }
+
+ /* map in the registers, allocate DMA buffers, etc. */
+ if (audiots_map_regs(dip, state) == DDI_FAILURE) {
+ audio_dev_warn(state->ts_adev, "unable to map registers");
+ goto error;
+ }
+
+ /* initialize the audio state structures */
+ if (audiots_init_state(state, dip) == DDI_FAILURE) {
+ audio_dev_warn(state->ts_adev, "init state structure failed");
+ goto error;
+ }
+
+ /* power up */
+ audiots_power_up(state);
+
+ /* initialize the audio controller */
+ audiots_chip_init(state);
+
+ /* initialize the AC-97 Codec */
+ ac97_init(state->ts_ac97, state->ts_adev);
+
+ /* put the engine interrupts into a known state -- all off */
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_ainten,
+ TS_ALL_DMA_OFF);
+
+ /* call the framework attach routine */
+ if (audio_dev_register(state->ts_adev) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev, "unable to register audio");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ state->ts_ksp = kstat_create(TS_NAME, instance, TS_NAME,
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
+ if (state->ts_ksp != NULL) {
+ kstat_install(state->ts_ksp);
+ }
+
+ /* set up the interrupt handler */
+ if (ddi_add_intr(dip, 0, NULL, NULL, audiots_intr,
+ (caddr_t)state) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "failed to register interrupt handler");
+ goto error;
+ }
+ state->ts_flags |= TS_INTR_INSTALLED;
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audiots_destroy(state);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audiots_detach()
+ *
+ * Description:
+ * Detach an instance of the audiots driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audiots_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ /* get the state structure */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
+ cmn_err(CE_WARN, "!%s%d: detach get soft state failed",
+ audiots_name, instance);
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_DETACH:
+ break;
+ case DDI_SUSPEND:
+
+ ac97_suspend(state->ts_ac97);
+
+ mutex_enter(&state->ts_lock);
+
+ state->ts_suspended = B_TRUE; /* stop new ops */
+
+ /* we may already be powered down, so only save state if up */
+
+ /* stop playing and recording */
+ (void) audiots_stop_everything(state);
+
+ mutex_exit(&state->ts_lock);
+
+ return (DDI_SUCCESS);
+
+ default:
+ return (DDI_FAILURE);
+ }
+
+ /* attempt to unregister from the framework first */
+ if (audio_dev_unregister(state->ts_adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audiots_destroy(state);
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiots_quiesce()
+ *
+ * Description:
+ * Quiesce an instance of the audiots driver. Stops all DMA and
+ * interrupts.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was quiesced
+ * DDI_SUCCESS The driver was NOT quiesced
+ */
+static int
+audiots_quiesce(dev_info_t *dip)
+{
+ audiots_state_t *state;
+ int instance;
+
+ instance = ddi_get_instance(dip);
+
+ /* get the state structure */
+ if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ audiots_stop_everything(state);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_power_up()
+ *
+ * Description
+ * Ensure that the device is running in PCI power state D0.
+ */
+static void
+audiots_power_up(audiots_state_t *state)
+{
+ ddi_acc_handle_t pcih = state->ts_pcih;
+ uint8_t ptr;
+ uint16_t pmcsr;
+
+ if ((pci_config_get16(pcih, PCI_CONF_STAT) & PCI_STAT_CAP) == 0) {
+ /* does not implement PCI capabilities -- no PM */
+ return;
+ }
+
+ ptr = pci_config_get8(pcih, PCI_CONF_CAP_PTR);
+ for (;;) {
+ if (ptr == PCI_CAP_NEXT_PTR_NULL) {
+ /* PM capability not found */
+ return;
+ }
+ if (pci_config_get8(pcih, ptr + PCI_CAP_ID) == PCI_CAP_ID_PM) {
+ /* found it */
+ break;
+ }
+ ptr = pci_config_get8(pcih, ptr + PCI_CAP_NEXT_PTR);
+ }
+
+ /* if we got here, then got valid PMCSR pointer */
+ ptr += PCI_PMCSR;
+
+ /* check to see if we are already in state D0 */
+ pmcsr = pci_config_get16(pcih, ptr);
+ if ((pmcsr & PCI_PMCSR_STATE_MASK) != PCI_PMCSR_D0) {
+
+ /* D3hot (or any other state) -> D0 */
+ pmcsr &= ~PCI_PMCSR_STATE_MASK;
+ pmcsr |= PCI_PMCSR_D0;
+ pci_config_put16(pcih, ptr, pmcsr);
+ }
+
+ /*
+ * Wait for it to power up - PCI spec says 10 ms is enough.
+ * We double it. Note that no locks are held when this routine
+ * is called, so we can sleep (we are in attach context only).
+ *
+ * We do this delay even if already powerd up, just to make
+ * sure we aren't seeing something that *just* transitioned
+ * into D0 state.
+ */
+ delay(drv_usectohz(TS_20MS));
+
+ /* clear PME# flag */
+ pmcsr = pci_config_get16(pcih, ptr);
+ pci_config_put16(pcih, ptr, pmcsr | PCI_PMCSR_PME_STAT);
+}
+
+/*
+ * audiots_chip_init()
+ *
+ * Description:
+ * Initialize the audio core.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_chip_init(audiots_state_t *state)
+{
+ ddi_acc_handle_t handle = state->ts_acch;
+ audiots_regs_t *regs = state->ts_regs;
+ int str;
+
+ /* start with all interrupts & dma channels disabled */
+ ddi_put32(handle, &regs->aud_regs.ap_stop, TS_ALL_DMA_ENGINES);
+ ddi_put32(handle, &regs->aud_regs.ap_ainten, TS_ALL_DMA_OFF);
+
+ /* set global music and wave volume to 0dB */
+ ddi_put32(handle, &regs->aud_regs.ap_volume, 0x0);
+
+ /* enable end interrupts for all channels. */
+ ddi_put32(handle, &regs->aud_regs.ap_cir_gc, AP_CIR_GC_ENDLP_IE);
+
+ /* for each stream, set gain and vol settings */
+ for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
+ /*
+ * Set volume to all off, 1st left and then right.
+ * These are never changed, so we don't have to save them.
+ */
+ ddi_put16(handle,
+ &regs->aud_ram[str].eram.eram_gvsel_pan_vol,
+ (ERAM_WAVE_VOL|ERAM_PAN_LEFT|ERAM_PAN_0dB|
+ ERAM_VOL_MAX_ATTEN));
+ ddi_put16(handle,
+ &regs->aud_ram[str].eram.eram_gvsel_pan_vol,
+ (ERAM_WAVE_VOL|ERAM_PAN_RIGHT|ERAM_PAN_0dB|
+ ERAM_VOL_MAX_ATTEN));
+
+ /*
+ * The envelope engine *MUST* remain in still mode (off).
+ * Otherwise bad things like gain randomly disappearing might
+ * happen. See bug #4332773.
+ */
+
+ ddi_put32(handle, &regs->aud_ram[str].eram.eram_ebuf1,
+ ERAM_EBUF_STILL);
+ ddi_put32(handle, &regs->aud_ram[str].eram.eram_ebuf2,
+ ERAM_EBUF_STILL);
+
+ /* program the initial eram and aram rate */
+ ddi_put16(handle, &regs->aud_ram[str].aram.aram_delta,
+ 1 << TS_SRC_SHIFT);
+ ddi_put16(handle, &regs->aud_ram[str].eram.eram_ctrl_ec,
+ ERAM_16_BITS | ERAM_STEREO | ERAM_LOOP_MODE |
+ ERAM_SIGNED_PCM);
+ }
+
+ /* program channel 31 for record */
+ OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_global_control,
+ (AP_CLOGAL_CTRL_E_PCMIN_CH31|AP_CLOGAL_CTRL_PCM_OUT_AC97|
+ AP_CLOGAL_CTRL_MMC_FROM_MIXER|AP_CLOGAL_CTRL_PCM_OUT_TO_AC97));
+
+ /* do a warm reset, which powers up the Codec */
+ OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
+ AP_SCTRL_WRST_CODEC);
+ drv_usecwait(2);
+ AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
+ ~AP_SCTRL_WRST_CODEC);
+
+ /* do a warm reset via the Codec, yes, I'm being paranoid! */
+ audiots_set_ac97(state, AC97_RESET_REGISTER, 0);
+
+ /* Make sure the Codec is powered up. */
+ int i = TS_WAIT_CNT;
+ while ((audiots_get_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER) &
+ PCSR_POWERD_UP) != PCSR_POWERD_UP && i--) {
+ drv_usecwait(1);
+ }
+
+}
+
+/*
+ * audiots_get_ac97()
+ *
+ * Description:
+ * Get the value in the specified AC-97 Codec register. There is a
+ * bug in silicon which forces us to do multiple reads of the Codec's
+ * register. This algorithm was provided by T2 and is heuristic in
+ * nature. Unfortunately we have no guarantees that the real answer
+ * isn't 0x0000, which is what we get when a read fails. So we loop
+ * TS_LOOP_CNT times before we give up. We just have to hope this is
+ * sufficient to give us the correct value.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ *
+ * Returns:
+ * unsigned short The value in the specified register
+ */
+static uint16_t
+audiots_get_ac97(void *arg, uint8_t reg)
+{
+ audiots_state_t *state = arg;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint16_t *data;
+ int count;
+ int delay;
+ uint16_t first;
+ uint16_t next;
+
+ if (state->ts_revid == AC_REV_ID1) {
+ data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
+ } else {
+ data = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ }
+
+ /* make sure the register is good */
+ reg &= AP_ACRD_INDEX_MASK;
+ for (count = TS_LOOP_CNT; count--; ) {
+ if ((first = audiots_read_ac97(state, reg)) != 0) {
+ next = first;
+ break;
+ }
+
+ delay = TS_DELAY_CNT;
+ while (delay--) {
+ (void) ddi_get16(handle, data);
+ }
+
+ if ((next = audiots_read_ac97(state, reg)) != 0) {
+ break;
+ }
+ }
+
+ /*
+ * Arggg, if you let the next read happen too soon then it fails.
+ * 12 usec fails, 13 usec succeeds. So set it to 20 for safety.
+ */
+ drv_usecwait(TS_20US);
+
+ return (next);
+
+}
+
+/*
+ * audiots_init_state()
+ *
+ * Description:
+ * This routine initializes the audio driver's state structure.
+ * This includes reading the properties.
+ *
+ * CAUTION: This routine cannot allocate resources, unless it frees
+ * them before returning for an error. Also, error_destroy:
+ * in audiots_attach() would need to be fixed as well.
+ *
+ * NOTE: birdsnest supports CD ROM input. We check for the cdrom
+ * property. If there we turn it on.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS State structure initialized
+ * DDI_FAILURE State structure not initialized
+ */
+static int
+audiots_init_state(audiots_state_t *state, dev_info_t *dip)
+{
+ state->ts_ac97 = ac97_alloc(dip, audiots_get_ac97,
+ audiots_set_ac97, state);
+
+ if (state->ts_ac97 == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ /* save the device info pointer */
+ state->ts_dip = dip;
+
+ /* get the iblock cookie needed for interrupt context */
+ if (ddi_get_iblock_cookie(dip, 0, &state->ts_iblock) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "cannot get iblock cookie");
+ return (DDI_FAILURE);
+ }
+
+ /* initialize the state mutexes and condition variables */
+ mutex_init(&state->ts_lock, NULL, MUTEX_DRIVER, state->ts_iblock);
+ state->ts_flags |= TS_MUTEX_INIT;
+
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ if (audiots_alloc_port(state, i) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+ }
+ /* init power management state */
+ state->ts_suspended = B_FALSE;
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiots_intr()
+ *
+ * Description:
+ * Interrupt service routine for both play and record. For play we
+ * get the next buffers worth of audio. For record we send it on to
+ * the mixer.
+ *
+ * NOTE: This device needs to make sure any PIO access required to clear
+ * its interrupt has made it out on the PCI bus before returning from its
+ * interrupt handler so that the interrupt has been deasserted. This is
+ * done by rereading the address engine interrupt register.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+audiots_intr(caddr_t T)
+{
+ audiots_state_t *state = (void *)T;
+ audiots_regs_t *regs = state->ts_regs;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint32_t interrupts;
+
+ mutex_enter(&state->ts_lock);
+
+ if (state->ts_suspended) {
+ mutex_exit(&state->ts_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ interrupts = ddi_get32(handle, &regs->aud_regs.ap_aint);
+ if (interrupts == 0) {
+ mutex_exit(&state->ts_lock);
+ /* no interrupts to process, so it's not us */
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /*
+ * Clear the interrupts to acknowledge. Also, reread the
+ * interrupt reg to ensure that PIO write has completed.
+ */
+ ddi_put32(handle, &regs->aud_regs.ap_aint, interrupts);
+ (void) ddi_get32(handle, &regs->aud_regs.ap_aint);
+
+ /* update the kernel interrupt statistics */
+ if (state->ts_ksp) {
+ TS_KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&state->ts_lock);
+
+ for (int i = 0; i < TS_NUM_PORTS; i++) {
+ audiots_port_t *port = state->ts_ports[i];
+
+ if (((interrupts & port->tp_int_mask) == 0) ||
+ (!port->tp_started))
+ continue;
+
+ if (i == TS_INPUT_PORT) {
+ audio_engine_produce(port->tp_engine);
+ } else {
+ audio_engine_consume(port->tp_engine);
+ }
+ }
+
+ return (DDI_INTR_CLAIMED);
+
+}
+
+/*
+ * audiots_map_regs()
+ *
+ * Description:
+ * This routine maps the registers in.
+ *
+ * Once the config space registers are mapped in we determine if the
+ * audio core may be power managed. It should, but if it doesn't,
+ * then trying to may cause the core to hang.
+ *
+ * CAUTION: Make sure all errors call audio_dev_warn().
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo
+ * audiots_state_t *state The device's state structure
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+audiots_map_regs(dev_info_t *dip, audiots_state_t *state)
+{
+ char rev[16];
+ char *name;
+
+ /* map in the registers, the config and memory mapped registers */
+ if (pci_config_setup(dip, &state->ts_pcih) != DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "unable to map PCI configuration space");
+ return (DDI_FAILURE);
+ }
+
+ /* Read the Audio Controller's vendor, device, and revision IDs */
+ state->ts_devid =
+ (pci_config_get16(state->ts_pcih, PCI_CONF_VENID) << 16) |
+ pci_config_get16(state->ts_pcih, PCI_CONF_DEVID);
+ state->ts_revid = pci_config_get8(state->ts_pcih, PCI_CONF_REVID);
+
+ if (ddi_regs_map_setup(dip, TS_MEM_MAPPED_REGS,
+ (caddr_t *)&state->ts_regs, 0, 0, &ts_regs_attr, &state->ts_acch) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->ts_adev,
+ "unable to map PCI device registers");
+ return (DDI_FAILURE);
+ }
+
+ switch (state->ts_devid) {
+ case 0x10b95451:
+ name = "ALI M5451";
+ break;
+ default:
+ name = "audiots";
+ break;
+ }
+ (void) snprintf(rev, sizeof (rev), "Rev %x", state->ts_revid);
+ audio_dev_set_description(state->ts_adev, name);
+ audio_dev_set_version(state->ts_adev, rev);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_alloc_port()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls should always succeed.
+ *
+ * NOTE: ddi_dma_alloc_handle() attempts to use the full 4 GB DMA address
+ * range. This is to work around Southbridge rev E/G OBP issues.
+ * (See Grover OBP note above)
+ *
+ * CAUTION: Make sure all errors call audio_dev_warn().
+ *
+ * Arguments:
+ * audiots_port_t *state The port structure for a device stream
+ * int num The port number
+ *
+ * Returns:
+ * DDI_SUCCESS DMA resources mapped
+ * DDI_FAILURE DMA resources not successfully mapped
+ */
+int
+audiots_alloc_port(audiots_state_t *state, int num)
+{
+ audiots_port_t *port;
+ dev_info_t *dip = state->ts_dip;
+ audio_dev_t *adev = state->ts_adev;
+ char *prop;
+ int dir;
+ unsigned caps;
+ ddi_dma_cookie_t cookie;
+ unsigned count;
+ int rc;
+ ddi_acc_handle_t regsh = state->ts_acch;
+ uint32_t *gcptr = &state->ts_regs->aud_regs.ap_cir_gc;
+ char *namestr;
+
+ port = kmem_zalloc(sizeof (*port), KM_SLEEP);
+ state->ts_ports[num] = port;
+ port->tp_num = num;
+ port->tp_state = state;
+ port->tp_started = B_FALSE;
+ port->tp_rate = 48000;
+
+ if (num == TS_INPUT_PORT) {
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ port->tp_dma_stream = 31;
+ port->tp_int_stream = 2;
+ port->tp_sync_dir = DDI_DMA_SYNC_FORKERNEL;
+ } else {
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ port->tp_dma_stream = 0;
+ port->tp_int_stream = 1;
+ port->tp_sync_dir = DDI_DMA_SYNC_FORDEV;
+ }
+ port->tp_int_mask = (1U << port->tp_int_stream);
+ port->tp_dma_mask = (1U << port->tp_dma_stream);
+
+ /* get the number of interrupts per second */
+ port->tp_intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, TS_INTS);
+
+ /* make sure the values are good */
+ if (port->tp_intrs < TS_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, port->tp_intrs, TS_INTS);
+ port->tp_intrs = TS_INTS;
+ } else if (port->tp_intrs > TS_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, port->tp_intrs, TS_INTS);
+ port->tp_intrs = TS_INTS;
+ }
+
+ /*
+ * Now allocate space. We configure for the worst case. The
+ * worst (biggest) case is 48000 kHz, at 4 bytes per frame
+ * (16-bit stereo), with the lowest interrupt frequency. We
+ * need two fragments though, and each half has to be rounded
+ * up to allow for alignment considerations.
+ */
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
+ NULL, &port->tp_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(port->tp_dmah, TS_BUFSZ, &ts_acc_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &port->tp_kaddr,
+ &port->tp_size, &port->tp_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(port->tp_dmah, NULL,
+ port->tp_kaddr, port->tp_size, dir|DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &cookie, &count);
+ if (rc != DDI_DMA_MAPPED) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ ASSERT(count == 1);
+
+ port->tp_paddr = cookie.dmac_address;
+ if ((unsigned)port->tp_paddr & 0x80000000U) {
+ ddi_put32(regsh, gcptr,
+ ddi_get32(regsh, gcptr) | AP_CIR_GC_SYS_MEM_4G_ENABLE);
+ } else {
+ ddi_put32(regsh, gcptr,
+ ddi_get32(regsh, gcptr) & ~(AP_CIR_GC_SYS_MEM_4G_ENABLE));
+ }
+ port->tp_engine = audio_engine_alloc(&audiots_engine_ops, caps);
+ if (port->tp_engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(port->tp_engine, port);
+ audio_dev_add_engine(adev, port->tp_engine);
+
+ state->ts_swapped = B_FALSE;
+
+ /*
+ * SPARCLE platform specific hack. For reasons that I can't
+ * seem to fathom, the SPARCLE platform only gets the
+ * endianness correct when transferring whole 32-bit words and
+ * using little endian mapping. That isn't compatible with
+ * the audio framework's access mode, so we have to set up
+ * explicit swapping of the left and right channels.
+ *
+ * The real mystery here is why this is required for Tadpole
+ * SPARCLE, but not for any other standard Sun platforms that
+ * I've tested.
+ *
+ * "swap_channels" property can be used in driver.conf to
+ * force the left/right as well.
+ */
+ rc = ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(), 0,
+ "name", &namestr);
+ if (rc == DDI_PROP_SUCCESS) {
+ if (strcmp(namestr, "TAD,SPARCLE") == 0) {
+ state->ts_swapped = B_TRUE;
+ }
+ ddi_prop_free(namestr);
+ }
+
+ state->ts_swapped = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_NOTPROM | DDI_PROP_DONTPASS, "swap_channels",
+ state->ts_swapped);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiots_read_ac97()
+ *
+ * Description:
+ * This routine actually reads the AC-97 Codec's register. It may
+ * be called several times to succeed.
+ *
+ * NOTE:
+ * Revision M1535D B1-C of the ALI SouthBridge includes a workaround for
+ * the broken busy flag. Resetting the busy flag requires a software tweak
+ * to go with the worked around hardware. When we detect failure, we make
+ * 10 attempts to reset the chip before we fail. This should reset the new
+ * SB systems. On all SB systems, this will increse the read delay
+ * slightly, but shouldn't bother it otherwise.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ *
+ * Returns:
+ * unsigned short The value in the specified register
+ */
+static uint16_t
+audiots_read_ac97(audiots_state_t *state, int reg)
+{
+ ddi_acc_handle_t acch = state->ts_acch;
+ uint16_t *addr;
+ uint16_t *data;
+ uint32_t *stimer = &state->ts_regs->aud_regs.ap_stimer;
+ uint32_t chk1;
+ uint32_t chk2;
+ int resets = 0;
+ int i;
+
+ if (state->ts_revid == AC_REV_ID1) {
+ addr = &state->ts_regs->aud_regs.ap_acrd_35D_reg;
+ data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
+ } else {
+ addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
+ data = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ }
+
+first_read:
+ /* wait for ready to send read request */
+ for (i = 0; i < TS_READ_TRIES; i++) {
+ if (!(ddi_get16(acch, addr) & AP_ACRD_R_READ_BUSY)) {
+ break;
+ }
+ /* don't beat on the bus */
+ drv_usecwait(1);
+ }
+ if (i >= TS_READ_TRIES) {
+ if (resets < TS_RESET_TRIES) {
+ /* Attempt to reset */
+ drv_usecwait(TS_20US);
+ ddi_put16(acch, addr, TS_SB_RESET);
+ resets++;
+ goto first_read;
+ } else {
+ state->ts_flags |= TS_AUDIO_READ_FAILED;
+ if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
+ "Unable to communicate with AC97 CODEC");
+ audio_dev_warn(state->ts_adev,
+ "The audio AC97 register has timed out.");
+ audio_dev_warn(state->ts_adev,
+ "Audio is now disabled.");
+ audio_dev_warn(state->ts_adev,
+ "Please reboot to restore audio.");
+
+ /* Don't flood the console */
+ state->ts_flags |= TS_READ_FAILURE_PRINTED;
+ }
+ }
+ return (0);
+ }
+
+ /* program the register to read */
+ ddi_put16(acch, addr, (reg|AP_ACRD_W_PRIMARY_CODEC|
+ AP_ACRD_W_READ_MIXER_REG|AP_ACRD_W_AUDIO_READ_REQ&
+ (~AP_ACWR_W_SELECT_WRITE)));
+
+ /* hardware bug work around */
+ chk1 = ddi_get32(acch, stimer);
+ chk2 = ddi_get32(acch, stimer);
+ i = TS_WAIT_CNT;
+ while (chk1 == chk2 && i) {
+ chk2 = ddi_get32(acch, stimer);
+ i--;
+ }
+ OR_SET_SHORT(acch, addr, AP_ACRD_W_READ_MIXER_REG);
+ resets = 0;
+
+second_read:
+ /* wait again for read to send read request */
+ for (i = 0; i < TS_READ_TRIES; i++) {
+ if (!(ddi_get16(acch, addr) & AP_ACRD_R_READ_BUSY)) {
+ break;
+ }
+ /* don't beat on the bus */
+ drv_usecwait(1);
+ }
+ if (i >= TS_READ_TRIES) {
+ if (resets < TS_RESET_TRIES) {
+ /* Attempt to reset */
+ drv_usecwait(TS_20US);
+ ddi_put16(acch, addr, TS_SB_RESET);
+ resets++;
+ goto second_read;
+ } else {
+ state->ts_flags |= TS_AUDIO_READ_FAILED;
+ if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
+ ddi_dev_report_fault(state->ts_dip,
+ DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
+ "Unable to communicate with AC97 CODEC");
+ audio_dev_warn(state->ts_adev,
+ "The audio AC97 register has timed out.");
+ audio_dev_warn(state->ts_adev,
+ "Audio is now disabled.");
+ audio_dev_warn(state->ts_adev,
+ "Please reboot to restore audio.");
+
+ /* Don't flood the console */
+ state->ts_flags |= TS_READ_FAILURE_PRINTED;
+ }
+ }
+ return (0);
+ }
+
+ return (ddi_get16(acch, data));
+
+} /* audiots_read_ac97() */
+
+/*
+ * audiots_set_ac97()
+ *
+ * Description:
+ * Set the value in the specified AC-97 Codec register. Just like
+ * reading the AC-97 Codec, it is possible there is a problem writing
+ * it as well. So we loop.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ * int reg AC-97 register number
+ * uint16_t value The value to write
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_set_ac97(void *arg, uint8_t reg8, uint16_t data)
+{
+ audiots_state_t *state = arg;
+ ddi_acc_handle_t handle = state->ts_acch;
+ uint16_t *data_addr = &state->ts_regs->aud_regs.ap_acrdwr_data;
+ uint16_t *reg_addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
+ int count;
+ int i;
+ uint16_t tmp_short;
+ uint16_t reg = reg8;
+
+ reg &= AP_ACWR_INDEX_MASK;
+
+ /* Don't touch the reserved bits on the pre 35D+ SouthBridge */
+ if (state->ts_revid == AC_REV_ID1) {
+ reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG;
+ } else {
+ reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG|
+ AP_ACWR_W_SELECT_WRITE;
+ }
+
+ for (count = TS_LOOP_CNT; count--; ) {
+ /* wait for ready to write */
+ for (i = 0; i < TS_WAIT_CNT; i++) {
+ if (!(ddi_get16(handle, reg_addr) &
+ AP_ACWR_R_WRITE_BUSY)) {
+ /* ready to write */
+ ddi_put16(handle, reg_addr, reg);
+
+ /* Write the data */
+ ddi_put16(handle, data_addr, data);
+ break;
+ }
+ }
+ if (i >= TS_WAIT_CNT) {
+ /* try again */
+ continue;
+ }
+
+ /* wait for write to complete */
+ for (i = 0; i < TS_WAIT_CNT; i++) {
+ if (!(ddi_get16(handle, reg_addr) &
+ AP_ACWR_R_WRITE_BUSY)) {
+ /* done writing */
+ break;
+ }
+ }
+
+ /* verify the value written */
+ tmp_short = audiots_get_ac97(state, reg8);
+ if (data == tmp_short) {
+ /* successfully loaded, so we can return */
+ return;
+ }
+ }
+
+} /* audiots_set_ac97() */
+
+/*
+ * audiots_reset_port()
+ *
+ * Description:
+ * Initializes the hardware for a DMA engine.
+ * We only support stereo 16-bit linear PCM (signed native endian).
+ *
+ * The audio core uses a single DMA buffer which is divided into two
+ * halves. An interrupt is generated when the middle of the buffer has
+ * been reached and at the end. The audio core resets the pointer back
+ * to the beginning automatically. After the interrupt the driver clears
+ * the buffer and asks the mixer for more audio samples. If there aren't
+ * enough then silence is played out.
+ *
+ * Arguments:
+ * audiots_port_t *port The DMA engine to reset
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_reset_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+ ddi_acc_handle_t handle = state->ts_acch;
+ audiots_regs_t *regs = state->ts_regs;
+ audiots_aram_t *aram;
+ audiots_eram_t *eram;
+ unsigned delta;
+ uint16_t ctrl;
+ uint16_t gvsel;
+ uint16_t eso;
+
+ if (state->ts_suspended)
+ return;
+
+ port->tp_cso = 0;
+
+ gvsel = ERAM_WAVE_VOL | ERAM_PAN_0dB | ERAM_VOL_DEFAULT;
+ ctrl = ERAM_16_BITS | ERAM_STEREO | ERAM_LOOP_MODE | ERAM_SIGNED_PCM;
+ for (int i = 0; i < 2; i++) {
+
+ delta = (port->tp_rate << TS_SRC_SHIFT) / TS_RATE;
+
+ if (i == 0) {
+ /* first do the DMA stream */
+ aram = &regs->aud_ram[port->tp_dma_stream].aram;
+ eram = &regs->aud_ram[port->tp_dma_stream].eram;
+ if (port->tp_num == TS_INPUT_PORT) {
+ delta = (TS_RATE << TS_SRC_SHIFT) /
+ port->tp_rate;
+ }
+ eso = port->tp_nframes - 1;
+ } else {
+ /* else do the interrupt stream */
+ aram = &regs->aud_ram[port->tp_int_stream].aram;
+ eram = &regs->aud_ram[port->tp_int_stream].eram;
+ /* interrupt stream is silent */
+ gvsel |= ERAM_VOL_MAX_ATTEN;
+ eso = port->tp_fragfr - 1;
+ }
+
+ /* program the sample rate */
+ ddi_put16(handle, &aram->aram_delta, (uint16_t)delta);
+
+ /* program the precision, number of channels and loop mode */
+ ddi_put16(handle, &eram->eram_ctrl_ec, ctrl);
+
+ /* program the volume settings */
+ ddi_put16(handle, &eram->eram_gvsel_pan_vol, gvsel);
+
+ /* set ALPHA and FMS to 0 */
+ ddi_put16(handle, &aram->aram_alpha_fms, 0x0);
+
+ /* set CSO to 0 */
+ ddi_put16(handle, &aram->aram_cso, 0x0);
+
+ /* set LBA */
+ ddi_put32(handle, &aram->aram_cptr_lba,
+ port->tp_paddr & ARAM_LBA_MASK);
+
+ /* set ESO */
+ ddi_put16(handle, &aram->aram_eso, eso);
+ }
+
+ /* stop the DMA & interrupt engines */
+ ddi_put32(handle, &regs->aud_regs.ap_stop,
+ port->tp_int_mask | port->tp_dma_mask);
+
+ /* enable interrupts */
+ OR_SET_WORD(handle, &regs->aud_regs.ap_ainten, port->tp_int_mask);
+}
+
+/*
+ * audiots_open()
+ *
+ * Description:
+ * Opens a DMA engine for use. Will also ensure the device is powered
+ * up if not already done so.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audiots_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ audiots_port_t *port = arg;
+ unsigned nfrag;
+
+ _NOTE(ARGUNUSED(flag));
+
+ /*
+ * Round up - we have to have a sample that is a whole number
+ * of 64-bit words. Since our frames are 4 bytes wide, we
+ * just need an even number of frames.
+ */
+ port->tp_fragfr = port->tp_rate / port->tp_intrs;
+ port->tp_fragfr = (port->tp_fragfr + 1) & ~1;
+ nfrag = port->tp_size / (port->tp_fragfr * TS_FRAMESZ);
+ port->tp_nframes = nfrag * port->tp_fragfr;
+ port->tp_started = B_FALSE;
+ port->tp_count = 0;
+ port->tp_cso = 0;
+ *fragfrp = port->tp_fragfr;
+ *nfragsp = nfrag;
+ *bufp = port->tp_kaddr;
+
+ /*
+ * This should always be true because we used a worst case
+ * assumption when calculating the port->tp_size.
+ */
+ ASSERT((port->tp_fragfr * nfrag) <= port->tp_size);
+
+ mutex_enter(&port->tp_state->ts_lock);
+ audiots_reset_port(port);
+ mutex_exit(&port->tp_state->ts_lock);
+
+ return (0);
+}
+
+/*
+ * audiots_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_close(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ audiots_stop_port(port);
+ port->tp_started = B_FALSE;
+ mutex_exit(&state->ts_lock);
+}
+
+/*
+ * audiots_stop()
+ *
+ * Description:
+ * This is called by the framework to stop a port that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ if (port->tp_started) {
+ audiots_stop_port(port);
+ }
+ port->tp_started = B_FALSE;
+ mutex_exit(&state->ts_lock);
+}
+
+/*
+ * audiots_start()
+ *
+ * Description:
+ * This is called by the framework to start a port transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success (never fails, errno if it did)
+ */
+static int
+audiots_start(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+
+ mutex_enter(&state->ts_lock);
+ if (!port->tp_started) {
+ audiots_start_port(port);
+ port->tp_started = B_TRUE;
+ }
+ mutex_exit(&state->ts_lock);
+ return (0);
+}
+
+/*
+ * audiots_chinfo()
+ *
+ * Description:
+ * This is called by the framework to query the channel offsets
+ * and ordering.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ * int chan Channel number.
+ * unsigned *offset Starting offset of channel.
+ * unsigned *incr Increment (in samples) between frames.
+ *
+ * Returns:
+ * 0 indicating rate array is range instead of enumeration
+ */
+
+static void
+audiots_chinfo(void *arg, int chan, unsigned *offset, unsigned *incr)
+{
+ audiots_port_t *port = arg;
+
+ /* if channels are swapped (SPARCLE), then deal with it */
+ if (port->tp_state->ts_swapped) {
+ *offset = (chan ? 0 : 1);
+ } else {
+ *offset = chan;
+ }
+ *incr = 2;
+}
+
+/*
+ * audiots_format()
+ *
+ * Description:
+ * Called by the framework to query the format for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_LE.
+ */
+static int
+audiots_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+
+/*
+ * audiots_channels()
+ *
+ * Description:
+ * Called by the framework to query the channnels for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 2 (Stereo).
+ */
+static int
+audiots_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (2);
+}
+
+/*
+ * audiots_rate()
+ *
+ * Description:
+ * Called by the framework to query the sample rates for the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * Sample rate in HZ (always 48000).
+ */
+static int
+audiots_rate(void *arg)
+{
+ audiots_port_t *port = arg;
+
+ return (port->tp_rate);
+}
+
+/*
+ * audiots_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audiots_count(void *arg)
+{
+ audiots_port_t *port = arg;
+ audiots_state_t *state = port->tp_state;
+ uint64_t val;
+
+ mutex_enter(&state->ts_lock);
+ audiots_update_port(port);
+
+ val = port->tp_count;
+ mutex_exit(&state->ts_lock);
+ return (val);
+}
+
+/*
+ * audiots_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ * We also leverage this do some endian swapping, because on SPARC
+ * the chip accesses the DMA region using 32-bit little-endian
+ * accesses. Its not enough to just use the framework's sample
+ * conversion logic, because the channels will also be backwards.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_sync(void *arg, unsigned nframes)
+{
+ audiots_port_t *port = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(port->tp_dmah, 0, 0, port->tp_sync_dir);
+}
+
+/*
+ * audiots_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audiots_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+/*
+ * audiots_start_port()
+ *
+ * Description:
+ * The audio core uses a single DMA buffer which is divided into two
+ * halves. An interrupt is generated when the middle of the buffer has
+ * been reached and at the end. The audio core resets the pointer back
+ * to the beginning automatically. After the interrupt the driver clears
+ * the buffer and asks the mixer for more audio samples. If there aren't
+ * enough then silence is played out.
+ *
+ * Arguments:
+ * audiots_port_t *port The DMA engine to start up
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_start_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+ audiots_regs_t *regs = state->ts_regs;
+ ddi_acc_handle_t handle = state->ts_acch;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ /* if suspended then do nothing else */
+ if (state->ts_suspended) {
+ return;
+ }
+
+ /* make sure it starts playing */
+ ddi_put32(handle, &regs->aud_regs.ap_start,
+ port->tp_dma_mask | port->tp_int_mask);
+
+ ASSERT(mutex_owned(&state->ts_lock));
+}
+
+/*
+ * audiots_stop_port()
+ *
+ * Description:
+ * This routine stops a DMA engine.
+ *
+ * Arguments:
+ * audiots_port_t *port The port to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ if (state->ts_suspended)
+ return;
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_stop,
+ port->tp_int_mask | port->tp_dma_mask);
+
+ ASSERT(mutex_owned(&state->ts_lock));
+}
+
+/*
+ * audiots_update_port()
+ *
+ * Description:
+ * This routine updates the ports frame counter from hardware, and
+ * gracefully handles wraps.
+ *
+ * Arguments:
+ * audiots_port_t *port The port to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_update_port(audiots_port_t *port)
+{
+ audiots_state_t *state = port->tp_state;
+
+ uint16_t cso;
+ unsigned n;
+
+ ASSERT(mutex_owned(&state->ts_lock));
+
+ if (state->ts_suspended)
+ return;
+
+ cso = ddi_get16(state->ts_acch,
+ &state->ts_regs->aud_ram[port->tp_dma_stream].aram.aram_cso);
+
+ n = (cso >= port->tp_cso) ?
+ cso - port->tp_cso :
+ cso + port->tp_nframes - port->tp_cso;
+
+ port->tp_cso = cso;
+ port->tp_count += n;
+}
+
+/*
+ * audiots_stop_everything()
+ *
+ * Description:
+ * This routine disables the address engine interrupt for all 32 DMA
+ * engines. Just to be sure, it then explicitly issues a stop command to
+ * the address engine and envelope engines for all 32 channels.
+ *
+ * NOTE:
+ *
+ * There is a hardware bug that generates a spurious interrupt
+ * when the DMA engines are stopped. It's not consistent - it
+ * happens every 1 out of 6 stops or so. It will show up as a
+ * record interrupt. The problem is that once the driver is
+ * detached or if the system goes into low power mode, nobody
+ * will service that interrupt. The system will eventually become
+ * unusable.
+ *
+ * Arguments:
+ * audiots_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+audiots_stop_everything(audiots_state_t *state)
+{
+ if (state->ts_acch == NULL)
+ return;
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_ainten,
+ TS_ALL_DMA_OFF);
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_stop,
+ TS_ALL_DMA_ENGINES);
+
+ ddi_put32(state->ts_acch, &state->ts_regs->aud_regs.ap_aint,
+ TS_ALL_DMA_ENGINES);
+}
+
+/*
+ * audiots_free_port()
+ *
+ * Description:
+ * This routine unbinds the DMA cookies, frees the DMA buffers,
+ * deallocates the DMA handles.
+ *
+ * Arguments:
+ * audiots_port_t *port The port structure for a device stream.
+ *
+ * Returns:
+ * None
+ */
+void
+audiots_free_port(audiots_port_t *port)
+{
+ if (port == NULL)
+ return;
+
+ if (port->tp_engine) {
+ audio_dev_remove_engine(port->tp_state->ts_adev,
+ port->tp_engine);
+ audio_engine_free(port->tp_engine);
+ }
+ if (port->tp_paddr) {
+ (void) ddi_dma_unbind_handle(port->tp_dmah);
+ }
+ if (port->tp_acch) {
+ ddi_dma_mem_free(&port->tp_acch);
+ }
+ if (port->tp_dmah) {
+ ddi_dma_free_handle(&port->tp_dmah);
+ }
+ kmem_free(port, sizeof (*port));
+}
+
+/*
+ * audiots_destroy()
+ *
+ * Description:
+ * This routine releases all resources held by the device instance,
+ * as part of either detach or a failure in attach.
+ *
+ * Arguments:
+ * audiots_state_t *state The device soft state.
+ *
+ * Returns:
+ * None
+ */
+void
+audiots_destroy(audiots_state_t *state)
+{
+ audiots_stop_everything(state);
+
+ if (state->ts_flags & TS_INTR_INSTALLED)
+ ddi_remove_intr(state->ts_dip, 0, NULL);
+
+ if (state->ts_ksp)
+ kstat_delete(state->ts_ksp);
+
+ for (int i = 0; i < TS_NUM_PORTS; i++)
+ audiots_free_port(state->ts_ports[i]);
+
+ if (state->ts_acch)
+ ddi_regs_map_free(&state->ts_acch);
+
+ if (state->ts_pcih)
+ pci_config_teardown(&state->ts_pcih);
+
+ if (state->ts_ac97)
+ ac97_free(state->ts_ac97);
+
+ if (state->ts_adev)
+ audio_dev_free(state->ts_adev);
+
+ if (state->ts_flags & TS_MUTEX_INIT) {
+ mutex_destroy(&state->ts_lock);
+ }
+
+ ddi_soft_state_free(audiots_statep, ddi_get_instance(state->ts_dip));
+}
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf b/usr/src/uts/common/io/audio/drv/audiots/audiots.conf
index 09bb31c4f3..598c38c531 100644
--- a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.conf
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 2000-2002 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audiots audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -55,12 +43,10 @@ mixer-mode=1;
# boundaries. If those boundaries are violated the driver will not be
# loaded and an error message is entered into the messages log
#
-play-interrupts=175;
-record-interrupts=175;
+#play-interrupts=175;
+#record-interrupts=175;
#
-# Uncomment reset-configuration to cause the audiots driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
+# ac97-amplifier enables the use of any onboard external amplifier.
#
-#reset-configuration=1;
+#ac97-amplifier=1;
diff --git a/usr/src/uts/common/sys/audio/impl/audiots_impl.h b/usr/src/uts/common/io/audio/drv/audiots/audiots.h
index 1723ad89b7..f239e8f608 100644
--- a/usr/src/uts/common/sys/audio/impl/audiots_impl.h
+++ b/usr/src/uts/common/io/audio/drv/audiots/audiots.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,134 +19,83 @@
* CDDL HEADER END
*/
/*
- * Copyright 2000-2003 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#ifndef _SYS_AUDIOTS_IMPL_H
-#define _SYS_AUDIOTS_IMPL_H
+#ifndef _AUDIOTS_H
+#define _AUDIOTS_H
-#pragma ident "%Z%%M% %I% %E% SMI"
+/*
+ * Header file for the audiots device driver.
+ */
-#ifdef __cplusplus
-extern "C" {
-#endif
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define TS_DEV_NAME "SUNW,audiots"
+#define TS_DEV_CONFIG "onboard1"
+#define TS_DEV_VERSION_A "a" /* grover, sngl strming play */
+#define TS_DEV_VERSION_B "b" /* birdsnest, sngl strm play */
/*
- * Implementation specific header file for the audiots device driver.
+ * Driver supported configuration information
*/
+#define TS_NAME "audiots"
+#define TS_MOD_NAME "audiots audio driver"
-#ifdef _KERNEL
+#define TS_RATE (48000)
+#define TS_STEREO (2) /* stereo */
+#define TS_FRAMESZ (4) /* 16-bit stereo */
+/*
+ * This is how much buffer space we at minimum need. The worst
+ * (biggest) case is 48000 kHz, at 4 bytes per frame (16-bit stereo),
+ * with the lowest interrupt frequency. 48000 x 4 bytes per sample /
+ * 24 is 8000 bytes per fragment. Two such fragments would be 16000.
+ * (At higher data rates, we get better buffering, with more frags.)
+ */
+#define TS_BUFSZ (16000) /* maximum buffer size */
+#define TS_INTS (175) /* default interrupt rate */
+#define TS_MIN_INTS (24) /* minimum interrupt rate */
+#define TS_MAX_INTS (2000) /* maximum interrupt rate */
/*
* Misc. defines
*/
-#define TS_CONFIG_REGS (0)
#define TS_IO_MAPPED_REGS (1)
#define TS_MEM_MAPPED_REGS (2)
#define TS_ALL_DMA_ENGINES (0xffffffff)
#define TS_ALL_DMA_OFF (0x00000000)
-#define TS_IDNUM (0x6175)
-#define TS_MINPACKET (0)
-#define TS_MAXPACKET (1*1024)
-#define TS_HIWATER (64*1024)
-#define TS_LOWATER (32*1024)
-
-#define TS_BSIZE (8*1024)
#define TS_20MS (20000) /* 20,000 microseconds */
#define TS_20US (20) /* 20 microseconds */
-#define TS_GAIN_SHIFT3 (3) /* 5 significan bits */
-#define TS_GAIN_SHIFT4 (4) /* 4 significan bits */
-#define TS_BYTE_SHIFT (8)
-#define TS_LAST_AC_REG (0x23)
-#define TS_REG_SIZE (2)
-#define TS_MOD_SIZE (16)
-#define TS_BUF_HALVES (2)
-#define TS_1ST_HALF (0)
-#define TS_2ND_HALF (1)
#define TS_SRC_SHIFT (12)
-#define TS_NOT_SUSPENDED (0)
-#define TS_SUSPENDED (~TS_NOT_SUSPENDED)
-#define TS_VENDOR_ID1_MASK (0x0000ffff);
-#define TS_PORT_MASK (0x0ff)
-#define TS_MAX_CHANNELS (200) /* force max # chs */
+#define TS_NUM_PORTS (2)
+#define TS_OUTPUT_PORT (0)
+#define TS_INPUT_PORT (1)
+
#define TS_MAX_HW_CHANNELS (32)
-#define TS_MAX_IN_CHANNELS 1
-#define TS_MAX_OUT_CHANNELS (TS_MAX_HW_CHANNELS - TS_MAX_IN_CHANNELS)
-#define TS_INPUT_STREAM (31)
-#define TS_INPUT_CHANNEL_MASK (0x80000000u)
-#define TS_INPUT_CHANNEL (TS_INPUT_CHANNEL_MASK)
-#define TS_OUTPUT_STREAM (0)
-#define TS_OUTPUT_CHANNEL (0x00000001u)
-#define TS_CH_ARRAY_SZIE (TS_MAX_HW_CHANNELS * sizeof (int))
-#define TS_COMPONENT (0)
-#define TS_PWR_OFF (0)
-#define TS_PWR_ON (1)
-#define TS_NO_PWR_MANAGE (0)
-#define TS_PWR_MANAGE (1)
-#define TS_NORMAL_POWER (1)
+
#define TS_KIOP(X) ((kstat_intr_t *)(X->ts_ksp->ks_data))
#define TS_WAIT_CNT (512)
#define TS_LOOP_CNT (10)
#define TS_DELAY_CNT (25)
-#define TS_INIT_RESTORE (0)
-#define TS_INIT_NO_RESTORE ~TS_INIT_RESTORE
#define TS_CODEC_REG(r) ((r) >> 1)
-#define TS_PORT_UNMUTE (0xffffffff)
-#define TS_AC97_ATTEN_HP (0x1818)
-#define TS_AC97_ATTEN_LINE (0x0404)
-#define TS_AC97_ATTEN_SPKR (0x0001)
-#define TS_FIFO_SIZE (8)
/* ALI Hacks */
#define TS_READ_TRIES (TS_WAIT_CNT/10)
#define TS_RESET_TRIES (16)
#define TS_SB_RESET (0x7fff)
-
-/*
- * audiots_config_t - Config space registers
- */
-struct audiots_config {
- uint16_t tsc_vendor_id; /* 00h - 01h */
- uint16_t tsc_device_id; /* 02h - 03h */
- uint16_t tsc_command; /* 04h - 05h */
- uint16_t tsc_status; /* 06h - 07h */
- uint32_t tsc_class_code_rev_id; /* 08h - 0bh */
- uint32_t tsc_bist_cache; /* 0ch - 0fh */
- uint32_t tsc_audio_io_base; /* 10h - 13h */
- uint32_t tsc_audio_mem_base; /* 14h - 17h */
- uint32_t tsc_rsvd1[5]; /* 18h - 2bh */
- uint32_t tsc_sub_ids; /* 2ch - 2fh */
- uint32_t tsc_rsvd2; /* 30h - 33h */
- uint16_t tsc_cap_ptr; /* 34h - 35h */
- uint16_t tsc_rsvd3; /* 36h - 37h */
- uint32_t tsc_rsvd4; /* 38h - 3bh */
- uint32_t tsc_compat1; /* 3ch - 3fh */
- uint32_t tsc_ddma_slave; /* 40h - 43h */
- uint32_t tsc_compat2; /* 44h - 47h */
- uint32_t tsc_compat3; /* 48h - 4bh */
- uint32_t tsc_rsvd5[36]; /* 4ch - dbh */
- uint16_t tsc_pm_id_next_ptr; /* dch - ddh */
- uint16_t tsc_pmc; /* deh - dfh */
- uint16_t tsc_pmcsr; /* e0h - e1h */
- uint16_t tsc_pmcsr_bse_base; /* e2h - e3h */
- uint32_t tsc_rsvd6[7]; /* e4h - ffh */
-};
-typedef struct audiots_config audiots_config_t;
+/* These are the devices we know about */
+#define TS_DEVICE_ALI_M5451 ((0x10b9 << 16) | (0x5451))
+#define TS_DEVICE_TRIDENT_4DWAVEDX ((0x1023 << 16) | (0x2000))
+#define TS_DEVICE_TRIDENT_4DWAVENX ((0x1023 << 16) | (0x2001))
+#define TS_DEVICE_SIS_7018 ((0x1039 << 16) | (0x7018))
#define TS_AD_CODEC_ID 0x4144
#define TS_AD_REV_ID 0x5340
-#define TS_CONFIG_VENDOR_ID 0x10b9
-#define TS_CONFIG_DEVICE_ID 0x5451
-#define TS_CONFIG_SUBSYSTEM_VENDOR_ID 0x10b9
-#define TS_CONFIG_SUBSYSTEM_ID 0x5451
-#define TRI_CONFIG_VENDOR_ID 0x1023
-#define TRI_CONFIG_DEVICE_ID 0x2000
-#define TRI_CONFIG_SUBSYSTEM_VENDOR_ID 0x1023
-#define TRI_CONFIG_SUBSYSTEM_ID 0x2000
#define AC_REV_ID1 0x0001
#define AC_REV_ID2 0x0002
@@ -377,6 +325,7 @@ typedef struct audiots_processor audiots_processor_t;
#define AP_CIR_GC_MIDLP_IE 0x00002000
#define AP_CIR_GC_ETOG_IE 0x00004000
#define AP_CIR_GC_EDROP_IE 0x00008000
+#define AP_CIR_GC_SYS_MEM_4G_ENABLE 0x00010000
#define AP_CIR_GC_PCM_FIFO 0x00000000
#define AP_CIR_GC_MMC_BUFFER 0x00100000
#define AP_CIR_GC_NORMAL_MODE 0x00000000
@@ -485,90 +434,74 @@ typedef struct audiots_regs audiots_regs_t;
/*
* audiots_save_regs_t - Saved audio controller registers.
*/
-struct audiots_save_regs {
- uint16_t aram_delta;
- uint16_t eram_ctrl_ec;
+
+struct audiots_port {
+ struct audiots_state *tp_state;
+ int tp_num;
+ int tp_dma_stream;
+ int tp_int_stream;
+
+ uint32_t tp_dma_mask;
+ uint32_t tp_int_mask;
+
+ boolean_t tp_started;
+ unsigned tp_intrs;
+ unsigned tp_fragfr;
+ unsigned tp_nframes;
+ unsigned tp_rate;
+ uint64_t tp_count;
+ size_t tp_size;
+ caddr_t tp_kaddr;
+ uint32_t tp_paddr;
+ ddi_dma_handle_t tp_dmah;
+ ddi_acc_handle_t tp_acch;
+ unsigned tp_sync_dir;
+
+ audio_engine_t *tp_engine;
+ /* counting cso */
+ uint16_t tp_cso;
};
-typedef struct audiots_save_regs audiots_save_regs_t;
+typedef struct audiots_port audiots_port_t;
/*
* audiots_state_t - per instance state and operation data
*/
struct audiots_state {
kmutex_t ts_lock; /* state protection lock */
- kcondvar_t ts_cv; /* suspend/resume cond. var. */
ddi_iblock_cookie_t ts_iblock; /* iblock cookie */
uint_t ts_flags; /* flags */
kstat_t *ts_ksp; /* kernel statistics */
dev_info_t *ts_dip; /* used by ts_getinfo() */
- audiohdl_t ts_ahandle; /* audio handle */
- audio_info_t ts_defaults; /* default state for the dev */
- am_ad_info_t ts_ad_info; /* audio device info state */
- audiots_config_t *ts_config; /* configuration registers */
+ audio_dev_t *ts_adev; /* audio device handle */
+ ac97_t *ts_ac97; /* ac97 common handle */
audiots_regs_t *ts_regs; /* memory mapped registers */
- audiots_save_regs_t ts_save_regs[TS_MAX_HW_CHANNELS];
- /* saved controller regs */
- ddi_acc_handle_t ts_chandle; /* handle to config regs */
- ddi_acc_handle_t ts_handle; /* handle to mapped regs */
- audio_device_t ts_dev_info; /* device info strings */
- int ts_instance; /* device instance */
- uint16_t ts_shadow[64]; /* ac97 shadow registers */
- boolean_t ts_pm_core; /* power manage audio core? */
- int ts_suspended; /* power management state */
- int ts_powered; /* device powered up? */
- int ts_busy_cnt; /* device busy count */
- ddi_dma_attr_t *ts_dma_attr; /* DMA attributes */
- ddi_dma_handle_t ts_ph; /* play DMA handles */
- ddi_dma_handle_t ts_ch; /* capture DMA handles */
- ddi_dma_cookie_t ts_pc; /* play DMA cookies */
- ddi_dma_cookie_t ts_cc; /* capture DMA cookies */
- ddi_acc_handle_t ts_pmh; /* play DMA memory handles */
- ddi_acc_handle_t ts_cmh; /* capture DMA memory handles */
- size_t ts_pbuf_size; /* size of play buffer */
- size_t ts_pml; /* play DMA memory length */
- size_t ts_cbuf_size; /* size of capture buffer */
- size_t ts_cml; /* capture DMA memory length */
- caddr_t ts_pb; /* play DMA buffers */
- caddr_t ts_cb; /* capture DMA buffers */
- uint16_t *ts_tcbuf; /* temp capture buffer */
- int ts_pcnt[2]; /* play count, in bytes */
- int ts_ccnt; /* capture count, in bytes */
- int ts_psamples[2]; /* play samples */
- uint_t ts_output_muted; /* output muted */
- uint_t ts_psample_rate; /* play sample rate */
- uint_t ts_pchannels; /* play channels */
- uint_t ts_pprecision; /* play precision */
- uint_t ts_csample_rate; /* capture sample rate */
- uint_t ts_cchannels; /* capture channels */
- uint_t ts_cprecision; /* capture precision */
- uint_t ts_output_port; /* current output port */
- uint_t ts_input_port; /* current input port */
- uint16_t ts_monitor_gain; /* monitor gain */
- int ts_rev_id; /* SB Chip Revision ID */
+ audiots_port_t *ts_ports[TS_NUM_PORTS];
+ /* hardware engines */
+
+ ddi_acc_handle_t ts_pcih; /* handle to config regs */
+ ddi_acc_handle_t ts_acch; /* handle to mapped regs */
+ boolean_t ts_suspended; /* power management state */
+ boolean_t ts_swapped; /* swapped left/right? */
+
+ uint32_t ts_devid;
+ uint8_t ts_revid; /* SB Chip Revision ID */
+
};
typedef struct audiots_state audiots_state_t;
_NOTE(MUTEX_PROTECTS_DATA(audiots_state::ts_lock, audiots_state))
_NOTE(READ_ONLY_DATA(audiots_state::ts_instance))
_NOTE(READ_ONLY_DATA(audiots_state::ts_dip))
-_NOTE(READ_ONLY_DATA(audiots_state::ts_ahandle))
+_NOTE(READ_ONLY_DATA(audiots_state::ts_adev))
/* audiots_state.ts_flags defines */
-#define TS_DMA_ENGINE_INITIALIZED 0x0001u /* play DMA eng. initialized */
-#define TS_DMA_ENGINE_PAUSED 0x0002u /* play DMA engine paused */
-#define TS_DMA_ENGINE_EMPTY 0x0004u /* play DMA engine empty */
-#define TS_DMA_RECORD_START 0x0008u /* record DMA engine started */
-#define TS_INTR_PENDING 0x0010u /* interrupt pending at DMA */
- /* stop */
+#define TS_MUTEX_INIT 0x0001u /* mutex initialized */
+#define TS_INTR_INSTALLED 0x0002u /* intr handler installeld */
#define TS_AUDIO_READ_FAILED 0x0020u /* reading the AC97 register */
/* has stopped working */
#define TS_READ_FAILURE_PRINTED 0x0040u /* Flag to avoid flooding the */
/* console with AC97 failure */
/* messages */
-#define TS_ATTACH_PWR 0x0080u /* Power raised at */
- /* attach time */
-#define TS_PM_SUPPORTED 0x0100u /* PM supported? */
-#define TS_PLAY_ACTIVE 0x0200u /* play active, for PM */
/*
* Read and write the AC-97 Codec's registers
@@ -603,10 +536,4 @@ _NOTE(READ_ONLY_DATA(audiots_state::ts_ahandle))
ddi_put32((handle), (uint32_t *)(addr), \
(ddi_get32((handle), (uint32_t *)(addr)) & (uint32_t)(val)));
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOTS_IMPL_H */
+#endif /* _AUDIOTS_H */
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c
new file mode 100644
index 0000000000..f1b05a5a25
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.c
@@ -0,0 +1,1070 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Driver for the VIA8233/8235 AC97 audio controller
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/pci.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include <sys/audio/ac97.h>
+
+#include "audiovia823x.h"
+
+static struct ddi_device_acc_attr dev_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static struct ddi_device_acc_attr buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_dma_attr_t dma_attr_sgd = {
+ DMA_ATTR_V0, /* version number */
+ 0x00000000, /* low DMA address range */
+ 0xffffffff, /* high DMA address range */
+ 0x0000ffff, /* DMA counter register */
+ 8, /* DMA address alignment */
+ 0x3c, /* DMA burstsizes */
+ 8, /* min effective DMA size */
+ 0xffffffff, /* max DMA xfer size */
+ 0x00000fff, /* segment boundary */
+ 1, /* s/g length */
+ 8, /* granularity of device */
+ 0 /* Bus specific DMA flags */
+};
+
+static ddi_dma_attr_t dma_attr_buf = {
+ DMA_ATTR_V0, /* version number */
+ 0x00000000, /* low DMA address range */
+ 0xffffffff, /* high DMA address range */
+ 0x0001fffe, /* DMA counter register */
+ 4, /* DMA address alignment */
+ 0x3c, /* DMA burstsizes */
+ 4, /* min effective DMA size */
+ 0x0001ffff, /* max DMA xfer size */
+ 0x0001ffff, /* segment boundary */
+ 1, /* s/g length */
+ 4, /* granularity of device */
+ 0 /* Bus specific DMA flags */
+};
+
+static int auvia_attach(dev_info_t *);
+static int auvia_resume(dev_info_t *);
+static int auvia_detach(auvia_devc_t *);
+static int auvia_suspend(auvia_devc_t *);
+
+static int auvia_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void auvia_close(void *);
+static int auvia_start(void *);
+static void auvia_stop(void *);
+static int auvia_format(void *);
+static int auvia_channels(void *);
+static int auvia_rate(void *);
+static uint64_t auvia_count(void *);
+static void auvia_sync(void *, unsigned);
+static size_t auvia_qlen(void *);
+
+static uint16_t auvia_read_ac97(void *, uint8_t);
+static void auvia_write_ac97(void *, uint8_t, uint16_t);
+static int auvia_alloc_port(auvia_devc_t *, int);
+static void auvia_start_port(auvia_portc_t *);
+static void auvia_stop_port(auvia_portc_t *);
+static void auvia_update_port(auvia_portc_t *);
+static void auvia_reset_input(auvia_portc_t *);
+static void auvia_reset_output(auvia_portc_t *);
+static void auvia_destroy(auvia_devc_t *);
+static int auvia_setup_intrs(auvia_devc_t *);
+static void auvia_hwinit(auvia_devc_t *);
+static uint_t auvia_intr(caddr_t, caddr_t);
+
+static audio_engine_ops_t auvia_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ auvia_open,
+ auvia_close,
+ auvia_start,
+ auvia_stop,
+ auvia_count,
+ auvia_format,
+ auvia_channels,
+ auvia_rate,
+ auvia_sync,
+ auvia_qlen
+};
+
+static uint16_t
+auvia_read_ac97(void *arg, uint8_t index)
+{
+ auvia_devc_t *devc = arg;
+ uint32_t val = 0;
+ int i;
+
+ mutex_enter(&devc->low_mutex);
+
+ val = ((uint32_t)index << 16) | CODEC_RD;
+ OUTL(devc, devc->base + REG_CODEC, val);
+ drv_usecwait(100);
+
+ /* Check AC CODEC access time out */
+ for (i = 0; i < CODEC_TIMEOUT_COUNT; i++) {
+
+ /* if send command over, break */
+ if (INL(devc, devc->base + REG_CODEC) & CODEC_STA_VALID)
+ break;
+ drv_usecwait(50);
+ }
+
+ if (i == CODEC_TIMEOUT_COUNT) {
+ goto failed;
+ }
+
+ /* Check if Index still ours? If yes, return data, else return FAIL */
+ val = INL(devc, devc->base + REG_CODEC);
+ OUTB(devc, devc->base + REG_CODEC + 3, 0x02);
+ if (((val & CODEC_INDEX) >> 16) == index) {
+ mutex_exit(&devc->low_mutex);
+ return (val & CODEC_DATA);
+ }
+
+failed:
+ mutex_exit(&devc->low_mutex);
+ return (0xffff);
+}
+
+static void
+auvia_write_ac97(void *arg, uint8_t index, uint16_t data)
+{
+ auvia_devc_t *devc = arg;
+ uint32_t val = 0;
+ int i = 0;
+
+ mutex_enter(&devc->low_mutex);
+
+ val = ((uint32_t)index << 16) | data | CODEC_WR;
+ OUTL(devc, devc->base + REG_CODEC, val);
+ drv_usecwait(100);
+
+ /* Check AC CODEC access time out */
+ for (i = 0; i < CODEC_TIMEOUT_COUNT; i++) {
+ /* if send command over, break */
+ if (!(INL(devc, devc->base + REG_CODEC) & CODEC_IN_CMD))
+ break;
+ drv_usecwait(50);
+ }
+
+ mutex_exit(&devc->low_mutex);
+}
+
+static uint_t
+auvia_intr(caddr_t argp, caddr_t nocare)
+{
+ auvia_devc_t *devc = (void *)argp;
+ auvia_portc_t *portc;
+ uint32_t gstat;
+ uint8_t status;
+ unsigned intrs = 0;
+
+ _NOTE(ARGUNUSED(nocare));
+
+ mutex_enter(&devc->mutex);
+ if (devc->suspended) {
+ mutex_exit(&devc->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ gstat = INL(devc, devc->base + REG_GSTAT);
+ if (gstat == 0) {
+ mutex_exit(&devc->mutex);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ portc = devc->portc[i];
+
+ status = INB(devc, portc->base + OFF_STATUS);
+ if ((status & STATUS_INTR) == 0) {
+ /* clear any other interrupts */
+ continue;
+ }
+
+ /*
+ * NB: The old code did some goofy things to update
+ * the last valid SGD. However, since we don't ever
+ * reach the last valid SGD (because we loop first), I
+ * don't believe we need to do that. It would appear
+ * that NetBSD does the same.
+ */
+ /* port interrupt */
+ if (portc->started) {
+ intrs |= (1U << i);
+ }
+ /* XXX: do we really need to do this? */
+ OUTB(devc, portc->base + OFF_STATUS, status);
+ }
+
+ OUTL(devc, devc->base + REG_GSTAT, gstat);
+
+ mutex_exit(&devc->mutex);
+ if (intrs & (1U << AUVIA_PLAY_SGD_NUM)) {
+ audio_engine_consume(devc->portc[AUVIA_PLAY_SGD_NUM]->engine);
+ }
+ if (intrs & (1U << AUVIA_REC_SGD_NUM)) {
+ audio_engine_produce(devc->portc[AUVIA_REC_SGD_NUM]->engine);
+ }
+ if (devc->ksp) {
+ AUVIA_KIOP(devc)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ return (DDI_INTR_CLAIMED);
+}
+
+/*
+ * Audio routines
+ */
+
+int
+auvia_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ _NOTE(ARGUNUSED(flag));
+
+ portc->started = B_FALSE;
+ portc->count = 0;
+ *fragfrp = portc->fragfr;
+ *nfragsp = AUVIA_NUM_SGD;
+ *bufp = portc->buf_kaddr;
+
+ mutex_enter(&devc->mutex);
+ portc->reset(portc);
+ mutex_exit(&devc->mutex);
+
+ return (0);
+}
+
+void
+auvia_close(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ auvia_stop_port(portc);
+ portc->started = B_FALSE;
+ mutex_exit(&devc->mutex);
+}
+
+int
+auvia_start(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ if (!portc->started) {
+ auvia_start_port(portc);
+ portc->started = B_TRUE;
+ }
+ mutex_exit(&devc->mutex);
+ return (0);
+}
+
+void
+auvia_stop(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+
+ mutex_enter(&devc->mutex);
+ if (portc->started) {
+ auvia_stop_port(portc);
+ portc->started = B_FALSE;
+ }
+ mutex_exit(&devc->mutex);
+}
+
+int
+auvia_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_LE);
+}
+
+int
+auvia_channels(void *arg)
+{
+ auvia_portc_t *portc = arg;
+
+ return (portc->nchan);
+}
+
+int
+auvia_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+void
+auvia_sync(void *arg, unsigned nframes)
+{
+ auvia_portc_t *portc = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(portc->buf_dmah, 0, 0, portc->syncdir);
+}
+
+size_t
+auvia_qlen(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+ return (0);
+}
+
+uint64_t
+auvia_count(void *arg)
+{
+ auvia_portc_t *portc = arg;
+ auvia_devc_t *devc = portc->devc;
+ uint64_t val;
+
+ mutex_enter(&devc->mutex);
+ auvia_update_port(portc);
+ /*
+ * The residual is in bytes. We have to convert to frames,
+ * and then subtract it from the fragment size to get the
+ * number of frames processed. It is somewhat unfortunate thta
+ * this (the division) has to happen under the lock. If we
+ * restricted ourself to stereo out, this would be a simple
+ * shift.
+ */
+ val = portc->count +
+ (portc->fragfr - (portc->resid / (portc->nchan * 2)));
+ mutex_exit(&devc->mutex);
+
+ return (val);
+}
+
+
+/* private implementation bits */
+
+void
+auvia_start_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+
+ ASSERT(mutex_owned(&devc->mutex));
+
+ if (devc->suspended)
+ return;
+
+ /*
+ * Start with autoinit and SGD flag
+ * interrupts enabled.
+ */
+ OUTB(devc, portc->base + OFF_CTRL,
+ CTRL_START | CTRL_AUTOSTART | CTRL_FLAG);
+}
+
+void
+auvia_stop_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE);
+}
+
+void
+auvia_update_port(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t frag;
+ uint32_t n;
+
+ ASSERT(mutex_owned(&devc->mutex));
+ if (devc->suspended) {
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+ n = 0;
+ } else {
+ frag = INL(devc, portc->base + OFF_COUNT);
+ portc->resid = (frag & 0xffffff);
+ frag >>= 24;
+ frag &= 0xff;
+
+ if (frag >= portc->cur_frag) {
+ n = frag - portc->cur_frag;
+ } else {
+ n = frag + AUVIA_NUM_SGD - portc->cur_frag;
+ }
+ portc->count += (n * portc->fragfr);
+ portc->cur_frag = frag;
+ }
+}
+
+void
+auvia_reset_output(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t cmap;
+
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE); /* Stop */
+ OUTL(devc, portc->base + OFF_DMA, portc->sgd_paddr);
+
+ OUTB(devc, portc->base + OFF_PLAYFMT,
+ PLAYFMT_16BIT | (portc->nchan << 4));
+
+ /* Select channel assignment - not valid for 8233A */
+ if (devc->chip_type != CHIP_8233A) {
+ /*
+ * Undocumented slot mapping table:
+ *
+ * slot 3 = 1 (left)
+ * slot 4 = 2 (right)
+ * slot 6 = 5 (center)
+ * slot 9 = 6 (lfe)
+ * slot 7 = 3 (left rear)
+ * slot 8 = 4 (right rear)
+ */
+ switch (portc->nchan) {
+ case 1:
+ cmap = (1 << 0) | (1 << 4);
+ break;
+ case 2:
+ cmap = (1 << 0) | (2 << 4);
+ break;
+ case 4:
+ cmap = (1 << 0) | (2 << 4) | (3 << 8) | (4 << 12);
+ break;
+ case 6:
+ cmap = (1 << 0) | (2 << 4) |
+ (5 << 8) | (6 << 12) | (3 << 16) | (4 << 20);
+ break;
+ default:
+ cmap = 0;
+ break;
+ }
+ OUTL(devc, portc->base + OFF_CHANNELS, cmap | 0xFF000000U);
+ }
+}
+
+static void
+auvia_reset_input(auvia_portc_t *portc)
+{
+ auvia_devc_t *devc = portc->devc;
+ uint32_t fmt;
+
+ portc->cur_frag = 0;
+ portc->resid = portc->fragsz;
+
+ if (devc->suspended)
+ return;
+
+ OUTB(devc, portc->base + OFF_CTRL, CTRL_TERMINATE); /* Stop */
+ OUTL(devc, portc->base + OFF_DMA, portc->sgd_paddr);
+
+ fmt = RECFMT_STEREO | RECFMT_16BIT;
+
+ if (devc->chip_type != CHIP_8233A) {
+ fmt |= RECFMT_48K;
+ }
+ fmt |= (0xffU << 24);
+ OUTB(devc, portc->base + OFF_RECFIFO, RECFIFO_ENABLE);
+ OUTL(devc, portc->base + OFF_RECFMT, fmt);
+}
+
+int
+auvia_alloc_port(auvia_devc_t *devc, int num)
+{
+ auvia_portc_t *portc;
+ size_t len;
+ ddi_dma_cookie_t cookie;
+ uint_t count;
+ int dir;
+ char *prop;
+ unsigned caps;
+ audio_dev_t *adev;
+ uint32_t *desc;
+ uint32_t paddr;
+
+ adev = devc->adev;
+ portc = kmem_zalloc(sizeof (*portc), KM_SLEEP);
+ devc->portc[num] = portc;
+ portc->devc = devc;
+ portc->started = B_FALSE;
+
+ switch (num) {
+ case AUVIA_REC_SGD_NUM:
+ prop = "record-interrupts";
+ portc->base = devc->base + REG_RECBASE;
+ portc->syncdir = DDI_DMA_SYNC_FORKERNEL;
+ portc->nchan = 2;
+ portc->reset = auvia_reset_input;
+ caps = ENGINE_INPUT_CAP;
+ dir = DDI_DMA_READ;
+ break;
+ case AUVIA_PLAY_SGD_NUM:
+ prop = "play-interrupts";
+ portc->base = devc->base + REG_PLAYBASE;
+ portc->syncdir = DDI_DMA_SYNC_FORDEV;
+ portc->nchan = 6;
+ portc->reset = auvia_reset_output;
+ caps = ENGINE_OUTPUT_CAP;
+ dir = DDI_DMA_WRITE;
+ break;
+ default:
+ return (DDI_FAILURE);
+ }
+
+ /* make sure port is shut down */
+ OUTB(portc->devc, portc->base + OFF_CTRL, CTRL_TERMINATE);
+
+ /* figure out fragment configuration */
+ portc->intrs = ddi_prop_get_int(DDI_DEV_T_ANY, devc->dip,
+ DDI_PROP_DONTPASS, prop, AUVIA_INTRS);
+
+ /* make sure the values are good */
+ if (portc->intrs < AUVIA_MIN_INTRS) {
+ audio_dev_warn(adev, "%s too low, %d, reset to %d",
+ prop, portc->intrs, AUVIA_INTRS);
+ portc->intrs = AUVIA_INTRS;
+ } else if (portc->intrs > AUVIA_MAX_INTRS) {
+ audio_dev_warn(adev, "%s too high, %d, reset to %d",
+ prop, portc->intrs, AUVIA_INTRS);
+ portc->intrs = AUVIA_INTRS;
+ }
+
+ portc->fragfr = 48000 / portc->intrs;
+ portc->fragsz = portc->fragfr * portc->nchan * 2;
+ portc->buf_size = portc->fragsz * AUVIA_NUM_SGD;
+
+ /* first allocate up space for SGD list */
+ if (ddi_dma_alloc_handle(devc->dip, &dma_attr_sgd,
+ DDI_DMA_SLEEP, NULL, &portc->sgd_dmah) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate SGD handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_mem_alloc(portc->sgd_dmah,
+ AUVIA_NUM_SGD * 2 * sizeof (uint32_t), &dev_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &portc->sgd_kaddr,
+ &len, &portc->sgd_acch) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate SGD memory");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_addr_bind_handle(portc->sgd_dmah, NULL,
+ portc->sgd_kaddr, len, DDI_DMA_CONSISTENT | DDI_DMA_WRITE,
+ DDI_DMA_SLEEP, NULL, &cookie, &count) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed binding SGD DMA handle");
+ return (DDI_FAILURE);
+ }
+ portc->sgd_paddr = cookie.dmac_address;
+
+ /* now buffers */
+ if (ddi_dma_alloc_handle(devc->dip, &dma_attr_buf, DDI_DMA_SLEEP, NULL,
+ &portc->buf_dmah) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate BUF handle");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_mem_alloc(portc->buf_dmah, portc->buf_size,
+ &buf_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
+ &portc->buf_kaddr, &len, &portc->buf_acch) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed to allocate BUF memory");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_dma_addr_bind_handle(portc->buf_dmah, NULL, portc->buf_kaddr,
+ len, DDI_DMA_CONSISTENT | dir, DDI_DMA_SLEEP, NULL, &cookie,
+ &count) != DDI_SUCCESS) {
+ audio_dev_warn(adev, "failed binding BUF DMA handle");
+ return (DDI_FAILURE);
+ }
+ portc->buf_paddr = cookie.dmac_address;
+
+ /* now wire descriptors up */
+ desc = (void *)portc->sgd_kaddr;
+ paddr = portc->buf_paddr;
+ for (int i = 0; i < AUVIA_NUM_SGD; i++) {
+ uint32_t flags;
+
+ flags = AUVIA_SGD_FLAG | portc->fragsz;
+
+ if (i == (AUVIA_NUM_SGD - 1)) {
+ flags |= AUVIA_SGD_EOL;
+ }
+ ddi_put32(portc->sgd_acch, desc++, paddr);
+ ddi_put32(portc->sgd_acch, desc++, flags);
+ paddr += portc->fragsz;
+ }
+
+ ddi_dma_sync(portc->sgd_dmah, 0, 0, DDI_DMA_SYNC_FORDEV);
+
+ portc->engine = audio_engine_alloc(&auvia_engine_ops, caps);
+ if (portc->engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(portc->engine, portc);
+ audio_dev_add_engine(adev, portc->engine);
+
+ return (DDI_SUCCESS);
+}
+
+int
+auvia_setup_intrs(auvia_devc_t *devc)
+{
+ uint_t ipri;
+ int actual;
+ int rv;
+ ddi_intr_handle_t ih[1];
+
+ rv = ddi_intr_alloc(devc->dip, ih, DDI_INTR_TYPE_FIXED,
+ 0, 1, &actual, DDI_INTR_ALLOC_STRICT);
+ if ((rv != DDI_SUCCESS) || (actual != 1)) {
+ audio_dev_warn(devc->adev,
+ "Can't alloc interrupt handle (rv %d actual %d)",
+ rv, actual);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_get_pri(ih[0], &ipri) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "Can't get interrupt priority");
+ (void) ddi_intr_free(ih[0]);
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_intr_add_handler(ih[0], auvia_intr, devc, NULL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "Can't add interrupt handler");
+ (void) ddi_intr_free(ih[0]);
+ return (DDI_FAILURE);
+ }
+
+ devc->ih = ih[0];
+ mutex_init(&devc->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ mutex_init(&devc->low_mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri));
+ return (DDI_SUCCESS);
+}
+
+void
+auvia_destroy(auvia_devc_t *devc)
+{
+ if (devc->ih != NULL) {
+ (void) ddi_intr_disable(devc->ih);
+ (void) ddi_intr_remove_handler(devc->ih);
+ (void) ddi_intr_free(devc->ih);
+ mutex_destroy(&devc->mutex);
+ mutex_destroy(&devc->low_mutex);
+ }
+
+ if (devc->ksp) {
+ kstat_delete(devc->ksp);
+ }
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+ auvia_portc_t *portc = devc->portc[i];
+ if (!portc)
+ continue;
+ if (portc->engine) {
+ audio_dev_remove_engine(devc->adev, portc->engine);
+ audio_engine_free(portc->engine);
+ }
+ if (portc->sgd_paddr) {
+ (void) ddi_dma_unbind_handle(portc->sgd_dmah);
+ }
+ if (portc->sgd_acch) {
+ ddi_dma_mem_free(&portc->sgd_acch);
+ }
+ if (portc->sgd_dmah) {
+ ddi_dma_free_handle(&portc->sgd_dmah);
+ }
+ if (portc->buf_paddr) {
+ (void) ddi_dma_unbind_handle(portc->buf_dmah);
+ }
+ if (portc->buf_acch) {
+ ddi_dma_mem_free(&portc->buf_acch);
+ }
+ if (portc->buf_dmah) {
+ ddi_dma_free_handle(&portc->buf_dmah);
+ }
+ kmem_free(portc, sizeof (*portc));
+ }
+
+ if (devc->ac97 != NULL) {
+ ac97_free(devc->ac97);
+ }
+ if (devc->adev != NULL) {
+ audio_dev_free(devc->adev);
+ }
+ if (devc->regsh != NULL) {
+ ddi_regs_map_free(&devc->regsh);
+ }
+ if (devc->pcih != NULL) {
+ pci_config_teardown(&devc->pcih);
+ }
+ kmem_free(devc, sizeof (*devc));
+}
+
+void
+auvia_hwinit(auvia_devc_t *devc)
+{
+ ddi_acc_handle_t pcih = devc->pcih;
+ uint32_t val;
+
+ val = pci_config_get32(pcih, AUVIA_PCICFG);
+ /* we want to disable all legacy */
+ val &= ~AUVIA_PCICFG_LEGACY;
+ val &= ~(AUVIA_PCICFG_FMEN | AUVIA_PCICFG_SBEN);
+
+ /* enable AC'97 link and clear the reset bit */
+ val |= (AUVIA_PCICFG_ACLINKEN | AUVIA_PCICFG_NRST);
+ /* disable SRC (we won't use it) */
+ val &= ~AUVIA_PCICFG_SRCEN;
+ /* enable the SGD engines */
+ val |= AUVIA_PCICFG_SGDEN;
+
+ pci_config_put32(pcih, AUVIA_PCICFG, val);
+
+ drv_usecwait(10);
+}
+
+int
+auvia_attach(dev_info_t *dip)
+{
+ uint8_t pci_revision;
+ uint16_t pci_command, vendor, device;
+ auvia_devc_t *devc;
+ ddi_acc_handle_t pcih;
+ const char *version;
+
+ devc = kmem_zalloc(sizeof (*devc), KM_SLEEP);
+ devc->dip = dip;
+ ddi_set_driver_private(dip, devc);
+
+ if ((devc->adev = audio_dev_alloc(dip, 0)) == NULL) {
+ cmn_err(CE_WARN, "audio_dev_alloc failed");
+ goto error;
+ }
+
+ if (pci_config_setup(dip, &pcih) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "pci_config_setup failed");
+ goto error;
+ }
+ devc->pcih = pcih;
+
+ vendor = pci_config_get16(pcih, PCI_CONF_VENID);
+ device = pci_config_get16(pcih, PCI_CONF_DEVID);
+ if ((vendor != VIA_VENDOR_ID) || (device != VIA_8233_ID &&
+ device != VIA_8233A_ID)) {
+ audio_dev_warn(devc->adev, "Hardware not recognized "
+ "(vendor=%x, dev=%x)", vendor, device);
+ goto error;
+ }
+
+ devc->chip_type = CHIP_8233;
+ devc->chip_name = "VIA VT8233";
+ version = "8233";
+
+ pci_revision = pci_config_get8(pcih, PCI_CONF_REVID);
+
+ if (pci_revision == 0x50) {
+ devc->chip_name = "VIA VT8235";
+ version = "8235";
+ }
+
+ if (pci_revision == 0x60) {
+ devc->chip_name = "VIA VT8237";
+ version = "8237";
+ }
+
+ if ((device == VIA_8233A_ID) ||
+ (device == VIA_8233_ID && pci_revision == 0x40)) {
+ devc->chip_type = CHIP_8233A;
+ devc->chip_name = "VIA VT8233A";
+ version = "8233A";
+ }
+ audio_dev_set_description(devc->adev, devc->chip_name);
+ audio_dev_set_version(devc->adev, version);
+
+ pci_command = pci_config_get16(pcih, PCI_CONF_COMM);
+ pci_command |= PCI_COMM_ME | PCI_COMM_IO | PCI_COMM_MAE;
+ pci_config_put16(pcih, PCI_CONF_COMM, pci_command);
+
+ if ((ddi_regs_map_setup(dip, 1, &devc->base, 0, 0, &dev_attr,
+ &devc->regsh)) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "failed to map registers");
+ goto error;
+ }
+
+ auvia_hwinit(devc);
+
+ if ((auvia_alloc_port(devc, AUVIA_PLAY_SGD_NUM) != DDI_SUCCESS) ||
+ (auvia_alloc_port(devc, AUVIA_REC_SGD_NUM) != DDI_SUCCESS)) {
+ goto error;
+ }
+
+ if (auvia_setup_intrs(devc) != DDI_SUCCESS) {
+ goto error;
+ }
+
+ devc->ac97 = ac97_alloc(dip, auvia_read_ac97, auvia_write_ac97, devc);
+ if (devc->ac97 == NULL) {
+ audio_dev_warn(devc->adev, "failed to allocate ac97 handle");
+ goto error;
+ }
+
+ if (ac97_init(devc->ac97, devc->adev) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "failed to init ac97");
+ goto error;
+ }
+
+ /* set up kernel statistics */
+ if ((devc->ksp = kstat_create(AUVIA_NAME, ddi_get_instance(dip),
+ AUVIA_NAME, "controller", KSTAT_TYPE_INTR, 1,
+ KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(devc->ksp);
+ }
+
+ if (audio_dev_register(devc->adev) != DDI_SUCCESS) {
+ audio_dev_warn(devc->adev, "unable to register with framework");
+ goto error;
+ }
+
+ (void) ddi_intr_enable(devc->ih);
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ auvia_destroy(devc);
+ return (DDI_FAILURE);
+}
+
+int
+auvia_resume(dev_info_t *dip)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ auvia_hwinit(devc);
+
+ /* allow ac97 operations again */
+ ac97_resume(devc->ac97);
+
+ mutex_enter(&devc->mutex);
+ devc->suspended = B_TRUE;
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+
+ if (portc->engine != NULL)
+ audio_engine_reset(portc->engine);
+
+ /* reset the port */
+ portc->reset(portc);
+
+ if (portc->started) {
+ auvia_start_port(portc);
+ } else {
+ auvia_stop_port(portc);
+ }
+ }
+ mutex_exit(&devc->mutex);
+ return (DDI_SUCCESS);
+}
+
+
+int
+auvia_detach(auvia_devc_t *devc)
+{
+ if (audio_dev_unregister(devc->adev) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ auvia_destroy(devc);
+ return (DDI_SUCCESS);
+}
+
+int
+auvia_suspend(auvia_devc_t *devc)
+{
+ ac97_suspend(devc->ac97);
+
+ mutex_enter(&devc->mutex);
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+ auvia_stop_port(portc);
+ }
+ devc->suspended = B_TRUE;
+ mutex_exit(&devc->mutex);
+ return (DDI_SUCCESS);
+}
+
+static int auvia_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int auvia_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int auvia_ddi_quiesce(dev_info_t *);
+
+static struct dev_ops auvia_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ NULL, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ auvia_ddi_attach, /* attach */
+ auvia_ddi_detach, /* detach */
+ nodev, /* reset */
+ NULL, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+ auvia_ddi_quiesce, /* quiesce */
+};
+
+static struct modldrv auvia_modldrv = {
+ &mod_driverops, /* drv_modops */
+ "Via 823x Audio", /* linkinfo */
+ &auvia_dev_ops, /* dev_ops */
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1,
+ { &auvia_modldrv, NULL }
+};
+
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&auvia_dev_ops, AUVIA_NAME);
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ audio_fini_ops(&auvia_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) == 0) {
+ audio_fini_ops(&auvia_dev_ops);
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
+
+int
+auvia_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (auvia_attach(dip));
+
+ case DDI_RESUME:
+ return (auvia_resume(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+int
+auvia_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ switch (cmd) {
+ case DDI_DETACH:
+ return (auvia_detach(devc));
+
+ case DDI_SUSPEND:
+ return (auvia_suspend(devc));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+int
+auvia_ddi_quiesce(dev_info_t *dip)
+{
+ auvia_devc_t *devc;
+
+ devc = ddi_get_driver_private(dip);
+
+ for (int i = 0; i < AUVIA_NUM_PORTC; i++) {
+
+ auvia_portc_t *portc = devc->portc[i];
+ auvia_stop_port(portc);
+ }
+ return (DDI_SUCCESS);
+}
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf
new file mode 100644
index 0000000000..4b98468d88
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.conf
@@ -0,0 +1,41 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the audiovia823x audio driver.
+#
+# WARNING: This is an UNSTABLE configuration file. Its contents
+# may change at any time.
+
+#
+# play-interrupts sets the number of interrupts per second when playing.
+# This affects the resolution of various things, such as sample counts.
+# record-interrupts does the same for record interrupts.
+#
+# These may be tuned to get more accurate information by increasing the
+# count. However, the larger the interrupts per second the larger the
+# load on the system. So use this capability cautiously. The audiovia823x
+# driver enforces a maximum and minimum count.
+#
+play-interrupts=175;
+record-interrupts=175;
diff --git a/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h
new file mode 100644
index 0000000000..f2eb52ce50
--- /dev/null
+++ b/usr/src/uts/common/io/audio/drv/audiovia823x/audiovia823x.h
@@ -0,0 +1,191 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Definitions for the via8233 driver
+ */
+/*
+ * This file is part of Open Sound System
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This software is released under CDDL 1.0 source license.
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ */
+#ifndef AUDIOVIA823X_H
+#define AUDIOVIA823X_H
+
+#define AUVIA_NAME "audiovia823x"
+
+#define VIA_VENDOR_ID 0x1106
+#define VIA_8233_ID 0x3059
+#define VIA_8233A_ID 0x7059
+
+/* pci configuration registers */
+#define AUVIA_PCICFG 0x40 /* Via chip specific cfg reg */
+#define AUVIA_PCICFG_LEGACY 0x00ff0000 /* legacy enables mask */
+#define AUVIA_PCICFG_ACLINKEN 0x00008000 /* AC'97 link enable */
+#define AUVIA_PCICFG_NRST 0x00004000 /* inverse of AC'97 reset */
+#define AUVIA_PCICFG_ACSYNC 0x00002000 /* AC'97 sync */
+#define AUVIA_PCICFG_SRCEN 0x00000800 /* sample rate converter en */
+#define AUVIA_PCICFG_SGDEN 0x00000400 /* SGD enable */
+#define AUVIA_PCICFG_FMEN 0x00000200 /* FM synth enable (legacy) */
+#define AUVIA_PCICFG_SBEN 0x00000100 /* SB compat enable (legacy) */
+#define AUVIA_PCICFG_PRIVALID 0x00000001 /* primary codec ready */
+
+#define AUVIA_PLAY_SGD_NUM 1
+#define AUVIA_REC_SGD_NUM 0
+#define AUVIA_NUM_PORTC 2
+#define AUVIA_NUM_SGD 16 /* number of fragments */
+
+#define AUVIA_MAX_INTRS 256
+#define AUVIA_MIN_INTRS 24
+#define AUVIA_INTRS 175
+
+#define AUVIA_SGD_EOL 0x80000000
+#define AUVIA_SGD_FLAG 0x40000000
+
+#define CODEC_TIMEOUT_COUNT 500
+
+#define REG_PLAYBASE 0x40 /* Multichannel SGD */
+#define REG_RECBASE 0x60
+#define REG_CODEC 0x80 /* Access AC97 Codec */
+#define REG_GSTAT 0x84 /* Global status */
+
+/* REG_CODEC */
+#define CODEC_IN_CMD 0x01000000 /* busy in sending */
+#define CODEC_STA_VALID 0x02000000 /* 1:status data is valid */
+#define CODEC_RD 0x00800000 /* Read CODEC status */
+#define CODEC_WR 0x00000000 /* Write CODEC status */
+#define CODEC_INDEX 0x007F0000 /* Index of command register */
+#define CODEC_DATA 0x0000FFFF /* AC97 status register data */
+
+/* registers that are offsets relative to a port */
+#define OFF_STATUS 0x00
+#define OFF_CTRL 0x01
+#define OFF_PLAYFMT 0x02
+#define OFF_RECFIFO 0x02
+#define OFF_DMA 0x04
+#define OFF_CHANNELS 0x08
+#define OFF_RECFMT 0x08
+#define OFF_COUNT 0x0C
+
+/* bits for above offsets */
+#define STATUS_INTR 0x3
+
+#define CTRL_START 0x80
+#define CTRL_TERMINATE 0x40
+#define CTRL_AUTOSTART 0x20
+#define CTRL_MULTICHORDER 0x10 /* SGD 0x40 only, Center/LFE order */
+#define CTRL_FLAG 0x01
+
+#define PLAYFMT_16BIT 0x80
+#define PLAYFMT_STEREO 0x20 /* Num channels (1-6), upper nybble */
+#define PLAYFMT_6CH 0x60
+#define PLAYFMT_4CH 0x40
+
+#define RECFIFO_ENABLE 0x40
+
+#define RECFMT_48K 0x00ffffff
+#define RECFMT_STEREO 0x00100000
+#define RECFMT_16BIT 0x00200000
+
+
+typedef struct {
+ unsigned int phaddr;
+ unsigned int flags;
+} SGD_entry;
+
+typedef struct auvia_portc auvia_portc_t;
+typedef struct auvia_devc auvia_devc_t;
+
+struct auvia_portc {
+ auvia_devc_t *devc;
+ audio_engine_t *engine;
+ caddr_t base; /* base for registers */
+ boolean_t started;
+ int nchan;
+
+ ddi_dma_handle_t sgd_dmah; /* dma for descriptors */
+ ddi_acc_handle_t sgd_acch;
+ uint32_t sgd_paddr;
+ caddr_t sgd_kaddr;
+
+ ddi_dma_handle_t buf_dmah; /* dma for buffers */
+ ddi_acc_handle_t buf_acch;
+ uint32_t buf_paddr;
+ caddr_t buf_kaddr;
+ size_t buf_size;
+ int syncdir;
+
+ unsigned intrs;
+ unsigned fragfr;
+ unsigned fragsz;
+ unsigned cur_frag;
+ unsigned resid;
+
+ uint64_t count;
+
+ /* helper functions */
+ void (*reset)(auvia_portc_t *);
+};
+
+
+struct auvia_devc {
+ dev_info_t *dip;
+ audio_dev_t *adev;
+ ac97_t *ac97;
+ kstat_t *ksp;
+ boolean_t suspended;
+
+ char *chip_name;
+ int chip_type;
+#define CHIP_8233 0
+#define CHIP_8233A 1
+
+ /* registers */
+ ddi_acc_handle_t pcih;
+ ddi_acc_handle_t regsh;
+ caddr_t base;
+
+ kmutex_t mutex; /* For normal locking */
+ kmutex_t low_mutex; /* For low level routines */
+ ddi_intr_handle_t ih;
+ auvia_portc_t *portc[AUVIA_NUM_PORTC];
+};
+
+#define AUVIA_KIOP(X) ((kstat_intr_t *)(X->ksp->ks_data))
+
+#define INL(devc, reg) ddi_get32(devc->regsh, (void *)(reg))
+
+#define INB(devc, reg) ddi_get8(devc->regsh, (void *)(reg))
+
+#define OUTL(devc, reg, val) ddi_put32(devc->regsh, (void *)(reg), (val))
+
+#define OUTB(devc, reg, val) ddi_put8(devc->regsh, (void *)(reg), (val))
+
+#endif /* AUDIOVIA823X_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio.conf b/usr/src/uts/common/io/audio/impl/audio.conf
new file mode 100644
index 0000000000..ca5a83e886
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio.conf
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the common audio driver.
+#
+
+#
+# We are a pseudo driver.
+#
+name="audio" parent="pseudo" instance=0;
+
+#
+# We want to always be present and never removed. This is important
+# to ensure that device numbering is not lost due to the driver being
+# forced out of memory automatically.
+#
+ddi-forceattach=1;
+ddi-no-autodetach=1;
diff --git a/usr/src/uts/common/io/audio/impl/audio_client.c b/usr/src/uts/common/io/audio/impl/audio_client.c
new file mode 100644
index 0000000000..f3514df49b
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_client.c
@@ -0,0 +1,1675 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include <sys/file.h>
+#include <sys/open.h>
+#include <sys/stat.h>
+#include <sys/errno.h>
+#include <sys/atomic.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Client implementation.
+ */
+
+/*
+ * Attenuation table for dB->linear conversion. Indexed in steps of
+ * 0.5 dB. Table size is 25 dB (first entry is handled as mute).
+ *
+ * Notably, the last item in table is taken as 0 dB (i.e. maximum volume).
+ *
+ * Table contents can be calculated as follows (requires sunmath library):
+ *
+ * scale = AUDIO_VOL_SCALE;
+ * for (i = -50; i <= 0; i++) {
+ * x = exp10(0.05 * i);
+ * printf("%d: %f %.0f\n", i, x, trunc(x * scale));
+ * }
+ *
+ */
+
+const uint16_t auimpl_db_table[AUDIO_DB_SIZE + 1] = {
+ 0, 0, 1, 1, 1, 1, 1, 1, 2, 2,
+ 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
+ 8, 9, 10, 11, 12, 14, 16, 18, 20, 22,
+ 25, 28, 32, 36, 40, 45, 51, 57, 64, 72,
+ 80, 90, 101, 114, 128, 143, 161, 181, 203, 228,
+ 256
+};
+
+void *
+auclnt_get_private(audio_client_t *c)
+{
+ return (c->c_private);
+}
+
+void
+auclnt_set_private(audio_client_t *c, void *private)
+{
+ c->c_private = private;
+}
+
+int
+auclnt_set_rate(audio_stream_t *sp, int rate)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /* basic sanity checks! */
+ if ((rate < 5000) || (rate > 192000)) {
+ return (EINVAL);
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ if (rate != parms.p_rate) {
+ parms.p_rate = rate;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+ return (rv);
+}
+
+int
+auclnt_get_rate(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_rate);
+}
+
+unsigned
+auclnt_get_fragsz(audio_stream_t *sp)
+{
+ return (sp->s_fragbytes);
+}
+
+unsigned
+auclnt_get_framesz(audio_stream_t *sp)
+{
+ return (sp->s_framesz);
+}
+
+unsigned
+auclnt_get_nfrags(audio_stream_t *sp)
+{
+ return (sp->s_nfrags);
+}
+
+unsigned
+auclnt_get_nframes(audio_stream_t *sp)
+{
+ return (sp->s_nframes);
+}
+
+uint64_t
+auclnt_get_head(audio_stream_t *sp)
+{
+ return (sp->s_head);
+}
+
+uint64_t
+auclnt_get_tail(audio_stream_t *sp)
+{
+ return (sp->s_tail);
+}
+
+unsigned
+auclnt_get_hidx(audio_stream_t *sp)
+{
+ return (sp->s_hidx);
+}
+
+unsigned
+auclnt_get_tidx(audio_stream_t *sp)
+{
+ return (sp->s_tidx);
+}
+
+audio_stream_t *
+auclnt_input_stream(audio_client_t *c)
+{
+ return (&c->c_istream);
+}
+
+audio_stream_t *
+auclnt_output_stream(audio_client_t *c)
+{
+ return (&c->c_ostream);
+}
+
+unsigned
+auclnt_get_count(audio_stream_t *sp)
+{
+ unsigned count;
+
+ mutex_enter(&sp->s_lock);
+ ASSERT((sp->s_head - sp->s_tail) <= sp->s_nframes);
+ count = (unsigned)(sp->s_head - sp->s_tail);
+ mutex_exit(&sp->s_lock);
+
+ return (count);
+}
+
+unsigned
+auclnt_consume(audio_stream_t *sp, unsigned n)
+{
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp == &sp->s_client->c_istream);
+ n = max(n, sp->s_head - sp->s_tail);
+ sp->s_tail += n;
+ sp->s_tidx += n;
+ if (sp->s_tidx >= sp->s_nframes) {
+ sp->s_tidx -= sp->s_nframes;
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (n);
+}
+
+unsigned
+auclnt_consume_data(audio_stream_t *sp, caddr_t dst, unsigned n)
+{
+ unsigned nframes;
+ unsigned framesz;
+ unsigned cnt;
+ caddr_t data;
+
+ mutex_enter(&sp->s_lock);
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp == &sp->s_client->c_istream);
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < nframes);
+ ASSERT(sp->s_hidx < nframes);
+
+ cnt = n = min(n, sp->s_head - sp->s_tail);
+ data = sp->s_data + (sp->s_tidx * framesz);
+ do {
+ unsigned nf, nb;
+
+ nf = min(nframes - sp->s_tidx, n);
+ nb = nf * framesz;
+
+ bcopy(data, dst, nb);
+ dst += nb;
+ data += nb;
+
+ n -= nf;
+ sp->s_tail += nf;
+ sp->s_tidx += nf;
+ if (sp->s_tidx == nframes) {
+ sp->s_tidx = 0;
+ data = sp->s_data;
+ }
+ } while (n);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_tidx < nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (cnt);
+}
+
+unsigned
+auclnt_produce(audio_stream_t *sp, unsigned n)
+{
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp == &sp->s_client->c_ostream);
+ n = max(n, sp->s_nframes - (sp->s_head - sp->s_tail));
+ sp->s_head += n;
+ sp->s_hidx += n;
+ if (sp->s_hidx >= sp->s_nframes) {
+ sp->s_hidx -= sp->s_nframes;
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (n);
+}
+
+unsigned
+auclnt_produce_data(audio_stream_t *sp, caddr_t src, unsigned n)
+{
+ unsigned nframes;
+ unsigned framesz;
+ unsigned cnt;
+ caddr_t data;
+
+ mutex_enter(&sp->s_lock);
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp == &sp->s_client->c_ostream);
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < nframes);
+ ASSERT(sp->s_hidx < nframes);
+
+ cnt = n = min(n, nframes - (sp->s_head - sp->s_tail));
+ data = sp->s_data + (sp->s_hidx * framesz);
+ do {
+ unsigned nf, nb;
+
+ nf = min(nframes - sp->s_hidx, n);
+ nb = nf * framesz;
+
+ bcopy(src, data, nb);
+
+ src += nb;
+ data += nb;
+
+ n -= nf;
+ sp->s_head += nf;
+ sp->s_hidx += nf;
+ if (sp->s_hidx == nframes) {
+ sp->s_hidx = 0;
+ data = sp->s_data;
+ }
+ } while (n);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+
+ mutex_exit(&sp->s_lock);
+
+ return (cnt);
+}
+
+int
+auclnt_read(audio_client_t *c, struct uio *uio)
+{
+ audio_stream_t *sp = &c->c_istream;
+ unsigned cnt;
+ int rv = 0;
+ offset_t loff;
+ int eagain;
+
+ loff = uio->uio_loffset;
+ eagain = EAGAIN;
+
+ mutex_enter(&sp->s_lock);
+
+ if ((!sp->s_paused) && (!sp->s_running)) {
+ mutex_exit(&sp->s_lock);
+ auclnt_start(sp);
+ mutex_enter(&sp->s_lock);
+ }
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ while (uio->uio_resid >= sp->s_framesz) {
+
+ while ((cnt = (sp->s_head - sp->s_tail)) == 0) {
+ if (uio->uio_fmode & (FNONBLOCK|FNDELAY)) {
+ mutex_exit(&sp->s_lock);
+ return (eagain);
+ }
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+
+ cnt = min(cnt, sp->s_nframes - sp->s_tidx);
+ cnt = min(cnt, (uio->uio_resid / sp->s_framesz));
+
+ rv = uiomove(sp->s_data + (sp->s_tidx * sp->s_framesz),
+ cnt * sp->s_framesz, UIO_READ, uio);
+ uio->uio_loffset = loff;
+ eagain = 0;
+
+ if (rv != 0) {
+ mutex_exit(&sp->s_lock);
+ return (rv);
+ }
+
+ sp->s_tail += cnt;
+ sp->s_tidx += cnt;
+ if (sp->s_tidx == sp->s_nframes) {
+ sp->s_tidx = 0;
+ }
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+
+ /* round off any remaining partial bits */
+ uio->uio_resid = 0;
+
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_write(audio_client_t *c, struct uio *uio)
+{
+ audio_stream_t *sp = &c->c_ostream;
+ unsigned cnt;
+ int rv = 0;
+ offset_t loff;
+ int eagain;
+
+ loff = uio->uio_loffset;
+ eagain = EAGAIN;
+
+ mutex_enter(&sp->s_lock);
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_tidx < sp->s_nframes);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ while (uio->uio_resid >= sp->s_framesz) {
+
+ while ((cnt = sp->s_nframes - (sp->s_head - sp->s_tail)) == 0) {
+ if (uio->uio_fmode & (FNONBLOCK|FNDELAY)) {
+ mutex_exit(&sp->s_lock);
+ return (eagain);
+ }
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+
+ cnt = min(cnt, sp->s_nframes - sp->s_hidx);
+ cnt = min(cnt, (uio->uio_resid / sp->s_framesz));
+
+ rv = uiomove(sp->s_data + (sp->s_hidx * sp->s_framesz),
+ cnt * sp->s_framesz, UIO_WRITE, uio);
+ uio->uio_loffset = loff;
+ eagain = 0;
+
+ if (rv != 0) {
+ mutex_exit(&sp->s_lock);
+ return (rv);
+ }
+
+ sp->s_head += cnt;
+ sp->s_hidx += cnt;
+ if (sp->s_hidx == sp->s_nframes) {
+ sp->s_hidx = 0;
+ }
+
+ if ((!sp->s_paused) && (!sp->s_running) &&
+ ((sp->s_head - sp->s_tail) > sp->s_fragfr)) {
+ mutex_exit(&sp->s_lock);
+ auclnt_start(sp);
+ mutex_enter(&sp->s_lock);
+ }
+ }
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < sp->s_nframes);
+
+ /* round off any remaining partial bits */
+ uio->uio_resid = 0;
+
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_chpoll(audio_client_t *c, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ audio_stream_t *sp;
+ short nev = 0;
+
+ if (events & (POLLIN | POLLRDNORM)) {
+ sp = &c->c_istream;
+ mutex_enter(&sp->s_lock);
+ if ((sp->s_head - sp->s_tail) > sp->s_fragfr) {
+ nev = POLLIN | POLLRDNORM;
+ }
+ mutex_exit(&sp->s_lock);
+ }
+
+ if (events & POLLOUT) {
+ sp = &c->c_ostream;
+ mutex_enter(&sp->s_lock);
+ if ((sp->s_nframes - (sp->s_head - sp->s_tail)) >
+ sp->s_fragfr) {
+ nev = POLLOUT;
+ }
+ mutex_exit(&sp->s_lock);
+ }
+
+ if (nev) {
+ *reventsp = nev & events;
+ } else {
+ *reventsp = 0;
+ if (!anyyet) {
+ *phpp = &c->c_pollhead;
+ }
+ }
+ return (0);
+}
+
+void
+auclnt_pollwakeup(audio_client_t *c, short events)
+{
+ pollwakeup(&c->c_pollhead, events);
+}
+
+void
+auclnt_get_output_qlen(audio_client_t *c, unsigned *slen, unsigned *flen)
+{
+ audio_stream_t *sp = &c->c_ostream;
+ audio_engine_t *e = sp->s_engine;
+ uint64_t el, sl;
+ unsigned cnt, er, sr;
+
+ if (e == NULL) {
+ /* if no output engine, can't do it! */
+ *slen = 0;
+ *flen = 0;
+ return;
+ }
+
+ mutex_enter(&e->e_lock);
+ mutex_enter(&sp->s_lock);
+ el = ENG_QLEN(e) + (e->e_head - e->e_tail);
+ er = e->e_rate;
+ sl = sp->s_cnv_cnt;
+ sr = sp->s_user_parms->p_rate;
+ cnt = (unsigned)(sp->s_head - sp->s_tail);
+ mutex_exit(&sp->s_lock);
+ mutex_exit(&e->e_lock);
+
+ /* engine frames converted to stream rate, plus stream frames */
+ *slen = cnt;
+ *flen = ((unsigned)(((el * sr) / er) + sl));
+}
+
+int
+auclnt_set_format(audio_stream_t *sp, int fmt)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /*
+ * AC3: If we select an AC3 format, then we have to allocate
+ * another engine. Normally this will be an output only
+ * engine. However, for now we aren't supporting AC3
+ * passthru.
+ */
+
+ switch (fmt) {
+ case AUDIO_FORMAT_U8:
+ case AUDIO_FORMAT_ULAW:
+ case AUDIO_FORMAT_ALAW:
+ case AUDIO_FORMAT_S8:
+ case AUDIO_FORMAT_S16_LE:
+ case AUDIO_FORMAT_S16_BE:
+ case AUDIO_FORMAT_U16_LE:
+ case AUDIO_FORMAT_U16_BE:
+ case AUDIO_FORMAT_S24_LE:
+ case AUDIO_FORMAT_S24_BE:
+ case AUDIO_FORMAT_S32_LE:
+ case AUDIO_FORMAT_S32_BE:
+ case AUDIO_FORMAT_S24_PACKED:
+ break;
+
+ case AUDIO_FORMAT_AC3: /* AC3: PASSTHRU */
+ default:
+ return (ENOTSUP);
+ }
+
+
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+
+ /*
+ * Optimization. Some personalities send us the same format
+ * over and over again. (Sun personality does this
+ * repeatedly.) setup_src is potentially expensive, so we
+ * avoid doing it unless we really need to.
+ */
+ if (fmt != parms.p_format) {
+ /*
+ * Note that setting the format doesn't check that the
+ * audio streams have been paused. As a result, any
+ * data still playing or recording will probably get
+ * misinterpreted. It would be smart if the client
+ * application paused/stopped playback before changing
+ * formats.
+ */
+ parms.p_format = fmt;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_get_format(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_format);
+}
+
+int
+auclnt_get_output_format(audio_client_t *c)
+{
+ return (c->c_ostream.s_user_parms->p_format);
+}
+
+int
+auclnt_get_input_format(audio_client_t *c)
+{
+ return (c->c_istream.s_user_parms->p_format);
+}
+
+int
+auclnt_set_channels(audio_stream_t *sp, int nchan)
+{
+ audio_parms_t parms;
+ int rv = 0;
+
+ /* Validate setting */
+ if ((nchan > AUDIO_MAX_CHANNELS) || (nchan < 1)) {
+ return (EINVAL);
+ }
+
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ if (nchan != parms.p_nchan) {
+ parms.p_nchan = nchan;
+ rv = auimpl_format_setup(sp, &parms);
+ }
+ mutex_exit(&sp->s_lock);
+
+ return (rv);
+}
+
+int
+auclnt_get_channels(audio_stream_t *sp)
+{
+ return (sp->s_user_parms->p_nchan);
+}
+
+void
+auimpl_set_gain_master(audio_stream_t *sp, uint8_t gain)
+{
+ uint32_t scaled;
+
+ if (gain > 100) {
+ gain = 0;
+ }
+
+ mutex_enter(&sp->s_lock);
+ if (sp->s_gain_master == gain) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ /*
+ * calculate the scaled values. Done now to avoid calculations
+ * later.
+ */
+ scaled = (gain * sp->s_gain_pct * AUDIO_DB_SIZE) / (100 * 100);
+
+ sp->s_gain_master = gain;
+ sp->s_gain_scaled = auimpl_db_table[scaled];
+
+ if (!sp->s_muted) {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ /*
+ * No need to notify clients, since they can't see this update.
+ */
+}
+
+void
+auclnt_set_gain(audio_stream_t *sp, uint8_t gain)
+{
+ uint32_t scaled;
+
+ if (gain > 100) {
+ gain = 0;
+ }
+
+ mutex_enter(&sp->s_lock);
+
+ /* if no change, don't bother doing updates */
+ if (sp->s_gain_pct == gain) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ /*
+ * calculate the scaled values. Done now to avoid calculations
+ * later.
+ */
+ scaled = (gain * sp->s_gain_master * AUDIO_DB_SIZE) / (100 * 100);
+
+ sp->s_gain_pct = gain;
+ sp->s_gain_scaled = auimpl_db_table[scaled];
+
+ if (!sp->s_muted) {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+uint8_t
+auclnt_get_gain(audio_stream_t *sp)
+{
+ return (sp->s_gain_pct);
+}
+
+void
+auclnt_set_muted(audio_stream_t *sp, boolean_t muted)
+{
+ mutex_enter(&sp->s_lock);
+
+ /* if no work change, don't bother doing updates */
+ if (sp->s_muted == muted) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+
+ sp->s_muted = muted;
+ if (muted) {
+ sp->s_gain_eff = 0;
+ } else {
+ sp->s_gain_eff = sp->s_gain_scaled;
+ }
+ mutex_exit(&sp->s_lock);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+boolean_t
+auclnt_get_muted(audio_stream_t *sp)
+{
+ return (sp->s_muted);
+}
+
+void
+auclnt_start(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_running = B_TRUE;
+ mutex_exit(&sp->s_lock);
+}
+
+void
+auclnt_stop(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ /* if running, then stop it */
+ if (sp->s_running) {
+ sp->s_running = B_FALSE;
+ /*
+ * if we stopped the engine, we might need to wake up
+ * a thread that is waiting for drain to complete.
+ */
+ cv_broadcast(&sp->s_cv);
+ }
+ mutex_exit(&sp->s_lock);
+}
+
+/*
+ * When pausing, no new data will be played after the most recently
+ * mixed samples have played. However, the audio engine will continue
+ * to play (possibly just silence).
+ *
+ * Note that we don't reference count the device, or release/close the
+ * engine here. Once fired up, the engine continues running unil it
+ * is closed.
+ */
+void
+auclnt_set_paused(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (sp->s_paused) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+ sp->s_paused = B_TRUE;
+ mutex_exit(&sp->s_lock);
+
+ auclnt_stop(sp);
+
+ auclnt_notify_dev(sp->s_client->c_dev);
+}
+
+void
+auclnt_clear_paused(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (!sp->s_paused) {
+ mutex_exit(&sp->s_lock);
+ return;
+ }
+ sp->s_paused = B_FALSE;
+ mutex_exit(&sp->s_lock);
+}
+
+boolean_t
+auclnt_is_paused(audio_stream_t *sp)
+{
+ return (sp->s_paused);
+}
+
+void
+auclnt_flush(audio_stream_t *sp)
+{
+ mutex_enter(&sp->s_lock);
+ if (sp == &sp->s_client->c_ostream) {
+ sp->s_tail = sp->s_head;
+ sp->s_tidx = sp->s_hidx;
+ } else {
+ sp->s_head = sp->s_tail;
+ sp->s_hidx = sp->s_tidx;
+ }
+ sp->s_cnv_cnt = 0;
+ mutex_exit(&sp->s_lock);
+}
+
+int
+auclnt_get_oflag(audio_client_t *c)
+{
+ return (c->c_omode);
+}
+
+/*
+ * These routines should not be accessed by client "personality"
+ * implementations, but are for private framework use only.
+ */
+
+static list_t auimpl_clients;
+static krwlock_t auimpl_client_lock;
+static audio_client_ops_t *audio_client_ops[AUDIO_MN_TYPE_MASK + 1];
+
+void
+auimpl_client_init(void)
+{
+ rw_init(&auimpl_client_lock, NULL, RW_DRIVER, NULL);
+ list_create(&auimpl_clients, sizeof (struct audio_client),
+ offsetof(struct audio_client, c_global_linkage));
+}
+
+void
+auimpl_client_fini(void)
+{
+ rw_destroy(&auimpl_client_lock);
+ list_destroy(&auimpl_clients);
+}
+
+static int
+auimpl_stream_init(audio_stream_t *sp, audio_client_t *c)
+{
+ mutex_init(&sp->s_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&sp->s_cv, NULL, CV_DRIVER, NULL);
+ sp->s_client = c;
+
+ if (sp == &c->c_ostream) {
+ sp->s_user_parms = &sp->s_cnv_src_parms;
+ sp->s_phys_parms = &sp->s_cnv_dst_parms;
+ sp->s_engcap = ENGINE_OUTPUT_CAP;
+ } else {
+ ASSERT(sp == &c->c_istream);
+ sp->s_user_parms = &sp->s_cnv_dst_parms;
+ sp->s_phys_parms = &sp->s_cnv_src_parms;
+ sp->s_engcap = ENGINE_INPUT_CAP;
+ }
+
+ /* for now initialize conversion parameters */
+ sp->s_src_quality = 3; /* reasonable compromise for now */
+ sp->s_cnv_dst_nchan = 2;
+ sp->s_cnv_dst_format = AUDIO_FORMAT_S24_NE;
+ sp->s_cnv_dst_rate = 48000;
+ sp->s_cnv_src_nchan = 2;
+ sp->s_cnv_src_format = AUDIO_FORMAT_S24_NE;
+ sp->s_cnv_src_rate = 48000;
+
+ /* set volume/gain all the way up */
+ sp->s_muted = B_FALSE;
+ sp->s_gain_pct = 0;
+ sp->s_gain_scaled = AUDIO_VOL_SCALE;
+ sp->s_gain_eff = AUDIO_VOL_SCALE;
+
+ /*
+ * We have to start off with a reasonable buffer and
+ * interrupt configuration.
+ */
+ sp->s_allocsz = 65536;
+ sp->s_data = ddi_umem_alloc(sp->s_allocsz, DDI_UMEM_NOSLEEP,
+ &sp->s_cookie);
+ if (sp->s_data == NULL) {
+ sp->s_allocsz = 0;
+ audio_dev_warn(c->c_dev, "ddi_umem_alloc failed");
+ return (ENOMEM);
+ }
+ /* make sure no stale data left in stream */
+ bzero(sp->s_data, sp->s_allocsz);
+
+ /*
+ * Allocate SRC and data conversion state.
+ */
+ mutex_enter(&sp->s_lock);
+ if (auimpl_format_alloc(sp) != 0) {
+ mutex_exit(&sp->s_lock);
+ return (ENOMEM);
+ }
+
+ mutex_exit(&sp->s_lock);
+
+ return (0);
+}
+
+
+static void
+audio_stream_fini(audio_stream_t *sp)
+{
+ auimpl_format_free(sp);
+ if (sp->s_cnv_buf0)
+ kmem_free(sp->s_cnv_buf0, sp->s_cnv_max);
+ if (sp->s_cnv_buf1)
+ kmem_free(sp->s_cnv_buf1, sp->s_cnv_max);
+ mutex_destroy(&sp->s_lock);
+ cv_destroy(&sp->s_cv);
+ if (sp->s_data != NULL) {
+ ddi_umem_free(sp->s_cookie);
+ sp->s_data = NULL;
+ }
+}
+
+void
+auimpl_client_task(void *arg)
+{
+ audio_client_t *c = arg;
+
+ mutex_enter(&c->c_lock);
+
+ for (;;) {
+ if (c->c_closing) {
+ break;
+ }
+
+ if (c->c_do_output) {
+ c->c_do_output = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_output != NULL)
+ c->c_output(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_input) {
+ c->c_do_input = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_input != NULL)
+ c->c_input(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_notify) {
+ c->c_do_notify = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_notify != NULL)
+ c->c_notify(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ if (c->c_do_drain) {
+ c->c_do_drain = B_FALSE;
+
+ mutex_exit(&c->c_lock);
+ if (c->c_drain != NULL)
+ c->c_drain(c);
+ mutex_enter(&c->c_lock);
+ continue;
+ }
+
+ /* if we got here, we had no work to do */
+ cv_wait(&c->c_cv, &c->c_lock);
+ }
+ mutex_exit(&c->c_lock);
+}
+
+int
+auclnt_start_drain(audio_client_t *c)
+{
+ audio_stream_t *sp;
+ int rv;
+
+ sp = &c->c_ostream;
+
+ /* start an asynchronous drain operation. */
+ mutex_enter(&sp->s_lock);
+ if (sp->s_paused || !sp->s_running) {
+ rv = EALREADY;
+ } else {
+ sp->s_draining = B_TRUE;
+ rv = 0;
+ }
+ mutex_exit(&sp->s_lock);
+ return (rv);
+}
+
+int
+auclnt_drain(audio_client_t *c)
+{
+ audio_stream_t *sp;
+
+ sp = &c->c_ostream;
+
+ /*
+ * Note: Drain logic will automatically "stop" the stream when
+ * the drain threshold has been reached. So all we have to do
+ * is wait for the stream to stop.
+ */
+ mutex_enter(&sp->s_lock);
+ sp->s_draining = B_TRUE;
+ while (sp->s_draining && sp->s_running && !sp->s_paused) {
+ if (cv_wait_sig(&sp->s_cv, &sp->s_lock) == 0) {
+ mutex_exit(&sp->s_lock);
+ return (EINTR);
+ }
+ }
+ mutex_exit(&sp->s_lock);
+ return (0);
+}
+
+audio_client_t *
+auimpl_client_create(dev_t dev)
+{
+ audio_client_ops_t *ops;
+ audio_client_t *c;
+ audio_client_t *next;
+ list_t *list = &auimpl_clients;
+ minor_t minor;
+ audio_dev_t *d;
+ char scratch[80];
+ static uint64_t unique = 0;
+
+ /* validate minor number */
+ minor = getminor(dev) & AUDIO_MN_TYPE_MASK;
+ if ((ops = audio_client_ops[minor]) == NULL) {
+ return (NULL);
+ }
+
+ /* lookup device instance */
+ if ((d = auimpl_dev_hold_by_devt(dev)) == NULL) {
+ audio_dev_warn(NULL, "no audio_dev for dev_t %d,%d",
+ getmajor(dev), getminor(dev));
+ return (NULL);
+ }
+
+ if ((c = kmem_zalloc(sizeof (*c), KM_NOSLEEP)) == NULL) {
+ audio_dev_warn(d, "unable to allocate client structure");
+ auimpl_dev_release(d);
+ return (NULL);
+ }
+ c->c_dev = d;
+
+ mutex_init(&c->c_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&c->c_cv, NULL, CV_DRIVER, NULL);
+
+ if ((auimpl_stream_init(&c->c_ostream, c) != 0) ||
+ (auimpl_stream_init(&c->c_istream, c) != 0)) {
+ goto failed;
+ }
+
+ c->c_major = getmajor(dev);
+ c->c_origminor = getminor(dev);
+ c->c_ops = *ops;
+
+ (void) snprintf(scratch, sizeof (scratch), "auclnt%" PRIx64,
+ atomic_inc_64_nv(&unique));
+ c->c_tq = ddi_taskq_create(NULL, scratch, 1, TASKQ_DEFAULTPRI, 0);
+ if (c->c_tq == NULL) {
+ audio_dev_warn(d, "client taskq_create failed");
+ goto failed;
+ }
+
+ /*
+ * We hold the client lock here.
+ */
+ rw_enter(&auimpl_client_lock, RW_WRITER);
+
+ minor = AUDIO_MN_CLONE_MASK;
+ for (next = list_head(list); next; next = list_next(list, next)) {
+ if (next->c_minor > minor) {
+ break;
+ }
+ minor++;
+ }
+ if (minor >= MAXMIN32) {
+ rw_exit(&auimpl_client_lock);
+ goto failed;
+ }
+ c->c_minor = minor;
+ list_insert_before(list, next, c);
+
+ rw_exit(&auimpl_client_lock);
+
+
+ return (c);
+
+failed:
+ auimpl_dev_release(d);
+ if (c->c_tq != NULL) {
+ ddi_taskq_destroy(c->c_tq);
+ }
+ audio_stream_fini(&c->c_ostream);
+ audio_stream_fini(&c->c_istream);
+ mutex_destroy(&c->c_lock);
+ cv_destroy(&c->c_cv);
+ kmem_free(c, sizeof (*c));
+ return (NULL);
+}
+
+void
+auimpl_client_destroy(audio_client_t *c)
+{
+ /* remove us from the global list */
+ rw_enter(&auimpl_client_lock, RW_WRITER);
+ list_remove(&auimpl_clients, c);
+ rw_exit(&auimpl_client_lock);
+
+ ASSERT(!c->c_istream.s_running);
+ ASSERT(!c->c_istream.s_running);
+
+ /* release the device reference count */
+ auimpl_dev_release(c->c_dev);
+ c->c_dev = NULL;
+
+ ddi_taskq_destroy(c->c_tq);
+
+ mutex_destroy(&c->c_lock);
+ cv_destroy(&c->c_cv);
+
+ audio_stream_fini(&c->c_istream);
+ audio_stream_fini(&c->c_ostream);
+ kmem_free(c, sizeof (*c));
+}
+
+void
+auclnt_close(audio_client_t *c)
+{
+ audio_dev_t *d = c->c_dev;
+
+ /* stop the engines if they are running */
+ auclnt_stop(&c->c_istream);
+ auclnt_stop(&c->c_ostream);
+
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ list_remove(&d->d_clients, c);
+ rw_exit(&d->d_clnt_lock);
+
+ mutex_enter(&c->c_lock);
+ /* if in transition need to wait for other thread to release */
+ while (c->c_refcnt) {
+ cv_wait(&c->c_cv, &c->c_lock);
+ }
+ c->c_closing = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+
+ /* make sure taskq has drained */
+ ddi_taskq_wait(c->c_tq);
+
+ /* release any engines that we were holding */
+ auimpl_engine_close(&c->c_ostream);
+ auimpl_engine_close(&c->c_istream);
+}
+
+audio_dev_t *
+auclnt_hold_dev_by_index(int index)
+{
+ return (auimpl_dev_hold_by_index(index));
+}
+
+void
+auclnt_release_dev(audio_dev_t *dev)
+{
+ auimpl_dev_release(dev);
+}
+
+audio_client_t *
+auclnt_hold_by_devt(dev_t dev)
+{
+ minor_t mn = getminor(dev);
+ major_t mj = getmajor(dev);
+ list_t *list;
+ audio_client_t *c;
+
+ list = &auimpl_clients;
+ /* linked list search is kind of inefficient, but it works */
+ rw_enter(&auimpl_client_lock, RW_READER);
+ for (c = list_head(list); c != NULL; c = list_next(list, c)) {
+ if ((c->c_major == mj) && (c->c_minor == mn)) {
+ mutex_enter(&c->c_lock);
+ if (c->c_is_open) {
+ c->c_refcnt++;
+ mutex_exit(&c->c_lock);
+ } else {
+ mutex_exit(&c->c_lock);
+ c = NULL;
+ }
+ break;
+ }
+ }
+ rw_exit(&auimpl_client_lock);
+ return (c);
+}
+
+void
+auclnt_release(audio_client_t *c)
+{
+ mutex_enter(&c->c_lock);
+ c->c_refcnt--;
+ if (c->c_refcnt == 0)
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+}
+
+void
+auclnt_dev_walk_clients(audio_dev_t *d,
+ int (*walker)(audio_client_t *, void *),
+ void *arg)
+{
+ list_t *l = &d->d_clients;
+ audio_client_t *c;
+ int rv;
+
+ rw_enter(&d->d_clnt_lock, RW_READER);
+restart:
+ for (c = list_head(l); c != NULL; c = list_next(l, c)) {
+ rv = (walker(c, arg));
+ if (rv == AUDIO_WALK_STOP) {
+ break;
+ } else if (rv == AUDIO_WALK_RESTART) {
+ goto restart;
+ }
+ }
+ rw_exit(&d->d_clnt_lock);
+}
+
+
+int
+auclnt_open(audio_client_t *c, unsigned fmts, int oflag)
+{
+ audio_stream_t *sp;
+ audio_dev_t *d = c->c_dev;
+ int rv = 0;
+ int flags;
+ audio_parms_t parms;
+
+ flags = 0;
+ if (oflag & FNDELAY)
+ flags |= ENGINE_NDELAY;
+
+ if (oflag & FWRITE) {
+ sp = &c->c_ostream;
+ rv = auimpl_engine_open(d, fmts, flags | ENGINE_OUTPUT, sp);
+
+ if (rv != 0) {
+ goto done;
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ rv = auimpl_format_setup(sp, &parms);
+ mutex_exit(&sp->s_lock);
+ if (rv != 0) {
+ goto done;
+ }
+ }
+
+ if (oflag & FREAD) {
+ sp = &c->c_istream;
+ rv = auimpl_engine_open(d, fmts, flags | ENGINE_INPUT, sp);
+
+ if (rv != 0) {
+ goto done;
+ }
+ mutex_enter(&sp->s_lock);
+ parms = *sp->s_user_parms;
+ rv = auimpl_format_setup(sp, &parms);
+ mutex_exit(&sp->s_lock);
+ if (rv != 0) {
+ goto done;
+ }
+ }
+
+ if (ddi_taskq_dispatch(c->c_tq, auimpl_client_task, c, DDI_NOSLEEP) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(d, "unable to start client taskq");
+ rv = ENOMEM;
+ }
+
+done:
+ if (rv != 0) {
+ /* close any engines that we opened */
+ auimpl_engine_close(&c->c_ostream);
+ auimpl_engine_close(&c->c_istream);
+ } else {
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ list_insert_tail(&d->d_clients, c);
+ c->c_ostream.s_gain_master = d->d_pcmvol;
+ c->c_istream.s_gain_master = 100;
+ rw_exit(&d->d_clnt_lock);
+ auclnt_set_gain(&c->c_ostream, 100);
+ auclnt_set_gain(&c->c_istream, 100);
+ }
+
+ return (rv);
+}
+
+minor_t
+auclnt_get_minor(audio_client_t *c)
+{
+ return (c->c_minor);
+}
+
+minor_t
+auclnt_get_original_minor(audio_client_t *c)
+{
+ return (c->c_origminor);
+}
+
+minor_t
+auclnt_get_minor_type(audio_client_t *c)
+{
+ return (c->c_origminor & AUDIO_MN_TYPE_MASK);
+}
+
+pid_t
+auclnt_get_pid(audio_client_t *c)
+{
+ return (c->c_pid);
+}
+
+cred_t *
+auclnt_get_cred(audio_client_t *c)
+{
+ return (c->c_cred);
+}
+
+audio_dev_t *
+auclnt_get_dev(audio_client_t *c)
+{
+ return (c->c_dev);
+}
+
+int
+auclnt_get_dev_number(audio_dev_t *dev)
+{
+ return (dev->d_number);
+}
+
+int
+auclnt_get_dev_index(audio_dev_t *dev)
+{
+ return (dev->d_index);
+}
+
+const char *
+auclnt_get_dev_name(audio_dev_t *dev)
+{
+ return (dev->d_name);
+}
+
+const char *
+auclnt_get_dev_driver(audio_dev_t *dev)
+{
+ return (ddi_driver_name(dev->d_dip));
+}
+
+dev_info_t *
+auclnt_get_dev_devinfo(audio_dev_t *dev)
+{
+ return (dev->d_dip);
+}
+
+const char *
+auclnt_get_dev_hw_info(audio_dev_t *dev, void **iter)
+{
+ struct audio_infostr *isp = *iter;
+ if (isp == NULL) {
+ isp = list_head(&dev->d_hwinfo);
+ } else {
+ isp = list_next(&dev->d_hwinfo, isp);
+ }
+
+ *iter = isp;
+ return (isp ? isp->i_line : NULL);
+}
+
+int
+auclnt_get_dev_instance(audio_dev_t *dev)
+{
+ return (dev->d_instance);
+}
+
+const char *
+auclnt_get_dev_description(audio_dev_t *dev)
+{
+ return (dev->d_desc);
+}
+
+const char *
+auclnt_get_dev_version(audio_dev_t *dev)
+{
+ return (dev->d_vers);
+}
+
+unsigned
+auclnt_get_dev_capab(audio_dev_t *dev)
+{
+ uint32_t flags;
+ unsigned caps = 0;
+
+ flags = dev->d_flags;
+
+ if (flags & DEV_OUTPUT_CAP)
+ caps |= AUDIO_CLIENT_CAP_PLAY;
+ if (flags & DEV_INPUT_CAP)
+ caps |= AUDIO_CLIENT_CAP_RECORD;
+ if (flags & DEV_DUPLEX_CAP)
+ caps |= AUDIO_CLIENT_CAP_DUPLEX;
+
+ /* AC3: deal with formats that don't support mixing */
+
+ return (caps);
+}
+
+void
+auclnt_notify_dev(audio_dev_t *dev)
+{
+ list_t *l = &dev->d_clients;
+ audio_client_t *c;
+
+ rw_enter(&dev->d_clnt_lock, RW_READER);
+ for (c = list_head(l); c != NULL; c = list_next(l, c)) {
+ mutex_enter(&c->c_lock);
+ c->c_do_notify = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+ rw_exit(&dev->d_clnt_lock);
+}
+
+uint64_t
+auclnt_get_samples(audio_stream_t *sp)
+{
+ uint64_t n;
+
+ mutex_enter(&sp->s_lock);
+ n = sp->s_samples;
+ mutex_exit(&sp->s_lock);
+ return (n);
+}
+
+void
+auclnt_set_samples(audio_stream_t *sp, uint64_t n)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_samples = n;
+ mutex_exit(&sp->s_lock);
+}
+
+uint64_t
+auclnt_get_errors(audio_stream_t *sp)
+{
+ uint64_t n;
+ mutex_enter(&sp->s_lock);
+ n = sp->s_errors;
+ mutex_exit(&sp->s_lock);
+ return (n);
+}
+
+void
+auclnt_set_errors(audio_stream_t *sp, uint64_t n)
+{
+ mutex_enter(&sp->s_lock);
+ sp->s_errors = n;
+ mutex_exit(&sp->s_lock);
+}
+
+void
+auclnt_register_ops(minor_t minor, audio_client_ops_t *ops)
+{
+ /* we control minor number allocations, no need for runtime checks */
+ ASSERT(minor <= AUDIO_MN_TYPE_MASK);
+
+ audio_client_ops[minor] = ops;
+}
+
+int
+auimpl_create_minors(audio_dev_t *d)
+{
+ char path[MAXPATHLEN];
+ int rv = 0;
+ minor_t minor;
+ audio_client_ops_t *ops;
+ char *nt;
+
+ for (int i = 0; i <= AUDIO_MN_TYPE_MASK; i++) {
+
+ if ((ops = audio_client_ops[i]) == NULL)
+ continue;
+
+ if (ops->aco_dev_init != NULL)
+ d->d_minor_data[i] = ops->aco_dev_init(d);
+
+ switch (i) {
+ case AUDIO_MINOR_SNDSTAT:
+ if (!(d->d_flags & DEV_SNDSTAT_CAP)) {
+ continue;
+ }
+ nt = DDI_PSEUDO;
+ break;
+
+ default:
+ if (!(d->d_flags & (DEV_INPUT_CAP| DEV_OUTPUT_CAP))) {
+ continue;
+ }
+ nt = DDI_NT_AUDIO;
+ break;
+ }
+
+ if (ops->aco_minor_prefix != NULL) {
+
+ minor = AUDIO_MKMN(d->d_instance, i);
+ (void) snprintf(path, sizeof (path),
+ "%s%d", ops->aco_minor_prefix, d->d_instance);
+
+ rv = ddi_create_minor_node(d->d_dip, path, S_IFCHR,
+ minor, nt, 0);
+
+ if (rv != 0)
+ break;
+ }
+ }
+ return (rv);
+}
+
+void
+auimpl_remove_minors(audio_dev_t *d)
+{
+ char path[MAXPATHLEN];
+ audio_client_ops_t *ops;
+
+ for (int i = 0; i <= AUDIO_MN_TYPE_MASK; i++) {
+ if ((ops = audio_client_ops[i]) == NULL)
+ continue;
+ if (ops->aco_minor_prefix != NULL) {
+ (void) snprintf(path, sizeof (path), "%s%d",
+ ops->aco_minor_prefix, d->d_instance);
+ (void) ddi_remove_minor_node(d->d_dip, path);
+ }
+
+ if (ops->aco_dev_fini != NULL)
+ ops->aco_dev_fini(d->d_minor_data[i]);
+ }
+}
+
+void *
+auclnt_get_dev_minor_data(audio_dev_t *d, minor_t mn)
+{
+ ASSERT(mn < (1U << AUDIO_MN_TYPE_NBITS));
+ return (d->d_minor_data[mn]);
+}
+
+void *
+auclnt_get_minor_data(audio_client_t *c, minor_t mn)
+{
+ ASSERT(mn < (1U << AUDIO_MN_TYPE_NBITS));
+ return (c->c_dev->d_minor_data[mn]);
+}
+
+/*
+ * This will walk all controls registered to a clients device and callback
+ * to walker for each one with its audio_ctrl. Note this data
+ * must be considered read only by walker.
+ *
+ * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
+ * or stop walk (AUDIO_WALK_STOP).
+ *
+ */
+void
+auclnt_walk_controls(audio_dev_t *d,
+ int (*walker)(audio_ctrl_t *, void *),
+ void *arg)
+{
+ audio_ctrl_t *ctrl;
+
+ rw_enter(&d->d_ctrl_lock, RW_READER);
+ for (ctrl = list_head(&d->d_controls); ctrl;
+ ctrl = list_next(&d->d_controls, ctrl)) {
+ if (walker(ctrl, arg) == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&d->d_ctrl_lock);
+}
+
+/*
+ * This will search all controls attached to an
+ * audio device for a control with the desired name.
+ *
+ * d - the audio device to look on
+ * name - name of the control being looked for.
+ *
+ * On successful return a ctrl handle will be returned. On
+ * failure NULL is returned.
+ */
+audio_ctrl_t *
+auclnt_find_control(audio_dev_t *d, const char *name)
+{
+ audio_ctrl_t *ctrl;
+
+ /* Verify argument */
+ ASSERT(d);
+
+ rw_enter(&d->d_ctrl_lock, RW_READER);
+ for (ctrl = list_head(&d->d_controls); ctrl;
+ ctrl = list_next(&d->d_controls, ctrl)) {
+ if (strcmp(ctrl->ctrl_name, name) == 0) {
+ rw_exit(&d->d_ctrl_lock);
+ return (ctrl);
+ }
+ }
+ rw_exit(&d->d_ctrl_lock);
+ return (NULL);
+}
+
+/*
+ * Given a known control, get its attributes.
+ *
+ * The caller must supply a audio_ctrl_desc_t structure. Also the
+ * values in the structure are ignored when making the call and filled
+ * in by this function. All data pointed to by elements of desc should
+ * be assumed read only.
+ *
+ * If an error occurs then a non-zero is returned.
+ *
+ */
+int
+auclnt_control_describe(audio_ctrl_t *ctrl, audio_ctrl_desc_t *desc)
+{
+ ASSERT(ctrl);
+ ASSERT(desc);
+
+ bcopy(&ctrl->ctrl_des, desc, sizeof (*desc));
+ return (0);
+}
+
+int
+auclnt_control_read(audio_ctrl_t *ctrl, uint64_t *value)
+{
+ return (audio_control_read(ctrl, value));
+}
+
+int
+auclnt_control_write(audio_ctrl_t *ctrl, uint64_t value)
+{
+ return (audio_control_write(ctrl, value));
+}
+
+void
+auclnt_warn(audio_client_t *c, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ auimpl_dev_vwarn(c ? c->c_dev : NULL, fmt, va);
+ va_end(va);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_client.h b/usr/src/uts/common/io/audio/impl/audio_client.h
new file mode 100644
index 0000000000..d38b1485a8
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_client.h
@@ -0,0 +1,260 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO_CLIENT_H
+#define _AUDIO_CLIENT_H
+
+/*
+ * Structure implementation in audio_impl.h
+ */
+#include <sys/audio/audio_common.h>
+
+typedef struct audio_client_ops {
+ const char *aco_minor_prefix;
+ void *(*aco_dev_init)(audio_dev_t *);
+ void (*aco_dev_fini)(void *);
+ int (*aco_open)(audio_client_t *, int);
+ void (*aco_close)(audio_client_t *);
+ int (*aco_read)(audio_client_t *, struct uio *, cred_t *);
+ int (*aco_write)(audio_client_t *, struct uio *, cred_t *);
+ int (*aco_ioctl)(audio_client_t *, int, intptr_t, int,
+ cred_t *, int *);
+ int (*aco_chpoll)(audio_client_t *, short, int, short *,
+ struct pollhead **);
+ int (*aco_mmap)(audio_client_t *, ...);
+ void (*aco_input)(audio_client_t *);
+ void (*aco_output)(audio_client_t *);
+ void (*aco_notify)(audio_client_t *);
+ void (*aco_drain)(audio_client_t *);
+} audio_client_ops_t;
+
+void *auclnt_get_private(audio_client_t *);
+void auclnt_set_private(audio_client_t *, void *);
+
+int auclnt_drain(audio_client_t *);
+int auclnt_start_drain(audio_client_t *);
+
+int auclnt_set_rate(audio_stream_t *, int);
+int auclnt_get_rate(audio_stream_t *);
+
+int auclnt_set_format(audio_stream_t *, int);
+int auclnt_get_format(audio_stream_t *);
+
+int auclnt_set_channels(audio_stream_t *, int);
+int auclnt_get_channels(audio_stream_t *);
+
+void auclnt_set_gain(audio_stream_t *, uint8_t);
+uint8_t auclnt_get_gain(audio_stream_t *);
+
+void auclnt_set_muted(audio_stream_t *, boolean_t);
+boolean_t auclnt_get_muted(audio_stream_t *);
+
+uint64_t auclnt_get_samples(audio_stream_t *);
+void auclnt_set_samples(audio_stream_t *, uint64_t);
+
+uint64_t auclnt_get_errors(audio_stream_t *);
+void auclnt_set_errors(audio_stream_t *, uint64_t);
+
+uint64_t auclnt_get_eof(audio_stream_t *);
+void auclnt_set_eof(audio_stream_t *, uint64_t);
+
+void auclnt_start(audio_stream_t *);
+void auclnt_stop(audio_stream_t *);
+
+void auclnt_set_paused(audio_stream_t *);
+void auclnt_clear_paused(audio_stream_t *);
+boolean_t auclnt_is_paused(audio_stream_t *);
+
+void auclnt_flush(audio_stream_t *);
+
+void auclnt_get_output_qlen(audio_client_t *, unsigned *, unsigned *);
+
+unsigned auclnt_get_fragsz(audio_stream_t *);
+unsigned auclnt_get_framesz(audio_stream_t *);
+unsigned auclnt_get_nfrags(audio_stream_t *);
+unsigned auclnt_get_nframes(audio_stream_t *);
+unsigned auclnt_get_count(audio_stream_t *);
+uint64_t auclnt_get_head(audio_stream_t *);
+uint64_t auclnt_get_tail(audio_stream_t *);
+unsigned auclnt_get_hidx(audio_stream_t *);
+unsigned auclnt_get_tidx(audio_stream_t *);
+
+audio_stream_t *auclnt_input_stream(audio_client_t *);
+audio_stream_t *auclnt_output_stream(audio_client_t *);
+
+int auclnt_get_oflag(audio_client_t *);
+
+int auclnt_open(audio_client_t *, unsigned, int);
+void auclnt_close(audio_client_t *);
+
+void auclnt_register_ops(minor_t, audio_client_ops_t *);
+
+minor_t auclnt_get_minor(audio_client_t *);
+minor_t auclnt_get_original_minor(audio_client_t *);
+minor_t auclnt_get_minor_type(audio_client_t *);
+
+unsigned auclnt_produce(audio_stream_t *, unsigned);
+unsigned auclnt_produce_data(audio_stream_t *, caddr_t, unsigned);
+unsigned auclnt_consume(audio_stream_t *, unsigned);
+unsigned auclnt_consume_data(audio_stream_t *, caddr_t, unsigned);
+int auclnt_read(audio_client_t *, struct uio *);
+int auclnt_write(audio_client_t *, struct uio *);
+int auclnt_chpoll(audio_client_t *, short, int, short *, struct pollhead **);
+void auclnt_pollwakeup(audio_client_t *, short);
+
+/*
+ * Return the process id that performed the original open() of the client.
+ */
+pid_t auclnt_get_pid(audio_client_t *);
+
+/*
+ * Return the credentials of the process that opened the client.
+ */
+cred_t *auclnt_get_cred(audio_client_t *);
+
+/*
+ * Get an opaque handle the underlying device for an audio client.
+ */
+audio_dev_t *auclnt_get_dev(audio_client_t *);
+audio_dev_t *auclnt_hold_dev_by_index(int);
+void auclnt_release_dev(audio_dev_t *);
+void auclnt_notify_dev(audio_dev_t *);
+int auclnt_get_dev_index(audio_dev_t *);
+int auclnt_get_dev_number(audio_dev_t *);
+void auclnt_set_dev_number(audio_dev_t *, int);
+const char *auclnt_get_dev_name(audio_dev_t *);
+const char *auclnt_get_dev_driver(audio_dev_t *);
+dev_info_t *auclnt_get_dev_devinfo(audio_dev_t *);
+int auclnt_get_dev_instance(audio_dev_t *);
+const char *auclnt_get_dev_description(audio_dev_t *);
+const char *auclnt_get_dev_version(audio_dev_t *);
+const char *auclnt_get_dev_hw_info(audio_dev_t *, void **);
+unsigned auclnt_get_dev_capab(audio_dev_t *);
+#define AUDIO_CLIENT_CAP_PLAY (1U << 0)
+#define AUDIO_CLIENT_CAP_RECORD (1U << 1)
+#define AUDIO_CLIENT_CAP_DUPLEX (1U << 2)
+#define AUDIO_CLIENT_CAP_SNDSTAT (1U << 3)
+
+/*
+ * Walk all the open client structures for a named audio device.
+ * Clients can use this to find "peer" clients accessing the same
+ * audio device. (This is useful for implementing special linkages,
+ * e.g. between /dev/audio and /dev/audioctl.)
+ */
+void auclnt_dev_walk_clients(audio_dev_t *,
+ int (*)(audio_client_t *, void *), void *);
+
+/*
+ * Audio control functions for use by clients.
+ */
+
+/*
+ * This will walk all controls registered to my device and callback
+ * to walker for each one with its audio_ctrl_desc_t..
+ *
+ * Note that walk_func may return values to continue (AUDIO_WALK_CONTINUE)
+ * or stop walk (AUDIO_WALK_STOP).
+ *
+ */
+void auclnt_walk_controls(audio_dev_t *,
+ int (*)(audio_ctrl_t *, void *), void *);
+
+/*
+ * This will search all controls attached to a clients
+ * audio device for a control with the desired name.
+ *
+ * On successful return a ctrl handle will be returned. On
+ * failure NULL is returned.
+ */
+audio_ctrl_t *auclnt_find_control(audio_dev_t *, const char *);
+
+/*
+ * Given a known control, get its attributes.
+ *
+ * The caller must supply a audio_ctrl_desc_t structure. Also the
+ * values in the structure are ignored when making the call and filled
+ * in by this function.
+ *
+ * If an error occurs then a non-zero is returned.
+ */
+int auclnt_control_describe(audio_ctrl_t *, audio_ctrl_desc_t *);
+
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int auclnt_control_read(audio_ctrl_t *, uint64_t *);
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int auclnt_control_write(audio_ctrl_t *, uint64_t);
+
+/*
+ * Walk all the audio devices on the system. Useful for clients
+ * like sndstat, which may need to inquire about every audio device
+ * on the system.
+ */
+void auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *);
+void auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *);
+
+audio_client_t *auclnt_hold_by_devt(dev_t);
+void auclnt_release(audio_client_t *);
+
+/*
+ * Engine rlated accesses. Note that normally clients don't need this level
+ * of information.
+ */
+void auclnt_dev_walk_engines(audio_dev_t *,
+ int (*)(audio_engine_t *, void *), void *);
+int auclnt_engine_get_format(audio_engine_t *);
+int auclnt_engine_get_rate(audio_engine_t *);
+int auclnt_engine_get_channels(audio_engine_t *);
+unsigned auclnt_engine_get_capab(audio_engine_t *);
+
+/*
+ * Retrieve minor-specific data for the instance. This allows for
+ * personality modules to store persistent state data on a physical
+ * device (e.g. to store persistent settings.) Synchronization of
+ * stored settings between personality modules is up to the
+ * personality modules themselves.
+ */
+void *auclnt_get_minor_data(audio_client_t *, minor_t);
+void *auclnt_get_dev_minor_data(audio_dev_t *, minor_t);
+
+/*
+ * Simpler warning message, alternative to cmn_err.
+ */
+void auclnt_warn(audio_client_t *, const char *fmt, ...);
+
+#endif /* _AUDIO_CLIENT_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_ctrl.c b/usr/src/uts/common/io/audio/impl/audio_ctrl.c
new file mode 100644
index 0000000000..64e7ca5549
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_ctrl.c
@@ -0,0 +1,375 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Control functions.
+ */
+
+/*
+ * Given a control structure - free all names
+ * strings allocated to it.
+ *
+ * ctrl - The control who's names that will be free'd.
+ */
+static void
+audio_control_freenames(audio_ctrl_t *ctrl)
+{
+ int indx;
+
+ if (ctrl->ctrl_name != NULL)
+ strfree((char *)ctrl->ctrl_name);
+ ctrl->ctrl_name = NULL;
+
+ for (indx = 0; indx < 64; indx++) {
+ if (ctrl->ctrl_enum[indx] != NULL) {
+ strfree((char *)ctrl->ctrl_enum[indx]);
+ ctrl->ctrl_enum[indx] = NULL;
+ }
+ }
+}
+
+/*
+ * This will allocate and register a control for my audio device.
+ *
+ * d - The audio device the control will be attached to.
+ * desc - Attributes about this new control
+ * read_fn - Callback function in driver to read control
+ * write_fn - Callback function in driver to write control.
+ * arg - driver private context passed to read_fn/write_fn
+ *
+ * On success this will return a control structure else NULL.
+ *
+ * The value passed in for a control number in the audio_ctrl_desc_t
+ * has some special meaning. If it is less then AUDIO_CONTROL_EXTBASE
+ * then the control is assumed to be a known control. If it is
+ * AUDIO_CONTROL_EXTBASE then the framework will allocate a unique
+ * control number and replace it in the audio_ctrl_desc_t structure
+ * and this control is considered an extended driver private control.
+ * The number that is replaced in audio_ctrl_desc_t will be greater
+ * then AUDIO_CONTROL_EXTBASE.
+ *
+ */
+audio_ctrl_t *
+audio_dev_add_control(audio_dev_t *d, audio_ctrl_desc_t *desc,
+ audio_ctrl_rd_t read_fn, audio_ctrl_wr_t write_fn, void *arg)
+{
+ audio_ctrl_t *ctrl;
+ audio_ctrl_desc_t *new_desc;
+ char scratch[16];
+ const char *name;
+
+ /* Verify arguments */
+ ASSERT(d);
+ ASSERT(desc);
+
+ /* We cannot deal with unnamed controls */
+ if ((name = desc->acd_name) == NULL) {
+ return (NULL);
+ }
+
+ /*
+ * If this was called with a control name that was already
+ * added, then we do some special things. First we reuse the
+ * control audio_ctrl_t and as far as outside users are
+ * concerned the handle is reused. To users this looks like we
+ * are changing the controls attributes. But what we really do
+ * is free every thing allocated to the control and then
+ * reinit everything. That way the same code can get used for
+ * both.
+ *
+ * We verify anything that could fail before we change the
+ * control or commit to any changes. If there is something bad
+ * return null to indicate an error but the original control
+ * is still usable and untouched.
+ */
+ ctrl = auclnt_find_control(d, name);
+
+ if (ctrl == NULL) {
+ /* Allocate a new control */
+ ctrl = kmem_zalloc(sizeof (*ctrl), KM_SLEEP);
+ } else {
+ /* Re-configure an existing control */
+ switch (desc->acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ case AUDIO_CTRL_TYPE_STEREO:
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_METER:
+ case AUDIO_CTRL_TYPE_ENUM:
+ break;
+ default:
+ audio_dev_warn(d, "bad control type %d for %s "
+ "not replaced", desc->acd_type, desc->acd_name);
+ return (NULL);
+ }
+
+ /*
+ * By removing it from the list we prevent the need to lock
+ * and check for locks on the control itself.
+ * Also by doing this we can use the normal add code to do
+ * what it normally does below.
+ */
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_remove(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ audio_control_freenames(ctrl);
+ ctrl->ctrl_read_fn = NULL;
+ ctrl->ctrl_write_fn = NULL;
+ ctrl->ctrl_arg = NULL;
+ ctrl->ctrl_dev = NULL;
+ mutex_destroy(&ctrl->ctrl_lock);
+ }
+ new_desc = &ctrl->ctrl_des;
+
+ /* Fill in new control description */
+ new_desc->acd_type = desc->acd_type;
+ new_desc->acd_flags = desc->acd_flags;
+ new_desc->acd_maxvalue = desc->acd_maxvalue;
+ new_desc->acd_minvalue = desc->acd_minvalue;
+ new_desc->acd_name = strdup(name);
+
+ /* Process type of control special actions, if any */
+ switch (desc->acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ case AUDIO_CTRL_TYPE_STEREO:
+ case AUDIO_CTRL_TYPE_MONO:
+ case AUDIO_CTRL_TYPE_METER:
+ break;
+
+ case AUDIO_CTRL_TYPE_ENUM:
+ for (int bit = 0; bit < 64; bit++) {
+ if (((1U << bit) & desc->acd_maxvalue) == 0)
+ continue;
+ name = desc->acd_enum[bit];
+ if (name == NULL) {
+ (void) snprintf(scratch, sizeof (scratch),
+ "bit%d", bit);
+ name = scratch;
+ }
+ new_desc->acd_enum[bit] = strdup(name);
+ }
+ break;
+ default:
+ audio_dev_warn(d, "bad control type %d for %s",
+ desc->acd_type, desc->acd_name);
+ goto ctrl_fail;
+ }
+
+ ctrl->ctrl_dev = d;
+ if (new_desc->acd_flags & AUDIO_CTRL_FLAG_READABLE) {
+ ASSERT(read_fn);
+ ctrl->ctrl_read_fn = read_fn;
+ ctrl->ctrl_arg = arg;
+ }
+ if (new_desc->acd_flags & AUDIO_CTRL_FLAG_WRITEABLE) {
+ ASSERT(write_fn);
+ ctrl->ctrl_write_fn = write_fn;
+ ctrl->ctrl_arg = arg;
+ }
+
+ mutex_init(&ctrl->ctrl_lock, NULL, MUTEX_DRIVER, NULL);
+
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_insert_tail(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ return (ctrl);
+
+
+ctrl_fail:
+ if (ctrl) {
+ audio_control_freenames(ctrl);
+ kmem_free(ctrl, sizeof (*ctrl));
+ }
+ return (NULL);
+}
+
+/*
+ * This will remove a control from my audio device.
+ *
+ * ctrl - The control will be removed.
+ */
+void
+audio_dev_del_control(audio_ctrl_t *ctrl)
+{
+ audio_dev_t *d;
+
+ /* Verify argument */
+ ASSERT(ctrl);
+ d = ctrl->ctrl_dev;
+ ASSERT(d);
+
+ rw_enter(&d->d_ctrl_lock, RW_WRITER);
+ list_remove(&d->d_controls, ctrl);
+ rw_exit(&d->d_ctrl_lock);
+
+ mutex_destroy(&ctrl->ctrl_lock);
+
+ audio_control_freenames(ctrl);
+ kmem_free(ctrl, sizeof (*ctrl));
+}
+
+static int
+auimpl_set_pcmvol(void *arg, uint64_t val)
+{
+ audio_dev_t *d = arg;
+ list_t *l = &d->d_clients;
+ audio_client_t *c;
+
+ if (val > 100) {
+ return (EINVAL);
+ }
+ rw_enter(&d->d_clnt_lock, RW_WRITER);
+ d->d_pcmvol = val & 0xff;
+ for (c = list_head(l); c; c = list_next(l, c)) {
+ auimpl_set_gain_master(&c->c_ostream, (uint8_t)val);
+ }
+ rw_exit(&d->d_clnt_lock);
+ return (0);
+}
+
+static int
+auimpl_get_pcmvol(void *arg, uint64_t *val)
+{
+ audio_dev_t *d = arg;
+
+ *val = d->d_pcmvol;
+ return (0);
+}
+
+int
+audio_dev_add_soft_volume(audio_dev_t *d)
+{
+ audio_ctrl_desc_t desc;
+
+ bzero(&desc, sizeof (desc));
+ if (d->d_pcmvol_ctrl == NULL) {
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY |
+ AUDIO_CTRL_FLAG_PCMVOL;
+ d->d_pcmvol_ctrl = audio_dev_add_control(d, &desc,
+ auimpl_get_pcmvol, auimpl_set_pcmvol, d);
+ d->d_pcmvol = 75;
+ }
+ return (0);
+}
+
+/*
+ * This will notify clients of need to reread control
+ * values since they have changed.
+ *
+ * There will be a routine that allows a client to register
+ * a callback. All callbacks registered to this device should
+ * get called from this routine.
+ *
+ * d - The device that needs updates.
+ */
+void
+audio_dev_update_controls(audio_dev_t *d)
+{
+ auclnt_notify_dev(d);
+}
+
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * ctrl - should be the valid control being read.
+ * value - is a pointer to the place that will contain the value read.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int
+audio_control_read(audio_ctrl_t *ctrl, uint64_t *value)
+{
+ uint64_t my_value;
+ int ret;
+
+ /* Verify arguments */
+ ASSERT(ctrl);
+ ASSERT(value);
+ ASSERT(ctrl->ctrl_dev);
+
+ if (!(ctrl->ctrl_flags & AUDIO_CTRL_FLAG_READABLE)) {
+ return (ENXIO);
+ }
+
+ ASSERT(ctrl->ctrl_read_fn);
+
+ if ((ret = ctrl->ctrl_read_fn(ctrl->ctrl_arg, &my_value)) != 0) {
+ return (ret);
+ }
+
+ *value = my_value;
+
+ return (ret);
+}
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * ctrl - should be the valid control being written.
+ * value - is value to set the control to.
+ *
+ * On return zero is returned on success else errno is returned.
+ *
+ */
+int
+audio_control_write(audio_ctrl_t *ctrl, uint64_t value)
+{
+ int ret;
+ audio_dev_t *d = ctrl->ctrl_dev;
+
+ /* Verify arguments */
+ ASSERT(ctrl);
+ ASSERT(d);
+
+ if (!(ctrl->ctrl_flags & AUDIO_CTRL_FLAG_WRITEABLE)) {
+ return (ENXIO);
+ }
+
+ ASSERT(ctrl->ctrl_write_fn);
+
+ ret = ctrl->ctrl_write_fn(ctrl->ctrl_arg, value);
+
+ if (ret == 0)
+ audio_dev_update_controls(d);
+
+ return (ret);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_ddi.c b/usr/src/uts/common/io/audio/impl/audio_ddi.c
new file mode 100644
index 0000000000..56138bc28c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_ddi.c
@@ -0,0 +1,465 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/stropts.h>
+#include <sys/strsun.h>
+#include <sys/list.h>
+#include <sys/mkdev.h>
+#include <sys/conf.h>
+#include <sys/note.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio DDI glue implementation.
+ */
+
+/*
+ * The audio module is itself a pseudo driver, as it contains the
+ * logic to support un-associated nodes. (Think generic /dev/mixer
+ * and /dev/sndstat used by OSS.)
+ */
+static int
+audio_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ audio_dev_t *adev;
+
+ /* pseudo devices don't need S/R support */
+ if ((cmd != DDI_ATTACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ /* this can't fail */
+ adev = audio_dev_alloc(dip, 0);
+ adev->d_flags = DEV_SNDSTAT_CAP;
+ audio_dev_set_description(adev, "Audio Common Code");
+ audio_dev_set_version(adev, "pseudo");
+ ddi_set_driver_private(dip, adev);
+
+ /* look up our properties! */
+
+ if (audio_dev_register(adev) != NULL) {
+ audio_dev_free(adev);
+ return (DDI_FAILURE);
+ }
+
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ audio_dev_t *adev;
+
+ /* pseudo devices don't need S/R support */
+ if (cmd != DDI_DETACH) {
+ return (DDI_FAILURE);
+ }
+
+ if (dip == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ if ((adev = ddi_get_driver_private(dip)) == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ if (audio_dev_unregister(adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ audio_dev_free(adev);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resp)
+{
+ dip = NULL;
+
+ if (getminor((dev_t)arg) & AUDIO_MN_CLONE_MASK) {
+ audio_client_t *c;
+ c = auclnt_hold_by_devt((dev_t)arg);
+ if (c != NULL) {
+ dip = c->c_dev->d_dip;
+ auclnt_release(c);
+ }
+ } else {
+ audio_dev_t *adev;
+ if ((adev = auimpl_dev_hold_by_devt((dev_t)arg)) != NULL) {
+ dip = adev->d_dip;
+ auimpl_dev_release(adev);
+ }
+ }
+
+ if (dip == NULL) {
+ return (DDI_FAILURE);
+ }
+
+ switch (cmd) {
+ case DDI_INFO_DEVT2DEVINFO:
+ *resp = dip;
+ break;
+ case DDI_INFO_DEVT2INSTANCE:
+ *resp = (void *)(uintptr_t)ddi_get_instance(dip);
+ break;
+ default:
+ *resp = NULL;
+ return (DDI_FAILURE);
+ }
+ return (DDI_SUCCESS);
+}
+
+static int
+audio_open(dev_t *devp, int oflag, int otyp, cred_t *credp)
+{
+ int rv;
+ audio_client_t *c;
+
+ if (otyp == OTYP_BLK) {
+ return (ENXIO);
+ }
+
+ if ((c = auimpl_client_create(*devp)) == NULL) {
+ audio_dev_warn(NULL, "client create failed");
+ return (ENXIO);
+ }
+
+ c->c_omode = oflag;
+ c->c_pid = ddi_get_pid();
+ c->c_cred = credp;
+
+ /*
+ * Call client/personality specific open handler. Note that
+ * we "insist" that there is an open. The personality layer
+ * will initialize/allocate any engines required.
+ *
+ * Hmm... do we need to pass in the cred?
+ */
+ if ((rv = c->c_open(c, oflag)) != 0) {
+ audio_dev_warn(c->c_dev, "open failed (rv %d)", rv);
+ auimpl_client_destroy(c);
+ return (rv);
+ }
+
+ /* we do device cloning! */
+ *devp = makedevice(c->c_major, c->c_minor);
+
+ mutex_enter(&c->c_lock);
+ c->c_is_open = B_TRUE;
+ mutex_exit(&c->c_lock);
+
+ auclnt_notify_dev(c->c_dev);
+
+ return (0);
+}
+
+static int
+audio_close(dev_t dev, int flag, int otyp, cred_t *credp)
+{
+ audio_client_t *c;
+ audio_dev_t *d;
+
+ _NOTE(ARGUNUSED(flag));
+ _NOTE(ARGUNUSED(credp));
+ _NOTE(ARGUNUSED(otyp));
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ audio_dev_warn(NULL, "close on bugs devt %x,%x",
+ getmajor(dev), getminor(dev));
+ return (ENXIO);
+ }
+
+ mutex_enter(&c->c_lock);
+ c->c_is_open = B_FALSE;
+ mutex_exit(&c->c_lock);
+
+ /*
+ * Pick up any data sitting around in input buffers. This
+ * avoids leaving record data stuck in queues.
+ */
+ if (c->c_istream.s_engine != NULL)
+ audio_engine_produce(c->c_istream.s_engine);
+
+ /* get a local hold on the device */
+ d = c->c_dev;
+ auimpl_dev_hold(c->c_dev);
+
+ /*
+ * NB: This must be done before c->c_close, since it calls
+ * auclnt_close which will block waiting for the refence count
+ * to drop to zero.
+ */
+ auclnt_release(c);
+
+ /* Call personality specific close handler */
+ c->c_close(c);
+
+ auimpl_client_destroy(c);
+
+ /* notify peers that a change has occurred */
+ auclnt_notify_dev(d);
+
+ /* now we can drop the release we had on the device */
+ auimpl_dev_release(d);
+
+ return (0);
+}
+
+static int
+audio_write(dev_t dev, struct uio *uio, cred_t *credp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_write == NULL) ? ENXIO : c->c_write(c, uio, credp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_read(dev_t dev, struct uio *uio, cred_t *credp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_read == NULL) ? ENXIO : c->c_read(c, uio, credp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_ioctl == NULL) ? ENXIO : c->c_ioctl(c, cmd, arg, mode,
+ credp, rvalp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+static int
+audio_chpoll(dev_t dev, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ audio_client_t *c;
+ int rv;
+
+ if ((c = auclnt_hold_by_devt(dev)) == NULL) {
+ return (ENXIO);
+ }
+ rv = (c->c_chpoll == NULL) ?
+ ENXIO :
+ c->c_chpoll(c, events, anyyet, reventsp, phpp);
+ auclnt_release(c);
+
+ return (rv);
+}
+
+struct cb_ops audio_cb_ops = {
+ audio_open, /* open */
+ audio_close, /* close */
+ nodev, /* strategy */
+ nodev, /* print */
+ nodev, /* dump */
+ audio_read, /* read */
+ audio_write, /* write */
+ audio_ioctl, /* ioctl */
+ nodev, /* devmap */
+ nodev, /* mmap */
+ nodev, /* segmap */
+ audio_chpoll, /* chpoll */
+ ddi_prop_op, /* prop_op */
+ NULL, /* str */
+ D_MP | D_64BIT, /* flag */
+ CB_REV, /* rev */
+ nodev, /* aread */
+ nodev, /* awrite */
+};
+
+static struct dev_ops audio_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ audio_getinfo, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ audio_attach, /* attach */
+ audio_detach, /* detach */
+ nodev, /* reset */
+ &audio_cb_ops, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+};
+
+static struct modldrv modldrv = {
+ &mod_driverops,
+ "Audio Framework",
+ &audio_dev_ops,
+};
+
+static struct modlinkage modlinkage = {
+ MODREV_1, /* MODREV_1 indicated by manual */
+ &modldrv,
+ NULL
+};
+
+struct audio_ops_helper {
+ struct cb_ops cbops;
+};
+
+void
+audio_init_ops(struct dev_ops *devops, const char *name)
+{
+ _NOTE(ARGUNUSED(name));
+
+ struct audio_ops_helper *helper;
+
+ helper = kmem_zalloc(sizeof (*helper), KM_SLEEP);
+
+ helper->cbops.cb_open = audio_open;
+ helper->cbops.cb_close = audio_close;
+ helper->cbops.cb_strategy = nodev;
+ helper->cbops.cb_print = nodev;
+ helper->cbops.cb_dump = nodev;
+ helper->cbops.cb_read = audio_read;
+ helper->cbops.cb_write = audio_write;
+ helper->cbops.cb_ioctl = audio_ioctl;
+ helper->cbops.cb_devmap = nodev;
+ helper->cbops.cb_mmap = nodev;
+ helper->cbops.cb_segmap = nodev;
+ helper->cbops.cb_chpoll = audio_chpoll;
+ helper->cbops.cb_prop_op = ddi_prop_op;
+ helper->cbops.cb_str = NULL;
+ helper->cbops.cb_flag = D_MP | D_64BIT;
+ helper->cbops.cb_rev = CB_REV;
+ helper->cbops.cb_aread = nodev;
+ helper->cbops.cb_awrite = nodev;
+
+ devops->devo_cb_ops = &helper->cbops;
+ devops->devo_getinfo = audio_getinfo;
+}
+
+void
+audio_fini_ops(struct dev_ops *devops)
+{
+ kmem_free(devops->devo_cb_ops, sizeof (struct audio_ops_helper));
+ devops->devo_cb_ops = NULL;
+ devops->devo_getinfo = NULL;
+}
+
+void
+auimpl_dev_vwarn(audio_dev_t *dev, const char *fmt, va_list va)
+{
+ char buf[256];
+
+ if (dev != NULL) {
+ (void) snprintf(buf, sizeof (buf), "%s#%d: %s",
+ ddi_driver_name(dev->d_dip), ddi_get_instance(dev->d_dip),
+ fmt);
+ } else {
+ (void) snprintf(buf, sizeof (buf), "audio: %s", fmt);
+ }
+
+ vcmn_err(CE_WARN, buf, va);
+}
+
+
+void
+audio_dev_warn(audio_dev_t *dev, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ auimpl_dev_vwarn(dev, fmt, va);
+ va_end(va);
+}
+
+/*
+ * _init, _info, and _fini DDI glue.
+ */
+int
+_init(void)
+{
+ int rv;
+
+ auimpl_client_init();
+ auimpl_dev_init();
+ auimpl_sun_init();
+ auimpl_oss_init();
+
+ if ((rv = mod_install(&modlinkage)) != 0) {
+ auimpl_dev_fini();
+ auimpl_client_fini();
+ }
+ return (rv);
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&modlinkage, modinfop));
+}
+
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&modlinkage)) != 0)
+ return (rv);
+
+ auimpl_dev_fini();
+ auimpl_client_fini();
+
+ return (rv);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_engine.c b/usr/src/uts/common/io/audio/impl/audio_engine.c
new file mode 100644
index 0000000000..0d48587991
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_engine.c
@@ -0,0 +1,1197 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/sysmacros.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/callb.h>
+#include <sys/kstat.h>
+#include <sys/note.h>
+
+#include "audio_impl.h"
+
+/*
+ * Audio Engine functions.
+ */
+
+audio_dev_t *
+audio_dev_alloc(dev_info_t *dip, int instance)
+{
+ audio_dev_t *d;
+
+ /*
+ * For a card with multiple independent audio ports on it, we
+ * allow the driver to provide a different instance numbering
+ * scheme than the standard DDI instance number. (This is
+ * sort of like the PPA numbering scheme used by NIC drivers
+ * -- by default PPA == instance, but sometimes we need more
+ * flexibility.)
+ */
+ if (instance == 0) {
+ instance = ddi_get_instance(dip);
+ }
+ /* generally this shouldn't occur */
+ if (instance > AUDIO_MN_INST_MASK) {
+ audio_dev_warn(NULL, "bad instance number for %s (%d)",
+ ddi_driver_name(dip), instance);
+ return (NULL);
+ }
+
+ if ((d = kmem_zalloc(sizeof (*d), KM_NOSLEEP)) == NULL) {
+ audio_dev_warn(NULL, "unable to allocate audio device struct");
+ return (NULL);
+ }
+ d->d_dip = dip;
+ d->d_number = -1;
+ d->d_major = ddi_driver_major(dip);
+ d->d_instance = instance;
+ d->d_pcmvol = 100;
+ mutex_init(&d->d_lock, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&d->d_cv, NULL, CV_DRIVER, NULL);
+ rw_init(&d->d_ctrl_lock, NULL, RW_DRIVER, NULL);
+ rw_init(&d->d_clnt_lock, NULL, RW_DRIVER, NULL);
+ list_create(&d->d_clients, sizeof (struct audio_client),
+ offsetof(struct audio_client, c_dev_linkage));
+ list_create(&d->d_engines, sizeof (struct audio_engine),
+ offsetof(struct audio_engine, e_dev_linkage));
+ list_create(&d->d_controls, sizeof (struct audio_ctrl),
+ offsetof(struct audio_ctrl, ctrl_linkage));
+ list_create(&d->d_hwinfo, sizeof (struct audio_infostr),
+ offsetof(struct audio_infostr, i_linkage));
+ (void) snprintf(d->d_name, sizeof (d->d_name), "%s#%d",
+ ddi_driver_name(dip), instance);
+
+ return (d);
+}
+
+void
+audio_dev_free(audio_dev_t *d)
+{
+ struct audio_infostr *isp;
+ while ((isp = list_remove_head(&d->d_hwinfo)) != NULL) {
+ kmem_free(isp, sizeof (*isp));
+ }
+ if (d->d_pcmvol_ctrl != NULL) {
+ audio_dev_del_control(d->d_pcmvol_ctrl);
+ }
+ list_destroy(&d->d_hwinfo);
+ list_destroy(&d->d_engines);
+ list_destroy(&d->d_controls);
+ list_destroy(&d->d_clients);
+ rw_destroy(&d->d_ctrl_lock);
+ mutex_destroy(&d->d_lock);
+ cv_destroy(&d->d_cv);
+ rw_destroy(&d->d_clnt_lock);
+ kmem_free(d, sizeof (*d));
+}
+
+void
+audio_dev_set_description(audio_dev_t *d, const char *desc)
+{
+ (void) strlcpy(d->d_desc, desc, sizeof (d->d_desc));
+}
+
+void
+audio_dev_set_version(audio_dev_t *d, const char *vers)
+{
+ (void) strlcpy(d->d_vers, vers, sizeof (d->d_vers));
+}
+
+void
+audio_dev_add_info(audio_dev_t *d, const char *info)
+{
+ struct audio_infostr *isp;
+
+ /* failure to add information structure is not critical */
+ isp = kmem_zalloc(sizeof (*isp), KM_NOSLEEP);
+ if (isp == NULL) {
+ audio_dev_warn(d, "unable to allocate information structure");
+ } else {
+ (void) snprintf(isp->i_line, sizeof (isp->i_line), info);
+ list_insert_tail(&d->d_hwinfo, isp);
+ }
+}
+
+void
+audio_engine_consume(audio_engine_t *e)
+{
+ mutex_enter(&e->e_lock);
+ e->e_tail = ENG_COUNT(e);
+ if (e->e_tail > e->e_head) {
+ /* want more data than we have, not much we can do */
+ e->e_errors++;
+ }
+ auimpl_output_callback(e);
+ mutex_exit(&e->e_lock);
+}
+
+void
+audio_engine_produce(audio_engine_t *e)
+{
+ mutex_enter(&e->e_lock);
+ e->e_head = ENG_COUNT(e);
+ if ((e->e_head - e->e_tail) > e->e_nframes) {
+ /* no room for engine data, not much we can do */
+ e->e_errors++;
+ }
+ auimpl_input_callback(e);
+ mutex_exit(&e->e_lock);
+}
+
+void
+audio_engine_reset(audio_engine_t *e)
+{
+ char *buf;
+ char *ptr;
+ int nfr;
+ int tail;
+
+
+ if ((e->e_flags & (ENGINE_INPUT | ENGINE_OUTPUT)) == 0) {
+ /* engine not open, nothing to do */
+ return;
+ }
+
+ buf = kmem_alloc(e->e_nbytes, KM_SLEEP);
+ ptr = buf;
+
+ mutex_enter(&e->e_lock);
+
+ tail = e->e_tidx;
+ nfr = min(e->e_head - e->e_tail, e->e_nframes);
+ while (nfr) {
+ int cnt;
+ int nbytes;
+
+ cnt = min((e->e_nframes - tail), nfr);
+ nbytes = cnt * e->e_framesz;
+
+ bcopy(e->e_data + (tail * e->e_framesz), ptr, nbytes);
+ ptr += nbytes;
+ tail += cnt;
+ if (tail >= e->e_framesz) {
+ tail -= e->e_framesz;
+ }
+ nfr -= cnt;
+ }
+
+ nfr = min(e->e_head - e->e_tail, e->e_nframes);
+ if (e->e_flags & ENGINE_INPUT) {
+ /* record */
+ e->e_hidx = 0;
+ e->e_tidx = (e->e_nframes - nfr) % e->e_nframes;
+ } else {
+ /* play */
+ e->e_hidx = nfr % e->e_nframes;
+ e->e_tidx = 0;
+ }
+
+ /* relocate from scratch area to destination */
+ bcopy(buf, e->e_data + (e->e_tidx * e->e_framesz), nfr * e->e_framesz);
+ mutex_exit(&e->e_lock);
+
+ kmem_free(buf, e->e_nbytes);
+}
+
+audio_engine_t *
+audio_engine_alloc(audio_engine_ops_t *ops, unsigned flags)
+{
+ int i;
+ audio_engine_t *e;
+
+ if (ops->audio_engine_version != AUDIO_ENGINE_VERSION) {
+ audio_dev_warn(NULL, "audio engine version mismatch: %d != %d",
+ ops->audio_engine_version, AUDIO_ENGINE_VERSION);
+ return (NULL);
+ }
+
+ /* NB: The ops vector must be held in persistent storage! */
+ e = kmem_zalloc(sizeof (audio_engine_t), KM_NOSLEEP);
+ if (e == NULL) {
+ audio_dev_warn(NULL, "unable to allocate engine struct");
+ return (NULL);
+ }
+ e->e_ops = *ops;
+ mutex_init(&e->e_lock, NULL, MUTEX_DRIVER, NULL);
+ list_create(&e->e_streams, sizeof (struct audio_stream),
+ offsetof(struct audio_stream, s_eng_linkage));
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ e->e_chbufs[i] = kmem_zalloc(sizeof (int32_t) * AUDIO_CHBUFS,
+ KM_NOSLEEP);
+ if (e->e_chbufs[i] == NULL) {
+ audio_dev_warn(NULL, "unable to allocate channel buf");
+ audio_engine_free(e);
+ return (NULL);
+ }
+ }
+
+ e->e_flags = flags & ENGINE_DRIVER_FLAGS;
+ return (e);
+}
+
+void
+audio_engine_free(audio_engine_t *e)
+{
+ int i;
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ if (e->e_chbufs[i] != NULL) {
+ kmem_free(e->e_chbufs[i],
+ sizeof (int32_t) * AUDIO_CHBUFS);
+ }
+ }
+ list_destroy(&e->e_streams);
+ mutex_destroy(&e->e_lock);
+ kmem_free(e, sizeof (*e));
+}
+
+static list_t auimpl_devs_by_index;
+static list_t auimpl_devs_by_number;
+static krwlock_t auimpl_dev_lock;
+
+/*
+ * Not for public consumption: Private interfaces.
+ */
+void
+auimpl_dev_hold(audio_dev_t *d)
+{
+ /* bump the reference count */
+ mutex_enter(&d->d_lock);
+ d->d_refcnt++;
+ mutex_exit(&d->d_lock);
+}
+
+audio_dev_t *
+auimpl_dev_hold_by_devt(dev_t dev)
+{
+ audio_dev_t *d;
+ major_t major;
+ int instance;
+ list_t *l = &auimpl_devs_by_index;
+
+ major = getmajor(dev);
+ instance = (getminor(dev) >> AUDIO_MN_INST_SHIFT) & AUDIO_MN_INST_MASK;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ if ((d->d_major == major) && (d->d_instance == instance)) {
+ auimpl_dev_hold(d);
+ break;
+ }
+ }
+
+ rw_exit(&auimpl_dev_lock);
+ return (d);
+}
+
+audio_dev_t *
+auimpl_dev_hold_by_index(int index)
+{
+ audio_dev_t *d;
+ list_t *l = &auimpl_devs_by_index;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ if (d->d_index == index) {
+ auimpl_dev_hold(d);
+ break;
+ }
+ }
+
+ rw_exit(&auimpl_dev_lock);
+ return (d);
+}
+
+void
+auimpl_dev_release(audio_dev_t *d)
+{
+ mutex_enter(&d->d_lock);
+ d->d_refcnt--;
+ mutex_exit(&d->d_lock);
+}
+
+int
+auimpl_choose_format(int fmts)
+{
+ /*
+ * Choose the very best format we can. We choose 24 bit in
+ * preference to 32 bit because we mix in 24 bit. We do that
+ * to allow overflows to fit within 32-bits. (Very few humans
+ * can tell a difference between 24 and 32 bit audio anyway.)
+ */
+ if (fmts & AUDIO_FORMAT_S24_NE)
+ return (AUDIO_FORMAT_S24_NE);
+
+ if (fmts & AUDIO_FORMAT_S32_NE)
+ return (AUDIO_FORMAT_S32_NE);
+
+ if (fmts & AUDIO_FORMAT_S24_OE)
+ return (AUDIO_FORMAT_S24_OE);
+
+ if (fmts & AUDIO_FORMAT_S32_OE)
+ return (AUDIO_FORMAT_S32_OE);
+
+ if (fmts & AUDIO_FORMAT_S16_NE)
+ return (AUDIO_FORMAT_S16_NE);
+
+ if (fmts & AUDIO_FORMAT_S16_OE)
+ return (AUDIO_FORMAT_S16_OE);
+
+ if (fmts & AUDIO_FORMAT_AC3)
+ return (AUDIO_FORMAT_AC3);
+
+ return (AUDIO_FORMAT_NONE);
+}
+
+int
+auimpl_engine_open(audio_dev_t *d, int fmts, int flags, audio_stream_t *sp)
+{
+ audio_engine_t *e = NULL;
+ list_t *list;
+ unsigned caps;
+ int priority = 0;
+ int rv = ENODEV;
+ int sampsz;
+ int i;
+
+ /*
+ * Engine selection:
+ *
+ * We try hard to avoid consuming an engine that can be used
+ * for another purpose.
+ *
+ */
+
+ /*
+ * Which direction are we opening. (We must open exactly
+ * one direction, otherwise the open is meaningless.)
+ */
+ if (flags & ENGINE_OUTPUT)
+ caps = ENGINE_OUTPUT_CAP;
+ else if (flags & ENGINE_INPUT)
+ caps = ENGINE_INPUT_CAP;
+ else
+ return (EINVAL);
+
+ list = &d->d_engines;
+
+ mutex_enter(&d->d_lock);
+
+ /*
+ * First we want to know if we already have "default" input
+ * and output engines.
+ */
+
+again:
+
+ for (audio_engine_t *t = list_head(list); t; t = list_next(list, t)) {
+ int mypri;
+
+ /* make sure the engine can do what we want it to */
+ mutex_enter(&t->e_lock);
+ if ((((t->e_flags & caps) & caps) == 0) ||
+ ((ENG_FORMAT(t) & fmts) == 0)) {
+ mutex_exit(&t->e_lock);
+ continue;
+ }
+
+ /* if engine is in exclusive use, can't do it */
+ if (t->e_flags & ENGINE_EXCLUSIVE) {
+ mutex_exit(&t->e_lock);
+ rv = EBUSY;
+ continue;
+ }
+
+ /* if engine is in incompatible use, can't do it */
+ if (((flags & ENGINE_INPUT) && (t->e_flags & ENGINE_OUTPUT)) ||
+ ((flags & ENGINE_OUTPUT) && (t->e_flags & ENGINE_INPUT))) {
+ mutex_exit(&t->e_lock);
+ rv = EBUSY;
+ continue;
+ }
+
+ /*
+ * In order to support as many different possible
+ * output streams (e.g. AC3 passthru or AC3 decode),
+ * or multiple exclusive outputs, we treat audio
+ * engines as *precious*.
+ *
+ * This means that we will try hard to reuse an
+ * existing allocated engine. This may not be the
+ * optimal performance configuration (especially if we
+ * wanted to avoid rate conversion, for example), but
+ * it should have fewer cases where the configuration
+ * results in denying service to any client.
+ */
+
+ rv = 0;
+ mypri = 2000;
+
+ /* try not to pick on idle engines */
+ if (list_is_empty(&t->e_streams)) {
+ mypri -= 1000;
+ }
+
+ /* try not to pick on duplex engines first */
+ if ((t->e_flags & ENGINE_CAPS) != caps) {
+ mypri -= 100;
+ }
+
+ /* try not to pick on engines that can do other formats */
+ if (t->e_format & ~fmts) {
+ mypri -= 10;
+ }
+
+ if (mypri > priority) {
+ if (e != NULL) {
+ mutex_exit(&e->e_lock);
+ }
+ e = t;
+ priority = mypri;
+ } else {
+ mutex_exit(&t->e_lock);
+ }
+ }
+
+ if ((rv == EBUSY) && ((flags & ENGINE_NDELAY) == 0)) {
+ ASSERT(e == NULL);
+ if (cv_wait_sig(&d->d_cv, &d->d_lock) == 0) {
+ mutex_exit(&d->d_lock);
+ return (EINTR);
+ }
+ goto again;
+ }
+
+ if (rv != 0) {
+ ASSERT(e == NULL);
+ mutex_exit(&d->d_lock);
+ return (rv);
+ }
+
+ ASSERT(e != NULL);
+ ASSERT(mutex_owned(&e->e_lock));
+
+ /*
+ * If the engine is already open, there is no need for further
+ * work. The first open will be relatively expensive, but
+ * subsequent opens should be as cheap as possible.
+ */
+ if (!list_is_empty(&e->e_streams)) {
+ rv = 0;
+ goto ok;
+ }
+
+ e->e_format = ENG_FORMAT(e);
+ e->e_nchan = ENG_CHANNELS(e);
+ e->e_rate = ENG_RATE(e);
+
+ /* Find out the "best" sample format supported by the device */
+ switch (e->e_format) {
+ case AUDIO_FORMAT_S24_NE:
+ e->e_export = auimpl_export_24ne;
+ e->e_import = auimpl_import_24ne;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S32_NE:
+ e->e_export = auimpl_export_32ne;
+ e->e_import = auimpl_import_32ne;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S24_OE:
+ e->e_export = auimpl_export_24oe;
+ e->e_import = auimpl_import_24oe;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S32_OE:
+ e->e_export = auimpl_export_32oe;
+ e->e_import = auimpl_import_32oe;
+ sampsz = 4;
+ break;
+ case AUDIO_FORMAT_S16_NE:
+ e->e_export = auimpl_export_16ne;
+ e->e_import = auimpl_import_16ne;
+ sampsz = 2;
+ break;
+ case AUDIO_FORMAT_S16_OE:
+ e->e_export = auimpl_export_16oe;
+ e->e_import = auimpl_import_16oe;
+ sampsz = 2;
+ break;
+ case AUDIO_FORMAT_AC3:
+ e->e_export = auimpl_export_24ne;
+ e->e_import = auimpl_import_24ne;
+ flags |= ENGINE_EXCLUSIVE;
+ sampsz = 2;
+ break;
+ default:
+ audio_dev_warn(d, "bad format");
+ rv = ENOTSUP;
+ goto done;
+ }
+
+ /* sanity test a few values */
+ if ((e->e_nchan < 0) || (e->e_nchan > AUDIO_MAX_CHANNELS) ||
+ (e->e_rate < 5000) || (e->e_rate > 192000)) {
+ audio_dev_warn(d, "bad engine channels or rate");
+ rv = EINVAL;
+ goto done;
+ }
+
+ rv = ENG_OPEN(e, &e->e_fragfr, &e->e_nfrags, &e->e_data);
+ if (rv != 0) {
+ audio_dev_warn(d, "unable to open engine");
+ goto done;
+ }
+ if ((e->e_fragfr < 1) || (e->e_data == NULL)) {
+ audio_dev_warn(d, "improper engine configuration");
+ rv = EINVAL;
+ goto done;
+ }
+
+ if ((e->e_fragfr > AUDIO_CHBUFS) || (e->e_nfrags < 2)) {
+ rv = EINVAL;
+ audio_dev_warn(d, "invalid fragment configuration");
+ goto done;
+ }
+
+ e->e_framesz = e->e_nchan * sampsz;
+ e->e_fragbytes = e->e_fragfr * e->e_framesz;
+ e->e_nframes = e->e_nfrags * e->e_fragfr;
+ e->e_intrs = e->e_rate / e->e_fragfr;
+ e->e_nbytes = e->e_nframes * e->e_framesz;
+ e->e_head = 0;
+ e->e_tail = 0;
+ e->e_hidx = 0;
+ e->e_tidx = 0;
+ e->e_limiter_state = 0x10000;
+ bzero(e->e_data, e->e_nbytes);
+
+ for (i = 0; i < e->e_nchan; i++) {
+ if (e->e_ops.audio_engine_chinfo == NULL) {
+ e->e_choffs[i] = i;
+ e->e_chincr[i] = e->e_nchan;
+ } else {
+ ENG_CHINFO(e, i, &e->e_choffs[i], &e->e_chincr[i]);
+ }
+ }
+
+ e->e_flags |= (ENGINE_OPEN | (flags & (ENGINE_OUTPUT | ENGINE_INPUT)));
+
+ /*
+ * Start the engine up now.
+ *
+ * AC3: Note that this will need to be modified for AC3, since
+ * for AC3 we can't start the device until we actually have
+ * some data for it from the application. Probably the best
+ * way to do this would be to add a flag, ENGINE_DEFERRED or
+ * somesuch.
+ */
+ if (e->e_ops.audio_engine_start != NULL) {
+ rv = ENG_START(e);
+ if (rv != 0) {
+ ENG_CLOSE(e);
+ goto done;
+ }
+ }
+
+ok:
+ sp->s_phys_parms->p_rate = e->e_rate;
+ sp->s_phys_parms->p_nchan = e->e_nchan;
+
+ list_insert_tail(&e->e_streams, sp);
+ sp->s_engine = e;
+
+done:
+ mutex_exit(&e->e_lock);
+ mutex_exit(&d->d_lock);
+ return (rv);
+}
+
+void
+auimpl_engine_close(audio_stream_t *sp)
+{
+ audio_engine_t *e = sp->s_engine;
+ audio_dev_t *d;
+
+ if (e == NULL)
+ return;
+
+ d = e->e_dev;
+
+ mutex_enter(&d->d_lock);
+ mutex_enter(&e->e_lock);
+ sp->s_engine = NULL;
+ list_remove(&e->e_streams, sp);
+ if (list_is_empty(&e->e_streams)) {
+ /* if last client holding engine open, close it all down */
+ if (e->e_ops.audio_engine_stop != NULL)
+ ENG_STOP(e);
+ e->e_flags &= ENGINE_DRIVER_FLAGS;
+ ENG_CLOSE(e);
+ }
+ mutex_exit(&e->e_lock);
+
+ cv_broadcast(&d->d_cv);
+ mutex_exit(&d->d_lock);
+}
+
+int
+audio_dev_register(audio_dev_t *d)
+{
+ list_t *l;
+ audio_dev_t *srch;
+ int start;
+
+ /*
+ * Make sure we don't automatically unload. This prevents
+ * loss of hardware settings when no audio clients are
+ * running.
+ */
+ (void) ddi_prop_update_int(DDI_DEV_T_NONE, d->d_dip,
+ DDI_NO_AUTODETACH, 1);
+
+ /*
+ * This does an in-order insertion, finding the first available
+ * free index. "Special" devices (ones without any actual engines)
+ * are all numbered 0. There should only be one of them anyway.
+ * All others start at one.
+ */
+ if (d->d_flags & DEV_SNDSTAT_CAP) {
+ start = 0;
+ } else {
+ start = 1;
+ }
+ d->d_index = start;
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ l = &auimpl_devs_by_index;
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ /* skip over special nodes */
+ if (srch->d_index < start)
+ continue;
+ if (srch->d_index > d->d_index) {
+ /* found a free spot! */
+ break;
+ }
+ d->d_index++;
+ }
+ /*
+ * NB: If srch is NULL, then list_insert_before puts
+ * it on the tail of the list. So if we didn't find a
+ * hole, then that's where we want it.
+ */
+ list_insert_before(l, srch, d);
+
+ /* insert in order by number */
+ l = &auimpl_devs_by_number;
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ if (srch->d_number >= d->d_number) {
+ break;
+ }
+ }
+ list_insert_before(l, srch, d);
+
+ rw_exit(&auimpl_dev_lock);
+
+ if (auimpl_create_minors(d) != 0) {
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ auimpl_remove_minors(d);
+ list_remove(&auimpl_devs_by_index, d);
+ list_remove(&auimpl_devs_by_number, d);
+ rw_exit(&auimpl_dev_lock);
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+int
+audio_dev_unregister(audio_dev_t *d)
+{
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+
+ mutex_enter(&d->d_lock);
+ /* if we are still in use, we can't unregister */
+ if (d->d_refcnt) {
+ mutex_exit(&d->d_lock);
+ rw_exit(&auimpl_dev_lock);
+ return (DDI_FAILURE);
+ }
+ auimpl_remove_minors(d);
+ list_remove(&auimpl_devs_by_index, d);
+ list_remove(&auimpl_devs_by_number, d);
+ mutex_exit(&d->d_lock);
+
+ rw_exit(&auimpl_dev_lock);
+
+ return (DDI_SUCCESS);
+}
+
+static int
+auimpl_engine_ksupdate(kstat_t *ksp, int rw)
+{
+ audio_engine_t *e = ksp->ks_private;
+ struct audio_stats *st = &e->e_stats;
+
+ if (rw == KSTAT_WRITE) {
+ return (EACCES);
+ }
+
+ mutex_enter(&e->e_lock);
+ st->st_head.value.ui64 = e->e_head;
+ st->st_tail.value.ui64 = e->e_tail;
+ st->st_flags.value.ui32 = e->e_flags;
+ st->st_fragfr.value.ui32 = e->e_fragfr;
+ st->st_nfrags.value.ui32 = e->e_nfrags;
+ st->st_framesz.value.ui32 = e->e_framesz;
+ st->st_nbytes.value.ui32 = e->e_nbytes;
+ st->st_hidx.value.ui32 = e->e_hidx;
+ st->st_tidx.value.ui32 = e->e_tidx;
+ st->st_format.value.ui32 = e->e_format;
+ st->st_nchan.value.ui32 = e->e_nchan;
+ st->st_rate.value.ui32 = e->e_rate;
+ st->st_intrs.value.ui32 = e->e_intrs;
+ st->st_errors.value.ui32 = e->e_errors;
+ st->st_suspended.value.ui32 = e->e_suspended;
+ mutex_exit(&e->e_lock);
+
+ return (0);
+}
+
+static void
+auimpl_engine_ksinit(audio_dev_t *d, audio_engine_t *e)
+{
+ char name[32];
+ struct audio_stats *st;
+
+ (void) snprintf(name, sizeof (name), "engine_%d", e->e_num);
+
+ e->e_ksp = kstat_create(ddi_driver_name(d->d_dip), d->d_instance,
+ name, "misc", KSTAT_TYPE_NAMED,
+ sizeof (struct audio_stats) / sizeof (kstat_named_t), 0);
+
+ if (e->e_ksp == NULL) {
+ audio_dev_warn(d, "unable to initialize kstats");
+ return;
+ }
+
+ st = &e->e_stats;
+ e->e_ksp->ks_data = st;
+ e->e_ksp->ks_private = e;
+ e->e_ksp->ks_lock = NULL;
+ e->e_ksp->ks_update = auimpl_engine_ksupdate;
+ kstat_named_init(&st->st_head, "head", KSTAT_DATA_UINT64);
+ kstat_named_init(&st->st_tail, "tail", KSTAT_DATA_UINT64);
+ kstat_named_init(&st->st_flags, "flags", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_fragfr, "fragfr", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nfrags, "nfrags", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_framesz, "framesz", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nbytes, "nbytes", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_hidx, "hidx", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_tidx, "tidx", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_format, "format", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_nchan, "channels", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_rate, "rate", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_intrs, "intrhz", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_errors, "errors", KSTAT_DATA_UINT32);
+ kstat_named_init(&st->st_suspended, "suspended", KSTAT_DATA_UINT32);
+ kstat_install(e->e_ksp);
+}
+
+void
+audio_dev_add_engine(audio_dev_t *d, audio_engine_t *e)
+{
+ e->e_num = d->d_engno++;
+
+ mutex_enter(&d->d_lock);
+
+ auimpl_engine_ksinit(d, e);
+
+ /* check for duplex */
+ if ((e->e_flags & ENGINE_OUTPUT_CAP) && (d->d_flags & DEV_INPUT_CAP)) {
+ d->d_flags |= DEV_DUPLEX_CAP;
+ }
+ if ((e->e_flags & ENGINE_INPUT_CAP) && (d->d_flags & DEV_OUTPUT_CAP)) {
+ d->d_flags |= DEV_DUPLEX_CAP;
+ }
+ /* add in the direction caps -- must be done after duplex above */
+ if (e->e_flags & ENGINE_OUTPUT_CAP) {
+ d->d_flags |= DEV_OUTPUT_CAP;
+ }
+ if (e->e_flags & ENGINE_INPUT_CAP) {
+ d->d_flags |= DEV_INPUT_CAP;
+ }
+
+ list_insert_tail(&d->d_engines, e);
+ e->e_dev = d;
+ mutex_exit(&d->d_lock);
+}
+
+void
+audio_dev_remove_engine(audio_dev_t *d, audio_engine_t *e)
+{
+ mutex_enter(&d->d_lock);
+ list_remove(&d->d_engines, e);
+ e->e_dev = NULL;
+ if (e->e_ksp)
+ kstat_delete(e->e_ksp);
+ e->e_ksp = NULL;
+ mutex_exit(&d->d_lock);
+}
+
+/*
+ * Change the number.
+ */
+void
+auclnt_set_dev_number(audio_dev_t *d, int num)
+{
+ list_t *l = &auimpl_devs_by_number;
+ audio_dev_t *srch;
+
+ /* reorder our list */
+ rw_enter(&auimpl_dev_lock, RW_WRITER);
+ d->d_number = num;
+ list_remove(l, d);
+ for (srch = list_head(l); srch; srch = list_next(l, srch)) {
+ if (srch->d_number >= d->d_number) {
+ break;
+ }
+ }
+ list_insert_before(l, srch, d);
+
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_walk_devs(int (*walker)(audio_dev_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ boolean_t cont;
+ list_t *l;
+
+ l = &auimpl_devs_by_index;
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ mutex_enter(&d->d_lock);
+ cont = walker(d, arg);
+ mutex_exit(&d->d_lock);
+ if (cont == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_walk_devs_by_number(int (*walker)(audio_dev_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ boolean_t cont;
+ list_t *l;
+
+ l = &auimpl_devs_by_number;
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ for (d = list_head(l); d; d = list_next(l, d)) {
+ mutex_enter(&d->d_lock);
+ cont = walker(d, arg);
+ mutex_exit(&d->d_lock);
+ if (cont == AUDIO_WALK_STOP)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+void
+auclnt_dev_walk_engines(audio_dev_t *d,
+ int (*walker)(audio_engine_t *, void *),
+ void *arg)
+{
+ audio_engine_t *e;
+ list_t *l = &d->d_engines;
+
+ mutex_enter(&d->d_lock);
+ for (e = list_head(l); e != NULL; e = list_next(l, e)) {
+ if (walker(e, arg) == AUDIO_WALK_STOP) {
+ break;
+ }
+ }
+ mutex_exit(&d->d_lock);
+}
+
+int
+auclnt_engine_get_format(audio_engine_t *e)
+{
+ return (ENG_FORMAT(e));
+}
+
+int
+auclnt_engine_get_channels(audio_engine_t *e)
+{
+ return (ENG_CHANNELS(e));
+}
+
+int
+auclnt_engine_get_rate(audio_engine_t *e)
+{
+ return (ENG_RATE(e));
+}
+
+unsigned
+auclnt_engine_get_capab(audio_engine_t *e)
+{
+ unsigned capab = 0;
+
+ if (e->e_flags & ENGINE_INPUT_CAP) {
+ capab |= AUDIO_CLIENT_CAP_RECORD;
+ }
+ if (e->e_flags & ENGINE_OUTPUT_CAP) {
+ capab |= AUDIO_CLIENT_CAP_PLAY;
+ }
+ return (capab);
+}
+
+static void
+auimpl_walk_engines(int (*walker)(audio_engine_t *, void *), void *arg)
+{
+ audio_dev_t *d;
+ audio_engine_t *e;
+ list_t *l1;
+ list_t *l2;
+ boolean_t done = B_FALSE;
+
+ rw_enter(&auimpl_dev_lock, RW_READER);
+ l1 = &auimpl_devs_by_index;
+ for (d = list_head(l1); d; d = list_next(l1, d)) {
+ mutex_enter(&d->d_lock);
+ l2 = &d->d_engines;
+ for (e = list_head(l2); e; e = list_next(l2, e)) {
+ if (walker(e, arg) == AUDIO_WALK_STOP) {
+ done = B_TRUE;
+ break;
+ }
+ }
+ mutex_exit(&d->d_lock);
+ if (done)
+ break;
+ }
+ rw_exit(&auimpl_dev_lock);
+}
+
+/*
+ * This function suspends an engine. The intent is to pause the
+ * engine temporarily so that it does not underrun while user threads
+ * are suspended. The driver is still responsible for actually doing
+ * the driver suspend work -- all this does is put the engine in a
+ * paused state. It does not prevent, for example, threads from
+ * accessing the hardware.
+ *
+ * A properly implemented driver won't even be aware of the existence
+ * of this routine -- the driver will just handle the suspend &
+ * resume. At the point of suspend & resume, the driver will see that
+ * the engines are not running (as if all threads had "paused" it).
+ *
+ * Failure to execute either of the routines below is not critical,
+ * but will probably lead to underruns and overflows as the kernel
+ * driver gets resumed well in advance of the time when user threads
+ * are ready to start operation.
+ */
+static int
+auimpl_engine_suspend(audio_engine_t *e, void *dontcare)
+{
+ _NOTE(ARGUNUSED(dontcare));
+
+ mutex_enter(&e->e_lock);
+ e->e_suspended = B_TRUE;
+ mutex_exit(&e->e_lock);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+auimpl_engine_resume(audio_engine_t *e, void *dontcare)
+{
+ _NOTE(ARGUNUSED(dontcare));
+ mutex_enter(&e->e_lock);
+ e->e_suspended = B_FALSE;
+ mutex_exit(&e->e_lock);
+ return (AUDIO_WALK_CONTINUE);
+}
+
+boolean_t
+auimpl_cpr(void *arg, int code)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ switch (code) {
+ case CB_CODE_CPR_CHKPT:
+ auimpl_walk_engines(auimpl_engine_suspend, NULL);
+ return (B_TRUE);
+
+ case CB_CODE_CPR_RESUME:
+ auimpl_walk_engines(auimpl_engine_resume, NULL);
+ return (B_TRUE);
+
+ default:
+ return (B_FALSE);
+ }
+}
+
+static callb_id_t auimpl_cpr_id = 0;
+
+void
+auimpl_dev_init(void)
+{
+ rw_init(&auimpl_dev_lock, NULL, RW_DRIVER, NULL);
+ list_create(&auimpl_devs_by_index, sizeof (struct audio_dev),
+ offsetof(struct audio_dev, d_by_index));
+ list_create(&auimpl_devs_by_number, sizeof (struct audio_dev),
+ offsetof(struct audio_dev, d_by_number));
+
+ /*
+ * We "borrow" the CB_CL_CPR_PM class, which gets executed at
+ * about the right time for us. It would be nice to have a
+ * new CB_CL_CPR_AUDIO class, but it isn't critical at this
+ * point.
+ *
+ * Note that we don't care about our thread id.
+ */
+ auimpl_cpr_id = callb_add(auimpl_cpr, NULL, CB_CL_CPR_PM, "audio_cpr");
+}
+
+void
+auimpl_dev_fini(void)
+{
+ (void) callb_delete(auimpl_cpr_id);
+ list_destroy(&auimpl_devs_by_index);
+ list_destroy(&auimpl_devs_by_number);
+ rw_destroy(&auimpl_dev_lock);
+}
+
+void
+audio_engine_set_private(audio_engine_t *eng, void *prv)
+{
+ eng->e_private = prv;
+}
+
+void *
+audio_engine_get_private(audio_engine_t *eng)
+{
+ return (eng->e_private);
+}
+
+void
+audio_dump_bytes(const uint8_t *w, int dcount)
+{
+ char line[64];
+ char *s;
+ int i;
+ const int wrap = 16;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %02x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
+
+void
+audio_dump_words(const uint16_t *w, int dcount)
+{
+ char line[64];
+ char *s;
+ int i;
+ const int wrap = 8;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %04x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
+
+void
+audio_dump_dwords(const uint32_t *w, int dcount)
+{
+ char line[128];
+ char *s;
+ int i;
+ const int wrap = 4;
+
+ s = line;
+ line[0] = 0;
+
+ cmn_err(CE_NOTE, "starting @ %p", (void *)w);
+ for (i = 0; i < dcount; i++) {
+
+ (void) sprintf(s, " %08x", *w);
+ s += strlen(s);
+ w++;
+
+ if ((i % wrap) == (wrap - 1)) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (wrap - 1), line);
+ line[0] = 0;
+ s = line;
+ }
+ }
+
+ if ((i % wrap) != 0) {
+ cmn_err(CE_NOTE, "%08x:%s", i - (i % wrap), line);
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_fltdata.c b/usr/src/uts/common/io/audio/impl/audio_fltdata.c
new file mode 100644
index 0000000000..8c5887085e
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_fltdata.c
@@ -0,0 +1,9283 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+
+/*
+ * Purpose: Filter coefficient tables for GRC3
+ */
+
+const int32_t filter_data_L[4097] = {
+ 0, -43570, -87593, -132073, -177009, -222405, -268261, -314581,
+ -361366, -408617, -456336, -504526, -553189, -602325, -651938, -702028,
+ -752598, -803650, -855185, -907205, -959713, -1012709, -1066196,
+ -1120176, -1174650, -1229621, -1285089, -1341058, -1397528, -1454502,
+ -1511982, -1569968, -1628464, -1687470, -1746989, -1807023, -1867572,
+ -1928640, -1990227, -2052336, -2114969, -2178126, -2241810, -2306023,
+ -2370767, -2436042, -2501851, -2568196, -2635079, -2702500, -2770463,
+ -2838968, -2908017, -2977612, -3047755, -3118448, -3189691, -3261488,
+ -3333839, -3406746, -3480211, -3554236, -3628822, -3703971, -3779685,
+ -3855965, -3932813, -4010230, -4088218, -4166780, -4245915, -4325627,
+ -4405917, -4486785, -4568235, -4650267, -4732883, -4816085, -4899874,
+ -4984252, -5069220, -5154780, -5240933, -5327682, -5415027, -5502970,
+ -5591512, -5680656, -5770402, -5860752, -5951708, -6043271, -6135443,
+ -6228224, -6321617, -6415623, -6510244, -6605480, -6701333, -6797805,
+ -6894897, -6992611, -7090947, -7189908, -7289494, -7389707, -7490549,
+ -7592020, -7694123, -7796857, -7900226, -8004230, -8108870, -8214147,
+ -8320064, -8426621, -8533819, -8641661, -8750146, -8859276, -8969053,
+ -9079478, -9190552, -9302276, -9414651, -9527679, -9641360, -9755697,
+ -9870689, -9986339, -10102647, -10219615, -10337243, -10455532,
+ -10574485, -10694101, -10814383, -10935330, -11056944, -11179227,
+ -11302178, -11425800, -11550093, -11675058, -11800696, -11927008,
+ -12053996, -12181659, -12309999, -12439017, -12568714, -12699091,
+ -12830148, -12961887, -13094307, -13227412, -13361200, -13495673,
+ -13630832, -13766677, -13903209, -14040430, -14178339, -14316938,
+ -14456228, -14596208, -14736880, -14878245, -15020302, -15163054,
+ -15306500, -15450641, -15595478, -15741012, -15887242, -16034170,
+ -16181797, -16330122, -16479146, -16628871, -16779295, -16930421,
+ -17082248, -17234777, -17388008, -17541942, -17696580, -17851921,
+ -18007966, -18164716, -18322170, -18480330, -18639196, -18798767,
+ -18959045, -19120029, -19281720, -19444119, -19607224, -19771038,
+ -19935559, -20100788, -20266726, -20433372, -20600727, -20768791,
+ -20937563, -21107045, -21277236, -21448136, -21619746, -21792065,
+ -21965093, -22138831, -22313278, -22488435, -22664301, -22840876,
+ -23018161, -23196155, -23374859, -23554271, -23734392, -23915223,
+ -24096761, -24279008, -24461964, -24645627, -24829998, -25015077,
+ -25200863, -25387356, -25574556, -25762462, -25951074, -26140392,
+ -26330415, -26521143, -26712576, -26904712, -27097553, -27291096,
+ -27485342, -27680290, -27875940, -28072291, -28269343, -28467095,
+ -28665546, -28864695, -29064543, -29265089, -29466331, -29668269,
+ -29870903, -30074231, -30278253, -30482969, -30688377, -30894476,
+ -31101266, -31308746, -31516915, -31725772, -31935317, -32145547,
+ -32356463, -32568064, -32780347, -32993313, -33206961, -33421289,
+ -33636296, -33851981, -34068343, -34285381, -34503094, -34721480,
+ -34940539, -35160268, -35380668, -35601737, -35823472, -36045874,
+ -36268941, -36492671, -36717063, -36942116, -37167828, -37394198,
+ -37621224, -37848905, -38077240, -38306227, -38535863, -38766149,
+ -38997082, -39228661, -39460883, -39693748, -39927254, -40161398,
+ -40396180, -40631598, -40867649, -41104332, -41341645, -41579587,
+ -41818156, -42057349, -42297164, -42537601, -42778656, -43020329,
+ -43262616, -43505516, -43749028, -43993148, -44237875, -44483206,
+ -44729140, -44975675, -45222807, -45470536, -45718859, -45967773,
+ -46217276, -46467367, -46718042, -46969299, -47221137, -47473552,
+ -47726542, -47980105, -48234239, -48488940, -48744207, -49000036,
+ -49256426, -49513373, -49770876, -50028931, -50287535, -50546687,
+ -50806383, -51066621, -51327398, -51588711, -51850557, -52112934,
+ -52375839, -52639268, -52903220, -53167690, -53432677, -53698176,
+ -53964186, -54230703, -54497724, -54765245, -55033265, -55301779,
+ -55570785, -55840279, -56110259, -56380720, -56651661, -56923077,
+ -57194964, -57467321, -57740143, -58013428, -58287171, -58561369,
+ -58836019, -59111118, -59386661, -59662646, -59939068, -60215925,
+ -60493212, -60770926, -61049064, -61327621, -61606594, -61885979,
+ -62165772, -62445970, -62726569, -63007564, -63288953, -63570731,
+ -63852894, -64135438, -64418360, -64701655, -64985319, -65269349,
+ -65553739, -65838487, -66123588, -66409037, -66694831, -66980965,
+ -67267436, -67554238, -67841368, -68128821, -68416593, -68704680,
+ -68993076, -69281779, -69570782, -69860083, -70149675, -70439556,
+ -70729720, -71020162, -71310878, -71601864, -71893114, -72184624,
+ -72476390, -72768406, -73060668, -73353171, -73645909, -73938880,
+ -74232076, -74525494, -74819129, -75112975, -75407028, -75701282,
+ -75995733, -76290376, -76585205, -76880215, -77175401, -77470758,
+ -77766281, -78061964, -78357803, -78653792, -78949925, -79246197,
+ -79542604, -79839139, -80135797, -80432572, -80729460, -81026455,
+ -81323551, -81620742, -81918024, -82215389, -82512834, -82810352,
+ -83107937, -83405584, -83703287, -84001040, -84298837, -84596673,
+ -84894542, -85192437, -85490354, -85788285, -86086225, -86384169,
+ -86682109, -86980041, -87277957, -87575852, -87873720, -88171554,
+ -88469349, -88767098, -89064795, -89362433, -89660007, -89957510,
+ -90254936, -90552278, -90849530, -91146685, -91443738, -91740681,
+ -92037509, -92334214, -92630790, -92927231, -93223529, -93519679,
+ -93815673, -94111506, -94407169, -94702657, -94997963, -95293079,
+ -95588000, -95882717, -96177226, -96471517, -96765585, -97059423,
+ -97353024, -97646380, -97939484, -98232330, -98524911, -98817219,
+ -99109247, -99400988, -99692436, -99983581, -100274419, -100564940,
+ -100855138, -101145006, -101434536, -101723721, -102012553, -102301026,
+ -102589131, -102876861, -103164209, -103451167, -103737727, -104023883,
+ -104309626, -104594949, -104879843, -105164303, -105448319, -105731884,
+ -106014991, -106297631, -106579796, -106861480, -107142674, -107423370,
+ -107703560, -107983236, -108262391, -108541017, -108819105, -109096647,
+ -109373636, -109650063, -109925920, -110201200, -110475893, -110749992,
+ -111023489, -111296375, -111568643, -111840283, -112111288, -112381649,
+ -112651358, -112920406, -113188786, -113456489, -113723506, -113989829,
+ -114255449, -114520359, -114784548, -115048010, -115310735, -115572715,
+ -115833940, -116094404, -116354096, -116613008, -116871131, -117128457,
+ -117384977, -117640682, -117895564, -118149613, -118402820, -118655178,
+ -118906676, -119157307, -119407060, -119655927, -119903900, -120150969,
+ -120397125, -120642359, -120886662, -121130025, -121372438, -121613894,
+ -121854382, -122093893, -122332418, -122569949, -122806475, -123041988,
+ -123276477, -123509935, -123742351, -123973717, -124204022, -124433258,
+ -124661415, -124888484, -125114455, -125339319, -125563066, -125785687,
+ -126007172, -126227512, -126446697, -126664718, -126881565, -127097228,
+ -127311698, -127524965, -127737019, -127947852, -128157452, -128365810,
+ -128572918, -128778764, -128983338, -129186633, -129388636, -129589339,
+ -129788732, -129986805, -130183547, -130378950, -130573002, -130765695,
+ -130957018, -131146961, -131335514, -131522667, -131708411, -131892735,
+ -132075628, -132257082, -132437085, -132615628, -132792701, -132968293,
+ -133142395, -133314995, -133486085, -133655653, -133823690, -133990184,
+ -134155127, -134318508, -134480316, -134640541, -134799172, -134956201,
+ -135111615, -135265405, -135417561, -135568071, -135716926, -135864115,
+ -136009628, -136153454, -136295583, -136436004, -136574707, -136711682,
+ -136846917, -136980402, -137112128, -137242082, -137370255, -137496636,
+ -137621215, -137743980, -137864922, -137984030, -138101292, -138216698,
+ -138330239, -138441902, -138551678, -138659555, -138765523, -138869571,
+ -138971689, -139071865, -139170090, -139266351, -139360639, -139452943,
+ -139543251, -139631554, -139717840, -139802098, -139884317, -139964488,
+ -140042598, -140118638, -140192595, -140264460, -140334221, -140401868,
+ -140467389, -140530774, -140592011, -140651091, -140708001, -140762732,
+ -140815271, -140865608, -140913733, -140959634, -141003299, -141044719,
+ -141083882, -141120778, -141155394, -141187721, -141217746, -141245460,
+ -141270851, -141293908, -141314620, -141332976, -141348965, -141362575,
+ -141373797, -141382618, -141389028, -141393015, -141394570, -141393679,
+ -141390333, -141384520, -141376229, -141365450, -141352170, -141336379,
+ -141318066, -141297220, -141273829, -141247883, -141219370, -141188279,
+ -141154599, -141118320, -141079429, -141037916, -140993770, -140946979,
+ -140897532, -140845419, -140790628, -140733147, -140672967, -140610075,
+ -140544461, -140476114, -140405022, -140331174, -140254559, -140175166,
+ -140092984, -140008001, -139920208, -139829591, -139736141, -139639847,
+ -139540696, -139438679, -139333783, -139225998, -139115313, -139001717,
+ -138885198, -138765745, -138643348, -138517995, -138389675, -138258377,
+ -138124090, -137986803, -137846505, -137703185, -137556831, -137407433,
+ -137254980, -137099461, -136940863, -136779178, -136614393, -136446497,
+ -136275480, -136101331, -135924037, -135743590, -135559977, -135373187,
+ -135183210, -134990034, -134793650, -134594044, -134391208, -134185129,
+ -133975798, -133763202, -133547331, -133328175, -133105722, -132879961,
+ -132650882, -132418474, -132182725, -131943626, -131701164, -131455330,
+ -131206113, -130953501, -130697485, -130438052, -130175193, -129908897,
+ -129639153, -129365950, -129089277, -128809125, -128525481, -128238336,
+ -127947679, -127653499, -127355785, -127054528, -126749716, -126441338,
+ -126129385, -125813845, -125494708, -125171963, -124845601, -124515610,
+ -124181980, -123844700, -123503761, -123159150, -122810860, -122458877,
+ -122103193, -121743798, -121380679, -121013828, -120643234, -120268886,
+ -119890775, -119508889, -119123220, -118733756, -118340487, -117943403,
+ -117542495, -117137751, -116729161, -116316716, -115900406, -115480219,
+ -115056147, -114628179, -114196305, -113760516, -113320800, -112877148,
+ -112429551, -111977998, -111522479, -111062985, -110599506, -110132031,
+ -109660551, -109185057, -108705537, -108221984, -107734386, -107242735,
+ -106747020, -106247232, -105743361, -105235398, -104723333, -104207157,
+ -103686860, -103162432, -102633863, -102101146, -101564269, -101023225,
+ -100478002, -99928593, -99374986, -98817175, -98255148, -97688897,
+ -97118412, -96543685, -95964706, -95381466, -94793956, -94202167,
+ -93606089, -93005714, -92401033, -91792036, -91178715, -90561061,
+ -89939065, -89312718, -88682011, -88046936, -87407483, -86763645,
+ -86115411, -85462774, -84805725, -84144255, -83478356, -82808019,
+ -82133236, -81453997, -80770296, -80082122, -79389469, -78692326,
+ -77990687, -77284543, -76573885, -75858706, -75138996, -74414749,
+ -73685955, -72952607, -72214696, -71472216, -70725156, -69973511,
+ -69217271, -68456429, -67690977, -66920907, -66146211, -65366882,
+ -64582911, -63794292, -63001017, -62203077, -61400466, -60593176,
+ -59781199, -58964527, -58143155, -57317073, -56486275, -55650754,
+ -54810501, -53965511, -53115775, -52261287, -51402039, -50538025,
+ -49669237, -48795669, -47917312, -47034162, -46146210, -45253449,
+ -44355874, -43453477, -42546251, -41634190, -40717287, -39795536,
+ -38868930, -37937462, -37001127, -36059917, -35113826, -34162849,
+ -33206977, -32246207, -31280530, -30309941, -29334435, -28354004,
+ -27368642, -26378345, -25383105, -24382917, -23377775, -22367673,
+ -21352606, -20332568, -19307552, -18277554, -17242567, -16202587,
+ -15157608, -14107623, -13052629, -11992619, -10927588, -9857532,
+ -8782443, -7702319, -6617153, -5526940, -4431675, -3331353, -2225970,
+ -1115521, 0, 1120597, 2246275, 3377039, 4512893, 5653843, 6799891,
+ 7951044, 9107305, 10268679, 11435170, 12606782, 13783521, 14965389,
+ 16152391, 17344532, 18541815, 19744244, 20951823, 22164556, 23382448,
+ 24605501, 25833720, 27067108, 28305668, 29549406, 30798323, 32052423,
+ 33311711, 34576189, 35845860, 37120729, 38400797, 39686069, 40976547,
+ 42272235, 43573135, 44879251, 46190585, 47507140, 48828919, 50155925,
+ 51488160, 52825627, 54168329, 55516268, 56869446, 58227867, 59591532,
+ 60960443, 62334604, 63714015, 65098680, 66488600, 67883777, 69284214,
+ 70689911, 72100872, 73517098, 74938590, 76365350, 77797380, 79234682,
+ 80677257, 82125106, 83578230, 85036632, 86500312, 87969272, 89443512,
+ 90923035, 92407840, 93897929, 95393303, 96893963, 98399909, 99911142,
+ 101427664, 102949474, 104476572, 106008961, 107546640, 109089609,
+ 110637869, 112191420, 113750263, 115314396, 116883822, 118458539,
+ 120038547, 121623847, 123214439, 124810321, 126411494, 128017958,
+ 129629712, 131246756, 132869088, 134496710, 136129619, 137767815,
+ 139411298, 141060066, 142714119, 144373456, 146038076, 147707977,
+ 149383159, 151063621, 152749360, 154440377, 156136668, 157838234,
+ 159545072, 161257181, 162974559, 164697204, 166425116, 168158291,
+ 169896728, 171640425, 173389381, 175143592, 176903057, 178667774,
+ 180437740, 182212953, 183993411, 185779111, 187570050, 189366227,
+ 191167637, 192974280, 194786151, 196603248, 198425568, 200253108,
+ 202085865, 203923836, 205767018, 207615407, 209469001, 211327795,
+ 213191786, 215060971, 216935347, 218814909, 220699654, 222589578,
+ 224484677, 226384948, 228290386, 230200988, 232116749, 234037665,
+ 235963732, 237894945, 239831301, 241772795, 243719422, 245671177,
+ 247628057, 249590056, 251557170, 253529394, 255506722, 257489151,
+ 259476675, 261469288, 263466986, 265469763, 267477615, 269490536,
+ 271508519, 273531561, 275559655, 277592796, 279630977, 281674194,
+ 283722440, 285775710, 287833997, 289897295, 291965599, 294038902,
+ 296117199, 298200481, 300288744, 302381981, 304480185, 306583350,
+ 308691469, 310804535, 312922542, 315045483, 317173351, 319306138,
+ 321443839, 323586445, 325733949, 327886345, 330043625, 332205781,
+ 334372807, 336544694, 338721435, 340903022, 343089448, 345280705,
+ 347476785, 349677680, 351883382, 354093883, 356309174, 358529248,
+ 360754097, 362983712, 365218084, 367457205, 369701067, 371949661,
+ 374202979, 376461011, 378723748, 380991183, 383263305, 385540107,
+ 387821578, 390107710, 392398493, 394693919, 396993977, 399298659,
+ 401607955, 403921855, 406240350, 408563430, 410891085, 413223306,
+ 415560082, 417901404, 420247261, 422597644, 424952542, 427311946,
+ 429675844, 432044226, 434417083, 436794402, 439176175, 441562390,
+ 443953037, 446348105, 448747582, 451151459, 453559723, 455972365,
+ 458389373, 460810735, 463236441, 465666479, 468100838, 470539507,
+ 472982473, 475429726, 477881254, 480337044, 482797086, 485261367,
+ 487729876, 490202600, 492679528, 495160647, 497645945, 500135411,
+ 502629031, 505126793, 507628686, 510134695, 512644810, 515159016,
+ 517677303, 520199656, 522726063, 525256511, 527790987, 530329478,
+ 532871971, 535418453, 537968910, 540523330, 543081699, 545644003,
+ 548210230, 550780365, 553354395, 555932307, 558514086, 561099718,
+ 563689191, 566282490, 568879600, 571480509, 574085201, 576693663,
+ 579305881, 581921839, 584541524, 587164922, 589792017, 592422796,
+ 595057243, 597695344, 600337084, 602982449, 605631423, 608283992,
+ 610940141, 613599853, 616263116, 618929912, 621600227, 624274046,
+ 626951354, 629632134, 632316371, 635004051, 637695156, 640389672,
+ 643087583, 645788873, 648493526, 651201526, 653912857, 656627504,
+ 659345449, 662066678, 664791173, 667518918, 670249898, 672984095,
+ 675721494, 678462077, 681205828, 683952731, 686702768, 689455924,
+ 692212181, 694971522, 697733931, 700499390, 703267882, 706039390,
+ 708813898, 711591388, 714371842, 717155244, 719941575, 722730819,
+ 725522958, 728317974, 731115850, 733916567, 736720110, 739526459,
+ 742335596, 745147504, 747962165, 750779561, 753599674, 756422486,
+ 759247977, 762076132, 764906930, 767740353, 770576384, 773415004,
+ 776256194, 779099935, 781946210, 784794999, 787646284, 790500045,
+ 793356265, 796214924, 799076003, 801939484, 804805347, 807673573,
+ 810544143, 813417038, 816292238, 819169725, 822049479, 824931480,
+ 827815710, 830702148, 833590775, 836481572, 839374518, 842269595,
+ 845166782, 848066059, 850967407, 853870806, 856776236, 859683677,
+ 862593109, 865504511, 868417864, 871333148, 874250341, 877169425,
+ 880090378, 883013180, 885937811, 888864250, 891792477, 894722471,
+ 897654212, 900587679, 903522851, 906459707, 909398227, 912338390,
+ 915280175, 918223561, 921168527, 924115052, 927063115, 930012694,
+ 932963770, 935916320, 938870323, 941825758, 944782604, 947740839,
+ 950700442, 953661392, 956623666, 959587244, 962552104, 965518224,
+ 968485582, 971454158, 974423928, 977394872, 980366968, 983340193,
+ 986314526, 989289944, 992266427, 995243951, 998222495, 1001202037,
+ 1004182555, 1007164025, 1010146427, 1013129738, 1016113936, 1019098998,
+ 1022084902, 1025071625, 1028059146, 1031047441, 1034036489, 1037026266,
+ 1040016750, 1043007919, 1045999750, 1048992219, 1051985306, 1054978985,
+ 1057973236, 1060968035, 1063963359, 1066959186, 1069955492, 1072952255,
+ 1075949451, 1078947057, 1081945052, 1084943410, 1087942110, 1090941128,
+ 1093940441, 1096940026, 1099939860, 1102939919, 1105940180, 1108940619,
+ 1111941215, 1114941942, 1117942777, 1120943698, 1123944681, 1126945702,
+ 1129946738, 1132947764, 1135948759, 1138949697, 1141950556, 1144951312,
+ 1147951940, 1150952419, 1153952722, 1156952828, 1159952711, 1162952349,
+ 1165951718, 1168950793, 1171949551, 1174947968, 1177946019, 1180943682,
+ 1183940932, 1186937744, 1189934096, 1192929963, 1195925320, 1198920145,
+ 1201914412, 1204908098, 1207901179, 1210893629, 1213885426, 1216876545,
+ 1219866962, 1222856652, 1225845591, 1228833755, 1231821120, 1234807662,
+ 1237793355, 1240778176, 1243762101, 1246745104, 1249727162, 1252708250,
+ 1255688343, 1258667418, 1261645450, 1264622414, 1267598286, 1270573041,
+ 1273546655, 1276519103, 1279490361, 1282460404, 1285429208, 1288396747,
+ 1291362998, 1294327936, 1297291536, 1300253773, 1303214624, 1306174062,
+ 1309132064, 1312088605, 1315043660, 1317997205, 1320949214, 1323899663,
+ 1326848528, 1329795783, 1332741404, 1335685366, 1338627645, 1341568215,
+ 1344507051, 1347444130, 1350379426, 1353312914, 1356244570, 1359174369,
+ 1362102286, 1365028296, 1367952374, 1370874496, 1373794637, 1376712771,
+ 1379628875, 1382542922, 1385454889, 1388364751, 1391272482, 1394178058,
+ 1397081453, 1399982644, 1402881606, 1405778312, 1408672739, 1411564862,
+ 1414454656, 1417342095, 1420227156, 1423109813, 1425990041, 1428867816,
+ 1431743112, 1434615906, 1437486171, 1440353883, 1443219018, 1446081551,
+ 1448941456, 1451798708, 1454653284, 1457505158, 1460354306, 1463200702,
+ 1466044321, 1468885140, 1471723133, 1474558275, 1477390542, 1480219909,
+ 1483046351, 1485869843, 1488690361, 1491507880, 1494322374, 1497133821,
+ 1499942194, 1502747469, 1505549621, 1508348626, 1511144459, 1513937095,
+ 1516726510, 1519512679, 1522295577, 1525075180, 1527851463, 1530624402,
+ 1533393972, 1536160149, 1538922907, 1541682223, 1544438072, 1547190429,
+ 1549939270, 1552684570, 1555426306, 1558164452, 1560898984, 1563629877,
+ 1566357108, 1569080652, 1571800485, 1574516582, 1577228919, 1579937471,
+ 1582642215, 1585343126, 1588040180, 1590733352, 1593422619, 1596107956,
+ 1598789339, 1601466744, 1604140146, 1606809523, 1609474849, 1612136101,
+ 1614793254, 1617446285, 1620095169, 1622739883, 1625380402, 1628016704,
+ 1630648763, 1633276556, 1635900059, 1638519248, 1641134100, 1643744591,
+ 1646350697, 1648952394, 1651549658, 1654142467, 1656730796, 1659314621,
+ 1661893920, 1664468669, 1667038843, 1669604420, 1672165376, 1674721688,
+ 1677273332, 1679820285, 1682362524, 1684900025, 1687432765, 1689960721,
+ 1692483869, 1695002186, 1697515650, 1700024237, 1702527924, 1705026688,
+ 1707520506, 1710009354, 1712493211, 1714972053, 1717445857, 1719914600,
+ 1722378260, 1724836813, 1727290238, 1729738511, 1732181610, 1734619511,
+ 1737052193, 1739479633, 1741901809, 1744318697, 1746730275, 1749136522,
+ 1751537414, 1753932930, 1756323047, 1758707742, 1761086994, 1763460781,
+ 1765829080, 1768191869, 1770549126, 1772900830, 1775246958, 1777587488,
+ 1779922398, 1782251667, 1784575273, 1786893194, 1789205409, 1791511895,
+ 1793812631, 1796107596, 1798396768, 1800680125, 1802957646, 1805229311,
+ 1807495096, 1809754982, 1812008946, 1814256968, 1816499026, 1818735100,
+ 1820965168, 1823189210, 1825407204, 1827619129, 1829824964, 1832024690,
+ 1834218284, 1836405726, 1838586996, 1840762073, 1842930937, 1845093566,
+ 1847249940, 1849400040, 1851543844, 1853681332, 1855812485, 1857937281,
+ 1860055701, 1862167724, 1864273331, 1866372501, 1868465215, 1870551452,
+ 1872631194, 1874704419, 1876771108, 1878831243, 1880884802, 1882931767,
+ 1884972117, 1887005834, 1889032899, 1891053291, 1893066991, 1895073981,
+ 1897074241, 1899067752, 1901054494, 1903034450, 1905007600, 1906973925,
+ 1908933406, 1910886025, 1912831762, 1914770600, 1916702519, 1918627502,
+ 1920545529, 1922456583, 1924360644, 1926257695, 1928147718, 1930030694,
+ 1931906605, 1933775433, 1935637160, 1937491769, 1939339241, 1941179559,
+ 1943012705, 1944838661, 1946657410, 1948468934, 1950273215, 1952070238,
+ 1953859983, 1955642434, 1957417573, 1959185384, 1960945850, 1962698952,
+ 1964444675, 1966183002, 1967913915, 1969637399, 1971353435, 1973062009,
+ 1974763103, 1976456700, 1978142785, 1979821341, 1981492351, 1983155800,
+ 1984811672, 1986459950, 1988100618, 1989733661, 1991359063, 1992976807,
+ 1994586878, 1996189261, 1997783940, 1999370900, 2000950124, 2002521598,
+ 2004085307, 2005641235, 2007189366, 2008729687, 2010262182, 2011786836,
+ 2013303634, 2014812562, 2016313604, 2017806746, 2019291974, 2020769273,
+ 2022238629, 2023700027, 2025153454, 2026598894, 2028036334, 2029465759,
+ 2030887157, 2032300512, 2033705812, 2035103042, 2036492189, 2037873238,
+ 2039246178, 2040610993, 2041967672, 2043316200, 2044656565, 2045988752,
+ 2047312750, 2048628546, 2049936125, 2051235476, 2052526587, 2053809443,
+ 2055084032, 2056350343, 2057608363, 2058858079, 2060099479, 2061332551,
+ 2062557282, 2063773662, 2064981677, 2066181316, 2067372568, 2068555420,
+ 2069729861, 2070895879, 2072053463, 2073202601, 2074343283, 2075475496,
+ 2076599231, 2077714475, 2078821218, 2079919449, 2081009157, 2082090331,
+ 2083162962, 2084227037, 2085282547, 2086329481, 2087367829, 2088397581,
+ 2089418727, 2090431256, 2091435159, 2092430425, 2093417045, 2094395009,
+ 2095364308, 2096324932, 2097276871, 2098220116, 2099154657, 2100080487,
+ 2100997594, 2101905971, 2102805608, 2103696497, 2104578628, 2105451993,
+ 2106316584, 2107172391, 2108019406, 2108857622, 2109687029, 2110507619,
+ 2111319385, 2112122318, 2112916410, 2113701654, 2114478042, 2115245566,
+ 2116004218, 2116753991, 2117494877, 2118226870, 2118949962, 2119664145,
+ 2120369413, 2121065759, 2121753176, 2122431657, 2123101195, 2123761783,
+ 2124413416, 2125056087, 2125689789, 2126314515, 2126930261, 2127537019,
+ 2128134784, 2128723550, 2129303311, 2129874061, 2130435794, 2130988506,
+ 2131532190, 2132066841, 2132592453, 2133109023, 2133616544, 2134115011,
+ 2134604419, 2135084765, 2135556042, 2136018246, 2136471373, 2136915418,
+ 2137350376, 2137776244, 2138193017, 2138600691, 2138999262, 2139388726,
+ 2139769079, 2140140317, 2140502437, 2140855436, 2141199308, 2141534052,
+ 2141859663, 2142176139, 2142483477, 2142781673, 2143070724, 2143350628,
+ 2143621381, 2143882982, 2144135427, 2144378714, 2144612841, 2144837804,
+ 2145053603, 2145260235, 2145457697, 2145645988, 2145825106, 2145995050,
+ 2146155816, 2146307405, 2146449814, 2146583042, 2146707087, 2146821949,
+ 2146927626, 2147024118, 2147111422, 2147189539, 2147258468, 2147318207,
+ 2147368757, 2147410117, 2147442286, 2147465264, 2147479051, 2147483647,
+ 2147479051, 2147465264, 2147442286, 2147410117, 2147368757, 2147318207,
+ 2147258468, 2147189539, 2147111422, 2147024118, 2146927626, 2146821949,
+ 2146707087, 2146583042, 2146449814, 2146307405, 2146155816, 2145995050,
+ 2145825106, 2145645988, 2145457697, 2145260235, 2145053603, 2144837804,
+ 2144612841, 2144378714, 2144135427, 2143882982, 2143621381, 2143350628,
+ 2143070724, 2142781673, 2142483477, 2142176139, 2141859663, 2141534052,
+ 2141199308, 2140855436, 2140502437, 2140140317, 2139769079, 2139388726,
+ 2138999262, 2138600691, 2138193017, 2137776244, 2137350376, 2136915418,
+ 2136471373, 2136018246, 2135556042, 2135084765, 2134604419, 2134115011,
+ 2133616544, 2133109023, 2132592453, 2132066841, 2131532190, 2130988506,
+ 2130435794, 2129874061, 2129303311, 2128723550, 2128134784, 2127537019,
+ 2126930261, 2126314515, 2125689789, 2125056087, 2124413416, 2123761783,
+ 2123101195, 2122431657, 2121753176, 2121065759, 2120369413, 2119664145,
+ 2118949962, 2118226870, 2117494877, 2116753991, 2116004218, 2115245566,
+ 2114478042, 2113701654, 2112916410, 2112122318, 2111319385, 2110507619,
+ 2109687029, 2108857622, 2108019406, 2107172391, 2106316584, 2105451993,
+ 2104578628, 2103696497, 2102805608, 2101905971, 2100997594, 2100080487,
+ 2099154657, 2098220116, 2097276871, 2096324932, 2095364308, 2094395009,
+ 2093417045, 2092430425, 2091435159, 2090431256, 2089418727, 2088397581,
+ 2087367829, 2086329481, 2085282547, 2084227037, 2083162962, 2082090331,
+ 2081009157, 2079919449, 2078821218, 2077714475, 2076599231, 2075475496,
+ 2074343283, 2073202601, 2072053463, 2070895879, 2069729861, 2068555420,
+ 2067372568, 2066181316, 2064981677, 2063773662, 2062557282, 2061332551,
+ 2060099479, 2058858079, 2057608363, 2056350343, 2055084032, 2053809443,
+ 2052526587, 2051235476, 2049936125, 2048628546, 2047312750, 2045988752,
+ 2044656565, 2043316200, 2041967672, 2040610993, 2039246178, 2037873238,
+ 2036492189, 2035103042, 2033705812, 2032300512, 2030887157, 2029465759,
+ 2028036334, 2026598894, 2025153454, 2023700027, 2022238629, 2020769273,
+ 2019291974, 2017806746, 2016313604, 2014812562, 2013303634, 2011786836,
+ 2010262182, 2008729687, 2007189366, 2005641235, 2004085307, 2002521598,
+ 2000950124, 1999370900, 1997783940, 1996189261, 1994586878, 1992976807,
+ 1991359063, 1989733661, 1988100618, 1986459950, 1984811672, 1983155800,
+ 1981492351, 1979821341, 1978142785, 1976456700, 1974763103, 1973062009,
+ 1971353435, 1969637399, 1967913915, 1966183002, 1964444675, 1962698952,
+ 1960945850, 1959185384, 1957417573, 1955642434, 1953859983, 1952070238,
+ 1950273215, 1948468934, 1946657410, 1944838661, 1943012705, 1941179559,
+ 1939339241, 1937491769, 1935637160, 1933775433, 1931906605, 1930030694,
+ 1928147718, 1926257695, 1924360644, 1922456583, 1920545529, 1918627502,
+ 1916702519, 1914770600, 1912831762, 1910886025, 1908933406, 1906973925,
+ 1905007600, 1903034450, 1901054494, 1899067752, 1897074241, 1895073981,
+ 1893066991, 1891053291, 1889032899, 1887005834, 1884972117, 1882931767,
+ 1880884802, 1878831243, 1876771108, 1874704419, 1872631194, 1870551452,
+ 1868465215, 1866372501, 1864273331, 1862167724, 1860055701, 1857937281,
+ 1855812485, 1853681332, 1851543844, 1849400040, 1847249940, 1845093566,
+ 1842930937, 1840762073, 1838586996, 1836405726, 1834218284, 1832024690,
+ 1829824964, 1827619129, 1825407204, 1823189210, 1820965168, 1818735100,
+ 1816499026, 1814256968, 1812008946, 1809754982, 1807495096, 1805229311,
+ 1802957646, 1800680125, 1798396768, 1796107596, 1793812631, 1791511895,
+ 1789205409, 1786893194, 1784575273, 1782251667, 1779922398, 1777587488,
+ 1775246958, 1772900830, 1770549126, 1768191869, 1765829080, 1763460781,
+ 1761086994, 1758707742, 1756323047, 1753932930, 1751537414, 1749136522,
+ 1746730275, 1744318697, 1741901809, 1739479633, 1737052193, 1734619511,
+ 1732181610, 1729738511, 1727290238, 1724836813, 1722378260, 1719914600,
+ 1717445857, 1714972053, 1712493211, 1710009354, 1707520506, 1705026688,
+ 1702527924, 1700024237, 1697515650, 1695002186, 1692483869, 1689960721,
+ 1687432765, 1684900025, 1682362524, 1679820285, 1677273332, 1674721688,
+ 1672165376, 1669604420, 1667038843, 1664468669, 1661893920, 1659314621,
+ 1656730796, 1654142467, 1651549658, 1648952394, 1646350697, 1643744591,
+ 1641134100, 1638519248, 1635900059, 1633276556, 1630648763, 1628016704,
+ 1625380402, 1622739883, 1620095169, 1617446285, 1614793254, 1612136101,
+ 1609474849, 1606809523, 1604140146, 1601466744, 1598789339, 1596107956,
+ 1593422619, 1590733352, 1588040180, 1585343126, 1582642215, 1579937471,
+ 1577228919, 1574516582, 1571800485, 1569080652, 1566357108, 1563629877,
+ 1560898984, 1558164452, 1555426306, 1552684570, 1549939270, 1547190429,
+ 1544438072, 1541682223, 1538922907, 1536160149, 1533393972, 1530624402,
+ 1527851463, 1525075180, 1522295577, 1519512679, 1516726510, 1513937095,
+ 1511144459, 1508348626, 1505549621, 1502747469, 1499942194, 1497133821,
+ 1494322374, 1491507880, 1488690361, 1485869843, 1483046351, 1480219909,
+ 1477390542, 1474558275, 1471723133, 1468885140, 1466044321, 1463200702,
+ 1460354306, 1457505158, 1454653284, 1451798708, 1448941456, 1446081551,
+ 1443219018, 1440353883, 1437486171, 1434615906, 1431743112, 1428867816,
+ 1425990041, 1423109813, 1420227156, 1417342095, 1414454656, 1411564862,
+ 1408672739, 1405778312, 1402881606, 1399982644, 1397081453, 1394178058,
+ 1391272482, 1388364751, 1385454889, 1382542922, 1379628875, 1376712771,
+ 1373794637, 1370874496, 1367952374, 1365028296, 1362102286, 1359174369,
+ 1356244570, 1353312914, 1350379426, 1347444130, 1344507051, 1341568215,
+ 1338627645, 1335685366, 1332741404, 1329795783, 1326848528, 1323899663,
+ 1320949214, 1317997205, 1315043660, 1312088605, 1309132064, 1306174062,
+ 1303214624, 1300253773, 1297291536, 1294327936, 1291362998, 1288396747,
+ 1285429208, 1282460404, 1279490361, 1276519103, 1273546655, 1270573041,
+ 1267598286, 1264622414, 1261645450, 1258667418, 1255688343, 1252708250,
+ 1249727162, 1246745104, 1243762101, 1240778176, 1237793355, 1234807662,
+ 1231821120, 1228833755, 1225845591, 1222856652, 1219866962, 1216876545,
+ 1213885426, 1210893629, 1207901179, 1204908098, 1201914412, 1198920145,
+ 1195925320, 1192929963, 1189934096, 1186937744, 1183940932, 1180943682,
+ 1177946019, 1174947968, 1171949551, 1168950793, 1165951718, 1162952349,
+ 1159952711, 1156952828, 1153952722, 1150952419, 1147951940, 1144951312,
+ 1141950556, 1138949697, 1135948759, 1132947764, 1129946738, 1126945702,
+ 1123944681, 1120943698, 1117942777, 1114941942, 1111941215, 1108940619,
+ 1105940180, 1102939919, 1099939860, 1096940026, 1093940441, 1090941128,
+ 1087942110, 1084943410, 1081945052, 1078947057, 1075949451, 1072952255,
+ 1069955492, 1066959186, 1063963359, 1060968035, 1057973236, 1054978985,
+ 1051985306, 1048992219, 1045999750, 1043007919, 1040016750, 1037026266,
+ 1034036489, 1031047441, 1028059146, 1025071625, 1022084902, 1019098998,
+ 1016113936, 1013129738, 1010146427, 1007164025, 1004182555, 1001202037,
+ 998222495, 995243951, 992266427, 989289944, 986314526, 983340193,
+ 980366968, 977394872, 974423928, 971454158, 968485582, 965518224,
+ 962552104, 959587244, 956623666, 953661392, 950700442, 947740839,
+ 944782604, 941825758, 938870323, 935916320, 932963770, 930012694,
+ 927063115, 924115052, 921168527, 918223561, 915280175, 912338390,
+ 909398227, 906459707, 903522851, 900587679, 897654212, 894722471,
+ 891792477, 888864250, 885937811, 883013180, 880090378, 877169425,
+ 874250341, 871333148, 868417864, 865504511, 862593109, 859683677,
+ 856776236, 853870806, 850967407, 848066059, 845166782, 842269595,
+ 839374518, 836481572, 833590775, 830702148, 827815710, 824931480,
+ 822049479, 819169725, 816292238, 813417038, 810544143, 807673573,
+ 804805347, 801939484, 799076003, 796214924, 793356265, 790500045,
+ 787646284, 784794999, 781946210, 779099935, 776256194, 773415004,
+ 770576384, 767740353, 764906930, 762076132, 759247977, 756422486,
+ 753599674, 750779561, 747962165, 745147504, 742335596, 739526459,
+ 736720110, 733916567, 731115850, 728317974, 725522958, 722730819,
+ 719941575, 717155244, 714371842, 711591388, 708813898, 706039390,
+ 703267882, 700499390, 697733931, 694971522, 692212181, 689455924,
+ 686702768, 683952731, 681205828, 678462077, 675721494, 672984095,
+ 670249898, 667518918, 664791173, 662066678, 659345449, 656627504,
+ 653912857, 651201526, 648493526, 645788873, 643087583, 640389672,
+ 637695156, 635004051, 632316371, 629632134, 626951354, 624274046,
+ 621600227, 618929912, 616263116, 613599853, 610940141, 608283992,
+ 605631423, 602982449, 600337084, 597695344, 595057243, 592422796,
+ 589792017, 587164922, 584541524, 581921839, 579305881, 576693663,
+ 574085201, 571480509, 568879600, 566282490, 563689191, 561099718,
+ 558514086, 555932307, 553354395, 550780365, 548210230, 545644003,
+ 543081699, 540523330, 537968910, 535418453, 532871971, 530329478,
+ 527790987, 525256511, 522726063, 520199656, 517677303, 515159016,
+ 512644810, 510134695, 507628686, 505126793, 502629031, 500135411,
+ 497645945, 495160647, 492679528, 490202600, 487729876, 485261367,
+ 482797086, 480337044, 477881254, 475429726, 472982473, 470539507,
+ 468100838, 465666479, 463236441, 460810735, 458389373, 455972365,
+ 453559723, 451151459, 448747582, 446348105, 443953037, 441562390,
+ 439176175, 436794402, 434417083, 432044226, 429675844, 427311946,
+ 424952542, 422597644, 420247261, 417901404, 415560082, 413223306,
+ 410891085, 408563430, 406240350, 403921855, 401607955, 399298659,
+ 396993977, 394693919, 392398493, 390107710, 387821578, 385540107,
+ 383263305, 380991183, 378723748, 376461011, 374202979, 371949661,
+ 369701067, 367457205, 365218084, 362983712, 360754097, 358529248,
+ 356309174, 354093883, 351883382, 349677680, 347476785, 345280705,
+ 343089448, 340903022, 338721435, 336544694, 334372807, 332205781,
+ 330043625, 327886345, 325733949, 323586445, 321443839, 319306138,
+ 317173351, 315045483, 312922542, 310804535, 308691469, 306583350,
+ 304480185, 302381981, 300288744, 298200481, 296117199, 294038902,
+ 291965599, 289897295, 287833997, 285775710, 283722440, 281674194,
+ 279630977, 277592796, 275559655, 273531561, 271508519, 269490536,
+ 267477615, 265469763, 263466986, 261469288, 259476675, 257489151,
+ 255506722, 253529394, 251557170, 249590056, 247628057, 245671177,
+ 243719422, 241772795, 239831301, 237894945, 235963732, 234037665,
+ 232116749, 230200988, 228290386, 226384948, 224484677, 222589578,
+ 220699654, 218814909, 216935347, 215060971, 213191786, 211327795,
+ 209469001, 207615407, 205767018, 203923836, 202085865, 200253108,
+ 198425568, 196603248, 194786151, 192974280, 191167637, 189366227,
+ 187570050, 185779111, 183993411, 182212953, 180437740, 178667774,
+ 176903057, 175143592, 173389381, 171640425, 169896728, 168158291,
+ 166425116, 164697204, 162974559, 161257181, 159545072, 157838234,
+ 156136668, 154440377, 152749360, 151063621, 149383159, 147707977,
+ 146038076, 144373456, 142714119, 141060066, 139411298, 137767815,
+ 136129619, 134496710, 132869088, 131246756, 129629712, 128017958,
+ 126411494, 124810321, 123214439, 121623847, 120038547, 118458539,
+ 116883822, 115314396, 113750263, 112191420, 110637869, 109089609,
+ 107546640, 106008961, 104476572, 102949474, 101427664, 99911142,
+ 98399909, 96893963, 95393303, 93897929, 92407840, 90923035, 89443512,
+ 87969272, 86500312, 85036632, 83578230, 82125106, 80677257, 79234682,
+ 77797380, 76365350, 74938590, 73517098, 72100872, 70689911, 69284214,
+ 67883777, 66488600, 65098680, 63714015, 62334604, 60960443, 59591532,
+ 58227867, 56869446, 55516268, 54168329, 52825627, 51488160, 50155925,
+ 48828919, 47507140, 46190585, 44879251, 43573135, 42272235, 40976547,
+ 39686069, 38400797, 37120729, 35845860, 34576189, 33311711, 32052423,
+ 30798323, 29549406, 28305668, 27067108, 25833720, 24605501, 23382448,
+ 22164556, 20951823, 19744244, 18541815, 17344532, 16152391, 14965389,
+ 13783521, 12606782, 11435170, 10268679, 9107305, 7951044, 6799891,
+ 5653843, 4512893, 3377039, 2246275, 1120597, 0, -1115521, -2225970,
+ -3331353, -4431675, -5526940, -6617153, -7702319, -8782443, -9857532,
+ -10927588, -11992619, -13052629, -14107623, -15157608, -16202587,
+ -17242567, -18277554, -19307552, -20332568, -21352606, -22367673,
+ -23377775, -24382917, -25383105, -26378345, -27368642, -28354004,
+ -29334435, -30309941, -31280530, -32246207, -33206977, -34162849,
+ -35113826, -36059917, -37001127, -37937462, -38868930, -39795536,
+ -40717287, -41634190, -42546251, -43453477, -44355874, -45253449,
+ -46146210, -47034162, -47917312, -48795669, -49669237, -50538025,
+ -51402039, -52261287, -53115775, -53965511, -54810501, -55650754,
+ -56486275, -57317073, -58143155, -58964527, -59781199, -60593176,
+ -61400466, -62203077, -63001017, -63794292, -64582911, -65366882,
+ -66146211, -66920907, -67690977, -68456429, -69217271, -69973511,
+ -70725156, -71472216, -72214696, -72952607, -73685955, -74414749,
+ -75138996, -75858706, -76573885, -77284543, -77990687, -78692326,
+ -79389469, -80082122, -80770296, -81453997, -82133236, -82808019,
+ -83478356, -84144255, -84805725, -85462774, -86115411, -86763645,
+ -87407483, -88046936, -88682011, -89312718, -89939065, -90561061,
+ -91178715, -91792036, -92401033, -93005714, -93606089, -94202167,
+ -94793956, -95381466, -95964706, -96543685, -97118412, -97688897,
+ -98255148, -98817175, -99374986, -99928593, -100478002, -101023225,
+ -101564269, -102101146, -102633863, -103162432, -103686860, -104207157,
+ -104723333, -105235398, -105743361, -106247232, -106747020, -107242735,
+ -107734386, -108221984, -108705537, -109185057, -109660551, -110132031,
+ -110599506, -111062985, -111522479, -111977998, -112429551, -112877148,
+ -113320800, -113760516, -114196305, -114628179, -115056147, -115480219,
+ -115900406, -116316716, -116729161, -117137751, -117542495, -117943403,
+ -118340487, -118733756, -119123220, -119508889, -119890775, -120268886,
+ -120643234, -121013828, -121380679, -121743798, -122103193, -122458877,
+ -122810860, -123159150, -123503761, -123844700, -124181980, -124515610,
+ -124845601, -125171963, -125494708, -125813845, -126129385, -126441338,
+ -126749716, -127054528, -127355785, -127653499, -127947679, -128238336,
+ -128525481, -128809125, -129089277, -129365950, -129639153, -129908897,
+ -130175193, -130438052, -130697485, -130953501, -131206113, -131455330,
+ -131701164, -131943626, -132182725, -132418474, -132650882, -132879961,
+ -133105722, -133328175, -133547331, -133763202, -133975798, -134185129,
+ -134391208, -134594044, -134793650, -134990034, -135183210, -135373187,
+ -135559977, -135743590, -135924037, -136101331, -136275480, -136446497,
+ -136614393, -136779178, -136940863, -137099461, -137254980, -137407433,
+ -137556831, -137703185, -137846505, -137986803, -138124090, -138258377,
+ -138389675, -138517995, -138643348, -138765745, -138885198, -139001717,
+ -139115313, -139225998, -139333783, -139438679, -139540696, -139639847,
+ -139736141, -139829591, -139920208, -140008001, -140092984, -140175166,
+ -140254559, -140331174, -140405022, -140476114, -140544461, -140610075,
+ -140672967, -140733147, -140790628, -140845419, -140897532, -140946979,
+ -140993770, -141037916, -141079429, -141118320, -141154599, -141188279,
+ -141219370, -141247883, -141273829, -141297220, -141318066, -141336379,
+ -141352170, -141365450, -141376229, -141384520, -141390333, -141393679,
+ -141394570, -141393015, -141389028, -141382618, -141373797, -141362575,
+ -141348965, -141332976, -141314620, -141293908, -141270851, -141245460,
+ -141217746, -141187721, -141155394, -141120778, -141083882, -141044719,
+ -141003299, -140959634, -140913733, -140865608, -140815271, -140762732,
+ -140708001, -140651091, -140592011, -140530774, -140467389, -140401868,
+ -140334221, -140264460, -140192595, -140118638, -140042598, -139964488,
+ -139884317, -139802098, -139717840, -139631554, -139543251, -139452943,
+ -139360639, -139266351, -139170090, -139071865, -138971689, -138869571,
+ -138765523, -138659555, -138551678, -138441902, -138330239, -138216698,
+ -138101292, -137984030, -137864922, -137743980, -137621215, -137496636,
+ -137370255, -137242082, -137112128, -136980402, -136846917, -136711682,
+ -136574707, -136436004, -136295583, -136153454, -136009628, -135864115,
+ -135716926, -135568071, -135417561, -135265405, -135111615, -134956201,
+ -134799172, -134640541, -134480316, -134318508, -134155127, -133990184,
+ -133823690, -133655653, -133486085, -133314995, -133142395, -132968293,
+ -132792701, -132615628, -132437085, -132257082, -132075628, -131892735,
+ -131708411, -131522667, -131335514, -131146961, -130957018, -130765695,
+ -130573002, -130378950, -130183547, -129986805, -129788732, -129589339,
+ -129388636, -129186633, -128983338, -128778764, -128572918, -128365810,
+ -128157452, -127947852, -127737019, -127524965, -127311698, -127097228,
+ -126881565, -126664718, -126446697, -126227512, -126007172, -125785687,
+ -125563066, -125339319, -125114455, -124888484, -124661415, -124433258,
+ -124204022, -123973717, -123742351, -123509935, -123276477, -123041988,
+ -122806475, -122569949, -122332418, -122093893, -121854382, -121613894,
+ -121372438, -121130025, -120886662, -120642359, -120397125, -120150969,
+ -119903900, -119655927, -119407060, -119157307, -118906676, -118655178,
+ -118402820, -118149613, -117895564, -117640682, -117384977, -117128457,
+ -116871131, -116613008, -116354096, -116094404, -115833940, -115572715,
+ -115310735, -115048010, -114784548, -114520359, -114255449, -113989829,
+ -113723506, -113456489, -113188786, -112920406, -112651358, -112381649,
+ -112111288, -111840283, -111568643, -111296375, -111023489, -110749992,
+ -110475893, -110201200, -109925920, -109650063, -109373636, -109096647,
+ -108819105, -108541017, -108262391, -107983236, -107703560, -107423370,
+ -107142674, -106861480, -106579796, -106297631, -106014991, -105731884,
+ -105448319, -105164303, -104879843, -104594949, -104309626, -104023883,
+ -103737727, -103451167, -103164209, -102876861, -102589131, -102301026,
+ -102012553, -101723721, -101434536, -101145006, -100855138, -100564940,
+ -100274419, -99983581, -99692436, -99400988, -99109247, -98817219,
+ -98524911, -98232330, -97939484, -97646380, -97353024, -97059423,
+ -96765585, -96471517, -96177226, -95882717, -95588000, -95293079,
+ -94997963, -94702657, -94407169, -94111506, -93815673, -93519679,
+ -93223529, -92927231, -92630790, -92334214, -92037509, -91740681,
+ -91443738, -91146685, -90849530, -90552278, -90254936, -89957510,
+ -89660007, -89362433, -89064795, -88767098, -88469349, -88171554,
+ -87873720, -87575852, -87277957, -86980041, -86682109, -86384169,
+ -86086225, -85788285, -85490354, -85192437, -84894542, -84596673,
+ -84298837, -84001040, -83703287, -83405584, -83107937, -82810352,
+ -82512834, -82215389, -81918024, -81620742, -81323551, -81026455,
+ -80729460, -80432572, -80135797, -79839139, -79542604, -79246197,
+ -78949925, -78653792, -78357803, -78061964, -77766281, -77470758,
+ -77175401, -76880215, -76585205, -76290376, -75995733, -75701282,
+ -75407028, -75112975, -74819129, -74525494, -74232076, -73938880,
+ -73645909, -73353171, -73060668, -72768406, -72476390, -72184624,
+ -71893114, -71601864, -71310878, -71020162, -70729720, -70439556,
+ -70149675, -69860083, -69570782, -69281779, -68993076, -68704680,
+ -68416593, -68128821, -67841368, -67554238, -67267436, -66980965,
+ -66694831, -66409037, -66123588, -65838487, -65553739, -65269349,
+ -64985319, -64701655, -64418360, -64135438, -63852894, -63570731,
+ -63288953, -63007564, -62726569, -62445970, -62165772, -61885979,
+ -61606594, -61327621, -61049064, -60770926, -60493212, -60215925,
+ -59939068, -59662646, -59386661, -59111118, -58836019, -58561369,
+ -58287171, -58013428, -57740143, -57467321, -57194964, -56923077,
+ -56651661, -56380720, -56110259, -55840279, -55570785, -55301779,
+ -55033265, -54765245, -54497724, -54230703, -53964186, -53698176,
+ -53432677, -53167690, -52903220, -52639268, -52375839, -52112934,
+ -51850557, -51588711, -51327398, -51066621, -50806383, -50546687,
+ -50287535, -50028931, -49770876, -49513373, -49256426, -49000036,
+ -48744207, -48488940, -48234239, -47980105, -47726542, -47473552,
+ -47221137, -46969299, -46718042, -46467367, -46217276, -45967773,
+ -45718859, -45470536, -45222807, -44975675, -44729140, -44483206,
+ -44237875, -43993148, -43749028, -43505516, -43262616, -43020329,
+ -42778656, -42537601, -42297164, -42057349, -41818156, -41579587,
+ -41341645, -41104332, -40867649, -40631598, -40396180, -40161398,
+ -39927254, -39693748, -39460883, -39228661, -38997082, -38766149,
+ -38535863, -38306227, -38077240, -37848905, -37621224, -37394198,
+ -37167828, -36942116, -36717063, -36492671, -36268941, -36045874,
+ -35823472, -35601737, -35380668, -35160268, -34940539, -34721480,
+ -34503094, -34285381, -34068343, -33851981, -33636296, -33421289,
+ -33206961, -32993313, -32780347, -32568064, -32356463, -32145547,
+ -31935317, -31725772, -31516915, -31308746, -31101266, -30894476,
+ -30688377, -30482969, -30278253, -30074231, -29870903, -29668269,
+ -29466331, -29265089, -29064543, -28864695, -28665546, -28467095,
+ -28269343, -28072291, -27875940, -27680290, -27485342, -27291096,
+ -27097553, -26904712, -26712576, -26521143, -26330415, -26140392,
+ -25951074, -25762462, -25574556, -25387356, -25200863, -25015077,
+ -24829998, -24645627, -24461964, -24279008, -24096761, -23915223,
+ -23734392, -23554271, -23374859, -23196155, -23018161, -22840876,
+ -22664301, -22488435, -22313278, -22138831, -21965093, -21792065,
+ -21619746, -21448136, -21277236, -21107045, -20937563, -20768791,
+ -20600727, -20433372, -20266726, -20100788, -19935559, -19771038,
+ -19607224, -19444119, -19281720, -19120029, -18959045, -18798767,
+ -18639196, -18480330, -18322170, -18164716, -18007966, -17851921,
+ -17696580, -17541942, -17388008, -17234777, -17082248, -16930421,
+ -16779295, -16628871, -16479146, -16330122, -16181797, -16034170,
+ -15887242, -15741012, -15595478, -15450641, -15306500, -15163054,
+ -15020302, -14878245, -14736880, -14596208, -14456228, -14316938,
+ -14178339, -14040430, -13903209, -13766677, -13630832, -13495673,
+ -13361200, -13227412, -13094307, -12961887, -12830148, -12699091,
+ -12568714, -12439017, -12309999, -12181659, -12053996, -11927008,
+ -11800696, -11675058, -11550093, -11425800, -11302178, -11179227,
+ -11056944, -10935330, -10814383, -10694101, -10574485, -10455532,
+ -10337243, -10219615, -10102647, -9986339, -9870689, -9755697,
+ -9641360, -9527679, -9414651, -9302276, -9190552, -9079478, -8969053,
+ -8859276, -8750146, -8641661, -8533819, -8426621, -8320064, -8214147,
+ -8108870, -8004230, -7900226, -7796857, -7694123, -7592020, -7490549,
+ -7389707, -7289494, -7189908, -7090947, -6992611, -6894897, -6797805,
+ -6701333, -6605480, -6510244, -6415623, -6321617, -6228224, -6135443,
+ -6043271, -5951708, -5860752, -5770402, -5680656, -5591512, -5502970,
+ -5415027, -5327682, -5240933, -5154780, -5069220, -4984252, -4899874,
+ -4816085, -4732883, -4650267, -4568235, -4486785, -4405917, -4325627,
+ -4245915, -4166780, -4088218, -4010230, -3932813, -3855965, -3779685,
+ -3703971, -3628822, -3554236, -3480211, -3406746, -3333839, -3261488,
+ -3189691, -3118448, -3047755, -2977612, -2908017, -2838968, -2770463,
+ -2702500, -2635079, -2568196, -2501851, -2436042, -2370767, -2306023,
+ -2241810, -2178126, -2114969, -2052336, -1990227, -1928640, -1867572,
+ -1807023, -1746989, -1687470, -1628464, -1569968, -1511982, -1454502,
+ -1397528, -1341058, -1285089, -1229621, -1174650, -1120176, -1066196,
+ -1012709, -959713, -907205, -855185, -803650, -752598, -702028,
+ -651938, -602325, -553189, -504526, -456336, -408617, -361366, -314581,
+ -268261, -222405, -177009, -132073, -87593, -43570, 0
+};
+
+const int32_t filter_data_M[8193] = {
+ 0, -5008, -10058, -15150, -20285, -25462, -30682, -35945, -41250,
+ -46598, -51990, -57425, -62903, -68425, -73990, -79599, -85252, -90949,
+ -96690, -102475, -108304, -114178, -120097, -126060, -132068, -138121,
+ -144219, -150362, -156550, -162784, -169063, -175387, -181758, -188174,
+ -194636, -201145, -207699, -214300, -220947, -227641, -234381, -241168,
+ -248001, -254882, -261810, -268785, -275807, -282876, -289993, -297157,
+ -304369, -311629, -318937, -326293, -333697, -341149, -348649, -356197,
+ -363794, -371440, -379134, -386877, -394669, -402510, -410400, -418339,
+ -426328, -434365, -442452, -450589, -458775, -467011, -475297, -483632,
+ -492018, -500453, -508939, -517475, -526061, -534698, -543385, -552122,
+ -560911, -569750, -578639, -587580, -596572, -605615, -614708, -623853,
+ -633050, -642297, -651597, -660947, -670349, -679803, -689309, -698866,
+ -708475, -718136, -727849, -737615, -747432, -757301, -767223, -777197,
+ -787224, -797303, -807434, -817618, -827855, -838144, -848486, -858881,
+ -869329, -879830, -890384, -900990, -911650, -922363, -933129, -943949,
+ -954822, -965748, -976727, -987760, -998846, -1009986, -1021179,
+ -1032426, -1043727, -1055082, -1066490, -1077952, -1089467, -1101037,
+ -1112660, -1124337, -1136069, -1147854, -1159693, -1171587, -1183534,
+ -1195535, -1207591, -1219701, -1231865, -1244083, -1256355, -1268682,
+ -1281063, -1293498, -1305988, -1318532, -1331130, -1343783, -1356490,
+ -1369251, -1382067, -1394937, -1407862, -1420841, -1433874, -1446962,
+ -1460105, -1473302, -1486553, -1499859, -1513219, -1526634, -1540103,
+ -1553627, -1567205, -1580838, -1594525, -1608267, -1622063, -1635913,
+ -1649818, -1663778, -1677791, -1691859, -1705982, -1720159, -1734390,
+ -1748676, -1763015, -1777410, -1791858, -1806361, -1820917, -1835528,
+ -1850194, -1864913, -1879686, -1894514, -1909395, -1924331, -1939320,
+ -1954364, -1969461, -1984612, -1999817, -2015076, -2030388, -2045755,
+ -2061174, -2076648, -2092175, -2107755, -2123389, -2139076, -2154817,
+ -2170611, -2186458, -2202358, -2218312, -2234318, -2250378, -2266490,
+ -2282656, -2298874, -2315144, -2331468, -2347844, -2364273, -2380754,
+ -2397287, -2413873, -2430511, -2447201, -2463943, -2480737, -2497583,
+ -2514481, -2531431, -2548432, -2565485, -2582589, -2599745, -2616951,
+ -2634210, -2651519, -2668879, -2686290, -2703752, -2721265, -2738828,
+ -2756441, -2774105, -2791820, -2809584, -2827399, -2845263, -2863178,
+ -2881142, -2899155, -2917218, -2935331, -2953492, -2971703, -2989963,
+ -3008272, -3026629, -3045035, -3063490, -3081993, -3100544, -3119143,
+ -3137790, -3156485, -3175227, -3194017, -3212855, -3231739, -3250671,
+ -3269650, -3288675, -3307747, -3326866, -3346031, -3365242, -3384499,
+ -3403802, -3423151, -3442545, -3461985, -3481469, -3500999, -3520574,
+ -3540193, -3559857, -3579565, -3599318, -3619114, -3638955, -3658838,
+ -3678766, -3698736, -3718750, -3738807, -3758906, -3779048, -3799232,
+ -3819458, -3839727, -3860037, -3880388, -3900781, -3921215, -3941690,
+ -3962206, -3982762, -4003359, -4023995, -4044672, -4065388, -4086144,
+ -4106939, -4127772, -4148645, -4169557, -4190506, -4211494, -4232520,
+ -4253583, -4274684, -4295822, -4316997, -4338209, -4359457, -4380741,
+ -4402062, -4423418, -4444810, -4466237, -4487699, -4509196, -4530728,
+ -4552293, -4573893, -4595526, -4617193, -4638894, -4660627, -4682393,
+ -4704191, -4726021, -4747884, -4769778, -4791703, -4813660, -4835647,
+ -4857665, -4879713, -4901791, -4923898, -4946036, -4968202, -4990397,
+ -5012620, -5034872, -5057152, -5079459, -5101793, -5124155, -5146544,
+ -5168958, -5191399, -5213866, -5236358, -5258876, -5281418, -5303985,
+ -5326576, -5349191, -5371830, -5394492, -5417177, -5439884, -5462614,
+ -5485366, -5508139, -5530934, -5553750, -5576586, -5599443, -5622320,
+ -5645216, -5668131, -5691066, -5714019, -5736990, -5759979, -5782986,
+ -5806010, -5829050, -5852108, -5875181, -5898270, -5921374, -5944493,
+ -5967627, -5990775, -6013937, -6037113, -6060301, -6083503, -6106717,
+ -6129942, -6153180, -6176428, -6199688, -6222958, -6246238, -6269528,
+ -6292827, -6316134, -6339451, -6362775, -6386107, -6409447, -6432793,
+ -6456146, -6479504, -6502869, -6526239, -6549613, -6572992, -6596375,
+ -6619762, -6643151, -6666544, -6689938, -6713335, -6736733, -6760132,
+ -6783532, -6806931, -6830331, -6853730, -6877127, -6900523, -6923917,
+ -6947309, -6970697, -6994083, -7017464, -7040841, -7064213, -7087580,
+ -7110942, -7134297, -7157646, -7180988, -7204322, -7227648, -7250966,
+ -7274275, -7297575, -7320865, -7344144, -7367413, -7390670, -7413916,
+ -7437149, -7460370, -7483577, -7506771, -7529951, -7553115, -7576265,
+ -7599399, -7622517, -7645618, -7668702, -7691769, -7714817, -7737847,
+ -7760857, -7783848, -7806818, -7829768, -7852697, -7875604, -7898488,
+ -7921350, -7944189, -7967004, -7989794, -8012560, -8035300, -8058014,
+ -8080702, -8103363, -8125996, -8148602, -8171178, -8193726, -8216244,
+ -8238732, -8261189, -8283614, -8306008, -8328370, -8350698, -8372993,
+ -8395254, -8417481, -8439672, -8461827, -8483947, -8506029, -8528074,
+ -8550081, -8572050, -8593979, -8615869, -8637718, -8659527, -8681294,
+ -8703020, -8724702, -8746342, -8767938, -8789490, -8810996, -8832458,
+ -8853873, -8875242, -8896563, -8917837, -8939062, -8960238, -8981365,
+ -9002441, -9023467, -9044441, -9065363, -9086233, -9107050, -9127812,
+ -9148520, -9169174, -9189771, -9210312, -9230797, -9251224, -9271593,
+ -9291903, -9312154, -9332344, -9352475, -9372544, -9392551, -9412496,
+ -9432378, -9452196, -9471949, -9491638, -9511261, -9530818, -9550308,
+ -9569730, -9589084, -9608370, -9627586, -9646732, -9665807, -9684811,
+ -9703743, -9722602, -9741388, -9760100, -9778737, -9797299, -9815785,
+ -9834195, -9852527, -9870782, -9888957, -9907054, -9925071, -9943007,
+ -9960862, -9978635, -9996326, -10013933, -10031457, -10048896,
+ -10066250, -10083518, -10100699, -10117793, -10134799, -10151717,
+ -10168545, -10185284, -10201931, -10218488, -10234952, -10251324,
+ -10267603, -10283787, -10299877, -10315871, -10331769, -10347571,
+ -10363275, -10378880, -10394387, -10409794, -10425102, -10440308,
+ -10455412, -10470414, -10485313, -10500109, -10514799, -10529385,
+ -10543865, -10558238, -10572504, -10586662, -10600712, -10614652,
+ -10628482, -10642201, -10655809, -10669304, -10682687, -10695956,
+ -10709110, -10722150, -10735074, -10747881, -10760571, -10773143,
+ -10785597, -10797931, -10810145, -10822238, -10834210, -10846060,
+ -10857786, -10869389, -10880868, -10892221, -10903449, -10914550,
+ -10925524, -10936370, -10947087, -10957674, -10968131, -10978458,
+ -10988653, -10998715, -11008644, -11018440, -11028100, -11037626,
+ -11047015, -11056268, -11065383, -11074360, -11083198, -11091897,
+ -11100455, -11108871, -11117146, -11125278, -11133267, -11141112,
+ -11148811, -11156366, -11163774, -11171034, -11178147, -11185112,
+ -11191927, -11198592, -11205107, -11211469, -11217680, -11223738,
+ -11229642, -11235391, -11240985, -11246424, -11251705, -11256830,
+ -11261796, -11266603, -11271250, -11275738, -11280064, -11284228,
+ -11288229, -11292067, -11295741, -11299250, -11302594, -11305771,
+ -11308781, -11311624, -11314298, -11316802, -11319136, -11321300,
+ -11323292, -11325112, -11326759, -11328232, -11329531, -11330654,
+ -11331601, -11332372, -11332965, -11333380, -11333616, -11333673,
+ -11333549, -11333243, -11332756, -11332087, -11331233, -11330196,
+ -11328974, -11327566, -11325972, -11324191, -11322222, -11320064,
+ -11317717, -11315181, -11312453, -11309534, -11306422, -11303118,
+ -11299620, -11295928, -11292040, -11287956, -11283676, -11279199,
+ -11274523, -11269648, -11264574, -11259300, -11253825, -11248148,
+ -11242268, -11236185, -11229898, -11223407, -11216710, -11209808,
+ -11202698, -11195381, -11187855, -11180121, -11172176, -11164022,
+ -11155656, -11147078, -11138288, -11129284, -11120067, -11110634,
+ -11100987, -11091123, -11081042, -11070743, -11060227, -11049491,
+ -11038536, -11027360, -11015963, -11004344, -10992502, -10980438,
+ -10968149, -10955636, -10942897, -10929933, -10916742, -10903323,
+ -10889676, -10875800, -10861695, -10847359, -10832793, -10817995,
+ -10802964, -10787701, -10772204, -10756473, -10740507, -10724305,
+ -10707866, -10691191, -10674278, -10657126, -10639735, -10622105,
+ -10604234, -10586122, -10567768, -10549172, -10530332, -10511249,
+ -10491921, -10472349, -10452530, -10432465, -10412153, -10391593,
+ -10370785, -10349728, -10328421, -10306864, -10285055, -10262996,
+ -10240683, -10218118, -10195300, -10172227, -10148899, -10125316,
+ -10101477, -10077381, -10053027, -10028416, -10003546, -9978417,
+ -9953028, -9927378, -9901467, -9875295, -9848860, -9822162, -9795201,
+ -9767976, -9740485, -9712730, -9684708, -9656420, -9627865, -9599042,
+ -9569950, -9540590, -9510960, -9481060, -9450889, -9420447, -9389733,
+ -9358746, -9327487, -9295954, -9264146, -9232064, -9199707, -9167074,
+ -9134164, -9100978, -9067513, -9033771, -8999750, -8965450, -8930870,
+ -8896009, -8860868, -8825446, -8789741, -8753754, -8717485, -8680931,
+ -8644094, -8606972, -8569564, -8531872, -8493893, -8455627, -8417075,
+ -8378234, -8339106, -8299689, -8259982, -8219986, -8179700, -8139123,
+ -8098255, -8057095, -8015644, -7973899, -7931862, -7889531, -7846906,
+ -7803987, -7760772, -7717262, -7673457, -7629355, -7584956, -7540260,
+ -7495266, -7449974, -7404384, -7358495, -7312306, -7265817, -7219028,
+ -7171938, -7124548, -7076855, -7028861, -6980564, -6931964, -6883062,
+ -6833855, -6784345, -6734530, -6684410, -6633986, -6583255, -6532219,
+ -6480876, -6429227, -6377270, -6325007, -6272435, -6219555, -6166367,
+ -6112869, -6059063, -6004947, -5950521, -5895784, -5840737, -5785380,
+ -5729711, -5673730, -5617437, -5560832, -5503915, -5446685, -5389142,
+ -5331285, -5273114, -5214629, -5155830, -5096717, -5037288, -4977544,
+ -4917485, -4857110, -4796419, -4735412, -4674088, -4612447, -4550490,
+ -4488215, -4425622, -4362712, -4299484, -4235937, -4172072, -4107888,
+ -4043386, -3978564, -3913423, -3847962, -3782181, -3716081, -3649660,
+ -3582919, -3515858, -3448476, -3380773, -3312749, -3244403, -3175736,
+ -3106748, -3037438, -2967806, -2897852, -2827576, -2756978, -2686057,
+ -2614814, -2543248, -2471359, -2399147, -2326612, -2253755, -2180573,
+ -2107069, -2033241, -1959090, -1884615, -1809816, -1734694, -1659247,
+ -1583477, -1507383, -1430965, -1354223, -1277157, -1199766, -1122052,
+ -1044013, -965650, -886963, -807951, -728615, -648955, -568970,
+ -488662, -408029, -327071, -245790, -164184, -82254, 0, 82578, 165480,
+ 248707, 332258, 416132, 500331, 584853, 669699, 754868, 840362, 926179,
+ 1012319, 1098782, 1185569, 1272679, 1360112, 1447867, 1535946, 1624347,
+ 1713070, 1802116, 1891484, 1981174, 2071186, 2161520, 2252175, 2343152,
+ 2434450, 2526069, 2618009, 2710269, 2802850, 2895751, 2988972, 3082513,
+ 3176374, 3270554, 3365053, 3459871, 3555008, 3650463, 3746236, 3842327,
+ 3938736, 4035462, 4132505, 4229866, 4327542, 4425535, 4523844, 4622468,
+ 4721408, 4820662, 4920232, 5020116, 5120313, 5220825, 5321649, 5422787,
+ 5524237, 5626000, 5728075, 5830461, 5933158, 6036166, 6139484, 6243112,
+ 6347050, 6451297, 6555852, 6660716, 6765888, 6871368, 6977154, 7083247,
+ 7189646, 7296351, 7403360, 7510675, 7618294, 7726217, 7834442, 7942971,
+ 8051802, 8160935, 8270369, 8380104, 8490139, 8600474, 8711108, 8822040,
+ 8933271, 9044799, 9156625, 9268746, 9381163, 9493876, 9606883, 9720185,
+ 9833780, 9947667, 10061847, 10176319, 10291082, 10406135, 10521477,
+ 10637109, 10753030, 10869238, 10985733, 11102515, 11219583, 11336935,
+ 11454572, 11572493, 11690697, 11809184, 11927952, 12047000, 12166329,
+ 12285938, 12405825, 12525990, 12646433, 12767152, 12888146, 13009416,
+ 13130960, 13252777, 13374866, 13497228, 13619860, 13742763, 13865935,
+ 13989376, 14113084, 14237059, 14361300, 14485807, 14610577, 14735612,
+ 14860908, 14986467, 15112286, 15238366, 15364704, 15491301, 15618155,
+ 15745265, 15872631, 16000251, 16128124, 16256251, 16384629, 16513258,
+ 16642136, 16771263, 16900639, 17030261, 17160128, 17290241, 17420598,
+ 17551197, 17682039, 17813121, 17944443, 18076003, 18207802, 18339837,
+ 18472107, 18604612, 18737351, 18870322, 19003525, 19136957, 19270619,
+ 19404509, 19538626, 19672969, 19807536, 19942327, 20077340, 20212575,
+ 20348030, 20483703, 20619595, 20755703, 20892027, 21028565, 21165316,
+ 21302279, 21439453, 21576836, 21714428, 21852227, 21990231, 22128440,
+ 22266852, 22405467, 22544282, 22683297, 22822510, 22961920, 23101526,
+ 23241327, 23381320, 23521506, 23661882, 23802447, 23943200, 24084139,
+ 24225264, 24366573, 24508064, 24649736, 24791588, 24933619, 25075826,
+ 25218209, 25360767, 25503497, 25646399, 25789470, 25932711, 26076118,
+ 26219691, 26363429, 26507329, 26651391, 26795613, 26939993, 27084530,
+ 27229223, 27374069, 27519068, 27664219, 27809518, 27954966, 28100560,
+ 28246299, 28392181, 28538206, 28684370, 28830674, 28977114, 29123690,
+ 29270400, 29417243, 29564216, 29711319, 29858549, 30005906, 30153386,
+ 30300990, 30448715, 30596559, 30744521, 30892599, 31040792, 31189098,
+ 31337515, 31486042, 31634676, 31783417, 31932262, 32081209, 32230258,
+ 32379407, 32528652, 32677994, 32827430, 32976958, 33126577, 33276285,
+ 33426079, 33575960, 33725923, 33875969, 34026094, 34176298, 34326578,
+ 34476933, 34627360, 34777858, 34928426, 35079060, 35229760, 35380524,
+ 35531349, 35682234, 35833177, 35984177, 36135230, 36286336, 36437492,
+ 36588696, 36739948, 36891244, 37042582, 37193962, 37345380, 37496836,
+ 37648326, 37799849, 37951404, 38102987, 38254598, 38406234, 38557893,
+ 38709574, 38861273, 39012990, 39164722, 39316467, 39468223, 39619988,
+ 39771761, 39923538, 40075319, 40227100, 40378880, 40530657, 40682429,
+ 40834193, 40985948, 41137691, 41289421, 41441135, 41592831, 41744507,
+ 41896161, 42047790, 42199394, 42350969, 42502513, 42654024, 42805501,
+ 42956940, 43108340, 43259699, 43411013, 43562283, 43713504, 43864674,
+ 44015793, 44166856, 44317863, 44468811, 44619697, 44770520, 44921276,
+ 45071965, 45222584, 45373130, 45523601, 45673995, 45824309, 45974542,
+ 46124691, 46274754, 46424728, 46574611, 46724402, 46874096, 47023693,
+ 47173190, 47322584, 47471874, 47621056, 47770129, 47919090, 48067936,
+ 48216667, 48365278, 48513768, 48662134, 48810374, 48958486, 49106467,
+ 49254314, 49402026, 49549600, 49697033, 49844323, 49991468, 50138465,
+ 50285312, 50432007, 50578546, 50724927, 50871148, 51017207, 51163101,
+ 51308828, 51454384, 51599768, 51744978, 51890009, 52034861, 52179531,
+ 52324015, 52468312, 52612419, 52756334, 52900054, 53043576, 53186898,
+ 53330017, 53472931, 53615638, 53758134, 53900418, 54042486, 54184336,
+ 54325965, 54467372, 54608552, 54749505, 54890226, 55030714, 55170966,
+ 55310979, 55450751, 55590279, 55729560, 55868593, 56007373, 56145899,
+ 56284168, 56422177, 56559924, 56697406, 56834620, 56971564, 57108235,
+ 57244630, 57380747, 57516584, 57652136, 57787402, 57922379, 58057064,
+ 58191455, 58325549, 58459343, 58592835, 58726021, 58858900, 58991468,
+ 59123722, 59255660, 59387280, 59518578, 59649552, 59780199, 59910516,
+ 60040500, 60170150, 60299461, 60428432, 60557059, 60685340, 60813272,
+ 60940852, 61068078, 61194946, 61321454, 61447599, 61573379, 61698790,
+ 61823830, 61948496, 62072785, 62196694, 62320221, 62443363, 62566117,
+ 62688480, 62810449, 62932022, 63053195, 63173967, 63294333, 63414292,
+ 63533840, 63652975, 63771693, 63889993, 64007870, 64125323, 64242348,
+ 64358943, 64475104, 64590829, 64706115, 64820960, 64935359, 65049311,
+ 65162813, 65275861, 65388453, 65500586, 65612257, 65723464, 65834202,
+ 65944471, 66054265, 66163584, 66272423, 66380781, 66488653, 66596037,
+ 66702931, 66809331, 66915235, 67020639, 67125541, 67229938, 67333827,
+ 67437205, 67540069, 67642416, 67744244, 67845548, 67946328, 68046579,
+ 68146299, 68245484, 68344132, 68442241, 68539806, 68636826, 68733296,
+ 68829215, 68924580, 69019387, 69113633, 69207316, 69300433, 69392980,
+ 69484956, 69576356, 69667179, 69757420, 69847078, 69936149, 70024630,
+ 70112519, 70199812, 70286506, 70372600, 70458089, 70542971, 70627242,
+ 70710901, 70793944, 70876367, 70958169, 71039346, 71119895, 71199814,
+ 71279099, 71357748, 71435757, 71513124, 71589846, 71665919, 71741341,
+ 71816110, 71890221, 71963672, 72036461, 72108584, 72180038, 72250821,
+ 72320929, 72390359, 72459110, 72527177, 72594558, 72661250, 72727250,
+ 72792555, 72857162, 72921068, 72984271, 73046767, 73108554, 73169628,
+ 73229987, 73289628, 73348548, 73406744, 73464213, 73520952, 73576958,
+ 73632229, 73686762, 73740553, 73793599, 73845899, 73897448, 73948245,
+ 73998286, 74047568, 74096088, 74143844, 74190833, 74237052, 74282497,
+ 74327167, 74371058, 74414167, 74456491, 74498028, 74538775, 74578729,
+ 74617887, 74656246, 74693804, 74730556, 74766502, 74801637, 74835960,
+ 74869466, 74902154, 74934020, 74965062, 74995277, 75024662, 75053214,
+ 75080931, 75107809, 75133846, 75159038, 75183384, 75206881, 75229525,
+ 75251313, 75272244, 75292314, 75311521, 75329861, 75347332, 75363931,
+ 75379655, 75394502, 75408469, 75421553, 75433752, 75445062, 75455481,
+ 75465006, 75473634, 75481363, 75488190, 75494112, 75499127, 75503232,
+ 75506423, 75508699, 75510057, 75510494, 75510007, 75508593, 75506251,
+ 75502977, 75498768, 75493622, 75487537, 75480509, 75472536, 75463616,
+ 75453745, 75442921, 75431142, 75418405, 75404706, 75390045, 75374417,
+ 75357820, 75340253, 75321711, 75302193, 75281696, 75260217, 75237755,
+ 75214305, 75189867, 75164436, 75138011, 75110589, 75082168, 75052745,
+ 75022317, 74990882, 74958438, 74924982, 74890511, 74855023, 74818516,
+ 74780986, 74742433, 74702852, 74662242, 74620600, 74577924, 74534211,
+ 74489459, 74443665, 74396828, 74348944, 74300011, 74250027, 74198989,
+ 74146896, 74093744, 74039531, 73984255, 73927914, 73870505, 73812026,
+ 73752475, 73691848, 73630145, 73567362, 73503498, 73438549, 73372514,
+ 73305391, 73237177, 73167870, 73097467, 73025967, 72953367, 72879664,
+ 72804858, 72728945, 72651923, 72573791, 72494545, 72414184, 72332705,
+ 72250107, 72166387, 72081544, 71995574, 71908476, 71820247, 71730886,
+ 71640391, 71548759, 71455988, 71362077, 71267022, 71170823, 71073477,
+ 70974982, 70875335, 70774536, 70672581, 70569470, 70465199, 70359767,
+ 70253173, 70145413, 70036486, 69926391, 69815124, 69702685, 69589071,
+ 69474281, 69358312, 69241163, 69122831, 69003315, 68882614, 68760724,
+ 68637645, 68513374, 68387910, 68261251, 68133395, 68004340, 67874085,
+ 67742628, 67609966, 67476099, 67341025, 67204741, 67067246, 66928539,
+ 66788617, 66647480, 66505125, 66361550, 66216755, 66070737, 65923495,
+ 65775027, 65625332, 65474407, 65322252, 65168865, 65014245, 64858389,
+ 64701296, 64542965, 64383394, 64222582, 64060527, 63897228, 63732683,
+ 63566891, 63399850, 63231560, 63062018, 62891223, 62719173, 62545869,
+ 62371307, 62195487, 62018407, 61840066, 61660463, 61479596, 61297465,
+ 61114067, 60929401, 60743467, 60556263, 60367788, 60178041, 59987020,
+ 59794724, 59601152, 59406303, 59210175, 59012769, 58814081, 58614112,
+ 58412861, 58210325, 58006505, 57801398, 57595005, 57387323, 57178353,
+ 56968092, 56756540, 56543697, 56329560, 56114129, 55897404, 55679382,
+ 55460064, 55239448, 55017534, 54794321, 54569807, 54343992, 54116875,
+ 53888456, 53658733, 53427705, 53195373, 52961735, 52726790, 52490538,
+ 52252979, 52014110, 51773932, 51532444, 51289646, 51045536, 50800114,
+ 50553379, 50305332, 50055970, 49805295, 49553305, 49299999, 49045377,
+ 48789439, 48532184, 48273612, 48013722, 47752513, 47489986, 47226140,
+ 46960975, 46694489, 46426683, 46157557, 45887110, 45615341, 45342251,
+ 45067839, 44792105, 44515048, 44236669, 43956967, 43675942, 43393594,
+ 43109922, 42824927, 42538608, 42250965, 41961998, 41671707, 41380092,
+ 41087152, 40792889, 40497301, 40200388, 39902152, 39602591, 39301705,
+ 38999496, 38695962, 38391104, 38084922, 37777416, 37468587, 37158433,
+ 36846957, 36534157, 36220034, 35904588, 35587820, 35269729, 34950316,
+ 34629581, 34307525, 33984147, 33659449, 33333430, 33006091, 32677432,
+ 32347454, 32016157, 31683541, 31349607, 31014356, 30677788, 30339903,
+ 30000701, 29660185, 29318353, 28975207, 28630747, 28284974, 27937889,
+ 27589491, 27239783, 26888763, 26536434, 26182796, 25827849, 25471595,
+ 25114034, 24755167, 24394994, 24033517, 23670736, 23306653, 22941268,
+ 22574582, 22206595, 21837310, 21466726, 21094846, 20721669, 20347197,
+ 19971430, 19594371, 19216020, 18836377, 18455445, 18073224, 17689715,
+ 17304920, 16918840, 16531475, 16142828, 15752899, 15361690, 14969201,
+ 14575435, 14180392, 13784074, 13386483, 12987618, 12587483, 12186078,
+ 11783404, 11379464, 10974259, 10567789, 10160057, 9751064, 9340812,
+ 8929302, 8516536, 8102515, 7687241, 7270716, 6852941, 6433918, 6013649,
+ 5592135, 5169378, 4745379, 4320142, 3893666, 3465955, 3037010, 2606833,
+ 2175425, 1742789, 1308927, 873840, 437530, 0, -438749, -878714,
+ -1319895, -1762288, -2205891, -2650704, -3096722, -3543945, -3992370,
+ -4441994, -4892817, -5344835, -5798047, -6252449, -6708041, -7164819,
+ -7622781, -8081925, -8542249, -9003750, -9466426, -9930274, -10395292,
+ -10861478, -11328829, -11797343, -12267017, -12737848, -13209835,
+ -13682974, -14157263, -14632699, -15109280, -15587003, -16065865,
+ -16545864, -17026997, -17509261, -17992654, -18477173, -18962814,
+ -19449576, -19937455, -20426448, -20916554, -21407767, -21900087,
+ -22393509, -22888032, -23383651, -23880364, -24378168, -24877061,
+ -25377038, -25878096, -26380234, -26883447, -27387732, -27893087,
+ -28399507, -28906991, -29415534, -29925134, -30435787, -30947490,
+ -31460239, -31974032, -32488864, -33004733, -33521636, -34039568,
+ -34558526, -35078507, -35599508, -36121524, -36644553, -37168591,
+ -37693634, -38219679, -38746722, -39274760, -39803789, -40333804,
+ -40864804, -41396783, -41929739, -42463667, -42998563, -43534425,
+ -44071247, -44609027, -45147760, -45687443, -46228072, -46769642,
+ -47312150, -47855592, -48399964, -48945262, -49491481, -50038619,
+ -50586671, -51135632, -51685499, -52236267, -52787933, -53340493,
+ -53893941, -54448274, -55003488, -55559578, -56116541, -56674371,
+ -57233065, -57792619, -58353027, -58914286, -59476391, -60039338,
+ -60603122, -61167739, -61733184, -62299454, -62866543, -63434446,
+ -64003160, -64572680, -65143001, -65714119, -66286029, -66858726,
+ -67432205, -68006463, -68581493, -69157292, -69733855, -70311177,
+ -70889253, -71468078, -72047648, -72627957, -73209001, -73790775,
+ -74373274, -74956492, -75540426, -76125070, -76710418, -77296467,
+ -77883210, -78470644, -79058762, -79647560, -80237032, -80827174,
+ -81417980, -82009445, -82601564, -83194331, -83787742, -84381790,
+ -84976472, -85571781, -86167712, -86764260, -87361419, -87959184,
+ -88557550, -89156511, -89756062, -90356197, -90956910, -91558197,
+ -92160052, -92762468, -93365441, -93968965, -94573035, -95177644,
+ -95782787, -96388459, -96994653, -97601364, -98208587, -98816315,
+ -99424542, -100033264, -100642473, -101252165, -101862333, -102472972,
+ -103084075, -103695637, -104307652, -104920114, -105533016, -106146354,
+ -106760120, -107374309, -107988915, -108603931, -109219352, -109835171,
+ -110451383, -111067981, -111684959, -112302311, -112920031, -113538112,
+ -114156548, -114775333, -115394461, -116013925, -116633719, -117253837,
+ -117874272, -118495017, -119116068, -119737416, -120359056, -120980982,
+ -121603186, -122225662, -122848404, -123471405, -124094659, -124718159,
+ -125341898, -125965871, -126590069, -127214487, -127839118, -128463956,
+ -129088992, -129714222, -130339638, -130965233, -131591001, -132216934,
+ -132843027, -133469271, -134095661, -134722189, -135348849, -135975634,
+ -136602536, -137229549, -137856666, -138483880, -139111183, -139738570,
+ -140366032, -140993563, -141621156, -142248804, -142876499, -143504234,
+ -144132003, -144759798, -145387612, -146015437, -146643268, -147271095,
+ -147898913, -148526714, -149154490, -149782234, -150409940, -151037599,
+ -151665205, -152292749, -152920226, -153547626, -154174943, -154802170,
+ -155429298, -156056321, -156683231, -157310021, -157936682, -158563208,
+ -159189591, -159815823, -160441897, -161067806, -161693540, -162319094,
+ -162944459, -163569628, -164194593, -164819346, -165443880, -166068186,
+ -166692258, -167316087, -167939666, -168562986, -169186041, -169808822,
+ -170431321, -171053531, -171675443, -172297050, -172918344, -173539318,
+ -174159962, -174780269, -175400231, -176019841, -176639090, -177257970,
+ -177876473, -178494592, -179112317, -179729642, -180346558, -180963056,
+ -181579129, -182194769, -182809968, -183424717, -184039008, -184652833,
+ -185266184, -185879053, -186491431, -187103311, -187714683, -188325540,
+ -188935874, -189545675, -190154937, -190763650, -191371806, -191979397,
+ -192586415, -193192850, -193798696, -194403942, -195008582, -195612606,
+ -196216006, -196818774, -197420901, -198022379, -198623199, -199223352,
+ -199822831, -200421626, -201019730, -201617132, -202213826, -202809803,
+ -203405053, -203999568, -204593340, -205186360, -205778619, -206370109,
+ -206960821, -207550746, -208139876, -208728202, -209315715, -209902407,
+ -210488268, -211073290, -211657465, -212240783, -212823236, -213404815,
+ -213985511, -214565315, -215144219, -215722214, -216299290, -216875439,
+ -217450653, -218024921, -218598236, -219170588, -219741969, -220312370,
+ -220881781, -221450194, -222017599, -222583989, -223149353, -223713683,
+ -224276970, -224839205, -225400379, -225960482, -226519507, -227077443,
+ -227634282, -228190015, -228744632, -229298125, -229850484, -230401700,
+ -230951765, -231500669, -232048403, -232594958, -233140324, -233684493,
+ -234227456, -234769203, -235309725, -235849013, -236387058, -236923850,
+ -237459380, -237993640, -238526620, -239058310, -239588702, -240117786,
+ -240645553, -241171993, -241697098, -242220859, -242743265, -243264307,
+ -243783977, -244302265, -244819162, -245334658, -245848744, -246361411,
+ -246872650, -247382450, -247890803, -248397700, -248903130, -249407085,
+ -249909556, -250410532, -250910005, -251407964, -251904402, -252399308,
+ -252892673, -253384487, -253874742, -254363427, -254850533, -255336052,
+ -255819972, -256302286, -256782983, -257262054, -257739490, -258215281,
+ -258689417, -259161890, -259632689, -260101806, -260569231, -261034953,
+ -261498965, -261961256, -262421817, -262880637, -263337709, -263793022,
+ -264246567, -264698334, -265148314, -265596497, -266042874, -266487435,
+ -266930171, -267371072, -267810128, -268247331, -268682670, -269116136,
+ -269547720, -269977411, -270405201, -270831079, -271255037, -271677064,
+ -272097152, -272515290, -272931469, -273345680, -273757913, -274168157,
+ -274576405, -274982646, -275386871, -275789069, -276189232, -276587351,
+ -276983414, -277377413, -277769339, -278159181, -278546930, -278932577,
+ -279316112, -279697526, -280076808, -280453949, -280828940, -281201771,
+ -281572433, -281940916, -282307210, -282671306, -283033194, -283392865,
+ -283750310, -284105518, -284458480, -284809186, -285157627, -285503794,
+ -285847677, -286189266, -286528551, -286865524, -287200175, -287532494,
+ -287862471, -288190097, -288515363, -288838259, -289158775, -289476902,
+ -289792630, -290105951, -290416853, -290725329, -291031368, -291334961,
+ -291636098, -291934769, -292230967, -292524680, -292815899, -293104615,
+ -293390819, -293674500, -293955650, -294234259, -294510318, -294783816,
+ -295054745, -295323096, -295588858, -295852022, -296112579, -296370519,
+ -296625834, -296878513, -297128547, -297375927, -297620644, -297862687,
+ -298102048, -298338717, -298572685, -298803942, -299032480, -299258288,
+ -299481358, -299701680, -299919244, -300134042, -300346064, -300555300,
+ -300761742, -300965381, -301166206, -301364208, -301559379, -301751709,
+ -301941189, -302127809, -302311561, -302492435, -302670421, -302845511,
+ -303017695, -303186965, -303353310, -303516723, -303677192, -303834711,
+ -303989268, -304140856, -304289465, -304435086, -304577709, -304717326,
+ -304853928, -304987505, -305118048, -305245549, -305369998, -305491386,
+ -305609704, -305724944, -305837095, -305946150, -306052098, -306154932,
+ -306254642, -306351219, -306444655, -306534939, -306622064, -306706020,
+ -306786799, -306864392, -306938789, -307009982, -307077962, -307142720,
+ -307204248, -307262536, -307317575, -307369358, -307417875, -307463117,
+ -307505075, -307543742, -307579107, -307611163, -307639901, -307665312,
+ -307687386, -307706117, -307721495, -307733510, -307742156, -307747423,
+ -307749302, -307747785, -307742864, -307734529, -307722773, -307707586,
+ -307688961, -307666888, -307641360, -307612367, -307579902, -307543956,
+ -307504521, -307461587, -307415147, -307365193, -307311715, -307254707,
+ -307194158, -307130062, -307062410, -306991193, -306916403, -306838032,
+ -306756072, -306670514, -306581351, -306488574, -306392175, -306292147,
+ -306188479, -306081166, -305970198, -305855568, -305737267, -305615288,
+ -305489622, -305360261, -305227198, -305090425, -304949933, -304805715,
+ -304657762, -304506068, -304350623, -304191420, -304028452, -303861711,
+ -303691188, -303516876, -303338767, -303156854, -302971128, -302781583,
+ -302588210, -302391001, -302189950, -301985049, -301776289, -301563664,
+ -301347165, -301126786, -300902518, -300674355, -300442288, -300206311,
+ -299966416, -299722595, -299474842, -299223148, -298967507, -298707910,
+ -298444352, -298176824, -297905320, -297629831, -297350352, -297066874,
+ -296779390, -296487894, -296192379, -295892836, -295589260, -295281642,
+ -294969977, -294654256, -294334474, -294010623, -293682695, -293350685,
+ -293014586, -292674389, -292330090, -291981680, -291629153, -291272503,
+ -290911722, -290546803, -290177741, -289804529, -289427159, -289045625,
+ -288659921, -288270039, -287875974, -287477719, -287075268, -286668613,
+ -286257749, -285842669, -285423367, -284999835, -284572069, -284140062,
+ -283703807, -283263297, -282818528, -282369493, -281916184, -281458597,
+ -280996726, -280530563, -280060103, -279585340, -279106268, -278622881,
+ -278135172, -277643137, -277146768, -276646061, -276141009, -275631606,
+ -275117847, -274599726, -274077237, -273550374, -273019132, -272483504,
+ -271943486, -271399072, -270850256, -270297032, -269739396, -269177341,
+ -268610862, -268039954, -267464611, -266884827, -266300599, -265711919,
+ -265118783, -264521186, -263919122, -263312586, -262701573, -262086078,
+ -261466096, -260841621, -260212648, -259579173, -258941191, -258298696,
+ -257651684, -257000149, -256344088, -255683494, -255018363, -254348691,
+ -253674472, -252995702, -252312376, -251624490, -250932038, -250235017,
+ -249533421, -248827247, -248116489, -247401144, -246681206, -245956672,
+ -245227536, -244493795, -243755445, -243012480, -242264897, -241512692,
+ -240755860, -239994397, -239228300, -238457563, -237682183, -236902156,
+ -236117479, -235328146, -234534154, -233735499, -232932177, -232124185,
+ -231311519, -230494175, -229672148, -228845437, -228014036, -227177942,
+ -226337152, -225491662, -224641469, -223786568, -222926958, -222062633,
+ -221193591, -220319829, -219441343, -218558130, -217670186, -216777509,
+ -215880095, -214977941, -214071044, -213159401, -212243009, -211321865,
+ -210395966, -209465308, -208529890, -207589708, -206644759, -205695041,
+ -204740551, -203781286, -202817243, -201848420, -200874814, -199896423,
+ -198913244, -197925275, -196932512, -195934954, -194932599, -193925443,
+ -192913485, -191896723, -190875153, -189848774, -188817584, -187781580,
+ -186740761, -185695124, -184644668, -183589390, -182529288, -181464360,
+ -180394606, -179320022, -178240607, -177156359, -176067277, -174973358,
+ -173874601, -172771005, -171662568, -170549288, -169431164, -168308195,
+ -167180378, -166047713, -164910199, -163767833, -162620615, -161468543,
+ -160311616, -159149834, -157983194, -156811696, -155635339, -154454122,
+ -153268044, -152077104, -150881300, -149680633, -148475101, -147264703,
+ -146049440, -144829310, -143604312, -142374446, -141139711, -139900107,
+ -138655633, -137406289, -136152075, -134892989, -133629032, -132360204,
+ -131086504, -129807931, -128524486, -127236169, -125942979, -124644917,
+ -123341982, -122034174, -120721494, -119403941, -118081516, -116754219,
+ -115422050, -114085009, -112743097, -111396314, -110044660, -108688136,
+ -107326742, -105960479, -104589347, -103213348, -101832480, -100446746,
+ -99056145, -97660680, -96260349, -94855155, -93445098, -92030179,
+ -90610398, -89185758, -87756259, -86321901, -84882687, -83438617,
+ -81989693, -80535915, -79077286, -77613805, -76145476, -74672298,
+ -73194275, -71711406, -70223693, -68731139, -67233745, -65731512,
+ -64224442, -62712537, -61195798, -59674228, -58147828, -56616601,
+ -55080547, -53539670, -51993970, -50443451, -48888115, -47327963,
+ -45762997, -44193220, -42618635, -41039243, -39455047, -37866049,
+ -36272253, -34673659, -33070271, -31462091, -29849123, -28231368,
+ -26608829, -24981509, -23349412, -21712538, -20070893, -18424478,
+ -16773296, -15117351, -13456645, -11791182, -10120965, -8445996,
+ -6766279, -5081818, -3392616, -1698675, 0, 1703406, 3411540, 5124399,
+ 6841978, 8564275, 10291285, 12023005, 13759430, 15500559, 17246385,
+ 18996906, 20752118, 22512017, 24276599, 26045859, 27819794, 29598400,
+ 31381673, 33169607, 34962200, 36759446, 38561342, 40367883, 42179065,
+ 43994882, 45815332, 47640409, 49470108, 51304425, 53143356, 54986895,
+ 56835038, 58687780, 60545117, 62407042, 64273553, 66144642, 68020306,
+ 69900540, 71785337, 73674694, 75568605, 77467064, 79370067, 81277609,
+ 83189683, 85106284, 87027407, 88953047, 90883198, 92817854, 94757010,
+ 96700660, 98648799, 100601420, 102558519, 104520088, 106486122,
+ 108456616, 110431564, 112410958, 114394794, 116383065, 118375765,
+ 120372889, 122374429, 124380379, 126390734, 128405486, 130424630,
+ 132448159, 134476066, 136508346, 138544991, 140585995, 142631351,
+ 144681053, 146735094, 148793467, 150856165, 152923182, 154994510,
+ 157070143, 159150073, 161234294, 163322799, 165415580, 167512631,
+ 169613943, 171719511, 173829326, 175943381, 178061669, 180184183,
+ 182310915, 184441857, 186577003, 188716344, 190859873, 193007582,
+ 195159464, 197315510, 199475714, 201640066, 203808560, 205981188,
+ 208157941, 210338811, 212523791, 214712872, 216906046, 219103306,
+ 221304642, 223510047, 225719513, 227933030, 230150591, 232372188,
+ 234597811, 236827453, 239061104, 241298757, 243540402, 245786031,
+ 248035636, 250289207, 252546735, 254808213, 257073630, 259342979,
+ 261616250, 263893434, 266174523, 268459506, 270748376, 273041122,
+ 275337736, 277638209, 279942530, 282250692, 284562684, 286878497,
+ 289198122, 291521549, 293848768, 296179771, 298514547, 300853087,
+ 303195382, 305541421, 307891194, 310244693, 312601907, 314962825,
+ 317327440, 319695739, 322067714, 324443354, 326822650, 329205590,
+ 331592166, 333982366, 336376181, 338773600, 341174613, 343579210,
+ 345987380, 348399112, 350814397, 353233224, 355655582, 358081460,
+ 360510849, 362943737, 365380114, 367819968, 370263290, 372710068,
+ 375160291, 377613949, 380071030, 382531525, 384995420, 387462707,
+ 389933372, 392407406, 394884798, 397365535, 399849607, 402337002,
+ 404827710, 407321718, 409819016, 412319591, 414823433, 417330530,
+ 419840871, 422354443, 424871236, 427391237, 429914435, 432440818,
+ 434970374, 437503092, 440038960, 442577966, 445120097, 447665343,
+ 450213690, 452765128, 455319643, 457877224, 460437859, 463001536,
+ 465568241, 468137964, 470710692, 473286412, 475865112, 478446779,
+ 481031403, 483618969, 486209465, 488802879, 491399199, 493998411,
+ 496600503, 499205463, 501813277, 504423933, 507037418, 509653720,
+ 512272825, 514894721, 517519395, 520146833, 522777023, 525409952,
+ 528045606, 530683974, 533325040, 535968794, 538615220, 541264306,
+ 543916039, 546570406, 549227393, 551886986, 554549173, 557213939,
+ 559881273, 562551159, 565223585, 567898537, 570576001, 573255964,
+ 575938412, 578623331, 581310708, 584000529, 586692781, 589387448,
+ 592084519, 594783978, 597485811, 600190006, 602896547, 605605421,
+ 608316615, 611030112, 613745901, 616463966, 619184293, 621906869,
+ 624631679, 627358708, 630087943, 632819369, 635552972, 638288737,
+ 641026651, 643766698, 646508864, 649253135, 651999496, 654747932,
+ 657498430, 660250974, 663005549, 665762142, 668520737, 671281320,
+ 674043876, 676808390, 679574848, 682343233, 685113533, 687885731,
+ 690659813, 693435764, 696213569, 698993212, 701774680, 704557956,
+ 707343026, 710129874, 712918486, 715708846, 718500939, 721294750,
+ 724090264, 726887464, 729686337, 732486866, 735289037, 738092833,
+ 740898240, 743705242, 746513823, 749323968, 752135662, 754948889,
+ 757763634, 760579880, 763397612, 766216815, 769037473, 771859570,
+ 774683090, 777508018, 780334339, 783162035, 785991092, 788821493,
+ 791653222, 794486265, 797320604, 800156225, 802993110, 805831244,
+ 808670611, 811511195, 814352979, 817195949, 820040087, 822885378,
+ 825731805, 828579352, 831428004, 834277743, 837128554, 839980420,
+ 842833325, 845687253, 848542187, 851398111, 854255009, 857112865,
+ 859971661, 862831382, 865692011, 868553531, 871415927, 874279181,
+ 877143277, 880008198, 882873929, 885740451, 888607750, 891475807,
+ 894344607, 897214133, 900084367, 902955294, 905826897, 908699158,
+ 911572062, 914445591, 917319728, 920194457, 923069761, 925945623,
+ 928822026, 931698954, 934576388, 937454313, 940332712, 943211567,
+ 946090861, 948970578, 951850700, 954731211, 957612093, 960493330,
+ 963374903, 966256797, 969138994, 972021477, 974904229, 977787232,
+ 980670470, 983553925, 986437580, 989321418, 992205421, 995089573,
+ 997973855, 1000858252, 1003742745, 1006627317, 1009511951, 1012396630,
+ 1015281336, 1018166051, 1021050759, 1023935442, 1026820083, 1029704664,
+ 1032589168, 1035473577, 1038357874, 1041242041, 1044126061, 1047009917,
+ 1049893591, 1052777065, 1055660322, 1058543344, 1061426114, 1064308615,
+ 1067190828, 1070072736, 1072954322, 1075835567, 1078716455, 1081596968,
+ 1084477087, 1087356796, 1090236076, 1093114911, 1095993281, 1098871171,
+ 1101748561, 1104625435, 1107501774, 1110377561, 1113252778, 1116127408,
+ 1119001432, 1121874833, 1124747593, 1127619694, 1130491119, 1133361849,
+ 1136231867, 1139101156, 1141969696, 1144837472, 1147704463, 1150570654,
+ 1153436026, 1156300560, 1159164240, 1162027048, 1164888964, 1167749973,
+ 1170610055, 1173469194, 1176327370, 1179184566, 1182040765, 1184895947,
+ 1187750097, 1190603194, 1193455223, 1196306164, 1199155999, 1202004711,
+ 1204852283, 1207698695, 1210543930, 1213387970, 1216230797, 1219072393,
+ 1221912740, 1224751821, 1227589616, 1230426109, 1233261281, 1236095115,
+ 1238927592, 1241758694, 1244588403, 1247416702, 1250243573, 1253068996,
+ 1255892955, 1258715432, 1261536408, 1264355866, 1267173787, 1269990154,
+ 1272804948, 1275618151, 1278429747, 1281239715, 1284048040, 1286854702,
+ 1289659683, 1292462966, 1295264533, 1298064366, 1300862446, 1303658756,
+ 1306453277, 1309245992, 1312036883, 1314825932, 1317613121, 1320398431,
+ 1323181846, 1325963346, 1328742914, 1331520532, 1334296182, 1337069847,
+ 1339841507, 1342611145, 1345378744, 1348144285, 1350907751, 1353669123,
+ 1356428383, 1359185514, 1361940498, 1364693317, 1367443952, 1370192386,
+ 1372938602, 1375682580, 1378424304, 1381163756, 1383900917, 1386635769,
+ 1389368295, 1392098478, 1394826298, 1397551739, 1400274782, 1402995410,
+ 1405713605, 1408429348, 1411142623, 1413853411, 1416561695, 1419267457,
+ 1421970678, 1424671342, 1427369431, 1430064926, 1432757810, 1435448066,
+ 1438135675, 1440820620, 1443502883, 1446182447, 1448859293, 1451533405,
+ 1454204764, 1456873353, 1459539154, 1462202150, 1464862322, 1467519654,
+ 1470174128, 1472825725, 1475474430, 1478120223, 1480763087, 1483403006,
+ 1486039961, 1488673934, 1491304909, 1493932868, 1496557793, 1499179667,
+ 1501798473, 1504414192, 1507026808, 1509636304, 1512242661, 1514845862,
+ 1517445890, 1520042728, 1522636358, 1525226763, 1527813926, 1530397829,
+ 1532978455, 1535555786, 1538129807, 1540700498, 1543267843, 1545831826,
+ 1548392428, 1550949632, 1553503421, 1556053779, 1558600688, 1561144130,
+ 1563684089, 1566220548, 1568753490, 1571282897, 1573808752, 1576331039,
+ 1578849741, 1581364840, 1583876320, 1586384163, 1588888353, 1591388873,
+ 1593885705, 1596378834, 1598868242, 1601353912, 1603835828, 1606313972,
+ 1608788328, 1611258880, 1613725610, 1616188502, 1618647538, 1621102703,
+ 1623553980, 1626001352, 1628444803, 1630884315, 1633319872, 1635751459,
+ 1638179057, 1640602651, 1643022225, 1645437761, 1647849243, 1650256655,
+ 1652659981, 1655059203, 1657454307, 1659845275, 1662232091, 1664614738,
+ 1666993202, 1669367464, 1671737510, 1674103322, 1676464885, 1678822182,
+ 1681175198, 1683523917, 1685868321, 1688208396, 1690544125, 1692875492,
+ 1695202481, 1697525076, 1699843261, 1702157021, 1704466340, 1706771201,
+ 1709071589, 1711367487, 1713658881, 1715945755, 1718228092, 1720505877,
+ 1722779095, 1725047729, 1727311765, 1729571186, 1731825977, 1734076122,
+ 1736321606, 1738562414, 1740798529, 1743029938, 1745256623, 1747478570,
+ 1749695763, 1751908188, 1754115828, 1756318669, 1758516695, 1760709892,
+ 1762898243, 1765081734, 1767260350, 1769434075, 1771602895, 1773766795,
+ 1775925759, 1778079773, 1780228821, 1782372889, 1784511962, 1786646024,
+ 1788775063, 1790899061, 1793018005, 1795131880, 1797240672, 1799344365,
+ 1801442945, 1803536397, 1805624707, 1807707860, 1809785843, 1811858639,
+ 1813926236, 1815988618, 1818045771, 1820097680, 1822144333, 1824185713,
+ 1826221808, 1828252602, 1830278082, 1832298233, 1834313041, 1836322493,
+ 1838326575, 1840325271, 1842318569, 1844306454, 1846288912, 1848265930,
+ 1850237494, 1852203589, 1854164203, 1856119322, 1858068931, 1860013017,
+ 1861951567, 1863884566, 1865812002, 1867733861, 1869650129, 1871560793,
+ 1873465840, 1875365256, 1877259027, 1879147141, 1881029585, 1882906344,
+ 1884777407, 1886642759, 1888502388, 1890356280, 1892204422, 1894046803,
+ 1895883407, 1897714224, 1899539239, 1901358440, 1903171814, 1904979348,
+ 1906781030, 1908576847, 1910366786, 1912150835, 1913928980, 1915701210,
+ 1917467513, 1919227874, 1920982283, 1922730727, 1924473193, 1926209669,
+ 1927940142, 1929664602, 1931383035, 1933095429, 1934801772, 1936502052,
+ 1938196258, 1939884376, 1941566396, 1943242305, 1944912092, 1946575744,
+ 1948233249, 1949884597, 1951529776, 1953168773, 1954801577, 1956428177,
+ 1958048560, 1959662717, 1961270634, 1962872301, 1964467707, 1966056839,
+ 1967639687, 1969216240, 1970786486, 1972350414, 1973908014, 1975459273,
+ 1977004182, 1978542728, 1980074901, 1981600691, 1983120086, 1984633076,
+ 1986139649, 1987639796, 1989133505, 1990620766, 1992101568, 1993575901,
+ 1995043754, 1996505116, 1997959979, 1999408330, 2000850159, 2002285457,
+ 2003714214, 2005136418, 2006552060, 2007961130, 2009363618, 2010759513,
+ 2012148807, 2013531488, 2014907547, 2016276974, 2017639760, 2018995894,
+ 2020345368, 2021688171, 2023024294, 2024353727, 2025676460, 2026992485,
+ 2028301792, 2029604372, 2030900215, 2032189312, 2033471653, 2034747231,
+ 2036016034, 2037278056, 2038533285, 2039781714, 2041023334, 2042258135,
+ 2043486109, 2044707247, 2045921540, 2047128980, 2048329558, 2049523265,
+ 2050710093, 2051890033, 2053063077, 2054229216, 2055388443, 2056540748,
+ 2057686124, 2058824562, 2059956054, 2061080592, 2062198169, 2063308775,
+ 2064412403, 2065509045, 2066598694, 2067681340, 2068756978, 2069825598,
+ 2070887194, 2071941757, 2072989280, 2074029756, 2075063177, 2076089536,
+ 2077108824, 2078121036, 2079126164, 2080124199, 2081115137, 2082098968,
+ 2083075686, 2084045285, 2085007757, 2085963094, 2086911292, 2087852341,
+ 2088786237, 2089712971, 2090632538, 2091544930, 2092450142, 2093348167,
+ 2094238997, 2095122628, 2095999052, 2096868263, 2097730255, 2098585021,
+ 2099432556, 2100272854, 2101105908, 2101931712, 2102750261, 2103561548,
+ 2104365568, 2105162315, 2105951783, 2106733967, 2107508860, 2108276458,
+ 2109036754, 2109789744, 2110535421, 2111273781, 2112004818, 2112728527,
+ 2113444903, 2114153940, 2114855633, 2115549978, 2116236969, 2116916601,
+ 2117588870, 2118253770, 2118911297, 2119561447, 2120204213, 2120839593,
+ 2121467580, 2122088171, 2122701361, 2123307146, 2123905522, 2124496483,
+ 2125080026, 2125656147, 2126224841, 2126786104, 2127339932, 2127886322,
+ 2128425269, 2128956770, 2129480819, 2129997415, 2130506553, 2131008229,
+ 2131502440, 2131989182, 2132468452, 2132940246, 2133404560, 2133861392,
+ 2134310739, 2134752596, 2135186961, 2135613830, 2136033201, 2136445070,
+ 2136849435, 2137246292, 2137635639, 2138017473, 2138391791, 2138758590,
+ 2139117868, 2139469622, 2139813850, 2140150549, 2140479716, 2140801350,
+ 2141115448, 2141422007, 2141721026, 2142012503, 2142296434, 2142572819,
+ 2142841655, 2143102940, 2143356672, 2143602850, 2143841472, 2144072535,
+ 2144296039, 2144511982, 2144720361, 2144921177, 2145114426, 2145300109,
+ 2145478223, 2145648767, 2145811739, 2145967140, 2146114967, 2146255220,
+ 2146387897, 2146512998, 2146630522, 2146740467, 2146842833, 2146937620,
+ 2147024826, 2147104451, 2147176495, 2147240956, 2147297835, 2147347131,
+ 2147388843, 2147422972, 2147449517, 2147468478, 2147479854, 2147483646,
+ 2147479854, 2147468478, 2147449517, 2147422972, 2147388843, 2147347131,
+ 2147297835, 2147240956, 2147176495, 2147104451, 2147024826, 2146937620,
+ 2146842833, 2146740467, 2146630522, 2146512998, 2146387897, 2146255220,
+ 2146114967, 2145967140, 2145811739, 2145648767, 2145478223, 2145300109,
+ 2145114426, 2144921177, 2144720361, 2144511982, 2144296039, 2144072535,
+ 2143841472, 2143602850, 2143356672, 2143102940, 2142841655, 2142572819,
+ 2142296434, 2142012503, 2141721026, 2141422007, 2141115448, 2140801350,
+ 2140479716, 2140150549, 2139813850, 2139469622, 2139117868, 2138758590,
+ 2138391791, 2138017473, 2137635639, 2137246292, 2136849435, 2136445070,
+ 2136033201, 2135613830, 2135186961, 2134752596, 2134310739, 2133861392,
+ 2133404560, 2132940246, 2132468452, 2131989182, 2131502440, 2131008229,
+ 2130506553, 2129997415, 2129480819, 2128956770, 2128425269, 2127886322,
+ 2127339932, 2126786104, 2126224841, 2125656147, 2125080026, 2124496483,
+ 2123905522, 2123307146, 2122701361, 2122088171, 2121467580, 2120839593,
+ 2120204213, 2119561447, 2118911297, 2118253770, 2117588870, 2116916601,
+ 2116236969, 2115549978, 2114855633, 2114153940, 2113444903, 2112728527,
+ 2112004818, 2111273781, 2110535421, 2109789744, 2109036754, 2108276458,
+ 2107508860, 2106733967, 2105951783, 2105162315, 2104365568, 2103561548,
+ 2102750261, 2101931712, 2101105908, 2100272854, 2099432556, 2098585021,
+ 2097730255, 2096868263, 2095999052, 2095122628, 2094238997, 2093348167,
+ 2092450142, 2091544930, 2090632538, 2089712971, 2088786237, 2087852341,
+ 2086911292, 2085963094, 2085007757, 2084045285, 2083075686, 2082098968,
+ 2081115137, 2080124199, 2079126164, 2078121036, 2077108824, 2076089536,
+ 2075063177, 2074029756, 2072989280, 2071941757, 2070887194, 2069825598,
+ 2068756978, 2067681340, 2066598694, 2065509045, 2064412403, 2063308775,
+ 2062198169, 2061080592, 2059956054, 2058824562, 2057686124, 2056540748,
+ 2055388443, 2054229216, 2053063077, 2051890033, 2050710093, 2049523265,
+ 2048329558, 2047128980, 2045921540, 2044707247, 2043486109, 2042258135,
+ 2041023334, 2039781714, 2038533285, 2037278056, 2036016034, 2034747231,
+ 2033471653, 2032189312, 2030900215, 2029604372, 2028301792, 2026992485,
+ 2025676460, 2024353727, 2023024294, 2021688171, 2020345368, 2018995894,
+ 2017639760, 2016276974, 2014907547, 2013531488, 2012148807, 2010759513,
+ 2009363618, 2007961130, 2006552060, 2005136418, 2003714214, 2002285457,
+ 2000850159, 1999408330, 1997959979, 1996505116, 1995043754, 1993575901,
+ 1992101568, 1990620766, 1989133505, 1987639796, 1986139649, 1984633076,
+ 1983120086, 1981600691, 1980074901, 1978542728, 1977004182, 1975459273,
+ 1973908014, 1972350414, 1970786486, 1969216240, 1967639687, 1966056839,
+ 1964467707, 1962872301, 1961270634, 1959662717, 1958048560, 1956428177,
+ 1954801577, 1953168773, 1951529776, 1949884597, 1948233249, 1946575744,
+ 1944912092, 1943242305, 1941566396, 1939884376, 1938196258, 1936502052,
+ 1934801772, 1933095429, 1931383035, 1929664602, 1927940142, 1926209669,
+ 1924473193, 1922730727, 1920982283, 1919227874, 1917467513, 1915701210,
+ 1913928980, 1912150835, 1910366786, 1908576847, 1906781030, 1904979348,
+ 1903171814, 1901358440, 1899539239, 1897714224, 1895883407, 1894046803,
+ 1892204422, 1890356280, 1888502388, 1886642759, 1884777407, 1882906344,
+ 1881029585, 1879147141, 1877259027, 1875365256, 1873465840, 1871560793,
+ 1869650129, 1867733861, 1865812002, 1863884566, 1861951567, 1860013017,
+ 1858068931, 1856119322, 1854164203, 1852203589, 1850237494, 1848265930,
+ 1846288912, 1844306454, 1842318569, 1840325271, 1838326575, 1836322493,
+ 1834313041, 1832298233, 1830278082, 1828252602, 1826221808, 1824185713,
+ 1822144333, 1820097680, 1818045771, 1815988618, 1813926236, 1811858639,
+ 1809785843, 1807707860, 1805624707, 1803536397, 1801442945, 1799344365,
+ 1797240672, 1795131880, 1793018005, 1790899061, 1788775063, 1786646024,
+ 1784511962, 1782372889, 1780228821, 1778079773, 1775925759, 1773766795,
+ 1771602895, 1769434075, 1767260350, 1765081734, 1762898243, 1760709892,
+ 1758516695, 1756318669, 1754115828, 1751908188, 1749695763, 1747478570,
+ 1745256623, 1743029938, 1740798529, 1738562414, 1736321606, 1734076122,
+ 1731825977, 1729571186, 1727311765, 1725047729, 1722779095, 1720505877,
+ 1718228092, 1715945755, 1713658881, 1711367487, 1709071589, 1706771201,
+ 1704466340, 1702157021, 1699843261, 1697525076, 1695202481, 1692875492,
+ 1690544125, 1688208396, 1685868321, 1683523917, 1681175198, 1678822182,
+ 1676464885, 1674103322, 1671737510, 1669367464, 1666993202, 1664614738,
+ 1662232091, 1659845275, 1657454307, 1655059203, 1652659981, 1650256655,
+ 1647849243, 1645437761, 1643022225, 1640602651, 1638179057, 1635751459,
+ 1633319872, 1630884315, 1628444803, 1626001352, 1623553980, 1621102703,
+ 1618647538, 1616188502, 1613725610, 1611258880, 1608788328, 1606313972,
+ 1603835828, 1601353912, 1598868242, 1596378834, 1593885705, 1591388873,
+ 1588888353, 1586384163, 1583876320, 1581364840, 1578849741, 1576331039,
+ 1573808752, 1571282897, 1568753490, 1566220548, 1563684089, 1561144130,
+ 1558600688, 1556053779, 1553503421, 1550949632, 1548392428, 1545831826,
+ 1543267843, 1540700498, 1538129807, 1535555786, 1532978455, 1530397829,
+ 1527813926, 1525226763, 1522636358, 1520042728, 1517445890, 1514845862,
+ 1512242661, 1509636304, 1507026808, 1504414192, 1501798473, 1499179667,
+ 1496557793, 1493932868, 1491304909, 1488673934, 1486039961, 1483403006,
+ 1480763087, 1478120223, 1475474430, 1472825725, 1470174128, 1467519654,
+ 1464862322, 1462202150, 1459539154, 1456873353, 1454204764, 1451533405,
+ 1448859293, 1446182447, 1443502883, 1440820620, 1438135675, 1435448066,
+ 1432757810, 1430064926, 1427369431, 1424671342, 1421970678, 1419267457,
+ 1416561695, 1413853411, 1411142623, 1408429348, 1405713605, 1402995410,
+ 1400274782, 1397551739, 1394826298, 1392098478, 1389368295, 1386635769,
+ 1383900917, 1381163756, 1378424304, 1375682580, 1372938602, 1370192386,
+ 1367443952, 1364693317, 1361940498, 1359185514, 1356428383, 1353669123,
+ 1350907751, 1348144285, 1345378744, 1342611145, 1339841507, 1337069847,
+ 1334296182, 1331520532, 1328742914, 1325963346, 1323181846, 1320398431,
+ 1317613121, 1314825932, 1312036883, 1309245992, 1306453277, 1303658756,
+ 1300862446, 1298064366, 1295264533, 1292462966, 1289659683, 1286854702,
+ 1284048040, 1281239715, 1278429747, 1275618151, 1272804948, 1269990154,
+ 1267173787, 1264355866, 1261536408, 1258715432, 1255892955, 1253068996,
+ 1250243573, 1247416702, 1244588403, 1241758694, 1238927592, 1236095115,
+ 1233261281, 1230426109, 1227589616, 1224751821, 1221912740, 1219072393,
+ 1216230797, 1213387970, 1210543930, 1207698695, 1204852283, 1202004711,
+ 1199155999, 1196306164, 1193455223, 1190603194, 1187750097, 1184895947,
+ 1182040765, 1179184566, 1176327370, 1173469194, 1170610055, 1167749973,
+ 1164888964, 1162027048, 1159164240, 1156300560, 1153436026, 1150570654,
+ 1147704463, 1144837472, 1141969696, 1139101156, 1136231867, 1133361849,
+ 1130491119, 1127619694, 1124747593, 1121874833, 1119001432, 1116127408,
+ 1113252778, 1110377561, 1107501774, 1104625435, 1101748561, 1098871171,
+ 1095993281, 1093114911, 1090236076, 1087356796, 1084477087, 1081596968,
+ 1078716455, 1075835567, 1072954322, 1070072736, 1067190828, 1064308615,
+ 1061426114, 1058543344, 1055660322, 1052777065, 1049893591, 1047009917,
+ 1044126061, 1041242041, 1038357874, 1035473577, 1032589168, 1029704664,
+ 1026820083, 1023935442, 1021050759, 1018166051, 1015281336, 1012396630,
+ 1009511951, 1006627317, 1003742745, 1000858252, 997973855, 995089573,
+ 992205421, 989321418, 986437580, 983553925, 980670470, 977787232,
+ 974904229, 972021477, 969138994, 966256797, 963374903, 960493330,
+ 957612093, 954731211, 951850700, 948970578, 946090861, 943211567,
+ 940332712, 937454313, 934576388, 931698954, 928822026, 925945623,
+ 923069761, 920194457, 917319728, 914445591, 911572062, 908699158,
+ 905826897, 902955294, 900084367, 897214133, 894344607, 891475807,
+ 888607750, 885740451, 882873929, 880008198, 877143277, 874279181,
+ 871415927, 868553531, 865692011, 862831382, 859971661, 857112865,
+ 854255009, 851398111, 848542187, 845687253, 842833325, 839980420,
+ 837128554, 834277743, 831428004, 828579352, 825731805, 822885378,
+ 820040087, 817195949, 814352979, 811511195, 808670611, 805831244,
+ 802993110, 800156225, 797320604, 794486265, 791653222, 788821493,
+ 785991092, 783162035, 780334339, 777508018, 774683090, 771859570,
+ 769037473, 766216815, 763397612, 760579880, 757763634, 754948889,
+ 752135662, 749323968, 746513823, 743705242, 740898240, 738092833,
+ 735289037, 732486866, 729686337, 726887464, 724090264, 721294750,
+ 718500939, 715708846, 712918486, 710129874, 707343026, 704557956,
+ 701774680, 698993212, 696213569, 693435764, 690659813, 687885731,
+ 685113533, 682343233, 679574848, 676808390, 674043876, 671281320,
+ 668520737, 665762142, 663005549, 660250974, 657498430, 654747932,
+ 651999496, 649253135, 646508864, 643766698, 641026651, 638288737,
+ 635552972, 632819369, 630087943, 627358708, 624631679, 621906869,
+ 619184293, 616463966, 613745901, 611030112, 608316615, 605605421,
+ 602896547, 600190006, 597485811, 594783978, 592084519, 589387448,
+ 586692781, 584000529, 581310708, 578623331, 575938412, 573255964,
+ 570576001, 567898537, 565223585, 562551159, 559881273, 557213939,
+ 554549173, 551886986, 549227393, 546570406, 543916039, 541264306,
+ 538615220, 535968794, 533325040, 530683974, 528045606, 525409952,
+ 522777023, 520146833, 517519395, 514894721, 512272825, 509653720,
+ 507037418, 504423933, 501813277, 499205463, 496600503, 493998411,
+ 491399199, 488802879, 486209465, 483618969, 481031403, 478446779,
+ 475865112, 473286412, 470710692, 468137964, 465568241, 463001536,
+ 460437859, 457877224, 455319643, 452765128, 450213690, 447665343,
+ 445120097, 442577966, 440038960, 437503092, 434970374, 432440818,
+ 429914435, 427391237, 424871236, 422354443, 419840871, 417330530,
+ 414823433, 412319591, 409819016, 407321718, 404827710, 402337002,
+ 399849607, 397365535, 394884798, 392407406, 389933372, 387462707,
+ 384995420, 382531525, 380071030, 377613949, 375160291, 372710068,
+ 370263290, 367819968, 365380114, 362943737, 360510849, 358081460,
+ 355655582, 353233224, 350814397, 348399112, 345987380, 343579210,
+ 341174613, 338773600, 336376181, 333982366, 331592166, 329205590,
+ 326822650, 324443354, 322067714, 319695739, 317327440, 314962825,
+ 312601907, 310244693, 307891194, 305541421, 303195382, 300853087,
+ 298514547, 296179771, 293848768, 291521549, 289198122, 286878497,
+ 284562684, 282250692, 279942530, 277638209, 275337736, 273041122,
+ 270748376, 268459506, 266174523, 263893434, 261616250, 259342979,
+ 257073630, 254808213, 252546735, 250289207, 248035636, 245786031,
+ 243540402, 241298757, 239061104, 236827453, 234597811, 232372188,
+ 230150591, 227933030, 225719513, 223510047, 221304642, 219103306,
+ 216906046, 214712872, 212523791, 210338811, 208157941, 205981188,
+ 203808560, 201640066, 199475714, 197315510, 195159464, 193007582,
+ 190859873, 188716344, 186577003, 184441857, 182310915, 180184183,
+ 178061669, 175943381, 173829326, 171719511, 169613943, 167512631,
+ 165415580, 163322799, 161234294, 159150073, 157070143, 154994510,
+ 152923182, 150856165, 148793467, 146735094, 144681053, 142631351,
+ 140585995, 138544991, 136508346, 134476066, 132448159, 130424630,
+ 128405486, 126390734, 124380379, 122374429, 120372889, 118375765,
+ 116383065, 114394794, 112410958, 110431564, 108456616, 106486122,
+ 104520088, 102558519, 100601420, 98648799, 96700660, 94757010,
+ 92817854, 90883198, 88953047, 87027407, 85106284, 83189683, 81277609,
+ 79370067, 77467064, 75568605, 73674694, 71785337, 69900540, 68020306,
+ 66144642, 64273553, 62407042, 60545117, 58687780, 56835038, 54986895,
+ 53143356, 51304425, 49470108, 47640409, 45815332, 43994882, 42179065,
+ 40367883, 38561342, 36759446, 34962200, 33169607, 31381673, 29598400,
+ 27819794, 26045859, 24276599, 22512017, 20752118, 18996906, 17246385,
+ 15500559, 13759430, 12023005, 10291285, 8564275, 6841978, 5124399,
+ 3411540, 1703406, 0, -1698675, -3392616, -5081818, -6766279, -8445996,
+ -10120965, -11791182, -13456645, -15117351, -16773296, -18424478,
+ -20070893, -21712538, -23349412, -24981509, -26608829, -28231368,
+ -29849123, -31462091, -33070271, -34673659, -36272253, -37866049,
+ -39455047, -41039243, -42618635, -44193220, -45762997, -47327963,
+ -48888115, -50443451, -51993970, -53539670, -55080547, -56616601,
+ -58147828, -59674228, -61195798, -62712537, -64224442, -65731512,
+ -67233745, -68731139, -70223693, -71711406, -73194275, -74672298,
+ -76145476, -77613805, -79077286, -80535915, -81989693, -83438617,
+ -84882687, -86321901, -87756259, -89185758, -90610398, -92030179,
+ -93445098, -94855155, -96260349, -97660680, -99056145, -100446746,
+ -101832480, -103213348, -104589347, -105960479, -107326742, -108688136,
+ -110044660, -111396314, -112743097, -114085009, -115422050, -116754219,
+ -118081516, -119403941, -120721494, -122034174, -123341982, -124644917,
+ -125942979, -127236169, -128524486, -129807931, -131086504, -132360204,
+ -133629032, -134892989, -136152075, -137406289, -138655633, -139900107,
+ -141139711, -142374446, -143604312, -144829310, -146049440, -147264703,
+ -148475101, -149680633, -150881300, -152077104, -153268044, -154454122,
+ -155635339, -156811696, -157983194, -159149834, -160311616, -161468543,
+ -162620615, -163767833, -164910199, -166047713, -167180378, -168308195,
+ -169431164, -170549288, -171662568, -172771005, -173874601, -174973358,
+ -176067277, -177156359, -178240607, -179320022, -180394606, -181464360,
+ -182529288, -183589390, -184644668, -185695124, -186740761, -187781580,
+ -188817584, -189848774, -190875153, -191896723, -192913485, -193925443,
+ -194932599, -195934954, -196932512, -197925275, -198913244, -199896423,
+ -200874814, -201848420, -202817243, -203781286, -204740551, -205695041,
+ -206644759, -207589708, -208529890, -209465308, -210395966, -211321865,
+ -212243009, -213159401, -214071044, -214977941, -215880095, -216777509,
+ -217670186, -218558130, -219441343, -220319829, -221193591, -222062633,
+ -222926958, -223786568, -224641469, -225491662, -226337152, -227177942,
+ -228014036, -228845437, -229672148, -230494175, -231311519, -232124185,
+ -232932177, -233735499, -234534154, -235328146, -236117479, -236902156,
+ -237682183, -238457563, -239228300, -239994397, -240755860, -241512692,
+ -242264897, -243012480, -243755445, -244493795, -245227536, -245956672,
+ -246681206, -247401144, -248116489, -248827247, -249533421, -250235017,
+ -250932038, -251624490, -252312376, -252995702, -253674472, -254348691,
+ -255018363, -255683494, -256344088, -257000149, -257651684, -258298696,
+ -258941191, -259579173, -260212648, -260841621, -261466096, -262086078,
+ -262701573, -263312586, -263919122, -264521186, -265118783, -265711919,
+ -266300599, -266884827, -267464611, -268039954, -268610862, -269177341,
+ -269739396, -270297032, -270850256, -271399072, -271943486, -272483504,
+ -273019132, -273550374, -274077237, -274599726, -275117847, -275631606,
+ -276141009, -276646061, -277146768, -277643137, -278135172, -278622881,
+ -279106268, -279585340, -280060103, -280530563, -280996726, -281458597,
+ -281916184, -282369493, -282818528, -283263297, -283703807, -284140062,
+ -284572069, -284999835, -285423367, -285842669, -286257749, -286668613,
+ -287075268, -287477719, -287875974, -288270039, -288659921, -289045625,
+ -289427159, -289804529, -290177741, -290546803, -290911722, -291272503,
+ -291629153, -291981680, -292330090, -292674389, -293014586, -293350685,
+ -293682695, -294010623, -294334474, -294654256, -294969977, -295281642,
+ -295589260, -295892836, -296192379, -296487894, -296779390, -297066874,
+ -297350352, -297629831, -297905320, -298176824, -298444352, -298707910,
+ -298967507, -299223148, -299474842, -299722595, -299966416, -300206311,
+ -300442288, -300674355, -300902518, -301126786, -301347165, -301563664,
+ -301776289, -301985049, -302189950, -302391001, -302588210, -302781583,
+ -302971128, -303156854, -303338767, -303516876, -303691188, -303861711,
+ -304028452, -304191420, -304350623, -304506068, -304657762, -304805715,
+ -304949933, -305090425, -305227198, -305360261, -305489622, -305615288,
+ -305737267, -305855568, -305970198, -306081166, -306188479, -306292147,
+ -306392175, -306488574, -306581351, -306670514, -306756072, -306838032,
+ -306916403, -306991193, -307062410, -307130062, -307194158, -307254707,
+ -307311715, -307365193, -307415147, -307461587, -307504521, -307543956,
+ -307579902, -307612367, -307641360, -307666888, -307688961, -307707586,
+ -307722773, -307734529, -307742864, -307747785, -307749302, -307747423,
+ -307742156, -307733510, -307721495, -307706117, -307687386, -307665312,
+ -307639901, -307611163, -307579107, -307543742, -307505075, -307463117,
+ -307417875, -307369358, -307317575, -307262536, -307204248, -307142720,
+ -307077962, -307009982, -306938789, -306864392, -306786799, -306706020,
+ -306622064, -306534939, -306444655, -306351219, -306254642, -306154932,
+ -306052098, -305946150, -305837095, -305724944, -305609704, -305491386,
+ -305369998, -305245549, -305118048, -304987505, -304853928, -304717326,
+ -304577709, -304435086, -304289465, -304140856, -303989268, -303834711,
+ -303677192, -303516723, -303353310, -303186965, -303017695, -302845511,
+ -302670421, -302492435, -302311561, -302127809, -301941189, -301751709,
+ -301559379, -301364208, -301166206, -300965381, -300761742, -300555300,
+ -300346064, -300134042, -299919244, -299701680, -299481358, -299258288,
+ -299032480, -298803942, -298572685, -298338717, -298102048, -297862687,
+ -297620644, -297375927, -297128547, -296878513, -296625834, -296370519,
+ -296112579, -295852022, -295588858, -295323096, -295054745, -294783816,
+ -294510318, -294234259, -293955650, -293674500, -293390819, -293104615,
+ -292815899, -292524680, -292230967, -291934769, -291636098, -291334961,
+ -291031368, -290725329, -290416853, -290105951, -289792630, -289476902,
+ -289158775, -288838259, -288515363, -288190097, -287862471, -287532494,
+ -287200175, -286865524, -286528551, -286189266, -285847677, -285503794,
+ -285157627, -284809186, -284458480, -284105518, -283750310, -283392865,
+ -283033194, -282671306, -282307210, -281940916, -281572433, -281201771,
+ -280828940, -280453949, -280076808, -279697526, -279316112, -278932577,
+ -278546930, -278159181, -277769339, -277377413, -276983414, -276587351,
+ -276189232, -275789069, -275386871, -274982646, -274576405, -274168157,
+ -273757913, -273345680, -272931469, -272515290, -272097152, -271677064,
+ -271255037, -270831079, -270405201, -269977411, -269547720, -269116136,
+ -268682670, -268247331, -267810128, -267371072, -266930171, -266487435,
+ -266042874, -265596497, -265148314, -264698334, -264246567, -263793022,
+ -263337709, -262880637, -262421817, -261961256, -261498965, -261034953,
+ -260569231, -260101806, -259632689, -259161890, -258689417, -258215281,
+ -257739490, -257262054, -256782983, -256302286, -255819972, -255336052,
+ -254850533, -254363427, -253874742, -253384487, -252892673, -252399308,
+ -251904402, -251407964, -250910005, -250410532, -249909556, -249407085,
+ -248903130, -248397700, -247890803, -247382450, -246872650, -246361411,
+ -245848744, -245334658, -244819162, -244302265, -243783977, -243264307,
+ -242743265, -242220859, -241697098, -241171993, -240645553, -240117786,
+ -239588702, -239058310, -238526620, -237993640, -237459380, -236923850,
+ -236387058, -235849013, -235309725, -234769203, -234227456, -233684493,
+ -233140324, -232594958, -232048403, -231500669, -230951765, -230401700,
+ -229850484, -229298125, -228744632, -228190015, -227634282, -227077443,
+ -226519507, -225960482, -225400379, -224839205, -224276970, -223713683,
+ -223149353, -222583989, -222017599, -221450194, -220881781, -220312370,
+ -219741969, -219170588, -218598236, -218024921, -217450653, -216875439,
+ -216299290, -215722214, -215144219, -214565315, -213985511, -213404815,
+ -212823236, -212240783, -211657465, -211073290, -210488268, -209902407,
+ -209315715, -208728202, -208139876, -207550746, -206960821, -206370109,
+ -205778619, -205186360, -204593340, -203999568, -203405053, -202809803,
+ -202213826, -201617132, -201019730, -200421626, -199822831, -199223352,
+ -198623199, -198022379, -197420901, -196818774, -196216006, -195612606,
+ -195008582, -194403942, -193798696, -193192850, -192586415, -191979397,
+ -191371806, -190763650, -190154937, -189545675, -188935874, -188325540,
+ -187714683, -187103311, -186491431, -185879053, -185266184, -184652833,
+ -184039008, -183424717, -182809968, -182194769, -181579129, -180963056,
+ -180346558, -179729642, -179112317, -178494592, -177876473, -177257970,
+ -176639090, -176019841, -175400231, -174780269, -174159962, -173539318,
+ -172918344, -172297050, -171675443, -171053531, -170431321, -169808822,
+ -169186041, -168562986, -167939666, -167316087, -166692258, -166068186,
+ -165443880, -164819346, -164194593, -163569628, -162944459, -162319094,
+ -161693540, -161067806, -160441897, -159815823, -159189591, -158563208,
+ -157936682, -157310021, -156683231, -156056321, -155429298, -154802170,
+ -154174943, -153547626, -152920226, -152292749, -151665205, -151037599,
+ -150409940, -149782234, -149154490, -148526714, -147898913, -147271095,
+ -146643268, -146015437, -145387612, -144759798, -144132003, -143504234,
+ -142876499, -142248804, -141621156, -140993563, -140366032, -139738570,
+ -139111183, -138483880, -137856666, -137229549, -136602536, -135975634,
+ -135348849, -134722189, -134095661, -133469271, -132843027, -132216934,
+ -131591001, -130965233, -130339638, -129714222, -129088992, -128463956,
+ -127839118, -127214487, -126590069, -125965871, -125341898, -124718159,
+ -124094659, -123471405, -122848404, -122225662, -121603186, -120980982,
+ -120359056, -119737416, -119116068, -118495017, -117874272, -117253837,
+ -116633719, -116013925, -115394461, -114775333, -114156548, -113538112,
+ -112920031, -112302311, -111684959, -111067981, -110451383, -109835171,
+ -109219352, -108603931, -107988915, -107374309, -106760120, -106146354,
+ -105533016, -104920114, -104307652, -103695637, -103084075, -102472972,
+ -101862333, -101252165, -100642473, -100033264, -99424542, -98816315,
+ -98208587, -97601364, -96994653, -96388459, -95782787, -95177644,
+ -94573035, -93968965, -93365441, -92762468, -92160052, -91558197,
+ -90956910, -90356197, -89756062, -89156511, -88557550, -87959184,
+ -87361419, -86764260, -86167712, -85571781, -84976472, -84381790,
+ -83787742, -83194331, -82601564, -82009445, -81417980, -80827174,
+ -80237032, -79647560, -79058762, -78470644, -77883210, -77296467,
+ -76710418, -76125070, -75540426, -74956492, -74373274, -73790775,
+ -73209001, -72627957, -72047648, -71468078, -70889253, -70311177,
+ -69733855, -69157292, -68581493, -68006463, -67432205, -66858726,
+ -66286029, -65714119, -65143001, -64572680, -64003160, -63434446,
+ -62866543, -62299454, -61733184, -61167739, -60603122, -60039338,
+ -59476391, -58914286, -58353027, -57792619, -57233065, -56674371,
+ -56116541, -55559578, -55003488, -54448274, -53893941, -53340493,
+ -52787933, -52236267, -51685499, -51135632, -50586671, -50038619,
+ -49491481, -48945262, -48399964, -47855592, -47312150, -46769642,
+ -46228072, -45687443, -45147760, -44609027, -44071247, -43534425,
+ -42998563, -42463667, -41929739, -41396783, -40864804, -40333804,
+ -39803789, -39274760, -38746722, -38219679, -37693634, -37168591,
+ -36644553, -36121524, -35599508, -35078507, -34558526, -34039568,
+ -33521636, -33004733, -32488864, -31974032, -31460239, -30947490,
+ -30435787, -29925134, -29415534, -28906991, -28399507, -27893087,
+ -27387732, -26883447, -26380234, -25878096, -25377038, -24877061,
+ -24378168, -23880364, -23383651, -22888032, -22393509, -21900087,
+ -21407767, -20916554, -20426448, -19937455, -19449576, -18962814,
+ -18477173, -17992654, -17509261, -17026997, -16545864, -16065865,
+ -15587003, -15109280, -14632699, -14157263, -13682974, -13209835,
+ -12737848, -12267017, -11797343, -11328829, -10861478, -10395292,
+ -9930274, -9466426, -9003750, -8542249, -8081925, -7622781, -7164819,
+ -6708041, -6252449, -5798047, -5344835, -4892817, -4441994, -3992370,
+ -3543945, -3096722, -2650704, -2205891, -1762288, -1319895, -878714,
+ -438749, 0, 437530, 873840, 1308927, 1742789, 2175425, 2606833,
+ 3037010, 3465955, 3893666, 4320142, 4745379, 5169378, 5592135, 6013649,
+ 6433918, 6852941, 7270716, 7687241, 8102515, 8516536, 8929302, 9340812,
+ 9751064, 10160057, 10567789, 10974259, 11379464, 11783404, 12186078,
+ 12587483, 12987618, 13386483, 13784074, 14180392, 14575435, 14969201,
+ 15361690, 15752899, 16142828, 16531475, 16918840, 17304920, 17689715,
+ 18073224, 18455445, 18836377, 19216020, 19594371, 19971430, 20347197,
+ 20721669, 21094846, 21466726, 21837310, 22206595, 22574582, 22941268,
+ 23306653, 23670736, 24033517, 24394994, 24755167, 25114034, 25471595,
+ 25827849, 26182796, 26536434, 26888763, 27239783, 27589491, 27937889,
+ 28284974, 28630747, 28975207, 29318353, 29660185, 30000701, 30339903,
+ 30677788, 31014356, 31349607, 31683541, 32016157, 32347454, 32677432,
+ 33006091, 33333430, 33659449, 33984147, 34307525, 34629581, 34950316,
+ 35269729, 35587820, 35904588, 36220034, 36534157, 36846957, 37158433,
+ 37468587, 37777416, 38084922, 38391104, 38695962, 38999496, 39301705,
+ 39602591, 39902152, 40200388, 40497301, 40792889, 41087152, 41380092,
+ 41671707, 41961998, 42250965, 42538608, 42824927, 43109922, 43393594,
+ 43675942, 43956967, 44236669, 44515048, 44792105, 45067839, 45342251,
+ 45615341, 45887110, 46157557, 46426683, 46694489, 46960975, 47226140,
+ 47489986, 47752513, 48013722, 48273612, 48532184, 48789439, 49045377,
+ 49299999, 49553305, 49805295, 50055970, 50305332, 50553379, 50800114,
+ 51045536, 51289646, 51532444, 51773932, 52014110, 52252979, 52490538,
+ 52726790, 52961735, 53195373, 53427705, 53658733, 53888456, 54116875,
+ 54343992, 54569807, 54794321, 55017534, 55239448, 55460064, 55679382,
+ 55897404, 56114129, 56329560, 56543697, 56756540, 56968092, 57178353,
+ 57387323, 57595005, 57801398, 58006505, 58210325, 58412861, 58614112,
+ 58814081, 59012769, 59210175, 59406303, 59601152, 59794724, 59987020,
+ 60178041, 60367788, 60556263, 60743467, 60929401, 61114067, 61297465,
+ 61479596, 61660463, 61840066, 62018407, 62195487, 62371307, 62545869,
+ 62719173, 62891223, 63062018, 63231560, 63399850, 63566891, 63732683,
+ 63897228, 64060527, 64222582, 64383394, 64542965, 64701296, 64858389,
+ 65014245, 65168865, 65322252, 65474407, 65625332, 65775027, 65923495,
+ 66070737, 66216755, 66361550, 66505125, 66647480, 66788617, 66928539,
+ 67067246, 67204741, 67341025, 67476099, 67609966, 67742628, 67874085,
+ 68004340, 68133395, 68261251, 68387910, 68513374, 68637645, 68760724,
+ 68882614, 69003315, 69122831, 69241163, 69358312, 69474281, 69589071,
+ 69702685, 69815124, 69926391, 70036486, 70145413, 70253173, 70359767,
+ 70465199, 70569470, 70672581, 70774536, 70875335, 70974982, 71073477,
+ 71170823, 71267022, 71362077, 71455988, 71548759, 71640391, 71730886,
+ 71820247, 71908476, 71995574, 72081544, 72166387, 72250107, 72332705,
+ 72414184, 72494545, 72573791, 72651923, 72728945, 72804858, 72879664,
+ 72953367, 73025967, 73097467, 73167870, 73237177, 73305391, 73372514,
+ 73438549, 73503498, 73567362, 73630145, 73691848, 73752475, 73812026,
+ 73870505, 73927914, 73984255, 74039531, 74093744, 74146896, 74198989,
+ 74250027, 74300011, 74348944, 74396828, 74443665, 74489459, 74534211,
+ 74577924, 74620600, 74662242, 74702852, 74742433, 74780986, 74818516,
+ 74855023, 74890511, 74924982, 74958438, 74990882, 75022317, 75052745,
+ 75082168, 75110589, 75138011, 75164436, 75189867, 75214305, 75237755,
+ 75260217, 75281696, 75302193, 75321711, 75340253, 75357820, 75374417,
+ 75390045, 75404706, 75418405, 75431142, 75442921, 75453745, 75463616,
+ 75472536, 75480509, 75487537, 75493622, 75498768, 75502977, 75506251,
+ 75508593, 75510007, 75510494, 75510057, 75508699, 75506423, 75503232,
+ 75499127, 75494112, 75488190, 75481363, 75473634, 75465006, 75455481,
+ 75445062, 75433752, 75421553, 75408469, 75394502, 75379655, 75363931,
+ 75347332, 75329861, 75311521, 75292314, 75272244, 75251313, 75229525,
+ 75206881, 75183384, 75159038, 75133846, 75107809, 75080931, 75053214,
+ 75024662, 74995277, 74965062, 74934020, 74902154, 74869466, 74835960,
+ 74801637, 74766502, 74730556, 74693804, 74656246, 74617887, 74578729,
+ 74538775, 74498028, 74456491, 74414167, 74371058, 74327167, 74282497,
+ 74237052, 74190833, 74143844, 74096088, 74047568, 73998286, 73948245,
+ 73897448, 73845899, 73793599, 73740553, 73686762, 73632229, 73576958,
+ 73520952, 73464213, 73406744, 73348548, 73289628, 73229987, 73169628,
+ 73108554, 73046767, 72984271, 72921068, 72857162, 72792555, 72727250,
+ 72661250, 72594558, 72527177, 72459110, 72390359, 72320929, 72250821,
+ 72180038, 72108584, 72036461, 71963672, 71890221, 71816110, 71741341,
+ 71665919, 71589846, 71513124, 71435757, 71357748, 71279099, 71199814,
+ 71119895, 71039346, 70958169, 70876367, 70793944, 70710901, 70627242,
+ 70542971, 70458089, 70372600, 70286506, 70199812, 70112519, 70024630,
+ 69936149, 69847078, 69757420, 69667179, 69576356, 69484956, 69392980,
+ 69300433, 69207316, 69113633, 69019387, 68924580, 68829215, 68733296,
+ 68636826, 68539806, 68442241, 68344132, 68245484, 68146299, 68046579,
+ 67946328, 67845548, 67744244, 67642416, 67540069, 67437205, 67333827,
+ 67229938, 67125541, 67020639, 66915235, 66809331, 66702931, 66596037,
+ 66488653, 66380781, 66272423, 66163584, 66054265, 65944471, 65834202,
+ 65723464, 65612257, 65500586, 65388453, 65275861, 65162813, 65049311,
+ 64935359, 64820960, 64706115, 64590829, 64475104, 64358943, 64242348,
+ 64125323, 64007870, 63889993, 63771693, 63652975, 63533840, 63414292,
+ 63294333, 63173967, 63053195, 62932022, 62810449, 62688480, 62566117,
+ 62443363, 62320221, 62196694, 62072785, 61948496, 61823830, 61698790,
+ 61573379, 61447599, 61321454, 61194946, 61068078, 60940852, 60813272,
+ 60685340, 60557059, 60428432, 60299461, 60170150, 60040500, 59910516,
+ 59780199, 59649552, 59518578, 59387280, 59255660, 59123722, 58991468,
+ 58858900, 58726021, 58592835, 58459343, 58325549, 58191455, 58057064,
+ 57922379, 57787402, 57652136, 57516584, 57380747, 57244630, 57108235,
+ 56971564, 56834620, 56697406, 56559924, 56422177, 56284168, 56145899,
+ 56007373, 55868593, 55729560, 55590279, 55450751, 55310979, 55170966,
+ 55030714, 54890226, 54749505, 54608552, 54467372, 54325965, 54184336,
+ 54042486, 53900418, 53758134, 53615638, 53472931, 53330017, 53186898,
+ 53043576, 52900054, 52756334, 52612419, 52468312, 52324015, 52179531,
+ 52034861, 51890009, 51744978, 51599768, 51454384, 51308828, 51163101,
+ 51017207, 50871148, 50724927, 50578546, 50432007, 50285312, 50138465,
+ 49991468, 49844323, 49697033, 49549600, 49402026, 49254314, 49106467,
+ 48958486, 48810374, 48662134, 48513768, 48365278, 48216667, 48067936,
+ 47919090, 47770129, 47621056, 47471874, 47322584, 47173190, 47023693,
+ 46874096, 46724402, 46574611, 46424728, 46274754, 46124691, 45974542,
+ 45824309, 45673995, 45523601, 45373130, 45222584, 45071965, 44921276,
+ 44770520, 44619697, 44468811, 44317863, 44166856, 44015793, 43864674,
+ 43713504, 43562283, 43411013, 43259699, 43108340, 42956940, 42805501,
+ 42654024, 42502513, 42350969, 42199394, 42047790, 41896161, 41744507,
+ 41592831, 41441135, 41289421, 41137691, 40985948, 40834193, 40682429,
+ 40530657, 40378880, 40227100, 40075319, 39923538, 39771761, 39619988,
+ 39468223, 39316467, 39164722, 39012990, 38861273, 38709574, 38557893,
+ 38406234, 38254598, 38102987, 37951404, 37799849, 37648326, 37496836,
+ 37345380, 37193962, 37042582, 36891244, 36739948, 36588696, 36437492,
+ 36286336, 36135230, 35984177, 35833177, 35682234, 35531349, 35380524,
+ 35229760, 35079060, 34928426, 34777858, 34627360, 34476933, 34326578,
+ 34176298, 34026094, 33875969, 33725923, 33575960, 33426079, 33276285,
+ 33126577, 32976958, 32827430, 32677994, 32528652, 32379407, 32230258,
+ 32081209, 31932262, 31783417, 31634676, 31486042, 31337515, 31189098,
+ 31040792, 30892599, 30744521, 30596559, 30448715, 30300990, 30153386,
+ 30005906, 29858549, 29711319, 29564216, 29417243, 29270400, 29123690,
+ 28977114, 28830674, 28684370, 28538206, 28392181, 28246299, 28100560,
+ 27954966, 27809518, 27664219, 27519068, 27374069, 27229223, 27084530,
+ 26939993, 26795613, 26651391, 26507329, 26363429, 26219691, 26076118,
+ 25932711, 25789470, 25646399, 25503497, 25360767, 25218209, 25075826,
+ 24933619, 24791588, 24649736, 24508064, 24366573, 24225264, 24084139,
+ 23943200, 23802447, 23661882, 23521506, 23381320, 23241327, 23101526,
+ 22961920, 22822510, 22683297, 22544282, 22405467, 22266852, 22128440,
+ 21990231, 21852227, 21714428, 21576836, 21439453, 21302279, 21165316,
+ 21028565, 20892027, 20755703, 20619595, 20483703, 20348030, 20212575,
+ 20077340, 19942327, 19807536, 19672969, 19538626, 19404509, 19270619,
+ 19136957, 19003525, 18870322, 18737351, 18604612, 18472107, 18339837,
+ 18207802, 18076003, 17944443, 17813121, 17682039, 17551197, 17420598,
+ 17290241, 17160128, 17030261, 16900639, 16771263, 16642136, 16513258,
+ 16384629, 16256251, 16128124, 16000251, 15872631, 15745265, 15618155,
+ 15491301, 15364704, 15238366, 15112286, 14986467, 14860908, 14735612,
+ 14610577, 14485807, 14361300, 14237059, 14113084, 13989376, 13865935,
+ 13742763, 13619860, 13497228, 13374866, 13252777, 13130960, 13009416,
+ 12888146, 12767152, 12646433, 12525990, 12405825, 12285938, 12166329,
+ 12047000, 11927952, 11809184, 11690697, 11572493, 11454572, 11336935,
+ 11219583, 11102515, 10985733, 10869238, 10753030, 10637109, 10521477,
+ 10406135, 10291082, 10176319, 10061847, 9947667, 9833780, 9720185,
+ 9606883, 9493876, 9381163, 9268746, 9156625, 9044799, 8933271, 8822040,
+ 8711108, 8600474, 8490139, 8380104, 8270369, 8160935, 8051802, 7942971,
+ 7834442, 7726217, 7618294, 7510675, 7403360, 7296351, 7189646, 7083247,
+ 6977154, 6871368, 6765888, 6660716, 6555852, 6451297, 6347050, 6243112,
+ 6139484, 6036166, 5933158, 5830461, 5728075, 5626000, 5524237, 5422787,
+ 5321649, 5220825, 5120313, 5020116, 4920232, 4820662, 4721408, 4622468,
+ 4523844, 4425535, 4327542, 4229866, 4132505, 4035462, 3938736, 3842327,
+ 3746236, 3650463, 3555008, 3459871, 3365053, 3270554, 3176374, 3082513,
+ 2988972, 2895751, 2802850, 2710269, 2618009, 2526069, 2434450, 2343152,
+ 2252175, 2161520, 2071186, 1981174, 1891484, 1802116, 1713070, 1624347,
+ 1535946, 1447867, 1360112, 1272679, 1185569, 1098782, 1012319, 926179,
+ 840362, 754868, 669699, 584853, 500331, 416132, 332258, 248707, 165480,
+ 82578, 0, -82254, -164184, -245790, -327071, -408029, -488662, -568970,
+ -648955, -728615, -807951, -886963, -965650, -1044013, -1122052,
+ -1199766, -1277157, -1354223, -1430965, -1507383, -1583477, -1659247,
+ -1734694, -1809816, -1884615, -1959090, -2033241, -2107069, -2180573,
+ -2253755, -2326612, -2399147, -2471359, -2543248, -2614814, -2686057,
+ -2756978, -2827576, -2897852, -2967806, -3037438, -3106748, -3175736,
+ -3244403, -3312749, -3380773, -3448476, -3515858, -3582919, -3649660,
+ -3716081, -3782181, -3847962, -3913423, -3978564, -4043386, -4107888,
+ -4172072, -4235937, -4299484, -4362712, -4425622, -4488215, -4550490,
+ -4612447, -4674088, -4735412, -4796419, -4857110, -4917485, -4977544,
+ -5037288, -5096717, -5155830, -5214629, -5273114, -5331285, -5389142,
+ -5446685, -5503915, -5560832, -5617437, -5673730, -5729711, -5785380,
+ -5840737, -5895784, -5950521, -6004947, -6059063, -6112869, -6166367,
+ -6219555, -6272435, -6325007, -6377270, -6429227, -6480876, -6532219,
+ -6583255, -6633986, -6684410, -6734530, -6784345, -6833855, -6883062,
+ -6931964, -6980564, -7028861, -7076855, -7124548, -7171938, -7219028,
+ -7265817, -7312306, -7358495, -7404384, -7449974, -7495266, -7540260,
+ -7584956, -7629355, -7673457, -7717262, -7760772, -7803987, -7846906,
+ -7889531, -7931862, -7973899, -8015644, -8057095, -8098255, -8139123,
+ -8179700, -8219986, -8259982, -8299689, -8339106, -8378234, -8417075,
+ -8455627, -8493893, -8531872, -8569564, -8606972, -8644094, -8680931,
+ -8717485, -8753754, -8789741, -8825446, -8860868, -8896009, -8930870,
+ -8965450, -8999750, -9033771, -9067513, -9100978, -9134164, -9167074,
+ -9199707, -9232064, -9264146, -9295954, -9327487, -9358746, -9389733,
+ -9420447, -9450889, -9481060, -9510960, -9540590, -9569950, -9599042,
+ -9627865, -9656420, -9684708, -9712730, -9740485, -9767976, -9795201,
+ -9822162, -9848860, -9875295, -9901467, -9927378, -9953028, -9978417,
+ -10003546, -10028416, -10053027, -10077381, -10101477, -10125316,
+ -10148899, -10172227, -10195300, -10218118, -10240683, -10262996,
+ -10285055, -10306864, -10328421, -10349728, -10370785, -10391593,
+ -10412153, -10432465, -10452530, -10472349, -10491921, -10511249,
+ -10530332, -10549172, -10567768, -10586122, -10604234, -10622105,
+ -10639735, -10657126, -10674278, -10691191, -10707866, -10724305,
+ -10740507, -10756473, -10772204, -10787701, -10802964, -10817995,
+ -10832793, -10847359, -10861695, -10875800, -10889676, -10903323,
+ -10916742, -10929933, -10942897, -10955636, -10968149, -10980438,
+ -10992502, -11004344, -11015963, -11027360, -11038536, -11049491,
+ -11060227, -11070743, -11081042, -11091123, -11100987, -11110634,
+ -11120067, -11129284, -11138288, -11147078, -11155656, -11164022,
+ -11172176, -11180121, -11187855, -11195381, -11202698, -11209808,
+ -11216710, -11223407, -11229898, -11236185, -11242268, -11248148,
+ -11253825, -11259300, -11264574, -11269648, -11274523, -11279199,
+ -11283676, -11287956, -11292040, -11295928, -11299620, -11303118,
+ -11306422, -11309534, -11312453, -11315181, -11317717, -11320064,
+ -11322222, -11324191, -11325972, -11327566, -11328974, -11330196,
+ -11331233, -11332087, -11332756, -11333243, -11333549, -11333673,
+ -11333616, -11333380, -11332965, -11332372, -11331601, -11330654,
+ -11329531, -11328232, -11326759, -11325112, -11323292, -11321300,
+ -11319136, -11316802, -11314298, -11311624, -11308781, -11305771,
+ -11302594, -11299250, -11295741, -11292067, -11288229, -11284228,
+ -11280064, -11275738, -11271250, -11266603, -11261796, -11256830,
+ -11251705, -11246424, -11240985, -11235391, -11229642, -11223738,
+ -11217680, -11211469, -11205107, -11198592, -11191927, -11185112,
+ -11178147, -11171034, -11163774, -11156366, -11148811, -11141112,
+ -11133267, -11125278, -11117146, -11108871, -11100455, -11091897,
+ -11083198, -11074360, -11065383, -11056268, -11047015, -11037626,
+ -11028100, -11018440, -11008644, -10998715, -10988653, -10978458,
+ -10968131, -10957674, -10947087, -10936370, -10925524, -10914550,
+ -10903449, -10892221, -10880868, -10869389, -10857786, -10846060,
+ -10834210, -10822238, -10810145, -10797931, -10785597, -10773143,
+ -10760571, -10747881, -10735074, -10722150, -10709110, -10695956,
+ -10682687, -10669304, -10655809, -10642201, -10628482, -10614652,
+ -10600712, -10586662, -10572504, -10558238, -10543865, -10529385,
+ -10514799, -10500109, -10485313, -10470414, -10455412, -10440308,
+ -10425102, -10409794, -10394387, -10378880, -10363275, -10347571,
+ -10331769, -10315871, -10299877, -10283787, -10267603, -10251324,
+ -10234952, -10218488, -10201931, -10185284, -10168545, -10151717,
+ -10134799, -10117793, -10100699, -10083518, -10066250, -10048896,
+ -10031457, -10013933, -9996326, -9978635, -9960862, -9943007, -9925071,
+ -9907054, -9888957, -9870782, -9852527, -9834195, -9815785, -9797299,
+ -9778737, -9760100, -9741388, -9722602, -9703743, -9684811, -9665807,
+ -9646732, -9627586, -9608370, -9589084, -9569730, -9550308, -9530818,
+ -9511261, -9491638, -9471949, -9452196, -9432378, -9412496, -9392551,
+ -9372544, -9352475, -9332344, -9312154, -9291903, -9271593, -9251224,
+ -9230797, -9210312, -9189771, -9169174, -9148520, -9127812, -9107050,
+ -9086233, -9065363, -9044441, -9023467, -9002441, -8981365, -8960238,
+ -8939062, -8917837, -8896563, -8875242, -8853873, -8832458, -8810996,
+ -8789490, -8767938, -8746342, -8724702, -8703020, -8681294, -8659527,
+ -8637718, -8615869, -8593979, -8572050, -8550081, -8528074, -8506029,
+ -8483947, -8461827, -8439672, -8417481, -8395254, -8372993, -8350698,
+ -8328370, -8306008, -8283614, -8261189, -8238732, -8216244, -8193726,
+ -8171178, -8148602, -8125996, -8103363, -8080702, -8058014, -8035300,
+ -8012560, -7989794, -7967004, -7944189, -7921350, -7898488, -7875604,
+ -7852697, -7829768, -7806818, -7783848, -7760857, -7737847, -7714817,
+ -7691769, -7668702, -7645618, -7622517, -7599399, -7576265, -7553115,
+ -7529951, -7506771, -7483577, -7460370, -7437149, -7413916, -7390670,
+ -7367413, -7344144, -7320865, -7297575, -7274275, -7250966, -7227648,
+ -7204322, -7180988, -7157646, -7134297, -7110942, -7087580, -7064213,
+ -7040841, -7017464, -6994083, -6970697, -6947309, -6923917, -6900523,
+ -6877127, -6853730, -6830331, -6806931, -6783532, -6760132, -6736733,
+ -6713335, -6689938, -6666544, -6643151, -6619762, -6596375, -6572992,
+ -6549613, -6526239, -6502869, -6479504, -6456146, -6432793, -6409447,
+ -6386107, -6362775, -6339451, -6316134, -6292827, -6269528, -6246238,
+ -6222958, -6199688, -6176428, -6153180, -6129942, -6106717, -6083503,
+ -6060301, -6037113, -6013937, -5990775, -5967627, -5944493, -5921374,
+ -5898270, -5875181, -5852108, -5829050, -5806010, -5782986, -5759979,
+ -5736990, -5714019, -5691066, -5668131, -5645216, -5622320, -5599443,
+ -5576586, -5553750, -5530934, -5508139, -5485366, -5462614, -5439884,
+ -5417177, -5394492, -5371830, -5349191, -5326576, -5303985, -5281418,
+ -5258876, -5236358, -5213866, -5191399, -5168958, -5146544, -5124155,
+ -5101793, -5079459, -5057152, -5034872, -5012620, -4990397, -4968202,
+ -4946036, -4923898, -4901791, -4879713, -4857665, -4835647, -4813660,
+ -4791703, -4769778, -4747884, -4726021, -4704191, -4682393, -4660627,
+ -4638894, -4617193, -4595526, -4573893, -4552293, -4530728, -4509196,
+ -4487699, -4466237, -4444810, -4423418, -4402062, -4380741, -4359457,
+ -4338209, -4316997, -4295822, -4274684, -4253583, -4232520, -4211494,
+ -4190506, -4169557, -4148645, -4127772, -4106939, -4086144, -4065388,
+ -4044672, -4023995, -4003359, -3982762, -3962206, -3941690, -3921215,
+ -3900781, -3880388, -3860037, -3839727, -3819458, -3799232, -3779048,
+ -3758906, -3738807, -3718750, -3698736, -3678766, -3658838, -3638955,
+ -3619114, -3599318, -3579565, -3559857, -3540193, -3520574, -3500999,
+ -3481469, -3461985, -3442545, -3423151, -3403802, -3384499, -3365242,
+ -3346031, -3326866, -3307747, -3288675, -3269650, -3250671, -3231739,
+ -3212855, -3194017, -3175227, -3156485, -3137790, -3119143, -3100544,
+ -3081993, -3063490, -3045035, -3026629, -3008272, -2989963, -2971703,
+ -2953492, -2935331, -2917218, -2899155, -2881142, -2863178, -2845263,
+ -2827399, -2809584, -2791820, -2774105, -2756441, -2738828, -2721265,
+ -2703752, -2686290, -2668879, -2651519, -2634210, -2616951, -2599745,
+ -2582589, -2565485, -2548432, -2531431, -2514481, -2497583, -2480737,
+ -2463943, -2447201, -2430511, -2413873, -2397287, -2380754, -2364273,
+ -2347844, -2331468, -2315144, -2298874, -2282656, -2266490, -2250378,
+ -2234318, -2218312, -2202358, -2186458, -2170611, -2154817, -2139076,
+ -2123389, -2107755, -2092175, -2076648, -2061174, -2045755, -2030388,
+ -2015076, -1999817, -1984612, -1969461, -1954364, -1939320, -1924331,
+ -1909395, -1894514, -1879686, -1864913, -1850194, -1835528, -1820917,
+ -1806361, -1791858, -1777410, -1763015, -1748676, -1734390, -1720159,
+ -1705982, -1691859, -1677791, -1663778, -1649818, -1635913, -1622063,
+ -1608267, -1594525, -1580838, -1567205, -1553627, -1540103, -1526634,
+ -1513219, -1499859, -1486553, -1473302, -1460105, -1446962, -1433874,
+ -1420841, -1407862, -1394937, -1382067, -1369251, -1356490, -1343783,
+ -1331130, -1318532, -1305988, -1293498, -1281063, -1268682, -1256355,
+ -1244083, -1231865, -1219701, -1207591, -1195535, -1183534, -1171587,
+ -1159693, -1147854, -1136069, -1124337, -1112660, -1101037, -1089467,
+ -1077952, -1066490, -1055082, -1043727, -1032426, -1021179, -1009986,
+ -998846, -987760, -976727, -965748, -954822, -943949, -933129, -922363,
+ -911650, -900990, -890384, -879830, -869329, -858881, -848486, -838144,
+ -827855, -817618, -807434, -797303, -787224, -777197, -767223, -757301,
+ -747432, -737615, -727849, -718136, -708475, -698866, -689309, -679803,
+ -670349, -660947, -651597, -642297, -633050, -623853, -614708, -605615,
+ -596572, -587580, -578639, -569750, -560911, -552122, -543385, -534698,
+ -526061, -517475, -508939, -500453, -492018, -483632, -475297, -467011,
+ -458775, -450589, -442452, -434365, -426328, -418339, -410400, -402510,
+ -394669, -386877, -379134, -371440, -363794, -356197, -348649, -341149,
+ -333697, -326293, -318937, -311629, -304369, -297157, -289993, -282876,
+ -275807, -268785, -261810, -254882, -248001, -241168, -234381, -227641,
+ -220947, -214300, -207699, -201145, -194636, -188174, -181758, -175387,
+ -169063, -162784, -156550, -150362, -144219, -138121, -132068, -126060,
+ -120097, -114178, -108304, -102475, -96690, -90949, -85252, -79599,
+ -73990, -68425, -62903, -57425, -51990, -46598, -41250, -35945, -30682,
+ -25462, -20285, -15150, -10058, -5008, 0
+};
+
+const int32_t filter_data_H[16385] = {
+ 0, -2498, -5007, -7527, -10057, -12598, -15149, -17711, -20283, -22866,
+ -25459, -28063, -30677, -33301, -35936, -38582, -41238, -43904, -46581,
+ -49268, -51966, -54674, -57392, -60121, -62860, -65610, -68370, -71141,
+ -73922, -76713, -79515, -82327, -85149, -87982, -90825, -93678, -96542,
+ -99416, -102301, -105195, -108100, -111016, -113941, -116877, -119823,
+ -122779, -125746, -128723, -131710, -134707, -137714, -140732, -143760,
+ -146798, -149846, -152904, -155972, -159051, -162139, -165238, -168347,
+ -171466, -174594, -177733, -180882, -184041, -187210, -190389, -193578,
+ -196777, -199986, -203205, -206433, -209672, -212920, -216179, -219447,
+ -222725, -226013, -229310, -232618, -235935, -239262, -242599, -245945,
+ -249301, -252667, -256042, -259427, -262822, -266227, -269641, -273064,
+ -276497, -279940, -283392, -286854, -290325, -293805, -297295, -300795,
+ -304304, -307822, -311350, -314886, -318433, -321988, -325553, -329127,
+ -332710, -336303, -339904, -343515, -347135, -350764, -354402, -358050,
+ -361706, -365371, -369045, -372728, -376421, -380122, -383832, -387550,
+ -391278, -395014, -398760, -402514, -406276, -410048, -413828, -417617,
+ -421414, -425220, -429035, -432858, -436690, -440530, -444378, -448235,
+ -452101, -455974, -459857, -463747, -467646, -471553, -475468, -479391,
+ -483323, -487262, -491210, -495166, -499130, -503102, -507082, -511069,
+ -515065, -519069, -523080, -527099, -531126, -535161, -539203, -543253,
+ -547311, -551376, -555449, -559530, -563618, -567713, -571816, -575926,
+ -580044, -584169, -588301, -592440, -596587, -600741, -604902, -609070,
+ -613245, -617427, -621616, -625812, -630015, -634225, -638442, -642665,
+ -646895, -651132, -655376, -659626, -663883, -668146, -672416, -676693,
+ -680975, -685265, -689560, -693862, -698170, -702484, -706805, -711132,
+ -715464, -719803, -724148, -728499, -732855, -737218, -741586, -745961,
+ -750341, -754726, -759117, -763514, -767917, -772325, -776738, -781157,
+ -785581, -790011, -794446, -798886, -803331, -807782, -812237, -816698,
+ -821164, -825634, -830110, -834590, -839075, -843565, -848060, -852559,
+ -857063, -861571, -866084, -870602, -875123, -879650, -884180, -888715,
+ -893254, -897797, -902344, -906895, -911451, -916010, -920573, -925140,
+ -929711, -934285, -938863, -943445, -948031, -952620, -957212, -961808,
+ -966407, -971009, -975615, -980224, -984836, -989451, -994069, -998690,
+ -1003314, -1007941, -1012571, -1017203, -1021838, -1026476, -1031116,
+ -1035759, -1040404, -1045052, -1049702, -1054354, -1059009, -1063665,
+ -1068324, -1072985, -1077648, -1082313, -1086979, -1091648, -1096318,
+ -1100990, -1105663, -1110338, -1115015, -1119693, -1124372, -1129053,
+ -1133735, -1138418, -1143102, -1147787, -1152474, -1157161, -1161849,
+ -1166538, -1171228, -1175918, -1180609, -1185301, -1189993, -1194686,
+ -1199379, -1204072, -1208765, -1213459, -1218153, -1222847, -1227540,
+ -1232234, -1236928, -1241621, -1246314, -1251007, -1255699, -1260391,
+ -1265082, -1269773, -1274463, -1279152, -1283840, -1288528, -1293214,
+ -1297900, -1302584, -1307267, -1311950, -1316630, -1321310, -1325987,
+ -1330664, -1335339, -1340012, -1344683, -1349353, -1354021, -1358687,
+ -1363350, -1368012, -1372672, -1377329, -1381984, -1386637, -1391288,
+ -1395935, -1400581, -1405223, -1409863, -1414500, -1419135, -1423766,
+ -1428394, -1433019, -1437641, -1442260, -1446876, -1451488, -1456097,
+ -1460702, -1465303, -1469901, -1474495, -1479086, -1483672, -1488255,
+ -1492833, -1497407, -1501977, -1506543, -1511105, -1515662, -1520214,
+ -1524762, -1529305, -1533844, -1538377, -1542906, -1547430, -1551949,
+ -1556463, -1560971, -1565474, -1569972, -1574465, -1578952, -1583433,
+ -1587909, -1592378, -1596843, -1601301, -1605753, -1610199, -1614639,
+ -1619073, -1623500, -1627921, -1632336, -1636744, -1641146, -1645540,
+ -1649929, -1654310, -1658684, -1663051, -1667411, -1671764, -1676110,
+ -1680448, -1684779, -1689102, -1693418, -1697726, -1702027, -1706319,
+ -1710604, -1714880, -1719149, -1723409, -1727662, -1731905, -1736141,
+ -1740368, -1744586, -1748796, -1752997, -1757189, -1761372, -1765546,
+ -1769711, -1773867, -1778014, -1782152, -1786280, -1790398, -1794507,
+ -1798606, -1802696, -1806776, -1810845, -1814905, -1818955, -1822995,
+ -1827024, -1831043, -1835051, -1839050, -1843037, -1847014, -1850980,
+ -1854935, -1858879, -1862812, -1866734, -1870645, -1874545, -1878433,
+ -1882310, -1886175, -1890029, -1893871, -1897701, -1901520, -1905326,
+ -1909120, -1912902, -1916672, -1920430, -1924175, -1927908, -1931628,
+ -1935336, -1939030, -1942712, -1946381, -1950037, -1953680, -1957310,
+ -1960926, -1964529, -1968119, -1971695, -1975258, -1978806, -1982341,
+ -1985863, -1989370, -1992863, -1996342, -1999806, -2003257, -2006693,
+ -2010114, -2013521, -2016913, -2020291, -2023654, -2027001, -2030334,
+ -2033651, -2036954, -2040241, -2043513, -2046769, -2050009, -2053234,
+ -2056444, -2059637, -2062815, -2065976, -2069122, -2072251, -2075364,
+ -2078461, -2081541, -2084605, -2087652, -2090682, -2093696, -2096693,
+ -2099672, -2102635, -2105581, -2108509, -2111420, -2114313, -2117189,
+ -2120048, -2122889, -2125712, -2128517, -2131304, -2134073, -2136824,
+ -2139557, -2142272, -2144968, -2147646, -2150305, -2152945, -2155567,
+ -2158170, -2160754, -2163319, -2165865, -2168391, -2170899, -2173387,
+ -2175855, -2178304, -2180734, -2183144, -2185533, -2187904, -2190254,
+ -2192584, -2194893, -2197183, -2199452, -2201701, -2203929, -2206137,
+ -2208324, -2210490, -2212636, -2214760, -2216864, -2218946, -2221007,
+ -2223047, -2225066, -2227063, -2229038, -2230992, -2232924, -2234834,
+ -2236722, -2238589, -2240433, -2242255, -2244055, -2245832, -2247587,
+ -2249320, -2251030, -2252717, -2254382, -2256023, -2257642, -2259238,
+ -2260810, -2262360, -2263886, -2265388, -2266868, -2268323, -2269755,
+ -2271164, -2272548, -2273909, -2275246, -2276558, -2277847, -2279111,
+ -2280351, -2281567, -2282758, -2283924, -2285066, -2286183, -2287276,
+ -2288343, -2289386, -2290403, -2291395, -2292362, -2293304, -2294220,
+ -2295111, -2295976, -2296816, -2297630, -2298418, -2299180, -2299916,
+ -2300626, -2301310, -2301968, -2302600, -2303205, -2303783, -2304335,
+ -2304861, -2305359, -2305831, -2306276, -2306694, -2307086, -2307449,
+ -2307786, -2308096, -2308378, -2308633, -2308860, -2309059, -2309231,
+ -2309375, -2309492, -2309580, -2309640, -2309673, -2309677, -2309653,
+ -2309601, -2309520, -2309411, -2309273, -2309107, -2308912, -2308688,
+ -2308436, -2308154, -2307844, -2307504, -2307135, -2306738, -2306310,
+ -2305854, -2305368, -2304852, -2304307, -2303732, -2303128, -2302493,
+ -2301829, -2301135, -2300410, -2299656, -2298871, -2298057, -2297211,
+ -2296336, -2295430, -2294493, -2293526, -2292528, -2291499, -2290440,
+ -2289350, -2288228, -2287076, -2285892, -2284677, -2283431, -2282154,
+ -2280845, -2279505, -2278133, -2276730, -2275295, -2273828, -2272330,
+ -2270800, -2269237, -2267643, -2266016, -2264358, -2262667, -2260944,
+ -2259189, -2257401, -2255581, -2253728, -2251842, -2249924, -2247974,
+ -2245990, -2243974, -2241924, -2239842, -2237727, -2235578, -2233396,
+ -2231181, -2228933, -2226652, -2224337, -2221988, -2219606, -2217191,
+ -2214741, -2212258, -2209742, -2207191, -2204607, -2201988, -2199336,
+ -2196649, -2193929, -2191174, -2188385, -2185561, -2182703, -2179811,
+ -2176885, -2173923, -2170928, -2167897, -2164832, -2161732, -2158598,
+ -2155428, -2152224, -2148984, -2145710, -2142400, -2139056, -2135676,
+ -2132261, -2128811, -2125325, -2121804, -2118248, -2114656, -2111029,
+ -2107366, -2103667, -2099933, -2096163, -2092357, -2088516, -2084638,
+ -2080725, -2076776, -2072790, -2068769, -2064712, -2060618, -2056488,
+ -2052322, -2048120, -2043881, -2039607, -2035295, -2030947, -2026563,
+ -2022142, -2017685, -2013191, -2008660, -2004093, -1999489, -1994848,
+ -1990171, -1985456, -1980705, -1975916, -1971091, -1966229, -1961329,
+ -1956393, -1951420, -1946409, -1941361, -1936276, -1931154, -1925994,
+ -1920797, -1915563, -1910291, -1904982, -1899636, -1894252, -1888830,
+ -1883371, -1877874, -1872340, -1866768, -1861159, -1855511, -1849826,
+ -1844104, -1838343, -1832545, -1826709, -1820835, -1814923, -1808973,
+ -1802985, -1796959, -1790896, -1784794, -1778654, -1772476, -1766261,
+ -1760007, -1753714, -1747384, -1741016, -1734609, -1728164, -1721681,
+ -1715160, -1708600, -1702002, -1695366, -1688692, -1681979, -1675228,
+ -1668438, -1661610, -1654744, -1647839, -1640896, -1633914, -1626894,
+ -1619836, -1612739, -1605603, -1598429, -1591217, -1583966, -1576676,
+ -1569348, -1561981, -1554576, -1547132, -1539650, -1532129, -1524569,
+ -1516971, -1509334, -1501659, -1493945, -1486192, -1478401, -1470571,
+ -1462702, -1454795, -1446849, -1438865, -1430842, -1422780, -1414680,
+ -1406540, -1398363, -1390147, -1381892, -1373598, -1365266, -1356895,
+ -1348486, -1340038, -1331551, -1323026, -1314462, -1305859, -1297218,
+ -1288538, -1279820, -1271063, -1262268, -1253434, -1244562, -1235651,
+ -1226701, -1217713, -1208687, -1199622, -1190518, -1181376, -1172196,
+ -1162977, -1153720, -1144425, -1135091, -1125718, -1116308, -1106859,
+ -1097371, -1087846, -1078282, -1068680, -1059039, -1049361, -1039644,
+ -1029889, -1020096, -1010265, -1000396, -990488, -980543, -970560,
+ -960538, -950479, -940381, -930246, -920073, -909862, -899613, -889326,
+ -879002, -868640, -858240, -847802, -837327, -826814, -816264, -805676,
+ -795050, -784387, -773687, -762949, -752174, -741362, -730512, -719625,
+ -708700, -697739, -686740, -675704, -664632, -653522, -642375, -631191,
+ -619971, -608713, -597419, -586088, -574720, -563316, -551875, -540397,
+ -528883, -517333, -505746, -494122, -482463, -470767, -459035, -447266,
+ -435462, -423621, -411745, -399832, -387884, -375899, -363879, -351823,
+ -339732, -327605, -315442, -303244, -291010, -278741, -266437, -254097,
+ -241723, -229313, -216868, -204388, -191873, -179323, -166738, -154119,
+ -141465, -128776, -116053, -103295, -90503, -77676, -64815, -51920,
+ -38991, -26028, -13031, 0, 13064, 26163, 39296, 52462, 65661, 78894,
+ 92161, 105461, 118794, 132160, 145559, 158991, 172457, 185955, 199485,
+ 213049, 226645, 240274, 253934, 267628, 281353, 295111, 308901, 322723,
+ 336576, 350462, 364379, 378328, 392308, 406320, 420364, 434438, 448544,
+ 462681, 476848, 491047, 505277, 519537, 533828, 548149, 562501, 576883,
+ 591295, 605737, 620210, 634712, 649244, 663806, 678398, 693019, 707669,
+ 722349, 737058, 751796, 766563, 781359, 796184, 811037, 825919, 840830,
+ 855768, 870735, 885731, 900754, 915805, 930884, 945990, 961124, 976286,
+ 991475, 1006691, 1021934, 1037204, 1052501, 1067825, 1083175, 1098552,
+ 1113956, 1129385, 1144841, 1160323, 1175831, 1191364, 1206923, 1222508,
+ 1238118, 1253754, 1269414, 1285100, 1300811, 1316546, 1332306, 1348091,
+ 1363899, 1379733, 1395590, 1411471, 1427377, 1443306, 1459258, 1475234,
+ 1491234, 1507257, 1523302, 1539371, 1555462, 1571577, 1587713, 1603872,
+ 1620054, 1636257, 1652483, 1668730, 1684999, 1701289, 1717601, 1733935,
+ 1750289, 1766664, 1783060, 1799477, 1815915, 1832373, 1848851, 1865349,
+ 1881867, 1898405, 1914963, 1931540, 1948136, 1964752, 1981387, 1998040,
+ 2014713, 2031404, 2048113, 2064841, 2081587, 2098351, 2115133, 2131932,
+ 2148749, 2165583, 2182435, 2199303, 2216189, 2233091, 2250010, 2266945,
+ 2283896, 2300864, 2317847, 2334846, 2351861, 2368891, 2385936, 2402997,
+ 2420072, 2437162, 2454267, 2471386, 2488520, 2505667, 2522829, 2540004,
+ 2557193, 2574395, 2591610, 2608839, 2626080, 2643334, 2660601, 2677880,
+ 2695171, 2712474, 2729790, 2747116, 2764455, 2781804, 2799165, 2816537,
+ 2833919, 2851312, 2868716, 2886129, 2903553, 2920987, 2938430, 2955883,
+ 2973345, 2990816, 3008297, 3025786, 3043283, 3060790, 3078304, 3095826,
+ 3113356, 3130894, 3148439, 3165992, 3183552, 3201118, 3218692, 3236271,
+ 3253858, 3271450, 3289048, 3306652, 3324261, 3341876, 3359496, 3377121,
+ 3394751, 3412386, 3430024, 3447667, 3465314, 3482965, 3500619, 3518277,
+ 3535938, 3553602, 3571269, 3588938, 3606610, 3624284, 3641960, 3659637,
+ 3677317, 3694997, 3712679, 3730362, 3748046, 3765730, 3783414, 3801099,
+ 3818784, 3836468, 3854152, 3871835, 3889517, 3907199, 3924879, 3942557,
+ 3960234, 3977909, 3995581, 4013251, 4030919, 4048584, 4066246, 4083905,
+ 4101560, 4119212, 4136859, 4154503, 4172143, 4189778, 4207408, 4225033,
+ 4242653, 4260268, 4277877, 4295481, 4313078, 4330669, 4348254, 4365832,
+ 4383403, 4400967, 4418524, 4436073, 4453614, 4471148, 4488673, 4506189,
+ 4523697, 4541196, 4558686, 4576167, 4593638, 4611099, 4628550, 4645991,
+ 4663421, 4680841, 4698250, 4715648, 4733034, 4750409, 4767771, 4785122,
+ 4802460, 4819786, 4837099, 4854400, 4871687, 4888960, 4906220, 4923466,
+ 4940697, 4957915, 4975117, 4992305, 5009478, 5026635, 5043777, 5060903,
+ 5078013, 5095107, 5112184, 5129245, 5146289, 5163315, 5180324, 5197315,
+ 5214289, 5231244, 5248181, 5265099, 5281999, 5298879, 5315740, 5332581,
+ 5349403, 5366204, 5382986, 5399746, 5416486, 5433205, 5449903, 5466579,
+ 5483233, 5499865, 5516476, 5533063, 5549628, 5566170, 5582689, 5599184,
+ 5615656, 5632104, 5648527, 5664927, 5681301, 5697651, 5713975, 5730274,
+ 5746548, 5762795, 5779016, 5795211, 5811380, 5827521, 5843636, 5859722,
+ 5875782, 5891813, 5907817, 5923792, 5939738, 5955656, 5971544, 5987403,
+ 6003233, 6019032, 6034802, 6050541, 6066250, 6081927, 6097574, 6113189,
+ 6128773, 6144325, 6159845, 6175332, 6190787, 6206209, 6221598, 6236953,
+ 6252275, 6267563, 6282817, 6298036, 6313221, 6328371, 6343486, 6358566,
+ 6373610, 6388618, 6403590, 6418526, 6433425, 6448287, 6463112, 6477899,
+ 6492649, 6507361, 6522035, 6536671, 6551267, 6565825, 6580344, 6594823,
+ 6609263, 6623663, 6638022, 6652341, 6666620, 6680857, 6695054, 6709208,
+ 6723322, 6737393, 6751422, 6765408, 6779352, 6793253, 6807110, 6820924,
+ 6834695, 6848421, 6862103, 6875741, 6889334, 6902882, 6916384, 6929841,
+ 6943253, 6956618, 6969937, 6983209, 6996435, 7009613, 7022745, 7035829,
+ 7048864, 7061852, 7074792, 7087683, 7100525, 7113318, 7126062, 7138756,
+ 7151400, 7163994, 7176538, 7189031, 7201474, 7213865, 7226205, 7238493,
+ 7250730, 7262914, 7275046, 7287125, 7299151, 7311125, 7323044, 7334911,
+ 7346723, 7358481, 7370185, 7381834, 7393428, 7404967, 7416451, 7427878,
+ 7439250, 7450566, 7461826, 7473028, 7484174, 7495263, 7506294, 7517268,
+ 7528183, 7539041, 7549840, 7560580, 7571261, 7581884, 7592446, 7602949,
+ 7613393, 7623776, 7634098, 7644360, 7654561, 7664701, 7674779, 7684796,
+ 7694751, 7704643, 7714473, 7724241, 7733946, 7743587, 7753165, 7762680,
+ 7772130, 7781517, 7790839, 7800096, 7809289, 7818416, 7827478, 7836475,
+ 7845406, 7854270, 7863068, 7871800, 7880465, 7889063, 7897593, 7906056,
+ 7914451, 7922778, 7931037, 7939227, 7947349, 7955401, 7963385, 7971299,
+ 7979143, 7986917, 7994621, 8002254, 8009817, 8017309, 8024730, 8032080,
+ 8039358, 8046564, 8053698, 8060759, 8067748, 8074665, 8081508, 8088278,
+ 8094974, 8101597, 8108146, 8114620, 8121021, 8127346, 8133597, 8139772,
+ 8145873, 8151897, 8157846, 8163719, 8169515, 8175235, 8180879, 8186445,
+ 8191934, 8197346, 8202680, 8207936, 8213115, 8218215, 8223236, 8228179,
+ 8233042, 8237827, 8242532, 8247157, 8251703, 8256168, 8260553, 8264858,
+ 8269082, 8273225, 8277286, 8281267, 8285165, 8288982, 8292717, 8296369,
+ 8299939, 8303427, 8306831, 8310152, 8313390, 8316545, 8319615, 8322602,
+ 8325504, 8328322, 8331056, 8333704, 8336268, 8338746, 8341139, 8343446,
+ 8345668, 8347803, 8349852, 8351814, 8353690, 8355479, 8357181, 8358796,
+ 8360323, 8361762, 8363113, 8364377, 8365552, 8366638, 8367636, 8368545,
+ 8369365, 8370096, 8370737, 8371288, 8371750, 8372121, 8372403, 8372593,
+ 8372693, 8372703, 8372621, 8372448, 8372184, 8371828, 8371380, 8370840,
+ 8370208, 8369484, 8368667, 8367758, 8366756, 8365660, 8364471, 8363189,
+ 8361814, 8360344, 8358780, 8357123, 8355371, 8353524, 8351583, 8349547,
+ 8347416, 8345189, 8342867, 8340450, 8337937, 8335328, 8332623, 8329822,
+ 8326924, 8323929, 8320838, 8317650, 8314365, 8310983, 8307503, 8303926,
+ 8300251, 8296478, 8292607, 8288637, 8284570, 8280404, 8276139, 8271775,
+ 8267312, 8262750, 8258089, 8253328, 8248468, 8243508, 8238448, 8233288,
+ 8228027, 8222666, 8217205, 8211643, 8205980, 8200217, 8194352, 8188386,
+ 8182318, 8176149, 8169878, 8163506, 8157031, 8150455, 8143776, 8136995,
+ 8130111, 8123125, 8116036, 8108844, 8101549, 8094151, 8086649, 8079044,
+ 8071336, 8063524, 8055608, 8047588, 8039464, 8031236, 8022904, 8014467,
+ 8005926, 7997280, 7988529, 7979673, 7970713, 7961647, 7952476, 7943200,
+ 7933818, 7924330, 7914737, 7905038, 7895234, 7885323, 7875306, 7865183,
+ 7854953, 7844618, 7834175, 7823626, 7812970, 7802208, 7791338, 7780362,
+ 7769278, 7758087, 7746789, 7735383, 7723870, 7712250, 7700521, 7688685,
+ 7676741, 7664689, 7652529, 7640261, 7627885, 7615401, 7602808, 7590106,
+ 7577297, 7564378, 7551351, 7538215, 7524971, 7511617, 7498154, 7484583,
+ 7470902, 7457112, 7443213, 7429205, 7415087, 7400860, 7386523, 7372077,
+ 7357521, 7342855, 7328080, 7313195, 7298200, 7283095, 7267880, 7252555,
+ 7237120, 7221575, 7205919, 7190154, 7174278, 7158292, 7142195, 7125988,
+ 7109671, 7093243, 7076704, 7060055, 7043296, 7026426, 7009445, 6992353,
+ 6975150, 6957837, 6940413, 6922878, 6905233, 6887476, 6869608, 6851630,
+ 6833540, 6815340, 6797028, 6778606, 6760072, 6741428, 6722672, 6703805,
+ 6684827, 6665738, 6646538, 6627226, 6607804, 6588270, 6568625, 6548869,
+ 6529002, 6509023, 6488934, 6468733, 6448421, 6427998, 6407463, 6386818,
+ 6366061, 6345193, 6324214, 6303124, 6281923, 6260610, 6239187, 6217652,
+ 6196007, 6174250, 6152382, 6130404, 6108314, 6086113, 6063802, 6041379,
+ 6018846, 5996201, 5973446, 5950581, 5927604, 5904517, 5881318, 5858010,
+ 5834590, 5811061, 5787420, 5763669, 5739808, 5715836, 5691754, 5667561,
+ 5643258, 5618845, 5594322, 5569689, 5544946, 5520092, 5495129, 5470056,
+ 5444873, 5419580, 5394178, 5368666, 5343044, 5317313, 5291472, 5265522,
+ 5239463, 5213294, 5187016, 5160630, 5134134, 5107529, 5080815, 5053993,
+ 5027062, 5000022, 4972874, 4945618, 4918253, 4890779, 4863198, 4835508,
+ 4807711, 4779805, 4751792, 4723671, 4695443, 4667107, 4638663, 4610113,
+ 4581455, 4552690, 4523818, 4494839, 4465753, 4436561, 4407262, 4377857,
+ 4348345, 4318727, 4289003, 4259173, 4229238, 4199196, 4169049, 4138797,
+ 4108439, 4077976, 4047408, 4016735, 3985957, 3955074, 3924087, 3892996,
+ 3861800, 3830500, 3799096, 3767588, 3735976, 3704261, 3672443, 3640521,
+ 3608496, 3576368, 3544137, 3511804, 3479368, 3446830, 3414190, 3381447,
+ 3348603, 3315657, 3282609, 3249460, 3216210, 3182859, 3149407, 3115854,
+ 3082201, 3048447, 3014593, 2980639, 2946586, 2912432, 2878180, 2843828,
+ 2809377, 2774827, 2740178, 2705431, 2670585, 2635641, 2600600, 2565460,
+ 2530223, 2494889, 2459457, 2423929, 2388303, 2352582, 2316763, 2280849,
+ 2244839, 2208733, 2172532, 2136235, 2099843, 2063356, 2026775, 1990099,
+ 1953329, 1916465, 1879507, 1842456, 1805311, 1768073, 1730743, 1693320,
+ 1655804, 1618196, 1580496, 1542705, 1504822, 1466848, 1428783, 1390627,
+ 1352381, 1314044, 1275617, 1237101, 1198495, 1159800, 1121016, 1082143,
+ 1043182, 1004132, 964995, 925770, 886457, 847057, 807570, 767997,
+ 728337, 688591, 648759, 608842, 568839, 528751, 488579, 448322, 407980,
+ 367555, 327046, 286454, 245779, 205021, 164181, 123258, 82253, 41167,
+ 0, -41248, -82577, -123987, -165477, -207047, -248696, -290425,
+ -332232, -374118, -416083, -458125, -500245, -542443, -584718, -627069,
+ -669497, -712001, -754580, -797235, -839966, -882771, -925651, -968604,
+ -1011632, -1054733, -1097908, -1141155, -1184475, -1227867, -1271331,
+ -1314866, -1358472, -1402150, -1445898, -1489716, -1533603, -1577560,
+ -1621587, -1665682, -1709845, -1754077, -1798376, -1842743, -1887176,
+ -1931676, -1976243, -2020875, -2065573, -2110336, -2155164, -2200056,
+ -2245013, -2290033, -2335116, -2380263, -2425472, -2470743, -2516076,
+ -2561470, -2606926, -2652442, -2698019, -2743656, -2789352, -2835107,
+ -2880921, -2926794, -2972724, -3018712, -3064757, -3110860, -3157018,
+ -3203233, -3249503, -3295828, -3342209, -3388643, -3435132, -3481675,
+ -3528270, -3574919, -3621619, -3668372, -3715177, -3762032, -3808938,
+ -3855895, -3902902, -3949958, -3997063, -4044217, -4091419, -4138668,
+ -4185966, -4233310, -4280701, -4328137, -4375620, -4423148, -4470720,
+ -4518337, -4565998, -4613702, -4661450, -4709240, -4757072, -4804946,
+ -4852862, -4900818, -4948815, -4996851, -5044927, -5093042, -5141196,
+ -5189388, -5237618, -5285885, -5334189, -5382529, -5430905, -5479316,
+ -5527763, -5576244, -5624759, -5673308, -5721889, -5770504, -5819150,
+ -5867829, -5916538, -5965279, -6014049, -6062850, -6111680, -6160538,
+ -6209425, -6258341, -6307283, -6356253, -6405249, -6454271, -6503318,
+ -6552391, -6601488, -6650609, -6699754, -6748922, -6798112, -6847324,
+ -6896559, -6945814, -6995090, -7044386, -7093701, -7143036, -7192389,
+ -7241761, -7291150, -7340556, -7389979, -7439418, -7488872, -7538342,
+ -7587826, -7637325, -7686836, -7736361, -7785899, -7835448, -7885009,
+ -7934581, -7984164, -8033756, -8083358, -8132969, -8182588, -8232215,
+ -8281850, -8331491, -8381139, -8430792, -8480451, -8530114, -8579781,
+ -8629453, -8679127, -8728804, -8778483, -8828163, -8877845, -8927527,
+ -8977209, -9026890, -9076570, -9126249, -9175925, -9225598, -9275268,
+ -9324935, -9374596, -9424253, -9473905, -9523550, -9573189, -9622820,
+ -9672444, -9722060, -9771667, -9821264, -9870852, -9920429, -9969995,
+ -10019549, -10069092, -10118622, -10168138, -10217641, -10267129,
+ -10316602, -10366060, -10415502, -10464927, -10514335, -10563726,
+ -10613097, -10662451, -10711784, -10761098, -10810391, -10859663,
+ -10908913, -10958141, -11007346, -11056527, -11105685, -11154818,
+ -11203925, -11253007, -11302063, -11351092, -11400093, -11449066,
+ -11498011, -11546926, -11595811, -11644667, -11693491, -11742283,
+ -11791044, -11839772, -11888466, -11937127, -11985753, -12034344,
+ -12082899, -12131418, -12179901, -12228345, -12276752, -12325120,
+ -12373450, -12421739, -12469988, -12518196, -12566362, -12614486,
+ -12662567, -12710605, -12758599, -12806549, -12854453, -12902312,
+ -12950124, -12997890, -13045607, -13093277, -13140898, -13188469,
+ -13235991, -13283462, -13330882, -13378250, -13425566, -13472828,
+ -13520038, -13567193, -13614293, -13661338, -13708327, -13755259,
+ -13802134, -13848951, -13895710, -13942409, -13989049, -14035629,
+ -14082148, -14128606, -14175001, -14221334, -14267603, -14313808,
+ -14359949, -14406025, -14452035, -14497979, -14543855, -14589664,
+ -14635405, -14681077, -14726679, -14772212, -14817673, -14863064,
+ -14908382, -14953628, -14998801, -15043900, -15088925, -15133874,
+ -15178748, -15223546, -15268267, -15312910, -15357476, -15401962,
+ -15446370, -15490697, -15534944, -15579109, -15623193, -15667194,
+ -15711113, -15754947, -15798698, -15842363, -15885943, -15929436,
+ -15972843, -16016163, -16059394, -16102537, -16145591, -16188554,
+ -16231427, -16274209, -16316900, -16359498, -16402002, -16444414,
+ -16486731, -16528953, -16571079, -16613110, -16655044, -16696880,
+ -16738619, -16780258, -16821799, -16863240, -16904580, -16945819,
+ -16986957, -17027992, -17068924, -17109753, -17150477, -17191096,
+ -17231611, -17272019, -17312320, -17352514, -17392600, -17432577,
+ -17472446, -17512204, -17551852, -17591389, -17630815, -17670128,
+ -17709328, -17748414, -17787387, -17826245, -17864987, -17903613,
+ -17942123, -17980515, -18018790, -18056946, -18094983, -18132900,
+ -18170697, -18208373, -18245927, -18283359, -18320668, -18357854,
+ -18394916, -18431853, -18468665, -18505351, -18541911, -18578343,
+ -18614648, -18650824, -18686871, -18722789, -18758576, -18794233,
+ -18829758, -18865152, -18900412, -18935539, -18970533, -19005392,
+ -19040116, -19074704, -19109156, -19143471, -19177648, -19211688,
+ -19245588, -19279349, -19312971, -19346451, -19379791, -19412989,
+ -19446044, -19478957, -19511725, -19544350, -19576830, -19609165,
+ -19641353, -19673395, -19705290, -19737037, -19768635, -19800085,
+ -19831385, -19862535, -19893534, -19924381, -19955077, -19985620,
+ -20016010, -20046246, -20076328, -20106255, -20136027, -20165642,
+ -20195101, -20224402, -20253546, -20282531, -20311356, -20340023,
+ -20368529, -20396874, -20425058, -20453080, -20480939, -20508636,
+ -20536168, -20563536, -20590740, -20617777, -20644649, -20671354,
+ -20697892, -20724263, -20750465, -20776498, -20802361, -20828055,
+ -20853578, -20878929, -20904109, -20929117, -20953951, -20978613,
+ -21003100, -21027412, -21051550, -21075512, -21099297, -21122906,
+ -21146337, -21169590, -21192665, -21215561, -21238277, -21260813,
+ -21283168, -21305342, -21327334, -21349144, -21370770, -21392214,
+ -21413473, -21434548, -21455437, -21476141, -21496659, -21516990,
+ -21537133, -21557089, -21576857, -21596435, -21615825, -21635024,
+ -21654032, -21672850, -21691476, -21709910, -21728152, -21746200,
+ -21764054, -21781715, -21799180, -21816451, -21833525, -21850404,
+ -21867085, -21883569, -21899856, -21915944, -21931833, -21947523,
+ -21963013, -21978302, -21993391, -22008278, -22022963, -22037446,
+ -22051726, -22065802, -22079675, -22093343, -22106806, -22120064,
+ -22133115, -22145961, -22158599, -22171030, -22183254, -22195269,
+ -22207075, -22218671, -22230058, -22241235, -22252201, -22262955,
+ -22273498, -22283828, -22293946, -22303851, -22313542, -22323019,
+ -22332281, -22341329, -22350161, -22358777, -22367176, -22375359,
+ -22383324, -22391072, -22398601, -22405911, -22413003, -22419874,
+ -22426526, -22432957, -22439167, -22445156, -22450923, -22456468,
+ -22461790, -22466889, -22471764, -22476415, -22480842, -22485044,
+ -22489020, -22492771, -22496295, -22499594, -22502665, -22505508,
+ -22508124, -22510511, -22512670, -22514600, -22516300, -22517770,
+ -22519010, -22520019, -22520797, -22521344, -22521659, -22521741,
+ -22521590, -22521207, -22520590, -22519739, -22518653, -22517333,
+ -22515778, -22513988, -22511962, -22509699, -22507200, -22504464,
+ -22501490, -22498279, -22494830, -22491142, -22487216, -22483050,
+ -22478645, -22474000, -22469115, -22463989, -22458622, -22453014,
+ -22447164, -22441072, -22434738, -22428161, -22421341, -22414277,
+ -22406970, -22399419, -22391624, -22383584, -22375298, -22366768,
+ -22357991, -22348969, -22339700, -22330185, -22320423, -22310413,
+ -22300156, -22289651, -22278897, -22267896, -22256645, -22245145,
+ -22233396, -22221397, -22209148, -22196649, -22183899, -22170898,
+ -22157646, -22144143, -22130388, -22116381, -22102121, -22087610,
+ -22072845, -22057827, -22042556, -22027031, -22011252, -21995219,
+ -21978932, -21962390, -21945593, -21928541, -21911233, -21893670,
+ -21875851, -21857776, -21839444, -21820856, -21802011, -21782909,
+ -21763549, -21743932, -21724057, -21703925, -21683533, -21662884,
+ -21641976, -21620809, -21599383, -21577697, -21555753, -21533548,
+ -21511084, -21488359, -21465374, -21442129, -21418623, -21394856,
+ -21370829, -21346540, -21321989, -21297177, -21272103, -21246768,
+ -21221170, -21195310, -21169187, -21142802, -21116155, -21089244,
+ -21062070, -21034633, -21006933, -20978969, -20950741, -20922250,
+ -20893495, -20864476, -20835192, -20805644, -20775832, -20745755,
+ -20715413, -20684807, -20653936, -20622799, -20591397, -20559731,
+ -20527798, -20495600, -20463137, -20430408, -20397413, -20364152,
+ -20330625, -20296832, -20262773, -20228448, -20193856, -20158998,
+ -20123874, -20088483, -20052825, -20016901, -19980710, -19944252,
+ -19907527, -19870535, -19833277, -19795751, -19757958, -19719898,
+ -19681571, -19642977, -19604116, -19564987, -19525591, -19485928,
+ -19445997, -19405799, -19365334, -19324601, -19283601, -19242333,
+ -19200798, -19158996, -19116926, -19074588, -19031984, -18989111,
+ -18945972, -18902565, -18858890, -18814948, -18770739, -18726263,
+ -18681519, -18636508, -18591230, -18545684, -18499872, -18453792,
+ -18407445, -18360832, -18313951, -18266803, -18219389, -18171707,
+ -18123759, -18075545, -18027063, -17978315, -17929301, -17880020,
+ -17830473, -17780660, -17730581, -17680235, -17629624, -17578747,
+ -17527604, -17476195, -17424521, -17372581, -17320376, -17267906,
+ -17215171, -17162171, -17108906, -17055376, -17001582, -16947523,
+ -16893200, -16838612, -16783761, -16728645, -16673266, -16617623,
+ -16561717, -16505548, -16449115, -16392419, -16335461, -16278240,
+ -16220756, -16163010, -16105002, -16046732, -15988200, -15929407,
+ -15870352, -15811036, -15751460, -15691622, -15631524, -15571165,
+ -15510546, -15449667, -15388529, -15327131, -15265473, -15203557,
+ -15141381, -15078948, -15016255, -14953305, -14890096, -14826630,
+ -14762907, -14698926, -14634688, -14570194, -14505443, -14440436,
+ -14375174, -14309655, -14243882, -14177853, -14111569, -14045031,
+ -13978239, -13911193, -13843893, -13776340, -13708534, -13640475,
+ -13572163, -13503600, -13434784, -13365717, -13296399, -13226830,
+ -13157011, -13086941, -13016621, -12946052, -12875233, -12804166,
+ -12732850, -12661286, -12589474, -12517414, -12445108, -12372554,
+ -12299754, -12226708, -12153417, -12079880, -12006098, -11932071,
+ -11857800, -11783286, -11708527, -11633526, -11558283, -11482797,
+ -11407069, -11331100, -11254889, -11178438, -11101747, -11024816,
+ -10947646, -10870236, -10792588, -10714702, -10636579, -10558218,
+ -10479620, -10400786, -10321716, -10242410, -10162870, -10083095,
+ -10003086, -9922843, -9842367, -9761658, -9680717, -9599544, -9518140,
+ -9436505, -9354640, -9272545, -9190221, -9107667, -9024886, -8941876,
+ -8858639, -8775176, -8691485, -8607570, -8523428, -8439062, -8354472,
+ -8269658, -8184620, -8099360, -8013878, -7928174, -7842250, -7756104,
+ -7669739, -7583154, -7496350, -7409328, -7322088, -7234631, -7146957,
+ -7059068, -6970962, -6882642, -6794108, -6705359, -6616398, -6527224,
+ -6437838, -6348241, -6258432, -6168414, -6078186, -5987749, -5897104,
+ -5806251, -5715190, -5623924, -5532451, -5440773, -5348891, -5256804,
+ -5164514, -5072022, -4979327, -4886431, -4793334, -4700037, -4606541,
+ -4512845, -4418952, -4324861, -4230573, -4136089, -4041410, -3946536,
+ -3851467, -3756206, -3660751, -3565105, -3469267, -3373238, -3277020,
+ -3180612, -3084016, -2987232, -2890260, -2793102, -2695759, -2598231,
+ -2500518, -2402622, -2304543, -2206282, -2107839, -2009216, -1910414,
+ -1811432, -1712271, -1612933, -1513419, -1413728, -1313862, -1213821,
+ -1113607, -1013219, -912659, -811928, -711026, -609954, -508713,
+ -407304, -305727, -203984, -102074, 0, 102239, 204641, 307206, 409934,
+ 512822, 615871, 719079, 822446, 925970, 1029652, 1133489, 1237482,
+ 1341630, 1445931, 1550385, 1654991, 1759748, 1864655, 1969711, 2074917,
+ 2180269, 2285769, 2391414, 2497205, 2603140, 2709218, 2815438, 2921800,
+ 3028303, 3134945, 3241726, 3348645, 3455702, 3562894, 3670222, 3777684,
+ 3885280, 3993008, 4100868, 4208859, 4316979, 4425228, 4533606, 4642110,
+ 4750740, 4859496, 4968376, 5077379, 5186504, 5295751, 5405118, 5514605,
+ 5624211, 5733934, 5843773, 5953729, 6063799, 6173982, 6284279, 6394687,
+ 6505207, 6615836, 6726574, 6837420, 6948373, 7059432, 7170595, 7281863,
+ 7393234, 7504706, 7616280, 7727953, 7839726, 7951596, 8063564, 8175627,
+ 8287785, 8400037, 8512382, 8624819, 8737346, 8849964, 8962670, 9075463,
+ 9188344, 9301310, 9414361, 9527495, 9640712, 9754010, 9867389, 9980847,
+ 10094383, 10207997, 10321687, 10435452, 10549291, 10663203, 10777187,
+ 10891241, 11005366, 11119559, 11233820, 11348147, 11462540, 11576997,
+ 11691518, 11806100, 11920744, 12035448, 12150210, 12265030, 12379907,
+ 12494840, 12609827, 12724868, 12839960, 12955104, 13070298, 13185541,
+ 13300831, 13416168, 13531551, 13646978, 13762448, 13877961, 13993514,
+ 14109108, 14224740, 14340410, 14456116, 14571857, 14687633, 14803441,
+ 14919282, 15035153, 15151054, 15266983, 15382939, 15498922, 15614929,
+ 15730960, 15847014, 15963089, 16079184, 16195298, 16311430, 16427579,
+ 16543743, 16659922, 16776114, 16892318, 17008533, 17124757, 17240989,
+ 17357229, 17473475, 17589726, 17705980, 17822237, 17938495, 18054753,
+ 18171009, 18287264, 18403515, 18519761, 18636000, 18752233, 18868457,
+ 18984672, 19100875, 19217067, 19333245, 19449409, 19565556, 19681687,
+ 19797800, 19913893, 20029965, 20146015, 20262042, 20378045, 20494022,
+ 20609972, 20725894, 20841787, 20957648, 21073478, 21189275, 21305038,
+ 21420764, 21536454, 21652106, 21767718, 21883290, 21998820, 22114306,
+ 22229748, 22345145, 22460494, 22575795, 22691046, 22806247, 22921396,
+ 23036491, 23151532, 23266517, 23381444, 23496314, 23611123, 23725872,
+ 23840558, 23955181, 24069739, 24184230, 24298654, 24413010, 24527296,
+ 24641510, 24755652, 24869719, 24983712, 25097628, 25211467, 25325226,
+ 25438905, 25552502, 25666017, 25779447, 25892792, 26006049, 26119219,
+ 26232299, 26345288, 26458186, 26570990, 26683699, 26796312, 26908828,
+ 27021245, 27133562, 27245778, 27357891, 27469901, 27581805, 27693603,
+ 27805293, 27916874, 28028344, 28139702, 28250948, 28362078, 28473094,
+ 28583992, 28694771, 28805431, 28915970, 29026386, 29136678, 29246846,
+ 29356887, 29466800, 29576585, 29686239, 29795761, 29905150, 30014405,
+ 30123524, 30232506, 30341350, 30450054, 30558617, 30667037, 30775314,
+ 30883446, 30991431, 31099269, 31206957, 31314496, 31421882, 31529115,
+ 31636194, 31743117, 31849883, 31956491, 32062939, 32169225, 32275349,
+ 32381310, 32487105, 32592733, 32698194, 32803486, 32908607, 33013556,
+ 33118332, 33222934, 33327359, 33431607, 33535677, 33639567, 33743275,
+ 33846801, 33950143, 34053300, 34156270, 34259051, 34361644, 34464046,
+ 34566256, 34668272, 34770094, 34871719, 34973148, 35074377, 35175406,
+ 35276234, 35376859, 35477280, 35577496, 35677504, 35777305, 35876896,
+ 35976276, 36075444, 36174398, 36273137, 36371661, 36469966, 36568053,
+ 36665920, 36763565, 36860987, 36958184, 37055156, 37151902, 37248418,
+ 37344706, 37440762, 37536586, 37632176, 37727532, 37822651, 37917532,
+ 38012175, 38106577, 38200737, 38294655, 38388328, 38481755, 38574936,
+ 38667868, 38760551, 38852982, 38945162, 39037087, 39128758, 39220173,
+ 39311330, 39402228, 39492865, 39583241, 39673354, 39763203, 39852787,
+ 39942103, 40031152, 40119931, 40208439, 40296675, 40384637, 40472325,
+ 40559736, 40646871, 40733726, 40820302, 40906596, 40992607, 41078335,
+ 41163777, 41248933, 41333801, 41418379, 41502668, 41586664, 41670367,
+ 41753777, 41836890, 41919706, 42002224, 42084443, 42166361, 42247976,
+ 42329288, 42410296, 42490997, 42571391, 42651477, 42731253, 42810717,
+ 42889869, 42968708, 43047231, 43125438, 43203328, 43280899, 43358150,
+ 43435079, 43511686, 43587969, 43663926, 43739558, 43814861, 43889836,
+ 43964480, 44038793, 44112774, 44186420, 44259731, 44332706, 44405342,
+ 44477640, 44549598, 44621214, 44692487, 44763417, 44834001, 44904239,
+ 44974129, 45043671, 45112862, 45181701, 45250189, 45318322, 45386100,
+ 45453522, 45520587, 45587293, 45653639, 45719623, 45785246, 45850505,
+ 45915399, 45979927, 46044088, 46107880, 46171303, 46234355, 46297036,
+ 46359343, 46421275, 46482832, 46544013, 46604815, 46665238, 46725281,
+ 46784943, 46844222, 46903117, 46961627, 47019751, 47077487, 47134835,
+ 47191794, 47248361, 47304537, 47360319, 47415707, 47470700, 47525296,
+ 47579495, 47633294, 47686694, 47739692, 47792288, 47844481, 47896269,
+ 47947652, 47998628, 48049195, 48099354, 48149103, 48198440, 48247365,
+ 48295876, 48343973, 48391654, 48438919, 48485765, 48532193, 48578200,
+ 48623786, 48668950, 48713691, 48758007, 48801897, 48845361, 48888398,
+ 48931006, 48973183, 49014930, 49056246, 49097128, 49137576, 49177589,
+ 49217166, 49256306, 49295007, 49333269, 49371091, 49408472, 49445410,
+ 49481905, 49517956, 49553561, 49588720, 49623431, 49657694, 49691507,
+ 49724870, 49757781, 49790240, 49822245, 49853796, 49884891, 49915530,
+ 49945712, 49975435, 50004699, 50033502, 50061844, 50089724, 50117141,
+ 50144093, 50170580, 50196602, 50222156, 50247242, 50271859, 50296006,
+ 50319683, 50342887, 50365619, 50387878, 50409662, 50430970, 50451803,
+ 50472158, 50492034, 50511432, 50530350, 50548787, 50566742, 50584215,
+ 50601204, 50617709, 50633729, 50649262, 50664309, 50678867, 50692937,
+ 50706517, 50719607, 50732206, 50744313, 50755926, 50767046, 50777671,
+ 50787801, 50797435, 50806571, 50815210, 50823350, 50830990, 50838130,
+ 50844769, 50850906, 50856540, 50861671, 50866297, 50870419, 50874034,
+ 50877143, 50879745, 50881838, 50883423, 50884498, 50885062, 50885116,
+ 50884657, 50883686, 50882201, 50880203, 50877689, 50874660, 50871115,
+ 50867053, 50862473, 50857375, 50851758, 50845621, 50838963, 50831785,
+ 50824084, 50815861, 50807115, 50797845, 50788051, 50777731, 50766886,
+ 50755514, 50743615, 50731188, 50718233, 50704749, 50690735, 50676191,
+ 50661116, 50645510, 50629372, 50612700, 50595496, 50577758, 50559485,
+ 50540677, 50521333, 50501454, 50481037, 50460083, 50438591, 50416561,
+ 50393992, 50370883, 50347234, 50323044, 50298313, 50273041, 50247226,
+ 50220868, 50193968, 50166523, 50138534, 50110001, 50080922, 50051297,
+ 50021126, 49990409, 49959144, 49927332, 49894971, 49862062, 49828604,
+ 49794597, 49760039, 49724931, 49689273, 49653063, 49616301, 49578988,
+ 49541122, 49502703, 49463731, 49424205, 49384126, 49343491, 49302302,
+ 49260558, 49218258, 49175402, 49131990, 49088021, 49043496, 48998413,
+ 48952772, 48906573, 48859816, 48812500, 48764625, 48716191, 48667198,
+ 48617644, 48567530, 48516856, 48465621, 48413825, 48361467, 48308548,
+ 48255067, 48201024, 48146419, 48091251, 48035520, 47979226, 47922369,
+ 47864948, 47806963, 47748414, 47689301, 47629624, 47569382, 47508575,
+ 47447204, 47385267, 47322765, 47259697, 47196064, 47131864, 47067099,
+ 47001768, 46935870, 46869406, 46802376, 46734778, 46666614, 46597884,
+ 46528586, 46458721, 46388288, 46317289, 46245722, 46173588, 46100886,
+ 46027616, 45953779, 45879374, 45804402, 45728861, 45652753, 45576077,
+ 45498833, 45421021, 45342641, 45263693, 45184177, 45104093, 45023442,
+ 44942222, 44860434, 44778079, 44695155, 44611664, 44527605, 44442979,
+ 44357784, 44272022, 44185693, 44098796, 44011332, 43923300, 43834701,
+ 43745535, 43655802, 43565502, 43474636, 43383202, 43291203, 43198636,
+ 43105504, 43011805, 42917541, 42822710, 42727314, 42631353, 42534826,
+ 42437734, 42340077, 42241855, 42143069, 42043719, 41943804, 41843326,
+ 41742283, 41640678, 41538509, 41435777, 41332483, 41228626, 41124206,
+ 41019225, 40913682, 40807578, 40700913, 40593687, 40485900, 40377554,
+ 40268647, 40159181, 40049155, 39938571, 39827428, 39715727, 39603468,
+ 39490651, 39377277, 39263347, 39148860, 39033817, 38918218, 38802064,
+ 38685355, 38568091, 38450274, 38331903, 38212978, 38093501, 37973472,
+ 37852890, 37731757, 37610073, 37487839, 37365054, 37241720, 37117837,
+ 36993405, 36868425, 36742897, 36616822, 36490200, 36363033, 36235319,
+ 36107061, 35978258, 35848911, 35719021, 35588588, 35457612, 35326095,
+ 35194037, 35061438, 34928299, 34794620, 34660403, 34525647, 34390354,
+ 34254524, 34118158, 33981256, 33843819, 33705847, 33567342, 33428303,
+ 33288732, 33148630, 33007996, 32866832, 32725138, 32582915, 32440163,
+ 32296884, 32153079, 32008746, 31863889, 31718507, 31572601, 31426171,
+ 31279219, 31131746, 30983751, 30835236, 30686202, 30536649, 30386579,
+ 30235991, 30084887, 29933268, 29781134, 29628487, 29475326, 29321654,
+ 29167470, 29012776, 28857572, 28701859, 28545639, 28388912, 28231679,
+ 28073940, 27915698, 27756952, 27597703, 27437953, 27277702, 27116952,
+ 26955703, 26793956, 26631712, 26468973, 26305738, 26142009, 25977788,
+ 25813074, 25647869, 25482174, 25315990, 25149319, 24982160, 24814514,
+ 24646384, 24477770, 24308673, 24139094, 23969035, 23798495, 23627477,
+ 23455981, 23284008, 23111560, 22938638, 22765242, 22591374, 22417034,
+ 22242225, 22066947, 21891201, 21714989, 21538310, 21361168, 21183562,
+ 21005495, 20826966, 20647978, 20468531, 20288627, 20108266, 19927451,
+ 19746182, 19564460, 19382287, 19199664, 19016592, 18833072, 18649105,
+ 18464694, 18279839, 18094540, 17908801, 17722621, 17536003, 17348947,
+ 17161454, 16973527, 16785165, 16596372, 16407147, 16217493, 16027410,
+ 15836900, 15645964, 15454604, 15262821, 15070616, 14877990, 14684946,
+ 14491484, 14297606, 14103313, 13908606, 13713488, 13517958, 13322020,
+ 13125674, 12928921, 12731764, 12534202, 12336239, 12137875, 11939112,
+ 11739952, 11540395, 11340443, 11140098, 10939361, 10738234, 10536718,
+ 10334815, 10132526, 9929852, 9726796, 9523359, 9319542, 9115346,
+ 8910774, 8705827, 8500507, 8294814, 8088752, 7882320, 7675521, 7468356,
+ 7260828, 7052937, 6844685, 6636074, 6427105, 6217780, 6008101, 5798069,
+ 5587686, 5376954, 5165874, 4954447, 4742676, 4530563, 4318108, 4105313,
+ 3892181, 3678713, 3464911, 3250775, 3036309, 2821514, 2606391, 2390942,
+ 2175169, 1959073, 1742658, 1525923, 1308871, 1091504, 873823, 655830,
+ 437528, 218917, 0, -219222, -438746, -658572, -878698, -1099120,
+ -1319839, -1540851, -1762155, -1983749, -2205631, -2427800, -2650254,
+ -2872990, -3096007, -3319303, -3542877, -3766725, -3990847, -4215240,
+ -4439903, -4664834, -4890030, -5115490, -5341212, -5567194, -5793434,
+ -6019931, -6246681, -6473684, -6700937, -6928439, -7156187, -7384179,
+ -7612414, -7840889, -8069603, -8298553, -8527738, -8757156, -8986804,
+ -9216680, -9446783, -9677111, -9907661, -10138432, -10369421,
+ -10600626, -10832046, -11063678, -11295521, -11527572, -11759828,
+ -11992289, -12224952, -12457815, -12690876, -12924133, -13157583,
+ -13391225, -13625056, -13859075, -14093279, -14327667, -14562235,
+ -14796983, -15031907, -15267006, -15502277, -15737719, -15973330,
+ -16209106, -16445046, -16681148, -16917410, -17153829, -17390404,
+ -17627132, -17864010, -18101038, -18338212, -18575530, -18812991,
+ -19050592, -19288330, -19526204, -19764211, -20002350, -20240617,
+ -20479011, -20717530, -20956171, -21194931, -21433810, -21672804,
+ -21911911, -22151129, -22390455, -22629889, -22869426, -23109065,
+ -23348804, -23588640, -23828571, -24068595, -24308710, -24548912,
+ -24789200, -25029572, -25270025, -25510557, -25751166, -25991849,
+ -26232604, -26473428, -26714320, -26955277, -27196296, -27437375,
+ -27678513, -27919706, -28160952, -28402249, -28643594, -28884986,
+ -29126421, -29367898, -29609413, -29850966, -30092552, -30334170,
+ -30575818, -30817493, -31059192, -31300913, -31542655, -31784414,
+ -32026187, -32267974, -32509770, -32751575, -32993384, -33235197,
+ -33477009, -33718820, -33960627, -34202426, -34444217, -34685995,
+ -34927760, -35169507, -35411236, -35652943, -35894625, -36136282,
+ -36377909, -36619505, -36861067, -37102592, -37344079, -37585524,
+ -37826925, -38068280, -38309586, -38550841, -38792042, -39033186,
+ -39274272, -39515296, -39756256, -39997150, -40237975, -40478728,
+ -40719408, -40960011, -41200535, -41440978, -41681336, -41921608,
+ -42161791, -42401882, -42641878, -42881778, -43121579, -43361278,
+ -43600873, -43840360, -44079738, -44319004, -44558155, -44797189,
+ -45036104, -45274895, -45513563, -45752102, -45990512, -46228789,
+ -46466930, -46704934, -46942798, -47180519, -47418094, -47655521,
+ -47892797, -48129920, -48366888, -48603696, -48840344, -49076828,
+ -49313146, -49549294, -49785272, -50021075, -50256702, -50492149,
+ -50727414, -50962495, -51197389, -51432093, -51666605, -51900921,
+ -52135040, -52368959, -52602675, -52836186, -53069488, -53302580,
+ -53535458, -53768121, -54000564, -54232787, -54464786, -54696558,
+ -54928101, -55159412, -55390489, -55621329, -55851929, -56082287,
+ -56312400, -56542265, -56771880, -57001242, -57230349, -57459197,
+ -57687785, -57916109, -58144166, -58371956, -58599473, -58826717,
+ -59053684, -59280371, -59506777, -59732897, -59958731, -60184274,
+ -60409525, -60634480, -60859138, -61083494, -61307548, -61531295,
+ -61754734, -61977862, -62200676, -62423173, -62645351, -62867207,
+ -63088738, -63309942, -63530817, -63751359, -63971565, -64191434,
+ -64410962, -64630147, -64848986, -65067477, -65285616, -65503402,
+ -65720831, -65937901, -66154610, -66370953, -66586930, -66802537,
+ -67017771, -67232630, -67447112, -67661213, -67874931, -68088263,
+ -68301207, -68513759, -68725918, -68937681, -69149045, -69360007,
+ -69570564, -69780715, -69990456, -70199784, -70408698, -70617194,
+ -70825270, -71032923, -71240150, -71446949, -71653318, -71859252,
+ -72064751, -72269811, -72474430, -72678604, -72882332, -73085610,
+ -73288436, -73490808, -73692723, -73894177, -74095169, -74295696,
+ -74495755, -74695344, -74894459, -75093099, -75291261, -75488941,
+ -75686138, -75882849, -76079071, -76274802, -76470039, -76664779,
+ -76859019, -77052758, -77245992, -77438719, -77630937, -77822642,
+ -78013832, -78204505, -78394657, -78584287, -78773391, -78961968,
+ -79150014, -79337527, -79524504, -79710943, -79896841, -80082195,
+ -80267004, -80451264, -80634973, -80818128, -81000726, -81182766,
+ -81364244, -81545158, -81725506, -81905284, -82084491, -82263124,
+ -82441179, -82618655, -82795550, -82971860, -83147582, -83322716,
+ -83497257, -83671203, -83844553, -84017302, -84189450, -84360992,
+ -84531928, -84702253, -84871967, -85041065, -85209546, -85377408,
+ -85544647, -85711261, -85877247, -86042604, -86207329, -86371419,
+ -86534872, -86697684, -86859855, -87021381, -87182259, -87342488,
+ -87502065, -87660987, -87819252, -87976858, -88133801, -88290081,
+ -88445693, -88600636, -88754907, -88908505, -89061425, -89213667,
+ -89365227, -89516103, -89666293, -89815794, -89964604, -90112720,
+ -90260141, -90406863, -90552885, -90698203, -90842816, -90986721,
+ -91129916, -91272399, -91414166, -91555216, -91695546, -91835154,
+ -91974038, -92112195, -92249623, -92386320, -92522282, -92657509,
+ -92791997, -92925745, -93058749, -93191008, -93322519, -93453280,
+ -93583289, -93712544, -93841041, -93968780, -94095757, -94221970,
+ -94347417, -94472096, -94596004, -94719140, -94841501, -94963084,
+ -95083888, -95203910, -95323148, -95441600, -95559263, -95676136,
+ -95792216, -95907501, -96021989, -96135677, -96248563, -96360646,
+ -96471923, -96582391, -96692049, -96800895, -96908925, -97016139,
+ -97122534, -97228108, -97332859, -97436784, -97539882, -97642150,
+ -97743586, -97844188, -97943954, -98042883, -98140971, -98238217,
+ -98334618, -98430173, -98524880, -98618736, -98711739, -98803888,
+ -98895180, -98985613, -99075186, -99163896, -99251741, -99338719,
+ -99424828, -99510066, -99594432, -99677922, -99760536, -99842271,
+ -99923126, -100003097, -100082184, -100160384, -100237696, -100314117,
+ -100389645, -100464279, -100538017, -100610856, -100682796, -100753833,
+ -100823966, -100893194, -100961514, -101028924, -101095423, -101161008,
+ -101225679, -101289432, -101352266, -101414180, -101475171, -101535238,
+ -101594379, -101652591, -101709874, -101766226, -101821644, -101876127,
+ -101929673, -101982280, -102033947, -102084672, -102134453, -102183288,
+ -102231176, -102278115, -102324103, -102369138, -102413220, -102456345,
+ -102498513, -102539721, -102579969, -102619254, -102657575, -102694930,
+ -102731317, -102766736, -102801183, -102834658, -102867159, -102898685,
+ -102929233, -102958803, -102987392, -103014999, -103041623, -103067261,
+ -103091913, -103115577, -103138252, -103159935, -103180625, -103200322,
+ -103219022, -103236725, -103253430, -103269135, -103283838, -103297538,
+ -103310233, -103321922, -103332604, -103342278, -103350941, -103358592,
+ -103365230, -103370854, -103375462, -103379053, -103381625, -103383178,
+ -103383709, -103383217, -103381702, -103379161, -103375594, -103370999,
+ -103365375, -103358720, -103351034, -103342314, -103332561, -103321771,
+ -103309945, -103297081, -103283178, -103268234, -103252249, -103235220,
+ -103217148, -103198030, -103177866, -103156655, -103134394, -103111084,
+ -103086723, -103061309, -103034842, -103007321, -102978745, -102949111,
+ -102918420, -102886671, -102853861, -102819991, -102785059, -102749064,
+ -102712004, -102673880, -102634690, -102594433, -102553108, -102510713,
+ -102467249, -102422714, -102377107, -102330428, -102282674, -102233846,
+ -102183942, -102132962, -102080904, -102027769, -101973554, -101918259,
+ -101861883, -101804425, -101745885, -101686261, -101625553, -101563761,
+ -101500882, -101436917, -101371864, -101305724, -101238494, -101170175,
+ -101100765, -101030264, -100958672, -100885986, -100812208, -100737336,
+ -100661369, -100584306, -100506148, -100426893, -100346541, -100265091,
+ -100182543, -100098895, -100014148, -99928301, -99841352, -99753303,
+ -99664151, -99573897, -99482539, -99390079, -99296514, -99201844,
+ -99106069, -99009189, -98911203, -98812110, -98711910, -98610603,
+ -98508188, -98404664, -98300032, -98194291, -98087441, -97979480,
+ -97870410, -97760228, -97648936, -97536533, -97423018, -97308391,
+ -97192651, -97075800, -96957835, -96838758, -96718567, -96597262,
+ -96474844, -96351312, -96226665, -96100904, -95974028, -95846038,
+ -95716932, -95586711, -95455375, -95322924, -95189356, -95054673,
+ -94918874, -94781960, -94643929, -94504782, -94364518, -94223139,
+ -94080643, -93937031, -93792303, -93646458, -93499497, -93351420,
+ -93202226, -93051916, -92900490, -92747947, -92594289, -92439514,
+ -92283624, -92126618, -91968496, -91809258, -91648905, -91487436,
+ -91324853, -91161154, -90996341, -90830413, -90663370, -90495214,
+ -90325943, -90155559, -89984061, -89811450, -89637726, -89462889,
+ -89286940, -89109879, -88931706, -88752422, -88572026, -88390520,
+ -88207904, -88024177, -87839341, -87653396, -87466341, -87278179,
+ -87088908, -86898530, -86707045, -86514454, -86320756, -86125952,
+ -85930044, -85733031, -85534914, -85335693, -85135369, -84933943,
+ -84731415, -84527786, -84323056, -84117226, -83910296, -83702268,
+ -83493141, -83282917, -83071597, -82859180, -82645667, -82431060,
+ -82215358, -81998564, -81780676, -81561697, -81341627, -81120466,
+ -80898216, -80674877, -80450450, -80224936, -79998335, -79770649,
+ -79541879, -79312025, -79081088, -78849069, -78615969, -78381788,
+ -78146529, -77910191, -77672776, -77434285, -77194718, -76954077,
+ -76712362, -76469575, -76225716, -75980787, -75734789, -75487723,
+ -75239589, -74990390, -74740125, -74488796, -74236405, -73982952,
+ -73728439, -73472866, -73216235, -72958546, -72699802, -72440004,
+ -72179152, -71917248, -71654292, -71390288, -71125234, -70859134,
+ -70591987, -70323796, -70054562, -69784286, -69512969, -69240613,
+ -68967219, -68692788, -68417323, -68140823, -67863291, -67584728,
+ -67305136, -67024515, -66742868, -66460196, -66176500, -65891781,
+ -65606042, -65319284, -65031508, -64742716, -64452910, -64162090,
+ -63870259, -63577418, -63283569, -62988714, -62692853, -62395989,
+ -62098123, -61799256, -61499392, -61198531, -60896674, -60593825,
+ -60289984, -59985152, -59679333, -59372527, -59064737, -58755964,
+ -58446210, -58135476, -57823765, -57511078, -57197418, -56882786,
+ -56567183, -56250612, -55933075, -55614574, -55295110, -54974686,
+ -54653302, -54330962, -54007668, -53683420, -53358222, -53032075,
+ -52704981, -52376942, -52047961, -51718039, -51387178, -51055380,
+ -50722648, -50388984, -50054389, -49718866, -49382417, -49045043,
+ -48706748, -48367534, -48027402, -47686354, -47344393, -47001522,
+ -46657742, -46313055, -45967464, -45620971, -45273579, -44925288,
+ -44576103, -44226025, -43875057, -43523200, -43170457, -42816831,
+ -42462324, -42106938, -41750675, -41393538, -41035530, -40676653,
+ -40316909, -39956300, -39594830, -39232500, -38869313, -38505272,
+ -38140379, -37774637, -37408047, -37040613, -36672338, -36303223,
+ -35933271, -35562485, -35190868, -34818422, -34445149, -34071053,
+ -33696135, -33320400, -32943848, -32566483, -32188308, -31809326,
+ -31429538, -31048948, -30667558, -30285372, -29902391, -29518619,
+ -29134059, -28748713, -28362584, -27975675, -27587988, -27199527,
+ -26810294, -26420293, -26029525, -25637995, -25245704, -24852656,
+ -24458854, -24064300, -23668998, -23272950, -22876159, -22478629,
+ -22080362, -21681361, -21281630, -20881171, -20479987, -20078081,
+ -19675457, -19272118, -18868066, -18463304, -18057836, -17651665,
+ -17244793, -16837225, -16428962, -16020009, -15610369, -15200043,
+ -14789037, -14377352, -13964992, -13551961, -13138261, -12723896,
+ -12308869, -11893183, -11476842, -11059848, -10642205, -10223916,
+ -9804985, -9385415, -8965209, -8544371, -8122903, -7700810, -7278094,
+ -6854759, -6430809, -6006246, -5581074, -5155297, -4728918, -4301940,
+ -3874367, -3446202, -3017449, -2588111, -2158192, -1727695, -1296624,
+ -864982, -432773, 0, 433333, 867223, 1301666, 1736658, 2172197,
+ 2608278, 3044897, 3482052, 3919738, 4357952, 4796690, 5235949, 5675725,
+ 6116014, 6556813, 6998117, 7439924, 7882229, 8325029, 8768320, 9212098,
+ 9656360, 10101101, 10546319, 10992008, 11438166, 11884789, 12331873,
+ 12779414, 13227408, 13675851, 14124740, 14574070, 15023839, 15474041,
+ 15924674, 16375732, 16827213, 17279113, 17731426, 18184151, 18637282,
+ 19090816, 19544748, 19999075, 20453793, 20908898, 21364386, 21820253,
+ 22276494, 22733107, 23190086, 23647428, 24105128, 24563184, 25021590,
+ 25480343, 25939438, 26398872, 26858640, 27318738, 27779162, 28239909,
+ 28700973, 29162352, 29624039, 30086033, 30548327, 31010919, 31473804,
+ 31936978, 32400437, 32864175, 33328190, 33792478, 34257033, 34721851,
+ 35186929, 35652262, 36117846, 36583677, 37049749, 37516060, 37982605,
+ 38449379, 38916379, 39383599, 39851036, 40318685, 40786542, 41254603,
+ 41722862, 42191317, 42659963, 43128794, 43597807, 44066998, 44536362,
+ 45005894, 45475591, 45945448, 46415460, 46885623, 47355932, 47826384,
+ 48296973, 48767696, 49238547, 49709523, 50180619, 50651830, 51123152,
+ 51594580, 52066110, 52537738, 53009458, 53481267, 53953160, 54425132,
+ 54897178, 55369295, 55841478, 56313722, 56786022, 57258375, 57730775,
+ 58203217, 58675698, 59148213, 59620757, 60093325, 60565913, 61038516,
+ 61511130, 61983750, 62456371, 62928989, 63401599, 63874196, 64346776,
+ 64819334, 65291866, 65764366, 66236830, 66709254, 67181632, 67653961,
+ 68126234, 68598449, 69070599, 69542680, 70014688, 70486617, 70958463,
+ 71430222, 71901887, 72373456, 72844923, 73316282, 73787531, 74258662,
+ 74729673, 75200558, 75671312, 76141931, 76612410, 77082743, 77552927,
+ 78022956, 78492825, 78962530, 79432066, 79901428, 80370612, 80839611,
+ 81308423, 81777041, 82245461, 82713678, 83181687, 83649483, 84117062,
+ 84584419, 85051548, 85518445, 85985105, 86451523, 86917694, 87383613,
+ 87849276, 88314678, 88779813, 89244677, 89709264, 90173571, 90637591,
+ 91101321, 91564754, 92027887, 92490714, 92953230, 93415431, 93877312,
+ 94338866, 94800091, 95260980, 95721529, 96181732, 96641586, 97101084,
+ 97560222, 98018995, 98477398, 98935426, 99393074, 99850336, 100307209,
+ 100763687, 101219766, 101675439, 102130702, 102585551, 103039979,
+ 103493983, 103947557, 104400696, 104853395, 105305650, 105757454,
+ 106208804, 106659694, 107110119, 107560074, 108009554, 108458555,
+ 108907070, 109355096, 109802626, 110249657, 110696183, 111142198,
+ 111587699, 112032679, 112477135, 112921060, 113364450, 113807300,
+ 114249605, 114691360, 115132559, 115573198, 116013272, 116452775,
+ 116891703, 117330051, 117767813, 118204984, 118641560, 119077535,
+ 119512905, 119947664, 120381807, 120815330, 121248226, 121680492,
+ 122112122, 122543111, 122973454, 123403146, 123832183, 124260557,
+ 124688266, 125115304, 125541665, 125967345, 126392339, 126816642,
+ 127240248, 127663152, 128085351, 128506837, 128927607, 129347656,
+ 129766978, 130185568, 130603422, 131020534, 131436899, 131852512,
+ 132267369, 132681463, 133094791, 133507347, 133919126, 134330123,
+ 134740333, 135149751, 135558372, 135966191, 136373202, 136779402,
+ 137184785, 137589345, 137993078, 138395980, 138798044, 139199265,
+ 139599640, 139999162, 140397828, 140795631, 141192567, 141588630,
+ 141983817, 142378121, 142771538, 143164064, 143555691, 143946417,
+ 144336236, 144725143, 145113132, 145500200, 145886341, 146271550,
+ 146655821, 147039151, 147421535, 147802966, 148183440, 148562953,
+ 148941500, 149319074, 149695673, 150071290, 150445920, 150819559,
+ 151192202, 151563844, 151934479, 152304104, 152672713, 153040300,
+ 153406863, 153772394, 154136890, 154500346, 154862756, 155224116,
+ 155584421, 155943667, 156301847, 156658958, 157014994, 157369950,
+ 157723823, 158076606, 158428295, 158778886, 159128373, 159476751,
+ 159824016, 160170163, 160515187, 160859083, 161201847, 161543473,
+ 161883957, 162223294, 162561479, 162898508, 163234375, 163569077,
+ 163902607, 164234962, 164566136, 164896125, 165224925, 165552529,
+ 165878934, 166204135, 166528128, 166850906, 167172467, 167492804,
+ 167811914, 168129791, 168446432, 168761830, 169075982, 169388883,
+ 169700528, 170010913, 170320033, 170627882, 170934458, 171239755,
+ 171543767, 171846492, 172147924, 172448058, 172746890, 173044416,
+ 173340630, 173635528, 173929106, 174221359, 174512282, 174801872,
+ 175090122, 175377030, 175662589, 175946797, 176229648, 176511137,
+ 176791261, 177070014, 177347393, 177623392, 177898008, 178171236,
+ 178443070, 178713508, 178982545, 179250175, 179516395, 179781200,
+ 180044586, 180306549, 180567083, 180826185, 181083851, 181340075,
+ 181594854, 181848183, 182100057, 182350473, 182599427, 182846913,
+ 183092928, 183337467, 183580526, 183822101, 184062187, 184300780,
+ 184537876, 184773471, 185007560, 185240140, 185471205, 185700752,
+ 185928777, 186155275, 186380242, 186603674, 186825567, 187045916,
+ 187264719, 187481969, 187697664, 187911799, 188124371, 188335374,
+ 188544805, 188752660, 188958934, 189163625, 189366727, 189568236,
+ 189768149, 189966462, 190163171, 190358271, 190551758, 190743629,
+ 190933880, 191122507, 191309505, 191494871, 191678602, 191860692,
+ 192041138, 192219937, 192397084, 192572575, 192746407, 192918576,
+ 193089078, 193257909, 193425065, 193590543, 193754338, 193916448,
+ 194076868, 194235594, 194392623, 194547951, 194701574, 194853489,
+ 195003692, 195152179, 195298946, 195443991, 195587308, 195728895,
+ 195868748, 196006864, 196143238, 196277867, 196410748, 196541877,
+ 196671250, 196798864, 196924716, 197048802, 197171118, 197291661,
+ 197410427, 197527413, 197642616, 197756032, 197867657, 197977489,
+ 198085524, 198191758, 198296188, 198398811, 198499623, 198598621,
+ 198695802, 198791163, 198884699, 198976408, 199066287, 199154333,
+ 199240541, 199324909, 199407434, 199488112, 199566940, 199643916,
+ 199719035, 199792295, 199863693, 199933225, 200000889, 200066681,
+ 200130598, 200192637, 200252796, 200311071, 200367458, 200421956,
+ 200474561, 200525270, 200574080, 200620988, 200665991, 200709087,
+ 200750272, 200789544, 200826899, 200862335, 200895849, 200927438,
+ 200957100, 200984831, 201010629, 201034490, 201056413, 201076394,
+ 201094431, 201110521, 201124661, 201136849, 201147082, 201155357,
+ 201161671, 201166023, 201168409, 201168827, 201167274, 201163748,
+ 201158246, 201150766, 201141305, 201129860, 201116430, 201101011,
+ 201083601, 201064198, 201042800, 201019404, 200994007, 200966607,
+ 200937202, 200905790, 200872368, 200836934, 200799485, 200760020,
+ 200718535, 200675030, 200629501, 200581947, 200532365, 200480753,
+ 200427108, 200371430, 200313715, 200253961, 200192167, 200128331,
+ 200062449, 199994521, 199924544, 199852516, 199778436, 199702301,
+ 199624109, 199543858, 199461547, 199377173, 199290735, 199202231,
+ 199111658, 199019016, 198924302, 198827514, 198728651, 198627711,
+ 198524692, 198419593, 198312411, 198203145, 198091794, 197978355,
+ 197862827, 197745209, 197625498, 197503694, 197379794, 197253798,
+ 197125703, 196995507, 196863211, 196728811, 196592308, 196453698,
+ 196312981, 196170155, 196025219, 195878172, 195729012, 195577737,
+ 195424347, 195268841, 195111216, 194951472, 194789608, 194625621,
+ 194459512, 194291278, 194120919, 193948434, 193773821, 193597079,
+ 193418207, 193237205, 193054070, 192868803, 192681401, 192491864,
+ 192300191, 192106382, 191910434, 191712347, 191512121, 191309754,
+ 191105245, 190898594, 190689800, 190478862, 190265779, 190050551,
+ 189833176, 189613654, 189391984, 189168166, 188942199, 188714081,
+ 188483814, 188251395, 188016825, 187780102, 187541227, 187300198,
+ 187057016, 186811679, 186564187, 186314540, 186062737, 185808779,
+ 185552663, 185294391, 185033961, 184771374, 184506629, 184239725,
+ 183970664, 183699443, 183426063, 183150524, 182872826, 182592967,
+ 182310950, 182026772, 181740434, 181451936, 181161278, 180868459,
+ 180573480, 180276341, 179977042, 179675582, 179371962, 179066182,
+ 178758241, 178448141, 178135880, 177821460, 177504881, 177186142,
+ 176865243, 176542186, 176216970, 175889596, 175560063, 175228373,
+ 174894525, 174558520, 174220358, 173880040, 173537566, 173192936,
+ 172846152, 172497212, 172146119, 171792872, 171437471, 171079919,
+ 170720214, 170358358, 169994352, 169628195, 169259889, 168889435,
+ 168516832, 168142082, 167765186, 167386144, 167004956, 166621625,
+ 166236151, 165848534, 165458776, 165066876, 164672838, 164276660,
+ 163878345, 163477892, 163075304, 162670581, 162263724, 161854735,
+ 161443614, 161030363, 160614982, 160197473, 159777837, 159356075,
+ 158932188, 158506178, 158078046, 157647793, 157215421, 156780930,
+ 156344323, 155905600, 155464763, 155021814, 154576753, 154129582,
+ 153680303, 153228918, 152775427, 152319832, 151862135, 151402338,
+ 150940441, 150476448, 150010358, 149542175, 149071899, 148599533,
+ 148125078, 147648535, 147169908, 146689197, 146206404, 145721531,
+ 145234581, 144745554, 144254454, 143761281, 143266037, 142768726,
+ 142269348, 141767906, 141264402, 140758837, 140251215, 139741537,
+ 139229805, 138716021, 138200188, 137682307, 137162382, 136640413,
+ 136116404, 135590357, 135062274, 134532157, 134000009, 133465833,
+ 132929629, 132391402, 131851153, 131308885, 130764600, 130218301,
+ 129669990, 129119671, 128567345, 128013014, 127456683, 126898353,
+ 126338027, 125775708, 125211398, 124645100, 124076817, 123506552,
+ 122934307, 122360086, 121783890, 121205724, 120625589, 120043489,
+ 119459427, 118873406, 118285428, 117695497, 117103615, 116509786,
+ 115914013, 115316298, 114716645, 114115058, 113511539, 112906090,
+ 112298717, 111689421, 111078206, 110465076, 109850033, 109233081,
+ 108614223, 107993462, 107370803, 106746248, 106119800, 105491463,
+ 104861241, 104229138, 103595155, 102959298, 102321569, 101681973,
+ 101040512, 100397191, 99752013, 99104981, 98456100, 97805373, 97152804,
+ 96498396, 95842153, 95184080, 94524179, 93862456, 93198912, 92533554,
+ 91866383, 91197405, 90526623, 89854041, 89179663, 88503494, 87825537,
+ 87145795, 86464275, 85780978, 85095911, 84409075, 83720477, 83030120,
+ 82338007, 81644145, 80948536, 80251184, 79552096, 78851273, 78148722,
+ 77444445, 76738449, 76030736, 75321312, 74610181, 73897346, 73182814,
+ 72466588, 71748673, 71029074, 70307794, 69584839, 68860213, 68133921,
+ 67405967, 66676357, 65945094, 65212184, 64477631, 63741440, 63003617,
+ 62264164, 61523089, 60780395, 60036086, 59290169, 58542648, 57793528,
+ 57042814, 56290511, 55536624, 54781158, 54024117, 53265508, 52505334,
+ 51743602, 50980317, 50215482, 49449105, 48681189, 47911740, 47140764,
+ 46368265, 45594249, 44818721, 44041686, 43263150, 42483118, 41701596,
+ 40918588, 40134101, 39348140, 38560710, 37771816, 36981465, 36189661,
+ 35396411, 34601719, 33805592, 33008035, 32209053, 31408653, 30606839,
+ 29803618, 28998996, 28192978, 27385569, 26576776, 25766604, 24955060,
+ 24142148, 23327876, 22512248, 21695271, 20876950, 20057292, 19236302,
+ 18413986, 17590351, 16765402, 15939146, 15111588, 14282735, 13452592,
+ 12621166, 11788463, 10954488, 10119249, 9282752, 8445002, 7606006,
+ 6765770, 5924300, 5081603, 4237684, 3392552, 2546210, 1698667, 849928,
+ 0, -851111, -1703398, -2556855, -3411476, -4267254, -5124182, -5982254,
+ -6841463, -7701803, -8563267, -9425848, -10289541, -11154337,
+ -12020232, -12887217, -13755286, -14624432, -15494649, -16365930,
+ -17238268, -18111657, -18986089, -19861557, -20738055, -21615576,
+ -22494114, -23373660, -24254208, -25135751, -26018283, -26901796,
+ -27786283, -28671737, -29558151, -30445519, -31333832, -32223084,
+ -33113268, -34004377, -34896403, -35789340, -36683179, -37577914,
+ -38473539, -39370044, -40267424, -41165670, -42064777, -42964735,
+ -43865538, -44767179, -45669651, -46572945, -47477054, -48381972,
+ -49287690, -50194201, -51101498, -52009574, -52918420, -53828029,
+ -54738393, -55649506, -56561359, -57473945, -58387257, -59301286,
+ -60216025, -61131467, -62047603, -62964426, -63881929, -64800103,
+ -65718941, -66638435, -67558578, -68479361, -69400776, -70322817,
+ -71245475, -72168742, -73092610, -74017072, -74942119, -75867744,
+ -76793939, -77720695, -78648005, -79575861, -80504255, -81433179,
+ -82362624, -83292584, -84223048, -85154011, -86085463, -87017396,
+ -87949803, -88882675, -89816004, -90749782, -91684000, -92618651,
+ -93553726, -94489218, -95425117, -96361415, -97298105, -98235178,
+ -99172625, -100110439, -101048611, -101987132, -102925995, -103865191,
+ -104804712, -105744548, -106684693, -107625137, -108565871, -109506888,
+ -110448179, -111389736, -112331549, -113273611, -114215913, -115158447,
+ -116101203, -117044174, -117987350, -118930723, -119874285, -120818027,
+ -121761940, -122706015, -123650245, -124594619, -125539131, -126483770,
+ -127428528, -128373397, -129318368, -130263431, -131208579, -132153802,
+ -133099091, -134044439, -134989835, -135935272, -136880740, -137826230,
+ -138771734, -139717243, -140662748, -141608239, -142553709, -143499147,
+ -144444546, -145389896, -146335189, -147280414, -148225564, -149170629,
+ -150115601, -151060470, -152005227, -152949863, -153894370, -154838737,
+ -155782957, -156727019, -157670916, -158614637, -159558173, -160501517,
+ -161444657, -162387586, -163330294, -164272771, -165215010, -166156999,
+ -167098731, -168040197, -168981386, -169922289, -170862898, -171803203,
+ -172743195, -173682864, -174622202, -175561199, -176499845, -177438132,
+ -178376050, -179313590, -180250742, -181187497, -182123845, -183059778,
+ -183995286, -184930359, -185864989, -186799165, -187732879, -188666120,
+ -189598880, -190531149, -191462917, -192394176, -193324915, -194255125,
+ -195184797, -196113922, -197042488, -197970489, -198897912, -199824750,
+ -200750993, -201676630, -202601653, -203526052, -204449817, -205372939,
+ -206295409, -207217216, -208138351, -209058805, -209978567, -210897629,
+ -211815980, -212733611, -213650513, -214566675, -215482088, -216396743,
+ -217310630, -218223738, -219136059, -220047583, -220958299, -221868199,
+ -222777273, -223685510, -224592902, -225499438, -226405109, -227309904,
+ -228213815, -229116832, -230018944, -230920143, -231820417, -232719759,
+ -233618157, -234515601, -235412083, -236307593, -237202120, -238095654,
+ -238988187, -239879708, -240770207, -241659675, -242548102, -243435477,
+ -244321791, -245207035, -246091198, -246974271, -247856243, -248737106,
+ -249616848, -250495460, -251372933, -252249256, -253124420, -253998414,
+ -254871229, -255742855, -256613282, -257482501, -258350500, -259217271,
+ -260082803, -260947087, -261810112, -262671870, -263532349, -264391540,
+ -265249433, -266106018, -266961285, -267815225, -268667826, -269519081,
+ -270368977, -271217507, -272064659, -272910423, -273754791, -274597751,
+ -275439294, -276279410, -277118089, -277955321, -278791096, -279625404,
+ -280458235, -281289580, -282119428, -282947769, -283774594, -284599892,
+ -285423654, -286245869, -287066528, -287885620, -288703136, -289519066,
+ -290333400, -291146127, -291957238, -292766724, -293574573, -294380776,
+ -295185323, -295988204, -296789409, -297588928, -298386752, -299182870,
+ -299977272, -300769949, -301560889, -302350085, -303137524, -303923199,
+ -304707098, -305489211, -306269530, -307048043, -307824741, -308599613,
+ -309372651, -310143844, -310913182, -311680655, -312446253, -313209966,
+ -313971785, -314731699, -315489699, -316245774, -316999915, -317752112,
+ -318502355, -319250633, -319996938, -320741258, -321483585, -322223908,
+ -322962218, -323698504, -324432757, -325164967, -325895123, -326623217,
+ -327349238, -328073176, -328795021, -329514764, -330232395, -330947903,
+ -331661280, -332372514, -333081597, -333788518, -334493268, -335195837,
+ -335896215, -336594392, -337290358, -337984104, -338675620, -339364895,
+ -340051921, -340736687, -341419183, -342099400, -342777329, -343452958,
+ -344126280, -344797282, -345465957, -346132294, -346796284, -347457916,
+ -348117182, -348774071, -349428573, -350080679, -350730380, -351377665,
+ -352022525, -352664950, -353304930, -353942456, -354577519, -355210108,
+ -355840214, -356467827, -357092937, -357715536, -358335613, -358953158,
+ -359568163, -360180618, -360790512, -361397837, -362002582, -362604739,
+ -363204297, -363801248, -364395581, -364987287, -365576357, -366162781,
+ -366746550, -367327653, -367906083, -368481828, -369054880, -369625229,
+ -370192866, -370757781, -371319965, -371879408, -372436102, -372990036,
+ -373541201, -374089588, -374635188, -375177990, -375717987, -376255168,
+ -376789524, -377321045, -377849723, -378375549, -378898512, -379418604,
+ -379935815, -380450136, -380961558, -381470071, -381975667, -382478336,
+ -382978069, -383474856, -383968689, -384459559, -384947455, -385432370,
+ -385914294, -386393217, -386869131, -387342027, -387811895, -388278727,
+ -388742512, -389203244, -389660911, -390115506, -390567019, -391015441,
+ -391460763, -391902977, -392342073, -392778042, -393210876, -393640565,
+ -394067100, -394490474, -394910676, -395327698, -395741531, -396152166,
+ -396559594, -396963807, -397364796, -397762552, -398157066, -398548329,
+ -398936333, -399321069, -399702528, -400080701, -400455581, -400827157,
+ -401195422, -401560367, -401921983, -402280261, -402635194, -402986771,
+ -403334986, -403679829, -404021291, -404359365, -404694041, -405025311,
+ -405353167, -405677601, -405998603, -406316165, -406630279, -406940937,
+ -407248130, -407551850, -407852088, -408148836, -408442085, -408731829,
+ -409018057, -409300762, -409579936, -409855570, -410127656, -410396186,
+ -410661152, -410922546, -411180359, -411434583, -411685211, -411932233,
+ -412175643, -412415431, -412651590, -412884112, -413112989, -413338213,
+ -413559775, -413777669, -413991885, -414202417, -414409255, -414612393,
+ -414811822, -415007535, -415199523, -415387779, -415572295, -415753064,
+ -415930077, -416103326, -416272805, -416438506, -416600420, -416758540,
+ -416912858, -417063367, -417210059, -417352927, -417491963, -417627159,
+ -417758509, -417886003, -418009636, -418129399, -418245286, -418357287,
+ -418465397, -418569608, -418669913, -418766303, -418858772, -418947313,
+ -419031918, -419112580, -419189292, -419262046, -419330835, -419395653,
+ -419456491, -419513344, -419566203, -419615061, -419659912, -419700749,
+ -419737564, -419770351, -419799102, -419823811, -419844470, -419861073,
+ -419873612, -419882082, -419886474, -419886783, -419883001, -419875121,
+ -419863138, -419847044, -419826832, -419802495, -419774028, -419741423,
+ -419704674, -419663774, -419618716, -419569494, -419516102, -419458533,
+ -419396780, -419330837, -419260698, -419186356, -419107804, -419025037,
+ -418938048, -418846831, -418751379, -418651686, -418547746, -418439552,
+ -418327099, -418210380, -418089389, -417964121, -417834568, -417700724,
+ -417562585, -417420143, -417273392, -417122328, -416966943, -416807232,
+ -416643188, -416474807, -416302082, -416125007, -415943576, -415757784,
+ -415567625, -415373093, -415174183, -414970888, -414763204, -414551124,
+ -414334643, -414113755, -413888455, -413658738, -413424597, -413186027,
+ -412943023, -412695579, -412443691, -412187351, -411926557, -411661301,
+ -411391578, -411117384, -410838714, -410555561, -410267921, -409975788,
+ -409679158, -409378025, -409072384, -408762231, -408447559, -408128365,
+ -407804643, -407476389, -407143596, -406806261, -406464379, -406117944,
+ -405766953, -405411399, -405051279, -404686587, -404317320, -403943472,
+ -403565038, -403182015, -402794397, -402402180, -402005359, -401603930,
+ -401197889, -400787230, -400371950, -399952044, -399527508, -399098338,
+ -398664529, -398226076, -397782976, -397335225, -396882818, -396425751,
+ -395964020, -395497621, -395026549, -394550802, -394070374, -393585262,
+ -393095461, -392600969, -392101780, -391597892, -391089299, -390576000,
+ -390057988, -389535262, -389007817, -388475650, -387938756, -387397133,
+ -386850776, -386299683, -385743848, -385183270, -384617945, -384047868,
+ -383473037, -382893449, -382309099, -381719985, -381126103, -380527450,
+ -379924023, -379315818, -378702833, -378085064, -377462509, -376835163,
+ -376203024, -375566089, -374924355, -374277819, -373626479, -372970330,
+ -372309371, -371643598, -370973009, -370297600, -369617370, -368932315,
+ -368242433, -367547721, -366848177, -366143797, -365434580, -364720522,
+ -364001622, -363277877, -362549284, -361815841, -361077546, -360334396,
+ -359586389, -358833523, -358075795, -357313204, -356545746, -355773421,
+ -354996225, -354214158, -353427216, -352635397, -351838701, -351037124,
+ -350230665, -349419322, -348603093, -347781977, -346955971, -346125073,
+ -345289283, -344448598, -343603017, -342752538, -341897159, -341036879,
+ -340171697, -339301610, -338426618, -337546719, -336661911, -335772194,
+ -334877565, -333978025, -333073570, -332164201, -331249915, -330330712,
+ -329406591, -328477550, -327543589, -326604706, -325660900, -324712171,
+ -323758517, -322799938, -321836433, -320868001, -319894640, -318916351,
+ -317933133, -316944985, -315951905, -314953895, -313950952, -312943077,
+ -311930269, -310912527, -309889851, -308862241, -307829696, -306792215,
+ -305749799, -304702448, -303650160, -302592936, -301530775, -300463677,
+ -299391643, -298314672, -297232764, -296145919, -295054137, -293957418,
+ -292855762, -291749170, -290637641, -289521175, -288399774, -287273436,
+ -286142163, -285005955, -283864811, -282718733, -281567721, -280411776,
+ -279250897, -278085085, -276914342, -275738667, -274558061, -273372525,
+ -272182059, -270986665, -269786343, -268581093, -267370917, -266155816,
+ -264935790, -263710841, -262480969, -261246175, -260006461, -258761828,
+ -257512275, -256257806, -254998421, -253734121, -252464907, -251190781,
+ -249911745, -248627798, -247338944, -246045183, -244746516, -243442946,
+ -242134474, -240821100, -239502828, -238179659, -236851593, -235518634,
+ -234180783, -232838041, -231490410, -230137892, -228780490, -227418205,
+ -226051038, -224678993, -223302070, -221920273, -220533602, -219142061,
+ -217745652, -216344376, -214938236, -213527234, -212111372, -210690654,
+ -209265080, -207834654, -206399379, -204959256, -203514288, -202064477,
+ -200609827, -199150340, -197686018, -196216864, -194742882, -193264073,
+ -191780440, -190291987, -188798717, -187300631, -185797733, -184290027,
+ -182777515, -181260199, -179738085, -178211173, -176679468, -175142972,
+ -173601690, -172055624, -170504777, -168949153, -167388755, -165823587,
+ -164253652, -162678954, -161099495, -159515280, -157926313, -156332596,
+ -154734133, -153130929, -151522986, -149910309, -148292902, -146670768,
+ -145043910, -143412334, -141776043, -140135041, -138489331, -136838919,
+ -135183807, -133524001, -131859504, -130190320, -128516454, -126837910,
+ -125154692, -123466805, -121774253, -120077040, -118375170, -116668649,
+ -114957481, -113241670, -111521220, -109796137, -108066425, -106332089,
+ -104593133, -102849562, -101101382, -99348596, -97591209, -95829227,
+ -94062655, -92291497, -90515758, -88735444, -86950559, -85161109,
+ -83367098, -81568532, -79765416, -77957756, -76145556, -74328822,
+ -72507559, -70681773, -68851468, -67016651, -65177327, -63333502,
+ -61485180, -59632368, -57775071, -55913295, -54047045, -52176328,
+ -50301149, -48421513, -46537427, -44648897, -42755927, -40858526,
+ -38956697, -37050448, -35139784, -33224711, -31305236, -29381364,
+ -27453102, -25520456, -23583433, -21642037, -19696277, -17746158,
+ -15791686, -13832868, -11869711, -9902220, -7930403, -5954266,
+ -3973815, -1989057, 0, 1993351, 3990989, 5992908, 7999099, 10009557,
+ 12024275, 14043245, 16066462, 18093917, 20125604, 22161515, 24201645,
+ 26245985, 28294529, 30347269, 32404199, 34465310, 36530596, 38600050,
+ 40673664, 42751430, 44833342, 46919392, 49009572, 51103875, 53202294,
+ 55304821, 57411447, 59522167, 61636972, 63755854, 65878805, 68005819,
+ 70136886, 72272000, 74411152, 76554335, 78701540, 80852759, 83007986,
+ 85167211, 87330427, 89497625, 91668797, 93843936, 96023032, 98206079,
+ 100393067, 102583988, 104778834, 106977597, 109180268, 111386839,
+ 113597301, 115811647, 118029866, 120251952, 122477895, 124707686,
+ 126941318, 129178781, 131420066, 133665166, 135914071, 138166772,
+ 140423261, 142683529, 144947566, 147215364, 149486915, 151762208,
+ 154041235, 156323988, 158610456, 160900631, 163194503, 165492064,
+ 167793304, 170098214, 172406785, 174719008, 177034872, 179354369,
+ 181677490, 184004225, 186334564, 188668498, 191006017, 193347113,
+ 195691775, 198039994, 200391760, 202747064, 205105895, 207468245,
+ 209834102, 212203459, 214576304, 216952628, 219332421, 221715674,
+ 224102375, 226492516, 228886086, 231283075, 233683473, 236087271,
+ 238494457, 240905023, 243318957, 245736249, 248156890, 250580868,
+ 253008175, 255438798, 257872729, 260309957, 262750470, 265194260,
+ 267641315, 270091624, 272545178, 275001966, 277461978, 279925201,
+ 282391627, 284861244, 287334042, 289810010, 292289136, 294771412,
+ 297256824, 299745364, 302237020, 304731780, 307229635, 309730572,
+ 312234582, 314741654, 317251775, 319764936, 322281124, 324800329,
+ 327322541, 329847747, 332375936, 334907097, 337441220, 339978292,
+ 342518303, 345061240, 347607094, 350155852, 352707502, 355262035,
+ 357819437, 360379698, 362942806, 365508749, 368077516, 370649096,
+ 373223477, 375800646, 378380593, 380963306, 383548773, 386136982,
+ 388727921, 391321579, 393917945, 396517005, 399118748, 401723162,
+ 404330236, 406939958, 409552314, 412167294, 414784886, 417405076,
+ 420027854, 422653207, 425281123, 427911590, 430544596, 433180128,
+ 435818174, 438458723, 441101761, 443747277, 446395257, 449045691,
+ 451698565, 454353867, 457011584, 459671705, 462334217, 464999106,
+ 467666362, 470335970, 473007919, 475682196, 478358789, 481037684,
+ 483718870, 486402333, 489088061, 491776040, 494466260, 497158705,
+ 499853365, 502550225, 505249274, 507950497, 510653883, 513359419,
+ 516067091, 518776887, 521488793, 524202797, 526918886, 529637047,
+ 532357266, 535079530, 537803827, 540530143, 543258465, 545988781,
+ 548721076, 551455337, 554191552, 556929708, 559669790, 562411785,
+ 565155681, 567901464, 570649121, 573398637, 576150001, 578903198,
+ 581658215, 584415039, 587173656, 589934052, 592696215, 595460130,
+ 598225784, 600993163, 603762255, 606533045, 609305519, 612079664,
+ 614855467, 617632914, 620411990, 623192683, 625974978, 628758862,
+ 631544321, 634331341, 637119908, 639910009, 642701630, 645494757,
+ 648289375, 651085472, 653883033, 656682043, 659482491, 662284360,
+ 665087638, 667892309, 670698362, 673505780, 676314550, 679124659,
+ 681936091, 684748834, 687562872, 690378191, 693194778, 696012619,
+ 698831698, 701652002, 704473517, 707296228, 710120121, 712945183,
+ 715771397, 718598751, 721427230, 724256820, 727087505, 729919273,
+ 732752108, 735585996, 738420923, 741256874, 744093835, 746931791,
+ 749770728, 752610632, 755451487, 758293280, 761135996, 763979620,
+ 766824137, 769669534, 772515796, 775362907, 778210854, 781059622,
+ 783909195, 786759561, 789610703, 792462607, 795315258, 798168642,
+ 801022745, 803877550, 806733044, 809589212, 812446038, 815303509,
+ 818161610, 821020325, 823879639, 826739539, 829600009, 832461034,
+ 835322599, 838184690, 841047292, 843910389, 846773967, 849638011,
+ 852502506, 855367437, 858232788, 861098546, 863964696, 866831221,
+ 869698107, 872565339, 875432903, 878300782, 881168963, 884037429,
+ 886906166, 889775160, 892644394, 895513853, 898383523, 901253389,
+ 904123434, 906993645, 909864006, 912734502, 915605118, 918475838,
+ 921346648, 924217532, 927088475, 929959462, 932830478, 935701506,
+ 938572534, 941443544, 944314522, 947185452, 950056319, 952927109,
+ 955797805, 958668393, 961538857, 964409182, 967279352, 970149352,
+ 973019168, 975888783, 978758182, 981627351, 984496273, 987364933,
+ 990233316, 993101407, 995969190, 998836650, 1001703771, 1004570539,
+ 1007436937, 1010302950, 1013168564, 1016033762, 1018898529, 1021762849,
+ 1024626709, 1027490091, 1030352980, 1033215361, 1036077219, 1038938538,
+ 1041799303, 1044659498, 1047519108, 1050378117, 1053236511, 1056094272,
+ 1058951387, 1061807839, 1064663612, 1067518693, 1070373065, 1073226712,
+ 1076079619, 1078931771, 1081783151, 1084633746, 1087483539, 1090332514,
+ 1093180656, 1096027950, 1098874380, 1101719930, 1104564586, 1107408331,
+ 1110251150, 1113093028, 1115933949, 1118773897, 1121612857, 1124450814,
+ 1127287751, 1130123654, 1132958507, 1135792294, 1138625000, 1141456610,
+ 1144287107, 1147116476, 1149944702, 1152771769, 1155597662, 1158422365,
+ 1161245863, 1164068139, 1166889179, 1169708968, 1172527488, 1175344726,
+ 1178160665, 1180975290, 1183788586, 1186600536, 1189411126, 1192220340,
+ 1195028162, 1197834577, 1200639569, 1203443123, 1206245223, 1209045854,
+ 1211845000, 1214642646, 1217438776, 1220233375, 1223026428, 1225817918,
+ 1228607830, 1231396150, 1234182860, 1236967947, 1239751393, 1242533185,
+ 1245313306, 1248091742, 1250868475, 1253643492, 1256416776, 1259188313,
+ 1261958086, 1264726080, 1267492280, 1270256671, 1273019236, 1275779961,
+ 1278538831, 1281295828, 1284050940, 1286804149, 1289555440, 1292304799,
+ 1295052209, 1297797656, 1300541123, 1303282596, 1306022060, 1308759498,
+ 1311494895, 1314228237, 1316959508, 1319688692, 1322415774, 1325140739,
+ 1327863572, 1330584256, 1333302778, 1336019121, 1338733271, 1341445211,
+ 1344154928, 1346862404, 1349567627, 1352270579, 1354971246, 1357669612,
+ 1360365663, 1363059382, 1365750756, 1368439768, 1371126404, 1373810648,
+ 1376492485, 1379171901, 1381848879, 1384523404, 1387195462, 1389865038,
+ 1392532116, 1395196681, 1397858718, 1400518212, 1403175148, 1405829511,
+ 1408481285, 1411130456, 1413777009, 1416420929, 1419062200, 1421700808,
+ 1424336737, 1426969973, 1429600501, 1432228305, 1434853371, 1437475684,
+ 1440095228, 1442711990, 1445325953, 1447937104, 1450545427, 1453150907,
+ 1455753530, 1458353281, 1460950144, 1463544105, 1466135149, 1468723262,
+ 1471308429, 1473890634, 1476469863, 1479046101, 1481619334, 1484189547,
+ 1486756725, 1489320854, 1491881918, 1494439903, 1496994794, 1499546578,
+ 1502095238, 1504640761, 1507183132, 1509722336, 1512258360, 1514791187,
+ 1517320804, 1519847196, 1522370348, 1524890247, 1527406877, 1529920225,
+ 1532430275, 1534937014, 1537440426, 1539940498, 1542437215, 1544930562,
+ 1547420526, 1549907092, 1552390245, 1554869972, 1557346257, 1559819088,
+ 1562288449, 1564754326, 1567216705, 1569675572, 1572130912, 1574582712,
+ 1577030957, 1579475633, 1581916726, 1584354222, 1586788106, 1589218366,
+ 1591644985, 1594067952, 1596487251, 1598902868, 1601314790, 1603723003,
+ 1606127492, 1608528243, 1610925244, 1613318479, 1615707936, 1618093599,
+ 1620475456, 1622853492, 1625227694, 1627598048, 1629964539, 1632327156,
+ 1634685882, 1637040706, 1639391613, 1641738589, 1644081622, 1646420696,
+ 1648755800, 1651086918, 1653414038, 1655737146, 1658056228, 1660371271,
+ 1662682262, 1664989187, 1667292032, 1669590784, 1671885430, 1674175956,
+ 1676462350, 1678744597, 1681022684, 1683296598, 1685566326, 1687831854,
+ 1690093170, 1692350260, 1694603110, 1696851709, 1699096042, 1701336096,
+ 1703571858, 1705803316, 1708030456, 1710253265, 1712471731, 1714685839,
+ 1716895578, 1719100934, 1721301894, 1723498446, 1725690576, 1727878272,
+ 1730061521, 1732240310, 1734414627, 1736584458, 1738749790, 1740910612,
+ 1743066911, 1745218673, 1747365887, 1749508539, 1751646617, 1753780108,
+ 1755909000, 1758033281, 1760152938, 1762267958, 1764378329, 1766484039,
+ 1768585075, 1770681424, 1772773076, 1774860016, 1776942233, 1779019715,
+ 1781092450, 1783160425, 1785223627, 1787282046, 1789335668, 1791384482,
+ 1793428476, 1795467637, 1797501954, 1799531414, 1801556006, 1803575717,
+ 1805590536, 1807600451, 1809605450, 1811605521, 1813600652, 1815590832,
+ 1817576048, 1819556289, 1821531544, 1823501800, 1825467047, 1827427272,
+ 1829382463, 1831332610, 1833277700, 1835217723, 1837152667, 1839082519,
+ 1841007270, 1842926907, 1844841419, 1846750795, 1848655023, 1850554092,
+ 1852447992, 1854336710, 1856220236, 1858098558, 1859971665, 1861839546,
+ 1863702190, 1865559587, 1867411724, 1869258591, 1871100178, 1872936472,
+ 1874767464, 1876593142, 1878413495, 1880228513, 1882038186, 1883842501,
+ 1885641449, 1887435018, 1889223199, 1891005980, 1892783351, 1894555301,
+ 1896321820, 1898082898, 1899838523, 1901588686, 1903333375, 1905072582,
+ 1906806294, 1908534502, 1910257196, 1911974366, 1913686000, 1915392090,
+ 1917092624, 1918787593, 1920476987, 1922160795, 1923839008, 1925511615,
+ 1927178607, 1928839973, 1930495704, 1932145790, 1933790221, 1935428987,
+ 1937062078, 1938689486, 1940311199, 1941927208, 1943537504, 1945142077,
+ 1946740917, 1948334016, 1949921363, 1951502948, 1953078764, 1954648799,
+ 1956213045, 1957771492, 1959324131, 1960870953, 1962411949, 1963947109,
+ 1965476424, 1966999885, 1968517483, 1970029209, 1971535053, 1973035008,
+ 1974529063, 1976017210, 1977499440, 1978975744, 1980446113, 1981910538,
+ 1983369012, 1984821524, 1986268067, 1987708631, 1989143208, 1990571790,
+ 1991994367, 1993410932, 1994821475, 1996225989, 1997624465, 1999016895,
+ 2000403269, 2001783581, 2003157821, 2004525982, 2005888055, 2007244032,
+ 2008593904, 2009937665, 2011275306, 2012606818, 2013932194, 2015251425,
+ 2016564505, 2017871425, 2019172176, 2020466752, 2021755145, 2023037347,
+ 2024313349, 2025583145, 2026846727, 2028104088, 2029355219, 2030600113,
+ 2031838763, 2033071161, 2034297301, 2035517173, 2036730772, 2037938090,
+ 2039139119, 2040333853, 2041522284, 2042704405, 2043880210, 2045049690,
+ 2046212839, 2047369650, 2048520115, 2049664229, 2050801984, 2051933373,
+ 2053058390, 2054177028, 2055289279, 2056395138, 2057494597, 2058587651,
+ 2059674291, 2060754513, 2061828309, 2062895673, 2063956599, 2065011080,
+ 2066059109, 2067100681, 2068135789, 2069164427, 2070186589, 2071202268,
+ 2072211459, 2073214155, 2074210351, 2075200040, 2076183216, 2077159874,
+ 2078130008, 2079093611, 2080050678, 2081001203, 2081945181, 2082882605,
+ 2083813470, 2084737771, 2085655502, 2086566657, 2087471231, 2088369219,
+ 2089260614, 2090145412, 2091023607, 2091895195, 2092760169, 2093618524,
+ 2094470256, 2095315359, 2096153828, 2096985658, 2097810844, 2098629381,
+ 2099441264, 2100246488, 2101045049, 2101836941, 2102622160, 2103400701,
+ 2104172559, 2104937730, 2105696208, 2106447991, 2107193072, 2107931447,
+ 2108663112, 2109388063, 2110106295, 2110817803, 2111522584, 2112220634,
+ 2112911947, 2113596520, 2114274349, 2114945429, 2115609757, 2116267329,
+ 2116918140, 2117562186, 2118199465, 2118829971, 2119453701, 2120070652,
+ 2120680819, 2121284199, 2121880788, 2122470582, 2123053579, 2123629775,
+ 2124199165, 2124761747, 2125317517, 2125866472, 2126408608, 2126943923,
+ 2127472413, 2127994074, 2128508904, 2129016900, 2129518058, 2130012376,
+ 2130499850, 2130980477, 2131454255, 2131921181, 2132381251, 2132834464,
+ 2133280816, 2133720305, 2134152928, 2134578682, 2134997565, 2135409574,
+ 2135814707, 2136212961, 2136604334, 2136988824, 2137366428, 2137737144,
+ 2138100969, 2138457902, 2138807941, 2139151082, 2139487325, 2139816667,
+ 2140139106, 2140454640, 2140763267, 2141064986, 2141359794, 2141647690,
+ 2141928672, 2142202738, 2142469887, 2142730117, 2142983427, 2143229814,
+ 2143469278, 2143701817, 2143927429, 2144146114, 2144357869, 2144562694,
+ 2144760588, 2144951548, 2145135575, 2145312666, 2145482822, 2145646040,
+ 2145802320, 2145951661, 2146094061, 2146229521, 2146358039, 2146479615,
+ 2146594247, 2146701936, 2146802680, 2146896478, 2146983331, 2147063238,
+ 2147136198, 2147202210, 2147261275, 2147313392, 2147358561, 2147396781,
+ 2147428052, 2147452375, 2147469748, 2147480172, 2147483647, 2147480172,
+ 2147469748, 2147452375, 2147428052, 2147396781, 2147358561, 2147313392,
+ 2147261275, 2147202210, 2147136198, 2147063238, 2146983331, 2146896478,
+ 2146802680, 2146701936, 2146594247, 2146479615, 2146358039, 2146229521,
+ 2146094061, 2145951661, 2145802320, 2145646040, 2145482822, 2145312666,
+ 2145135575, 2144951548, 2144760588, 2144562694, 2144357869, 2144146114,
+ 2143927429, 2143701817, 2143469278, 2143229814, 2142983427, 2142730117,
+ 2142469887, 2142202738, 2141928672, 2141647690, 2141359794, 2141064986,
+ 2140763267, 2140454640, 2140139106, 2139816667, 2139487325, 2139151082,
+ 2138807941, 2138457902, 2138100969, 2137737144, 2137366428, 2136988824,
+ 2136604334, 2136212961, 2135814707, 2135409574, 2134997565, 2134578682,
+ 2134152928, 2133720305, 2133280816, 2132834464, 2132381251, 2131921181,
+ 2131454255, 2130980477, 2130499850, 2130012376, 2129518058, 2129016900,
+ 2128508904, 2127994074, 2127472413, 2126943923, 2126408608, 2125866472,
+ 2125317517, 2124761747, 2124199165, 2123629775, 2123053579, 2122470582,
+ 2121880788, 2121284199, 2120680819, 2120070652, 2119453701, 2118829971,
+ 2118199465, 2117562186, 2116918140, 2116267329, 2115609757, 2114945429,
+ 2114274349, 2113596520, 2112911947, 2112220634, 2111522584, 2110817803,
+ 2110106295, 2109388063, 2108663112, 2107931447, 2107193072, 2106447991,
+ 2105696208, 2104937730, 2104172559, 2103400701, 2102622160, 2101836941,
+ 2101045049, 2100246488, 2099441264, 2098629381, 2097810844, 2096985658,
+ 2096153828, 2095315359, 2094470256, 2093618524, 2092760169, 2091895195,
+ 2091023607, 2090145412, 2089260614, 2088369219, 2087471231, 2086566657,
+ 2085655502, 2084737771, 2083813470, 2082882605, 2081945181, 2081001203,
+ 2080050678, 2079093611, 2078130008, 2077159874, 2076183216, 2075200040,
+ 2074210351, 2073214155, 2072211459, 2071202268, 2070186589, 2069164427,
+ 2068135789, 2067100681, 2066059109, 2065011080, 2063956599, 2062895673,
+ 2061828309, 2060754513, 2059674291, 2058587651, 2057494597, 2056395138,
+ 2055289279, 2054177028, 2053058390, 2051933373, 2050801984, 2049664229,
+ 2048520115, 2047369650, 2046212839, 2045049690, 2043880210, 2042704405,
+ 2041522284, 2040333853, 2039139119, 2037938090, 2036730772, 2035517173,
+ 2034297301, 2033071161, 2031838763, 2030600113, 2029355219, 2028104088,
+ 2026846727, 2025583145, 2024313349, 2023037347, 2021755145, 2020466752,
+ 2019172176, 2017871425, 2016564505, 2015251425, 2013932194, 2012606818,
+ 2011275306, 2009937665, 2008593904, 2007244032, 2005888055, 2004525982,
+ 2003157821, 2001783581, 2000403269, 1999016895, 1997624465, 1996225989,
+ 1994821475, 1993410932, 1991994367, 1990571790, 1989143208, 1987708631,
+ 1986268067, 1984821524, 1983369012, 1981910538, 1980446113, 1978975744,
+ 1977499440, 1976017210, 1974529063, 1973035008, 1971535053, 1970029209,
+ 1968517483, 1966999885, 1965476424, 1963947109, 1962411949, 1960870953,
+ 1959324131, 1957771492, 1956213045, 1954648799, 1953078764, 1951502948,
+ 1949921363, 1948334016, 1946740917, 1945142077, 1943537504, 1941927208,
+ 1940311199, 1938689486, 1937062078, 1935428987, 1933790221, 1932145790,
+ 1930495704, 1928839973, 1927178607, 1925511615, 1923839008, 1922160795,
+ 1920476987, 1918787593, 1917092624, 1915392090, 1913686000, 1911974366,
+ 1910257196, 1908534502, 1906806294, 1905072582, 1903333375, 1901588686,
+ 1899838523, 1898082898, 1896321820, 1894555301, 1892783351, 1891005980,
+ 1889223199, 1887435018, 1885641449, 1883842501, 1882038186, 1880228513,
+ 1878413495, 1876593142, 1874767464, 1872936472, 1871100178, 1869258591,
+ 1867411724, 1865559587, 1863702190, 1861839546, 1859971665, 1858098558,
+ 1856220236, 1854336710, 1852447992, 1850554092, 1848655023, 1846750795,
+ 1844841419, 1842926907, 1841007270, 1839082519, 1837152667, 1835217723,
+ 1833277700, 1831332610, 1829382463, 1827427272, 1825467047, 1823501800,
+ 1821531544, 1819556289, 1817576048, 1815590832, 1813600652, 1811605521,
+ 1809605450, 1807600451, 1805590536, 1803575717, 1801556006, 1799531414,
+ 1797501954, 1795467637, 1793428476, 1791384482, 1789335668, 1787282046,
+ 1785223627, 1783160425, 1781092450, 1779019715, 1776942233, 1774860016,
+ 1772773076, 1770681424, 1768585075, 1766484039, 1764378329, 1762267958,
+ 1760152938, 1758033281, 1755909000, 1753780108, 1751646617, 1749508539,
+ 1747365887, 1745218673, 1743066911, 1740910612, 1738749790, 1736584458,
+ 1734414627, 1732240310, 1730061521, 1727878272, 1725690576, 1723498446,
+ 1721301894, 1719100934, 1716895578, 1714685839, 1712471731, 1710253265,
+ 1708030456, 1705803316, 1703571858, 1701336096, 1699096042, 1696851709,
+ 1694603110, 1692350260, 1690093170, 1687831854, 1685566326, 1683296598,
+ 1681022684, 1678744597, 1676462350, 1674175956, 1671885430, 1669590784,
+ 1667292032, 1664989187, 1662682262, 1660371271, 1658056228, 1655737146,
+ 1653414038, 1651086918, 1648755800, 1646420696, 1644081622, 1641738589,
+ 1639391613, 1637040706, 1634685882, 1632327156, 1629964539, 1627598048,
+ 1625227694, 1622853492, 1620475456, 1618093599, 1615707936, 1613318479,
+ 1610925244, 1608528243, 1606127492, 1603723003, 1601314790, 1598902868,
+ 1596487251, 1594067952, 1591644985, 1589218366, 1586788106, 1584354222,
+ 1581916726, 1579475633, 1577030957, 1574582712, 1572130912, 1569675572,
+ 1567216705, 1564754326, 1562288449, 1559819088, 1557346257, 1554869972,
+ 1552390245, 1549907092, 1547420526, 1544930562, 1542437215, 1539940498,
+ 1537440426, 1534937014, 1532430275, 1529920225, 1527406877, 1524890247,
+ 1522370348, 1519847196, 1517320804, 1514791187, 1512258360, 1509722336,
+ 1507183132, 1504640761, 1502095238, 1499546578, 1496994794, 1494439903,
+ 1491881918, 1489320854, 1486756725, 1484189547, 1481619334, 1479046101,
+ 1476469863, 1473890634, 1471308429, 1468723262, 1466135149, 1463544105,
+ 1460950144, 1458353281, 1455753530, 1453150907, 1450545427, 1447937104,
+ 1445325953, 1442711990, 1440095228, 1437475684, 1434853371, 1432228305,
+ 1429600501, 1426969973, 1424336737, 1421700808, 1419062200, 1416420929,
+ 1413777009, 1411130456, 1408481285, 1405829511, 1403175148, 1400518212,
+ 1397858718, 1395196681, 1392532116, 1389865038, 1387195462, 1384523404,
+ 1381848879, 1379171901, 1376492485, 1373810648, 1371126404, 1368439768,
+ 1365750756, 1363059382, 1360365663, 1357669612, 1354971246, 1352270579,
+ 1349567627, 1346862404, 1344154928, 1341445211, 1338733271, 1336019121,
+ 1333302778, 1330584256, 1327863572, 1325140739, 1322415774, 1319688692,
+ 1316959508, 1314228237, 1311494895, 1308759498, 1306022060, 1303282596,
+ 1300541123, 1297797656, 1295052209, 1292304799, 1289555440, 1286804149,
+ 1284050940, 1281295828, 1278538831, 1275779961, 1273019236, 1270256671,
+ 1267492280, 1264726080, 1261958086, 1259188313, 1256416776, 1253643492,
+ 1250868475, 1248091742, 1245313306, 1242533185, 1239751393, 1236967947,
+ 1234182860, 1231396150, 1228607830, 1225817918, 1223026428, 1220233375,
+ 1217438776, 1214642646, 1211845000, 1209045854, 1206245223, 1203443123,
+ 1200639569, 1197834577, 1195028162, 1192220340, 1189411126, 1186600536,
+ 1183788586, 1180975290, 1178160665, 1175344726, 1172527488, 1169708968,
+ 1166889179, 1164068139, 1161245863, 1158422365, 1155597662, 1152771769,
+ 1149944702, 1147116476, 1144287107, 1141456610, 1138625000, 1135792294,
+ 1132958507, 1130123654, 1127287751, 1124450814, 1121612857, 1118773897,
+ 1115933949, 1113093028, 1110251150, 1107408331, 1104564586, 1101719930,
+ 1098874380, 1096027950, 1093180656, 1090332514, 1087483539, 1084633746,
+ 1081783151, 1078931771, 1076079619, 1073226712, 1070373065, 1067518693,
+ 1064663612, 1061807839, 1058951387, 1056094272, 1053236511, 1050378117,
+ 1047519108, 1044659498, 1041799303, 1038938538, 1036077219, 1033215361,
+ 1030352980, 1027490091, 1024626709, 1021762849, 1018898529, 1016033762,
+ 1013168564, 1010302950, 1007436937, 1004570539, 1001703771, 998836650,
+ 995969190, 993101407, 990233316, 987364933, 984496273, 981627351,
+ 978758182, 975888783, 973019168, 970149352, 967279352, 964409182,
+ 961538857, 958668393, 955797805, 952927109, 950056319, 947185452,
+ 944314522, 941443544, 938572534, 935701506, 932830478, 929959462,
+ 927088475, 924217532, 921346648, 918475838, 915605118, 912734502,
+ 909864006, 906993645, 904123434, 901253389, 898383523, 895513853,
+ 892644394, 889775160, 886906166, 884037429, 881168963, 878300782,
+ 875432903, 872565339, 869698107, 866831221, 863964696, 861098546,
+ 858232788, 855367437, 852502506, 849638011, 846773967, 843910389,
+ 841047292, 838184690, 835322599, 832461034, 829600009, 826739539,
+ 823879639, 821020325, 818161610, 815303509, 812446038, 809589212,
+ 806733044, 803877550, 801022745, 798168642, 795315258, 792462607,
+ 789610703, 786759561, 783909195, 781059622, 778210854, 775362907,
+ 772515796, 769669534, 766824137, 763979620, 761135996, 758293280,
+ 755451487, 752610632, 749770728, 746931791, 744093835, 741256874,
+ 738420923, 735585996, 732752108, 729919273, 727087505, 724256820,
+ 721427230, 718598751, 715771397, 712945183, 710120121, 707296228,
+ 704473517, 701652002, 698831698, 696012619, 693194778, 690378191,
+ 687562872, 684748834, 681936091, 679124659, 676314550, 673505780,
+ 670698362, 667892309, 665087638, 662284360, 659482491, 656682043,
+ 653883033, 651085472, 648289375, 645494757, 642701630, 639910009,
+ 637119908, 634331341, 631544321, 628758862, 625974978, 623192683,
+ 620411990, 617632914, 614855467, 612079664, 609305519, 606533045,
+ 603762255, 600993163, 598225784, 595460130, 592696215, 589934052,
+ 587173656, 584415039, 581658215, 578903198, 576150001, 573398637,
+ 570649121, 567901464, 565155681, 562411785, 559669790, 556929708,
+ 554191552, 551455337, 548721076, 545988781, 543258465, 540530143,
+ 537803827, 535079530, 532357266, 529637047, 526918886, 524202797,
+ 521488793, 518776887, 516067091, 513359419, 510653883, 507950497,
+ 505249274, 502550225, 499853365, 497158705, 494466260, 491776040,
+ 489088061, 486402333, 483718870, 481037684, 478358789, 475682196,
+ 473007919, 470335970, 467666362, 464999106, 462334217, 459671705,
+ 457011584, 454353867, 451698565, 449045691, 446395257, 443747277,
+ 441101761, 438458723, 435818174, 433180128, 430544596, 427911590,
+ 425281123, 422653207, 420027854, 417405076, 414784886, 412167294,
+ 409552314, 406939958, 404330236, 401723162, 399118748, 396517005,
+ 393917945, 391321579, 388727921, 386136982, 383548773, 380963306,
+ 378380593, 375800646, 373223477, 370649096, 368077516, 365508749,
+ 362942806, 360379698, 357819437, 355262035, 352707502, 350155852,
+ 347607094, 345061240, 342518303, 339978292, 337441220, 334907097,
+ 332375936, 329847747, 327322541, 324800329, 322281124, 319764936,
+ 317251775, 314741654, 312234582, 309730572, 307229635, 304731780,
+ 302237020, 299745364, 297256824, 294771412, 292289136, 289810010,
+ 287334042, 284861244, 282391627, 279925201, 277461978, 275001966,
+ 272545178, 270091624, 267641315, 265194260, 262750470, 260309957,
+ 257872729, 255438798, 253008175, 250580868, 248156890, 245736249,
+ 243318957, 240905023, 238494457, 236087271, 233683473, 231283075,
+ 228886086, 226492516, 224102375, 221715674, 219332421, 216952628,
+ 214576304, 212203459, 209834102, 207468245, 205105895, 202747064,
+ 200391760, 198039994, 195691775, 193347113, 191006017, 188668498,
+ 186334564, 184004225, 181677490, 179354369, 177034872, 174719008,
+ 172406785, 170098214, 167793304, 165492064, 163194503, 160900631,
+ 158610456, 156323988, 154041235, 151762208, 149486915, 147215364,
+ 144947566, 142683529, 140423261, 138166772, 135914071, 133665166,
+ 131420066, 129178781, 126941318, 124707686, 122477895, 120251952,
+ 118029866, 115811647, 113597301, 111386839, 109180268, 106977597,
+ 104778834, 102583988, 100393067, 98206079, 96023032, 93843936,
+ 91668797, 89497625, 87330427, 85167211, 83007986, 80852759, 78701540,
+ 76554335, 74411152, 72272000, 70136886, 68005819, 65878805, 63755854,
+ 61636972, 59522167, 57411447, 55304821, 53202294, 51103875, 49009572,
+ 46919392, 44833342, 42751430, 40673664, 38600050, 36530596, 34465310,
+ 32404199, 30347269, 28294529, 26245985, 24201645, 22161515, 20125604,
+ 18093917, 16066462, 14043245, 12024275, 10009557, 7999099, 5992908,
+ 3990989, 1993351, 0, -1989057, -3973815, -5954266, -7930403, -9902220,
+ -11869711, -13832868, -15791686, -17746158, -19696277, -21642037,
+ -23583433, -25520456, -27453102, -29381364, -31305236, -33224711,
+ -35139784, -37050448, -38956697, -40858526, -42755927, -44648897,
+ -46537427, -48421513, -50301149, -52176328, -54047045, -55913295,
+ -57775071, -59632368, -61485180, -63333502, -65177327, -67016651,
+ -68851468, -70681773, -72507559, -74328822, -76145556, -77957756,
+ -79765416, -81568532, -83367098, -85161109, -86950559, -88735444,
+ -90515758, -92291497, -94062655, -95829227, -97591209, -99348596,
+ -101101382, -102849562, -104593133, -106332089, -108066425, -109796137,
+ -111521220, -113241670, -114957481, -116668649, -118375170, -120077040,
+ -121774253, -123466805, -125154692, -126837910, -128516454, -130190320,
+ -131859504, -133524001, -135183807, -136838919, -138489331, -140135041,
+ -141776043, -143412334, -145043910, -146670768, -148292902, -149910309,
+ -151522986, -153130929, -154734133, -156332596, -157926313, -159515280,
+ -161099495, -162678954, -164253652, -165823587, -167388755, -168949153,
+ -170504777, -172055624, -173601690, -175142972, -176679468, -178211173,
+ -179738085, -181260199, -182777515, -184290027, -185797733, -187300631,
+ -188798717, -190291987, -191780440, -193264073, -194742882, -196216864,
+ -197686018, -199150340, -200609827, -202064477, -203514288, -204959256,
+ -206399379, -207834654, -209265080, -210690654, -212111372, -213527234,
+ -214938236, -216344376, -217745652, -219142061, -220533602, -221920273,
+ -223302070, -224678993, -226051038, -227418205, -228780490, -230137892,
+ -231490410, -232838041, -234180783, -235518634, -236851593, -238179659,
+ -239502828, -240821100, -242134474, -243442946, -244746516, -246045183,
+ -247338944, -248627798, -249911745, -251190781, -252464907, -253734121,
+ -254998421, -256257806, -257512275, -258761828, -260006461, -261246175,
+ -262480969, -263710841, -264935790, -266155816, -267370917, -268581093,
+ -269786343, -270986665, -272182059, -273372525, -274558061, -275738667,
+ -276914342, -278085085, -279250897, -280411776, -281567721, -282718733,
+ -283864811, -285005955, -286142163, -287273436, -288399774, -289521175,
+ -290637641, -291749170, -292855762, -293957418, -295054137, -296145919,
+ -297232764, -298314672, -299391643, -300463677, -301530775, -302592936,
+ -303650160, -304702448, -305749799, -306792215, -307829696, -308862241,
+ -309889851, -310912527, -311930269, -312943077, -313950952, -314953895,
+ -315951905, -316944985, -317933133, -318916351, -319894640, -320868001,
+ -321836433, -322799938, -323758517, -324712171, -325660900, -326604706,
+ -327543589, -328477550, -329406591, -330330712, -331249915, -332164201,
+ -333073570, -333978025, -334877565, -335772194, -336661911, -337546719,
+ -338426618, -339301610, -340171697, -341036879, -341897159, -342752538,
+ -343603017, -344448598, -345289283, -346125073, -346955971, -347781977,
+ -348603093, -349419322, -350230665, -351037124, -351838701, -352635397,
+ -353427216, -354214158, -354996225, -355773421, -356545746, -357313204,
+ -358075795, -358833523, -359586389, -360334396, -361077546, -361815841,
+ -362549284, -363277877, -364001622, -364720522, -365434580, -366143797,
+ -366848177, -367547721, -368242433, -368932315, -369617370, -370297600,
+ -370973009, -371643598, -372309371, -372970330, -373626479, -374277819,
+ -374924355, -375566089, -376203024, -376835163, -377462509, -378085064,
+ -378702833, -379315818, -379924023, -380527450, -381126103, -381719985,
+ -382309099, -382893449, -383473037, -384047868, -384617945, -385183270,
+ -385743848, -386299683, -386850776, -387397133, -387938756, -388475650,
+ -389007817, -389535262, -390057988, -390576000, -391089299, -391597892,
+ -392101780, -392600969, -393095461, -393585262, -394070374, -394550802,
+ -395026549, -395497621, -395964020, -396425751, -396882818, -397335225,
+ -397782976, -398226076, -398664529, -399098338, -399527508, -399952044,
+ -400371950, -400787230, -401197889, -401603930, -402005359, -402402180,
+ -402794397, -403182015, -403565038, -403943472, -404317320, -404686587,
+ -405051279, -405411399, -405766953, -406117944, -406464379, -406806261,
+ -407143596, -407476389, -407804643, -408128365, -408447559, -408762231,
+ -409072384, -409378025, -409679158, -409975788, -410267921, -410555561,
+ -410838714, -411117384, -411391578, -411661301, -411926557, -412187351,
+ -412443691, -412695579, -412943023, -413186027, -413424597, -413658738,
+ -413888455, -414113755, -414334643, -414551124, -414763204, -414970888,
+ -415174183, -415373093, -415567625, -415757784, -415943576, -416125007,
+ -416302082, -416474807, -416643188, -416807232, -416966943, -417122328,
+ -417273392, -417420143, -417562585, -417700724, -417834568, -417964121,
+ -418089389, -418210380, -418327099, -418439552, -418547746, -418651686,
+ -418751379, -418846831, -418938048, -419025037, -419107804, -419186356,
+ -419260698, -419330837, -419396780, -419458533, -419516102, -419569494,
+ -419618716, -419663774, -419704674, -419741423, -419774028, -419802495,
+ -419826832, -419847044, -419863138, -419875121, -419883001, -419886783,
+ -419886474, -419882082, -419873612, -419861073, -419844470, -419823811,
+ -419799102, -419770351, -419737564, -419700749, -419659912, -419615061,
+ -419566203, -419513344, -419456491, -419395653, -419330835, -419262046,
+ -419189292, -419112580, -419031918, -418947313, -418858772, -418766303,
+ -418669913, -418569608, -418465397, -418357287, -418245286, -418129399,
+ -418009636, -417886003, -417758509, -417627159, -417491963, -417352927,
+ -417210059, -417063367, -416912858, -416758540, -416600420, -416438506,
+ -416272805, -416103326, -415930077, -415753064, -415572295, -415387779,
+ -415199523, -415007535, -414811822, -414612393, -414409255, -414202417,
+ -413991885, -413777669, -413559775, -413338213, -413112989, -412884112,
+ -412651590, -412415431, -412175643, -411932233, -411685211, -411434583,
+ -411180359, -410922546, -410661152, -410396186, -410127656, -409855570,
+ -409579936, -409300762, -409018057, -408731829, -408442085, -408148836,
+ -407852088, -407551850, -407248130, -406940937, -406630279, -406316165,
+ -405998603, -405677601, -405353167, -405025311, -404694041, -404359365,
+ -404021291, -403679829, -403334986, -402986771, -402635194, -402280261,
+ -401921983, -401560367, -401195422, -400827157, -400455581, -400080701,
+ -399702528, -399321069, -398936333, -398548329, -398157066, -397762552,
+ -397364796, -396963807, -396559594, -396152166, -395741531, -395327698,
+ -394910676, -394490474, -394067100, -393640565, -393210876, -392778042,
+ -392342073, -391902977, -391460763, -391015441, -390567019, -390115506,
+ -389660911, -389203244, -388742512, -388278727, -387811895, -387342027,
+ -386869131, -386393217, -385914294, -385432370, -384947455, -384459559,
+ -383968689, -383474856, -382978069, -382478336, -381975667, -381470071,
+ -380961558, -380450136, -379935815, -379418604, -378898512, -378375549,
+ -377849723, -377321045, -376789524, -376255168, -375717987, -375177990,
+ -374635188, -374089588, -373541201, -372990036, -372436102, -371879408,
+ -371319965, -370757781, -370192866, -369625229, -369054880, -368481828,
+ -367906083, -367327653, -366746550, -366162781, -365576357, -364987287,
+ -364395581, -363801248, -363204297, -362604739, -362002582, -361397837,
+ -360790512, -360180618, -359568163, -358953158, -358335613, -357715536,
+ -357092937, -356467827, -355840214, -355210108, -354577519, -353942456,
+ -353304930, -352664950, -352022525, -351377665, -350730380, -350080679,
+ -349428573, -348774071, -348117182, -347457916, -346796284, -346132294,
+ -345465957, -344797282, -344126280, -343452958, -342777329, -342099400,
+ -341419183, -340736687, -340051921, -339364895, -338675620, -337984104,
+ -337290358, -336594392, -335896215, -335195837, -334493268, -333788518,
+ -333081597, -332372514, -331661280, -330947903, -330232395, -329514764,
+ -328795021, -328073176, -327349238, -326623217, -325895123, -325164967,
+ -324432757, -323698504, -322962218, -322223908, -321483585, -320741258,
+ -319996938, -319250633, -318502355, -317752112, -316999915, -316245774,
+ -315489699, -314731699, -313971785, -313209966, -312446253, -311680655,
+ -310913182, -310143844, -309372651, -308599613, -307824741, -307048043,
+ -306269530, -305489211, -304707098, -303923199, -303137524, -302350085,
+ -301560889, -300769949, -299977272, -299182870, -298386752, -297588928,
+ -296789409, -295988204, -295185323, -294380776, -293574573, -292766724,
+ -291957238, -291146127, -290333400, -289519066, -288703136, -287885620,
+ -287066528, -286245869, -285423654, -284599892, -283774594, -282947769,
+ -282119428, -281289580, -280458235, -279625404, -278791096, -277955321,
+ -277118089, -276279410, -275439294, -274597751, -273754791, -272910423,
+ -272064659, -271217507, -270368977, -269519081, -268667826, -267815225,
+ -266961285, -266106018, -265249433, -264391540, -263532349, -262671870,
+ -261810112, -260947087, -260082803, -259217271, -258350500, -257482501,
+ -256613282, -255742855, -254871229, -253998414, -253124420, -252249256,
+ -251372933, -250495460, -249616848, -248737106, -247856243, -246974271,
+ -246091198, -245207035, -244321791, -243435477, -242548102, -241659675,
+ -240770207, -239879708, -238988187, -238095654, -237202120, -236307593,
+ -235412083, -234515601, -233618157, -232719759, -231820417, -230920143,
+ -230018944, -229116832, -228213815, -227309904, -226405109, -225499438,
+ -224592902, -223685510, -222777273, -221868199, -220958299, -220047583,
+ -219136059, -218223738, -217310630, -216396743, -215482088, -214566675,
+ -213650513, -212733611, -211815980, -210897629, -209978567, -209058805,
+ -208138351, -207217216, -206295409, -205372939, -204449817, -203526052,
+ -202601653, -201676630, -200750993, -199824750, -198897912, -197970489,
+ -197042488, -196113922, -195184797, -194255125, -193324915, -192394176,
+ -191462917, -190531149, -189598880, -188666120, -187732879, -186799165,
+ -185864989, -184930359, -183995286, -183059778, -182123845, -181187497,
+ -180250742, -179313590, -178376050, -177438132, -176499845, -175561199,
+ -174622202, -173682864, -172743195, -171803203, -170862898, -169922289,
+ -168981386, -168040197, -167098731, -166156999, -165215010, -164272771,
+ -163330294, -162387586, -161444657, -160501517, -159558173, -158614637,
+ -157670916, -156727019, -155782957, -154838737, -153894370, -152949863,
+ -152005227, -151060470, -150115601, -149170629, -148225564, -147280414,
+ -146335189, -145389896, -144444546, -143499147, -142553709, -141608239,
+ -140662748, -139717243, -138771734, -137826230, -136880740, -135935272,
+ -134989835, -134044439, -133099091, -132153802, -131208579, -130263431,
+ -129318368, -128373397, -127428528, -126483770, -125539131, -124594619,
+ -123650245, -122706015, -121761940, -120818027, -119874285, -118930723,
+ -117987350, -117044174, -116101203, -115158447, -114215913, -113273611,
+ -112331549, -111389736, -110448179, -109506888, -108565871, -107625137,
+ -106684693, -105744548, -104804712, -103865191, -102925995, -101987132,
+ -101048611, -100110439, -99172625, -98235178, -97298105, -96361415,
+ -95425117, -94489218, -93553726, -92618651, -91684000, -90749782,
+ -89816004, -88882675, -87949803, -87017396, -86085463, -85154011,
+ -84223048, -83292584, -82362624, -81433179, -80504255, -79575861,
+ -78648005, -77720695, -76793939, -75867744, -74942119, -74017072,
+ -73092610, -72168742, -71245475, -70322817, -69400776, -68479361,
+ -67558578, -66638435, -65718941, -64800103, -63881929, -62964426,
+ -62047603, -61131467, -60216025, -59301286, -58387257, -57473945,
+ -56561359, -55649506, -54738393, -53828029, -52918420, -52009574,
+ -51101498, -50194201, -49287690, -48381972, -47477054, -46572945,
+ -45669651, -44767179, -43865538, -42964735, -42064777, -41165670,
+ -40267424, -39370044, -38473539, -37577914, -36683179, -35789340,
+ -34896403, -34004377, -33113268, -32223084, -31333832, -30445519,
+ -29558151, -28671737, -27786283, -26901796, -26018283, -25135751,
+ -24254208, -23373660, -22494114, -21615576, -20738055, -19861557,
+ -18986089, -18111657, -17238268, -16365930, -15494649, -14624432,
+ -13755286, -12887217, -12020232, -11154337, -10289541, -9425848,
+ -8563267, -7701803, -6841463, -5982254, -5124182, -4267254, -3411476,
+ -2556855, -1703398, -851111, 0, 849928, 1698667, 2546210, 3392552,
+ 4237684, 5081603, 5924300, 6765770, 7606006, 8445002, 9282752,
+ 10119249, 10954488, 11788463, 12621166, 13452592, 14282735, 15111588,
+ 15939146, 16765402, 17590351, 18413986, 19236302, 20057292, 20876950,
+ 21695271, 22512248, 23327876, 24142148, 24955060, 25766604, 26576776,
+ 27385569, 28192978, 28998996, 29803618, 30606839, 31408653, 32209053,
+ 33008035, 33805592, 34601719, 35396411, 36189661, 36981465, 37771816,
+ 38560710, 39348140, 40134101, 40918588, 41701596, 42483118, 43263150,
+ 44041686, 44818721, 45594249, 46368265, 47140764, 47911740, 48681189,
+ 49449105, 50215482, 50980317, 51743602, 52505334, 53265508, 54024117,
+ 54781158, 55536624, 56290511, 57042814, 57793528, 58542648, 59290169,
+ 60036086, 60780395, 61523089, 62264164, 63003617, 63741440, 64477631,
+ 65212184, 65945094, 66676357, 67405967, 68133921, 68860213, 69584839,
+ 70307794, 71029074, 71748673, 72466588, 73182814, 73897346, 74610181,
+ 75321312, 76030736, 76738449, 77444445, 78148722, 78851273, 79552096,
+ 80251184, 80948536, 81644145, 82338007, 83030120, 83720477, 84409075,
+ 85095911, 85780978, 86464275, 87145795, 87825537, 88503494, 89179663,
+ 89854041, 90526623, 91197405, 91866383, 92533554, 93198912, 93862456,
+ 94524179, 95184080, 95842153, 96498396, 97152804, 97805373, 98456100,
+ 99104981, 99752013, 100397191, 101040512, 101681973, 102321569,
+ 102959298, 103595155, 104229138, 104861241, 105491463, 106119800,
+ 106746248, 107370803, 107993462, 108614223, 109233081, 109850033,
+ 110465076, 111078206, 111689421, 112298717, 112906090, 113511539,
+ 114115058, 114716645, 115316298, 115914013, 116509786, 117103615,
+ 117695497, 118285428, 118873406, 119459427, 120043489, 120625589,
+ 121205724, 121783890, 122360086, 122934307, 123506552, 124076817,
+ 124645100, 125211398, 125775708, 126338027, 126898353, 127456683,
+ 128013014, 128567345, 129119671, 129669990, 130218301, 130764600,
+ 131308885, 131851153, 132391402, 132929629, 133465833, 134000009,
+ 134532157, 135062274, 135590357, 136116404, 136640413, 137162382,
+ 137682307, 138200188, 138716021, 139229805, 139741537, 140251215,
+ 140758837, 141264402, 141767906, 142269348, 142768726, 143266037,
+ 143761281, 144254454, 144745554, 145234581, 145721531, 146206404,
+ 146689197, 147169908, 147648535, 148125078, 148599533, 149071899,
+ 149542175, 150010358, 150476448, 150940441, 151402338, 151862135,
+ 152319832, 152775427, 153228918, 153680303, 154129582, 154576753,
+ 155021814, 155464763, 155905600, 156344323, 156780930, 157215421,
+ 157647793, 158078046, 158506178, 158932188, 159356075, 159777837,
+ 160197473, 160614982, 161030363, 161443614, 161854735, 162263724,
+ 162670581, 163075304, 163477892, 163878345, 164276660, 164672838,
+ 165066876, 165458776, 165848534, 166236151, 166621625, 167004956,
+ 167386144, 167765186, 168142082, 168516832, 168889435, 169259889,
+ 169628195, 169994352, 170358358, 170720214, 171079919, 171437471,
+ 171792872, 172146119, 172497212, 172846152, 173192936, 173537566,
+ 173880040, 174220358, 174558520, 174894525, 175228373, 175560063,
+ 175889596, 176216970, 176542186, 176865243, 177186142, 177504881,
+ 177821460, 178135880, 178448141, 178758241, 179066182, 179371962,
+ 179675582, 179977042, 180276341, 180573480, 180868459, 181161278,
+ 181451936, 181740434, 182026772, 182310950, 182592967, 182872826,
+ 183150524, 183426063, 183699443, 183970664, 184239725, 184506629,
+ 184771374, 185033961, 185294391, 185552663, 185808779, 186062737,
+ 186314540, 186564187, 186811679, 187057016, 187300198, 187541227,
+ 187780102, 188016825, 188251395, 188483814, 188714081, 188942199,
+ 189168166, 189391984, 189613654, 189833176, 190050551, 190265779,
+ 190478862, 190689800, 190898594, 191105245, 191309754, 191512121,
+ 191712347, 191910434, 192106382, 192300191, 192491864, 192681401,
+ 192868803, 193054070, 193237205, 193418207, 193597079, 193773821,
+ 193948434, 194120919, 194291278, 194459512, 194625621, 194789608,
+ 194951472, 195111216, 195268841, 195424347, 195577737, 195729012,
+ 195878172, 196025219, 196170155, 196312981, 196453698, 196592308,
+ 196728811, 196863211, 196995507, 197125703, 197253798, 197379794,
+ 197503694, 197625498, 197745209, 197862827, 197978355, 198091794,
+ 198203145, 198312411, 198419593, 198524692, 198627711, 198728651,
+ 198827514, 198924302, 199019016, 199111658, 199202231, 199290735,
+ 199377173, 199461547, 199543858, 199624109, 199702301, 199778436,
+ 199852516, 199924544, 199994521, 200062449, 200128331, 200192167,
+ 200253961, 200313715, 200371430, 200427108, 200480753, 200532365,
+ 200581947, 200629501, 200675030, 200718535, 200760020, 200799485,
+ 200836934, 200872368, 200905790, 200937202, 200966607, 200994007,
+ 201019404, 201042800, 201064198, 201083601, 201101011, 201116430,
+ 201129860, 201141305, 201150766, 201158246, 201163748, 201167274,
+ 201168827, 201168409, 201166023, 201161671, 201155357, 201147082,
+ 201136849, 201124661, 201110521, 201094431, 201076394, 201056413,
+ 201034490, 201010629, 200984831, 200957100, 200927438, 200895849,
+ 200862335, 200826899, 200789544, 200750272, 200709087, 200665991,
+ 200620988, 200574080, 200525270, 200474561, 200421956, 200367458,
+ 200311071, 200252796, 200192637, 200130598, 200066681, 200000889,
+ 199933225, 199863693, 199792295, 199719035, 199643916, 199566940,
+ 199488112, 199407434, 199324909, 199240541, 199154333, 199066287,
+ 198976408, 198884699, 198791163, 198695802, 198598621, 198499623,
+ 198398811, 198296188, 198191758, 198085524, 197977489, 197867657,
+ 197756032, 197642616, 197527413, 197410427, 197291661, 197171118,
+ 197048802, 196924716, 196798864, 196671250, 196541877, 196410748,
+ 196277867, 196143238, 196006864, 195868748, 195728895, 195587308,
+ 195443991, 195298946, 195152179, 195003692, 194853489, 194701574,
+ 194547951, 194392623, 194235594, 194076868, 193916448, 193754338,
+ 193590543, 193425065, 193257909, 193089078, 192918576, 192746407,
+ 192572575, 192397084, 192219937, 192041138, 191860692, 191678602,
+ 191494871, 191309505, 191122507, 190933880, 190743629, 190551758,
+ 190358271, 190163171, 189966462, 189768149, 189568236, 189366727,
+ 189163625, 188958934, 188752660, 188544805, 188335374, 188124371,
+ 187911799, 187697664, 187481969, 187264719, 187045916, 186825567,
+ 186603674, 186380242, 186155275, 185928777, 185700752, 185471205,
+ 185240140, 185007560, 184773471, 184537876, 184300780, 184062187,
+ 183822101, 183580526, 183337467, 183092928, 182846913, 182599427,
+ 182350473, 182100057, 181848183, 181594854, 181340075, 181083851,
+ 180826185, 180567083, 180306549, 180044586, 179781200, 179516395,
+ 179250175, 178982545, 178713508, 178443070, 178171236, 177898008,
+ 177623392, 177347393, 177070014, 176791261, 176511137, 176229648,
+ 175946797, 175662589, 175377030, 175090122, 174801872, 174512282,
+ 174221359, 173929106, 173635528, 173340630, 173044416, 172746890,
+ 172448058, 172147924, 171846492, 171543767, 171239755, 170934458,
+ 170627882, 170320033, 170010913, 169700528, 169388883, 169075982,
+ 168761830, 168446432, 168129791, 167811914, 167492804, 167172467,
+ 166850906, 166528128, 166204135, 165878934, 165552529, 165224925,
+ 164896125, 164566136, 164234962, 163902607, 163569077, 163234375,
+ 162898508, 162561479, 162223294, 161883957, 161543473, 161201847,
+ 160859083, 160515187, 160170163, 159824016, 159476751, 159128373,
+ 158778886, 158428295, 158076606, 157723823, 157369950, 157014994,
+ 156658958, 156301847, 155943667, 155584421, 155224116, 154862756,
+ 154500346, 154136890, 153772394, 153406863, 153040300, 152672713,
+ 152304104, 151934479, 151563844, 151192202, 150819559, 150445920,
+ 150071290, 149695673, 149319074, 148941500, 148562953, 148183440,
+ 147802966, 147421535, 147039151, 146655821, 146271550, 145886341,
+ 145500200, 145113132, 144725143, 144336236, 143946417, 143555691,
+ 143164064, 142771538, 142378121, 141983817, 141588630, 141192567,
+ 140795631, 140397828, 139999162, 139599640, 139199265, 138798044,
+ 138395980, 137993078, 137589345, 137184785, 136779402, 136373202,
+ 135966191, 135558372, 135149751, 134740333, 134330123, 133919126,
+ 133507347, 133094791, 132681463, 132267369, 131852512, 131436899,
+ 131020534, 130603422, 130185568, 129766978, 129347656, 128927607,
+ 128506837, 128085351, 127663152, 127240248, 126816642, 126392339,
+ 125967345, 125541665, 125115304, 124688266, 124260557, 123832183,
+ 123403146, 122973454, 122543111, 122112122, 121680492, 121248226,
+ 120815330, 120381807, 119947664, 119512905, 119077535, 118641560,
+ 118204984, 117767813, 117330051, 116891703, 116452775, 116013272,
+ 115573198, 115132559, 114691360, 114249605, 113807300, 113364450,
+ 112921060, 112477135, 112032679, 111587699, 111142198, 110696183,
+ 110249657, 109802626, 109355096, 108907070, 108458555, 108009554,
+ 107560074, 107110119, 106659694, 106208804, 105757454, 105305650,
+ 104853395, 104400696, 103947557, 103493983, 103039979, 102585551,
+ 102130702, 101675439, 101219766, 100763687, 100307209, 99850336,
+ 99393074, 98935426, 98477398, 98018995, 97560222, 97101084, 96641586,
+ 96181732, 95721529, 95260980, 94800091, 94338866, 93877312, 93415431,
+ 92953230, 92490714, 92027887, 91564754, 91101321, 90637591, 90173571,
+ 89709264, 89244677, 88779813, 88314678, 87849276, 87383613, 86917694,
+ 86451523, 85985105, 85518445, 85051548, 84584419, 84117062, 83649483,
+ 83181687, 82713678, 82245461, 81777041, 81308423, 80839611, 80370612,
+ 79901428, 79432066, 78962530, 78492825, 78022956, 77552927, 77082743,
+ 76612410, 76141931, 75671312, 75200558, 74729673, 74258662, 73787531,
+ 73316282, 72844923, 72373456, 71901887, 71430222, 70958463, 70486617,
+ 70014688, 69542680, 69070599, 68598449, 68126234, 67653961, 67181632,
+ 66709254, 66236830, 65764366, 65291866, 64819334, 64346776, 63874196,
+ 63401599, 62928989, 62456371, 61983750, 61511130, 61038516, 60565913,
+ 60093325, 59620757, 59148213, 58675698, 58203217, 57730775, 57258375,
+ 56786022, 56313722, 55841478, 55369295, 54897178, 54425132, 53953160,
+ 53481267, 53009458, 52537738, 52066110, 51594580, 51123152, 50651830,
+ 50180619, 49709523, 49238547, 48767696, 48296973, 47826384, 47355932,
+ 46885623, 46415460, 45945448, 45475591, 45005894, 44536362, 44066998,
+ 43597807, 43128794, 42659963, 42191317, 41722862, 41254603, 40786542,
+ 40318685, 39851036, 39383599, 38916379, 38449379, 37982605, 37516060,
+ 37049749, 36583677, 36117846, 35652262, 35186929, 34721851, 34257033,
+ 33792478, 33328190, 32864175, 32400437, 31936978, 31473804, 31010919,
+ 30548327, 30086033, 29624039, 29162352, 28700973, 28239909, 27779162,
+ 27318738, 26858640, 26398872, 25939438, 25480343, 25021590, 24563184,
+ 24105128, 23647428, 23190086, 22733107, 22276494, 21820253, 21364386,
+ 20908898, 20453793, 19999075, 19544748, 19090816, 18637282, 18184151,
+ 17731426, 17279113, 16827213, 16375732, 15924674, 15474041, 15023839,
+ 14574070, 14124740, 13675851, 13227408, 12779414, 12331873, 11884789,
+ 11438166, 10992008, 10546319, 10101101, 9656360, 9212098, 8768320,
+ 8325029, 7882229, 7439924, 6998117, 6556813, 6116014, 5675725, 5235949,
+ 4796690, 4357952, 3919738, 3482052, 3044897, 2608278, 2172197, 1736658,
+ 1301666, 867223, 433333, 0, -432773, -864982, -1296624, -1727695,
+ -2158192, -2588111, -3017449, -3446202, -3874367, -4301940, -4728918,
+ -5155297, -5581074, -6006246, -6430809, -6854759, -7278094, -7700810,
+ -8122903, -8544371, -8965209, -9385415, -9804985, -10223916, -10642205,
+ -11059848, -11476842, -11893183, -12308869, -12723896, -13138261,
+ -13551961, -13964992, -14377352, -14789037, -15200043, -15610369,
+ -16020009, -16428962, -16837225, -17244793, -17651665, -18057836,
+ -18463304, -18868066, -19272118, -19675457, -20078081, -20479987,
+ -20881171, -21281630, -21681361, -22080362, -22478629, -22876159,
+ -23272950, -23668998, -24064300, -24458854, -24852656, -25245704,
+ -25637995, -26029525, -26420293, -26810294, -27199527, -27587988,
+ -27975675, -28362584, -28748713, -29134059, -29518619, -29902391,
+ -30285372, -30667558, -31048948, -31429538, -31809326, -32188308,
+ -32566483, -32943848, -33320400, -33696135, -34071053, -34445149,
+ -34818422, -35190868, -35562485, -35933271, -36303223, -36672338,
+ -37040613, -37408047, -37774637, -38140379, -38505272, -38869313,
+ -39232500, -39594830, -39956300, -40316909, -40676653, -41035530,
+ -41393538, -41750675, -42106938, -42462324, -42816831, -43170457,
+ -43523200, -43875057, -44226025, -44576103, -44925288, -45273579,
+ -45620971, -45967464, -46313055, -46657742, -47001522, -47344393,
+ -47686354, -48027402, -48367534, -48706748, -49045043, -49382417,
+ -49718866, -50054389, -50388984, -50722648, -51055380, -51387178,
+ -51718039, -52047961, -52376942, -52704981, -53032075, -53358222,
+ -53683420, -54007668, -54330962, -54653302, -54974686, -55295110,
+ -55614574, -55933075, -56250612, -56567183, -56882786, -57197418,
+ -57511078, -57823765, -58135476, -58446210, -58755964, -59064737,
+ -59372527, -59679333, -59985152, -60289984, -60593825, -60896674,
+ -61198531, -61499392, -61799256, -62098123, -62395989, -62692853,
+ -62988714, -63283569, -63577418, -63870259, -64162090, -64452910,
+ -64742716, -65031508, -65319284, -65606042, -65891781, -66176500,
+ -66460196, -66742868, -67024515, -67305136, -67584728, -67863291,
+ -68140823, -68417323, -68692788, -68967219, -69240613, -69512969,
+ -69784286, -70054562, -70323796, -70591987, -70859134, -71125234,
+ -71390288, -71654292, -71917248, -72179152, -72440004, -72699802,
+ -72958546, -73216235, -73472866, -73728439, -73982952, -74236405,
+ -74488796, -74740125, -74990390, -75239589, -75487723, -75734789,
+ -75980787, -76225716, -76469575, -76712362, -76954077, -77194718,
+ -77434285, -77672776, -77910191, -78146529, -78381788, -78615969,
+ -78849069, -79081088, -79312025, -79541879, -79770649, -79998335,
+ -80224936, -80450450, -80674877, -80898216, -81120466, -81341627,
+ -81561697, -81780676, -81998564, -82215358, -82431060, -82645667,
+ -82859180, -83071597, -83282917, -83493141, -83702268, -83910296,
+ -84117226, -84323056, -84527786, -84731415, -84933943, -85135369,
+ -85335693, -85534914, -85733031, -85930044, -86125952, -86320756,
+ -86514454, -86707045, -86898530, -87088908, -87278179, -87466341,
+ -87653396, -87839341, -88024177, -88207904, -88390520, -88572026,
+ -88752422, -88931706, -89109879, -89286940, -89462889, -89637726,
+ -89811450, -89984061, -90155559, -90325943, -90495214, -90663370,
+ -90830413, -90996341, -91161154, -91324853, -91487436, -91648905,
+ -91809258, -91968496, -92126618, -92283624, -92439514, -92594289,
+ -92747947, -92900490, -93051916, -93202226, -93351420, -93499497,
+ -93646458, -93792303, -93937031, -94080643, -94223139, -94364518,
+ -94504782, -94643929, -94781960, -94918874, -95054673, -95189356,
+ -95322924, -95455375, -95586711, -95716932, -95846038, -95974028,
+ -96100904, -96226665, -96351312, -96474844, -96597262, -96718567,
+ -96838758, -96957835, -97075800, -97192651, -97308391, -97423018,
+ -97536533, -97648936, -97760228, -97870410, -97979480, -98087441,
+ -98194291, -98300032, -98404664, -98508188, -98610603, -98711910,
+ -98812110, -98911203, -99009189, -99106069, -99201844, -99296514,
+ -99390079, -99482539, -99573897, -99664151, -99753303, -99841352,
+ -99928301, -100014148, -100098895, -100182543, -100265091, -100346541,
+ -100426893, -100506148, -100584306, -100661369, -100737336, -100812208,
+ -100885986, -100958672, -101030264, -101100765, -101170175, -101238494,
+ -101305724, -101371864, -101436917, -101500882, -101563761, -101625553,
+ -101686261, -101745885, -101804425, -101861883, -101918259, -101973554,
+ -102027769, -102080904, -102132962, -102183942, -102233846, -102282674,
+ -102330428, -102377107, -102422714, -102467249, -102510713, -102553108,
+ -102594433, -102634690, -102673880, -102712004, -102749064, -102785059,
+ -102819991, -102853861, -102886671, -102918420, -102949111, -102978745,
+ -103007321, -103034842, -103061309, -103086723, -103111084, -103134394,
+ -103156655, -103177866, -103198030, -103217148, -103235220, -103252249,
+ -103268234, -103283178, -103297081, -103309945, -103321771, -103332561,
+ -103342314, -103351034, -103358720, -103365375, -103370999, -103375594,
+ -103379161, -103381702, -103383217, -103383709, -103383178, -103381625,
+ -103379053, -103375462, -103370854, -103365230, -103358592, -103350941,
+ -103342278, -103332604, -103321922, -103310233, -103297538, -103283838,
+ -103269135, -103253430, -103236725, -103219022, -103200322, -103180625,
+ -103159935, -103138252, -103115577, -103091913, -103067261, -103041623,
+ -103014999, -102987392, -102958803, -102929233, -102898685, -102867159,
+ -102834658, -102801183, -102766736, -102731317, -102694930, -102657575,
+ -102619254, -102579969, -102539721, -102498513, -102456345, -102413220,
+ -102369138, -102324103, -102278115, -102231176, -102183288, -102134453,
+ -102084672, -102033947, -101982280, -101929673, -101876127, -101821644,
+ -101766226, -101709874, -101652591, -101594379, -101535238, -101475171,
+ -101414180, -101352266, -101289432, -101225679, -101161008, -101095423,
+ -101028924, -100961514, -100893194, -100823966, -100753833, -100682796,
+ -100610856, -100538017, -100464279, -100389645, -100314117, -100237696,
+ -100160384, -100082184, -100003097, -99923126, -99842271, -99760536,
+ -99677922, -99594432, -99510066, -99424828, -99338719, -99251741,
+ -99163896, -99075186, -98985613, -98895180, -98803888, -98711739,
+ -98618736, -98524880, -98430173, -98334618, -98238217, -98140971,
+ -98042883, -97943954, -97844188, -97743586, -97642150, -97539882,
+ -97436784, -97332859, -97228108, -97122534, -97016139, -96908925,
+ -96800895, -96692049, -96582391, -96471923, -96360646, -96248563,
+ -96135677, -96021989, -95907501, -95792216, -95676136, -95559263,
+ -95441600, -95323148, -95203910, -95083888, -94963084, -94841501,
+ -94719140, -94596004, -94472096, -94347417, -94221970, -94095757,
+ -93968780, -93841041, -93712544, -93583289, -93453280, -93322519,
+ -93191008, -93058749, -92925745, -92791997, -92657509, -92522282,
+ -92386320, -92249623, -92112195, -91974038, -91835154, -91695546,
+ -91555216, -91414166, -91272399, -91129916, -90986721, -90842816,
+ -90698203, -90552885, -90406863, -90260141, -90112720, -89964604,
+ -89815794, -89666293, -89516103, -89365227, -89213667, -89061425,
+ -88908505, -88754907, -88600636, -88445693, -88290081, -88133801,
+ -87976858, -87819252, -87660987, -87502065, -87342488, -87182259,
+ -87021381, -86859855, -86697684, -86534872, -86371419, -86207329,
+ -86042604, -85877247, -85711261, -85544647, -85377408, -85209546,
+ -85041065, -84871967, -84702253, -84531928, -84360992, -84189450,
+ -84017302, -83844553, -83671203, -83497257, -83322716, -83147582,
+ -82971860, -82795550, -82618655, -82441179, -82263124, -82084491,
+ -81905284, -81725506, -81545158, -81364244, -81182766, -81000726,
+ -80818128, -80634973, -80451264, -80267004, -80082195, -79896841,
+ -79710943, -79524504, -79337527, -79150014, -78961968, -78773391,
+ -78584287, -78394657, -78204505, -78013832, -77822642, -77630937,
+ -77438719, -77245992, -77052758, -76859019, -76664779, -76470039,
+ -76274802, -76079071, -75882849, -75686138, -75488941, -75291261,
+ -75093099, -74894459, -74695344, -74495755, -74295696, -74095169,
+ -73894177, -73692723, -73490808, -73288436, -73085610, -72882332,
+ -72678604, -72474430, -72269811, -72064751, -71859252, -71653318,
+ -71446949, -71240150, -71032923, -70825270, -70617194, -70408698,
+ -70199784, -69990456, -69780715, -69570564, -69360007, -69149045,
+ -68937681, -68725918, -68513759, -68301207, -68088263, -67874931,
+ -67661213, -67447112, -67232630, -67017771, -66802537, -66586930,
+ -66370953, -66154610, -65937901, -65720831, -65503402, -65285616,
+ -65067477, -64848986, -64630147, -64410962, -64191434, -63971565,
+ -63751359, -63530817, -63309942, -63088738, -62867207, -62645351,
+ -62423173, -62200676, -61977862, -61754734, -61531295, -61307548,
+ -61083494, -60859138, -60634480, -60409525, -60184274, -59958731,
+ -59732897, -59506777, -59280371, -59053684, -58826717, -58599473,
+ -58371956, -58144166, -57916109, -57687785, -57459197, -57230349,
+ -57001242, -56771880, -56542265, -56312400, -56082287, -55851929,
+ -55621329, -55390489, -55159412, -54928101, -54696558, -54464786,
+ -54232787, -54000564, -53768121, -53535458, -53302580, -53069488,
+ -52836186, -52602675, -52368959, -52135040, -51900921, -51666605,
+ -51432093, -51197389, -50962495, -50727414, -50492149, -50256702,
+ -50021075, -49785272, -49549294, -49313146, -49076828, -48840344,
+ -48603696, -48366888, -48129920, -47892797, -47655521, -47418094,
+ -47180519, -46942798, -46704934, -46466930, -46228789, -45990512,
+ -45752102, -45513563, -45274895, -45036104, -44797189, -44558155,
+ -44319004, -44079738, -43840360, -43600873, -43361278, -43121579,
+ -42881778, -42641878, -42401882, -42161791, -41921608, -41681336,
+ -41440978, -41200535, -40960011, -40719408, -40478728, -40237975,
+ -39997150, -39756256, -39515296, -39274272, -39033186, -38792042,
+ -38550841, -38309586, -38068280, -37826925, -37585524, -37344079,
+ -37102592, -36861067, -36619505, -36377909, -36136282, -35894625,
+ -35652943, -35411236, -35169507, -34927760, -34685995, -34444217,
+ -34202426, -33960627, -33718820, -33477009, -33235197, -32993384,
+ -32751575, -32509770, -32267974, -32026187, -31784414, -31542655,
+ -31300913, -31059192, -30817493, -30575818, -30334170, -30092552,
+ -29850966, -29609413, -29367898, -29126421, -28884986, -28643594,
+ -28402249, -28160952, -27919706, -27678513, -27437375, -27196296,
+ -26955277, -26714320, -26473428, -26232604, -25991849, -25751166,
+ -25510557, -25270025, -25029572, -24789200, -24548912, -24308710,
+ -24068595, -23828571, -23588640, -23348804, -23109065, -22869426,
+ -22629889, -22390455, -22151129, -21911911, -21672804, -21433810,
+ -21194931, -20956171, -20717530, -20479011, -20240617, -20002350,
+ -19764211, -19526204, -19288330, -19050592, -18812991, -18575530,
+ -18338212, -18101038, -17864010, -17627132, -17390404, -17153829,
+ -16917410, -16681148, -16445046, -16209106, -15973330, -15737719,
+ -15502277, -15267006, -15031907, -14796983, -14562235, -14327667,
+ -14093279, -13859075, -13625056, -13391225, -13157583, -12924133,
+ -12690876, -12457815, -12224952, -11992289, -11759828, -11527572,
+ -11295521, -11063678, -10832046, -10600626, -10369421, -10138432,
+ -9907661, -9677111, -9446783, -9216680, -8986804, -8757156, -8527738,
+ -8298553, -8069603, -7840889, -7612414, -7384179, -7156187, -6928439,
+ -6700937, -6473684, -6246681, -6019931, -5793434, -5567194, -5341212,
+ -5115490, -4890030, -4664834, -4439903, -4215240, -3990847, -3766725,
+ -3542877, -3319303, -3096007, -2872990, -2650254, -2427800, -2205631,
+ -1983749, -1762155, -1540851, -1319839, -1099120, -878698, -658572,
+ -438746, -219222, 0, 218917, 437528, 655830, 873823, 1091504, 1308871,
+ 1525923, 1742658, 1959073, 2175169, 2390942, 2606391, 2821514, 3036309,
+ 3250775, 3464911, 3678713, 3892181, 4105313, 4318108, 4530563, 4742676,
+ 4954447, 5165874, 5376954, 5587686, 5798069, 6008101, 6217780, 6427105,
+ 6636074, 6844685, 7052937, 7260828, 7468356, 7675521, 7882320, 8088752,
+ 8294814, 8500507, 8705827, 8910774, 9115346, 9319542, 9523359, 9726796,
+ 9929852, 10132526, 10334815, 10536718, 10738234, 10939361, 11140098,
+ 11340443, 11540395, 11739952, 11939112, 12137875, 12336239, 12534202,
+ 12731764, 12928921, 13125674, 13322020, 13517958, 13713488, 13908606,
+ 14103313, 14297606, 14491484, 14684946, 14877990, 15070616, 15262821,
+ 15454604, 15645964, 15836900, 16027410, 16217493, 16407147, 16596372,
+ 16785165, 16973527, 17161454, 17348947, 17536003, 17722621, 17908801,
+ 18094540, 18279839, 18464694, 18649105, 18833072, 19016592, 19199664,
+ 19382287, 19564460, 19746182, 19927451, 20108266, 20288627, 20468531,
+ 20647978, 20826966, 21005495, 21183562, 21361168, 21538310, 21714989,
+ 21891201, 22066947, 22242225, 22417034, 22591374, 22765242, 22938638,
+ 23111560, 23284008, 23455981, 23627477, 23798495, 23969035, 24139094,
+ 24308673, 24477770, 24646384, 24814514, 24982160, 25149319, 25315990,
+ 25482174, 25647869, 25813074, 25977788, 26142009, 26305738, 26468973,
+ 26631712, 26793956, 26955703, 27116952, 27277702, 27437953, 27597703,
+ 27756952, 27915698, 28073940, 28231679, 28388912, 28545639, 28701859,
+ 28857572, 29012776, 29167470, 29321654, 29475326, 29628487, 29781134,
+ 29933268, 30084887, 30235991, 30386579, 30536649, 30686202, 30835236,
+ 30983751, 31131746, 31279219, 31426171, 31572601, 31718507, 31863889,
+ 32008746, 32153079, 32296884, 32440163, 32582915, 32725138, 32866832,
+ 33007996, 33148630, 33288732, 33428303, 33567342, 33705847, 33843819,
+ 33981256, 34118158, 34254524, 34390354, 34525647, 34660403, 34794620,
+ 34928299, 35061438, 35194037, 35326095, 35457612, 35588588, 35719021,
+ 35848911, 35978258, 36107061, 36235319, 36363033, 36490200, 36616822,
+ 36742897, 36868425, 36993405, 37117837, 37241720, 37365054, 37487839,
+ 37610073, 37731757, 37852890, 37973472, 38093501, 38212978, 38331903,
+ 38450274, 38568091, 38685355, 38802064, 38918218, 39033817, 39148860,
+ 39263347, 39377277, 39490651, 39603468, 39715727, 39827428, 39938571,
+ 40049155, 40159181, 40268647, 40377554, 40485900, 40593687, 40700913,
+ 40807578, 40913682, 41019225, 41124206, 41228626, 41332483, 41435777,
+ 41538509, 41640678, 41742283, 41843326, 41943804, 42043719, 42143069,
+ 42241855, 42340077, 42437734, 42534826, 42631353, 42727314, 42822710,
+ 42917541, 43011805, 43105504, 43198636, 43291203, 43383202, 43474636,
+ 43565502, 43655802, 43745535, 43834701, 43923300, 44011332, 44098796,
+ 44185693, 44272022, 44357784, 44442979, 44527605, 44611664, 44695155,
+ 44778079, 44860434, 44942222, 45023442, 45104093, 45184177, 45263693,
+ 45342641, 45421021, 45498833, 45576077, 45652753, 45728861, 45804402,
+ 45879374, 45953779, 46027616, 46100886, 46173588, 46245722, 46317289,
+ 46388288, 46458721, 46528586, 46597884, 46666614, 46734778, 46802376,
+ 46869406, 46935870, 47001768, 47067099, 47131864, 47196064, 47259697,
+ 47322765, 47385267, 47447204, 47508575, 47569382, 47629624, 47689301,
+ 47748414, 47806963, 47864948, 47922369, 47979226, 48035520, 48091251,
+ 48146419, 48201024, 48255067, 48308548, 48361467, 48413825, 48465621,
+ 48516856, 48567530, 48617644, 48667198, 48716191, 48764625, 48812500,
+ 48859816, 48906573, 48952772, 48998413, 49043496, 49088021, 49131990,
+ 49175402, 49218258, 49260558, 49302302, 49343491, 49384126, 49424205,
+ 49463731, 49502703, 49541122, 49578988, 49616301, 49653063, 49689273,
+ 49724931, 49760039, 49794597, 49828604, 49862062, 49894971, 49927332,
+ 49959144, 49990409, 50021126, 50051297, 50080922, 50110001, 50138534,
+ 50166523, 50193968, 50220868, 50247226, 50273041, 50298313, 50323044,
+ 50347234, 50370883, 50393992, 50416561, 50438591, 50460083, 50481037,
+ 50501454, 50521333, 50540677, 50559485, 50577758, 50595496, 50612700,
+ 50629372, 50645510, 50661116, 50676191, 50690735, 50704749, 50718233,
+ 50731188, 50743615, 50755514, 50766886, 50777731, 50788051, 50797845,
+ 50807115, 50815861, 50824084, 50831785, 50838963, 50845621, 50851758,
+ 50857375, 50862473, 50867053, 50871115, 50874660, 50877689, 50880203,
+ 50882201, 50883686, 50884657, 50885116, 50885062, 50884498, 50883423,
+ 50881838, 50879745, 50877143, 50874034, 50870419, 50866297, 50861671,
+ 50856540, 50850906, 50844769, 50838130, 50830990, 50823350, 50815210,
+ 50806571, 50797435, 50787801, 50777671, 50767046, 50755926, 50744313,
+ 50732206, 50719607, 50706517, 50692937, 50678867, 50664309, 50649262,
+ 50633729, 50617709, 50601204, 50584215, 50566742, 50548787, 50530350,
+ 50511432, 50492034, 50472158, 50451803, 50430970, 50409662, 50387878,
+ 50365619, 50342887, 50319683, 50296006, 50271859, 50247242, 50222156,
+ 50196602, 50170580, 50144093, 50117141, 50089724, 50061844, 50033502,
+ 50004699, 49975435, 49945712, 49915530, 49884891, 49853796, 49822245,
+ 49790240, 49757781, 49724870, 49691507, 49657694, 49623431, 49588720,
+ 49553561, 49517956, 49481905, 49445410, 49408472, 49371091, 49333269,
+ 49295007, 49256306, 49217166, 49177589, 49137576, 49097128, 49056246,
+ 49014930, 48973183, 48931006, 48888398, 48845361, 48801897, 48758007,
+ 48713691, 48668950, 48623786, 48578200, 48532193, 48485765, 48438919,
+ 48391654, 48343973, 48295876, 48247365, 48198440, 48149103, 48099354,
+ 48049195, 47998628, 47947652, 47896269, 47844481, 47792288, 47739692,
+ 47686694, 47633294, 47579495, 47525296, 47470700, 47415707, 47360319,
+ 47304537, 47248361, 47191794, 47134835, 47077487, 47019751, 46961627,
+ 46903117, 46844222, 46784943, 46725281, 46665238, 46604815, 46544013,
+ 46482832, 46421275, 46359343, 46297036, 46234355, 46171303, 46107880,
+ 46044088, 45979927, 45915399, 45850505, 45785246, 45719623, 45653639,
+ 45587293, 45520587, 45453522, 45386100, 45318322, 45250189, 45181701,
+ 45112862, 45043671, 44974129, 44904239, 44834001, 44763417, 44692487,
+ 44621214, 44549598, 44477640, 44405342, 44332706, 44259731, 44186420,
+ 44112774, 44038793, 43964480, 43889836, 43814861, 43739558, 43663926,
+ 43587969, 43511686, 43435079, 43358150, 43280899, 43203328, 43125438,
+ 43047231, 42968708, 42889869, 42810717, 42731253, 42651477, 42571391,
+ 42490997, 42410296, 42329288, 42247976, 42166361, 42084443, 42002224,
+ 41919706, 41836890, 41753777, 41670367, 41586664, 41502668, 41418379,
+ 41333801, 41248933, 41163777, 41078335, 40992607, 40906596, 40820302,
+ 40733726, 40646871, 40559736, 40472325, 40384637, 40296675, 40208439,
+ 40119931, 40031152, 39942103, 39852787, 39763203, 39673354, 39583241,
+ 39492865, 39402228, 39311330, 39220173, 39128758, 39037087, 38945162,
+ 38852982, 38760551, 38667868, 38574936, 38481755, 38388328, 38294655,
+ 38200737, 38106577, 38012175, 37917532, 37822651, 37727532, 37632176,
+ 37536586, 37440762, 37344706, 37248418, 37151902, 37055156, 36958184,
+ 36860987, 36763565, 36665920, 36568053, 36469966, 36371661, 36273137,
+ 36174398, 36075444, 35976276, 35876896, 35777305, 35677504, 35577496,
+ 35477280, 35376859, 35276234, 35175406, 35074377, 34973148, 34871719,
+ 34770094, 34668272, 34566256, 34464046, 34361644, 34259051, 34156270,
+ 34053300, 33950143, 33846801, 33743275, 33639567, 33535677, 33431607,
+ 33327359, 33222934, 33118332, 33013556, 32908607, 32803486, 32698194,
+ 32592733, 32487105, 32381310, 32275349, 32169225, 32062939, 31956491,
+ 31849883, 31743117, 31636194, 31529115, 31421882, 31314496, 31206957,
+ 31099269, 30991431, 30883446, 30775314, 30667037, 30558617, 30450054,
+ 30341350, 30232506, 30123524, 30014405, 29905150, 29795761, 29686239,
+ 29576585, 29466800, 29356887, 29246846, 29136678, 29026386, 28915970,
+ 28805431, 28694771, 28583992, 28473094, 28362078, 28250948, 28139702,
+ 28028344, 27916874, 27805293, 27693603, 27581805, 27469901, 27357891,
+ 27245778, 27133562, 27021245, 26908828, 26796312, 26683699, 26570990,
+ 26458186, 26345288, 26232299, 26119219, 26006049, 25892792, 25779447,
+ 25666017, 25552502, 25438905, 25325226, 25211467, 25097628, 24983712,
+ 24869719, 24755652, 24641510, 24527296, 24413010, 24298654, 24184230,
+ 24069739, 23955181, 23840558, 23725872, 23611123, 23496314, 23381444,
+ 23266517, 23151532, 23036491, 22921396, 22806247, 22691046, 22575795,
+ 22460494, 22345145, 22229748, 22114306, 21998820, 21883290, 21767718,
+ 21652106, 21536454, 21420764, 21305038, 21189275, 21073478, 20957648,
+ 20841787, 20725894, 20609972, 20494022, 20378045, 20262042, 20146015,
+ 20029965, 19913893, 19797800, 19681687, 19565556, 19449409, 19333245,
+ 19217067, 19100875, 18984672, 18868457, 18752233, 18636000, 18519761,
+ 18403515, 18287264, 18171009, 18054753, 17938495, 17822237, 17705980,
+ 17589726, 17473475, 17357229, 17240989, 17124757, 17008533, 16892318,
+ 16776114, 16659922, 16543743, 16427579, 16311430, 16195298, 16079184,
+ 15963089, 15847014, 15730960, 15614929, 15498922, 15382939, 15266983,
+ 15151054, 15035153, 14919282, 14803441, 14687633, 14571857, 14456116,
+ 14340410, 14224740, 14109108, 13993514, 13877961, 13762448, 13646978,
+ 13531551, 13416168, 13300831, 13185541, 13070298, 12955104, 12839960,
+ 12724868, 12609827, 12494840, 12379907, 12265030, 12150210, 12035448,
+ 11920744, 11806100, 11691518, 11576997, 11462540, 11348147, 11233820,
+ 11119559, 11005366, 10891241, 10777187, 10663203, 10549291, 10435452,
+ 10321687, 10207997, 10094383, 9980847, 9867389, 9754010, 9640712,
+ 9527495, 9414361, 9301310, 9188344, 9075463, 8962670, 8849964, 8737346,
+ 8624819, 8512382, 8400037, 8287785, 8175627, 8063564, 7951596, 7839726,
+ 7727953, 7616280, 7504706, 7393234, 7281863, 7170595, 7059432, 6948373,
+ 6837420, 6726574, 6615836, 6505207, 6394687, 6284279, 6173982, 6063799,
+ 5953729, 5843773, 5733934, 5624211, 5514605, 5405118, 5295751, 5186504,
+ 5077379, 4968376, 4859496, 4750740, 4642110, 4533606, 4425228, 4316979,
+ 4208859, 4100868, 3993008, 3885280, 3777684, 3670222, 3562894, 3455702,
+ 3348645, 3241726, 3134945, 3028303, 2921800, 2815438, 2709218, 2603140,
+ 2497205, 2391414, 2285769, 2180269, 2074917, 1969711, 1864655, 1759748,
+ 1654991, 1550385, 1445931, 1341630, 1237482, 1133489, 1029652, 925970,
+ 822446, 719079, 615871, 512822, 409934, 307206, 204641, 102239, 0,
+ -102074, -203984, -305727, -407304, -508713, -609954, -711026, -811928,
+ -912659, -1013219, -1113607, -1213821, -1313862, -1413728, -1513419,
+ -1612933, -1712271, -1811432, -1910414, -2009216, -2107839, -2206282,
+ -2304543, -2402622, -2500518, -2598231, -2695759, -2793102, -2890260,
+ -2987232, -3084016, -3180612, -3277020, -3373238, -3469267, -3565105,
+ -3660751, -3756206, -3851467, -3946536, -4041410, -4136089, -4230573,
+ -4324861, -4418952, -4512845, -4606541, -4700037, -4793334, -4886431,
+ -4979327, -5072022, -5164514, -5256804, -5348891, -5440773, -5532451,
+ -5623924, -5715190, -5806251, -5897104, -5987749, -6078186, -6168414,
+ -6258432, -6348241, -6437838, -6527224, -6616398, -6705359, -6794108,
+ -6882642, -6970962, -7059068, -7146957, -7234631, -7322088, -7409328,
+ -7496350, -7583154, -7669739, -7756104, -7842250, -7928174, -8013878,
+ -8099360, -8184620, -8269658, -8354472, -8439062, -8523428, -8607570,
+ -8691485, -8775176, -8858639, -8941876, -9024886, -9107667, -9190221,
+ -9272545, -9354640, -9436505, -9518140, -9599544, -9680717, -9761658,
+ -9842367, -9922843, -10003086, -10083095, -10162870, -10242410,
+ -10321716, -10400786, -10479620, -10558218, -10636579, -10714702,
+ -10792588, -10870236, -10947646, -11024816, -11101747, -11178438,
+ -11254889, -11331100, -11407069, -11482797, -11558283, -11633526,
+ -11708527, -11783286, -11857800, -11932071, -12006098, -12079880,
+ -12153417, -12226708, -12299754, -12372554, -12445108, -12517414,
+ -12589474, -12661286, -12732850, -12804166, -12875233, -12946052,
+ -13016621, -13086941, -13157011, -13226830, -13296399, -13365717,
+ -13434784, -13503600, -13572163, -13640475, -13708534, -13776340,
+ -13843893, -13911193, -13978239, -14045031, -14111569, -14177853,
+ -14243882, -14309655, -14375174, -14440436, -14505443, -14570194,
+ -14634688, -14698926, -14762907, -14826630, -14890096, -14953305,
+ -15016255, -15078948, -15141381, -15203557, -15265473, -15327131,
+ -15388529, -15449667, -15510546, -15571165, -15631524, -15691622,
+ -15751460, -15811036, -15870352, -15929407, -15988200, -16046732,
+ -16105002, -16163010, -16220756, -16278240, -16335461, -16392419,
+ -16449115, -16505548, -16561717, -16617623, -16673266, -16728645,
+ -16783761, -16838612, -16893200, -16947523, -17001582, -17055376,
+ -17108906, -17162171, -17215171, -17267906, -17320376, -17372581,
+ -17424521, -17476195, -17527604, -17578747, -17629624, -17680235,
+ -17730581, -17780660, -17830473, -17880020, -17929301, -17978315,
+ -18027063, -18075545, -18123759, -18171707, -18219389, -18266803,
+ -18313951, -18360832, -18407445, -18453792, -18499872, -18545684,
+ -18591230, -18636508, -18681519, -18726263, -18770739, -18814948,
+ -18858890, -18902565, -18945972, -18989111, -19031984, -19074588,
+ -19116926, -19158996, -19200798, -19242333, -19283601, -19324601,
+ -19365334, -19405799, -19445997, -19485928, -19525591, -19564987,
+ -19604116, -19642977, -19681571, -19719898, -19757958, -19795751,
+ -19833277, -19870535, -19907527, -19944252, -19980710, -20016901,
+ -20052825, -20088483, -20123874, -20158998, -20193856, -20228448,
+ -20262773, -20296832, -20330625, -20364152, -20397413, -20430408,
+ -20463137, -20495600, -20527798, -20559731, -20591397, -20622799,
+ -20653936, -20684807, -20715413, -20745755, -20775832, -20805644,
+ -20835192, -20864476, -20893495, -20922250, -20950741, -20978969,
+ -21006933, -21034633, -21062070, -21089244, -21116155, -21142802,
+ -21169187, -21195310, -21221170, -21246768, -21272103, -21297177,
+ -21321989, -21346540, -21370829, -21394856, -21418623, -21442129,
+ -21465374, -21488359, -21511084, -21533548, -21555753, -21577697,
+ -21599383, -21620809, -21641976, -21662884, -21683533, -21703925,
+ -21724057, -21743932, -21763549, -21782909, -21802011, -21820856,
+ -21839444, -21857776, -21875851, -21893670, -21911233, -21928541,
+ -21945593, -21962390, -21978932, -21995219, -22011252, -22027031,
+ -22042556, -22057827, -22072845, -22087610, -22102121, -22116381,
+ -22130388, -22144143, -22157646, -22170898, -22183899, -22196649,
+ -22209148, -22221397, -22233396, -22245145, -22256645, -22267896,
+ -22278897, -22289651, -22300156, -22310413, -22320423, -22330185,
+ -22339700, -22348969, -22357991, -22366768, -22375298, -22383584,
+ -22391624, -22399419, -22406970, -22414277, -22421341, -22428161,
+ -22434738, -22441072, -22447164, -22453014, -22458622, -22463989,
+ -22469115, -22474000, -22478645, -22483050, -22487216, -22491142,
+ -22494830, -22498279, -22501490, -22504464, -22507200, -22509699,
+ -22511962, -22513988, -22515778, -22517333, -22518653, -22519739,
+ -22520590, -22521207, -22521590, -22521741, -22521659, -22521344,
+ -22520797, -22520019, -22519010, -22517770, -22516300, -22514600,
+ -22512670, -22510511, -22508124, -22505508, -22502665, -22499594,
+ -22496295, -22492771, -22489020, -22485044, -22480842, -22476415,
+ -22471764, -22466889, -22461790, -22456468, -22450923, -22445156,
+ -22439167, -22432957, -22426526, -22419874, -22413003, -22405911,
+ -22398601, -22391072, -22383324, -22375359, -22367176, -22358777,
+ -22350161, -22341329, -22332281, -22323019, -22313542, -22303851,
+ -22293946, -22283828, -22273498, -22262955, -22252201, -22241235,
+ -22230058, -22218671, -22207075, -22195269, -22183254, -22171030,
+ -22158599, -22145961, -22133115, -22120064, -22106806, -22093343,
+ -22079675, -22065802, -22051726, -22037446, -22022963, -22008278,
+ -21993391, -21978302, -21963013, -21947523, -21931833, -21915944,
+ -21899856, -21883569, -21867085, -21850404, -21833525, -21816451,
+ -21799180, -21781715, -21764054, -21746200, -21728152, -21709910,
+ -21691476, -21672850, -21654032, -21635024, -21615825, -21596435,
+ -21576857, -21557089, -21537133, -21516990, -21496659, -21476141,
+ -21455437, -21434548, -21413473, -21392214, -21370770, -21349144,
+ -21327334, -21305342, -21283168, -21260813, -21238277, -21215561,
+ -21192665, -21169590, -21146337, -21122906, -21099297, -21075512,
+ -21051550, -21027412, -21003100, -20978613, -20953951, -20929117,
+ -20904109, -20878929, -20853578, -20828055, -20802361, -20776498,
+ -20750465, -20724263, -20697892, -20671354, -20644649, -20617777,
+ -20590740, -20563536, -20536168, -20508636, -20480939, -20453080,
+ -20425058, -20396874, -20368529, -20340023, -20311356, -20282531,
+ -20253546, -20224402, -20195101, -20165642, -20136027, -20106255,
+ -20076328, -20046246, -20016010, -19985620, -19955077, -19924381,
+ -19893534, -19862535, -19831385, -19800085, -19768635, -19737037,
+ -19705290, -19673395, -19641353, -19609165, -19576830, -19544350,
+ -19511725, -19478957, -19446044, -19412989, -19379791, -19346451,
+ -19312971, -19279349, -19245588, -19211688, -19177648, -19143471,
+ -19109156, -19074704, -19040116, -19005392, -18970533, -18935539,
+ -18900412, -18865152, -18829758, -18794233, -18758576, -18722789,
+ -18686871, -18650824, -18614648, -18578343, -18541911, -18505351,
+ -18468665, -18431853, -18394916, -18357854, -18320668, -18283359,
+ -18245927, -18208373, -18170697, -18132900, -18094983, -18056946,
+ -18018790, -17980515, -17942123, -17903613, -17864987, -17826245,
+ -17787387, -17748414, -17709328, -17670128, -17630815, -17591389,
+ -17551852, -17512204, -17472446, -17432577, -17392600, -17352514,
+ -17312320, -17272019, -17231611, -17191096, -17150477, -17109753,
+ -17068924, -17027992, -16986957, -16945819, -16904580, -16863240,
+ -16821799, -16780258, -16738619, -16696880, -16655044, -16613110,
+ -16571079, -16528953, -16486731, -16444414, -16402002, -16359498,
+ -16316900, -16274209, -16231427, -16188554, -16145591, -16102537,
+ -16059394, -16016163, -15972843, -15929436, -15885943, -15842363,
+ -15798698, -15754947, -15711113, -15667194, -15623193, -15579109,
+ -15534944, -15490697, -15446370, -15401962, -15357476, -15312910,
+ -15268267, -15223546, -15178748, -15133874, -15088925, -15043900,
+ -14998801, -14953628, -14908382, -14863064, -14817673, -14772212,
+ -14726679, -14681077, -14635405, -14589664, -14543855, -14497979,
+ -14452035, -14406025, -14359949, -14313808, -14267603, -14221334,
+ -14175001, -14128606, -14082148, -14035629, -13989049, -13942409,
+ -13895710, -13848951, -13802134, -13755259, -13708327, -13661338,
+ -13614293, -13567193, -13520038, -13472828, -13425566, -13378250,
+ -13330882, -13283462, -13235991, -13188469, -13140898, -13093277,
+ -13045607, -12997890, -12950124, -12902312, -12854453, -12806549,
+ -12758599, -12710605, -12662567, -12614486, -12566362, -12518196,
+ -12469988, -12421739, -12373450, -12325120, -12276752, -12228345,
+ -12179901, -12131418, -12082899, -12034344, -11985753, -11937127,
+ -11888466, -11839772, -11791044, -11742283, -11693491, -11644667,
+ -11595811, -11546926, -11498011, -11449066, -11400093, -11351092,
+ -11302063, -11253007, -11203925, -11154818, -11105685, -11056527,
+ -11007346, -10958141, -10908913, -10859663, -10810391, -10761098,
+ -10711784, -10662451, -10613097, -10563726, -10514335, -10464927,
+ -10415502, -10366060, -10316602, -10267129, -10217641, -10168138,
+ -10118622, -10069092, -10019549, -9969995, -9920429, -9870852,
+ -9821264, -9771667, -9722060, -9672444, -9622820, -9573189, -9523550,
+ -9473905, -9424253, -9374596, -9324935, -9275268, -9225598, -9175925,
+ -9126249, -9076570, -9026890, -8977209, -8927527, -8877845, -8828163,
+ -8778483, -8728804, -8679127, -8629453, -8579781, -8530114, -8480451,
+ -8430792, -8381139, -8331491, -8281850, -8232215, -8182588, -8132969,
+ -8083358, -8033756, -7984164, -7934581, -7885009, -7835448, -7785899,
+ -7736361, -7686836, -7637325, -7587826, -7538342, -7488872, -7439418,
+ -7389979, -7340556, -7291150, -7241761, -7192389, -7143036, -7093701,
+ -7044386, -6995090, -6945814, -6896559, -6847324, -6798112, -6748922,
+ -6699754, -6650609, -6601488, -6552391, -6503318, -6454271, -6405249,
+ -6356253, -6307283, -6258341, -6209425, -6160538, -6111680, -6062850,
+ -6014049, -5965279, -5916538, -5867829, -5819150, -5770504, -5721889,
+ -5673308, -5624759, -5576244, -5527763, -5479316, -5430905, -5382529,
+ -5334189, -5285885, -5237618, -5189388, -5141196, -5093042, -5044927,
+ -4996851, -4948815, -4900818, -4852862, -4804946, -4757072, -4709240,
+ -4661450, -4613702, -4565998, -4518337, -4470720, -4423148, -4375620,
+ -4328137, -4280701, -4233310, -4185966, -4138668, -4091419, -4044217,
+ -3997063, -3949958, -3902902, -3855895, -3808938, -3762032, -3715177,
+ -3668372, -3621619, -3574919, -3528270, -3481675, -3435132, -3388643,
+ -3342209, -3295828, -3249503, -3203233, -3157018, -3110860, -3064757,
+ -3018712, -2972724, -2926794, -2880921, -2835107, -2789352, -2743656,
+ -2698019, -2652442, -2606926, -2561470, -2516076, -2470743, -2425472,
+ -2380263, -2335116, -2290033, -2245013, -2200056, -2155164, -2110336,
+ -2065573, -2020875, -1976243, -1931676, -1887176, -1842743, -1798376,
+ -1754077, -1709845, -1665682, -1621587, -1577560, -1533603, -1489716,
+ -1445898, -1402150, -1358472, -1314866, -1271331, -1227867, -1184475,
+ -1141155, -1097908, -1054733, -1011632, -968604, -925651, -882771,
+ -839966, -797235, -754580, -712001, -669497, -627069, -584718, -542443,
+ -500245, -458125, -416083, -374118, -332232, -290425, -248696, -207047,
+ -165477, -123987, -82577, -41248, 0, 41167, 82253, 123258, 164181,
+ 205021, 245779, 286454, 327046, 367555, 407980, 448322, 488579, 528751,
+ 568839, 608842, 648759, 688591, 728337, 767997, 807570, 847057, 886457,
+ 925770, 964995, 1004132, 1043182, 1082143, 1121016, 1159800, 1198495,
+ 1237101, 1275617, 1314044, 1352381, 1390627, 1428783, 1466848, 1504822,
+ 1542705, 1580496, 1618196, 1655804, 1693320, 1730743, 1768073, 1805311,
+ 1842456, 1879507, 1916465, 1953329, 1990099, 2026775, 2063356, 2099843,
+ 2136235, 2172532, 2208733, 2244839, 2280849, 2316763, 2352582, 2388303,
+ 2423929, 2459457, 2494889, 2530223, 2565460, 2600600, 2635641, 2670585,
+ 2705431, 2740178, 2774827, 2809377, 2843828, 2878180, 2912432, 2946586,
+ 2980639, 3014593, 3048447, 3082201, 3115854, 3149407, 3182859, 3216210,
+ 3249460, 3282609, 3315657, 3348603, 3381447, 3414190, 3446830, 3479368,
+ 3511804, 3544137, 3576368, 3608496, 3640521, 3672443, 3704261, 3735976,
+ 3767588, 3799096, 3830500, 3861800, 3892996, 3924087, 3955074, 3985957,
+ 4016735, 4047408, 4077976, 4108439, 4138797, 4169049, 4199196, 4229238,
+ 4259173, 4289003, 4318727, 4348345, 4377857, 4407262, 4436561, 4465753,
+ 4494839, 4523818, 4552690, 4581455, 4610113, 4638663, 4667107, 4695443,
+ 4723671, 4751792, 4779805, 4807711, 4835508, 4863198, 4890779, 4918253,
+ 4945618, 4972874, 5000022, 5027062, 5053993, 5080815, 5107529, 5134134,
+ 5160630, 5187016, 5213294, 5239463, 5265522, 5291472, 5317313, 5343044,
+ 5368666, 5394178, 5419580, 5444873, 5470056, 5495129, 5520092, 5544946,
+ 5569689, 5594322, 5618845, 5643258, 5667561, 5691754, 5715836, 5739808,
+ 5763669, 5787420, 5811061, 5834590, 5858010, 5881318, 5904517, 5927604,
+ 5950581, 5973446, 5996201, 6018846, 6041379, 6063802, 6086113, 6108314,
+ 6130404, 6152382, 6174250, 6196007, 6217652, 6239187, 6260610, 6281923,
+ 6303124, 6324214, 6345193, 6366061, 6386818, 6407463, 6427998, 6448421,
+ 6468733, 6488934, 6509023, 6529002, 6548869, 6568625, 6588270, 6607804,
+ 6627226, 6646538, 6665738, 6684827, 6703805, 6722672, 6741428, 6760072,
+ 6778606, 6797028, 6815340, 6833540, 6851630, 6869608, 6887476, 6905233,
+ 6922878, 6940413, 6957837, 6975150, 6992353, 7009445, 7026426, 7043296,
+ 7060055, 7076704, 7093243, 7109671, 7125988, 7142195, 7158292, 7174278,
+ 7190154, 7205919, 7221575, 7237120, 7252555, 7267880, 7283095, 7298200,
+ 7313195, 7328080, 7342855, 7357521, 7372077, 7386523, 7400860, 7415087,
+ 7429205, 7443213, 7457112, 7470902, 7484583, 7498154, 7511617, 7524971,
+ 7538215, 7551351, 7564378, 7577297, 7590106, 7602808, 7615401, 7627885,
+ 7640261, 7652529, 7664689, 7676741, 7688685, 7700521, 7712250, 7723870,
+ 7735383, 7746789, 7758087, 7769278, 7780362, 7791338, 7802208, 7812970,
+ 7823626, 7834175, 7844618, 7854953, 7865183, 7875306, 7885323, 7895234,
+ 7905038, 7914737, 7924330, 7933818, 7943200, 7952476, 7961647, 7970713,
+ 7979673, 7988529, 7997280, 8005926, 8014467, 8022904, 8031236, 8039464,
+ 8047588, 8055608, 8063524, 8071336, 8079044, 8086649, 8094151, 8101549,
+ 8108844, 8116036, 8123125, 8130111, 8136995, 8143776, 8150455, 8157031,
+ 8163506, 8169878, 8176149, 8182318, 8188386, 8194352, 8200217, 8205980,
+ 8211643, 8217205, 8222666, 8228027, 8233288, 8238448, 8243508, 8248468,
+ 8253328, 8258089, 8262750, 8267312, 8271775, 8276139, 8280404, 8284570,
+ 8288637, 8292607, 8296478, 8300251, 8303926, 8307503, 8310983, 8314365,
+ 8317650, 8320838, 8323929, 8326924, 8329822, 8332623, 8335328, 8337937,
+ 8340450, 8342867, 8345189, 8347416, 8349547, 8351583, 8353524, 8355371,
+ 8357123, 8358780, 8360344, 8361814, 8363189, 8364471, 8365660, 8366756,
+ 8367758, 8368667, 8369484, 8370208, 8370840, 8371380, 8371828, 8372184,
+ 8372448, 8372621, 8372703, 8372693, 8372593, 8372403, 8372121, 8371750,
+ 8371288, 8370737, 8370096, 8369365, 8368545, 8367636, 8366638, 8365552,
+ 8364377, 8363113, 8361762, 8360323, 8358796, 8357181, 8355479, 8353690,
+ 8351814, 8349852, 8347803, 8345668, 8343446, 8341139, 8338746, 8336268,
+ 8333704, 8331056, 8328322, 8325504, 8322602, 8319615, 8316545, 8313390,
+ 8310152, 8306831, 8303427, 8299939, 8296369, 8292717, 8288982, 8285165,
+ 8281267, 8277286, 8273225, 8269082, 8264858, 8260553, 8256168, 8251703,
+ 8247157, 8242532, 8237827, 8233042, 8228179, 8223236, 8218215, 8213115,
+ 8207936, 8202680, 8197346, 8191934, 8186445, 8180879, 8175235, 8169515,
+ 8163719, 8157846, 8151897, 8145873, 8139772, 8133597, 8127346, 8121021,
+ 8114620, 8108146, 8101597, 8094974, 8088278, 8081508, 8074665, 8067748,
+ 8060759, 8053698, 8046564, 8039358, 8032080, 8024730, 8017309, 8009817,
+ 8002254, 7994621, 7986917, 7979143, 7971299, 7963385, 7955401, 7947349,
+ 7939227, 7931037, 7922778, 7914451, 7906056, 7897593, 7889063, 7880465,
+ 7871800, 7863068, 7854270, 7845406, 7836475, 7827478, 7818416, 7809289,
+ 7800096, 7790839, 7781517, 7772130, 7762680, 7753165, 7743587, 7733946,
+ 7724241, 7714473, 7704643, 7694751, 7684796, 7674779, 7664701, 7654561,
+ 7644360, 7634098, 7623776, 7613393, 7602949, 7592446, 7581884, 7571261,
+ 7560580, 7549840, 7539041, 7528183, 7517268, 7506294, 7495263, 7484174,
+ 7473028, 7461826, 7450566, 7439250, 7427878, 7416451, 7404967, 7393428,
+ 7381834, 7370185, 7358481, 7346723, 7334911, 7323044, 7311125, 7299151,
+ 7287125, 7275046, 7262914, 7250730, 7238493, 7226205, 7213865, 7201474,
+ 7189031, 7176538, 7163994, 7151400, 7138756, 7126062, 7113318, 7100525,
+ 7087683, 7074792, 7061852, 7048864, 7035829, 7022745, 7009613, 6996435,
+ 6983209, 6969937, 6956618, 6943253, 6929841, 6916384, 6902882, 6889334,
+ 6875741, 6862103, 6848421, 6834695, 6820924, 6807110, 6793253, 6779352,
+ 6765408, 6751422, 6737393, 6723322, 6709208, 6695054, 6680857, 6666620,
+ 6652341, 6638022, 6623663, 6609263, 6594823, 6580344, 6565825, 6551267,
+ 6536671, 6522035, 6507361, 6492649, 6477899, 6463112, 6448287, 6433425,
+ 6418526, 6403590, 6388618, 6373610, 6358566, 6343486, 6328371, 6313221,
+ 6298036, 6282817, 6267563, 6252275, 6236953, 6221598, 6206209, 6190787,
+ 6175332, 6159845, 6144325, 6128773, 6113189, 6097574, 6081927, 6066250,
+ 6050541, 6034802, 6019032, 6003233, 5987403, 5971544, 5955656, 5939738,
+ 5923792, 5907817, 5891813, 5875782, 5859722, 5843636, 5827521, 5811380,
+ 5795211, 5779016, 5762795, 5746548, 5730274, 5713975, 5697651, 5681301,
+ 5664927, 5648527, 5632104, 5615656, 5599184, 5582689, 5566170, 5549628,
+ 5533063, 5516476, 5499865, 5483233, 5466579, 5449903, 5433205, 5416486,
+ 5399746, 5382986, 5366204, 5349403, 5332581, 5315740, 5298879, 5281999,
+ 5265099, 5248181, 5231244, 5214289, 5197315, 5180324, 5163315, 5146289,
+ 5129245, 5112184, 5095107, 5078013, 5060903, 5043777, 5026635, 5009478,
+ 4992305, 4975117, 4957915, 4940697, 4923466, 4906220, 4888960, 4871687,
+ 4854400, 4837099, 4819786, 4802460, 4785122, 4767771, 4750409, 4733034,
+ 4715648, 4698250, 4680841, 4663421, 4645991, 4628550, 4611099, 4593638,
+ 4576167, 4558686, 4541196, 4523697, 4506189, 4488673, 4471148, 4453614,
+ 4436073, 4418524, 4400967, 4383403, 4365832, 4348254, 4330669, 4313078,
+ 4295481, 4277877, 4260268, 4242653, 4225033, 4207408, 4189778, 4172143,
+ 4154503, 4136859, 4119212, 4101560, 4083905, 4066246, 4048584, 4030919,
+ 4013251, 3995581, 3977909, 3960234, 3942557, 3924879, 3907199, 3889517,
+ 3871835, 3854152, 3836468, 3818784, 3801099, 3783414, 3765730, 3748046,
+ 3730362, 3712679, 3694997, 3677317, 3659637, 3641960, 3624284, 3606610,
+ 3588938, 3571269, 3553602, 3535938, 3518277, 3500619, 3482965, 3465314,
+ 3447667, 3430024, 3412386, 3394751, 3377121, 3359496, 3341876, 3324261,
+ 3306652, 3289048, 3271450, 3253858, 3236271, 3218692, 3201118, 3183552,
+ 3165992, 3148439, 3130894, 3113356, 3095826, 3078304, 3060790, 3043283,
+ 3025786, 3008297, 2990816, 2973345, 2955883, 2938430, 2920987, 2903553,
+ 2886129, 2868716, 2851312, 2833919, 2816537, 2799165, 2781804, 2764455,
+ 2747116, 2729790, 2712474, 2695171, 2677880, 2660601, 2643334, 2626080,
+ 2608839, 2591610, 2574395, 2557193, 2540004, 2522829, 2505667, 2488520,
+ 2471386, 2454267, 2437162, 2420072, 2402997, 2385936, 2368891, 2351861,
+ 2334846, 2317847, 2300864, 2283896, 2266945, 2250010, 2233091, 2216189,
+ 2199303, 2182435, 2165583, 2148749, 2131932, 2115133, 2098351, 2081587,
+ 2064841, 2048113, 2031404, 2014713, 1998040, 1981387, 1964752, 1948136,
+ 1931540, 1914963, 1898405, 1881867, 1865349, 1848851, 1832373, 1815915,
+ 1799477, 1783060, 1766664, 1750289, 1733935, 1717601, 1701289, 1684999,
+ 1668730, 1652483, 1636257, 1620054, 1603872, 1587713, 1571577, 1555462,
+ 1539371, 1523302, 1507257, 1491234, 1475234, 1459258, 1443306, 1427377,
+ 1411471, 1395590, 1379733, 1363899, 1348091, 1332306, 1316546, 1300811,
+ 1285100, 1269414, 1253754, 1238118, 1222508, 1206923, 1191364, 1175831,
+ 1160323, 1144841, 1129385, 1113956, 1098552, 1083175, 1067825, 1052501,
+ 1037204, 1021934, 1006691, 991475, 976286, 961124, 945990, 930884,
+ 915805, 900754, 885731, 870735, 855768, 840830, 825919, 811037, 796184,
+ 781359, 766563, 751796, 737058, 722349, 707669, 693019, 678398, 663806,
+ 649244, 634712, 620210, 605737, 591295, 576883, 562501, 548149, 533828,
+ 519537, 505277, 491047, 476848, 462681, 448544, 434438, 420364, 406320,
+ 392308, 378328, 364379, 350462, 336576, 322723, 308901, 295111, 281353,
+ 267628, 253934, 240274, 226645, 213049, 199485, 185955, 172457, 158991,
+ 145559, 132160, 118794, 105461, 92161, 78894, 65661, 52462, 39296,
+ 26163, 13064, 0, -13031, -26028, -38991, -51920, -64815, -77676,
+ -90503, -103295, -116053, -128776, -141465, -154119, -166738, -179323,
+ -191873, -204388, -216868, -229313, -241723, -254097, -266437, -278741,
+ -291010, -303244, -315442, -327605, -339732, -351823, -363879, -375899,
+ -387884, -399832, -411745, -423621, -435462, -447266, -459035, -470767,
+ -482463, -494122, -505746, -517333, -528883, -540397, -551875, -563316,
+ -574720, -586088, -597419, -608713, -619971, -631191, -642375, -653522,
+ -664632, -675704, -686740, -697739, -708700, -719625, -730512, -741362,
+ -752174, -762949, -773687, -784387, -795050, -805676, -816264, -826814,
+ -837327, -847802, -858240, -868640, -879002, -889326, -899613, -909862,
+ -920073, -930246, -940381, -950479, -960538, -970560, -980543, -990488,
+ -1000396, -1010265, -1020096, -1029889, -1039644, -1049361, -1059039,
+ -1068680, -1078282, -1087846, -1097371, -1106859, -1116308, -1125718,
+ -1135091, -1144425, -1153720, -1162977, -1172196, -1181376, -1190518,
+ -1199622, -1208687, -1217713, -1226701, -1235651, -1244562, -1253434,
+ -1262268, -1271063, -1279820, -1288538, -1297218, -1305859, -1314462,
+ -1323026, -1331551, -1340038, -1348486, -1356895, -1365266, -1373598,
+ -1381892, -1390147, -1398363, -1406540, -1414680, -1422780, -1430842,
+ -1438865, -1446849, -1454795, -1462702, -1470571, -1478401, -1486192,
+ -1493945, -1501659, -1509334, -1516971, -1524569, -1532129, -1539650,
+ -1547132, -1554576, -1561981, -1569348, -1576676, -1583966, -1591217,
+ -1598429, -1605603, -1612739, -1619836, -1626894, -1633914, -1640896,
+ -1647839, -1654744, -1661610, -1668438, -1675228, -1681979, -1688692,
+ -1695366, -1702002, -1708600, -1715160, -1721681, -1728164, -1734609,
+ -1741016, -1747384, -1753714, -1760007, -1766261, -1772476, -1778654,
+ -1784794, -1790896, -1796959, -1802985, -1808973, -1814923, -1820835,
+ -1826709, -1832545, -1838343, -1844104, -1849826, -1855511, -1861159,
+ -1866768, -1872340, -1877874, -1883371, -1888830, -1894252, -1899636,
+ -1904982, -1910291, -1915563, -1920797, -1925994, -1931154, -1936276,
+ -1941361, -1946409, -1951420, -1956393, -1961329, -1966229, -1971091,
+ -1975916, -1980705, -1985456, -1990171, -1994848, -1999489, -2004093,
+ -2008660, -2013191, -2017685, -2022142, -2026563, -2030947, -2035295,
+ -2039607, -2043881, -2048120, -2052322, -2056488, -2060618, -2064712,
+ -2068769, -2072790, -2076776, -2080725, -2084638, -2088516, -2092357,
+ -2096163, -2099933, -2103667, -2107366, -2111029, -2114656, -2118248,
+ -2121804, -2125325, -2128811, -2132261, -2135676, -2139056, -2142400,
+ -2145710, -2148984, -2152224, -2155428, -2158598, -2161732, -2164832,
+ -2167897, -2170928, -2173923, -2176885, -2179811, -2182703, -2185561,
+ -2188385, -2191174, -2193929, -2196649, -2199336, -2201988, -2204607,
+ -2207191, -2209742, -2212258, -2214741, -2217191, -2219606, -2221988,
+ -2224337, -2226652, -2228933, -2231181, -2233396, -2235578, -2237727,
+ -2239842, -2241924, -2243974, -2245990, -2247974, -2249924, -2251842,
+ -2253728, -2255581, -2257401, -2259189, -2260944, -2262667, -2264358,
+ -2266016, -2267643, -2269237, -2270800, -2272330, -2273828, -2275295,
+ -2276730, -2278133, -2279505, -2280845, -2282154, -2283431, -2284677,
+ -2285892, -2287076, -2288228, -2289350, -2290440, -2291499, -2292528,
+ -2293526, -2294493, -2295430, -2296336, -2297211, -2298057, -2298871,
+ -2299656, -2300410, -2301135, -2301829, -2302493, -2303128, -2303732,
+ -2304307, -2304852, -2305368, -2305854, -2306310, -2306738, -2307135,
+ -2307504, -2307844, -2308154, -2308436, -2308688, -2308912, -2309107,
+ -2309273, -2309411, -2309520, -2309601, -2309653, -2309677, -2309673,
+ -2309640, -2309580, -2309492, -2309375, -2309231, -2309059, -2308860,
+ -2308633, -2308378, -2308096, -2307786, -2307449, -2307086, -2306694,
+ -2306276, -2305831, -2305359, -2304861, -2304335, -2303783, -2303205,
+ -2302600, -2301968, -2301310, -2300626, -2299916, -2299180, -2298418,
+ -2297630, -2296816, -2295976, -2295111, -2294220, -2293304, -2292362,
+ -2291395, -2290403, -2289386, -2288343, -2287276, -2286183, -2285066,
+ -2283924, -2282758, -2281567, -2280351, -2279111, -2277847, -2276558,
+ -2275246, -2273909, -2272548, -2271164, -2269755, -2268323, -2266868,
+ -2265388, -2263886, -2262360, -2260810, -2259238, -2257642, -2256023,
+ -2254382, -2252717, -2251030, -2249320, -2247587, -2245832, -2244055,
+ -2242255, -2240433, -2238589, -2236722, -2234834, -2232924, -2230992,
+ -2229038, -2227063, -2225066, -2223047, -2221007, -2218946, -2216864,
+ -2214760, -2212636, -2210490, -2208324, -2206137, -2203929, -2201701,
+ -2199452, -2197183, -2194893, -2192584, -2190254, -2187904, -2185533,
+ -2183144, -2180734, -2178304, -2175855, -2173387, -2170899, -2168391,
+ -2165865, -2163319, -2160754, -2158170, -2155567, -2152945, -2150305,
+ -2147646, -2144968, -2142272, -2139557, -2136824, -2134073, -2131304,
+ -2128517, -2125712, -2122889, -2120048, -2117189, -2114313, -2111420,
+ -2108509, -2105581, -2102635, -2099672, -2096693, -2093696, -2090682,
+ -2087652, -2084605, -2081541, -2078461, -2075364, -2072251, -2069122,
+ -2065976, -2062815, -2059637, -2056444, -2053234, -2050009, -2046769,
+ -2043513, -2040241, -2036954, -2033651, -2030334, -2027001, -2023654,
+ -2020291, -2016913, -2013521, -2010114, -2006693, -2003257, -1999806,
+ -1996342, -1992863, -1989370, -1985863, -1982341, -1978806, -1975258,
+ -1971695, -1968119, -1964529, -1960926, -1957310, -1953680, -1950037,
+ -1946381, -1942712, -1939030, -1935336, -1931628, -1927908, -1924175,
+ -1920430, -1916672, -1912902, -1909120, -1905326, -1901520, -1897701,
+ -1893871, -1890029, -1886175, -1882310, -1878433, -1874545, -1870645,
+ -1866734, -1862812, -1858879, -1854935, -1850980, -1847014, -1843037,
+ -1839050, -1835051, -1831043, -1827024, -1822995, -1818955, -1814905,
+ -1810845, -1806776, -1802696, -1798606, -1794507, -1790398, -1786280,
+ -1782152, -1778014, -1773867, -1769711, -1765546, -1761372, -1757189,
+ -1752997, -1748796, -1744586, -1740368, -1736141, -1731905, -1727662,
+ -1723409, -1719149, -1714880, -1710604, -1706319, -1702027, -1697726,
+ -1693418, -1689102, -1684779, -1680448, -1676110, -1671764, -1667411,
+ -1663051, -1658684, -1654310, -1649929, -1645540, -1641146, -1636744,
+ -1632336, -1627921, -1623500, -1619073, -1614639, -1610199, -1605753,
+ -1601301, -1596843, -1592378, -1587909, -1583433, -1578952, -1574465,
+ -1569972, -1565474, -1560971, -1556463, -1551949, -1547430, -1542906,
+ -1538377, -1533844, -1529305, -1524762, -1520214, -1515662, -1511105,
+ -1506543, -1501977, -1497407, -1492833, -1488255, -1483672, -1479086,
+ -1474495, -1469901, -1465303, -1460702, -1456097, -1451488, -1446876,
+ -1442260, -1437641, -1433019, -1428394, -1423766, -1419135, -1414500,
+ -1409863, -1405223, -1400581, -1395935, -1391288, -1386637, -1381984,
+ -1377329, -1372672, -1368012, -1363350, -1358687, -1354021, -1349353,
+ -1344683, -1340012, -1335339, -1330664, -1325987, -1321310, -1316630,
+ -1311950, -1307267, -1302584, -1297900, -1293214, -1288528, -1283840,
+ -1279152, -1274463, -1269773, -1265082, -1260391, -1255699, -1251007,
+ -1246314, -1241621, -1236928, -1232234, -1227540, -1222847, -1218153,
+ -1213459, -1208765, -1204072, -1199379, -1194686, -1189993, -1185301,
+ -1180609, -1175918, -1171228, -1166538, -1161849, -1157161, -1152474,
+ -1147787, -1143102, -1138418, -1133735, -1129053, -1124372, -1119693,
+ -1115015, -1110338, -1105663, -1100990, -1096318, -1091648, -1086979,
+ -1082313, -1077648, -1072985, -1068324, -1063665, -1059009, -1054354,
+ -1049702, -1045052, -1040404, -1035759, -1031116, -1026476, -1021838,
+ -1017203, -1012571, -1007941, -1003314, -998690, -994069, -989451,
+ -984836, -980224, -975615, -971009, -966407, -961808, -957212, -952620,
+ -948031, -943445, -938863, -934285, -929711, -925140, -920573, -916010,
+ -911451, -906895, -902344, -897797, -893254, -888715, -884180, -879650,
+ -875123, -870602, -866084, -861571, -857063, -852559, -848060, -843565,
+ -839075, -834590, -830110, -825634, -821164, -816698, -812237, -807782,
+ -803331, -798886, -794446, -790011, -785581, -781157, -776738, -772325,
+ -767917, -763514, -759117, -754726, -750341, -745961, -741586, -737218,
+ -732855, -728499, -724148, -719803, -715464, -711132, -706805, -702484,
+ -698170, -693862, -689560, -685265, -680975, -676693, -672416, -668146,
+ -663883, -659626, -655376, -651132, -646895, -642665, -638442, -634225,
+ -630015, -625812, -621616, -617427, -613245, -609070, -604902, -600741,
+ -596587, -592440, -588301, -584169, -580044, -575926, -571816, -567713,
+ -563618, -559530, -555449, -551376, -547311, -543253, -539203, -535161,
+ -531126, -527099, -523080, -519069, -515065, -511069, -507082, -503102,
+ -499130, -495166, -491210, -487262, -483323, -479391, -475468, -471553,
+ -467646, -463747, -459857, -455974, -452101, -448235, -444378, -440530,
+ -436690, -432858, -429035, -425220, -421414, -417617, -413828, -410048,
+ -406276, -402514, -398760, -395014, -391278, -387550, -383832, -380122,
+ -376421, -372728, -369045, -365371, -361706, -358050, -354402, -350764,
+ -347135, -343515, -339904, -336303, -332710, -329127, -325553, -321988,
+ -318433, -314886, -311350, -307822, -304304, -300795, -297295, -293805,
+ -290325, -286854, -283392, -279940, -276497, -273064, -269641, -266227,
+ -262822, -259427, -256042, -252667, -249301, -245945, -242599, -239262,
+ -235935, -232618, -229310, -226013, -222725, -219447, -216179, -212920,
+ -209672, -206433, -203205, -199986, -196777, -193578, -190389, -187210,
+ -184041, -180882, -177733, -174594, -171466, -168347, -165238, -162139,
+ -159051, -155972, -152904, -149846, -146798, -143760, -140732, -137714,
+ -134707, -131710, -128723, -125746, -122779, -119823, -116877, -113941,
+ -111016, -108100, -105195, -102301, -99416, -96542, -93678, -90825,
+ -87982, -85149, -82327, -79515, -76713, -73922, -71141, -68370, -65610,
+ -62860, -60121, -57392, -54674, -51966, -49268, -46581, -43904, -41238,
+ -38582, -35936, -33301, -30677, -28063, -25459, -22866, -20283, -17711,
+ -15149, -12598, -10057, -7527, -5007, -2498, 0
+};
+
+const int32_t filter_data_P[32769] = {
+ 0, -1248, -2498, -3752, -5007, -6266, -7527, -8790, -10057, -11325,
+ -12597, -13870, -15147, -16426, -17707, -18991, -20277, -21566, -22857,
+ -24151, -25447, -26746, -28047, -29350, -30656, -31964, -33275, -34588,
+ -35903, -37221, -38541, -39863, -41188, -42515, -43844, -45176, -46510,
+ -47846, -49184, -50525, -51868, -53213, -54560, -55910, -57261, -58615,
+ -59971, -61330, -62690, -64053, -65417, -66784, -68153, -69524, -70897,
+ -72272, -73649, -75028, -76410, -77793, -79178, -80565, -81955, -83346,
+ -84739, -86134, -87531, -88930, -90331, -91734, -93139, -94545, -95954,
+ -97364, -98776, -100190, -101606, -103024, -104443, -105864, -107287,
+ -108712, -110138, -111567, -112997, -114428, -115861, -117296, -118733,
+ -120171, -121611, -123053, -124496, -125940, -127387, -128835, -130284,
+ -131735, -133188, -134642, -136097, -137554, -139013, -140473, -141934,
+ -143397, -144861, -146327, -147794, -149262, -150732, -152203, -153676,
+ -155150, -156625, -158101, -159579, -161058, -162538, -164020, -165503,
+ -166986, -168472, -169958, -171445, -172934, -174424, -175915, -177407,
+ -178900, -180394, -181889, -183385, -184883, -186381, -187880, -189381,
+ -190882, -192384, -193888, -195392, -196897, -198403, -199910, -201417,
+ -202926, -204435, -205945, -207456, -208968, -210481, -211994, -213508,
+ -215023, -216539, -218055, -219572, -221090, -222608, -224127, -225646,
+ -227166, -228687, -230208, -231730, -233253, -234776, -236299, -237823,
+ -239347, -240872, -242397, -243923, -245449, -246976, -248503, -250030,
+ -251557, -253085, -254614, -256142, -257671, -259200, -260729, -262259,
+ -263789, -265319, -266849, -268379, -269910, -271440, -272971, -274502,
+ -276033, -277564, -279094, -280625, -282157, -283688, -285218, -286749,
+ -288280, -289811, -291342, -292872, -294403, -295933, -297463, -298993,
+ -300523, -302053, -303582, -305111, -306640, -308169, -309697, -311225,
+ -312752, -314280, -315806, -317333, -318859, -320385, -321910, -323435,
+ -324959, -326483, -328006, -329528, -331051, -332572, -334093, -335614,
+ -337133, -338652, -340171, -341689, -343206, -344722, -346238, -347753,
+ -349267, -350780, -352293, -353804, -355315, -356825, -358334, -359843,
+ -361350, -362856, -364362, -365866, -367370, -368872, -370374, -371874,
+ -373373, -374872, -376369, -377865, -379360, -380853, -382346, -383837,
+ -385327, -386816, -388304, -389790, -391275, -392759, -394242, -395723,
+ -397203, -398681, -400158, -401633, -403107, -404580, -406051, -407521,
+ -408989, -410456, -411921, -413384, -414846, -416306, -417765, -419222,
+ -420677, -422131, -423583, -425033, -426482, -427928, -429373, -430816,
+ -432258, -433697, -435135, -436570, -438004, -439436, -440866, -442294,
+ -443720, -445144, -446566, -447986, -449404, -450820, -452234, -453645,
+ -455055, -456462, -457867, -459270, -460671, -462069, -463466, -464860,
+ -466251, -467641, -469028, -470413, -471795, -473175, -474553, -475928,
+ -477300, -478671, -480038, -481404, -482766, -484127, -485484, -486839,
+ -488192, -489542, -490889, -492233, -493575, -494914, -496251, -497584,
+ -498915, -500243, -501569, -502891, -504211, -505528, -506842, -508153,
+ -509461, -510766, -512068, -513367, -514664, -515957, -517247, -518534,
+ -519818, -521099, -522377, -523652, -524924, -526192, -527457, -528719,
+ -529978, -531234, -532486, -533735, -534980, -536223, -537462, -538697,
+ -539930, -541158, -542384, -543606, -544824, -546039, -547251, -548459,
+ -549663, -550864, -552061, -553255, -554445, -555631, -556814, -557993,
+ -559169, -560340, -561508, -562672, -563833, -564989, -566142, -567291,
+ -568436, -569577, -570714, -571848, -572977, -574102, -575224, -576341,
+ -577455, -578564, -579670, -580771, -581868, -582961, -584050, -585135,
+ -586216, -587293, -588365, -589433, -590497, -591556, -592612, -593663,
+ -594709, -595752, -596790, -597823, -598852, -599877, -600898, -601913,
+ -602925, -603932, -604934, -605932, -606926, -607914, -608899, -609878,
+ -610853, -611823, -612789, -613750, -614706, -615658, -616605, -617547,
+ -618484, -619417, -620344, -621267, -622185, -623099, -624007, -624910,
+ -625809, -626702, -627591, -628474, -629353, -630226, -631095, -631959,
+ -632817, -633670, -634519, -635362, -636200, -637032, -637860, -638682,
+ -639500, -640312, -641118, -641920, -642716, -643507, -644293, -645073,
+ -645848, -646617, -647381, -648140, -648893, -649641, -650383, -651120,
+ -651852, -652578, -653298, -654013, -654722, -655426, -656124, -656816,
+ -657503, -658184, -658859, -659529, -660193, -660851, -661504, -662151,
+ -662792, -663427, -664057, -664680, -665298, -665910, -666516, -667116,
+ -667710, -668299, -668881, -669457, -670028, -670592, -671151, -671703,
+ -672250, -672790, -673324, -673852, -674374, -674890, -675400, -675904,
+ -676401, -676892, -677377, -677856, -678329, -678795, -679255, -679709,
+ -680157, -680598, -681033, -681461, -681883, -682299, -682708, -683111,
+ -683508, -683898, -684282, -684659, -685030, -685394, -685752, -686103,
+ -686447, -686785, -687117, -687442, -687760, -688072, -688377, -688675,
+ -688967, -689252, -689530, -689802, -690067, -690325, -690577, -690821,
+ -691059, -691290, -691515, -691732, -691943, -692146, -692343, -692533,
+ -692717, -692893, -693062, -693225, -693380, -693529, -693670, -693805,
+ -693932, -694053, -694167, -694273, -694373, -694465, -694550, -694628,
+ -694700, -694764, -694820, -694870, -694913, -694948, -694976, -694997,
+ -695011, -695018, -695017, -695010, -694994, -694972, -694942, -694906,
+ -694861, -694810, -694751, -694685, -694611, -694530, -694442, -694346,
+ -694243, -694133, -694015, -693890, -693757, -693617, -693469, -693314,
+ -693151, -692981, -692804, -692619, -692426, -692226, -692018, -691803,
+ -691580, -691349, -691111, -690866, -690613, -690352, -690083, -689807,
+ -689523, -689232, -688933, -688626, -688312, -687990, -687660, -687322,
+ -686977, -686624, -686263, -685895, -685518, -685134, -684742, -684343,
+ -683935, -683520, -683097, -682666, -682228, -681781, -681327, -680864,
+ -680394, -679916, -679430, -678937, -678435, -677926, -677408, -676883,
+ -676349, -675808, -675259, -674702, -674137, -673564, -672983, -672394,
+ -671797, -671192, -670579, -669958, -669329, -668692, -668047, -667394,
+ -666733, -666064, -665386, -664701, -664008, -663307, -662597, -661880,
+ -661154, -660420, -659678, -658929, -658171, -657404, -656630, -655848,
+ -655057, -654259, -653452, -652637, -651814, -650983, -650144, -649296,
+ -648440, -647577, -646705, -645824, -644936, -644039, -643135, -642222,
+ -641301, -640371, -639434, -638488, -637534, -636572, -635601, -634623,
+ -633636, -632641, -631637, -630626, -629606, -628578, -627542, -626497,
+ -625445, -624384, -623314, -622237, -621151, -620057, -618955, -617844,
+ -616726, -615599, -614463, -613320, -612168, -611008, -609839, -608663,
+ -607478, -606285, -605083, -603873, -602655, -601429, -600195, -598952,
+ -597701, -596441, -595174, -593898, -592613, -591321, -590020, -588711,
+ -587394, -586068, -584734, -583392, -582042, -580683, -579316, -577941,
+ -576557, -575166, -573766, -572357, -570941, -569516, -568083, -566641,
+ -565192, -563734, -562268, -560794, -559311, -557820, -556321, -554814,
+ -553298, -551775, -550243, -548702, -547154, -545597, -544032, -542459,
+ -540878, -539288, -537691, -536085, -534471, -532848, -531218, -529579,
+ -527932, -526277, -524614, -522943, -521263, -519575, -517879, -516175,
+ -514463, -512743, -511015, -509278, -507533, -505781, -504020, -502251,
+ -500474, -498689, -496895, -495094, -493284, -491467, -489641, -487808,
+ -485966, -484116, -482259, -480393, -478519, -476637, -474747, -472850,
+ -470944, -469030, -467108, -465179, -463241, -461295, -459342, -457380,
+ -455410, -453433, -451448, -449454, -447453, -445444, -443427, -441403,
+ -439370, -437330, -435281, -433225, -431161, -429089, -427010, -424922,
+ -422827, -420724, -418613, -416495, -414368, -412234, -410093, -407943,
+ -405786, -403621, -401449, -399268, -397081, -394885, -392682, -390471,
+ -388253, -386027, -383793, -381552, -379303, -377047, -374783, -372511,
+ -370232, -367946, -365652, -363350, -361041, -358725, -356401, -354070,
+ -351731, -349385, -347032, -344671, -342302, -339927, -337544, -335153,
+ -332756, -330351, -327939, -325519, -323092, -320658, -318217, -315768,
+ -313313, -310850, -308380, -305903, -303418, -300927, -298428, -295922,
+ -293410, -290890, -288363, -285829, -283288, -280740, -278185, -275623,
+ -273054, -270478, -267895, -265306, -262709, -260106, -257495, -254878,
+ -252254, -249623, -246986, -244341, -241690, -239032, -236368, -233696,
+ -231018, -228333, -225642, -222944, -220240, -217528, -214811, -212086,
+ -209355, -206618, -203874, -201124, -198367, -195604, -192834, -190058,
+ -187275, -184486, -181691, -178889, -176081, -173267, -170447, -167620,
+ -164787, -161948, -159102, -156251, -153393, -150529, -147659, -144783,
+ -141901, -139013, -136119, -133219, -130312, -127400, -124482, -121558,
+ -118628, -115692, -112751, -109803, -106850, -103891, -100926, -97955,
+ -94979, -91997, -89009, -86016, -83017, -80012, -77002, -73986, -70965,
+ -67938, -64906, -61868, -58825, -55776, -52722, -49662, -46598, -43527,
+ -40452, -37371, -34285, -31194, -28098, -24996, -21889, -18777, -15660,
+ -12538, -9411, -6279, -3142, 0, 3147, 6299, 9456, 12618, 15784, 18956,
+ 22132, 25313, 28499, 31690, 34885, 38085, 41290, 44499, 47713, 50931,
+ 54154, 57382, 60614, 63850, 67091, 70336, 73586, 76840, 80098, 83361,
+ 86628, 89899, 93174, 96454, 99738, 103026, 106317, 109613, 112913,
+ 116218, 119526, 122838, 126153, 129473, 132797, 136125, 139456, 142791,
+ 146130, 149473, 152819, 156169, 159522, 162880, 166241, 169605, 172973,
+ 176344, 179719, 183097, 186479, 189864, 193252, 196644, 200039, 203437,
+ 206839, 210243, 213651, 217062, 220476, 223893, 227313, 230736, 234162,
+ 237591, 241023, 244457, 247895, 251335, 254779, 258224, 261673, 265124,
+ 268578, 272035, 275494, 278956, 282420, 285887, 289356, 292828, 296302,
+ 299778, 303257, 306738, 310221, 313706, 317194, 320684, 324176, 327670,
+ 331166, 334664, 338164, 341666, 345170, 348676, 352184, 355693, 359205,
+ 362718, 366233, 369749, 373268, 376787, 380309, 383832, 387356, 390882,
+ 394410, 397938, 401469, 405000, 408533, 412067, 415602, 419139, 422677,
+ 426216, 429755, 433296, 436839, 440382, 443926, 447470, 451016, 454563,
+ 458110, 461659, 465208, 468757, 472308, 475859, 479410, 482962, 486515,
+ 490068, 493622, 497176, 500730, 504285, 507840, 511395, 514951, 518507,
+ 522062, 525618, 529175, 532731, 536287, 539843, 543399, 546955, 550511,
+ 554067, 557622, 561177, 564732, 568287, 571841, 575395, 578948, 582501,
+ 586054, 589605, 593157, 596707, 600257, 603807, 607355, 610903, 614450,
+ 617996, 621541, 625085, 628629, 632171, 635712, 639252, 642791, 646329,
+ 649866, 653401, 656936, 660468, 664000, 667530, 671059, 674586, 678111,
+ 681636, 685158, 688679, 692198, 695716, 699232, 702746, 706258, 709768,
+ 713276, 716783, 720287, 723790, 727290, 730789, 734285, 737779, 741271,
+ 744760, 748247, 751732, 755215, 758695, 762172, 765648, 769120, 772590,
+ 776058, 779522, 782984, 786444, 789900, 793354, 796805, 800253, 803698,
+ 807140, 810579, 814015, 817448, 820878, 824304, 827728, 831148, 834565,
+ 837978, 841388, 844795, 848198, 851598, 854994, 858387, 861776, 865161,
+ 868543, 871921, 875295, 878665, 882031, 885394, 888752, 892107, 895458,
+ 898804, 902146, 905485, 908819, 912148, 915474, 918795, 922112, 925425,
+ 928733, 932036, 935335, 938630, 941920, 945205, 948485, 951761, 955032,
+ 958299, 961560, 964816, 968068, 971315, 974556, 977793, 981025, 984251,
+ 987472, 990688, 993899, 997104, 1000304, 1003499, 1006689, 1009872,
+ 1013051, 1016224, 1019391, 1022552, 1025708, 1028859, 1032003, 1035142,
+ 1038275, 1041402, 1044523, 1047638, 1050747, 1053851, 1056948, 1060039,
+ 1063123, 1066202, 1069274, 1072341, 1075400, 1078454, 1081501, 1084541,
+ 1087576, 1090603, 1093624, 1096639, 1099646, 1102647, 1105642, 1108629,
+ 1111610, 1114584, 1117551, 1120511, 1123465, 1126411, 1129350, 1132282,
+ 1135207, 1138125, 1141035, 1143938, 1146834, 1149723, 1152604, 1155478,
+ 1158344, 1161203, 1164055, 1166898, 1169735, 1172563, 1175384, 1178197,
+ 1181002, 1183800, 1186589, 1189371, 1192145, 1194910, 1197668, 1200418,
+ 1203159, 1205893, 1208618, 1211335, 1214044, 1216745, 1219437, 1222121,
+ 1224796, 1227463, 1230121, 1232771, 1235412, 1238045, 1240669, 1243284,
+ 1245891, 1248489, 1251078, 1253658, 1256229, 1258792, 1261345, 1263889,
+ 1266425, 1268951, 1271468, 1273976, 1276475, 1278964, 1281444, 1283915,
+ 1286377, 1288829, 1291271, 1293704, 1296128, 1298542, 1300947, 1303342,
+ 1305727, 1308102, 1310468, 1312824, 1315170, 1317506, 1319833, 1322149,
+ 1324456, 1326752, 1329038, 1331315, 1333581, 1335837, 1338083, 1340318,
+ 1342544, 1344758, 1346963, 1349157, 1351341, 1353514, 1355677, 1357829,
+ 1359971, 1362102, 1364223, 1366332, 1368431, 1370520, 1372597, 1374664,
+ 1376719, 1378764, 1380798, 1382821, 1384833, 1386834, 1388823, 1390802,
+ 1392770, 1394726, 1396671, 1398604, 1400527, 1402438, 1404338, 1406226,
+ 1408103, 1409968, 1411822, 1413664, 1415495, 1417314, 1419121, 1420917,
+ 1422701, 1424473, 1426233, 1427982, 1429719, 1431443, 1433156, 1434857,
+ 1436546, 1438223, 1439887, 1441540, 1443180, 1444809, 1446425, 1448028,
+ 1449620, 1451199, 1452766, 1454320, 1455862, 1457392, 1458909, 1460414,
+ 1461906, 1463385, 1464852, 1466306, 1467748, 1469177, 1470593, 1471996,
+ 1473386, 1474764, 1476129, 1477480, 1478819, 1480145, 1481458, 1482758,
+ 1484045, 1485319, 1486579, 1487827, 1489061, 1490282, 1491490, 1492684,
+ 1493865, 1495033, 1496187, 1497328, 1498456, 1499570, 1500671, 1501758,
+ 1502831, 1503891, 1504938, 1505970, 1506989, 1507995, 1508986, 1509964,
+ 1510928, 1511878, 1512814, 1513737, 1514645, 1515540, 1516420, 1517287,
+ 1518139, 1518978, 1519802, 1520613, 1521409, 1522191, 1522959, 1523712,
+ 1524451, 1525177, 1525887, 1526584, 1527266, 1527933, 1528587, 1529225,
+ 1529850, 1530460, 1531055, 1531636, 1532202, 1532754, 1533291, 1533813,
+ 1534321, 1534814, 1535292, 1535755, 1536204, 1536638, 1537057, 1537461,
+ 1537851, 1538225, 1538585, 1538929, 1539259, 1539574, 1539873, 1540158,
+ 1540427, 1540682, 1540921, 1541145, 1541354, 1541548, 1541726, 1541890,
+ 1542038, 1542171, 1542288, 1542390, 1542477, 1542549, 1542605, 1542646,
+ 1542671, 1542681, 1542675, 1542654, 1542617, 1542565, 1542497, 1542414,
+ 1542315, 1542200, 1542070, 1541924, 1541763, 1541586, 1541393, 1541184,
+ 1540959, 1540719, 1540463, 1540191, 1539904, 1539600, 1539281, 1538945,
+ 1538594, 1538227, 1537844, 1537445, 1537030, 1536599, 1536152, 1535689,
+ 1535209, 1534714, 1534203, 1533676, 1533132, 1532572, 1531997, 1531405,
+ 1530796, 1530172, 1529531, 1528875, 1528202, 1527512, 1526807, 1526085,
+ 1525347, 1524592, 1523821, 1523034, 1522230, 1521411, 1520574, 1519721,
+ 1518852, 1517967, 1517065, 1516146, 1515211, 1514260, 1513292, 1512307,
+ 1511306, 1510289, 1509255, 1508204, 1507137, 1506053, 1504953, 1503836,
+ 1502702, 1501552, 1500385, 1499201, 1498001, 1496784, 1495551, 1494300,
+ 1493033, 1491750, 1490449, 1489132, 1487798, 1486448, 1485080, 1483696,
+ 1482295, 1480878, 1479443, 1477992, 1476524, 1475039, 1473537, 1472019,
+ 1470483, 1468931, 1467362, 1465776, 1464173, 1462554, 1460917, 1459264,
+ 1457593, 1455906, 1454202, 1452481, 1450743, 1448988, 1447217, 1445428,
+ 1443622, 1441800, 1439960, 1438104, 1436230, 1434340, 1432433, 1430508,
+ 1428567, 1426609, 1424634, 1422642, 1420633, 1418607, 1416564, 1414504,
+ 1412427, 1410333, 1408222, 1406094, 1403949, 1401787, 1399608, 1397412,
+ 1395199, 1392969, 1390722, 1388459, 1386178, 1383880, 1381565, 1379233,
+ 1376884, 1374519, 1372136, 1369736, 1367320, 1364886, 1362435, 1359968,
+ 1357483, 1354981, 1352463, 1349927, 1347375, 1344805, 1342219, 1339616,
+ 1336995, 1334358, 1331704, 1329033, 1326345, 1323640, 1320918, 1318179,
+ 1315424, 1312651, 1309862, 1307055, 1304232, 1301392, 1298535, 1295661,
+ 1292770, 1289863, 1286938, 1283997, 1281039, 1278064, 1275073, 1272064,
+ 1269039, 1265997, 1262938, 1259862, 1256770, 1253661, 1250535, 1247392,
+ 1244233, 1241057, 1237864, 1234654, 1231428, 1228185, 1224926, 1221650,
+ 1218357, 1215047, 1211721, 1208379, 1205020, 1201644, 1198251, 1194842,
+ 1191417, 1187975, 1184516, 1181041, 1177550, 1174042, 1170517, 1166977,
+ 1163419, 1159845, 1156255, 1152649, 1149026, 1145387, 1141731, 1138059,
+ 1134371, 1130666, 1126945, 1123208, 1119455, 1115685, 1111900, 1108098,
+ 1104279, 1100445, 1096595, 1092728, 1088845, 1084947, 1081032, 1077101,
+ 1073154, 1069191, 1065212, 1061217, 1057206, 1053179, 1049136, 1045078,
+ 1041003, 1036913, 1032807, 1028685, 1024547, 1020393, 1016224, 1012039,
+ 1007838, 1003622, 999389, 995142, 990878, 986599, 982305, 977995,
+ 973669, 969328, 964971, 960599, 956212, 951809, 947391, 942957, 938508,
+ 934044, 929564, 925069, 920559, 916034, 911494, 906938, 902368, 897782,
+ 893181, 888565, 883934, 879288, 874627, 869952, 865261, 860555, 855835,
+ 851100, 846350, 841585, 836806, 832011, 827202, 822379, 817541, 812688,
+ 807821, 802939, 798043, 793132, 788207, 783267, 778313, 773345, 768362,
+ 763365, 758354, 753329, 748289, 743236, 738168, 733086, 727990, 722880,
+ 717756, 712618, 707467, 702301, 697122, 691928, 686721, 681501, 676266,
+ 671018, 665756, 660481, 655192, 649890, 644574, 639244, 633902, 628545,
+ 623176, 617793, 612397, 606988, 601565, 596130, 590681, 585219, 579744,
+ 574257, 568756, 563242, 557715, 552176, 546624, 541059, 535481, 529891,
+ 524288, 518672, 513044, 507403, 501750, 496084, 490406, 484716, 479013,
+ 473298, 467571, 461832, 456080, 450317, 444541, 438753, 432954, 427142,
+ 421318, 415483, 409636, 403777, 397907, 392024, 386131, 380225, 374308,
+ 368380, 362440, 356489, 350526, 344552, 338567, 332571, 326563, 320544,
+ 314515, 308474, 302422, 296360, 290286, 284202, 278107, 272001, 265884,
+ 259757, 253619, 247471, 241312, 235143, 228963, 222773, 216573, 210362,
+ 204141, 197911, 191670, 185419, 179157, 172886, 166606, 160315, 154014,
+ 147704, 141384, 135054, 128715, 122367, 116008, 109641, 103264, 96877,
+ 90482, 84077, 77663, 71240, 64808, 58366, 51916, 45457, 38989, 32513,
+ 26027, 19533, 13031, 6519, 0, -6528, -13064, -19609, -26163, -32724,
+ -39294, -45872, -52458, -59052, -65654, -72263, -78881, -85507, -92140,
+ -98781, -105429, -112085, -118748, -125419, -132098, -138783, -145476,
+ -152176, -158884, -165598, -172319, -179048, -185783, -192525, -199274,
+ -206030, -212792, -219561, -226337, -233119, -239907, -246702, -253503,
+ -260310, -267124, -273944, -280770, -287601, -294439, -301283, -308132,
+ -314987, -321848, -328715, -335587, -342464, -349347, -356236, -363130,
+ -370029, -376933, -383842, -390757, -397676, -404600, -411530, -418464,
+ -425403, -432346, -439294, -446247, -453204, -460166, -467132, -474102,
+ -481076, -488055, -495038, -502024, -509015, -516010, -523008, -530011,
+ -537017, -544026, -551040, -558056, -565076, -572100, -579127, -586157,
+ -593190, -600227, -607266, -614308, -621354, -628402, -635453, -642506,
+ -649563, -656621, -663683, -670746, -677813, -684881, -691952, -699024,
+ -706099, -713176, -720255, -727336, -734418, -741502, -748588, -755676,
+ -762765, -769856, -776947, -784041, -791135, -798231, -805328, -812426,
+ -819524, -826624, -833725, -840826, -847928, -855031, -862134, -869237,
+ -876341, -883446, -890550, -897655, -904760, -911865, -918970, -926075,
+ -933180, -940284, -947389, -954492, -961596, -968698, -975801, -982902,
+ -990003, -997103, -1004202, -1011300, -1018397, -1025493, -1032588,
+ -1039681, -1046774, -1053864, -1060954, -1068042, -1075128, -1082212,
+ -1089295, -1096376, -1103455, -1110531, -1117606, -1124679, -1131750,
+ -1138818, -1145884, -1152947, -1160008, -1167066, -1174122, -1181175,
+ -1188225, -1195272, -1202317, -1209358, -1216396, -1223431, -1230463,
+ -1237491, -1244516, -1251537, -1258555, -1265570, -1272580, -1279587,
+ -1286590, -1293589, -1300584, -1307575, -1314562, -1321544, -1328522,
+ -1335496, -1342465, -1349430, -1356390, -1363346, -1370297, -1377243,
+ -1384183, -1391119, -1398050, -1404976, -1411897, -1418812, -1425722,
+ -1432626, -1439525, -1446418, -1453306, -1460187, -1467063, -1473933,
+ -1480797, -1487655, -1494507, -1501353, -1508192, -1515025, -1521852,
+ -1528672, -1535485, -1542292, -1549092, -1555885, -1562671, -1569450,
+ -1576222, -1582987, -1589745, -1596496, -1603239, -1609974, -1616703,
+ -1623423, -1630136, -1636841, -1643538, -1650228, -1656909, -1663582,
+ -1670247, -1676904, -1683553, -1690193, -1696825, -1703448, -1710063,
+ -1716669, -1723266, -1729854, -1736434, -1743004, -1749565, -1756118,
+ -1762661, -1769194, -1775719, -1782233, -1788739, -1795234, -1801720,
+ -1808197, -1814663, -1821119, -1827566, -1834002, -1840429, -1846845,
+ -1853250, -1859646, -1866030, -1872405, -1878768, -1885121, -1891464,
+ -1897795, -1904115, -1910425, -1916723, -1923010, -1929286, -1935551,
+ -1941804, -1948046, -1954276, -1960495, -1966702, -1972897, -1979081,
+ -1985252, -1991411, -1997559, -2003694, -2009817, -2015927, -2022026,
+ -2028111, -2034185, -2040245, -2046293, -2052328, -2058351, -2064360,
+ -2070357, -2076340, -2082310, -2088267, -2094211, -2100141, -2106058,
+ -2111961, -2117851, -2123727, -2129589, -2135438, -2141272, -2147093,
+ -2152899, -2158692, -2164470, -2170234, -2175983, -2181718, -2187439,
+ -2193145, -2198836, -2204512, -2210174, -2215821, -2221453, -2227070,
+ -2232671, -2238258, -2243829, -2249385, -2254926, -2260451, -2265960,
+ -2271454, -2276932, -2282395, -2287841, -2293272, -2298686, -2304085,
+ -2309467, -2314833, -2320183, -2325517, -2330834, -2336134, -2341418,
+ -2346685, -2351936, -2357169, -2362386, -2367586, -2372769, -2377934,
+ -2383083, -2388214, -2393328, -2398425, -2403504, -2408565, -2413609,
+ -2418635, -2423644, -2428635, -2433607, -2438562, -2443499, -2448417,
+ -2453318, -2458200, -2463064, -2467909, -2472736, -2477545, -2482335,
+ -2487106, -2491858, -2496592, -2501307, -2506002, -2510679, -2515337,
+ -2519975, -2524594, -2529194, -2533775, -2538336, -2542877, -2547399,
+ -2551902, -2556384, -2560847, -2565290, -2569713, -2574116, -2578499,
+ -2582861, -2587204, -2591526, -2595828, -2600110, -2604371, -2608611,
+ -2612831, -2617030, -2621209, -2625366, -2629503, -2633619, -2637714,
+ -2641787, -2645840, -2649871, -2653881, -2657870, -2661838, -2665783,
+ -2669708, -2673610, -2677492, -2681351, -2685188, -2689004, -2692798,
+ -2696570, -2700319, -2704047, -2707752, -2711435, -2715096, -2718734,
+ -2722350, -2725944, -2729515, -2733063, -2736589, -2740092, -2743572,
+ -2747029, -2750463, -2753874, -2757262, -2760627, -2763969, -2767288,
+ -2770583, -2773855, -2777103, -2780328, -2783530, -2786708, -2789862,
+ -2792992, -2796099, -2799181, -2802240, -2805275, -2808286, -2811273,
+ -2814235, -2817174, -2820088, -2822978, -2825843, -2828684, -2831501,
+ -2834293, -2837060, -2839803, -2842521, -2845214, -2847882, -2850525,
+ -2853144, -2855737, -2858306, -2860849, -2863367, -2865860, -2868328,
+ -2870770, -2873187, -2875578, -2877944, -2880285, -2882599, -2884889,
+ -2887152, -2889390, -2891601, -2893787, -2895947, -2898081, -2900189,
+ -2902271, -2904327, -2906356, -2908360, -2910337, -2912288, -2914212,
+ -2916110, -2917981, -2919826, -2921644, -2923436, -2925201, -2926939,
+ -2928650, -2930335, -2931992, -2933623, -2935227, -2936803, -2938353,
+ -2939875, -2941371, -2942839, -2944280, -2945693, -2947079, -2948438,
+ -2949769, -2951073, -2952349, -2953598, -2954819, -2956012, -2957177,
+ -2958315, -2959425, -2960507, -2961562, -2962588, -2963586, -2964556,
+ -2965499, -2966413, -2967298, -2968156, -2968986, -2969787, -2970560,
+ -2971304, -2972020, -2972708, -2973367, -2973997, -2974599, -2975173,
+ -2975717, -2976234, -2976721, -2977179, -2977609, -2978010, -2978382,
+ -2978725, -2979039, -2979325, -2979581, -2979808, -2980006, -2980175,
+ -2980314, -2980425, -2980506, -2980558, -2980580, -2980574, -2980537,
+ -2980472, -2980377, -2980252, -2980098, -2979915, -2979702, -2979459,
+ -2979186, -2978884, -2978552, -2978191, -2977799, -2977378, -2976927,
+ -2976446, -2975936, -2975395, -2974824, -2974224, -2973593, -2972932,
+ -2972241, -2971520, -2970769, -2969988, -2969177, -2968335, -2967463,
+ -2966561, -2965629, -2964666, -2963673, -2962650, -2961596, -2960511,
+ -2959397, -2958252, -2957076, -2955870, -2954633, -2953366, -2952068,
+ -2950739, -2949380, -2947990, -2946570, -2945119, -2943637, -2942124,
+ -2940581, -2939007, -2937402, -2935766, -2934099, -2932402, -2930673,
+ -2928914, -2927124, -2925303, -2923451, -2921567, -2919653, -2917708,
+ -2915732, -2913725, -2911687, -2909618, -2907517, -2905386, -2903223,
+ -2901030, -2898805, -2896549, -2894262, -2891944, -2889594, -2887213,
+ -2884801, -2882358, -2879884, -2877378, -2874841, -2872273, -2869673,
+ -2867042, -2864380, -2861687, -2858962, -2856206, -2853418, -2850599,
+ -2847749, -2844868, -2841955, -2839010, -2836034, -2833027, -2829989,
+ -2826919, -2823817, -2820684, -2817520, -2814325, -2811097, -2807839,
+ -2804549, -2801227, -2797874, -2794490, -2791074, -2787627, -2784148,
+ -2780638, -2777096, -2773523, -2769918, -2766282, -2762615, -2758916,
+ -2755185, -2751423, -2747630, -2743805, -2739949, -2736061, -2732142,
+ -2728191, -2724209, -2720195, -2716150, -2712073, -2707966, -2703826,
+ -2699655, -2695453, -2691220, -2686954, -2682658, -2678330, -2673971,
+ -2669580, -2665158, -2660705, -2656220, -2651704, -2647157, -2642578,
+ -2637968, -2633327, -2628654, -2623951, -2619215, -2614449, -2609651,
+ -2604822, -2599962, -2595071, -2590148, -2585194, -2580209, -2575193,
+ -2570146, -2565068, -2559958, -2554818, -2549646, -2544443, -2539209,
+ -2533944, -2528648, -2523322, -2517964, -2512575, -2507155, -2501704,
+ -2496223, -2490710, -2485167, -2479593, -2473987, -2468352, -2462685,
+ -2456987, -2451259, -2445500, -2439711, -2433890, -2428039, -2422158,
+ -2416245, -2410303, -2404329, -2398325, -2392291, -2386226, -2380130,
+ -2374005, -2367848, -2361662, -2355445, -2349197, -2342920, -2336612,
+ -2330274, -2323906, -2317507, -2311078, -2304619, -2298131, -2291612,
+ -2285063, -2278484, -2271875, -2265236, -2258567, -2251868, -2245139,
+ -2238381, -2231593, -2224775, -2217927, -2211050, -2204143, -2197207,
+ -2190241, -2183245, -2176220, -2169165, -2162081, -2154968, -2147825,
+ -2140653, -2133451, -2126221, -2118961, -2111672, -2104354, -2097007,
+ -2089631, -2082226, -2074791, -2067328, -2059836, -2052316, -2044766,
+ -2037188, -2029581, -2021945, -2014281, -2006588, -1998867, -1991117,
+ -1983339, -1975532, -1967697, -1959834, -1951942, -1944022, -1936074,
+ -1928098, -1920094, -1912062, -1904002, -1895914, -1887798, -1879654,
+ -1871482, -1863283, -1855056, -1846802, -1838519, -1830210, -1821873,
+ -1813508, -1805116, -1796697, -1788251, -1779777, -1771276, -1762748,
+ -1754193, -1745611, -1737002, -1728367, -1719704, -1711015, -1702298,
+ -1693556, -1684786, -1675991, -1667168, -1658320, -1649444, -1640543,
+ -1631615, -1622661, -1613681, -1604675, -1595643, -1586585, -1577501,
+ -1568392, -1559256, -1550095, -1540908, -1531696, -1522458, -1513194,
+ -1503906, -1494592, -1485252, -1475888, -1466498, -1457083, -1447644,
+ -1438179, -1428690, -1419175, -1409636, -1400072, -1390484, -1380871,
+ -1371234, -1361572, -1351886, -1342176, -1332442, -1322683, -1312900,
+ -1303094, -1293263, -1283409, -1273531, -1263629, -1253704, -1243755,
+ -1233783, -1223787, -1213768, -1203725, -1193660, -1183571, -1173459,
+ -1163325, -1153167, -1142987, -1132784, -1122558, -1112310, -1102039,
+ -1091746, -1081430, -1071092, -1060732, -1050350, -1039946, -1029520,
+ -1019072, -1008602, -998111, -987597, -977063, -966507, -955929,
+ -945330, -934710, -924069, -913407, -902723, -892019, -881294, -870548,
+ -859782, -848995, -838188, -827360, -816512, -805643, -794755, -783846,
+ -772918, -761969, -751001, -740013, -729006, -717979, -706932, -695866,
+ -684781, -673677, -662553, -651411, -640250, -629069, -617871, -606653,
+ -595417, -584163, -572890, -561599, -550289, -538962, -527616, -516253,
+ -504872, -493473, -482057, -470623, -459171, -447702, -436216, -424713,
+ -413193, -401656, -390102, -378531, -366943, -355339, -343719, -332082,
+ -320428, -308759, -297073, -285372, -273655, -261921, -250173, -238408,
+ -226628, -214833, -203022, -191196, -179355, -167499, -155629, -143743,
+ -131843, -119928, -107998, -96055, -84097, -72124, -60138, -48138,
+ -36124, -24096, -12055, 0, 12068, 24150, 36245, 48353, 60474, 72608,
+ 84755, 96915, 109087, 121272, 133469, 145679, 157900, 170134, 182379,
+ 194637, 206906, 219187, 231479, 243783, 256098, 268424, 280761, 293110,
+ 305469, 317838, 330219, 342610, 355011, 367423, 379845, 392277, 404719,
+ 417171, 429632, 442103, 454584, 467074, 479573, 492082, 504599, 517126,
+ 529661, 542205, 554758, 567319, 579888, 592466, 605052, 617646, 630248,
+ 642857, 655475, 668099, 680732, 693371, 706018, 718672, 731332, 744000,
+ 756674, 769355, 782043, 794737, 807437, 820143, 832855, 845573, 858297,
+ 871027, 883762, 896502, 909248, 921999, 934755, 947516, 960282, 973052,
+ 985827, 998607, 1011391, 1024179, 1036971, 1049767, 1062567, 1075370,
+ 1088177, 1100988, 1113802, 1126619, 1139439, 1152262, 1165088, 1177917,
+ 1190749, 1203583, 1216419, 1229257, 1242098, 1254940, 1267784, 1280631,
+ 1293478, 1306327, 1319178, 1332029, 1344882, 1357736, 1370591, 1383446,
+ 1396302, 1409158, 1422015, 1434872, 1447729, 1460586, 1473442, 1486299,
+ 1499155, 1512010, 1524865, 1537719, 1550572, 1563424, 1576274, 1589124,
+ 1601971, 1614818, 1627662, 1640505, 1653346, 1666184, 1679021, 1691855,
+ 1704686, 1717515, 1730341, 1743165, 1755985, 1768802, 1781616, 1794426,
+ 1807233, 1820036, 1832836, 1845631, 1858422, 1871210, 1883993, 1896771,
+ 1909545, 1922314, 1935078, 1947837, 1960591, 1973340, 1986084, 1998822,
+ 2011554, 2024281, 2037001, 2049716, 2062424, 2075126, 2087822, 2100511,
+ 2113194, 2125869, 2138538, 2151199, 2163853, 2176500, 2189140, 2201771,
+ 2214395, 2227011, 2239619, 2252219, 2264811, 2277394, 2289968, 2302534,
+ 2315091, 2327639, 2340177, 2352707, 2365227, 2377738, 2390239, 2402730,
+ 2415212, 2427683, 2440144, 2452595, 2465035, 2477465, 2489884, 2502292,
+ 2514689, 2527075, 2539450, 2551813, 2564165, 2576505, 2588834, 2601150,
+ 2613454, 2625746, 2638026, 2650294, 2662548, 2674790, 2687019, 2699235,
+ 2711438, 2723628, 2735804, 2747967, 2760116, 2772251, 2784372, 2796479,
+ 2808572, 2820650, 2832714, 2844763, 2856798, 2868818, 2880822, 2892812,
+ 2904786, 2916744, 2928687, 2940615, 2952526, 2964422, 2976301, 2988164,
+ 3000011, 3011841, 3023655, 3035451, 3047231, 3058994, 3070739, 3082467,
+ 3094178, 3105871, 3117547, 3129204, 3140843, 3152465, 3164068, 3175652,
+ 3187219, 3198766, 3210294, 3221804, 3233295, 3244766, 3256218, 3267650,
+ 3279063, 3290456, 3301829, 3313183, 3324516, 3335828, 3347121, 3358392,
+ 3369643, 3380874, 3392083, 3403271, 3414438, 3425584, 3436708, 3447810,
+ 3458891, 3469950, 3480986, 3492001, 3502993, 3513963, 3524911, 3535835,
+ 3546737, 3557616, 3568472, 3579304, 3590114, 3600899, 3611661, 3622400,
+ 3633114, 3643805, 3654471, 3665113, 3675731, 3686324, 3696893, 3707436,
+ 3717955, 3728449, 3738918, 3749361, 3759779, 3770171, 3780537, 3790878,
+ 3801193, 3811481, 3821744, 3831980, 3842189, 3852372, 3862528, 3872658,
+ 3882760, 3892835, 3902883, 3912904, 3922897, 3932862, 3942800, 3952710,
+ 3962591, 3972445, 3982270, 3992067, 4001835, 4011575, 4021286, 4030968,
+ 4040621, 4050245, 4059839, 4069404, 4078940, 4088445, 4097922, 4107368,
+ 4116784, 4126170, 4135525, 4144850, 4154145, 4163409, 4172642, 4181845,
+ 4191016, 4200156, 4209265, 4218342, 4227388, 4236402, 4245385, 4254335,
+ 4263254, 4272140, 4280994, 4289816, 4298605, 4307361, 4316085, 4324776,
+ 4333434, 4342059, 4350650, 4359209, 4367733, 4376225, 4384682, 4393106,
+ 4401495, 4409851, 4418172, 4426459, 4434712, 4442930, 4451114, 4459262,
+ 4467376, 4475455, 4483499, 4491507, 4499480, 4507418, 4515320, 4523186,
+ 4531016, 4538811, 4546569, 4554292, 4561978, 4569627, 4577240, 4584817,
+ 4592356, 4599859, 4607325, 4614754, 4622146, 4629500, 4636817, 4644097,
+ 4651338, 4658542, 4665709, 4672837, 4679927, 4686979, 4693992, 4700968,
+ 4707904, 4714802, 4721662, 4728482, 4735264, 4742006, 4748710, 4755374,
+ 4761999, 4768584, 4775129, 4781635, 4788101, 4794528, 4800914, 4807260,
+ 4813566, 4819831, 4826056, 4832241, 4838385, 4844488, 4850550, 4856571,
+ 4862552, 4868491, 4874389, 4880245, 4886060, 4891834, 4897565, 4903255,
+ 4908904, 4914510, 4920074, 4925596, 4931076, 4936513, 4941908, 4947261,
+ 4952570, 4957837, 4963062, 4968243, 4973381, 4978476, 4983528, 4988537,
+ 4993502, 4998423, 5003301, 5008136, 5012926, 5017673, 5022375, 5027034,
+ 5031649, 5036219, 5040745, 5045226, 5049663, 5054055, 5058403, 5062706,
+ 5066963, 5071176, 5075344, 5079467, 5083544, 5087577, 5091563, 5095505,
+ 5099400, 5103250, 5107055, 5110813, 5114526, 5118192, 5121812, 5125387,
+ 5128915, 5132396, 5135831, 5139220, 5142562, 5145858, 5149106, 5152308,
+ 5155463, 5158571, 5161632, 5164646, 5167612, 5170532, 5173403, 5176228,
+ 5179005, 5181734, 5184415, 5187049, 5189635, 5192173, 5194663, 5197105,
+ 5199499, 5201845, 5204142, 5206391, 5208591, 5210743, 5212847, 5214902,
+ 5216908, 5218865, 5220773, 5222633, 5224443, 5226205, 5227917, 5229580,
+ 5231194, 5232759, 5234274, 5235740, 5237156, 5238522, 5239839, 5241106,
+ 5242324, 5243491, 5244609, 5245676, 5246694, 5247661, 5248579, 5249446,
+ 5250263, 5251029, 5251745, 5252411, 5253026, 5253590, 5254104, 5254567,
+ 5254980, 5255341, 5255652, 5255912, 5256121, 5256279, 5256385, 5256441,
+ 5256445, 5256398, 5256300, 5256151, 5255950, 5255698, 5255394, 5255039,
+ 5254632, 5254173, 5253663, 5253101, 5252487, 5251821, 5251104, 5250334,
+ 5249513, 5248639, 5247714, 5246736, 5245706, 5244624, 5243490, 5242303,
+ 5241064, 5239773, 5238430, 5237033, 5235585, 5234084, 5232530, 5230924,
+ 5229265, 5227553, 5225789, 5223972, 5222102, 5220179, 5218204, 5216175,
+ 5214094, 5211959, 5209772, 5207532, 5205238, 5202892, 5200492, 5198039,
+ 5195533, 5192974, 5190361, 5187695, 5184976, 5182204, 5179378, 5176499,
+ 5173567, 5170581, 5167541, 5164448, 5161302, 5158102, 5154848, 5151541,
+ 5148180, 5144766, 5141298, 5137776, 5134201, 5130572, 5126889, 5123152,
+ 5119362, 5115518, 5111620, 5107668, 5103663, 5099604, 5095490, 5091323,
+ 5087102, 5082827, 5078499, 5074116, 5069679, 5065189, 5060644, 5056046,
+ 5051393, 5046687, 5041926, 5037112, 5032243, 5027321, 5022344, 5017313,
+ 5012229, 5007090, 5001897, 4996651, 4991350, 4985995, 4980586, 4975123,
+ 4969606, 4964035, 4958410, 4952730, 4946997, 4941210, 4935368, 4929473,
+ 4923523, 4917520, 4911462, 4905351, 4899185, 4892965, 4886691, 4880364,
+ 4873982, 4867546, 4861056, 4854513, 4847915, 4841263, 4834558, 4827798,
+ 4820985, 4814117, 4807196, 4800221, 4793192, 4786109, 4778972, 4771782,
+ 4764537, 4757239, 4749887, 4742482, 4735022, 4727509, 4719942, 4712322,
+ 4704647, 4696919, 4689138, 4681303, 4673414, 4665472, 4657476, 4649427,
+ 4641324, 4633168, 4624959, 4616696, 4608380, 4600010, 4591587, 4583111,
+ 4574581, 4565998, 4557362, 4548673, 4539931, 4531136, 4522287, 4513386,
+ 4504432, 4495424, 4486364, 4477251, 4468085, 4458866, 4449594, 4440270,
+ 4430893, 4421463, 4411981, 4402446, 4392858, 4383218, 4373526, 4363781,
+ 4353984, 4344134, 4334232, 4324278, 4314272, 4304213, 4294103, 4283940,
+ 4273726, 4263459, 4253140, 4242770, 4232348, 4221874, 4211348, 4200771,
+ 4190142, 4179462, 4168730, 4157946, 4147112, 4136226, 4125288, 4114299,
+ 4103260, 4092169, 4081027, 4069834, 4058590, 4047295, 4035950, 4024553,
+ 4013106, 4001608, 3990060, 3978461, 3966812, 3955113, 3943363, 3931563,
+ 3919712, 3907812, 3895861, 3883861, 3871810, 3859710, 3847560, 3835360,
+ 3823111, 3810812, 3798464, 3786066, 3773619, 3761122, 3748576, 3735982,
+ 3723338, 3710645, 3697903, 3685113, 3672273, 3659385, 3646449, 3633463,
+ 3620430, 3607348, 3594218, 3581039, 3567813, 3554538, 3541216, 3527845,
+ 3514427, 3500961, 3487448, 3473887, 3460278, 3446623, 3432919, 3419169,
+ 3405372, 3391527, 3377636, 3363698, 3349713, 3335682, 3321604, 3307479,
+ 3293308, 3279091, 3264828, 3250519, 3236163, 3221762, 3207315, 3192822,
+ 3178284, 3163700, 3149070, 3134396, 3119676, 3104911, 3090101, 3075246,
+ 3060346, 3045402, 3030413, 3015379, 3000301, 2985179, 2970013, 2954802,
+ 2939548, 2924249, 2908907, 2893521, 2878092, 2862619, 2847103, 2831544,
+ 2815941, 2800296, 2784607, 2768876, 2753102, 2737286, 2721427, 2705526,
+ 2689582, 2673597, 2657569, 2641500, 2625389, 2609236, 2593042, 2576806,
+ 2560529, 2544211, 2527852, 2511452, 2495011, 2478530, 2462007, 2445445,
+ 2428842, 2412199, 2395516, 2378793, 2362030, 2345227, 2328385, 2311504,
+ 2294583, 2277622, 2260623, 2243585, 2226508, 2209393, 2192239, 2175046,
+ 2157815, 2140546, 2123239, 2105895, 2088512, 2071092, 2053634, 2036139,
+ 2018607, 2001037, 1983431, 1965788, 1948108, 1930392, 1912639, 1894850,
+ 1877025, 1859164, 1841267, 1823335, 1805366, 1787363, 1769324, 1751250,
+ 1733141, 1714997, 1696819, 1678606, 1660358, 1642077, 1623761, 1605411,
+ 1587027, 1568610, 1550159, 1531675, 1513157, 1494607, 1476023, 1457407,
+ 1438758, 1420077, 1401363, 1382617, 1363839, 1345030, 1326188, 1307315,
+ 1288411, 1269475, 1250508, 1231510, 1212482, 1193422, 1174333, 1155213,
+ 1136063, 1116882, 1097672, 1078433, 1059163, 1039865, 1020537, 1001180,
+ 981794, 962380, 942937, 923466, 903966, 884438, 864883, 845300, 825689,
+ 806050, 786385, 766692, 746973, 727227, 707454, 687655, 667829, 647978,
+ 628100, 608197, 588268, 568314, 548335, 528331, 508301, 488247, 468169,
+ 448066, 427939, 407788, 387614, 367415, 347193, 326948, 306680, 286388,
+ 266074, 245737, 225378, 204997, 184594, 164168, 143721, 123253, 102763,
+ 82252, 61720, 41167, 20593, 0, -20614, -41248, -61902, -82576, -103269,
+ -123982, -144714, -165465, -186234, -207023, -227829, -248654, -269497,
+ -290358, -311236, -332132, -353045, -373976, -394923, -415887, -436868,
+ -457864, -478877, -499906, -520951, -542012, -563087, -584178, -605284,
+ -626405, -647540, -668690, -689854, -711032, -732224, -753430, -774649,
+ -795881, -817127, -838385, -859656, -880939, -902235, -923543, -944863,
+ -966194, -987537, -1008891, -1030256, -1051632, -1073019, -1094417,
+ -1115824, -1137242, -1158670, -1180107, -1201554, -1223010, -1244475,
+ -1265949, -1287432, -1308924, -1330423, -1351931, -1373446, -1394970,
+ -1416500, -1438038, -1459583, -1481135, -1502694, -1524259, -1545830,
+ -1567407, -1588990, -1610579, -1632173, -1653773, -1675377, -1696986,
+ -1718600, -1740218, -1761841, -1783467, -1805097, -1826731, -1848367,
+ -1870008, -1891651, -1913296, -1934945, -1956595, -1978248, -1999902,
+ -2021558, -2043216, -2064875, -2086535, -2108195, -2129857, -2151518,
+ -2173180, -2194842, -2216504, -2238165, -2259826, -2281485, -2303144,
+ -2324801, -2346457, -2368111, -2389763, -2411412, -2433060, -2454705,
+ -2476347, -2497986, -2519622, -2541254, -2562883, -2584508, -2606128,
+ -2627745, -2649357, -2670964, -2692566, -2714163, -2735755, -2757341,
+ -2778921, -2800495, -2822063, -2843624, -2865179, -2886727, -2908267,
+ -2929800, -2951326, -2972844, -2994354, -3015855, -3037349, -3058833,
+ -3080309, -3101775, -3123233, -3144680, -3166118, -3187546, -3208964,
+ -3230371, -3251768, -3273154, -3294528, -3315892, -3337244, -3358584,
+ -3379912, -3401228, -3422532, -3443823, -3465101, -3486366, -3507618,
+ -3528856, -3550081, -3571291, -3592488, -3613670, -3634837, -3655990,
+ -3677127, -3698250, -3719356, -3740447, -3761523, -3782581, -3803624,
+ -3824650, -3845659, -3866651, -3887626, -3908583, -3929523, -3950444,
+ -3971348, -3992233, -4013099, -4033947, -4054775, -4075585, -4096374,
+ -4117144, -4137895, -4158624, -4179334, -4200023, -4220691, -4241338,
+ -4261964, -4282568, -4303151, -4323711, -4344250, -4364766, -4385259,
+ -4405730, -4426177, -4446602, -4467002, -4487379, -4507732, -4528061,
+ -4548366, -4568646, -4588901, -4609131, -4629336, -4649515, -4669668,
+ -4689796, -4709897, -4729972, -4750021, -4770042, -4790037, -4810004,
+ -4829944, -4849856, -4869740, -4889595, -4909423, -4929222, -4948992,
+ -4968733, -4988445, -5008127, -5027779, -5047402, -5066994, -5086557,
+ -5106088, -5125589, -5145058, -5164497, -5183904, -5203279, -5222622,
+ -5241933, -5261212, -5280458, -5299672, -5318852, -5337999, -5357113,
+ -5376193, -5395239, -5414251, -5433229, -5452172, -5471081, -5489954,
+ -5508792, -5527595, -5546362, -5565094, -5583789, -5602448, -5621070,
+ -5639656, -5658205, -5676717, -5695191, -5713627, -5732026, -5750387,
+ -5768710, -5786994, -5805239, -5823446, -5841614, -5859742, -5877830,
+ -5895879, -5913888, -5931857, -5949786, -5967673, -5985520, -6003326,
+ -6021091, -6038814, -6056496, -6074136, -6091733, -6109289, -6126802,
+ -6144272, -6161699, -6179083, -6196423, -6213721, -6230974, -6248183,
+ -6265348, -6282469, -6299545, -6316576, -6333562, -6350503, -6367399,
+ -6384249, -6401053, -6417811, -6434522, -6451187, -6467806, -6484377,
+ -6500902, -6517379, -6533808, -6550190, -6566524, -6582809, -6599047,
+ -6615236, -6631376, -6647467, -6663509, -6679501, -6695444, -6711337,
+ -6727181, -6742974, -6758716, -6774408, -6790050, -6805640, -6821179,
+ -6836667, -6852103, -6867487, -6882820, -6898100, -6913328, -6928503,
+ -6943625, -6958695, -6973711, -6988674, -7003583, -7018439, -7033241,
+ -7047988, -7062681, -7077320, -7091904, -7106433, -7120906, -7135325,
+ -7149688, -7163995, -7178246, -7192442, -7206581, -7220663, -7234689,
+ -7248658, -7262570, -7276424, -7290222, -7303961, -7317643, -7331267,
+ -7344833, -7358340, -7371789, -7385179, -7398510, -7411782, -7424995,
+ -7438148, -7451241, -7464275, -7477249, -7490162, -7503015, -7515808,
+ -7528539, -7541210, -7553820, -7566368, -7578855, -7591280, -7603644,
+ -7615945, -7628184, -7640361, -7652475, -7664526, -7676515, -7688440,
+ -7700303, -7712101, -7723836, -7735508, -7747115, -7758658, -7770137,
+ -7781552, -7792902, -7804187, -7815407, -7826562, -7837651, -7848675,
+ -7859633, -7870526, -7881352, -7892113, -7902807, -7913434, -7923995,
+ -7934489, -7944916, -7955275, -7965568, -7975793, -7985950, -7996039,
+ -8006061, -8016014, -8025899, -8035716, -8045463, -8055143, -8064753,
+ -8074294, -8083766, -8093168, -8102501, -8111764, -8120957, -8130080,
+ -8139133, -8148116, -8157028, -8165869, -8174640, -8183339, -8191968,
+ -8200525, -8209011, -8217425, -8225768, -8234039, -8242237, -8250364,
+ -8258418, -8266400, -8274309, -8282146, -8289909, -8297600, -8305217,
+ -8312761, -8320232, -8327629, -8334952, -8342202, -8349377, -8356478,
+ -8363505, -8370458, -8377336, -8384139, -8390868, -8397521, -8404100,
+ -8410603, -8417031, -8423383, -8429659, -8435860, -8441985, -8448034,
+ -8454007, -8459903, -8465723, -8471467, -8477134, -8482724, -8488237,
+ -8493673, -8499032, -8504313, -8509517, -8514644, -8519693, -8524664,
+ -8529557, -8534372, -8539109, -8543768, -8548349, -8552851, -8557274,
+ -8561618, -8565884, -8570071, -8574178, -8578207, -8582156, -8586026,
+ -8589816, -8593526, -8597157, -8600708, -8604179, -8607570, -8610881,
+ -8614111, -8617261, -8620331, -8623320, -8626228, -8629056, -8631802,
+ -8634468, -8637052, -8639555, -8641977, -8644317, -8646576, -8648754,
+ -8650849, -8652863, -8654795, -8656645, -8658413, -8660099, -8661702,
+ -8663223, -8664662, -8666018, -8667291, -8668482, -8669590, -8670615,
+ -8671557, -8672416, -8673192, -8673885, -8674494, -8675020, -8675462,
+ -8675821, -8676096, -8676288, -8676395, -8676419, -8676359, -8676215,
+ -8675986, -8675674, -8675277, -8674796, -8674231, -8673581, -8672846,
+ -8672027, -8671123, -8670135, -8669061, -8667903, -8666660, -8665331,
+ -8663918, -8662419, -8660836, -8659167, -8657412, -8655572, -8653647,
+ -8651636, -8649540, -8647358, -8645090, -8642737, -8640297, -8637772,
+ -8635161, -8632464, -8629681, -8626812, -8623857, -8620815, -8617687,
+ -8614474, -8611173, -8607787, -8604313, -8600754, -8597108, -8593375,
+ -8589556, -8585650, -8581658, -8577579, -8573413, -8569160, -8564820,
+ -8560394, -8555880, -8551280, -8546593, -8541818, -8536957, -8532008,
+ -8526973, -8521850, -8516640, -8511343, -8505959, -8500488, -8494929,
+ -8489283, -8483549, -8477728, -8471820, -8465825, -8459742, -8453571,
+ -8447313, -8440968, -8434535, -8428015, -8421407, -8414712, -8407929,
+ -8401058, -8394100, -8387054, -8379921, -8372700, -8365391, -8357995,
+ -8350511, -8342940, -8335281, -8327534, -8319699, -8311777, -8303767,
+ -8295670, -8287485, -8279212, -8270851, -8262403, -8253867, -8245244,
+ -8236533, -8227734, -8218847, -8209873, -8200811, -8191662, -8182425,
+ -8173100, -8163688, -8154188, -8144601, -8134926, -8125164, -8115314,
+ -8105376, -8095351, -8085239, -8075039, -8064751, -8054377, -8043915,
+ -8033365, -8022728, -8012004, -8001193, -7990294, -7979308, -7968235,
+ -7957074, -7945827, -7934492, -7923070, -7911562, -7899966, -7888283,
+ -7876513, -7864657, -7852713, -7840683, -7828565, -7816361, -7804071,
+ -7791693, -7779229, -7766678, -7754041, -7741317, -7728507, -7715611,
+ -7702628, -7689558, -7676403, -7663161, -7649833, -7636419, -7622919,
+ -7609333, -7595660, -7581902, -7568059, -7554129, -7540113, -7526012,
+ -7511826, -7497553, -7483196, -7468752, -7454224, -7439610, -7424911,
+ -7410127, -7395258, -7380303, -7365264, -7350140, -7334931, -7319637,
+ -7304258, -7288795, -7273248, -7257616, -7241899, -7226098, -7210214,
+ -7194244, -7178191, -7162054, -7145833, -7129528, -7113140, -7096667,
+ -7080112, -7063472, -7046750, -7029944, -7013054, -6996082, -6979027,
+ -6961888, -6944667, -6927363, -6909977, -6892508, -6874956, -6857322,
+ -6839606, -6821807, -6803927, -6785964, -6767920, -6749794, -6731586,
+ -6713296, -6694926, -6676473, -6657940, -6639325, -6620630, -6601853,
+ -6582996, -6564057, -6545039, -6525940, -6506760, -6487500, -6468160,
+ -6448740, -6429240, -6409661, -6390002, -6370263, -6350444, -6330547,
+ -6310570, -6290514, -6270380, -6250166, -6229874, -6209503, -6189054,
+ -6168527, -6147921, -6127237, -6106476, -6085636, -6064720, -6043725,
+ -6022653, -6001504, -5980278, -5958975, -5937595, -5916139, -5894605,
+ -5872996, -5851310, -5829548, -5807710, -5785797, -5763807, -5741743,
+ -5719602, -5697387, -5675096, -5652731, -5630291, -5607776, -5585186,
+ -5562523, -5539785, -5516973, -5494087, -5471128, -5448095, -5424989,
+ -5401809, -5378556, -5355231, -5331833, -5308362, -5284818, -5261203,
+ -5237515, -5213756, -5189925, -5166022, -5142047, -5118002, -5093885,
+ -5069698, -5045440, -5021111, -4996712, -4972243, -4947703, -4923094,
+ -4898415, -4873667, -4848849, -4823962, -4799006, -4773982, -4748889,
+ -4723727, -4698497, -4673200, -4647834, -4622401, -4596900, -4571332,
+ -4545696, -4519994, -4494226, -4468390, -4442488, -4416521, -4390487,
+ -4364387, -4338222, -4311992, -4285696, -4259336, -4232910, -4206420,
+ -4179866, -4153248, -4126565, -4099819, -4073009, -4046136, -4019200,
+ -3992201, -3965139, -3938015, -3910828, -3883579, -3856268, -3828896,
+ -3801462, -3773967, -3746411, -3718794, -3691116, -3663378, -3635580,
+ -3607722, -3579804, -3551826, -3523789, -3495694, -3467539, -3439326,
+ -3411054, -3382724, -3354336, -3325890, -3297387, -3268826, -3240209,
+ -3211534, -3182803, -3154016, -3125172, -3096273, -3067318, -3038307,
+ -3009241, -2980120, -2950945, -2921714, -2892430, -2863092, -2833699,
+ -2804253, -2774754, -2745202, -2715597, -2685939, -2656229, -2626467,
+ -2596653, -2566787, -2536870, -2506902, -2476883, -2446813, -2416693,
+ -2386523, -2356303, -2326033, -2295713, -2265345, -2234928, -2204462,
+ -2173948, -2143385, -2112775, -2082117, -2051411, -2020659, -1989860,
+ -1959014, -1928122, -1897183, -1866199, -1835170, -1804095, -1772975,
+ -1741810, -1710601, -1679347, -1648050, -1616709, -1585324, -1553897,
+ -1522426, -1490913, -1459357, -1427760, -1396120, -1364439, -1332717,
+ -1300953, -1269149, -1237305, -1205420, -1173495, -1141531, -1109527,
+ -1077485, -1045403, -1013283, -981125, -948928, -916694, -884423,
+ -852115, -819769, -787387, -754969, -722515, -690025, -657500, -624940,
+ -592344, -559714, -527050, -494352, -461620, -428855, -396057, -363226,
+ -330362, -297466, -264538, -231579, -198588, -165566, -132513, -99429,
+ -66316, -33173, 0, 33202, 66433, 99693, 132982, 166298, 199643, 233014,
+ 266413, 299839, 333292, 366771, 400276, 433806, 467363, 500944, 534549,
+ 568180, 601834, 635513, 669215, 702940, 736688, 770459, 804252, 838067,
+ 871904, 905762, 939642, 973542, 1007462, 1041403, 1075364, 1109344,
+ 1143343, 1177361, 1211398, 1245453, 1279526, 1313617, 1347725, 1381850,
+ 1415992, 1450150, 1484324, 1518514, 1552719, 1586939, 1621174, 1655424,
+ 1689688, 1723965, 1758256, 1792560, 1826877, 1861207, 1895549, 1929902,
+ 1964268, 1998644, 2033031, 2067429, 2101837, 2136255, 2170683, 2205120,
+ 2239566, 2274020, 2308483, 2342954, 2377432, 2411918, 2446411, 2480910,
+ 2515416, 2549927, 2584445, 2618967, 2653495, 2688027, 2722564, 2757104,
+ 2791649, 2826196, 2860747, 2895300, 2929856, 2964413, 2998973, 3033533,
+ 3068095, 3102657, 3137220, 3171782, 3206344, 3240906, 3275466, 3310025,
+ 3344583, 3379138, 3413691, 3448242, 3482789, 3517333, 3551873, 3586409,
+ 3620941, 3655468, 3689989, 3724506, 3759016, 3793521, 3828019, 3862510,
+ 3896994, 3931471, 3965940, 4000401, 4034853, 4069296, 4103730, 4138155,
+ 4172570, 4206974, 4241368, 4275751, 4310123, 4344484, 4378832, 4413168,
+ 4447491, 4481802, 4516099, 4550382, 4584652, 4618907, 4653147, 4687373,
+ 4721583, 4755777, 4789955, 4824117, 4858262, 4892390, 4926500, 4960593,
+ 4994667, 5028723, 5062760, 5096778, 5130776, 5164754, 5198713, 5232650,
+ 5266567, 5300462, 5334336, 5368187, 5402017, 5435823, 5469607, 5503367,
+ 5537104, 5570816, 5604504, 5638168, 5671806, 5705418, 5739005, 5772566,
+ 5806100, 5839607, 5873088, 5906540, 5939965, 5973361, 6006729, 6040067,
+ 6073377, 6106657, 6139906, 6173126, 6206315, 6239472, 6272598, 6305693,
+ 6338755, 6371785, 6404782, 6437746, 6470677, 6503573, 6536436, 6569264,
+ 6602057, 6634814, 6667536, 6700223, 6732872, 6765486, 6798062, 6830601,
+ 6863102, 6895565, 6927990, 6960376, 6992723, 7025030, 7057298, 7089526,
+ 7121713, 7153859, 7185964, 7218028, 7250050, 7282029, 7313966, 7345861,
+ 7377711, 7409519, 7441282, 7473001, 7504675, 7536305, 7567889, 7599427,
+ 7630919, 7662365, 7693765, 7725117, 7756422, 7787679, 7818887, 7850048,
+ 7881160, 7912222, 7943235, 7974199, 8005112, 8035974, 8066786, 8097547,
+ 8128256, 8158913, 8189518, 8220070, 8250569, 8281016, 8311408, 8341747,
+ 8372031, 8402261, 8432436, 8462555, 8492619, 8522627, 8552579, 8582474,
+ 8612312, 8642092, 8671815, 8701480, 8731087, 8760635, 8790124, 8819553,
+ 8848923, 8878233, 8907483, 8936671, 8965799, 8994865, 9023870, 9052812,
+ 9081693, 9110510, 9139265, 9167956, 9196583, 9225146, 9253645, 9282079,
+ 9310449, 9338752, 9366990, 9395162, 9423268, 9451307, 9479279, 9507184,
+ 9535021, 9562790, 9590490, 9618122, 9645685, 9673178, 9700602, 9727956,
+ 9755240, 9782453, 9809595, 9836666, 9863665, 9890592, 9917447, 9944230,
+ 9970940, 9997576, 10024139, 10050628, 10077043, 10103383, 10129648,
+ 10155839, 10181954, 10207993, 10233956, 10259843, 10285653, 10311386,
+ 10337041, 10362619, 10388119, 10413541, 10438884, 10464148, 10489333,
+ 10514438, 10539463, 10564409, 10589274, 10614058, 10638760, 10663382,
+ 10687922, 10712379, 10736755, 10761048, 10785258, 10809384, 10833427,
+ 10857386, 10881261, 10905052, 10928758, 10952378, 10975914, 10999363,
+ 11022727, 11046004, 11069195, 11092299, 11115316, 11138245, 11161086,
+ 11183840, 11206505, 11229081, 11251569, 11273967, 11296276, 11318494,
+ 11340623, 11362661, 11384609, 11406466, 11428231, 11449905, 11471487,
+ 11492976, 11514374, 11535678, 11556890, 11578008, 11599032, 11619963,
+ 11640800, 11661542, 11682190, 11702742, 11723199, 11743561, 11763827,
+ 11783997, 11804070, 11824047, 11843927, 11863709, 11883394, 11902982,
+ 11922471, 11941862, 11961154, 11980348, 11999442, 12018437, 12037333,
+ 12056128, 12074824, 12093418, 12111913, 12130306, 12148598, 12166788,
+ 12184876, 12202863, 12220747, 12238529, 12256208, 12273784, 12291256,
+ 12308625, 12325890, 12343051, 12360107, 12377059, 12393906, 12410648,
+ 12427285, 12443816, 12460241, 12476560, 12492772, 12508878, 12524877,
+ 12540769, 12556554, 12572231, 12587800, 12603262, 12618614, 12633859,
+ 12648994, 12664021, 12678938, 12693745, 12708443, 12723031, 12737509,
+ 12751876, 12766133, 12780278, 12794313, 12808236, 12822047, 12835747,
+ 12849334, 12862810, 12876172, 12889423, 12902560, 12915583, 12928494,
+ 12941291, 12953974, 12966543, 12978997, 12991337, 13003563, 13015673,
+ 13027669, 13039549, 13051313, 13062962, 13074494, 13085911, 13097211,
+ 13108394, 13119461, 13130410, 13141242, 13151957, 13162555, 13173034,
+ 13183395, 13193638, 13203763, 13213769, 13223656, 13233424, 13243073,
+ 13252602, 13262012, 13271302, 13280472, 13289522, 13298451, 13307260,
+ 13315948, 13324515, 13332961, 13341286, 13349489, 13357571, 13365531,
+ 13373368, 13381084, 13388677, 13396147, 13403495, 13410720, 13417822,
+ 13424800, 13431655, 13438387, 13444995, 13451478, 13457838, 13464073,
+ 13470184, 13476171, 13482032, 13487769, 13493381, 13498867, 13504228,
+ 13509464, 13514573, 13519557, 13524415, 13529147, 13533752, 13538231,
+ 13542583, 13546809, 13550907, 13554879, 13558723, 13562440, 13566029,
+ 13569491, 13572825, 13576031, 13579109, 13582059, 13584880, 13587573,
+ 13590138, 13592574, 13594880, 13597058, 13599107, 13601027, 13602817,
+ 13604477, 13606008, 13607410, 13608681, 13609822, 13610834, 13611715,
+ 13612465, 13613086, 13613575, 13613934, 13614163, 13614260, 13614226,
+ 13614061, 13613765, 13613338, 13612779, 13612088, 13611266, 13610313,
+ 13609227, 13608009, 13606659, 13605177, 13603563, 13601817, 13599938,
+ 13597926, 13595782, 13593506, 13591096, 13588553, 13585878, 13583069,
+ 13580128, 13577053, 13573845, 13570503, 13567028, 13563420, 13559677,
+ 13555801, 13551792, 13547648, 13543371, 13538960, 13534414, 13529735,
+ 13524921, 13519973, 13514891, 13509674, 13504323, 13498837, 13493217,
+ 13487463, 13481573, 13475549, 13469390, 13463096, 13456668, 13450104,
+ 13443406, 13436572, 13429604, 13422500, 13415261, 13407887, 13400378,
+ 13392733, 13384954, 13377038, 13368988, 13360802, 13352480, 13344023,
+ 13335431, 13326703, 13317839, 13308840, 13299705, 13290435, 13281029,
+ 13271487, 13261809, 13251996, 13242047, 13231962, 13221742, 13211385,
+ 13200893, 13190265, 13179501, 13168602, 13157566, 13146395, 13135088,
+ 13123645, 13112066, 13100351, 13088501, 13076514, 13064392, 13052134,
+ 13039740, 13027210, 13014544, 13001743, 12988806, 12975733, 12962524,
+ 12949180, 12935699, 12922083, 12908332, 12894444, 12880421, 12866263,
+ 12851969, 12837539, 12822974, 12808273, 12793436, 12778465, 12763357,
+ 12748115, 12732737, 12717223, 12701575, 12685791, 12669872, 12653818,
+ 12637629, 12621304, 12604845, 12588251, 12571522, 12554657, 12537659,
+ 12520525, 12503256, 12485853, 12468316, 12450644, 12432837, 12414896,
+ 12396821, 12378611, 12360267, 12341789, 12323177, 12304431, 12285551,
+ 12266537, 12247389, 12228107, 12208692, 12189144, 12169461, 12149646,
+ 12129697, 12109615, 12089399, 12069051, 12048570, 12027956, 12007209,
+ 11986329, 11965316, 11944172, 11922894, 11901485, 11879943, 11858269,
+ 11836463, 11814525, 11792455, 11770254, 11747921, 11725456, 11702860,
+ 11680133, 11657275, 11634285, 11611165, 11587914, 11564532, 11541019,
+ 11517376, 11493603, 11469699, 11445666, 11421502, 11397209, 11372786,
+ 11348233, 11323551, 11298739, 11273799, 11248729, 11223530, 11198203,
+ 11172747, 11147163, 11121450, 11095609, 11069640, 11043543, 11017318,
+ 10990965, 10964486, 10937878, 10911144, 10884283, 10857295, 10830180,
+ 10802938, 10775571, 10748077, 10720457, 10692711, 10664839, 10636842,
+ 10608720, 10580472, 10552099, 10523602, 10494979, 10466233, 10437361,
+ 10408366, 10379247, 10350004, 10320637, 10291147, 10261533, 10231797,
+ 10201938, 10171956, 10141851, 10111624, 10081275, 10050805, 10020212,
+ 9989498, 9958662, 9927706, 9896628, 9865430, 9834112, 9802672, 9771113,
+ 9739434, 9707636, 9675717, 9643680, 9611523, 9579248, 9546854, 9514341,
+ 9481711, 9448962, 9416096, 9383112, 9350011, 9316792, 9283457, 9250006,
+ 9216437, 9182753, 9148953, 9115037, 9081005, 9046859, 9012597, 8978221,
+ 8943730, 8909125, 8874405, 8839572, 8804626, 8769566, 8734393, 8699107,
+ 8663709, 8628198, 8592576, 8556841, 8520995, 8485038, 8448970, 8412790,
+ 8376501, 8340101, 8303591, 8266972, 8230243, 8193404, 8156457, 8119402,
+ 8082237, 8044965, 8007585, 7970097, 7932502, 7894801, 7856992, 7819077,
+ 7781055, 7742928, 7704695, 7666357, 7627914, 7589366, 7550714, 7511957,
+ 7473097, 7434133, 7395066, 7355895, 7316622, 7277247, 7237770, 7198190,
+ 7158509, 7118727, 7078844, 7038861, 6998777, 6958593, 6918310, 6877927,
+ 6837445, 6796864, 6756185, 6715408, 6674533, 6633560, 6592491, 6551324,
+ 6510061, 6468702, 6427247, 6385696, 6344050, 6302309, 6260474, 6218544,
+ 6176520, 6134403, 6092192, 6049889, 6007493, 5965005, 5922424, 5879753,
+ 5836990, 5794136, 5751191, 5708156, 5665032, 5621818, 5578514, 5535122,
+ 5491641, 5448072, 5404416, 5360672, 5316841, 5272923, 5228918, 5184828,
+ 5140652, 5096391, 5052045, 5007614, 4963099, 4918500, 4873818, 4829052,
+ 4784204, 4739273, 4694260, 4649166, 4603990, 4558734, 4513396, 4467979,
+ 4422482, 4376906, 4331250, 4285516, 4239703, 4193813, 4147845, 4101800,
+ 4055678, 4009480, 3963205, 3916856, 3870431, 3823931, 3777356, 3730708,
+ 3683986, 3637191, 3590323, 3543382, 3496369, 3449285, 3402130, 3354903,
+ 3307606, 3260239, 3212802, 3165296, 3117721, 3070078, 3022367, 2974588,
+ 2926741, 2878828, 2830849, 2782803, 2734692, 2686515, 2638274, 2589969,
+ 2541599, 2493166, 2444670, 2396112, 2347490, 2298808, 2250063, 2201258,
+ 2152392, 2103466, 2054480, 2005435, 1956331, 1907169, 1857948, 1808670,
+ 1759335, 1709943, 1660495, 1610990, 1561431, 1511816, 1462147, 1412424,
+ 1362647, 1312817, 1262934, 1212998, 1163011, 1112972, 1062883, 1012742,
+ 962552, 912311, 862022, 811684, 761297, 710862, 660380, 609851, 559275,
+ 508654, 457986, 407273, 356516, 305714, 254869, 203980, 153048, 102074,
+ 51057, 0, -51098, -102238, -153418, -204637, -255896, -307193, -358529,
+ -409903, -461314, -512762, -564246, -615766, -667322, -718913, -770538,
+ -822198, -873891, -925617, -977376, -1029167, -1080990, -1132844,
+ -1184729, -1236644, -1288589, -1340563, -1392566, -1444597, -1496657,
+ -1548743, -1600857, -1652997, -1705163, -1757355, -1809571, -1861812,
+ -1914077, -1966366, -2018677, -2071012, -2123368, -2175746, -2228145,
+ -2280564, -2333004, -2385463, -2437941, -2490438, -2542953, -2595486,
+ -2648036, -2700603, -2753186, -2805784, -2858398, -2911026, -2963668,
+ -3016324, -3068994, -3121676, -3174370, -3227076, -3279793, -3332521,
+ -3385258, -3438006, -3490763, -3543528, -3596302, -3649083, -3701871,
+ -3754666, -3807468, -3860274, -3913086, -3965903, -4018724, -4071548,
+ -4124376, -4177206, -4230038, -4282872, -4335706, -4388542, -4441377,
+ -4494212, -4547046, -4599878, -4652709, -4705537, -4758362, -4811183,
+ -4864001, -4916813, -4969621, -5022423, -5075219, -5128009, -5180791,
+ -5233566, -5286332, -5339090, -5391838, -5444577, -5497306, -5550023,
+ -5602730, -5655425, -5708107, -5760777, -5813433, -5866075, -5918703,
+ -5971316, -6023914, -6076495, -6129060, -6181609, -6234139, -6286652,
+ -6339146, -6391621, -6444076, -6496511, -6548926, -6601319, -6653691,
+ -6706040, -6758367, -6810670, -6862950, -6915205, -6967435, -7019640,
+ -7071820, -7123972, -7176098, -7228196, -7280267, -7332308, -7384321,
+ -7436304, -7488257, -7540180, -7592071, -7643931, -7695758, -7747553,
+ -7799314, -7851042, -7902735, -7954393, -8006016, -8057603, -8109154,
+ -8160668, -8212144, -8263582, -8314982, -8366343, -8417664, -8468945,
+ -8520185, -8571384, -8622542, -8673657, -8724730, -8775759, -8826744,
+ -8877685, -8928581, -8979432, -9030237, -9080996, -9131707, -9182371,
+ -9232987, -9283554, -9334073, -9384541, -9434960, -9485328, -9535644,
+ -9585909, -9636122, -9686282, -9736389, -9786441, -9836440, -9886383,
+ -9936272, -9986104, -10035880, -10085598, -10135260, -10184863,
+ -10234408, -10283893, -10333319, -10382685, -10431990, -10481235,
+ -10530417, -10579537, -10628594, -10677588, -10726519, -10775385,
+ -10824186, -10872921, -10921591, -10970195, -11018731, -11067200,
+ -11115601, -11163934, -11212197, -11260391, -11308515, -11356569,
+ -11404551, -11452461, -11500300, -11548066, -11595758, -11643377,
+ -11690922, -11738392, -11785786, -11833105, -11880348, -11927514,
+ -11974602, -12021613, -12068545, -12115399, -12162173, -12208867,
+ -12255481, -12302013, -12348465, -12394834, -12441121, -12487325,
+ -12533446, -12579482, -12625434, -12671301, -12717082, -12762778,
+ -12808387, -12853908, -12899343, -12944689, -12989946, -13035115,
+ -13080194, -13125182, -13170081, -13214888, -13259603, -13304226,
+ -13348757, -13393195, -13437539, -13481788, -13525944, -13570004,
+ -13613968, -13657836, -13701608, -13745282, -13788859, -13832338,
+ -13875718, -13918999, -13962181, -14005262, -14048242, -14091122,
+ -14133900, -14176576, -14219149, -14261619, -14303986, -14346249,
+ -14388407, -14430460, -14472407, -14514249, -14555984, -14597612,
+ -14639132, -14680545, -14721849, -14763044, -14804130, -14845106,
+ -14885972, -14926727, -14967370, -15007902, -15048321, -15088627,
+ -15128821, -15168900, -15208866, -15248716, -15288452, -15328072,
+ -15367576, -15406963, -15446233, -15485386, -15524421, -15563337,
+ -15602134, -15640812, -15679370, -15717808, -15756125, -15794321,
+ -15832395, -15870347, -15908176, -15945882, -15983465, -16020924,
+ -16058258, -16095467, -16132551, -16169508, -16206340, -16243045,
+ -16279623, -16316073, -16352394, -16388588, -16424652, -16460587,
+ -16496392, -16532066, -16567610, -16603023, -16638304, -16673452,
+ -16708468, -16743351, -16778101, -16812717, -16847198, -16881545,
+ -16915756, -16949832, -16983771, -17017574, -17051241, -17084769,
+ -17118160, -17151413, -17184527, -17217502, -17250338, -17283033,
+ -17315588, -17348002, -17380275, -17412407, -17444396, -17476243,
+ -17507947, -17539508, -17570925, -17602197, -17633325, -17664309,
+ -17695146, -17725838, -17756384, -17786783, -17817036, -17847140,
+ -17877097, -17906906, -17936566, -17966077, -17995438, -18024650,
+ -18053711, -18082622, -18111381, -18139990, -18168446, -18196750,
+ -18224902, -18252900, -18280746, -18308437, -18335974, -18363357,
+ -18390585, -18417657, -18444574, -18471334, -18497939, -18524386,
+ -18550676, -18576809, -18602783, -18628599, -18654257, -18679755,
+ -18705094, -18730273, -18755292, -18780151, -18804848, -18829384,
+ -18853759, -18877971, -18902021, -18925909, -18949633, -18973194,
+ -18996591, -19019824, -19042893, -19065796, -19088535, -19111108,
+ -19133515, -19155756, -19177830, -19199737, -19221477, -19243050,
+ -19264454, -19285691, -19306758, -19327657, -19348386, -19368946,
+ -19389336, -19409556, -19429605, -19449483, -19469190, -19488726,
+ -19508089, -19527280, -19546299, -19565145, -19583818, -19602317,
+ -19620643, -19638794, -19656771, -19674574, -19692201, -19709653,
+ -19726929, -19744030, -19760954, -19777702, -19794273, -19810667,
+ -19826883, -19842922, -19858782, -19874465, -19889969, -19905294,
+ -19920439, -19935406, -19950192, -19964799, -19979225, -19993471,
+ -20007536, -20021420, -20035122, -20048643, -20061982, -20075139,
+ -20088113, -20100905, -20113513, -20125938, -20138180, -20150238,
+ -20162112, -20173802, -20185307, -20196627, -20207763, -20218712,
+ -20229477, -20240056, -20250448, -20260654, -20270674, -20280507,
+ -20290153, -20299612, -20308883, -20317967, -20326863, -20335570,
+ -20344089, -20352420, -20360561, -20368514, -20376277, -20383851,
+ -20391235, -20398429, -20405432, -20412246, -20418869, -20425301,
+ -20431542, -20437592, -20443450, -20449117, -20454592, -20459875,
+ -20464965, -20469863, -20474569, -20479082, -20483402, -20487528,
+ -20491461, -20495201, -20498747, -20502099, -20505257, -20508220,
+ -20510989, -20513563, -20515943, -20518128, -20520117, -20521911,
+ -20523509, -20524912, -20526119, -20527130, -20527945, -20528564,
+ -20528986, -20529211, -20529240, -20529072, -20528706, -20528144,
+ -20527384, -20526426, -20525271, -20523918, -20522367, -20520618,
+ -20518671, -20516526, -20514182, -20511639, -20508898, -20505958,
+ -20502818, -20499480, -20495943, -20492206, -20488270, -20484134,
+ -20479798, -20475263, -20470528, -20465593, -20460457, -20455122,
+ -20449586, -20443849, -20437913, -20431775, -20425437, -20418898,
+ -20412158, -20405217, -20398075, -20390732, -20383188, -20375442,
+ -20367495, -20359347, -20350997, -20342445, -20333692, -20324737,
+ -20315580, -20306221, -20296660, -20286897, -20276932, -20266765,
+ -20256396, -20245825, -20235051, -20224075, -20212896, -20201515,
+ -20189932, -20178146, -20166157, -20153966, -20141572, -20128976,
+ -20116176, -20103174, -20089970, -20076562, -20062951, -20049138,
+ -20035122, -20020903, -20006481, -19991856, -19977028, -19961997,
+ -19946764, -19931327, -19915687, -19899844, -19883799, -19867550,
+ -19851098, -19834444, -19817586, -19800526, -19783262, -19765796,
+ -19748126, -19730254, -19712179, -19693901, -19675420, -19656736,
+ -19637850, -19618760, -19599468, -19579974, -19560276, -19540376,
+ -19520273, -19499968, -19479460, -19458750, -19437837, -19416722,
+ -19395405, -19373885, -19352163, -19330239, -19308113, -19285785,
+ -19263255, -19240522, -19217588, -19194453, -19171115, -19147576,
+ -19123835, -19099893, -19075749, -19051404, -19026858, -19002110,
+ -18977162, -18952012, -18926661, -18901110, -18875358, -18849405,
+ -18823252, -18796898, -18770344, -18743590, -18716636, -18689481,
+ -18662127, -18634573, -18606819, -18578866, -18550713, -18522361,
+ -18493810, -18465059, -18436110, -18406962, -18377615, -18348070,
+ -18318326, -18288384, -18258243, -18227905, -18197369, -18166635,
+ -18135704, -18104575, -18073249, -18041726, -18010005, -17978088,
+ -17945975, -17913664, -17881158, -17848455, -17815557, -17782462,
+ -17749172, -17715686, -17682005, -17648129, -17614058, -17579792,
+ -17545332, -17510677, -17475828, -17440785, -17405548, -17370118,
+ -17334494, -17298676, -17262666, -17226463, -17190067, -17153479,
+ -17116699, -17079726, -17042562, -17005206, -16967659, -16929920,
+ -16891991, -16853871, -16815560, -16777059, -16738368, -16699488,
+ -16660417, -16621158, -16581709, -16542071, -16502245, -16462230,
+ -16422027, -16381636, -16341058, -16300292, -16259339, -16218199,
+ -16176872, -16135359, -16093660, -16051775, -16009705, -15967449,
+ -15925008, -15882382, -15839571, -15796577, -15753398, -15710036,
+ -15666490, -15622761, -15578849, -15534755, -15490478, -15446020,
+ -15401379, -15356558, -15311555, -15266371, -15221007, -15175462,
+ -15129738, -15083834, -15037751, -14991489, -14945048, -14898428,
+ -14851631, -14804656, -14757503, -14710174, -14662667, -14614984,
+ -14567125, -14519090, -14470880, -14422495, -14373935, -14325200,
+ -14276291, -14227209, -14177953, -14128524, -14078922, -14029148,
+ -13979201, -13929083, -13878794, -13828334, -13777703, -13726902,
+ -13675930, -13624790, -13573480, -13522001, -13470354, -13418539,
+ -13366556, -13314406, -13262089, -13209605, -13156955, -13104140,
+ -13051159, -12998013, -12944702, -12891227, -12837588, -12783786,
+ -12729820, -12675692, -12621402, -12566950, -12512336, -12457561,
+ -12402626, -12347530, -12292275, -12236860, -12181286, -12125553,
+ -12069663, -12013614, -11957408, -11901046, -11844527, -11787851,
+ -11731021, -11674035, -11616894, -11559599, -11502150, -11444547,
+ -11386792, -11328884, -11270824, -11212612, -11154249, -11095735,
+ -11037071, -10978257, -10919293, -10860181, -10800920, -10741511,
+ -10681954, -10622251, -10562400, -10502404, -10442261, -10381974,
+ -10321542, -10260965, -10200245, -10139381, -10078374, -10017225,
+ -9955934, -9894502, -9832928, -9771215, -9709361, -9647368, -9585235,
+ -9522965, -9460556, -9398010, -9335327, -9272507, -9209552, -9146461,
+ -9083235, -9019874, -8956380, -8892752, -8828991, -8765098, -8701073,
+ -8636916, -8572629, -8508211, -8443664, -8378987, -8314182, -8249248,
+ -8184186, -8118998, -8053683, -7988241, -7922674, -7856983, -7791166,
+ -7725226, -7659162, -7592975, -7526667, -7460236, -7393684, -7327011,
+ -7260219, -7193307, -7126275, -7059126, -6991858, -6924473, -6856972,
+ -6789354, -6721620, -6653772, -6585809, -6517732, -6449542, -6381239,
+ -6312823, -6244296, -6175658, -6106910, -6038052, -5969084, -5900007,
+ -5830823, -5761531, -5692132, -5622626, -5553015, -5483298, -5413477,
+ -5343552, -5273523, -5203392, -5133158, -5062823, -4992387, -4921850,
+ -4851214, -4780478, -4709644, -4638712, -4567682, -4496556, -4425333,
+ -4354015, -4282602, -4211094, -4139493, -4067799, -3996013, -3924134,
+ -3852165, -3780105, -3707955, -3635715, -3563387, -3490971, -3418467,
+ -3345877, -3273201, -3200439, -3127592, -3054660, -2981646, -2908548,
+ -2835368, -2762106, -2688763, -2615340, -2541837, -2468255, -2394595,
+ -2320857, -2247041, -2173150, -2099182, -2025139, -1951022, -1876831,
+ -1802566, -1728229, -1653821, -1579341, -1504790, -1430170, -1355480,
+ -1280722, -1205896, -1131003, -1056043, -981017, -905927, -830771,
+ -755552, -680270, -604925, -529518, -454051, -378523, -302935, -227288,
+ -151583, -75820, 0, 75876, 151808, 227795, 303836, 379931, 456078,
+ 532278, 608529, 684831, 761183, 837585, 914035, 990533, 1067079,
+ 1143671, 1220309, 1296992, 1373719, 1450491, 1527305, 1604162, 1681060,
+ 1758000, 1834979, 1911998, 1989056, 2066152, 2143285, 2220455, 2297661,
+ 2374902, 2452178, 2529487, 2606830, 2684204, 2761611, 2839048, 2916515,
+ 2994012, 3071538, 3149092, 3226673, 3304280, 3381913, 3459572, 3537255,
+ 3614961, 3692690, 3770442, 3848215, 3926008, 4003822, 4081655, 4159506,
+ 4237375, 4315261, 4393164, 4471082, 4549015, 4626961, 4704922, 4782894,
+ 4860879, 4938875, 5016881, 5094897, 5172921, 5250954, 5328994, 5407041,
+ 5485094, 5563152, 5641214, 5719280, 5797349, 5875420, 5953492, 6031565,
+ 6109638, 6187710, 6265781, 6343849, 6421914, 6499975, 6578032, 6656083,
+ 6734128, 6812166, 6890197, 6968219, 7046232, 7124235, 7202228, 7280209,
+ 7358177, 7436133, 7514075, 7592003, 7669916, 7747812, 7825692, 7903554,
+ 7981398, 8059223, 8137028, 8214813, 8292576, 8370317, 8448035, 8525730,
+ 8603400, 8681046, 8758665, 8836257, 8913822, 8991359, 9068867, 9146345,
+ 9223793, 9301209, 9378594, 9455945, 9533263, 9610546, 9687795, 9765007,
+ 9842183, 9919321, 9996421, 10073483, 10150504, 10227485, 10304424,
+ 10381322, 10458177, 10534988, 10611754, 10688476, 10765152, 10841781,
+ 10918362, 10994895, 11071380, 11147814, 11224198, 11300531, 11376811,
+ 11453039, 11529213, 11605332, 11681397, 11757405, 11833357, 11909251,
+ 11985087, 12060864, 12136581, 12212237, 12287832, 12363365, 12438835,
+ 12514242, 12589583, 12664860, 12740071, 12815215, 12890291, 12965299,
+ 13040238, 13115107, 13189905, 13264633, 13339287, 13413869, 13488377,
+ 13562811, 13637170, 13711452, 13785658, 13859786, 13933835, 14007806,
+ 14081697, 14155507, 14229235, 14302882, 14376445, 14449925, 14523320,
+ 14596630, 14669854, 14742992, 14816041, 14889002, 14961875, 15034657,
+ 15107349, 15179949, 15252457, 15324872, 15397194, 15469421, 15541553,
+ 15613588, 15685527, 15757369, 15829112, 15900757, 15972301, 16043745,
+ 16115088, 16186328, 16257466, 16328500, 16399430, 16470254, 16540973,
+ 16611585, 16682090, 16752486, 16822774, 16892952, 16963019, 17032976,
+ 17102820, 17172552, 17242171, 17311675, 17381064, 17450338, 17519495,
+ 17588535, 17657457, 17726260, 17794944, 17863508, 17931951, 18000272,
+ 18068470, 18136546, 18204498, 18272324, 18340026, 18407601, 18475050,
+ 18542371, 18609564, 18676627, 18743561, 18810364, 18877035, 18943575,
+ 19009982, 19076255, 19142394, 19208398, 19274267, 19339998, 19405593,
+ 19471050, 19536368, 19601547, 19666585, 19731483, 19796239, 19860853,
+ 19925324, 19989651, 20053834, 20117871, 20181763, 20245508, 20309105,
+ 20372555, 20435855, 20499007, 20562007, 20624858, 20687556, 20750102,
+ 20812495, 20874734, 20936819, 20998748, 21060522, 21122139, 21183598,
+ 21244900, 21306043, 21367026, 21427849, 21488512, 21549013, 21609351,
+ 21669527, 21729539, 21789386, 21849069, 21908586, 21967937, 22027120,
+ 22086136, 22144983, 22203661, 22262169, 22320506, 22378672, 22436667,
+ 22494488, 22552137, 22609611, 22666911, 22724036, 22780984, 22837756,
+ 22894351, 22950767, 23007005, 23063064, 23118942, 23174640, 23230156,
+ 23285490, 23340642, 23395610, 23450395, 23504994, 23559409, 23613637,
+ 23667678, 23721533, 23775199, 23828677, 23881965, 23935064, 23987972,
+ 24040689, 24093214, 24145546, 24197685, 24249631, 24301382, 24352938,
+ 24404299, 24455463, 24506430, 24557199, 24607770, 24658143, 24708316,
+ 24758289, 24808061, 24857631, 24907000, 24956166, 25005129, 25053888,
+ 25102443, 25150792, 25198936, 25246874, 25294604, 25342128, 25389443,
+ 25436549, 25483446, 25530133, 25576609, 25622875, 25668928, 25714770,
+ 25760398, 25805813, 25851014, 25896000, 25940771, 25985326, 26029664,
+ 26073786, 26117690, 26161375, 26204842, 26248090, 26291117, 26333925,
+ 26376511, 26418875, 26461017, 26502937, 26544633, 26586105, 26627353,
+ 26668376, 26709173, 26749745, 26790089, 26830206, 26870096, 26909757,
+ 26949189, 26988392, 27027365, 27066108, 27104619, 27142899, 27180947,
+ 27218762, 27256344, 27293692, 27330806, 27367685, 27404329, 27440738,
+ 27476910, 27512845, 27548542, 27584002, 27619224, 27654206, 27688950,
+ 27723453, 27757716, 27791738, 27825519, 27859057, 27892354, 27925407,
+ 27958217, 27990783, 28023105, 28055182, 28087014, 28118600, 28149939,
+ 28181032, 28211877, 28242475, 28272825, 28302926, 28332777, 28362379,
+ 28391732, 28420833, 28449684, 28478283, 28506630, 28534725, 28562567,
+ 28590156, 28617491, 28644572, 28671398, 28697969, 28724285, 28750345,
+ 28776149, 28801696, 28826985, 28852017, 28876791, 28901307, 28925563,
+ 28949561, 28973298, 28996775, 29019992, 29042948, 29065643, 29088075,
+ 29110246, 29132154, 29153798, 29175180, 29196298, 29217151, 29237740,
+ 29258064, 29278123, 29297916, 29317443, 29336703, 29355697, 29374423,
+ 29392882, 29411073, 29428995, 29446649, 29464034, 29481149, 29497994,
+ 29514570, 29530875, 29546909, 29562672, 29578163, 29593382, 29608330,
+ 29623004, 29637406, 29651535, 29665390, 29678971, 29692278, 29705310,
+ 29718068, 29730550, 29742757, 29754688, 29766343, 29777721, 29788823,
+ 29799648, 29810195, 29820465, 29830457, 29840171, 29849606, 29858762,
+ 29867639, 29876237, 29884555, 29892593, 29900351, 29907829, 29915025,
+ 29921941, 29928575, 29934928, 29940999, 29946788, 29952294, 29957518,
+ 29962459, 29967117, 29971491, 29975582, 29979389, 29982912, 29986151,
+ 29989105, 29991774, 29994159, 29996258, 29998071, 29999599, 30000841,
+ 30001797, 30002467, 30002850, 30002946, 30002756, 30002278, 30001513,
+ 30000460, 29999119, 29997491, 29995574, 29993370, 29990876, 29988094,
+ 29985023, 29981663, 29978014, 29974075, 29969847, 29965329, 29960522,
+ 29955424, 29950036, 29944358, 29938389, 29932129, 29925579, 29918738,
+ 29911605, 29904182, 29896467, 29888460, 29880162, 29871572, 29862691,
+ 29853517, 29844051, 29834293, 29824242, 29813899, 29803264, 29792336,
+ 29781115, 29769601, 29757794, 29745694, 29733301, 29720615, 29707635,
+ 29694362, 29680795, 29666935, 29652781, 29638333, 29623592, 29608557,
+ 29593227, 29577604, 29561687, 29545475, 29528969, 29512170, 29495075,
+ 29477687, 29460004, 29442027, 29423755, 29405189, 29386329, 29367174,
+ 29347724, 29327980, 29307941, 29287607, 29266979, 29246057, 29224839,
+ 29203327, 29181521, 29159419, 29137023, 29114333, 29091347, 29068068,
+ 29044493, 29020624, 28996461, 28972002, 28947250, 28922203, 28896861,
+ 28871225, 28845295, 28819070, 28792551, 28765737, 28738630, 28711228,
+ 28683532, 28655543, 28627259, 28598681, 28569809, 28540644, 28511185,
+ 28481432, 28451386, 28421046, 28390413, 28359487, 28328267, 28296754,
+ 28264948, 28232849, 28200458, 28167773, 28134796, 28101527, 28067965,
+ 28034111, 27999964, 27965526, 27930796, 27895774, 27860460, 27824854,
+ 27788958, 27752770, 27716291, 27679520, 27642460, 27605108, 27567466,
+ 27529533, 27491311, 27452798, 27413995, 27374903, 27335521, 27295850,
+ 27255889, 27215640, 27175102, 27134275, 27093159, 27051756, 27010064,
+ 26968084, 26925817, 26883262, 26840420, 26797291, 26753875, 26710173,
+ 26666183, 26621908, 26577347, 26532500, 26487368, 26441950, 26396247,
+ 26350259, 26303987, 26257431, 26210590, 26163466, 26116058, 26068366,
+ 26020392, 25972135, 25923595, 25874773, 25825669, 25776283, 25726615,
+ 25676667, 25626438, 25575928, 25525137, 25474067, 25422717, 25371087,
+ 25319178, 25266991, 25214525, 25161780, 25108758, 25055458, 25001881,
+ 24948027, 24893896, 24839488, 24784805, 24729846, 24674612, 24619103,
+ 24563319, 24507261, 24450928, 24394323, 24337443, 24280291, 24222867,
+ 24165170, 24107201, 24048961, 23990449, 23931667, 23872615, 23813293,
+ 23753700, 23693839, 23633709, 23573310, 23512644, 23451709, 23390508,
+ 23329039, 23267304, 23205303, 23143036, 23080504, 23017708, 22954646,
+ 22891321, 22827732, 22763880, 22699766, 22635388, 22570750, 22505849,
+ 22440688, 22375266, 22309584, 22243643, 22177442, 22110982, 22044264,
+ 21977289, 21910056, 21842566, 21774819, 21706817, 21638559, 21570046,
+ 21501279, 21432257, 21362982, 21293454, 21223673, 21153640, 21083356,
+ 21012820, 20942034, 20870997, 20799712, 20728176, 20656393, 20584361,
+ 20512082, 20439556, 20366783, 20293764, 20220500, 20146991, 20073237,
+ 19999240, 19924999, 19850516, 19775790, 19700823, 19625614, 19550165,
+ 19474476, 19398547, 19322380, 19245974, 19169331, 19092450, 19015332,
+ 18937979, 18860390, 18782566, 18704508, 18626216, 18547691, 18468933,
+ 18389944, 18310723, 18231271, 18151589, 18071678, 17991538, 17911169,
+ 17830573, 17749749, 17668699, 17587423, 17505922, 17424196, 17342246,
+ 17260073, 17177677, 17095059, 17012219, 16929159, 16845878, 16762378,
+ 16678659, 16594721, 16510566, 16426195, 16341606, 16256803, 16171784,
+ 16086551, 16001104, 15915445, 15829573, 15743489, 15657195, 15570690,
+ 15483976, 15397053, 15309921, 15222583, 15135037, 15047285, 14959328,
+ 14871166, 14782800, 14694231, 14605460, 14516486, 14427311, 14337936,
+ 14248361, 14158587, 14068614, 13978445, 13888078, 13797515, 13706757,
+ 13615804, 13524657, 13433317, 13341785, 13250061, 13158146, 13066040,
+ 12973746, 12881262, 12788591, 12695733, 12602688, 12509457, 12416042,
+ 12322442, 12228660, 12134694, 12040547, 11946219, 11851710, 11757022,
+ 11662156, 11567111, 11471890, 11376492, 11280918, 11185170, 11089248,
+ 10993153, 10896885, 10800446, 10703836, 10607057, 10510108, 10412991,
+ 10315706, 10218255, 10120638, 10022856, 9924910, 9826800, 9728528,
+ 9630094, 9531499, 9432744, 9333830, 9234758, 9135528, 9036141, 8936599,
+ 8836901, 8737050, 8637045, 8536888, 8436579, 8336119, 8235509, 8134751,
+ 8033844, 7932790, 7831590, 7730244, 7628753, 7527119, 7425342, 7323422,
+ 7221362, 7119161, 7016821, 6914342, 6811725, 6708972, 6606083, 6503059,
+ 6399901, 6296610, 6193187, 6089632, 5985947, 5882132, 5778188, 5674117,
+ 5569919, 5465595, 5361146, 5256572, 5151876, 5047057, 4942117, 4837057,
+ 4731877, 4626579, 4521163, 4415630, 4309981, 4204218, 4098340, 3992350,
+ 3886248, 3780034, 3673711, 3567278, 3460737, 3354088, 3247334, 3140473,
+ 3033509, 2926440, 2819270, 2711997, 2604624, 2497152, 2389580, 2281911,
+ 2174145, 2066283, 1958327, 1850276, 1742133, 1633897, 1525571, 1417155,
+ 1308649, 1200056, 1091375, 982609, 873757, 764821, 655803, 546702,
+ 437519, 328257, 218916, 109496, 0, -109572, -219220, -328943, -438738,
+ -548606, -658544, -768553, -878631, -988778, -1098991, -1209270,
+ -1319615, -1430024, -1540495, -1651029, -1761624, -1872279, -1982993,
+ -2093765, -2204593, -2315478, -2426418, -2537411, -2648458, -2759556,
+ -2870705, -2981904, -3093152, -3204447, -3315789, -3427177, -3538609,
+ -3650085, -3761603, -3873163, -3984763, -4096403, -4208081, -4319796,
+ -4431547, -4543334, -4655155, -4767009, -4878895, -4990813, -5102760,
+ -5214736, -5326740, -5438770, -5550827, -5662908, -5775013, -5887140,
+ -5999289, -6111458, -6223647, -6335854, -6448078, -6560319, -6672575,
+ -6784844, -6897127, -7009422, -7121727, -7234043, -7346367, -7458698,
+ -7571037, -7683380, -7795729, -7908080, -8020434, -8132789, -8245145,
+ -8357499, -8469851, -8582200, -8694545, -8806885, -8919218, -9031544,
+ -9143862, -9256170, -9368467, -9480752, -9593025, -9705283, -9817527,
+ -9929755, -10041965, -10154157, -10266330, -10378482, -10490613,
+ -10602721, -10714805, -10826865, -10938898, -11050905, -11162883,
+ -11274833, -11386752, -11498639, -11610495, -11722316, -11834103,
+ -11945854, -12057569, -12169245, -12280883, -12392480, -12504036,
+ -12615549, -12727020, -12838445, -12949825, -13061159, -13172444,
+ -13283681, -13394867, -13506002, -13617085, -13728115, -13839090,
+ -13950010, -14060873, -14171679, -14282425, -14393112, -14503737,
+ -14614301, -14724801, -14835236, -14945607, -15055910, -15166146,
+ -15276314, -15386411, -15496437, -15606392, -15716273, -15826079,
+ -15935811, -16045466, -16155043, -16264542, -16373960, -16483298,
+ -16592554, -16701726, -16810815, -16919818, -17028735, -17137564,
+ -17246304, -17354955, -17463515, -17571982, -17680357, -17788638,
+ -17896823, -18004912, -18112904, -18220797, -18328590, -18436282,
+ -18543873, -18651360, -18758744, -18866022, -18973194, -19080259,
+ -19187215, -19294062, -19400797, -19507421, -19613933, -19720330,
+ -19826612, -19932778, -20038827, -20144757, -20250568, -20356258,
+ -20461826, -20567272, -20672594, -20777791, -20882862, -20987806,
+ -21092621, -21197307, -21301863, -21406287, -21510579, -21614737,
+ -21718760, -21822648, -21926398, -22030010, -22133483, -22236816,
+ -22340008, -22443057, -22545963, -22648724, -22751339, -22853808,
+ -22956129, -23058301, -23160323, -23262194, -23363913, -23465478,
+ -23566890, -23668146, -23769245, -23870187, -23970970, -24071594,
+ -24172057, -24272358, -24372496, -24472470, -24572279, -24671922,
+ -24771397, -24870705, -24969843, -25068811, -25167607, -25266231,
+ -25364681, -25462957, -25561057, -25658980, -25756725, -25854291,
+ -25951678, -26048883, -26145906, -26242747, -26339403, -26435873,
+ -26532158, -26628255, -26724164, -26819884, -26915413, -27010750,
+ -27105895, -27200846, -27295603, -27390164, -27484528, -27578695,
+ -27672662, -27766430, -27859997, -27953362, -28046524, -28139483,
+ -28232236, -28324783, -28417123, -28509255, -28601178, -28692890,
+ -28784392, -28875681, -28966758, -29057619, -29148266, -29238697,
+ -29328910, -29418905, -29508680, -29598236, -29687570, -29776681,
+ -29865570, -29954234, -30042672, -30130885, -30218870, -30306627,
+ -30394154, -30481451, -30568517, -30655350, -30741950, -30828316,
+ -30914447, -31000341, -31085998, -31171417, -31256596, -31341536,
+ -31426234, -31510690, -31594903, -31678872, -31762595, -31846073,
+ -31929304, -32012286, -32095020, -32177504, -32259737, -32341718,
+ -32423447, -32504922, -32586142, -32667106, -32747814, -32828264,
+ -32908456, -32988388, -33068060, -33147471, -33226619, -33305505,
+ -33384126, -33462482, -33540572, -33618395, -33695950, -33773237,
+ -33850254, -33927000, -34003475, -34079677, -34155606, -34231260,
+ -34306640, -34381743, -34456569, -34531118, -34605387, -34679377,
+ -34753086, -34826514, -34899659, -34972521, -35045098, -35117391,
+ -35189398, -35261117, -35332549, -35403693, -35474547, -35545110,
+ -35615383, -35685363, -35755050, -35824443, -35893542, -35962345,
+ -36030851, -36099060, -36166971, -36234583, -36301895, -36368907,
+ -36435617, -36502024, -36568128, -36633928, -36699424, -36764613,
+ -36829496, -36894071, -36958338, -37022296, -37085945, -37149282,
+ -37212308, -37275021, -37337422, -37399508, -37461280, -37522736,
+ -37583875, -37644698, -37705202, -37765388, -37825254, -37884800,
+ -37944024, -38002927, -38061506, -38119763, -38177695, -38235302,
+ -38292583, -38349537, -38406164, -38462463, -38518433, -38574074,
+ -38629384, -38684362, -38739009, -38793323, -38847304, -38900951,
+ -38954262, -39007238, -39059878, -39112181, -39164145, -39215771,
+ -39267058, -39318005, -39368611, -39418876, -39468798, -39518378,
+ -39567614, -39616505, -39665052, -39713253, -39761108, -39808615,
+ -39855775, -39902587, -39949049, -39995161, -40040923, -40086334,
+ -40131393, -40176099, -40220452, -40264451, -40308096, -40351386,
+ -40394319, -40436897, -40479117, -40520979, -40562483, -40603628,
+ -40644413, -40684838, -40724902, -40764604, -40803944, -40842922,
+ -40881535, -40919785, -40957670, -40995190, -41032344, -41069131,
+ -41105551, -41141604, -41177288, -41212603, -41247549, -41282125,
+ -41316330, -41350164, -41383626, -41416715, -41449432, -41481775,
+ -41513744, -41545339, -41576558, -41607402, -41637869, -41667960,
+ -41697673, -41727008, -41755965, -41784542, -41812741, -41840559,
+ -41867996, -41895053, -41921728, -41948020, -41973930, -41999457,
+ -42024601, -42049360, -42073735, -42097724, -42121328, -42144545,
+ -42167377, -42189821, -42211877, -42233545, -42254825, -42275716,
+ -42296218, -42316330, -42336051, -42355381, -42374321, -42392868,
+ -42411024, -42428787, -42446157, -42463133, -42479716, -42495904,
+ -42511698, -42527096, -42542099, -42556706, -42570917, -42584731,
+ -42598147, -42611166, -42623788, -42636010, -42647834, -42659259,
+ -42670285, -42680911, -42691136, -42700961, -42710384, -42719407,
+ -42728028, -42736246, -42744063, -42751476, -42758487, -42765094,
+ -42771297, -42777097, -42782491, -42787481, -42792066, -42796246,
+ -42800020, -42803388, -42806350, -42808905, -42811053, -42812794,
+ -42814127, -42815052, -42815570, -42815679, -42815380, -42814671,
+ -42813554, -42812027, -42810090, -42807744, -42804987, -42801820,
+ -42798242, -42794253, -42789853, -42785041, -42779818, -42774183,
+ -42768136, -42761676, -42754804, -42747520, -42739822, -42731711,
+ -42723187, -42714249, -42704897, -42695132, -42684952, -42674358,
+ -42663350, -42651927, -42640089, -42627836, -42615168, -42602085,
+ -42588586, -42574671, -42560341, -42545595, -42530433, -42514854,
+ -42498860, -42482448, -42465621, -42448376, -42430715, -42412637,
+ -42394142, -42375230, -42355900, -42336153, -42315989, -42295407,
+ -42274408, -42252991, -42231156, -42208904, -42186233, -42163145,
+ -42139639, -42115714, -42091372, -42066611, -42041432, -42015835,
+ -41989820, -41963386, -41936534, -41909264, -41881575, -41853468,
+ -41824942, -41795998, -41766636, -41736855, -41706655, -41676038,
+ -41645002, -41613547, -41581674, -41549383, -41516673, -41483546,
+ -41450000, -41416035, -41381653, -41346852, -41311634, -41275997,
+ -41239943, -41203470, -41166580, -41129272, -41091546, -41053403,
+ -41014842, -40975864, -40936469, -40896656, -40856426, -40815780,
+ -40774716, -40733235, -40691338, -40649024, -40606294, -40563148,
+ -40519585, -40475607, -40431212, -40386402, -40341176, -40295535,
+ -40249478, -40203007, -40156120, -40108819, -40061103, -40012972,
+ -39964427, -39915469, -39866096, -39816310, -39766110, -39715497,
+ -39664471, -39613032, -39561181, -39508917, -39456241, -39403153,
+ -39349653, -39295741, -39241419, -39186685, -39131541, -39075986,
+ -39020021, -38963646, -38906861, -38849667, -38792063, -38734051,
+ -38675630, -38616801, -38557563, -38497918, -38437865, -38377406,
+ -38316539, -38255266, -38193587, -38131501, -38069010, -38006114,
+ -37942813, -37879107, -37814997, -37750484, -37685566, -37620246,
+ -37554522, -37488396, -37421868, -37354938, -37287607, -37219874,
+ -37151741, -37083208, -37014275, -36944942, -36875211, -36805080,
+ -36734552, -36663625, -36592301, -36520580, -36448463, -36375949,
+ -36303039, -36229734, -36156034, -36081940, -36007452, -35932570,
+ -35857295, -35781627, -35705567, -35629116, -35552273, -35475039,
+ -35397415, -35319402, -35240999, -35162207, -35083026, -35003458,
+ -34923503, -34843160, -34762432, -34681317, -34599818, -34517933,
+ -34435664, -34353012, -34269976, -34186558, -34102757, -34018575,
+ -33934012, -33849068, -33763745, -33678042, -33591961, -33505501,
+ -33418664, -33331449, -33243858, -33155892, -33067549, -32978833,
+ -32889742, -32800278, -32710440, -32620231, -32529650, -32438698,
+ -32347375, -32255683, -32163621, -32071191, -31978393, -31885228,
+ -31791696, -31697799, -31603536, -31508908, -31413916, -31318561,
+ -31222844, -31126764, -31030323, -30933522, -30836360, -30738840,
+ -30640961, -30542724, -30444130, -30345179, -30245873, -30146212,
+ -30046196, -29945827, -29845105, -29744031, -29642605, -29540829,
+ -29438703, -29336228, -29233404, -29130233, -29026714, -28922850,
+ -28818640, -28714086, -28609187, -28503946, -28398362, -28292437,
+ -28186171, -28079565, -27972620, -27865337, -27757716, -27649758,
+ -27541465, -27432836, -27323873, -27214576, -27104947, -26994986,
+ -26884694, -26774071, -26663120, -26551840, -26440232, -26328297,
+ -26216037, -26103451, -25990541, -25877308, -25763752, -25649875,
+ -25535677, -25421159, -25306322, -25191167, -25075694, -24959906,
+ -24843802, -24727383, -24610651, -24493606, -24376249, -24258581,
+ -24140604, -24022317, -23903723, -23784821, -23665612, -23546099,
+ -23426281, -23306160, -23185736, -23065010, -22943985, -22822659,
+ -22701035, -22579113, -22456894, -22334380, -22211570, -22088467,
+ -21965072, -21841384, -21717405, -21593137, -21468580, -21343734,
+ -21218602, -21093185, -20967482, -20841495, -20715226, -20588675,
+ -20461843, -20334731, -20207341, -20079673, -19951728, -19823508,
+ -19695013, -19566245, -19437204, -19307891, -19178309, -19048457,
+ -18918337, -18787949, -18657296, -18526377, -18395195, -18263750,
+ -18132043, -18000075, -17867848, -17735362, -17602618, -17469619,
+ -17336364, -17202855, -17069093, -16935079, -16800814, -16666300,
+ -16531537, -16396526, -16261270, -16125768, -15990022, -15854033,
+ -15717803, -15581332, -15444621, -15307672, -15170486, -15033064,
+ -14895407, -14757516, -14619393, -14481039, -14342454, -14203640,
+ -14064599, -13925330, -13785836, -13646118, -13506177, -13366014,
+ -13225630, -13085027, -12944205, -12803166, -12661911, -12520442,
+ -12378759, -12236863, -12094757, -11952441, -11809916, -11667183,
+ -11524245, -11381101, -11237754, -11094204, -10950453, -10806502,
+ -10662352, -10518005, -10373461, -10228723, -10083790, -9938665,
+ -9793349, -9647843, -9502148, -9356266, -9210198, -9063944, -8917507,
+ -8770888, -8624087, -8477107, -8329949, -8182613, -8035101, -7887414,
+ -7739554, -7591523, -7443320, -7294948, -7146408, -6997701, -6848828,
+ -6699792, -6550592, -6401231, -6251710, -6102030, -5952192, -5802198,
+ -5652049, -5501747, -5351292, -5200686, -5049931, -4899027, -4747977,
+ -4596781, -4445441, -4293958, -4142334, -3990569, -3838666, -3686625,
+ -3534448, -3382137, -3229692, -3077115, -2924408, -2771571, -2618607,
+ -2465516, -2312300, -2158961, -2005499, -1851916, -1698214, -1544394,
+ -1390456, -1236404, -1082238, -927959, -773568, -619068, -464460,
+ -309745, -154924, 0, 155027, 310156, 465385, 620712, 776136, 931656,
+ 1087270, 1242977, 1398775, 1554663, 1710639, 1866703, 2022852, 2179085,
+ 2335401, 2491799, 2648276, 2804832, 2961464, 3118173, 3274955, 3431810,
+ 3588736, 3745732, 3902796, 4059926, 4217123, 4374383, 4531705, 4689089,
+ 4846532, 5004033, 5161590, 5319203, 5476869, 5634588, 5792357, 5950175,
+ 6108041, 6265954, 6423911, 6581911, 6739954, 6898036, 7056158, 7214316,
+ 7372511, 7530740, 7689002, 7847296, 8005619, 8163971, 8322349, 8480753,
+ 8639181, 8797632, 8956103, 9114594, 9273103, 9431628, 9590168, 9748721,
+ 9907287, 10065862, 10224447, 10383039, 10541637, 10700240, 10858845,
+ 11017451, 11176057, 11334662, 11493264, 11651860, 11810451, 11969033,
+ 12127607, 12286169, 12444719, 12603256, 12761777, 12920281, 13078766,
+ 13237232, 13395676, 13554097, 13712494, 13870864, 14029207, 14187521,
+ 14345804, 14504055, 14662272, 14820453, 14978598, 15136705, 15294772,
+ 15452797, 15610780, 15768718, 15926609, 16084454, 16242249, 16399993,
+ 16557686, 16715324, 16872908, 17030434, 17187902, 17345310, 17502657,
+ 17659941, 17817160, 17974313, 18131399, 18288415, 18445361, 18602234,
+ 18759034, 18915758, 19072405, 19228974, 19385462, 19541870, 19698194,
+ 19854433, 20010586, 20166652, 20322628, 20478514, 20634306, 20790005,
+ 20945609, 21101115, 21256523, 21411831, 21567037, 21722140, 21877138,
+ 22032029, 22186813, 22341487, 22496050, 22650501, 22804838, 22959059,
+ 23113162, 23267147, 23421012, 23574755, 23728375, 23881869, 24035237,
+ 24188477, 24341587, 24494567, 24647413, 24800125, 24952702, 25105141,
+ 25257441, 25409601, 25561619, 25713494, 25865223, 26016806, 26168240,
+ 26319525, 26470659, 26621640, 26772466, 26923137, 27073650, 27224004,
+ 27374198, 27524230, 27674098, 27823801, 27973337, 28122706, 28271904,
+ 28420931, 28569786, 28718466, 28866970, 29015296, 29163444, 29311412,
+ 29459197, 29606799, 29754215, 29901445, 30048487, 30195340, 30342001,
+ 30488469, 30634743, 30780822, 30926703, 31072385, 31217867, 31363147,
+ 31508224, 31653096, 31797761, 31942218, 32086466, 32230503, 32374328,
+ 32517939, 32661334, 32804512, 32947471, 33090211, 33232728, 33375023,
+ 33517094, 33658938, 33800554, 33941942, 34083099, 34224024, 34364715,
+ 34505172, 34645391, 34785373, 34925115, 35064616, 35203875, 35342889,
+ 35481658, 35620180, 35758453, 35896477, 36034249, 36171768, 36309033,
+ 36446042, 36582793, 36719286, 36855518, 36991489, 37127196, 37262638,
+ 37397815, 37532723, 37667363, 37801732, 37935829, 38069652, 38203200,
+ 38336472, 38469466, 38602181, 38734615, 38866767, 38998635, 39130218,
+ 39261514, 39392522, 39523241, 39653669, 39783805, 39913647, 40043194,
+ 40172444, 40301396, 40430048, 40558400, 40686449, 40814195, 40941635,
+ 41068769, 41195595, 41322111, 41448317, 41574210, 41699790, 41825054,
+ 41950002, 42074633, 42198944, 42322934, 42446603, 42569948, 42692968,
+ 42815661, 42938028, 43060065, 43181772, 43303147, 43424189, 43544897,
+ 43665269, 43785303, 43904999, 44024355, 44143370, 44262041, 44380369,
+ 44498352, 44615987, 44733275, 44850213, 44966800, 45083036, 45198917,
+ 45314444, 45429615, 45544428, 45658882, 45772977, 45886709, 46000079,
+ 46113085, 46225726, 46337999, 46449905, 46561441, 46672607, 46783400,
+ 46893820, 47003866, 47113536, 47222829, 47331743, 47440277, 47548430,
+ 47656201, 47763589, 47870591, 47977208, 48083437, 48189277, 48294727,
+ 48399787, 48504453, 48608726, 48712604, 48816086, 48919170, 49021855,
+ 49124141, 49226025, 49327507, 49428585, 49529259, 49629526, 49729385,
+ 49828837, 49927878, 50026509, 50124727, 50222531, 50319922, 50416896,
+ 50513453, 50609592, 50705312, 50800611, 50895488, 50989943, 51083973,
+ 51177578, 51270756, 51363507, 51455828, 51547720, 51639181, 51730209,
+ 51820804, 51910965, 52000689, 52089977, 52178827, 52267237, 52355208,
+ 52442736, 52529823, 52616465, 52702663, 52788415, 52873720, 52958577,
+ 53042984, 53126942, 53210447, 53293501, 53376100, 53458246, 53539935,
+ 53621167, 53701942, 53782258, 53862113, 53941508, 54020440, 54098909,
+ 54176914, 54254453, 54331526, 54408132, 54484269, 54559937, 54635134,
+ 54709860, 54784113, 54857892, 54931197, 55004027, 55076379, 55148255,
+ 55219651, 55290568, 55361005, 55430959, 55500432, 55569420, 55637925,
+ 55705943, 55773476, 55840521, 55907077, 55973144, 56038721, 56103807,
+ 56168401, 56232501, 56296108, 56359219, 56421835, 56483954, 56545575,
+ 56606697, 56667320, 56727442, 56787064, 56846182, 56904798, 56962910,
+ 57020517, 57077618, 57134212, 57190299, 57245877, 57300947, 57355506,
+ 57409554, 57463090, 57516113, 57568624, 57620619, 57672100, 57723064,
+ 57773512, 57823442, 57872854, 57921746, 57970118, 58017970, 58065300,
+ 58112107, 58158391, 58204151, 58249386, 58294096, 58338279, 58381935,
+ 58425063, 58467663, 58509733, 58551273, 58592282, 58632760, 58672705,
+ 58712117, 58750995, 58789339, 58827148, 58864420, 58901156, 58937355,
+ 58973016, 59008138, 59042720, 59076762, 59110264, 59143224, 59175642,
+ 59207517, 59238849, 59269637, 59299880, 59329577, 59358729, 59387334,
+ 59415391, 59442901, 59469862, 59496274, 59522137, 59547449, 59572209,
+ 59596419, 59620076, 59643181, 59665732, 59687729, 59709172, 59730060,
+ 59750392, 59770168, 59789388, 59808050, 59826154, 59843700, 59860688,
+ 59877115, 59892983, 59908291, 59923038, 59937223, 59950846, 59963907,
+ 59976405, 59988340, 59999710, 60010517, 60020758, 60030435, 60039545,
+ 60048089, 60056067, 60063478, 60070321, 60076596, 60082302, 60087440,
+ 60092009, 60096007, 60099436, 60102295, 60104582, 60106298, 60107443,
+ 60108015, 60108015, 60107443, 60106297, 60104577, 60102284, 60099417,
+ 60095975, 60091958, 60087366, 60082198, 60076454, 60070134, 60063238,
+ 60055765, 60047714, 60039086, 60029881, 60020097, 60009735, 59998794,
+ 59987275, 59975176, 59962499, 59949241, 59935404, 59920986, 59905988,
+ 59890409, 59874250, 59857509, 59840188, 59822284, 59803799, 59784732,
+ 59765083, 59744852, 59724038, 59702642, 59680662, 59658100, 59634955,
+ 59611226, 59586914, 59562018, 59536538, 59510475, 59483827, 59456595,
+ 59428779, 59400379, 59371394, 59341824, 59311670, 59280931, 59249607,
+ 59217698, 59185204, 59152125, 59118461, 59084212, 59049377, 59013957,
+ 58977951, 58941361, 58904184, 58866423, 58828075, 58789143, 58749624,
+ 58709520, 58668831, 58627556, 58585696, 58543250, 58500219, 58456602,
+ 58412400, 58367613, 58322240, 58276282, 58229739, 58182611, 58134898,
+ 58086599, 58037716, 57988248, 57938196, 57887558, 57836336, 57784530,
+ 57732140, 57679165, 57625606, 57571464, 57516737, 57461427, 57405534,
+ 57349057, 57291997, 57234354, 57176128, 57117319, 57057928, 56997955,
+ 56937400, 56876262, 56814543, 56752243, 56689361, 56625899, 56561855,
+ 56497231, 56432027, 56366242, 56299878, 56232934, 56165411, 56097308,
+ 56028627, 55959368, 55889530, 55819114, 55748121, 55676550, 55604403,
+ 55531678, 55458377, 55384501, 55310048, 55235020, 55159417, 55083240,
+ 55006488, 54929162, 54851262, 54772790, 54693744, 54614126, 54533935,
+ 54453173, 54371840, 54289936, 54207461, 54124417, 54040802, 53956619,
+ 53871866, 53786546, 53700657, 53614201, 53527178, 53439588, 53351432,
+ 53262711, 53173425, 53083574, 52993158, 52902180, 52810638, 52718533,
+ 52625866, 52532638, 52438849, 52344499, 52249589, 52154120, 52058091,
+ 51961505, 51864360, 51766659, 51668400, 51569586, 51470216, 51370291,
+ 51269812, 51168779, 51067193, 50965054, 50862364, 50759122, 50655330,
+ 50550987, 50446096, 50340655, 50234666, 50128130, 50021048, 49913419,
+ 49805244, 49696525, 49587262, 49477456, 49367107, 49256215, 49144783,
+ 49032810, 48920297, 48807245, 48693655, 48579527, 48464862, 48349661,
+ 48233924, 48117653, 48000848, 47883510, 47765639, 47647237, 47528304,
+ 47408841, 47288849, 47168329, 47047281, 46925706, 46803605, 46680979,
+ 46557828, 46434154, 46309958, 46185240, 46060000, 45934241, 45807962,
+ 45681165, 45553851, 45426020, 45297673, 45168812, 45039436, 44909548,
+ 44779147, 44648235, 44516813, 44384881, 44252441, 44119494, 43986040,
+ 43852080, 43717616, 43582648, 43447177, 43311204, 43174730, 43037757,
+ 42900285, 42762315, 42623848, 42484885, 42345427, 42205475, 42065031,
+ 41924094, 41782667, 41640750, 41498345, 41355451, 41212071, 41068205,
+ 40923855, 40779021, 40633705, 40487908, 40341630, 40194873, 40047638,
+ 39899926, 39751738, 39603075, 39453939, 39304330, 39154250, 39003699,
+ 38852679, 38701191, 38549236, 38396815, 38243930, 38090581, 37936770,
+ 37782498, 37627766, 37472575, 37316926, 37160821, 37004261, 36847247,
+ 36689780, 36531861, 36373492, 36214674, 36055408, 35895695, 35735537,
+ 35574934, 35413889, 35252401, 35090474, 34928107, 34765301, 34602060,
+ 34438382, 34274271, 34109727, 33944751, 33779345, 33613510, 33447247,
+ 33280558, 33113443, 32945905, 32777945, 32609563, 32440762, 32271542,
+ 32101905, 31931853, 31761386, 31590506, 31419214, 31247512, 31075401,
+ 30902883, 30729958, 30556628, 30382896, 30208761, 30034225, 29859291,
+ 29683958, 29508229, 29332106, 29155588, 28978679, 28801379, 28623690,
+ 28445612, 28267149, 28088301, 27909069, 27729455, 27549461, 27369088,
+ 27188337, 27007210, 26825708, 26643834, 26461587, 26278971, 26095986,
+ 25912634, 25728916, 25544834, 25360389, 25175584, 24990419, 24804896,
+ 24619016, 24432782, 24246194, 24059255, 23871965, 23684326, 23496341,
+ 23308009, 23119334, 22930316, 22740958, 22551260, 22361225, 22170853,
+ 21980147, 21789108, 21597738, 21406038, 21214010, 21021656, 20828977,
+ 20635974, 20442651, 20249007, 20055045, 19860766, 19666172, 19471265,
+ 19276047, 19080518, 18884681, 18688537, 18492088, 18295336, 18098282,
+ 17900928, 17703276, 17505327, 17307084, 17108547, 16909719, 16710601,
+ 16511194, 16311502, 16111524, 15911264, 15710723, 15509902, 15308803,
+ 15107428, 14905780, 14703858, 14501666, 14299205, 14096476, 13893482,
+ 13690224, 13486704, 13282924, 13078886, 12874591, 12670041, 12465238,
+ 12260183, 12054880, 11849328, 11643530, 11437489, 11231205, 11024680,
+ 10817917, 10610917, 10403682, 10196214, 9988514, 9780585, 9572428,
+ 9364045, 9155438, 8946609, 8737559, 8528291, 8318806, 8109107, 7899194,
+ 7689070, 7478737, 7268197, 7057451, 6846502, 6635351, 6424000, 6212451,
+ 6000706, 5788767, 5576636, 5364314, 5151804, 4939107, 4726225, 4513161,
+ 4299915, 4086491, 3872890, 3659114, 3445164, 3231043, 3016753, 2802296,
+ 2587673, 2372886, 2157938, 1942831, 1727565, 1512144, 1296569, 1080842,
+ 864966, 648941, 432771, 216456, 0, -216596, -433331, -650202, -867206,
+ -1084343, -1301611, -1519006, -1736528, -1954173, -2171941, -2389829,
+ -2607836, -2825958, -3044195, -3262544, -3481003, -3699570, -3918244,
+ -4137021, -4355901, -4574881, -4793959, -5013133, -5232401, -5451761,
+ -5671211, -5890749, -6110373, -6330081, -6549871, -6769740, -6989687,
+ -7209710, -7429807, -7649975, -7870213, -8090518, -8310889, -8531323,
+ -8751818, -8972373, -9192985, -9413652, -9634372, -9855144, -10075964,
+ -10296831, -10517743, -10738697, -10959692, -11180726, -11401796,
+ -11622901, -11844038, -12065205, -12286400, -12507622, -12728867,
+ -12950134, -13171421, -13392726, -13614046, -13835380, -14056725,
+ -14278079, -14499441, -14720808, -14942177, -15163548, -15384917,
+ -15606283, -15827644, -16048997, -16270340, -16491671, -16712989,
+ -16934290, -17155574, -17376837, -17598077, -17819294, -18040483,
+ -18261644, -18482774, -18703871, -18924932, -19145957, -19366942,
+ -19587885, -19808785, -20029639, -20250446, -20471202, -20691906,
+ -20912555, -21133148, -21353683, -21574157, -21794568, -22014913,
+ -22235192, -22455402, -22675540, -22895604, -23115593, -23335503,
+ -23555334, -23775083, -23994747, -24214325, -24433814, -24653213,
+ -24872518, -25091729, -25310842, -25529856, -25748768, -25967577,
+ -26186280, -26404875, -26623360, -26841733, -27059991, -27278133,
+ -27496156, -27714058, -27931837, -28149491, -28367018, -28584415,
+ -28801681, -29018813, -29235808, -29452666, -29669384, -29885959,
+ -30102389, -30318673, -30534808, -30750792, -30966622, -31182298,
+ -31397816, -31613174, -31828370, -32043403, -32258269, -32472968,
+ -32687495, -32901851, -33116031, -33330035, -33543859, -33757503,
+ -33970963, -34184238, -34397325, -34610222, -34822927, -35035438,
+ -35247754, -35459870, -35671786, -35883500, -36095009, -36306310,
+ -36517403, -36728284, -36938952, -37149405, -37359640, -37569655,
+ -37779448, -37989016, -38198359, -38407473, -38616357, -38825008,
+ -39033425, -39241604, -39449544, -39657243, -39864699, -40071909,
+ -40278872, -40485585, -40692046, -40898253, -41104204, -41309897,
+ -41515329, -41720499, -41925405, -42130043, -42334413, -42538512,
+ -42742337, -42945888, -43149161, -43352154, -43554867, -43757295,
+ -43959438, -44161293, -44362857, -44564130, -44765109, -44965791,
+ -45166175, -45366258, -45566039, -45765515, -45964684, -46163544,
+ -46362093, -46560330, -46758251, -46955855, -47153139, -47350102,
+ -47546742, -47743056, -47939042, -48134699, -48330023, -48525014,
+ -48719669, -48913986, -49107963, -49301597, -49494888, -49687832,
+ -49880427, -50072673, -50264565, -50456104, -50647285, -50838109,
+ -51028571, -51218671, -51408406, -51597774, -51786773, -51975401,
+ -52163657, -52351537, -52539041, -52726166, -52912909, -53099270,
+ -53285245, -53470833, -53656033, -53840841, -54025255, -54209275,
+ -54392898, -54576121, -54758944, -54941363, -55123377, -55304984,
+ -55486181, -55666968, -55847341, -56027300, -56206841, -56385963,
+ -56564664, -56742943, -56920796, -57098222, -57275219, -57451786,
+ -57627919, -57803618, -57978880, -58153704, -58328087, -58502027,
+ -58675523, -58848572, -59021173, -59193323, -59365022, -59536266,
+ -59707054, -59877384, -60047254, -60216662, -60385607, -60554085,
+ -60722096, -60889638, -61056709, -61223306, -61389428, -61555072,
+ -61720238, -61884924, -62049126, -62212844, -62376075, -62538819,
+ -62701072, -62862833, -63024100, -63184871, -63345145, -63504919,
+ -63664192, -63822962, -63981227, -64138986, -64296235, -64452974,
+ -64609201, -64764914, -64920111, -65074790, -65228950, -65382589,
+ -65535704, -65688295, -65840358, -65991894, -66142899, -66293372,
+ -66443311, -66592715, -66741581, -66889908, -67037695, -67184938,
+ -67331638, -67477791, -67623396, -67768452, -67912956, -68056907,
+ -68200304, -68343144, -68485425, -68627147, -68768307, -68908904,
+ -69048936, -69188401, -69327297, -69465623, -69603378, -69740559,
+ -69877164, -70013193, -70148643, -70283514, -70417802, -70551507,
+ -70684626, -70817159, -70949103, -71080458, -71211220, -71341390,
+ -71470964, -71599942, -71728322, -71856101, -71983280, -72109855,
+ -72235826, -72361191, -72485948, -72610095, -72733632, -72856556,
+ -72978867, -73100561, -73221639, -73342097, -73461936, -73581153,
+ -73699746, -73817715, -73935057, -74051771, -74167856, -74283310,
+ -74398131, -74512319, -74625871, -74738786, -74851063, -74962700,
+ -75073695, -75184048, -75293756, -75402819, -75511234, -75619001,
+ -75726118, -75832583, -75938395, -76043553, -76148055, -76251899,
+ -76355085, -76457611, -76559476, -76660677, -76761215, -76861087,
+ -76960291, -77058828, -77156694, -77253890, -77350413, -77446262,
+ -77541436, -77635933, -77729753, -77822893, -77915353, -78007131,
+ -78098226, -78188637, -78278362, -78367399, -78455749, -78543408,
+ -78630377, -78716654, -78802237, -78887126, -78971318, -79054814,
+ -79137611, -79219708, -79301104, -79381798, -79461789, -79541075,
+ -79619656, -79697529, -79774694, -79851150, -79926895, -80001929,
+ -80076249, -80149856, -80222747, -80294922, -80366379, -80437117,
+ -80507136, -80576434, -80645010, -80712862, -80779990, -80846393,
+ -80912069, -80977018, -81041237, -81104727, -81167487, -81229514,
+ -81290808, -81351368, -81411193, -81470282, -81528634, -81586248,
+ -81643122, -81699256, -81754649, -81809299, -81863207, -81916370,
+ -81968787, -82020459, -82071383, -82121559, -82170986, -82219663,
+ -82267589, -82314763, -82361184, -82406851, -82451763, -82495920,
+ -82539320, -82581963, -82623847, -82664972, -82705337, -82744941,
+ -82783783, -82821862, -82859178, -82895729, -82931515, -82966535,
+ -83000788, -83034273, -83066989, -83098936, -83130113, -83160519,
+ -83190153, -83219014, -83247103, -83274417, -83300956, -83326719,
+ -83351707, -83375917, -83399349, -83422003, -83443878, -83464972,
+ -83485286, -83504818, -83523569, -83541536, -83558721, -83575121,
+ -83590736, -83605566, -83619610, -83632867, -83645337, -83657018,
+ -83667912, -83678016, -83687330, -83695854, -83703586, -83710528,
+ -83716677, -83722033, -83726596, -83730365, -83733340, -83735520,
+ -83736904, -83737492, -83737284, -83736279, -83734476, -83731875,
+ -83728476, -83724277, -83719280, -83713482, -83706884, -83699484,
+ -83691284, -83682282, -83672477, -83661870, -83650460, -83638247,
+ -83625230, -83611408, -83596782, -83581350, -83565114, -83548071,
+ -83530223, -83511568, -83492106, -83471837, -83450761, -83428877,
+ -83406184, -83382684, -83358374, -83333256, -83307328, -83280591,
+ -83253044, -83224687, -83195519, -83165541, -83134752, -83103152,
+ -83070741, -83037518, -83003483, -82968637, -82932978, -82896507,
+ -82859224, -82821128, -82782219, -82742497, -82701962, -82660614,
+ -82618453, -82575478, -82531689, -82487087, -82441670, -82395440,
+ -82348396, -82300538, -82251865, -82202379, -82152078, -82100962,
+ -82049033, -81996289, -81942730, -81888357, -81833170, -81777168,
+ -81720351, -81662721, -81604275, -81545016, -81484942, -81424054,
+ -81362351, -81299834, -81236503, -81172358, -81107400, -81041627,
+ -80975040, -80907640, -80839426, -80770399, -80700558, -80629905,
+ -80558438, -80486158, -80413066, -80339161, -80264444, -80188914,
+ -80112573, -80035420, -79957455, -79878679, -79799091, -79718693,
+ -79637484, -79555465, -79472636, -79388996, -79304547, -79219289,
+ -79133222, -79046345, -78958661, -78870168, -78780867, -78690759,
+ -78599844, -78508122, -78415593, -78322258, -78228118, -78133172,
+ -78037421, -77940866, -77843506, -77745342, -77646375, -77546605,
+ -77446033, -77344658, -77242482, -77139504, -77035726, -76931148,
+ -76825769, -76719591, -76612615, -76504840, -76396267, -76286897,
+ -76176730, -76065767, -75954009, -75841455, -75728106, -75613963,
+ -75499027, -75383298, -75266777, -75149464, -75031359, -74912465,
+ -74792780, -74672306, -74551043, -74428993, -74306155, -74182530,
+ -74058120, -73932924, -73806943, -73680179, -73552631, -73424300,
+ -73295188, -73165295, -73034621, -72903167, -72770935, -72637924,
+ -72504136, -72369571, -72234231, -72098115, -71961225, -71823562,
+ -71685125, -71545917, -71405938, -71265189, -71123670, -70981383,
+ -70838328, -70694506, -70549918, -70404566, -70258449, -70111568,
+ -69963926, -69815522, -69666357, -69516432, -69365749, -69214309,
+ -69062111, -68909157, -68755449, -68600986, -68445771, -68289804,
+ -68133086, -67975617, -67817400, -67658435, -67498723, -67338265,
+ -67177062, -67015116, -66852426, -66688995, -66524824, -66359913,
+ -66194263, -66027876, -65860753, -65692895, -65524303, -65354978,
+ -65184921, -65014134, -64842617, -64670372, -64497399, -64323701,
+ -64149278, -63974132, -63798263, -63621672, -63444362, -63266333,
+ -63087587, -62908124, -62727946, -62547055, -62365450, -62183135,
+ -62000109, -61816375, -61631933, -61446785, -61260932, -61074376,
+ -60887118, -60699158, -60510499, -60321142, -60131087, -59940337,
+ -59748893, -59556757, -59363928, -59170410, -58976203, -58781309,
+ -58585729, -58389464, -58192516, -57994887, -57796578, -57597590,
+ -57397924, -57197583, -56996567, -56794879, -56592519, -56389489,
+ -56185791, -55981426, -55776395, -55570701, -55364344, -55157327,
+ -54949650, -54741315, -54532324, -54322678, -54112380, -53901430,
+ -53689829, -53477581, -53264686, -53051146, -52836962, -52622136,
+ -52406670, -52190565, -51973823, -51756446, -51538435, -51319793,
+ -51100519, -50880617, -50660088, -50438934, -50217156, -49994756,
+ -49771735, -49548096, -49323841, -49098970, -48873486, -48647390,
+ -48420685, -48193371, -47965451, -47736927, -47507799, -47278071,
+ -47047743, -46816819, -46585298, -46353184, -46120477, -45887181,
+ -45653296, -45418825, -45183769, -44948130, -44711911, -44475112,
+ -44237736, -43999785, -43761261, -43522165, -43282499, -43042266,
+ -42801467, -42560103, -42318178, -42075693, -41832650, -41589051,
+ -41344898, -41100192, -40854936, -40609132, -40362781, -40115886,
+ -39868449, -39620472, -39371956, -39122903, -38873317, -38623198,
+ -38372549, -38121372, -37869668, -37617440, -37364691, -37111421,
+ -36857633, -36603330, -36348512, -36093183, -35837345, -35580998,
+ -35324147, -35066792, -34808936, -34550580, -34291728, -34032381,
+ -33772542, -33512212, -33251393, -32990088, -32728299, -32466029,
+ -32203279, -31940051, -31676348, -31412171, -31147524, -30882408,
+ -30616826, -30350779, -30084270, -29817301, -29549875, -29281994,
+ -29013659, -28744873, -28475639, -28205959, -27935834, -27665268,
+ -27394262, -27122819, -26850941, -26578630, -26305889, -26032720,
+ -25759125, -25485107, -25210668, -24935810, -24660536, -24384848,
+ -24108748, -23832238, -23555322, -23278001, -23000278, -22722155,
+ -22443634, -22164719, -21885410, -21605712, -21325625, -21045153,
+ -20764298, -20483062, -20201447, -19919457, -19637094, -19354360,
+ -19071257, -18787788, -18503955, -18219761, -17935209, -17650300,
+ -17365037, -17079423, -16793461, -16507152, -16220499, -15933505,
+ -15646172, -15358503, -15070500, -14782165, -14493502, -14204513,
+ -13915200, -13625566, -13335613, -13045344, -12754761, -12463868,
+ -12172666, -11881158, -11589347, -11297235, -11004825, -10712119,
+ -10419121, -10125832, -9832255, -9538393, -9244249, -8949824, -8655122,
+ -8360146, -8064897, -7769378, -7473593, -7177544, -6881233, -6584663,
+ -6287836, -5990756, -5693425, -5395846, -5098020, -4799952, -4501644,
+ -4203097, -3904316, -3605303, -3306059, -3006589, -2706895, -2406979,
+ -2106844, -1806493, -1505928, -1205153, -904170, -602981, -301590, 0,
+ 301788, 603770, 905944, 1208307, 1510856, 1813588, 2116501, 2419592,
+ 2722858, 3026297, 3329905, 3633680, 3937619, 4241719, 4545978, 4850392,
+ 5154959, 5459677, 5764542, 6069551, 6374702, 6679992, 6985418, 7290977,
+ 7596667, 7902485, 8208427, 8514492, 8820676, 9126976, 9433390, 9739914,
+ 10046547, 10353284, 10660124, 10967063, 11274098, 11581227, 11888447,
+ 12195755, 12503149, 12810624, 13118179, 13425810, 13733515, 14041291,
+ 14349134, 14657043, 14965013, 15273043, 15581130, 15889270, 16197460,
+ 16505698, 16813981, 17122306, 17430670, 17739070, 18047504, 18355967,
+ 18664458, 18972974, 19281511, 19590067, 19898638, 20207223, 20515817,
+ 20824418, 21133024, 21441630, 21750235, 22058835, 22367428, 22676010,
+ 22984578, 23293130, 23601663, 23910173, 24218658, 24527115, 24835541,
+ 25143932, 25452287, 25760601, 26068873, 26377099, 26685276, 26993401,
+ 27301471, 27609484, 27917436, 28225324, 28533146, 28840898, 29148578,
+ 29456182, 29763707, 30071152, 30378511, 30685784, 30992966, 31300055,
+ 31607047, 31913941, 32220732, 32527417, 32833995, 33140461, 33446814,
+ 33753049, 34059164, 34365156, 34671021, 34976758, 35282363, 35587833,
+ 35893164, 36198355, 36503401, 36808301, 37113051, 37417647, 37722088,
+ 38026370, 38330490, 38634445, 38938232, 39241848, 39545290, 39848555,
+ 40151641, 40454543, 40757260, 41059788, 41362124, 41664265, 41966208,
+ 42267951, 42569489, 42870821, 43171943, 43472852, 43773545, 44074020,
+ 44374273, 44674301, 44974101, 45273670, 45573006, 45872105, 46170964,
+ 46469580, 46767951, 47066073, 47363943, 47661559, 47958917, 48256014,
+ 48552848, 48849414, 49145712, 49441736, 49737485, 50032956, 50328144,
+ 50623048, 50917665, 51211991, 51506024, 51799760, 52093196, 52386331,
+ 52679159, 52971680, 53263888, 53555783, 53847360, 54138617, 54429550,
+ 54720158, 55010436, 55300382, 55589992, 55879265, 56168196, 56456784,
+ 56745024, 57032915, 57320452, 57607633, 57894456, 58180917, 58467013,
+ 58752741, 59038099, 59323083, 59607691, 59891919, 60175764, 60459224,
+ 60742296, 61024976, 61307262, 61589152, 61870640, 62151726, 62432406,
+ 62712677, 62992537, 63271981, 63551008, 63829614, 64107797, 64385554,
+ 64662881, 64939776, 65216235, 65492257, 65767838, 66042974, 66317664,
+ 66591905, 66865693, 67139025, 67411899, 67684312, 67956260, 68227742,
+ 68498754, 68769293, 69039356, 69308941, 69578045, 69846664, 70114796,
+ 70382438, 70649587, 70916241, 71182396, 71448050, 71713199, 71977841,
+ 72241974, 72505593, 72768697, 73031283, 73293347, 73554887, 73815901,
+ 74076384, 74336335, 74595750, 74854628, 75112964, 75370756, 75628002,
+ 75884699, 76140843, 76396432, 76651464, 76905935, 77159842, 77413183,
+ 77665956, 77918157, 78169783, 78420832, 78671301, 78921188, 79170489,
+ 79419202, 79667323, 79914851, 80161783, 80408115, 80653846, 80898972,
+ 81143490, 81387398, 81630694, 81873374, 82115436, 82356877, 82597694,
+ 82837885, 83077447, 83316377, 83554673, 83792332, 84029351, 84265728,
+ 84501460, 84736544, 84970978, 85204758, 85437883, 85670350, 85902156,
+ 86133298, 86363774, 86593581, 86822716, 87051178, 87278963, 87506068,
+ 87732492, 87958231, 88183284, 88407646, 88631317, 88854292, 89076570,
+ 89298148, 89519024, 89739194, 89958657, 90177410, 90395450, 90612775,
+ 90829382, 91045268, 91260432, 91474871, 91688581, 91901562, 92113809,
+ 92325321, 92536095, 92746129, 92955420, 93163965, 93371763, 93578811,
+ 93785106, 93990646, 94195428, 94399450, 94602710, 94805205, 95006932,
+ 95207890, 95408076, 95607487, 95806121, 96003976, 96201049, 96397338,
+ 96592840, 96787553, 96981476, 97174604, 97366937, 97558471, 97749205,
+ 97939135, 98128261, 98316578, 98504086, 98690781, 98876662, 99061726,
+ 99245971, 99429394, 99611993, 99793767, 99974712, 100154826, 100334108,
+ 100512555, 100690164, 100866934, 101042862, 101217946, 101392183,
+ 101565573, 101738111, 101909797, 102080628, 102250601, 102419715,
+ 102587968, 102755357, 102921880, 103087534, 103252319, 103416231,
+ 103579269, 103741430, 103902713, 104063115, 104222633, 104381267,
+ 104539014, 104695871, 104851838, 105006911, 105161088, 105314368,
+ 105466749, 105618228, 105768803, 105918473, 106067235, 106215088,
+ 106362029, 106508056, 106653168, 106797362, 106940636, 107082989,
+ 107224419, 107364923, 107504499, 107643146, 107780862, 107917645,
+ 108053493, 108188403, 108322375, 108455406, 108587494, 108718638,
+ 108848835, 108978084, 109106383, 109233729, 109360122, 109485559,
+ 109610039, 109733559, 109856119, 109977715, 110098347, 110218012,
+ 110336709, 110454435, 110571190, 110686972, 110801778, 110915607,
+ 111028457, 111140327, 111251215, 111361118, 111470036, 111577967,
+ 111684909, 111790860, 111895819, 111999784, 112102754, 112204726,
+ 112305699, 112405672, 112504643, 112602610, 112699572, 112795527,
+ 112890473, 112984409, 113077334, 113169246, 113260143, 113350023,
+ 113438886, 113526730, 113613553, 113699353, 113784130, 113867882,
+ 113950606, 114032303, 114112970, 114192606, 114271209, 114348778,
+ 114425312, 114500809, 114575267, 114648687, 114721065, 114792400,
+ 114862692, 114931939, 115000139, 115067291, 115133395, 115198447,
+ 115262448, 115325396, 115387290, 115448127, 115507908, 115566630,
+ 115624293, 115680895, 115736436, 115790912, 115844325, 115896672,
+ 115947951, 115998163, 116047306, 116095377, 116142378, 116188305,
+ 116233159, 116276937, 116319640, 116361265, 116401811, 116441278,
+ 116479664, 116516969, 116553191, 116588328, 116622381, 116655348,
+ 116687228, 116718020, 116747723, 116776335, 116803857, 116830287,
+ 116855623, 116879865, 116903013, 116925065, 116946019, 116965876,
+ 116984634, 117002293, 117018851, 117034307, 117048661, 117061912,
+ 117074059, 117085101, 117095038, 117103867, 117111590, 117118204,
+ 117123709, 117128104, 117131389, 117133562, 117134623, 117134571,
+ 117133406, 117131126, 117127731, 117123220, 117117593, 117110849,
+ 117102986, 117094005, 117083905, 117072685, 117060344, 117046883,
+ 117032299, 117016593, 116999764, 116981811, 116962735, 116942533,
+ 116921206, 116898753, 116875174, 116850468, 116824635, 116797673,
+ 116769583, 116740364, 116710015, 116678537, 116645928, 116612189,
+ 116577318, 116541315, 116504180, 116465913, 116426513, 116385979,
+ 116344312, 116301511, 116257575, 116212505, 116166299, 116118958,
+ 116070482, 116020869, 115970120, 115918234, 115865212, 115811052,
+ 115755755, 115699321, 115641748, 115583037, 115523188, 115462201,
+ 115400075, 115336810, 115272406, 115206863, 115140180, 115072358,
+ 115003397, 114933296, 114862054, 114789674, 114716153, 114641492,
+ 114565691, 114488749, 114410668, 114331446, 114251085, 114169582,
+ 114086940, 114003158, 113918235, 113832172, 113744969, 113656626,
+ 113567143, 113476520, 113384757, 113291854, 113197812, 113102631,
+ 113006310, 112908850, 112810250, 112710512, 112609635, 112507620,
+ 112404467, 112300175, 112194745, 112088178, 111980473, 111871631,
+ 111761652, 111650537, 111538285, 111424898, 111310374, 111194715,
+ 111077921, 110959992, 110840929, 110720732, 110599401, 110476937,
+ 110353340, 110228610, 110102748, 109975755, 109847631, 109718376,
+ 109587990, 109456475, 109323830, 109190056, 109055155, 108919125,
+ 108781968, 108643684, 108504274, 108363739, 108222078, 108079293,
+ 107935383, 107790351, 107644196, 107496919, 107348520, 107199000,
+ 107048361, 106896602, 106743724, 106589728, 106434614, 106278384,
+ 106121038, 105962577, 105803001, 105642312, 105480509, 105317595,
+ 105153568, 104988432, 104822185, 104654830, 104486366, 104316796,
+ 104146118, 103974336, 103801448, 103627457, 103452363, 103276166,
+ 103098869, 102920472, 102740975, 102560380, 102378688, 102195900,
+ 102012016, 101827038, 101640967, 101453803, 101265548, 101076203,
+ 100885769, 100694246, 100501637, 100307941, 100113161, 99917297,
+ 99720351, 99522323, 99323214, 99123026, 98921761, 98719418, 98516000,
+ 98311507, 98105941, 97899303, 97691594, 97482816, 97272969, 97062055,
+ 96850075, 96637031, 96422923, 96207753, 95991523, 95774234, 95555886,
+ 95336482, 95116023, 94894509, 94671943, 94448327, 94223660, 93997945,
+ 93771183, 93543376, 93314524, 93084630, 92853695, 92621720, 92388708,
+ 92154658, 91919574, 91683455, 91446305, 91208124, 90968914, 90728677,
+ 90487414, 90245127, 90001817, 89757486, 89512135, 89265767, 89018382,
+ 88769983, 88520571, 88270147, 88018715, 87766274, 87512827, 87258376,
+ 87002922, 86746467, 86489013, 86230561, 85971114, 85710673, 85449239,
+ 85186815, 84923403, 84659004, 84393620, 84127252, 83859904, 83591576,
+ 83322271, 83051990, 82780736, 82508509, 82235313, 81961148, 81686018,
+ 81409924, 81132867, 80854850, 80575875, 80295943, 80015058, 79733220,
+ 79450432, 79166695, 78882013, 78596386, 78309817, 78022308, 77733862,
+ 77444479, 77154163, 76862915, 76570737, 76277632, 75983602, 75688649,
+ 75392774, 75095981, 74798271, 74499647, 74200111, 73899665, 73598310,
+ 73296051, 72992887, 72688823, 72383860, 72078000, 71771246, 71463601,
+ 71155065, 70845642, 70535334, 70224143, 69912072, 69599122, 69285297,
+ 68970599, 68655029, 68338591, 68021287, 67703119, 67384090, 67064201,
+ 66743457, 66421858, 66099407, 65776108, 65451961, 65126971, 64801139,
+ 64474467, 64146959, 63818617, 63489443, 63159440, 62828611, 62496957,
+ 62164482, 61831189, 61497079, 61162155, 60826420, 60489877, 60152528,
+ 59814376, 59475424, 59135673, 58795128, 58453789, 58111661, 57768746,
+ 57425047, 57080565, 56735305, 56389268, 56042458, 55694877, 55346527,
+ 54997413, 54647536, 54296899, 53945505, 53593357, 53240458, 52886810,
+ 52532417, 52177280, 51821404, 51464790, 51107442, 50749363, 50390555,
+ 50031021, 49670765, 49309789, 48948095, 48585688, 48222570, 47858743,
+ 47494212, 47128978, 46763044, 46396415, 46029092, 45661079, 45292378,
+ 44922993, 44552927, 44182183, 43810763, 43438671, 43065910, 42692483,
+ 42318392, 41943642, 41568235, 41192175, 40815463, 40438104, 40060101,
+ 39681456, 39302173, 38922255, 38541705, 38160527, 37778723, 37396296,
+ 37013250, 36629589, 36245314, 35860430, 35474940, 35088846, 34702152,
+ 34314862, 33926978, 33538504, 33149443, 32759798, 32369573, 31978771,
+ 31587395, 31195449, 30802935, 30409857, 30016219, 29622024, 29227274,
+ 28831974, 28436127, 28039736, 27642805, 27245336, 26847334, 26448801,
+ 26049742, 25650158, 25250055, 24849435, 24448302, 24046659, 23644509,
+ 23241857, 22838705, 22435056, 22030916, 21626286, 21221170, 20815573,
+ 20409497, 20002945, 19595922, 19188431, 18780475, 18372058, 17963184,
+ 17553856, 17144077, 16733851, 16323182, 15912074, 15500529, 15088551,
+ 14676145, 14263313, 13850059, 13436387, 13022301, 12607803, 12192899,
+ 11777590, 11361882, 10945777, 10529279, 10112392, 9695120, 9277466,
+ 8859434, 8441028, 8022251, 7603106, 7183599, 6763732, 6343509, 5922934,
+ 5502010, 5080742, 4659132, 4237186, 3814906, 3392296, 2969360, 2546102,
+ 2122526, 1698635, 1274433, 849924, 425111, 0, -425407, -851107,
+ -1277094, -1703366, -2129918, -2556747, -2983849, -3411219, -3838855,
+ -4266752, -4694906, -5123314, -5551971, -5980874, -6410019, -6839402,
+ -7269020, -7698867, -8128941, -8559237, -8989752, -9420481, -9851421,
+ -10282568, -10713918, -11145467, -11577211, -12009145, -12441267,
+ -12873573, -13306057, -13738717, -14171548, -14604546, -15037708,
+ -15471029, -15904505, -16338133, -16771909, -17205828, -17639886,
+ -18074080, -18508405, -18942858, -19377435, -19812131, -20246942,
+ -20681864, -21116895, -21552028, -21987261, -22422589, -22858008,
+ -23293515, -23729104, -24164773, -24600517, -25036332, -25472213,
+ -25908158, -26344162, -26780220, -27216329, -27652484, -28088682,
+ -28524918, -28961189, -29397490, -29833817, -30270166, -30706533,
+ -31142914, -31579304, -32015701, -32452098, -32888493, -33324882,
+ -33761259, -34197622, -34633966, -35070286, -35506579, -35942840,
+ -36379066, -36815252, -37251394, -37687488, -38123530, -38559516,
+ -38995441, -39431301, -39867093, -40302812, -40738453, -41174014,
+ -41609488, -42044874, -42480165, -42915358, -43350450, -43785435,
+ -44220309, -44655069, -45089710, -45524228, -45958619, -46392879,
+ -46827003, -47260987, -47694827, -48128519, -48562059, -48995442,
+ -49428664, -49861722, -50294610, -50727325, -51159862, -51592218,
+ -52024388, -52456368, -52888153, -53319740, -53751124, -54182301,
+ -54613267, -55044017, -55474548, -55904855, -56334934, -56764781,
+ -57194391, -57623760, -58052885, -58481761, -58910383, -59338747,
+ -59766850, -60194687, -60622254, -61049546, -61476559, -61903290,
+ -62329733, -62755885, -63181742, -63607299, -64032552, -64457496,
+ -64882128, -65306444, -65730439, -66154108, -66577448, -67000455,
+ -67423123, -67845450, -68267431, -68689061, -69110336, -69531253,
+ -69951806, -70371992, -70791807, -71211245, -71630304, -72048979,
+ -72467265, -72885158, -73302655, -73719750, -74136441, -74552721,
+ -74968588, -75384037, -75799064, -76213665, -76627835, -77041570,
+ -77454866, -77867719, -78280125, -78692079, -79103577, -79514615,
+ -79925189, -80335295, -80744928, -81154085, -81562760, -81970950,
+ -82378651, -82785858, -83192568, -83598775, -84004477, -84409668,
+ -84814345, -85218503, -85622138, -86025246, -86427824, -86829865,
+ -87231368, -87632326, -88032737, -88432596, -88831899, -89230641,
+ -89628819, -90026428, -90423464, -90819924, -91215802, -91611096,
+ -92005800, -92399910, -92793423, -93186334, -93578639, -93970334,
+ -94361415, -94751878, -95141719, -95530933, -95919516, -96307465,
+ -96694774, -97081441, -97467461, -97852830, -98237544, -98621598,
+ -99004989, -99387712, -99769764, -100151141, -100531837, -100911850,
+ -101291175, -101669808, -102047745, -102424982, -102801515, -103177340,
+ -103552453, -103926849, -104300525, -104673477, -105045701, -105417193,
+ -105787948, -106157962, -106527233, -106895754, -107263524, -107630537,
+ -107996790, -108362278, -108726998, -109090946, -109454117, -109816508,
+ -110178114, -110538933, -110898959, -111258189, -111616619, -111974245,
+ -112331063, -112687069, -113042259, -113396629, -113750175, -114102894,
+ -114454781, -114805833, -115156046, -115505415, -115853937, -116201608,
+ -116548424, -116894381, -117239475, -117583703, -117927061, -118269544,
+ -118611149, -118951872, -119291709, -119630657, -119968711, -120305868,
+ -120642124, -120977475, -121311917, -121645446, -121978059, -122309752,
+ -122640522, -122970363, -123299273, -123627248, -123954284, -124280377,
+ -124605524, -124929720, -125252963, -125575247, -125896571, -126216929,
+ -126536318, -126854735, -127172176, -127488637, -127804114, -128118604,
+ -128432103, -128744607, -129056113, -129366617, -129676116, -129984605,
+ -130292082, -130598542, -130903982, -131208398, -131511787, -131814145,
+ -132115469, -132415755, -132714999, -133013198, -133310348, -133606446,
+ -133901488, -134195470, -134488390, -134780243, -135071026, -135360736,
+ -135649369, -135936921, -136223390, -136508771, -136793061, -137076257,
+ -137358355, -137639352, -137919244, -138198028, -138475700, -138752257,
+ -139027696, -139302014, -139575206, -139847269, -140118201, -140387997,
+ -140656655, -140924171, -141190541, -141455763, -141719832, -141982746,
+ -142244502, -142505096, -142764524, -143022784, -143279873, -143535786,
+ -143790521, -144044074, -144296443, -144547623, -144797612, -145046407,
+ -145294004, -145540400, -145785592, -146029577, -146272351, -146513912,
+ -146754256, -146993381, -147231282, -147467957, -147703403, -147937616,
+ -148170594, -148402334, -148632832, -148862085, -149090090, -149316845,
+ -149542346, -149766590, -149989574, -150211295, -150431750, -150650936,
+ -150868850, -151085490, -151300852, -151514933, -151727730, -151939240,
+ -152149461, -152358390, -152566023, -152772357, -152977391, -153181120,
+ -153383543, -153584655, -153784455, -153982940, -154180106, -154375952,
+ -154570473, -154763668, -154955533, -155146065, -155335263, -155523123,
+ -155709643, -155894819, -156078649, -156261131, -156442261, -156622037,
+ -156800457, -156977517, -157153215, -157327548, -157500514, -157672110,
+ -157842333, -158011181, -158178651, -158344741, -158509448, -158672770,
+ -158834703, -158995246, -159154396, -159312150, -159468506, -159623461,
+ -159777013, -159929160, -160079899, -160229227, -160377142, -160523642,
+ -160668724, -160812386, -160954626, -161095440, -161234827, -161372785,
+ -161509311, -161644402, -161778057, -161910272, -162041047, -162170378,
+ -162298263, -162424700, -162549686, -162673220, -162795300, -162915922,
+ -163035085, -163152787, -163269025, -163383797, -163497102, -163608936,
+ -163719299, -163828187, -163935598, -164041531, -164145984, -164248954,
+ -164350439, -164450437, -164548947, -164645966, -164741492, -164835523,
+ -164928058, -165019093, -165108628, -165196661, -165283188, -165368210,
+ -165451722, -165533725, -165614215, -165693191, -165770652, -165846594,
+ -165921017, -165993918, -166065297, -166135150, -166203476, -166270274,
+ -166335542, -166399277, -166461479, -166522145, -166581274, -166638864,
+ -166694913, -166749420, -166802384, -166853801, -166903672, -166951994,
+ -166998765, -167043985, -167087651, -167129762, -167170316, -167209312,
+ -167246748, -167282623, -167316936, -167349684, -167380867, -167410483,
+ -167438530, -167465007, -167489913, -167513247, -167535006, -167555189,
+ -167573796, -167590824, -167606274, -167620142, -167632428, -167643130,
+ -167652248, -167659780, -167665725, -167670081, -167672848, -167674024,
+ -167673608, -167671598, -167667994, -167662795, -167655999, -167647605,
+ -167637612, -167626019, -167612825, -167598029, -167581630, -167563627,
+ -167544018, -167522803, -167499981, -167475550, -167449511, -167421861,
+ -167392600, -167361727, -167329241, -167295141, -167259427, -167222097,
+ -167183150, -167142587, -167100405, -167056604, -167011184, -166964143,
+ -166915481, -166865197, -166813290, -166759760, -166704606, -166647826,
+ -166589422, -166529391, -166467733, -166404448, -166339534, -166272992,
+ -166204821, -166135020, -166063588, -165990526, -165915831, -165839505,
+ -165761547, -165681955, -165600730, -165517871, -165433377, -165347249,
+ -165259485, -165170086, -165079051, -164986379, -164892071, -164796126,
+ -164698543, -164599322, -164498464, -164395967, -164291832, -164186058,
+ -164078644, -163969592, -163858900, -163746568, -163632597, -163516986,
+ -163399734, -163280842, -163160310, -163038138, -162914324, -162788871,
+ -162661776, -162533041, -162402665, -162270648, -162136991, -162001693,
+ -161864754, -161726174, -161585954, -161444094, -161300593, -161155452,
+ -161008670, -160860249, -160710188, -160558487, -160405147, -160250167,
+ -160093549, -159935291, -159775395, -159613861, -159450689, -159285879,
+ -159119431, -158951347, -158781626, -158610268, -158437275, -158262646,
+ -158086381, -157908482, -157728948, -157547781, -157364980, -157180547,
+ -156994480, -156806782, -156617453, -156426492, -156233902, -156039681,
+ -155843832, -155646353, -155447248, -155246514, -155044154, -154840169,
+ -154634557, -154427322, -154218462, -154007980, -153795875, -153582148,
+ -153366801, -153149833, -152931247, -152711042, -152489219, -152265780,
+ -152040724, -151814054, -151585770, -151355873, -151124363, -150891242,
+ -150656511, -150420171, -150182222, -149942666, -149701504, -149458736,
+ -149214365, -148968390, -148720813, -148471635, -148220858, -147968482,
+ -147714508, -147458938, -147201773, -146943014, -146682662, -146420719,
+ -146157185, -145892063, -145625353, -145357056, -145087174, -144815709,
+ -144542661, -144268032, -143991823, -143714036, -143434671, -143153732,
+ -142871218, -142587132, -142301474, -142014247, -141725451, -141435089,
+ -141143162, -140849671, -140554618, -140258005, -139959832, -139660103,
+ -139358818, -139055978, -138751586, -138445644, -138138153, -137829114,
+ -137518529, -137206401, -136892731, -136577520, -136260770, -135942484,
+ -135622663, -135301308, -134978423, -134654007, -134328064, -134000596,
+ -133671603, -133341089, -133009055, -132675502, -132340434, -132003851,
+ -131665756, -131326151, -130985038, -130642420, -130298297, -129952672,
+ -129605547, -129256925, -128906807, -128555195, -128202093, -127847501,
+ -127491422, -127133858, -126774812, -126414285, -126052280, -125688800,
+ -125323845, -124957420, -124589525, -124220164, -123849339, -123477051,
+ -123103304, -122728099, -122351440, -121973328, -121593766, -121212757,
+ -120830302, -120446405, -120061067, -119674292, -119286082, -118896439,
+ -118505366, -118112865, -117718939, -117323591, -116926824, -116528639,
+ -116129039, -115728028, -115325607, -114921780, -114516549, -114109917,
+ -113701887, -113292460, -112881641, -112469432, -112055836, -111640855,
+ -111224492, -110806750, -110387633, -109967142, -109545280, -109122052,
+ -108697459, -108271504, -107844190, -107415521, -106985499, -106554127,
+ -106121409, -105687346, -105251943, -104815203, -104377127, -103937720,
+ -103496984, -103054923, -102611540, -102166837, -101720818, -101273487,
+ -100824846, -100374898, -99923646, -99471095, -99017247, -98562105,
+ -98105672, -97647953, -97188949, -96728665, -96267104, -95804268,
+ -95340163, -94874789, -94408152, -93940255, -93471100, -93000692,
+ -92529033, -92056128, -91581979, -91106591, -90629965, -90152107,
+ -89673020, -89192707, -88711171, -88228417, -87744447, -87259266,
+ -86772876, -86285282, -85796488, -85306496, -84815310, -84322935,
+ -83829373, -83334629, -82838707, -82341609, -81843339, -81343902,
+ -80843302, -80341541, -79838624, -79334554, -78829336, -78322972,
+ -77815468, -77306827, -76797052, -76286148, -75774119, -75260967,
+ -74746698, -74231316, -73714823, -73197225, -72678525, -72158727,
+ -71637835, -71115853, -70592785, -70068635, -69543408, -69017107,
+ -68489736, -67961300, -67431803, -66901248, -66369640, -65836983,
+ -65303281, -64768538, -64232759, -63695947, -63158107, -62619244,
+ -62079361, -61538462, -60996552, -60453635, -59909716, -59364798,
+ -58818887, -58271985, -57724099, -57175231, -56625387, -56074570,
+ -55522785, -54970037, -54416330, -53861668, -53306056, -52749498,
+ -52191999, -51633563, -51074194, -50513898, -49952678, -49390539,
+ -48827486, -48263523, -47698654, -47132885, -46566220, -45998664,
+ -45430220, -44860894, -44290691, -43719614, -43147669, -42574860,
+ -42001192, -41426669, -40851297, -40275080, -39698022, -39120129,
+ -38541405, -37961855, -37381483, -36800295, -36218295, -35635488,
+ -35051879, -34467473, -33882274, -33296287, -32709518, -32121970,
+ -31533649, -30944560, -30354708, -29764097, -29172733, -28580620,
+ -27987763, -27394168, -26799839, -26204781, -25608999, -25012498,
+ -24415284, -23817360, -23218733, -22619407, -22019388, -21418679,
+ -20817287, -20215217, -19612473, -19009060, -18404985, -17800251,
+ -17194864, -16588829, -15982152, -15374836, -14766889, -14158314,
+ -13549117, -12939303, -12328877, -11717845, -11106212, -10493982,
+ -9881162, -9267756, -8653770, -8039209, -7424078, -6808382, -6192128,
+ -5575319, -4957962, -4340062, -3721624, -3102653, -2483155, -1863136,
+ -1242600, -621552, 0, 622053, 1244601, 1867638, 2491160, 3115160,
+ 3739634, 4364575, 4989979, 5615839, 6242150, 6868908, 7496106, 8123739,
+ 8751801, 9380286, 10009191, 10638508, 11268232, 11898358, 12528880,
+ 13159793, 13791090, 14422767, 15054818, 15687237, 16320019, 16953158,
+ 17586648, 18220484, 18854660, 19489170, 20124010, 20759172, 21394652,
+ 22030444, 22666542, 23302940, 23939634, 24576616, 25213882, 25851425,
+ 26489240, 27127322, 27765664, 28404260, 29043106, 29682194, 30321521,
+ 30961078, 31600862, 32240866, 32881084, 33521511, 34162140, 34802966,
+ 35443983, 36085186, 36726568, 37368123, 38009847, 38651732, 39293773,
+ 39935964, 40578300, 41220774, 41863381, 42506114, 43148968, 43791937,
+ 44435015, 45078196, 45721474, 46364843, 47008298, 47651832, 48295439,
+ 48939114, 49582851, 50226643, 50870484, 51514370, 52158293, 52802248,
+ 53446228, 54090229, 54734243, 55378265, 56022288, 56666308, 57310317,
+ 57954310, 58598281, 59242223, 59886131, 60529999, 61173821, 61817590,
+ 62461300, 63104946, 63748522, 64392021, 65035437, 65678765, 66321997,
+ 66965129, 67608154, 68251066, 68893858, 69536526, 70179062, 70821461,
+ 71463716, 72105822, 72747772, 73389560, 74031180, 74672626, 75313892,
+ 75954971, 76595859, 77236547, 77877031, 78517304, 79157360, 79797193,
+ 80436797, 81076165, 81715292, 82354171, 82992796, 83631161, 84269260,
+ 84907086, 85544634, 86181898, 86818870, 87455545, 88091918, 88727980,
+ 89363727, 89999153, 90634250, 91269014, 91903436, 92537513, 93171237,
+ 93804601, 94437601, 95070229, 95702480, 96334347, 96965824, 97596906,
+ 98227584, 98857855, 99487710, 100117145, 100746152, 101374726,
+ 102002860, 102630549, 103257785, 103884564, 104510878, 105136721,
+ 105762087, 106386970, 107011364, 107635262, 108258659, 108881547,
+ 109503922, 110125775, 110747103, 111367897, 111988152, 112607862,
+ 113227020, 113845620, 114463657, 115081123, 115698013, 116314320,
+ 116930038, 117545161, 118159682, 118773596, 119386896, 119999577,
+ 120611630, 121223052, 121833835, 122443972, 123053459, 123662289,
+ 124270454, 124877950, 125484770, 126090908, 126696358, 127301112,
+ 127905166, 128508513, 129111147, 129713061, 130314249, 130914706,
+ 131514424, 132113399, 132711622, 133309089, 133905793, 134501729,
+ 135096888, 135691267, 136284858, 136877655, 137469652, 138060842,
+ 138651221, 139240781, 139829516, 140417420, 141004487, 141590712,
+ 142176086, 142760605, 143344263, 143927052, 144508968, 145090003,
+ 145670152, 146249409, 146827767, 147405220, 147981762, 148557388,
+ 149132090, 149705863, 150278700, 150850597, 151421545, 151991540,
+ 152560575, 153128644, 153695741, 154261859, 154826994, 155391138,
+ 155954286, 156516431, 157077568, 157637690, 158196792, 158754866,
+ 159311908, 159867911, 160422869, 160976776, 161529626, 162081413,
+ 162632131, 163181774, 163730335, 164277809, 164824191, 165369473,
+ 165913649, 166456715, 166998663, 167539489, 168079185, 168617745,
+ 169155165, 169691438, 170226557, 170760518, 171293314, 171824938,
+ 172355386, 172884651, 173412728, 173939609, 174465290, 174989765,
+ 175513027, 176035072, 176555891, 177075481, 177593835, 178110947,
+ 178626812, 179141423, 179654774, 180166860, 180677675, 181187214,
+ 181695469, 182202436, 182708109, 183212481, 183715547, 184217302,
+ 184717739, 185216853, 185714637, 186211087, 186706196, 187199958,
+ 187692369, 188183421, 188673110, 189161429, 189648374, 190133938,
+ 190618115, 191100900, 191582287, 192062271, 192540845, 193018005,
+ 193493744, 193968057, 194440939, 194912383, 195382383, 195850936,
+ 196318034, 196783672, 197247845, 197710546, 198171772, 198631515,
+ 199089770, 199546533, 200001796, 200455555, 200907805, 201358539,
+ 201807752, 202255439, 202701595, 203146213, 203589288, 204030816,
+ 204470789, 204909204, 205346055, 205781335, 206215040, 206647165,
+ 207077703, 207506650, 207934001, 208359749, 208783890, 209206418,
+ 209627328, 210046614, 210464272, 210880295, 211294680, 211707419,
+ 212118509, 212527944, 212935718, 213341827, 213746265, 214149027,
+ 214550107, 214949502, 215347204, 215743210, 216137514, 216530111,
+ 216920996, 217310163, 217697608, 218083325, 218467310, 218849557,
+ 219230061, 219608818, 219985821, 220361067, 220734550, 221106265,
+ 221476206, 221844370, 222210751, 222575344, 222938145, 223299147,
+ 223658347, 224015739, 224371319, 224725081, 225077022, 225427134,
+ 225775415, 226121859, 226466462, 226809218, 227150122, 227489171,
+ 227826359, 228161681, 228495133, 228826709, 229156406, 229484218,
+ 229810141, 230134170, 230456300, 230776527, 231094846, 231411252,
+ 231725742, 232038309, 232348950, 232657660, 232964434, 233269268,
+ 233572158, 233873098, 234172085, 234469113, 234764179, 235057277,
+ 235348404, 235637555, 235924725, 236209910, 236493106, 236774308,
+ 237053512, 237330714, 237605909, 237879092, 238150260, 238419408,
+ 238686532, 238951628, 239214691, 239475718, 239734703, 239991642,
+ 240246533, 240499369, 240750148, 240998864, 241245515, 241490095,
+ 241732600, 241973028, 242211372, 242447630, 242681797, 242913869,
+ 243143842, 243371713, 243597477, 243821130, 244042668, 244262087,
+ 244479384, 244694555, 244907595, 245118500, 245327268, 245533893,
+ 245738373, 245940702, 246140879, 246338898, 246534756, 246728449,
+ 246919973, 247109326, 247296502, 247481499, 247664312, 247844939,
+ 248023374, 248199616, 248373659, 248545501, 248715138, 248882567,
+ 249047783, 249210784, 249371565, 249530124, 249686456, 249840559,
+ 249992429, 250142063, 250289456, 250434607, 250577511, 250718164,
+ 250856565, 250992708, 251126592, 251258213, 251387567, 251514651,
+ 251639462, 251761997, 251882253, 252000226, 252115914, 252229312,
+ 252340418, 252449230, 252555743, 252659954, 252761862, 252861462,
+ 252958751, 253053727, 253146387, 253236728, 253324746, 253410438,
+ 253493803, 253574837, 253653536, 253729899, 253803922, 253875603,
+ 253944938, 254011926, 254076563, 254138846, 254198773, 254256341,
+ 254311547, 254364389, 254414864, 254462969, 254508702, 254552060,
+ 254593041, 254631642, 254667860, 254701693, 254733139, 254762195,
+ 254788858, 254813126, 254834997, 254854468, 254871538, 254886202,
+ 254898460, 254908309, 254915746, 254920769, 254923376, 254923565,
+ 254921334, 254916680, 254909600, 254900094, 254888159, 254873792,
+ 254856991, 254837756, 254816082, 254791969, 254765414, 254736415,
+ 254704971, 254671079, 254634737, 254595943, 254554697, 254510994,
+ 254464835, 254416216, 254365137, 254311594, 254255587, 254197114,
+ 254136173, 254072762, 254006879, 253938524, 253867693, 253794386,
+ 253718601, 253640336, 253559590, 253476361, 253390647, 253302448,
+ 253211761, 253118585, 253022919, 252924761, 252824110, 252720964,
+ 252615322, 252507183, 252396545, 252283407, 252167768, 252049626,
+ 251928981, 251805830, 251680173, 251552009, 251421336, 251288153,
+ 251152459, 251014254, 250873535, 250730302, 250584555, 250436290,
+ 250285509, 250132210, 249976391, 249818053, 249657194, 249493812,
+ 249327909, 249159481, 248988530, 248815053, 248639050, 248460521,
+ 248279464, 248095879, 247909765, 247721122, 247529949, 247336245,
+ 247140010, 246941242, 246739943, 246536110, 246329744, 246120843,
+ 245909409, 245695439, 245478934, 245259893, 245038316, 244814202,
+ 244587552, 244358364, 244126639, 243892377, 243655576, 243416237,
+ 243174359, 242929944, 242682989, 242433495, 242181463, 241926891,
+ 241669780, 241410130, 241147941, 240883212, 240615944, 240346138,
+ 240073792, 239798906, 239521483, 239241520, 238959018, 238673979,
+ 238386401, 238096285, 237803631, 237508439, 237210711, 236910446,
+ 236607644, 236302305, 235994432, 235684022, 235371078, 235055599,
+ 234737586, 234417040, 234093960, 233768348, 233440204, 233109529,
+ 232776323, 232440587, 232102322, 231761528, 231418205, 231072356,
+ 230723980, 230373078, 230019651, 229663700, 229305226, 228944229,
+ 228580711, 228214672, 227846113, 227475036, 227101440, 226725328,
+ 226346701, 225965558, 225581902, 225195733, 224807053, 224415863,
+ 224022164, 223625956, 223227243, 222826023, 222422300, 222016073,
+ 221607345, 221196117, 220782389, 220366165, 219947444, 219526228,
+ 219102519, 218676319, 218247628, 217816448, 217382781, 216946628,
+ 216507991, 216066872, 215623272, 215177193, 214728636, 214277604,
+ 213824097, 213368118, 212909669, 212448751, 211985366, 211519515,
+ 211051202, 210580427, 210107193, 209631502, 209153355, 208672754,
+ 208189702, 207704201, 207216252, 206725858, 206233021, 205737742,
+ 205240025, 204739871, 204237282, 203732261, 203224810, 202714931,
+ 202202626, 201687899, 201170750, 200651183, 200129200, 199604803,
+ 199077994, 198548777, 198017154, 197483127, 196946698, 196407871,
+ 195866647, 195323030, 194777022, 194228626, 193677844, 193124679,
+ 192569133, 192011211, 191450913, 190888244, 190323205, 189755800,
+ 189186032, 188613903, 188039416, 187462575, 186883382, 186301840,
+ 185717952, 185131722, 184543151, 183952244, 183359004, 182763433,
+ 182165534, 181565312, 180962768, 180357907, 179750731, 179141244,
+ 178529449, 177915349, 177298948, 176680248, 176059254, 175435969,
+ 174810396, 174182539, 173552400, 172919984, 172285295, 171648335,
+ 171009108, 170367617, 169723867, 169077861, 168429603, 167779096,
+ 167126344, 166471351, 165814120, 165154656, 164492961, 163829041,
+ 163162898, 162494537, 161823961, 161151174, 160476181, 159798985,
+ 159119590, 158438000, 157754220, 157068253, 156380103, 155689775,
+ 154997272, 154302599, 153605760, 152906759, 152205600, 151502287,
+ 150796826, 150089219, 149379472, 148667588, 147953572, 147237429,
+ 146519162, 145798777, 145076277, 144351667, 143624951, 142896135,
+ 142165222, 141432218, 140697126, 139959951, 139220698, 138479372,
+ 137735977, 136990518, 136242999, 135493426, 134741803, 133988134,
+ 133232426, 132474681, 131714907, 130953106, 130189284, 129423447,
+ 128655598, 127885743, 127113887, 126340035, 125564192, 124786363,
+ 124006552, 123224766, 122441009, 121655286, 120867603, 120077964,
+ 119286376, 118492842, 117697369, 116899961, 116100624, 115299364,
+ 114496184, 113691092, 112884092, 112075190, 111264391, 110451700,
+ 109637123, 108820666, 108002333, 107182132, 106360066, 105536142,
+ 104710365, 103882741, 103053275, 102221974, 101388842, 100553886,
+ 99717111, 98878523, 98038128, 97195931, 96351939, 95506157, 94658591,
+ 93809247, 92958130, 92105248, 91250605, 90394207, 89536061, 88676173,
+ 87814549, 86951194, 86086114, 85219317, 84350807, 83480592, 82608677,
+ 81735068, 80859771, 79982794, 79104141, 78223820, 77341836, 76458196,
+ 75572906, 74685972, 73797401, 72907200, 72015374, 71121930, 70226874,
+ 69330213, 68431954, 67532102, 66630665, 65727649, 64823060, 63916906,
+ 63009192, 62099925, 61189112, 60276760, 59362875, 58447463, 57530533,
+ 56612090, 55692141, 54770693, 53847753, 52923327, 51997423, 51070047,
+ 50141206, 49210907, 48279157, 47345963, 46411332, 45475270, 44537786,
+ 43598885, 42658575, 41716863, 40773756, 39829261, 38883385, 37936135,
+ 36987519, 36037543, 35086216, 34133543, 33179532, 32224191, 31267527,
+ 30309547, 29350258, 28389667, 27427783, 26464612, 25500161, 24534439,
+ 23567452, 22599208, 21629714, 20658979, 19687008, 18713811, 17739393,
+ 16763764, 15786930, 14808899, 13829678, 12849276, 11867700, 10884957,
+ 9901055, 8916002, 7929806, 6942474, 5954014, 4964433, 3973740, 2981943,
+ 1989048, 995064, 0, -996138, -1993342, -2991603, -3990914, -4991267,
+ -5992654, -6995066, -7998497, -9002937, -10008380, -11014816,
+ -12022238, -13030638, -14040007, -15050338, -16061623, -17073853,
+ -18087020, -19101116, -20116133, -21132063, -22148897, -23166627,
+ -24185246, -25204744, -26225113, -27246346, -28268434, -29291368,
+ -30315140, -31339743, -32365166, -33391403, -34418445, -35446283,
+ -36474908, -37504313, -38534489, -39565428, -40597120, -41629558,
+ -42662733, -43696636, -44731259, -45766594, -46802631, -47839362,
+ -48876778, -49914872, -50953633, -51993054, -53033126, -54073841,
+ -55115188, -56157161, -57199749, -58242945, -59286739, -60331123,
+ -61376088, -62421625, -63467725, -64514380, -65561581, -66609318,
+ -67657583, -68706367, -69755662, -70805457, -71855745, -72906517,
+ -73957762, -75009473, -76061641, -77114256, -78167309, -79220792,
+ -80274696, -81329010, -82383727, -83438837, -84494331, -85550200,
+ -86606436, -87663027, -88719967, -89777245, -90834852, -91892780,
+ -92951018, -94009558, -95068391, -96127507, -97186897, -98246552,
+ -99306463, -100366620, -101427014, -102487635, -103548476, -104609525,
+ -105670774, -106732213, -107793833, -108855625, -109917580, -110979687,
+ -112041938, -113104323, -114166832, -115229457, -116292188, -117355015,
+ -118417929, -119480920, -120543980, -121607097, -122670264, -123733470,
+ -124796706, -125859962, -126923229, -127986497, -129049756, -130112998,
+ -131176212, -132239389, -133302520, -134365594, -135428601, -136491534,
+ -137554380, -138617132, -139679780, -140742312, -141804721, -142866996,
+ -143929128, -144991107, -146052922, -147114565, -148176026, -149237294,
+ -150298361, -151359216, -152419850, -153480252, -154540413, -155600324,
+ -156659973, -157719353, -158778452, -159837260, -160895769, -161953968,
+ -163011847, -164069397, -165126607, -166183468, -167239969, -168296102,
+ -169351855, -170407219, -171462185, -172516741, -173570879, -174624587,
+ -175677858, -176730679, -177783042, -178834936, -179886352, -180937278,
+ -181987707, -183037626, -184087028, -185135900, -186184234, -187232019,
+ -188279245, -189325903, -190371981, -191417471, -192462362, -193506643,
+ -194550306, -195593340, -196635734, -197677479, -198718564, -199758980,
+ -200798716, -201837762, -202876109, -203913745, -204950661, -205986847,
+ -207022293, -208056987, -209090922, -210124085, -211156467, -212188058,
+ -213218847, -214248825, -215277982, -216306306, -217333788, -218360418,
+ -219386185, -220411080, -221435092, -222458210, -223480426, -224501727,
+ -225522105, -226541549, -227560049, -228577594, -229594175, -230609781,
+ -231624401, -232638027, -233650646, -234662250, -235672827, -236682368,
+ -237690863, -238698300, -239704670, -240709963, -241714168, -242717276,
+ -243719275, -244720155, -245719906, -246718519, -247715982, -248712285,
+ -249707419, -250701372, -251694134, -252685696, -253676047, -254665176,
+ -255653074, -256639729, -257625133, -258609273, -259592141, -260573726,
+ -261554017, -262533004, -263510677, -264487026, -265462040, -266435709,
+ -267408022, -268378970, -269348542, -270316728, -271283517, -272248899,
+ -273212864, -274175402, -275136501, -276096153, -277054346, -278011071,
+ -278966316, -279920072, -280872329, -281823075, -282772301, -283719997,
+ -284666152, -285610755, -286553797, -287495267, -288435156, -289373452,
+ -290310145, -291245225, -292178682, -293110505, -294040685, -294969210,
+ -295896071, -296821258, -297744759, -298666565, -299586666, -300505051,
+ -301421709, -302336632, -303249807, -304161226, -305070878, -305978752,
+ -306884838, -307789127, -308691607, -309592269, -310491103, -311388097,
+ -312283242, -313176528, -314067944, -314957481, -315845127, -316730873,
+ -317614708, -318496623, -319376607, -320254649, -321130740, -322004870,
+ -322877028, -323747204, -324615388, -325481569, -326345738, -327207885,
+ -328067998, -328926069, -329782086, -330636040, -331487921, -332337718,
+ -333185422, -334031021, -334874507, -335715868, -336555095, -337392178,
+ -338227107, -339059870, -339890460, -340718864, -341545074, -342369079,
+ -343190869, -344010434, -344827764, -345642849, -346455678, -347266243,
+ -348074532, -348880536, -349684245, -350485648, -351284736, -352081499,
+ -352875927, -353668009, -354457737, -355245099, -356030085, -356812687,
+ -357592894, -358370696, -359146083, -359919045, -360689572, -361457655,
+ -362223283, -362986447, -363747136, -364505341, -365261052, -366014260,
+ -366764953, -367513123, -368258760, -369001853, -369742393, -370480370,
+ -371215775, -371948597, -372678827, -373406455, -374131471, -374853866,
+ -375573630, -376290752, -377005224, -377717036, -378426177, -379132639,
+ -379836411, -380537484, -381235849, -381931494, -382624412, -383314592,
+ -384002025, -384686701, -385368610, -386047743, -386724090, -387397643,
+ -388068390, -388736323, -389401432, -390063708, -390723140, -391379721,
+ -392033439, -392684286, -393332252, -393977328, -394619504, -395258771,
+ -395895120, -396528540, -397159023, -397786559, -398411139, -399032754,
+ -399651393, -400267049, -400879711, -401489370, -402096017, -402699643,
+ -403300238, -403897793, -404492299, -405083746, -405672126, -406257430,
+ -406839647, -407418769, -407994787, -408567691, -409137472, -409704122,
+ -410267631, -410827990, -411385190, -411939222, -412490077, -413037745,
+ -413582218, -414123487, -414661543, -415196377, -415727979, -416256341,
+ -416781455, -417303310, -417821898, -418337210, -418849238, -419357972,
+ -419863404, -420365525, -420864325, -421359797, -421851931, -422340718,
+ -422826151, -423308219, -423786915, -424262229, -424734154, -425202679,
+ -425667798, -426129500, -426587777, -427042622, -427494024, -427941976,
+ -428386469, -428827494, -429265043, -429699107, -430129679, -430556749,
+ -430980308, -431400349, -431816864, -432229842, -432639277, -433045160,
+ -433447483, -433846236, -434241412, -434633003, -435021000, -435405395,
+ -435786180, -436163346, -436536885, -436906790, -437273051, -437635661,
+ -437994611, -438349894, -438701501, -439049424, -439393655, -439734187,
+ -440071010, -440404117, -440733501, -441059152, -441381063, -441699227,
+ -442013635, -442324279, -442631151, -442934244, -443233549, -443529059,
+ -443820767, -444108663, -444392742, -444672993, -444949411, -445221987,
+ -445490714, -445755583, -446016588, -446273721, -446526973, -446776338,
+ -447021808, -447263375, -447501032, -447734771, -447964585, -448190467,
+ -448412408, -448630401, -448844440, -449054517, -449260623, -449462753,
+ -449660898, -449855052, -450045206, -450231355, -450413490, -450591604,
+ -450765691, -450935742, -451101752, -451263712, -451421615, -451575456,
+ -451725225, -451870917, -452012525, -452150041, -452283458, -452412770,
+ -452537969, -452659049, -452776003, -452888824, -452997505, -453102039,
+ -453202419, -453298639, -453390692, -453478572, -453562270, -453641782,
+ -453717100, -453788217, -453855127, -453917824, -453976300, -454030550,
+ -454080567, -454126343, -454167873, -454205151, -454238170, -454266923,
+ -454291404, -454311607, -454327525, -454339153, -454346483, -454349511,
+ -454348228, -454342630, -454332709, -454318461, -454299878, -454276955,
+ -454249685, -454218063, -454182082, -454141737, -454097021, -454047928,
+ -453994454, -453936590, -453874333, -453807675, -453736612, -453661136,
+ -453581244, -453496927, -453408182, -453315003, -453217382, -453115316,
+ -453008798, -452897823, -452782384, -452662478, -452538097, -452409237,
+ -452275892, -452138057, -451995726, -451848893, -451697554, -451541703,
+ -451381335, -451216445, -451047026, -450873075, -450694585, -450511552,
+ -450323970, -450131835, -449935140, -449733882, -449528055, -449317654,
+ -449102674, -448883110, -448658957, -448430210, -448196864, -447958915,
+ -447716358, -447469187, -447217399, -446960987, -446699948, -446434277,
+ -446163969, -445889020, -445609425, -445325179, -445036277, -444742716,
+ -444444491, -444141597, -443834029, -443521784, -443204857, -442883244,
+ -442556940, -442225941, -441890243, -441549841, -441204731, -440854909,
+ -440500372, -440141114, -439777131, -439408420, -439034977, -438656797,
+ -438273877, -437886212, -437493799, -437096633, -436694711, -436288029,
+ -435876584, -435460370, -435039386, -434613626, -434183087, -433747765,
+ -433307658, -432862761, -432413070, -431958582, -431499294, -431035202,
+ -430566303, -430092593, -429614068, -429130726, -428642563, -428149575,
+ -427651760, -427149114, -426641634, -426129317, -425612159, -425090157,
+ -424563309, -424031611, -423495060, -422953654, -422407388, -421856261,
+ -421300269, -420739409, -420173679, -419603076, -419027596, -418447237,
+ -417861997, -417271872, -416676861, -416076959, -415472166, -414862477,
+ -414247891, -413628405, -413004016, -412374722, -411740521, -411101410,
+ -410457387, -409808449, -409154594, -408495821, -407832125, -407163507,
+ -406489962, -405811489, -405128087, -404439752, -403746483, -403048277,
+ -402345133, -401637049, -400924023, -400206053, -399483137, -398755273,
+ -398022459, -397284694, -396541975, -395794302, -395041672, -394284084,
+ -393521536, -392754027, -391981555, -391204118, -390421715, -389634345,
+ -388842006, -388044696, -387242415, -386435161, -385622932, -384805728,
+ -383983547, -383156388, -382324250, -381487132, -380645032, -379797949,
+ -378945883, -378088833, -377226797, -376359774, -375487764, -374610766,
+ -373728778, -372841801, -371949833, -371052873, -370150921, -369243976,
+ -368332038, -367415105, -366493178, -365566255, -364634336, -363697422,
+ -362755510, -361808601, -360856694, -359899790, -358937887, -357970985,
+ -356999085, -356022185, -355040287, -354053388, -353061490, -352064593,
+ -351062696, -350055799, -349043902, -348027005, -347005109, -345978213,
+ -344946318, -343909423, -342867530, -341820637, -340768746, -339711857,
+ -338649970, -337583085, -336511203, -335434325, -334352450, -333265579,
+ -332173713, -331076853, -329974998, -328868150, -327756309, -326639476,
+ -325517652, -324390837, -323259033, -322122239, -320980458, -319833689,
+ -318681934, -317525194, -316363470, -315196762, -314025072, -312848401,
+ -311666751, -310480121, -309288514, -308091931, -306890373, -305683841,
+ -304472336, -303255861, -302034415, -300808002, -299576622, -298340277,
+ -297098968, -295852697, -294601466, -293345276, -292084128, -290818025,
+ -289546969, -288270960, -286990002, -285704095, -284413241, -283117443,
+ -281816703, -280511022, -279200402, -277884846, -276564356, -275238933,
+ -273908580, -272573299, -271233092, -269887962, -268537910, -267182940,
+ -265823052, -264458251, -263088538, -261713915, -260334386, -258949952,
+ -257560617, -256166382, -254767251, -253363226, -251954310, -250540505,
+ -249121814, -247698241, -246269787, -244836456, -243398250, -241955173,
+ -240507228, -239054417, -237596744, -236134211, -234666822, -233194579,
+ -231717487, -230235548, -228748765, -227257141, -225760681, -224259387,
+ -222753263, -221242311, -219726536, -218205941, -216680530, -215150305,
+ -213615271, -212075431, -210530789, -208981348, -207427112, -205868085,
+ -204304271, -202735673, -201162296, -199584143, -198001217, -196413524,
+ -194821067, -193223849, -191621876, -190015151, -188403677, -186787461,
+ -185166504, -183540813, -181910390, -180275241, -178635369, -176990779,
+ -175341475, -173687462, -172028743, -170365325, -168697210, -167024404,
+ -165346912, -163664737, -161977884, -160286359, -158590165, -156889308,
+ -155183793, -153473623, -151758805, -150039342, -148315240, -146586504,
+ -144853138, -143115148, -141372539, -139625316, -137873484, -136117048,
+ -134356012, -132590384, -130820167, -129045367, -127265989, -125482039,
+ -123693522, -121900444, -120102809, -118300623, -116493892, -114682622,
+ -112866817, -111046484, -109221628, -107392255, -105558371, -103719981,
+ -101877091, -100029706, -98177833, -96321478, -94460646, -92595344,
+ -90725577, -88851351, -86972673, -85089548, -83201982, -81309983,
+ -79413554, -77512704, -75607439, -73697763, -71783685, -69865209,
+ -67942343, -66015093, -64083465, -62147465, -60207101, -58262379,
+ -56313304, -54359885, -52402127, -50440037, -48473622, -46502888,
+ -44527842, -42548492, -40564843, -38576903, -36584678, -34588176,
+ -32587403, -30582366, -28573073, -26559529, -24541744, -22519722,
+ -20493472, -18463001, -16428316, -14389424, -12346332, -10299048,
+ -8247579, -6191932, -4132115, -2068135, 0, 2072283, 4148707, 6229264,
+ 8313947, 10402747, 12495658, 14592671, 16693779, 18798974, 20908249,
+ 23021595, 25139005, 27260471, 29385985, 31515539, 33649126, 35786737,
+ 37928364, 40074000, 42223636, 44377264, 46534876, 48696464, 50862019,
+ 53031534, 55205001, 57382410, 59563755, 61749025, 63938214, 66131312,
+ 68328312, 70529204, 72733981, 74942633, 77155153, 79371531, 81591760,
+ 83815830, 86043733, 88275460, 90511002, 92750351, 94993498, 97240434,
+ 99491150, 101745638, 104003888, 106265892, 108531640, 110801124,
+ 113074335, 115351264, 117631900, 119916237, 122204263, 124495971,
+ 126791351, 129090394, 131393090, 133699430, 136009405, 138323006,
+ 140640224, 142961048, 145285470, 147613479, 149945068, 152280225,
+ 154618942, 156961209, 159307016, 161656355, 164009214, 166365585,
+ 168725458, 171088822, 173455670, 175825989, 178199772, 180577007,
+ 182957686, 185341798, 187729333, 190120281, 192514633, 194912378,
+ 197313507, 199718008, 202125873, 204537091, 206951653, 209369546,
+ 211790763, 214215292, 216643123, 219074246, 221508651, 223946326,
+ 226387263, 228831451, 231278878, 233729536, 236183412, 238640498,
+ 241100782, 243564253, 246030902, 248500717, 250973689, 253449805,
+ 255929057, 258411432, 260896921, 263385513, 265877196, 268371960,
+ 270869795, 273370689, 275874631, 278381611, 280891618, 283404640,
+ 285920667, 288439688, 290961692, 293486667, 296014604, 298545489,
+ 301079313, 303616065, 306155732, 308698305, 311243771, 313792120,
+ 316343340, 318897420, 321454348, 324014114, 326576706, 329142112,
+ 331710321, 334281322, 336855103, 339431653, 342010961, 344593014,
+ 347177801, 349765310, 352355531, 354948451, 357544059, 360142343,
+ 362743291, 365346892, 367953133, 370562004, 373173492, 375787586,
+ 378404273, 381023542, 383645382, 386269779, 388896722, 391526200,
+ 394158200, 396792710, 399429719, 402069213, 404711182, 407355613,
+ 410002494, 412651813, 415303557, 417957715, 420614275, 423273223,
+ 425934549, 428598239, 431264281, 433932664, 436603375, 439276401,
+ 441951730, 444629350, 447309248, 449991412, 452675830, 455362488,
+ 458051376, 460742479, 463435786, 466131283, 468828960, 471528802,
+ 474230797, 476934933, 479641196, 482349576, 485060057, 487772629,
+ 490487278, 493203991, 495922756, 498643560, 501366390, 504091233,
+ 506818077, 509546908, 512277714, 515010482, 517745198, 520481851,
+ 523220427, 525960913, 528703295, 531447562, 534193700, 536941696,
+ 539691537, 542443209, 545196700, 547951997, 550709087, 553467955,
+ 556228590, 558990978, 561755105, 564520959, 567288527, 570057794,
+ 572828748, 575601376, 578375663, 581151598, 583929166, 586708354,
+ 589489149, 592271537, 595055505, 597841039, 600628127, 603416754,
+ 606206907, 608998573, 611791738, 614586389, 617382511, 620180092,
+ 622979118, 625779575, 628581450, 631384729, 634189399, 636995445,
+ 639802854, 642611613, 645421708, 648233124, 651045849, 653859868,
+ 656675168, 659491736, 662309556, 665128616, 667948901, 670770399,
+ 673593094, 676416973, 679242022, 682068228, 684895576, 687724053,
+ 690553644, 693384336, 696216115, 699048966, 701882876, 704717831,
+ 707553817, 710390819, 713228824, 716067817, 718907785, 721748713,
+ 724590588, 727433395, 730277121, 733121750, 735967269, 738813664,
+ 741660921, 744509025, 747357962, 750207719, 753058280, 755909631,
+ 758761760, 761614650, 764468288, 767322660, 770177751, 773033547,
+ 775890034, 778747197, 781605023, 784463496, 787322602, 790182328,
+ 793042658, 795903579, 798765076, 801627134, 804489739, 807352877,
+ 810216534, 813080694, 815945344, 818810468, 821676053, 824542084,
+ 827408547, 830275427, 833142709, 836010379, 838878423, 841746825,
+ 844615572, 847484649, 850354042, 853223735, 856093714, 858963965,
+ 861834472, 864705223, 867576201, 870447392, 873318781, 876190355,
+ 879062098, 881933996, 884806033, 887678196, 890550469, 893422839,
+ 896295290, 899167807, 902040376, 904912983, 907785612, 910658248,
+ 913530878, 916403486, 919276057, 922148578, 925021032, 927893406,
+ 930765684, 933637853, 936509896, 939381799, 942253548, 945125127,
+ 947996522, 950867719, 953738701, 956609455, 959479966, 962350218,
+ 965220197, 968089889, 970959277, 973828348, 976697087, 979565478,
+ 982433508, 985301160, 988168420, 991035274, 993901706, 996767702,
+ 999633246, 1002498324, 1005362921, 1008227022, 1011090612, 1013953676,
+ 1016816200, 1019678167, 1022539565, 1025400377, 1028260588, 1031120185,
+ 1033979151, 1036837472, 1039695133, 1042552119, 1045408415, 1048264007,
+ 1051118878, 1053973015, 1056826403, 1059679025, 1062530869, 1065381918,
+ 1068232157, 1071081573, 1073930149, 1076777870, 1079624723, 1082470692,
+ 1085315761, 1088159917, 1091003143, 1093845426, 1096686750, 1099527100,
+ 1102366461, 1105204819, 1108042158, 1110878463, 1113713720, 1116547913,
+ 1119381028, 1122213049, 1125043962, 1127873752, 1130702403, 1133529902,
+ 1136356232, 1139181379, 1142005328, 1144828063, 1147649571, 1150469837,
+ 1153288844, 1156106578, 1158923025, 1161738170, 1164551996, 1167364490,
+ 1170175637, 1172985422, 1175793829, 1178600844, 1181406452, 1184210637,
+ 1187013386, 1189814683, 1192614513, 1195412862, 1198209714, 1201005055,
+ 1203798869, 1206591142, 1209381858, 1212171004, 1214958564, 1217744523,
+ 1220528866, 1223311579, 1226092646, 1228872053, 1231649785, 1234425827,
+ 1237200164, 1239972782, 1242743665, 1245512798, 1248280168, 1251045758,
+ 1253809555, 1256571543, 1259331707, 1262090033, 1264846506, 1267601112,
+ 1270353834, 1273104660, 1275853573, 1278600559, 1281345603, 1284088691,
+ 1286829807, 1289568938, 1292306067, 1295041182, 1297774266, 1300505305,
+ 1303234285, 1305961190, 1308686006, 1311408719, 1314129313, 1316847774,
+ 1319564087, 1322278238, 1324990211, 1327699993, 1330407569, 1333112923,
+ 1335816042, 1338516911, 1341215515, 1343911839, 1346605870, 1349297591,
+ 1351986990, 1354674051, 1357358759, 1360041101, 1362721061, 1365398625,
+ 1368073779, 1370746508, 1373416797, 1376084633, 1378750000, 1381412884,
+ 1384073270, 1386731145, 1389386494, 1392039302, 1394689554, 1397337237,
+ 1399982336, 1402624837, 1405264725, 1407901986, 1410536606, 1413168569,
+ 1415797863, 1418424472, 1421048382, 1423669579, 1426288049, 1428903777,
+ 1431516749, 1434126950, 1436734368, 1439338986, 1441940792, 1444539770,
+ 1447135907, 1449729189, 1452319601, 1454907129, 1457491759, 1460073476,
+ 1462652268, 1465228119, 1467801015, 1470370943, 1472937888, 1475501836,
+ 1478062774, 1480620687, 1483175561, 1485727381, 1488276136, 1490821809,
+ 1493364387, 1495903857, 1498440204, 1500973414, 1503503474, 1506030369,
+ 1508554086, 1511074610, 1513591929, 1516106027, 1518616892, 1521124509,
+ 1523628865, 1526129946, 1528627738, 1531122227, 1533613400, 1536101243,
+ 1538585742, 1541066883, 1543544653, 1546019038, 1548490025, 1550957600,
+ 1553421749, 1555882458, 1558339715, 1560793505, 1563243816, 1565690632,
+ 1568133942, 1570573731, 1573009986, 1575442693, 1577871840, 1580297412,
+ 1582719396, 1585137779, 1587552548, 1589963688, 1592371188, 1594775032,
+ 1597175209, 1599571705, 1601964506, 1604353599, 1606738972, 1609120610,
+ 1611498500, 1613872631, 1616242987, 1618609557, 1620972326, 1623331282,
+ 1625686413, 1628037703, 1630385142, 1632728715, 1635068410, 1637404213,
+ 1639736112, 1642064093, 1644388145, 1646708253, 1649024405, 1651336588,
+ 1653644789, 1655948995, 1658249194, 1660545373, 1662837519, 1665125619,
+ 1667409660, 1669689630, 1671965516, 1674237305, 1676504985, 1678768543,
+ 1681027966, 1683283243, 1685534359, 1687781303, 1690024062, 1692262624,
+ 1694496976, 1696727106, 1698953001, 1701174649, 1703392037, 1705605153,
+ 1707813985, 1710018520, 1712218747, 1714414651, 1716606223, 1718793448,
+ 1720976316, 1723154813, 1725328928, 1727498648, 1729663961, 1731824856,
+ 1733981320, 1736133340, 1738280906, 1740424004, 1742562624, 1744696752,
+ 1746826377, 1748951487, 1751072071, 1753188116, 1755299610, 1757406541,
+ 1759508899, 1761606670, 1763699844, 1765788408, 1767872350, 1769951660,
+ 1772026325, 1774096334, 1776161675, 1778222336, 1780278306, 1782329574,
+ 1784376128, 1786417955, 1788455046, 1790487388, 1792514971, 1794537781,
+ 1796555810, 1798569044, 1800577472, 1802581084, 1804579868, 1806573812,
+ 1808562907, 1810547139, 1812526499, 1814500974, 1816470555, 1818435230,
+ 1820394987, 1822349816, 1824299705, 1826244645, 1828184623, 1830119629,
+ 1832049652, 1833974681, 1835894705, 1837809714, 1839719696, 1841624641,
+ 1843524538, 1845419376, 1847309145, 1849193834, 1851073432, 1852947929,
+ 1854817314, 1856681577, 1858540707, 1860394693, 1862243526, 1864087194,
+ 1865925687, 1867758996, 1869587108, 1871410015, 1873227706, 1875040170,
+ 1876847398, 1878649379, 1880446103, 1882237559, 1884023738, 1885804630,
+ 1887580224, 1889350510, 1891115479, 1892875121, 1894629424, 1896378381,
+ 1898121979, 1899860211, 1901593065, 1903320533, 1905042604, 1906759268,
+ 1908470516, 1910176338, 1911876725, 1913571666, 1915261153, 1916945175,
+ 1918623723, 1920296788, 1921964360, 1923626430, 1925282988, 1926934024,
+ 1928579530, 1930219496, 1931853913, 1933482771, 1935106061, 1936723775,
+ 1938335902, 1939942434, 1941543362, 1943138676, 1944728368, 1946312428,
+ 1947890847, 1949463617, 1951030728, 1952592172, 1954147940, 1955698022,
+ 1957242411, 1958781096, 1960314071, 1961841325, 1963362850, 1964878638,
+ 1966388680, 1967892967, 1969391490, 1970884242, 1972371214, 1973852396,
+ 1975327782, 1976797362, 1978261128, 1979719072, 1981171185, 1982617459,
+ 1984057887, 1985492459, 1986921167, 1988344004, 1989760961, 1991172031,
+ 1992577204, 1993976474, 1995369832, 1996757271, 1998138781, 1999514356,
+ 2000883988, 2002247669, 2003605391, 2004957146, 2006302927, 2007642725,
+ 2008976534, 2010304346, 2011626153, 2012941947, 2014251722, 2015555469,
+ 2016853181, 2018144851, 2019430472, 2020710035, 2021983535, 2023250962,
+ 2024512311, 2025767574, 2027016744, 2028259814, 2029496777, 2030727625,
+ 2031952351, 2033170949, 2034383412, 2035589732, 2036789904, 2037983919,
+ 2039171771, 2040353454, 2041528960, 2042698283, 2043861416, 2045018353,
+ 2046169086, 2047313610, 2048451918, 2049584003, 2050709859, 2051829480,
+ 2052942858, 2054049988, 2055150863, 2056245477, 2057333824, 2058415897,
+ 2059491691, 2060561199, 2061624414, 2062681332, 2063731946, 2064776249,
+ 2065814237, 2066845902, 2067871240, 2068890243, 2069902908, 2070909226,
+ 2071909194, 2072902804, 2073890052, 2074870932, 2075845438, 2076813564,
+ 2077775305, 2078730656, 2079679611, 2080622164, 2081558311, 2082488045,
+ 2083411362, 2084328257, 2085238723, 2086142755, 2087040350, 2087931501,
+ 2088816203, 2089694451, 2090566241, 2091431566, 2092290424, 2093142807,
+ 2093988712, 2094828133, 2095661066, 2096487506, 2097307449, 2098120889,
+ 2098927821, 2099728243, 2100522147, 2101309531, 2102090390, 2102864719,
+ 2103632513, 2104393769, 2105148481, 2105896646, 2106638260, 2107373317,
+ 2108101815, 2108823748, 2109539112, 2110247904, 2110950119, 2111645754,
+ 2112334804, 2113017265, 2113693133, 2114362406, 2115025078, 2115681145,
+ 2116330605, 2116973454, 2117609687, 2118239301, 2118862293, 2119478658,
+ 2120088394, 2120691497, 2121287963, 2121877789, 2122460972, 2123037508,
+ 2123607394, 2124170626, 2124727202, 2125277118, 2125820372, 2126356959,
+ 2126886877, 2127410122, 2127926693, 2128436585, 2128939797, 2129436324,
+ 2129926164, 2130409315, 2130885774, 2131355537, 2131818602, 2132274967,
+ 2132724629, 2133167585, 2133603833, 2134033369, 2134456193, 2134872301,
+ 2135281691, 2135684361, 2136080307, 2136469529, 2136852024, 2137227789,
+ 2137596822, 2137959122, 2138314686, 2138663512, 2139005598, 2139340943,
+ 2139669543, 2139991398, 2140306506, 2140614864, 2140916471, 2141211325,
+ 2141499425, 2141780769, 2142055355, 2142323181, 2142584247, 2142838550,
+ 2143086090, 2143326864, 2143560871, 2143788111, 2144008581, 2144222280,
+ 2144429208, 2144629363, 2144822743, 2145009348, 2145189177, 2145362229,
+ 2145528502, 2145687996, 2145840710, 2145986642, 2146125793, 2146258161,
+ 2146383745, 2146502545, 2146614560, 2146719790, 2146818233, 2146909890,
+ 2146994759, 2147072841, 2147144134, 2147208639, 2147266355, 2147317281,
+ 2147361418, 2147398765, 2147429322, 2147453089, 2147470065, 2147480251,
+ 2147483646, 2147480251, 2147470065, 2147453089, 2147429322, 2147398765,
+ 2147361418, 2147317281, 2147266355, 2147208639, 2147144134, 2147072841,
+ 2146994759, 2146909890, 2146818233, 2146719790, 2146614560, 2146502545,
+ 2146383745, 2146258161, 2146125793, 2145986642, 2145840710, 2145687996,
+ 2145528502, 2145362229, 2145189177, 2145009348, 2144822743, 2144629363,
+ 2144429208, 2144222280, 2144008581, 2143788111, 2143560871, 2143326864,
+ 2143086090, 2142838550, 2142584247, 2142323181, 2142055355, 2141780769,
+ 2141499425, 2141211325, 2140916471, 2140614864, 2140306506, 2139991398,
+ 2139669543, 2139340943, 2139005598, 2138663512, 2138314686, 2137959122,
+ 2137596822, 2137227789, 2136852024, 2136469529, 2136080307, 2135684361,
+ 2135281691, 2134872301, 2134456193, 2134033369, 2133603833, 2133167585,
+ 2132724629, 2132274967, 2131818602, 2131355537, 2130885774, 2130409315,
+ 2129926164, 2129436324, 2128939797, 2128436585, 2127926693, 2127410122,
+ 2126886877, 2126356959, 2125820372, 2125277118, 2124727202, 2124170626,
+ 2123607394, 2123037508, 2122460972, 2121877789, 2121287963, 2120691497,
+ 2120088394, 2119478658, 2118862293, 2118239301, 2117609687, 2116973454,
+ 2116330605, 2115681145, 2115025078, 2114362406, 2113693133, 2113017265,
+ 2112334804, 2111645754, 2110950119, 2110247904, 2109539112, 2108823748,
+ 2108101815, 2107373317, 2106638260, 2105896646, 2105148481, 2104393769,
+ 2103632513, 2102864719, 2102090390, 2101309531, 2100522147, 2099728243,
+ 2098927821, 2098120889, 2097307449, 2096487506, 2095661066, 2094828133,
+ 2093988712, 2093142807, 2092290424, 2091431566, 2090566241, 2089694451,
+ 2088816203, 2087931501, 2087040350, 2086142755, 2085238723, 2084328257,
+ 2083411362, 2082488045, 2081558311, 2080622164, 2079679611, 2078730656,
+ 2077775305, 2076813564, 2075845438, 2074870932, 2073890052, 2072902804,
+ 2071909194, 2070909226, 2069902908, 2068890243, 2067871240, 2066845902,
+ 2065814237, 2064776249, 2063731946, 2062681332, 2061624414, 2060561199,
+ 2059491691, 2058415897, 2057333824, 2056245477, 2055150863, 2054049988,
+ 2052942858, 2051829480, 2050709859, 2049584003, 2048451918, 2047313610,
+ 2046169086, 2045018353, 2043861416, 2042698283, 2041528960, 2040353454,
+ 2039171771, 2037983919, 2036789904, 2035589732, 2034383412, 2033170949,
+ 2031952351, 2030727625, 2029496777, 2028259814, 2027016744, 2025767574,
+ 2024512311, 2023250962, 2021983535, 2020710035, 2019430472, 2018144851,
+ 2016853181, 2015555469, 2014251722, 2012941947, 2011626153, 2010304346,
+ 2008976534, 2007642725, 2006302927, 2004957146, 2003605391, 2002247669,
+ 2000883988, 1999514356, 1998138781, 1996757271, 1995369832, 1993976474,
+ 1992577204, 1991172031, 1989760961, 1988344004, 1986921167, 1985492459,
+ 1984057887, 1982617459, 1981171185, 1979719072, 1978261128, 1976797362,
+ 1975327782, 1973852396, 1972371214, 1970884242, 1969391490, 1967892967,
+ 1966388680, 1964878638, 1963362850, 1961841325, 1960314071, 1958781096,
+ 1957242411, 1955698022, 1954147940, 1952592172, 1951030728, 1949463617,
+ 1947890847, 1946312428, 1944728368, 1943138676, 1941543362, 1939942434,
+ 1938335902, 1936723775, 1935106061, 1933482771, 1931853913, 1930219496,
+ 1928579530, 1926934024, 1925282988, 1923626430, 1921964360, 1920296788,
+ 1918623723, 1916945175, 1915261153, 1913571666, 1911876725, 1910176338,
+ 1908470516, 1906759268, 1905042604, 1903320533, 1901593065, 1899860211,
+ 1898121979, 1896378381, 1894629424, 1892875121, 1891115479, 1889350510,
+ 1887580224, 1885804630, 1884023738, 1882237559, 1880446103, 1878649379,
+ 1876847398, 1875040170, 1873227706, 1871410015, 1869587108, 1867758996,
+ 1865925687, 1864087194, 1862243526, 1860394693, 1858540707, 1856681577,
+ 1854817314, 1852947929, 1851073432, 1849193834, 1847309145, 1845419376,
+ 1843524538, 1841624641, 1839719696, 1837809714, 1835894705, 1833974681,
+ 1832049652, 1830119629, 1828184623, 1826244645, 1824299705, 1822349816,
+ 1820394987, 1818435230, 1816470555, 1814500974, 1812526499, 1810547139,
+ 1808562907, 1806573812, 1804579868, 1802581084, 1800577472, 1798569044,
+ 1796555810, 1794537781, 1792514971, 1790487388, 1788455046, 1786417955,
+ 1784376128, 1782329574, 1780278306, 1778222336, 1776161675, 1774096334,
+ 1772026325, 1769951660, 1767872350, 1765788408, 1763699844, 1761606670,
+ 1759508899, 1757406541, 1755299610, 1753188116, 1751072071, 1748951487,
+ 1746826377, 1744696752, 1742562624, 1740424004, 1738280906, 1736133340,
+ 1733981320, 1731824856, 1729663961, 1727498648, 1725328928, 1723154813,
+ 1720976316, 1718793448, 1716606223, 1714414651, 1712218747, 1710018520,
+ 1707813985, 1705605153, 1703392037, 1701174649, 1698953001, 1696727106,
+ 1694496976, 1692262624, 1690024062, 1687781303, 1685534359, 1683283243,
+ 1681027966, 1678768543, 1676504985, 1674237305, 1671965516, 1669689630,
+ 1667409660, 1665125619, 1662837519, 1660545373, 1658249194, 1655948995,
+ 1653644789, 1651336588, 1649024405, 1646708253, 1644388145, 1642064093,
+ 1639736112, 1637404213, 1635068410, 1632728715, 1630385142, 1628037703,
+ 1625686413, 1623331282, 1620972326, 1618609557, 1616242987, 1613872631,
+ 1611498500, 1609120610, 1606738972, 1604353599, 1601964506, 1599571705,
+ 1597175209, 1594775032, 1592371188, 1589963688, 1587552548, 1585137779,
+ 1582719396, 1580297412, 1577871840, 1575442693, 1573009986, 1570573731,
+ 1568133942, 1565690632, 1563243816, 1560793505, 1558339715, 1555882458,
+ 1553421749, 1550957600, 1548490025, 1546019038, 1543544653, 1541066883,
+ 1538585742, 1536101243, 1533613400, 1531122227, 1528627738, 1526129946,
+ 1523628865, 1521124509, 1518616892, 1516106027, 1513591929, 1511074610,
+ 1508554086, 1506030369, 1503503474, 1500973414, 1498440204, 1495903857,
+ 1493364387, 1490821809, 1488276136, 1485727381, 1483175561, 1480620687,
+ 1478062774, 1475501836, 1472937888, 1470370943, 1467801015, 1465228119,
+ 1462652268, 1460073476, 1457491759, 1454907129, 1452319601, 1449729189,
+ 1447135907, 1444539770, 1441940792, 1439338986, 1436734368, 1434126950,
+ 1431516749, 1428903777, 1426288049, 1423669579, 1421048382, 1418424472,
+ 1415797863, 1413168569, 1410536606, 1407901986, 1405264725, 1402624837,
+ 1399982336, 1397337237, 1394689554, 1392039302, 1389386494, 1386731145,
+ 1384073270, 1381412884, 1378750000, 1376084633, 1373416797, 1370746508,
+ 1368073779, 1365398625, 1362721061, 1360041101, 1357358759, 1354674051,
+ 1351986990, 1349297591, 1346605870, 1343911839, 1341215515, 1338516911,
+ 1335816042, 1333112923, 1330407569, 1327699993, 1324990211, 1322278238,
+ 1319564087, 1316847774, 1314129313, 1311408719, 1308686006, 1305961190,
+ 1303234285, 1300505305, 1297774266, 1295041182, 1292306067, 1289568938,
+ 1286829807, 1284088691, 1281345603, 1278600559, 1275853573, 1273104660,
+ 1270353834, 1267601112, 1264846506, 1262090033, 1259331707, 1256571543,
+ 1253809555, 1251045758, 1248280168, 1245512798, 1242743665, 1239972782,
+ 1237200164, 1234425827, 1231649785, 1228872053, 1226092646, 1223311579,
+ 1220528866, 1217744523, 1214958564, 1212171004, 1209381858, 1206591142,
+ 1203798869, 1201005055, 1198209714, 1195412862, 1192614513, 1189814683,
+ 1187013386, 1184210637, 1181406452, 1178600844, 1175793829, 1172985422,
+ 1170175637, 1167364490, 1164551996, 1161738170, 1158923025, 1156106578,
+ 1153288844, 1150469837, 1147649571, 1144828063, 1142005328, 1139181379,
+ 1136356232, 1133529902, 1130702403, 1127873752, 1125043962, 1122213049,
+ 1119381028, 1116547913, 1113713720, 1110878463, 1108042158, 1105204819,
+ 1102366461, 1099527100, 1096686750, 1093845426, 1091003143, 1088159917,
+ 1085315761, 1082470692, 1079624723, 1076777870, 1073930149, 1071081573,
+ 1068232157, 1065381918, 1062530869, 1059679025, 1056826403, 1053973015,
+ 1051118878, 1048264007, 1045408415, 1042552119, 1039695133, 1036837472,
+ 1033979151, 1031120185, 1028260588, 1025400377, 1022539565, 1019678167,
+ 1016816200, 1013953676, 1011090612, 1008227022, 1005362921, 1002498324,
+ 999633246, 996767702, 993901706, 991035274, 988168420, 985301160,
+ 982433508, 979565478, 976697087, 973828348, 970959277, 968089889,
+ 965220197, 962350218, 959479966, 956609455, 953738701, 950867719,
+ 947996522, 945125127, 942253548, 939381799, 936509896, 933637853,
+ 930765684, 927893406, 925021032, 922148578, 919276057, 916403486,
+ 913530878, 910658248, 907785612, 904912983, 902040376, 899167807,
+ 896295290, 893422839, 890550469, 887678196, 884806033, 881933996,
+ 879062098, 876190355, 873318781, 870447392, 867576201, 864705223,
+ 861834472, 858963965, 856093714, 853223735, 850354042, 847484649,
+ 844615572, 841746825, 838878423, 836010379, 833142709, 830275427,
+ 827408547, 824542084, 821676053, 818810468, 815945344, 813080694,
+ 810216534, 807352877, 804489739, 801627134, 798765076, 795903579,
+ 793042658, 790182328, 787322602, 784463496, 781605023, 778747197,
+ 775890034, 773033547, 770177751, 767322660, 764468288, 761614650,
+ 758761760, 755909631, 753058280, 750207719, 747357962, 744509025,
+ 741660921, 738813664, 735967269, 733121750, 730277121, 727433395,
+ 724590588, 721748713, 718907785, 716067817, 713228824, 710390819,
+ 707553817, 704717831, 701882876, 699048966, 696216115, 693384336,
+ 690553644, 687724053, 684895576, 682068228, 679242022, 676416973,
+ 673593094, 670770399, 667948901, 665128616, 662309556, 659491736,
+ 656675168, 653859868, 651045849, 648233124, 645421708, 642611613,
+ 639802854, 636995445, 634189399, 631384729, 628581450, 625779575,
+ 622979118, 620180092, 617382511, 614586389, 611791738, 608998573,
+ 606206907, 603416754, 600628127, 597841039, 595055505, 592271537,
+ 589489149, 586708354, 583929166, 581151598, 578375663, 575601376,
+ 572828748, 570057794, 567288527, 564520959, 561755105, 558990978,
+ 556228590, 553467955, 550709087, 547951997, 545196700, 542443209,
+ 539691537, 536941696, 534193700, 531447562, 528703295, 525960913,
+ 523220427, 520481851, 517745198, 515010482, 512277714, 509546908,
+ 506818077, 504091233, 501366390, 498643560, 495922756, 493203991,
+ 490487278, 487772629, 485060057, 482349576, 479641196, 476934933,
+ 474230797, 471528802, 468828960, 466131283, 463435786, 460742479,
+ 458051376, 455362488, 452675830, 449991412, 447309248, 444629350,
+ 441951730, 439276401, 436603375, 433932664, 431264281, 428598239,
+ 425934549, 423273223, 420614275, 417957715, 415303557, 412651813,
+ 410002494, 407355613, 404711182, 402069213, 399429719, 396792710,
+ 394158200, 391526200, 388896722, 386269779, 383645382, 381023542,
+ 378404273, 375787586, 373173492, 370562004, 367953133, 365346892,
+ 362743291, 360142343, 357544059, 354948451, 352355531, 349765310,
+ 347177801, 344593014, 342010961, 339431653, 336855103, 334281322,
+ 331710321, 329142112, 326576706, 324014114, 321454348, 318897420,
+ 316343340, 313792120, 311243771, 308698305, 306155732, 303616065,
+ 301079313, 298545489, 296014604, 293486667, 290961692, 288439688,
+ 285920667, 283404640, 280891618, 278381611, 275874631, 273370689,
+ 270869795, 268371960, 265877196, 263385513, 260896921, 258411432,
+ 255929057, 253449805, 250973689, 248500717, 246030902, 243564253,
+ 241100782, 238640498, 236183412, 233729536, 231278878, 228831451,
+ 226387263, 223946326, 221508651, 219074246, 216643123, 214215292,
+ 211790763, 209369546, 206951653, 204537091, 202125873, 199718008,
+ 197313507, 194912378, 192514633, 190120281, 187729333, 185341798,
+ 182957686, 180577007, 178199772, 175825989, 173455670, 171088822,
+ 168725458, 166365585, 164009214, 161656355, 159307016, 156961209,
+ 154618942, 152280225, 149945068, 147613479, 145285470, 142961048,
+ 140640224, 138323006, 136009405, 133699430, 131393090, 129090394,
+ 126791351, 124495971, 122204263, 119916237, 117631900, 115351264,
+ 113074335, 110801124, 108531640, 106265892, 104003888, 101745638,
+ 99491150, 97240434, 94993498, 92750351, 90511002, 88275460, 86043733,
+ 83815830, 81591760, 79371531, 77155153, 74942633, 72733981, 70529204,
+ 68328312, 66131312, 63938214, 61749025, 59563755, 57382410, 55205001,
+ 53031534, 50862019, 48696464, 46534876, 44377264, 42223636, 40074000,
+ 37928364, 35786737, 33649126, 31515539, 29385985, 27260471, 25139005,
+ 23021595, 20908249, 18798974, 16693779, 14592671, 12495658, 10402747,
+ 8313947, 6229264, 4148707, 2072283, 0, -2068135, -4132115, -6191932,
+ -8247579, -10299048, -12346332, -14389424, -16428316, -18463001,
+ -20493472, -22519722, -24541744, -26559529, -28573073, -30582366,
+ -32587403, -34588176, -36584678, -38576903, -40564843, -42548492,
+ -44527842, -46502888, -48473622, -50440037, -52402127, -54359885,
+ -56313304, -58262379, -60207101, -62147465, -64083465, -66015093,
+ -67942343, -69865209, -71783685, -73697763, -75607439, -77512704,
+ -79413554, -81309983, -83201982, -85089548, -86972673, -88851351,
+ -90725577, -92595344, -94460646, -96321478, -98177833, -100029706,
+ -101877091, -103719981, -105558371, -107392255, -109221628, -111046484,
+ -112866817, -114682622, -116493892, -118300623, -120102809, -121900444,
+ -123693522, -125482039, -127265989, -129045367, -130820167, -132590384,
+ -134356012, -136117048, -137873484, -139625316, -141372539, -143115148,
+ -144853138, -146586504, -148315240, -150039342, -151758805, -153473623,
+ -155183793, -156889308, -158590165, -160286359, -161977884, -163664737,
+ -165346912, -167024404, -168697210, -170365325, -172028743, -173687462,
+ -175341475, -176990779, -178635369, -180275241, -181910390, -183540813,
+ -185166504, -186787461, -188403677, -190015151, -191621876, -193223849,
+ -194821067, -196413524, -198001217, -199584143, -201162296, -202735673,
+ -204304271, -205868085, -207427112, -208981348, -210530789, -212075431,
+ -213615271, -215150305, -216680530, -218205941, -219726536, -221242311,
+ -222753263, -224259387, -225760681, -227257141, -228748765, -230235548,
+ -231717487, -233194579, -234666822, -236134211, -237596744, -239054417,
+ -240507228, -241955173, -243398250, -244836456, -246269787, -247698241,
+ -249121814, -250540505, -251954310, -253363226, -254767251, -256166382,
+ -257560617, -258949952, -260334386, -261713915, -263088538, -264458251,
+ -265823052, -267182940, -268537910, -269887962, -271233092, -272573299,
+ -273908580, -275238933, -276564356, -277884846, -279200402, -280511022,
+ -281816703, -283117443, -284413241, -285704095, -286990002, -288270960,
+ -289546969, -290818025, -292084128, -293345276, -294601466, -295852697,
+ -297098968, -298340277, -299576622, -300808002, -302034415, -303255861,
+ -304472336, -305683841, -306890373, -308091931, -309288514, -310480121,
+ -311666751, -312848401, -314025072, -315196762, -316363470, -317525194,
+ -318681934, -319833689, -320980458, -322122239, -323259033, -324390837,
+ -325517652, -326639476, -327756309, -328868150, -329974998, -331076853,
+ -332173713, -333265579, -334352450, -335434325, -336511203, -337583085,
+ -338649970, -339711857, -340768746, -341820637, -342867530, -343909423,
+ -344946318, -345978213, -347005109, -348027005, -349043902, -350055799,
+ -351062696, -352064593, -353061490, -354053388, -355040287, -356022185,
+ -356999085, -357970985, -358937887, -359899790, -360856694, -361808601,
+ -362755510, -363697422, -364634336, -365566255, -366493178, -367415105,
+ -368332038, -369243976, -370150921, -371052873, -371949833, -372841801,
+ -373728778, -374610766, -375487764, -376359774, -377226797, -378088833,
+ -378945883, -379797949, -380645032, -381487132, -382324250, -383156388,
+ -383983547, -384805728, -385622932, -386435161, -387242415, -388044696,
+ -388842006, -389634345, -390421715, -391204118, -391981555, -392754027,
+ -393521536, -394284084, -395041672, -395794302, -396541975, -397284694,
+ -398022459, -398755273, -399483137, -400206053, -400924023, -401637049,
+ -402345133, -403048277, -403746483, -404439752, -405128087, -405811489,
+ -406489962, -407163507, -407832125, -408495821, -409154594, -409808449,
+ -410457387, -411101410, -411740521, -412374722, -413004016, -413628405,
+ -414247891, -414862477, -415472166, -416076959, -416676861, -417271872,
+ -417861997, -418447237, -419027596, -419603076, -420173679, -420739409,
+ -421300269, -421856261, -422407388, -422953654, -423495060, -424031611,
+ -424563309, -425090157, -425612159, -426129317, -426641634, -427149114,
+ -427651760, -428149575, -428642563, -429130726, -429614068, -430092593,
+ -430566303, -431035202, -431499294, -431958582, -432413070, -432862761,
+ -433307658, -433747765, -434183087, -434613626, -435039386, -435460370,
+ -435876584, -436288029, -436694711, -437096633, -437493799, -437886212,
+ -438273877, -438656797, -439034977, -439408420, -439777131, -440141114,
+ -440500372, -440854909, -441204731, -441549841, -441890243, -442225941,
+ -442556940, -442883244, -443204857, -443521784, -443834029, -444141597,
+ -444444491, -444742716, -445036277, -445325179, -445609425, -445889020,
+ -446163969, -446434277, -446699948, -446960987, -447217399, -447469187,
+ -447716358, -447958915, -448196864, -448430210, -448658957, -448883110,
+ -449102674, -449317654, -449528055, -449733882, -449935140, -450131835,
+ -450323970, -450511552, -450694585, -450873075, -451047026, -451216445,
+ -451381335, -451541703, -451697554, -451848893, -451995726, -452138057,
+ -452275892, -452409237, -452538097, -452662478, -452782384, -452897823,
+ -453008798, -453115316, -453217382, -453315003, -453408182, -453496927,
+ -453581244, -453661136, -453736612, -453807675, -453874333, -453936590,
+ -453994454, -454047928, -454097021, -454141737, -454182082, -454218063,
+ -454249685, -454276955, -454299878, -454318461, -454332709, -454342630,
+ -454348228, -454349511, -454346483, -454339153, -454327525, -454311607,
+ -454291404, -454266923, -454238170, -454205151, -454167873, -454126343,
+ -454080567, -454030550, -453976300, -453917824, -453855127, -453788217,
+ -453717100, -453641782, -453562270, -453478572, -453390692, -453298639,
+ -453202419, -453102039, -452997505, -452888824, -452776003, -452659049,
+ -452537969, -452412770, -452283458, -452150041, -452012525, -451870917,
+ -451725225, -451575456, -451421615, -451263712, -451101752, -450935742,
+ -450765691, -450591604, -450413490, -450231355, -450045206, -449855052,
+ -449660898, -449462753, -449260623, -449054517, -448844440, -448630401,
+ -448412408, -448190467, -447964585, -447734771, -447501032, -447263375,
+ -447021808, -446776338, -446526973, -446273721, -446016588, -445755583,
+ -445490714, -445221987, -444949411, -444672993, -444392742, -444108663,
+ -443820767, -443529059, -443233549, -442934244, -442631151, -442324279,
+ -442013635, -441699227, -441381063, -441059152, -440733501, -440404117,
+ -440071010, -439734187, -439393655, -439049424, -438701501, -438349894,
+ -437994611, -437635661, -437273051, -436906790, -436536885, -436163346,
+ -435786180, -435405395, -435021000, -434633003, -434241412, -433846236,
+ -433447483, -433045160, -432639277, -432229842, -431816864, -431400349,
+ -430980308, -430556749, -430129679, -429699107, -429265043, -428827494,
+ -428386469, -427941976, -427494024, -427042622, -426587777, -426129500,
+ -425667798, -425202679, -424734154, -424262229, -423786915, -423308219,
+ -422826151, -422340718, -421851931, -421359797, -420864325, -420365525,
+ -419863404, -419357972, -418849238, -418337210, -417821898, -417303310,
+ -416781455, -416256341, -415727979, -415196377, -414661543, -414123487,
+ -413582218, -413037745, -412490077, -411939222, -411385190, -410827990,
+ -410267631, -409704122, -409137472, -408567691, -407994787, -407418769,
+ -406839647, -406257430, -405672126, -405083746, -404492299, -403897793,
+ -403300238, -402699643, -402096017, -401489370, -400879711, -400267049,
+ -399651393, -399032754, -398411139, -397786559, -397159023, -396528540,
+ -395895120, -395258771, -394619504, -393977328, -393332252, -392684286,
+ -392033439, -391379721, -390723140, -390063708, -389401432, -388736323,
+ -388068390, -387397643, -386724090, -386047743, -385368610, -384686701,
+ -384002025, -383314592, -382624412, -381931494, -381235849, -380537484,
+ -379836411, -379132639, -378426177, -377717036, -377005224, -376290752,
+ -375573630, -374853866, -374131471, -373406455, -372678827, -371948597,
+ -371215775, -370480370, -369742393, -369001853, -368258760, -367513123,
+ -366764953, -366014260, -365261052, -364505341, -363747136, -362986447,
+ -362223283, -361457655, -360689572, -359919045, -359146083, -358370696,
+ -357592894, -356812687, -356030085, -355245099, -354457737, -353668009,
+ -352875927, -352081499, -351284736, -350485648, -349684245, -348880536,
+ -348074532, -347266243, -346455678, -345642849, -344827764, -344010434,
+ -343190869, -342369079, -341545074, -340718864, -339890460, -339059870,
+ -338227107, -337392178, -336555095, -335715868, -334874507, -334031021,
+ -333185422, -332337718, -331487921, -330636040, -329782086, -328926069,
+ -328067998, -327207885, -326345738, -325481569, -324615388, -323747204,
+ -322877028, -322004870, -321130740, -320254649, -319376607, -318496623,
+ -317614708, -316730873, -315845127, -314957481, -314067944, -313176528,
+ -312283242, -311388097, -310491103, -309592269, -308691607, -307789127,
+ -306884838, -305978752, -305070878, -304161226, -303249807, -302336632,
+ -301421709, -300505051, -299586666, -298666565, -297744759, -296821258,
+ -295896071, -294969210, -294040685, -293110505, -292178682, -291245225,
+ -290310145, -289373452, -288435156, -287495267, -286553797, -285610755,
+ -284666152, -283719997, -282772301, -281823075, -280872329, -279920072,
+ -278966316, -278011071, -277054346, -276096153, -275136501, -274175402,
+ -273212864, -272248899, -271283517, -270316728, -269348542, -268378970,
+ -267408022, -266435709, -265462040, -264487026, -263510677, -262533004,
+ -261554017, -260573726, -259592141, -258609273, -257625133, -256639729,
+ -255653074, -254665176, -253676047, -252685696, -251694134, -250701372,
+ -249707419, -248712285, -247715982, -246718519, -245719906, -244720155,
+ -243719275, -242717276, -241714168, -240709963, -239704670, -238698300,
+ -237690863, -236682368, -235672827, -234662250, -233650646, -232638027,
+ -231624401, -230609781, -229594175, -228577594, -227560049, -226541549,
+ -225522105, -224501727, -223480426, -222458210, -221435092, -220411080,
+ -219386185, -218360418, -217333788, -216306306, -215277982, -214248825,
+ -213218847, -212188058, -211156467, -210124085, -209090922, -208056987,
+ -207022293, -205986847, -204950661, -203913745, -202876109, -201837762,
+ -200798716, -199758980, -198718564, -197677479, -196635734, -195593340,
+ -194550306, -193506643, -192462362, -191417471, -190371981, -189325903,
+ -188279245, -187232019, -186184234, -185135900, -184087028, -183037626,
+ -181987707, -180937278, -179886352, -178834936, -177783042, -176730679,
+ -175677858, -174624587, -173570879, -172516741, -171462185, -170407219,
+ -169351855, -168296102, -167239969, -166183468, -165126607, -164069397,
+ -163011847, -161953968, -160895769, -159837260, -158778452, -157719353,
+ -156659973, -155600324, -154540413, -153480252, -152419850, -151359216,
+ -150298361, -149237294, -148176026, -147114565, -146052922, -144991107,
+ -143929128, -142866996, -141804721, -140742312, -139679780, -138617132,
+ -137554380, -136491534, -135428601, -134365594, -133302520, -132239389,
+ -131176212, -130112998, -129049756, -127986497, -126923229, -125859962,
+ -124796706, -123733470, -122670264, -121607097, -120543980, -119480920,
+ -118417929, -117355015, -116292188, -115229457, -114166832, -113104323,
+ -112041938, -110979687, -109917580, -108855625, -107793833, -106732213,
+ -105670774, -104609525, -103548476, -102487635, -101427014, -100366620,
+ -99306463, -98246552, -97186897, -96127507, -95068391, -94009558,
+ -92951018, -91892780, -90834852, -89777245, -88719967, -87663027,
+ -86606436, -85550200, -84494331, -83438837, -82383727, -81329010,
+ -80274696, -79220792, -78167309, -77114256, -76061641, -75009473,
+ -73957762, -72906517, -71855745, -70805457, -69755662, -68706367,
+ -67657583, -66609318, -65561581, -64514380, -63467725, -62421625,
+ -61376088, -60331123, -59286739, -58242945, -57199749, -56157161,
+ -55115188, -54073841, -53033126, -51993054, -50953633, -49914872,
+ -48876778, -47839362, -46802631, -45766594, -44731259, -43696636,
+ -42662733, -41629558, -40597120, -39565428, -38534489, -37504313,
+ -36474908, -35446283, -34418445, -33391403, -32365166, -31339743,
+ -30315140, -29291368, -28268434, -27246346, -26225113, -25204744,
+ -24185246, -23166627, -22148897, -21132063, -20116133, -19101116,
+ -18087020, -17073853, -16061623, -15050338, -14040007, -13030638,
+ -12022238, -11014816, -10008380, -9002937, -7998497, -6995066,
+ -5992654, -4991267, -3990914, -2991603, -1993342, -996138, 0, 995064,
+ 1989048, 2981943, 3973740, 4964433, 5954014, 6942474, 7929806, 8916002,
+ 9901055, 10884957, 11867700, 12849276, 13829678, 14808899, 15786930,
+ 16763764, 17739393, 18713811, 19687008, 20658979, 21629714, 22599208,
+ 23567452, 24534439, 25500161, 26464612, 27427783, 28389667, 29350258,
+ 30309547, 31267527, 32224191, 33179532, 34133543, 35086216, 36037543,
+ 36987519, 37936135, 38883385, 39829261, 40773756, 41716863, 42658575,
+ 43598885, 44537786, 45475270, 46411332, 47345963, 48279157, 49210907,
+ 50141206, 51070047, 51997423, 52923327, 53847753, 54770693, 55692141,
+ 56612090, 57530533, 58447463, 59362875, 60276760, 61189112, 62099925,
+ 63009192, 63916906, 64823060, 65727649, 66630665, 67532102, 68431954,
+ 69330213, 70226874, 71121930, 72015374, 72907200, 73797401, 74685972,
+ 75572906, 76458196, 77341836, 78223820, 79104141, 79982794, 80859771,
+ 81735068, 82608677, 83480592, 84350807, 85219317, 86086114, 86951194,
+ 87814549, 88676173, 89536061, 90394207, 91250605, 92105248, 92958130,
+ 93809247, 94658591, 95506157, 96351939, 97195931, 98038128, 98878523,
+ 99717111, 100553886, 101388842, 102221974, 103053275, 103882741,
+ 104710365, 105536142, 106360066, 107182132, 108002333, 108820666,
+ 109637123, 110451700, 111264391, 112075190, 112884092, 113691092,
+ 114496184, 115299364, 116100624, 116899961, 117697369, 118492842,
+ 119286376, 120077964, 120867603, 121655286, 122441009, 123224766,
+ 124006552, 124786363, 125564192, 126340035, 127113887, 127885743,
+ 128655598, 129423447, 130189284, 130953106, 131714907, 132474681,
+ 133232426, 133988134, 134741803, 135493426, 136242999, 136990518,
+ 137735977, 138479372, 139220698, 139959951, 140697126, 141432218,
+ 142165222, 142896135, 143624951, 144351667, 145076277, 145798777,
+ 146519162, 147237429, 147953572, 148667588, 149379472, 150089219,
+ 150796826, 151502287, 152205600, 152906759, 153605760, 154302599,
+ 154997272, 155689775, 156380103, 157068253, 157754220, 158438000,
+ 159119590, 159798985, 160476181, 161151174, 161823961, 162494537,
+ 163162898, 163829041, 164492961, 165154656, 165814120, 166471351,
+ 167126344, 167779096, 168429603, 169077861, 169723867, 170367617,
+ 171009108, 171648335, 172285295, 172919984, 173552400, 174182539,
+ 174810396, 175435969, 176059254, 176680248, 177298948, 177915349,
+ 178529449, 179141244, 179750731, 180357907, 180962768, 181565312,
+ 182165534, 182763433, 183359004, 183952244, 184543151, 185131722,
+ 185717952, 186301840, 186883382, 187462575, 188039416, 188613903,
+ 189186032, 189755800, 190323205, 190888244, 191450913, 192011211,
+ 192569133, 193124679, 193677844, 194228626, 194777022, 195323030,
+ 195866647, 196407871, 196946698, 197483127, 198017154, 198548777,
+ 199077994, 199604803, 200129200, 200651183, 201170750, 201687899,
+ 202202626, 202714931, 203224810, 203732261, 204237282, 204739871,
+ 205240025, 205737742, 206233021, 206725858, 207216252, 207704201,
+ 208189702, 208672754, 209153355, 209631502, 210107193, 210580427,
+ 211051202, 211519515, 211985366, 212448751, 212909669, 213368118,
+ 213824097, 214277604, 214728636, 215177193, 215623272, 216066872,
+ 216507991, 216946628, 217382781, 217816448, 218247628, 218676319,
+ 219102519, 219526228, 219947444, 220366165, 220782389, 221196117,
+ 221607345, 222016073, 222422300, 222826023, 223227243, 223625956,
+ 224022164, 224415863, 224807053, 225195733, 225581902, 225965558,
+ 226346701, 226725328, 227101440, 227475036, 227846113, 228214672,
+ 228580711, 228944229, 229305226, 229663700, 230019651, 230373078,
+ 230723980, 231072356, 231418205, 231761528, 232102322, 232440587,
+ 232776323, 233109529, 233440204, 233768348, 234093960, 234417040,
+ 234737586, 235055599, 235371078, 235684022, 235994432, 236302305,
+ 236607644, 236910446, 237210711, 237508439, 237803631, 238096285,
+ 238386401, 238673979, 238959018, 239241520, 239521483, 239798906,
+ 240073792, 240346138, 240615944, 240883212, 241147941, 241410130,
+ 241669780, 241926891, 242181463, 242433495, 242682989, 242929944,
+ 243174359, 243416237, 243655576, 243892377, 244126639, 244358364,
+ 244587552, 244814202, 245038316, 245259893, 245478934, 245695439,
+ 245909409, 246120843, 246329744, 246536110, 246739943, 246941242,
+ 247140010, 247336245, 247529949, 247721122, 247909765, 248095879,
+ 248279464, 248460521, 248639050, 248815053, 248988530, 249159481,
+ 249327909, 249493812, 249657194, 249818053, 249976391, 250132210,
+ 250285509, 250436290, 250584555, 250730302, 250873535, 251014254,
+ 251152459, 251288153, 251421336, 251552009, 251680173, 251805830,
+ 251928981, 252049626, 252167768, 252283407, 252396545, 252507183,
+ 252615322, 252720964, 252824110, 252924761, 253022919, 253118585,
+ 253211761, 253302448, 253390647, 253476361, 253559590, 253640336,
+ 253718601, 253794386, 253867693, 253938524, 254006879, 254072762,
+ 254136173, 254197114, 254255587, 254311594, 254365137, 254416216,
+ 254464835, 254510994, 254554697, 254595943, 254634737, 254671079,
+ 254704971, 254736415, 254765414, 254791969, 254816082, 254837756,
+ 254856991, 254873792, 254888159, 254900094, 254909600, 254916680,
+ 254921334, 254923565, 254923376, 254920769, 254915746, 254908309,
+ 254898460, 254886202, 254871538, 254854468, 254834997, 254813126,
+ 254788858, 254762195, 254733139, 254701693, 254667860, 254631642,
+ 254593041, 254552060, 254508702, 254462969, 254414864, 254364389,
+ 254311547, 254256341, 254198773, 254138846, 254076563, 254011926,
+ 253944938, 253875603, 253803922, 253729899, 253653536, 253574837,
+ 253493803, 253410438, 253324746, 253236728, 253146387, 253053727,
+ 252958751, 252861462, 252761862, 252659954, 252555743, 252449230,
+ 252340418, 252229312, 252115914, 252000226, 251882253, 251761997,
+ 251639462, 251514651, 251387567, 251258213, 251126592, 250992708,
+ 250856565, 250718164, 250577511, 250434607, 250289456, 250142063,
+ 249992429, 249840559, 249686456, 249530124, 249371565, 249210784,
+ 249047783, 248882567, 248715138, 248545501, 248373659, 248199616,
+ 248023374, 247844939, 247664312, 247481499, 247296502, 247109326,
+ 246919973, 246728449, 246534756, 246338898, 246140879, 245940702,
+ 245738373, 245533893, 245327268, 245118500, 244907595, 244694555,
+ 244479384, 244262087, 244042668, 243821130, 243597477, 243371713,
+ 243143842, 242913869, 242681797, 242447630, 242211372, 241973028,
+ 241732600, 241490095, 241245515, 240998864, 240750148, 240499369,
+ 240246533, 239991642, 239734703, 239475718, 239214691, 238951628,
+ 238686532, 238419408, 238150260, 237879092, 237605909, 237330714,
+ 237053512, 236774308, 236493106, 236209910, 235924725, 235637555,
+ 235348404, 235057277, 234764179, 234469113, 234172085, 233873098,
+ 233572158, 233269268, 232964434, 232657660, 232348950, 232038309,
+ 231725742, 231411252, 231094846, 230776527, 230456300, 230134170,
+ 229810141, 229484218, 229156406, 228826709, 228495133, 228161681,
+ 227826359, 227489171, 227150122, 226809218, 226466462, 226121859,
+ 225775415, 225427134, 225077022, 224725081, 224371319, 224015739,
+ 223658347, 223299147, 222938145, 222575344, 222210751, 221844370,
+ 221476206, 221106265, 220734550, 220361067, 219985821, 219608818,
+ 219230061, 218849557, 218467310, 218083325, 217697608, 217310163,
+ 216920996, 216530111, 216137514, 215743210, 215347204, 214949502,
+ 214550107, 214149027, 213746265, 213341827, 212935718, 212527944,
+ 212118509, 211707419, 211294680, 210880295, 210464272, 210046614,
+ 209627328, 209206418, 208783890, 208359749, 207934001, 207506650,
+ 207077703, 206647165, 206215040, 205781335, 205346055, 204909204,
+ 204470789, 204030816, 203589288, 203146213, 202701595, 202255439,
+ 201807752, 201358539, 200907805, 200455555, 200001796, 199546533,
+ 199089770, 198631515, 198171772, 197710546, 197247845, 196783672,
+ 196318034, 195850936, 195382383, 194912383, 194440939, 193968057,
+ 193493744, 193018005, 192540845, 192062271, 191582287, 191100900,
+ 190618115, 190133938, 189648374, 189161429, 188673110, 188183421,
+ 187692369, 187199958, 186706196, 186211087, 185714637, 185216853,
+ 184717739, 184217302, 183715547, 183212481, 182708109, 182202436,
+ 181695469, 181187214, 180677675, 180166860, 179654774, 179141423,
+ 178626812, 178110947, 177593835, 177075481, 176555891, 176035072,
+ 175513027, 174989765, 174465290, 173939609, 173412728, 172884651,
+ 172355386, 171824938, 171293314, 170760518, 170226557, 169691438,
+ 169155165, 168617745, 168079185, 167539489, 166998663, 166456715,
+ 165913649, 165369473, 164824191, 164277809, 163730335, 163181774,
+ 162632131, 162081413, 161529626, 160976776, 160422869, 159867911,
+ 159311908, 158754866, 158196792, 157637690, 157077568, 156516431,
+ 155954286, 155391138, 154826994, 154261859, 153695741, 153128644,
+ 152560575, 151991540, 151421545, 150850597, 150278700, 149705863,
+ 149132090, 148557388, 147981762, 147405220, 146827767, 146249409,
+ 145670152, 145090003, 144508968, 143927052, 143344263, 142760605,
+ 142176086, 141590712, 141004487, 140417420, 139829516, 139240781,
+ 138651221, 138060842, 137469652, 136877655, 136284858, 135691267,
+ 135096888, 134501729, 133905793, 133309089, 132711622, 132113399,
+ 131514424, 130914706, 130314249, 129713061, 129111147, 128508513,
+ 127905166, 127301112, 126696358, 126090908, 125484770, 124877950,
+ 124270454, 123662289, 123053459, 122443972, 121833835, 121223052,
+ 120611630, 119999577, 119386896, 118773596, 118159682, 117545161,
+ 116930038, 116314320, 115698013, 115081123, 114463657, 113845620,
+ 113227020, 112607862, 111988152, 111367897, 110747103, 110125775,
+ 109503922, 108881547, 108258659, 107635262, 107011364, 106386970,
+ 105762087, 105136721, 104510878, 103884564, 103257785, 102630549,
+ 102002860, 101374726, 100746152, 100117145, 99487710, 98857855,
+ 98227584, 97596906, 96965824, 96334347, 95702480, 95070229, 94437601,
+ 93804601, 93171237, 92537513, 91903436, 91269014, 90634250, 89999153,
+ 89363727, 88727980, 88091918, 87455545, 86818870, 86181898, 85544634,
+ 84907086, 84269260, 83631161, 82992796, 82354171, 81715292, 81076165,
+ 80436797, 79797193, 79157360, 78517304, 77877031, 77236547, 76595859,
+ 75954971, 75313892, 74672626, 74031180, 73389560, 72747772, 72105822,
+ 71463716, 70821461, 70179062, 69536526, 68893858, 68251066, 67608154,
+ 66965129, 66321997, 65678765, 65035437, 64392021, 63748522, 63104946,
+ 62461300, 61817590, 61173821, 60529999, 59886131, 59242223, 58598281,
+ 57954310, 57310317, 56666308, 56022288, 55378265, 54734243, 54090229,
+ 53446228, 52802248, 52158293, 51514370, 50870484, 50226643, 49582851,
+ 48939114, 48295439, 47651832, 47008298, 46364843, 45721474, 45078196,
+ 44435015, 43791937, 43148968, 42506114, 41863381, 41220774, 40578300,
+ 39935964, 39293773, 38651732, 38009847, 37368123, 36726568, 36085186,
+ 35443983, 34802966, 34162140, 33521511, 32881084, 32240866, 31600862,
+ 30961078, 30321521, 29682194, 29043106, 28404260, 27765664, 27127322,
+ 26489240, 25851425, 25213882, 24576616, 23939634, 23302940, 22666542,
+ 22030444, 21394652, 20759172, 20124010, 19489170, 18854660, 18220484,
+ 17586648, 16953158, 16320019, 15687237, 15054818, 14422767, 13791090,
+ 13159793, 12528880, 11898358, 11268232, 10638508, 10009191, 9380286,
+ 8751801, 8123739, 7496106, 6868908, 6242150, 5615839, 4989979, 4364575,
+ 3739634, 3115160, 2491160, 1867638, 1244601, 622053, 0, -621552,
+ -1242600, -1863136, -2483155, -3102653, -3721624, -4340062, -4957962,
+ -5575319, -6192128, -6808382, -7424078, -8039209, -8653770, -9267756,
+ -9881162, -10493982, -11106212, -11717845, -12328877, -12939303,
+ -13549117, -14158314, -14766889, -15374836, -15982152, -16588829,
+ -17194864, -17800251, -18404985, -19009060, -19612473, -20215217,
+ -20817287, -21418679, -22019388, -22619407, -23218733, -23817360,
+ -24415284, -25012498, -25608999, -26204781, -26799839, -27394168,
+ -27987763, -28580620, -29172733, -29764097, -30354708, -30944560,
+ -31533649, -32121970, -32709518, -33296287, -33882274, -34467473,
+ -35051879, -35635488, -36218295, -36800295, -37381483, -37961855,
+ -38541405, -39120129, -39698022, -40275080, -40851297, -41426669,
+ -42001192, -42574860, -43147669, -43719614, -44290691, -44860894,
+ -45430220, -45998664, -46566220, -47132885, -47698654, -48263523,
+ -48827486, -49390539, -49952678, -50513898, -51074194, -51633563,
+ -52191999, -52749498, -53306056, -53861668, -54416330, -54970037,
+ -55522785, -56074570, -56625387, -57175231, -57724099, -58271985,
+ -58818887, -59364798, -59909716, -60453635, -60996552, -61538462,
+ -62079361, -62619244, -63158107, -63695947, -64232759, -64768538,
+ -65303281, -65836983, -66369640, -66901248, -67431803, -67961300,
+ -68489736, -69017107, -69543408, -70068635, -70592785, -71115853,
+ -71637835, -72158727, -72678525, -73197225, -73714823, -74231316,
+ -74746698, -75260967, -75774119, -76286148, -76797052, -77306827,
+ -77815468, -78322972, -78829336, -79334554, -79838624, -80341541,
+ -80843302, -81343902, -81843339, -82341609, -82838707, -83334629,
+ -83829373, -84322935, -84815310, -85306496, -85796488, -86285282,
+ -86772876, -87259266, -87744447, -88228417, -88711171, -89192707,
+ -89673020, -90152107, -90629965, -91106591, -91581979, -92056128,
+ -92529033, -93000692, -93471100, -93940255, -94408152, -94874789,
+ -95340163, -95804268, -96267104, -96728665, -97188949, -97647953,
+ -98105672, -98562105, -99017247, -99471095, -99923646, -100374898,
+ -100824846, -101273487, -101720818, -102166837, -102611540, -103054923,
+ -103496984, -103937720, -104377127, -104815203, -105251943, -105687346,
+ -106121409, -106554127, -106985499, -107415521, -107844190, -108271504,
+ -108697459, -109122052, -109545280, -109967142, -110387633, -110806750,
+ -111224492, -111640855, -112055836, -112469432, -112881641, -113292460,
+ -113701887, -114109917, -114516549, -114921780, -115325607, -115728028,
+ -116129039, -116528639, -116926824, -117323591, -117718939, -118112865,
+ -118505366, -118896439, -119286082, -119674292, -120061067, -120446405,
+ -120830302, -121212757, -121593766, -121973328, -122351440, -122728099,
+ -123103304, -123477051, -123849339, -124220164, -124589525, -124957420,
+ -125323845, -125688800, -126052280, -126414285, -126774812, -127133858,
+ -127491422, -127847501, -128202093, -128555195, -128906807, -129256925,
+ -129605547, -129952672, -130298297, -130642420, -130985038, -131326151,
+ -131665756, -132003851, -132340434, -132675502, -133009055, -133341089,
+ -133671603, -134000596, -134328064, -134654007, -134978423, -135301308,
+ -135622663, -135942484, -136260770, -136577520, -136892731, -137206401,
+ -137518529, -137829114, -138138153, -138445644, -138751586, -139055978,
+ -139358818, -139660103, -139959832, -140258005, -140554618, -140849671,
+ -141143162, -141435089, -141725451, -142014247, -142301474, -142587132,
+ -142871218, -143153732, -143434671, -143714036, -143991823, -144268032,
+ -144542661, -144815709, -145087174, -145357056, -145625353, -145892063,
+ -146157185, -146420719, -146682662, -146943014, -147201773, -147458938,
+ -147714508, -147968482, -148220858, -148471635, -148720813, -148968390,
+ -149214365, -149458736, -149701504, -149942666, -150182222, -150420171,
+ -150656511, -150891242, -151124363, -151355873, -151585770, -151814054,
+ -152040724, -152265780, -152489219, -152711042, -152931247, -153149833,
+ -153366801, -153582148, -153795875, -154007980, -154218462, -154427322,
+ -154634557, -154840169, -155044154, -155246514, -155447248, -155646353,
+ -155843832, -156039681, -156233902, -156426492, -156617453, -156806782,
+ -156994480, -157180547, -157364980, -157547781, -157728948, -157908482,
+ -158086381, -158262646, -158437275, -158610268, -158781626, -158951347,
+ -159119431, -159285879, -159450689, -159613861, -159775395, -159935291,
+ -160093549, -160250167, -160405147, -160558487, -160710188, -160860249,
+ -161008670, -161155452, -161300593, -161444094, -161585954, -161726174,
+ -161864754, -162001693, -162136991, -162270648, -162402665, -162533041,
+ -162661776, -162788871, -162914324, -163038138, -163160310, -163280842,
+ -163399734, -163516986, -163632597, -163746568, -163858900, -163969592,
+ -164078644, -164186058, -164291832, -164395967, -164498464, -164599322,
+ -164698543, -164796126, -164892071, -164986379, -165079051, -165170086,
+ -165259485, -165347249, -165433377, -165517871, -165600730, -165681955,
+ -165761547, -165839505, -165915831, -165990526, -166063588, -166135020,
+ -166204821, -166272992, -166339534, -166404448, -166467733, -166529391,
+ -166589422, -166647826, -166704606, -166759760, -166813290, -166865197,
+ -166915481, -166964143, -167011184, -167056604, -167100405, -167142587,
+ -167183150, -167222097, -167259427, -167295141, -167329241, -167361727,
+ -167392600, -167421861, -167449511, -167475550, -167499981, -167522803,
+ -167544018, -167563627, -167581630, -167598029, -167612825, -167626019,
+ -167637612, -167647605, -167655999, -167662795, -167667994, -167671598,
+ -167673608, -167674024, -167672848, -167670081, -167665725, -167659780,
+ -167652248, -167643130, -167632428, -167620142, -167606274, -167590824,
+ -167573796, -167555189, -167535006, -167513247, -167489913, -167465007,
+ -167438530, -167410483, -167380867, -167349684, -167316936, -167282623,
+ -167246748, -167209312, -167170316, -167129762, -167087651, -167043985,
+ -166998765, -166951994, -166903672, -166853801, -166802384, -166749420,
+ -166694913, -166638864, -166581274, -166522145, -166461479, -166399277,
+ -166335542, -166270274, -166203476, -166135150, -166065297, -165993918,
+ -165921017, -165846594, -165770652, -165693191, -165614215, -165533725,
+ -165451722, -165368210, -165283188, -165196661, -165108628, -165019093,
+ -164928058, -164835523, -164741492, -164645966, -164548947, -164450437,
+ -164350439, -164248954, -164145984, -164041531, -163935598, -163828187,
+ -163719299, -163608936, -163497102, -163383797, -163269025, -163152787,
+ -163035085, -162915922, -162795300, -162673220, -162549686, -162424700,
+ -162298263, -162170378, -162041047, -161910272, -161778057, -161644402,
+ -161509311, -161372785, -161234827, -161095440, -160954626, -160812386,
+ -160668724, -160523642, -160377142, -160229227, -160079899, -159929160,
+ -159777013, -159623461, -159468506, -159312150, -159154396, -158995246,
+ -158834703, -158672770, -158509448, -158344741, -158178651, -158011181,
+ -157842333, -157672110, -157500514, -157327548, -157153215, -156977517,
+ -156800457, -156622037, -156442261, -156261131, -156078649, -155894819,
+ -155709643, -155523123, -155335263, -155146065, -154955533, -154763668,
+ -154570473, -154375952, -154180106, -153982940, -153784455, -153584655,
+ -153383543, -153181120, -152977391, -152772357, -152566023, -152358390,
+ -152149461, -151939240, -151727730, -151514933, -151300852, -151085490,
+ -150868850, -150650936, -150431750, -150211295, -149989574, -149766590,
+ -149542346, -149316845, -149090090, -148862085, -148632832, -148402334,
+ -148170594, -147937616, -147703403, -147467957, -147231282, -146993381,
+ -146754256, -146513912, -146272351, -146029577, -145785592, -145540400,
+ -145294004, -145046407, -144797612, -144547623, -144296443, -144044074,
+ -143790521, -143535786, -143279873, -143022784, -142764524, -142505096,
+ -142244502, -141982746, -141719832, -141455763, -141190541, -140924171,
+ -140656655, -140387997, -140118201, -139847269, -139575206, -139302014,
+ -139027696, -138752257, -138475700, -138198028, -137919244, -137639352,
+ -137358355, -137076257, -136793061, -136508771, -136223390, -135936921,
+ -135649369, -135360736, -135071026, -134780243, -134488390, -134195470,
+ -133901488, -133606446, -133310348, -133013198, -132714999, -132415755,
+ -132115469, -131814145, -131511787, -131208398, -130903982, -130598542,
+ -130292082, -129984605, -129676116, -129366617, -129056113, -128744607,
+ -128432103, -128118604, -127804114, -127488637, -127172176, -126854735,
+ -126536318, -126216929, -125896571, -125575247, -125252963, -124929720,
+ -124605524, -124280377, -123954284, -123627248, -123299273, -122970363,
+ -122640522, -122309752, -121978059, -121645446, -121311917, -120977475,
+ -120642124, -120305868, -119968711, -119630657, -119291709, -118951872,
+ -118611149, -118269544, -117927061, -117583703, -117239475, -116894381,
+ -116548424, -116201608, -115853937, -115505415, -115156046, -114805833,
+ -114454781, -114102894, -113750175, -113396629, -113042259, -112687069,
+ -112331063, -111974245, -111616619, -111258189, -110898959, -110538933,
+ -110178114, -109816508, -109454117, -109090946, -108726998, -108362278,
+ -107996790, -107630537, -107263524, -106895754, -106527233, -106157962,
+ -105787948, -105417193, -105045701, -104673477, -104300525, -103926849,
+ -103552453, -103177340, -102801515, -102424982, -102047745, -101669808,
+ -101291175, -100911850, -100531837, -100151141, -99769764, -99387712,
+ -99004989, -98621598, -98237544, -97852830, -97467461, -97081441,
+ -96694774, -96307465, -95919516, -95530933, -95141719, -94751878,
+ -94361415, -93970334, -93578639, -93186334, -92793423, -92399910,
+ -92005800, -91611096, -91215802, -90819924, -90423464, -90026428,
+ -89628819, -89230641, -88831899, -88432596, -88032737, -87632326,
+ -87231368, -86829865, -86427824, -86025246, -85622138, -85218503,
+ -84814345, -84409668, -84004477, -83598775, -83192568, -82785858,
+ -82378651, -81970950, -81562760, -81154085, -80744928, -80335295,
+ -79925189, -79514615, -79103577, -78692079, -78280125, -77867719,
+ -77454866, -77041570, -76627835, -76213665, -75799064, -75384037,
+ -74968588, -74552721, -74136441, -73719750, -73302655, -72885158,
+ -72467265, -72048979, -71630304, -71211245, -70791807, -70371992,
+ -69951806, -69531253, -69110336, -68689061, -68267431, -67845450,
+ -67423123, -67000455, -66577448, -66154108, -65730439, -65306444,
+ -64882128, -64457496, -64032552, -63607299, -63181742, -62755885,
+ -62329733, -61903290, -61476559, -61049546, -60622254, -60194687,
+ -59766850, -59338747, -58910383, -58481761, -58052885, -57623760,
+ -57194391, -56764781, -56334934, -55904855, -55474548, -55044017,
+ -54613267, -54182301, -53751124, -53319740, -52888153, -52456368,
+ -52024388, -51592218, -51159862, -50727325, -50294610, -49861722,
+ -49428664, -48995442, -48562059, -48128519, -47694827, -47260987,
+ -46827003, -46392879, -45958619, -45524228, -45089710, -44655069,
+ -44220309, -43785435, -43350450, -42915358, -42480165, -42044874,
+ -41609488, -41174014, -40738453, -40302812, -39867093, -39431301,
+ -38995441, -38559516, -38123530, -37687488, -37251394, -36815252,
+ -36379066, -35942840, -35506579, -35070286, -34633966, -34197622,
+ -33761259, -33324882, -32888493, -32452098, -32015701, -31579304,
+ -31142914, -30706533, -30270166, -29833817, -29397490, -28961189,
+ -28524918, -28088682, -27652484, -27216329, -26780220, -26344162,
+ -25908158, -25472213, -25036332, -24600517, -24164773, -23729104,
+ -23293515, -22858008, -22422589, -21987261, -21552028, -21116895,
+ -20681864, -20246942, -19812131, -19377435, -18942858, -18508405,
+ -18074080, -17639886, -17205828, -16771909, -16338133, -15904505,
+ -15471029, -15037708, -14604546, -14171548, -13738717, -13306057,
+ -12873573, -12441267, -12009145, -11577211, -11145467, -10713918,
+ -10282568, -9851421, -9420481, -8989752, -8559237, -8128941, -7698867,
+ -7269020, -6839402, -6410019, -5980874, -5551971, -5123314, -4694906,
+ -4266752, -3838855, -3411219, -2983849, -2556747, -2129918, -1703366,
+ -1277094, -851107, -425407, 0, 425111, 849924, 1274433, 1698635,
+ 2122526, 2546102, 2969360, 3392296, 3814906, 4237186, 4659132, 5080742,
+ 5502010, 5922934, 6343509, 6763732, 7183599, 7603106, 8022251, 8441028,
+ 8859434, 9277466, 9695120, 10112392, 10529279, 10945777, 11361882,
+ 11777590, 12192899, 12607803, 13022301, 13436387, 13850059, 14263313,
+ 14676145, 15088551, 15500529, 15912074, 16323182, 16733851, 17144077,
+ 17553856, 17963184, 18372058, 18780475, 19188431, 19595922, 20002945,
+ 20409497, 20815573, 21221170, 21626286, 22030916, 22435056, 22838705,
+ 23241857, 23644509, 24046659, 24448302, 24849435, 25250055, 25650158,
+ 26049742, 26448801, 26847334, 27245336, 27642805, 28039736, 28436127,
+ 28831974, 29227274, 29622024, 30016219, 30409857, 30802935, 31195449,
+ 31587395, 31978771, 32369573, 32759798, 33149443, 33538504, 33926978,
+ 34314862, 34702152, 35088846, 35474940, 35860430, 36245314, 36629589,
+ 37013250, 37396296, 37778723, 38160527, 38541705, 38922255, 39302173,
+ 39681456, 40060101, 40438104, 40815463, 41192175, 41568235, 41943642,
+ 42318392, 42692483, 43065910, 43438671, 43810763, 44182183, 44552927,
+ 44922993, 45292378, 45661079, 46029092, 46396415, 46763044, 47128978,
+ 47494212, 47858743, 48222570, 48585688, 48948095, 49309789, 49670765,
+ 50031021, 50390555, 50749363, 51107442, 51464790, 51821404, 52177280,
+ 52532417, 52886810, 53240458, 53593357, 53945505, 54296899, 54647536,
+ 54997413, 55346527, 55694877, 56042458, 56389268, 56735305, 57080565,
+ 57425047, 57768746, 58111661, 58453789, 58795128, 59135673, 59475424,
+ 59814376, 60152528, 60489877, 60826420, 61162155, 61497079, 61831189,
+ 62164482, 62496957, 62828611, 63159440, 63489443, 63818617, 64146959,
+ 64474467, 64801139, 65126971, 65451961, 65776108, 66099407, 66421858,
+ 66743457, 67064201, 67384090, 67703119, 68021287, 68338591, 68655029,
+ 68970599, 69285297, 69599122, 69912072, 70224143, 70535334, 70845642,
+ 71155065, 71463601, 71771246, 72078000, 72383860, 72688823, 72992887,
+ 73296051, 73598310, 73899665, 74200111, 74499647, 74798271, 75095981,
+ 75392774, 75688649, 75983602, 76277632, 76570737, 76862915, 77154163,
+ 77444479, 77733862, 78022308, 78309817, 78596386, 78882013, 79166695,
+ 79450432, 79733220, 80015058, 80295943, 80575875, 80854850, 81132867,
+ 81409924, 81686018, 81961148, 82235313, 82508509, 82780736, 83051990,
+ 83322271, 83591576, 83859904, 84127252, 84393620, 84659004, 84923403,
+ 85186815, 85449239, 85710673, 85971114, 86230561, 86489013, 86746467,
+ 87002922, 87258376, 87512827, 87766274, 88018715, 88270147, 88520571,
+ 88769983, 89018382, 89265767, 89512135, 89757486, 90001817, 90245127,
+ 90487414, 90728677, 90968914, 91208124, 91446305, 91683455, 91919574,
+ 92154658, 92388708, 92621720, 92853695, 93084630, 93314524, 93543376,
+ 93771183, 93997945, 94223660, 94448327, 94671943, 94894509, 95116023,
+ 95336482, 95555886, 95774234, 95991523, 96207753, 96422923, 96637031,
+ 96850075, 97062055, 97272969, 97482816, 97691594, 97899303, 98105941,
+ 98311507, 98516000, 98719418, 98921761, 99123026, 99323214, 99522323,
+ 99720351, 99917297, 100113161, 100307941, 100501637, 100694246,
+ 100885769, 101076203, 101265548, 101453803, 101640967, 101827038,
+ 102012016, 102195900, 102378688, 102560380, 102740975, 102920472,
+ 103098869, 103276166, 103452363, 103627457, 103801448, 103974336,
+ 104146118, 104316796, 104486366, 104654830, 104822185, 104988432,
+ 105153568, 105317595, 105480509, 105642312, 105803001, 105962577,
+ 106121038, 106278384, 106434614, 106589728, 106743724, 106896602,
+ 107048361, 107199000, 107348520, 107496919, 107644196, 107790351,
+ 107935383, 108079293, 108222078, 108363739, 108504274, 108643684,
+ 108781968, 108919125, 109055155, 109190056, 109323830, 109456475,
+ 109587990, 109718376, 109847631, 109975755, 110102748, 110228610,
+ 110353340, 110476937, 110599401, 110720732, 110840929, 110959992,
+ 111077921, 111194715, 111310374, 111424898, 111538285, 111650537,
+ 111761652, 111871631, 111980473, 112088178, 112194745, 112300175,
+ 112404467, 112507620, 112609635, 112710512, 112810250, 112908850,
+ 113006310, 113102631, 113197812, 113291854, 113384757, 113476520,
+ 113567143, 113656626, 113744969, 113832172, 113918235, 114003158,
+ 114086940, 114169582, 114251085, 114331446, 114410668, 114488749,
+ 114565691, 114641492, 114716153, 114789674, 114862054, 114933296,
+ 115003397, 115072358, 115140180, 115206863, 115272406, 115336810,
+ 115400075, 115462201, 115523188, 115583037, 115641748, 115699321,
+ 115755755, 115811052, 115865212, 115918234, 115970120, 116020869,
+ 116070482, 116118958, 116166299, 116212505, 116257575, 116301511,
+ 116344312, 116385979, 116426513, 116465913, 116504180, 116541315,
+ 116577318, 116612189, 116645928, 116678537, 116710015, 116740364,
+ 116769583, 116797673, 116824635, 116850468, 116875174, 116898753,
+ 116921206, 116942533, 116962735, 116981811, 116999764, 117016593,
+ 117032299, 117046883, 117060344, 117072685, 117083905, 117094005,
+ 117102986, 117110849, 117117593, 117123220, 117127731, 117131126,
+ 117133406, 117134571, 117134623, 117133562, 117131389, 117128104,
+ 117123709, 117118204, 117111590, 117103867, 117095038, 117085101,
+ 117074059, 117061912, 117048661, 117034307, 117018851, 117002293,
+ 116984634, 116965876, 116946019, 116925065, 116903013, 116879865,
+ 116855623, 116830287, 116803857, 116776335, 116747723, 116718020,
+ 116687228, 116655348, 116622381, 116588328, 116553191, 116516969,
+ 116479664, 116441278, 116401811, 116361265, 116319640, 116276937,
+ 116233159, 116188305, 116142378, 116095377, 116047306, 115998163,
+ 115947951, 115896672, 115844325, 115790912, 115736436, 115680895,
+ 115624293, 115566630, 115507908, 115448127, 115387290, 115325396,
+ 115262448, 115198447, 115133395, 115067291, 115000139, 114931939,
+ 114862692, 114792400, 114721065, 114648687, 114575267, 114500809,
+ 114425312, 114348778, 114271209, 114192606, 114112970, 114032303,
+ 113950606, 113867882, 113784130, 113699353, 113613553, 113526730,
+ 113438886, 113350023, 113260143, 113169246, 113077334, 112984409,
+ 112890473, 112795527, 112699572, 112602610, 112504643, 112405672,
+ 112305699, 112204726, 112102754, 111999784, 111895819, 111790860,
+ 111684909, 111577967, 111470036, 111361118, 111251215, 111140327,
+ 111028457, 110915607, 110801778, 110686972, 110571190, 110454435,
+ 110336709, 110218012, 110098347, 109977715, 109856119, 109733559,
+ 109610039, 109485559, 109360122, 109233729, 109106383, 108978084,
+ 108848835, 108718638, 108587494, 108455406, 108322375, 108188403,
+ 108053493, 107917645, 107780862, 107643146, 107504499, 107364923,
+ 107224419, 107082989, 106940636, 106797362, 106653168, 106508056,
+ 106362029, 106215088, 106067235, 105918473, 105768803, 105618228,
+ 105466749, 105314368, 105161088, 105006911, 104851838, 104695871,
+ 104539014, 104381267, 104222633, 104063115, 103902713, 103741430,
+ 103579269, 103416231, 103252319, 103087534, 102921880, 102755357,
+ 102587968, 102419715, 102250601, 102080628, 101909797, 101738111,
+ 101565573, 101392183, 101217946, 101042862, 100866934, 100690164,
+ 100512555, 100334108, 100154826, 99974712, 99793767, 99611993,
+ 99429394, 99245971, 99061726, 98876662, 98690781, 98504086, 98316578,
+ 98128261, 97939135, 97749205, 97558471, 97366937, 97174604, 96981476,
+ 96787553, 96592840, 96397338, 96201049, 96003976, 95806121, 95607487,
+ 95408076, 95207890, 95006932, 94805205, 94602710, 94399450, 94195428,
+ 93990646, 93785106, 93578811, 93371763, 93163965, 92955420, 92746129,
+ 92536095, 92325321, 92113809, 91901562, 91688581, 91474871, 91260432,
+ 91045268, 90829382, 90612775, 90395450, 90177410, 89958657, 89739194,
+ 89519024, 89298148, 89076570, 88854292, 88631317, 88407646, 88183284,
+ 87958231, 87732492, 87506068, 87278963, 87051178, 86822716, 86593581,
+ 86363774, 86133298, 85902156, 85670350, 85437883, 85204758, 84970978,
+ 84736544, 84501460, 84265728, 84029351, 83792332, 83554673, 83316377,
+ 83077447, 82837885, 82597694, 82356877, 82115436, 81873374, 81630694,
+ 81387398, 81143490, 80898972, 80653846, 80408115, 80161783, 79914851,
+ 79667323, 79419202, 79170489, 78921188, 78671301, 78420832, 78169783,
+ 77918157, 77665956, 77413183, 77159842, 76905935, 76651464, 76396432,
+ 76140843, 75884699, 75628002, 75370756, 75112964, 74854628, 74595750,
+ 74336335, 74076384, 73815901, 73554887, 73293347, 73031283, 72768697,
+ 72505593, 72241974, 71977841, 71713199, 71448050, 71182396, 70916241,
+ 70649587, 70382438, 70114796, 69846664, 69578045, 69308941, 69039356,
+ 68769293, 68498754, 68227742, 67956260, 67684312, 67411899, 67139025,
+ 66865693, 66591905, 66317664, 66042974, 65767838, 65492257, 65216235,
+ 64939776, 64662881, 64385554, 64107797, 63829614, 63551008, 63271981,
+ 62992537, 62712677, 62432406, 62151726, 61870640, 61589152, 61307262,
+ 61024976, 60742296, 60459224, 60175764, 59891919, 59607691, 59323083,
+ 59038099, 58752741, 58467013, 58180917, 57894456, 57607633, 57320452,
+ 57032915, 56745024, 56456784, 56168196, 55879265, 55589992, 55300382,
+ 55010436, 54720158, 54429550, 54138617, 53847360, 53555783, 53263888,
+ 52971680, 52679159, 52386331, 52093196, 51799760, 51506024, 51211991,
+ 50917665, 50623048, 50328144, 50032956, 49737485, 49441736, 49145712,
+ 48849414, 48552848, 48256014, 47958917, 47661559, 47363943, 47066073,
+ 46767951, 46469580, 46170964, 45872105, 45573006, 45273670, 44974101,
+ 44674301, 44374273, 44074020, 43773545, 43472852, 43171943, 42870821,
+ 42569489, 42267951, 41966208, 41664265, 41362124, 41059788, 40757260,
+ 40454543, 40151641, 39848555, 39545290, 39241848, 38938232, 38634445,
+ 38330490, 38026370, 37722088, 37417647, 37113051, 36808301, 36503401,
+ 36198355, 35893164, 35587833, 35282363, 34976758, 34671021, 34365156,
+ 34059164, 33753049, 33446814, 33140461, 32833995, 32527417, 32220732,
+ 31913941, 31607047, 31300055, 30992966, 30685784, 30378511, 30071152,
+ 29763707, 29456182, 29148578, 28840898, 28533146, 28225324, 27917436,
+ 27609484, 27301471, 26993401, 26685276, 26377099, 26068873, 25760601,
+ 25452287, 25143932, 24835541, 24527115, 24218658, 23910173, 23601663,
+ 23293130, 22984578, 22676010, 22367428, 22058835, 21750235, 21441630,
+ 21133024, 20824418, 20515817, 20207223, 19898638, 19590067, 19281511,
+ 18972974, 18664458, 18355967, 18047504, 17739070, 17430670, 17122306,
+ 16813981, 16505698, 16197460, 15889270, 15581130, 15273043, 14965013,
+ 14657043, 14349134, 14041291, 13733515, 13425810, 13118179, 12810624,
+ 12503149, 12195755, 11888447, 11581227, 11274098, 10967063, 10660124,
+ 10353284, 10046547, 9739914, 9433390, 9126976, 8820676, 8514492,
+ 8208427, 7902485, 7596667, 7290977, 6985418, 6679992, 6374702, 6069551,
+ 5764542, 5459677, 5154959, 4850392, 4545978, 4241719, 3937619, 3633680,
+ 3329905, 3026297, 2722858, 2419592, 2116501, 1813588, 1510856, 1208307,
+ 905944, 603770, 301788, 0, -301590, -602981, -904170, -1205153,
+ -1505928, -1806493, -2106844, -2406979, -2706895, -3006589, -3306059,
+ -3605303, -3904316, -4203097, -4501644, -4799952, -5098020, -5395846,
+ -5693425, -5990756, -6287836, -6584663, -6881233, -7177544, -7473593,
+ -7769378, -8064897, -8360146, -8655122, -8949824, -9244249, -9538393,
+ -9832255, -10125832, -10419121, -10712119, -11004825, -11297235,
+ -11589347, -11881158, -12172666, -12463868, -12754761, -13045344,
+ -13335613, -13625566, -13915200, -14204513, -14493502, -14782165,
+ -15070500, -15358503, -15646172, -15933505, -16220499, -16507152,
+ -16793461, -17079423, -17365037, -17650300, -17935209, -18219761,
+ -18503955, -18787788, -19071257, -19354360, -19637094, -19919457,
+ -20201447, -20483062, -20764298, -21045153, -21325625, -21605712,
+ -21885410, -22164719, -22443634, -22722155, -23000278, -23278001,
+ -23555322, -23832238, -24108748, -24384848, -24660536, -24935810,
+ -25210668, -25485107, -25759125, -26032720, -26305889, -26578630,
+ -26850941, -27122819, -27394262, -27665268, -27935834, -28205959,
+ -28475639, -28744873, -29013659, -29281994, -29549875, -29817301,
+ -30084270, -30350779, -30616826, -30882408, -31147524, -31412171,
+ -31676348, -31940051, -32203279, -32466029, -32728299, -32990088,
+ -33251393, -33512212, -33772542, -34032381, -34291728, -34550580,
+ -34808936, -35066792, -35324147, -35580998, -35837345, -36093183,
+ -36348512, -36603330, -36857633, -37111421, -37364691, -37617440,
+ -37869668, -38121372, -38372549, -38623198, -38873317, -39122903,
+ -39371956, -39620472, -39868449, -40115886, -40362781, -40609132,
+ -40854936, -41100192, -41344898, -41589051, -41832650, -42075693,
+ -42318178, -42560103, -42801467, -43042266, -43282499, -43522165,
+ -43761261, -43999785, -44237736, -44475112, -44711911, -44948130,
+ -45183769, -45418825, -45653296, -45887181, -46120477, -46353184,
+ -46585298, -46816819, -47047743, -47278071, -47507799, -47736927,
+ -47965451, -48193371, -48420685, -48647390, -48873486, -49098970,
+ -49323841, -49548096, -49771735, -49994756, -50217156, -50438934,
+ -50660088, -50880617, -51100519, -51319793, -51538435, -51756446,
+ -51973823, -52190565, -52406670, -52622136, -52836962, -53051146,
+ -53264686, -53477581, -53689829, -53901430, -54112380, -54322678,
+ -54532324, -54741315, -54949650, -55157327, -55364344, -55570701,
+ -55776395, -55981426, -56185791, -56389489, -56592519, -56794879,
+ -56996567, -57197583, -57397924, -57597590, -57796578, -57994887,
+ -58192516, -58389464, -58585729, -58781309, -58976203, -59170410,
+ -59363928, -59556757, -59748893, -59940337, -60131087, -60321142,
+ -60510499, -60699158, -60887118, -61074376, -61260932, -61446785,
+ -61631933, -61816375, -62000109, -62183135, -62365450, -62547055,
+ -62727946, -62908124, -63087587, -63266333, -63444362, -63621672,
+ -63798263, -63974132, -64149278, -64323701, -64497399, -64670372,
+ -64842617, -65014134, -65184921, -65354978, -65524303, -65692895,
+ -65860753, -66027876, -66194263, -66359913, -66524824, -66688995,
+ -66852426, -67015116, -67177062, -67338265, -67498723, -67658435,
+ -67817400, -67975617, -68133086, -68289804, -68445771, -68600986,
+ -68755449, -68909157, -69062111, -69214309, -69365749, -69516432,
+ -69666357, -69815522, -69963926, -70111568, -70258449, -70404566,
+ -70549918, -70694506, -70838328, -70981383, -71123670, -71265189,
+ -71405938, -71545917, -71685125, -71823562, -71961225, -72098115,
+ -72234231, -72369571, -72504136, -72637924, -72770935, -72903167,
+ -73034621, -73165295, -73295188, -73424300, -73552631, -73680179,
+ -73806943, -73932924, -74058120, -74182530, -74306155, -74428993,
+ -74551043, -74672306, -74792780, -74912465, -75031359, -75149464,
+ -75266777, -75383298, -75499027, -75613963, -75728106, -75841455,
+ -75954009, -76065767, -76176730, -76286897, -76396267, -76504840,
+ -76612615, -76719591, -76825769, -76931148, -77035726, -77139504,
+ -77242482, -77344658, -77446033, -77546605, -77646375, -77745342,
+ -77843506, -77940866, -78037421, -78133172, -78228118, -78322258,
+ -78415593, -78508122, -78599844, -78690759, -78780867, -78870168,
+ -78958661, -79046345, -79133222, -79219289, -79304547, -79388996,
+ -79472636, -79555465, -79637484, -79718693, -79799091, -79878679,
+ -79957455, -80035420, -80112573, -80188914, -80264444, -80339161,
+ -80413066, -80486158, -80558438, -80629905, -80700558, -80770399,
+ -80839426, -80907640, -80975040, -81041627, -81107400, -81172358,
+ -81236503, -81299834, -81362351, -81424054, -81484942, -81545016,
+ -81604275, -81662721, -81720351, -81777168, -81833170, -81888357,
+ -81942730, -81996289, -82049033, -82100962, -82152078, -82202379,
+ -82251865, -82300538, -82348396, -82395440, -82441670, -82487087,
+ -82531689, -82575478, -82618453, -82660614, -82701962, -82742497,
+ -82782219, -82821128, -82859224, -82896507, -82932978, -82968637,
+ -83003483, -83037518, -83070741, -83103152, -83134752, -83165541,
+ -83195519, -83224687, -83253044, -83280591, -83307328, -83333256,
+ -83358374, -83382684, -83406184, -83428877, -83450761, -83471837,
+ -83492106, -83511568, -83530223, -83548071, -83565114, -83581350,
+ -83596782, -83611408, -83625230, -83638247, -83650460, -83661870,
+ -83672477, -83682282, -83691284, -83699484, -83706884, -83713482,
+ -83719280, -83724277, -83728476, -83731875, -83734476, -83736279,
+ -83737284, -83737492, -83736904, -83735520, -83733340, -83730365,
+ -83726596, -83722033, -83716677, -83710528, -83703586, -83695854,
+ -83687330, -83678016, -83667912, -83657018, -83645337, -83632867,
+ -83619610, -83605566, -83590736, -83575121, -83558721, -83541536,
+ -83523569, -83504818, -83485286, -83464972, -83443878, -83422003,
+ -83399349, -83375917, -83351707, -83326719, -83300956, -83274417,
+ -83247103, -83219014, -83190153, -83160519, -83130113, -83098936,
+ -83066989, -83034273, -83000788, -82966535, -82931515, -82895729,
+ -82859178, -82821862, -82783783, -82744941, -82705337, -82664972,
+ -82623847, -82581963, -82539320, -82495920, -82451763, -82406851,
+ -82361184, -82314763, -82267589, -82219663, -82170986, -82121559,
+ -82071383, -82020459, -81968787, -81916370, -81863207, -81809299,
+ -81754649, -81699256, -81643122, -81586248, -81528634, -81470282,
+ -81411193, -81351368, -81290808, -81229514, -81167487, -81104727,
+ -81041237, -80977018, -80912069, -80846393, -80779990, -80712862,
+ -80645010, -80576434, -80507136, -80437117, -80366379, -80294922,
+ -80222747, -80149856, -80076249, -80001929, -79926895, -79851150,
+ -79774694, -79697529, -79619656, -79541075, -79461789, -79381798,
+ -79301104, -79219708, -79137611, -79054814, -78971318, -78887126,
+ -78802237, -78716654, -78630377, -78543408, -78455749, -78367399,
+ -78278362, -78188637, -78098226, -78007131, -77915353, -77822893,
+ -77729753, -77635933, -77541436, -77446262, -77350413, -77253890,
+ -77156694, -77058828, -76960291, -76861087, -76761215, -76660677,
+ -76559476, -76457611, -76355085, -76251899, -76148055, -76043553,
+ -75938395, -75832583, -75726118, -75619001, -75511234, -75402819,
+ -75293756, -75184048, -75073695, -74962700, -74851063, -74738786,
+ -74625871, -74512319, -74398131, -74283310, -74167856, -74051771,
+ -73935057, -73817715, -73699746, -73581153, -73461936, -73342097,
+ -73221639, -73100561, -72978867, -72856556, -72733632, -72610095,
+ -72485948, -72361191, -72235826, -72109855, -71983280, -71856101,
+ -71728322, -71599942, -71470964, -71341390, -71211220, -71080458,
+ -70949103, -70817159, -70684626, -70551507, -70417802, -70283514,
+ -70148643, -70013193, -69877164, -69740559, -69603378, -69465623,
+ -69327297, -69188401, -69048936, -68908904, -68768307, -68627147,
+ -68485425, -68343144, -68200304, -68056907, -67912956, -67768452,
+ -67623396, -67477791, -67331638, -67184938, -67037695, -66889908,
+ -66741581, -66592715, -66443311, -66293372, -66142899, -65991894,
+ -65840358, -65688295, -65535704, -65382589, -65228950, -65074790,
+ -64920111, -64764914, -64609201, -64452974, -64296235, -64138986,
+ -63981227, -63822962, -63664192, -63504919, -63345145, -63184871,
+ -63024100, -62862833, -62701072, -62538819, -62376075, -62212844,
+ -62049126, -61884924, -61720238, -61555072, -61389428, -61223306,
+ -61056709, -60889638, -60722096, -60554085, -60385607, -60216662,
+ -60047254, -59877384, -59707054, -59536266, -59365022, -59193323,
+ -59021173, -58848572, -58675523, -58502027, -58328087, -58153704,
+ -57978880, -57803618, -57627919, -57451786, -57275219, -57098222,
+ -56920796, -56742943, -56564664, -56385963, -56206841, -56027300,
+ -55847341, -55666968, -55486181, -55304984, -55123377, -54941363,
+ -54758944, -54576121, -54392898, -54209275, -54025255, -53840841,
+ -53656033, -53470833, -53285245, -53099270, -52912909, -52726166,
+ -52539041, -52351537, -52163657, -51975401, -51786773, -51597774,
+ -51408406, -51218671, -51028571, -50838109, -50647285, -50456104,
+ -50264565, -50072673, -49880427, -49687832, -49494888, -49301597,
+ -49107963, -48913986, -48719669, -48525014, -48330023, -48134699,
+ -47939042, -47743056, -47546742, -47350102, -47153139, -46955855,
+ -46758251, -46560330, -46362093, -46163544, -45964684, -45765515,
+ -45566039, -45366258, -45166175, -44965791, -44765109, -44564130,
+ -44362857, -44161293, -43959438, -43757295, -43554867, -43352154,
+ -43149161, -42945888, -42742337, -42538512, -42334413, -42130043,
+ -41925405, -41720499, -41515329, -41309897, -41104204, -40898253,
+ -40692046, -40485585, -40278872, -40071909, -39864699, -39657243,
+ -39449544, -39241604, -39033425, -38825008, -38616357, -38407473,
+ -38198359, -37989016, -37779448, -37569655, -37359640, -37149405,
+ -36938952, -36728284, -36517403, -36306310, -36095009, -35883500,
+ -35671786, -35459870, -35247754, -35035438, -34822927, -34610222,
+ -34397325, -34184238, -33970963, -33757503, -33543859, -33330035,
+ -33116031, -32901851, -32687495, -32472968, -32258269, -32043403,
+ -31828370, -31613174, -31397816, -31182298, -30966622, -30750792,
+ -30534808, -30318673, -30102389, -29885959, -29669384, -29452666,
+ -29235808, -29018813, -28801681, -28584415, -28367018, -28149491,
+ -27931837, -27714058, -27496156, -27278133, -27059991, -26841733,
+ -26623360, -26404875, -26186280, -25967577, -25748768, -25529856,
+ -25310842, -25091729, -24872518, -24653213, -24433814, -24214325,
+ -23994747, -23775083, -23555334, -23335503, -23115593, -22895604,
+ -22675540, -22455402, -22235192, -22014913, -21794568, -21574157,
+ -21353683, -21133148, -20912555, -20691906, -20471202, -20250446,
+ -20029639, -19808785, -19587885, -19366942, -19145957, -18924932,
+ -18703871, -18482774, -18261644, -18040483, -17819294, -17598077,
+ -17376837, -17155574, -16934290, -16712989, -16491671, -16270340,
+ -16048997, -15827644, -15606283, -15384917, -15163548, -14942177,
+ -14720808, -14499441, -14278079, -14056725, -13835380, -13614046,
+ -13392726, -13171421, -12950134, -12728867, -12507622, -12286400,
+ -12065205, -11844038, -11622901, -11401796, -11180726, -10959692,
+ -10738697, -10517743, -10296831, -10075964, -9855144, -9634372,
+ -9413652, -9192985, -8972373, -8751818, -8531323, -8310889, -8090518,
+ -7870213, -7649975, -7429807, -7209710, -6989687, -6769740, -6549871,
+ -6330081, -6110373, -5890749, -5671211, -5451761, -5232401, -5013133,
+ -4793959, -4574881, -4355901, -4137021, -3918244, -3699570, -3481003,
+ -3262544, -3044195, -2825958, -2607836, -2389829, -2171941, -1954173,
+ -1736528, -1519006, -1301611, -1084343, -867206, -650202, -433331,
+ -216596, 0, 216456, 432771, 648941, 864966, 1080842, 1296569, 1512144,
+ 1727565, 1942831, 2157938, 2372886, 2587673, 2802296, 3016753, 3231043,
+ 3445164, 3659114, 3872890, 4086491, 4299915, 4513161, 4726225, 4939107,
+ 5151804, 5364314, 5576636, 5788767, 6000706, 6212451, 6424000, 6635351,
+ 6846502, 7057451, 7268197, 7478737, 7689070, 7899194, 8109107, 8318806,
+ 8528291, 8737559, 8946609, 9155438, 9364045, 9572428, 9780585, 9988514,
+ 10196214, 10403682, 10610917, 10817917, 11024680, 11231205, 11437489,
+ 11643530, 11849328, 12054880, 12260183, 12465238, 12670041, 12874591,
+ 13078886, 13282924, 13486704, 13690224, 13893482, 14096476, 14299205,
+ 14501666, 14703858, 14905780, 15107428, 15308803, 15509902, 15710723,
+ 15911264, 16111524, 16311502, 16511194, 16710601, 16909719, 17108547,
+ 17307084, 17505327, 17703276, 17900928, 18098282, 18295336, 18492088,
+ 18688537, 18884681, 19080518, 19276047, 19471265, 19666172, 19860766,
+ 20055045, 20249007, 20442651, 20635974, 20828977, 21021656, 21214010,
+ 21406038, 21597738, 21789108, 21980147, 22170853, 22361225, 22551260,
+ 22740958, 22930316, 23119334, 23308009, 23496341, 23684326, 23871965,
+ 24059255, 24246194, 24432782, 24619016, 24804896, 24990419, 25175584,
+ 25360389, 25544834, 25728916, 25912634, 26095986, 26278971, 26461587,
+ 26643834, 26825708, 27007210, 27188337, 27369088, 27549461, 27729455,
+ 27909069, 28088301, 28267149, 28445612, 28623690, 28801379, 28978679,
+ 29155588, 29332106, 29508229, 29683958, 29859291, 30034225, 30208761,
+ 30382896, 30556628, 30729958, 30902883, 31075401, 31247512, 31419214,
+ 31590506, 31761386, 31931853, 32101905, 32271542, 32440762, 32609563,
+ 32777945, 32945905, 33113443, 33280558, 33447247, 33613510, 33779345,
+ 33944751, 34109727, 34274271, 34438382, 34602060, 34765301, 34928107,
+ 35090474, 35252401, 35413889, 35574934, 35735537, 35895695, 36055408,
+ 36214674, 36373492, 36531861, 36689780, 36847247, 37004261, 37160821,
+ 37316926, 37472575, 37627766, 37782498, 37936770, 38090581, 38243930,
+ 38396815, 38549236, 38701191, 38852679, 39003699, 39154250, 39304330,
+ 39453939, 39603075, 39751738, 39899926, 40047638, 40194873, 40341630,
+ 40487908, 40633705, 40779021, 40923855, 41068205, 41212071, 41355451,
+ 41498345, 41640750, 41782667, 41924094, 42065031, 42205475, 42345427,
+ 42484885, 42623848, 42762315, 42900285, 43037757, 43174730, 43311204,
+ 43447177, 43582648, 43717616, 43852080, 43986040, 44119494, 44252441,
+ 44384881, 44516813, 44648235, 44779147, 44909548, 45039436, 45168812,
+ 45297673, 45426020, 45553851, 45681165, 45807962, 45934241, 46060000,
+ 46185240, 46309958, 46434154, 46557828, 46680979, 46803605, 46925706,
+ 47047281, 47168329, 47288849, 47408841, 47528304, 47647237, 47765639,
+ 47883510, 48000848, 48117653, 48233924, 48349661, 48464862, 48579527,
+ 48693655, 48807245, 48920297, 49032810, 49144783, 49256215, 49367107,
+ 49477456, 49587262, 49696525, 49805244, 49913419, 50021048, 50128130,
+ 50234666, 50340655, 50446096, 50550987, 50655330, 50759122, 50862364,
+ 50965054, 51067193, 51168779, 51269812, 51370291, 51470216, 51569586,
+ 51668400, 51766659, 51864360, 51961505, 52058091, 52154120, 52249589,
+ 52344499, 52438849, 52532638, 52625866, 52718533, 52810638, 52902180,
+ 52993158, 53083574, 53173425, 53262711, 53351432, 53439588, 53527178,
+ 53614201, 53700657, 53786546, 53871866, 53956619, 54040802, 54124417,
+ 54207461, 54289936, 54371840, 54453173, 54533935, 54614126, 54693744,
+ 54772790, 54851262, 54929162, 55006488, 55083240, 55159417, 55235020,
+ 55310048, 55384501, 55458377, 55531678, 55604403, 55676550, 55748121,
+ 55819114, 55889530, 55959368, 56028627, 56097308, 56165411, 56232934,
+ 56299878, 56366242, 56432027, 56497231, 56561855, 56625899, 56689361,
+ 56752243, 56814543, 56876262, 56937400, 56997955, 57057928, 57117319,
+ 57176128, 57234354, 57291997, 57349057, 57405534, 57461427, 57516737,
+ 57571464, 57625606, 57679165, 57732140, 57784530, 57836336, 57887558,
+ 57938196, 57988248, 58037716, 58086599, 58134898, 58182611, 58229739,
+ 58276282, 58322240, 58367613, 58412400, 58456602, 58500219, 58543250,
+ 58585696, 58627556, 58668831, 58709520, 58749624, 58789143, 58828075,
+ 58866423, 58904184, 58941361, 58977951, 59013957, 59049377, 59084212,
+ 59118461, 59152125, 59185204, 59217698, 59249607, 59280931, 59311670,
+ 59341824, 59371394, 59400379, 59428779, 59456595, 59483827, 59510475,
+ 59536538, 59562018, 59586914, 59611226, 59634955, 59658100, 59680662,
+ 59702642, 59724038, 59744852, 59765083, 59784732, 59803799, 59822284,
+ 59840188, 59857509, 59874250, 59890409, 59905988, 59920986, 59935404,
+ 59949241, 59962499, 59975176, 59987275, 59998794, 60009735, 60020097,
+ 60029881, 60039086, 60047714, 60055765, 60063238, 60070134, 60076454,
+ 60082198, 60087366, 60091958, 60095975, 60099417, 60102284, 60104577,
+ 60106297, 60107443, 60108015, 60108015, 60107443, 60106298, 60104582,
+ 60102295, 60099436, 60096007, 60092009, 60087440, 60082302, 60076596,
+ 60070321, 60063478, 60056067, 60048089, 60039545, 60030435, 60020758,
+ 60010517, 59999710, 59988340, 59976405, 59963907, 59950846, 59937223,
+ 59923038, 59908291, 59892983, 59877115, 59860688, 59843700, 59826154,
+ 59808050, 59789388, 59770168, 59750392, 59730060, 59709172, 59687729,
+ 59665732, 59643181, 59620076, 59596419, 59572209, 59547449, 59522137,
+ 59496274, 59469862, 59442901, 59415391, 59387334, 59358729, 59329577,
+ 59299880, 59269637, 59238849, 59207517, 59175642, 59143224, 59110264,
+ 59076762, 59042720, 59008138, 58973016, 58937355, 58901156, 58864420,
+ 58827148, 58789339, 58750995, 58712117, 58672705, 58632760, 58592282,
+ 58551273, 58509733, 58467663, 58425063, 58381935, 58338279, 58294096,
+ 58249386, 58204151, 58158391, 58112107, 58065300, 58017970, 57970118,
+ 57921746, 57872854, 57823442, 57773512, 57723064, 57672100, 57620619,
+ 57568624, 57516113, 57463090, 57409554, 57355506, 57300947, 57245877,
+ 57190299, 57134212, 57077618, 57020517, 56962910, 56904798, 56846182,
+ 56787064, 56727442, 56667320, 56606697, 56545575, 56483954, 56421835,
+ 56359219, 56296108, 56232501, 56168401, 56103807, 56038721, 55973144,
+ 55907077, 55840521, 55773476, 55705943, 55637925, 55569420, 55500432,
+ 55430959, 55361005, 55290568, 55219651, 55148255, 55076379, 55004027,
+ 54931197, 54857892, 54784113, 54709860, 54635134, 54559937, 54484269,
+ 54408132, 54331526, 54254453, 54176914, 54098909, 54020440, 53941508,
+ 53862113, 53782258, 53701942, 53621167, 53539935, 53458246, 53376100,
+ 53293501, 53210447, 53126942, 53042984, 52958577, 52873720, 52788415,
+ 52702663, 52616465, 52529823, 52442736, 52355208, 52267237, 52178827,
+ 52089977, 52000689, 51910965, 51820804, 51730209, 51639181, 51547720,
+ 51455828, 51363507, 51270756, 51177578, 51083973, 50989943, 50895488,
+ 50800611, 50705312, 50609592, 50513453, 50416896, 50319922, 50222531,
+ 50124727, 50026509, 49927878, 49828837, 49729385, 49629526, 49529259,
+ 49428585, 49327507, 49226025, 49124141, 49021855, 48919170, 48816086,
+ 48712604, 48608726, 48504453, 48399787, 48294727, 48189277, 48083437,
+ 47977208, 47870591, 47763589, 47656201, 47548430, 47440277, 47331743,
+ 47222829, 47113536, 47003866, 46893820, 46783400, 46672607, 46561441,
+ 46449905, 46337999, 46225726, 46113085, 46000079, 45886709, 45772977,
+ 45658882, 45544428, 45429615, 45314444, 45198917, 45083036, 44966800,
+ 44850213, 44733275, 44615987, 44498352, 44380369, 44262041, 44143370,
+ 44024355, 43904999, 43785303, 43665269, 43544897, 43424189, 43303147,
+ 43181772, 43060065, 42938028, 42815661, 42692968, 42569948, 42446603,
+ 42322934, 42198944, 42074633, 41950002, 41825054, 41699790, 41574210,
+ 41448317, 41322111, 41195595, 41068769, 40941635, 40814195, 40686449,
+ 40558400, 40430048, 40301396, 40172444, 40043194, 39913647, 39783805,
+ 39653669, 39523241, 39392522, 39261514, 39130218, 38998635, 38866767,
+ 38734615, 38602181, 38469466, 38336472, 38203200, 38069652, 37935829,
+ 37801732, 37667363, 37532723, 37397815, 37262638, 37127196, 36991489,
+ 36855518, 36719286, 36582793, 36446042, 36309033, 36171768, 36034249,
+ 35896477, 35758453, 35620180, 35481658, 35342889, 35203875, 35064616,
+ 34925115, 34785373, 34645391, 34505172, 34364715, 34224024, 34083099,
+ 33941942, 33800554, 33658938, 33517094, 33375023, 33232728, 33090211,
+ 32947471, 32804512, 32661334, 32517939, 32374328, 32230503, 32086466,
+ 31942218, 31797761, 31653096, 31508224, 31363147, 31217867, 31072385,
+ 30926703, 30780822, 30634743, 30488469, 30342001, 30195340, 30048487,
+ 29901445, 29754215, 29606799, 29459197, 29311412, 29163444, 29015296,
+ 28866970, 28718466, 28569786, 28420931, 28271904, 28122706, 27973337,
+ 27823801, 27674098, 27524230, 27374198, 27224004, 27073650, 26923137,
+ 26772466, 26621640, 26470659, 26319525, 26168240, 26016806, 25865223,
+ 25713494, 25561619, 25409601, 25257441, 25105141, 24952702, 24800125,
+ 24647413, 24494567, 24341587, 24188477, 24035237, 23881869, 23728375,
+ 23574755, 23421012, 23267147, 23113162, 22959059, 22804838, 22650501,
+ 22496050, 22341487, 22186813, 22032029, 21877138, 21722140, 21567037,
+ 21411831, 21256523, 21101115, 20945609, 20790005, 20634306, 20478514,
+ 20322628, 20166652, 20010586, 19854433, 19698194, 19541870, 19385462,
+ 19228974, 19072405, 18915758, 18759034, 18602234, 18445361, 18288415,
+ 18131399, 17974313, 17817160, 17659941, 17502657, 17345310, 17187902,
+ 17030434, 16872908, 16715324, 16557686, 16399993, 16242249, 16084454,
+ 15926609, 15768718, 15610780, 15452797, 15294772, 15136705, 14978598,
+ 14820453, 14662272, 14504055, 14345804, 14187521, 14029207, 13870864,
+ 13712494, 13554097, 13395676, 13237232, 13078766, 12920281, 12761777,
+ 12603256, 12444719, 12286169, 12127607, 11969033, 11810451, 11651860,
+ 11493264, 11334662, 11176057, 11017451, 10858845, 10700240, 10541637,
+ 10383039, 10224447, 10065862, 9907287, 9748721, 9590168, 9431628,
+ 9273103, 9114594, 8956103, 8797632, 8639181, 8480753, 8322349, 8163971,
+ 8005619, 7847296, 7689002, 7530740, 7372511, 7214316, 7056158, 6898036,
+ 6739954, 6581911, 6423911, 6265954, 6108041, 5950175, 5792357, 5634588,
+ 5476869, 5319203, 5161590, 5004033, 4846532, 4689089, 4531705, 4374383,
+ 4217123, 4059926, 3902796, 3745732, 3588736, 3431810, 3274955, 3118173,
+ 2961464, 2804832, 2648276, 2491799, 2335401, 2179085, 2022852, 1866703,
+ 1710639, 1554663, 1398775, 1242977, 1087270, 931656, 776136, 620712,
+ 465385, 310156, 155027, 0, -154924, -309745, -464460, -619068, -773568,
+ -927959, -1082238, -1236404, -1390456, -1544394, -1698214, -1851916,
+ -2005499, -2158961, -2312300, -2465516, -2618607, -2771571, -2924408,
+ -3077115, -3229692, -3382137, -3534448, -3686625, -3838666, -3990569,
+ -4142334, -4293958, -4445441, -4596781, -4747977, -4899027, -5049931,
+ -5200686, -5351292, -5501747, -5652049, -5802198, -5952192, -6102030,
+ -6251710, -6401231, -6550592, -6699792, -6848828, -6997701, -7146408,
+ -7294948, -7443320, -7591523, -7739554, -7887414, -8035101, -8182613,
+ -8329949, -8477107, -8624087, -8770888, -8917507, -9063944, -9210198,
+ -9356266, -9502148, -9647843, -9793349, -9938665, -10083790, -10228723,
+ -10373461, -10518005, -10662352, -10806502, -10950453, -11094204,
+ -11237754, -11381101, -11524245, -11667183, -11809916, -11952441,
+ -12094757, -12236863, -12378759, -12520442, -12661911, -12803166,
+ -12944205, -13085027, -13225630, -13366014, -13506177, -13646118,
+ -13785836, -13925330, -14064599, -14203640, -14342454, -14481039,
+ -14619393, -14757516, -14895407, -15033064, -15170486, -15307672,
+ -15444621, -15581332, -15717803, -15854033, -15990022, -16125768,
+ -16261270, -16396526, -16531537, -16666300, -16800814, -16935079,
+ -17069093, -17202855, -17336364, -17469619, -17602618, -17735362,
+ -17867848, -18000075, -18132043, -18263750, -18395195, -18526377,
+ -18657296, -18787949, -18918337, -19048457, -19178309, -19307891,
+ -19437204, -19566245, -19695013, -19823508, -19951728, -20079673,
+ -20207341, -20334731, -20461843, -20588675, -20715226, -20841495,
+ -20967482, -21093185, -21218602, -21343734, -21468580, -21593137,
+ -21717405, -21841384, -21965072, -22088467, -22211570, -22334380,
+ -22456894, -22579113, -22701035, -22822659, -22943985, -23065010,
+ -23185736, -23306160, -23426281, -23546099, -23665612, -23784821,
+ -23903723, -24022317, -24140604, -24258581, -24376249, -24493606,
+ -24610651, -24727383, -24843802, -24959906, -25075694, -25191167,
+ -25306322, -25421159, -25535677, -25649875, -25763752, -25877308,
+ -25990541, -26103451, -26216037, -26328297, -26440232, -26551840,
+ -26663120, -26774071, -26884694, -26994986, -27104947, -27214576,
+ -27323873, -27432836, -27541465, -27649758, -27757716, -27865337,
+ -27972620, -28079565, -28186171, -28292437, -28398362, -28503946,
+ -28609187, -28714086, -28818640, -28922850, -29026714, -29130233,
+ -29233404, -29336228, -29438703, -29540829, -29642605, -29744031,
+ -29845105, -29945827, -30046196, -30146212, -30245873, -30345179,
+ -30444130, -30542724, -30640961, -30738840, -30836360, -30933522,
+ -31030323, -31126764, -31222844, -31318561, -31413916, -31508908,
+ -31603536, -31697799, -31791696, -31885228, -31978393, -32071191,
+ -32163621, -32255683, -32347375, -32438698, -32529650, -32620231,
+ -32710440, -32800278, -32889742, -32978833, -33067549, -33155892,
+ -33243858, -33331449, -33418664, -33505501, -33591961, -33678042,
+ -33763745, -33849068, -33934012, -34018575, -34102757, -34186558,
+ -34269976, -34353012, -34435664, -34517933, -34599818, -34681317,
+ -34762432, -34843160, -34923503, -35003458, -35083026, -35162207,
+ -35240999, -35319402, -35397415, -35475039, -35552273, -35629116,
+ -35705567, -35781627, -35857295, -35932570, -36007452, -36081940,
+ -36156034, -36229734, -36303039, -36375949, -36448463, -36520580,
+ -36592301, -36663625, -36734552, -36805080, -36875211, -36944942,
+ -37014275, -37083208, -37151741, -37219874, -37287607, -37354938,
+ -37421868, -37488396, -37554522, -37620246, -37685566, -37750484,
+ -37814997, -37879107, -37942813, -38006114, -38069010, -38131501,
+ -38193587, -38255266, -38316539, -38377406, -38437865, -38497918,
+ -38557563, -38616801, -38675630, -38734051, -38792063, -38849667,
+ -38906861, -38963646, -39020021, -39075986, -39131541, -39186685,
+ -39241419, -39295741, -39349653, -39403153, -39456241, -39508917,
+ -39561181, -39613032, -39664471, -39715497, -39766110, -39816310,
+ -39866096, -39915469, -39964427, -40012972, -40061103, -40108819,
+ -40156120, -40203007, -40249478, -40295535, -40341176, -40386402,
+ -40431212, -40475607, -40519585, -40563148, -40606294, -40649024,
+ -40691338, -40733235, -40774716, -40815780, -40856426, -40896656,
+ -40936469, -40975864, -41014842, -41053403, -41091546, -41129272,
+ -41166580, -41203470, -41239943, -41275997, -41311634, -41346852,
+ -41381653, -41416035, -41450000, -41483546, -41516673, -41549383,
+ -41581674, -41613547, -41645002, -41676038, -41706655, -41736855,
+ -41766636, -41795998, -41824942, -41853468, -41881575, -41909264,
+ -41936534, -41963386, -41989820, -42015835, -42041432, -42066611,
+ -42091372, -42115714, -42139639, -42163145, -42186233, -42208904,
+ -42231156, -42252991, -42274408, -42295407, -42315989, -42336153,
+ -42355900, -42375230, -42394142, -42412637, -42430715, -42448376,
+ -42465621, -42482448, -42498860, -42514854, -42530433, -42545595,
+ -42560341, -42574671, -42588586, -42602085, -42615168, -42627836,
+ -42640089, -42651927, -42663350, -42674358, -42684952, -42695132,
+ -42704897, -42714249, -42723187, -42731711, -42739822, -42747520,
+ -42754804, -42761676, -42768136, -42774183, -42779818, -42785041,
+ -42789853, -42794253, -42798242, -42801820, -42804987, -42807744,
+ -42810090, -42812027, -42813554, -42814671, -42815380, -42815679,
+ -42815570, -42815052, -42814127, -42812794, -42811053, -42808905,
+ -42806350, -42803388, -42800020, -42796246, -42792066, -42787481,
+ -42782491, -42777097, -42771297, -42765094, -42758487, -42751476,
+ -42744063, -42736246, -42728028, -42719407, -42710384, -42700961,
+ -42691136, -42680911, -42670285, -42659259, -42647834, -42636010,
+ -42623788, -42611166, -42598147, -42584731, -42570917, -42556706,
+ -42542099, -42527096, -42511698, -42495904, -42479716, -42463133,
+ -42446157, -42428787, -42411024, -42392868, -42374321, -42355381,
+ -42336051, -42316330, -42296218, -42275716, -42254825, -42233545,
+ -42211877, -42189821, -42167377, -42144545, -42121328, -42097724,
+ -42073735, -42049360, -42024601, -41999457, -41973930, -41948020,
+ -41921728, -41895053, -41867996, -41840559, -41812741, -41784542,
+ -41755965, -41727008, -41697673, -41667960, -41637869, -41607402,
+ -41576558, -41545339, -41513744, -41481775, -41449432, -41416715,
+ -41383626, -41350164, -41316330, -41282125, -41247549, -41212603,
+ -41177288, -41141604, -41105551, -41069131, -41032344, -40995190,
+ -40957670, -40919785, -40881535, -40842922, -40803944, -40764604,
+ -40724902, -40684838, -40644413, -40603628, -40562483, -40520979,
+ -40479117, -40436897, -40394319, -40351386, -40308096, -40264451,
+ -40220452, -40176099, -40131393, -40086334, -40040923, -39995161,
+ -39949049, -39902587, -39855775, -39808615, -39761108, -39713253,
+ -39665052, -39616505, -39567614, -39518378, -39468798, -39418876,
+ -39368611, -39318005, -39267058, -39215771, -39164145, -39112181,
+ -39059878, -39007238, -38954262, -38900951, -38847304, -38793323,
+ -38739009, -38684362, -38629384, -38574074, -38518433, -38462463,
+ -38406164, -38349537, -38292583, -38235302, -38177695, -38119763,
+ -38061506, -38002927, -37944024, -37884800, -37825254, -37765388,
+ -37705202, -37644698, -37583875, -37522736, -37461280, -37399508,
+ -37337422, -37275021, -37212308, -37149282, -37085945, -37022296,
+ -36958338, -36894071, -36829496, -36764613, -36699424, -36633928,
+ -36568128, -36502024, -36435617, -36368907, -36301895, -36234583,
+ -36166971, -36099060, -36030851, -35962345, -35893542, -35824443,
+ -35755050, -35685363, -35615383, -35545110, -35474547, -35403693,
+ -35332549, -35261117, -35189398, -35117391, -35045098, -34972521,
+ -34899659, -34826514, -34753086, -34679377, -34605387, -34531118,
+ -34456569, -34381743, -34306640, -34231260, -34155606, -34079677,
+ -34003475, -33927000, -33850254, -33773237, -33695950, -33618395,
+ -33540572, -33462482, -33384126, -33305505, -33226619, -33147471,
+ -33068060, -32988388, -32908456, -32828264, -32747814, -32667106,
+ -32586142, -32504922, -32423447, -32341718, -32259737, -32177504,
+ -32095020, -32012286, -31929304, -31846073, -31762595, -31678872,
+ -31594903, -31510690, -31426234, -31341536, -31256596, -31171417,
+ -31085998, -31000341, -30914447, -30828316, -30741950, -30655350,
+ -30568517, -30481451, -30394154, -30306627, -30218870, -30130885,
+ -30042672, -29954234, -29865570, -29776681, -29687570, -29598236,
+ -29508680, -29418905, -29328910, -29238697, -29148266, -29057619,
+ -28966758, -28875681, -28784392, -28692890, -28601178, -28509255,
+ -28417123, -28324783, -28232236, -28139483, -28046524, -27953362,
+ -27859997, -27766430, -27672662, -27578695, -27484528, -27390164,
+ -27295603, -27200846, -27105895, -27010750, -26915413, -26819884,
+ -26724164, -26628255, -26532158, -26435873, -26339403, -26242747,
+ -26145906, -26048883, -25951678, -25854291, -25756725, -25658980,
+ -25561057, -25462957, -25364681, -25266231, -25167607, -25068811,
+ -24969843, -24870705, -24771397, -24671922, -24572279, -24472470,
+ -24372496, -24272358, -24172057, -24071594, -23970970, -23870187,
+ -23769245, -23668146, -23566890, -23465478, -23363913, -23262194,
+ -23160323, -23058301, -22956129, -22853808, -22751339, -22648724,
+ -22545963, -22443057, -22340008, -22236816, -22133483, -22030010,
+ -21926398, -21822648, -21718760, -21614737, -21510579, -21406287,
+ -21301863, -21197307, -21092621, -20987806, -20882862, -20777791,
+ -20672594, -20567272, -20461826, -20356258, -20250568, -20144757,
+ -20038827, -19932778, -19826612, -19720330, -19613933, -19507421,
+ -19400797, -19294062, -19187215, -19080259, -18973194, -18866022,
+ -18758744, -18651360, -18543873, -18436282, -18328590, -18220797,
+ -18112904, -18004912, -17896823, -17788638, -17680357, -17571982,
+ -17463515, -17354955, -17246304, -17137564, -17028735, -16919818,
+ -16810815, -16701726, -16592554, -16483298, -16373960, -16264542,
+ -16155043, -16045466, -15935811, -15826079, -15716273, -15606392,
+ -15496437, -15386411, -15276314, -15166146, -15055910, -14945607,
+ -14835236, -14724801, -14614301, -14503737, -14393112, -14282425,
+ -14171679, -14060873, -13950010, -13839090, -13728115, -13617085,
+ -13506002, -13394867, -13283681, -13172444, -13061159, -12949825,
+ -12838445, -12727020, -12615549, -12504036, -12392480, -12280883,
+ -12169245, -12057569, -11945854, -11834103, -11722316, -11610495,
+ -11498639, -11386752, -11274833, -11162883, -11050905, -10938898,
+ -10826865, -10714805, -10602721, -10490613, -10378482, -10266330,
+ -10154157, -10041965, -9929755, -9817527, -9705283, -9593025, -9480752,
+ -9368467, -9256170, -9143862, -9031544, -8919218, -8806885, -8694545,
+ -8582200, -8469851, -8357499, -8245145, -8132789, -8020434, -7908080,
+ -7795729, -7683380, -7571037, -7458698, -7346367, -7234043, -7121727,
+ -7009422, -6897127, -6784844, -6672575, -6560319, -6448078, -6335854,
+ -6223647, -6111458, -5999289, -5887140, -5775013, -5662908, -5550827,
+ -5438770, -5326740, -5214736, -5102760, -4990813, -4878895, -4767009,
+ -4655155, -4543334, -4431547, -4319796, -4208081, -4096403, -3984763,
+ -3873163, -3761603, -3650085, -3538609, -3427177, -3315789, -3204447,
+ -3093152, -2981904, -2870705, -2759556, -2648458, -2537411, -2426418,
+ -2315478, -2204593, -2093765, -1982993, -1872279, -1761624, -1651029,
+ -1540495, -1430024, -1319615, -1209270, -1098991, -988778, -878631,
+ -768553, -658544, -548606, -438738, -328943, -219220, -109572, 0,
+ 109496, 218916, 328257, 437519, 546702, 655803, 764821, 873757, 982609,
+ 1091375, 1200056, 1308649, 1417155, 1525571, 1633897, 1742133, 1850276,
+ 1958327, 2066283, 2174145, 2281911, 2389580, 2497152, 2604624, 2711997,
+ 2819270, 2926440, 3033509, 3140473, 3247334, 3354088, 3460737, 3567278,
+ 3673711, 3780034, 3886248, 3992350, 4098340, 4204218, 4309981, 4415630,
+ 4521163, 4626579, 4731877, 4837057, 4942117, 5047057, 5151876, 5256572,
+ 5361146, 5465595, 5569919, 5674117, 5778188, 5882132, 5985947, 6089632,
+ 6193187, 6296610, 6399901, 6503059, 6606083, 6708972, 6811725, 6914342,
+ 7016821, 7119161, 7221362, 7323422, 7425342, 7527119, 7628753, 7730244,
+ 7831590, 7932790, 8033844, 8134751, 8235509, 8336119, 8436579, 8536888,
+ 8637045, 8737050, 8836901, 8936599, 9036141, 9135528, 9234758, 9333830,
+ 9432744, 9531499, 9630094, 9728528, 9826800, 9924910, 10022856,
+ 10120638, 10218255, 10315706, 10412991, 10510108, 10607057, 10703836,
+ 10800446, 10896885, 10993153, 11089248, 11185170, 11280918, 11376492,
+ 11471890, 11567111, 11662156, 11757022, 11851710, 11946219, 12040547,
+ 12134694, 12228660, 12322442, 12416042, 12509457, 12602688, 12695733,
+ 12788591, 12881262, 12973746, 13066040, 13158146, 13250061, 13341785,
+ 13433317, 13524657, 13615804, 13706757, 13797515, 13888078, 13978445,
+ 14068614, 14158587, 14248361, 14337936, 14427311, 14516486, 14605460,
+ 14694231, 14782800, 14871166, 14959328, 15047285, 15135037, 15222583,
+ 15309921, 15397053, 15483976, 15570690, 15657195, 15743489, 15829573,
+ 15915445, 16001104, 16086551, 16171784, 16256803, 16341606, 16426195,
+ 16510566, 16594721, 16678659, 16762378, 16845878, 16929159, 17012219,
+ 17095059, 17177677, 17260073, 17342246, 17424196, 17505922, 17587423,
+ 17668699, 17749749, 17830573, 17911169, 17991538, 18071678, 18151589,
+ 18231271, 18310723, 18389944, 18468933, 18547691, 18626216, 18704508,
+ 18782566, 18860390, 18937979, 19015332, 19092450, 19169331, 19245974,
+ 19322380, 19398547, 19474476, 19550165, 19625614, 19700823, 19775790,
+ 19850516, 19924999, 19999240, 20073237, 20146991, 20220500, 20293764,
+ 20366783, 20439556, 20512082, 20584361, 20656393, 20728176, 20799712,
+ 20870997, 20942034, 21012820, 21083356, 21153640, 21223673, 21293454,
+ 21362982, 21432257, 21501279, 21570046, 21638559, 21706817, 21774819,
+ 21842566, 21910056, 21977289, 22044264, 22110982, 22177442, 22243643,
+ 22309584, 22375266, 22440688, 22505849, 22570750, 22635388, 22699766,
+ 22763880, 22827732, 22891321, 22954646, 23017708, 23080504, 23143036,
+ 23205303, 23267304, 23329039, 23390508, 23451709, 23512644, 23573310,
+ 23633709, 23693839, 23753700, 23813293, 23872615, 23931667, 23990449,
+ 24048961, 24107201, 24165170, 24222867, 24280291, 24337443, 24394323,
+ 24450928, 24507261, 24563319, 24619103, 24674612, 24729846, 24784805,
+ 24839488, 24893896, 24948027, 25001881, 25055458, 25108758, 25161780,
+ 25214525, 25266991, 25319178, 25371087, 25422717, 25474067, 25525137,
+ 25575928, 25626438, 25676667, 25726615, 25776283, 25825669, 25874773,
+ 25923595, 25972135, 26020392, 26068366, 26116058, 26163466, 26210590,
+ 26257431, 26303987, 26350259, 26396247, 26441950, 26487368, 26532500,
+ 26577347, 26621908, 26666183, 26710173, 26753875, 26797291, 26840420,
+ 26883262, 26925817, 26968084, 27010064, 27051756, 27093159, 27134275,
+ 27175102, 27215640, 27255889, 27295850, 27335521, 27374903, 27413995,
+ 27452798, 27491311, 27529533, 27567466, 27605108, 27642460, 27679520,
+ 27716291, 27752770, 27788958, 27824854, 27860460, 27895774, 27930796,
+ 27965526, 27999964, 28034111, 28067965, 28101527, 28134796, 28167773,
+ 28200458, 28232849, 28264948, 28296754, 28328267, 28359487, 28390413,
+ 28421046, 28451386, 28481432, 28511185, 28540644, 28569809, 28598681,
+ 28627259, 28655543, 28683532, 28711228, 28738630, 28765737, 28792551,
+ 28819070, 28845295, 28871225, 28896861, 28922203, 28947250, 28972002,
+ 28996461, 29020624, 29044493, 29068068, 29091347, 29114333, 29137023,
+ 29159419, 29181521, 29203327, 29224839, 29246057, 29266979, 29287607,
+ 29307941, 29327980, 29347724, 29367174, 29386329, 29405189, 29423755,
+ 29442027, 29460004, 29477687, 29495075, 29512170, 29528969, 29545475,
+ 29561687, 29577604, 29593227, 29608557, 29623592, 29638333, 29652781,
+ 29666935, 29680795, 29694362, 29707635, 29720615, 29733301, 29745694,
+ 29757794, 29769601, 29781115, 29792336, 29803264, 29813899, 29824242,
+ 29834293, 29844051, 29853517, 29862691, 29871572, 29880162, 29888460,
+ 29896467, 29904182, 29911605, 29918738, 29925579, 29932129, 29938389,
+ 29944358, 29950036, 29955424, 29960522, 29965329, 29969847, 29974075,
+ 29978014, 29981663, 29985023, 29988094, 29990876, 29993370, 29995574,
+ 29997491, 29999119, 30000460, 30001513, 30002278, 30002756, 30002946,
+ 30002850, 30002467, 30001797, 30000841, 29999599, 29998071, 29996258,
+ 29994159, 29991774, 29989105, 29986151, 29982912, 29979389, 29975582,
+ 29971491, 29967117, 29962459, 29957518, 29952294, 29946788, 29940999,
+ 29934928, 29928575, 29921941, 29915025, 29907829, 29900351, 29892593,
+ 29884555, 29876237, 29867639, 29858762, 29849606, 29840171, 29830457,
+ 29820465, 29810195, 29799648, 29788823, 29777721, 29766343, 29754688,
+ 29742757, 29730550, 29718068, 29705310, 29692278, 29678971, 29665390,
+ 29651535, 29637406, 29623004, 29608330, 29593382, 29578163, 29562672,
+ 29546909, 29530875, 29514570, 29497994, 29481149, 29464034, 29446649,
+ 29428995, 29411073, 29392882, 29374423, 29355697, 29336703, 29317443,
+ 29297916, 29278123, 29258064, 29237740, 29217151, 29196298, 29175180,
+ 29153798, 29132154, 29110246, 29088075, 29065643, 29042948, 29019992,
+ 28996775, 28973298, 28949561, 28925563, 28901307, 28876791, 28852017,
+ 28826985, 28801696, 28776149, 28750345, 28724285, 28697969, 28671398,
+ 28644572, 28617491, 28590156, 28562567, 28534725, 28506630, 28478283,
+ 28449684, 28420833, 28391732, 28362379, 28332777, 28302926, 28272825,
+ 28242475, 28211877, 28181032, 28149939, 28118600, 28087014, 28055182,
+ 28023105, 27990783, 27958217, 27925407, 27892354, 27859057, 27825519,
+ 27791738, 27757716, 27723453, 27688950, 27654206, 27619224, 27584002,
+ 27548542, 27512845, 27476910, 27440738, 27404329, 27367685, 27330806,
+ 27293692, 27256344, 27218762, 27180947, 27142899, 27104619, 27066108,
+ 27027365, 26988392, 26949189, 26909757, 26870096, 26830206, 26790089,
+ 26749745, 26709173, 26668376, 26627353, 26586105, 26544633, 26502937,
+ 26461017, 26418875, 26376511, 26333925, 26291117, 26248090, 26204842,
+ 26161375, 26117690, 26073786, 26029664, 25985326, 25940771, 25896000,
+ 25851014, 25805813, 25760398, 25714770, 25668928, 25622875, 25576609,
+ 25530133, 25483446, 25436549, 25389443, 25342128, 25294604, 25246874,
+ 25198936, 25150792, 25102443, 25053888, 25005129, 24956166, 24907000,
+ 24857631, 24808061, 24758289, 24708316, 24658143, 24607770, 24557199,
+ 24506430, 24455463, 24404299, 24352938, 24301382, 24249631, 24197685,
+ 24145546, 24093214, 24040689, 23987972, 23935064, 23881965, 23828677,
+ 23775199, 23721533, 23667678, 23613637, 23559409, 23504994, 23450395,
+ 23395610, 23340642, 23285490, 23230156, 23174640, 23118942, 23063064,
+ 23007005, 22950767, 22894351, 22837756, 22780984, 22724036, 22666911,
+ 22609611, 22552137, 22494488, 22436667, 22378672, 22320506, 22262169,
+ 22203661, 22144983, 22086136, 22027120, 21967937, 21908586, 21849069,
+ 21789386, 21729539, 21669527, 21609351, 21549013, 21488512, 21427849,
+ 21367026, 21306043, 21244900, 21183598, 21122139, 21060522, 20998748,
+ 20936819, 20874734, 20812495, 20750102, 20687556, 20624858, 20562007,
+ 20499007, 20435855, 20372555, 20309105, 20245508, 20181763, 20117871,
+ 20053834, 19989651, 19925324, 19860853, 19796239, 19731483, 19666585,
+ 19601547, 19536368, 19471050, 19405593, 19339998, 19274267, 19208398,
+ 19142394, 19076255, 19009982, 18943575, 18877035, 18810364, 18743561,
+ 18676627, 18609564, 18542371, 18475050, 18407601, 18340026, 18272324,
+ 18204498, 18136546, 18068470, 18000272, 17931951, 17863508, 17794944,
+ 17726260, 17657457, 17588535, 17519495, 17450338, 17381064, 17311675,
+ 17242171, 17172552, 17102820, 17032976, 16963019, 16892952, 16822774,
+ 16752486, 16682090, 16611585, 16540973, 16470254, 16399430, 16328500,
+ 16257466, 16186328, 16115088, 16043745, 15972301, 15900757, 15829112,
+ 15757369, 15685527, 15613588, 15541553, 15469421, 15397194, 15324872,
+ 15252457, 15179949, 15107349, 15034657, 14961875, 14889002, 14816041,
+ 14742992, 14669854, 14596630, 14523320, 14449925, 14376445, 14302882,
+ 14229235, 14155507, 14081697, 14007806, 13933835, 13859786, 13785658,
+ 13711452, 13637170, 13562811, 13488377, 13413869, 13339287, 13264633,
+ 13189905, 13115107, 13040238, 12965299, 12890291, 12815215, 12740071,
+ 12664860, 12589583, 12514242, 12438835, 12363365, 12287832, 12212237,
+ 12136581, 12060864, 11985087, 11909251, 11833357, 11757405, 11681397,
+ 11605332, 11529213, 11453039, 11376811, 11300531, 11224198, 11147814,
+ 11071380, 10994895, 10918362, 10841781, 10765152, 10688476, 10611754,
+ 10534988, 10458177, 10381322, 10304424, 10227485, 10150504, 10073483,
+ 9996421, 9919321, 9842183, 9765007, 9687795, 9610546, 9533263, 9455945,
+ 9378594, 9301209, 9223793, 9146345, 9068867, 8991359, 8913822, 8836257,
+ 8758665, 8681046, 8603400, 8525730, 8448035, 8370317, 8292576, 8214813,
+ 8137028, 8059223, 7981398, 7903554, 7825692, 7747812, 7669916, 7592003,
+ 7514075, 7436133, 7358177, 7280209, 7202228, 7124235, 7046232, 6968219,
+ 6890197, 6812166, 6734128, 6656083, 6578032, 6499975, 6421914, 6343849,
+ 6265781, 6187710, 6109638, 6031565, 5953492, 5875420, 5797349, 5719280,
+ 5641214, 5563152, 5485094, 5407041, 5328994, 5250954, 5172921, 5094897,
+ 5016881, 4938875, 4860879, 4782894, 4704922, 4626961, 4549015, 4471082,
+ 4393164, 4315261, 4237375, 4159506, 4081655, 4003822, 3926008, 3848215,
+ 3770442, 3692690, 3614961, 3537255, 3459572, 3381913, 3304280, 3226673,
+ 3149092, 3071538, 2994012, 2916515, 2839048, 2761611, 2684204, 2606830,
+ 2529487, 2452178, 2374902, 2297661, 2220455, 2143285, 2066152, 1989056,
+ 1911998, 1834979, 1758000, 1681060, 1604162, 1527305, 1450491, 1373719,
+ 1296992, 1220309, 1143671, 1067079, 990533, 914035, 837585, 761183,
+ 684831, 608529, 532278, 456078, 379931, 303836, 227795, 151808, 75876,
+ 0, -75820, -151583, -227288, -302935, -378523, -454051, -529518,
+ -604925, -680270, -755552, -830771, -905927, -981017, -1056043,
+ -1131003, -1205896, -1280722, -1355480, -1430170, -1504790, -1579341,
+ -1653821, -1728229, -1802566, -1876831, -1951022, -2025139, -2099182,
+ -2173150, -2247041, -2320857, -2394595, -2468255, -2541837, -2615340,
+ -2688763, -2762106, -2835368, -2908548, -2981646, -3054660, -3127592,
+ -3200439, -3273201, -3345877, -3418467, -3490971, -3563387, -3635715,
+ -3707955, -3780105, -3852165, -3924134, -3996013, -4067799, -4139493,
+ -4211094, -4282602, -4354015, -4425333, -4496556, -4567682, -4638712,
+ -4709644, -4780478, -4851214, -4921850, -4992387, -5062823, -5133158,
+ -5203392, -5273523, -5343552, -5413477, -5483298, -5553015, -5622626,
+ -5692132, -5761531, -5830823, -5900007, -5969084, -6038052, -6106910,
+ -6175658, -6244296, -6312823, -6381239, -6449542, -6517732, -6585809,
+ -6653772, -6721620, -6789354, -6856972, -6924473, -6991858, -7059126,
+ -7126275, -7193307, -7260219, -7327011, -7393684, -7460236, -7526667,
+ -7592975, -7659162, -7725226, -7791166, -7856983, -7922674, -7988241,
+ -8053683, -8118998, -8184186, -8249248, -8314182, -8378987, -8443664,
+ -8508211, -8572629, -8636916, -8701073, -8765098, -8828991, -8892752,
+ -8956380, -9019874, -9083235, -9146461, -9209552, -9272507, -9335327,
+ -9398010, -9460556, -9522965, -9585235, -9647368, -9709361, -9771215,
+ -9832928, -9894502, -9955934, -10017225, -10078374, -10139381,
+ -10200245, -10260965, -10321542, -10381974, -10442261, -10502404,
+ -10562400, -10622251, -10681954, -10741511, -10800920, -10860181,
+ -10919293, -10978257, -11037071, -11095735, -11154249, -11212612,
+ -11270824, -11328884, -11386792, -11444547, -11502150, -11559599,
+ -11616894, -11674035, -11731021, -11787851, -11844527, -11901046,
+ -11957408, -12013614, -12069663, -12125553, -12181286, -12236860,
+ -12292275, -12347530, -12402626, -12457561, -12512336, -12566950,
+ -12621402, -12675692, -12729820, -12783786, -12837588, -12891227,
+ -12944702, -12998013, -13051159, -13104140, -13156955, -13209605,
+ -13262089, -13314406, -13366556, -13418539, -13470354, -13522001,
+ -13573480, -13624790, -13675930, -13726902, -13777703, -13828334,
+ -13878794, -13929083, -13979201, -14029148, -14078922, -14128524,
+ -14177953, -14227209, -14276291, -14325200, -14373935, -14422495,
+ -14470880, -14519090, -14567125, -14614984, -14662667, -14710174,
+ -14757503, -14804656, -14851631, -14898428, -14945048, -14991489,
+ -15037751, -15083834, -15129738, -15175462, -15221007, -15266371,
+ -15311555, -15356558, -15401379, -15446020, -15490478, -15534755,
+ -15578849, -15622761, -15666490, -15710036, -15753398, -15796577,
+ -15839571, -15882382, -15925008, -15967449, -16009705, -16051775,
+ -16093660, -16135359, -16176872, -16218199, -16259339, -16300292,
+ -16341058, -16381636, -16422027, -16462230, -16502245, -16542071,
+ -16581709, -16621158, -16660417, -16699488, -16738368, -16777059,
+ -16815560, -16853871, -16891991, -16929920, -16967659, -17005206,
+ -17042562, -17079726, -17116699, -17153479, -17190067, -17226463,
+ -17262666, -17298676, -17334494, -17370118, -17405548, -17440785,
+ -17475828, -17510677, -17545332, -17579792, -17614058, -17648129,
+ -17682005, -17715686, -17749172, -17782462, -17815557, -17848455,
+ -17881158, -17913664, -17945975, -17978088, -18010005, -18041726,
+ -18073249, -18104575, -18135704, -18166635, -18197369, -18227905,
+ -18258243, -18288384, -18318326, -18348070, -18377615, -18406962,
+ -18436110, -18465059, -18493810, -18522361, -18550713, -18578866,
+ -18606819, -18634573, -18662127, -18689481, -18716636, -18743590,
+ -18770344, -18796898, -18823252, -18849405, -18875358, -18901110,
+ -18926661, -18952012, -18977162, -19002110, -19026858, -19051404,
+ -19075749, -19099893, -19123835, -19147576, -19171115, -19194453,
+ -19217588, -19240522, -19263255, -19285785, -19308113, -19330239,
+ -19352163, -19373885, -19395405, -19416722, -19437837, -19458750,
+ -19479460, -19499968, -19520273, -19540376, -19560276, -19579974,
+ -19599468, -19618760, -19637850, -19656736, -19675420, -19693901,
+ -19712179, -19730254, -19748126, -19765796, -19783262, -19800526,
+ -19817586, -19834444, -19851098, -19867550, -19883799, -19899844,
+ -19915687, -19931327, -19946764, -19961997, -19977028, -19991856,
+ -20006481, -20020903, -20035122, -20049138, -20062951, -20076562,
+ -20089970, -20103174, -20116176, -20128976, -20141572, -20153966,
+ -20166157, -20178146, -20189932, -20201515, -20212896, -20224075,
+ -20235051, -20245825, -20256396, -20266765, -20276932, -20286897,
+ -20296660, -20306221, -20315580, -20324737, -20333692, -20342445,
+ -20350997, -20359347, -20367495, -20375442, -20383188, -20390732,
+ -20398075, -20405217, -20412158, -20418898, -20425437, -20431775,
+ -20437913, -20443849, -20449586, -20455122, -20460457, -20465593,
+ -20470528, -20475263, -20479798, -20484134, -20488270, -20492206,
+ -20495943, -20499480, -20502818, -20505958, -20508898, -20511639,
+ -20514182, -20516526, -20518671, -20520618, -20522367, -20523918,
+ -20525271, -20526426, -20527384, -20528144, -20528706, -20529072,
+ -20529240, -20529211, -20528986, -20528564, -20527945, -20527130,
+ -20526119, -20524912, -20523509, -20521911, -20520117, -20518128,
+ -20515943, -20513563, -20510989, -20508220, -20505257, -20502099,
+ -20498747, -20495201, -20491461, -20487528, -20483402, -20479082,
+ -20474569, -20469863, -20464965, -20459875, -20454592, -20449117,
+ -20443450, -20437592, -20431542, -20425301, -20418869, -20412246,
+ -20405432, -20398429, -20391235, -20383851, -20376277, -20368514,
+ -20360561, -20352420, -20344089, -20335570, -20326863, -20317967,
+ -20308883, -20299612, -20290153, -20280507, -20270674, -20260654,
+ -20250448, -20240056, -20229477, -20218712, -20207763, -20196627,
+ -20185307, -20173802, -20162112, -20150238, -20138180, -20125938,
+ -20113513, -20100905, -20088113, -20075139, -20061982, -20048643,
+ -20035122, -20021420, -20007536, -19993471, -19979225, -19964799,
+ -19950192, -19935406, -19920439, -19905294, -19889969, -19874465,
+ -19858782, -19842922, -19826883, -19810667, -19794273, -19777702,
+ -19760954, -19744030, -19726929, -19709653, -19692201, -19674574,
+ -19656771, -19638794, -19620643, -19602317, -19583818, -19565145,
+ -19546299, -19527280, -19508089, -19488726, -19469190, -19449483,
+ -19429605, -19409556, -19389336, -19368946, -19348386, -19327657,
+ -19306758, -19285691, -19264454, -19243050, -19221477, -19199737,
+ -19177830, -19155756, -19133515, -19111108, -19088535, -19065796,
+ -19042893, -19019824, -18996591, -18973194, -18949633, -18925909,
+ -18902021, -18877971, -18853759, -18829384, -18804848, -18780151,
+ -18755292, -18730273, -18705094, -18679755, -18654257, -18628599,
+ -18602783, -18576809, -18550676, -18524386, -18497939, -18471334,
+ -18444574, -18417657, -18390585, -18363357, -18335974, -18308437,
+ -18280746, -18252900, -18224902, -18196750, -18168446, -18139990,
+ -18111381, -18082622, -18053711, -18024650, -17995438, -17966077,
+ -17936566, -17906906, -17877097, -17847140, -17817036, -17786783,
+ -17756384, -17725838, -17695146, -17664309, -17633325, -17602197,
+ -17570925, -17539508, -17507947, -17476243, -17444396, -17412407,
+ -17380275, -17348002, -17315588, -17283033, -17250338, -17217502,
+ -17184527, -17151413, -17118160, -17084769, -17051241, -17017574,
+ -16983771, -16949832, -16915756, -16881545, -16847198, -16812717,
+ -16778101, -16743351, -16708468, -16673452, -16638304, -16603023,
+ -16567610, -16532066, -16496392, -16460587, -16424652, -16388588,
+ -16352394, -16316073, -16279623, -16243045, -16206340, -16169508,
+ -16132551, -16095467, -16058258, -16020924, -15983465, -15945882,
+ -15908176, -15870347, -15832395, -15794321, -15756125, -15717808,
+ -15679370, -15640812, -15602134, -15563337, -15524421, -15485386,
+ -15446233, -15406963, -15367576, -15328072, -15288452, -15248716,
+ -15208866, -15168900, -15128821, -15088627, -15048321, -15007902,
+ -14967370, -14926727, -14885972, -14845106, -14804130, -14763044,
+ -14721849, -14680545, -14639132, -14597612, -14555984, -14514249,
+ -14472407, -14430460, -14388407, -14346249, -14303986, -14261619,
+ -14219149, -14176576, -14133900, -14091122, -14048242, -14005262,
+ -13962181, -13918999, -13875718, -13832338, -13788859, -13745282,
+ -13701608, -13657836, -13613968, -13570004, -13525944, -13481788,
+ -13437539, -13393195, -13348757, -13304226, -13259603, -13214888,
+ -13170081, -13125182, -13080194, -13035115, -12989946, -12944689,
+ -12899343, -12853908, -12808387, -12762778, -12717082, -12671301,
+ -12625434, -12579482, -12533446, -12487325, -12441121, -12394834,
+ -12348465, -12302013, -12255481, -12208867, -12162173, -12115399,
+ -12068545, -12021613, -11974602, -11927514, -11880348, -11833105,
+ -11785786, -11738392, -11690922, -11643377, -11595758, -11548066,
+ -11500300, -11452461, -11404551, -11356569, -11308515, -11260391,
+ -11212197, -11163934, -11115601, -11067200, -11018731, -10970195,
+ -10921591, -10872921, -10824186, -10775385, -10726519, -10677588,
+ -10628594, -10579537, -10530417, -10481235, -10431990, -10382685,
+ -10333319, -10283893, -10234408, -10184863, -10135260, -10085598,
+ -10035880, -9986104, -9936272, -9886383, -9836440, -9786441, -9736389,
+ -9686282, -9636122, -9585909, -9535644, -9485328, -9434960, -9384541,
+ -9334073, -9283554, -9232987, -9182371, -9131707, -9080996, -9030237,
+ -8979432, -8928581, -8877685, -8826744, -8775759, -8724730, -8673657,
+ -8622542, -8571384, -8520185, -8468945, -8417664, -8366343, -8314982,
+ -8263582, -8212144, -8160668, -8109154, -8057603, -8006016, -7954393,
+ -7902735, -7851042, -7799314, -7747553, -7695758, -7643931, -7592071,
+ -7540180, -7488257, -7436304, -7384321, -7332308, -7280267, -7228196,
+ -7176098, -7123972, -7071820, -7019640, -6967435, -6915205, -6862950,
+ -6810670, -6758367, -6706040, -6653691, -6601319, -6548926, -6496511,
+ -6444076, -6391621, -6339146, -6286652, -6234139, -6181609, -6129060,
+ -6076495, -6023914, -5971316, -5918703, -5866075, -5813433, -5760777,
+ -5708107, -5655425, -5602730, -5550023, -5497306, -5444577, -5391838,
+ -5339090, -5286332, -5233566, -5180791, -5128009, -5075219, -5022423,
+ -4969621, -4916813, -4864001, -4811183, -4758362, -4705537, -4652709,
+ -4599878, -4547046, -4494212, -4441377, -4388542, -4335706, -4282872,
+ -4230038, -4177206, -4124376, -4071548, -4018724, -3965903, -3913086,
+ -3860274, -3807468, -3754666, -3701871, -3649083, -3596302, -3543528,
+ -3490763, -3438006, -3385258, -3332521, -3279793, -3227076, -3174370,
+ -3121676, -3068994, -3016324, -2963668, -2911026, -2858398, -2805784,
+ -2753186, -2700603, -2648036, -2595486, -2542953, -2490438, -2437941,
+ -2385463, -2333004, -2280564, -2228145, -2175746, -2123368, -2071012,
+ -2018677, -1966366, -1914077, -1861812, -1809571, -1757355, -1705163,
+ -1652997, -1600857, -1548743, -1496657, -1444597, -1392566, -1340563,
+ -1288589, -1236644, -1184729, -1132844, -1080990, -1029167, -977376,
+ -925617, -873891, -822198, -770538, -718913, -667322, -615766, -564246,
+ -512762, -461314, -409903, -358529, -307193, -255896, -204637, -153418,
+ -102238, -51098, 0, 51057, 102074, 153048, 203980, 254869, 305714,
+ 356516, 407273, 457986, 508654, 559275, 609851, 660380, 710862, 761297,
+ 811684, 862022, 912311, 962552, 1012742, 1062883, 1112972, 1163011,
+ 1212998, 1262934, 1312817, 1362647, 1412424, 1462147, 1511816, 1561431,
+ 1610990, 1660495, 1709943, 1759335, 1808670, 1857948, 1907169, 1956331,
+ 2005435, 2054480, 2103466, 2152392, 2201258, 2250063, 2298808, 2347490,
+ 2396112, 2444670, 2493166, 2541599, 2589969, 2638274, 2686515, 2734692,
+ 2782803, 2830849, 2878828, 2926741, 2974588, 3022367, 3070078, 3117721,
+ 3165296, 3212802, 3260239, 3307606, 3354903, 3402130, 3449285, 3496369,
+ 3543382, 3590323, 3637191, 3683986, 3730708, 3777356, 3823931, 3870431,
+ 3916856, 3963205, 4009480, 4055678, 4101800, 4147845, 4193813, 4239703,
+ 4285516, 4331250, 4376906, 4422482, 4467979, 4513396, 4558734, 4603990,
+ 4649166, 4694260, 4739273, 4784204, 4829052, 4873818, 4918500, 4963099,
+ 5007614, 5052045, 5096391, 5140652, 5184828, 5228918, 5272923, 5316841,
+ 5360672, 5404416, 5448072, 5491641, 5535122, 5578514, 5621818, 5665032,
+ 5708156, 5751191, 5794136, 5836990, 5879753, 5922424, 5965005, 6007493,
+ 6049889, 6092192, 6134403, 6176520, 6218544, 6260474, 6302309, 6344050,
+ 6385696, 6427247, 6468702, 6510061, 6551324, 6592491, 6633560, 6674533,
+ 6715408, 6756185, 6796864, 6837445, 6877927, 6918310, 6958593, 6998777,
+ 7038861, 7078844, 7118727, 7158509, 7198190, 7237770, 7277247, 7316622,
+ 7355895, 7395066, 7434133, 7473097, 7511957, 7550714, 7589366, 7627914,
+ 7666357, 7704695, 7742928, 7781055, 7819077, 7856992, 7894801, 7932502,
+ 7970097, 8007585, 8044965, 8082237, 8119402, 8156457, 8193404, 8230243,
+ 8266972, 8303591, 8340101, 8376501, 8412790, 8448970, 8485038, 8520995,
+ 8556841, 8592576, 8628198, 8663709, 8699107, 8734393, 8769566, 8804626,
+ 8839572, 8874405, 8909125, 8943730, 8978221, 9012597, 9046859, 9081005,
+ 9115037, 9148953, 9182753, 9216437, 9250006, 9283457, 9316792, 9350011,
+ 9383112, 9416096, 9448962, 9481711, 9514341, 9546854, 9579248, 9611523,
+ 9643680, 9675717, 9707636, 9739434, 9771113, 9802672, 9834112, 9865430,
+ 9896628, 9927706, 9958662, 9989498, 10020212, 10050805, 10081275,
+ 10111624, 10141851, 10171956, 10201938, 10231797, 10261533, 10291147,
+ 10320637, 10350004, 10379247, 10408366, 10437361, 10466233, 10494979,
+ 10523602, 10552099, 10580472, 10608720, 10636842, 10664839, 10692711,
+ 10720457, 10748077, 10775571, 10802938, 10830180, 10857295, 10884283,
+ 10911144, 10937878, 10964486, 10990965, 11017318, 11043543, 11069640,
+ 11095609, 11121450, 11147163, 11172747, 11198203, 11223530, 11248729,
+ 11273799, 11298739, 11323551, 11348233, 11372786, 11397209, 11421502,
+ 11445666, 11469699, 11493603, 11517376, 11541019, 11564532, 11587914,
+ 11611165, 11634285, 11657275, 11680133, 11702860, 11725456, 11747921,
+ 11770254, 11792455, 11814525, 11836463, 11858269, 11879943, 11901485,
+ 11922894, 11944172, 11965316, 11986329, 12007209, 12027956, 12048570,
+ 12069051, 12089399, 12109615, 12129697, 12149646, 12169461, 12189144,
+ 12208692, 12228107, 12247389, 12266537, 12285551, 12304431, 12323177,
+ 12341789, 12360267, 12378611, 12396821, 12414896, 12432837, 12450644,
+ 12468316, 12485853, 12503256, 12520525, 12537659, 12554657, 12571522,
+ 12588251, 12604845, 12621304, 12637629, 12653818, 12669872, 12685791,
+ 12701575, 12717223, 12732737, 12748115, 12763357, 12778465, 12793436,
+ 12808273, 12822974, 12837539, 12851969, 12866263, 12880421, 12894444,
+ 12908332, 12922083, 12935699, 12949180, 12962524, 12975733, 12988806,
+ 13001743, 13014544, 13027210, 13039740, 13052134, 13064392, 13076514,
+ 13088501, 13100351, 13112066, 13123645, 13135088, 13146395, 13157566,
+ 13168602, 13179501, 13190265, 13200893, 13211385, 13221742, 13231962,
+ 13242047, 13251996, 13261809, 13271487, 13281029, 13290435, 13299705,
+ 13308840, 13317839, 13326703, 13335431, 13344023, 13352480, 13360802,
+ 13368988, 13377038, 13384954, 13392733, 13400378, 13407887, 13415261,
+ 13422500, 13429604, 13436572, 13443406, 13450104, 13456668, 13463096,
+ 13469390, 13475549, 13481573, 13487463, 13493217, 13498837, 13504323,
+ 13509674, 13514891, 13519973, 13524921, 13529735, 13534414, 13538960,
+ 13543371, 13547648, 13551792, 13555801, 13559677, 13563420, 13567028,
+ 13570503, 13573845, 13577053, 13580128, 13583069, 13585878, 13588553,
+ 13591096, 13593506, 13595782, 13597926, 13599938, 13601817, 13603563,
+ 13605177, 13606659, 13608009, 13609227, 13610313, 13611266, 13612088,
+ 13612779, 13613338, 13613765, 13614061, 13614226, 13614260, 13614163,
+ 13613934, 13613575, 13613086, 13612465, 13611715, 13610834, 13609822,
+ 13608681, 13607410, 13606008, 13604477, 13602817, 13601027, 13599107,
+ 13597058, 13594880, 13592574, 13590138, 13587573, 13584880, 13582059,
+ 13579109, 13576031, 13572825, 13569491, 13566029, 13562440, 13558723,
+ 13554879, 13550907, 13546809, 13542583, 13538231, 13533752, 13529147,
+ 13524415, 13519557, 13514573, 13509464, 13504228, 13498867, 13493381,
+ 13487769, 13482032, 13476171, 13470184, 13464073, 13457838, 13451478,
+ 13444995, 13438387, 13431655, 13424800, 13417822, 13410720, 13403495,
+ 13396147, 13388677, 13381084, 13373368, 13365531, 13357571, 13349489,
+ 13341286, 13332961, 13324515, 13315948, 13307260, 13298451, 13289522,
+ 13280472, 13271302, 13262012, 13252602, 13243073, 13233424, 13223656,
+ 13213769, 13203763, 13193638, 13183395, 13173034, 13162555, 13151957,
+ 13141242, 13130410, 13119461, 13108394, 13097211, 13085911, 13074494,
+ 13062962, 13051313, 13039549, 13027669, 13015673, 13003563, 12991337,
+ 12978997, 12966543, 12953974, 12941291, 12928494, 12915583, 12902560,
+ 12889423, 12876172, 12862810, 12849334, 12835747, 12822047, 12808236,
+ 12794313, 12780278, 12766133, 12751876, 12737509, 12723031, 12708443,
+ 12693745, 12678938, 12664021, 12648994, 12633859, 12618614, 12603262,
+ 12587800, 12572231, 12556554, 12540769, 12524877, 12508878, 12492772,
+ 12476560, 12460241, 12443816, 12427285, 12410648, 12393906, 12377059,
+ 12360107, 12343051, 12325890, 12308625, 12291256, 12273784, 12256208,
+ 12238529, 12220747, 12202863, 12184876, 12166788, 12148598, 12130306,
+ 12111913, 12093418, 12074824, 12056128, 12037333, 12018437, 11999442,
+ 11980348, 11961154, 11941862, 11922471, 11902982, 11883394, 11863709,
+ 11843927, 11824047, 11804070, 11783997, 11763827, 11743561, 11723199,
+ 11702742, 11682190, 11661542, 11640800, 11619963, 11599032, 11578008,
+ 11556890, 11535678, 11514374, 11492976, 11471487, 11449905, 11428231,
+ 11406466, 11384609, 11362661, 11340623, 11318494, 11296276, 11273967,
+ 11251569, 11229081, 11206505, 11183840, 11161086, 11138245, 11115316,
+ 11092299, 11069195, 11046004, 11022727, 10999363, 10975914, 10952378,
+ 10928758, 10905052, 10881261, 10857386, 10833427, 10809384, 10785258,
+ 10761048, 10736755, 10712379, 10687922, 10663382, 10638760, 10614058,
+ 10589274, 10564409, 10539463, 10514438, 10489333, 10464148, 10438884,
+ 10413541, 10388119, 10362619, 10337041, 10311386, 10285653, 10259843,
+ 10233956, 10207993, 10181954, 10155839, 10129648, 10103383, 10077043,
+ 10050628, 10024139, 9997576, 9970940, 9944230, 9917447, 9890592,
+ 9863665, 9836666, 9809595, 9782453, 9755240, 9727956, 9700602, 9673178,
+ 9645685, 9618122, 9590490, 9562790, 9535021, 9507184, 9479279, 9451307,
+ 9423268, 9395162, 9366990, 9338752, 9310449, 9282079, 9253645, 9225146,
+ 9196583, 9167956, 9139265, 9110510, 9081693, 9052812, 9023870, 8994865,
+ 8965799, 8936671, 8907483, 8878233, 8848923, 8819553, 8790124, 8760635,
+ 8731087, 8701480, 8671815, 8642092, 8612312, 8582474, 8552579, 8522627,
+ 8492619, 8462555, 8432436, 8402261, 8372031, 8341747, 8311408, 8281016,
+ 8250569, 8220070, 8189518, 8158913, 8128256, 8097547, 8066786, 8035974,
+ 8005112, 7974199, 7943235, 7912222, 7881160, 7850048, 7818887, 7787679,
+ 7756422, 7725117, 7693765, 7662365, 7630919, 7599427, 7567889, 7536305,
+ 7504675, 7473001, 7441282, 7409519, 7377711, 7345861, 7313966, 7282029,
+ 7250050, 7218028, 7185964, 7153859, 7121713, 7089526, 7057298, 7025030,
+ 6992723, 6960376, 6927990, 6895565, 6863102, 6830601, 6798062, 6765486,
+ 6732872, 6700223, 6667536, 6634814, 6602057, 6569264, 6536436, 6503573,
+ 6470677, 6437746, 6404782, 6371785, 6338755, 6305693, 6272598, 6239472,
+ 6206315, 6173126, 6139906, 6106657, 6073377, 6040067, 6006729, 5973361,
+ 5939965, 5906540, 5873088, 5839607, 5806100, 5772566, 5739005, 5705418,
+ 5671806, 5638168, 5604504, 5570816, 5537104, 5503367, 5469607, 5435823,
+ 5402017, 5368187, 5334336, 5300462, 5266567, 5232650, 5198713, 5164754,
+ 5130776, 5096778, 5062760, 5028723, 4994667, 4960593, 4926500, 4892390,
+ 4858262, 4824117, 4789955, 4755777, 4721583, 4687373, 4653147, 4618907,
+ 4584652, 4550382, 4516099, 4481802, 4447491, 4413168, 4378832, 4344484,
+ 4310123, 4275751, 4241368, 4206974, 4172570, 4138155, 4103730, 4069296,
+ 4034853, 4000401, 3965940, 3931471, 3896994, 3862510, 3828019, 3793521,
+ 3759016, 3724506, 3689989, 3655468, 3620941, 3586409, 3551873, 3517333,
+ 3482789, 3448242, 3413691, 3379138, 3344583, 3310025, 3275466, 3240906,
+ 3206344, 3171782, 3137220, 3102657, 3068095, 3033533, 2998973, 2964413,
+ 2929856, 2895300, 2860747, 2826196, 2791649, 2757104, 2722564, 2688027,
+ 2653495, 2618967, 2584445, 2549927, 2515416, 2480910, 2446411, 2411918,
+ 2377432, 2342954, 2308483, 2274020, 2239566, 2205120, 2170683, 2136255,
+ 2101837, 2067429, 2033031, 1998644, 1964268, 1929902, 1895549, 1861207,
+ 1826877, 1792560, 1758256, 1723965, 1689688, 1655424, 1621174, 1586939,
+ 1552719, 1518514, 1484324, 1450150, 1415992, 1381850, 1347725, 1313617,
+ 1279526, 1245453, 1211398, 1177361, 1143343, 1109344, 1075364, 1041403,
+ 1007462, 973542, 939642, 905762, 871904, 838067, 804252, 770459,
+ 736688, 702940, 669215, 635513, 601834, 568180, 534549, 500944, 467363,
+ 433806, 400276, 366771, 333292, 299839, 266413, 233014, 199643, 166298,
+ 132982, 99693, 66433, 33202, 0, -33173, -66316, -99429, -132513,
+ -165566, -198588, -231579, -264538, -297466, -330362, -363226, -396057,
+ -428855, -461620, -494352, -527050, -559714, -592344, -624940, -657500,
+ -690025, -722515, -754969, -787387, -819769, -852115, -884423, -916694,
+ -948928, -981125, -1013283, -1045403, -1077485, -1109527, -1141531,
+ -1173495, -1205420, -1237305, -1269149, -1300953, -1332717, -1364439,
+ -1396120, -1427760, -1459357, -1490913, -1522426, -1553897, -1585324,
+ -1616709, -1648050, -1679347, -1710601, -1741810, -1772975, -1804095,
+ -1835170, -1866199, -1897183, -1928122, -1959014, -1989860, -2020659,
+ -2051411, -2082117, -2112775, -2143385, -2173948, -2204462, -2234928,
+ -2265345, -2295713, -2326033, -2356303, -2386523, -2416693, -2446813,
+ -2476883, -2506902, -2536870, -2566787, -2596653, -2626467, -2656229,
+ -2685939, -2715597, -2745202, -2774754, -2804253, -2833699, -2863092,
+ -2892430, -2921714, -2950945, -2980120, -3009241, -3038307, -3067318,
+ -3096273, -3125172, -3154016, -3182803, -3211534, -3240209, -3268826,
+ -3297387, -3325890, -3354336, -3382724, -3411054, -3439326, -3467539,
+ -3495694, -3523789, -3551826, -3579804, -3607722, -3635580, -3663378,
+ -3691116, -3718794, -3746411, -3773967, -3801462, -3828896, -3856268,
+ -3883579, -3910828, -3938015, -3965139, -3992201, -4019200, -4046136,
+ -4073009, -4099819, -4126565, -4153248, -4179866, -4206420, -4232910,
+ -4259336, -4285696, -4311992, -4338222, -4364387, -4390487, -4416521,
+ -4442488, -4468390, -4494226, -4519994, -4545696, -4571332, -4596900,
+ -4622401, -4647834, -4673200, -4698497, -4723727, -4748889, -4773982,
+ -4799006, -4823962, -4848849, -4873667, -4898415, -4923094, -4947703,
+ -4972243, -4996712, -5021111, -5045440, -5069698, -5093885, -5118002,
+ -5142047, -5166022, -5189925, -5213756, -5237515, -5261203, -5284818,
+ -5308362, -5331833, -5355231, -5378556, -5401809, -5424989, -5448095,
+ -5471128, -5494087, -5516973, -5539785, -5562523, -5585186, -5607776,
+ -5630291, -5652731, -5675096, -5697387, -5719602, -5741743, -5763807,
+ -5785797, -5807710, -5829548, -5851310, -5872996, -5894605, -5916139,
+ -5937595, -5958975, -5980278, -6001504, -6022653, -6043725, -6064720,
+ -6085636, -6106476, -6127237, -6147921, -6168527, -6189054, -6209503,
+ -6229874, -6250166, -6270380, -6290514, -6310570, -6330547, -6350444,
+ -6370263, -6390002, -6409661, -6429240, -6448740, -6468160, -6487500,
+ -6506760, -6525940, -6545039, -6564057, -6582996, -6601853, -6620630,
+ -6639325, -6657940, -6676473, -6694926, -6713296, -6731586, -6749794,
+ -6767920, -6785964, -6803927, -6821807, -6839606, -6857322, -6874956,
+ -6892508, -6909977, -6927363, -6944667, -6961888, -6979027, -6996082,
+ -7013054, -7029944, -7046750, -7063472, -7080112, -7096667, -7113140,
+ -7129528, -7145833, -7162054, -7178191, -7194244, -7210214, -7226098,
+ -7241899, -7257616, -7273248, -7288795, -7304258, -7319637, -7334931,
+ -7350140, -7365264, -7380303, -7395258, -7410127, -7424911, -7439610,
+ -7454224, -7468752, -7483196, -7497553, -7511826, -7526012, -7540113,
+ -7554129, -7568059, -7581902, -7595660, -7609333, -7622919, -7636419,
+ -7649833, -7663161, -7676403, -7689558, -7702628, -7715611, -7728507,
+ -7741317, -7754041, -7766678, -7779229, -7791693, -7804071, -7816361,
+ -7828565, -7840683, -7852713, -7864657, -7876513, -7888283, -7899966,
+ -7911562, -7923070, -7934492, -7945827, -7957074, -7968235, -7979308,
+ -7990294, -8001193, -8012004, -8022728, -8033365, -8043915, -8054377,
+ -8064751, -8075039, -8085239, -8095351, -8105376, -8115314, -8125164,
+ -8134926, -8144601, -8154188, -8163688, -8173100, -8182425, -8191662,
+ -8200811, -8209873, -8218847, -8227734, -8236533, -8245244, -8253867,
+ -8262403, -8270851, -8279212, -8287485, -8295670, -8303767, -8311777,
+ -8319699, -8327534, -8335281, -8342940, -8350511, -8357995, -8365391,
+ -8372700, -8379921, -8387054, -8394100, -8401058, -8407929, -8414712,
+ -8421407, -8428015, -8434535, -8440968, -8447313, -8453571, -8459742,
+ -8465825, -8471820, -8477728, -8483549, -8489283, -8494929, -8500488,
+ -8505959, -8511343, -8516640, -8521850, -8526973, -8532008, -8536957,
+ -8541818, -8546593, -8551280, -8555880, -8560394, -8564820, -8569160,
+ -8573413, -8577579, -8581658, -8585650, -8589556, -8593375, -8597108,
+ -8600754, -8604313, -8607787, -8611173, -8614474, -8617687, -8620815,
+ -8623857, -8626812, -8629681, -8632464, -8635161, -8637772, -8640297,
+ -8642737, -8645090, -8647358, -8649540, -8651636, -8653647, -8655572,
+ -8657412, -8659167, -8660836, -8662419, -8663918, -8665331, -8666660,
+ -8667903, -8669061, -8670135, -8671123, -8672027, -8672846, -8673581,
+ -8674231, -8674796, -8675277, -8675674, -8675986, -8676215, -8676359,
+ -8676419, -8676395, -8676288, -8676096, -8675821, -8675462, -8675020,
+ -8674494, -8673885, -8673192, -8672416, -8671557, -8670615, -8669590,
+ -8668482, -8667291, -8666018, -8664662, -8663223, -8661702, -8660099,
+ -8658413, -8656645, -8654795, -8652863, -8650849, -8648754, -8646576,
+ -8644317, -8641977, -8639555, -8637052, -8634468, -8631802, -8629056,
+ -8626228, -8623320, -8620331, -8617261, -8614111, -8610881, -8607570,
+ -8604179, -8600708, -8597157, -8593526, -8589816, -8586026, -8582156,
+ -8578207, -8574178, -8570071, -8565884, -8561618, -8557274, -8552851,
+ -8548349, -8543768, -8539109, -8534372, -8529557, -8524664, -8519693,
+ -8514644, -8509517, -8504313, -8499032, -8493673, -8488237, -8482724,
+ -8477134, -8471467, -8465723, -8459903, -8454007, -8448034, -8441985,
+ -8435860, -8429659, -8423383, -8417031, -8410603, -8404100, -8397521,
+ -8390868, -8384139, -8377336, -8370458, -8363505, -8356478, -8349377,
+ -8342202, -8334952, -8327629, -8320232, -8312761, -8305217, -8297600,
+ -8289909, -8282146, -8274309, -8266400, -8258418, -8250364, -8242237,
+ -8234039, -8225768, -8217425, -8209011, -8200525, -8191968, -8183339,
+ -8174640, -8165869, -8157028, -8148116, -8139133, -8130080, -8120957,
+ -8111764, -8102501, -8093168, -8083766, -8074294, -8064753, -8055143,
+ -8045463, -8035716, -8025899, -8016014, -8006061, -7996039, -7985950,
+ -7975793, -7965568, -7955275, -7944916, -7934489, -7923995, -7913434,
+ -7902807, -7892113, -7881352, -7870526, -7859633, -7848675, -7837651,
+ -7826562, -7815407, -7804187, -7792902, -7781552, -7770137, -7758658,
+ -7747115, -7735508, -7723836, -7712101, -7700303, -7688440, -7676515,
+ -7664526, -7652475, -7640361, -7628184, -7615945, -7603644, -7591280,
+ -7578855, -7566368, -7553820, -7541210, -7528539, -7515808, -7503015,
+ -7490162, -7477249, -7464275, -7451241, -7438148, -7424995, -7411782,
+ -7398510, -7385179, -7371789, -7358340, -7344833, -7331267, -7317643,
+ -7303961, -7290222, -7276424, -7262570, -7248658, -7234689, -7220663,
+ -7206581, -7192442, -7178246, -7163995, -7149688, -7135325, -7120906,
+ -7106433, -7091904, -7077320, -7062681, -7047988, -7033241, -7018439,
+ -7003583, -6988674, -6973711, -6958695, -6943625, -6928503, -6913328,
+ -6898100, -6882820, -6867487, -6852103, -6836667, -6821179, -6805640,
+ -6790050, -6774408, -6758716, -6742974, -6727181, -6711337, -6695444,
+ -6679501, -6663509, -6647467, -6631376, -6615236, -6599047, -6582809,
+ -6566524, -6550190, -6533808, -6517379, -6500902, -6484377, -6467806,
+ -6451187, -6434522, -6417811, -6401053, -6384249, -6367399, -6350503,
+ -6333562, -6316576, -6299545, -6282469, -6265348, -6248183, -6230974,
+ -6213721, -6196423, -6179083, -6161699, -6144272, -6126802, -6109289,
+ -6091733, -6074136, -6056496, -6038814, -6021091, -6003326, -5985520,
+ -5967673, -5949786, -5931857, -5913888, -5895879, -5877830, -5859742,
+ -5841614, -5823446, -5805239, -5786994, -5768710, -5750387, -5732026,
+ -5713627, -5695191, -5676717, -5658205, -5639656, -5621070, -5602448,
+ -5583789, -5565094, -5546362, -5527595, -5508792, -5489954, -5471081,
+ -5452172, -5433229, -5414251, -5395239, -5376193, -5357113, -5337999,
+ -5318852, -5299672, -5280458, -5261212, -5241933, -5222622, -5203279,
+ -5183904, -5164497, -5145058, -5125589, -5106088, -5086557, -5066994,
+ -5047402, -5027779, -5008127, -4988445, -4968733, -4948992, -4929222,
+ -4909423, -4889595, -4869740, -4849856, -4829944, -4810004, -4790037,
+ -4770042, -4750021, -4729972, -4709897, -4689796, -4669668, -4649515,
+ -4629336, -4609131, -4588901, -4568646, -4548366, -4528061, -4507732,
+ -4487379, -4467002, -4446602, -4426177, -4405730, -4385259, -4364766,
+ -4344250, -4323711, -4303151, -4282568, -4261964, -4241338, -4220691,
+ -4200023, -4179334, -4158624, -4137895, -4117144, -4096374, -4075585,
+ -4054775, -4033947, -4013099, -3992233, -3971348, -3950444, -3929523,
+ -3908583, -3887626, -3866651, -3845659, -3824650, -3803624, -3782581,
+ -3761523, -3740447, -3719356, -3698250, -3677127, -3655990, -3634837,
+ -3613670, -3592488, -3571291, -3550081, -3528856, -3507618, -3486366,
+ -3465101, -3443823, -3422532, -3401228, -3379912, -3358584, -3337244,
+ -3315892, -3294528, -3273154, -3251768, -3230371, -3208964, -3187546,
+ -3166118, -3144680, -3123233, -3101775, -3080309, -3058833, -3037349,
+ -3015855, -2994354, -2972844, -2951326, -2929800, -2908267, -2886727,
+ -2865179, -2843624, -2822063, -2800495, -2778921, -2757341, -2735755,
+ -2714163, -2692566, -2670964, -2649357, -2627745, -2606128, -2584508,
+ -2562883, -2541254, -2519622, -2497986, -2476347, -2454705, -2433060,
+ -2411412, -2389763, -2368111, -2346457, -2324801, -2303144, -2281485,
+ -2259826, -2238165, -2216504, -2194842, -2173180, -2151518, -2129857,
+ -2108195, -2086535, -2064875, -2043216, -2021558, -1999902, -1978248,
+ -1956595, -1934945, -1913296, -1891651, -1870008, -1848367, -1826731,
+ -1805097, -1783467, -1761841, -1740218, -1718600, -1696986, -1675377,
+ -1653773, -1632173, -1610579, -1588990, -1567407, -1545830, -1524259,
+ -1502694, -1481135, -1459583, -1438038, -1416500, -1394970, -1373446,
+ -1351931, -1330423, -1308924, -1287432, -1265949, -1244475, -1223010,
+ -1201554, -1180107, -1158670, -1137242, -1115824, -1094417, -1073019,
+ -1051632, -1030256, -1008891, -987537, -966194, -944863, -923543,
+ -902235, -880939, -859656, -838385, -817127, -795881, -774649, -753430,
+ -732224, -711032, -689854, -668690, -647540, -626405, -605284, -584178,
+ -563087, -542012, -520951, -499906, -478877, -457864, -436868, -415887,
+ -394923, -373976, -353045, -332132, -311236, -290358, -269497, -248654,
+ -227829, -207023, -186234, -165465, -144714, -123982, -103269, -82576,
+ -61902, -41248, -20614, 0, 20593, 41167, 61720, 82252, 102763, 123253,
+ 143721, 164168, 184594, 204997, 225378, 245737, 266074, 286388, 306680,
+ 326948, 347193, 367415, 387614, 407788, 427939, 448066, 468169, 488247,
+ 508301, 528331, 548335, 568314, 588268, 608197, 628100, 647978, 667829,
+ 687655, 707454, 727227, 746973, 766692, 786385, 806050, 825689, 845300,
+ 864883, 884438, 903966, 923466, 942937, 962380, 981794, 1001180,
+ 1020537, 1039865, 1059163, 1078433, 1097672, 1116882, 1136063, 1155213,
+ 1174333, 1193422, 1212482, 1231510, 1250508, 1269475, 1288411, 1307315,
+ 1326188, 1345030, 1363839, 1382617, 1401363, 1420077, 1438758, 1457407,
+ 1476023, 1494607, 1513157, 1531675, 1550159, 1568610, 1587027, 1605411,
+ 1623761, 1642077, 1660358, 1678606, 1696819, 1714997, 1733141, 1751250,
+ 1769324, 1787363, 1805366, 1823335, 1841267, 1859164, 1877025, 1894850,
+ 1912639, 1930392, 1948108, 1965788, 1983431, 2001037, 2018607, 2036139,
+ 2053634, 2071092, 2088512, 2105895, 2123239, 2140546, 2157815, 2175046,
+ 2192239, 2209393, 2226508, 2243585, 2260623, 2277622, 2294583, 2311504,
+ 2328385, 2345227, 2362030, 2378793, 2395516, 2412199, 2428842, 2445445,
+ 2462007, 2478530, 2495011, 2511452, 2527852, 2544211, 2560529, 2576806,
+ 2593042, 2609236, 2625389, 2641500, 2657569, 2673597, 2689582, 2705526,
+ 2721427, 2737286, 2753102, 2768876, 2784607, 2800296, 2815941, 2831544,
+ 2847103, 2862619, 2878092, 2893521, 2908907, 2924249, 2939548, 2954802,
+ 2970013, 2985179, 3000301, 3015379, 3030413, 3045402, 3060346, 3075246,
+ 3090101, 3104911, 3119676, 3134396, 3149070, 3163700, 3178284, 3192822,
+ 3207315, 3221762, 3236163, 3250519, 3264828, 3279091, 3293308, 3307479,
+ 3321604, 3335682, 3349713, 3363698, 3377636, 3391527, 3405372, 3419169,
+ 3432919, 3446623, 3460278, 3473887, 3487448, 3500961, 3514427, 3527845,
+ 3541216, 3554538, 3567813, 3581039, 3594218, 3607348, 3620430, 3633463,
+ 3646449, 3659385, 3672273, 3685113, 3697903, 3710645, 3723338, 3735982,
+ 3748576, 3761122, 3773619, 3786066, 3798464, 3810812, 3823111, 3835360,
+ 3847560, 3859710, 3871810, 3883861, 3895861, 3907812, 3919712, 3931563,
+ 3943363, 3955113, 3966812, 3978461, 3990060, 4001608, 4013106, 4024553,
+ 4035950, 4047295, 4058590, 4069834, 4081027, 4092169, 4103260, 4114299,
+ 4125288, 4136226, 4147112, 4157946, 4168730, 4179462, 4190142, 4200771,
+ 4211348, 4221874, 4232348, 4242770, 4253140, 4263459, 4273726, 4283940,
+ 4294103, 4304213, 4314272, 4324278, 4334232, 4344134, 4353984, 4363781,
+ 4373526, 4383218, 4392858, 4402446, 4411981, 4421463, 4430893, 4440270,
+ 4449594, 4458866, 4468085, 4477251, 4486364, 4495424, 4504432, 4513386,
+ 4522287, 4531136, 4539931, 4548673, 4557362, 4565998, 4574581, 4583111,
+ 4591587, 4600010, 4608380, 4616696, 4624959, 4633168, 4641324, 4649427,
+ 4657476, 4665472, 4673414, 4681303, 4689138, 4696919, 4704647, 4712322,
+ 4719942, 4727509, 4735022, 4742482, 4749887, 4757239, 4764537, 4771782,
+ 4778972, 4786109, 4793192, 4800221, 4807196, 4814117, 4820985, 4827798,
+ 4834558, 4841263, 4847915, 4854513, 4861056, 4867546, 4873982, 4880364,
+ 4886691, 4892965, 4899185, 4905351, 4911462, 4917520, 4923523, 4929473,
+ 4935368, 4941210, 4946997, 4952730, 4958410, 4964035, 4969606, 4975123,
+ 4980586, 4985995, 4991350, 4996651, 5001897, 5007090, 5012229, 5017313,
+ 5022344, 5027321, 5032243, 5037112, 5041926, 5046687, 5051393, 5056046,
+ 5060644, 5065189, 5069679, 5074116, 5078499, 5082827, 5087102, 5091323,
+ 5095490, 5099604, 5103663, 5107668, 5111620, 5115518, 5119362, 5123152,
+ 5126889, 5130572, 5134201, 5137776, 5141298, 5144766, 5148180, 5151541,
+ 5154848, 5158102, 5161302, 5164448, 5167541, 5170581, 5173567, 5176499,
+ 5179378, 5182204, 5184976, 5187695, 5190361, 5192974, 5195533, 5198039,
+ 5200492, 5202892, 5205238, 5207532, 5209772, 5211959, 5214094, 5216175,
+ 5218204, 5220179, 5222102, 5223972, 5225789, 5227553, 5229265, 5230924,
+ 5232530, 5234084, 5235585, 5237033, 5238430, 5239773, 5241064, 5242303,
+ 5243490, 5244624, 5245706, 5246736, 5247714, 5248639, 5249513, 5250334,
+ 5251104, 5251821, 5252487, 5253101, 5253663, 5254173, 5254632, 5255039,
+ 5255394, 5255698, 5255950, 5256151, 5256300, 5256398, 5256445, 5256441,
+ 5256385, 5256279, 5256121, 5255912, 5255652, 5255341, 5254980, 5254567,
+ 5254104, 5253590, 5253026, 5252411, 5251745, 5251029, 5250263, 5249446,
+ 5248579, 5247661, 5246694, 5245676, 5244609, 5243491, 5242324, 5241106,
+ 5239839, 5238522, 5237156, 5235740, 5234274, 5232759, 5231194, 5229580,
+ 5227917, 5226205, 5224443, 5222633, 5220773, 5218865, 5216908, 5214902,
+ 5212847, 5210743, 5208591, 5206391, 5204142, 5201845, 5199499, 5197105,
+ 5194663, 5192173, 5189635, 5187049, 5184415, 5181734, 5179005, 5176228,
+ 5173403, 5170532, 5167612, 5164646, 5161632, 5158571, 5155463, 5152308,
+ 5149106, 5145858, 5142562, 5139220, 5135831, 5132396, 5128915, 5125387,
+ 5121812, 5118192, 5114526, 5110813, 5107055, 5103250, 5099400, 5095505,
+ 5091563, 5087577, 5083544, 5079467, 5075344, 5071176, 5066963, 5062706,
+ 5058403, 5054055, 5049663, 5045226, 5040745, 5036219, 5031649, 5027034,
+ 5022375, 5017673, 5012926, 5008136, 5003301, 4998423, 4993502, 4988537,
+ 4983528, 4978476, 4973381, 4968243, 4963062, 4957837, 4952570, 4947261,
+ 4941908, 4936513, 4931076, 4925596, 4920074, 4914510, 4908904, 4903255,
+ 4897565, 4891834, 4886060, 4880245, 4874389, 4868491, 4862552, 4856571,
+ 4850550, 4844488, 4838385, 4832241, 4826056, 4819831, 4813566, 4807260,
+ 4800914, 4794528, 4788101, 4781635, 4775129, 4768584, 4761999, 4755374,
+ 4748710, 4742006, 4735264, 4728482, 4721662, 4714802, 4707904, 4700968,
+ 4693992, 4686979, 4679927, 4672837, 4665709, 4658542, 4651338, 4644097,
+ 4636817, 4629500, 4622146, 4614754, 4607325, 4599859, 4592356, 4584817,
+ 4577240, 4569627, 4561978, 4554292, 4546569, 4538811, 4531016, 4523186,
+ 4515320, 4507418, 4499480, 4491507, 4483499, 4475455, 4467376, 4459262,
+ 4451114, 4442930, 4434712, 4426459, 4418172, 4409851, 4401495, 4393106,
+ 4384682, 4376225, 4367733, 4359209, 4350650, 4342059, 4333434, 4324776,
+ 4316085, 4307361, 4298605, 4289816, 4280994, 4272140, 4263254, 4254335,
+ 4245385, 4236402, 4227388, 4218342, 4209265, 4200156, 4191016, 4181845,
+ 4172642, 4163409, 4154145, 4144850, 4135525, 4126170, 4116784, 4107368,
+ 4097922, 4088445, 4078940, 4069404, 4059839, 4050245, 4040621, 4030968,
+ 4021286, 4011575, 4001835, 3992067, 3982270, 3972445, 3962591, 3952710,
+ 3942800, 3932862, 3922897, 3912904, 3902883, 3892835, 3882760, 3872658,
+ 3862528, 3852372, 3842189, 3831980, 3821744, 3811481, 3801193, 3790878,
+ 3780537, 3770171, 3759779, 3749361, 3738918, 3728449, 3717955, 3707436,
+ 3696893, 3686324, 3675731, 3665113, 3654471, 3643805, 3633114, 3622400,
+ 3611661, 3600899, 3590114, 3579304, 3568472, 3557616, 3546737, 3535835,
+ 3524911, 3513963, 3502993, 3492001, 3480986, 3469950, 3458891, 3447810,
+ 3436708, 3425584, 3414438, 3403271, 3392083, 3380874, 3369643, 3358392,
+ 3347121, 3335828, 3324516, 3313183, 3301829, 3290456, 3279063, 3267650,
+ 3256218, 3244766, 3233295, 3221804, 3210294, 3198766, 3187219, 3175652,
+ 3164068, 3152465, 3140843, 3129204, 3117547, 3105871, 3094178, 3082467,
+ 3070739, 3058994, 3047231, 3035451, 3023655, 3011841, 3000011, 2988164,
+ 2976301, 2964422, 2952526, 2940615, 2928687, 2916744, 2904786, 2892812,
+ 2880822, 2868818, 2856798, 2844763, 2832714, 2820650, 2808572, 2796479,
+ 2784372, 2772251, 2760116, 2747967, 2735804, 2723628, 2711438, 2699235,
+ 2687019, 2674790, 2662548, 2650294, 2638026, 2625746, 2613454, 2601150,
+ 2588834, 2576505, 2564165, 2551813, 2539450, 2527075, 2514689, 2502292,
+ 2489884, 2477465, 2465035, 2452595, 2440144, 2427683, 2415212, 2402730,
+ 2390239, 2377738, 2365227, 2352707, 2340177, 2327639, 2315091, 2302534,
+ 2289968, 2277394, 2264811, 2252219, 2239619, 2227011, 2214395, 2201771,
+ 2189140, 2176500, 2163853, 2151199, 2138538, 2125869, 2113194, 2100511,
+ 2087822, 2075126, 2062424, 2049716, 2037001, 2024281, 2011554, 1998822,
+ 1986084, 1973340, 1960591, 1947837, 1935078, 1922314, 1909545, 1896771,
+ 1883993, 1871210, 1858422, 1845631, 1832836, 1820036, 1807233, 1794426,
+ 1781616, 1768802, 1755985, 1743165, 1730341, 1717515, 1704686, 1691855,
+ 1679021, 1666184, 1653346, 1640505, 1627662, 1614818, 1601971, 1589124,
+ 1576274, 1563424, 1550572, 1537719, 1524865, 1512010, 1499155, 1486299,
+ 1473442, 1460586, 1447729, 1434872, 1422015, 1409158, 1396302, 1383446,
+ 1370591, 1357736, 1344882, 1332029, 1319178, 1306327, 1293478, 1280631,
+ 1267784, 1254940, 1242098, 1229257, 1216419, 1203583, 1190749, 1177917,
+ 1165088, 1152262, 1139439, 1126619, 1113802, 1100988, 1088177, 1075370,
+ 1062567, 1049767, 1036971, 1024179, 1011391, 998607, 985827, 973052,
+ 960282, 947516, 934755, 921999, 909248, 896502, 883762, 871027, 858297,
+ 845573, 832855, 820143, 807437, 794737, 782043, 769355, 756674, 744000,
+ 731332, 718672, 706018, 693371, 680732, 668099, 655475, 642857, 630248,
+ 617646, 605052, 592466, 579888, 567319, 554758, 542205, 529661, 517126,
+ 504599, 492082, 479573, 467074, 454584, 442103, 429632, 417171, 404719,
+ 392277, 379845, 367423, 355011, 342610, 330219, 317838, 305469, 293110,
+ 280761, 268424, 256098, 243783, 231479, 219187, 206906, 194637, 182379,
+ 170134, 157900, 145679, 133469, 121272, 109087, 96915, 84755, 72608,
+ 60474, 48353, 36245, 24150, 12068, 0, -12055, -24096, -36124, -48138,
+ -60138, -72124, -84097, -96055, -107998, -119928, -131843, -143743,
+ -155629, -167499, -179355, -191196, -203022, -214833, -226628, -238408,
+ -250173, -261921, -273655, -285372, -297073, -308759, -320428, -332082,
+ -343719, -355339, -366943, -378531, -390102, -401656, -413193, -424713,
+ -436216, -447702, -459171, -470623, -482057, -493473, -504872, -516253,
+ -527616, -538962, -550289, -561599, -572890, -584163, -595417, -606653,
+ -617871, -629069, -640250, -651411, -662553, -673677, -684781, -695866,
+ -706932, -717979, -729006, -740013, -751001, -761969, -772918, -783846,
+ -794755, -805643, -816512, -827360, -838188, -848995, -859782, -870548,
+ -881294, -892019, -902723, -913407, -924069, -934710, -945330, -955929,
+ -966507, -977063, -987597, -998111, -1008602, -1019072, -1029520,
+ -1039946, -1050350, -1060732, -1071092, -1081430, -1091746, -1102039,
+ -1112310, -1122558, -1132784, -1142987, -1153167, -1163325, -1173459,
+ -1183571, -1193660, -1203725, -1213768, -1223787, -1233783, -1243755,
+ -1253704, -1263629, -1273531, -1283409, -1293263, -1303094, -1312900,
+ -1322683, -1332442, -1342176, -1351886, -1361572, -1371234, -1380871,
+ -1390484, -1400072, -1409636, -1419175, -1428690, -1438179, -1447644,
+ -1457083, -1466498, -1475888, -1485252, -1494592, -1503906, -1513194,
+ -1522458, -1531696, -1540908, -1550095, -1559256, -1568392, -1577501,
+ -1586585, -1595643, -1604675, -1613681, -1622661, -1631615, -1640543,
+ -1649444, -1658320, -1667168, -1675991, -1684786, -1693556, -1702298,
+ -1711015, -1719704, -1728367, -1737002, -1745611, -1754193, -1762748,
+ -1771276, -1779777, -1788251, -1796697, -1805116, -1813508, -1821873,
+ -1830210, -1838519, -1846802, -1855056, -1863283, -1871482, -1879654,
+ -1887798, -1895914, -1904002, -1912062, -1920094, -1928098, -1936074,
+ -1944022, -1951942, -1959834, -1967697, -1975532, -1983339, -1991117,
+ -1998867, -2006588, -2014281, -2021945, -2029581, -2037188, -2044766,
+ -2052316, -2059836, -2067328, -2074791, -2082226, -2089631, -2097007,
+ -2104354, -2111672, -2118961, -2126221, -2133451, -2140653, -2147825,
+ -2154968, -2162081, -2169165, -2176220, -2183245, -2190241, -2197207,
+ -2204143, -2211050, -2217927, -2224775, -2231593, -2238381, -2245139,
+ -2251868, -2258567, -2265236, -2271875, -2278484, -2285063, -2291612,
+ -2298131, -2304619, -2311078, -2317507, -2323906, -2330274, -2336612,
+ -2342920, -2349197, -2355445, -2361662, -2367848, -2374005, -2380130,
+ -2386226, -2392291, -2398325, -2404329, -2410303, -2416245, -2422158,
+ -2428039, -2433890, -2439711, -2445500, -2451259, -2456987, -2462685,
+ -2468352, -2473987, -2479593, -2485167, -2490710, -2496223, -2501704,
+ -2507155, -2512575, -2517964, -2523322, -2528648, -2533944, -2539209,
+ -2544443, -2549646, -2554818, -2559958, -2565068, -2570146, -2575193,
+ -2580209, -2585194, -2590148, -2595071, -2599962, -2604822, -2609651,
+ -2614449, -2619215, -2623951, -2628654, -2633327, -2637968, -2642578,
+ -2647157, -2651704, -2656220, -2660705, -2665158, -2669580, -2673971,
+ -2678330, -2682658, -2686954, -2691220, -2695453, -2699655, -2703826,
+ -2707966, -2712073, -2716150, -2720195, -2724209, -2728191, -2732142,
+ -2736061, -2739949, -2743805, -2747630, -2751423, -2755185, -2758916,
+ -2762615, -2766282, -2769918, -2773523, -2777096, -2780638, -2784148,
+ -2787627, -2791074, -2794490, -2797874, -2801227, -2804549, -2807839,
+ -2811097, -2814325, -2817520, -2820684, -2823817, -2826919, -2829989,
+ -2833027, -2836034, -2839010, -2841955, -2844868, -2847749, -2850599,
+ -2853418, -2856206, -2858962, -2861687, -2864380, -2867042, -2869673,
+ -2872273, -2874841, -2877378, -2879884, -2882358, -2884801, -2887213,
+ -2889594, -2891944, -2894262, -2896549, -2898805, -2901030, -2903223,
+ -2905386, -2907517, -2909618, -2911687, -2913725, -2915732, -2917708,
+ -2919653, -2921567, -2923451, -2925303, -2927124, -2928914, -2930673,
+ -2932402, -2934099, -2935766, -2937402, -2939007, -2940581, -2942124,
+ -2943637, -2945119, -2946570, -2947990, -2949380, -2950739, -2952068,
+ -2953366, -2954633, -2955870, -2957076, -2958252, -2959397, -2960511,
+ -2961596, -2962650, -2963673, -2964666, -2965629, -2966561, -2967463,
+ -2968335, -2969177, -2969988, -2970769, -2971520, -2972241, -2972932,
+ -2973593, -2974224, -2974824, -2975395, -2975936, -2976446, -2976927,
+ -2977378, -2977799, -2978191, -2978552, -2978884, -2979186, -2979459,
+ -2979702, -2979915, -2980098, -2980252, -2980377, -2980472, -2980537,
+ -2980574, -2980580, -2980558, -2980506, -2980425, -2980314, -2980175,
+ -2980006, -2979808, -2979581, -2979325, -2979039, -2978725, -2978382,
+ -2978010, -2977609, -2977179, -2976721, -2976234, -2975717, -2975173,
+ -2974599, -2973997, -2973367, -2972708, -2972020, -2971304, -2970560,
+ -2969787, -2968986, -2968156, -2967298, -2966413, -2965499, -2964556,
+ -2963586, -2962588, -2961562, -2960507, -2959425, -2958315, -2957177,
+ -2956012, -2954819, -2953598, -2952349, -2951073, -2949769, -2948438,
+ -2947079, -2945693, -2944280, -2942839, -2941371, -2939875, -2938353,
+ -2936803, -2935227, -2933623, -2931992, -2930335, -2928650, -2926939,
+ -2925201, -2923436, -2921644, -2919826, -2917981, -2916110, -2914212,
+ -2912288, -2910337, -2908360, -2906356, -2904327, -2902271, -2900189,
+ -2898081, -2895947, -2893787, -2891601, -2889390, -2887152, -2884889,
+ -2882599, -2880285, -2877944, -2875578, -2873187, -2870770, -2868328,
+ -2865860, -2863367, -2860849, -2858306, -2855737, -2853144, -2850525,
+ -2847882, -2845214, -2842521, -2839803, -2837060, -2834293, -2831501,
+ -2828684, -2825843, -2822978, -2820088, -2817174, -2814235, -2811273,
+ -2808286, -2805275, -2802240, -2799181, -2796099, -2792992, -2789862,
+ -2786708, -2783530, -2780328, -2777103, -2773855, -2770583, -2767288,
+ -2763969, -2760627, -2757262, -2753874, -2750463, -2747029, -2743572,
+ -2740092, -2736589, -2733063, -2729515, -2725944, -2722350, -2718734,
+ -2715096, -2711435, -2707752, -2704047, -2700319, -2696570, -2692798,
+ -2689004, -2685188, -2681351, -2677492, -2673610, -2669708, -2665783,
+ -2661838, -2657870, -2653881, -2649871, -2645840, -2641787, -2637714,
+ -2633619, -2629503, -2625366, -2621209, -2617030, -2612831, -2608611,
+ -2604371, -2600110, -2595828, -2591526, -2587204, -2582861, -2578499,
+ -2574116, -2569713, -2565290, -2560847, -2556384, -2551902, -2547399,
+ -2542877, -2538336, -2533775, -2529194, -2524594, -2519975, -2515337,
+ -2510679, -2506002, -2501307, -2496592, -2491858, -2487106, -2482335,
+ -2477545, -2472736, -2467909, -2463064, -2458200, -2453318, -2448417,
+ -2443499, -2438562, -2433607, -2428635, -2423644, -2418635, -2413609,
+ -2408565, -2403504, -2398425, -2393328, -2388214, -2383083, -2377934,
+ -2372769, -2367586, -2362386, -2357169, -2351936, -2346685, -2341418,
+ -2336134, -2330834, -2325517, -2320183, -2314833, -2309467, -2304085,
+ -2298686, -2293272, -2287841, -2282395, -2276932, -2271454, -2265960,
+ -2260451, -2254926, -2249385, -2243829, -2238258, -2232671, -2227070,
+ -2221453, -2215821, -2210174, -2204512, -2198836, -2193145, -2187439,
+ -2181718, -2175983, -2170234, -2164470, -2158692, -2152899, -2147093,
+ -2141272, -2135438, -2129589, -2123727, -2117851, -2111961, -2106058,
+ -2100141, -2094211, -2088267, -2082310, -2076340, -2070357, -2064360,
+ -2058351, -2052328, -2046293, -2040245, -2034185, -2028111, -2022026,
+ -2015927, -2009817, -2003694, -1997559, -1991411, -1985252, -1979081,
+ -1972897, -1966702, -1960495, -1954276, -1948046, -1941804, -1935551,
+ -1929286, -1923010, -1916723, -1910425, -1904115, -1897795, -1891464,
+ -1885121, -1878768, -1872405, -1866030, -1859646, -1853250, -1846845,
+ -1840429, -1834002, -1827566, -1821119, -1814663, -1808197, -1801720,
+ -1795234, -1788739, -1782233, -1775719, -1769194, -1762661, -1756118,
+ -1749565, -1743004, -1736434, -1729854, -1723266, -1716669, -1710063,
+ -1703448, -1696825, -1690193, -1683553, -1676904, -1670247, -1663582,
+ -1656909, -1650228, -1643538, -1636841, -1630136, -1623423, -1616703,
+ -1609974, -1603239, -1596496, -1589745, -1582987, -1576222, -1569450,
+ -1562671, -1555885, -1549092, -1542292, -1535485, -1528672, -1521852,
+ -1515025, -1508192, -1501353, -1494507, -1487655, -1480797, -1473933,
+ -1467063, -1460187, -1453306, -1446418, -1439525, -1432626, -1425722,
+ -1418812, -1411897, -1404976, -1398050, -1391119, -1384183, -1377243,
+ -1370297, -1363346, -1356390, -1349430, -1342465, -1335496, -1328522,
+ -1321544, -1314562, -1307575, -1300584, -1293589, -1286590, -1279587,
+ -1272580, -1265570, -1258555, -1251537, -1244516, -1237491, -1230463,
+ -1223431, -1216396, -1209358, -1202317, -1195272, -1188225, -1181175,
+ -1174122, -1167066, -1160008, -1152947, -1145884, -1138818, -1131750,
+ -1124679, -1117606, -1110531, -1103455, -1096376, -1089295, -1082212,
+ -1075128, -1068042, -1060954, -1053864, -1046774, -1039681, -1032588,
+ -1025493, -1018397, -1011300, -1004202, -997103, -990003, -982902,
+ -975801, -968698, -961596, -954492, -947389, -940284, -933180, -926075,
+ -918970, -911865, -904760, -897655, -890550, -883446, -876341, -869237,
+ -862134, -855031, -847928, -840826, -833725, -826624, -819524, -812426,
+ -805328, -798231, -791135, -784041, -776947, -769856, -762765, -755676,
+ -748588, -741502, -734418, -727336, -720255, -713176, -706099, -699024,
+ -691952, -684881, -677813, -670746, -663683, -656621, -649563, -642506,
+ -635453, -628402, -621354, -614308, -607266, -600227, -593190, -586157,
+ -579127, -572100, -565076, -558056, -551040, -544026, -537017, -530011,
+ -523008, -516010, -509015, -502024, -495038, -488055, -481076, -474102,
+ -467132, -460166, -453204, -446247, -439294, -432346, -425403, -418464,
+ -411530, -404600, -397676, -390757, -383842, -376933, -370029, -363130,
+ -356236, -349347, -342464, -335587, -328715, -321848, -314987, -308132,
+ -301283, -294439, -287601, -280770, -273944, -267124, -260310, -253503,
+ -246702, -239907, -233119, -226337, -219561, -212792, -206030, -199274,
+ -192525, -185783, -179048, -172319, -165598, -158884, -152176, -145476,
+ -138783, -132098, -125419, -118748, -112085, -105429, -98781, -92140,
+ -85507, -78881, -72263, -65654, -59052, -52458, -45872, -39294, -32724,
+ -26163, -19609, -13064, -6528, 0, 6519, 13031, 19533, 26027, 32513,
+ 38989, 45457, 51916, 58366, 64808, 71240, 77663, 84077, 90482, 96877,
+ 103264, 109641, 116008, 122367, 128715, 135054, 141384, 147704, 154014,
+ 160315, 166606, 172886, 179157, 185419, 191670, 197911, 204141, 210362,
+ 216573, 222773, 228963, 235143, 241312, 247471, 253619, 259757, 265884,
+ 272001, 278107, 284202, 290286, 296360, 302422, 308474, 314515, 320544,
+ 326563, 332571, 338567, 344552, 350526, 356489, 362440, 368380, 374308,
+ 380225, 386131, 392024, 397907, 403777, 409636, 415483, 421318, 427142,
+ 432954, 438753, 444541, 450317, 456080, 461832, 467571, 473298, 479013,
+ 484716, 490406, 496084, 501750, 507403, 513044, 518672, 524288, 529891,
+ 535481, 541059, 546624, 552176, 557715, 563242, 568756, 574257, 579744,
+ 585219, 590681, 596130, 601565, 606988, 612397, 617793, 623176, 628545,
+ 633902, 639244, 644574, 649890, 655192, 660481, 665756, 671018, 676266,
+ 681501, 686721, 691928, 697122, 702301, 707467, 712618, 717756, 722880,
+ 727990, 733086, 738168, 743236, 748289, 753329, 758354, 763365, 768362,
+ 773345, 778313, 783267, 788207, 793132, 798043, 802939, 807821, 812688,
+ 817541, 822379, 827202, 832011, 836806, 841585, 846350, 851100, 855835,
+ 860555, 865261, 869952, 874627, 879288, 883934, 888565, 893181, 897782,
+ 902368, 906938, 911494, 916034, 920559, 925069, 929564, 934044, 938508,
+ 942957, 947391, 951809, 956212, 960599, 964971, 969328, 973669, 977995,
+ 982305, 986599, 990878, 995142, 999389, 1003622, 1007838, 1012039,
+ 1016224, 1020393, 1024547, 1028685, 1032807, 1036913, 1041003, 1045078,
+ 1049136, 1053179, 1057206, 1061217, 1065212, 1069191, 1073154, 1077101,
+ 1081032, 1084947, 1088845, 1092728, 1096595, 1100445, 1104279, 1108098,
+ 1111900, 1115685, 1119455, 1123208, 1126945, 1130666, 1134371, 1138059,
+ 1141731, 1145387, 1149026, 1152649, 1156255, 1159845, 1163419, 1166977,
+ 1170517, 1174042, 1177550, 1181041, 1184516, 1187975, 1191417, 1194842,
+ 1198251, 1201644, 1205020, 1208379, 1211721, 1215047, 1218357, 1221650,
+ 1224926, 1228185, 1231428, 1234654, 1237864, 1241057, 1244233, 1247392,
+ 1250535, 1253661, 1256770, 1259862, 1262938, 1265997, 1269039, 1272064,
+ 1275073, 1278064, 1281039, 1283997, 1286938, 1289863, 1292770, 1295661,
+ 1298535, 1301392, 1304232, 1307055, 1309862, 1312651, 1315424, 1318179,
+ 1320918, 1323640, 1326345, 1329033, 1331704, 1334358, 1336995, 1339616,
+ 1342219, 1344805, 1347375, 1349927, 1352463, 1354981, 1357483, 1359968,
+ 1362435, 1364886, 1367320, 1369736, 1372136, 1374519, 1376884, 1379233,
+ 1381565, 1383880, 1386178, 1388459, 1390722, 1392969, 1395199, 1397412,
+ 1399608, 1401787, 1403949, 1406094, 1408222, 1410333, 1412427, 1414504,
+ 1416564, 1418607, 1420633, 1422642, 1424634, 1426609, 1428567, 1430508,
+ 1432433, 1434340, 1436230, 1438104, 1439960, 1441800, 1443622, 1445428,
+ 1447217, 1448988, 1450743, 1452481, 1454202, 1455906, 1457593, 1459264,
+ 1460917, 1462554, 1464173, 1465776, 1467362, 1468931, 1470483, 1472019,
+ 1473537, 1475039, 1476524, 1477992, 1479443, 1480878, 1482295, 1483696,
+ 1485080, 1486448, 1487798, 1489132, 1490449, 1491750, 1493033, 1494300,
+ 1495551, 1496784, 1498001, 1499201, 1500385, 1501552, 1502702, 1503836,
+ 1504953, 1506053, 1507137, 1508204, 1509255, 1510289, 1511306, 1512307,
+ 1513292, 1514260, 1515211, 1516146, 1517065, 1517967, 1518852, 1519721,
+ 1520574, 1521411, 1522230, 1523034, 1523821, 1524592, 1525347, 1526085,
+ 1526807, 1527512, 1528202, 1528875, 1529531, 1530172, 1530796, 1531405,
+ 1531997, 1532572, 1533132, 1533676, 1534203, 1534714, 1535209, 1535689,
+ 1536152, 1536599, 1537030, 1537445, 1537844, 1538227, 1538594, 1538945,
+ 1539281, 1539600, 1539904, 1540191, 1540463, 1540719, 1540959, 1541184,
+ 1541393, 1541586, 1541763, 1541924, 1542070, 1542200, 1542315, 1542414,
+ 1542497, 1542565, 1542617, 1542654, 1542675, 1542681, 1542671, 1542646,
+ 1542605, 1542549, 1542477, 1542390, 1542288, 1542171, 1542038, 1541890,
+ 1541726, 1541548, 1541354, 1541145, 1540921, 1540682, 1540427, 1540158,
+ 1539873, 1539574, 1539259, 1538929, 1538585, 1538225, 1537851, 1537461,
+ 1537057, 1536638, 1536204, 1535755, 1535292, 1534814, 1534321, 1533813,
+ 1533291, 1532754, 1532202, 1531636, 1531055, 1530460, 1529850, 1529225,
+ 1528587, 1527933, 1527266, 1526584, 1525887, 1525177, 1524451, 1523712,
+ 1522959, 1522191, 1521409, 1520613, 1519802, 1518978, 1518139, 1517287,
+ 1516420, 1515540, 1514645, 1513737, 1512814, 1511878, 1510928, 1509964,
+ 1508986, 1507995, 1506989, 1505970, 1504938, 1503891, 1502831, 1501758,
+ 1500671, 1499570, 1498456, 1497328, 1496187, 1495033, 1493865, 1492684,
+ 1491490, 1490282, 1489061, 1487827, 1486579, 1485319, 1484045, 1482758,
+ 1481458, 1480145, 1478819, 1477480, 1476129, 1474764, 1473386, 1471996,
+ 1470593, 1469177, 1467748, 1466306, 1464852, 1463385, 1461906, 1460414,
+ 1458909, 1457392, 1455862, 1454320, 1452766, 1451199, 1449620, 1448028,
+ 1446425, 1444809, 1443180, 1441540, 1439887, 1438223, 1436546, 1434857,
+ 1433156, 1431443, 1429719, 1427982, 1426233, 1424473, 1422701, 1420917,
+ 1419121, 1417314, 1415495, 1413664, 1411822, 1409968, 1408103, 1406226,
+ 1404338, 1402438, 1400527, 1398604, 1396671, 1394726, 1392770, 1390802,
+ 1388823, 1386834, 1384833, 1382821, 1380798, 1378764, 1376719, 1374664,
+ 1372597, 1370520, 1368431, 1366332, 1364223, 1362102, 1359971, 1357829,
+ 1355677, 1353514, 1351341, 1349157, 1346963, 1344758, 1342544, 1340318,
+ 1338083, 1335837, 1333581, 1331315, 1329038, 1326752, 1324456, 1322149,
+ 1319833, 1317506, 1315170, 1312824, 1310468, 1308102, 1305727, 1303342,
+ 1300947, 1298542, 1296128, 1293704, 1291271, 1288829, 1286377, 1283915,
+ 1281444, 1278964, 1276475, 1273976, 1271468, 1268951, 1266425, 1263889,
+ 1261345, 1258792, 1256229, 1253658, 1251078, 1248489, 1245891, 1243284,
+ 1240669, 1238045, 1235412, 1232771, 1230121, 1227463, 1224796, 1222121,
+ 1219437, 1216745, 1214044, 1211335, 1208618, 1205893, 1203159, 1200418,
+ 1197668, 1194910, 1192145, 1189371, 1186589, 1183800, 1181002, 1178197,
+ 1175384, 1172563, 1169735, 1166898, 1164055, 1161203, 1158344, 1155478,
+ 1152604, 1149723, 1146834, 1143938, 1141035, 1138125, 1135207, 1132282,
+ 1129350, 1126411, 1123465, 1120511, 1117551, 1114584, 1111610, 1108629,
+ 1105642, 1102647, 1099646, 1096639, 1093624, 1090603, 1087576, 1084541,
+ 1081501, 1078454, 1075400, 1072341, 1069274, 1066202, 1063123, 1060039,
+ 1056948, 1053851, 1050747, 1047638, 1044523, 1041402, 1038275, 1035142,
+ 1032003, 1028859, 1025708, 1022552, 1019391, 1016224, 1013051, 1009872,
+ 1006689, 1003499, 1000304, 997104, 993899, 990688, 987472, 984251,
+ 981025, 977793, 974556, 971315, 968068, 964816, 961560, 958299, 955032,
+ 951761, 948485, 945205, 941920, 938630, 935335, 932036, 928733, 925425,
+ 922112, 918795, 915474, 912148, 908819, 905485, 902146, 898804, 895458,
+ 892107, 888752, 885394, 882031, 878665, 875295, 871921, 868543, 865161,
+ 861776, 858387, 854994, 851598, 848198, 844795, 841388, 837978, 834565,
+ 831148, 827728, 824304, 820878, 817448, 814015, 810579, 807140, 803698,
+ 800253, 796805, 793354, 789900, 786444, 782984, 779522, 776058, 772590,
+ 769120, 765648, 762172, 758695, 755215, 751732, 748247, 744760, 741271,
+ 737779, 734285, 730789, 727290, 723790, 720287, 716783, 713276, 709768,
+ 706258, 702746, 699232, 695716, 692198, 688679, 685158, 681636, 678111,
+ 674586, 671059, 667530, 664000, 660468, 656936, 653401, 649866, 646329,
+ 642791, 639252, 635712, 632171, 628629, 625085, 621541, 617996, 614450,
+ 610903, 607355, 603807, 600257, 596707, 593157, 589605, 586054, 582501,
+ 578948, 575395, 571841, 568287, 564732, 561177, 557622, 554067, 550511,
+ 546955, 543399, 539843, 536287, 532731, 529175, 525618, 522062, 518507,
+ 514951, 511395, 507840, 504285, 500730, 497176, 493622, 490068, 486515,
+ 482962, 479410, 475859, 472308, 468757, 465208, 461659, 458110, 454563,
+ 451016, 447470, 443926, 440382, 436839, 433296, 429755, 426216, 422677,
+ 419139, 415602, 412067, 408533, 405000, 401469, 397938, 394410, 390882,
+ 387356, 383832, 380309, 376787, 373268, 369749, 366233, 362718, 359205,
+ 355693, 352184, 348676, 345170, 341666, 338164, 334664, 331166, 327670,
+ 324176, 320684, 317194, 313706, 310221, 306738, 303257, 299778, 296302,
+ 292828, 289356, 285887, 282420, 278956, 275494, 272035, 268578, 265124,
+ 261673, 258224, 254779, 251335, 247895, 244457, 241023, 237591, 234162,
+ 230736, 227313, 223893, 220476, 217062, 213651, 210243, 206839, 203437,
+ 200039, 196644, 193252, 189864, 186479, 183097, 179719, 176344, 172973,
+ 169605, 166241, 162880, 159522, 156169, 152819, 149473, 146130, 142791,
+ 139456, 136125, 132797, 129473, 126153, 122838, 119526, 116218, 112913,
+ 109613, 106317, 103026, 99738, 96454, 93174, 89899, 86628, 83361,
+ 80098, 76840, 73586, 70336, 67091, 63850, 60614, 57382, 54154, 50931,
+ 47713, 44499, 41290, 38085, 34885, 31690, 28499, 25313, 22132, 18956,
+ 15784, 12618, 9456, 6299, 3147, 0, -3142, -6279, -9411, -12538, -15660,
+ -18777, -21889, -24996, -28098, -31194, -34285, -37371, -40452, -43527,
+ -46598, -49662, -52722, -55776, -58825, -61868, -64906, -67938, -70965,
+ -73986, -77002, -80012, -83017, -86016, -89009, -91997, -94979, -97955,
+ -100926, -103891, -106850, -109803, -112751, -115692, -118628, -121558,
+ -124482, -127400, -130312, -133219, -136119, -139013, -141901, -144783,
+ -147659, -150529, -153393, -156251, -159102, -161948, -164787, -167620,
+ -170447, -173267, -176081, -178889, -181691, -184486, -187275, -190058,
+ -192834, -195604, -198367, -201124, -203874, -206618, -209355, -212086,
+ -214811, -217528, -220240, -222944, -225642, -228333, -231018, -233696,
+ -236368, -239032, -241690, -244341, -246986, -249623, -252254, -254878,
+ -257495, -260106, -262709, -265306, -267895, -270478, -273054, -275623,
+ -278185, -280740, -283288, -285829, -288363, -290890, -293410, -295922,
+ -298428, -300927, -303418, -305903, -308380, -310850, -313313, -315768,
+ -318217, -320658, -323092, -325519, -327939, -330351, -332756, -335153,
+ -337544, -339927, -342302, -344671, -347032, -349385, -351731, -354070,
+ -356401, -358725, -361041, -363350, -365652, -367946, -370232, -372511,
+ -374783, -377047, -379303, -381552, -383793, -386027, -388253, -390471,
+ -392682, -394885, -397081, -399268, -401449, -403621, -405786, -407943,
+ -410093, -412234, -414368, -416495, -418613, -420724, -422827, -424922,
+ -427010, -429089, -431161, -433225, -435281, -437330, -439370, -441403,
+ -443427, -445444, -447453, -449454, -451448, -453433, -455410, -457380,
+ -459342, -461295, -463241, -465179, -467108, -469030, -470944, -472850,
+ -474747, -476637, -478519, -480393, -482259, -484116, -485966, -487808,
+ -489641, -491467, -493284, -495094, -496895, -498689, -500474, -502251,
+ -504020, -505781, -507533, -509278, -511015, -512743, -514463, -516175,
+ -517879, -519575, -521263, -522943, -524614, -526277, -527932, -529579,
+ -531218, -532848, -534471, -536085, -537691, -539288, -540878, -542459,
+ -544032, -545597, -547154, -548702, -550243, -551775, -553298, -554814,
+ -556321, -557820, -559311, -560794, -562268, -563734, -565192, -566641,
+ -568083, -569516, -570941, -572357, -573766, -575166, -576557, -577941,
+ -579316, -580683, -582042, -583392, -584734, -586068, -587394, -588711,
+ -590020, -591321, -592613, -593898, -595174, -596441, -597701, -598952,
+ -600195, -601429, -602655, -603873, -605083, -606285, -607478, -608663,
+ -609839, -611008, -612168, -613320, -614463, -615599, -616726, -617844,
+ -618955, -620057, -621151, -622237, -623314, -624384, -625445, -626497,
+ -627542, -628578, -629606, -630626, -631637, -632641, -633636, -634623,
+ -635601, -636572, -637534, -638488, -639434, -640371, -641301, -642222,
+ -643135, -644039, -644936, -645824, -646705, -647577, -648440, -649296,
+ -650144, -650983, -651814, -652637, -653452, -654259, -655057, -655848,
+ -656630, -657404, -658171, -658929, -659678, -660420, -661154, -661880,
+ -662597, -663307, -664008, -664701, -665386, -666064, -666733, -667394,
+ -668047, -668692, -669329, -669958, -670579, -671192, -671797, -672394,
+ -672983, -673564, -674137, -674702, -675259, -675808, -676349, -676883,
+ -677408, -677926, -678435, -678937, -679430, -679916, -680394, -680864,
+ -681327, -681781, -682228, -682666, -683097, -683520, -683935, -684343,
+ -684742, -685134, -685518, -685895, -686263, -686624, -686977, -687322,
+ -687660, -687990, -688312, -688626, -688933, -689232, -689523, -689807,
+ -690083, -690352, -690613, -690866, -691111, -691349, -691580, -691803,
+ -692018, -692226, -692426, -692619, -692804, -692981, -693151, -693314,
+ -693469, -693617, -693757, -693890, -694015, -694133, -694243, -694346,
+ -694442, -694530, -694611, -694685, -694751, -694810, -694861, -694906,
+ -694942, -694972, -694994, -695010, -695017, -695018, -695011, -694997,
+ -694976, -694948, -694913, -694870, -694820, -694764, -694700, -694628,
+ -694550, -694465, -694373, -694273, -694167, -694053, -693932, -693805,
+ -693670, -693529, -693380, -693225, -693062, -692893, -692717, -692533,
+ -692343, -692146, -691943, -691732, -691515, -691290, -691059, -690821,
+ -690577, -690325, -690067, -689802, -689530, -689252, -688967, -688675,
+ -688377, -688072, -687760, -687442, -687117, -686785, -686447, -686103,
+ -685752, -685394, -685030, -684659, -684282, -683898, -683508, -683111,
+ -682708, -682299, -681883, -681461, -681033, -680598, -680157, -679709,
+ -679255, -678795, -678329, -677856, -677377, -676892, -676401, -675904,
+ -675400, -674890, -674374, -673852, -673324, -672790, -672250, -671703,
+ -671151, -670592, -670028, -669457, -668881, -668299, -667710, -667116,
+ -666516, -665910, -665298, -664680, -664057, -663427, -662792, -662151,
+ -661504, -660851, -660193, -659529, -658859, -658184, -657503, -656816,
+ -656124, -655426, -654722, -654013, -653298, -652578, -651852, -651120,
+ -650383, -649641, -648893, -648140, -647381, -646617, -645848, -645073,
+ -644293, -643507, -642716, -641920, -641118, -640312, -639500, -638682,
+ -637860, -637032, -636200, -635362, -634519, -633670, -632817, -631959,
+ -631095, -630226, -629353, -628474, -627591, -626702, -625809, -624910,
+ -624007, -623099, -622185, -621267, -620344, -619417, -618484, -617547,
+ -616605, -615658, -614706, -613750, -612789, -611823, -610853, -609878,
+ -608899, -607914, -606926, -605932, -604934, -603932, -602925, -601913,
+ -600898, -599877, -598852, -597823, -596790, -595752, -594709, -593663,
+ -592612, -591556, -590497, -589433, -588365, -587293, -586216, -585135,
+ -584050, -582961, -581868, -580771, -579670, -578564, -577455, -576341,
+ -575224, -574102, -572977, -571848, -570714, -569577, -568436, -567291,
+ -566142, -564989, -563833, -562672, -561508, -560340, -559169, -557993,
+ -556814, -555631, -554445, -553255, -552061, -550864, -549663, -548459,
+ -547251, -546039, -544824, -543606, -542384, -541158, -539930, -538697,
+ -537462, -536223, -534980, -533735, -532486, -531234, -529978, -528719,
+ -527457, -526192, -524924, -523652, -522377, -521099, -519818, -518534,
+ -517247, -515957, -514664, -513367, -512068, -510766, -509461, -508153,
+ -506842, -505528, -504211, -502891, -501569, -500243, -498915, -497584,
+ -496251, -494914, -493575, -492233, -490889, -489542, -488192, -486839,
+ -485484, -484127, -482766, -481404, -480038, -478671, -477300, -475928,
+ -474553, -473175, -471795, -470413, -469028, -467641, -466251, -464860,
+ -463466, -462069, -460671, -459270, -457867, -456462, -455055, -453645,
+ -452234, -450820, -449404, -447986, -446566, -445144, -443720, -442294,
+ -440866, -439436, -438004, -436570, -435135, -433697, -432258, -430816,
+ -429373, -427928, -426482, -425033, -423583, -422131, -420677, -419222,
+ -417765, -416306, -414846, -413384, -411921, -410456, -408989, -407521,
+ -406051, -404580, -403107, -401633, -400158, -398681, -397203, -395723,
+ -394242, -392759, -391275, -389790, -388304, -386816, -385327, -383837,
+ -382346, -380853, -379360, -377865, -376369, -374872, -373373, -371874,
+ -370374, -368872, -367370, -365866, -364362, -362856, -361350, -359843,
+ -358334, -356825, -355315, -353804, -352293, -350780, -349267, -347753,
+ -346238, -344722, -343206, -341689, -340171, -338652, -337133, -335614,
+ -334093, -332572, -331051, -329528, -328006, -326483, -324959, -323435,
+ -321910, -320385, -318859, -317333, -315806, -314280, -312752, -311225,
+ -309697, -308169, -306640, -305111, -303582, -302053, -300523, -298993,
+ -297463, -295933, -294403, -292872, -291342, -289811, -288280, -286749,
+ -285218, -283688, -282157, -280625, -279094, -277564, -276033, -274502,
+ -272971, -271440, -269910, -268379, -266849, -265319, -263789, -262259,
+ -260729, -259200, -257671, -256142, -254614, -253085, -251557, -250030,
+ -248503, -246976, -245449, -243923, -242397, -240872, -239347, -237823,
+ -236299, -234776, -233253, -231730, -230208, -228687, -227166, -225646,
+ -224127, -222608, -221090, -219572, -218055, -216539, -215023, -213508,
+ -211994, -210481, -208968, -207456, -205945, -204435, -202926, -201417,
+ -199910, -198403, -196897, -195392, -193888, -192384, -190882, -189381,
+ -187880, -186381, -184883, -183385, -181889, -180394, -178900, -177407,
+ -175915, -174424, -172934, -171445, -169958, -168472, -166986, -165503,
+ -164020, -162538, -161058, -159579, -158101, -156625, -155150, -153676,
+ -152203, -150732, -149262, -147794, -146327, -144861, -143397, -141934,
+ -140473, -139013, -137554, -136097, -134642, -133188, -131735, -130284,
+ -128835, -127387, -125940, -124496, -123053, -121611, -120171, -118733,
+ -117296, -115861, -114428, -112997, -111567, -110138, -108712, -107287,
+ -105864, -104443, -103024, -101606, -100190, -98776, -97364, -95954,
+ -94545, -93139, -91734, -90331, -88930, -87531, -86134, -84739, -83346,
+ -81955, -80565, -79178, -77793, -76410, -75028, -73649, -72272, -70897,
+ -69524, -68153, -66784, -65417, -64053, -62690, -61330, -59971, -58615,
+ -57261, -55910, -54560, -53213, -51868, -50525, -49184, -47846, -46510,
+ -45176, -43844, -42515, -41188, -39863, -38541, -37221, -35903, -34588,
+ -33275, -31964, -30656, -29350, -28047, -26746, -25447, -24151, -22857,
+ -21566, -20277, -18991, -17707, -16426, -15147, -13870, -12597, -11325,
+ -10057, -8790, -7527, -6266, -5007, -3752, -2498, -1248, 0
+};
diff --git a/usr/src/uts/common/io/audio/impl/audio_format.c b/usr/src/uts/common/io/audio/impl/audio_format.c
new file mode 100644
index 0000000000..b7385e336c
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_format.c
@@ -0,0 +1,894 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Audio format conversion routines used by audio.c
+ */
+
+#include <sys/types.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/g711.h>
+
+#include "audio_impl.h"
+#include "audio_grc3.h"
+
+
+/*
+ * Note: In the function below, the division by the number of channels is
+ * probably fairly expensive. It turns out that we usually deal with stereo
+ * or mono data, so perhaps it would be useful to build custom versions of
+ * this function that only dealt with stereo or mono.
+ */
+static int
+do_src(audio_stream_t *sp, void *p1, void *p2, int len, int nchan)
+{
+ int ch, size;
+
+ /*
+ * Note that we presume that we are doing sample rate
+ * conversions on AUDIO_FORMAT_S24_NE, which means that have 4
+ * byte and 32-bit samples.
+ */
+ size = sp->s_cnv_max / 4; /* sample size is 4 */
+ size /= nchan;
+
+ for (ch = 0; ch < nchan; ch++) {
+ grc3_convert(sp->s_src_state[ch], sp->s_src_quality,
+ p1, p2, len, size, nchan, ch);
+ }
+ return (((grc3state_t *)sp->s_src_state[0])->outsz);
+}
+
+static void
+setup_src(audio_stream_t *sp, int srate, int trate, int sch, int tch)
+{
+ int ch, nch;
+
+ nch = min(sch, tch);
+
+ ASSERT(nch <= AUDIO_MAX_CHANNELS);
+
+ if (sp->s_src_quality < 1)
+ sp->s_src_quality = 1;
+ if (sp->s_src_quality > 5)
+ sp->s_src_quality = 5;
+
+ for (ch = 0; ch < nch; ch++) {
+ grc3_reset(sp->s_src_state[ch]);
+ grc3_setup(sp->s_src_state[ch], srate, trate);
+ }
+}
+
+static int
+cnv_srconly(audio_stream_t *sp, int len)
+{
+ void *src = sp->s_cnv_src;
+ void *dst = sp->s_cnv_dst;
+
+ /*
+ * We must be using 24-bit native signed.
+ */
+ len = do_src(sp, src, dst, len, sp->s_cnv_src_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+
+ return (len);
+}
+
+static int
+cnv_s24oe(audio_stream_t *sp, int len)
+{
+ /*
+ * Endian switch works in both directions. We do it in place.
+ */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *src = ddi_swap32(*src);
+ src++;
+ }
+
+ return (len);
+}
+
+
+static int
+cnv_from_s8(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (*src++) << 16;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u8(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int8_t)((*src++) ^ 0x80) << 16;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_ulaw(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *dst++ = _8ulaw2linear16[(*src++)] << 8;
+ }
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_alaw(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ *dst++ = _8alaw2linear16[(*src++)] << 8;
+ }
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s16ne(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (*src++) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s16oe(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ int16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)(ddi_swap16(*src++)) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u16ne(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)((*src++) ^ 0x8000) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_u16oe(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint16_t *src = s;
+ int32_t *dst = d;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--)
+ *dst++ = (int16_t)(ddi_swap16((*src++) ^ 0x8000)) << 8;
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s24p(audio_stream_t *sp, int len)
+{
+ void *s = sp->s_cnv_src;
+ void *d = sp->s_cnv_dst;
+ uint8_t *src = s;
+ int32_t *dst = d;
+ int32_t tmp;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--) {
+ /* NB: this is a little endian format */
+ tmp = (*src++);
+ tmp |= (*src++) << 8;
+ tmp |= (*src++) << 16;
+ *dst++ = tmp;
+ }
+
+ sp->s_cnv_src = d;
+ sp->s_cnv_dst = s;
+ return (len);
+}
+
+static int
+cnv_from_s32ne(audio_stream_t *sp, int len)
+{
+ /* 32-bit conversions can be done in place */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--, src++)
+ *src = *src >> 8;
+
+ return (len);
+}
+
+static int
+cnv_from_s32oe(audio_stream_t *sp, int len)
+{
+ /* 32-bit conversions can be done in place */
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_src_nchan; i; i--, src++)
+ *src = (int32_t)(ddi_swap32(*src)) >> 8;
+
+ return (len);
+}
+
+/*
+ * NB: All the destination format conversions use the same or fewer
+ * bytes as the 24-bit unpacked (32-bits used per sample), so we can
+ * convert all of them in place.
+ */
+
+static int
+cnv_to_u8(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = (*src++ >> 16) ^ 0x80;
+
+ return (len);
+}
+
+static int
+cnv_to_s8(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = *src++ >> 16;
+
+ return (len);
+}
+
+static int
+cnv_to_ulaw(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ int idx = *src++;
+ idx >>= 10;
+ idx += G711_ULAW_MIDPOINT;
+ idx &= 0x3fff; /* safety precaution */
+ *dst++ = _14linear2ulaw8[idx];
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_alaw(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ int idx = *src++;
+ idx >>= 11;
+ idx += G711_ALAW_MIDPOINT;
+ idx &= 0x1fff; /* safety precaution */
+ *dst++ = _13linear2alaw8[idx];
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_s16ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = *src++ >> 8;
+
+ return (len);
+}
+
+static int
+cnv_to_s16oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ int16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = ddi_swap16(*src++ >> 8);
+
+ return (len);
+}
+
+static int
+cnv_to_u16ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = (*src++ >> 8) ^ 0x8000;
+
+ return (len);
+}
+
+static int
+cnv_to_u16oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint16_t *dst = (void *)src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--)
+ *dst++ = ddi_swap16(*src++ >> 8) ^ 0x8000;
+
+ return (len);
+}
+
+static int
+cnv_to_s24p(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+ uint8_t *dst = (void *)src;
+ int32_t d;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--) {
+ /* NB: this is a little endian format */
+ d = *src++;
+ *dst++ = d & 0xff;
+ *dst++ = (d >> 8) & 0xff;
+ *dst++ = (d >> 16) & 0xff;
+ }
+
+ return (len);
+}
+
+static int
+cnv_to_s32ne(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--, src++)
+ *src = *src << 8;
+
+ return (len);
+}
+
+static int
+cnv_to_s32oe(audio_stream_t *sp, int len)
+{
+ int32_t *src = sp->s_cnv_src;
+
+ for (int i = len * sp->s_cnv_dst_nchan; i; i--, src++)
+ *src = ddi_swap32(*src << 8);
+
+ return (len);
+}
+
+static int
+cnv_default(audio_stream_t *sp, int len)
+{
+ /*
+ * Note that the formats were already preverified during
+ * select_converter, to ensure that only supported formats are
+ * used.
+ */
+
+ /*
+ * Convert samples to 24 bit (32 bit lsb aligned) if
+ * necessary.
+ */
+
+ switch (sp->s_cnv_src_format) {
+
+ case AUDIO_FORMAT_U8:
+ len = cnv_from_u8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S8:
+ len = cnv_from_s8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ULAW:
+ len = cnv_from_ulaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ len = cnv_from_alaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ len = cnv_from_s16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_OE:
+ len = cnv_from_s16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_NE:
+ len = cnv_from_u16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_OE:
+ len = cnv_from_u16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ len = cnv_from_s32ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_OE:
+ len = cnv_from_s32oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_OE:
+ len = cnv_s24oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_PACKED:
+ len = cnv_from_s24p(sp, len);
+ break;
+ }
+
+ /*
+ * If we aren't decreasing the number of channels, then do the
+ * SRC now. (We prefer to do SRC on the smaller number of channels.)
+ */
+ if (sp->s_cnv_src_rate != sp->s_cnv_dst_rate &&
+ sp->s_cnv_src_nchan <= sp->s_cnv_dst_nchan) {
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+
+ len = do_src(sp, src, dst, len, sp->s_cnv_src_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+ }
+
+ /*
+ * Convert between mono and stereo
+ */
+
+ if (sp->s_cnv_src_nchan != sp->s_cnv_dst_nchan) {
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+ int tc = sp->s_cnv_dst_nchan;
+ int sc = sp->s_cnv_src_nchan;
+ int nc;
+ int i;
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+
+ if (sc == 1) {
+ /*
+ * Mono expansion. We expand into the stereo
+ * channel, and leave other channels silent.
+ */
+ for (i = len; i; i--) {
+ *dst++ = *src;
+ *dst++ = *src++;
+ for (int j = tc - 2; j > 0; j--) {
+ *dst++ = 0;
+ }
+
+ }
+
+ } else if (sc == 2 && tc == 1) {
+ /*
+ * Stereo -> mono. We do stereo separately to make
+ * the division fast (div by const 2 is just shift).
+ */
+ for (i = len; i; i--) {
+ /*
+ * Take just the left channel sample,
+ * discard the right channel.
+ */
+ *dst++ = *src++; /* left */
+ src++; /* right */
+ }
+ } else {
+ /*
+ * Multi channel conversions. We just copy the
+ * minimum number of channels.
+ */
+
+ /* Calculate number of frames */
+
+ nc = min(sc, tc);
+
+ /* Clear destination */
+ bzero(dst, (len * tc * sizeof (int32_t)));
+
+ for (i = len; i; i--) {
+ int c;
+
+ for (c = 0; c < nc; c++)
+ dst[c] = src[c];
+
+ src += sc;
+ dst += tc;
+ }
+ }
+ }
+
+ /*
+ * If we didn't do SRC pre-conversion, then do it now.
+ */
+ if (sp->s_cnv_src_rate != sp->s_cnv_dst_rate &&
+ sp->s_cnv_src_nchan > sp->s_cnv_dst_nchan) {
+
+ int32_t *src = sp->s_cnv_src;
+ int32_t *dst = sp->s_cnv_dst;
+
+ len = do_src(sp, src, dst, len, sp->s_cnv_dst_nchan);
+
+ sp->s_cnv_src = dst;
+ sp->s_cnv_dst = src;
+ }
+
+ /*
+ * Finally convert samples from internal 24 bit format to target format
+ */
+
+ switch (sp->s_cnv_dst_format) {
+ case AUDIO_FORMAT_U8:
+ len = cnv_to_u8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S8:
+ len = cnv_to_s8(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ len = cnv_to_s16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S16_OE:
+ len = cnv_to_s16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_NE:
+ len = cnv_to_u16ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_U16_OE:
+ len = cnv_to_u16oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_OE:
+ len = cnv_s24oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S24_PACKED:
+ len = cnv_to_s24p(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ len = cnv_to_s32ne(sp, len);
+ break;
+
+ case AUDIO_FORMAT_S32_OE:
+ len = cnv_to_s32oe(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ULAW:
+ len = cnv_to_ulaw(sp, len);
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ len = cnv_to_alaw(sp, len);
+ break;
+ }
+
+ return (len);
+}
+
+static const struct audio_format_info {
+ unsigned format;
+ int sampsize;
+ audio_cnv_func_t from;
+ audio_cnv_func_t to;
+} audio_format_info[] = {
+ { AUDIO_FORMAT_S8, 1, cnv_from_s8, cnv_to_s8 },
+ { AUDIO_FORMAT_U8, 1, cnv_from_u8, cnv_to_u8 },
+ { AUDIO_FORMAT_ULAW, 1, cnv_from_ulaw, cnv_to_ulaw },
+ { AUDIO_FORMAT_ALAW, 1, cnv_from_alaw, cnv_to_alaw },
+ { AUDIO_FORMAT_S16_NE, 2, cnv_from_s16ne, cnv_to_s16ne },
+ { AUDIO_FORMAT_S16_OE, 2, cnv_from_s16oe, cnv_to_s16oe },
+ { AUDIO_FORMAT_U16_NE, 2, cnv_from_u16ne, cnv_to_u16ne },
+ { AUDIO_FORMAT_U16_OE, 2, cnv_from_u16oe, cnv_to_u16oe },
+ { AUDIO_FORMAT_S32_NE, 4, cnv_from_s32ne, cnv_to_s32ne },
+ { AUDIO_FORMAT_S32_OE, 4, cnv_from_s32oe, cnv_to_s32oe },
+
+ /* 24-bit formats are "special" */
+ { AUDIO_FORMAT_S24_NE, 4, NULL, NULL },
+ { AUDIO_FORMAT_S24_OE, 4, cnv_s24oe, cnv_s24oe },
+ { AUDIO_FORMAT_S24_PACKED, 3, cnv_from_s24p, cnv_to_s24p },
+
+ /* sentinel */
+ { AUDIO_FORMAT_NONE, 0, NULL, NULL }
+};
+
+int
+auimpl_format_setup(audio_stream_t *sp, audio_parms_t *uparms)
+{
+ audio_parms_t *source = &sp->s_cnv_src_parms;
+ audio_parms_t *target = &sp->s_cnv_dst_parms;
+ audio_cnv_func_t converter = NULL;
+ const struct audio_format_info *info;
+ int expand = AUDIO_UNIT_EXPAND;
+ unsigned cnv_sampsz = sizeof (uint32_t);
+ unsigned cnv_max;
+
+ if (sp == &sp->s_client->c_ostream) {
+ source = uparms;
+ } else {
+ target = uparms;
+ }
+
+ ASSERT(mutex_owned(&sp->s_lock));
+
+ /*
+ * At least one of the source or target are S24_NE.
+ *
+ * If we have a signed/native endian format, then pick an
+ * optimized converter. While at it, ensure that a valid
+ * format is selected.
+ */
+ if (source->p_format != AUDIO_FORMAT_S24_NE) {
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (source->p_format == info->format) {
+ converter = info->from;
+ expand *= sizeof (int32_t);
+ expand /= info->sampsize;
+ /* save source frame size */
+ cnv_sampsz = info->sampsize;
+ break;
+ }
+ }
+ if (info->format == AUDIO_FORMAT_NONE) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "invalid source format selected");
+ return (EINVAL);
+ }
+
+ } else if (target->p_format != AUDIO_FORMAT_S24_NE) {
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (target->p_format == info->format) {
+ converter = info->to;
+ expand *= info->sampsize;
+ expand /= sizeof (int32_t);
+ break;
+ }
+ }
+ if (info->format == AUDIO_FORMAT_NONE) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "invalid target format selected");
+ return (EINVAL);
+ }
+ }
+
+ if (source->p_nchan != target->p_nchan) {
+ /*
+ * if channels need conversion, then we must use the
+ * default.
+ */
+ converter = cnv_default;
+ expand *= target->p_nchan;
+ expand /= source->p_nchan;
+ }
+
+ if (source->p_rate != target->p_rate) {
+ /*
+ * We need SRC; if we can avoid data conversion, do so.
+ */
+ setup_src(sp, source->p_rate, target->p_rate,
+ source->p_nchan, target->p_nchan);
+
+ converter = (converter == NULL) ? cnv_srconly : cnv_default;
+
+ expand *= target->p_rate;
+ expand /= source->p_rate;
+ }
+
+ ASSERT(sp->s_engine);
+ ASSERT(sp->s_engine->e_intrs);
+
+ /*
+ * Figure out the size of the conversion buffer we need. We
+ * assume room for two full source fragments, which ought to
+ * be enough, even with rounding errors.
+ */
+ cnv_max = 2 * (source->p_rate / sp->s_engine->e_intrs) *
+ cnv_sampsz * source->p_nchan;
+
+ /*
+ * If the conversion will cause us to expand fragments, then
+ * we need to increase cnv_max. Scale by AUDIO_UNIT_EXPAND to
+ * avoid rouding errors or losing bits when doing reducing
+ * conversions.
+ */
+ if (expand > AUDIO_UNIT_EXPAND) {
+ cnv_max *= expand;
+ cnv_max /= AUDIO_UNIT_EXPAND;
+ }
+
+ /*
+ * Now we need to allocate space.
+ */
+ if (sp->s_cnv_max < cnv_max) {
+ uint32_t *buf0, *buf1;
+
+ buf0 = kmem_alloc(cnv_max, KM_NOSLEEP);
+ buf1 = kmem_alloc(cnv_max, KM_NOSLEEP);
+ if ((buf0 == NULL) || (buf1 == NULL)) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "failed to allocate audio conversion buffer "
+ "(%u bytes)", cnv_max);
+ if (buf0)
+ kmem_free(buf0, cnv_max);
+ if (buf1)
+ kmem_free(buf1, cnv_max);
+ return (ENOMEM);
+ }
+
+ if (sp->s_cnv_buf0)
+ kmem_free(sp->s_cnv_buf0, sp->s_cnv_max);
+ if (sp->s_cnv_buf1)
+ kmem_free(sp->s_cnv_buf1, sp->s_cnv_max);
+
+ sp->s_cnv_buf0 = buf0;
+ sp->s_cnv_buf1 = buf1;
+ sp->s_cnv_max = cnv_max;
+ }
+
+ /*
+ * NB: From here on, we must not fail.
+ */
+
+ /*
+ * Configure default fragment setup.
+ */
+ for (info = &audio_format_info[0]; info->sampsize; info++) {
+ if (uparms->p_format == info->format) {
+ break;
+ }
+ }
+ ASSERT(info->sampsize);
+
+ sp->s_framesz = info->sampsize * uparms->p_nchan;
+ sp->s_fragfr = (uparms->p_rate / sp->s_engine->e_intrs);
+ sp->s_fragbytes = sp->s_fragfr * sp->s_framesz;
+ sp->s_nfrags = sp->s_allocsz / sp->s_fragbytes;
+ sp->s_nframes = sp->s_nfrags * sp->s_fragfr;
+ sp->s_nbytes = sp->s_nframes * sp->s_framesz;
+ *sp->s_user_parms = *uparms;
+ sp->s_converter = converter;
+
+ /*
+ * Ensure that we toss any stale data -- probably wrong format.
+ * Note that as a consequence of this, all of the offsets and
+ * counters get reset. Clients should not rely on these values
+ * being preserved when changing formats.
+ *
+ * Its critical that we reset the indices, in particular,
+ * because not only will the data be the wrong format, but the
+ * indices themselves are quite possibly going to be invalid.
+ */
+ sp->s_cnv_cnt = 0;
+ sp->s_tail = sp->s_head = 0;
+ sp->s_tidx = sp->s_hidx = 0;
+
+ return (0);
+}
+
+int
+auimpl_format_alloc(audio_stream_t *sp)
+{
+ int i;
+
+ ASSERT(mutex_owned(&sp->s_lock));
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ sp->s_src_state[i] =
+ kmem_zalloc(sizeof (grc3state_t), KM_NOSLEEP);
+ if (sp->s_src_state[i] == NULL) {
+ audio_dev_warn(sp->s_client->c_dev,
+ "unable to allocate SRC state structures");
+ return (ENOMEM);
+ }
+ }
+ return (0);
+}
+
+void
+auimpl_format_free(audio_stream_t *sp)
+{
+ int i;
+
+ for (i = 0; i < AUDIO_MAX_CHANNELS; i++) {
+ if (sp->s_src_state[i] != NULL) {
+ kmem_free(sp->s_src_state[i], sizeof (grc3state_t));
+ sp->s_src_state[i] = NULL;
+ }
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_grc3.c b/usr/src/uts/common/io/audio/impl/audio_grc3.c
new file mode 100644
index 0000000000..3d42ab8425
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_grc3.c
@@ -0,0 +1,388 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: GRC3 Sample Rate Converter
+ *
+ * GRC library version 3.1
+ */
+
+#include <sys/types.h>
+#include "audio_grc3.h"
+
+extern const int32_t filter_data_L[];
+extern const int32_t filter_data_M[];
+extern const int32_t filter_data_H[];
+extern const int32_t filter_data_P[];
+
+#define filter_data_HX filter_data_H
+#define filter_data_PX filter_data_P
+
+static int32_t
+_muldivu64(uint32_t a, uint32_t val1, uint32_t val2)
+{
+ uint64_t v = ((uint64_t)a) * val1 / val2;
+ return ((uint32_t)(v));
+}
+
+
+static int32_t
+_grc_sat6(int32_t a, int32_t b)
+{
+ int64_t v = ((int64_t)a) * b + (1 << 5);
+ return ((int32_t)(v >> 6));
+}
+
+static int32_t
+_grc_sat31(int32_t a, int32_t b)
+{
+ int64_t v = ((int64_t)a) * b + (1 << 30);
+ return ((int32_t)(v >> 31));
+}
+
+
+#define DEFINE_FILTER(T) \
+static int32_t \
+_filt31_##T(int32_t a, int32_t idx) \
+{ \
+ int64_t v = ((int64_t)a) * filter_data_##T[idx >> 15]; \
+ return ((int32_t)(v >> 31)); \
+}
+
+#define DEFINE_FILTER_HQ(T) \
+static int32_t \
+_filt31_##T(int32_t a, int32_t idx) \
+{ \
+ int32_t idx2 = idx>>15; \
+ int64_t v = ((int64_t)a) * \
+ \
+ (filter_data_##T[idx2] + \
+ (((int64_t)(idx & 32767)) * (filter_data_##T[idx2 + 1] - \
+ filter_data_##T[idx2]) >> 15)); \
+ return ((int32_t)(v>>31)); \
+}
+
+
+DEFINE_FILTER(L)
+DEFINE_FILTER(M)
+DEFINE_FILTER(H)
+DEFINE_FILTER_HQ(HX)
+DEFINE_FILTER(P)
+DEFINE_FILTER_HQ(PX)
+
+#define DEFINE_CONVD(T, SZ) \
+static int32_t \
+_conv31d_##T(int32_t *history, uint32_t filter, uint32_t incv) \
+{ \
+ int32_t accum = 0; \
+ \
+ filter = (1024 << 15) - filter; \
+ \
+ while (filter < ((uint32_t)(SZ << 15))) { \
+ accum += _filt31_##T(*history, filter); \
+ filter += incv; \
+ history--; \
+ } \
+ \
+ return (accum); \
+}
+
+DEFINE_CONVD(L, 4096)
+DEFINE_CONVD(M, 8192)
+DEFINE_CONVD(H, 16384)
+DEFINE_CONVD(HX, 16384)
+DEFINE_CONVD(P, 32768)
+DEFINE_CONVD(PX, 32768)
+
+static int32_t
+_conv31_L(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+#define ITERATION(p) \
+ accum += _filt31_##p(*history, filter); \
+ filter += (1024 << 15); \
+ history--
+
+ ITERATION(L); ITERATION(L); ITERATION(L); ITERATION(L);
+ return (accum);
+}
+
+
+static int32_t
+_conv31_M(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
+ ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
+ return (accum);
+}
+
+static int32_t
+_conv31_H(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
+ return (accum);
+}
+
+static int32_t
+_conv31_HX(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
+ return (accum);
+}
+
+static int32_t
+_conv31_P(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
+ return (accum);
+}
+
+static int32_t
+_conv31_PX(int32_t *history, uint32_t filter)
+{
+ int32_t accum = 0;
+
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
+ return (accum);
+}
+
+#define GRC3_RESAMPLE(QUAL) \
+static void \
+grc3_upsample_##QUAL(grc3state_t *grc, const int32_t *src, \
+ int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ int32_t ptr = grc->ptr; \
+ int32_t srcrate = grc->srcrate; \
+ int32_t dstrate = grc->dstrate; \
+ int32_t *history = grc->historyptr; \
+ int32_t filtfactor = grc->filtfactor; \
+ uint32_t dstsz = 0; \
+ \
+ src += offset; \
+ dst += offset; \
+ \
+ while (sz > 0) { \
+ while (ptr < dstrate) { \
+ if (dstsz >= bufsz) \
+ goto endloop; \
+ dst[0] = (_conv31_##QUAL(history, \
+ _grc_sat6(ptr, filtfactor))); \
+ ptr += srcrate; \
+ dst += inc; \
+ dstsz++; \
+ } \
+ \
+ history++; \
+ if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
+ history -= GRC3_MAXHISTORY; \
+ \
+ history[0] = history[-GRC3_MAXHISTORY] = (*src); \
+ \
+ ptr -= dstrate; \
+ \
+ sz--; \
+ src += inc; \
+ } \
+endloop: \
+ \
+ grc->ptr = ptr; \
+ grc->historyptr = history; \
+ grc->outsz = dstsz; \
+} \
+ \
+static void \
+grc3_dnsample_##QUAL(grc3state_t *grc, const int32_t *src, \
+ int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ int32_t ptr = grc->ptr; \
+ int32_t srcrate = grc->srcrate; \
+ int32_t dstrate = grc->dstrate; \
+ int32_t sat = grc->sat; \
+ int32_t *history = grc->historyptr; \
+ int32_t filtfactor = grc->filtfactor; \
+ uint32_t dstsz = 0; \
+ \
+ src += offset; \
+ dst += offset; \
+ \
+ while (sz > 0) { \
+ while (ptr >= srcrate) { \
+ if (dstsz >= bufsz) \
+ goto endloop; \
+ ptr -= srcrate; \
+ dst[0] = (_conv31d_##QUAL(history, \
+ _grc_sat6(ptr, filtfactor), \
+ grc->ptr_incv)); \
+ dst += inc; \
+ dstsz++; \
+ } \
+ \
+ history++; \
+ if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
+ history -= GRC3_MAXHISTORY; \
+ \
+ /* \
+ * TODO: for better quality multiplier is worth moving \
+ * to output cascade \
+ */ \
+ history[0] = history[-GRC3_MAXHISTORY] = \
+ _grc_sat31((*src), sat); \
+ \
+ ptr += dstrate; \
+ \
+ sz--; \
+ src += inc; \
+ } \
+endloop: \
+ \
+ grc->ptr = ptr; \
+ grc->historyptr = history; \
+ grc->outsz = dstsz; \
+} \
+ \
+static void \
+grc3_resample_##QUAL(grc3state_t *grc, const void *src, void *dst, \
+ uint32_t sz, uint32_t bufsz, int inc, int offset) \
+{ \
+ if (grc->srcrate <= grc->dstrate) \
+ grc3_upsample_##QUAL(grc, src, dst, sz, \
+ bufsz, inc, offset); \
+ else \
+ grc3_dnsample_##QUAL(grc, src, dst, sz, \
+ bufsz, inc, offset); \
+}
+
+GRC3_RESAMPLE(L)
+GRC3_RESAMPLE(M)
+GRC3_RESAMPLE(H)
+GRC3_RESAMPLE(HX)
+GRC3_RESAMPLE(P)
+GRC3_RESAMPLE(PX)
+
+/*
+ * For performance reasons, we only support 24-bit SRC.
+ */
+void
+grc3_convert(grc3state_t *grc, int quality, const void *src,
+ void *dst, int sz, int bufsz, int inc, int offset)
+{
+
+ switch (quality) {
+ default:
+ case 0:
+ case 1:
+ grc3_resample_L(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 2:
+ grc3_resample_M(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 3:
+ grc3_resample_H(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 4:
+ grc3_resample_HX(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 5:
+ grc3_resample_P(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ case 6:
+ grc3_resample_PX(grc, src, dst, sz, bufsz, inc, offset);
+ break;
+ }
+}
+
+void
+grc3_reset(grc3state_t *grc)
+{
+ int32_t t;
+ grc->ptr = 0;
+ grc->historyptr = grc->history + GRC3_MAXHISTORY;
+
+ for (t = 0; t < GRC3_MAXHISTORY * 2; t++)
+ grc->history[t] = 0;
+}
+
+static void
+grc3_setup_up(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ grc->srcrate = fromRate;
+ grc->dstrate = toRate;
+ grc->filtfactor = 0x80000000U / toRate;
+}
+
+static void
+grc3_setup_dn(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ grc->srcrate = fromRate;
+ grc->dstrate = toRate;
+ grc->filtfactor = 0x80000000U / fromRate;
+ grc->ptr_incv = _muldivu64(1024 << 15, toRate, fromRate);
+ grc->sat = _muldivu64(0x80000000U, toRate, fromRate);
+}
+
+void
+grc3_setup(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
+{
+ while ((!(fromRate & 1)) && (!(toRate & 1)) && (fromRate > 0)) {
+ fromRate >>= 1;
+ toRate >>= 1;
+ }
+
+ if (fromRate <= toRate)
+ grc3_setup_up(grc, fromRate, toRate);
+ else
+ grc3_setup_dn(grc, fromRate, toRate);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_grc3.h b/usr/src/uts/common/io/audio/impl/audio_grc3.h
new file mode 100644
index 0000000000..0003dc1574
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_grc3.h
@@ -0,0 +1,275 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: GRC library version 3.1 internal definitions
+ *
+ * GRC3 is a high quality sample rate conversion module that uses fixed point
+ * arithmetic.
+ */
+
+#ifndef AUDIO_GRC3_H
+#define AUDIO_GRC3_H
+
+#define GRC3_MAXHISTORY 4096
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef struct grc3state {
+ uint32_t srcrate;
+ uint32_t dstrate;
+ uint32_t ptr;
+ uint32_t ptr_incv;
+
+ uint32_t sat;
+ uint32_t filtfactor;
+ int32_t *historyptr;
+ int32_t dummy_pad1;
+
+ int32_t history[GRC3_MAXHISTORY * 2];
+
+ uint32_t outsz;
+} grc3state_t;
+
+
+/* BEGIN CSTYLED */
+/*****************************************************************************
+
+ Tutorial on how to use GRC3 rate conversion
+
+1. First, you create an instance of grc3state_t for each channel. If you
+ are working with stereo files - you will need 2 of such instances,
+ for quadro - 4.
+
+ The instances may be allocated in either static or dynamic memory - that
+ makes no difference to the convertor. So, if your program has to process
+ one stereo stream, there's no reason why should you use malloc/free to
+ allocate/deallocate structures. Also, in device drivers, you can
+ use static variables as well:
+
+ static grc3state_t grc[2]; // for two channels
+
+
+2. Before starting any conversion, grc3state_t instances should be initialized
+ properly, and you do this with grc3_setup function. Function itself does
+ not allocate additional memory or change anything except grc3state_t
+ structure, so this is thread safe, and you don't have to do additional
+ "deinitialization".
+
+ If you are doing interleaved audio (stereo/quadro/whatever) conversion,
+ you should do setup on each of the channels, and should have separate
+ instance of grc3state_t for each channel. As you will understand further,
+ such conversion is done separately. And now, the setup function:
+
+ int grc3_setup( grc3state_t *grc,
+ uint32_t fromRate,
+ uint32_t toRate );
+
+ grc - pointer to grc3state_t instance
+ fromRate - source sample rate
+ toRate - destination sample rate
+
+ Note, that sample rates itself are not important - the important thing
+ is ratio between those sample rates. So, for example, if you have to
+ convert from 24000Hz to 48000Hz, it's ok to write:
+
+ grc3_setup( &grc[0], 240, 480 );
+
+ Sometimes (in MIDI synths) it would be desired to use fractional sample
+ rates. For example, setup for conversion from 33100.78 to 48000 may look
+ like this:
+
+ grc3_setup( &grc[0], 3310078, 4800000);
+
+ Note, that on stereo, GRC3 setup will look like this:
+
+ static grc3state_t grc[2];
+
+ // ...
+
+ grc3_setup( &grc[0], 3310078, 4800000)
+ grc3_setup( &grc[1], 3310078, 4800000);
+
+
+ Note, that you should not rely on grc3_setup's fast execution or any
+ execution timing. It may contain some massive arithmetic and even huge
+ loops, so avoid putting grc3_setup to inner loops and calling in
+ latency-dependent code.
+
+
+3. Next, before running a stream through grc3_convert function, you should
+ reset each of grc3state_t instance used:
+
+ void grc3_reset(grc3state_t *grc);
+
+
+ grc - pointer to GRC3 instance variable
+
+ So, for stereo, this appears to be:
+
+ static grc3state_t grc[2];
+
+ // ...
+
+ grc3_reset( &grc[0] );
+ grc3_reset( &grc[1] );
+
+
+4. Finally, doing conversion is easy:
+
+ void grc3_convert( grc3state_t *grc,
+ int domain,
+ int quality,
+ const void *src,
+ void *dst,
+ int maxInSize,
+ int maxOutSize,
+ int interleave,
+ int offset );
+
+
+ grc - pointer to initialized grc3state_t instance; you
+ can specify NULL to check whether a particular
+ domain/quality pair is supported, check return value
+
+ quality - quality to use for conversion, supported values are:
+
+ 0 - D lowest quality (normally equals to low quality)
+ 1 - L low quality (spline interpolation)
+ 2 - M medium quality (lagrange interpolation)
+ 3 - H high quality
+ 4 - HX high quality (high quality with extra precision)
+ 5 - P production quality
+
+ 6 - PX production quality (prod quality with extra precision)
+ (PX is currently disabled because it causes a crash)
+
+ src - source audio buffer
+
+ dst - destination audio buffer;
+
+ maxInSize - size of input buffer (in samples per channel!)
+
+ maxOutSize - size of output buffer (in samples per channel!)
+ (will never overrun this size)
+
+ interleave - interleave factor; for MONO or non-interleaved data
+ it should be equal to 1;
+
+ 2 - STEREO interleaved audio
+ 4 - QUADRO interleaved audio
+
+ So, basically, this parameter should be equal to number
+ of interleaved channels
+
+ offset - number of interleaved channel currently processing,
+ starting from 0; for MONO or non-interleaved data
+ it should be equal to 0
+
+
+ For unsupported quality values, it will fall back to
+ "D" quality (the lowest one)
+
+ also on return it sets:
+
+ grc->outsz == number of output samples
+
+ Note, that if quality is not supported,
+ calling the function with real data will fall back
+ to the worst quality available.
+
+ Note that this version of GRC3 only supports 24-bit
+ native endian. (Modified by Sun for performance.)
+
+
+
+5. Interleaved processing of N channels is done like this:
+
+
+ static grc3state_t grc[N];
+ int t;
+
+ //...
+
+
+ for(t=0; t<N; t++)
+ {
+ grc3_setup( &grc[t], 22050, 48000 );
+
+ grc3_reset( &grc[t] );
+ }
+
+
+ //...
+
+ while (...) {
+
+ for(t = 0; t < N; t++) {
+ grc3_convert(&grc[t], // instance pointer
+ 4, // quality
+ in_buffer, // input buffer
+ out_buffer, // input buffer
+ in_samples_count, // number of samples
+ // in in_buffer
+ 2048, // size of out_buffer
+ N, t // num of channels, channel#
+ );
+ }
+
+
+ // Normally, for interleaved data, ->outsz of all instances will
+ // be the same for the same stream
+
+ put_sound_somewhere(out_buffer,
+ grc[0]->outsz * N * sizeof(out_buffer[0]) );
+ }
+
+
+6. If you use the same storage and the same setup for processing few separate
+ non-related sounds, to prevent the feedback of sound1's tail to sound2's
+ beginning - do grc3_reset on the state instances before calling
+ grc_convert.
+
+*****************************************************************************
+*/
+/* END CSTYLED */
+
+void grc3_setup(grc3state_t *, uint32_t fromRate, uint32_t toRate);
+
+void grc3_reset(grc3state_t *);
+
+void grc3_convert(grc3state_t *, int quality,
+ const void *src, void *dst, int sz, int bufsz, int inc, int offset);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* AUDIO_GRC3_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_impl.h b/usr/src/uts/common/io/audio/impl/audio_impl.h
new file mode 100644
index 0000000000..7c8099ea88
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_impl.h
@@ -0,0 +1,472 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AUDIO_IMPL_H
+#define _AUDIO_IMPL_H
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/poll.h>
+
+#include <sys/audio/audio_driver.h>
+#include "audio_client.h"
+
+#define AUDIO_MAX_OPENS 256
+#define AUDIO_MAX_CHANNELS 16
+#define AUDIO_UNIT_EXPAND 1024
+#define AUDIO_CHBUFS 2048 /* samples for mixing */
+#define AUDIO_VOL_SCALE 256
+#define AUDIO_DB_SIZE 50
+
+struct audio_parms {
+ int p_format;
+ int p_rate;
+ int p_nchan;
+};
+
+typedef int (*audio_cnv_func_t)(audio_stream_t *, int);
+
+struct audio_buffer {
+ caddr_t b_data;
+ uint64_t b_head;
+ uint64_t b_tail;
+ unsigned b_hidx; /* head % nframes */
+ unsigned b_tidx; /* tail % nframes */
+ unsigned b_fragfr; /* frames per frag */
+ unsigned b_fragbytes; /* bytes per frag */
+ unsigned b_nframes; /* total frames */
+ unsigned b_nbytes; /* total bytes */
+ unsigned b_nfrags; /* total frags */
+ unsigned b_framesz; /* bytes per frame */
+};
+
+/*
+ * struct audio_stream: This structure represents a virtual stream exposed
+ * to a single client. Each client will have at most two of these (one for
+ * record, one for playback.)
+ */
+struct audio_stream {
+ audio_buffer_t s_buf;
+#define s_data s_buf.b_data
+#define s_bufsz s_buf.b_size
+#define s_head s_buf.b_head
+#define s_tail s_buf.b_tail
+#define s_nfrags s_buf.b_nfrags
+#define s_framesz s_buf.b_framesz
+#define s_fragfr s_buf.b_fragfr
+#define s_fragbytes s_buf.b_fragbytes
+#define s_nframes s_buf.b_nframes
+#define s_nbytes s_buf.b_nbytes
+#define s_tidx s_buf.b_tidx
+#define s_hidx s_buf.b_hidx
+ ddi_umem_cookie_t s_cookie;
+ size_t s_allocsz;
+
+ /*
+ * Various counters.
+ */
+ uint64_t s_samples;
+ uint64_t s_errors; /* underrun or overrun count */
+
+ boolean_t s_running;
+ boolean_t s_paused; /* stream paused */
+ boolean_t s_draining; /* stream draining */
+
+ /*
+ * Sample rate conversion (SRC) and format conversion details.
+ */
+ struct grc3state *s_src_state[AUDIO_MAX_CHANNELS];
+ unsigned s_src_quality;
+ int s_cnv_max;
+ audio_cnv_func_t s_converter;
+ uint32_t *s_cnv_buf0;
+ uint32_t *s_cnv_buf1;
+ void *s_cnv_src;
+ void *s_cnv_dst;
+ audio_parms_t s_cnv_src_parms;
+#define s_cnv_src_nchan s_cnv_src_parms.p_nchan
+#define s_cnv_src_rate s_cnv_src_parms.p_rate
+#define s_cnv_src_format s_cnv_src_parms.p_format
+
+ audio_parms_t s_cnv_dst_parms;
+#define s_cnv_dst_nchan s_cnv_dst_parms.p_nchan
+#define s_cnv_dst_rate s_cnv_dst_parms.p_rate
+#define s_cnv_dst_format s_cnv_dst_parms.p_format
+
+ size_t s_cnv_cnt;
+ int32_t *s_cnv_ptr;
+
+ audio_parms_t *s_user_parms;
+ audio_parms_t *s_phys_parms;
+
+ /*
+ * Volume.
+ */
+ uint8_t s_gain_master;
+ uint8_t s_gain_pct;
+ uint16_t s_gain_scaled;
+ uint16_t s_gain_eff;
+ boolean_t s_muted;
+
+ /*
+ * Callbacks.
+ */
+ uint64_t s_drain_idx; /* engine index */
+
+ /*
+ * Other per stream details, e.g. channel offset, etc.
+ */
+ kmutex_t s_lock;
+ kcondvar_t s_cv;
+ list_node_t s_eng_linkage; /* place on engine list */
+ audio_client_t *s_client;
+ audio_engine_t *s_engine;
+ int s_choffs;
+
+ /*
+ * Other bits.
+ */
+ unsigned s_engcap; /* ENGINE_xxx_CAP */
+};
+
+/*
+ * struct audio_client: This structure represents a logical port,
+ * associated with an open file, etc. These are the entities that are
+ * mixed.
+ */
+struct audio_client {
+ audio_stream_t c_istream;
+ audio_stream_t c_ostream;
+ void *c_private;
+
+ /*
+ * DDI support.
+ */
+ major_t c_major;
+ minor_t c_minor;
+ minor_t c_origminor;
+
+ /*
+ * Linkage for per-device list of clients.
+ */
+ list_node_t c_global_linkage;
+ list_node_t c_dev_linkage;
+ int c_refcnt;
+
+ kmutex_t c_lock;
+ kcondvar_t c_cv;
+ ddi_taskq_t *c_tq;
+ boolean_t c_do_output;
+ boolean_t c_do_input;
+ boolean_t c_do_notify;
+ boolean_t c_do_drain;
+ boolean_t c_closing;
+ boolean_t c_is_open;
+
+ /*
+ * Client wide settings... e.g. ops vector, etc.
+ */
+ unsigned c_omode; /* open mode */
+ pid_t c_pid; /* opening process id */
+ audio_dev_t *c_dev;
+ cred_t *c_cred;
+ audio_client_ops_t c_ops;
+#define c_open c_ops.aco_open
+#define c_close c_ops.aco_close
+#define c_read c_ops.aco_read
+#define c_write c_ops.aco_write
+#define c_ioctl c_ops.aco_ioctl
+#define c_chpoll c_ops.aco_chpoll
+#define c_output c_ops.aco_output
+#define c_input c_ops.aco_input
+#define c_notify c_ops.aco_notify
+#define c_drain c_ops.aco_drain
+
+ struct pollhead c_pollhead;
+
+};
+
+struct audio_infostr {
+ char i_line[100];
+ list_node_t i_linkage;
+};
+
+struct audio_stats {
+ kstat_named_t st_head;
+ kstat_named_t st_tail;
+ kstat_named_t st_flags;
+ kstat_named_t st_fragfr;
+ kstat_named_t st_nfrags;
+ kstat_named_t st_framesz;
+ kstat_named_t st_nbytes;
+ kstat_named_t st_hidx;
+ kstat_named_t st_tidx;
+ kstat_named_t st_format;
+ kstat_named_t st_nchan;
+ kstat_named_t st_rate;
+ kstat_named_t st_intrs;
+ kstat_named_t st_errors;
+ kstat_named_t st_suspended;
+};
+
+/*
+ * An audio engine corresponds to a single DMA transfer channel. It can
+ * represent either record or playback, but not both at the same time.
+ * A device that supports simultaneous record and playback will register
+ * separate channels.
+ */
+struct audio_engine {
+ audio_engine_ops_t e_ops;
+ void *e_private;
+ unsigned e_flags;
+
+ /*
+ * Mixing related fields.
+ */
+ unsigned e_limiter_state;
+ int32_t *e_chbufs[AUDIO_MAX_CHANNELS];
+ unsigned e_choffs[AUDIO_MAX_CHANNELS];
+ unsigned e_chincr[AUDIO_MAX_CHANNELS];
+ void (*e_export)(audio_engine_t *);
+ void (*e_import)(audio_engine_t *, audio_stream_t *);
+
+ /*
+ * Underlying physical buffer shared with device driver.
+ */
+ audio_buffer_t e_buf;
+#define e_head e_buf.b_head
+#define e_tail e_buf.b_tail
+#define e_data e_buf.b_data
+#define e_fragfr e_buf.b_fragfr
+#define e_fragbytes e_buf.b_fragbytes
+#define e_framesz e_buf.b_framesz
+#define e_nbytes e_buf.b_nbytes
+#define e_nframes e_buf.b_nframes
+#define e_nfrags e_buf.b_nfrags
+#define e_hidx e_buf.b_hidx
+#define e_tidx e_buf.b_tidx
+
+ int e_intrs;
+ int e_errors;
+
+ audio_parms_t e_parms;
+#define e_format e_parms.p_format
+#define e_nchan e_parms.p_nchan
+#define e_rate e_parms.p_rate
+
+ /*
+ * Statistics.
+ */
+ kstat_t *e_ksp;
+ struct audio_stats e_stats;
+
+
+ /*
+ * Synchronization.
+ */
+ kmutex_t e_lock;
+
+ /*
+ * Linkage for per-device list.
+ */
+ list_node_t e_dev_linkage;
+ audio_dev_t *e_dev;
+ int e_num; /* arbitrary engine number */
+
+ /*
+ * List of of streams attached to this engine.
+ */
+ list_t e_streams;
+ int e_nrunning;
+ boolean_t e_suspended;
+};
+
+struct audio_dev {
+ dev_info_t *d_dip;
+ major_t d_major;
+ int d_instance;
+
+ uint32_t d_flags;
+#define DEV_OUTPUT_CAP (1U << 0)
+#define DEV_INPUT_CAP (1U << 1)
+#define DEV_DUPLEX_CAP (1U << 2)
+#define DEV_SNDSTAT_CAP (1U << 3)
+
+ char d_name[128]; /* generic description */
+ char d_desc[128]; /* detailed config descr */
+ char d_vers[128]; /* detailed version descr */
+ int d_number; /* global /dev/audioXX # */
+ int d_index; /* master device index */
+ int d_engno; /* engine counter */
+
+ list_t d_hwinfo; /* strings of hw info */
+
+ /*
+ * Synchronization.
+ */
+ kmutex_t d_lock;
+ kcondvar_t d_cv;
+ krwlock_t d_ctrl_lock; /* leaf lock */
+ krwlock_t d_clnt_lock;
+ unsigned d_refcnt;
+
+ /*
+ * Lists of virtual clients, controls and engines. Protected by
+ * the d_lock field above.
+ */
+ list_t d_clients;
+ list_t d_engines;
+ list_t d_controls;
+ audio_ctrl_t *d_pcmvol_ctrl;
+ uint64_t d_pcmvol;
+
+ /*
+ * Linkage onto global list of devices.
+ */
+ list_node_t d_by_index;
+ list_node_t d_by_number;
+
+ /*
+ * Personality specific data.
+ */
+ void *d_minor_data[1 << AUDIO_MN_TYPE_NBITS];
+};
+
+/*
+ * Each audio_dev optionally can have controls attached to it.
+ * Controls are separate from audio engines. They are methods of
+ * adjusting pharameters or reading metrics that usually relate to
+ * hardware on devices engine by the driver. They can be things like
+ * master volume for example.
+ *
+ * If the driver does not support controls then it must insure
+ * that any hardware controls are initialized to a usable state.
+ *
+ * For the framework/user-apps to be able to change controls
+ * the driver must create, enable and configure controls with
+ * control API's.
+ *
+ * There are a number of common controls (well-known) that most
+ * hardware supports. These have known names and known ctrl numbers.
+ * In addition a driver can have any number of extention
+ * controls (device-private). These can have any name and any ctrl
+ * number other then the ones, defined as well-knonw ones.
+ *
+ * Only controls created through control API's will be available,
+ * well-known or device-private.
+ */
+struct audio_ctrl {
+ audio_ctrl_desc_t ctrl_des;
+#define ctrl_name ctrl_des.acd_name
+#define ctrl_type ctrl_des.acd_type
+#define ctrl_enum ctrl_des.acd_enum
+#define ctrl_flags ctrl_des.acd_flags
+ audio_dev_t *ctrl_dev;
+ audio_ctrl_rd_t ctrl_read_fn;
+ audio_ctrl_wr_t ctrl_write_fn;
+ list_node_t ctrl_linkage;
+ kmutex_t ctrl_lock;
+ void *ctrl_arg;
+};
+
+
+/*
+ * Prototypes.
+ */
+
+/* audio_format.c */
+int auimpl_format_alloc(audio_stream_t *);
+void auimpl_format_free(audio_stream_t *);
+int auimpl_format_setup(audio_stream_t *, audio_parms_t *);
+
+/* audio_output.c */
+void auimpl_export_16ne(audio_engine_t *);
+void auimpl_export_16oe(audio_engine_t *);
+void auimpl_export_24ne(audio_engine_t *);
+void auimpl_export_24oe(audio_engine_t *);
+void auimpl_export_32ne(audio_engine_t *);
+void auimpl_export_32oe(audio_engine_t *);
+void auimpl_output_callback(audio_engine_t *);
+
+/* audio_input.c */
+void auimpl_import_16ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_16oe(audio_engine_t *, audio_stream_t *);
+void auimpl_import_24ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_24oe(audio_engine_t *, audio_stream_t *);
+void auimpl_import_32ne(audio_engine_t *, audio_stream_t *);
+void auimpl_import_32oe(audio_engine_t *, audio_stream_t *);
+void auimpl_input_callback(audio_engine_t *);
+int auimpl_input_drain(audio_stream_t *);
+
+/* audio_client.c */
+void auimpl_client_init(void);
+void auimpl_client_fini(void);
+audio_client_t *auimpl_client_create(dev_t);
+void auimpl_client_destroy(audio_client_t *);
+int auimpl_create_minors(audio_dev_t *);
+void auimpl_remove_minors(audio_dev_t *);
+void auimpl_set_gain_master(audio_stream_t *, uint8_t);
+
+/* audio_engine.c */
+void auimpl_dev_init(void);
+void auimpl_dev_fini(void);
+void auimpl_dev_hold(audio_dev_t *);
+audio_dev_t *auimpl_dev_hold_by_devt(dev_t);
+audio_dev_t *auimpl_dev_hold_by_index(int);
+void auimpl_dev_release(audio_dev_t *);
+int auimpl_choose_format(int);
+
+int auimpl_engine_open(audio_dev_t *, int, int, audio_stream_t *);
+void auimpl_engine_close(audio_stream_t *);
+
+void auimpl_dev_walk_engines(audio_dev_t *,
+ int (*)(audio_engine_t *, void *), void *);
+
+void auimpl_dev_vwarn(audio_dev_t *, const char *, va_list);
+
+/* engine operations */
+#define E_OP(e, entry) ((e)->e_ops.audio_engine_##entry)
+#define E_PRV(e) ((e)->e_private)
+#define ENG_FORMAT(e) E_OP(e, format)(E_PRV(e))
+#define ENG_RATE(e) E_OP(e, rate)(E_PRV(e))
+#define ENG_CHANNELS(e) E_OP(e, channels)(E_PRV(e))
+#define ENG_SYNC(e, num) E_OP(e, sync)(E_PRV(e), num)
+#define ENG_START(e) E_OP(e, start)(E_PRV(e))
+#define ENG_STOP(e) E_OP(e, stop)(E_PRV(e))
+#define ENG_COUNT(e) E_OP(e, count)(E_PRV(e))
+#define ENG_QLEN(e) E_OP(e, qlen)(E_PRV(e))
+#define ENG_CLOSE(e) E_OP(e, close)(E_PRV(e))
+#define ENG_OPEN(e, s, nf, d) E_OP(e, open)(E_PRV(e), e->e_flags, s, nf, d)
+#define ENG_CHINFO(e, c, o, i) E_OP(e, chinfo(E_PRV(e), c, o, i))
+
+/* audio_sun.c */
+void auimpl_sun_init(void);
+
+/* audio_oss.c */
+void auimpl_oss_init(void);
+
+#endif /* _AUDIO_IMPL_H */
diff --git a/usr/src/uts/common/io/audio/impl/audio_input.c b/usr/src/uts/common/io/audio/impl/audio_input.c
new file mode 100644
index 0000000000..8646707880
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_input.c
@@ -0,0 +1,229 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Virtual mixing audio input routines
+ *
+ * This file contains the actual mixing and resampling engine for input.
+ */
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sysmacros.h>
+#include "audio_impl.h"
+
+#ifdef DEBUG
+int audio_overruns = 0;
+#endif
+
+#define DECL_AUDIO_IMPORT(NAME, TYPE, SWAP, SHIFT) \
+void \
+auimpl_import_##NAME(audio_engine_t *eng, audio_stream_t *sp) \
+{ \
+ int nch = eng->e_nchan; \
+ int32_t *out; \
+ TYPE *in; \
+ int ch; \
+ void *data; \
+ int vol; \
+ \
+ data = sp->s_cnv_src; \
+ ch = 0; \
+ in = (void *)(eng->e_data + (eng->e_tidx * eng->e_framesz)); \
+ out = data; \
+ vol = sp->s_gain_eff; \
+ \
+ do { /* for each channel */ \
+ TYPE *ip; \
+ int32_t *op; \
+ int i; \
+ \
+ /* get value and adjust next channel offset */ \
+ op = out++; \
+ ip = in++; \
+ \
+ i = eng->e_fragfr; \
+ \
+ do { /* for each frame */ \
+ int32_t sample = (TYPE)SWAP(*ip); \
+ int32_t scaled = sample SHIFT; \
+ \
+ scaled *= vol; \
+ scaled /= AUDIO_VOL_SCALE; \
+ \
+ *op = scaled; \
+ ip += nch; \
+ op += nch; \
+ \
+ } while (--i); \
+ ch++; \
+ } while (ch < nch); \
+}
+
+DECL_AUDIO_IMPORT(16ne, int16_t, /* nop */, << 8)
+DECL_AUDIO_IMPORT(16oe, int16_t, ddi_swap16, << 8)
+DECL_AUDIO_IMPORT(32ne, int32_t, /* nop */, >> 8)
+DECL_AUDIO_IMPORT(32oe, int32_t, ddi_swap32, >> 8)
+DECL_AUDIO_IMPORT(24ne, int32_t, /* nop */, /* nop */)
+DECL_AUDIO_IMPORT(24oe, int32_t, ddi_swap32, /* nop */)
+
+/*
+ * Produce a fragment's worth of data. This is called when the data in
+ * the conversion buffer is exhausted, and we need to refill it from the
+ * source buffer. We always consume data from the client in quantities of
+ * a fragment at a time (assuming that a fragment is available.)
+ */
+static void
+auimpl_produce_fragment(audio_stream_t *sp, unsigned count)
+{
+ unsigned nframes;
+ unsigned framesz;
+ caddr_t cnvsrc;
+ caddr_t data;
+
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp->s_head >= sp->s_tail);
+ ASSERT(sp->s_hidx < nframes);
+ ASSERT(sp->s_tidx < nframes);
+
+ /*
+ * Copy data. We deal properly with wraps. Done as a
+ * do...while to minimize the number of tests.
+ */
+ cnvsrc = sp->s_cnv_src;
+ data = sp->s_data + (sp->s_hidx * framesz);
+ do {
+ unsigned nf;
+ unsigned nb;
+
+ ASSERT(sp->s_hidx < nframes);
+ nf = min(nframes - sp->s_hidx, count);
+ nb = nf * framesz;
+
+ bcopy(cnvsrc, data, nb);
+ data += nb;
+ cnvsrc += nb;
+ sp->s_hidx += nf;
+ sp->s_head += nf;
+ count -= nf;
+ sp->s_samples += nf;
+ if (sp->s_hidx >= nframes) {
+ sp->s_hidx -= nframes;
+ data -= sp->s_nbytes;
+ }
+ } while (count);
+
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+ ASSERT(sp->s_tail <= sp->s_head);
+ ASSERT(sp->s_hidx < nframes);
+}
+
+void
+auimpl_input_callback(audio_engine_t *eng)
+{
+ int fragfr = eng->e_fragfr;
+ boolean_t overrun;
+ audio_client_t *c;
+
+ /* consume all fragments in the buffer */
+ while ((eng->e_head - eng->e_tail) > fragfr) {
+
+ /*
+ * Consider doing the SYNC outside of the lock.
+ */
+ ENG_SYNC(eng, fragfr);
+
+ for (audio_stream_t *sp = list_head(&eng->e_streams);
+ sp != NULL;
+ sp = list_next(&eng->e_streams, sp)) {
+ int space;
+ int count;
+
+ c = sp->s_client;
+
+ mutex_enter(&sp->s_lock);
+ /* skip over streams paused or not running */
+ if (sp->s_paused || (!sp->s_running) ||
+ eng->e_suspended) {
+ mutex_exit(&sp->s_lock);
+ continue;
+ }
+ sp->s_cnv_src = sp->s_cnv_buf0;
+ sp->s_cnv_dst = sp->s_cnv_buf1;
+ eng->e_import(eng, sp);
+
+ /*
+ * Optionally convert fragment to requested sample
+ * format and rate.
+ */
+ if (sp->s_converter != NULL) {
+ count = sp->s_converter(sp, fragfr);
+ } else {
+ count = fragfr;
+ }
+
+ space = sp->s_nframes - (sp->s_head - sp->s_tail);
+ if (count > space) {
+#ifdef DEBUG
+ audio_overruns++;
+#endif
+ sp->s_errors += count - space;
+ count = space;
+ overrun = B_TRUE;
+ } else {
+ overrun = B_FALSE;
+ }
+
+ auimpl_produce_fragment(sp, count);
+
+ /* wake blocked threads (blocking reads, etc.) */
+ cv_broadcast(&sp->s_cv);
+
+ mutex_exit(&sp->s_lock);
+
+ mutex_enter(&c->c_lock);
+ if (overrun) {
+ c->c_do_notify = B_TRUE;
+ }
+ c->c_do_input = B_TRUE;
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+
+ /*
+ * Update the tail pointer, and the data pointer.
+ */
+ eng->e_tail += fragfr;
+ eng->e_tidx += fragfr;
+ if (eng->e_tidx >= eng->e_nframes) {
+ eng->e_tidx -= eng->e_nframes;
+ }
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_oss.c b/usr/src/uts/common/io/audio/impl/audio_oss.c
new file mode 100644
index 0000000000..a77fcd1196
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_oss.c
@@ -0,0 +1,2577 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/types.h>
+#include <sys/open.h>
+#include <sys/errno.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_oss.h>
+#include <sys/file.h>
+#include <sys/note.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include "audio_client.h"
+
+#define OSS_FMT AFMT_S16_LE
+#define OSS_RATE 48000
+#define OSS_CHANNELS 2
+
+typedef struct ossclient ossclient_t;
+typedef struct ossdev ossdev_t;
+
+static const struct {
+ int oss;
+ int fmt;
+} oss_formats[] = {
+ { AFMT_MU_LAW, AUDIO_FORMAT_ULAW },
+ { AFMT_A_LAW, AUDIO_FORMAT_ALAW },
+ { AFMT_U8, AUDIO_FORMAT_U8 },
+ { AFMT_S8, AUDIO_FORMAT_S8 },
+ { AFMT_S16_BE, AUDIO_FORMAT_S16_BE },
+ { AFMT_S16_LE, AUDIO_FORMAT_S16_LE },
+ { AFMT_U16_BE, AUDIO_FORMAT_U16_BE },
+ { AFMT_U16_LE, AUDIO_FORMAT_U16_LE },
+ { AFMT_S24_BE, AUDIO_FORMAT_S24_BE },
+ { AFMT_S24_LE, AUDIO_FORMAT_S24_LE },
+ { AFMT_S32_BE, AUDIO_FORMAT_S32_BE },
+ { AFMT_S32_LE, AUDIO_FORMAT_S32_LE },
+ { AFMT_S24_PACKED, AUDIO_FORMAT_S24_PACKED },
+ { AFMT_AC3, AUDIO_FORMAT_AC3 },
+ { AFMT_QUERY, AUDIO_FORMAT_NONE }
+};
+
+/* common structure shared between both mixer and dsp nodes */
+struct ossclient {
+ ossdev_t *o_ossdev;
+ audio_client_t *o_client;
+ /* sndstat */
+ kmutex_t o_ss_lock;
+ char *o_ss_buf;
+ size_t o_ss_len;
+ size_t o_ss_sz;
+ size_t o_ss_off;
+};
+
+struct ossdev {
+ audio_dev_t *d_dev;
+
+ uint_t d_modify_cnt; /* flag apps of ctrl changes */
+ uint_t d_nctrl; /* num actual controls */
+ uint_t d_nalloc; /* num allocated controls */
+ audio_ctrl_t **d_ctrls; /* array of control handles */
+ oss_mixext *d_exts; /* array of mixer descs */
+
+ int d_play_grp;
+ int d_rec_grp;
+ int d_mon_grp;
+ int d_misc_grp;
+
+ kmutex_t d_mx;
+ kcondvar_t d_cv;
+};
+
+static int
+oss_cnt_controls(audio_ctrl_t *ctrl, void *arg)
+{
+ int *pint = (int *)arg;
+ int cnt;
+ audio_ctrl_desc_t desc;
+
+ cnt = *pint;
+ cnt++;
+ *pint = cnt;
+
+ if (auclnt_control_describe(ctrl, &desc) != 0)
+ return (AUDIO_WALK_CONTINUE);
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ for (uint64_t mask = desc.acd_maxvalue; mask; mask >>= 1) {
+ if (mask & 1) {
+ cnt++;
+ }
+ }
+ *pint = cnt;
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+/*
+ * Add one entry to the OSS user control table to internal control
+ * helper table.
+ *
+ * This is used with auimpl_walk_controls. The table must be pre-
+ * allocated before it is walk'd. This includes the root and
+ * extended control markers!
+ */
+static int
+oss_add_control(audio_ctrl_t *ctrl, void *arg)
+{
+ ossdev_t *odev = arg;
+ audio_ctrl_desc_t desc;
+ oss_mixext *ext;
+ int bit;
+ uint64_t mask;
+ const char *name;
+ int parent;
+ int flags;
+ unsigned scope;
+
+ if (auclnt_control_describe(ctrl, &desc))
+ return (AUDIO_WALK_CONTINUE);
+
+ parent = 0;
+
+ /*
+ * Add appropriate group if not already done so.
+ */
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_PLAY) {
+ if (!odev->d_play_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_OUTPUT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "PLAYBACK");
+ odev->d_play_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_OUTPUT;
+ parent = odev->d_play_grp;
+ } else if (desc.acd_flags & AUDIO_CTRL_FLAG_REC) {
+ if (!odev->d_rec_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_INPUT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "RECORD");
+ odev->d_rec_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_INPUT;
+ parent = odev->d_rec_grp;
+ } else if (desc.acd_flags & AUDIO_CTRL_FLAG_MONITOR) {
+ if (!odev->d_mon_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_MONITOR;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "MONITOR");
+ odev->d_mon_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_MONITOR;
+ parent = odev->d_mon_grp;
+ } else {
+ if (!odev->d_misc_grp) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->desc = MIXEXT_SCOPE_OTHER;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "MISC");
+ odev->d_misc_grp = odev->d_nctrl;
+ odev->d_nctrl++;
+ }
+ scope = MIXEXT_SCOPE_OTHER;
+ parent = odev->d_misc_grp;
+ }
+
+ name = desc.acd_name ? desc.acd_name : "";
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_GROUP;
+ ext->timestamp = gethrtime();
+ ext->parent = parent;
+ ext->desc = scope;
+ (void) snprintf(ext->id, sizeof (ext->id), "%s", name);
+ (void) snprintf(ext->extname, sizeof (ext->extname),
+ "%s", name);
+ parent = odev->d_nctrl++;
+ }
+
+ /* Next available open entry */
+ ext = &odev->d_exts[odev->d_nctrl];
+
+ /* Record the underlying control handle */
+ odev->d_ctrls[odev->d_nctrl] = ctrl;
+
+ /*
+ * Now setup the oss entry
+ */
+
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->maxvalue = (int)desc.acd_maxvalue;
+ ext->minvalue = (int)desc.acd_minvalue;
+ ext->timestamp = gethrtime();
+ ext->parent = parent;
+ ext->desc = scope;
+ /* all controls should be pollable for now */
+ flags = MIXF_POLL;
+
+ /*
+ * The following flags are intended to help out applications
+ * which need to figure out where to place certain controls.
+ * A few further words of guidance:
+ *
+ * Apps that just want a single master volume control should
+ * adjust the control(s) that are labelled with MIXF_PCMVOL if
+ * present. They can fall back to adjusting all MAINVOL
+ * levels instead, if no PCMVOL is present.
+ *
+ * Controls that are one type on a certain device might be a
+ * different type on another device. For example,
+ * audiopci/ak4531 can adjust input gains for individual
+ * levels, but lacks a master record gain. AC'97, on the
+ * other hand, has individual monitor gains for inputs, but
+ * only a single master recording gain.
+ */
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_READABLE)
+ flags |= MIXF_READABLE;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_WRITEABLE)
+ flags |= MIXF_WRITEABLE;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_CENTIBEL)
+ flags |= MIXF_CENTIBEL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_DECIBEL)
+ flags |= MIXF_DECIBEL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MAINVOL)
+ flags |= MIXF_MAINVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_PCMVOL)
+ flags |= MIXF_PCMVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_RECVOL)
+ flags |= MIXF_RECVOL;
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MONVOL)
+ flags |= MIXF_MONVOL;
+ ext->flags = flags;
+
+ (void) snprintf(ext->id, sizeof (ext->id), "%s", name);
+
+ /*
+ * For now just use the same extname as the real name.
+ */
+ (void) snprintf(ext->extname, sizeof (ext->extname), name);
+
+ /*
+ * Now we deal with various control types.
+ */
+ switch (desc.acd_type) {
+ case AUDIO_CTRL_TYPE_BOOLEAN:
+ ext->type = MIXT_ONOFF;
+ ext->enumbit = -1;
+ break;
+ case AUDIO_CTRL_TYPE_STEREO:
+ ext->type = MIXT_STEREOSLIDER;
+ break;
+ case AUDIO_CTRL_TYPE_MONO:
+ ext->type = MIXT_MONOSLIDER;
+ break;
+ case AUDIO_CTRL_TYPE_ENUM:
+
+ if (desc.acd_flags & AUDIO_CTRL_FLAG_MULTI) {
+ /*
+ * We turn AUDIO_CTRL_FLAG_MULTI into a group
+ * of checkboxes, since OSS can't represent it
+ * natively.
+ */
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ while (mask) {
+ if (mask & 1) {
+ ext = &odev->d_exts[odev->d_nctrl];
+ (void) snprintf(ext->extname,
+ sizeof (ext->extname), "%s.%s",
+ name, desc.acd_enum[bit]);
+ (void) snprintf(ext->id,
+ sizeof (ext->id), "%s",
+ desc.acd_enum[bit]);
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->parent = parent;
+ ext->timestamp = gethrtime();
+ ext->type = MIXT_ONOFF;
+ ext->minvalue = 0;
+ ext->maxvalue = 1;
+ ext->enumbit = bit;
+ ext->flags = flags;
+ odev->d_ctrls[odev->d_nctrl] = ctrl;
+ odev->d_nctrl++;
+ }
+ bit++;
+ mask >>= 1;
+ }
+ return (AUDIO_WALK_CONTINUE);
+ } else {
+ /*
+ * NB: This is sufficient only for controls
+ * with a single value. It cannot express the
+ * richer bitmask capabilities.
+ */
+ ext->type = MIXT_ENUM;
+ ext->minvalue = 0;
+
+ /*
+ * For an enumaration, we need to figure out
+ * which values are present, and set the
+ * appropriate mask and max value.
+ */
+ bzero(ext->enum_present, sizeof (ext->enum_present));
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ while (mask) {
+ if (mask & 1) {
+ ext->enum_present[bit / 8] |=
+ (1 << (bit % 8));
+ }
+ mask >>= 1;
+ bit++;
+ }
+ ext->maxvalue = bit;
+ }
+ break;
+
+ case AUDIO_CTRL_TYPE_METER:
+ default:
+ /* Its an unknown or unsupported (for now) control, skip */
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ odev->d_nctrl++;
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+/*
+ * Free up an OSS user land control to internal control,
+ * helper table.
+ */
+static void
+oss_free_controls(ossdev_t *odev)
+{
+ kmem_free(odev->d_ctrls, sizeof (audio_ctrl_t *) * odev->d_nalloc);
+ kmem_free(odev->d_exts, sizeof (oss_mixext) * odev->d_nalloc);
+ odev->d_nctrl = 0;
+ odev->d_nalloc = 0;
+}
+
+/*
+ * Allocate and fill in an OSS user land controls to internal controls
+ * helper table. This is done on one audio_dev device.
+ */
+static void
+oss_alloc_controls(ossdev_t *odev)
+{
+ audio_dev_t *d = odev->d_dev;
+ int nctrl = 0;
+ oss_mixext *ext;
+ oss_mixext_root *root_data;
+
+ /* Find out who many entries we need */
+ auclnt_walk_controls(d, oss_cnt_controls, &nctrl);
+ nctrl++; /* Needs space for the device root node */
+ nctrl++; /* Needs space for the device ext marker */
+ nctrl++; /* Needs space for the play group */
+ nctrl++; /* Needs space for the record group */
+ nctrl++; /* Needs space for the monitor group */
+ nctrl++; /* Needs space for the tone group */
+ nctrl++; /* Needs space for the 3D group */
+ nctrl++; /* Needs space for the misc group */
+
+ /* Allocate the OSS to boomer helper table */
+ odev->d_nalloc = nctrl;
+ odev->d_ctrls = kmem_zalloc(sizeof (audio_ctrl_t *) * nctrl, KM_SLEEP);
+ odev->d_exts = kmem_zalloc(sizeof (oss_mixext) * nctrl, KM_SLEEP);
+
+ /*
+ * Setup special case outputs to output OSS routes helper tables
+ */
+
+ /*
+ * Root node is first, that way all others parent is this one
+ */
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = 0;
+ ext->parent = -1;
+ ext->type = MIXT_DEVROOT;
+ ext->timestamp = gethrtime();
+ (void) snprintf(ext->id, sizeof (ext->id), "DEVROOT");
+ /*
+ * Root data... nobody should be using this though.
+ */
+ root_data = (oss_mixext_root *)&ext->data;
+ (void) snprintf(root_data->name, sizeof (root_data->name), "%s",
+ auclnt_get_dev_name(d));
+ (void) snprintf(root_data->id, sizeof (root_data->id), "%s",
+ auclnt_get_dev_name(d));
+
+ odev->d_nctrl++;
+
+ /*
+ * Insert an extra marker -- needed to keep layout apps hapy.
+ * This prevents some apps from assuming we are in "LEGACY" mode.
+ */
+ ext = &odev->d_exts[odev->d_nctrl];
+ ext->ctrl = odev->d_nctrl;
+ ext->control_no = -1;
+ ext->type = MIXT_MARKER;
+ ext->timestamp = gethrtime();
+ ext->parent = 0;
+ odev->d_nctrl++;
+
+ /* Fill in the complete table now */
+ auclnt_walk_controls(d, oss_add_control, odev);
+
+ /* Update the update_counter reference counter for groups */
+ for (nctrl = 0; nctrl < odev->d_nctrl; nctrl++) {
+ int i;
+
+ ext = &odev->d_exts[nctrl];
+ i = ext->parent;
+ while ((i >= 0) && (i < odev->d_nctrl)) {
+
+ ext = &odev->d_exts[i];
+ ASSERT(ext->parent < i);
+ ASSERT((ext->type == MIXT_GROUP) ||
+ (ext->type == MIXT_DEVROOT));
+ ext->update_counter++;
+ i = ext->parent;
+ }
+ }
+
+ ASSERT(odev->d_nctrl <= odev->d_nalloc);
+}
+
+static int
+oss_open(audio_client_t *c, int oflag)
+{
+ int rv;
+ ossdev_t *odev;
+ ossclient_t *sc;
+ audio_stream_t *isp, *osp;
+
+ isp = auclnt_input_stream(c);
+ osp = auclnt_output_stream(c);
+
+ /* note that OSS always uses nonblocking open() semantics */
+ if ((rv = auclnt_open(c, AUDIO_FORMAT_PCM, oflag | FNDELAY)) != 0) {
+ return (rv);
+ }
+
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ auclnt_close(c);
+ return (ENOMEM);
+ }
+ auclnt_set_private(c, sc);
+
+ odev = auclnt_get_minor_data(c, AUDIO_MINOR_DSP);
+
+ /* set a couple of common fields */
+ sc->o_client = c;
+ sc->o_ossdev = odev;
+
+ /* set all default parameters */
+ if (oflag & FWRITE) {
+ if (((rv = auclnt_set_format(osp, OSS_FMT)) != 0) ||
+ ((rv = auclnt_set_rate(osp, OSS_RATE)) != 0) ||
+ ((rv = auclnt_set_channels(osp, OSS_CHANNELS)) != 0)) {
+ goto failed;
+ }
+ }
+
+ if (oflag & FREAD) {
+ if (((rv = auclnt_set_format(isp, OSS_FMT)) != 0) ||
+ ((rv = auclnt_set_rate(isp, OSS_RATE)) != 0) ||
+ ((rv = auclnt_set_channels(isp, OSS_CHANNELS)) != 0)) {
+ goto failed;
+ }
+ }
+
+ return (0);
+
+failed:
+ auclnt_close(c);
+ return (rv);
+}
+
+static void
+oss_close(audio_client_t *c)
+{
+ ossclient_t *sc;
+
+ sc = auclnt_get_private(c);
+
+ if (ddi_can_receive_sig() || (ddi_get_pid() == 0)) {
+ (void) auclnt_drain(c);
+ }
+
+ kmem_free(sc, sizeof (*sc));
+
+ auclnt_close(c);
+}
+
+/*
+ * This is used to generate an array of names for an enumeration
+ */
+static ushort_t
+oss_set_enum(oss_mixer_enuminfo *ei, ushort_t nxt, const char *name)
+{
+ uint32_t n;
+
+ /* Get current entry to fill in */
+ n = ei->nvalues;
+ (void) snprintf(&ei->strings[nxt], ((sizeof (ei->strings) - nxt) - 1),
+ "%s", name);
+ ei->strindex[n] = nxt;
+
+ /* Adjust everything for next entry */
+ nxt += strnlen(name, ((sizeof (ei->strings) - nxt) - 1));
+ ei->strings[nxt++] = '\0';
+
+ ei->nvalues++;
+ return (nxt);
+}
+
+/*
+ * The following two functions are used to count the number of devices
+ * in under the boomer framework.
+ *
+ * We actually report the highest "index", and then if an audio device
+ * is not found, we report a bogus removed device for it in the actual
+ * ioctls. This goofiness is required to make the OSS API happy.
+ */
+int
+oss_dev_walker(audio_dev_t *d, void *arg)
+{
+ int *pcnt = arg;
+ int cnt;
+ int index;
+
+ cnt = *pcnt;
+ index = auclnt_get_dev_index(d);
+ if ((index + 1) > cnt) {
+ cnt = index + 1;
+ *pcnt = cnt;
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+oss_cnt_devs(void)
+{
+ int cnt = 0;
+
+ auclnt_walk_devs(oss_dev_walker, &cnt);
+ return (cnt);
+}
+
+static int
+sndctl_dsp_speed(audio_client_t *c, int *ratep)
+{
+ int rv;
+ int rate;
+ int oflag;
+
+ rate = *ratep;
+
+ oflag = auclnt_get_oflag(c);
+ if (oflag & FREAD) {
+ if ((rv = auclnt_set_rate(auclnt_input_stream(c), rate)) != 0)
+ return (rv);
+ }
+
+ if (oflag & FWRITE) {
+ if ((rv = auclnt_set_rate(auclnt_output_stream(c), rate)) != 0)
+ return (rv);
+ }
+
+ return (0);
+}
+
+static int
+sndctl_dsp_setfmt(audio_client_t *c, int *fmtp)
+{
+ int rv;
+ int fmt;
+ int i;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ if (*fmtp != AFMT_QUERY) {
+ /* convert from OSS */
+ for (i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (oss_formats[i].oss == *fmtp) {
+ fmt = oss_formats[i].fmt;
+ break;
+ }
+ }
+ if (fmt == AUDIO_FORMAT_NONE) {
+ /* if format not known, return ENOTSUP */
+ return (ENOTSUP);
+ }
+
+ if (oflag & FWRITE) {
+ rv = auclnt_set_format(auclnt_output_stream(c), fmt);
+ if (rv != 0)
+ return (rv);
+ }
+
+ if (oflag & FREAD) {
+ rv = auclnt_set_format(auclnt_input_stream(c), fmt);
+ if (rv != 0)
+ return (rv);
+ }
+ }
+
+ if (oflag & FWRITE) {
+ fmt = auclnt_get_format(auclnt_output_stream(c));
+ } else if (oflag & FREAD) {
+ fmt = auclnt_get_format(auclnt_input_stream(c));
+ }
+
+ /* convert back to OSS */
+ *(int *)fmtp = AFMT_QUERY;
+ for (i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (oss_formats[i].fmt == fmt) {
+ *(int *)fmtp = oss_formats[i].oss;
+ }
+ }
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getfmts(audio_client_t *c, int *fmtsp)
+{
+ _NOTE(ARGUNUSED(c));
+
+ /*
+ * For now, we support all the standard ones. Later we might
+ * add in conditional support for AC3.
+ */
+ *fmtsp = (AFMT_MU_LAW | AFMT_A_LAW |
+ AFMT_U8 | AFMT_S8 |
+ AFMT_S16_LE |AFMT_S16_BE |
+ AFMT_S24_LE | AFMT_S24_BE |
+ AFMT_S32_LE | AFMT_S32_BE |
+ AFMT_S24_PACKED);
+
+ return (0);
+}
+
+static int
+sndctl_dsp_channels(audio_client_t *c, int *chanp)
+{
+ int rv;
+ int nchan;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ nchan = *chanp;
+ if (nchan != 0) {
+ if (oflag & FWRITE) {
+ rv = auclnt_set_channels(auclnt_output_stream(c),
+ nchan);
+ if (rv != 0)
+ return (rv);
+ }
+
+ if (oflag & FREAD) {
+ rv = auclnt_set_channels(auclnt_input_stream(c), nchan);
+ if (rv != 0)
+ return (rv);
+ }
+ }
+
+ if (oflag & FWRITE) {
+ nchan = auclnt_get_channels(auclnt_output_stream(c));
+ } else if (oflag & FREAD) {
+ nchan = auclnt_get_channels(auclnt_input_stream(c));
+ }
+ *chanp = nchan;
+ return (0);
+}
+
+static int
+sndctl_dsp_stereo(audio_client_t *c, int *onoff)
+{
+ int nchan;
+
+ switch (*onoff) {
+ case 0:
+ nchan = 1;
+ break;
+ case 1:
+ nchan = 2;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ return (sndctl_dsp_channels(c, &nchan));
+}
+
+static int
+sndctl_dsp_post(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_flush(sp);
+ auclnt_clear_paused(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_getcaps(audio_client_t *c, int *capsp)
+{
+ int ncaps;
+ int osscaps = 0;
+
+ ncaps = auclnt_get_dev_capab(auclnt_get_dev(c));
+
+ if (ncaps & AUDIO_CLIENT_CAP_PLAY)
+ osscaps |= PCM_CAP_OUTPUT;
+ if (ncaps & AUDIO_CLIENT_CAP_RECORD)
+ osscaps |= PCM_CAP_INPUT;
+ if (ncaps & AUDIO_CLIENT_CAP_DUPLEX)
+ osscaps |= PCM_CAP_DUPLEX;
+
+ *capsp = osscaps;
+ return (0);
+}
+
+static int
+sndctl_dsp_gettrigger(audio_client_t *c, int *trigp)
+{
+ int triggers = 0;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+
+ if (oflag & FWRITE) {
+ if (!auclnt_is_paused(auclnt_output_stream(c))) {
+ triggers |= PCM_ENABLE_OUTPUT;
+ }
+ }
+
+ if (oflag & FREAD) {
+ if (!auclnt_is_paused(auclnt_input_stream(c))) {
+ triggers |= PCM_ENABLE_INPUT;
+ }
+ }
+ *trigp = triggers;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_settrigger(audio_client_t *c, int *trigp)
+{
+ int triggers;
+ int oflag;
+
+ oflag = auclnt_get_oflag(c);
+ triggers = *trigp;
+
+ if ((oflag & FWRITE) && (triggers & PCM_ENABLE_OUTPUT)) {
+ auclnt_clear_paused(auclnt_output_stream(c));
+ }
+
+ if ((oflag & FREAD) && (triggers & PCM_ENABLE_INPUT)) {
+ auclnt_clear_paused(auclnt_input_stream(c));
+ }
+
+ return (0);
+}
+
+struct oss_legacy_volume {
+ pid_t pid;
+ uint8_t ogain;
+ uint8_t igain;
+};
+
+static int
+oss_legacy_volume_walker(audio_client_t *c, void *arg)
+{
+ struct oss_legacy_volume *olv = arg;
+
+ if (auclnt_get_pid(c) == olv->pid) {
+ if (olv->ogain <= 100) {
+ auclnt_set_gain(auclnt_output_stream(c), olv->ogain);
+ }
+ if (olv->igain <= 100) {
+ auclnt_set_gain(auclnt_input_stream(c), olv->igain);
+ }
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void
+oss_set_legacy_volume(audio_client_t *c, uint8_t ogain, uint8_t igain)
+{
+ struct oss_legacy_volume olv;
+
+ olv.pid = auclnt_get_pid(c);
+ olv.ogain = ogain;
+ olv.igain = igain;
+ auclnt_dev_walk_clients(auclnt_get_dev(c),
+ oss_legacy_volume_walker, &olv);
+}
+
+static int
+sndctl_dsp_getplayvol(audio_client_t *c, int *volp)
+{
+ int vol;
+
+ /* convert monophonic soft value to OSS stereo value */
+ vol = auclnt_get_gain(auclnt_output_stream(c));
+ *volp = vol | (vol << 8);
+ return (0);
+}
+
+static int
+sndctl_dsp_setplayvol(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+
+ auclnt_set_gain(auclnt_output_stream(c), vol);
+ *volp = (vol | (vol << 8));
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getrecvol(audio_client_t *c, int *volp)
+{
+ int vol;
+
+ vol = auclnt_get_gain(auclnt_input_stream(c));
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sndctl_dsp_setrecvol(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+
+ auclnt_set_gain(auclnt_input_stream(c), vol);
+ *volp = (vol | (vol << 8));
+
+ return (0);
+}
+
+static int
+sound_mixer_write_ogain(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+ oss_set_legacy_volume(c, vol, 255);
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sound_mixer_write_igain(audio_client_t *c, int *volp)
+{
+ uint8_t vol;
+
+ vol = *volp & 0xff;
+ if (vol > 100) {
+ return (EINVAL);
+ }
+ oss_set_legacy_volume(c, 255, vol);
+ *volp = (vol | (vol << 8));
+ return (0);
+}
+
+static int
+sndctl_dsp_readctl(audio_client_t *c, oss_digital_control *ctl)
+{
+ /* SPDIF: need to add support with spdif */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(ctl));
+ return (ENOTSUP);
+}
+
+static int
+sndctl_dsp_writectl(audio_client_t *c, oss_digital_control *ctl)
+{
+ /* SPDIF: need to add support with spdif */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(ctl));
+ return (ENOTSUP);
+}
+
+static int
+sndctl_dsp_cookedmode(audio_client_t *c, int *rvp)
+{
+ _NOTE(ARGUNUSED(c));
+
+ /* We are *always* in cooked mode -- at least until we have AC3. */
+ if (*rvp == 0) {
+ return (ENOTSUP);
+ } else {
+ return (0);
+ }
+}
+
+static int
+sndctl_dsp_silence(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_skip(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ auclnt_clear_paused(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt_input(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FREAD) {
+ audio_stream_t *sp = auclnt_input_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt_output(audio_client_t *c)
+{
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ auclnt_set_paused(sp);
+ auclnt_flush(sp);
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_halt(audio_client_t *c)
+{
+ (void) sndctl_dsp_halt_input(c);
+ (void) sndctl_dsp_halt_output(c);
+ return (0);
+}
+
+static int
+sndctl_dsp_sync(audio_client_t *c)
+{
+ return (auclnt_drain(c));
+}
+
+static int
+sndctl_dsp_setfragment(audio_client_t *c, int *fragp)
+{
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(fragp));
+ /*
+ * We don't really implement this "properly" at this time.
+ * The problems with this ioctl are various: the API insists
+ * that fragment sizes be a power of two -- and we can't cope
+ * with accurately reporting fragment sizes in the face of
+ * mixing and format conversion.
+ *
+ * Well behaved applications should really not use this API.
+ *
+ * According to the OSS API documentation, the values provided
+ * are nothing more than a "hint" and not to be relied upon
+ * anyway. And we aren't obligated to report the actual
+ * values back!
+ */
+ return (0);
+}
+
+/*
+ * A word about recsrc, and playtgt ioctls: We don't allow ordinary DSP
+ * applications to change port configurations, because these could have a
+ * bad effect for other applications. Instead, these settings have to
+ * be changed using the master mixer panel. In order to make applications
+ * happy, we just present a single "default" source/target.
+ */
+static int
+sndctl_dsp_get_recsrc_names(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ _NOTE(ARGUNUSED(c));
+
+ ei->nvalues = 1;
+ (void) snprintf(ei->strings, sizeof (ei->strings), "default");
+ ei->strindex[0] = 0;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_get_recsrc(audio_client_t *c, int *srcp)
+{
+ _NOTE(ARGUNUSED(c));
+ *srcp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_set_recsrc(audio_client_t *c, int *srcp)
+{
+ _NOTE(ARGUNUSED(c));
+ *srcp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_get_playtgt_names(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ _NOTE(ARGUNUSED(c));
+
+ ei->nvalues = 1;
+ (void) snprintf(ei->strings, sizeof (ei->strings), "default");
+ ei->strindex[0] = 0;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_get_playtgt(audio_client_t *c, int *tgtp)
+{
+ _NOTE(ARGUNUSED(c));
+ *tgtp = 0;
+ return (0);
+}
+
+static int
+sndctl_dsp_set_playtgt(audio_client_t *c, int *tgtp)
+{
+ _NOTE(ARGUNUSED(c));
+ *tgtp = 0;
+ return (0);
+}
+
+static int
+sndctl_sysinfo(oss_sysinfo *si)
+{
+ bzero(si, sizeof (*si));
+ (void) snprintf(si->product, sizeof (si->product), "SunOS Audio");
+ (void) snprintf(si->version, sizeof (si->version), "4.0");
+ si->versionnum = OSS_VERSION;
+ si->numcards = oss_cnt_devs();
+ si->nummixers = si->numcards - 1;
+ si->numaudios = si->numcards - 1;
+ si->numaudioengines = si->numaudios;
+ (void) snprintf(si->license, sizeof (si->license), "CDDL");
+ return (0);
+}
+
+static int
+sndctl_cardinfo(audio_client_t *c, oss_card_info *ci)
+{
+ audio_dev_t *d;
+ void *iter;
+ const char *info;
+ int n;
+ boolean_t release;
+
+ if ((n = ci->card) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(ci, sizeof (*ci));
+ ci->card = n;
+
+ if (d == NULL) {
+ /*
+ * If device removed (e.g. for DR), then
+ * report a bogus removed entry.
+ */
+ (void) snprintf(ci->shortname, sizeof (ci->shortname),
+ "<removed>");
+ (void) snprintf(ci->longname, sizeof (ci->longname),
+ "<removed>");
+ return (0);
+ }
+
+ (void) snprintf(ci->shortname, sizeof (ci->shortname),
+ "%s", auclnt_get_dev_name(d));
+ (void) snprintf(ci->longname, sizeof (ci->longname),
+ "%s (%s)", auclnt_get_dev_description(d),
+ auclnt_get_dev_version(d));
+
+ iter = NULL;
+ while ((info = auclnt_get_dev_hw_info(d, &iter)) != NULL) {
+ (void) strlcat(ci->hw_info, info, sizeof (ci->hw_info));
+ (void) strlcat(ci->hw_info, "\n", sizeof (ci->hw_info));
+ }
+
+ /*
+ * We don't report interrupt counts, ack counts (which are
+ * just "read" interrupts, not spurious), or any other flags.
+ * Nothing should be using any of this data anyway ... these
+ * values were intended for 4Front's debugging purposes. In
+ * Solaris, drivers should use interrupt kstats to report
+ * interrupt related statistics.
+ */
+ if (release)
+ auclnt_release_dev(d);
+ return (0);
+}
+
+static int
+audioinfo_walker(audio_engine_t *e, void *a)
+{
+ oss_audioinfo *si = a;
+ int fmt, nchan, rate, cap;
+
+ fmt = auclnt_engine_get_format(e);
+ nchan = auclnt_engine_get_channels(e);
+ rate = auclnt_engine_get_rate(e);
+ cap = auclnt_engine_get_capab(e);
+
+ for (int i = 0; oss_formats[i].fmt != AUDIO_FORMAT_NONE; i++) {
+ if (fmt == oss_formats[i].fmt) {
+ if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ si->oformats |= oss_formats[i].oss;
+ }
+ if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ si->iformats |= oss_formats[i].oss;
+ }
+ break;
+ }
+ }
+ si->max_channels = max(nchan, si->max_channels);
+ si->max_rate = max(rate, si->max_rate);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sndctl_audioinfo(audio_client_t *c, oss_audioinfo *si)
+{
+ audio_dev_t *d;
+ const char *name;
+ int n;
+ boolean_t release;
+ unsigned cap;
+
+ if ((n = si->dev) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ n++; /* skip pseudo device */
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(si, sizeof (*si));
+ si->dev = n - 1;
+
+ if (d == NULL) {
+ /* if device not present, forge a false entry */
+ si->card_number = n;
+ si->mixer_dev = n - 1;
+ si->legacy_device = -1;
+ si->enabled = 0;
+ (void) snprintf(si->name, sizeof (si->name), "<removed>");
+ return (0);
+ }
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(si->name, sizeof (si->name), "%s", name);
+
+ si->legacy_device = auclnt_get_dev_number(d);
+ si->caps = 0;
+
+ auclnt_dev_walk_engines(d, audioinfo_walker, si);
+
+ cap = auclnt_get_dev_capab(d);
+
+ if (cap & AUDIO_CLIENT_CAP_DUPLEX) {
+ si->caps |= PCM_CAP_DUPLEX;
+ }
+ if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ si->caps |= PCM_CAP_OUTPUT;
+ }
+ if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ si->caps |= PCM_CAP_INPUT;
+ }
+
+ if (si->caps != 0) {
+ /* AC3: PCM_CAP_MULTI would be wrong for an AC3 only device */
+ si->caps |= PCM_CAP_BATCH | PCM_CAP_TRIGGER | PCM_CAP_MULTI;
+ /* MMAP: we add PCM_CAP_MMAP when we we support it */
+ si->enabled = 1;
+ si->rate_source = si->dev;
+
+ /* we can convert PCM formats */
+ if ((si->iformats | si->oformats) &
+ AUDIO_FORMAT_PCM) {
+ si->min_channels = min(2, si->max_channels);
+ si->min_rate = min(5000, si->max_rate);
+ si->caps |= PCM_CAP_FREERATE;
+ }
+ (void) snprintf(si->devnode, sizeof (si->devnode),
+ "/dev/sound/%s:%ddsp",
+ auclnt_get_dev_driver(d), auclnt_get_dev_instance(d));
+ } else {
+ si->enabled = 0; /* stops apps from using us directly */
+ si->caps = PCM_CAP_VIRTUAL;
+ (void) snprintf(si->devnode, sizeof (si->devnode),
+ "/dev/sndstat");
+ }
+
+ si->pid = -1;
+ (void) snprintf(si->handle, sizeof (si->handle), "%s", name);
+ (void) snprintf(si->label, sizeof (si->label), "%s", name);
+ si->latency = -1;
+ si->card_number = n;
+ si->mixer_dev = n - 1;
+
+ if (release)
+ auclnt_release_dev(d);
+
+ return (0);
+}
+
+static int
+sound_mixer_info(audio_client_t *c, mixer_info *mi)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ ossclient_t *sc;
+ const char *name;
+
+ sc = auclnt_get_private(c);
+ odev = sc->o_ossdev;
+
+ d = auclnt_get_dev(c);
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(mi->id, sizeof (mi->id), "%s", name);
+ (void) snprintf(mi->name, sizeof (mi->name), "%s", name);
+ (void) snprintf(mi->handle, sizeof (mi->handle), "%s", name);
+ mi->modify_counter = odev->d_modify_cnt;
+ mi->card_number = auclnt_get_dev_index(d);
+ mi->port_number = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_devmask(audio_client_t *c, int *devmask)
+{
+ _NOTE(ARGUNUSED(c));
+ *devmask = SOUND_MASK_VOLUME | SOUND_MASK_PCM | SOUND_MASK_IGAIN;
+ return (0);
+}
+
+static int
+sound_mixer_read_recmask(audio_client_t *c, int *recmask)
+{
+ _NOTE(ARGUNUSED(c));
+ *recmask = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_recsrc(audio_client_t *c, int *recsrc)
+{
+ _NOTE(ARGUNUSED(c));
+ *recsrc = 0;
+ return (0);
+}
+
+static int
+sound_mixer_read_caps(audio_client_t *c, int *caps)
+{
+ _NOTE(ARGUNUSED(c));
+ /* single recording source... sort of */
+ *caps = SOUND_CAP_EXCL_INPUT;
+ return (0);
+}
+
+static int
+sndctl_mixerinfo(audio_client_t *c, oss_mixerinfo *mi)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ const char *name;
+ int n;
+ boolean_t release = B_FALSE;
+
+ if ((n = mi->dev) == -1) {
+ release = B_FALSE;
+ d = auclnt_get_dev(c);
+ n = auclnt_get_dev_index(d);
+ } else {
+ release = B_TRUE;
+ n++;
+ d = auclnt_hold_dev_by_index(n);
+ }
+
+ bzero(mi, sizeof (*mi));
+ mi->dev = n - 1;
+
+ if (d == NULL) {
+ mi->card_number = n;
+ mi->enabled = 0;
+ mi->legacy_device = -1;
+ (void) snprintf(mi->name, sizeof (mi->name), "<removed>");
+ (void) snprintf(mi->id, sizeof (mi->id), "<removed>");
+ return (0);
+ }
+
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ if (release)
+ auclnt_release_dev(d);
+ return (EINVAL);
+ }
+
+ name = auclnt_get_dev_name(d);
+ (void) snprintf(mi->name, sizeof (mi->name), "%s", name);
+ (void) snprintf(mi->id, sizeof (mi->id), "%s", name);
+ (void) snprintf(mi->handle, sizeof (mi->handle), "%s", name);
+ mi->modify_counter = odev->d_modify_cnt;
+ mi->card_number = auclnt_get_dev_index(d);
+ mi->legacy_device = auclnt_get_dev_number(d);
+ if (mi->legacy_device >= 0) {
+ (void) snprintf(mi->devnode, sizeof (mi->devnode),
+ "/dev/sound/%s:%dmixer",
+ auclnt_get_dev_driver(d), auclnt_get_dev_instance(d));
+ mi->enabled = 1;
+ } else {
+ /* special nodes use generic sndstat node */
+ (void) snprintf(mi->devnode, sizeof (mi->devnode),
+ "/dev/sndstat");
+ mi->enabled = 0;
+ }
+ mi->nrext = odev->d_nctrl;
+
+ if (release)
+ auclnt_release_dev(d);
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getblksize(audio_client_t *c, int *fragsz)
+{
+ int oflag = auclnt_get_oflag(c);
+
+ if (oflag & FWRITE)
+ *fragsz = auclnt_get_fragsz(auclnt_output_stream(c));
+ else if (oflag & FREAD)
+ *fragsz = auclnt_get_fragsz(auclnt_input_stream(c));
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getospace(audio_client_t *c, audio_buf_info *bi)
+{
+ audio_stream_t *sp;
+ unsigned n;
+
+ if ((auclnt_get_oflag(c) & FWRITE) == 0) {
+ return (EACCES);
+ }
+
+ sp = auclnt_output_stream(c);
+ n = auclnt_get_nframes(sp) - auclnt_get_count(sp);
+
+ bi->fragsize = auclnt_get_fragsz(sp);
+ bi->fragstotal = auclnt_get_nfrags(sp);
+ bi->bytes = (n * auclnt_get_framesz(sp));
+ bi->fragments = bi->bytes / bi->fragsize;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getispace(audio_client_t *c, audio_buf_info *bi)
+{
+ audio_stream_t *sp;
+ unsigned n;
+
+ if ((auclnt_get_oflag(c) & FREAD) == 0) {
+ return (EACCES);
+ }
+
+ sp = auclnt_input_stream(c);
+ n = auclnt_get_count(sp);
+
+ bi->fragsize = auclnt_get_fragsz(sp);
+ bi->fragstotal = auclnt_get_nfrags(sp);
+ bi->bytes = (n * auclnt_get_framesz(sp));
+ bi->fragments = bi->bytes / bi->fragsize;
+
+ return (0);
+}
+
+static int
+sndctl_dsp_getodelay(audio_client_t *c, int *bytes)
+{
+ unsigned framesz;
+ unsigned slen, flen;
+
+ if (auclnt_get_oflag(c) & FWRITE) {
+ audio_stream_t *sp = auclnt_output_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ auclnt_get_output_qlen(c, &slen, &flen);
+ *bytes = (slen + flen) * framesz;
+ } else {
+ *bytes = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_current_iptr(audio_client_t *c, oss_count_t *count)
+{
+ if (auclnt_get_oflag(c) & FREAD) {
+ count->samples = auclnt_get_samples(auclnt_input_stream(c));
+ count->fifo_samples = 0; /* not quite accurate */
+ } else {
+ count->samples = 0;
+ count->fifo_samples = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_current_optr(audio_client_t *c, oss_count_t *count)
+{
+ unsigned samples, fifo;
+
+ if (auclnt_get_oflag(c) & FWRITE) {
+ auclnt_get_output_qlen(c, &samples, &fifo);
+ count->samples = samples;
+ count->fifo_samples = fifo;
+ } else {
+ count->samples = 0;
+ count->fifo_samples = 0;
+ }
+ return (0);
+}
+
+static int
+sndctl_dsp_getoptr(audio_client_t *c, count_info *ci)
+{
+ audio_stream_t *sp;
+ unsigned framesz;
+ unsigned fragsz;
+
+ bzero(ci, sizeof (*ci));
+ if ((auclnt_get_oflag(c) & FWRITE) == 0) {
+ return (0);
+ }
+ sp = auclnt_output_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ fragsz = auclnt_get_fragsz(sp);
+ ci->blocks = auclnt_get_samples(sp) * framesz / fragsz;
+ auclnt_set_samples(sp, 0);
+ ci->bytes = auclnt_get_tail(sp) * framesz;
+ ci->ptr = auclnt_get_tidx(sp) * framesz;
+ return (0);
+}
+
+static int
+sndctl_dsp_getiptr(audio_client_t *c, count_info *ci)
+{
+ audio_stream_t *sp;
+ unsigned framesz;
+ unsigned fragsz;
+
+ bzero(ci, sizeof (*ci));
+ if ((auclnt_get_oflag(c) & FREAD) == 0) {
+ return (0);
+ }
+ sp = auclnt_input_stream(c);
+ framesz = auclnt_get_framesz(sp);
+ fragsz = auclnt_get_fragsz(sp);
+ ci->blocks = auclnt_get_samples(sp) * framesz / fragsz;
+ auclnt_set_samples(sp, 0);
+ ci->bytes = auclnt_get_head(sp) * framesz;
+ ci->ptr = auclnt_get_hidx(sp) * framesz;
+ return (0);
+}
+
+static int
+sndctl_dsp_geterror(audio_client_t *c, audio_errinfo *bi)
+{
+ audio_stream_t *sp;
+ unsigned fragsz;
+ /*
+ * Note: The use of this structure is unsafe... different
+ * meanings for error codes are used by different implementations,
+ * according to the spec. (Even different versions of the same
+ * implementation could have different values.)
+ *
+ * Rather than try to come up with a reliable solution here, we
+ * don't use it. If you want to report errors, or see the result
+ * of errors, use syslog.
+ */
+ bzero(bi, sizeof (*bi));
+
+ sp = auclnt_output_stream(c);
+ fragsz = max(auclnt_get_fragsz(sp), 1);
+ bi->play_underruns = (int)((auclnt_get_errors(sp) + (fragsz - 1)) /
+ fragsz);
+ auclnt_set_errors(sp, 0);
+
+ sp = auclnt_input_stream(c);
+ fragsz = max(auclnt_get_fragsz(sp), 1);
+ bi->rec_overruns = (int)((auclnt_get_errors(sp) + (fragsz - 1)) /
+ fragsz);
+ auclnt_set_errors(sp, 0);
+
+ return (0);
+}
+
+static int
+sndctl_sun_send_number(audio_client_t *c, int *num, cred_t *cr)
+{
+ audio_dev_t *dev;
+ int rv;
+
+ if ((rv = drv_priv(cr)) != 0) {
+ return (rv);
+ }
+
+ dev = auclnt_get_dev(c);
+ auclnt_set_dev_number(dev, *num);
+ return (0);
+}
+
+static int
+oss_getversion(int *versp)
+{
+ *versp = OSS_VERSION;
+ return (0);
+}
+
+static int
+oss_ioctl(audio_client_t *c, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ int sz;
+ void *data;
+ int rv = 0;
+
+ _NOTE(ARGUNUSED(credp));
+
+ sz = OSSIOC_GETSZ(cmd);
+
+ if ((cmd & (OSSIOC_IN | OSSIOC_OUT)) && sz) {
+ if ((data = kmem_zalloc(sz, KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ } else {
+ sz = 0;
+ }
+
+ if (cmd & OSSIOC_IN) {
+ if ((rv = ddi_copyin((void *)arg, data, sz, mode)) != 0) {
+ goto done;
+ }
+ }
+
+ switch (cmd) {
+ /*
+ * DSP specific ioctls
+ */
+ case SNDCTL_DSP_HALT:
+ rv = sndctl_dsp_halt(c);
+ break;
+
+ case SNDCTL_DSP_SYNC:
+ rv = sndctl_dsp_sync(c);
+ break;
+
+ case SNDCTL_DSP_SPEED:
+ rv = sndctl_dsp_speed(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETFMT:
+ rv = sndctl_dsp_setfmt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETFMTS:
+ rv = sndctl_dsp_getfmts(c, (int *)data);
+ break;
+ case SNDCTL_DSP_STEREO:
+ rv = sndctl_dsp_stereo(c, (int *)data);
+ break;
+ case SNDCTL_DSP_CHANNELS:
+ rv = sndctl_dsp_channels(c, (int *)data);
+ break;
+ case SNDCTL_DSP_POST:
+ rv = sndctl_dsp_post(c);
+ break;
+ case SNDCTL_DSP_GETCAPS:
+ rv = sndctl_dsp_getcaps(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETTRIGGER:
+ rv = sndctl_dsp_gettrigger(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETTRIGGER:
+ rv = sndctl_dsp_settrigger(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETPLAYVOL:
+ case SOUND_MIXER_READ_VOLUME: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_PCM: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_OGAIN: /* legacy mixer on dsp */
+ rv = sndctl_dsp_getplayvol(c, (int *)data);
+ break;
+ case SOUND_MIXER_WRITE_VOLUME: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_PCM: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_OGAIN: /* legacy mixer on dsp */
+ rv = sound_mixer_write_ogain(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETPLAYVOL:
+ rv = sndctl_dsp_setplayvol(c, (int *)data);
+ break;
+ case SNDCTL_DSP_READCTL:
+ rv = sndctl_dsp_readctl(c, (oss_digital_control *)data);
+ break;
+ case SNDCTL_DSP_WRITECTL:
+ rv = sndctl_dsp_writectl(c, (oss_digital_control *)data);
+ break;
+ case SNDCTL_DSP_COOKEDMODE:
+ rv = sndctl_dsp_cookedmode(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SILENCE:
+ rv = sndctl_dsp_silence(c);
+ break;
+ case SNDCTL_DSP_SKIP:
+ rv = sndctl_dsp_skip(c);
+ break;
+ case SNDCTL_DSP_HALT_INPUT:
+ rv = sndctl_dsp_halt_input(c);
+ break;
+ case SNDCTL_DSP_HALT_OUTPUT:
+ rv = sndctl_dsp_halt_output(c);
+ break;
+ case SNDCTL_DSP_GET_RECSRC_NAMES:
+ rv = sndctl_dsp_get_recsrc_names(c, (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_DSP_SUBDIVIDE:
+ case SNDCTL_DSP_SETFRAGMENT:
+ rv = sndctl_dsp_setfragment(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GET_RECSRC:
+ rv = sndctl_dsp_get_recsrc(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SET_RECSRC:
+ rv = sndctl_dsp_set_recsrc(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GET_PLAYTGT_NAMES:
+ rv = sndctl_dsp_get_playtgt_names(c,
+ (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_DSP_GET_PLAYTGT:
+ rv = sndctl_dsp_get_playtgt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SET_PLAYTGT:
+ rv = sndctl_dsp_set_playtgt(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETRECVOL:
+ case SOUND_MIXER_READ_RECGAIN: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_RECLEV: /* legacy mixer on dsp */
+ case SOUND_MIXER_READ_IGAIN: /* legacy mixer on dsp */
+ rv = sndctl_dsp_getrecvol(c, (int *)data);
+ break;
+ case SOUND_MIXER_WRITE_RECGAIN: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_RECLEV: /* legacy mixer on dsp */
+ case SOUND_MIXER_WRITE_IGAIN: /* legacy mixer on dsp */
+ rv = sound_mixer_write_igain(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETRECVOL:
+ rv = sndctl_dsp_setrecvol(c, (int *)data);
+ break;
+ case SNDCTL_DSP_SETDUPLEX: /* Ignored */
+ case SNDCTL_DSP_LOW_WATER: /* Ignored */
+ case SNDCTL_DSP_POLICY: /* Ignored */
+ case SNDCTL_DSP_PROFILE: /* Ignored */
+ rv = 0;
+ break;
+ case SNDCTL_DSP_GETBLKSIZE:
+ rv = sndctl_dsp_getblksize(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETOSPACE:
+ rv = sndctl_dsp_getospace(c, (audio_buf_info *)data);
+ break;
+ case SNDCTL_DSP_GETISPACE:
+ rv = sndctl_dsp_getispace(c, (audio_buf_info *)data);
+ break;
+ case SNDCTL_DSP_GETODELAY:
+ rv = sndctl_dsp_getodelay(c, (int *)data);
+ break;
+ case SNDCTL_DSP_GETOPTR:
+ rv = sndctl_dsp_getoptr(c, (count_info *)data);
+ break;
+ case SNDCTL_DSP_GETIPTR:
+ rv = sndctl_dsp_getiptr(c, (count_info *)data);
+ break;
+ case SNDCTL_DSP_GETERROR:
+ rv = sndctl_dsp_geterror(c, (audio_errinfo *)data);
+ break;
+ case SNDCTL_DSP_CURRENT_IPTR:
+ rv = sndctl_dsp_current_iptr(c, (oss_count_t *)data);
+ break;
+ case SNDCTL_DSP_CURRENT_OPTR:
+ rv = sndctl_dsp_current_optr(c, (oss_count_t *)data);
+ break;
+
+ /*
+ * Shared ioctls with /dev/mixer.
+ */
+ case OSS_GETVERSION:
+ rv = oss_getversion((int *)data);
+ break;
+ case SNDCTL_CARDINFO:
+ rv = sndctl_cardinfo(c, (oss_card_info *)data);
+ break;
+ case SNDCTL_ENGINEINFO:
+ case SNDCTL_AUDIOINFO:
+ case SNDCTL_AUDIOINFO_EX:
+ rv = sndctl_audioinfo(c, (oss_audioinfo *)data);
+ break;
+ case SNDCTL_SYSINFO:
+ rv = sndctl_sysinfo((oss_sysinfo *)data);
+ break;
+ case SNDCTL_MIXERINFO:
+ rv = sndctl_mixerinfo(c, (oss_mixerinfo *)data);
+ break;
+ case SOUND_MIXER_INFO:
+ rv = sound_mixer_info(c, (mixer_info *)data);
+ break;
+
+ /*
+ * These are mixer ioctls that are virtualized for the DSP
+ * device. They are accessible via either /dev/mixer or
+ * /dev/dsp.
+ */
+ case SOUND_MIXER_READ_RECSRC:
+ case SOUND_MIXER_WRITE_RECSRC:
+ rv = sound_mixer_read_recsrc(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_DEVMASK:
+ case SOUND_MIXER_READ_STEREODEVS:
+ rv = sound_mixer_read_devmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECMASK:
+ rv = sound_mixer_read_recmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_CAPS:
+ rv = sound_mixer_read_caps(c, (int *)data);
+ break;
+
+ /*
+ * Ioctls we have chosen not to support for now. Some
+ * of these are of legacy interest only.
+ */
+ case SNDCTL_SETSONG:
+ case SNDCTL_GETSONG:
+ case SNDCTL_DSP_SYNCGROUP:
+ case SNDCTL_DSP_SYNCSTART:
+ case SNDCTL_DSP_GET_CHNORDER:
+ case SNDCTL_DSP_SET_CHNORDER:
+ case SNDCTL_DSP_GETIPEAKS:
+ case SNDCTL_DSP_GETOPEAKS:
+ case SNDCTL_DSP_GETCHANNELMASK:
+ case SNDCTL_DSP_BIND_CHANNEL:
+ case SNDCTL_DSP_SETSYNCRO:
+ default:
+ rv = EINVAL;
+ break;
+ }
+
+ if ((rv == 0) && (cmd & OSSIOC_OUT)) {
+ rv = ddi_copyout(data, (void *)arg, sz, mode);
+ }
+ if (rv == 0) {
+ *rvalp = 0;
+ }
+
+done:
+ if (sz) {
+ kmem_free(data, sz);
+ }
+ return (rv);
+}
+
+static void
+oss_output(audio_client_t *c)
+{
+ auclnt_pollwakeup(c, POLLOUT);
+}
+
+static void
+oss_input(audio_client_t *c)
+{
+ auclnt_pollwakeup(c, POLLIN | POLLRDNORM);
+}
+
+static void
+oss_notify(audio_client_t *c)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ return;
+ }
+ odev->d_modify_cnt++;
+}
+
+static int
+ossmix_open(audio_client_t *c, int oflag)
+{
+ int rv;
+ ossclient_t *sc;
+ ossdev_t *odev;
+
+ _NOTE(ARGUNUSED(oflag));
+
+ if ((rv = auclnt_open(c, AUDIO_FORMAT_NONE, 0)) != 0) {
+ return (rv);
+ }
+
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ sc->o_ss_sz = 8192;
+ if ((sc->o_ss_buf = kmem_zalloc(sc->o_ss_sz, KM_NOSLEEP)) == NULL) {
+ kmem_free(sc, sizeof (*sc));
+ return (ENOMEM);
+ }
+ auclnt_set_private(c, sc);
+
+ odev = auclnt_get_minor_data(c, AUDIO_MINOR_DSP);
+
+ /* set a couple of common fields */
+ sc->o_client = c;
+ sc->o_ossdev = odev;
+
+ return (rv);
+}
+
+static void
+ossmix_close(audio_client_t *c)
+{
+ ossclient_t *sc;
+
+ sc = auclnt_get_private(c);
+
+ kmem_free(sc->o_ss_buf, sc->o_ss_sz);
+ kmem_free(sc, sizeof (*sc));
+
+ auclnt_close(c);
+}
+
+static int
+sndctl_mix_nrext(audio_client_t *c, int *ncp)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((*ncp != -1) && (*ncp != (auclnt_get_dev_index(d) - 1))) {
+ return (ENXIO);
+ }
+
+ if ((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) {
+ return (EINVAL);
+ }
+
+ *ncp = odev->d_nctrl;
+
+ return (0);
+}
+
+static int
+sndctl_mix_extinfo(audio_client_t *c, oss_mixext *pext)
+{
+ audio_dev_t *d;
+ ossdev_t *odev;
+ int rv = 0;
+ int dev;
+
+ d = auclnt_get_dev(c);
+
+ if (((dev = pext->dev) != -1) && (dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (pext->ctrl >= odev->d_nctrl)) {
+ return (EINVAL);
+ }
+
+ bcopy(&odev->d_exts[pext->ctrl], pext, sizeof (*pext));
+ pext->enumbit = 0;
+ pext->dev = dev;
+
+ return (rv);
+}
+
+static int
+sndctl_mix_enuminfo(audio_client_t *c, oss_mixer_enuminfo *ei)
+{
+ audio_dev_t *d;
+ audio_ctrl_desc_t desc;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+ uint64_t mask;
+ int bit;
+ ushort_t nxt;
+
+ d = auclnt_get_dev(c);
+
+ if ((ei->dev != -1) && (ei->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (ei->ctrl >= odev->d_nctrl) ||
+ (odev->d_exts[ei->ctrl].type != MIXT_ENUM) ||
+ ((ctrl = odev->d_ctrls[ei->ctrl]) == NULL) ||
+ (auclnt_control_describe(ctrl, &desc) != 0)) {
+ return (EINVAL);
+ }
+
+ mask = desc.acd_maxvalue;
+ bit = 0;
+ nxt = 0;
+ ei->nvalues = 0;
+ bzero(ei->strings, sizeof (ei->strings));
+ bzero(ei->strindex, sizeof (ei->strindex));
+
+ while (mask) {
+ const char *name = desc.acd_enum[bit];
+ nxt = oss_set_enum(ei, nxt, name ? name : "");
+ mask >>= 1;
+ bit++;
+ }
+
+ return (0);
+}
+
+static int
+sndctl_mix_read(audio_client_t *c, oss_mixer_value *vr)
+{
+ int rv;
+ uint64_t v;
+ audio_dev_t *d;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((vr->dev != -1) && (vr->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (vr->ctrl >= odev->d_nctrl) ||
+ ((ctrl = odev->d_ctrls[vr->ctrl]) == NULL)) {
+ return (EINVAL);
+ }
+ if ((rv = auclnt_control_read(ctrl, &v)) == 0) {
+ switch (odev->d_exts[vr->ctrl].type) {
+ case MIXT_ENUM:
+ /* translate this from an enum style bit mask */
+ vr->value = ddi_ffs((unsigned long)v) - 1;
+ break;
+ case MIXT_STEREOSLIDER:
+ vr->value = (int)ddi_swap16(v & 0xffff);
+ break;
+ case MIXT_MONOSLIDER:
+ vr->value = (int)(v | (v << 8));
+ break;
+ case MIXT_ONOFF:
+ /* this could be simple, or could be part of a multi */
+ if (odev->d_exts[vr->ctrl].enumbit >= 0) {
+ uint64_t mask;
+ mask = 1;
+ mask <<= (odev->d_exts[vr->ctrl].enumbit);
+ vr->value = (v & mask) ? 1 : 0;
+ } else {
+ vr->value = v ? 1 : 0;
+ }
+ break;
+
+ default:
+ vr->value = (int)v;
+ break;
+ }
+ }
+
+ return (rv);
+}
+
+static int
+sndctl_mix_write(audio_client_t *c, oss_mixer_value *vr)
+{
+ int rv;
+ uint64_t v;
+ audio_dev_t *d;
+ audio_ctrl_t *ctrl;
+ ossdev_t *odev;
+
+ d = auclnt_get_dev(c);
+
+ if ((vr->dev != -1) && (vr->dev != (auclnt_get_dev_index(d) - 1)))
+ return (ENXIO);
+
+ if (((odev = auclnt_get_dev_minor_data(d, AUDIO_MINOR_DSP)) == NULL) ||
+ (vr->ctrl >= odev->d_nctrl) ||
+ ((ctrl = odev->d_ctrls[vr->ctrl]) == NULL)) {
+ return (EINVAL);
+ }
+
+ switch (odev->d_exts[vr->ctrl].type) {
+ case MIXT_ONOFF:
+ /* this could be standalone, or it could be part of a multi */
+ if (odev->d_exts[vr->ctrl].enumbit >= 0) {
+ uint64_t mask;
+ if ((rv = auclnt_control_read(ctrl, &v)) != 0) {
+ return (EINVAL);
+ }
+ mask = 1;
+ mask <<= (odev->d_exts[vr->ctrl].enumbit);
+ if (vr->value) {
+ v |= mask;
+ } else {
+ v &= ~mask;
+ }
+ } else {
+ v = vr->value;
+ }
+ break;
+ case MIXT_ENUM:
+ /* translate this to an enum style bit mask */
+ v = 1U << vr->value;
+ break;
+ case MIXT_MONOSLIDER:
+ /* mask off high order bits */
+ v = vr->value & 0xff;
+ break;
+ case MIXT_STEREOSLIDER:
+ /* OSS uses reverse byte ordering */
+ v = vr->value;
+ v = ddi_swap16(vr->value & 0xffff);
+ break;
+ default:
+ v = vr->value;
+ }
+ rv = auclnt_control_write(ctrl, v);
+
+ return (rv);
+}
+
+static int
+sndctl_mix_nrmix(audio_client_t *c, int *nmixp)
+{
+ _NOTE(ARGUNUSED(c));
+ *nmixp = oss_cnt_devs() - 1;
+ return (0);
+}
+
+static int
+ossmix_ioctl(audio_client_t *c, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
+{
+ int sz;
+ void *data;
+ int rv = 0;
+
+ sz = OSSIOC_GETSZ(cmd);
+
+ if ((cmd & (OSSIOC_IN | OSSIOC_OUT)) && sz) {
+ if ((data = kmem_zalloc(sz, KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+ } else {
+ sz = 0;
+ }
+
+ if (cmd & OSSIOC_IN) {
+ if ((rv = ddi_copyin((void *)arg, data, sz, mode)) != 0) {
+ goto done;
+ }
+ }
+
+ switch (cmd) {
+ /*
+ * Mixer specific ioctls
+ */
+ case SNDCTL_MIX_NREXT:
+ rv = sndctl_mix_nrext(c, (int *)data);
+ break;
+ case SNDCTL_MIX_EXTINFO:
+ rv = sndctl_mix_extinfo(c, (oss_mixext *)data);
+ break;
+ case SNDCTL_MIX_ENUMINFO:
+ rv = sndctl_mix_enuminfo(c, (oss_mixer_enuminfo *)data);
+ break;
+ case SNDCTL_MIX_READ:
+ rv = sndctl_mix_read(c, (oss_mixer_value *)data);
+ break;
+ case SNDCTL_MIX_WRITE:
+ rv = sndctl_mix_write(c, (oss_mixer_value *)data);
+ break;
+ case SNDCTL_MIX_NRMIX:
+ rv = sndctl_mix_nrmix(c, (int *)data);
+ break;
+
+ /*
+ * Legacy ioctls. These are treated as soft values only,
+ * and do not affect global hardware state. For use by
+ * legacy DSP applications.
+ */
+ case SOUND_MIXER_READ_VOLUME:
+ case SOUND_MIXER_READ_PCM:
+ case SOUND_MIXER_READ_OGAIN:
+ rv = sndctl_dsp_getplayvol(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_WRITE_VOLUME:
+ case SOUND_MIXER_WRITE_PCM:
+ case SOUND_MIXER_WRITE_OGAIN:
+ rv = sound_mixer_write_ogain(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECGAIN:
+ case SOUND_MIXER_READ_RECLEV:
+ case SOUND_MIXER_READ_IGAIN:
+ rv = sndctl_dsp_getrecvol(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_WRITE_RECGAIN:
+ case SOUND_MIXER_WRITE_RECLEV:
+ case SOUND_MIXER_WRITE_IGAIN:
+ rv = sound_mixer_write_igain(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECSRC:
+ case SOUND_MIXER_WRITE_RECSRC:
+ rv = sound_mixer_read_recsrc(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_DEVMASK:
+ case SOUND_MIXER_READ_STEREODEVS:
+ rv = sound_mixer_read_devmask(c, (int *)data);
+ break;
+
+ case SOUND_MIXER_READ_RECMASK:
+ rv = sound_mixer_read_recmask(c, (int *)data);
+ break;
+
+ /*
+ * Common ioctls shared with DSP
+ */
+ case OSS_GETVERSION:
+ rv = oss_getversion((int *)data);
+ break;
+
+ case SNDCTL_CARDINFO:
+ rv = sndctl_cardinfo(c, (oss_card_info *)data);
+ break;
+
+ case SNDCTL_ENGINEINFO:
+ case SNDCTL_AUDIOINFO:
+ case SNDCTL_AUDIOINFO_EX:
+ rv = sndctl_audioinfo(c, (oss_audioinfo *)data);
+ break;
+
+ case SNDCTL_SYSINFO:
+ rv = sndctl_sysinfo((oss_sysinfo *)data);
+ break;
+
+ case SNDCTL_MIXERINFO:
+ rv = sndctl_mixerinfo(c, (oss_mixerinfo *)data);
+ break;
+
+ case SOUND_MIXER_INFO:
+ rv = sound_mixer_info(c, (mixer_info *)data);
+ break;
+
+ case SNDCTL_MIX_DESCRIPTION: /* NOT SUPPORTED: tooltip */
+ rv = EIO; /* OSS returns EIO for this one */
+ break;
+
+ /*
+ * Special implementation-private ioctls.
+ */
+ case SNDCTL_SUN_SEND_NUMBER:
+ rv = sndctl_sun_send_number(c, (int *)data, credp);
+ break;
+
+ /*
+ * Legacy ioctls we don't support.
+ */
+ case SOUND_MIXER_WRITE_MONGAIN:
+ case SOUND_MIXER_READ_MONGAIN:
+ case SOUND_MIXER_READ_BASS:
+ case SOUND_MIXER_READ_TREBLE:
+ case SOUND_MIXER_READ_SPEAKER:
+ case SOUND_MIXER_READ_LINE:
+ case SOUND_MIXER_READ_MIC:
+ case SOUND_MIXER_READ_CD:
+ case SOUND_MIXER_READ_IMIX:
+ case SOUND_MIXER_READ_ALTPCM:
+ case SOUND_MIXER_READ_SYNTH:
+ case SOUND_MIXER_READ_LINE1:
+ case SOUND_MIXER_READ_LINE2:
+ case SOUND_MIXER_READ_LINE3:
+ case SOUND_MIXER_WRITE_BASS:
+ case SOUND_MIXER_WRITE_TREBLE:
+ case SOUND_MIXER_WRITE_SPEAKER:
+ case SOUND_MIXER_WRITE_LINE:
+ case SOUND_MIXER_WRITE_MIC:
+ case SOUND_MIXER_WRITE_CD:
+ case SOUND_MIXER_WRITE_IMIX:
+ case SOUND_MIXER_WRITE_ALTPCM:
+ case SOUND_MIXER_WRITE_SYNTH:
+ case SOUND_MIXER_WRITE_LINE1:
+ case SOUND_MIXER_WRITE_LINE2:
+ case SOUND_MIXER_WRITE_LINE3:
+ /*
+ * Additional ioctls we *could* support, but don't.
+ */
+ case SNDCTL_SETSONG:
+ case SNDCTL_SETLABEL:
+ case SNDCTL_GETSONG:
+ case SNDCTL_GETLABEL:
+ case SNDCTL_MIDIINFO:
+ case SNDCTL_SETNAME:
+ default:
+ rv = EINVAL;
+ break;
+ }
+
+ if ((rv == 0) && (cmd & OSSIOC_OUT)) {
+ rv = ddi_copyout(data, (void *)arg, sz, mode);
+ }
+ if (rv == 0) {
+ *rvalp = 0;
+ }
+
+done:
+ if (sz) {
+ kmem_free(data, sz);
+ }
+ return (rv);
+}
+
+static void *
+oss_dev_init(audio_dev_t *dev)
+{
+ ossdev_t *odev;
+
+ odev = kmem_zalloc(sizeof (*odev), KM_SLEEP);
+ odev->d_dev = dev;
+
+ mutex_init(&odev->d_mx, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&odev->d_cv, NULL, CV_DRIVER, NULL);
+ oss_alloc_controls(odev);
+
+ return (odev);
+}
+
+static void
+oss_dev_fini(void *arg)
+{
+ ossdev_t *odev = arg;
+
+ if (odev != NULL) {
+ oss_free_controls(odev);
+ mutex_destroy(&odev->d_mx);
+ cv_destroy(&odev->d_cv);
+ kmem_free(odev, sizeof (*odev));
+ }
+}
+
+static void
+sndstat_printf(ossclient_t *oc, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ (void) vsnprintf(oc->o_ss_buf + oc->o_ss_len,
+ oc->o_ss_sz - oc->o_ss_len, fmt, va);
+ va_end(va);
+ oc->o_ss_len = strlen(oc->o_ss_buf);
+}
+
+static int
+sndstat_dev_walker(audio_dev_t *d, void *arg)
+{
+ ossclient_t *oc = arg;
+ const char *capstr;
+ unsigned cap;
+
+ cap = auclnt_get_dev_capab(d);
+
+ if (cap & AUDIO_CLIENT_CAP_DUPLEX) {
+ capstr = "DUPLEX";
+ } else if ((cap & AUDIO_CLIENT_CAP_PLAY) &&
+ (cap & AUDIO_CLIENT_CAP_RECORD)) {
+ capstr = "INPUT,OUTPUT";
+ } else if (cap & AUDIO_CLIENT_CAP_PLAY) {
+ capstr = "OUTPUT";
+ } else if (cap & AUDIO_CLIENT_CAP_RECORD) {
+ capstr = "INPUT";
+ } else {
+ capstr = NULL;
+ }
+
+ if (capstr == NULL)
+ return (AUDIO_WALK_CONTINUE);
+
+ sndstat_printf(oc, "%d: %s %s, %s (%s)\n",
+ auclnt_get_dev_number(d), auclnt_get_dev_name(d),
+ auclnt_get_dev_description(d), auclnt_get_dev_version(d), capstr);
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sndstat_mixer_walker(audio_dev_t *d, void *arg)
+{
+ ossclient_t *oc = arg;
+ unsigned cap;
+ void *iter;
+ const char *info;
+
+ cap = auclnt_get_dev_capab(d);
+
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY|AUDIO_CLIENT_CAP_RECORD)) == 0)
+ return (AUDIO_WALK_CONTINUE);
+
+ sndstat_printf(oc, "%d: %s %s, %s\n",
+ auclnt_get_dev_number(d), auclnt_get_dev_name(d),
+ auclnt_get_dev_description(d), auclnt_get_dev_version(d));
+ iter = NULL;
+ while ((info = auclnt_get_dev_hw_info(d, &iter)) != NULL) {
+ sndstat_printf(oc, "\t%s\n", info);
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+ossmix_write(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ /* write on sndstat is a no-op */
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(uio));
+ _NOTE(ARGUNUSED(cr));
+
+ return (0);
+}
+
+static int
+ossmix_read(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ ossclient_t *oc;
+ unsigned n;
+ int rv;
+
+ _NOTE(ARGUNUSED(cr));
+
+ if (uio->uio_resid == 0) {
+ return (0);
+ }
+
+ oc = auclnt_get_private(c);
+
+ mutex_enter(&oc->o_ss_lock);
+
+ if (oc->o_ss_off == 0) {
+
+ sndstat_printf(oc, "SunOS Audio Framework\n");
+
+ sndstat_printf(oc, "\nAudio Devices:\n");
+ auclnt_walk_devs_by_number(sndstat_dev_walker, oc);
+
+ sndstat_printf(oc, "\nMixers:\n");
+ auclnt_walk_devs_by_number(sndstat_mixer_walker, oc);
+ }
+
+ /*
+ * For simplicity's sake, we implement a non-seekable device. We could
+ * support seekability, but offsets would be rather meaningless between
+ * changes.
+ */
+ n = min(uio->uio_resid, (oc->o_ss_len - oc->o_ss_off));
+
+ rv = uiomove(oc->o_ss_buf + oc->o_ss_off, n, UIO_READ, uio);
+ if (rv != 0) {
+ n = 0;
+ }
+ oc->o_ss_off += n;
+
+ if (n == 0) {
+ /*
+ * end-of-file reached... clear the sndstat buffer so that
+ * subsequent reads will get the latest data.
+ */
+ oc->o_ss_off = oc->o_ss_len = 0;
+ }
+ mutex_exit(&oc->o_ss_lock);
+ return (rv);
+}
+
+int
+oss_read(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ _NOTE(ARGUNUSED(cr));
+
+ auclnt_clear_paused(auclnt_input_stream(c));
+
+ return (auclnt_read(c, uio));
+}
+
+int
+oss_write(audio_client_t *c, struct uio *uio, cred_t *cr)
+{
+ _NOTE(ARGUNUSED(cr));
+
+ auclnt_clear_paused(auclnt_output_stream(c));
+
+ return (auclnt_write(c, uio));
+}
+
+int
+oss_chpoll(audio_client_t *c, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp)
+{
+ return (auclnt_chpoll(c, events, anyyet, reventsp, phpp));
+}
+
+static struct audio_client_ops oss_ops = {
+ "sound,dsp",
+ oss_dev_init,
+ oss_dev_fini,
+ oss_open,
+ oss_close,
+ oss_read,
+ oss_write,
+ oss_ioctl,
+ oss_chpoll,
+ NULL, /* mmap */
+ oss_input,
+ oss_output,
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+static struct audio_client_ops ossmix_ops = {
+ "sound,mixer",
+ NULL,
+ NULL,
+ ossmix_open,
+ ossmix_close,
+ ossmix_read,
+ ossmix_write,
+ ossmix_ioctl,
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* input */
+ NULL, /* output */
+ oss_notify,
+ NULL, /* drain */
+};
+
+/* nearly the same as ossxmix; different minor name helps devfsadm */
+static struct audio_client_ops sndstat_ops = {
+ "sound,sndstat",
+ NULL, /* dev_init */
+ NULL, /* dev_fini */
+ ossmix_open,
+ ossmix_close,
+ ossmix_read,
+ ossmix_write,
+ ossmix_ioctl,
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* input */
+ NULL, /* output */
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+void
+auimpl_oss_init(void)
+{
+ auclnt_register_ops(AUDIO_MINOR_DSP, &oss_ops);
+ auclnt_register_ops(AUDIO_MINOR_MIXER, &ossmix_ops);
+ auclnt_register_ops(AUDIO_MINOR_SNDSTAT, &sndstat_ops);
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_output.c b/usr/src/uts/common/io/audio/impl/audio_output.c
new file mode 100644
index 0000000000..be3c66412a
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_output.c
@@ -0,0 +1,463 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Purpose: Virtual mixing audio output routines
+ *
+ * This file contains the actual mixing and resampling engine for output.
+ */
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sysmacros.h>
+#include "audio_impl.h"
+
+#ifdef DEBUG
+int audio_underruns = 0;
+#endif
+
+#define DECL_AUDIO_EXPORT(NAME, TYPE, SAMPLE) \
+void \
+auimpl_export_##NAME(audio_engine_t *eng) \
+{ \
+ int fragfr = eng->e_fragfr; \
+ int nch = eng->e_nchan; \
+ unsigned hidx = eng->e_hidx; \
+ TYPE *out = (void *)eng->e_data; \
+ int ch = 0; \
+ \
+ do { /* for each channel */ \
+ int32_t *ip; \
+ TYPE *op; \
+ int i; \
+ int incr = eng->e_chincr[ch]; \
+ \
+ /* get value and adjust next channel offset */ \
+ op = out + eng->e_choffs[ch] + (hidx * incr); \
+ ip = eng->e_chbufs[ch]; \
+ \
+ i = fragfr; \
+ \
+ do { /* for each frame */ \
+ int32_t sample = *ip; \
+ \
+ *op = SAMPLE; \
+ op += incr; \
+ ip++; \
+ \
+ } while (--i); \
+ \
+ ch++; \
+ } while (ch < nch); \
+}
+
+DECL_AUDIO_EXPORT(16ne, int16_t, sample >> 8)
+DECL_AUDIO_EXPORT(16oe, int16_t, ddi_swap16(sample >> 8))
+DECL_AUDIO_EXPORT(32ne, int32_t, sample << 8)
+DECL_AUDIO_EXPORT(32oe, int32_t, ddi_swap32(sample << 8))
+DECL_AUDIO_EXPORT(24ne, int32_t, sample)
+DECL_AUDIO_EXPORT(24oe, int32_t, ddi_swap32(sample))
+
+/*
+ * Simple limiter to prevent overflows when using fixed point computations
+ */
+static void
+auimpl_output_limiter(audio_engine_t *eng)
+{
+ int k, t;
+ unsigned int q, amp, amp2;
+ int nchan = eng->e_nchan;
+ int fragfr = eng->e_fragfr;
+ int32_t **chbufs = eng->e_chbufs;
+ unsigned int statevar = eng->e_limiter_state;
+
+ for (t = 0; t < fragfr; t++) {
+
+ amp = (unsigned)ABS(chbufs[0][t]);
+
+ for (k = 1; k < nchan; k++) {
+ amp2 = (unsigned)ABS(chbufs[k][t]);
+ if (amp2 > amp)
+ amp = amp2;
+ }
+
+ amp >>= 8;
+ q = 0x10000;
+
+ if (amp > 0x7FFF)
+ q = 0x7FFF0000 / amp;
+
+ if (statevar > q) {
+ statevar = q;
+ } else {
+ q = statevar;
+
+ /*
+ * Simplier (linear) tracking algo
+ * (gives less distortion, but more pumping)
+ */
+ statevar += 2;
+ if (statevar > 0x10000)
+ statevar = 0x10000;
+
+ /*
+ * Classic tracking algo
+ * gives more distortion with no-lookahead
+ * statevar=0x10000-((0x10000-statevar)*0xFFF4>>16);
+ */
+ }
+
+ for (k = 0; k < nchan; k++) {
+ int32_t in = chbufs[k][t];
+ int32_t out = 0;
+ unsigned int p;
+
+ if (in >= 0) {
+ p = in;
+ p = ((p & 0xFFFF) * (q >> 4) >> 12) +
+ (p >> 16) * q;
+ out = p;
+ } else {
+ p = -in;
+ p = ((p & 0xFFFF) * (q >> 4) >> 12) +
+ (p >> 16) * q;
+ out = -p;
+ }
+ /* safety code */
+ /*
+ * if output after limiter is clamped, then it
+ * can be dropped
+ */
+ if (out > 0x7FFFFF)
+ out = 0x7FFFFF;
+ else if (out < -0x7FFFFF)
+ out = -0x7FFFFF;
+
+ chbufs[k][t] = out;
+ }
+ }
+
+ eng->e_limiter_state = statevar;
+}
+
+/*
+ * Output mixing function. Assumption: all work is done in 24-bit native PCM.
+ */
+static void
+auimpl_output_mix(audio_stream_t *sp, int offset, int nfr)
+{
+ audio_engine_t *eng = sp->s_engine;
+ const int32_t *src;
+ int choffs;
+ int nch;
+ int vol;
+
+ /*
+ * Initial setup.
+ */
+
+ src = sp->s_cnv_ptr;
+ choffs = sp->s_choffs;
+ nch = sp->s_cnv_dst_nchan;
+ vol = sp->s_gain_eff;
+
+ /*
+ * Do the mixing. We de-interleave the source stream at the
+ * same time.
+ */
+ for (int ch = 0; ch < nch; ch++) {
+ int32_t *op;
+ const int32_t *ip;
+
+
+ ip = src + ch;
+ op = eng->e_chbufs[ch + choffs];
+ op += offset;
+
+ for (int i = nfr; i; i--) {
+
+ int64_t samp;
+
+ samp = *ip;
+ samp *= vol;
+ samp /= AUDIO_VOL_SCALE;
+
+ ip += nch;
+ *op += (int32_t)samp;
+ op++;
+ }
+ }
+
+ sp->s_cnv_cnt -= nfr;
+ sp->s_cnv_ptr += (nch * nfr);
+}
+
+/*
+ * Consume a fragment's worth of data. This is called when the data in
+ * the conversion buffer is exhausted, and we need to refill it from the
+ * source buffer. We always consume data from the client in quantities of
+ * a fragment at a time (assuming that a fragment is available.)
+ */
+static void
+auimpl_consume_fragment(audio_stream_t *sp)
+{
+ unsigned count;
+ unsigned avail;
+ unsigned nframes;
+ unsigned fragfr;
+ unsigned framesz;
+ caddr_t cnvbuf;
+
+ sp->s_cnv_src = sp->s_cnv_buf0;
+ sp->s_cnv_dst = sp->s_cnv_buf1;
+
+ fragfr = sp->s_fragfr;
+ nframes = sp->s_nframes;
+ framesz = sp->s_framesz;
+
+ ASSERT(sp->s_head >= sp->s_tail);
+
+ avail = sp->s_head - sp->s_tail;
+ cnvbuf = sp->s_cnv_src;
+
+ count = min(avail, fragfr);
+
+ /*
+ * Copy data. We deal properly with wraps. Done as a
+ * do...while to minimize the number of tests.
+ */
+ do {
+ unsigned n;
+ unsigned nbytes;
+
+ n = min(nframes - sp->s_tidx, count);
+ nbytes = framesz * n;
+ bcopy(sp->s_data + (sp->s_tidx * framesz), cnvbuf, nbytes);
+ cnvbuf += nbytes;
+ count -= n;
+ sp->s_samples += n;
+ sp->s_tail += n;
+ sp->s_tidx += n;
+ if (sp->s_tidx >= nframes)
+ sp->s_tidx -= nframes;
+ } while (count);
+
+ /* Note: data conversion is optional! */
+ count = min(avail, fragfr);
+ if (sp->s_converter != NULL) {
+ sp->s_cnv_cnt = sp->s_converter(sp, count);
+ } else {
+ sp->s_cnv_cnt = count;
+ }
+}
+
+static void
+auimpl_output_callback_impl(audio_engine_t *eng)
+{
+ int fragfr = eng->e_fragfr;
+
+ /* clear any preexisting mix results */
+ for (int i = 0; i < eng->e_nchan; i++)
+ bzero(eng->e_chbufs[i], AUDIO_CHBUFS * sizeof (int32_t));
+
+ for (audio_stream_t *sp = list_head(&eng->e_streams);
+ sp != NULL;
+ sp = list_next(&eng->e_streams, sp)) {
+
+ int need;
+ int avail;
+ int used;
+ int offset;
+ boolean_t underrun = B_FALSE;
+ boolean_t drained = B_FALSE;
+ audio_client_t *c = sp->s_client;
+
+ /*
+ * We need/want a full fragment. If the client has
+ * less than that available, it will cause a client
+ * underrun in auimpl_consume_fragment, but in such a
+ * case we should get silence bytes. Assignments done
+ * ahead of the lock to minimize lock contention.
+ */
+ need = fragfr;
+ offset = 0;
+
+ mutex_enter(&sp->s_lock);
+ /* skip over streams not running or paused */
+ if ((!sp->s_running) || (sp->s_paused) || eng->e_suspended) {
+ mutex_exit(&sp->s_lock);
+ continue;
+ }
+
+ do {
+ /* make sure we have data to chew on */
+ if ((avail = sp->s_cnv_cnt) == 0) {
+ auimpl_consume_fragment(sp);
+ sp->s_cnv_ptr = sp->s_cnv_src;
+ avail = sp->s_cnv_cnt;
+ }
+
+ /*
+ * We might have got more data than we need
+ * right now. (E.g. 8kHz expanding to 48kHz.)
+ * Take only what we need.
+ */
+ used = min(avail, need);
+
+ /*
+ * Mix the results, as much data as we can use
+ * this round.
+ */
+ auimpl_output_mix(sp, offset, used);
+
+ /*
+ * Save the offset for the next round, so we don't
+ * remix into the same location.
+ */
+ offset += used;
+
+ /*
+ * Okay, we mixed some data, but it might not
+ * have been all we need. This can happen
+ * either because we just mixed up some
+ * partial/residual data, or because the
+ * client has a fragment size which expands to
+ * less than a full fragment for us. (Such as
+ * a client wanting to operate at a higher
+ * data rate than the engine.)
+ */
+ need -= used;
+
+ } while (need && avail);
+
+ if (avail == 0) {
+ /* underrun or end of data */
+ if (sp->s_draining) {
+ if (sp->s_drain_idx == 0) {
+ sp->s_drain_idx = eng->e_head;
+ }
+ if (eng->e_tail >= sp->s_drain_idx) {
+ sp->s_drain_idx = 0;
+ sp->s_draining = B_FALSE;
+ /*
+ * After draining, stop the
+ * stream cleanly. This
+ * prevents underrun errors.
+ *
+ * (Stream will auto-start if
+ * client submits more data to
+ * it.)
+ *
+ * AC3: When an AC3 stream
+ * drains we should probably
+ * stop the actual hardware
+ * engine.
+ */
+ ASSERT(mutex_owned(&eng->e_lock));
+ sp->s_running = B_FALSE;
+ drained = B_TRUE;
+ }
+ } else {
+#ifdef DEBUG
+ audio_underruns++;
+#endif
+ underrun = B_TRUE;
+ sp->s_errors += need;
+ }
+ }
+
+ /* wake threads waiting for stream (blocking writes, etc.) */
+ cv_broadcast(&sp->s_cv);
+
+ mutex_exit(&sp->s_lock);
+
+
+ /*
+ * Asynchronously notify clients. We do as much as
+ * possible of this outside of the lock, it avoids
+ * s_lock and c_lock contention and eliminates any
+ * chance of deadlock.
+ */
+
+ mutex_enter(&c->c_lock);
+ c->c_do_output = B_TRUE;
+
+ if (underrun)
+ c->c_do_notify = B_TRUE;
+
+ if (drained)
+ c->c_do_drain = B_TRUE;
+
+ cv_broadcast(&c->c_cv);
+ mutex_exit(&c->c_lock);
+ }
+
+ /*
+ * Deal with 24-bit overflows (from mixing) gracefully.
+ */
+ auimpl_output_limiter(eng);
+
+ /*
+ * Export the data (a whole fragment) to the device.
+ */
+ eng->e_export(eng);
+
+ /*
+ * Update the head and offset. The head counts without
+ * wrapping, whereas the offset wraps. Note that the test +
+ * subtraction is faster for dealing with wrap than modulo.
+ */
+ eng->e_head += fragfr;
+ eng->e_hidx += fragfr;
+ if (eng->e_hidx >= eng->e_nframes)
+ eng->e_hidx -= eng->e_nframes;
+
+ /*
+ * Consider doing the SYNC outside of the lock.
+ */
+ ENG_SYNC(eng, fragfr);
+}
+
+/*
+ * Outer loop attempts to keep playing until we hit maximum playahead.
+ */
+
+void
+auimpl_output_callback(audio_engine_t *eng)
+{
+ unsigned fragfr;
+ int64_t cnt;
+
+ fragfr = eng->e_fragfr;
+ cnt = eng->e_head - eng->e_tail;
+
+ /* stay a bit ahead */
+ while (cnt < (fragfr * 4)) {
+ auimpl_output_callback_impl(eng);
+ cnt = eng->e_head - eng->e_tail;
+ }
+}
diff --git a/usr/src/uts/common/io/audio/impl/audio_sun.c b/usr/src/uts/common/io/audio/impl/audio_sun.c
new file mode 100644
index 0000000000..d75366f439
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/audio_sun.c
@@ -0,0 +1,1967 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Sun audio(7I) and mixer(7I) personality.
+ *
+ * There are some "undocumented" details of how legacy Sun audio
+ * interfaces work. The following "rules" were derived from reading the
+ * legacy Sun mixer code, and to the best of our knowledge are not
+ * documented elsewhere.
+ *
+ * - We create a "fake" audio device, which behaves like a classic
+ * exclusive audio device, for each PID, as determined during open(2).
+ *
+ * - Different processes don't interfere with each other. Even though
+ * they are running concurrently, they each think they have exclusive
+ * control over the audio device.
+ *
+ * - Read and write directions operate independent of each other. That
+ * is, a device open for reading won't intefere with a future open for
+ * writing, and vice versa. This is true even within the same process.
+ *
+ * - Because the virtualization is by PID, strange behavior may occur
+ * if a process tries to open an audio device at the same time it
+ * has already received a file descriptor from another process (such
+ * through inheritence via fork()).
+ *
+ * - The "fake" audio device has no control over physical settings.
+ * It sees only the software attenuation-based volumes for play and
+ * record, and has no support for alternate input or output ports or
+ * access to the monitoring features of the hardware.
+ *
+ * - Explicit notificaton signals (SIGPOLL) are only ever sent up the
+ * audioctl node -- never up a regular audio node. (The stream head
+ * may still issue SIGPOLL based on readability/writability of
+ * course.)
+ *
+ * - Corollary: processes that want asynch. notifications will open
+ * /dev/audioctl as well as /dev/audio.
+ *
+ * - We don't support the MIXER mode at all.
+ *
+ * - By corollary, a process is only allowed to open /dev/audio once
+ * (in each direction.)
+ *
+ * - Attempts to open /dev/audio in duplex mode (O_RDWR) fail (EBUSY)
+ * if the device cannot support duplex operation.
+ *
+ * - Attempts to open a device with FREAD set fail if the device is not
+ * capable of recording. (Likewise for FWRITE and playback.)
+ *
+ * - No data transfer is permitted for audioctl nodes. (No actual
+ * record or play.)
+ *
+ * - Sun audio does not support any formats other than linear and
+ * ULAW/ALAW. I.e. it will never support AC3 or other "opaque"
+ * streams which require special handling.
+ *
+ * - Sun audio only supports stereo or monophonic data streams.
+ */
+
+#include <sys/types.h>
+#include <sys/open.h>
+#include <sys/errno.h>
+#include <sys/audio.h>
+#include <sys/mixer.h>
+#include <sys/file.h>
+#include <sys/stropts.h>
+#include <sys/strsun.h>
+#include <sys/sysmacros.h>
+#include <sys/list.h>
+#include <sys/note.h>
+#include <sys/stat.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include "audio_client.h"
+
+typedef struct sclient sclient_t;
+typedef struct sdev sdev_t;
+typedef struct sproc sproc_t;
+typedef struct sioc sioc_t;
+
+typedef enum {
+ COPYIN,
+ COPYOUT,
+ IOCTL,
+ ACK,
+ NAK,
+ FINI
+} sioc_state_t;
+
+struct sioc {
+ sclient_t *i_sc;
+ int i_cmd;
+ size_t i_size;
+ void *i_data;
+ mblk_t *i_bcont;
+ int i_step;
+ uint_t i_model;
+ sioc_state_t i_state;
+ mblk_t *i_mp;
+ caddr_t i_addr;
+ int i_error;
+};
+
+/* common structure shared between both audioctl and audio nodes */
+struct sclient {
+ sproc_t *s_proc;
+ sdev_t *s_sdev;
+ audio_client_t *s_client;
+ queue_t *s_rq;
+ queue_t *s_wq;
+ ldi_handle_t s_lh;
+ unsigned s_eof;
+ list_t s_eofcnt;
+ kmutex_t s_lock;
+ mblk_t *s_draining;
+};
+
+struct eofcnt {
+ list_node_t linkage;
+ uint64_t tail;
+};
+
+struct sdev {
+ audio_dev_t *d_dev;
+
+ list_t d_procs;
+ kmutex_t d_mx;
+ kcondvar_t d_cv;
+};
+
+struct sproc {
+ pid_t p_id;
+ struct audio_info p_info;
+ int p_refcnt;
+ int p_oflag;
+ list_node_t p_linkage;
+ sdev_t *p_sdev;
+ sclient_t *p_writer;
+ sclient_t *p_reader;
+};
+
+int sproc_hold(audio_client_t *, int);
+void sproc_release(sclient_t *);
+static void sproc_update(sproc_t *);
+
+
+static kmutex_t sdev_lock;
+static dev_info_t *sdev_dip;
+
+/*
+ * Alloc extra room for ioctl buffer, in case none was supplied or copyin was
+ * shorter than we need for the whole struct. On failure, returns an
+ * appropriate errno, zero on success. Any original data is preserved.
+ */
+static int
+sioc_alloc(sioc_t *ip, size_t size)
+{
+ mblk_t *nmp;
+
+ /* if we already have enough, just use what we've got */
+ if (ip->i_size >= size)
+ return (0);
+
+ if ((nmp = allocb(size, BPRI_MED)) == NULL) {
+ ip->i_state = NAK;
+ ip->i_error = ENOMEM;
+ return (ENOMEM);
+ }
+ bzero(nmp->b_rptr, size);
+
+ /* if there was already some data present, preserve it */
+ if (ip->i_size != 0) {
+ bcopy(ip->i_data, nmp->b_rptr, ip->i_size);
+ freemsg(ip->i_bcont);
+ }
+ ip->i_bcont = nmp;
+ ip->i_data = nmp->b_rptr;
+ ip->i_size = size;
+
+ return (0);
+}
+
+static void
+sioc_copyin(sioc_t *ip, size_t size)
+{
+ ip->i_state = COPYIN;
+ ip->i_size = size;
+ if (ip->i_bcont != NULL) {
+ freemsg(ip->i_bcont);
+ ip->i_bcont = NULL;
+ }
+
+ mcopyin(ip->i_mp, ip, size, ip->i_addr);
+}
+
+static void
+sioc_copyout(sioc_t *ip, size_t size)
+{
+ mblk_t *bcont;
+
+ ASSERT(ip->i_size >= size);
+
+ bcont = ip->i_bcont;
+
+ ip->i_state = COPYOUT;
+ ip->i_bcont = NULL;
+
+ mcopyout(ip->i_mp, ip, size, ip->i_addr, bcont);
+}
+
+static void
+sioc_error(sioc_t *ip, int error)
+{
+ ip->i_state = NAK;
+ ip->i_error = error;
+}
+
+static void
+sioc_success(sioc_t *ip)
+{
+ ip->i_state = ACK;
+}
+
+static void
+sioc_fini(sioc_t *ip)
+{
+ if (ip->i_bcont != NULL)
+ freemsg(ip->i_bcont);
+
+ kmem_free(ip, sizeof (*ip));
+}
+
+static void
+sioc_finish(sioc_t *ip)
+{
+ mblk_t *mp;
+ sclient_t *sc;
+
+ sc = ip->i_sc;
+ mp = ip->i_mp;
+ ip->i_mp = NULL;
+
+ switch (ip->i_state) {
+ case ACK:
+ miocack(sc->s_wq, mp, 0, 0);
+ break;
+
+ case IOCTL: /* caller didn't use sioc_success */
+ ip->i_error = ECANCELED;
+ miocnak(sc->s_wq, mp, 0, ip->i_error);
+ break;
+
+ case NAK:
+ miocnak(sc->s_wq, mp, 0, ip->i_error);
+ break;
+
+ case COPYOUT:
+ case COPYIN:
+ /* data copy to be done */
+ qreply(sc->s_wq, mp);
+ return;
+
+ case FINI:
+ if (mp != NULL) {
+ freemsg(mp);
+ }
+ break;
+ }
+
+ sioc_fini(ip);
+}
+
+static int
+sun_compose_format(audio_prinfo_t *prinfo)
+{
+ switch (prinfo->precision) {
+ case 8:
+ switch (prinfo->encoding) {
+ case AUDIO_ENCODING_ULAW:
+ return (AUDIO_FORMAT_ULAW);
+ case AUDIO_ENCODING_ALAW:
+ return (AUDIO_FORMAT_ALAW);
+ case AUDIO_ENCODING_LINEAR8:
+ return (AUDIO_FORMAT_U8);
+ case AUDIO_ENCODING_LINEAR:
+ return (AUDIO_FORMAT_S8);
+ }
+ break;
+ case 16:
+ if (prinfo->encoding == AUDIO_ENCODING_LINEAR)
+ return (AUDIO_FORMAT_S16_NE);
+ break;
+ case 32:
+ if (prinfo->encoding == AUDIO_ENCODING_LINEAR)
+ return (AUDIO_FORMAT_S32_NE);
+ break;
+ }
+ return (AUDIO_FORMAT_NONE);
+
+}
+
+static void
+sun_decompose_format(audio_prinfo_t *prinfo, int afmt)
+{
+ int e, p;
+
+ /*
+ * N.B.: Even though some of the formats below can't be set by
+ * this personality, reporting them (using the closest match)
+ * allows this personality to roughly approximate settings for
+ * other streams. It would be incredibly poor form for any
+ * personality to modify the format settings for a different
+ * personality, so we don't worry about that case.
+ */
+
+ switch (afmt) {
+ case AUDIO_FORMAT_ULAW:
+ e = AUDIO_ENCODING_ULAW;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_ALAW:
+ e = AUDIO_ENCODING_ALAW;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_U8:
+ e = AUDIO_ENCODING_LINEAR8;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_S8:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 8;
+ break;
+
+ case AUDIO_FORMAT_S16_NE:
+ case AUDIO_FORMAT_S16_OE:
+ case AUDIO_FORMAT_U16_NE:
+ case AUDIO_FORMAT_U16_OE:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 16;
+ break;
+
+ case AUDIO_FORMAT_S24_NE:
+ case AUDIO_FORMAT_S24_OE:
+ case AUDIO_FORMAT_S24_PACKED:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 24;
+ break;
+
+ case AUDIO_FORMAT_S32_NE:
+ case AUDIO_FORMAT_S32_OE:
+ e = AUDIO_ENCODING_LINEAR;
+ p = 32;
+ break;
+
+ default:
+ /* all other formats (e.g. AC3) are uninterpreted */
+ e = AUDIO_ENCODING_NONE;
+ p = 32;
+ break;
+ }
+
+ prinfo->encoding = e;
+ prinfo->precision = p;
+}
+
+static sproc_t *
+sproc_alloc(sclient_t *sc)
+{
+ audio_client_t *c;
+ audio_info_t *info;
+ audio_prinfo_t *prinfo;
+ uint32_t caps;
+ sproc_t *proc;
+
+ c = sc->s_client;
+ if ((proc = kmem_zalloc(sizeof (*proc), KM_NOSLEEP)) == NULL) {
+ return (NULL);
+ }
+ info = &proc->p_info;
+
+ /*
+ * audio(7I) says: Upon the initial open() of the audio
+ * device, the driver resets the data format of the device to
+ * the default state of 8-bit, 8Khz, mono u-Law data.
+ */
+ prinfo = &info->play;
+ prinfo->channels = 1;
+ prinfo->sample_rate = 8000;
+ prinfo->encoding = AUDIO_ENCODING_ULAW;
+ prinfo->precision = 8;
+ prinfo->gain = AUDIO_MAX_GAIN;
+ prinfo->balance = AUDIO_MID_BALANCE;
+ prinfo->buffer_size = 8192;
+ prinfo->pause = B_FALSE;
+ prinfo->waiting = B_FALSE;
+ prinfo->open = B_FALSE;
+ prinfo->active = B_FALSE;
+ prinfo->samples = 0;
+ prinfo->eof = 0;
+ prinfo->error = 0;
+ prinfo->minordev = 0;
+ prinfo->port = AUDIO_SPEAKER;
+ prinfo->avail_ports = AUDIO_SPEAKER;
+ prinfo->mod_ports = AUDIO_NONE;
+ prinfo->_xxx = 0;
+
+ prinfo = &info->record;
+ prinfo->channels = 1;
+ prinfo->sample_rate = 8000;
+ prinfo->encoding = AUDIO_ENCODING_ULAW;
+ prinfo->precision = 8;
+ prinfo->gain = AUDIO_MAX_GAIN;
+ prinfo->balance = AUDIO_MID_BALANCE;
+ prinfo->buffer_size = 8192;
+ prinfo->waiting = B_FALSE;
+ prinfo->open = B_FALSE;
+ prinfo->active = B_FALSE;
+ prinfo->samples = 0;
+ prinfo->eof = 0;
+ prinfo->error = 0;
+ prinfo->minordev = 0;
+ prinfo->port = AUDIO_MICROPHONE;
+ prinfo->avail_ports = AUDIO_MICROPHONE;
+ prinfo->mod_ports = AUDIO_MICROPHONE;
+
+ info->output_muted = B_FALSE;
+ /* pretend we don't have a software mixer - we don't support the API */
+ info->hw_features = 0;
+ info->sw_features = 0;
+ info->sw_features_enabled = 0;
+
+ caps = auclnt_get_dev_capab(auclnt_get_dev(c));
+ if (caps & AUDIO_CLIENT_CAP_PLAY)
+ info->hw_features |= AUDIO_HWFEATURE_PLAY;
+ if (caps & AUDIO_CLIENT_CAP_RECORD)
+ info->hw_features |= AUDIO_HWFEATURE_RECORD;
+ if (caps & AUDIO_CLIENT_CAP_DUPLEX)
+ info->hw_features |= AUDIO_HWFEATURE_DUPLEX;
+
+ return (proc);
+}
+
+static void
+sproc_free(sproc_t *proc)
+{
+ kmem_free(proc, sizeof (*proc));
+}
+
+int
+sproc_hold(audio_client_t *c, int oflag)
+{
+ pid_t pid;
+ sproc_t *proc;
+ sdev_t *sdev;
+ sclient_t *sc;
+ list_t *l;
+ audio_dev_t *adev;
+ int rv;
+
+ adev = auclnt_get_dev(c);
+
+ /* first allocate and initialize the sclient private data */
+ if ((sc = kmem_zalloc(sizeof (*sc), KM_NOSLEEP)) == NULL) {
+ return (ENOMEM);
+ }
+
+ mutex_init(&sc->s_lock, NULL, MUTEX_DRIVER, NULL);
+ list_create(&sc->s_eofcnt, sizeof (struct eofcnt),
+ offsetof(struct eofcnt, linkage));
+ auclnt_set_private(c, sc);
+
+ sdev = auclnt_get_dev_minor_data(adev, AUDIO_MINOR_DEVAUDIO);
+ l = &sdev->d_procs;
+ pid = auclnt_get_pid(c);
+
+ /* set a couple of common fields */
+ sc->s_client = c;
+ sc->s_sdev = sdev;
+
+ mutex_enter(&sdev->d_mx);
+ for (proc = list_head(l); proc != NULL; proc = list_next(l, proc)) {
+ if (proc->p_id == pid) {
+ proc->p_refcnt++;
+ break;
+ }
+ }
+ if (proc == NULL) {
+ if ((proc = sproc_alloc(sc)) == NULL) {
+ rv = ENOMEM;
+ goto failed;
+ }
+ proc->p_refcnt = 1;
+ proc->p_id = pid;
+ proc->p_sdev = sdev;
+ list_insert_tail(l, proc);
+ }
+
+ sc->s_proc = proc;
+
+ while (proc->p_oflag & oflag) {
+
+ if (oflag & (FNDELAY|FNONBLOCK)) {
+ rv = EBUSY;
+ goto failed;
+ }
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting++;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting++;
+ if (cv_wait_sig(&sdev->d_cv, &sdev->d_mx) == 0) {
+ /* interrupted! */
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting--;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting--;
+ rv = EINTR;
+ goto failed;
+ }
+ if (oflag & FWRITE)
+ proc->p_info.play.waiting--;
+ if (oflag & FREAD)
+ proc->p_info.record.waiting--;
+ }
+
+ if (oflag & FWRITE) {
+ audio_prinfo_t *play = &proc->p_info.play;
+ audio_stream_t *sp = auclnt_output_stream(c);
+
+ if (((rv = auclnt_set_rate(sp, 8000)) != 0) ||
+ ((rv = auclnt_set_format(sp, AUDIO_FORMAT_ULAW)) != 0) ||
+ ((rv = auclnt_set_channels(sp, 1)) != 0)) {
+ goto failed;
+ }
+
+ auclnt_set_samples(sp, 0);
+ auclnt_set_errors(sp, 0);
+ play->eof = 0;
+ play->buffer_size = 8192;
+
+ auclnt_set_gain(sp, ((play->gain * 100) / AUDIO_MAX_GAIN));
+ auclnt_set_muted(sp, proc->p_info.output_muted);
+ play->open = B_TRUE;
+ proc->p_writer = sc;
+ proc->p_oflag |= FWRITE;
+ }
+
+ if (oflag & FREAD) {
+ audio_prinfo_t *rec = &proc->p_info.record;
+ audio_stream_t *sp = auclnt_input_stream(c);
+
+ if (((rv = auclnt_set_rate(sp, 8000)) != 0) ||
+ ((rv = auclnt_set_format(sp, AUDIO_FORMAT_ULAW)) != 0) ||
+ ((rv = auclnt_set_channels(sp, 1)) != 0)) {
+ goto failed;
+ }
+
+ auclnt_set_samples(sp, 0);
+ auclnt_set_errors(sp, 0);
+ rec->eof = 0;
+ rec->buffer_size = 8192;
+
+ auclnt_set_gain(sp, ((rec->gain * 100) / AUDIO_MAX_GAIN));
+ rec->open = B_TRUE;
+ proc->p_reader = sc;
+ proc->p_oflag |= FREAD;
+ }
+
+ sproc_update(proc);
+
+ mutex_exit(&sdev->d_mx);
+
+ return (0);
+
+failed:
+ mutex_exit(&sdev->d_mx);
+ sproc_release(sc);
+ return (rv);
+
+}
+
+static void
+sun_clear_eof(sclient_t *sc)
+{
+ struct eofcnt *eof;
+ mutex_enter(&sc->s_lock);
+ while ((eof = list_remove_head(&sc->s_eofcnt)) != NULL) {
+ kmem_free(eof, sizeof (*eof));
+ }
+ mutex_exit(&sc->s_lock);
+}
+
+void
+sproc_release(sclient_t *sc)
+{
+ sproc_t *proc;
+ sdev_t *sdev;
+ mblk_t *mp;
+
+ proc = sc->s_proc;
+ sdev = sc->s_sdev;
+ sc->s_proc = NULL;
+
+ mutex_enter(&sdev->d_mx);
+
+ if (proc != NULL) {
+ proc->p_refcnt--;
+ ASSERT(proc->p_refcnt >= 0);
+
+ if (sc == proc->p_writer) {
+ proc->p_oflag &= ~FWRITE;
+ proc->p_writer = NULL;
+ }
+ if (sc == proc->p_reader) {
+ proc->p_oflag &= ~FREAD;
+ proc->p_reader = NULL;
+ }
+ cv_broadcast(&sdev->d_cv);
+
+ if (proc->p_refcnt == 0) {
+ list_remove(&sdev->d_procs, proc);
+ sproc_free(proc);
+ }
+ sc->s_proc = NULL;
+ }
+
+ mutex_exit(&sdev->d_mx);
+
+ sun_clear_eof(sc);
+
+ while ((mp = sc->s_draining) != NULL) {
+ sc->s_draining = mp->b_next;
+ mp->b_next = NULL;
+ freemsg(mp);
+ }
+
+ mutex_destroy(&sc->s_lock);
+ list_destroy(&sc->s_eofcnt);
+ kmem_free(sc, sizeof (*sc));
+}
+
+static void
+sun_sendup(audio_client_t *c)
+{
+ audio_stream_t *sp = auclnt_input_stream(c);
+ sclient_t *sc = auclnt_get_private(c);
+ unsigned framesz = auclnt_get_framesz(sp);
+ queue_t *rq = sc->s_rq;
+ mblk_t *mp;
+ unsigned nbytes = sc->s_proc->p_info.record.buffer_size;
+ unsigned count = nbytes / framesz;
+
+ /*
+ * Potentially send a message upstream with the record data.
+ * We collect this up in chunks of the buffer size requested
+ * by the client.
+ */
+
+ while (auclnt_get_count(sp) >= count) {
+
+ if ((!canputnext(rq)) ||
+ ((mp = allocb(nbytes, BPRI_MED)) == NULL)) {
+ /*
+ * This will apply back pressure to the
+ * buffer. We haven't yet lost any data, we
+ * just can't send it up. The point at which
+ * we have an unrecoverable overrun is in the
+ * buffer, not in the streams queue. So, no
+ * need to do anything right now.
+ *
+ * Note that since recording is enabled, we
+ * expect that the callback routine will be
+ * called repeatedly & regularly, so we don't
+ * have to worry about leaving data orphaned
+ * in the queue.
+ */
+ break;
+ }
+
+ (void) auclnt_consume_data(sp, (caddr_t)mp->b_wptr, count);
+ mp->b_wptr += nbytes;
+ putnext(rq, mp);
+ }
+}
+
+static int
+sun_open(audio_client_t *c, int oflag)
+{
+ _NOTE(ARGUNUSED(c));
+ _NOTE(ARGUNUSED(oflag));
+ return (0);
+}
+
+static void
+sun_close(audio_client_t *c)
+{
+ _NOTE(ARGUNUSED(c));
+}
+
+static void
+sproc_update(sproc_t *proc)
+{
+ audio_info_t *info;
+ audio_stream_t *sp;
+ sclient_t *sc;
+
+ info = &proc->p_info;
+
+ ASSERT(mutex_owned(&proc->p_sdev->d_mx));
+
+ if ((sc = proc->p_writer) != NULL) {
+ sp = auclnt_output_stream(sc->s_client);
+
+ info->play.sample_rate = auclnt_get_rate(sp);
+ info->play.channels = auclnt_get_channels(sp);
+ sun_decompose_format(&info->play, auclnt_get_format(sp));
+
+ info->play.gain =
+ (auclnt_get_gain(sp) * AUDIO_MAX_GAIN) / 100;
+ info->play.pause = auclnt_is_paused(sp);
+ info->play.active = !info->play.pause;
+ info->play.samples = auclnt_get_samples(sp);
+ info->play.error = auclnt_get_errors(sp) ? B_TRUE : B_FALSE;
+ info->output_muted = auclnt_get_muted(sp);
+ }
+
+ if ((sc = proc->p_reader) != NULL) {
+ sp = auclnt_input_stream(sc->s_client);
+
+ info->record.sample_rate = auclnt_get_rate(sp);
+ info->record.channels = auclnt_get_channels(sp);
+ sun_decompose_format(&info->record, auclnt_get_format(sp));
+
+ info->record.gain =
+ (auclnt_get_gain(sp) * AUDIO_MAX_GAIN) / 100;
+ info->record.pause = auclnt_is_paused(sp);
+ info->record.active = !info->record.pause;
+ info->record.samples = auclnt_get_samples(sp);
+ info->record.error = auclnt_get_errors(sp) ? B_TRUE : B_FALSE;
+ }
+}
+
+static void
+sioc_getinfo(sioc_t *ip)
+{
+ sclient_t *sc = ip->i_sc;
+ sproc_t *proc = sc->s_proc;
+ int rv;
+
+ switch (ip->i_step) {
+ case 0:
+ if ((rv = sioc_alloc(ip, sizeof (audio_info_t))) != 0) {
+ sioc_error(ip, rv);
+ break;
+ }
+
+ mutex_enter(&sc->s_sdev->d_mx);
+ sproc_update(proc);
+ mutex_exit(&sc->s_sdev->d_mx);
+
+ bcopy(&proc->p_info, ip->i_data, sizeof (audio_info_t));
+ sioc_copyout(ip, sizeof (audio_info_t));
+ break;
+ case 1:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+#define CHANGED(new, old, field) \
+ ((new->field != ((uint32_t)~0)) && (new->field != old->field))
+#define CHANGED8(new, old, field) \
+ ((new->field != ((uint8_t)~0)) && (new->field != old->field))
+
+static int
+sun_setinfo(sclient_t *sc, audio_info_t *ninfo)
+{
+ sproc_t *proc = sc->s_proc;
+ audio_info_t *oinfo = &proc->p_info;
+ audio_prinfo_t *npr;
+ audio_prinfo_t *opr;
+
+ int pfmt = AUDIO_FORMAT_NONE;
+ int rfmt = AUDIO_FORMAT_NONE;
+
+ boolean_t reader;
+ boolean_t writer;
+ boolean_t isctl;
+ audio_stream_t *sp;
+ int rv;
+
+ if (auclnt_get_minor_type(sc->s_client) == AUDIO_MINOR_DEVAUDIOCTL) {
+ /* control node can do both read and write fields */
+ isctl = B_TRUE;
+ reader = B_TRUE;
+ writer = B_TRUE;
+ } else {
+ isctl = B_FALSE;
+ writer = sc == proc->p_writer;
+ reader = sc == proc->p_reader;
+ }
+
+ /*
+ * Start by validating settings.
+ */
+ npr = &ninfo->play;
+ opr = &oinfo->play;
+
+ if (writer && CHANGED(npr, opr, sample_rate)) {
+ if ((isctl) ||
+ (npr->sample_rate < 5500) || (npr->sample_rate > 48000)) {
+ return (EINVAL);
+ }
+ }
+ if (writer && CHANGED(npr, opr, channels)) {
+ if ((isctl) || (npr->channels < 1) || (npr->channels > 2)) {
+ return (EINVAL);
+ }
+ }
+ if (writer &&
+ (CHANGED(npr, opr, encoding) || CHANGED(npr, opr, precision))) {
+ if (npr->encoding == (uint32_t)~0)
+ npr->encoding = opr->encoding;
+ if (npr->precision == (uint32_t)~0)
+ npr->precision = opr->precision;
+ pfmt = sun_compose_format(npr);
+ if ((isctl) || (pfmt == AUDIO_FORMAT_NONE)) {
+ return (EINVAL);
+ }
+ }
+
+ /* play fields that anyone can modify */
+ if (CHANGED(npr, opr, gain)) {
+ if (npr->gain > AUDIO_MAX_GAIN) {
+ return (EINVAL);
+ }
+ }
+
+
+ npr = &ninfo->record;
+ opr = &oinfo->record;
+
+ if (reader && CHANGED(npr, opr, sample_rate)) {
+ if ((isctl) ||
+ (npr->sample_rate < 5500) ||
+ (npr->sample_rate > 48000)) {
+ return (EINVAL);
+ }
+ }
+ if (reader && CHANGED(npr, opr, channels)) {
+ if ((isctl) || (npr->channels < 1) || (npr->channels > 2)) {
+ return (EINVAL);
+ }
+ }
+ if (reader &&
+ (CHANGED(npr, opr, encoding) || CHANGED(npr, opr, precision))) {
+ if (npr->encoding == (uint32_t)~0)
+ npr->encoding = opr->encoding;
+ if (npr->precision == (uint32_t)~0)
+ npr->precision = opr->precision;
+ rfmt = sun_compose_format(npr);
+ if ((isctl) || (rfmt == AUDIO_FORMAT_NONE)) {
+ return (EINVAL);
+ }
+ }
+ if (reader && CHANGED(npr, opr, buffer_size)) {
+ if (isctl) {
+ return (EINVAL);
+ }
+ /* make sure we can support 16-bit stereo samples */
+ if ((npr->buffer_size % 4) != 0) {
+ npr->buffer_size = (npr->buffer_size + 3) & ~3;
+ }
+ /* limit the maximum buffer size somewhat */
+ if (npr->buffer_size > 16384) {
+ npr->buffer_size = 16384;
+ }
+ }
+
+ /* record fields that anyone can modify */
+ if (CHANGED(npr, opr, gain)) {
+ if (npr->gain > AUDIO_MAX_GAIN) {
+ return (EINVAL);
+ }
+ }
+
+ /*
+ * Now apply the changes.
+ */
+ if (proc->p_writer != NULL) {
+ sp = auclnt_output_stream(proc->p_writer->s_client);
+ npr = &ninfo->play;
+ opr = &oinfo->play;
+
+ if (CHANGED(npr, opr, sample_rate)) {
+ rv = auclnt_set_rate(sp, npr->sample_rate);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, channels)) {
+ rv = auclnt_set_channels(sp, npr->channels);
+ if (rv != 0)
+ return (rv);
+ }
+ if (pfmt != AUDIO_FORMAT_NONE) {
+ rv = auclnt_set_format(sp, pfmt);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, samples)) {
+ auclnt_set_samples(sp, npr->samples);
+ }
+ if (CHANGED(npr, opr, eof)) {
+ /*
+ * This ugly special case code is required to
+ * prevent problems with realaudio.
+ */
+ if (npr->eof == 0) {
+ sun_clear_eof(proc->p_writer);
+ }
+ opr->eof = npr->eof;
+ }
+ if (CHANGED8(npr, opr, pause)) {
+ if (npr->pause) {
+ auclnt_set_paused(sp);
+ } else {
+ auclnt_clear_paused(sp);
+ /* qenable to start up the playback */
+ qenable(proc->p_writer->s_wq);
+ }
+ }
+ if (CHANGED8(npr, opr, waiting) && (npr->waiting)) {
+ opr->waiting = npr->waiting;
+ }
+ if (CHANGED8(npr, opr, error)) {
+ auclnt_set_errors(sp, npr->error);
+ }
+ if (CHANGED(npr, opr, gain)) {
+ auclnt_set_gain(sp, (npr->gain * 100) / AUDIO_MAX_GAIN);
+ }
+ if (CHANGED8(ninfo, oinfo, output_muted)) {
+ auclnt_set_muted(sp, ninfo->output_muted);
+ }
+ if (CHANGED(npr, opr, buffer_size)) {
+ /*
+ * No checks on the buffer size are performed
+ * for play side. The value of the buffer size
+ * is meaningless for play side anyway.
+ */
+ opr->buffer_size = npr->buffer_size;
+ }
+ } else {
+ /* these vaalues are preserved even if /dev/audio not open */
+ if (CHANGED(npr, opr, gain)) {
+ opr->gain = npr->gain;
+ }
+ if (CHANGED8(ninfo, oinfo, output_muted)) {
+ oinfo->output_muted = ninfo->output_muted;
+ }
+ }
+
+ if (proc->p_reader != NULL) {
+ sp = auclnt_input_stream(proc->p_reader->s_client);
+ npr = &ninfo->record;
+ opr = &oinfo->record;
+
+ if (CHANGED(npr, opr, sample_rate)) {
+ rv = auclnt_set_rate(sp, npr->sample_rate);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, channels)) {
+ rv = auclnt_set_channels(sp, npr->channels);
+ if (rv != 0)
+ return (rv);
+ }
+ if (rfmt != AUDIO_FORMAT_NONE) {
+ rv = auclnt_set_format(sp, rfmt);
+ if (rv != 0)
+ return (rv);
+ }
+ if (CHANGED(npr, opr, samples)) {
+ auclnt_set_samples(sp, npr->samples);
+ }
+ if (CHANGED(npr, opr, eof)) {
+ opr->eof = npr->eof;
+ }
+ if (CHANGED8(npr, opr, pause)) {
+ if (npr->pause) {
+ auclnt_set_paused(sp);
+ } else {
+ auclnt_clear_paused(sp);
+ auclnt_start(sp);
+ }
+ }
+ if (CHANGED8(npr, opr, waiting) && (npr->waiting)) {
+ opr->waiting = npr->waiting;
+ }
+ if (CHANGED8(npr, opr, error)) {
+ auclnt_set_errors(sp, npr->error);
+ }
+ if (CHANGED(npr, opr, buffer_size)) {
+ opr->buffer_size = npr->buffer_size;
+ }
+ if (CHANGED(npr, opr, gain)) {
+ auclnt_set_gain(sp, (npr->gain * 100) / AUDIO_MAX_GAIN);
+ }
+ } else {
+ /* these values are preserved even if /dev/audio not open */
+ if (CHANGED(npr, opr, gain)) {
+ opr->gain = npr->gain;
+ }
+ }
+
+ return (0);
+}
+
+static void
+sioc_setinfo(sioc_t *ip)
+{
+ int rv;
+ sclient_t *sc = ip->i_sc;
+ audio_info_t *ninfo;
+
+ switch (ip->i_step) {
+ case 0:
+ sioc_copyin(ip, sizeof (audio_info_t));
+ break;
+
+ case 1:
+ ninfo = (audio_info_t *)ip->i_data;
+
+ mutex_enter(&sc->s_sdev->d_mx);
+ rv = sun_setinfo(ip->i_sc, ninfo);
+
+ if (rv != 0) {
+ sioc_error(ip, rv);
+ } else {
+ sproc_update(sc->s_proc);
+
+ bcopy(&sc->s_proc->p_info, ninfo, sizeof (*ninfo));
+ sioc_copyout(ip, sizeof (audio_info_t));
+ }
+ mutex_exit(&sc->s_sdev->d_mx);
+ break;
+
+ case 2:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+static void
+sioc_getdev(sioc_t *ip)
+{
+ int rv;
+ sclient_t *sc = ip->i_sc;
+ audio_client_t *c = sc->s_client;
+ audio_dev_t *d = auclnt_get_dev(c);
+
+ switch (ip->i_step) {
+ case 0:
+ rv = sioc_alloc(ip, sizeof (audio_device_t));
+ if (rv == 0) {
+ audio_device_t *a = ip->i_data;
+
+ (void) snprintf(a->name, sizeof (a->name),
+ "SUNW,%s", auclnt_get_dev_name(d));
+ (void) strlcpy(a->config,
+ auclnt_get_dev_description(d), sizeof (a->config));
+ (void) strlcpy(a->version,
+ auclnt_get_dev_version(d), sizeof (a->version));
+ sioc_copyout(ip, sizeof (*a));
+ } else {
+ sioc_error(ip, rv);
+ }
+ break;
+
+ case 1:
+ sioc_success(ip);
+ break;
+ }
+
+ ip->i_step++;
+ sioc_finish(ip);
+}
+
+static void
+sunstr_ioctl(sioc_t *ip)
+{
+ switch (ip->i_cmd) {
+ case AUDIO_GETINFO:
+ sioc_getinfo(ip);
+ break;
+
+ case AUDIO_SETINFO:
+ sioc_setinfo(ip);
+ break;
+
+ case AUDIO_GETDEV:
+ sioc_getdev(ip);
+ break;
+
+ case AUDIO_DIAG_LOOPBACK:
+ /* we don't support this one */
+ sioc_error(ip, ENOTTY);
+ sioc_finish(ip);
+ break;
+
+ case AUDIO_MIXERCTL_GET_MODE:
+ case AUDIO_MIXERCTL_SET_MODE:
+ case AUDIO_MIXERCTL_GET_CHINFO:
+ case AUDIO_MIXERCTL_SET_CHINFO:
+ case AUDIO_MIXERCTL_GETINFO:
+ case AUDIO_MIXERCTL_SETINFO:
+ case AUDIO_GET_NUM_CHS:
+ case AUDIO_GET_CH_NUMBER:
+ case AUDIO_GET_CH_TYPE:
+ case AUDIO_MIXER_SINGLE_OPEN:
+ case AUDIO_MIXER_MULTIPLE_OPEN:
+ case AUDIO_MIXER_GET_SAMPLE_RATES:
+ default:
+ sioc_error(ip, EINVAL);
+ sioc_finish(ip);
+ break;
+ }
+}
+
+static int
+sun_sigpoll(audio_client_t *c, void *arg)
+{
+ sproc_t *proc = arg;
+ sclient_t *sc;
+
+ if (auclnt_get_minor_type(c) == AUDIO_MINOR_DEVAUDIOCTL) {
+ sc = auclnt_get_private(c);
+ /* we only need to notify peers in our own process */
+ if ((sc != NULL) && (sc->s_proc == proc)) {
+ (void) putnextctl1(sc->s_rq, M_PCSIG, SIGPOLL);
+ }
+ }
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void
+sun_drain(audio_client_t *c)
+{
+ sclient_t *sc = auclnt_get_private(c);
+ mblk_t *mplist, *mp;
+
+ mutex_enter(&sc->s_lock);
+ mplist = sc->s_draining;
+ sc->s_draining = NULL;
+ mutex_exit(&sc->s_lock);
+
+ while ((mp = mplist) != NULL) {
+ mplist = mp->b_next;
+ mp->b_next = NULL;
+ miocack(sc->s_wq, mp, 0, 0);
+ }
+}
+
+static void
+sun_output(audio_client_t *c)
+{
+ sclient_t *sc = auclnt_get_private(c);
+ sproc_t *proc = sc->s_proc;
+ uint64_t tail;
+ struct eofcnt *eof;
+ int eofs = 0;
+
+ tail = auclnt_get_tail(auclnt_output_stream(c));
+
+ /* get more data! (do this early) */
+ qenable(sc->s_wq);
+
+ mutex_enter(&sc->s_lock);
+ while (((eof = list_head(&sc->s_eofcnt)) != NULL) &&
+ (eof->tail < tail)) {
+ list_remove(&sc->s_eofcnt, eof);
+ kmem_free(eof, sizeof (*eof));
+ eofs++;
+ }
+ proc->p_info.play.eof += eofs;
+ mutex_exit(&sc->s_lock);
+
+ if (eofs) {
+ auclnt_dev_walk_clients(auclnt_get_dev(c),
+ sun_sigpoll, proc);
+ }
+}
+
+static void
+sun_input(audio_client_t *c)
+{
+ sun_sendup(c);
+}
+
+static int
+sun_create_minors(audio_dev_t *adev, void *notused)
+{
+ char path[MAXPATHLEN];
+ minor_t minor;
+ int inst;
+ int index;
+ const char *driver;
+ unsigned cap;
+
+ _NOTE(ARGUNUSED(notused));
+
+ ASSERT(mutex_owned(&sdev_lock));
+
+ /* don't create device nodes for sndstat device */
+ cap = auclnt_get_dev_capab(adev);
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ index = auclnt_get_dev_index(adev);
+ inst = auclnt_get_dev_instance(adev);
+ driver = auclnt_get_dev_driver(adev);
+
+ if (sdev_dip != NULL) {
+
+ minor = AUDIO_MKMN(index, AUDIO_MINOR_DEVAUDIO);
+ (void) snprintf(path, sizeof (path), "sound,%s,audio%d",
+ driver, inst);
+ (void) ddi_create_minor_node(sdev_dip, path, S_IFCHR, minor,
+ DDI_NT_AUDIO, 0);
+
+ minor = AUDIO_MKMN(index, AUDIO_MINOR_DEVAUDIOCTL);
+ (void) snprintf(path, sizeof (path), "sound,%s,audioctl%d",
+ driver, inst);
+ (void) ddi_create_minor_node(sdev_dip, path, S_IFCHR, minor,
+ DDI_NT_AUDIO, 0);
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static int
+sun_remove_minors(audio_dev_t *adev, void *notused)
+{
+ char path[MAXPATHLEN];
+ int inst;
+ const char *driver;
+ unsigned cap;
+
+ _NOTE(ARGUNUSED(notused));
+
+ ASSERT(mutex_owned(&sdev_lock));
+
+ cap = auclnt_get_dev_capab(adev);
+ /* if not a play or record device, don't bother creating minors */
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (AUDIO_WALK_CONTINUE);
+ }
+
+ inst = auclnt_get_dev_instance(adev);
+ driver = auclnt_get_dev_driver(adev);
+
+ if (sdev_dip != NULL) {
+
+ (void) snprintf(path, sizeof (path), "sound,%s,audio%d",
+ driver, inst);
+ ddi_remove_minor_node(sdev_dip, path);
+
+ (void) snprintf(path, sizeof (path), "sound,%s,audioctl%d",
+ driver, inst);
+ ddi_remove_minor_node(sdev_dip, path);
+ }
+
+ return (AUDIO_WALK_CONTINUE);
+}
+
+static void *
+sun_dev_init(audio_dev_t *adev)
+{
+ sdev_t *sdev;
+ unsigned cap;
+
+ cap = auclnt_get_dev_capab(adev);
+ /* if not a play or record device, don't bother initializing it */
+ if ((cap & (AUDIO_CLIENT_CAP_PLAY | AUDIO_CLIENT_CAP_RECORD)) == 0) {
+ return (NULL);
+ }
+
+ sdev = kmem_zalloc(sizeof (*sdev), KM_SLEEP);
+ sdev->d_dev = adev;
+ mutex_init(&sdev->d_mx, NULL, MUTEX_DRIVER, NULL);
+ cv_init(&sdev->d_cv, NULL, CV_DRIVER, NULL);
+ list_create(&sdev->d_procs, sizeof (struct sproc),
+ offsetof(struct sproc, p_linkage));
+
+ mutex_enter(&sdev_lock);
+ (void) sun_create_minors(adev, NULL);
+ mutex_exit(&sdev_lock);
+
+ return (sdev);
+}
+
+static void
+sun_dev_fini(void *arg)
+{
+ sdev_t *sdev = arg;
+
+ if (sdev != NULL) {
+
+ /* remove minor nodes */
+ mutex_enter(&sdev_lock);
+ (void) sun_remove_minors(sdev->d_dev, NULL);
+ mutex_exit(&sdev_lock);
+
+ mutex_destroy(&sdev->d_mx);
+ cv_destroy(&sdev->d_cv);
+ list_destroy(&sdev->d_procs);
+ kmem_free(sdev, sizeof (*sdev));
+ }
+}
+
+static struct audio_client_ops sun_ops = {
+ "internal,audio",
+ sun_dev_init,
+ sun_dev_fini,
+ sun_open,
+ sun_close,
+ NULL, /* read */
+ NULL, /* write */
+ NULL, /* ioctl */
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ sun_input,
+ sun_output,
+ NULL, /* notify */
+ sun_drain,
+};
+
+static struct audio_client_ops sunctl_ops = {
+ "internal,audioctl",
+ NULL, /* dev_init */
+ NULL, /* dev_fini */
+ sun_open,
+ sun_close,
+ NULL, /* read */
+ NULL, /* write */
+ NULL, /* ioctl */
+ NULL, /* chpoll */
+ NULL, /* mmap */
+ NULL, /* output */
+ NULL, /* input */
+ NULL, /* notify */
+ NULL, /* drain */
+};
+
+void
+auimpl_sun_init(void)
+{
+ mutex_init(&sdev_lock, NULL, MUTEX_DRIVER, NULL);
+ sdev_dip = NULL;
+ auclnt_register_ops(AUDIO_MINOR_DEVAUDIO, &sun_ops);
+ auclnt_register_ops(AUDIO_MINOR_DEVAUDIOCTL, &sunctl_ops);
+}
+
+/*
+ * This is the operations entry points that are streams specific...
+ * We map "instance" numbers.
+ */
+
+static int
+sunstr_open(queue_t *rq, dev_t *devp, int flag, int sflag, cred_t *cr)
+{
+ int rv;
+ minor_t minor;
+ minor_t index;
+ minor_t type;
+ dev_t physdev;
+ ldi_ident_t lid;
+ ldi_handle_t lh = NULL;
+ audio_client_t *c = NULL;
+ sclient_t *sc = NULL;
+ audio_dev_t *adev;
+ unsigned fmt;
+ int oflag;
+ boolean_t isopen = B_FALSE;
+
+ if (sflag != 0) {
+ /* no direct clone or module opens */
+ return (EINVAL);
+ }
+
+ /*
+ * NB: We reuse the partitioning that the core framework is
+ * using for instance numbering. This does mean that we are
+ * limited to at most AUDIO_MN_INST_MASK devices, but this
+ * number is sufficiently large (8192) that not to be a concern.
+ */
+
+ minor = getminor(*devp);
+ index = (minor >> AUDIO_MN_INST_SHIFT) & AUDIO_MN_INST_MASK;
+ type = (minor >> AUDIO_MN_TYPE_SHIFT) & AUDIO_MN_TYPE_MASK;
+
+ /* can't directly open a cloned node! */
+ if (minor & AUDIO_MN_CLONE_MASK) {
+ return (ENXIO);
+ }
+
+ switch (type) {
+ case AUDIO_MINOR_DEVAUDIOCTL:
+ fmt = AUDIO_FORMAT_NONE;
+ oflag = flag & ~(FWRITE | FREAD);
+ break;
+ case AUDIO_MINOR_DEVAUDIO:
+ fmt = AUDIO_FORMAT_PCM;
+ oflag = flag;
+ break;
+ default:
+ /* these minor types are not legal */
+ return (ENXIO);
+ }
+
+ /* look up and hold the matching audio device */
+ adev = auclnt_hold_dev_by_index(index);
+ if (adev == NULL) {
+ return (ENXIO);
+ }
+ /* find the matching physical devt */
+ physdev = makedevice(ddi_driver_major(auclnt_get_dev_devinfo(adev)),
+ AUDIO_MKMN(auclnt_get_dev_instance(adev), type));
+
+ if ((rv = ldi_ident_from_stream(rq, &lid)) == 0) {
+ rv = ldi_open_by_dev(&physdev, OTYP_CHR, flag, cr, &lh, lid);
+ }
+
+ /* ldi open is done, lh holds device, and we can release our hold */
+ auclnt_release_dev(adev);
+
+ if (rv != 0) {
+ goto fail;
+ }
+ /* phys layer clones a device for us */
+ ASSERT((getminor(physdev) & AUDIO_MN_CLONE_MASK) != 0);
+
+ c = auclnt_hold_by_devt(physdev);
+ ASSERT(c != NULL);
+ if ((rv = auclnt_open(c, fmt, oflag)) != 0) {
+ goto fail;
+ }
+ isopen = B_TRUE;
+
+ if ((rv = sproc_hold(c, oflag)) != 0) {
+ goto fail;
+ }
+
+ sc = auclnt_get_private(c);
+ WR(rq)->q_ptr = rq->q_ptr = sc;
+ sc->s_lh = lh;
+ sc->s_rq = rq;
+ sc->s_wq = WR(rq);
+
+ /* start up the input */
+ if (oflag & FREAD) {
+ auclnt_start(auclnt_input_stream(c));
+ }
+
+ auclnt_release(c);
+
+ /* we just reuse same minor number that phys layer used */
+ *devp = makedevice(getmajor(*devp), getminor(physdev));
+
+ qprocson(rq);
+
+ return (0);
+
+fail:
+ if (sc != NULL) {
+ sproc_release(sc);
+ }
+ if (isopen) {
+ auclnt_close(c);
+ }
+ if (lh != NULL) {
+ auclnt_release(c);
+ (void) ldi_close(lh, flag, cr);
+ }
+
+ return (rv);
+}
+
+static int
+sunstr_close(queue_t *rq, int flag, cred_t *cr)
+{
+ sclient_t *sc;
+ audio_client_t *c;
+ int rv;
+
+ sc = rq->q_ptr;
+ c = sc->s_client;
+
+ if ((auclnt_get_minor_type(c) == AUDIO_MINOR_DEVAUDIO) &&
+ (ddi_can_receive_sig() || (ddi_get_pid() == 0))) {
+ rv = auclnt_drain(c);
+ }
+
+ auclnt_stop(auclnt_output_stream(c));
+ auclnt_stop(auclnt_input_stream(c));
+
+ auclnt_close(c);
+
+ qprocsoff(rq);
+
+ (void) ldi_close(sc->s_lh, flag, cr);
+
+ sproc_release(sc);
+
+ return (rv);
+}
+
+static void
+sunstr_miocdata(sclient_t *sc, mblk_t *mp)
+{
+ struct copyresp *csp;
+ sioc_t *ip;
+ mblk_t *bcont;
+
+ csp = (void *)mp->b_rptr;
+
+ /*
+ * If no state, then something "bad" has happened.
+ */
+ if (((ip = (void *)csp->cp_private) == NULL) || (ip->i_sc != sc)) {
+ miocnak(sc->s_wq, mp, 0, EFAULT);
+ return;
+ }
+
+ /*
+ * If we failed to transfer data to/from userland, then we are
+ * done. (Stream head will have notified userland.)
+ */
+ if (csp->cp_rval != 0) {
+ ip->i_state = FINI;
+ ip->i_mp = mp;
+ sioc_finish(ip);
+ return;
+ }
+
+ /*
+ * Buffer area for ioctl is attached to chain.
+ * For an ioctl that didn't have any data to copyin,
+ * we might need to allocate a new buffer area.
+ */
+ bcont = mp->b_cont;
+ ip->i_bcont = bcont;
+ mp->b_cont = NULL;
+
+ if (bcont != NULL) {
+ ip->i_data = bcont->b_rptr;
+ }
+
+ /*
+ * Meaty part of data processing.
+ */
+ ip->i_state = IOCTL;
+ ip->i_mp = mp;
+
+ /* now, call the handler ioctl */
+ sunstr_ioctl(ip);
+}
+
+static void
+sunstr_mioctl(sclient_t *sc, mblk_t *mp)
+{
+ struct iocblk *iocp = (void *)mp->b_rptr;
+ sioc_t *ip;
+
+ /* BSD legacy here: we only support transparent ioctls */
+ if (iocp->ioc_count != TRANSPARENT) {
+ miocnak(sc->s_wq, mp, 0, EINVAL);
+ return;
+ }
+
+ ip = kmem_zalloc(sizeof (*ip), KM_NOSLEEP);
+ if (ip == NULL) {
+ miocnak(sc->s_wq, mp, 0, ENOMEM);
+ return;
+ }
+
+ /* make sure everything is setup in case we need to do copyin/out */
+ ip->i_sc = sc;
+ ip->i_model = iocp->ioc_flag;
+ ip->i_cmd = iocp->ioc_cmd;
+ ip->i_addr = *(caddr_t *)(void *)mp->b_cont->b_rptr;
+ ip->i_state = IOCTL;
+ ip->i_mp = mp;
+ freemsg(mp->b_cont);
+ mp->b_cont = NULL;
+
+ /* now, call the handler ioctl */
+ sunstr_ioctl(ip);
+}
+
+static int
+sunstr_wput(queue_t *wq, mblk_t *mp)
+{
+ sclient_t *sc = wq->q_ptr;
+ struct iocblk *iocp;
+
+ switch (DB_TYPE(mp)) {
+ case M_IOCTL:
+ /* Drain ioctl needs to be handled on the service queue */
+ iocp = (void *)mp->b_rptr;
+ if (iocp->ioc_cmd == AUDIO_DRAIN) {
+ if (auclnt_get_minor_type(sc->s_client) ==
+ AUDIO_MINOR_DEVAUDIO) {
+ (void) putq(wq, mp);
+ } else {
+ miocnak(wq, mp, 0, EINVAL);
+ }
+ } else {
+ sunstr_mioctl(sc, mp);
+ }
+ break;
+
+ case M_IOCDATA:
+ sunstr_miocdata(sc, mp);
+ break;
+
+ case M_FLUSH:
+ /*
+ * We don't flush the engine. The reason is that
+ * other streams might be using the engine. This is
+ * fundamentally no different from the case where the
+ * engine hardware has data buffered in an
+ * inaccessible FIFO.
+ *
+ * Clients that want to ensure no more data is coming
+ * should stop the stream before flushing.
+ */
+ if (*mp->b_rptr & FLUSHW) {
+ flushq(wq, FLUSHALL);
+ auclnt_flush(auclnt_output_stream(sc->s_client));
+ *mp->b_rptr &= ~FLUSHW;
+ }
+ if (*mp->b_rptr & FLUSHR) {
+ flushq(RD(wq), FLUSHALL);
+ auclnt_flush(auclnt_input_stream(sc->s_client));
+ qreply(wq, mp);
+ } else {
+ freemsg(mp);
+ }
+ break;
+
+ case M_DATA:
+ /*
+ * If we don't have an engine, then we can't accept
+ * write() data. audio(7i) says we just ignore it,
+ * so we toss it.
+ */
+ if (auclnt_get_minor_type(sc->s_client) !=
+ AUDIO_MINOR_DEVAUDIO) {
+ freemsg(mp);
+ } else {
+ /*
+ * Defer processing to the queue. This keeps
+ * the data ordered, and allows the wsrv
+ * routine to gather multiple mblks at once.
+ */
+ if (mp->b_cont != NULL) {
+
+ /*
+ * If we need to pullup, do it here to
+ * simplify the rest of the processing
+ * later. This should rarely (if
+ * ever) be necessary.
+ */
+ mblk_t *nmp;
+
+ if ((nmp = msgpullup(mp, -1)) == NULL) {
+ freemsg(mp);
+ } else {
+ freemsg(mp);
+ (void) putq(wq, nmp);
+ }
+ } else {
+ (void) putq(wq, mp);
+ }
+ }
+ break;
+
+ default:
+ freemsg(mp);
+ break;
+ }
+ return (0);
+}
+
+static int
+sunstr_wsrv(queue_t *wq)
+{
+ sclient_t *sc = wq->q_ptr;
+ audio_client_t *c = sc->s_client;
+ audio_stream_t *sp;
+ mblk_t *mp;
+ unsigned framesz;
+
+ sp = auclnt_output_stream(c);
+
+ framesz = auclnt_get_framesz(sp);
+
+ while ((mp = getq(wq)) != NULL) {
+
+ unsigned count;
+
+ /* got a message */
+
+ /* if its a drain ioctl, we need to process it here */
+ if (DB_TYPE(mp) == M_IOCTL) {
+ ASSERT((*(int *)(void *)mp->b_rptr) == AUDIO_DRAIN);
+ mutex_enter(&sc->s_lock);
+ mp->b_next = sc->s_draining;
+ sc->s_draining = mp;
+ mutex_exit(&sc->s_lock);
+
+ if (auclnt_start_drain(c) != 0) {
+ sun_drain(c);
+ }
+ continue;
+ }
+
+ ASSERT(DB_TYPE(mp) == M_DATA);
+
+ /*
+ * Empty mblk require special handling, since they
+ * indicate EOF. We treat them separate from the main
+ * processing loop.
+ */
+ if (MBLKL(mp) == 0) {
+ struct eofcnt *eof;
+
+ eof = kmem_zalloc(sizeof (*eof), KM_NOSLEEP);
+ if (eof != NULL) {
+ eof->tail = auclnt_get_head(sp);
+ mutex_enter(&sc->s_lock);
+ list_insert_tail(&sc->s_eofcnt, eof);
+ mutex_exit(&sc->s_lock);
+ }
+ freemsg(mp);
+ continue;
+ }
+
+ count = auclnt_produce_data(sp, (caddr_t)mp->b_rptr,
+ MBLKL(mp) / framesz);
+
+ mp->b_rptr += count * framesz;
+
+ if (MBLKL(mp) >= framesz) {
+ (void) putbq(wq, mp);
+ break;
+ } else {
+ freemsg(mp);
+ }
+ }
+
+ /* if the stream isn't running yet, start it up */
+ if (!auclnt_is_paused(sp))
+ auclnt_start(sp);
+
+ return (0);
+}
+
+static int
+sunstr_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ if ((cmd != DDI_ATTACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&sdev_lock);
+ sdev_dip = dip;
+ auclnt_walk_devs(sun_create_minors, NULL);
+ mutex_exit(&sdev_lock);
+ ddi_report_dev(dip);
+
+ return (0);
+}
+
+static int
+sunstr_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ if ((cmd != DDI_DETACH) || (dip == NULL)) {
+ return (DDI_FAILURE);
+ }
+ if (ddi_get_instance(dip) != 0) {
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&sdev_lock);
+ /* remove all minors */
+ auclnt_walk_devs(sun_remove_minors, NULL);
+ sdev_dip = NULL;
+ mutex_exit(&sdev_lock);
+
+ return (0);
+}
+
+static int
+sunstr_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
+{
+ int error;
+
+ _NOTE(ARGUNUSED(dip));
+ _NOTE(ARGUNUSED(arg));
+
+ switch (cmd) {
+ case DDI_INFO_DEVT2DEVINFO:
+ *result = sdev_dip;
+ error = DDI_SUCCESS;
+ break;
+ case DDI_INFO_DEVT2INSTANCE:
+ *result = 0;
+ error = DDI_SUCCESS;
+ break;
+ default:
+ *result = NULL;
+ error = DDI_FAILURE;
+ }
+ return (error);
+}
+
+static struct module_info sunstr_minfo = {
+ 0, /* used for strlog(1M) only, which we don't use */
+ "austr",
+ 0, /* min pkt size */
+ 2048, /* max pkt size */
+ 65536, /* hi water */
+ 32768, /* lo water */
+};
+
+static struct qinit sunstr_rqinit = {
+ NULL, /* qi_putp */
+ NULL, /* qi_srvp */
+ sunstr_open, /* qi_qopen */
+ sunstr_close, /* qi_qclose */
+ NULL, /* qi_qadmin */
+ &sunstr_minfo, /* qi_minfo */
+ NULL, /* qi_mstat */
+};
+
+static struct qinit sunstr_wqinit = {
+ sunstr_wput, /* qi_putp */
+ sunstr_wsrv, /* qi_srvp */
+ NULL, /* qi_qopen */
+ NULL, /* qi_qclose */
+ NULL, /* qi_qadmin */
+ &sunstr_minfo, /* qi_minfo */
+ NULL, /* qi_mstat */
+};
+
+static struct streamtab sunstr_strtab = {
+ &sunstr_rqinit,
+ &sunstr_wqinit,
+ NULL,
+ NULL
+};
+
+struct cb_ops sunstr_cb_ops = {
+ nodev, /* open */
+ nodev, /* close */
+ nodev, /* strategy */
+ nodev, /* print */
+ nodev, /* dump */
+ nodev, /* read */
+ nodev, /* write */
+ nodev, /* ioctl */
+ nodev, /* devmap */
+ nodev, /* mmap */
+ nodev, /* segmap */
+ nochpoll, /* chpoll */
+ ddi_prop_op, /* prop_op */
+ &sunstr_strtab, /* str */
+ D_MP, /* flag */
+ CB_REV, /* rev */
+ nodev, /* aread */
+ nodev, /* awrite */
+};
+
+static struct dev_ops sunstr_dev_ops = {
+ DEVO_REV, /* rev */
+ 0, /* refcnt */
+ sunstr_getinfo, /* getinfo */
+ nulldev, /* identify */
+ nulldev, /* probe */
+ sunstr_attach, /* attach */
+ sunstr_detach, /* detach */
+ nodev, /* reset */
+ &sunstr_cb_ops, /* cb_ops */
+ NULL, /* bus_ops */
+ NULL, /* power */
+};
+
+static struct modldrv sunstr_modldrv = {
+ &mod_driverops,
+ "Audio Streams Support",
+ &sunstr_dev_ops,
+};
+
+static struct modlinkage sunstr_modlinkage = {
+ MODREV_1, /* MODREV_1 indicated by manual */
+ &sunstr_modldrv,
+ NULL
+};
+
+int
+sunstr_init(void)
+{
+ /*
+ * NB: This *must* be called after the "audio" module's
+ * _init routine has called auimpl_sun_init().
+ */
+ return (mod_install(&sunstr_modlinkage));
+}
+
+int
+sunstr_fini(void)
+{
+ return (mod_remove(&sunstr_modlinkage));
+}
+
+int
+sunstr_info(struct modinfo *modinfop)
+{
+ return (mod_info(&sunstr_modlinkage, modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/impl/austr.c b/usr/src/uts/common/io/audio/impl/austr.c
new file mode 100644
index 0000000000..5f85c483b7
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/austr.c
@@ -0,0 +1,62 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Audio Streams Support driver. This relies on the common audio module.
+ *
+ * The entire driver is a tiny shim for the audio framework, and exists
+ * solely to provide a device node that we can hang STREAMs minor nodes from,
+ * since we can't mix and match STREAMs and character devices in the same
+ * driver, due to limitations in the DDI.
+ */
+
+#include <sys/types.h>
+#include <sys/modctl.h>
+#include <sys/conf.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+
+/* our entire API with "audio" is miniscule */
+extern int sunstr_init(void);
+extern int sunstr_fini(void);
+extern int sunstr_info(struct modinfo *);
+
+int
+_init(void)
+{
+ return (sunstr_init());
+}
+
+int
+_fini(void)
+{
+ return (sunstr_fini());
+}
+
+int
+_info(struct modinfo *modinfop)
+{
+ return (sunstr_info(modinfop));
+}
diff --git a/usr/src/uts/common/io/audio/impl/austr.conf b/usr/src/uts/common/io/audio/impl/austr.conf
new file mode 100644
index 0000000000..4796f135b1
--- /dev/null
+++ b/usr/src/uts/common/io/audio/impl/austr.conf
@@ -0,0 +1,38 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# Configuration file for the common austr driver.
+#
+
+#
+# We are a pseudo driver.
+#
+name="austr" parent="pseudo" instance=0;
+
+#
+# We want to always be present and never removed. This is important
+# to ensure that device numbering is not lost due to the driver being
+# forced out of memory automatically.
+#
+ddi-forceattach=1;
+ddi-no-autodetach=1;
diff --git a/usr/src/uts/common/io/audio/inc.flg b/usr/src/uts/common/io/audio/inc.flg
deleted file mode 100644
index 09f67a654c..0000000000
--- a/usr/src/uts/common/io/audio/inc.flg
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-#
-
-# This file brings down all that is needed to build just
-# audio drivers.
-#
-
-find_files "s.*" \
- usr/src/uts/sun/io/audio
-
-find_files "s.*.h" \
- usr/src/uts/common/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/v7/sys
-
-find_files "s.*.h" \
- usr/src/uts/sparc/v9/sys
-
-find_files "s.*.h" \
- usr/src/uts/intel/sys
-
-find_files "s.*.h" \
- usr/src/uts/intel/ia32/sys
-
-find_files "s.*" \
- usr/src/uts/intel/ia32/ml
-
-find_files "s.*.h" \
- usr/src/uts/sun/sys
-
-find_files "s.*.h" \
- usr/src/uts/i86pc/sys
-
-find_files "s.*.h" \
- usr/src/uts/common/vm
-
-find_files "s.*" \
- usr/src/uts/common/io/warlock
-
-find_files "s.*" \
- usr/src/uts/sparc/ml
-
-find_files "s.*" \
- usr/src/uts/sparc/warlock \
- usr/src/uts/sparc/audiocs \
- usr/src/uts/sparc/audiots \
- usr/src/uts/sparc/audio810 \
- usr/src/uts/sparc/audio1575 \
- usr/src/uts/sparc/audiohd \
- usr/src/uts/sparc/audiosup \
- usr/src/uts/sparc/mixer \
- usr/src/uts/sparc/amsrc2 \
- usr/src/uts/intel/audio810 \
- usr/src/uts/intel/audiohd \
- usr/src/uts/intel/audiosup \
- usr/src/uts/intel/mixer
-
-echo_file usr/src/uts/sparc/os/driver_classes
-echo_file usr/src/uts/sparc/os/driver_aliases
-echo_file usr/src/uts/sparc/os/name_to_major
-echo_file usr/src/uts/intel/os/driver_classes
-echo_file usr/src/uts/intel/os/driver_aliases
-echo_file usr/src/uts/intel/os/name_to_major
-
-echo_file usr/src/Makefile.master
-echo_file usr/src/Makefile.master.64
-echo_file usr/src/req.flg
-echo_file usr/src/Makefile.psm
-echo_file usr/src/Makefile.psm.targ
-echo_file usr/src/uts/Makefile
-echo_file usr/src/uts/Makefile.targ
-echo_file usr/src/uts/Makefile.uts
-echo_file usr/src/uts/sun/Makefile.files
-echo_file usr/src/uts/sun/Makefile.rules
-echo_file usr/src/uts/common/Makefile.files
-echo_file usr/src/uts/common/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile
-echo_file usr/src/uts/sparc/Makefile.files
-echo_file usr/src/uts/sparc/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile.sparc
-echo_file usr/src/uts/sparc/Makefile.sparc.shared
-echo_file usr/src/uts/sparc/Makefile.targ
-echo_file usr/src/uts/sparc/Makefile.targ.shared
-echo_file usr/src/uts/sparc/req.flg
-echo_file usr/src/uts/i86pc/Makefile.i86pc
-echo_file usr/src/uts/i86pc/Makefile.i86pc.shared
-echo_file usr/src/uts/i86pc/Makefile.files
-echo_file usr/src/uts/i86pc/Makefile.rules
-echo_file usr/src/uts/i86pc/Makefile.targ
-echo_file usr/src/uts/i86pc/Makefile.targ.shared
-echo_file usr/src/uts/i86pc/Makefile.workarounds
-echo_file usr/src/uts/intel/Makefile
-echo_file usr/src/uts/intel/Makefile.files
-echo_file usr/src/uts/intel/Makefile.rules
-echo_file usr/src/uts/intel/Makefile.intel
-echo_file usr/src/uts/intel/Makefile.intel.shared
-echo_file usr/src/uts/intel/Makefile.targ
-echo_file usr/src/uts/intel/Makefile.targ.shared
diff --git a/usr/src/uts/common/io/audio/sada/amsrc2/README b/usr/src/uts/common/io/audio/sada/amsrc2/README
deleted file mode 100644
index ee89a89634..0000000000
--- a/usr/src/uts/common/io/audio/sada/amsrc2/README
+++ /dev/null
@@ -1,106 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-Bandlimited Interpolation
-
-In bandlimited interpolation a windowed sinc function is used to
-interpolate input samples and implement sample rate conversion.
-More information on the algorithm can be found on the website at
-http://ccrma-www.stanford.edu/~jos/resample. Choices to be made
-during an implementation include (i) the type of window with which
-to truncate the infinitely long sinc function (ii) the length of
-the latter window (i.e. how many sinc zero-crossings to include)
-(iii) the density of sinc function sampling (iv) the number of bits
-used to encode each sinc coefficient (v) whether to interpolate
-sinc coefficients during sample rate conversion.
-
-In our implementation we (i) use a Kaiser window to truncate
-the sinc function (ii) sample up to the 10th zero crossing (iii)
-sample the interval between each zero crossing 256 times (iv)
-use an integer (32 bits) to encode each coefficient (v) do not,
-for performance reasons, perform coefficient interpolation during
-conversion.
-
-Using the above settings we end up with a conversion table which
-contains (2 * 10 + 1) * 256 = 5376 entries. (We add some more to
-simplify the implementation.) For performance reasons, we use two
-copies of the table, one for up and one for downsampling. Each is
-a reordering of the other. We also use separate functions for up
-and downsampling mono and stereo files giving 4 resampling functions.
-Each can handle, theoretically, any start/target sample rate
-configuration and is accurate to 1Hz.
-
-Upsampling
-
-During conversion the sinc window is centered over the current output
-sample location. We project upwards from input sample values under
-the sinc "umbrella" and multiply and sum corresponding input samples
-and sinc coefficients. The sinc function acts like a low pass filter
-with a cut off frequency of Fs/2 where Fs is the input sample rate.
-The number of multiply-adds is fixed, irrespective of the start and
-target sample rates. Often an input sample location will not intersect
-with a prestored coefficient value and as stated earlier we do not
-interpolate but multiply by the nearest coefficient value.
-
-Downsampling
-
-Downsampling is not as straightforward as upsampling. The stored
-sinc table must be traversed in such a way as to act like a low
-pass filter but this time with a cut off frequency equal to Fs'/2
-where Fs' is the target sample rate. To achieve this the sinc
-coefficients are stretched over a longer interval of the input
-signal (compared to upsampling) and traversed at a slower rate.
-Compared to upsampling there are then more multiply-adds to be
-performed but this is offset by the fact that there are fewer
-output samples to be generated.
-
-Notes
-
-When resampling we are performing an interpolation. This interpolation
-is imperfect and errors will occur. Furthermore, in our implementation
-there is often no direct mapping from filter coefficents to input
-samples and in this case we use the closest filter coefficient which
-introduces more error. These errors lead to unwanted frequencies in
-the audio output signal. Many of these could be removed or reduced by
-(i) employing a greater sampling density over the stored sinc function,
-thereby increasing the overall table size and lowering the error
-introduced by a lack of filter coefficient interpolation or (ii)
-maintaining the same overall table size but interpolating between
-filter coefficients for increased accuracy at a computational cost.
-Implementing either of these would have a significant effect on
-output audio quality.
-
-As is stands our current implementation should theoretically exhibit a
-stopband rejection of 60dB and a transition bandwidth of ~34% (these
-are theoretical values since the errors mentioned above drag quality
-downwards). Our transition band is centered over Fs/2 with the result
-that should there be significant energy in the upper ~17% of the spectrum
-there will be a considerable artifact introduced in the output signal.
-We take that chance. Stopband rejection can be increased at the expense
-of transition bandwidth and transition bandwidth can be lessened by
-using more sinc zero crossings (i.e. lengthening the filter kernel).
diff --git a/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c b/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c
deleted file mode 100644
index 1897eb6934..0000000000
--- a/usr/src/uts/common/io/audio/sada/amsrc2/am_src2.c
+++ /dev/null
@@ -1,1037 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Audio Mixer Sample Rate Conversion Routine 2
- *
- * This module is used by the audio mixer to perform sample rate conversion
- * of audio streams. The audio driver actually specifies which sample rate
- * conversion routine it wants to use, and then passes that information to
- * the audio mixer.
- *
- * NOTE: This module depends on the misc/audiosup and misc/mixer
- * modules being loaded 1st.
- *
- * NOTE: We do NOT allocate the buffers used for sample rate conversion.
- * That is the job of the audio mixer.
- */
-
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/cmn_err.h>
-#include <sys/kmem.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/am_src2_impl.h>
-#include <sys/audio/impl/am_src2_table.h>
-
-/*
- * Local sample rate conversion routines.
- */
-static int am_src2_adjust(srchdl_t, int, int);
-static int *am_src2_convert(srchdl_t, int, int, int *, int *, int *, int *);
-static void am_src2_exit(srchdl_t, int);
-static size_t am_src2_init(srchdl_t, int);
-static size_t am_src2_size(srchdl_t, audio_prinfo_t *, int, int, int);
-static int am_src2_update(srchdl_t, audio_prinfo_t *, audio_prinfo_t *,
- void *, int);
-static int am_src2_up_s(am_src2_data_t *, int *, int *, int);
-static int am_src2_up_m(am_src2_data_t *, int *, int *, int);
-static int am_src2_dn_s(am_src2_data_t *, int *, int *, int);
-static int am_src2_dn_m(am_src2_data_t *, int *, int *, int);
-
-/*
- * Global variable to provide generic sample rate conversion facility.
- */
-am_ad_src_entry_t am_src2 = {
- AM_SRC_VERSION,
- am_src2_init,
- am_src2_exit,
- am_src2_update,
- am_src2_adjust,
- am_src2_convert,
- am_src2_size
-};
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc amsrc2_modlmisc = {
- &mod_miscops, /* drv_modops */
- AM_SRC2_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage amsrc2_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&amsrc2_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Loadable Module Configuration Entry Points
- *
- *
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in amsrc2 _init()", 0);
-
- /* Standard linkage call */
- if ((error = mod_install(&amsrc2_modlinkage)) != 0) {
- ATRACE_32("amsrc2 _init() error 1", error);
- return (error);
- }
-
- ATRACE("amsrc2 _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in amsrc2 _fini()", 0);
-
- if ((error = mod_remove(&amsrc2_modlinkage)) != 0) {
- ATRACE_32("amsrc2 _fini() mod_remove failed", error);
- return (error);
- }
-
- ATRACE_32("amsrc2 _fini() successful", error);
-
- return (error);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&amsrc2_modlinkage, modinfop);
-
- ATRACE_32("amsrc2 _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * am_src2_adjust()
- *
- * Description:
- * This routine is used to adjust the number of hardware samples so we
- * know how many channel samples were converted.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int samples The number of hardware samples
- *
- * Returns:
- * >= 0 The number of channel samples
- * AUDIO_FAILURE Couldn't adjust the size
- */
-static int
-am_src2_adjust(srchdl_t handle, int dir, int samples)
-{
- am_src2_data_t *pptr;
- int value;
-
- ATRACE("in am_src2_adjust()", handle);
- ATRACE_32("am_src2_adjust() direction", dir);
- ATRACE_32("am_src2_adjust() samples", samples);
-
- /* Get the conversion info */
- if ((pptr = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_adjust() no pptr");
- return (AUDIO_FAILURE);
- }
-
- /* Do the math */
- mutex_enter(&pptr->src2_lock);
- ATRACE_32("am_src2_adjust() inFs", pptr->src2_inFs);
- ATRACE_32("am_src2_adjust() outFS", pptr->src2_outFs);
- value = (samples * pptr->src2_inFs) / pptr->src2_outFs;
- mutex_exit(&pptr->src2_lock);
-
- ATRACE_32("am_src2_adjust() returning", value);
-
- return (value);
-
-} /* am_src2_adjust() */
-
-/*
- * am_src2_convert()
- *
- * Description:
- * This routine manages the sample rate conversion process. It converts
- * from src2_inFs to src2_outFs. The input stream must be 16-bit Linear
- * PCM held as 32-bit integers.
- *
- * The returned pointer, if valid, must be one of the two passed in
- * pointers. Otherwise memory will become lost.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int channels The number of channels in conversion
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int *src Original data to convert
- * int *ptr1 Conversion buffer
- * int *ptr2 Conversion buffer (not used)
- * int *samples Pointer to the number of samples to
- * convert, and when we return, the number
- * of samples converted.
- *
- * Returns:
- * valid pointer Pointer to the converted audio stream
- * NULL Conversion failed
- */
-/*ARGSUSED*/
-static int *
-am_src2_convert(srchdl_t handle, int channels, int dir, int *src,
- int *ptr1, int *ptr2, int *samples)
-{
- am_src2_data_t *pdata;
- int converted;
-
- ATRACE("in am_src2_convert()", handle);
- ATRACE_32("am_src2_convert() direction", dir);
- ATRACE_32("am_src2_convert() channels", channels);
-
- /* Get the sample rate conversion data */
- if ((pdata = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_convert() no pdata");
- return (NULL);
- }
-
- mutex_enter(&pdata->src2_lock);
-
- /* Set conversion function depending on direction and channels */
- if (dir == AUDIO_PLAY) {
- if (channels == AUDIO_CHANNELS_MONO) {
- pdata->src2_resample = am_src2_up_m;
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- pdata->src2_resample = am_src2_up_s;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (channels == AUDIO_CHANNELS_MONO) {
- pdata->src2_resample = am_src2_dn_m;
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- pdata->src2_resample = am_src2_dn_s;
- }
-
- }
-
- /* Resample */
- converted = pdata->src2_resample(pdata, src, ptr1, *samples);
-
- ATRACE_32("am_src2_convert() final number converted", converted);
- ATRACE("am_src2_convert() final conversions returning", ptr1);
-
- *samples = converted;
-
- mutex_exit(&pdata->src2_lock);
-
- return (ptr1);
-
-} /* am_src2_convert() */
-
-/*
- * am_src2_exit()
- *
- * Description:
- * Free the private data structure allocated in am_src2_init()
- *
- * NOTE: We do NOT free the buffers used for sample rate conversion.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * void
- */
-static void
-am_src2_exit(srchdl_t handle, int dir)
-{
- am_src2_data_t *pdata;
-
- ATRACE_32("am_src2_exit() direction", dir);
-
- /* Get pointers, based on which direction we are going */
- pdata = (am_src2_data_t *)am_get_src_data(handle, dir);
-
- ATRACE("am_src2_exit() data", pdata);
-
- if (pdata == NULL) {
- ATRACE("am_src2_exit() done", pdata);
- return;
- }
-
- /* Get the mutex */
- mutex_enter(&pdata->src2_lock);
-
- /* Free memory for table pointers */
- if (dir == AUDIO_PLAY) {
- kmem_free((void *)pdata->src2_tables,
- sizeof (*pdata->src2_tables) * (AM_SRC2_CPZC + 1));
- }
-
- /* Release and destroy the mutex */
- mutex_exit(&pdata->src2_lock);
-
- mutex_destroy(&pdata->src2_lock);
-
- kmem_free(pdata, sizeof (*pdata));
-
- am_set_src_data(handle, dir, NULL);
-
- ATRACE("am_src2_exit() done", NULL);
-
-} /* am_src2_exit() */
-
-/*
- * am_src2_init()
- *
- * Description:
- * Allocate memory for the sample rate conversion private data
- * structure and initialize the mutex that guarantees we don't
- * mess with buffers and parameters in the middle of a conversion.
- * Because the current output sample depends on the current and
- * past input samples we require room to store past input samples.
- * Here we return the amount of extra room required in bytes.
- * We initialise all we can at this point in order to keep the
- * work required of am_src2_update() to a minimum.
- *
- * CAUTION: This routine may be called only once without calling
- * am_src2_exit(), otherwise we'll have a memory leak.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * size_t prebuffer Prebuffer memory requirement
- */
-static size_t
-am_src2_init(srchdl_t handle, int dir)
-{
- am_src2_data_t *pdata;
- size_t prebuffer;
- int i;
-
- ATRACE("in am_src2_init()", handle);
- ATRACE_32("am_src2_init() direction", dir);
-
- /* Allocate src data structure */
- pdata = kmem_zalloc(sizeof (*pdata), KM_SLEEP);
- ATRACE("am_src2_init() new src data structure", pdata);
-
- /* Set up mutex */
- mutex_init(&pdata->src2_lock, NULL, MUTEX_DRIVER, NULL);
-
- /* Get the mutex */
- mutex_enter(&pdata->src2_lock);
-
- if (dir == AUDIO_PLAY) {
- /* Scale for 32-bit ints */
- prebuffer = (AM_SRC2_PBUFFER << AM_SRC2_SHIFT2);
- pdata->src2_pbsize = AM_SRC2_PBUFFER;
- pdata->src2_i_index = (pdata->src2_pbsize >> AM_SRC2_SHIFT1);
- pdata->src2_delta_c = 0;
- pdata->src2_cover = 0;
- pdata->src2_tables = kmem_alloc(sizeof (*pdata->src2_tables) *
- (AM_SRC2_CPZC + 1), KM_SLEEP);
- for (i = 0; i < AM_SRC2_CPZC + 1; i++) {
- pdata->src2_tables[i] =
- &_amsrc2tables[i * AM_SRC2_COFFS];
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- /* Scale for 32-bit ints */
- prebuffer = (AM_SRC2_RBUFFER << AM_SRC2_SHIFT2);
- pdata->src2_pbsize = AM_SRC2_RBUFFER;
- pdata->src2_i_index = (pdata->src2_pbsize >> AM_SRC2_SHIFT1);
- pdata->src2_delta_c = 0;
- pdata->src2_delta_n = 0;
- pdata->src2_cover = 0;
- pdata->src2_table = _amsrc2table;
- }
-
- /* Set the data */
- am_set_src_data(handle, dir, pdata);
-
- /* Release the mutex */
- mutex_exit(&pdata->src2_lock);
-
- return (prebuffer);
-
-} /* am_src2_init() */
-
-/*
- * am_src2_size()
- *
- * Description:
- * Determine the size of a buffer, in bytes, needed to hold the number
- * of "samples" when they are converted. We adjust the size based on
- * the number of source hardware channels.
- *
- * NOTE: This size of the buffer is based on 32-bit per sample.
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * audio_prinfo_t *prinfo Ptr to the channel's information
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- * int samples The number of samples
- * int hw_channels Number of hardware channels
- *
- * Returns:
- * size The max # of bytes any sample rate conversion
- * step could need in buffer space
- * AUDIO_FAILURE Couldn't find this size
- */
-static size_t
-am_src2_size(srchdl_t handle, audio_prinfo_t *prinfo, int dir, int samples,
- int hw_channels)
-{
- am_src2_data_t *pdata;
- size_t size;
-
- ATRACE("in am_src2_size()", handle);
- ATRACE_32("am_src2_size() direction", dir);
- ATRACE_32("am_src2_size() samples", samples);
- ATRACE_32("am_src2_size() hw_channels", hw_channels);
-
- pdata = (am_src2_data_t *)am_get_src_data(handle, dir);
- if (pdata == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_size() no pdata");
- return ((size_t)AUDIO_FAILURE);
- }
-
- ASSERT(pdata);
-
- mutex_enter(&pdata->src2_lock);
- ASSERT(pdata->src2_inFs);
- ASSERT(pdata->src2_outFs);
- ATRACE_32("am_src2_size() inFs", pdata->src2_inFs);
- ATRACE_32("am_src2_size() outFs", pdata->src2_outFs);
-
- /* Round up to maximum frame size if any leftover */
- size = samples * pdata->src2_outFs;
- if (size % pdata->src2_inFs) {
- size /= pdata->src2_inFs;
- size++;
- } else {
- size /= pdata->src2_inFs;
- }
- if (size % AUDIO_CHANNELS_STEREO) {
- size++;
- }
-
- /* Scale for 32-bit ints */
- size <<= AM_SRC2_SHIFT2;
-
- /* Now adjust for the number of channels */
- if (dir == AUDIO_PLAY) {
- if (prinfo->channels < hw_channels) {
- size *= hw_channels;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (prinfo->channels > hw_channels) {
- size *= prinfo->channels;
- }
- }
-
- mutex_exit(&pdata->src2_lock);
-
- ATRACE_32("am_src2_size() returned size", size);
-
- return (size);
-
-} /* am_src2_size() */
-
-/*
- * am_src2_update()
- *
- * Description:
- * Initialise the sample rate conversion private data structure. Here
- * we (re-)initialise what we couldn't in am_src2_init().
- *
- * Arguments:
- * srchdl_t handle Mixer/src handle
- * audio_prinfo_t *ch_prinfo Ptr to the channel's information
- * audio_prinfo_t *hw_prinfo Ptr to the Codec's information
- * void *src_info Src information (not used)
- * int dir Direction, AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * AUDIO_SUCCESS Initialisation succeeded
- * AUDIO_FAILURE Initialisation failed
- */
-/*ARGSUSED*/
-static int
-am_src2_update(srchdl_t handle, audio_prinfo_t *ch_prinfo, audio_prinfo_t
- *hw_prinfo, void *src_info, int dir)
-{
- am_src2_data_t *pdata;
-
- ATRACE("in am_src2_update()", handle);
- ATRACE_32("am_src2_update() direction", dir);
- ATRACE("am_src2_update() ch_prinfo", ch_prinfo);
- ATRACE("am_src2_update() hw_prinfo", hw_prinfo);
-
- /* Get src data structure */
- if ((pdata = (am_src2_data_t *)am_get_src_data(handle, dir)) == NULL) {
- cmn_err(CE_WARN, "!amsrc2: src2_update() no pdata");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&pdata->src2_lock);
-
- ATRACE("am_src2_update() pdata", pdata);
-
- /*
- * Set direction dependent data. Note: we should probably do some
- * checking here to make sure sane samples rates are being used.
- * Not as strict as amsrc1 but there should be something.
- */
- if (dir == AUDIO_PLAY) {
- pdata->src2_inFs = ch_prinfo->sample_rate;
- pdata->src2_outFs = hw_prinfo->sample_rate;
- pdata->src2_csteps = ((pdata->src2_inFs << AM_SRC2_CPZC_SHIFT) /
- pdata->src2_outFs);
- pdata->src2_cmod = ((pdata->src2_inFs << AM_SRC2_CPZC_SHIFT) %
- pdata->src2_outFs);
- } else {
- ASSERT(dir == AUDIO_RECORD);
- pdata->src2_inFs = hw_prinfo->sample_rate;
- pdata->src2_outFs = ch_prinfo->sample_rate;
- pdata->src2_csteps = (pdata->src2_inFs * ch_prinfo->channels
- << AM_SRC2_CPZC_SHIFT) / pdata->src2_outFs;
- pdata->src2_cmod = ((pdata->src2_inFs * ch_prinfo->channels
- << AM_SRC2_CPZC_SHIFT) % pdata->src2_outFs);
- pdata->src2_tsteps = ((pdata->src2_outFs << AM_SRC2_CPZC_SHIFT)
- / pdata->src2_inFs);
- /*
- * Increment the filter step size if there is any left over.
- * Otherwise we can overrun the end of the input signal when
- * downsampling as the rounding errors accumulate.
- */
- if ((pdata->src2_outFs << AM_SRC2_CPZC_SHIFT)
- % pdata->src2_inFs) {
- pdata->src2_tsteps++;
- }
- }
-
- ATRACE("am_src2_update() ch_prinfo", ch_prinfo);
- ATRACE_32("am_src2_update() src2_inFs", pdata->src2_inFs);
- ATRACE_32("am_src2_update() src2_outFs", pdata->src2_outFs);
-
- mutex_exit(&pdata->src2_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_src2_update() */
-
-/*
- * am_src2_up_m()
- *
- * Description:
- * Carry out upsampling on a mono buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * >= 0 The number of samples after conversion
- */
-static int
-am_src2_up_m(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum; /* Output sample value */
- int k; /* Coefficient counter */
- int *t; /* Pointer into table */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int cmod;
- int cover;
- int csteps;
- int i_index;
- int delta_c;
- int **tables;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- cover = parms->src2_cover;
- tables = parms->src2_tables;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_up_m()", NULL);
- ATRACE_32("in am_src2_up_m() cmod", cmod);
- ATRACE_32("in am_src2_up_m() cover", cover);
- ATRACE_32("in am_src2_up_m() csteps", csteps);
- ATRACE_32("in am_src2_up_m() i_index", i_index);
- ATRACE_32("in am_src2_up_m() delta_c", delta_c);
- ATRACE_32("in am_src2_up_m() outFs", outFs);
- ATRACE_32("in am_src2_up_m() l_index", l_index);
- ATRACE_32("in am_src2_up_m() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient */
- c_index = AM_SRC2_CPZC - delta_c;
- t = tables[c_index];
-
- /* Starting sample */
- s_index = i_index + AM_SRC2_NZCS;
-
- /*
- * Calculate output sample. Note we work from right to left
- * starting with the rightmost sample and going backwards.
- * We do it this way so a while loop can be used for better
- * efficiency. This relies on the fact that t[0] is always
- * zero.
- */
- sum = 0;
- k = AM_SRC2_COFFS - 1;
- while (k) {
- sum += t[k--] * inbuf[s_index--];
- }
-
- /* Write out */
- outbuf[count++] = (sum >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_up_m() */
-
-/*
- * am_src2_up_s()
- *
- * Description:
- * Carry out upsampling on a stereo buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_up_s(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum_l; /* Output sample value */
- long long sum_r; /* Output sample value */
- int c; /* Coefficient value */
- int *t; /* Pointer into table */
- int k; /* Coefficient counter */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int cmod;
- int cover;
- int csteps;
- int i_index;
- int delta_c;
- int **tables;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- cover = parms->src2_cover;
- tables = parms->src2_tables;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_up_s()", NULL);
- ATRACE_32("in am_src2_up_s() cmod", cmod);
- ATRACE_32("in am_src2_up_s() cover", cover);
- ATRACE_32("in am_src2_up_s() csteps", csteps);
- ATRACE_32("in am_src2_up_s() i_index", i_index);
- ATRACE_32("in am_src2_up_s() delta_c", delta_c);
- ATRACE_32("in am_src2_up_s() outFs", outFs);
- ATRACE_32("in am_src2_up_s() l_index", l_index);
- ATRACE_32("in am_src2_up_s() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient */
- c_index = AM_SRC2_CPZC - delta_c;
- t = tables[c_index];
-
- /* Starting sample */
- s_index = i_index + (AM_SRC2_NZCS << AM_SRC2_SHIFT1) + 1;
-
- /*
- * Calculate output sample. Note we work from right to left
- * starting with the rightmost sample and going backwards.
- * We do it this way so a while loop can be used for better
- * efficiency. This relies on the fact that t[0] is always
- * zero.
- */
- sum_l = sum_r = 0;
- k = AM_SRC2_COFFS - 1;
- while (k) {
- c = t[k--];
- sum_r += c * inbuf[s_index--];
- sum_l += c * inbuf[s_index--];
- }
-
- /* Write out */
- outbuf[count++] = (sum_l >> AM_SRC2_COFF_SHIFT);
- outbuf[count++] = (sum_r >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- i_index += (i_index & AM_SRC2_STEREO_MASK);
- delta_c &= AM_SRC2_CPZC_MASK;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_up_s() */
-
-/*
- * am_src2_dn_m()
- *
- * Description:
- * Carry out downsampling on a mono buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_dn_m(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum; /* Output sample value */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int inFs;
- int cmod;
- int cover;
- int csteps;
- int tsteps;
- int *table;
- int i_index;
- int delta_c;
- int delta_n;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- table = parms->src2_table;
- cover = parms->src2_cover;
- tsteps = parms->src2_tsteps;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- delta_n = parms->src2_delta_n;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- inFs = parms->src2_inFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_dn_m()", NULL);
- ATRACE_32("in am_src2_dn_m() cmod", cmod);
- ATRACE_32("in am_src2_dn_m() cover", cover);
- ATRACE_32("in am_src2_dn_m() csteps", csteps);
- ATRACE_32("in am_src2_dn_m() tsteps", tsteps);
- ATRACE_32("in am_src2_dn_m() i_index", i_index);
- ATRACE_32("in am_src2_dn_m() delta_c", delta_c);
- ATRACE_32("in am_src2_dn_m() delta_n", delta_n);
- ATRACE_32("in am_src2_dn_m() outFs", outFs);
- ATRACE_32("in am_src2_dn_m() inFs", inFs);
- ATRACE_32("in am_src2_dn_m() l_index", l_index);
- ATRACE_32("in am_src2_dn_m() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient and sample */
- c_index = AM_SRC2_MIDDLE - delta_n;
- s_index = i_index - ((c_index - AM_SRC2_START) / tsteps);
- c_index -= tsteps * ((c_index - AM_SRC2_START) / tsteps);
-
- /* Calculate output sample */
- sum = 0;
- while (c_index <= AM_SRC2_END) {
- sum += (table[c_index] * inbuf[s_index++]);
- c_index += tsteps;
- }
-
- /* Write out */
- outbuf[count++] = ((sum * outFs / inFs) >> AM_SRC2_COFF_SHIFT);
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- delta_n = delta_c * outFs / inFs;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_delta_n = delta_n;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_dn_m() */
-
-/*
- * am_src2_dn_s()
- *
- * Description:
- * Carry out downsampling on a stereo buffer.
- *
- * Arguments:
- * am_src2_data_t *parms Conversion parameters structure
- * int inbuf The input buffer to convert
- * int outbuf The converted audio buffer
- * int samples The number of samples to convert
- *
- * Returns:
- * > 0 The number of samples after conversion
- */
-static int
-am_src2_dn_s(am_src2_data_t *parms, int *inbuf, int *outbuf, int samples)
-{
- long long sum_l; /* Output sample value */
- long long sum_r; /* Output sample value */
- int c; /* Coefficient value */
- int count; /* Output sample counter */
- int s_index; /* Input sample index */
- int l_index; /* Last sample index */
- int c_index; /* Starting coefficient index */
- int rounding; /* For rounding to nearest index */
- int outFs; /* Local copies of variables */
- int inFs;
- int cmod;
- int cover;
- int csteps;
- int *table;
- int tsteps;
- int i_index;
- int delta_c;
- int delta_n;
-
- /* Initialise */
- count = 0;
- cmod = parms->src2_cmod;
- table = parms->src2_table;
- cover = parms->src2_cover;
- tsteps = parms->src2_tsteps;
- csteps = parms->src2_csteps;
- i_index = parms->src2_i_index;
- delta_c = parms->src2_delta_c;
- delta_n = parms->src2_delta_n;
- i_index += (parms->src2_pbsize >> AM_SRC2_SHIFT1);
- outFs = parms->src2_outFs;
- inFs = parms->src2_inFs;
- l_index = samples + (parms->src2_pbsize >> AM_SRC2_SHIFT1);
-
- ATRACE("in am_src2_dn_s()", NULL);
- ATRACE_32("in am_src2_dn_s() cmod", cmod);
- ATRACE_32("in am_src2_dn_s() cover", cover);
- ATRACE_32("in am_src2_dn_s() csteps", csteps);
- ATRACE_32("in am_src2_dn_s() tsteps", tsteps);
- ATRACE_32("in am_src2_dn_s() i_index", i_index);
- ATRACE_32("in am_src2_dn_s() delta_c", delta_c);
- ATRACE_32("in am_src2_dn_s() delta_n", delta_n);
- ATRACE_32("in am_src2_dn_s() outFs", outFs);
- ATRACE_32("in am_src2_dn_s() inFs", inFs);
- ATRACE_32("in am_src2_dn_s() l_index", l_index);
- ATRACE_32("in am_src2_dn_s() samples", samples);
-
- /* Continue until the end */
- while (i_index < l_index) {
-
- /* Starting coefficient and sample */
- c_index = AM_SRC2_MIDDLE - delta_n;
- s_index = i_index - (i_index & AM_SRC2_STEREO_MASK);
- s_index -= (((c_index - AM_SRC2_START) / tsteps) <<
- AM_SRC2_SHIFT1);
- c_index -= tsteps * ((c_index - AM_SRC2_START) / tsteps);
-
- sum_l = sum_r = 0;
- while (c_index <= AM_SRC2_END) {
- c = table[c_index];
- sum_l += c * inbuf[s_index++];
- sum_r += c * inbuf[s_index++];
- c_index += tsteps;
- }
-
- /* Write out */
- outbuf[count++] = (sum_l * outFs / inFs) >> AM_SRC2_COFF_SHIFT;
- outbuf[count++] = (sum_r * outFs / inFs) >> AM_SRC2_COFF_SHIFT;
-
- /* Increment counters and pointers */
- cover += cmod;
- rounding = (cover << AM_SRC2_SHIFT1) / outFs;
- cover -= rounding * outFs;
- delta_c += rounding + csteps;
- i_index += (delta_c >> AM_SRC2_CPZC_SHIFT);
- delta_c &= AM_SRC2_CPZC_MASK;
- delta_n = ((i_index & AM_SRC2_STEREO_MASK) <<
- (AM_SRC2_CPZC_SHIFT - 1)) + (delta_c >> AM_SRC2_SHIFT1);
- delta_n = delta_n * outFs / inFs;
- }
-
- /* Put back */
- parms->src2_i_index = i_index - l_index;
- parms->src2_delta_c = delta_c;
- parms->src2_delta_n = delta_n;
- parms->src2_cover = cover;
-
- /* Copy to front */
- bcopy(&inbuf[samples], inbuf, parms->src2_pbsize * sizeof (*inbuf));
-
- return (count);
-
-} /* am_src2_dn_s() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/README b/usr/src/uts/common/io/audio/sada/drv/audio810/README
deleted file mode 100644
index c3cfcd773d..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/README
+++ /dev/null
@@ -1,383 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# Design Document for Metropolis (Amd8111/ALC655) Audio Driver
-
-1. Technical overview
-
-SADA (Solaris audio driver architecture) is the native audio framework of
-Solaris. It supports quickly writing new STREAMS audio drivers by providing
-a number of library modules. There are two types of library modules, the
-audio support module and audio personality modules. The unique audio support
-module provides driver instance, buffer and state management routines. Audio
-personality modules implement the semantics of the device interface. The mixer
-module, as a personality module, implements the semantics of the audio(7I) and
-mixer(7I) man pages. And the another personality module, amsrc2, provides the
-sample rate conversion for mixer. So a SADA driver with mixer function would
-communicate with audio support module, mixer module, and amsrc2 module or
-another conversion module.
-
-
-1.1 Audio support module
-
-The audio support module provides a number of common routines for managing the
-instances and state information for the audio driver. Audio drivers that don't
-need special open(), close(), put(), svc(), and getinfo() routines set their
-qinit and dev_ops data structures as follows:
-
- /* read queue */
- static struct qinit xx_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &xx_modinfo, /* module parameters */
- NULL /* module statistics */
- };
-
- /* write queue */
- static struct qinit xx_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &xx_modinfo, /* module parameters */
- NULL /* module statistics */
- };
-
- /* Device operations structure */
- static struct dev_ops audiots_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio_sup_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- xx_attach, /* devo_attach */
- xx_detach, /* devo_detach */
- nodev, /* devo_reset */
- &xx_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- xx_power /* devo_power */
- };
-
-
- The audio support module manages the device minor nodes for each
- instance of an audio device. Minor nodes are mapped as follows
-
- 0 AUDIO /dev/audio, /dev/sound/?
- 1 AUDIOCTL /dev/audioctl, /dev/sound/?ctl
- 2 WTABLE future wave table synthesizer
- 3 MIDI future hardware MIDI ports
- 4 ATIME future audio timer, probably something like
- SMPTE, which is used to sync audio and video,
- there are a lot of MIDI devices that also
- provide SMPTE information
- 5 - 7 unassigned
- 8 USER1 available for any use
- 9 USER2 available for any use
- 10 USER3 available for any use
-
- 11 - 127 used when the open is cloned
-
- For example, if an app opens /dev/audio that means that minor node 0
- was opened. audiosup sees this and knows that it needs to call
- am_open() in the mixer, which it does. am_open() enforces the open()
- semantics for /dev/audio. Assuming all is legal it checks looks for
- the first clone minor node that isn't being used. It then constructs
- a new device number based on this new minor number and this is
- returned to the kernel. Thus when open() returns you have a cloned
- node. Since the mixer doesn't make the node you don't see an entry
- in /devices, it is invisible.
-
- The number of minor numbers at the beginning is tunable, as is the
- total minor numbers per instance.
-
-
-1.2 Audio Mixer Module
-
- The mixer implements the semantics of the audio(7I) and mixer(7I)
- man pages. Doing so it is the module that provides /dev/audio(ctl).
-
- The mixer supports two modes of operation, mixer on and mixer off.
- When the mixer is off it supports the audio(7I) semantics and just
- a few new ioctl()s from mixer(7I). Essentially it enforces only one
- play and one record stream. Also, the audioctl devices represents
- the hardware.
-
- When the mixer is enabled it takes an audio stream, converts it to
- 32 bit signed linear PCM and saves this converted data as well as
- the original data. When the audio driver needs audio to play the
- mixer scans all clone channels looking for AUDIO play channels. When
- one is found the audio data is retrieved and summed. When all audio
- data is summed it is clipped and converted to the format that the
- audio device is programmed to use. All semantics of audio(7I) and
- mixer(7I) are available. One of the biggest differences is that
- the audioctl channel may now represent either the audio device or the
- clone channel. The rules for this is very complicated and are
- explained elsewhere.
-
- The mixer also supports record, which is essentially the play in
- reverse. The biggest difference is that record doesn't save any
- messages. As for play, the mixer may be on or off. If off then the
- recorded audio is passed straight to the application. If on then
- the mixer scans all clone channels looking for AUDIO record channels.
- When one is found the audio is converted to the right format and
- sent to the application. For both mixer modes the recorded audio is
- queued up in a buffer before it is sent to the application. The size
- of this buffer is set by the record buffer size.
-
-1.3 Amsrc Module
-
- This is the sample rate converted that the mixer uses when the mixer
- is enabled. Currently there are just two sample rate converter modules.
- However the mixer supports the audio driver author providing his/her
- own. This can be for performance or audio quality reasons. In this
- project we use the amsrc2 module.
-
-
-2. Hardware Configuration
-
- This driver is for the low end audio configuration of Metropols
- workstation. This configuration consists of two components, controller
- and codec. The controller is integrated in the southbridge, amd8111, as
- a function of amd8111. And the ALC655 codec is an AC97 2.3 compatible
- codec. It is a 16-bit full-duplex six-channel audio codec with fixed
- 48khz sampling rate.
-
-
-3. Software Environment
-
- Because SADA framework supports only mono/stereo at most, which means
- SADA does not support multi-channel(3, 4, 6 channel), this driver cannot
- support multi-channel unless we modify SADA framework. We plan to use
- Solaris 10&9 as the target operating system for the driver.
-
-
-4. The features/functions
-
- The driver will be placed in /kernel/drv. Like other audio drivers,
- the driver can be added/removed by users via "add_drv/rem_drv" tools.
-
-5. The source code structure
-
- The driver consists of three files, audio810.c, audio810_impl.h and
- audio810.h. The audio810.c is the C source file which contains all
- the C codes of the driver. The audio810.h is the header file containing
- only some baud rate definitions. The audio810_impl.h also a header file
- which contains hardware specific information, such as data structures.
-
- In audio810.c file, we implement the entry functions defined by mixer
- module as follows:
-
- 1) audio810_ad_set_config, /* ad_set_config() */
- 2) audio810_ad_set_format, /* ad_set_format() */
- 3) audio810_ad_start_play, /* ad_start_play() */
- 4) audio810_ad_pause_play, /* ad_pause_play() */
- 5) audio810_ad_stop_play, /* ad_stop_play() */
- 6) audio810_ad_start_record, /* ad_start_record() */
- 7) audio810_ad_stop_record, /* ad_stop_record() */
-
-6. The implementations
- In this section, we describe the design of the driver in detail.
-
-6.1 Main data structure
-
-6.1.1 Buffer descriptor list
- According to the datasheet of amd8111, the buffer descriptor list
- (BDL) allows device drivers to program DMA transfer using by the
- audio controller. The BDL is an array of up to 32 entry, each of
- which describes a data buffer. So we define the BDL entry structure
- as follows:
-
- struct i810_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t reserved:14;
- uint8_t cmd_bup:1; /* interrupt if underflows */
- uint8_t cmd_ioc:1; /* interrupt if completing this entry */
- };
-
- AMD8111 audio function has separated DMA engine for PCM in/out, so
- we must set the two BDLs. For simplification, we allocate continuous
- DMA memory for all BDLs, and define the BDL as follows,
-
- struct i810_bd_list {
- i810_bd_entry_t pcm_in[I810_BD_NUMS];
- i810_bd_entry_t pcm_out[I810_BD_NUMS];
- };
-
-
-6.1.2 Data buffer for BDL entry
-
- For simplification, we allocate DMA buffer for each BDL entry.
-
- struct i810_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- caddr_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
- };
-
-
-6.1.3 Sample buffer
-
- struct i810_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- i810_bdlist_chunk_t chunk[2]; /* 2 chunks for each buffers */
- };
-
-
-6.1.4 Soft state
-
- Every instance of the hardware should have a soft state to save
- instance-wide data in it.
-
- struct audio810_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audio810_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64]; /* shadow of AC97 registers */
-
- boolean_t var_sr; /* variable sample rate ? */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- ddi_acc_handle_t bm_regs_handle; /* for bus master register */
- caddr_t am_regs_base; /* base of audio mixer regs */
- caddr_t bm_regs_base; /* base of bus master regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- i810_bd_list_t *bdl_virtual; /* virtual address of BDL */
- i810_bd_list_t *bdl_phys; /* Physical address of BDL */
- size_t bdl_size; /* real len of BDL */
-
- i810_sample_buf_t play_buf; /* buffer for playback */
- i810_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t i810_defaults; /* default state for dev */
- audio_device_t i810_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *i810_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t i810_psample_rate; /* play sample rate */
- uint_t i810_pchannels; /* play channels */
- uint_t i810_pprecision; /* play precision */
- uint_t i810_csample_rate; /* record sample rate */
- uint_t i810_cchannels; /* record channels */
- uint_t i810_cprecision; /* record precision */
- uint_t i810_output_port; /* current out port */
- uint_t i810_input_port; /* current input port */
- uint_t i810_monitor_gain; /* monitor gain */
- int i810_csamples; /* pcm-in samples/interrupt */
- int i810_psamples; /* pcm-out samples/intr */
-
- uint32_t i810_res_flags; /* resource flags */
- };
-
-6.2 Interrupt handler
-
- We use the BD list (buffer descriptor list) as a round-robin FIFO.
- Both the software and hardware loop around the BD list. For playback,
- the software writes to the buffers pointed by the BD entries of BD
- list, and the hardware sends the data in the buffers out. For record,
- the process is reversed. The structure i810_sample_buf (Refer to 6.1.3)
- is defined for the sample buffer. This structure has two chunks(data
- buffers). The software uses the head, tail and avail fields of this
- structure to manipulate the FIFO. Head field indicates the first valid
- BD hardware can manipulate, and tail indicates the BD after the last
- valid BD, avail indicates how many buffers (chunks) are available.
- There're also two hardware registers to index the FIFO, the CIV (current
- index value) indicates the current BD the hardware is transferring, the
- LVI (last valid index) indicates the last valid BD that contains proper
- data, which the hardware should not pass over. Each time a BD is
- processed, the hardware will update the CIV (plus 1), and issue an
- interrupt if the cmd_ioc field of this processed BD entry is set. If
- the system is busy, there can be more than one BD to be processed when
- the OS has chance to handle the interrupt. Except for the initialization
- at the beginning of playback/record, the driver do not modify the
- content of CIV register.
-
-
- CIV=3 LVI=3 (CIV is updated by hardware)
- ----------------------------------------------------------------
- 0 1 2 3 31
- ----------------------------------------------------------------
- head=2 --> (reclaim, from head to CIV)
- tail=3 --> (fill, from tail to head)
-
- (a) before reclaiming
-
-
- CIV=3 LVI=3
- ----------------------------------------------------------------
- 0 1 2 3 31
- ----------------------------------------------------------------
- head=3 --> (reclaim, from head to CIV)
- tail=3 --> (fill, from tail to head)
-
- (b) after reclaiming/before filling
-
-
- CIV=3 LVI=5(LVI is updated by software)
- ----------------------------------------------------------------
- 0 1 2 3 4 5 31
- ----------------------------------------------------------------
- head=3 --> (reclaim, from head to CIV)
- tail=5 --> (fill, from tail to head)
-
- (c) after filling
-
- Fig 1. Interrupt handler(one pass)
-
- Note:
- Here, we use only two BDs at any time, so when we "fill" BD,
- we can't "fill" all BDs from tail to head.
- tail - head <=2 , when tail>=head;
- tail + 32 - head <=2, when tail<head;
-
- Now, let us explain what the interrupt handler does. It will first
- reclaim the BD(s) which had been transferred, which ranges from
- "head" to (CIV - 1). This job is done in the routine
- audio810_reclaim_play_buf(...). Then it invokes audio810_fill_play_buf
- (...), fills audio samples into buffers pointed by the available BDs
- beginning from "tail", updates the LVI to to the last processed BD
- and update tail to LVI + 1, and update the avail to 0. we use 2 buffers
- and let the 0, 2, 4, 6, ..., 28, 30 BDs pointing to the first buffer,
- let the 1, 3, 5, ..., 29, 31 BDs pointing to the second buffer, so the
- hardware and software will manipulate the two buffer in turn.
diff --git a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c b/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c
deleted file mode 100644
index 815d48c2e5..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audio810/audio810.c
+++ /dev/null
@@ -1,3490 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audio810 Audio Driver
- *
- * The driver is primarily targeted at providing audio support for
- * the W1100z and W2100z systems, which use the AMD 8111 audio core
- * and the Realtek ALC 655 codec. The ALC 655 chip supports only
- * fixed 48k sample rate. However, the audio core of AMD 8111 is
- * completely compatible to the Intel ICHx chips (Intel 8x0 chipsets),
- * so the driver can work for the ICHx. In order to support more
- * chipsets, the driver supports variable sample rates, rather than
- * fixed 48k, but it does not support the rates below 8k because some
- * codec chips do not support the sample rates in that scope. Therefore
- * the option of loading the driver in compat mode through the .conf
- * file on the W1100z and W2100z systems is not supported and the
- * "mixer-mode" property has been removed from that file.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The AMD 8111 audio core, as an AC'97 controller, has independent
- * channels for PCM in, PCM out, mic in, modem in, and modem out.
- * The AC'97 controller is a PCI bus master with scatter/gather
- * support. Each channel has a DMA engine. Currently, we use only
- * the PCM in and PCM out channels. Each DMA engine uses one buffer
- * descriptor list. And the buffer descriptor list is an array of up
- * to 32 entries, each of which describes a data buffer. Each entry
- * contains a pointer to a data buffer, control bits, and the length
- * of the buffer being pointed to, where the length is expressed as
- * the number of samples. This, combined with the 16-bit sample size,
- * gives the actual physical length of the buffer.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, i810_sample_buf,
- * to handle BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. There're also two hardware registers to index
- * the FIFO, the CIV (current index value) indicating the current BD the
- * hardware is transferring, and the LVI (last valid index) indicating
- * the last valid BD that contains proper data which the hardware should
- * not pass over. Each time a BD is processed, the hardware will issue an
- * interrupt. If the system is busy, there can be more than one BD to be
- * processed when the OS have chance to handle the interrupt. When an
- * interrupt generated, the interrupt handler will first reclaim the BD(s)
- * which had been transferred, which will be the limit [head, CIV-1], then
- * update the value of the head field to CIV, update the value of avail to
- * CIV - head. And then it will process avail BDs from tail, and set the
- * LVI to the last processed BD and update tail to LVI + 1, and update the
- * avail to 0.
- *
- * We allocate only 2 blocks of DMA memory, say A and B, for every DMA
- * engine, and bind the first, Block A, to the even entries of BDL,
- * while bind the second to the odd entries. That's say, for each buffer
- * descriptor list of DMA engine, entry 0, 2,,, 30 would be bound to Block
- * A, and entry 1, 3,,, 31 would be bound to Block B. Take the playback as
- * an example. At the beginning of playback, we set the entry 0 and 1 to
- * point to block A and B separately, and tell the DMA engine that the last
- * valid entry is entry 1. So the DMA engine doesn't access the entries after
- * entry 1. When the first playback interrupt generated, we reclaim entry
- * 0, and fill the BD entry 2 with the address of Block A, then set the
- * entry 2 to be the last valid entry, and so on. So at any time there are
- * at most two entries available for per DMA engine.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audio810_chip_init()
- *
- * A workaround for the AD1980 and AD1985 codec:
- * Most vendors connect the surr-out of the codecs to the line-out jack.
- * So far we haven't found which vendors don't do that. So we assume that
- * all vendors swap the surr-out and the line-out outputs. So we need swap
- * the two outputs. But we still internally process the
- * "ad198x-swap-output" property. If someday some vendors do not swap the
- * outputs, we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audio810.conf file, and unload and reload the audio810
- * driver (or reboot).
- *
- * System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audio810_impl.h>
-#include <sys/audio/audio810.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audio810_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audio810_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audio810_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audio810_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audio810_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audio810_ad_start_play(audiohdl_t, int);
-static void audio810_ad_pause_play(audiohdl_t, int);
-static void audio810_ad_stop_play(audiohdl_t, int);
-static int audio810_ad_start_record(audiohdl_t, int);
-static void audio810_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audio810_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static void audio810_set_busy(audio810_state_t *);
-static void audio810_set_idle(audio810_state_t *);
-static int audio810_codec_sync(audio810_state_t *);
-static int audio810_write_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_read_ac97(audio810_state_t *, int, uint16_t *);
-static int audio810_and_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_or_ac97(audio810_state_t *, int, uint16_t);
-static int audio810_reset_ac97(audio810_state_t *);
-static int audio810_init_state(audio810_state_t *, dev_info_t *);
-static int audio810_map_regs(dev_info_t *, audio810_state_t *);
-static void audio810_unmap_regs(audio810_state_t *);
-static int audio810_alloc_sample_buf(audio810_state_t *, int, int);
-static void audio810_free_sample_buf(audio810_state_t *, i810_sample_buf_t *);
-static void audio810_stop_dma(audio810_state_t *);
-static int audio810_chip_init(audio810_state_t *, int);
-static int audio810_fill_play_buf(audio810_state_t *);
-static int audio810_prepare_record_buf(audio810_state_t *);
-static void audio810_reclaim_play_buf(audio810_state_t *);
-static void audio810_reclaim_record_buf(audio810_state_t *);
-static int audio810_set_gain(audio810_state_t *, int, int, int);
-static int audio810_set_port(audio810_state_t *, int, int);
-static int audio810_set_monitor_gain(audio810_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audio810_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audio810_name = I810_NAME;
-
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audio810_modinfo = {
- I810_IDNUM, /* module ID number */
- I810_NAME, /* module name */
- I810_MINPACKET, /* minimum packet size */
- I810_MAXPACKET, /* maximum packet size */
- I810_HIWATER, /* high water mark */
- I810_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audio810_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audio810_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audio810_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audio810_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audio810_str_info = {
- &audio810_rqueue, /* read queue */
- &audio810_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audio810_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audio810_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audio810_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio810_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audio810_attach, /* devo_attach */
- audio810_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audio810_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audio810_modldrv = {
- &mod_driverops, /* drv_modops */
- I810_MOD_NAME, /* drv_linkinfo */
- &audio810_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audio810_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audio810_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audio810_mixer_srs[] = {
- I810_SAMPR5510, I810_SAMPR48000, 0
-};
-
-static uint_t audio810_min_compat_srs[] = {
- I810_SAMPR48000, 0
-};
-
-static uint_t audio810_compat_srs [] = {
- I810_SAMPR8000, I810_SAMPR9600, I810_SAMPR11025,
- I810_SAMPR16000, I810_SAMPR18900, I810_SAMPR22050,
- I810_SAMPR27420, I810_SAMPR32000, I810_SAMPR33075,
- I810_SAMPR37800, I810_SAMPR44100, I810_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audio810_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audio810_mixer_srs
-};
-
-static am_ad_sample_rates_t audio810_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio810_compat_srs
-};
-
-/* Some codec, such as the ALC 655, only support 48K sample rate */
-static am_ad_sample_rates_t audio810_min_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio810_min_compat_srs
-};
-
-/* now, only support stereo */
-static uint_t audio810_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-
-static am_ad_cap_comb_t audio810_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0000ffff, /* count_max */
- 8, /* align, BDL must be aligned on a 8-byte boundary */
- 0x3c, /* burstsize */
- 8, /* minxfer, set to the size of a BDlist entry */
- 0x0000ffff, /* maxxfer */
- 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
- 1, /* sgllen, there's no scatter-gather list */
- 8, /* granular, set to the value of minxfer */
- 0 /* flags, use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0001fffe, /* count_max */
- 2, /* align, data buffer is aligned on a 2-byte boundary */
- 0x3c, /* burstsize */
- 4, /* minxfer, set to the size of a sample data */
- 0x0001ffff, /* maxxfer */
- 0x0001ffff, /* seg */
- 1, /* sgllen, no scatter-gather */
- 4, /* granular, set to the value of minxfer */
- 0, /* flags, use virtual address */
-};
-
-static am_ad_entry_t audio810_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audio810_ad_set_config, /* ad_set_config() */
- audio810_ad_set_format, /* ad_set_format() */
- audio810_ad_start_play, /* ad_start_play() */
- audio810_ad_pause_play, /* ad_pause_play() */
- audio810_ad_stop_play, /* ad_stop_play() */
- audio810_ad_start_record, /* ad_start_record() */
- audio810_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audio810 _init()", NULL);
-
- if ((error = ddi_soft_state_init(&audio810_statep,
- sizeof (audio810_state_t), 1)) != 0) {
- ATRACE("i810 ddi_soft_state_init() failed", audio810_statep);
- return (error);
- }
-
- if ((error = mod_install(&audio810_modlinkage)) != 0) {
- ddi_soft_state_fini(&audio810_statep);
- }
-
- ATRACE("audio810 _init() audio810_statep", audio810_statep);
- ATRACE("audio810 _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audio810 _fini()", audio810_statep);
-
- if ((error = mod_remove(&audio810_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audio810_statep);
-
- ATRACE_32("audio810 _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audio810 _info()", NULL);
-
- error = mod_info(&audio810_modlinkage, modinfop);
-
- ATRACE_32("audio810 _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audio810_getinfo()
- */
-static int
-audio810_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audio810_state_t *state;
- int instance;
- int error;
-
- error = DDI_FAILURE;
- ATRACE("in audio810_getinfo()", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audio810_statep,
- instance)) != NULL) {
- *result = state->dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void*)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- return (error);
-
-} /* audio810_getinfo() */
-
-/*
- * audio810_attach()
- *
- * Description:
- * Attach an instance of the audio810 driver. This routine does the
- * device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audio810_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- int instance;
- uint16_t cmdreg;
- audio810_state_t *statep;
- audio_sup_reg_data_t data;
-
- ATRACE("in audio810_attach()", dip);
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audio810_attach() audio810_statep", audio810_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("I810_attach() DDI_RESUME", NULL);
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!attach() DDI_RESUME get soft state failed");
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == statep->dip);
-
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_SUSPENDED);
-
- statep->i810_suspended = I810_NOT_SUSPENDED;
-
- /* Restore the audio810 chip's state */
- if (audio810_chip_init(statep, I810_INIT_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() DDI_RESUME failed to init chip");
- mutex_exit(&statep->inst_lock);
- return (DDI_FAILURE);
- }
-
- mutex_exit(&statep->inst_lock);
-
- /* Resume playing and recording, if required */
- if (audio_sup_restore_state(statep->audio_handle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() DDI_RESUME audio restart failed");
- }
-
- mutex_enter(&statep->inst_lock);
- cv_broadcast(&statep->i810_cv); /* let entry points continue */
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_attach() DDI_RESUME done", NULL);
-
- return (DDI_SUCCESS);
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x",
- audio810_name, instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in the driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unsupported high level interrupt",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audio810_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state failed",
- audio810_name, instance);
- goto error_state;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->audio_handle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failed",
- audio810_name, instance);
- goto error_state;
- }
-
- /* save private state */
- audio_sup_set_private(statep->audio_handle, statep);
-
- if ((audio810_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audio810_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_destroy;
- }
-
- /* set PCI command register */
- cmdreg = pci_config_get16(statep->pci_conf_handle, PCI_CONF_COMM);
- pci_config_put16(statep->pci_conf_handle, PCI_CONF_COMM,
- cmdreg | PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
-
- if ((audio810_alloc_sample_buf(statep, I810_DMA_PCM_OUT,
- statep->play_buf_size) == AUDIO_FAILURE) ||
- (audio810_alloc_sample_buf(statep, I810_DMA_PCM_IN,
- statep->record_buf_size) == AUDIO_FAILURE)) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() couldn't allocate sample buffers");
- goto error_unmap;
- }
-
- /* initialize audio controller and AC97 codec */
- if (audio810_chip_init(statep, I810_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() failed to init chip");
- goto error_dealloc;
- }
-
- /* call the mixer attach() routine */
- if (am_attach(statep->audio_handle, cmd, &statep->ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() am_attach() failed");
- goto error_dealloc;
- }
-
- /* set up kernel statistics */
- if ((statep->i810_ksp = kstat_create(I810_NAME, instance,
- I810_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->i810_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, &statep->intr_iblock,
- (ddi_idevice_cookie_t *)NULL, audio810_intr, (caddr_t)statep) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!attach() bad interrupt specification ");
- goto error_kstat;
- }
- ddi_report_dev(dip);
-
- return (DDI_SUCCESS);
-
-error_kstat:
- if (statep->i810_ksp) {
- kstat_delete(statep->i810_ksp);
- }
- (void) am_detach(statep->audio_handle, DDI_DETACH);
-
-error_dealloc:
- audio810_free_sample_buf(statep, &statep->play_buf);
- audio810_free_sample_buf(statep, &statep->record_buf);
-
-error_unmap:
- audio810_unmap_regs(statep);
-
-error_destroy:
- ATRACE("audio810_attach() error_destroy", statep);
- mutex_destroy(&statep->inst_lock);
- cv_destroy(&statep->i810_cv);
-
-error_audiosup:
- ATRACE("audio810_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->audio_handle);
-
-error_state:
- ATRACE("audio810_attach() error_state", statep);
- ddi_soft_state_free(audio810_statep, instance);
-
- ATRACE("audio810_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audio810_attach() */
-
-/*
- * audio810_detach()
- *
- * Description:
- * Detach an instance of the audio810 driver. After the Codec is detached
- * we call am_detach() and audio_sup_register() so they may do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audio810_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audio810_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE_32("audio810_detach() instance", instance);
- ATRACE("audio810_detach() audio810_statep", audio810_statep);
-
- if ((statep = ddi_get_soft_state(audio810_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed",
- audio810_name, instance);
- return (DDI_FAILURE);
- }
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("i810_detach() SUSPEND", statep);
-
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_NOT_SUSPENDED);
-
- statep->i810_suspended = I810_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (statep->i810_busy_cnt != 0)
- cv_wait(&statep->i810_cv, &statep->inst_lock);
-
- /* stop DMA engines */
- audio810_stop_dma(statep);
-
- if (audio_sup_save_state(statep->audio_handle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!detach() DDI_SUSPEND audio save failed");
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_detach() DDI_SUSPEND successful", statep);
-
- return (DDI_SUCCESS);
- default:
- ATRACE("i810_detach() unknown command", cmd);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!detach() unknown command: 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- /* stop DMA engines */
- mutex_enter(&statep->inst_lock);
- audio810_stop_dma(statep);
- mutex_exit(&statep->inst_lock);
-
- /* remove the interrupt handler */
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
- /* free DMA memory */
- audio810_free_sample_buf(statep, &statep->play_buf);
- audio810_free_sample_buf(statep, &statep->record_buf);
-
- /* free the kernel statistics structure */
- if (statep->i810_ksp) {
- kstat_delete(statep->i810_ksp);
- }
-
- /* detach audio mixer */
- (void) am_detach(statep->audio_handle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->audio_handle);
-
- mutex_destroy(&statep->inst_lock);
- cv_destroy(&statep->i810_cv);
-
- audio810_unmap_regs(statep);
-
- ddi_soft_state_free(audio810_statep, instance);
-
- return (DDI_SUCCESS);
-
-} /* audio810_detach */
-
-/*
- * audio810_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * Each of buffer descriptor has a field IOC(interrupt on completion)
- * When both this and the IOC bit of correspondent dma control register
- * is set, it means that the controller should issue an interrupt upon
- * completion of this buffer.
- * (AMD 8111 hypertransport I/O hub data sheet. 3.8.3 page 71)
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audio810_intr(caddr_t arg)
-{
- audio810_state_t *statep;
- uint16_t gsr;
-
- statep = (audio810_state_t *)arg;
- mutex_enter(&statep->inst_lock);
-
- if (statep->i810_suspended == I810_SUSPENDED) {
- ATRACE("audio810_intr() device suspended", NULL);
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- gsr = I810_BM_GET32(I810_REG_GSR);
-
- /* check if device is interrupting */
- if ((gsr & I810_GSR_USE_INTR) == 0) {
- ATRACE_32("audio810_intr() not our interrupt", gsr);
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* PCM in interrupt */
- if (gsr & I810_GSR_INTR_PIN) {
- I810_BM_PUT8(I810_PCM_IN_SR,
- I810_BM_SR_LVBCI |
- I810_BM_SR_BCIS |
- I810_BM_SR_FIFOE);
-
- if (statep->flags & I810_DMA_RECD_STARTED) {
- audio810_reclaim_record_buf(statep);
- (void) audio810_prepare_record_buf(statep);
- }
- }
-
- /* PCM out interrupt */
- if (gsr & I810_GSR_INTR_POUT) {
- I810_BM_PUT8(I810_PCM_OUT_SR,
- I810_BM_SR_LVBCI |
- I810_BM_SR_BCIS |
- I810_BM_SR_FIFOE);
-
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- audio810_reclaim_play_buf(statep);
- (void) audio810_fill_play_buf(statep);
- }
- }
-
- /* update the kernel interrupt statistics */
- if (statep->i810_ksp) {
- I810_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audio810_intr() */
-
-/*
- * audio810_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended. It will also block any routine
- * while a suspend is going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_set_busy(audio810_state_t *statep)
-{
- ATRACE("in audio810_set_busy()", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&statep->inst_lock);
-
- /* block if we are suspended */
- while (statep->i810_suspended == I810_SUSPENDED) {
- cv_wait(&statep->i810_cv, &statep->inst_lock);
- }
-
- /*
- * Okay, we aren't suspended, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(statep->i810_busy_cnt >= 0);
- statep->i810_busy_cnt++;
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_set_busy() done", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
-} /* audio810_set_busy() */
-
-/*
- * audio810_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_set_idle(audio810_state_t *statep)
-{
- ATRACE("in audio810_set_idle()", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&statep->inst_lock);
-
- ASSERT(statep->i810_suspended == I810_NOT_SUSPENDED);
-
- /* decrement the busy count */
- ASSERT(statep->i810_busy_cnt > 0);
- statep->i810_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (statep->i810_busy_cnt == 0) {
- cv_broadcast(&statep->i810_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audio810_set_idle() done", statep);
-
- ASSERT(!mutex_owned(&statep->inst_lock));
-
-} /* audio810_set_idle() */
-
-/* *********************** Mixer Entry Point Routines ******************* */
-/*
- * audio810_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audio810_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audio810_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("i810_ad_set_config() stream", stream);
- ATRACE_32("i810_ad_set_config() command", command);
- ATRACE_32("i810_ad_set_config() dir", dir);
- ATRACE_32("i810_ad_set_config() arg1", arg1);
- ATRACE_32("i810_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audio810_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audio810_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audio810_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- (void) audio810_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- (void) audio810_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audio810_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- } else { /* not muted */
-
- /* by setting the port we unmute only active ports */
- (void) audio810_set_port(statep,
- AUDIO_PLAY, statep->i810_output_port);
- }
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audio810_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("i810_ad_set_config() unsupported command",
- command);
- break;
- }
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- ATRACE_32("i810_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audio810_ad_set_config() */
-
-/*
- * audio810_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 16 bit signed linear.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audio810_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audio810_state_t *statep;
- uint16_t val;
- int rc = AUDIO_FAILURE;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
-
- ATRACE_32("i810_ad_set_format() stream", stream);
- ATRACE_32("i810_ad_set_format() dir", dir);
- ATRACE_32("i810_ad_set_format() sample_rate", sample_rate);
- ATRACE_32("i810_ad_set_format() channels", channels);
- ATRACE_32("i810_ad_set_format() precision", precision);
- ATRACE_32("i810_ad_set_format() encoding", encoding);
-
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE("i810_ad_set_format() bad encoding", encoding);
- return (AUDIO_FAILURE);
- }
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->var_sr == B_FALSE) {
- /* codec doesn't support variable sample rate */
-
- if (sample_rate != I810_SAMPR48000) {
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!ad_set_format() bad sample rate %d\n",
- sample_rate);
- goto done;
- }
- } else {
- switch (sample_rate) {
- case I810_SAMPR8000: break;
- case I810_SAMPR9600: break;
- case I810_SAMPR11025: break;
- case I810_SAMPR16000: break;
- case I810_SAMPR18900: break;
- case I810_SAMPR22050: break;
- case I810_SAMPR27420: break;
- case I810_SAMPR32000: break;
- case I810_SAMPR33075: break;
- case I810_SAMPR37800: break;
- case I810_SAMPR44100: break;
- case I810_SAMPR48000: break;
- default:
- ATRACE_32("i810_ad_set_format() bad SR", sample_rate);
- goto done;
- }
- }
-
- if (dir == AUDIO_PLAY) {
-
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_SURROUND_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_LFE_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("ad_set_format() bad out SR",
- sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!set_format() bad output sample rate %d",
- sample_rate);
- goto done;
- }
- }
-
- statep->i810_psample_rate = sample_rate;
- statep->i810_pchannels = channels;
- statep->i810_pprecision = precision;
- } else {
-
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_MIC_ADC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("ad_set_format() bad input SR",
- sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!set_format() bad input sample rate %d",
- sample_rate);
- goto done;
- }
- }
-
- statep->i810_csample_rate = sample_rate;
- statep->i810_cchannels = channels;
- statep->i810_cprecision = precision;
- }
-
- rc = AUDIO_SUCCESS;
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- ATRACE_32("i810_ad_set_format() returning", rc);
-
- return (rc);
-
-} /* audio810_ad_set_format() */
-
-/*
- * audio810_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audio810_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- uint8_t cr;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("i810_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & I810_DMA_PLAY_PAUSED) {
- statep->flags |= I810_DMA_PLAY_STARTED;
- statep->flags &= ~I810_DMA_PLAY_PAUSED;
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
- cr |= I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
- goto done;
- }
-
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- goto done;
- }
-
- rc = audio810_fill_play_buf(statep);
- if (rc == AUDIO_FAILURE) {
- statep->flags &= ~I810_DMA_PLAY_STARTED;
- } else {
- statep->flags |= I810_DMA_PLAY_STARTED;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- return (rc);
-
-} /* audio810_ad_start_play() */
-
-/*
- * audio810_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- uint8_t cr;
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
- ATRACE("audio810_ad_pause_play() ", ahandle);
- ATRACE_32("i810_ad_pause_play() stream", stream);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- if ((statep->flags & I810_DMA_PLAY_STARTED) == 0)
- goto done;
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
- cr &= ~I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
- statep->flags |= I810_DMA_PLAY_PAUSED;
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_pause_play() */
-
-/*
- * audio810_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- i810_sample_buf_t *buf;
-
- ATRACE("audio810_ad_stop_play() ", ahandle);
- ATRACE_32("i810_ad_stop_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
-
- /* pause bus master */
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_PAUSE);
-
- /* reset registers */
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
-
- buf = &statep->play_buf;
- buf->io_started = B_FALSE;
- statep->flags &= ~(I810_DMA_PLAY_STARTED
- |I810_DMA_PLAY_PAUSED | I810_DMA_PLAY_EMPTY);
-
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_stop_play() */
-
-/*
- * audio810_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audio810_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio810_ad_start_record() ", ahandle);
- ATRACE_32("i810_ad_start_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- if (statep->flags & I810_DMA_RECD_STARTED)
- goto done;
-
- rc = audio810_prepare_record_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= I810_DMA_RECD_STARTED;
- }
-done:
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
- return (rc);
-
-} /* audio810_ad_start_record() */
-
-/*
- * audio810_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audio810_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audio810_state_t *statep;
- i810_sample_buf_t *buf;
-
- ATRACE("audio810_ad_stop_record() ", ahandle);
- ATRACE_32("i810_ad_stop_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- audio810_set_busy(statep);
-
- mutex_enter(&statep->inst_lock);
- statep->flags &= ~I810_DMA_RECD_STARTED;
-
- buf = &statep->record_buf;
- buf->io_started = B_FALSE;
-
- /* pause bus master */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_PAUSE);
-
- /* reset registers */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST);
-
- mutex_exit(&statep->inst_lock);
-
- audio810_set_idle(statep);
-
-} /* audio810_ad_stop_record() */
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audio810_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audio810_attach() would need to be fixed as well.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audio810_init_state(audio810_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int cdrom;
- int mode;
-
- ATRACE("audio810_init_state()", NULL);
-
- statep->dip = dip;
- statep->vol_bits_mask = 5;
-
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", I810_INTS);
- if (pints > I810_MAX_INTS) {
- ATRACE_32("i810_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, I810_INTS);
- pints = I810_INTS;
- } else if (pints < I810_MIN_INTS) {
- ATRACE_32("i810_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, I810_INTS);
- pints = I810_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", I810_INTS);
- if (rints > I810_MAX_INTS) {
- ATRACE_32("i810_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, I810_INTS);
- rints = I810_INTS;
- } else if (rints < I810_MIN_INTS) {
- ATRACE_32("i810_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- rints, I810_INTS);
- rints = I810_INTS;
- }
-
- /* fill in the device default state */
- statep->i810_defaults.play.sample_rate = I810_DEFAULT_SR;
- statep->i810_defaults.play.channels = I810_DEFAULT_CH;
- statep->i810_defaults.play.precision = I810_DEFAULT_PREC;
- statep->i810_defaults.play.encoding = I810_DEFAULT_ENC;
- statep->i810_defaults.play.gain = I810_DEFAULT_PGAIN;
- statep->i810_defaults.play.port = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.avail_ports = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.mod_ports = AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->i810_defaults.play.buffer_size = I810_BSIZE;
- statep->i810_defaults.play.balance = I810_DEFAULT_BAL;
-
- statep->i810_defaults.record.sample_rate = I810_DEFAULT_SR;
- statep->i810_defaults.record.channels = I810_DEFAULT_CH;
- statep->i810_defaults.record.precision = I810_DEFAULT_PREC;
- statep->i810_defaults.record.encoding = I810_DEFAULT_ENC;
- statep->i810_defaults.record.gain = I810_DEFAULT_PGAIN;
- statep->i810_defaults.record.port = AUDIO_MICROPHONE;
- statep->i810_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->i810_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->i810_defaults.record.buffer_size = I810_BSIZE;
- statep->i810_defaults.record.balance = I810_DEFAULT_BAL;
-
- statep->i810_defaults.monitor_gain = I810_DEFAULT_MONITOR_GAIN;
- statep->i810_defaults.output_muted = B_FALSE;
- statep->i810_defaults.ref_cnt = B_FALSE;
- statep->i810_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->i810_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (cdrom) {
- statep->i810_defaults.record.avail_ports |= AUDIO_CD;
- statep->i810_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->i810_psample_rate = statep->i810_defaults.play.sample_rate;
- statep->i810_pchannels = statep->i810_defaults.play.channels;
- statep->i810_pprecision = statep->i810_defaults.play.precision;
- statep->i810_csample_rate = statep->i810_defaults.record.sample_rate;
- statep->i810_cchannels = statep->i810_defaults.record.channels;
- statep->i810_cprecision = statep->i810_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->ad_info.ad_mode = mode;
- statep->ad_info.ad_int_vers = AM_VERSION;
- statep->ad_info.ad_add_mode = NULL;
- statep->ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->ad_info.ad_defaults = &statep->i810_defaults;
- statep->ad_info.ad_play_comb = audio810_combinations;
- statep->ad_info.ad_rec_comb = audio810_combinations;
- statep->ad_info.ad_entry = &audio810_entry;
- statep->ad_info.ad_dev_info = &statep->i810_dev_info;
- statep->ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->ad_info.ad_play.ad_mixer_srs = audio810_mixer_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs = audio810_compat_sample_rates;
- statep->ad_info.ad_play.ad_conv = &am_src2;
- statep->ad_info.ad_play.ad_sr_info = NULL;
- statep->ad_info.ad_play.ad_chs = audio810_channels;
- statep->ad_info.ad_play.ad_int_rate = pints;
- statep->ad_info.ad_play.ad_max_chs = I810_MAX_OUT_CHANNELS;
- statep->ad_info.ad_play.ad_bsize = I810_BSIZE;
-
- /* record capabilities */
- statep->ad_info.ad_record.ad_mixer_srs = audio810_mixer_sample_rates;
- statep->ad_info.ad_record.ad_compat_srs =
- audio810_compat_sample_rates;
- statep->ad_info.ad_record.ad_conv = &am_src2;
- statep->ad_info.ad_record.ad_sr_info = NULL;
- statep->ad_info.ad_record.ad_chs = audio810_channels;
- statep->ad_info.ad_record.ad_int_rate = rints;
- statep->ad_info.ad_record.ad_max_chs = I810_MAX_CHANNELS;
- statep->ad_info.ad_record.ad_bsize = I810_BSIZE;
-
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->intr_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
- mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->intr_iblock);
- cv_init(&statep->i810_cv, NULL, CV_DRIVER, NULL);
-
- /* fill in device info strings */
- (void) strcpy(statep->i810_dev_info.name, I810_DEV_NAME);
- (void) strcpy(statep->i810_dev_info.config, I810_DEV_CONFIG);
- (void) strcpy(statep->i810_dev_info.version, I810_DEV_VERSION);
-
- statep->play_buf_size = I810_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / pints;
- statep->play_buf_size += I810_MOD_SIZE -
- (statep->play_buf_size % I810_MOD_SIZE);
- statep->record_buf_size = I810_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / rints;
- statep->record_buf_size += I810_MOD_SIZE -
- (statep->record_buf_size % I810_MOD_SIZE);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_init_state */
-
-
-/*
- * audio810_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audio810_map_regs(dev_info_t *dip, audio810_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
- uint_t nregs = 0;
- int *regs_list;
- int i;
- int pciBar1 = 0;
- int pciBar2 = 0;
- int pciBar3 = 0;
- int pciBar4 = 0;
-
- ATRACE("audio810_map_regs()", statep);
-
- statep->i810_res_flags = 0;
-
- /* map PCI config space */
- if (pci_config_setup(statep->dip, &statep->pci_conf_handle) ==
- DDI_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() configuration memory mapping failed");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_PCI_REGS;
-
- /* check the "reg" property to get the length of memory-mapped I/O */
- if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "reg", (int **)&regs_list, &nregs) != DDI_PROP_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() inquire regs property failed");
- goto error;
- }
- /*
- * Some hardwares, such as Intel ICH0/ICH and AMD 8111, use PCI 0x10
- * and 0x14 BAR separately for native audio mixer BAR and native bus
- * mastering BAR. More advanced hardwares, such as Intel ICH4 and ICH5,
- * support PCI memory BAR, via PCI 0x18 and 0x1C BAR, that allows for
- * higher performance access to the controller register. All features
- * can be accessed via this BAR making the I/O BAR (PCI 0x10 and 0x14
- * BAR) capabilities obsolete. However, these controller maintain the
- * I/O BAR capability to allow for the reuse of legacy code maintaining
- * backward compatibility. The I/O BAR is disabled unless system BIOS
- * enables the simultaneous backward compatible capability on the 0x41
- * register.
- *
- * When I/O BAR is enabled, the value of "reg" property should be like
- * this,
- * phys_hi phys_mid phys_lo size_hi size_lo
- * --------------------------------------------------------
- * 0000fd00 00000000 00000000 00000000 00000000
- * 0100fd10 00000000 00000000 00000000 00000100
- * 0100fd14 00000000 00000000 00000000 00000040
- * 0200fd18 00000000 00000000 00000000 00000200
- * 0200fd1c 00000000 00000000 00000000 00000100
- *
- * When I/O BAR is disabled, the "reg" property of the device node does
- * not consist of the description for the I/O BAR. The following example
- * illustrates the vaule of "reg" property,
- *
- * phys_hi phys_mid phys_lo size_hi size_lo
- * --------------------------------------------------------
- * 0000fd00 00000000 00000000 00000000 00000000
- * 0200fd18 00000000 00000000 00000000 00000200
- * 0200fd1c 00000000 00000000 00000000 00000100
- *
- * If the hardware has memory-mapped I/O access, first try to use
- * this facility, otherwise we will try I/O access.
- */
- for (i = 1; i < nregs/I810_INTS_PER_REG_PROP; i++) {
- switch (regs_list[I810_INTS_PER_REG_PROP * i] & 0x000000ff) {
- case 0x10:
- pciBar1 = i;
- break;
- case 0x14:
- pciBar2 = i;
- break;
- case 0x18:
- pciBar3 = i;
- break;
- case 0x1c:
- pciBar4 = i;
- break;
- default: /* we don't care others */
- break;
- }
- }
-
- if ((pciBar3 != 0) && (pciBar4 != 0)) {
- /* map audio mixer registers */
- if ((ddi_regs_map_setup(dip, pciBar3,
- (caddr_t *)&statep->am_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar3 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() memory am mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar3 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_AM_REGS;
-
- /* map bus master register */
- if ((ddi_regs_map_setup(dip, pciBar4,
- (caddr_t *)&statep->bm_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar4 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() memory bm mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar4 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_BM_REGS;
-
- } else if ((pciBar1 != 0) && (pciBar2 != 0)) {
- /* map audio mixer registers */
- if ((ddi_regs_map_setup(dip, pciBar1,
- (caddr_t *)&statep->am_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar1 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() I/O am mapping failed, len=0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar1 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_AM_REGS;
-
- /* map bus master register */
- if ((ddi_regs_map_setup(dip, pciBar2,
- (caddr_t *)&statep->bm_regs_base, 0,
- regs_list[I810_INTS_PER_REG_PROP * pciBar2 +
- I810_REG_PROP_ADDR_LEN_IDX], &dev_attr,
- &statep->bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() I/O bm mapping failed, len=: 0x%08x",
- regs_list[I810_INTS_PER_REG_PROP * pciBar2 +
- I810_REG_PROP_ADDR_LEN_IDX]);
- goto error;
- }
- statep->i810_res_flags |= I810_RS_BM_REGS;
- } else {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_reg() pci BAR error");
- goto error;
- }
-
- /*
- * now, from here we allocate DMA memory for buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(bdlist) failed ");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_DMA_BDL_HANDLE;
-
- /*
- * we allocate all buffer descriptors lists in continuous dma memory.
- */
- if (ddi_dma_mem_alloc(statep->bdl_dma_handle,
- sizeof (i810_bd_entry_t) * I810_BD_NUMS * 2,
- &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- (caddr_t *)&statep->bdl_virtual, &statep->bdl_size,
- &statep->bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(bdlist) failed");
- goto error;
- }
- statep->i810_res_flags |= I810_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->bdl_dma_handle, NULL,
- (caddr_t)statep->bdl_virtual, statep->bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() addr_bind_handle failed");
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!map_regs() addr_bind_handle failed, cookies > 1");
- goto error;
- }
-
- statep->bdl_virt_pin = (i810_bd_entry_t *)(statep->bdl_virtual);
- statep->bdl_virt_pout = statep->bdl_virt_pin + I810_BD_NUMS;
- statep->bdl_phys_pin = (uint32_t)(cookie.dmac_address);
- statep->bdl_phys_pout = statep->bdl_phys_pin +
- sizeof (i810_bd_entry_t) * I810_BD_NUMS;
-
- statep->i810_res_flags |= I810_RS_DMA_BDL_BIND;
-
- ddi_prop_free(regs_list);
-
- return (AUDIO_SUCCESS);
-
-error:
- if (nregs > 0) {
- ddi_prop_free(regs_list);
- }
- audio810_unmap_regs(statep);
-
- return (AUDIO_FAILURE);
-
-} /* audio810_map_regs() */
-
-/*
- * audio810_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and the unmaps control registers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_unmap_regs(audio810_state_t *statep)
-{
- if (statep->i810_res_flags & I810_RS_DMA_BDL_BIND) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_DMA_BDL_MEM) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->bdl_acc_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_DMA_BDL_HANDLE) {
- statep->i810_res_flags &= ~I810_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->bdl_dma_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_BM_REGS) {
- statep->i810_res_flags &= ~I810_RS_BM_REGS;
- ddi_regs_map_free(&statep->bm_regs_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_AM_REGS) {
- statep->i810_res_flags &= ~I810_RS_AM_REGS;
- ddi_regs_map_free(&statep->am_regs_handle);
- }
-
- if (statep->i810_res_flags & I810_RS_PCI_REGS) {
- statep->i810_res_flags &= ~I810_RS_PCI_REGS;
- pci_config_teardown(&statep->pci_conf_handle);
- }
-
-} /* audio810_unmap_regs() */
-
-/*
- * audio810_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * I810_DMA_PCM_IN ---PCM in DMA engine
- * I810_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-
-static int
-audio810_alloc_sample_buf(audio810_state_t *statep, int which, int len)
-{
- i810_sample_buf_t *buf;
- i810_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
-
- if (which == I810_DMA_PCM_OUT) {
- buf = &statep->play_buf;
- } else {
- ASSERT(which == I810_DMA_PCM_IN);
- buf = &statep->record_buf;
- }
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
-
- if (ddi_dma_alloc_handle(statep->dip, &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len, &dev_attr,
- DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL, &chunk->data_buf,
- &chunk->real_len, &chunk->acc_handle) != DDI_SUCCESS) {
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len, DDI_DMA_WRITE,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
-
- return (AUDIO_SUCCESS);
-
-error:
- if (i != 0) {
- (void) ddi_dma_unbind_handle((buf->chunk[0].dma_handle));
- ddi_dma_mem_free(&(buf->chunk[0].acc_handle));
- ddi_dma_free_handle(&(buf->chunk[0].dma_handle));
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio810_alloc_sample_buf() */
-
-/*
- * audio810_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audio810_alloc_sample_buf().
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * i810_sample_buf_t *buf The sample buffer structure
- *
- * Returns:
- * void
- */
-static void
-audio810_free_sample_buf(audio810_state_t *statep, i810_sample_buf_t *buf)
-{
- i810_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audio810_free_sample_buf() audio810_statep", statep);
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- chunk->acc_handle = 0;
- ddi_dma_free_handle(&chunk->dma_handle);
- }
-
-} /* audio810_free_sample_buf() */
-
-/*
- * audio810_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_reclaim_play_buf(audio810_state_t *statep)
-{
- i810_sample_buf_t *buf;
- int16_t bmciv;
-
- ASSERT(mutex_owned(&statep->inst_lock));
-
- buf = &statep->play_buf;
- bmciv = I810_BM_GET8(I810_PCM_OUT_CIV);
- while (buf->head != bmciv) {
- buf->avail++;
- buf->head++;
- if (buf->head >= I810_BD_NUMS) {
- buf->head = 0;
- }
- }
-
-} /* audio810_reclaim_play_buf() */
-
-/*
- * audio810_chip_init()
- *
- * Description:
- * This routine initializes the AMD 8111 audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int restore If I810_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio810_chip_init(audio810_state_t *statep, int restore)
-{
- uint32_t gcr;
- uint32_t gsr;
- uint32_t codec_ready;
- uint16_t *shadow;
- int loop;
- int i;
- int j;
- uint16_t sr;
- uint16_t vid1;
- uint16_t vid2;
- uint16_t tmp;
- clock_t ticks;
-
- gcr = I810_BM_GET32(I810_REG_GCR);
- ticks = drv_usectohz(100);
-
- /*
- * SADA only supports stereo, so we set the channel bits
- * to "00" to select 2 channels.
- */
- gcr &= ~(I810_GCR_ACLINK_OFF | I810_GCR_CHANNELS_MASK);
-
- /*
- * Datasheet(ICH5, document number of Intel: 252751-001):
- * 3.6.5.5(page 37)
- * if reset bit(bit1) is "0", driver must set it
- * to "1" to de-assert the AC_RESET# signal in AC
- * link, thus completing a cold reset. But if the
- * bit is "1", then a warm reset is required.
- */
- gcr |= (gcr & I810_GCR_COLD_RST) == 0 ?
- I810_GCR_COLD_RST:I810_GCR_WARM_RST;
- I810_BM_PUT32(I810_REG_GCR, gcr);
-
- /* according AC'97 spec, wait for codec reset */
- for (loop = 6000; --loop >= 0; ) {
- delay(ticks);
- gcr = I810_BM_GET32(I810_REG_GCR);
- if ((gcr & I810_GCR_WARM_RST) == 0) {
- break;
- }
- }
-
- /* codec reset failed */
- if (loop < 0) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!Failed to reset codec");
- return (AUDIO_FAILURE);
- }
-
- /*
- * Wait for codec ready. The hardware can provide the state of
- * codec ready bit on SDATA_IN[0], SDATA_IN[1] or SDATA_IN[2]
- */
- codec_ready =
- I810_GSR_PRI_READY | I810_GSR_SEC_READY | I810_GSR_TRI_READY;
- for (loop = 7000; --loop >= 0; ) {
- delay(ticks);
- gsr = I810_BM_GET32(I810_REG_GSR);
- if ((gsr & codec_ready) != 0) {
- break;
- }
- }
- if (loop < 0) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No codec ready signal received");
- return (AUDIO_FAILURE);
- }
-
- /*
- * put the audio controller into quiet state, everything off
- */
- audio810_stop_dma(statep);
-
- /* AC97 register reset */
- if (audio810_reset_ac97(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- shadow = statep->codec_shadow;
-
- if (restore == I810_INIT_NO_RESTORE) {
- for (i = 0; i < I810_LAST_AC_REG; i += 2) {
- (void) audio810_read_ac97(statep, i,
- &(shadow[I810_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] = MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[I810_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
-
- /* 08h - set master tone control to no modification */
- shadow[I810_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /* 0ah - open pc beep, 0dB */
- shadow[I810_CODEC_REG(AC97_PC_BEEP_REGISTER)] = PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[I810_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[I810_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[I810_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[I810_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- shadow[I810_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[I810_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- shadow[I810_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * 26h - set EAPD to 1 for devices with ac97-invert-amp
- * property.
- *
- * According to AC'97 spec, EAPD (PR7) independently controls
- * an output pin that manages an optional external audio
- * amplifier. AC'97 compliance requires the implementation of
- * a dedicated output pin for external audio amplifier control.
- * The pin is controlled via the ¡°EAPD¡±(External Amplifier
- * Powerdown) bit in Powerdown Ctrl/Stat Register, bit 15
- * (formerly PR7). EAPD = 0 places a 0 on the output pin,
- * enabling an external audio amplifier, EAPD = 1 shuts it
- * down. Audio amplifier devices that operate with reverse
- * polarity may require an external inverter. By default,
- * EAPD = 0 is to enable external audio amplifier, but for
- * some Sony Vaio laptops, we need to revert polarity to
- * enable external amplifier.
- */
- switch (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ac97-invert-amp", -1)) {
- case -1:
- /* not attempt to flip EAPD */
- break;
-
- case 0:
- /* set EAPD to 0 */
- shadow[I810_CODEC_REG(
- AC97_POWERDOWN_CTRL_STAT_REGISTER)] &= ~PCSR_EAPD;
- break;
-
- case 1:
- /* set EAPD to 1 */
- shadow[I810_CODEC_REG(
- AC97_POWERDOWN_CTRL_STAT_REGISTER)] |= PCSR_EAPD;
- break;
-
- default:
- /* invalid */
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!Invalid value for ac97-invert-amp property");
- break;
- }
-
- /*
- * The rest we ignore, most are reserved.
- */
-
- }
-
- if (restore == I810_INIT_RESTORE) {
- /* Restore from saved values */
- shadow[I810_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- shadow[I810_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- shadow[I810_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- shadow[I810_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= I810_LAST_AC_REG; i += 2)
- (void) audio810_write_ac97(statep, i,
- shadow[I810_CODEC_REG(i)]);
-
- (void) audio810_read_ac97(statep, AC97_RESET_REGISTER, &tmp);
- if (tmp & RR_HEADPHONE_SUPPORT) {
- statep->i810_defaults.play.port |= AUDIO_HEADPHONE;
- statep->i810_defaults.play.avail_ports |= AUDIO_HEADPHONE;
- statep->i810_defaults.play.mod_ports |= AUDIO_HEADPHONE;
- }
-
- /*
- * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
- * line-out jack. So far we haven't found which vendors don't
- * do that. So we assume that all vendors swap the surr-out
- * and the line-out outputs. So we need swap the two outputs.
- * But we still internally process the "ad198x-swap-output"
- * property. If someday some vendors do not swap the outputs,
- * we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audio810.conf file, and unload and reload the
- * audio810 driver (or reboot).
- */
- (void) audio810_read_ac97(statep, AC97_VENDOR_ID1_REGISTER, &vid1);
- (void) audio810_read_ac97(statep, AC97_VENDOR_ID2_REGISTER, &vid2);
- if (vid1 == AD1980_VID1 &&
- (vid2 == AD1980_VID2 || vid2 == AD1985_VID2)) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
- statep->swap_out = B_TRUE;
- (void) audio810_read_ac97(statep, CODEC_AD_REG_MISC,
- &tmp);
- (void) audio810_write_ac97(statep, CODEC_AD_REG_MISC,
- tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
- }
- }
-
- /* check if the codec implements 6 bit volume register */
- (void) audio810_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE | MVR_RIGHT_OPTIONAL_MASK | MVR_LEFT_OPTIONAL_MASK);
- (void) audio810_read_ac97(statep, AC97_MASTER_VOLUME_REGISTER, &tmp);
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->vol_bits_mask = 6;
- }
- /* resume the master volume to the max */
- (void) audio810_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip does not support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audio810_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER, &tmp);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!%s%d: xid=0x%04x, vid1=0x%04x, vid2=0x%04x",
- audio810_name, ddi_get_instance(statep->dip), tmp, vid1, vid2);
- if (!(tmp & EAR_VRA)) {
- statep->var_sr = B_FALSE;
- statep->ad_info.ad_record.ad_compat_srs =
- audio810_min_compat_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audio810_min_compat_sample_rates;
- statep->i810_defaults.play.sample_rate =
- I810_SAMPR48000;
- statep->i810_defaults.record.sample_rate =
- I810_SAMPR48000;
- } else { /* variable sample rate supported */
- statep->var_sr = B_TRUE;
-
- /* set variable rate mode */
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
-
- /* check the sample rates supported */
- for (i = 0, j = 0; audio810_compat_srs[i] != 0; i++) {
- (void) audio810_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER,
- audio810_compat_srs[i]);
- (void) audio810_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &sr);
-
- if (sr == audio810_compat_srs[i]) {
- if (i != j) {
- audio810_compat_srs[j] =
- audio810_compat_srs[i];
- }
- j++;
- }
- }
-
- if (j < 1) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No standard sample rate is supported");
- return (AUDIO_FAILURE);
- }
- audio810_compat_srs[j] = 0;
-
- /*
- * if the configuration doesn't support 8K sample rate,
- * we modify the default value to the first.
- */
- if (audio810_compat_srs[0] != I810_SAMPR8000) {
- statep->i810_defaults.play.sample_rate =
- audio810_compat_srs[0];
- statep->i810_defaults.record.sample_rate =
- audio810_compat_srs[0];
- }
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_chip_init() */
-
-/*
- * audio810_stop_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_stop_dma(audio810_state_t *statep)
-{
- /* pause bus master (needed for the following reset register) */
- I810_BM_PUT8(I810_PCM_IN_CR, 0x0);
- I810_BM_PUT8(I810_PCM_OUT_CR, 0x0);
- I810_BM_PUT8(I810_MIC_CR, 0x0);
-
- /* and then reset the bus master registers for a three DMA engines */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
- I810_BM_PUT8(I810_MIC_CR, I810_BM_CR_RST);
-
- statep->flags = 0;
-
-/*
- * XXXX Not sure what these declarations are for, but I brought them from
- * the PM gate.
- */
- statep->play_buf.io_started = B_FALSE;
-
- statep->record_buf.io_started = B_FALSE;
-
-} /* audio810_stop_dma() */
-
-/*
- * audio810_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio810_set_gain(audio810_state_t *statep, int dir, int gain, int channel)
-{
- uint16_t tmp;
- uint16_t channel_gain;
- int regidx;
- uint16_t mask;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- if (statep->vol_bits_mask == 6)
- mask = 0x3f;
- else
- mask = 0x1f;
-
- channel_gain = AUDIO_MAX_GAIN - gain;
- channel_gain = ((channel_gain << statep->vol_bits_mask) -
- channel_gain) / AUDIO_MAX_GAIN;
-
- if (dir == AUDIO_PLAY) {
- if (statep->swap_out == B_TRUE) {
- regidx = AC97_EXTENDED_LRS_VOLUME_REGISTER;
- } else {
- regidx = AC97_PCM_OUT_VOLUME_REGISTER;
- }
- (void) audio810_read_ac97(statep, regidx, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= mask;
- tmp |= (channel_gain << 8);
- } else { /* right channel */
- tmp &= (mask << 8);
- tmp |= channel_gain;
- }
-
- (void) audio810_write_ac97(statep, regidx, tmp);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- (void) audio810_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= gain & RGR_LEFT_MASK;
- } else {
- /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= gain & RGR_RIGHT_MASK;
- }
- (void) audio810_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_set_gain() */
-
-/*
- * audio810_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set
- * AUDIO_SPEAKER output to built-in speaker
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audio810_set_port(audio810_state_t *statep, int dir, int port)
-{
- uint16_t tmp;
-
- if (dir == AUDIO_PLAY) { /* output port */
- tmp = 0;
- if (port == I810_PORT_UNMUTE) {
- port = statep->i810_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audio810_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audio810_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- if (statep->swap_out == B_FALSE) {
- (void) audio810_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- } else {
- (void) audio810_and_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- (uint16_t)~AD1980_SURR_MUTE);
- }
- tmp |= AUDIO_LINE_OUT;
- } else {
- if (statep->swap_out == B_FALSE) {
- (void) audio810_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audio810_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audio810_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audio810_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- ATRACE_32("810_set_port() out port", tmp);
- statep->i810_output_port = tmp;
- if (tmp != port) {
- ATRACE_32("810_set_port() bad out port", port);
- return (AUDIO_FAILURE);
- }
-
- } else { /* input port */
- ASSERT(dir == AUDIO_RECORD);
-
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
-
- /* mute the master record input */
- (void) audio810_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port == AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- (void) audio810_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->i810_monitor_gain);
- }
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
-
- if (statep->i810_monitor_gain) {
- if (statep->i810_input_port == AUDIO_LINE_IN) {
- (void) audio810_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio810_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->i810_input_port ==
- AUDIO_CD) {
- (void) audio810_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- default:
- ATRACE_32("810_set_port bad in port", port);
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audio810_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
- if ((port != AUDIO_NONE) &&
- (statep->codec_shadow[I810_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audio810_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->i810_input_port = port;
- }
-
- ATRACE_32("810_set_port() returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* audio810_set_port() */
-
-/*
- * audio810_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio810_set_monitor_gain(audio810_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audio810_set_monitor_gain()", statep);
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = AUDIO_MAX_GAIN - gain;
- tmp_short = ((tmp_short << statep->vol_bits_mask) - tmp_short) /
- AUDIO_MAX_GAIN;
- tmp_short |= (((tmp_short << statep->vol_bits_mask) -
- tmp_short) / AUDIO_MAX_GAIN) << 8;
- }
-
- switch (statep->i810_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |= statep->codec_shadow[I810_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audio810_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audio810_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audio810_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("i810_ad_set_config() monitor gain bad device", NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->i810_monitor_gain = 0;
- } else {
- statep->i810_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE_32("audio810_set_monitor_gain()", rc);
-
- return (rc);
-
-} /* audio810_set_monitor_gain() */
-
-/*
- * audio810_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audio810_codec_sync(audio810_state_t *statep)
-{
- int i;
- uint16_t casr;
-
- for (i = 0; i < 300; i++) {
- casr = I810_BM_GET8(I810_REG_CASR);
- if ((casr & 1) == 0) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio810_codec_sync() */
-
-/*
- * audio810_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_and_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- I810_AM_PUT16(reg, data & statep->codec_shadow[I810_CODEC_REG(reg)]);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_and_ac97() */
-
-/*
- * audio810_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_or_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- I810_AM_PUT16(reg, data | statep->codec_shadow[I810_CODEC_REG(reg)]);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_or_ac97() */
-
-/*
- * audio810_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio810_write_ac97(audio810_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
- I810_AM_PUT16(reg, data);
-
- (void) audio810_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_write_ac97() */
-
-/*
- * audio810_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audio810_read_ac97(audio810_state_t *statep, int reg, uint16_t *data)
-{
- if (audio810_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
- *data = I810_AM_GET16(reg);
- statep->codec_shadow[I810_CODEC_REG(reg)] = *data;
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_read_ac97() */
-
-/*
- * audio810_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audio810_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audio810_reset_ac97(audio810_state_t *statep)
-{
- uint16_t tmp;
-
- if (audio810_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &tmp) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- if (audio810_write_ac97(statep, AC97_RESET_REGISTER, 1) !=
- AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- if (audio810_read_ac97(statep, AC97_RESET_REGISTER, &tmp) !=
- AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_reset_ac97() */
-
-/*
- * audio810_fill_play_buf()
- *
- * Description:
- * This routine is called by i810_ad_start_play() and the interrupt
- * handler. It fills playback samples into the DMA memory, sets the
- * BDL entries, and starts the playback DMA engine.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audio810_fill_play_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- i810_bd_entry_t *bdesc;
- int samples;
- int rs;
- uint8_t cr;
-
- buf = &statep->play_buf;
-
- if (!buf->io_started) {
- /*
- * ready to start PCM out engine
- */
- I810_BM_PUT8(I810_PCM_OUT_CR, 0);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST |I810_BM_CR_IOCE);
- I810_BM_PUT8(I810_PCM_OUT_LVI, 0);
- I810_BM_PUT32(I810_PCM_OUT_BD_BASE, statep->bdl_phys_pout);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = 2; /* have only two buffers for playback */
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->i810_psample_rate * statep->i810_pchannels /
- statep->ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->tail & 1]);
- mutex_exit(&statep->inst_lock);
- rs = am_get_audio(statep->audio_handle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
-
- if (((statep->flags & I810_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- return (AUDIO_FAILURE);
- }
-
- if (rs <= 0) {
- if (statep->flags & I810_DMA_PLAY_EMPTY) {
-
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->flags &= ~I810_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->inst_lock);
- am_play_shutdown(statep->audio_handle, NULL);
- mutex_enter(&statep->inst_lock);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->flags & I810_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- I810_BM_PUT8(I810_PCM_OUT_CR, 0);
- I810_BM_PUT8(I810_PCM_OUT_CR, I810_BM_CR_RST);
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->flags &= ~(I810_DMA_PLAY_PAUSED |
- I810_DMA_PLAY_EMPTY);
-
- /* return the value for i810_ad_start_play() */
- return (AUDIO_FAILURE);
- } else {
- /*
- * this time, we use one BD entry with empty
- * buffer next time we shut down, if no sound
- * again
- */
- statep->flags |= I810_DMA_PLAY_EMPTY;
- }
- } else {
- /* we got at least one sample */
- statep->flags &= ~I810_DMA_PLAY_EMPTY;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs << 1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->bdl_virt_pout[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)rs;
- bdesc->cmd_bup = 0;
- bdesc->reserved = 0;
- bdesc->cmd_ioc = 1;
- I810_BM_PUT8(I810_PCM_OUT_LVI, buf->tail);
- buf->tail++;
- buf->avail--;
-
- if (buf->tail >= I810_BD_NUMS) {
- buf->tail = 0;
- }
- }
-
- cr = I810_BM_GET8(I810_PCM_OUT_CR);
-
- if (!buf->io_started) {
- cr &= ~(I810_BM_CR_FEIE|I810_BM_CR_LVBIE);
- cr |= I810_BM_CR_IOCE;
- buf->io_started = B_TRUE;
- }
-
- /* start PCM out engine */
- cr |= I810_BM_CR_RUN;
- I810_BM_PUT8(I810_PCM_OUT_CR, cr);
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_fill_play_buf() */
-
-/*
- * audio810_prepare_record_buf()
- *
- * Description:
- * This routine is called by audio810_ad_start_record(). It prepares DMA
- * memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- *
- */
-static int
-audio810_prepare_record_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- i810_bd_entry_t *bdesc;
- int samples;
- uint8_t cr;
-
- buf = &statep->record_buf;
-
- if (!buf->io_started) {
- /* pause PCM in DMA engine */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_PAUSE);
-
- /* reset PCM in DMA engine */
- I810_BM_PUT8(I810_PCM_IN_CR, I810_BM_CR_RST |I810_BM_CR_IOCE);
-
- /* set last valid index to 0 */
- I810_BM_PUT8(I810_PCM_IN_LVI, 0);
-
- /* buffer base */
- I810_BM_PUT32(I810_PCM_IN_BD_BASE, statep->bdl_phys_pin);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = 2;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->i810_csample_rate * statep->i810_cchannels /
- statep->ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->i810_csamples = samples;
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->tail & 1];
- bdesc = &(statep->bdl_virt_pin[buf->tail]);
- bdesc->buf_len = (uint16_t)samples;
- bdesc->cmd_bup = 0;
- bdesc->reserved = 0;
- bdesc->cmd_ioc = 1;
- bdesc->buf_base = chunk->addr_phy;
- I810_BM_PUT8(I810_PCM_IN_LVI, buf->tail);
- buf->tail++;
- buf->avail--;
- if (buf->tail >= I810_BD_NUMS) {
- buf->tail = 0;
- }
- }
- cr = I810_BM_GET8(I810_PCM_IN_CR);
-
- if (!buf->io_started) {
- cr &= ~(I810_BM_CR_FEIE|I810_BM_CR_LVBIE);
- cr |= I810_BM_CR_IOCE;
- buf->io_started = B_TRUE;
- }
-
- if (buf->avail < 2) {
- cr |= I810_BM_CR_RUN;
- }
-
- I810_BM_PUT8(I810_PCM_IN_CR, cr);
- cr = I810_BM_GET8(I810_PCM_IN_CR);
-
- if ((cr & (I810_BM_CR_RUN | I810_BM_CR_IOCE)) !=
- (I810_BM_CR_RUN | I810_BM_CR_IOCE)) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio810_prepare_record_buf() */
-
-/*
- * audio810_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audio810_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio810_reclaim_record_buf(audio810_state_t *statep)
-{
- i810_bdlist_chunk_t *chunk;
- i810_sample_buf_t *buf;
- int16_t bmciv;
- int samples;
-
- buf = &statep->record_buf;
- bmciv = I810_BM_GET8(I810_PCM_IN_CIV);
- samples = statep->i810_csamples;
-
- while ((buf->head != bmciv) && (buf->avail < 2)) {
- chunk = &buf->chunk[buf->head & 1];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- chunk->real_len, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->inst_lock);
- am_send_audio(statep->audio_handle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
- buf->avail++;
- buf->head++;
-
- if (buf->head >= I810_BD_NUMS) {
- buf->head = 0;
- }
- if ((statep->flags & I810_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-
-} /* audio810_reclaim_record_buf() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c b/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c
deleted file mode 100644
index 743a9dec05..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audioixp/audioixp.c
+++ /dev/null
@@ -1,3389 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * audioixp Audio Driver
- *
- * This driver supports audio hardware integrated in ATI IXP400 chipset.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The IXP400 audio core is an AC'97 controller, which has independent
- * channels for PCM in, PCM out. The AC'97 controller is a PCI bus master
- * with scatter/gather support. Each channel has a DMA engine. Currently,
- * we use only the PCM in and PCM out channels. Each DMA engine uses one
- * buffer descriptor list. And the buffer descriptor list is an array
- * of up to 32 entries, each of which describes a data buffer. You dont need
- * to use all these entries. Each entry contains a pointer to a data buffer,
- * status, length of the buffer being pointed to and the pointer to the next
- * entry. Length of the buffer is in number of bytes. Interrupt will be
- * triggered each time a entry is processed by hardware.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, audioixp_sample_buf,
- * to handle BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. Two DMA buffers are allocated for both playback
- * and record, and two BD entries are used. When processing interrupt,
- * the current hardware pointer will be check to tell which buffer is
- * being processed. It's possible for the hardware to interrupt twice
- * for one buffer, this logic is handled in the routine
- * audioixp_chunk_processed.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audioixp_chip_init().
- *
- * System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audioixp_impl.h>
-#include <sys/audio/audioixp.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audioixp_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audioixp_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audioixp_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audioixp_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audioixp_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audioixp_ad_start_play(audiohdl_t, int);
-static void audioixp_ad_pause_play(audiohdl_t, int);
-static void audioixp_ad_stop_play(audiohdl_t, int);
-static int audioixp_ad_start_record(audiohdl_t, int);
-static void audioixp_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audioixp_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static int audioixp_codec_sync(audioixp_state_t *);
-static int audioixp_write_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_read_ac97(audioixp_state_t *, int, uint16_t *);
-static int audioixp_and_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_or_ac97(audioixp_state_t *, int, uint16_t);
-static int audioixp_reset_ac97(audioixp_state_t *);
-static int audioixp_init_state(audioixp_state_t *, dev_info_t *);
-static int audioixp_map_regs(dev_info_t *, audioixp_state_t *);
-static void audioixp_unmap_regs(audioixp_state_t *);
-static int audioixp_alloc_sample_buf(audioixp_state_t *, int, int);
-static void audioixp_free_sample_buf(audioixp_state_t *,
- audioixp_sample_buf_t *);
-static void audioixp_setup_bdl(audioixp_state_t *);
-static void audioixp_start_dma(audioixp_state_t *, int);
-static void audioixp_stop_dma(audioixp_state_t *, int);
-static int audioixp_chip_init(audioixp_state_t *, int);
-static void audioixp_chip_fini(audioixp_state_t *);
-static int audioixp_chunk_processed(audioixp_state_t *, int);
-static int audioixp_fill_play_buf(audioixp_state_t *);
-static int audioixp_prepare_record_buf(audioixp_state_t *);
-static void audioixp_reclaim_play_buf(audioixp_state_t *);
-static void audioixp_reclaim_record_buf(audioixp_state_t *);
-static int audioixp_set_gain(audioixp_state_t *, int, int, int);
-static int audioixp_set_port(audioixp_state_t *, int, int);
-static int audioixp_set_monitor_gain(audioixp_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audioixp_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audioixp_name = IXP_NAME;
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audioixp_modinfo = {
- IXP_IDNUM, /* module ID number */
- IXP_NAME, /* module name */
- IXP_MINPACKET, /* minimum packet size */
- IXP_MAXPACKET, /* maximum packet size */
- IXP_HIWATER, /* high water mark */
- IXP_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audioixp_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audioixp_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audioixp_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audioixp_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audioixp_str_info = {
- &audioixp_rqueue, /* read queue */
- &audioixp_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audioixp_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audioixp_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audioixp_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audioixp_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audioixp_attach, /* devo_attach */
- audioixp_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audioixp_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audioixp_modldrv = {
- &mod_driverops, /* drv_modops */
- IXP_MOD_NAME, /* drv_linkinfo */
- &audioixp_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audioixp_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audioixp_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audioixp_mixer_srs[] = {
- IXP_SAMPR8000, IXP_SAMPR48000, 0
-};
-
-static uint_t audioixp_min_compat_srs[] = {
- IXP_SAMPR48000, 0
-};
-
-static uint_t audioixp_compat_srs [] = {
- IXP_SAMPR8000, IXP_SAMPR11025, IXP_SAMPR16000,
- IXP_SAMPR22050, IXP_SAMPR24000, IXP_SAMPR32000,
- IXP_SAMPR44100, IXP_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t audioixp_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audioixp_mixer_srs
-};
-
-static am_ad_sample_rates_t audioixp_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audioixp_compat_srs
-};
-
-/* Some codec, only support 48K sample rate */
-static am_ad_sample_rates_t audioixp_min_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audioixp_min_compat_srs
-};
-
-static uint_t audioixp_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audioixp_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0000ffff, /* count_max */
- 8, /* align, BDL must be aligned on a 8-byte boundary */
- 0x3c, /* burstsize */
- 8, /* minxfer, set to the size of a BDlist entry */
- 0x0000ffff, /* maxxfer */
- 0x00000fff, /* seg, set to the RAM pagesize of intel platform */
- 1, /* sgllen, there's no scatter-gather list */
- 8, /* granular, set to the value of minxfer */
- 0 /* flags, use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0, /* addr_lo */
- 0xffffffff, /* addr_hi */
- 0x0001fffe, /* count_max */
- 2, /* align, data buffer is aligned on a 2-byte boundary */
- 0x3c, /* burstsize */
- 4, /* minxfer, set to the size of a sample data */
- 0x0001ffff, /* maxxfer */
- 0x0001ffff, /* seg */
- 1, /* sgllen, no scatter-gather */
- 4, /* granular, set to the value of minxfer */
- 0, /* flags, use virtual address */
-};
-
-static am_ad_entry_t audioixp_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audioixp_ad_set_config, /* ad_set_config() */
- audioixp_ad_set_format, /* ad_set_format() */
- audioixp_ad_start_play, /* ad_start_play() */
- audioixp_ad_pause_play, /* ad_pause_play() */
- audioixp_ad_stop_play, /* ad_stop_play() */
- audioixp_ad_start_record, /* ad_start_record() */
- audioixp_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audioixp _init()", NULL);
-
- if ((error = ddi_soft_state_init(&audioixp_statep,
- sizeof (audioixp_state_t), 1)) != 0) {
- ATRACE("audioixp ddi_soft_state_init() failed",
- audioixp_statep);
- return (error);
- }
-
- if ((error = mod_install(&audioixp_modlinkage)) != 0) {
- ddi_soft_state_fini(&audioixp_statep);
- }
-
- ATRACE("audioixp _init() audioixp_statep", audioixp_statep);
- ATRACE("audioixp _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audioixp _fini()", audioixp_statep);
-
- if ((error = mod_remove(&audioixp_modlinkage)) != 0) {
- return (error);
- }
-
- ddi_soft_state_fini(&audioixp_statep);
-
- ATRACE_32("audioixp _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audioixp _info()", NULL);
-
- error = mod_info(&audioixp_modlinkage, modinfop);
-
- ATRACE_32("audioixp _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audioixp_getinfo()
- */
-static int
-audioixp_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd,
- void *arg, void **result)
-{
- audioixp_state_t *state;
- int instance;
- int error;
-
- error = DDI_FAILURE;
- ATRACE("in audioixp_getinfo()", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audioixp_statep,
- instance)) != NULL) {
- *result = state->dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void*)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- return (error);
-
-} /* audioixp_getinfo() */
-
-/*
- * audioixp_attach()
- *
- * Description:
- * Attach an instance of the audioixp driver. This routine does
- * the device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audioixp_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- int instance;
- uint16_t cmdeg;
- audioixp_state_t *statep;
- audio_sup_reg_data_t data;
-
- ATRACE("in audioixp_attach()", dip);
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audioixp_attach() audioixp_statep",
- audioixp_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
-
- /*
- * now, no suspend/resume supported. we'll do it in the future.
- */
- case DDI_RESUME:
- ATRACE("audioixp_attach() DDI_RESUME", NULL);
- audio_sup_log(NULL, CE_WARN,
- "%s%d: audioixp_attach() resume is not supported yet",
- audioixp_name, instance);
- return (DDI_FAILURE);
-
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() unknown command: 0x%x",
- audioixp_name, instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in the driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach()"
- " unsupported high level interrupt",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audioixp_statep, instance) !=
- DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() soft state allocate failed",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- if ((statep = ddi_get_soft_state(audioixp_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() soft state failed",
- audioixp_name, instance);
- goto error_state;
- }
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((statep->audio_handle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_attach() audio_sup_register() failed",
- audioixp_name, instance);
- goto error_state;
- }
-
- /* save private state */
- audio_sup_set_private(statep->audio_handle, statep);
-
- if ((audioixp_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audioixp_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't map registers");
- goto error_destroy;
- }
-
- /* set PCI command register */
- cmdeg = pci_config_get16(statep->pci_conf_handle, PCI_CONF_COMM);
- pci_config_put16(statep->pci_conf_handle, PCI_CONF_COMM,
- cmdeg | PCI_COMM_IO | PCI_COMM_MAE);
-
- if (audioixp_alloc_sample_buf(statep, IXP_DMA_PCM_OUT,
- statep->play_buf_size) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't allocate play sample "
- "buffers");
- goto error_unmap;
- }
-
- if (audioixp_alloc_sample_buf(statep, IXP_DMA_PCM_IN,
- statep->record_buf_size) == AUDIO_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() couldn't allocate record sample "
- "buffers");
- goto error_dealloc_play;
- }
-
- audioixp_setup_bdl(statep);
-
- /* set up kernel statistics */
- if ((statep->ixp_ksp = kstat_create(IXP_NAME, instance,
- IXP_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->ixp_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, &statep->intr_iblock,
- (ddi_idevice_cookie_t *)NULL, audioixp_intr, (caddr_t)statep) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() bad interrupt specification ");
- goto error_kstat;
- }
-
- if (audioixp_chip_init(statep, IXP_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() failed to init chip");
- goto error_intr;
- }
-
- /* call the mixer attach() routine */
- if (am_attach(statep->audio_handle, cmd, &statep->ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_attach() am_attach() failed");
- goto error_intr;
- }
-
- ddi_report_dev(dip);
-
- return (DDI_SUCCESS);
-
-error_intr:
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
-error_kstat:
- if (statep->ixp_ksp) {
- kstat_delete(statep->ixp_ksp);
- }
-
-error_dealloc:
- audioixp_free_sample_buf(statep, &statep->record_buf);
-
-error_dealloc_play:
- audioixp_free_sample_buf(statep, &statep->play_buf);
-
-error_unmap:
- audioixp_unmap_regs(statep);
-
-error_destroy:
- ATRACE("audioixp_attach() error_destroy", statep);
- mutex_destroy(&statep->inst_lock);
-
-error_audiosup:
- ATRACE("audioixp_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->audio_handle);
-
-error_state:
- ATRACE("audioixp_attach() error_state", statep);
- ddi_soft_state_free(audioixp_statep, instance);
-
- ATRACE("audioixp_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audioixp_attach() */
-
-/*
- * audioixp_detach()
- *
- * Description:
- * Detach an instance of the audioixp driver. After the Codec is
- * detached, we call am_detach() and audio_sup_register() so they may
- * do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audioixp_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audioixp_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE_32("audioixp_detach() instance", instance);
- ATRACE("audioixp_detach() audioixp_statep",
- audioixp_statep);
-
- if ((statep = ddi_get_soft_state(audioixp_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: audioixp_detach() get soft state failed",
- audioixp_name, instance);
- return (DDI_FAILURE);
- }
-
- switch (cmd) {
- case DDI_DETACH:
- break;
-
- /*
- * now, no suspend/resume supported. we'll do it in the future.
- */
- case DDI_SUSPEND:
- ATRACE("audioixp_detach() SUSPEND", statep);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "audioixp_detach() suspend is not supported yet");
- return (DDI_FAILURE);
-
- default:
- ATRACE("audioixp_detach() unknown command", cmd);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_detach() unknown command: 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- audioixp_chip_fini(statep);
-
- /* stop DMA engines */
- mutex_enter(&statep->inst_lock);
- audioixp_stop_dma(statep, AUDIO_PLAY);
- audioixp_stop_dma(statep, AUDIO_RECORD);
- mutex_exit(&statep->inst_lock);
-
- /* remove the interrupt handler */
- ddi_remove_intr(dip, 0, statep->intr_iblock);
-
- /* free DMA memory */
- audioixp_free_sample_buf(statep, &statep->play_buf);
- audioixp_free_sample_buf(statep, &statep->record_buf);
-
- /* free the kernel statistics structure */
- if (statep->ixp_ksp) {
- kstat_delete(statep->ixp_ksp);
- }
-
- /* detach audio mixer */
- (void) am_detach(statep->audio_handle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->audio_handle);
-
- mutex_destroy(&statep->inst_lock);
-
- audioixp_unmap_regs(statep);
-
- ddi_soft_state_free(audioixp_statep, instance);
-
- return (DDI_SUCCESS);
-
-} /* audioixp_detach */
-
-/*
- * audioixp_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * There's a hardware pointer which indicate memory location where
- * the hardware is processing. We check this pointer to decide whether
- * to handle the buffer and how many buffers should be handled.
- * Refer to ATI IXP400/450 Register Reference Manual, page 193,194.
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audioixp_intr(caddr_t arg)
-{
- audioixp_state_t *statep;
- uint32_t sr;
- int intr_claimed = DDI_INTR_UNCLAIMED;
-
- statep = (audioixp_state_t *)arg;
- mutex_enter(&statep->inst_lock);
-
- sr = IXP_AM_GET32(IXP_AUDIO_INT);
-
- /* PCM in interrupt */
- if (sr & IXP_AUDIO_INT_IN_DMA) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA);
-
- if (statep->flags & IXP_DMA_RECD_STARTED) {
- audioixp_reclaim_record_buf(statep);
- }
- }
-
- /* PCM out interrupt */
- if (sr & IXP_AUDIO_INT_OUT_DMA) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA);
-
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- audioixp_reclaim_play_buf(statep);
- (void) audioixp_fill_play_buf(statep);
- }
- }
-
- /* system is too busy to process the input stream, ignore it */
- if (sr & IXP_AUDIO_INT_IN_DMA_OVERFLOW) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_IN_DMA_OVERFLOW);
- }
-
- /* System is too busy, ignore it */
- if (sr & IXP_AUDIO_INT_OUT_DMA_UNDERFLOW) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_OUT_DMA_UNDERFLOW);
- }
-
- if (sr & IXP_AUDIO_INT_CODEC0_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC0_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC0_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_CODEC1_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC1_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC1_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_CODEC2_NOT_READY) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_CODEC2_NOT_READY);
- statep -> ixp_codec_not_ready_bits |=
- IXP_AUDIO_INT_CODEC2_NOT_READY;
- }
-
- if (sr & IXP_AUDIO_INT_NEW_FRAME) {
- intr_claimed = DDI_INTR_CLAIMED;
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AUDIO_INT_NEW_FRAME);
- statep -> ixp_codec_not_ready_bits |= IXP_AUDIO_INT_NEW_FRAME;
- }
-
- if (intr_claimed == DDI_INTR_UNCLAIMED) {
- mutex_exit(&statep->inst_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* update the kernel interrupt statistics */
- if (statep->ixp_ksp) {
- IXP_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->inst_lock);
-
- ATRACE("audioixp_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audioixp_intr() */
-
-/* *********************** Mixer Entry Point Routines ******************* */
-/*
- * audioixp_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audioixp_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audioixp_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
- ATRACE_32("audioixp_ad_set_config() stream", stream);
- ATRACE_32("audioixp_ad_set_config() command", command);
- ATRACE_32("audioixp_ad_set_config() dir", dir);
- ATRACE_32("audioixp_ad_set_config() arg1", arg1);
- ATRACE_32("audioixp_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audioixp_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audioixp_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audioixp_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- (void) audioixp_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audioixp_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
-
- } else { /* not muted */
-
- /* by setting the port we unmute only active ports */
- (void) audioixp_set_port(statep,
- AUDIO_PLAY, statep->ixp_output_port);
- }
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audioixp_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- rc = AUDIO_FAILURE;
- ATRACE_32("audioixp_ad_set_config() unsupported command",
- command);
- break;
- }
- mutex_exit(&statep->inst_lock);
-
- ATRACE_32("audioixp_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audioixp_ad_set_config() */
-
-/*
- * audioixp_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audioixp_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audioixp_state_t *statep;
- uint16_t val;
- uint32_t slot;
- uint32_t cmd;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- ATRACE_32("audioixp_ad_set_format() stream", stream);
- ATRACE_32("audioixp_ad_set_format() dir", dir);
- ATRACE_32("audioixp_ad_set_format() sample_rate", sample_rate);
- ATRACE_32("audioixp_ad_set_format() channels", channels);
- ATRACE_32("audioixp_ad_set_format() precision", precision);
- ATRACE_32("audioixp_ad_set_format() encoding", encoding);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->var_sr == B_FALSE) {
- /* codec doesn't support variable sample rate */
-
- if (sample_rate != IXP_SAMPR48000) {
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad sample"
- " rate %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- } else {
- switch (sample_rate) {
- case IXP_SAMPR8000: break;
- case IXP_SAMPR11025: break;
- case IXP_SAMPR16000: break;
- case IXP_SAMPR22050: break;
- case IXP_SAMPR24000: break;
- case IXP_SAMPR32000: break;
- case IXP_SAMPR44100: break;
- case IXP_SAMPR48000: break;
- default:
- ATRACE_32("audioixp_ad_set_format() bad SR",
- sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- if (dir == AUDIO_PLAY) {
-
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("audioixp_ad_set_format()"
- " bad out SR", sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad out"
- " SR %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- slot = IXP_AM_GET32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD);
- slot |= IXP_AUDIO_OUT_DMA_SLOT_3
- | IXP_AUDIO_OUT_DMA_SLOT_4;
- slot &= ~ (IXP_AUDIO_OUT_DMA_SLOT_5
- |IXP_AUDIO_OUT_DMA_SLOT_6
- |IXP_AUDIO_OUT_DMA_SLOT_7
- |IXP_AUDIO_OUT_DMA_SLOT_8
- |IXP_AUDIO_OUT_DMA_SLOT_9
- |IXP_AUDIO_OUT_DMA_SLOT_10
- |IXP_AUDIO_OUT_DMA_SLOT_11
- |IXP_AUDIO_OUT_DMA_SLOT_12);
-
- IXP_AM_PUT32(IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD, slot);
-
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- cmd |= IXP_AUDIO_CMD_INTER_OUT;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
-
- statep->ixp_psample_rate = sample_rate;
- statep->ixp_pchannels = channels;
- statep->ixp_pprecision = precision;
- } else {
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
-
- /*
- * Some codecs before ac97 2.2, such as YMF753 produced by
- * Yamaha LSI, don't have the AC'97 registers indexed range
- * from 0x2c to 0x34. So we assume this kind of codec
- * supports fixed 48k sample rate.
- */
- if (statep->var_sr == B_TRUE) {
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, &val);
- if (val != sample_rate) {
- ATRACE_32("audioixp_ad_set_format() bad"
- " in SR", sample_rate);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!audioixp_ad_set_format() bad in"
- " SR %d\n", sample_rate);
- mutex_exit(&statep->inst_lock);
- return (AUDIO_FAILURE);
- }
- }
-
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- cmd |= IXP_AUDIO_CMD_INTER_IN;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
-
- statep->ixp_csample_rate = sample_rate;
- statep->ixp_cchannels = channels;
- statep->ixp_cprecision = precision;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
-
- ATRACE_32("audioixp_ad_set_format() returning success", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_ad_set_format() */
-
-/*
- * audioixp_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audioixp_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- int rc = AUDIO_SUCCESS;
-
-
- ATRACE_32("audioixp_ad_start_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & IXP_DMA_PLAY_PAUSED) {
- statep->flags |= IXP_DMA_PLAY_STARTED;
- statep->flags &= ~IXP_DMA_PLAY_PAUSED;
- audioixp_start_dma(statep, AUDIO_PLAY);
- IXP_AM_UPDATE32(
- IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- IXP_AUDIO_CMD_EN_OUT);
- goto done;
- }
-
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- goto done;
- }
-
- audioixp_start_dma(statep, AUDIO_PLAY);
- rc = audioixp_fill_play_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= IXP_DMA_PLAY_STARTED;
- }
-
-done:
- mutex_exit(&statep->inst_lock);
- return (rc);
-
-} /* audioixp_ad_start_play() */
-
-/*
- * audioixp_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
-
- statep = audio_sup_get_private(ahandle);
-
- ASSERT(statep);
- ATRACE("audioixp_ad_pause_play() ", ahandle);
- ATRACE_32("audioixp_ad_pause_play() stream", stream);
-
- mutex_enter(&statep->inst_lock);
-
- if ((statep->flags & IXP_DMA_PLAY_STARTED) == 0) {
- mutex_exit(&statep->inst_lock);
- return;
- }
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT, 0);
- statep->flags |= IXP_DMA_PLAY_PAUSED;
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_pause_play() */
-
-/*
- * audioixp_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- audioixp_sample_buf_t *buf;
-
- ATRACE("audioixp_ad_stop_play() ", ahandle);
- ATRACE_32("audioixp_ad_stop_play() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_OUT, 0);
- audioixp_stop_dma(statep, AUDIO_PLAY);
-
- buf = &statep->play_buf;
- buf->io_started = B_FALSE;
- statep->flags &= ~(IXP_DMA_PLAY_STARTED
- | IXP_DMA_PLAY_PAUSED | IXP_DMA_PLAY_EMPTY);
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_stop_play() */
-
-/*
- * audioixp_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audioixp_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- int rc;
-
- ATRACE("audioixp_ad_start_record() ", ahandle);
- ATRACE_32("audioixp_ad_start_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
-
- if (statep->flags & IXP_DMA_RECD_STARTED) {
- mutex_exit(&statep->inst_lock);
- return (AUDIO_SUCCESS);
- }
-
- audioixp_start_dma(statep, AUDIO_RECORD);
- rc = audioixp_prepare_record_buf(statep);
- if (rc == AUDIO_SUCCESS) {
- statep->flags |= IXP_DMA_RECD_STARTED;
- }
-
- mutex_exit(&statep->inst_lock);
-
- return (rc);
-
-} /* audioixp_ad_start_record() */
-
-/*
- * audioixp_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audioixp_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audioixp_state_t *statep;
- audioixp_sample_buf_t *buf;
-
- ATRACE("audioixp_ad_stop_record() ", ahandle);
- ATRACE_32("audioixp_ad_stop_record() stream", stream);
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->inst_lock);
- statep->flags &= ~IXP_DMA_RECD_STARTED;
-
- buf = &statep->record_buf;
- buf->io_started = B_FALSE;
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_EN_IN, 0);
- audioixp_stop_dma(statep, AUDIO_RECORD);
-
- mutex_exit(&statep->inst_lock);
-
-} /* audioixp_ad_stop_record() */
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audioixp_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audioixp_attach() would need to be fixed as well.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audioixp_init_state(audioixp_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int cdrom;
- int mode;
-
- ATRACE("audioixp_init_state()", NULL);
-
- statep->dip = dip;
- statep->vol_bits_mask = 5;
-
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", 1)) {
- mode = AM_MIXER_MODE;
- } else {
- mode = AM_COMPAT_MODE;
- }
-
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", IXP_INTS);
- if (pints > IXP_MAX_INTS) {
- ATRACE_32("audioixp_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, IXP_INTS);
- pints = IXP_INTS;
- } else if (pints < IXP_MIN_INTS) {
- ATRACE_32("audioixp_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, IXP_INTS);
- pints = IXP_INTS;
- }
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", IXP_INTS);
- if (rints > IXP_MAX_INTS) {
- ATRACE_32("audioixp_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "record interrupt rate set too high, %d, resetting to "
- "%d",
- rints, IXP_INTS);
- rints = IXP_INTS;
- } else if (rints < IXP_MIN_INTS) {
- ATRACE_32("audioixp_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "audioixp_init_state() "
- "record interrupt rate set too low, %d, resetting to "
- "%d",
- rints, IXP_INTS);
- rints = IXP_INTS;
- }
-
- /* fill in the device default state */
- statep->ixp_defaults.play.sample_rate = IXP_DEFAULT_SR;
- statep->ixp_defaults.play.channels = IXP_DEFAULT_CH;
- statep->ixp_defaults.play.precision = IXP_DEFAULT_PREC;
- statep->ixp_defaults.play.encoding = IXP_DEFAULT_ENC;
- statep->ixp_defaults.play.gain = IXP_DEFAULT_PGAIN;
- statep->ixp_defaults.play.port =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.avail_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.mod_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT;
- statep->ixp_defaults.play.buffer_size = IXP_BSIZE;
- statep->ixp_defaults.play.balance = IXP_DEFAULT_BAL;
-
- statep->ixp_defaults.record.sample_rate = IXP_DEFAULT_SR;
- statep->ixp_defaults.record.channels = IXP_DEFAULT_CH;
- statep->ixp_defaults.record.precision = IXP_DEFAULT_PREC;
- statep->ixp_defaults.record.encoding = IXP_DEFAULT_ENC;
- statep->ixp_defaults.record.gain = IXP_DEFAULT_PGAIN;
- statep->ixp_defaults.record.port = AUDIO_MICROPHONE;
- statep->ixp_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->ixp_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->ixp_defaults.record.buffer_size = IXP_BSIZE;
- statep->ixp_defaults.record.balance = IXP_DEFAULT_BAL;
-
- statep->ixp_defaults.monitor_gain = IXP_DEFAULT_MONITOR_GAIN;
- statep->ixp_defaults.output_muted = B_FALSE;
- statep->ixp_defaults.ref_cnt = B_FALSE;
- statep->ixp_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX | AUDIO_HWFEATURE_PLAY |
- AUDIO_HWFEATURE_IN2OUT | AUDIO_HWFEATURE_RECORD;
- statep->ixp_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (cdrom) {
- statep->ixp_defaults.record.avail_ports |= AUDIO_CD;
- statep->ixp_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->ixp_psample_rate =
- statep->ixp_defaults.play.sample_rate;
- statep->ixp_pchannels =
- statep->ixp_defaults.play.channels;
- statep->ixp_pprecision =
- statep->ixp_defaults.play.precision;
- statep->ixp_csample_rate =
- statep->ixp_defaults.record.sample_rate;
- statep->ixp_cchannels =
- statep->ixp_defaults.record.channels;
- statep->ixp_cprecision =
- statep->ixp_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->ad_info.ad_mode = mode;
- statep->ad_info.ad_int_vers = AM_VERSION;
- statep->ad_info.ad_add_mode = NULL;
- statep->ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->ad_info.ad_defaults = &statep->ixp_defaults;
- statep->ad_info.ad_play_comb = audioixp_combinations;
- statep->ad_info.ad_rec_comb = audioixp_combinations;
- statep->ad_info.ad_entry = &audioixp_entry;
- statep->ad_info.ad_dev_info = &statep->ixp_dev_info;
- statep->ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->ad_info.ad_misc_flags = AM_MISC_RP_EXCL | AM_MISC_MONO_DUP;
- statep->ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->ad_info.ad_play.ad_mixer_srs =
- audioixp_mixer_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audioixp_compat_sample_rates;
- statep->ad_info.ad_play.ad_conv = &am_src2;
- statep->ad_info.ad_play.ad_sr_info = NULL;
- statep->ad_info.ad_play.ad_chs = audioixp_channels;
- statep->ad_info.ad_play.ad_int_rate = pints;
- statep->ad_info.ad_play.ad_max_chs = IXP_MAX_OUT_CHANNELS;
- statep->ad_info.ad_play.ad_bsize = IXP_BSIZE;
-
- /* record capabilities */
- statep->ad_info.ad_record.ad_mixer_srs =
- audioixp_mixer_sample_rates;
- statep->ad_info.ad_record.ad_compat_srs =
- audioixp_compat_sample_rates;
- statep->ad_info.ad_record.ad_conv = &am_src2;
- statep->ad_info.ad_record.ad_sr_info = NULL;
- statep->ad_info.ad_record.ad_chs = audioixp_channels;
- statep->ad_info.ad_record.ad_int_rate = rints;
- statep->ad_info.ad_record.ad_max_chs = IXP_MAX_CHANNELS;
- statep->ad_info.ad_record.ad_bsize = IXP_BSIZE;
-
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &statep->intr_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
- mutex_init(&statep->inst_lock, NULL, MUTEX_DRIVER, statep->intr_iblock);
-
- /* fill in device info strings */
- (void) strcpy(statep->ixp_dev_info.name, IXP_DEV_NAME);
- (void) strcpy(statep->ixp_dev_info.config, IXP_DEV_CONFIG);
- (void) strcpy(statep->ixp_dev_info.version, IXP_DEV_VERSION);
-
- statep->play_buf_size = IXP_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / pints;
- statep->play_buf_size += IXP_MOD_SIZE -
- (statep->play_buf_size % IXP_MOD_SIZE);
- statep->record_buf_size = IXP_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / rints;
- statep->record_buf_size += IXP_MOD_SIZE - 1;
- statep->record_buf_size -= statep->record_buf_size % IXP_MOD_SIZE;
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_init_state() */
-
-/*
- * audioixp_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audioixp_map_regs(dev_info_t *dip, audioixp_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
-
- ATRACE("audioixp_map_regs()", statep);
-
- statep->ixp_res_flags = 0;
-
- /* map PCI config space */
- if (pci_config_setup(statep->dip, &statep->pci_conf_handle) ==
- DDI_FAILURE) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() configuration "
- "memory mapping failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_PCI_REGS;
-
- /* map audio mixer register */
- if ((ddi_regs_map_setup(dip, IXP_IO_AM_REGS,
- (caddr_t *)&statep->am_regs_base, 0, 0,
- &dev_attr, &statep->am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() audio mixer "
- "memory mapping failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_AM_REGS;
-
- /*
- * now, from here we allocate DMA memory for buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() ddi_dma_alloc_handle(bdlist)"
- " failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_HANDLE;
-
- if (ddi_dma_mem_alloc(statep->bdl_dma_handle,
- sizeof (audioixp_bd_list_t), &dev_attr, DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, NULL, (caddr_t *)&statep->bdl_virtual,
- &statep->bdl_size, &statep->bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() ddi_dma_mem_alloc(bdlist) "
- "failed");
- goto error;
- }
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->bdl_dma_handle, NULL,
- (caddr_t)statep->bdl_virtual, statep->bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() addr_bind_handle failed");
- goto error;
- }
-
- /*
- * there are some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_map_regs() addr_bind_handle failed,"
- " cookies > 1");
- goto error;
- }
-
- statep->bdl_phys =
- (audioixp_bd_list_t *)(long)(cookie.dmac_address);
- statep->ixp_res_flags |= IXP_RS_DMA_BDL_BIND;
-
- return (AUDIO_SUCCESS);
-
-error:
- audioixp_unmap_regs(statep);
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_map_regs() */
-
-/*
- * audioixp_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and then unmaps control registers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_unmap_regs(audioixp_state_t *statep)
-{
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_BIND) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->bdl_dma_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_MEM) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->bdl_acc_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_DMA_BDL_HANDLE) {
- statep->ixp_res_flags &= ~IXP_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->bdl_dma_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_AM_REGS) {
- statep->ixp_res_flags &= ~IXP_RS_AM_REGS;
- ddi_regs_map_free(&statep->am_regs_handle);
- }
-
- if (statep->ixp_res_flags & IXP_RS_PCI_REGS) {
- statep->ixp_res_flags &= ~IXP_RS_PCI_REGS;
- pci_config_teardown(&statep->pci_conf_handle);
- }
-
-} /* audioixp_unmap_regs() */
-
-/*
- * audioixp_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * IXP_DMA_PCM_IN ---PCM in DMA engine
- * IXP_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-
-static int
-audioixp_alloc_sample_buf(audioixp_state_t *statep, int which, int len)
-{
- audioixp_sample_buf_t *buf;
- audioixp_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
-
- if (which == IXP_DMA_PCM_OUT) {
- buf = &statep->play_buf;
- } else {
- ASSERT(which == IXP_DMA_PCM_IN);
- buf = &statep->record_buf;
- }
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
-
- if (ddi_dma_alloc_handle(statep->dip, &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len, &dev_attr,
- DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL,
- &chunk->data_buf, &chunk->real_len,
- &chunk->acc_handle) != DDI_SUCCESS) {
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len, DDI_DMA_WRITE,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- /*
- * there some bugs in the DDI framework and it is possible to
- * get multiple cookies
- */
- if (count != 1) {
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- goto error;
- }
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
-
- return (AUDIO_SUCCESS);
-
-error:
- if (i != 0) {
- (void) ddi_dma_unbind_handle((buf->chunk[0].dma_handle));
- ddi_dma_mem_free(&(buf->chunk[0].acc_handle));
- ddi_dma_free_handle(&(buf->chunk[0].dma_handle));
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_alloc_sample_buf() */
-
-/*
- * audioixp_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audioixp_alloc_sample_buf().
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * audioixp_sample_buf_t *buf The sample buffer structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_free_sample_buf(audioixp_state_t *statep,
- audioixp_sample_buf_t *buf)
-{
- audioixp_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audioixp_free_sample_buf() audioixp_statep", statep);
-
- for (i = 0; i < 2; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- chunk->acc_handle = 0;
- ddi_dma_free_handle(&chunk->dma_handle);
- }
-
-} /* audioixp_free_sample_buf() */
-
-
-/*
- * audioixp_setup_bdl()
- *
- * Description:
- * This routine setup the buf descriptor list.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-
-static void audioixp_setup_bdl(audioixp_state_t *statep)
-{
- int i;
- audioixp_bd_entry_t *bd_p;
-
- /* setup playback bdlist */
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- bd_p = &(((audioixp_bd_list_t *)(statep->bdl_virtual))
- ->pcm_out[i]);
- bd_p->buf_base = statep->play_buf.chunk[i&IXP_CHUNK_MASK]
- .addr_phy;
- bd_p->status = 0;
- bd_p->buf_len = 0;
- bd_p->next = (uintptr_t)&(((audioixp_bd_list_t *)
- (statep->bdl_phys))->pcm_out[(i+1)%IXP_BD_NUMS]);
- }
-
- /* setup record bdlist */
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- bd_p = &(((audioixp_bd_list_t *)(statep->bdl_virtual))
- ->pcm_in[i]);
- bd_p->buf_base = statep->record_buf.chunk[i&IXP_CHUNK_MASK]
- .addr_phy;
- bd_p->status = 0;
- bd_p->buf_len = 0;
- bd_p->next = (uintptr_t)&(((audioixp_bd_list_t *)
- (statep->bdl_phys))->pcm_in[(i+1)%IXP_BD_NUMS]);
- }
-} /* audioixp_setup_bdl() */
-
-/*
- * audioixp_start_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into working state.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_start_dma(audioixp_state_t *statep, int dir)
-{
-
- ASSERT(dir == AUDIO_PLAY || dir == AUDIO_RECORD);
-
- if (dir == AUDIO_PLAY) {
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_OUT);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT_DMA,
- IXP_AUDIO_CMD_EN_OUT_DMA);
- } else {
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN_DMA,
- IXP_AUDIO_CMD_EN_IN_DMA);
- }
-
-} /* audioixp_start_dma() */
-
-/*
- * audioixp_stop_dma()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_stop_dma(audioixp_state_t *statep, int dir)
-{
-
- ASSERT(dir == AUDIO_PLAY || dir == AUDIO_RECORD);
-
- IXP_AM_PUT32(IXP_AUDIO_FIFO_FLUSH, IXP_AUDIO_FIFO_FLUSH_IN);
-
- if (dir == AUDIO_PLAY) {
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT_DMA,
- 0);
- } else {
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN_DMA,
- 0);
- }
-
-} /* audioixp_stop_dma() */
-
-
-/*
- * audioixp_codec_ready ()
- *
- * Description:
- * This routine checks the state of codecs. This routine is called by
- * chip_init before interrupt is enabled. It enables interrupt first,
- * then waits a moment for interrupt handler to set the flag according
- * to the hardware configuration. Then it checks the flag to confirm
- * that primary codec is ready. The original value of interrupt enable
- * register is restored.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS codec is ready
- * AUDIO_FAILURE codec is not ready
- */
-static int
-audioixp_codec_ready(audioixp_state_t *statep)
-{
- uint32_t old_reg;
-
- old_reg = IXP_AM_GET32(IXP_AUDIO_INT_EN);
-
- IXP_AM_UPDATE32(IXP_AUDIO_INT_EN,
- IXP_AUDIO_INT_EN_CODEC0_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC1_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC2_NOT_READY,
- IXP_AUDIO_INT_EN_CODEC0_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC1_NOT_READY
- | IXP_AUDIO_INT_EN_CODEC2_NOT_READY);
-
- drv_usecwait(1000);
- IXP_AM_PUT32(IXP_AUDIO_INT_EN, old_reg);
-
- if (statep->ixp_codec_not_ready_bits & IXP_AUDIO_INT_CODEC0_NOT_READY) {
- audio_sup_log(NULL, CE_WARN, "primary codec not ready");
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-}
-
-/*
- * audioixp_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audioixp_codec_sync(audioixp_state_t *statep)
-{
- int i;
- uint32_t cmd;
-
- for (i = 0; i < 300; i++) {
- cmd = IXP_AM_GET32(IXP_AUDIO_OUT_PHY_ADDR_DATA);
- if (!(cmd & IXP_AUDIO_OUT_PHY_EN)) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_codec_sync() */
-
-
-/*
- * audioixp_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audioixp_read_ac97(audioixp_state_t *statep, int reg, uint16_t *data)
-{
- uint32_t value;
- uint32_t result;
- int i;
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
-
- value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC
- | IXP_AUDIO_OUT_PHY_READ
- | IXP_AUDIO_OUT_PHY_EN
- | ((reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT)
- & IXP_AUDIO_OUT_PHY_ADDR_MASK);
- IXP_AM_PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- *data = 0xffff;
- return (AUDIO_FAILURE);
- }
-
- for (i = 0; i < 300; i++) {
- result = IXP_AM_GET32(IXP_AUDIO_IN_PHY_ADDR_DATA);
- if (result & IXP_AUDIO_IN_PHY_READY) {
- *data = (result & IXP_AUDIO_IN_PHY_DATA_MASK)
- >> IXP_AUDIO_IN_PHY_DATA_SHIFT;
- statep->codec_shadow[IXP_CODEC_REG(reg)] = *data;
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(10);
- }
-
- *data = 0xffff;
- return (AUDIO_FAILURE);
-
-} /* audioixp_read_ac97() */
-
-/*
- * audioixp_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_write_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
- uint32_t value;
-
- if (audioixp_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- value = IXP_AUDIO_OUT_PHY_PRIMARY_CODEC
- | IXP_AUDIO_OUT_PHY_WRITE
- | IXP_AUDIO_OUT_PHY_EN
- | ((reg << IXP_AUDIO_OUT_PHY_ADDR_SHIFT)
- & IXP_AUDIO_OUT_PHY_ADDR_MASK)
- | ((data << IXP_AUDIO_OUT_PHY_DATA_SHIFT)
- & IXP_AUDIO_OUT_PHY_DATA_MASK);
- IXP_AM_PUT32(IXP_AUDIO_OUT_PHY_ADDR_DATA, value);
-
- (void) audioixp_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_write_ac97() */
-
-/*
- * audioixp_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_and_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- data &= statep->codec_shadow[IXP_CODEC_REG(reg)];
- if (audioixp_write_ac97(statep, reg, data) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_and_ac97() */
-
-/*
- * audioixp_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audioixp_or_ac97(audioixp_state_t *statep, int reg, uint16_t data)
-{
- data |= statep->codec_shadow[IXP_CODEC_REG(reg)];
- if (audioixp_write_ac97(statep, reg, data) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_or_ac97() */
-
-/*
- * audioixp_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audioixp_reset_ac97(audioixp_state_t *statep)
-{
- uint32_t cmd;
- int i;
-
- IXP_AM_UPDATE32(IXP_AUDIO_CMD, IXP_AUDIO_CMD_POWER_DOWN, 0);
- drv_usecwait(10);
-
- /* register reset */
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_AC_SOFT_RESET,
- IXP_AUDIO_CMD_AC_SOFT_RESET);
-
- drv_usecwait(10);
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_AC_SOFT_RESET,
- 0);
-
- /* cold reset */
- for (i = 0; i < 300; i++) {
- cmd = IXP_AM_GET32(IXP_AUDIO_CMD);
- if (cmd & IXP_AUDIO_CMD_AC_ACTIVE) {
- cmd |= IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- return (AUDIO_SUCCESS);
- }
- cmd &= ~IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- (void) IXP_AM_GET32(IXP_AUDIO_CMD);
- drv_usecwait(10);
- cmd |= IXP_AUDIO_CMD_AC_RESET;
- IXP_AM_PUT32(IXP_AUDIO_CMD, cmd);
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audioixp_reset_ac97() */
-
-/*
- * audioixp_chunk_processed()
- *
- * Description:
- * This routine returns the count of chunk processed. It's called by
- * audioixp_reclaim_play_buf and audioixp_reclaim_record_buf
- * This routine compares the current hw_point value with its last value,
- * there're two cases:
- * case 1: new pointer is bigger than the last one and smaller than the
- * last one + len of the last chunk, which mean the current
- * chunk has not been finished, return 0.
- * case 2: the hw_pointer return to the old value, which means both chunks
- * have been processed,return 2
- * case 3: one chunk is processed, return 1.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- *
- * Returns:
- * count of chunk processed
- */
-static int
-audioixp_chunk_processed(audioixp_state_t *statep, int dir)
-{
- audioixp_sample_buf_t *buf;
- uint32_t hw_pointer;
- int result;
- audioixp_bd_entry_t *bd;
- int i;
- int retry_count;
-
- ASSERT(mutex_owned(&statep->inst_lock));
-
- retry_count = 0;
- while (++retry_count < 100) {
- if (dir == AUDIO_PLAY) {
- buf = &statep->play_buf;
- hw_pointer = IXP_AM_GET32(IXP_AUDIO_OUT_DMA_DT_CUR);
- } else {
- buf = &statep->record_buf;
- hw_pointer = IXP_AM_GET32(IXP_AUDIO_IN_DMA_DT_CUR);
- }
-
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- if (dir == AUDIO_PLAY)
- bd = &statep->bdl_virtual->pcm_out[i];
- else
- bd = &statep->bdl_virtual->pcm_in[i];
-
- if (hw_pointer >= bd->buf_base &&
- hw_pointer < bd->buf_base + bd->buf_len*4)
- break;
- }
-
- if (i < IXP_BD_NUMS)
- break;
- }
-
- /*
- * cannot get valid hw_pointer, return 0 without updating
- * last_hw_pointer
- */
- if (retry_count == 100) {
- cmn_err(CE_WARN, "!bad hw_pointer, hw_pointer=0x%08x",
- hw_pointer);
- for (i = 0; i < IXP_BD_NUMS; i ++) {
- if (dir == AUDIO_PLAY)
- bd = &statep->bdl_virtual->pcm_out[i];
- else
- bd = &statep->bdl_virtual->pcm_in[i];
-
- cmn_err(CE_WARN, "!bd[%d], base=0x%08x, len=0x%x",
- i, bd->buf_base, bd->buf_len);
- }
- return (0);
- }
-
- if (buf->last_hw_pointer >= bd->buf_base && /* case 1 */
- hw_pointer > buf->last_hw_pointer &&
- hw_pointer < bd->buf_base + bd->buf_len * 4)
- result = 0;
- else if (buf->last_hw_pointer == hw_pointer) /* case 2 */
- result = 2;
- else /* case 3 */
- result = 1;
-
- buf->last_hw_pointer = hw_pointer;
-
- return (result);
-
-} /* audioixp_chunk_processed() */
-
-/*
- * audioixp_fill_play_buf()
- *
- * Description:
- * This routine is called by audioixp_ad_start_play() and the
- * interrupt handler. It fills playback samples into the DMA memory,
- * sets the BDL entries, and starts the playback DMA engine.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audioixp_fill_play_buf(audioixp_state_t *statep)
-{
- audioixp_bdlist_chunk_t *chunk;
- audioixp_sample_buf_t *buf;
- audioixp_bd_entry_t *bdesc;
- int samples;
- int rs;
-
- buf = &statep->play_buf;
-
- if (!buf->io_started) {
- /*
- * ready to start PCM out engine
- */
- IXP_AM_PUT32(
- IXP_AUDIO_OUT_DMA_LINK_P,
- (uint32_t)(uintptr_t)statep->bdl_phys->pcm_out |
- IXP_AUDIO_OUT_DMA_LINK_P_EN);
-
- buf->next = 0;
- buf->avail = 2; /* have only two buffers for playback */
- buf->last_hw_pointer = statep->bdl_virtual->pcm_out[0].buf_base;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->ixp_psample_rate * statep->ixp_pchannels /
- statep->ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->next & 1]);
- mutex_exit(&statep->inst_lock);
- rs = am_get_audio(statep->audio_handle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
-
- mutex_enter(&statep->inst_lock);
-
- if (((statep->flags & IXP_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- return (AUDIO_FAILURE);
- }
-
- if (rs <= 0) {
- if (statep->flags & IXP_DMA_PLAY_EMPTY) {
-
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->flags &= ~IXP_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->inst_lock);
- am_play_shutdown(statep->audio_handle, NULL);
- mutex_enter(&statep->inst_lock);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->flags & IXP_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- 0);
-
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->flags &= ~(IXP_DMA_PLAY_PAUSED |
- IXP_DMA_PLAY_EMPTY);
-
- return (AUDIO_FAILURE);
- } else {
- /*
- * this time, we use one BD entry with empty
- * buffer next time we shut down, if no sound
- * again
- */
- statep->flags |= IXP_DMA_PLAY_EMPTY;
- }
- } else {
- /* we got at least one sample */
- statep->flags &= ~IXP_DMA_PLAY_EMPTY;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs<<1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->bdl_virtual->pcm_out[buf->next]);
- bdesc->buf_len = (uint16_t)rs>>1; /* in dword */
-
- buf->avail --;
- buf->next ++;
- buf->next %= IXP_BD_NUMS;
- }
-
- /* start PCM out engine */
- if (!buf->io_started) {
- IXP_AM_UPDATE32(
- IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_OUT,
- IXP_AUDIO_CMD_EN_OUT);
-
- buf->io_started = B_TRUE;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_fill_play_buf() */
-
-/*
- * audioixp_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_reclaim_play_buf(audioixp_state_t *statep)
-{
-
- audioixp_sample_buf_t *buf;
-
- buf = &statep->play_buf;
- buf->avail += audioixp_chunk_processed(statep, AUDIO_PLAY);
-
- return;
-
-} /* audioixp_reclaim_play_buf() */
-
-/*
- * audioixp_prepare_record_buf()
- *
- * Description:
- * This routine is called by audioixp_ad_start_record(). It prepares
- * DMA memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- *
- */
-static int
-audioixp_prepare_record_buf(audioixp_state_t *statep)
-{
- audioixp_sample_buf_t *buf;
- audioixp_bd_entry_t *bdesc;
- int samples;
- int i;
-
- buf = &statep->record_buf;
-
- if (!buf->io_started) {
-
- /* buffer base */
- IXP_AM_PUT32(IXP_AUDIO_IN_DMA_LINK_P,
- (uint32_t)(uintptr_t)statep->bdl_phys->pcm_in |
- IXP_AUDIO_IN_DMA_LINK_P_EN);
- buf->next = 0;
- buf->avail = 2;
- buf->last_hw_pointer = statep->bdl_virtual->pcm_in[0].buf_base;
- }
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->ixp_csample_rate * statep->ixp_cchannels /
- statep->ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->ixp_csamples = samples;
- for (i = 0; i < 2; i ++) {
- samples = statep->ixp_csamples;
- bdesc = &(statep->bdl_virtual->pcm_in[i]);
- bdesc->buf_len = (uint16_t)samples >> 1; /* in dword */
- buf->avail --;
- }
-
- if (!buf->io_started) {
- buf->io_started = B_TRUE;
- IXP_AM_UPDATE32(IXP_AUDIO_CMD,
- IXP_AUDIO_CMD_EN_IN,
- IXP_AUDIO_CMD_EN_IN);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_prepare_record_buf() */
-
-/*
- * audioixp_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audioixp_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audioixp_reclaim_record_buf(audioixp_state_t *statep)
-{
- audioixp_bdlist_chunk_t *chunk;
- audioixp_sample_buf_t *buf;
- int samples;
-
- buf = &statep->record_buf;
- samples = statep->ixp_csamples;
-
- buf->avail += audioixp_chunk_processed(statep, AUDIO_RECORD);
-
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->next & 1];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- samples<<1, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->inst_lock);
- am_send_audio(statep->audio_handle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->inst_lock);
- buf->avail --;
- buf->next ++;
- buf->next %= IXP_BD_NUMS;
-
- if ((statep->flags & IXP_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-} /* audioixp_reclaim_record_buf() */
-
-/*
- * audioixp_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audioixp_set_gain(audioixp_state_t *statep, int dir, int gain,
- int channel)
-{
- uint16_t tmp;
- uint16_t channel_gain;
- int regidx;
- int max_channel_gain;
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- max_channel_gain = (1<<PCMOVR_GAIN_BITS)-1;
- channel_gain = 31-gain*max_channel_gain/AUDIO_MAX_GAIN;
-
- if (dir == AUDIO_PLAY) {
- if (statep->swap_out == B_TRUE) {
- regidx = AC97_EXTENDED_LRS_VOLUME_REGISTER;
- } else {
- regidx = AC97_PCM_OUT_VOLUME_REGISTER;
- }
- (void) audioixp_read_ac97(statep, regidx, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= PCMOVR_RIGHT_GAIN_MASK;
- tmp |= (channel_gain << 8);
- } else { /* right channel */
- tmp &= PCMOVR_LEFT_GAIN_MASK;
- tmp |= channel_gain;
- }
-
- (void) audioixp_write_ac97(statep, regidx, tmp);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- (void) audioixp_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= gain & RGR_LEFT_MASK;
- } else {
- /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= gain & RGR_RIGHT_MASK;
- }
- (void) audioixp_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audioixp_set_gain() */
-
-/*
- * audioixp_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set
- * AUDIO_SPEAKER output to built-in speaker
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audioixp_set_port(audioixp_state_t *statep, int dir, int port)
-{
- uint16_t tmp;
-
- if (dir == AUDIO_PLAY) { /* output port */
- tmp = 0;
- if (port == IXP_PORT_UNMUTE) {
- port = statep->ixp_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audioixp_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- } else {
- (void) audioixp_and_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- (uint16_t)~AD1980_SURR_MUTE);
- }
- tmp |= AUDIO_LINE_OUT;
- } else {
- if (statep->swap_out == B_FALSE) {
- (void) audioixp_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_EXTENDED_LRS_VOLUME_REGISTER,
- AD1980_SURR_MUTE);
- }
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audioixp_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audioixp_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- ATRACE_32("audioixp_set_port() out port", tmp);
- statep->ixp_output_port = tmp;
- if (tmp != port) {
- ATRACE_32("audioixp_set_port() bad out port", port);
- return (AUDIO_FAILURE);
- }
-
- } else { /* input port */
- ASSERT(dir == AUDIO_RECORD);
-
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
-
- /* mute the master record input */
- (void) audioixp_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- (void) audioixp_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->ixp_monitor_gain);
- }
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
-
- if (statep->ixp_monitor_gain) {
- if (statep->ixp_input_port ==
- AUDIO_LINE_IN) {
- (void) audioixp_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_MICROPHONE) {
- (void) audioixp_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->ixp_input_port ==
- AUDIO_CD) {
- (void) audioixp_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
-
- default:
- ATRACE_32("audioixp_set_port bad in port", port);
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audioixp_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
- if ((port != AUDIO_NONE) &&
- (statep->codec_shadow[IXP_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audioixp_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->ixp_input_port = port;
- }
-
- ATRACE_32("audioixp_set_port() returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* audioixp_set_port() */
-
-/*
- * audioixp_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audioixp_set_monitor_gain(audioixp_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audioixp_set_monitor_gain()", statep);
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = AUDIO_MAX_GAIN - gain;
- tmp_short = ((tmp_short << statep->vol_bits_mask) - tmp_short)
- / AUDIO_MAX_GAIN;
- tmp_short |= (((tmp_short << statep->vol_bits_mask) -
- tmp_short) / AUDIO_MAX_GAIN) << 8;
- }
-
- switch (statep->ixp_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |=
- statep->codec_shadow[IXP_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audioixp_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audioixp_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audioixp_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("audioixp_ad_set_config() monitor gain bad device",
- NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->ixp_monitor_gain = 0;
- } else {
- statep->ixp_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE_32("audioixp_set_monitor_gain()", rc);
-
- return (rc);
-
-} /* audioixp_set_monitor_gain() */
-
-/*
- * audioixp_chip_init()
- *
- * Description:
- * This routine initializes ATI IXP audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- * int restore If IXP_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audioixp_chip_init(audioixp_state_t *statep, int restore)
-{
- uint16_t *shadow;
- int i;
- int j;
- uint16_t xid;
- uint16_t vid1;
- uint16_t vid2;
- uint16_t sr;
- uint16_t tmp;
-
- /*
- * put the audio controller into quiet state, everything off
- */
- audioixp_stop_dma(statep, AUDIO_PLAY);
- audioixp_stop_dma(statep, AUDIO_RECORD);
-
- /* AC97 reset */
- if (audioixp_reset_ac97(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_chip_init() AC97 codec reset failed");
- return (AUDIO_FAILURE);
- }
-
- if (audioixp_codec_ready(statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!audioixp_chip_init() AC97 codec not ready");
- return (AUDIO_FAILURE);
- }
-
- shadow = statep->codec_shadow;
-
- if (restore == IXP_INIT_NO_RESTORE) {
- for (i = 0; i <= IXP_LAST_AC_REG; i += 2) {
- (void) audioixp_read_ac97(statep, i,
- &(shadow[IXP_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[IXP_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
-
- /* 08h - set master tone control to no modification */
- shadow[IXP_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /*
- * 0ah - turn pc beep mute off, 0dB
- *
- * AC'97 Spec does define the optional PC Beep support, that is,
- * the BIOS (dependent on hardware design) can use the audio
- * hardware for the beep, especially on some laptops, in order
- * to save cost. So we have to turn the pc_beep mute off, that
- * is, enable the PC Beep support.
- */
- shadow[IXP_CODEC_REG(AC97_PC_BEEP_REGISTER)] =
- PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[IXP_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[IXP_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[IXP_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[IXP_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- shadow[IXP_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[IXP_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- shadow[IXP_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * The rest we ignore, most are reserved.
- */
-
- }
-
- if (restore == IXP_INIT_RESTORE) {
- /* Restore from saved values */
- shadow[IXP_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- shadow[IXP_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= IXP_LAST_AC_REG; i += 2)
- (void) audioixp_write_ac97(statep, i,
- shadow[IXP_CODEC_REG(i)]);
-
- (void) audioixp_read_ac97(statep, AC97_RESET_REGISTER, &tmp);
- if (tmp & RR_HEADPHONE_SUPPORT) {
- statep->ixp_defaults.play.port |= AUDIO_HEADPHONE;
- statep->ixp_defaults.play.avail_ports |= AUDIO_HEADPHONE;
- statep->ixp_defaults.play.mod_ports |= AUDIO_HEADPHONE;
- }
-
- /*
- * Most vendors connect the surr-out of ad1980/ad1985 codecs to the
- * line-out jack. So far we haven't found which vendors don't
- * do that. So we assume that all vendors swap the surr-out
- * and the line-out outputs. So we need swap the two outputs.
- * But we still internally process the "ad198x-swap-output"
- * property. If someday some vendors do not swap the outputs,
- * we would set "ad198x-swap-output = 0" in the
- * /kernel/drv/audioixp.conf file, and unload and reload the
- * audioixp driver (or reboot).
- */
- (void) audioixp_read_ac97(statep, AC97_VENDOR_ID1_REGISTER, &vid1);
- (void) audioixp_read_ac97(statep, AC97_VENDOR_ID2_REGISTER, &vid2);
- if (vid1 == AD1980_VID1 &&
- (vid2 == AD1980_VID2 || vid2 == AD1985_VID2)) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, statep->dip,
- DDI_PROP_DONTPASS, "ad198x-swap-output", 1) == 1) {
- statep->swap_out = B_TRUE;
- (void) audioixp_read_ac97(statep, CODEC_AD_REG_MISC,
- &tmp);
- (void) audioixp_write_ac97(statep,
- CODEC_AD_REG_MISC,
- tmp | AD1980_MISC_LOSEL | AD1980_MISC_HPSEL);
- }
- }
-
- /*
- * check if the codec implements 6 bit volume register,
- * but the ALC202 does not strictly obey the AC'97 Spec
- * and it only supports 5 bit volume register, so we
- * skip the check for it as a workaround.
- */
- if (!(vid1 == ALC202_VID1 && vid2 == ALC202_VID2)) {
- (void) audioixp_write_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE |
- MVR_RIGHT_OPTIONAL_MASK | MVR_LEFT_OPTIONAL_MASK);
-
- (void) audioixp_read_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, &tmp);
-
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->vol_bits_mask = 6;
- }
- }
-
- /* resume the master volume to the max */
- (void) audioixp_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip does not support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audioixp_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER,
- &xid);
- audio_sup_log(statep->audio_handle, CE_NOTE,
- "!%s%d: xid=0x%04x, vid1=0x%04x, vid2=0x%04x",
- audioixp_name, ddi_get_instance(statep->dip), xid, vid1, vid2);
- if (!(xid & EAR_VRA)) {
- statep->var_sr = B_FALSE;
- statep->ad_info.ad_record.ad_compat_srs =
- audioixp_min_compat_sample_rates;
- statep->ad_info.ad_play.ad_compat_srs =
- audioixp_min_compat_sample_rates;
- statep->ixp_defaults.play.sample_rate =
- IXP_SAMPR48000;
- statep->ixp_defaults.record.sample_rate =
- IXP_SAMPR48000;
- } else { /* variable sample rate supported */
- statep->var_sr = B_TRUE;
-
- /* set variable rate mode */
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
-
- /* check the sample rates supported */
- for (i = 0, j = 0; audioixp_compat_srs[i] != 0; i++) {
- (void) audioixp_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER,
- audioixp_compat_srs[i]);
- (void) audioixp_read_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, &sr);
-
- if (sr == audioixp_compat_srs[i]) {
- if (i != j) {
- audioixp_compat_srs[j] =
- audioixp_compat_srs[i];
- }
- j++;
- }
- }
-
- if (j < 1) {
- audio_sup_log(statep->audio_handle, CE_WARN,
- "!No standard sample rate is supported");
- return (AUDIO_FAILURE);
- }
- audioixp_compat_srs[j] = 0;
-
- /*
- * if the configuration doesn't support 8K sample rate,
- * we modify the default value to the first.
- */
- for (i = 0; audioixp_compat_srs[i] != 0; i++) {
- if (audioixp_compat_srs[i] == IXP_SAMPR8000) {
- break;
- }
- }
- if (audioixp_compat_srs[i] != IXP_SAMPR8000) {
- statep->ixp_defaults.play.sample_rate =
- audioixp_compat_srs[0];
- statep->ixp_defaults.record.sample_rate =
- audioixp_compat_srs[0];
- }
- }
-
- /* enable interrupts */
- IXP_AM_PUT32(IXP_AUDIO_INT, 0xffffffff);
- IXP_AM_PUT32(
- IXP_AUDIO_INT_EN,
- IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW |
- IXP_AUDIO_INT_EN_STATUS |
- IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW);
- return (AUDIO_SUCCESS);
-
-} /* audioixp_chip_init() */
-
-/*
- * audioixp_chip_fini()
- *
- * Description:
- * This routine disables hardware interrupts.
- *
- * Arguments:
- * audioixp_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void audioixp_chip_fini(audioixp_state_t *statep)
-{
- IXP_AM_PUT32(IXP_AUDIO_INT, IXP_AM_GET32(IXP_AUDIO_INT));
- IXP_AM_PUT32(IXP_AUDIO_INT_EN, 0);
-} /* audioixp_chip_fini() */
diff --git a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c b/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c
deleted file mode 100644
index d1a69da820..0000000000
--- a/usr/src/uts/common/io/audio/sada/drv/audiots/audiots.c
+++ /dev/null
@@ -1,4264 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audiots Audio Driver
- *
- * This Audio Driver controls the T2 audio core in the ALI M1553
- * southbridge chip. This chip supports multiple play streams, but just
- * a single record stream. It also supports wave table synthesis and
- * hardware MIDI and joystick ports. Unfortunately the MIDI ports are
- * not available because their pins have been re-assigned to expose
- * interrupts. We also aren't going to do anything with the joystick
- * ports. The audio core controls an AC-97 V2.1 Codec.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Although the play side of the
- * audio core supports multiple streams we don't use that feature.
- * The mixer needs to be fixed up first. Thus we let the mixer do it's
- * thing for both directions.
- *
- * The DMA engine uses a single buffer which is large enough to hold
- * two interrupts worth of data. When it gets to the mid point an
- * interrupt is generated and data is either sent (for record) or
- * requested and put in that half of the buffer (for play). When the
- * second half is played we do the same, but the audio core loops the
- * pointer back to the beginning. For play we bzero() the half buffer
- * before we ask for more audio. That way if there isn't enough waiting
- * for us we just play silence. If more arrives later we'll keep going,
- * but after a slight pop.
- *
- * The audio core has a bug in silicon that doesn't let it read the AC-97
- * Codec's register. T2 has provided an algorithm that attempts to read the
- * the Codec several times. This is probably heuristic and thus isn't
- * absolutely guaranteed to work. However we do have to place a limit on
- * the looping, otherwise when we read a valid 0x00 we would never exit
- * the loop. Unfortunately there is also a problem with writing the AC-97
- * Codec's registers as well. Thus we read it back to verify the write.
- *
- * Every time we program the AC-97 Codec we save the value in ts_shadow[].
- * Thus every time we need to get a Codec register we don't have to do
- * a very long read. This also means that register state information is
- * saved for power management shutdown (CPR). When the Codec is started
- * back up we use this saved state to restore the Codec's state in
- * audiots_chip_init().
- *
- * We don't save any of the audio controller registers during normal
- * operation. When we need to save register state we only have to save
- * the aram and eram. The rest of the controller state is never modified
- * from the initial programming. Thus restoring the controller state
- * can be done from audiots_chip_init() as well.
- *
- *
- * WARNING: The SME birdsnest platform uses a PCI bridge chip between the
- * CPU and the southbridge containing the audio core. There is
- * a bug in silicon that causes a bogus parity error. With the mixer
- * reimplementation project, Bug 4374774, the audio driver is always
- * set to the best precision and number of channels. Thus when turning
- * the mixer on and off the only thing that changes is the sample rate.
- * This change in programming doesn't trigger the silicon error.
- * Thus the supported channels must always be 2 and the precision
- * must always be 16-bits. This will keep any future change in the
- * mixer from exposing this bug.
- *
- * Due to a hardware bug, system power management is not supported by this
- * driver.
- *
- * CAUTION: If audio controller state is changed outside of aram
- * and eram then that information must be saved and restored
- * during power management shutdown and bringup.
- *
- * NOTE: The AC-97 Codec's reset pin is set to PCI reset, so we
- * can't power down the Codec all the way.
- *
- * NOTE: This driver depends on the misc/audiosup and misc/mixer
- * modules being loaded first.
- *
- * NOTE: Don't OR the ap_stop register to stop a play or record. This
- * will just stop all active channels because a read of ap_stop
- * returns ap_start. Just set the ap_stop register with the
- * channels you want to stop. The same goes for ap_start.
- *
- * NOTE: There is a hardware problem with P2 rev motherboards. After
- * prolonged use, reading the AC97 register will always return
- * busy. The AC97 register is now useless. Consequently, we are no
- * longer able to program the Codec. This work around disables
- * audio when this state is detected. It's not great, but its
- * better than having audio blasting out at 100% all the time.
- *
- * NOTE: Power Management testing has also exposed this AC97 timeout
- * problem. Management has decided this is too risky for customers
- * and hence they want power management support removed from the
- * audio subsystem. All PM support is now removed.
- */
-
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/audiots.h>
-#include <sys/audio/impl/audiots_impl.h>
-#include <sys/audio/ac97.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audiots_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-static int audiots_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audiots_detach(dev_info_t *, ddi_detach_cmd_t);
-static int audiots_power(dev_info_t *, int, int);
-
-/*
- * Entry point routine prototypes
- */
-static int audiots_ad_setup(audiohdl_t, int, int);
-static void audiots_ad_pause_play(audiohdl_t, int);
-static int audiots_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audiots_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audiots_ad_start_play(audiohdl_t, int);
-static void audiots_ad_stop_play(audiohdl_t, int);
-static int audiots_ad_start_record(audiohdl_t, int);
-static void audiots_ad_stop_record(audiohdl_t, int);
-
-/*
- * Local Routine Prototypes
- */
-static void audiots_and_ac97(audiots_state_t *, int, uint16_t);
-static void audiots_chip_init(audiots_state_t *, int);
-static uint16_t audiots_get_ac97(audiots_state_t *, int);
-static int audiots_init_state(audiots_state_t *, dev_info_t *);
-static uint_t audiots_intr(caddr_t);
-static int audiots_map_regs(dev_info_t *, audiots_state_t *);
-static void audiots_or_ac97(audiots_state_t *, int, uint16_t);
-static void audiots_power_down(audiots_state_t *);
-static void audiots_power_up(audiots_state_t *);
-static uint16_t audiots_read_ac97(audiots_state_t *, int);
-static void audiots_save_controller(audiots_state_t *);
-static void audiots_set_ac97(audiots_state_t *, int, const uint16_t);
-static int audiots_set_busy(audiots_state_t *);
-static int audiots_set_gain(audiots_state_t *, int, int, int, int);
-static void audiots_set_idle(audiots_state_t *);
-static int audiots_set_monitor_gain(audiots_state_t *, int);
-static int audiots_set_port(audiots_state_t *, int, int);
-static int audiots_start_play(audiots_state_t *);
-static void audiots_stop_play(audiots_state_t *);
-static int audiots_start_record(audiots_state_t *);
-static void audiots_stop_record(audiots_state_t *);
-static void audiots_stop_everything(audiots_state_t *);
-static void audiots_unmap_regs(audiots_state_t *);
-
-/*
- * Global variables, but viewable only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audiots_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audiots_name = TS_NAME;
-
-static uint_t audiots_mixer_srs[] = {
- TS_SAMPR5510, TS_SAMPR48000, 0
-};
-
-static uint_t audiots_compat_srs[] = {
- TS_SAMPR5510, TS_SAMPR6620, TS_SAMPR8000,
- TS_SAMPR9600, TS_SAMPR11025, TS_SAMPR16000,
- TS_SAMPR18900, TS_SAMPR22050, TS_SAMPR27420,
- TS_SAMPR32000, TS_SAMPR33075, TS_SAMPR37800,
- TS_SAMPR44100, TS_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t audiots_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audiots_mixer_srs
-};
-
-static am_ad_sample_rates_t audiots_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audiots_compat_srs
-};
-
-static uint_t audiots_channels[] = {
- AUDIO_CHANNELS_STEREO, 0
-};
-
-static am_ad_cap_comb_t audiots_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-static am_ad_entry_t audiots_entry = {
- audiots_ad_setup, /* ad_setup() */
- NULL, /* ad_teardown() */
- audiots_ad_set_config, /* ad_set_config() */
- audiots_ad_set_format, /* ad_set_format() */
- audiots_ad_start_play, /* ad_start_play() */
- audiots_ad_pause_play, /* ad_pause_play() */
- audiots_ad_stop_play, /* ad_stop_play() */
- audiots_ad_start_record, /* ad_start_record() */
- audiots_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info audiots_modinfo = {
- TS_IDNUM, /* module ID number */
- TS_NAME, /* module name */
- TS_MINPACKET, /* minimum packet size */
- TS_MAXPACKET, /* maximum packet size */
- TS_HIWATER, /* high water mark */
- TS_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audiots_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audiots_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audiots_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audiots_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audiots_str_info = {
- &audiots_rqueue, /* read queue */
- &audiots_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audiots_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audiots_str_info, /* cb_str */
- D_NEW|D_MP|D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
-
-/* Device operations structure */
-static struct dev_ops audiots_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audiots_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audiots_attach, /* devo_attach */
- audiots_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audiots_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- audiots_power, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audiots_modldrv = {
- &mod_driverops, /* drv_modops */
- TS_MOD_NAME, /* drv_linkinfo */
- &audiots_dev_ops /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audiots_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audiots_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-
-/*
- * NOTE: Grover OBP v4.0.166 and rev G of the ALI Southbridge chip force the
- * audiots driver to use the upper 2 GB DMA address range. However to maintain
- * backwards compatibility with older systems/OBP, we're going to try the full
- * 4 GB DMA range.
- *
- * Eventually, this will be set back to using the proper high 2 GB DMA range.
- */
-
-/* Device attribute structure - full 4 gig address range */
-static ddi_dma_attr_t audiots_attr = {
- DMA_ATTR_VERSION, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000003fffLL, /* DMA counter register - 16 bits */
- 0x0000000000000008LL, /* DMA address alignment, 64-bit */
- 0x0000007f, /* 1 through 64 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x0000000000003fffLL, /* maximum transfer size, 16k */
- 0x000000000000ffffLL, /* segment boundary, 64k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t ts_acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-
-/* ******* Loadable Module Configuration Entry Points ********************* */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audiots _init()", NULL);
-
- /* initialize the soft state */
- if ((error = ddi_soft_state_init(&audiots_statep,
- sizeof (audiots_state_t), 1)) != 0) {
- ATRACE("audiots ddi_soft_state_init() failed", audiots_statep);
- return (error);
- }
-
- if ((error = mod_install(&audiots_modlinkage)) != 0) {
- ddi_soft_state_fini(&audiots_statep);
- }
-
- ATRACE("audiots _init() audiots_statep", audiots_statep);
-
- ATRACE_32("audiots _init() returning", error);
-
- return (error);
-}
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiots _fini()", audiots_statep);
-
- if ((error = mod_remove(&audiots_modlinkage)) != 0) {
- return (error);
- }
-
- /* free the soft state internal structures */
- ddi_soft_state_fini(&audiots_statep);
-
- ATRACE_32("audiots _fini() returning", error);
-
- return (0);
-}
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns infomation about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audiots _info()", NULL);
-
- error = mod_info(&audiots_modlinkage, modinfop);
-
- ATRACE_32("audiots _info() returning", error);
-
- return (error);
-}
-
-
-/* ******* Driver Entry Points ******************************************** */
-
-/*
- * audiots_getinfo()
- */
-/*ARGSUSED*/
-static int
-audiots_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- audiots_state_t *state;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(audiots_statep,
- instance)) != NULL) {
- *result = state->ts_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result =
- (void *)(uintptr_t)audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
-
-/*
- * audiots_attach()
- *
- * Description:
- * Attach an instance of the audiots driver. This routine does the
- * device dependent attach tasks. When it is complete it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * NOTE: audiots_attach() assumes the Codec is powered down.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audiots_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audiots_state_t *state;
- audio_sup_reg_data_t data;
- char *pm_comp[] = {
- "NAME=audiots audio device",
- "0=off",
- "1=on"
- };
- int instance;
-
- ATRACE("in ts_attach()", dip);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_attach() instance", instance);
- ATRACE("ts_attach() audiots_statep", audiots_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("ts_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == state->ts_dip);
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* suspend/resume resets the chip, so we have no more faults */
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_RESTORED,
- DDI_DEVICE_FAULT,
- "check port, gain, balance, and mute settings");
- /* and clear the fault state flags */
- state->ts_flags &=
- ~(TS_AUDIO_READ_FAILED|TS_READ_FAILURE_PRINTED);
- }
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /*
- * power up the Codec, see comment
- * in audiots_set_busy()
- */
- ASSERT(state->ts_powered == TS_PWR_OFF);
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT,
- TS_PWR_ON) == DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->ts_dip,
- TS_COMPONENT);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() DDI_RESUME failed");
- return (DDI_FAILURE);
- }
- }
- mutex_enter(&state->ts_lock);
-
- state->ts_powered = TS_PWR_ON;
-
- ASSERT(state->ts_suspended == TS_SUSPENDED);
- state->ts_suspended = TS_NOT_SUSPENDED;
-
- /* Restore the audiots chip's state */
- audiots_chip_init(state, TS_INIT_RESTORE);
-
- /*
- * Put the address engine interrupt enable register in a known
- * state - everything off.
- */
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- mutex_exit(&state->ts_lock);
-
- /*
- * Start playing and recording, if not needed they'll stop
- * on their own. But, we don't start them if the hardware has
- * failed.
- */
- if (audio_sup_restore_state(state->ts_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() audio restart failed");
- }
-
- cv_broadcast(&state->ts_cv); /* let entry points continue */
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /* we're no longer busy */
- ASSERT(state->ts_powered == TS_PWR_ON);
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
-
- ATRACE("ts_attach() DDI_RESUME done", NULL);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- default:
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x", audiots_name,
- instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* before we do anything make sure that we haven't had a h/w failure */
- if (ddi_get_devstate(dip) == DDI_DEVSTATE_DOWN) {
- audio_sup_log(NULL, CE_WARN, "%s%d: The audio hardware has "
- "been disabled.", audiots_name, instance);
- audio_sup_log(NULL, CE_CONT, "Please reboot to restore audio.");
- return (DDI_FAILURE);
- }
-
- /* we don't support high level interrupts in this driver */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unsupported high level interrupt",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- /* allocate the state structure */
- if (ddi_soft_state_zalloc(audiots_statep, instance) == DDI_FAILURE) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- /*
- * WARNING: From here on all errors require that we free memory,
- * including the state structure.
- */
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() get soft state failed",
- audiots_name, instance);
- goto error_mem;
- }
-
- /* call audiosup module registration routine */
- ATRACE("ts_attach() calling audio_sup_register()", NULL);
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((state->ts_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failed",
- audiots_name, instance);
- goto error_mem;
- }
-
- /* initialize the audio state structures */
- if (audiots_init_state(state, dip) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() init state structure failed");
- goto error_audiosup;
- }
-
- /* map in the registers, allocate DMA buffers, etc. */
- if (audiots_map_regs(dip, state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_destroy;
- }
-
- if (state->ts_rev_id == AC_REV_ID2) {
- /* set up the pm-components */
- if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
- "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!init_state() couldn't create component");
- return (DDI_FAILURE);
- }
-
- /* Mark PM supported */
- state->ts_flags |= TS_PM_SUPPORTED;
-
- /* Mark as powering up at attach time */
- state->ts_flags |= TS_ATTACH_PWR;
-
- /* make sure the power framework knows the we are powered up */
- ASSERT(state->ts_powered == TS_PWR_OFF);
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT, TS_PWR_ON) ==
- DDI_FAILURE) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- ATRACE("ts_attach() pm_raise_power() failed", NULL);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() power up failed");
- goto error_destroy;
- }
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- /* Clear the attach time powering flag */
- state->ts_flags &= ~TS_ATTACH_PWR;
- } else {
- /* Mark on for CPR */
- state->ts_powered = TS_PWR_ON;
- }
-
- /* initialize the audio controller and the AC-97 Codec */
- audiots_chip_init(state, TS_INIT_NO_RESTORE);
-
- /*
- * Put the address engine interrupt enable register in a known
- * state - everything off.
- */
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- /* save private state */
- audio_sup_set_private(state->ts_ahandle, state);
-
- /* call the mixer attach() routine */
- ATRACE("ts_attach() calling am_attach()", &state->ts_ad_info);
- if (am_attach(state->ts_ahandle, cmd, &state->ts_ad_info) ==
- AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() am_attach() failed");
- goto error_unmap;
- }
-
- /* set up kernel statistics */
- if ((state->ts_ksp = kstat_create(TS_NAME, instance, TS_NAME,
- "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(state->ts_ksp);
- }
-
- /* set up the interrupt handler */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)NULL,
- (ddi_idevice_cookie_t *)NULL, audiots_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- ATRACE("ts_attach() bad interrupt spec", state);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!attach() bad interrupt specification");
- goto error_kstat;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- /*
- * CAUTION: Make sure there's an audio_sup_log() call before jumping
- * here
- */
-
-error_kstat:
- ATRACE("ts_attach() error_kstat", state);
- if (state->ts_ksp) {
- kstat_delete(state->ts_ksp);
- }
-
- (void) am_detach(state->ts_ahandle, DDI_DETACH);
-
-error_unmap:
- ATRACE("ts_attach() error_unmap", state);
- audiots_unmap_regs(state);
-
-error_destroy:
- ATRACE("ts_attach() error_destroy", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- kmem_free(state->ts_tcbuf, state->ts_cbuf_size);
-
- /* destroy the state mutexes and cvs */
- mutex_destroy(&state->ts_lock);
- cv_destroy(&state->ts_cv);
-
-error_audiosup:
- ATRACE("ts_attach() error_audiosup", state);
- (void) audio_sup_unregister(state->ts_ahandle);
-
-error_mem:
- ATRACE("ts_attach() error_mem", state);
- ddi_soft_state_free(audiots_statep, instance);
-
- ATRACE("ts_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* audiots_attach() */
-
-/*
- * audiots_detach()
- *
- * Description:
- * Detach an instance of the audiots driver. After the Codec is detached
- * we call am_detach() and audio_sup_unregister() so they may do their
- * work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audiots_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audiots_state_t *state;
- int instance;
-
- ATRACE_32("in ts_detach()", cmd);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_detach() instance", instance);
- ATRACE("ts_detach() audiots_statep", audiots_statep);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed",
- audiots_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("ts_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&state->ts_lock);
-
- ASSERT(state->ts_suspended == TS_NOT_SUSPENDED);
-
- state->ts_suspended = TS_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (state->ts_busy_cnt != 0) {
- cv_wait(&state->ts_cv, &state->ts_lock);
- }
-
- /* we may already be powered down, so only save state if up */
- if (state->ts_powered == TS_PWR_ON) {
-
- /* stop playing and recording */
- (void) audiots_stop_everything(state);
-
- /*
- * Save the controller state. The Codec's state is
- * already in ts_shadow[]. audiots_power_down()
- * saves the state and gets us ready to be powered
- * back up when we resume.
- */
- if (state->ts_flags & TS_PM_SUPPORTED) {
- audiots_power_down(state);
- } else {
- audiots_save_controller(state);
- }
- }
-
- if (audio_sup_save_state(state->ts_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!detach() audio save failed");
- }
-
- mutex_exit(&state->ts_lock);
-
- ATRACE("ts_detach() SUSPEND successful", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE_32("ts_detach() unknown command failure", cmd);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!detach() unknown command: 0x%x", cmd);
- ASSERT(!mutex_owned(&state->ts_lock));
- return (DDI_FAILURE);
- }
-
- /* Make sure play and record are stopped and disable all interrupts */
- ATRACE("ts_detach() stopping all DMA engines before detaching", 0);
- mutex_enter(&state->ts_lock);
- audiots_stop_everything(state);
- mutex_exit(&state->ts_lock);
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- /*
- * power down the device, no reason to waste power
- * without a driver
- */
- (void) pm_lower_power(state->ts_dip, TS_COMPONENT, TS_PWR_OFF);
- }
-
- /* remove the interrupt handler */
- ATRACE("ts_detach() removing interrupt handler", state);
- ddi_remove_intr(dip, 0, NULL);
-
- /* free the kernel statistics structure */
- if (state->ts_ksp) {
- kstat_delete(state->ts_ksp);
- }
-
- /*
- * Call the mixer detach routine to tear down the mixer before
- * we lose the hardware.
- */
- ATRACE("ts_detach() calling am_detach()", dip);
- (void) am_detach(state->ts_ahandle, cmd);
-
- /*
- * Now call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- ATRACE("ts_detach() calling audio_sup_unregister()", dip);
- (void) audio_sup_unregister(state->ts_ahandle);
-
- /* unmap the registers */
- audiots_unmap_regs(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* free temporary capture buffer */
- kmem_free(state->ts_tcbuf, state->ts_cbuf_size);
-
- /* destroy the state mutexes and cvs */
- mutex_destroy(&state->ts_lock);
- cv_destroy(&state->ts_cv);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(audiots_statep, instance);
-
- ATRACE("ts_detach() returning success", audiots_statep);
-
- return (DDI_SUCCESS);
-
-} /* audiots_detach() */
-
-
-/*
- * audiots_power()
- *
- * Description:
- * This routine is used to turn the power to the Codec and audio core
- * on and off. The Codec's registers are always saved, however, when
- * we power down we have to save the audio core's state. When powering
- * on we restore both Codec and core state via audiots_chip_init().
- *
- * This routine doesn't worry about starting or stopping audio, other
- * routines have that responsibility.
- *
- * Arguments:
- * def_info_t *dip Ptr to the device's dev_info structure
- * int component Which component to power up/down
- * int level The power level for the component
- *
- * Returns:
- * DDI_SUCCESS Power level changed
- * DDI_FAILURE Power level didn't change
- */
-/*ARGSUSED*/
-static int
-audiots_power(dev_info_t *dip, int component, int level)
-{
- audiots_state_t *state;
- int instance;
- int rc = DDI_FAILURE;
-
- ATRACE("in ts_power()", dip);
- ATRACE("ts_power() audiots_statep", audiots_statep);
- ATRACE_32("ts_power() component", component);
- ATRACE_32("ts_power() level", level);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("ts_power() instance", instance);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(audiots_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: power() get soft state failed", audiots_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->ts_lock));
- ASSERT(component == 0);
-
- mutex_enter(&state->ts_lock);
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* check the level change to see what we need to do */
- if (level == TS_PWR_OFF && state->ts_powered == TS_PWR_ON) {
- ATRACE("ts_power() powering down", NULL);
-
- /* don't power off if we're busy */
- if (ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_start) ||
- state->ts_busy_cnt) {
- /* device is busy, so don't power off */
- mutex_exit(&state->ts_lock);
-
- /* reset the timer */
- (void) pm_idle_component(dip, TS_COMPONENT);
-
- ATRACE("ts_power() power off failed, busy",
- state->ts_busy_cnt);
- ASSERT(rc == DDI_FAILURE);
-
- goto done;
- }
-
- /* power down and save the state */
- audiots_power_down(state);
-
- ATRACE("ts_power() power down complete", NULL);
- } else if (level == TS_PWR_ON && state->ts_powered == TS_PWR_OFF) {
- ATRACE("ts_power() powering up", NULL);
-
- audiots_power_up(state);
-
- ATRACE("ts_power() power up complete", NULL);
-#ifdef DEBUG
- } else {
- ATRACE_32("ts_power() no change to make", level);
-#endif
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = DDI_SUCCESS;
-
-done:
-
- ATRACE("ts_power() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_power() */
-
-/* ******* DDAudio Entry Point Routines ************************************ */
-
-/*
- * audiots_ad_setup()
- *
- * Description:
- * This routine checks whether the audio hardware has failed. If so, it
- * returns AUDIO_FAILURE and opens are blocked. Otherwise, it lets
- * everything proceed as normal.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int dir Direction of audio, we don't care here
- *
- * Returns:
- * AUDIO_SUCCESS The audio hardware is working
- * AUDIO_FAILURE The audio hardware has failed
- */
-/*ARGSUSED*/
-static int
-audiots_ad_setup(audiohdl_t ahandle, int stream, int dir)
-{
- audiots_state_t *state;
- int rc = AUDIO_SUCCESS;
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- ATRACE_32("in audiots_ad_setup(), instance", state->ts_instance);
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- ATRACE_32("ts_ad_setup() h/w has failed", state->ts_flags);
- rc = AUDIO_FAILURE;
- }
- mutex_exit(&state->ts_lock);
-
- ATRACE_32("ts_ad_setup() returning", rc);
-
- return (rc);
-
-} /* audiots_ad_setup() */
-
-/*
- * audiots_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("in ts_ad_pause_play()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!pause_play() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
-
- handle = state->ts_handle;
-
- /* we don't do anything if we aren't already running */
- if (!(ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_OUTPUT_CHANNEL)) {
- ATRACE("ts_pause_play() DMA engine already stopped", state);
- goto done;
- }
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
- state->ts_flags |= TS_DMA_ENGINE_PAUSED;
-
-done:
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE("ts_ad_pause_play() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_pause_play() */
-
-/*
- * audiots_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set, or the
- * parameter couldn't be set
- */
-/*ARGSUSED*/
-static int
-audiots_ad_set_config(audiohdl_t ahandle, int stream, int command, int dir,
- int arg1, int arg2)
-{
- audiots_state_t *state;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("ts_ad_set_config() stream", stream);
- ATRACE_32("ts_ad_set_config() command", command);
- ATRACE_32("ts_ad_set_config() dir", dir);
- ATRACE_32("ts_ad_set_config() arg1", arg1);
- ATRACE_32("ts_ad_set_config() arg2", arg2);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_config() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_config() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audiots_set_gain(state, stream, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audiots_set_port(state, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audiots_set_monitor_gain(state, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
-
- if (arg1) { /* mute */
- mutex_enter(&state->ts_lock);
- audiots_or_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
- audiots_or_ac97(state, AC97_HEADPHONE_VOLUME_REGISTER,
- HPVR_MUTE);
- audiots_or_ac97(state, AC97_MONO_MASTER_VOLUME_REGSITER,
- MMVR_MUTE);
- mutex_exit(&state->ts_lock);
- } else { /* not muted */
- /* by setting the port we unmute only active ports */
- (void) audiots_set_port(state, AUDIO_PLAY,
- TS_PORT_UNMUTE);
- }
-
- rc = AUDIO_SUCCESS;
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- mutex_enter(&state->ts_lock);
-
- if (arg1) { /* enable */
- audiots_or_ac97(state, AC97_MIC_VOLUME_REGISTER,
- MICVR_20dB_BOOST);
- state->ts_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- audiots_and_ac97(state, AC97_MIC_VOLUME_REGISTER,
- ~MICVR_20dB_BOOST);
- state->ts_ad_info.ad_add_mode &= ~AM_ADD_MODE_MIC_BOOST;
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = AUDIO_SUCCESS;
- break;
-
- case AM_SET_DIAG_MODE:
- /*
- * Set the loopback diagnostics mode.
- *
- * arg1 --> 1 == diagnostics on, 0 == diagnostics off
- * arg2 --> not used
- */
- mutex_enter(&state->ts_lock);
-
- if (arg1) {
- state->ts_ad_info.ad_add_mode |= AM_ADD_MODE_DIAG_MODE;
- } else {
- state->ts_ad_info.ad_add_mode &= ~AM_ADD_MODE_DIAG_MODE;
- }
-
- mutex_exit(&state->ts_lock);
-
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- */
- ATRACE_32("ts_ad_set_config() unsupported command", command);
- break;
- }
-
-done:
- ATRACE_32("ts_ad_set_config() done", rc);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_set_config() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_set_config() */
-
-/*
- * audiots_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 8 and 16 bit signed linear.
- *
- * NOTE: We don't support mono or 8-bit. See the WARNING at the
- * top of the file.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 8 or 16
- * int encoding Encoding method, u-law, A-law and linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-/*ARGSUSED*/
-static int
-audiots_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audiots_state_t *state;
- ddi_acc_handle_t handle;
- int ch;
- int rc = AUDIO_FAILURE;
- uint16_t sign;
- uint16_t tmp_short;
-
- ATRACE_32("ts_ad_set_format() stream", stream);
- ATRACE_32("ts_ad_set_format() dir", dir);
- ATRACE_32("ts_ad_set_format() sample rate", sample_rate);
- ATRACE_32("ts_ad_set_format() channels", channels);
- ATRACE_32("ts_ad_set_format() precision", precision);
- ATRACE_32("ts_ad_set_format() encoding", encoding);
-
- /*
- * first, check the encoding method
- */
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE_32("ts_ad_set_format() bad encoding", encoding);
- return (AUDIO_FAILURE);
- }
-
- /*
- * get the state structure
- */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_format() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_format() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- switch (sample_rate) {
- case TS_SAMPR5510: break;
- case TS_SAMPR6620: break;
- case TS_SAMPR8000: break;
- case TS_SAMPR9600: break;
- case TS_SAMPR11025: break;
- case TS_SAMPR16000: break;
- case TS_SAMPR18900: break;
- case TS_SAMPR22050: break;
- case TS_SAMPR27420: break;
- case TS_SAMPR32000: break;
- case TS_SAMPR33075: break;
- case TS_SAMPR37800: break;
- case TS_SAMPR44100: break;
- case TS_SAMPR48000: break;
- default:
- ATRACE_32("ts_ad_set_format() bad SR", sample_rate);
- goto done;
- }
-
- /* can't fail, so update the saved format and implement */
- mutex_enter(&state->ts_lock);
- if (dir == AUDIO_PLAY) {
- /* save for later use */
- state->ts_psample_rate = sample_rate;
- state->ts_pchannels = channels;
- state->ts_pprecision = precision;
-
- /*
- * first find the h/w channel with the stream
- */
- ch = TS_OUTPUT_STREAM;
-
- /*
- * convert the sample rate into 4.12 format
- */
- sample_rate = (sample_rate << TS_SRC_SHIFT) / TS_SAMPR48000;
-
- /* for play we always use signed */
- sign = ERAM_SIGNED_PCM;
-
- ATRACE_32("ts_ad_set_format() play SR", sample_rate);
- } else {
- /* save for later use */
- state->ts_csample_rate = sample_rate;
- state->ts_cchannels = channels;
- state->ts_cprecision = precision;
-
- /*
- * we set the only record stream
- */
- ch = TS_INPUT_STREAM;
-
- /*
- * convert the sample rate into 4.12 format
- */
- sample_rate = (TS_SAMPR48000 << TS_SRC_SHIFT) / sample_rate;
-
- ATRACE_32("ts_ad_set_format() record SR", sample_rate);
-
- /* for 16-bit record we use signed */
- sign = ERAM_SIGNED_PCM;
- }
-
- /* check for stereo only */
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- channels = ERAM_STEREO;
-
- /* check for 16-bit only */
- ASSERT(precision == AUDIO_PRECISION_16);
- precision = ERAM_16_BITS;
-
- /* always linear encoding */
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- /* program the sample rate */
- handle = state->ts_handle;
- ddi_put16(handle, &state->ts_regs->aud_ram[ch].aram.aram_delta,
- (uint16_t)sample_rate);
-
- /* program the precision and number of channels */
- tmp_short = ddi_get16(handle,
- &state->ts_regs->aud_ram[ch].eram.eram_ctrl_ec) & ~(ERAM_CTRL_MASK);
- tmp_short |= precision|channels|ERAM_LOOP_MODE|sign;
- ddi_put16(handle, &state->ts_regs->aud_ram[ch].eram.eram_ctrl_ec,
- tmp_short);
-
- mutex_exit(&state->ts_lock);
-
- ATRACE("ts_ad_set_format() finished programming the device", 0);
-
- rc = AUDIO_SUCCESS;
-
-done:
- ATRACE_32("ts_ad_set_format() done", rc);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_set_format() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_set_format() */
-
-/*
- * audiots_ad_start_play()
- *
- * Description:
- * Wrapper to call audiots_start_play().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-/*ARGSUSED*/
-static int
-audiots_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- int rc;
-
- ATRACE("in ts_ad_start_play() handle", ahandle);
- ATRACE_32("ts_ad_start_play() stream", stream);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_start_play() h/w has failed", state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_play() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&state->ts_lock);
- rc = audiots_start_play(state);
-
- if (rc == AUDIO_SUCCESS && (state->ts_flags & TS_PLAY_ACTIVE) == 0) {
- state->ts_flags |= TS_PLAY_ACTIVE;
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- }
- }
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_start_play() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_start_play() */
-
-/*
- * audiots_ad_stop_play()
- *
- * Description:
- * Wrapper to call audiots_stop_play().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
-
- ATRACE("in ts_ad_stop_play()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!stop_play() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
- audiots_stop_play(state);
-
- if ((state->ts_flags & (TS_PM_SUPPORTED|TS_PLAY_ACTIVE)) ==
- (TS_PM_SUPPORTED|TS_PLAY_ACTIVE)) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
-
- state->ts_flags &= ~TS_PLAY_ACTIVE;
-
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE("ts_ad_stop_play() returning", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_stop_play() */
-
-/*
- * audiots_ad_start_record()
- *
- * Description:
- * Wrapper to call audiots_start_record().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-/*ARGSUSED*/
-static int
-audiots_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
- int rc;
-
- ATRACE("in ts_ad_start_record()", ahandle);
- ATRACE_32("ts_ad_start_record() stream", stream);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* Check if the hardware has failed */
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_AUDIO_READ_FAILED) {
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_start_record() h/w has failed",
- state->ts_flags);
- return (AUDIO_FAILURE);
- }
- mutex_exit(&state->ts_lock);
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_record() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&state->ts_lock);
- rc = audiots_start_record(state);
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ATRACE_32("ts_ad_start_record() returning", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_ad_start_record() */
-
-/*
- * audiots_ad_stop_record()
- *
- * Description:
- * Wrapper to call audiots_stop_record().
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audiots_state_t *state;
-
- ATRACE("in ts_ad_stop_record()", ahandle);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (audiots_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!stop_record() set_busy() failed");
- return;
- }
-
- mutex_enter(&state->ts_lock);
- audiots_stop_record(state);
-
- if (state->ts_flags & TS_PM_SUPPORTED) {
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
- }
- mutex_exit(&state->ts_lock);
-
- /* we're no longer busy */
- audiots_set_idle(state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_ad_stop_record() */
-
-
-/* ******* Local Routines *************************************************** */
-
-/*
- * audiots_and_ac97()
- *
- * Description:
- * Logically AND a value with the specified AC-97 Codec register.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * void
- */
-static void
-audiots_and_ac97(audiots_state_t *state, int reg, uint16_t data)
-{
- audiots_set_ac97(state, reg,
- (data & state->ts_shadow[TS_CODEC_REG(reg)]));
-
-} /* audiots_and_ac97() */
-
-/*
- * audiots_chip_init()
- *
- * Description:
- * Initialize the audio core and the AC-97 Codec. The AC-97 Codec is
- * always programmed from ts_shadow[]. If we aren't doing a restore
- * we initialize ts_shadow[], otherwise we use the current values of
- * ts_shadow[]. This allows this routine to be used for both attaching
- * and for power management power up.
- *
- * Speaker, line out and headphone out gain are not set to 0 gain.
- * Thus their respective registers are never set to 0. Since the failed
- * read and write over the AC-97 link results in a 0 we now know for
- * sure if the write succeeded or not.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int restore If TS_INIT_RESTORE then restore
- * from ts_shadow[]
- *
- * Returns:
- * void
- */
-static void
-audiots_chip_init(audiots_state_t *state, int restore)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- int i;
- int str;
-
- ATRACE("in ts_chip_init()", state);
- ATRACE_32("ts_chip_init() restore", restore);
-
- /* set global music and wave volume to 0dB */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_volume, 0x0);
-
- /*
- * Enable middle and end interrupts for all channels. Since
- * we always set these we don't have to save it as well.
- */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_cir_gc,
- (AP_CIR_GC_ENDLP_IE|AP_CIR_GC_MIDLP_IE));
-
- /* for each channel, set gain and enable interrupts for middle & end */
- for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
- /*
- * Set volume to 0dB attenuation, 1st left and then right.
- * These are never changed, so we don't have to save them.
- */
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_gvsel_pan_vol,
- (ERAM_WAVE_VOL|ERAM_PAN_LEFT|ERAM_PAN_0dB|
- ERAM_VOL_DEFAULT));
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_gvsel_pan_vol,
- (ERAM_WAVE_VOL|ERAM_PAN_RIGHT|ERAM_PAN_0dB|
- ERAM_VOL_DEFAULT));
-
- /*
- * The envelope engine *MUST* remain in still mode (off).
- * Otherwise bad things like gain randomly disappearing might
- * happen. See bug #4332773.
- */
-
- ddi_put32(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ebuf1,
- ERAM_EBUF_STILL);
- ddi_put32(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ebuf2,
- ERAM_EBUF_STILL);
-
- /* Set the eram and aram state */
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].aram.aram_delta,
- state->ts_save_regs[str].aram_delta);
- ddi_put16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ctrl_ec,
- state->ts_save_regs[str].eram_ctrl_ec);
- }
-
- /* program channel 31 for record */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_global_control,
- (AP_CLOGAL_CTRL_E_PCMIN_CH31|AP_CLOGAL_CTRL_PCM_OUT_AC97|
- AP_CLOGAL_CTRL_MMC_FROM_MIXER|AP_CLOGAL_CTRL_PCM_OUT_TO_AC97));
-
- /* do a warm reset, which powers up the Codec */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
- AP_SCTRL_WRST_CODEC);
- drv_usecwait(2);
- AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_sctrl,
- ~AP_SCTRL_WRST_CODEC);
-
- /* do a warm reset via the Codec, yes, I'm being paranoid! */
- audiots_set_ac97(state, AC97_RESET_REGISTER, 0);
-
- /* Make sure the Codec is powered up. */
- i = TS_WAIT_CNT;
- while ((audiots_get_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER) &
- PCSR_POWERD_UP) != PCSR_POWERD_UP && i--) {
- drv_usecwait(1);
- }
-
- if ((restore == TS_INIT_RESTORE) && (state->ts_flags & TS_ATTACH_PWR)) {
- /*
- * Here we're raising power at attach time, we need to
- * initialize the shadow array and then mute the outputs.
- * If we don't, there's a loud double pop on the headphones.
- */
- for (str = 0; str < sizeof (ac97_v21_t); str += 2) {
- (void) audiots_get_ac97(state, str);
- }
-
- /* set outputs muted */
- state->ts_shadow[TS_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
- state->ts_shadow[TS_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
- state->ts_shadow
- [TS_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE;
- state->ts_shadow[TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_MUTE;
- }
-
- /* preload shadow registers if not restoring */
- if (restore == TS_INIT_NO_RESTORE) {
- for (str = 0; str < sizeof (ac97_v21_t); str += 2) {
- /* read the Codec & save in the shadow register array */
- (void) audiots_get_ac97(state, str);
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE|TS_AC97_ATTEN_LINE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE|TS_AC97_ATTEN_HP;
-
- /* 06h - set master mono volume, muted, 0dB */
- state->ts_shadow[
- TS_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE|TS_AC97_ATTEN_SPKR;
-
- /* 08h - set master tone control to no modification */
- state->ts_shadow[
- TS_CODEC_REG(AC97_MASTER_TONE_CONTROL_REGISTER)] =
- MTCR_BASS_BYPASS|MTCR_TREBLE_BYPASS;
-
- /* 0ah - mute pc beep, 0dB */
- state->ts_shadow[TS_CODEC_REG(AC97_PC_BEEP_REGISTER)] =
- PCBR_MUTE|PCBR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /* 0eh - set mic input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE|MICVR_0dB_GAIN;
-
- /* 10h - set line input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 14h - set video input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_VIDEO_VOLUME_REGISTER)] =
- VIDVR_MUTE|VIDVR_RIGHT_0dB_GAIN|VIDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- state->ts_shadow[TS_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- state->ts_shadow[TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- state->ts_shadow[
- TS_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 1eh - set record mic gain to 0dB and not muted */
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_MIC_REGISTER)] =
- RGMR_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- state->ts_shadow[TS_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 22h - set 3D control to NULL */
- state->ts_shadow[TS_CODEC_REG(AC97_THREE_D_CONTROL_REGISTER)] =
- TDCR_NULL;
-
- /*
- * The rest we ignore, most are reserved.
- *
- * CAUTION: If we add to the list we need to fix the end
- * of the loop below.
- */
- }
-
- /* now program the AC-97 Codec from ts_shadow[] */
- for (i = 0; i < TS_LAST_AC_REG; i += TS_REG_SIZE) {
- audiots_set_ac97(state, i, state->ts_shadow[TS_CODEC_REG(i)]);
- }
-
- ATRACE("ts_chip_init() returning", state);
-
-} /* audiots_chip_init() */
-
-/*
- * audiots_get_ac97()
- *
- * Description:
- * Get the value in the specified AC-97 Codec register. There is a
- * bug in silicon which forces us to do multiple reads of the Codec's
- * register. This algorithm was provided by T2 and is heuristic in
- * nature. Unfortunately we have no guarantees that the real answer
- * isn't 0x0000, which is what we get when a read fails. So we loop
- * TS_LOOP_CNT times before we give up. We just have to hope this is
- * sufficient to give us the correct value.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- *
- * Returns:
- * unsigned short The value in the specified register
- */
-static uint16_t
-audiots_get_ac97(audiots_state_t *state, int reg)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *data;
- int count;
- int delay;
- uint16_t first;
- uint16_t next;
-
- ATRACE_32("in ts_get_ac97()", reg);
-
- if (state->ts_rev_id == AC_REV_ID1) {
- data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
- } else {
- data = &state->ts_regs->aud_regs.ap_acrdwr_data;
- }
-
- /* make sure the register is good */
- reg &= AP_ACRD_INDEX_MASK;
- for (count = TS_LOOP_CNT; count--; ) {
- if ((first = audiots_read_ac97(state, reg)) != 0) {
- next = first;
- break;
- }
-
- delay = TS_DELAY_CNT;
- while (delay--) {
- (void) ddi_get16(handle, data);
- }
-
- if ((next = audiots_read_ac97(state, reg)) != 0) {
- break;
- }
- }
- /* save the value in the shadow register array */
- state->ts_shadow[TS_CODEC_REG(reg)] = next;
-
- ATRACE_16("ts_get_ac97() returning",
- state->ts_shadow[TS_CODEC_REG(reg)]);
-
- /*
- * Arggg, if you let the next read happen too soon then it fails.
- * 12 usec fails, 13 usec succeeds. So set it to 20 for safety.
- */
- drv_usecwait(TS_20US);
-
- return (state->ts_shadow[TS_CODEC_REG(reg)]);
-
-} /* audiots_get_ac97() */
-
-/*
- * audiots_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure.
- * This includes reading the properties.
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning for an error. Also, error_destroy:
- * in audiots_attach() would need to be fixed as well.
- *
- * NOTE: birdsnest supports CD ROM input. We check for the cdrom
- * property. If there we turn it on.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audiots_init_state(audiots_state_t *state, dev_info_t *dip)
-{
- int ts_pints;
- int ts_rints;
- int cdrom = 0;
-
- ATRACE("in ts_init_state()", NULL);
-
- /* get the number of play and record interrupts per second */
- ts_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "play-interrupts", TS_INTS);
- ts_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "record-interrupts", TS_INTS);
-
- /* make sure the values are good */
- if (ts_pints < TS_MIN_INTS) {
- ATRACE_32("ts_init_state() "
- "play interrupt rate set too low, resetting", ts_pints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- ts_pints, TS_MIN_INTS);
- ts_pints = TS_INTS;
- } else if (ts_pints > TS_MAX_INTS) {
- ATRACE_32("ts_init_state() "
- "play interrupt rate set too high, resetting", ts_pints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- ts_pints, TS_MAX_INTS);
- ts_pints = TS_INTS;
- }
- if (ts_rints < TS_MIN_INTS) {
- ATRACE_32("ts_init_state() "
- "record interrupt rate set too low, resetting", ts_rints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too low, %d, resetting to %d",
- ts_rints, TS_MIN_INTS);
- ts_rints = TS_INTS;
- } else if (ts_rints > TS_MAX_INTS) {
- ATRACE_32("ts_init_state() "
- "record interrupt rate set too high, resetting", ts_rints);
- audio_sup_log(state->ts_ahandle, CE_NOTE, "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- ts_rints, TS_MAX_INTS);
- ts_rints = TS_INTS;
- }
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- state->ts_ad_info.ad_mode = AM_MIXER_MODE;
- } else {
- state->ts_ad_info.ad_mode = AM_COMPAT_MODE;
- }
-
- ATRACE_32("ts_init_state() setting mode", state->ts_ad_info.ad_mode);
-
- /* figure out the platform */
- cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "cdrom", 0);
-
- /* save the device info pointer */
- state->ts_dip = dip;
-
- /* get the iblock cookie needed for interrupt context */
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &state->ts_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
-
- /* initialize the state mutexes and condition variables */
- mutex_init(&state->ts_lock, NULL, MUTEX_DRIVER, state->ts_iblock);
- cv_init(&state->ts_cv, NULL, CV_DRIVER, NULL);
-
- /*
- * CAUTION: From here on we must destroy the mutexes if there's
- * an error and we return failure.
- */
- /* fill in the device default state */
- state->ts_defaults.play.sample_rate = TS_DEFAULT_SR;
- state->ts_defaults.play.channels = TS_DEFAULT_CH;
- state->ts_defaults.play.precision = TS_DEFAULT_PREC;
- state->ts_defaults.play.encoding = TS_DEFAULT_ENC;
- state->ts_defaults.play.gain = TS_DEFAULT_PGAIN;
- state->ts_defaults.play.port = AUDIO_SPEAKER|AUDIO_HEADPHONE;
- state->ts_defaults.play.avail_ports = AUDIO_SPEAKER|AUDIO_HEADPHONE|\
- AUDIO_LINE_OUT;
- state->ts_defaults.play.mod_ports = AUDIO_SPEAKER|AUDIO_LINE_OUT;
- state->ts_defaults.play.buffer_size = TS_BSIZE;
- state->ts_defaults.play.balance = TS_DEFAULT_BAL;
- state->ts_defaults.record.sample_rate = TS_DEFAULT_SR;
- state->ts_defaults.record.channels = TS_DEFAULT_CH;
- state->ts_defaults.record.precision = TS_DEFAULT_PREC;
- state->ts_defaults.record.encoding = TS_DEFAULT_ENC;
- state->ts_defaults.record.gain = TS_DEFAULT_PGAIN;
- state->ts_defaults.record.port = AUDIO_MICROPHONE;
- state->ts_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->ts_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->ts_defaults.record.buffer_size = TS_BSIZE;
- state->ts_defaults.record.balance = TS_DEFAULT_BAL;
- state->ts_defaults.monitor_gain = TS_DEFAULT_MONITOR_GAIN;
- state->ts_defaults.output_muted = B_FALSE;
- state->ts_defaults.ref_cnt = B_FALSE;
- state->ts_defaults.hw_features = AUDIO_HWFEATURE_DUPLEX|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_PLAY|AUDIO_HWFEATURE_RECORD;
- state->ts_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- /* add CD ROM for birdsnest */
- if (cdrom) {
- state->ts_defaults.record.avail_ports |= AUDIO_CD;
- state->ts_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- state->ts_psample_rate = state->ts_defaults.play.sample_rate;
- state->ts_pchannels = state->ts_defaults.play.channels;
- state->ts_pprecision = state->ts_defaults.play.precision;
- state->ts_csample_rate = state->ts_defaults.record.sample_rate;
- state->ts_cchannels = state->ts_defaults.record.channels;
- state->ts_cprecision = state->ts_defaults.record.precision;
-
- /* fill in the ad_info structure */
- state->ts_ad_info.ad_int_vers = AM_VERSION;
- state->ts_ad_info.ad_add_mode = NULL;
- state->ts_ad_info.ad_codec_type = AM_TRAD_CODEC;
- state->ts_ad_info.ad_defaults = &state->ts_defaults;
- state->ts_ad_info.ad_play_comb = audiots_combinations;
- state->ts_ad_info.ad_rec_comb = audiots_combinations;
- state->ts_ad_info.ad_entry = &audiots_entry;
- state->ts_ad_info.ad_dev_info = &state->ts_dev_info;
- state->ts_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- state->ts_ad_info.ad_diff_flags =
- AM_DIFF_SR|AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- state->ts_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- state->ts_ad_info.ad_misc_flags = AM_MISC_RP_EXCL|AM_MISC_MONO_DUP;
- state->ts_ad_info.ad_translate_flags = AM_MISC_8_R_TRANSLATE;
- state->ts_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- state->ts_ad_info.ad_play.ad_mixer_srs = audiots_mixer_sample_rates;
- state->ts_ad_info.ad_play.ad_compat_srs = audiots_compat_sample_rates;
- state->ts_ad_info.ad_play.ad_conv = &am_src2;
- state->ts_ad_info.ad_play.ad_sr_info = NULL;
- state->ts_ad_info.ad_play.ad_chs = audiots_channels;
- state->ts_ad_info.ad_play.ad_int_rate = ts_pints;
- state->ts_ad_info.ad_play.ad_max_chs = TS_MAX_OUT_CHANNELS;
- state->ts_ad_info.ad_play.ad_bsize = TS_BSIZE;
-
- /* record capabilities */
- state->ts_ad_info.ad_record.ad_mixer_srs = audiots_mixer_sample_rates;
- state->ts_ad_info.ad_record.ad_compat_srs = audiots_compat_sample_rates;
- state->ts_ad_info.ad_record.ad_conv = &am_src2;
- state->ts_ad_info.ad_record.ad_sr_info = NULL;
- state->ts_ad_info.ad_record.ad_chs = audiots_channels;
- state->ts_ad_info.ad_record.ad_int_rate = ts_rints;
- state->ts_ad_info.ad_record.ad_max_chs = TS_MAX_CHANNELS;
- state->ts_ad_info.ad_record.ad_bsize = TS_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(state->ts_dev_info.name, TS_DEV_NAME);
- (void) strcpy(state->ts_dev_info.config, TS_DEV_CONFIG);
- if (!cdrom) {
- (void) strcpy(state->ts_dev_info.version, TS_DEV_VERSION_A);
- } else {
- (void) strcpy(state->ts_dev_info.version, TS_DEV_VERSION_B);
- }
-
- /*
- * Figure out the largest transfer size for the DMA engine. We then
- * double the size because an interrupt happens in the middle and
- * the end of the buffer. This size must be modulo 16 to fit two 16-bit
- * stereo streams in on the interrupt boundaries, middle and end,
- * with an 8-byte boundary.
- */
- state->ts_pbuf_size = TS_BUF_HALVES * TS_SAMPR48000 *
- AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / ts_pints;
- state->ts_pbuf_size += TS_MOD_SIZE -
- (state->ts_pbuf_size % TS_MOD_SIZE);
- ASSERT(state->ts_pbuf_size > 0);
- ASSERT((state->ts_pbuf_size % TS_MOD_SIZE) == 0);
-
- state->ts_cbuf_size = TS_BUF_HALVES * TS_SAMPR48000 *
- AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / ts_rints;
- state->ts_cbuf_size += TS_MOD_SIZE -
- (state->ts_cbuf_size % TS_MOD_SIZE);
- ASSERT(state->ts_cbuf_size > 0);
- ASSERT((state->ts_cbuf_size % TS_MOD_SIZE) == 0);
- state->ts_tcbuf = kmem_alloc(state->ts_cbuf_size, KM_SLEEP);
-
- /* init power management state */
- state->ts_suspended = TS_NOT_SUSPENDED;
- state->ts_powered = TS_PWR_OFF;
- state->ts_busy_cnt = 0;
-
- ATRACE("ts_init_state() success", NULL);
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_init_state() */
-
-/*
- * audiots_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * NOTE: This device needs to make sure any PIO access required to clear
- * its interrupt has made it out on the PCI bus before returning from its
- * interrupt handler so that the interrupt has been deasserted. This is
- * done by rereading the address engine interrupt register.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audiots_intr(caddr_t T)
-{
- audiots_state_t *state = (audiots_state_t *)T;
- ddi_acc_handle_t handle;
- char *bptr;
- uint16_t *sptr;
- uint16_t *tcbuf;
- uint32_t interrupts;
- uint32_t location;
- int i;
- int count;
- int samples;
- int rc = DDI_INTR_UNCLAIMED;
-
- ATRACE("in ts_intr()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- mutex_enter(&state->ts_lock);
-
- handle = state->ts_handle;
-
- if (state->ts_flags & TS_INTR_PENDING) {
- state->ts_flags &= ~TS_INTR_PENDING;
- rc = DDI_INTR_CLAIMED;
- mutex_exit(&state->ts_lock);
- ATRACE("ts_intr() servicing with pending intr from stop()", 0);
- goto done;
- }
-
- interrupts = ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
- ATRACE_32("ts_intr() interrupts", interrupts);
- if (interrupts == 0) {
- mutex_exit(&state->ts_lock);
- /* no interrupts to process, so it's not us */
- ATRACE_32("ts_intr() device didn't send interrupt", interrupts);
- ASSERT(rc == DDI_INTR_UNCLAIMED);
- goto done;
- }
-
- if (interrupts & TS_OUTPUT_CHANNEL) { /* play interrupt */
- ATRACE_32("ts_intr() play interrupt", interrupts);
-
- /* is this in the 1st or 2nd half of the buffer? */
- location = ddi_get32(handle, &state->ts_regs->aud_regs.ap_cspf);
-
- /* clear the interrupt, should this be after getting loc? */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- TS_OUTPUT_CHANNEL);
-
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- /* set up for 1st or 2nd half */
- if (location & TS_OUTPUT_CHANNEL) { /* in the 2nd half */
- bptr = &state->ts_pb[TS_1ST_HALF];
- count = state->ts_pcnt[TS_1ST_HALF];
- samples = state->ts_psamples[TS_1ST_HALF];
- } else { /* in 1st half */
- /* pcnt[0] could be different from pcnt[TS_2ND_HALF] */
- bptr = &state->ts_pb[state->ts_pcnt[TS_1ST_HALF]];
- count = state->ts_pcnt[TS_2ND_HALF];
- samples = state->ts_psamples[TS_2ND_HALF];
- }
-
- /* always zero for silence */
- bzero(bptr, count);
-
- /* get the next chunk of audio */
- mutex_exit(&state->ts_lock);
- if (am_get_audio(state->ts_ahandle, bptr, AUDIO_NO_CHANNEL,
- samples) == 0) {
- mutex_enter(&state->ts_lock);
- if (state->ts_flags & TS_DMA_ENGINE_EMPTY) {
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- state->ts_flags &= ~TS_DMA_ENGINE_INITIALIZED;
-
- /* shutdown the mixer */
- mutex_exit(&state->ts_lock);
- am_play_shutdown(state->ts_ahandle, NULL);
- mutex_enter(&state->ts_lock);
-
- /*
- * Make sure playing wasn't restarted when
- * lock lost.
- */
- if (state->ts_flags &
- TS_DMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("ts_intr() restart after"
- "shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto rec_intr;
- }
-
- /* done playing, so stop playing */
- ddi_put32(handle,
- &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
-
- /* clr the flags getting ready for next start */
- state->ts_flags &= ~(TS_DMA_ENGINE_PAUSED|
- TS_DMA_ENGINE_EMPTY);
- } else {
- /* next time we shut down, if no sound again */
- state->ts_flags |= TS_DMA_ENGINE_EMPTY;
- }
- } else {
- mutex_enter(&state->ts_lock);
- /* we got at least one sample, so don't shutdown yet */
- state->ts_flags &= ~TS_DMA_ENGINE_EMPTY;
- (void) ddi_dma_sync(state->ts_ph, (off_t)bptr, count,
- DDI_DMA_SYNC_FORDEV);
- }
- rc = DDI_INTR_CLAIMED;
- }
-
-rec_intr:
-
- if (interrupts & TS_INPUT_CHANNEL) { /* record interrupt */
- ATRACE_32("ts_intr() record interrupt", interrupts);
-
- /* is this in the 1st or 2nd half of the buffer? */
- location = ddi_get32(handle, &state->ts_regs->aud_regs.ap_cspf);
- ATRACE_32("ts_intr(c) location", location);
-
- /* clear the interrupt, should this be after getting loc? */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- TS_INPUT_CHANNEL);
-
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- if (location & TS_INPUT_CHANNEL_MASK) {
- /* 1st half just filled */
- if (state->ts_flags & TS_DMA_RECORD_START) {
- /* skip the first interrupt, it is NULL */
- state->ts_flags &= ~TS_DMA_RECORD_START;
- } else {
- if (ddi_dma_sync(state->ts_ch,
- (off_t)((state->ts_ccnt<<1) - TS_FIFO_SIZE),
- TS_FIFO_SIZE, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle,
- CE_NOTE,
- "!dma_sync(1) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = TS_FIFO_SIZE /
- (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)
- &state->ts_cb[(state->ts_ccnt<<1) -
- TS_FIFO_SIZE];
- for (i = 0; i < (TS_FIFO_SIZE/2); i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c1) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
-
- if (ddi_dma_sync(state->ts_ch, (off_t)0,
- state->ts_ccnt - TS_FIFO_SIZE,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle,
- CE_NOTE,
- "!dma_sync(2) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = (state->ts_ccnt - TS_FIFO_SIZE) /
- (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)state->ts_cb;
- count = (state->ts_ccnt - TS_FIFO_SIZE) >> 1;
- for (i = 0; i < count; i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c2) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
- }
- } else {
- /* 2nd half just filled */
- if (ddi_dma_sync(state->ts_ch,
- (off_t)(state->ts_ccnt - TS_FIFO_SIZE),
- state->ts_ccnt, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_NOTE,
- "!dma_sync(2) failed audio lost");
- mutex_exit(&state->ts_lock);
- goto done;
- }
- samples = state->ts_ccnt / (state->ts_cprecision >>
- AUDIO_PRECISION_SHIFT);
-
- sptr = (uint16_t *)&state->ts_cb[state->ts_ccnt -
- TS_FIFO_SIZE];
- count = state->ts_ccnt >> 1;
- for (i = 0; i < count; i++) {
- state->ts_tcbuf[i] = sptr[i];
- }
- ATRACE_32("ts_intr(c3) "
- "calling am_send_audio() samples", samples);
- tcbuf = state->ts_tcbuf;
- mutex_exit(&state->ts_lock);
- am_send_audio(state->ts_ahandle, tcbuf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->ts_lock);
- }
-
- rc = DDI_INTR_CLAIMED;
- }
-
- interrupts &= ~(TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL);
- if (interrupts) {
- /*
- * handle, but don't service non play or record audiots
- * interrupts and shutdown the other DMA engines if they
- * somehow activated themselves - which is why we are here in
- * the first place.
- */
- ATRACE_32("ts_intr() unused audiots interrupt", interrupts);
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_aint,
- interrupts);
- /*
- * Reread the interrupt reg to ensure that
- * PIO write has completed.
- */
- (void) ddi_get32(handle, &state->ts_regs->aud_regs.ap_aint);
-
- AND_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL);
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- ~(TS_INPUT_CHANNEL|TS_OUTPUT_CHANNEL));
-
- rc = DDI_INTR_CLAIMED;
- }
-
- /* update the kernel interrupt statistics */
- if (state->ts_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- TS_KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->ts_lock);
-
-done:
- ATRACE("audiots_intr() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_intr() */
-
-/*
- * audiots_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * Once the config space registers are mapped in we determine if the
- * audio core may be power managed. It should, but if it doesn't,
- * then trying to may cause the core to hang.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * NOTE: ddi_dma_alloc_handle() attempts to use the full 4 GB DMA address
- * range. This is to work around Southbridge rev E/G OBP issues.
- * (See Grover OBP note above)
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * audiots_state_t *state The device's state structure
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audiots_map_regs(dev_info_t *dip, audiots_state_t *state)
-{
- uint_t dma_cookie_count;
- uint32_t rev_id;
- int rc;
-
- ATRACE("in ts_map_regs()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* allocate one handle for play and one for record */
- if ((rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->ts_ph)) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(P) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &audiots_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->ts_ch)) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_alloc_handle(C) failed: %d", rc);
- goto error_ph;
- }
-
- /* allocate the two DMA buffers, one for play and one for record */
- ASSERT(state->ts_pbuf_size > 0);
- ASSERT(state->ts_cbuf_size > 0);
- if (ddi_dma_mem_alloc(state->ts_ph, state->ts_pbuf_size, &ts_acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &state->ts_pb,
- &state->ts_pml, &state->ts_pmh) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(P) failed");
- goto error_ch;
- }
- if (ddi_dma_mem_alloc(state->ts_ch, state->ts_cbuf_size, &ts_acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &state->ts_cb,
- &state->ts_cml, &state->ts_cmh) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_mem_alloc(C) failed");
- goto error_pmh;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->ts_ph, (struct as *)0,
- state->ts_pb, state->ts_pbuf_size, DDI_DMA_WRITE|DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, (caddr_t)0, &state->ts_pc, &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle(P) failed: %d", rc);
- goto error_cmh;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->ts_ch, (struct as *)0,
- state->ts_cb, state->ts_cbuf_size, DDI_DMA_READ|DDI_DMA_CONSISTENT,
- DDI_DMA_SLEEP, (caddr_t)0, &state->ts_cc, &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_dma_addr_bind_handle(C) failed: %d", rc);
- goto error_pc;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* map in the registers, the config and memory mapped registers */
- if (ddi_regs_map_setup(dip, TS_CONFIG_REGS,
- (caddr_t *)&state->ts_config, 0, 0, &ts_acc_attr,
- &state->ts_chandle) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_cc;
- }
-
- /* make sure we can power manage the audio core */
- if (ddi_get16(state->ts_chandle, &state->ts_config->tsc_cap_ptr) ==
- TS_CAP_PTR) {
- state->ts_pm_core = TS_PWR_MANAGE;
- ATRACE("Audio core is power manageable", 0);
- } else {
- state->ts_pm_core = TS_NO_PWR_MANAGE;
- ATRACE("Audio core is not power manageable", 0);
- }
-
- if (ddi_regs_map_setup(dip, TS_MEM_MAPPED_REGS,
- (caddr_t *)&state->ts_regs, 0, 0, &ts_acc_attr,
- &state->ts_handle) != DDI_SUCCESS) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_unmap;
- }
-
- /* Read the Audio Controller's revision ID */
- rev_id = ddi_get32(state->ts_chandle,
- &state->ts_config->tsc_class_code_rev_id);
- if (rev_id & AC_REV_ID1) {
- state->ts_rev_id = AC_REV_ID1;
- ATRACE("Old SB audio rev ID", rev_id);
- } else if (rev_id & AC_REV_ID2) {
- state->ts_rev_id = AC_REV_ID2;
- ATRACE("New SB audio rev ID", rev_id);
- } else {
- /* Unknown rev, who knows what else has changed... */
- ATRACE("Unknown SB rev - don't use", rev_id);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "map_regs() unsupported SouthBridge Chip revision: %x",
- rev_id);
- return (AUDIO_FAILURE);
- }
-
- /* let the state structure know about the attributes */
- state->ts_dma_attr = &audiots_attr;
-
- ATRACE("ts_map_regs() returning success", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-error_unmap:
- ddi_regs_map_free(&state->ts_chandle);
-error_cc:
- (void) ddi_dma_unbind_handle(state->ts_ch);
-error_pc:
- (void) ddi_dma_unbind_handle(state->ts_ph);
-error_cmh:
- ddi_dma_mem_free(&state->ts_cmh);
-error_pmh:
- ddi_dma_mem_free(&state->ts_pmh);
-error_ch:
- ddi_dma_free_handle(&state->ts_ch);
-error_ph:
- ddi_dma_free_handle(&state->ts_ph);
-error:
- ATRACE("ts_map_regs() returning failure", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_FAILURE);
-
-} /* audiots_map_regs() */
-
-/*
- * audiots_or_ac97()
- *
- * Description:
- * Logically OR a value with the specified AC-97 Codec register.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * void
- */
-static void
-audiots_or_ac97(audiots_state_t *state, int reg, uint16_t data)
-{
-
- audiots_set_ac97(state, reg,
- (data | state->ts_shadow[TS_CODEC_REG(reg)]));
-
-} /* audiots_or_ac97() */
-
-/*
- * audiots_power_down()
- *
- * Description:
- * Power down the AC-97 Codec and then, if allowed, power down
- * the audio core. The audio core implements PCI power management
- * version 1.0. We don't support state D3 (cold) since we don't
- * have an external device to drive reseting the core to get it
- * back up and running. We just toggle between D0 and D3 since
- * we need the device either all on or all off.
- *
- * Minimum transition times between the power states:
- * D0 <---> D1 no time delay
- * D0 <---> D2 200 microseconds
- * D0 <---> D3 10 milliseconds
- *
- * To be safe I'm doubling that time because if you don't wait
- * long enough you get a hard hang for the app opening audio.
- *
- * AC-97 Codec's walk from power states PR0 through PR5 plus the
- * optional PR6 and EAPD. We always set PR6 EAPD since they don't
- * hurt anything. Then we walk to PR2|PR3. We don't go any further
- * because this requires that we do a cold reset. Since this pin
- * isn't connected in the 1553 we can't do this.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_power_down(audiots_state_t *state)
-{
- ATRACE("in audiots_power_down() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* No interrupts should be pending before we power down */
- ASSERT(ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_aint) == 0);
- ASSERT(ddi_get32(state->ts_handle,
- &state->ts_regs->aud_regs.ap_eint) == 0);
-
- /* powering down, save the audio core's state */
- audiots_save_controller(state);
-
- /* power down the Codec, also shut down external amps */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER,
- (PCSR_PR6|PCSR_EAPD));
-
- /* shut down ADC and inputs */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_PR0);
-
- /* shut down DAC */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER, PCSR_PR1);
-
- /* shut down analog mixer and Vref */
- audiots_set_ac97(state, AC97_POWERDOWN_CTRL_STAT_REGISTER,
- (PCSR_PR2|PCSR_PR3));
-
- /* MUST clear the shadow register so we can power up! */
- state->ts_shadow[TS_CODEC_REG(AC97_POWERDOWN_CTRL_STAT_REGISTER)] = 0;
-
- /* power down the core, if allowed */
- if (state->ts_pm_core == TS_PWR_MANAGE) {
- /* okay, drop to D3 for the best power reduction */
- OR_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, TS_PWR_D3);
-
- /*
- * wait 20 milliseconds for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(TS_20MS));
-#endif
- }
-
- state->ts_powered = TS_PWR_OFF;
-
- ATRACE("audiots_power_down() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_power_down() */
-
-/*
- * audiots_power_up()
- *
- * Description:
- * Power up the audio core if allowed, and then the AC-97 Codec.
- * The state change timings documented in audiots_power_down()
- * apply to powering up as well.
- *
- * audiots_chip_init() does a soft reset, which powers up all of
- * the sections of the Codec that were powered down in
- * audiots_power_down().
- *
- * NOTE: We don't worry about locking since the only routines that
- * may call us are audiots_attach() and audiots_power().
- * Both of which should be the only threads in the driver.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_power_up(audiots_state_t *state)
-{
- ATRACE("in audiots_power_up()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* PM should be enabled */
- ASSERT(state->ts_flags & TS_PM_SUPPORTED);
-
- /* power up the core, if allowed */
- if (state->ts_pm_core == TS_PWR_MANAGE) {
- /* go from D3 to D0 */
- AND_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, ~TS_PWR_D3);
-
- /*
- * wait 20 milliseconds for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(TS_20MS));
-#endif
- /* clear the PME# flag */
- OR_SET_SHORT(state->ts_chandle,
- &state->ts_config->tsc_pmcsr, TS_PWR_PME);
- }
-
- /* restore the state, does reset to power up the Codec */
- audiots_chip_init(state, TS_INIT_RESTORE);
-
- state->ts_powered = TS_PWR_ON;
-
- ATRACE("audiots_power_up() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_power_up() */
-
-/*
- * audiots_read_ac97()
- *
- * Description:
- * This routine actually reads the AC-97 Codec's register. It may
- * be called several times to succeed.
- *
- * NOTE:
- * Revision M1535D B1-C of the ALI SouthBridge includes a workaround for
- * the broken busy flag. Resetting the busy flag requires a software tweak
- * to go with the worked around hardware. When we detect failure, we make
- * 10 attempts to reset the chip before we fail. This should reset the new
- * SB systems. On all SB systems, this will increse the read delay
- * slightly, but shouldn't bother it otherwise.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- *
- * Returns:
- * unsigned short The value in the specified register
- */
-static uint16_t
-audiots_read_ac97(audiots_state_t *state, int reg)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *addr;
- uint16_t *data;
- uint32_t *stimer = &state->ts_regs->aud_regs.ap_stimer;
- uint32_t chk1;
- uint32_t chk2;
- int resets = 0;
- int i;
-
- if (state->ts_rev_id == AC_REV_ID1) {
- addr = &state->ts_regs->aud_regs.ap_acrd_35D_reg;
- data = &state->ts_regs->aud_regs.ap_acrd_35D_data;
- ATRACE("Using OLD SB 35D addresses for reading", 0x44);
- } else {
- addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
- data = &state->ts_regs->aud_regs.ap_acrdwr_data;
- ATRACE("Using NEW SB 35D+ addresses for reading", 0x40);
- }
-
-first_read:
- /* wait for ready to send read request */
- for (i = 0; i < TS_READ_TRIES; i++) {
- if (!(ddi_get16(handle, addr) & AP_ACRD_R_READ_BUSY)) {
- break;
- }
- /* don't beat on the bus */
- drv_usecwait(1);
- }
- if (i >= TS_READ_TRIES) {
- if (resets < TS_RESET_TRIES) {
- /* Attempt to reset */
- ATRACE("Attempting to reset the AC97 #1", resets);
- drv_usecwait(TS_20US);
- ddi_put16(handle, addr, TS_SB_RESET);
- resets++;
- goto first_read;
- } else {
- ATRACE("Reading the AC97 register has failed #1", 0);
- state->ts_flags |= TS_AUDIO_READ_FAILED;
- if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
- "Unable to communicate with AC97 CODEC");
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "The audio AC97 register has timed out.");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Audio is now disabled.\n");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Please reboot to restore audio.\n");
-
- /* Don't flood the console */
- state->ts_flags |= TS_READ_FAILURE_PRINTED;
- }
- }
- return (0);
- }
-
- /* program the register to read */
- ddi_put16(handle, addr, (reg|AP_ACRD_W_PRIMARY_CODEC|
- AP_ACRD_W_READ_MIXER_REG|AP_ACRD_W_AUDIO_READ_REQ&
- (~AP_ACWR_W_SELECT_WRITE)));
-
- /* hardware bug work around */
- chk1 = ddi_get32(handle, stimer);
- chk2 = ddi_get32(handle, stimer);
- i = TS_WAIT_CNT;
- while (chk1 == chk2 && i) {
- chk2 = ddi_get32(handle, stimer);
- i--;
- }
- OR_SET_SHORT(handle, addr, AP_ACRD_W_READ_MIXER_REG);
- resets = 0;
-
-second_read:
- /* wait again for read to send read request */
- for (i = 0; i < TS_READ_TRIES; i++) {
- if (!(ddi_get16(handle, addr) & AP_ACRD_R_READ_BUSY)) {
- break;
- }
- /* don't beat on the bus */
- drv_usecwait(1);
- }
- if (i >= TS_READ_TRIES) {
- if (resets < TS_RESET_TRIES) {
- /* Attempt to reset */
- ATRACE("Attempting to reset the AC97 #2", resets);
- drv_usecwait(TS_20US);
- ddi_put16(handle, addr, TS_SB_RESET);
- resets++;
- goto second_read;
- } else {
- ATRACE("Reading the AC97 register has failed #2", 0);
- state->ts_flags |= TS_AUDIO_READ_FAILED;
- if (!(state->ts_flags & TS_READ_FAILURE_PRINTED)) {
- ddi_dev_report_fault(state->ts_dip,
- DDI_SERVICE_LOST, DDI_DEVICE_FAULT,
- "Unable to communicate with AC97 CODEC");
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "The audio AC97 register has timed out.");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Audio is now disabled.\n");
- audio_sup_log(state->ts_ahandle, CE_CONT,
- "Please reboot to restore audio.\n");
-
- /* Don't flood the console */
- state->ts_flags |= TS_READ_FAILURE_PRINTED;
- }
- }
- return (0);
- }
-
- return (ddi_get16(handle, data));
-
-} /* audiots_read_ac97() */
-
-/*
- * audiots_save_controller()
- *
- * Description:
- * Save the state of the audio controller.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_save_controller(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- int str;
-
- ATRACE("in ts_save_controller()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* save the controller state, Codec state is in ts_shadow[] */
- handle = state->ts_handle;
- for (str = 0; str < TS_MAX_HW_CHANNELS; str++) {
- state->ts_save_regs[str].aram_delta = ddi_get16(handle,
- &state->ts_regs->aud_ram[str].aram.aram_delta);
- state->ts_save_regs[str].eram_ctrl_ec = ddi_get16(handle,
- &state->ts_regs->aud_ram[str].eram.eram_ctrl_ec);
- }
-
- ATRACE("ts_save_controller() done", NULL);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_save_controller() */
-
-/*
- * audiots_set_ac97()
- *
- * Description:
- * Set the value in the specified AC-97 Codec register. Just like
- * reading the AC-97 Codec, it is possible there is a problem writing
- * it as well. So we loop.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int reg AC-97 register number
- * uint16_t value The value to write
- *
- * Returns:
- * void
- */
-static void
-audiots_set_ac97(audiots_state_t *state, int reg, const uint16_t data)
-{
- ddi_acc_handle_t handle = state->ts_handle;
- uint16_t *data_addr = &state->ts_regs->aud_regs.ap_acrdwr_data;
- uint16_t *reg_addr = &state->ts_regs->aud_regs.ap_acrdwr_reg;
- int count;
- int i;
- uint16_t tmp_short;
-
- reg &= AP_ACWR_INDEX_MASK;
-
- /* Don't touch the reserved bits on the pre 35D+ SouthBridge */
- if (state->ts_rev_id == AC_REV_ID1) {
- reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG;
- ATRACE("Writing to 35D SB", reg);
- } else {
- reg |= AP_ACWR_W_PRIMARY_CODEC|AP_ACWR_W_WRITE_MIXER_REG|
- AP_ACWR_W_SELECT_WRITE;
- ATRACE("Writing to 35D+ SB", reg);
- }
-
- for (count = TS_LOOP_CNT; count--; ) {
- /* wait for ready to write */
- for (i = 0; i < TS_WAIT_CNT; i++) {
- if (!(ddi_get16(handle, reg_addr) &
- AP_ACWR_R_WRITE_BUSY)) {
- /* ready to write */
- ddi_put16(handle, reg_addr, reg);
-
- /* Write the data */
- ddi_put16(handle, data_addr, data);
- break;
- }
- }
- if (i >= TS_WAIT_CNT) {
- /* try again */
- continue;
- }
-
- /* wait for write to complete */
- for (i = 0; i < TS_WAIT_CNT; i++) {
- if (!(ddi_get16(handle, reg_addr) &
- AP_ACWR_R_WRITE_BUSY)) {
- /* done writing */
- break;
- }
- }
-
- /* verify the value written and also update ts_shadow[] */
- tmp_short = audiots_get_ac97(state, reg);
- if (data == tmp_short) {
- /* successfully loaded, so we can return */
- return;
- }
- }
-
-} /* audiots_set_ac97() */
-
-/*
- * audiots_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended or the power removed by the power
- * manager. It will also block any routine while a suspend is
- * going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Set busy and powered up
- * AUDIO_FAILURE Couldn't power up, so not busy
- */
-static int
-audiots_set_busy(audiots_state_t *state)
-{
- ATRACE("in audiots_set_busy()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->ts_lock);
-
- /* Don't proceed if PM is not enabled */
- if (!(state->ts_flags & TS_PM_SUPPORTED)) {
- mutex_exit(&state->ts_lock);
- return (AUDIO_SUCCESS);
- }
-
- /* block if we are going to be suspended */
- while (state->ts_suspended == TS_SUSPENDED) {
- cv_wait(&state->ts_cv, &state->ts_lock);
- }
-
- /*
- * Okay, we aren't going to be suspended yet, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(state->ts_busy_cnt >= 0);
- state->ts_busy_cnt++;
-
- /* now can release the lock before we raise the power */
- mutex_exit(&state->ts_lock);
-
- /*
- * Mark as busy before we ask for power to be raised. This removes
- * the race condtion between the call to audiots_power() and our call
- * to raise power. After we raise power we immediately mark as idle
- * so the count is still good.
- */
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- if (pm_raise_power(state->ts_dip, TS_COMPONENT, TS_PWR_ON) ==
- DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- ATRACE("ts_set_busy() pm_raise_power() failed", NULL);
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!set_busy() power up failed");
-
- mutex_enter(&state->ts_lock);
- state->ts_busy_cnt--; /* restore busy count */
- if (state->ts_busy_cnt == 0) {
- /* let DDI_SUSPEND continue */
- cv_broadcast(&state->ts_cv);
- }
- mutex_exit(&state->ts_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* power is up and we are marked as busy, so we are done */
-
- ATRACE("audiots_set_busy() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_set_busy() */
-
-/*
- * audiots_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left or 1 == right
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-audiots_set_gain(audiots_state_t *state, int stream, int dir, int gain,
- int channel)
-{
- uint16_t tmp_short;
-
- ATRACE("in audiots_set_gain()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (dir == AUDIO_PLAY) { /* play gain */
- /*
- * For play we use PCM so all volumes change with just
- * one write. This way we get line out, headphone and
- * internal speaker in one shot.
- *
- * The AC-97 Codec goes from -34.5 dB (11111) to 0 dB
- * (01000) to +12.0 dB (00000). We turn gain into atten.
- */
- mutex_enter(&state->ts_lock);
- tmp_short = state->ts_shadow[
- TS_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)];
- if (channel == 0) { /* left channel */
- tmp_short &= ~PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= (((AUDIO_MAX_GAIN - gain) >>
- TS_GAIN_SHIFT3) << TS_BYTE_SHIFT) &
- PCMOVR_LEFT_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp_short &= ~PCMOVR_RIGHT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >>
- TS_GAIN_SHIFT3) & PCMOVR_RIGHT_GAIN_MASK;
- }
- audiots_set_ac97(state, AC97_PCM_OUT_VOLUME_REGISTER,
- tmp_short);
- mutex_exit(&state->ts_lock);
- } else {
- ASSERT(dir == AUDIO_RECORD);
- /*
- * For record we use the master record gain with all
- * of the inputs set to 0dB.
- *
- * The AC-97 Codec goes from 0 dB (0000) to +22.5 dB
- * (1111), so gain remains gain. We chop off the bottom
- * 4 bits and use the top for the gain.
- */
- mutex_enter(&state->ts_lock);
- tmp_short =
- state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)];
- if (channel == 0) { /* left channel */
- tmp_short &= ~RGR_LEFT_MASK;
- tmp_short |= (gain << TS_GAIN_SHIFT4) & RGR_LEFT_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp_short &= ~RGR_RIGHT_MASK;
- tmp_short |= (gain >> TS_GAIN_SHIFT4) & RGR_RIGHT_MASK;
- }
- audiots_set_ac97(state, AC97_RECORD_GAIN_REGISTER,
- tmp_short);
- mutex_exit(&state->ts_lock);
- }
-
- ATRACE("audiots_set_gain() done", NULL);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* audiots_set_gain() */
-
-/*
- * audiots_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * It ends by resetting the power management timer.
- *
- * We don't do anything with power because the routine that is no longer
- * busy either doesn't need the hardware, or we are playing or recording
- * so the power won't come down anyway.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_set_idle(audiots_state_t *state)
-{
- ATRACE("in audiots_set_idle()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->ts_lock);
-
- /* Don't proceed if PM is not enabled */
- if (!(state->ts_flags & TS_PM_SUPPORTED)) {
- mutex_exit(&state->ts_lock);
- return;
- }
-
- ASSERT(state->ts_suspended == TS_NOT_SUSPENDED);
-
- /* decrement the busy count */
- state->ts_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (state->ts_busy_cnt == 0) {
- cv_broadcast(&state->ts_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&state->ts_lock);
-
- /* reset the timer */
- (void) pm_idle_component(state->ts_dip, TS_COMPONENT);
-
- ATRACE("audiots_set_idle() done", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
-} /* audiots_set_idle() */
-
-/*
- * audiots_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-audiots_set_monitor_gain(audiots_state_t *state, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audiots_set_monitor_gain()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to meet the requirement of AC'97 */
- tmp_short = (((AUDIO_MAX_GAIN - gain) >> TS_GAIN_SHIFT3) <<
- TS_BYTE_SHIFT) & PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >> TS_GAIN_SHIFT3) &
- PCMOVR_RIGHT_GAIN_MASK;
- }
-
- mutex_enter(&state->ts_lock);
-
- switch (state->ts_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
- case AUDIO_MICROPHONE:
- /*
- * MIC input has 20dB boost, we just preserve it
- */
- tmp_short |= state->ts_shadow[TS_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- audiots_set_ac97(state,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_LINE_IN:
- audiots_set_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_CD:
- audiots_set_ac97(state,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are getting the loopback, so done */
- mutex_exit(&state->ts_lock);
- rc = AUDIO_SUCCESS;
- goto done;
- default:
- /* this should never happen! */
- mutex_exit(&state->ts_lock);
- ATRACE("ts_ad_set_config() monitor gain bad device",
- NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- state->ts_monitor_gain = 0;
- } else {
- state->ts_monitor_gain = tmp_short;
- }
- mutex_exit(&state->ts_lock);
-
-done:
- ATRACE_32("audiots_set_monitor_gain()", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_set_monitor_gain() */
-
-/*
- * audiots_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * We also use this routine to unmute the play ports. By passing
- * TS_PORT_UNMUTE as the port we know to use the stored play port.
- * This has to be done inside the lock, otherwise there is the
- * possibility that the port passed in when this routine is called
- * could be wrong by the time we execute the unmute.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- * which is not how we program the device
- * for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int port The port to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audiots_set_port(audiots_state_t *state, int dir, int port)
-{
- uint32_t tmp_word;
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in audiots_set_port()", state);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- if (dir == AUDIO_PLAY) { /* output port(s) */
- /* figure out which output port(s) to turn on */
- tmp_word = 0;
-
- mutex_enter(&state->ts_lock);
-
- /*
- * CAUTION: We must get the saved output port after the
- * lock so we know it is good.
- */
- if (port == TS_PORT_UNMUTE) {
- port = state->ts_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- audiots_and_ac97(state,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MMVR_MUTE);
- tmp_word |= AUDIO_SPEAKER;
- } else {
- audiots_or_ac97(state,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- }
-
- if (port & AUDIO_HEADPHONE) {
- audiots_and_ac97(state,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~HPVR_MUTE);
- tmp_word |= AUDIO_HEADPHONE;
- } else {
- audiots_or_ac97(state,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- audiots_and_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp_word |= AUDIO_LINE_OUT;
- } else {
- audiots_or_ac97(state, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
- }
-
- state->ts_output_port = tmp_word;
-
- mutex_exit(&state->ts_lock);
-
- ATRACE_32("ts_ad_set_config() set out port", tmp_word);
-
- if (tmp_word != (port & TS_PORT_MASK)) {
- ATRACE_32("ts_ad_set_config() bad out port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- /* figure out which input port to set */
- mutex_enter(&state->ts_lock);
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp_short = RSCR_R_PHONE|RSCR_L_PHONE;
-
- /* mute the master record input */
- audiots_or_ac97(state, AC97_RECORD_GAIN_REGISTER,
- RGR_MUTE);
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp_short = RSCR_R_MIC|RSCR_L_MIC;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp_short = RSCR_R_LINE_IN|RSCR_L_LINE_IN;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_CD:
- /* set to the line in input */
- tmp_short = RSCR_R_CD|RSCR_L_CD;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- }
- audiots_set_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- state->ts_monitor_gain);
- }
- break;
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp_short = RSCR_R_STEREO_MIX|RSCR_L_STEREO_MIX;
-
- /* see if we need to update monitor loopback */
- if (state->ts_monitor_gain) {
- if (state->ts_input_port == AUDIO_LINE_IN) {
- audiots_or_ac97(state,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (state->ts_input_port ==
- AUDIO_MICROPHONE) {
- audiots_or_ac97(state,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (state->ts_input_port == AUDIO_CD) {
- audiots_or_ac97(state,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- }
- break;
- default:
- /* unknown or inclusive input ports */
- mutex_exit(&state->ts_lock);
- ATRACE_32("ts_ad_set_config() bad in port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
- /* select the input */
- audiots_set_ac97(state, AC97_RECORD_SELECT_CTRL_REGISTER,
- tmp_short);
-
- /* if an input port then make sure we aren't muted */
- if (port != AUDIO_NONE &&
- (state->ts_shadow[TS_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] &
- RGR_MUTE)) {
- audiots_and_ac97(state, AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
-
- state->ts_input_port = port;
-
- mutex_exit(&state->ts_lock);
- }
-
-done:
- ATRACE_32("audiots_set_port()", rc);
-
- ASSERT(!mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_set_port() */
-
-/*
- * audiots_start_play()
- *
- * Description:
- * The audio core uses a single DMA buffer which is divided into two
- * halves. An interrupt is generated when the middle of the buffer has
- * been reached and at the end. The audio core resets the pointer back
- * to the beginning automatically. After the interrupt the driver clears
- * the buffer and asks the mixer for more audio samples. If there aren't
- * enough then silence is played out.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audiots_start_play(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- size_t buf_size;
- char *bptr;
- int rc = AUDIO_SUCCESS;
- int rs;
- int samples;
- int str = TS_OUTPUT_STREAM;
-
- ATRACE("in ts_start_play()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- handle = state->ts_handle;
-
- /* see if we are already playing */
- if ((ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_OUTPUT_CHANNEL)) {
- ATRACE("ts_start_play() DMA engine already running", state);
- ASSERT(rc == AUDIO_SUCCESS);
- goto done;
- }
-
- /* see if we are just paused */
- if (state->ts_flags & TS_DMA_ENGINE_PAUSED) {
- ATRACE_32("ts_start_play() DMA paused", state->ts_flags);
- state->ts_flags &= ~TS_DMA_ENGINE_PAUSED;
-
- /* make sure it starts playing */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start,
- TS_OUTPUT_CHANNEL);
-
- ATRACE_32("ts_start_play() DMA engine restarted",
- state->ts_flags);
- ASSERT(rc == AUDIO_SUCCESS);
- goto done;
- }
-
- /*
- * Okay, we are starting from scratch, so get the first chunks of audio.
- * We ask for half of the buffer twice. That way we don't mess up the
- * mixer's paradigm of using two buffers. But before we get the audio
- * we zero the buffer, giving it silence, just in case there isn't
- * enough audio.
- */
- bzero(state->ts_pb, state->ts_pbuf_size);
-
- samples = state->ts_psample_rate * state->ts_pchannels /
- state->ts_ad_info.ad_play.ad_int_rate;
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE_32("ts_start_play() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
-
- buf_size = samples * (state->ts_pprecision >> AUDIO_PRECISION_SHIFT);
- ASSERT((buf_size << 1) <= state->ts_pbuf_size);
-
- ATRACE("ts_start_play() getting 1st audio", NULL);
- bptr = state->ts_pb;
-
- mutex_exit(&state->ts_lock);
- rs = am_get_audio(state->ts_ahandle, &bptr[0], AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->ts_lock);
-
- if (rs == 0) {
- /* there's nothing to play */
- ATRACE("ts_start_play() nothing to play", NULL);
- rc = AUDIO_FAILURE;
- goto done;
- }
- ATRACE_32("ts_start_play() 1st am_get_audio()", rs);
- state->ts_pcnt[TS_1ST_HALF] = buf_size;
- state->ts_psamples[TS_1ST_HALF] = samples;
-
- ATRACE("ts_start_play() getting 2nd audio", NULL);
-
- mutex_exit(&state->ts_lock);
- rs = am_get_audio(state->ts_ahandle, &bptr[buf_size], AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->ts_lock);
-
- ATRACE_32("ts_start_play() 2nd am_get_audio()", rs);
- if (rs > 0) {
- state->ts_pcnt[TS_2ND_HALF] = buf_size;
- } else {
- state->ts_pcnt[TS_2ND_HALF] = 0;
- }
- state->ts_psamples[TS_2ND_HALF] = samples;
-
- /* sync the DMA buffer */
- if (ddi_dma_sync(state->ts_ph, (off_t)0, (off_t)0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->ts_ahandle, CE_WARN,
- "!start_play() ddi_dma_sync() failed, audio lost");
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- /* set ALPHA and FMS to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_alpha_fms,
- 0x0);
-
- /* set CSO to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_cso, 0x0);
-
- /* set LBA */
- ddi_put32(handle, &state->ts_regs->aud_ram[str].aram.aram_cptr_lba,
- state->ts_pc.dmac_address & ARAM_LBA_MASK);
-
- /* set ESO */
- if (state->ts_pchannels == AUDIO_CHANNELS_MONO) {
- samples = (samples << 1) - 1;
- } else {
- samples--;
- }
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_eso, samples);
-
- /* enable interrupts */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_OUTPUT_CHANNEL);
-
- /* make sure it starts playing */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start,
- TS_OUTPUT_CHANNEL);
-
- state->ts_flags &= ~(TS_DMA_ENGINE_PAUSED|TS_DMA_ENGINE_EMPTY);
- state->ts_flags |= TS_DMA_ENGINE_INITIALIZED;
-
- ATRACE("ts_start_play() successful", state);
- ASSERT(rc == AUDIO_SUCCESS);
-
-done:
- ASSERT(mutex_owned(&state->ts_lock));
-
- return (rc);
-
-} /* audiots_start_play() */
-
-/*
- * audiots_stop_play()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_stop_play(audiots_state_t *state)
-{
- ATRACE("in ts_stop_play()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_OUTPUT_CHANNEL);
-
- AND_SET_WORD(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- ~TS_OUTPUT_CHANNEL);
-
- state->ts_flags &= ~(TS_DMA_ENGINE_INITIALIZED|TS_DMA_ENGINE_PAUSED|
- TS_DMA_ENGINE_EMPTY);
-
- ATRACE("ts_stop_play() returning", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_play() */
-
-/*
- * audiots_start_record()
- *
- * Description:
- * The record DMA engine works the same way as the play DMA engine.
- * Record cannot be multi-stream and must be on T2 channel 31.
- *
- * There isn't a pause for record, only start and stop. So this code
- * is a touch simpler than starting up play.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-/*ARGSUSED*/
-static int
-audiots_start_record(audiots_state_t *state)
-{
- ddi_acc_handle_t handle;
- size_t buf_size;
- int rc = AUDIO_SUCCESS;
- int samples;
- int str = TS_INPUT_STREAM;
-
- ATRACE("in ts_start_record()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- handle = state->ts_handle;
-
- /* see if we are already recording */
- if ((ddi_get32(handle, &state->ts_regs->aud_regs.ap_start) &
- TS_INPUT_CHANNEL)) {
- ATRACE("ts_start_record() DMA engine already running",
- state);
- ASSERT(rc == AUDIO_SUCCESS);
- return (rc);
- }
-
- /* okay, we start from scratch; start by figuring out sample sizes */
- samples = state->ts_csample_rate * state->ts_cchannels /
- state->ts_ad_info.ad_record.ad_int_rate;
- /* if not an even number of samples we panic! */
- if ((samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE_32("ts_start_record() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
-
- buf_size = samples * (state->ts_cprecision >> AUDIO_PRECISION_SHIFT);
- ASSERT((buf_size << 1) <= state->ts_cbuf_size);
-
- state->ts_ccnt = buf_size;
-
- /* set ALPHA and FMS to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_alpha_fms,
- 0x0);
-
- /* set CSO to 0 */
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_cso, 0x0);
-
- /* set LBA */
- ddi_put32(handle, &state->ts_regs->aud_ram[str].aram.aram_cptr_lba,
- state->ts_cc.dmac_address & ARAM_LBA_MASK);
-
- /* set ESO */
- if (state->ts_cchannels == AUDIO_CHANNELS_MONO) {
- samples = (samples << 1) - 1;
- } else {
- samples--;
- }
- ddi_put16(handle, &state->ts_regs->aud_ram[str].aram.aram_eso, samples);
-
- /* enable interrupts */
- OR_SET_WORD(handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_INPUT_CHANNEL);
-
- /* make sure it starts recording */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_start, TS_INPUT_CHANNEL);
-
- state->ts_flags |= TS_DMA_RECORD_START;
-
- ATRACE("ts_start_record() done", NULL);
- ASSERT(rc == AUDIO_SUCCESS);
-
-done:
- ASSERT(mutex_owned(&state->ts_lock));
-
- if (rc == AUDIO_SUCCESS && (state->ts_flags & TS_PM_SUPPORTED)) {
- (void) pm_busy_component(state->ts_dip, TS_COMPONENT);
- }
-
- return (rc);
-
-} /* audiots_start_record() */
-
-/*
- * audiots_stop_record()
- *
- * Description:
- * This routine stops the record DMA engine. Any data in the buffer
- * is just thrown away. After all, we're done recording so there aren't
- * any apps that need audio.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-audiots_stop_record(audiots_state_t *state)
-{
- ddi_acc_handle_t handle = state->ts_handle;
-
- ATRACE("in ts_stop_record()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- /* stop recording */
- ddi_put32(handle, &state->ts_regs->aud_regs.ap_stop, TS_INPUT_CHANNEL);
-
- AND_SET_WORD(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- ~TS_INPUT_CHANNEL);
-
- state->ts_flags &= ~TS_DMA_RECORD_START;
-
- ATRACE("ts_stop_record() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_record() */
-
-/*
- * audiots_stop_everything()
- *
- * Description:
- * This routine disables the address engine interrupt for all 32 DMA
- * engines. Just to be sure, it then explicitly issues a stop command to
- * the address engine and envelope engines for all 32 channels.
- *
- * NOTE:
- * There is a hardware bug that generates a spurious interrupt when the DMA
- * engines are stopped. It's not consistent - it happens every 1 out of 6
- * stops or so. It will show up as a record interrupt. The problem is that
- * once the driver is detached or if the system goes into low power mode,
- * nobody will service that interrupt. The system will eventually become
- * unusable.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audiots_stop_everything(audiots_state_t *state)
-{
- uint_t intr;
-
- ATRACE("in ts_stop_everything()", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
-
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_stop,
- TS_ALL_DMA_ENGINES);
-
- intr = ddi_get32(state->ts_handle, &state->ts_regs->aud_regs.ap_aint);
- if (intr != 0) {
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_aint,
- intr);
- ddi_put32(state->ts_handle, &state->ts_regs->aud_regs.ap_ainten,
- TS_ALL_DMA_OFF);
- ATRACE("ts_stop_everything() clearing the bogus interrupt",
- intr);
-
- /*
- * Flag this interrupt for the audiots_intr() routine to claim,
- * but this interrupt doesn't need to be processed.
- */
- state->ts_flags |= TS_INTR_PENDING;
- }
-
- ATRACE("ts_stop_everything() done", state);
-
- ASSERT(mutex_owned(&state->ts_lock));
-
-} /* audiots_stop_everything() */
-
-/*
- * audiots_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocates the DMA handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * audiots_state_t *state The device's state structure
- *
- * Returns:
- * None
- */
-static void
-audiots_unmap_regs(audiots_state_t *state)
-{
- ATRACE("in ts_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->ts_ph);
- (void) ddi_dma_unbind_handle(state->ts_ch);
-
- ddi_dma_mem_free(&state->ts_pmh);
- ddi_dma_mem_free(&state->ts_cmh);
-
- ddi_dma_free_handle(&state->ts_ph);
- ddi_dma_free_handle(&state->ts_ch);
-
- ddi_regs_map_free(&state->ts_handle);
- ddi_regs_map_free(&state->ts_chandle);
-
- ATRACE("ts_unmap_regs() returning", state);
-
-} /* audiots_unmap_regs() */
diff --git a/usr/src/uts/common/io/audio/sada/framework/audio_support.c b/usr/src/uts/common/io/audio/sada/framework/audio_support.c
deleted file mode 100644
index 3d20b6a313..0000000000
--- a/usr/src/uts/common/io/audio/sada/framework/audio_support.c
+++ /dev/null
@@ -1,4209 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Audio Support Module
- *
- * This module is use by Audio Drivers that use the new audio driver
- * architecture. It provides common services to get and set data
- * structures used by Audio Drivers and Audio Personality Modules.
- * It provides the home for the audio_state_t structures, one per
- * audio device.
- *
- * Audio Drivers set their qinit structures to the open, close, info, put
- * and service routines in this module. Then this module determines
- * which Audio Personality Module to call to implement the read, write,
- * and ioctl semantics.
- *
- * This module supports persistent data across driver/module unloads
- * and reloads. The space_*() routines are used to save an main anchor
- * which points to a linked list of instance data structures. Each instance
- * data structure points to APM data structures for its instance. These
- * instance and APM persistent data structures are available only via the
- * main anchor.
- */
-
-#include <sys/note.h>
-#include <sys/varargs.h>
-#include <sys/stream.h>
-#include <sys/modctl.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/strsun.h>
-#include <sys/taskq.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/impl/audio_support_impl.h>
-
-/*
- * Solaris external defines.
- */
-extern pri_t minclsyspri;
-
-/*
- * External functions not declared in header files.
- */
-extern uintptr_t space_fetch(char *key);
-extern void space_free(char *key);
-extern int space_store(char *key, uintptr_t ptr);
-
-/* streams stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyreq))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyresp))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", datab))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", queue))
-
-/* other unshared/stable or no lock needed stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_channel))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_i_state))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_qptr))
-
-#ifdef DEBUG
-/*
- * Global audio tracing variables
- */
-audio_trace_buf_t audio_trace_buffer[AUDIO_TRACE_BUFFER_SIZE];
-kmutex_t audio_tb_lock;
-size_t audio_tb_siz = AUDIO_TRACE_BUFFER_SIZE;
-int audio_tb_pos = 0;
-uint_t audio_tb_seq = 0;
-#endif
-
-/*
- * Global hidden variables.
- */
-/* for persistent memory */
-static audio_inst_persist_t **audio_main_anchor = NULL;
-static char *audio_key_class = AUDIO_KEY_CLASS;
-
-static audio_inst_info_t *audio_drv_list_head;
- /* list of all registered drivers */
-
-/* locks */
-static kmutex_t audio_drv_list_lock; /* mutex to protect driver list */
-static kmutex_t audio_persist_lock; /* mutex to protect persistent data */
-_NOTE(MUTEX_PROTECTS_DATA(audio_drv_list_lock, audio_inst_info))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_main_anchor))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_inst_persist))
-_NOTE(MUTEX_PROTECTS_DATA(audio_persist_lock, audio_apm_persist))
-
-/* console message logging */
-static kmutex_t audio_sup_log_lock;
-static char audio_sup_log_buf[256];
-_NOTE(MUTEX_PROTECTS_DATA(audio_sup_log_lock, audio_sup_log_buf))
-
-static audio_device_t audio_device_info = {
- AUDIO_NAME,
- AUDIO_VERSION,
- AUDIO_CONFIGURATION
-};
-
-/*
- * Local Support Routine Prototypes For Audio Support Module
- */
-static audio_inst_info_t *audio_sup_create_drv_entry(dev_info_t *);
-static audio_inst_info_t *audio_sup_lookup_drv_entry(dev_info_t *);
-static void audio_sup_free_drv_entry(dev_info_t *);
-static void audio_sup_free_apm_persist(audio_state_t *, audio_apm_persist_t *);
-static void audio_sup_free_inst_persist(audio_state_t *,
- audio_inst_persist_t *);
-static int audio_sup_persist(audio_state_t *, char *);
-
-static int audio_sup_wiocdata(queue_t *, mblk_t *, audio_ch_t *);
-static int audio_sup_wioctl(queue_t *, mblk_t *, audio_ch_t *);
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc audio_modlmisc = {
- &mod_miscops, /* drv_modops */
- AUDIO_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage audio_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&audio_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Standard loadable Module Configuration Entry Points
- */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when module is first loaded.
- * Global module locks are initialized here.
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
-#ifdef DEBUG
- /* initialize the trace lock */
- mutex_init(&audio_tb_lock, NULL, MUTEX_DRIVER, NULL);
-#endif
-
- /* standard linkage call */
- if ((error = mod_install(&audio_modlinkage)) != 0) {
- ATRACE_32("audiosup _init() error 1", error);
-#ifdef DEBUG
- mutex_destroy(&audio_tb_lock);
-#endif
- return (error);
-
- }
-
- /* init mutexes after we can't have any failures */
-
- /* initialize the instance list lock */
- mutex_init(&audio_drv_list_lock, NULL, MUTEX_DRIVER, NULL);
- /* log buffer mutex */
- mutex_init(&audio_sup_log_lock, NULL, MUTEX_DRIVER, NULL);
-
- /* persistent data mutex */
- mutex_init(&audio_persist_lock, NULL, MUTEX_DRIVER, NULL);
-
- ATRACE("audiosup _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- * Free resources that were allocated in _init().
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiosup _fini()", 0);
-
- /* all drivers must have unregistered */
- ASSERT(audio_drv_list_head == NULL);
-
- if ((error = mod_remove(&audio_modlinkage)) != 0) {
- ATRACE_32("audiosup _fini() mod_remove failed", error);
-
- return (error);
-
- }
-
- /* free instance list lock */
- mutex_destroy(&audio_drv_list_lock);
- /* free log lock */
- mutex_destroy(&audio_sup_log_lock);
- /* free persistent memory lock */
- mutex_destroy(&audio_persist_lock);
-
- ATRACE_32("audiosup _fini() successful", error);
-
-#ifdef DEBUG
- mutex_destroy(&audio_tb_lock);
-#endif
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&audio_modlinkage, modinfop);
-
- ATRACE_32("audiosup _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * Public Audio Device Independent Driver Entry Points
- *
- * Standard Driver Entry Points
- */
-
-/*
- * audio_sup_attach() and audio_sup_detach() are being replaced in the
- * next minor release of Solaris. Audio drivers must be modified to use
- * the new interfaces.
- */
-/*ARGSUSED*/
-audiohdl_t
-audio_sup_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audio_sup_reg_data_t data;
-
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
-
- return (audio_sup_register(dip, &data));
-
-} /* audio_sup_attach() */
-
-/*ARGSUSED*/
-int
-audio_sup_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
-{
- return (audio_sup_unregister(handle));
-}
-
-/*
- * audio_sup_register()
- *
- * Description:
- * This routine initializes structures used for an instance of an
- * audio driver. Persistent state storage is allocated and used to
- * store state when drivers are unloaded. This routine always allocates
- * a very small chunk of memory for each instance which we never free.
- *
- * Arguments:
- * dev_info_t *dip Ptr to the device's dev_info structure
- * audio_sup_reg_data_t *data Registration data
- *
- * Returns:
- * audiohdl_t Handle to the audio device is successful
- * NULL Attach failed
- */
-audiohdl_t
-audio_sup_register(dev_info_t *dip, audio_sup_reg_data_t *data)
-{
- audio_inst_info_t *instp; /* inst info pointer */
- audio_state_t *statep; /* instance state pointer */
- audio_ch_t *chptr; /* channel pointer */
- int i;
- int sup_chs;
-
- ATRACE("in audio_sup_register() dip", dip);
- ATRACE("audio_sup_register() version", data->asrd_version);
-
- /* make sure we have a supported version */
- if (data->asrd_version != AUDIOSUP_VERSION) {
- ATRACE("audio_sup_register() bad version", data->asrd_version);
- audio_sup_log(NULL, CE_WARN, "unsupported version: %d",
- data->asrd_version);
- return (NULL);
- }
-
- /* minors per inst - reserved audio channels */
- sup_chs = AUDIO_MINOR_PER_INST - AUDIO_NUM_DEVS;
- ATRACE_32("audio_sup_register() supported channels per device",
- sup_chs);
-
- /* register and get device instance number */
- if ((instp = audio_sup_create_drv_entry(dip)) == NULL) {
- ATRACE("audio_sup_register() "
- "audio_sup_create_drv_entry() failed", 0);
-
- return (NULL);
- }
-
- statep = &instp->ail_state;
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*statep))
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chptr))
-
- /*
- * WARNING: From here on all error returns must worry about the
- * driver list.
- *
- * Initialize the instance mutex and condition variables. Used to
- * allocate channels.
- */
- mutex_init(&statep->as_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&statep->as_cv, NULL, CV_DRIVER, NULL);
-
- /* initialize other state information */
- statep->as_dip = dip;
- statep->as_dev_instance = ddi_get_instance(dip);
- statep->as_major = ddi_driver_major(dip);
- statep->as_max_chs = sup_chs;
- statep->as_minors_per_inst = AUDIO_MINOR_PER_INST;
- statep->as_audio_reserved = AUDIO_NUM_DEVS;
-
- /* sanity check that we can use the device */
- ASSERT((sup_chs >= AUDIO_MIN_CLONE_CHS) &&
- (sup_chs <= AUDIO_CLONE_CHANLIM));
-
- /* setup persistent memory */
- if (audio_sup_persist(statep, data->asrd_key) == AUDIO_FAILURE) {
- ATRACE("audio_sup_register() couldn't set up persist mem", 0);
-
- goto error;
- }
-
- /*
- * WARNING: From here on we cannot fail. Otherwise we would have
- * to loop through the channel structures and clear those CVs
- * and locks.
- *
- * Initialize the channel structures.
- */
- ATRACE("audio_sup_register() # sup channels", sup_chs);
- for (i = 0, chptr = &statep->as_channels[0];
- i < sup_chs; i++, chptr++) {
- /* most everything is zero, do it quickly */
- bzero(chptr, sizeof (*chptr));
-
- /* now do the non-zero members */
- chptr->ch_statep = statep;
- chptr->ch_dev = NODEV;
- chptr->ch_info.ch_number = i;
- chptr->ch_info.dev_type = UNDEFINED;
-
- mutex_init(&chptr->ch_lock, NULL, MUTEX_DRIVER, NULL);
- mutex_init(&chptr->ch_adata_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&chptr->ch_cv, NULL, CV_DRIVER, NULL);
- }
-
- ATRACE_32("audio_sup_register() returning", statep->as_dev_instance);
-
-done:
- ATRACE("audio_sup_register() handle", statep);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*statep))
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chptr))
-
- return (AUDIO_STATE2HDL(statep));
-
-error:
- ATRACE("audio_sup_register() error", statep);
-
- mutex_destroy(&statep->as_lock);
- cv_destroy(&statep->as_cv);
-
- audio_sup_free_drv_entry(statep->as_dip);
-
- return (NULL);
-
-} /* audio_sup_register() */
-
-/*
- * audio_sup_unregister()
- *
- * Description:
- * This routine de-initializes structures used for an instance of the
- * of an audio driver. It doesn't really do too much.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * AUDIO_SUCCESS Detach successful
- * AUDIO_FAILURE Detach failed
- */
-int
-audio_sup_unregister(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_inst_persist_t *persistp;
-
- ATRACE("in audio_sup_unregister()", handle);
-
- /*
- * WARNING: From here on all error returns must worry about the
- * instance state structures.
- */
-
- /* get the state pointer for this instance */
- if ((statep = audio_sup_devinfo_to_state(statep->as_dip)) == NULL) {
- ATRACE("audio_sup_unregister() "
- "audio_sup_devinfo_to_state() failed", 0);
-
- return (AUDIO_FAILURE);
-
- }
-
- /*
- * Free the instance persistent data struct if it doesn't point to
- * any saved data.
- */
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
- ASSERT(audio_main_anchor);
-
- persistp = (audio_inst_persist_t *)statep->as_persistp;
-
- if (persistp->amp_apmp == NULL) {
- (void) audio_sup_free_inst_persist(statep, persistp);
- statep->as_persistp = NULL;
- }
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- /* remove the dip from the instance list */
- ATRACE("audio_sup_unregister() freeing instance", statep->as_dip);
- audio_sup_free_drv_entry(statep->as_dip);
-
- ATRACE("audio_sup_unregister() returning", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_unregister() */
-
-/*
- * audio_sup_open()
- *
- * Description:
- * This routine is called when the kernel wants to open an Audio Driver
- * channel. It figures out what kind of device it is and calls the
- * appropriate Audio Personality Module.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int flag Open flags
- * int sflag STREAMS flags
- * cred_t *credp Pointer to the user's credential struct.
- *
- * Returns:
- * 0 Successfully opened the device
- * errno Error number for failed open
- */
-int
-audio_sup_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t *chptr;
- audio_device_type_e type;
- int rc;
-
- ATRACE("in audio_sup_open()", q);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "audio_sup_open() audio_sup_devt_to_state() failed", 0);
-
- return (ENXIO);
-
- }
- ATRACE("audio_sup_open() statep", statep);
-
- /* get the device type */
- type = audio_sup_devt_to_ch_type(statep, *devp);
- ATRACE_32("audio_sup_open() type", type);
-
- /* get the APM info structure */
- if ((apm_infop = audio_sup_get_apm_info(statep, type)) == NULL) {
- ATRACE_32("audio_sup_open() audio_sup_get_apm_info() failed",
- type);
-
- return (ENXIO);
-
- }
- ATRACE("audio_sup_open() apm_infop", apm_infop);
-
- ASSERT(apm_infop->apm_open);
-
- rc = (*apm_infop->apm_open)(q, devp, flag, sflag, credp);
-
- if (rc == AUDIO_SUCCESS) {
- /* open was successful, make sure we've got routines */
- chptr = (audio_ch_t *)audio_sup_get_qptr_data(q);
- if (chptr == NULL ||
- chptr->ch_wput == NULL || chptr->ch_wsvc == NULL ||
- chptr->ch_rput == NULL || chptr->ch_rsvc == NULL) {
- ATRACE("audio_sup_open() bad open", chptr);
- /* close the device */
- (*apm_infop->apm_close)(q, flag, credp);
- rc = EIO;
- }
- }
-
- return (rc);
-
-} /* audio_sup_open() */
-
-/*
- * audio_sup_close()
- *
- * Description:
- * This routine is called when the kernel wants to close an Audio Driver
- * channel. It figures out what kind of device it is and calls the
- * appropriate Audio Personality Module.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag Open flags
- * cred_t *credp Pointer to the user's credential struct.
- *
- * Returns:
- * 0 Successfully closed the device
- * errno Error number for failed close
- */
-int
-audio_sup_close(queue_t *q, int flag, cred_t *credp)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_close()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (EIO);
- }
-
- ASSERT(chptr->ch_apm_infop);
- ASSERT(chptr->ch_apm_infop->apm_close);
- ATRACE("audio_sup_close() chptr->ch_apm_infop", chptr->ch_apm_infop);
-
- return ((*chptr->ch_apm_infop->apm_close)(q, flag, credp));
-
-} /* audio_sup_open() */
-
-/*
- * audio_sup_restore_state()
- *
- * Description:
- * Restore the state of the hardware that the specified APM controls.
- * The specified APM is called to do the restore. It is up to that
- * APM's restore state function to restart the hardware or not. The
- * APM also deals with the direction. If anything keeps the state from
- * being restored then AUDIO_FAILURE is returned. If AUDIO_ALL_DEVICES
- * is sent then if any one APM fails the whole call fails. It is also
- * a failure to restore an APM that doesn't have an apm_restore_state()
- * function, which is optional.
- *
- * Arguments:
- * audiohdl_t handle Device handle
- * audio_device_type_e device The device to restore
- * int dir The direction to restore
- *
- * Returns:
- * AUDIO_SUCCESS State restored
- * AUDIO_FAILURE State not restored
- */
-int
-audio_sup_restore_state(audiohdl_t handle, audio_device_type_e device, int dir)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- int found;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- ATRACE("in audio_sup_restore_state()", handle);
- ATRACE_32("audio_sup_restore_state() device", device);
-
- if (statep == NULL) {
- ATRACE("audio_sup_restore_state() no statep", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- if ((dir & AUDIO_BOTH) == 0) {
- ATRACE_32("audio_sup_restore_state() no direction", dir);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&statep->as_lock);
- if ((apm_infop = statep->as_apm_info_list) == NULL) {
- /* nothing to restore, so this is an error */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_restore_state() no apm list", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- mutex_exit(&statep->as_lock);
-
- /* go through the list looking for APMs that match this device */
- for (found = 0; apm_infop != NULL; apm_infop = apm_infop->apm_next) {
- /* does this APM match? */
- if (device != AUDIO_ALL_DEVICES &&
- device != apm_infop->apm_type) {
- /* nope, it doesn't, so get the next one */
- ATRACE_32("audio_sup_restore_state() not this one",
- apm_infop->apm_type);
- continue;
- }
-
- /* does this APM have a restore function? */
- if (apm_infop->apm_restore_state == NULL) {
- /* if AUDIO_ALL_DEVICES then it's okay to be NULL */
- if (device == AUDIO_ALL_DEVICES) {
- ATRACE("audio_sup_restore_state() NULL", 0);
- continue;
- } else {
- ATRACE("audio_sup_restore_state() fail NULL",
- 0);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- }
-
- /* this is ours, so call it */
- ATRACE("audio_sup_restore_state() calling restore",
- apm_infop->apm_restore_state);
- if ((*apm_infop->apm_restore_state)(statep, apm_infop, dir) ==
- AUDIO_FAILURE) {
- ATRACE("audio_sup_restore_state() restore failed",
- apm_infop->apm_restore_state);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- ATRACE_32("audio_sup_restore_state() restore succeeded",
- apm_infop->apm_type);
-
- /* are we done? */
- if (device != AUDIO_ALL_DEVICES) {
- /* yes, just a single device to restore */
- ATRACE_32(
- "audio_sup_restore_state() single dev success",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_SUCCESS);
- }
- }
-
- /* if we specify the device then it's possible it wasn't there, so ck */
- if (device != AUDIO_ALL_DEVICES && !found) {
- ATRACE_32("audio_sup_restore_state() single device not found",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- /*
- * Either we found the single device or we looked at all the devices
- * and they succeeded. Even if there wasn't a single restore function
- * to call when AUDIO_ALL_DEVICES was specified we still succeeded.
- */
-
- ATRACE_32("audio_sup_restore_state() all devices found", device);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_restore_state() */
-
-/*
- * audio_sup_save_state()
- *
- * Description:
- * Save the state of the hardware that the specified APM controls.
- * The specified APM is called to do the save. It is up to that
- * APM's save state function to define any interaction with the
- * hardware. If anything keeps the state from being saved then
- * AUDIO_FAILURE is returned. If AUDIO_ALL_DEVICES is sent then if
- * any one APM fails the whole call fails. It is also a failure to
- * save an APM that doesn't have an apm_save_state() function, which
- * is optional.
- *
- * Arguments:
- * audiohdl_t handle Device handle
- * audio_device_type_e device The device to save
- * int dir The direction to save
- *
- * Returns:
- * AUDIO_SUCCESS State save
- * AUDIO_FAILURE State not save
- */
-int
-audio_sup_save_state(audiohdl_t handle, audio_device_type_e device, int dir)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- int found;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- ATRACE("in audio_sup_save_state()", handle);
- ATRACE_32("audio_sup_save_state() device", device);
-
- if (statep == NULL) {
- ATRACE("audio_sup_save_state() no statep", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- if ((dir & AUDIO_BOTH) == 0) {
- ATRACE_32("audio_sup_save_state() no direction", dir);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- mutex_enter(&statep->as_lock);
- if ((apm_infop = statep->as_apm_info_list) == NULL) {
- /* nothing to save, so this is an error */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_save_state() no apm list", statep);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- mutex_exit(&statep->as_lock);
-
- /* go through the list looking for APMs that match this device */
- for (found = 0; apm_infop != NULL; apm_infop = apm_infop->apm_next) {
- /* does this APM match? */
- if (device != AUDIO_ALL_DEVICES &&
- device != apm_infop->apm_type) {
- /* nope, it doesn't, so get the next one */
- ATRACE_32("audio_sup_save_state() not this one",
- apm_infop->apm_type);
- continue;
- }
-
- /* does this APM have a save function? */
- if (apm_infop->apm_save_state == NULL) {
- /* if AUDIO_ALL_DEVICES then it's okay to be NULL */
- if (device == AUDIO_ALL_DEVICES) {
- ATRACE("audio_sup_save_state() NULL", 0);
- continue;
- } else {
- ATRACE("audio_sup_save_state() fail NULL",
- 0);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- }
-
- /* this is ours, so call it */
- ATRACE("audio_sup_save_state() calling save",
- apm_infop->apm_save_state);
- if ((*apm_infop->apm_save_state)(statep, apm_infop, dir) ==
- AUDIO_FAILURE) {
- ATRACE("audio_sup_save_state() save failed",
- apm_infop->apm_save_state);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
- ATRACE_32("audio_sup_save_state() save succeeded",
- apm_infop->apm_type);
-
- /* are we done? */
- if (device != AUDIO_ALL_DEVICES) {
- /* yes, just a single device to save */
- ATRACE_32(
- "audio_sup_save_state() single dev success",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_SUCCESS);
- }
- }
-
- /* if we specify the device then it's possible it wasn't there, so ck */
- if (device != AUDIO_ALL_DEVICES && !found) {
- ATRACE_32("audio_sup_save_state() single device not found",
- device);
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
- return (AUDIO_FAILURE);
- }
-
- /*
- * Either we found the single device or we looked at all the devices
- * and they succeeded. Even if there wasn't a single save function
- * to call when AUDIO_ALL_DEVICES was specified we still succeeded.
- */
-
- ATRACE_32("audio_sup_save_state() all devices found", device);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_save_state() */
-
-/*
- * audio_sup_getinfo()
- *
- * XXX this function is incorrect and should be obsoleted
- *
- * Description:
- * Get driver information.
- *
- * Arguments:
- * def_info_t *dip Pointer to the device's dev_info structure
- * WARNING: Don't use this dev_info structure
- * ddi_info_cmd_t infocmd Getinfo command
- * void *arg Command specific argument
- * void **result Pointer to the requested information
- *
- * Returns:
- * DDI_SUCCESS The information could be returned
- * DDI_FAILURE The information couldn't be returned
- */
-/*ARGSUSED*/
-int
-audio_sup_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
- void **result)
-{
- int error;
- int instance = 0;
- audio_state_t *statep;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- statep = audio_sup_devt_to_state((dev_t)arg);
- if ((statep == NULL) || (statep->as_dip == NULL)) {
- error = DDI_FAILURE;
- } else {
- *result = (void *)statep->as_dip;
- error = DDI_SUCCESS;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- instance = AUDIO_MINOR_TO_INST((dev_t)arg);
- *result = (void *)(uintptr_t)instance;
-
- if (*result != NULL) {
- error = DDI_SUCCESS;
- } else {
- error = DDI_FAILURE;
- }
- break;
-
- default:
- error = DDI_FAILURE;
- break;
- }
-
- return (error);
-
-} /* audio_sup_getinfo() */
-
-/*
- * audio_sup_rput()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_rput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_rput()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_rput() bad chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_rput);
-
- ATRACE("audio_sup_rput() calling ch_rput()", chptr);
-
- rc = chptr->ch_rput(q, mp);
-
- ATRACE_32("audio_sup_rput() ch_rput() returned", rc);
-
- return (rc);
-
-} /* audio_sup_rput() */
-
-/*
- * audio_sup_rsvc()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_rsvc(queue_t *q)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_rsvc()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_rsvc() null chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_rsvc);
-
- ATRACE("audio_sup_rsvc() calling ch_rsvc()", chptr);
-
- rc = chptr->ch_rsvc(q);
-
- ATRACE_32("audio_sup_rsvc() ch_rsvc() returned", rc);
-
- return (rc);
-
-} /* audio_sup_rsvc() */
-
-/*
- * audio_sup_wput()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_wput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr;
- audio_i_state_t *cmd;
- struct iocblk *iocbp;
- struct copyresp *csp;
- int rc = 0;
-
- ATRACE("in audio_sup_wput()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (0);
- }
- ASSERT(chptr->ch_wput);
-
- /* pick off the audio support ioctls, there aren't very many */
- ATRACE_32("audio_sup_wput() type", mp->b_datap->db_type);
- switch (mp->b_datap->db_type) {
-
- case M_IOCTL:
- ATRACE("audio_sup_wput() IOCTL ", chptr);
- iocbp = (struct iocblk *)mp->b_rptr; /* ptr to ioctl info */
-
- switch (iocbp->ioc_cmd) {
- case AUDIO_GET_CH_NUMBER:
- case AUDIO_GET_CH_TYPE:
- case AUDIO_GET_NUM_CHS:
- case AUDIO_GET_AD_DEV:
- case AUDIO_GET_APM_DEV:
- case AUDIO_GET_AS_DEV:
- ATRACE_32("audio_sup_wput() "
- "IOCTL calling audio_sup_wioctl()", iocbp->ioc_cmd);
- rc = audio_sup_wioctl(q, mp, chptr);
- break;
- default:
- ATRACE("audio_sup_wput() IOCTL calling ch_wput()",
- chptr);
- rc = chptr->ch_wput(q, mp);
- }
- break;
- case M_IOCDATA:
- ATRACE("audio_sup_wput() IOCDATA ", chptr);
- iocbp = (struct iocblk *)mp->b_rptr; /* ptr to ioctl info */
- csp = (struct copyresp *)mp->b_rptr; /* copy response ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
-
- if (cmd == NULL) {
- ATRACE("audio_sup_wput() M_IOCDATA NULL cmd calling "
- "ch_wput()", chptr);
- csp->cp_rval = 0;
- rc = chptr->ch_wput(q, mp);
- break;
- }
-
- switch (cmd->ais_command) {
- case AUDIO_COPY_OUT_CH_NUMBER:
- case AUDIO_COPY_OUT_CH_TYPE:
- case AUDIO_COPY_OUT_NUM_CHS:
- case AUDIO_COPY_OUT_AD_DEV:
- case AUDIO_COPY_OUT_APM_DEV:
- case AUDIO_COPY_OUT_AS_DEV:
- ATRACE_32("audio_sup_wput() "
- "IOCDATA calling audio_sup_wiocdata()",
- cmd->ais_command);
- rc = audio_sup_wiocdata(q, mp, chptr);
- break;
- default:
- ATRACE("audio_sup_wput() IOCDATA calling ch_wput()",
- chptr);
- rc = chptr->ch_wput(q, mp);
- }
- break;
- default:
- ATRACE("audio_sup_wput() calling ch_wput()", chptr);
- rc = chptr->ch_wput(q, mp);
- }
-
- ATRACE_32("audio_sup_wput() ch_wput() returned", rc);
-
- return (rc);
-
-} /* audio_sup_wput() */
-
-/*
- * audio_sup_wsvc()
- *
- * Description:
- * Make sure we have a valid function pointer. If we do we make the call.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-int
-audio_sup_wsvc(queue_t *q)
-{
- audio_ch_t *chptr;
- int rc;
-
- ATRACE("in audio_sup_wsvc()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_wsvc() bad chptr", 0);
- return (EIO);
- }
- ASSERT(chptr->ch_wsvc);
-
- ATRACE("audio_sup_wsvc() calling ch_wsvc()", chptr);
-
- rc = chptr->ch_wsvc(q);
-
- ATRACE_32("audio_sup_wsvc() ch_wsvc() returned", rc);
-
- return (rc);
-
-} /* audio_sup_wsvc() */
-
-/*
- * Public Audio Personality Module Support Routines
- *
- * Channel Routines
- */
-
-/*
- * audio_sup_alloc_ch()
- *
- * Description:
- * Go through the list of channels. Find the first one that isn't
- * assigned and take it. If there aren't any channels then depending
- * on the flags either wait for a channel to become free or return
- * NULL
- *
- * CAUTION: Make sure *error is always set before returning.
- *
- * NOTE: This routine expects the Audio Personality Module to fill in
- * all the members of the audio_ch_t structure.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * int *error Error code
- * audio_device_type_e type The device type
- * int flags AUDIO_NO_SLEEP or AUDIO_SLEEP
- *
- * Returns:
- * valid pointer to ch Channel allocated
- * NULL Channel not allocated
- */
-audio_ch_t *
-audio_sup_alloc_ch(audio_state_t *statep, int *error, audio_device_type_e type,
- int flags)
-{
- audio_ch_t *chptr;
- audio_apm_info_t *apm_infop;
- int i;
- int max_chs = statep->as_max_chs;
- int rc;
-
- ATRACE("in audio_sup_alloc_ch()", statep);
-
- ASSERT((flags & (AUDIO_NO_SLEEP|AUDIO_SLEEP)) !=
- (AUDIO_NO_SLEEP|AUDIO_SLEEP));
-
- /* make sure there's an apm_infop for the type */
- if ((apm_infop = audio_sup_get_apm_info(statep, type)) == NULL) {
- ATRACE("audio_sup_alloc_ch() audio_sup_get_apm_info() failed",
- statep);
- *error = EIO;
-
- return (NULL);
-
- }
-
- /* find the first unused channel */
- mutex_enter(&statep->as_lock);
-
- /* cv_broadcast() means we may need to try many times */
- while (statep->as_ch_inuse >= max_chs) {
- /* no channels available right now, do we wait? */
- if (flags & AUDIO_NO_SLEEP) {
- /* don't wait for a channel to become free */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_alloc_ch() no ch return", 0);
- *error = EBUSY;
-
- return (NULL);
-
- }
-
- /* wait for a channel to become free */
- rc = cv_wait_sig(&statep->as_cv, &statep->as_lock);
- if (rc <= 0) {
- ATRACE("audio_sup_alloc_ch() max chs signal wakeup",
- statep);
- /*
- * This channel may have had a signal, but that doesn't
- * mean any of the other channels may proceed. So make
- * sure every channel gets another go.
- */
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_alloc_ch() no ch sig return", 0);
- *error = EINTR;
-
- return (NULL);
-
- }
- }
-
- /* we've got a channel, so find it */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
- mutex_enter(&chptr->ch_lock);
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED)) {
- /* found it! */
- mutex_exit(&chptr->ch_lock);
- break;
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chptr))
- ASSERT(i <= max_chs);
- ASSERT(i == chptr->ch_info.ch_number);
- ASSERT(statep == chptr->ch_statep);
-
- ATRACE("audio_sup_alloc_ch() found channel", chptr);
-
- chptr->ch_info.dev_type = type;
- chptr->ch_apm_infop = apm_infop;
- chptr->ch_flags |= AUDIO_CHNL_ALLOCATED;
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chptr))
-
- /* just to be sure */
- mutex_enter(&chptr->ch_adata_lock);
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
- chptr->ch_adata_cnt = 0;
- mutex_exit(&chptr->ch_adata_lock);
-
- statep->as_ch_inuse++; /* inc. the number of allocated chs */
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_alloc_ch() returning", chptr);
-
- *error = 0; /* no errors */
-
- return (chptr);
-
-} /* audio_sup_alloc_ch() */
-
-/*
- * audio_sup_free_ch()
- *
- * Description:
- * This routine returns a channel structure to the device instance's
- * pool of channel structures. All the various pointers must be freed
- * and NULLed before this routine is called. It then does a cv_broadcast()
- * to wake up any cv_wait()/cv_wait_sig() calls which might be waiting
- * for a channel to be freed.
- *
- * Arguments:
- * audio_ch_t *chptr The channel structure to free
- *
- * Returns:
- * AUDIO_SUCCESS No error
- * AUDIO_FAILURE One of the pointers is not set to NULL or
- * chptr is not valid
- */
-int
-audio_sup_free_ch(audio_ch_t *chptr)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
-
- ATRACE("in audio_sup_free_ch()", chptr);
-
- if (chptr == NULL) {
- ATRACE("audio_sup_free_ch() chptr == NULL", chptr);
-
- return (AUDIO_FAILURE);
- }
-
- statep = chptr->ch_statep;
- apm_infop = chptr->ch_apm_infop;
-
- ASSERT(chptr->ch_statep == statep);
- ASSERT(apm_infop != NULL);
-
- /* finally, clear the channel structure and make available for reuse */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
-#ifdef DEBUG
- mutex_enter(&chptr->ch_adata_lock);
- ASSERT(chptr->ch_adata_cnt == 0);
- mutex_exit(&chptr->ch_adata_lock);
-#endif
-
- ATRACE("audio_sup_free_ch() chptr", chptr);
- ATRACE("audio_sup_free_ch() ch_private", chptr->ch_private);
- ATRACE("audio_sup_free_ch() ch_info.info", chptr->ch_info.info);
-
- if (chptr->ch_private) {
- ATRACE("audio_sup_free_ch() chptr->ch_private != NULL",
- chptr->ch_private);
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
-
- }
- if (chptr->ch_info.info) {
- ATRACE("audio_sup_free_ch() chptr->ch_info.info != NULL",
- chptr->ch_info.info);
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
-
- }
-
- /* free the message list */
- ATRACE("audio_sup_free_ch() freeing saved messages", chptr);
- audio_sup_flush_audio_data(chptr);
-
- chptr->ch_flags = 0;
- chptr->ch_info.pid = 0;
-
- statep->as_ch_inuse--;
-
- ATRACE("audio_sup_free_ch() resetting channel info", chptr);
-
- chptr->ch_qptr = NULL;
- mutex_enter(&chptr->ch_adata_lock);
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
- chptr->ch_adata_cnt = 0;
- mutex_exit(&chptr->ch_adata_lock);
- chptr->ch_apm_infop = NULL;
- chptr->ch_wput = NULL;
- chptr->ch_wsvc = NULL;
- chptr->ch_rput = NULL;
- chptr->ch_rsvc = NULL;
- chptr->ch_dir = 0;
- chptr->ch_dev = NODEV;
- chptr->ch_info.dev_type = UNDEFINED;
-
- mutex_exit(&chptr->ch_lock);
-
- /* the channel is freed, so send the broadcast */
-
- cv_broadcast(&statep->as_cv);
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_ch() returning success", statep);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_free_ch() */
-
-/*
- * Persistent Memory Routines
- */
-
-/*
- * audio_sup_get_persist_state()
- *
- * Description:
- * Search through the linked list of audio_apm_persist data structures
- * for this driver instance's persistent data for the specifed audio
- * personality module.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to set data for
- *
- * Returns:
- * valid pointer Pointer to the saved data
- * NULL Couldn't find the data
- */
-void *
-audio_sup_get_persist_state(audio_state_t *statep, audio_device_type_e dev_type)
-{
- audio_inst_persist_t *instp;
- audio_apm_persist_t *tmp;
- void *ret_ptr;
-
- ATRACE("in audio_sup_get_persist_state()", statep);
- ATRACE_32("audio_sup_get_persist_state() dev_type", dev_type);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
-
- ASSERT(statep->as_persistp);
- instp = statep->as_persistp;
-
- for (tmp = instp->amp_apmp; tmp; tmp = tmp->ap_next) {
- if (tmp->ap_apm_type == dev_type) {
- ret_ptr = tmp->ap_data; /* make warlock happy */
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_get_persist_state() found state",
- ret_ptr);
- return (ret_ptr);
- }
- }
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- return (NULL);
-
-} /* audio_sup_get_persist_state() */
-
-/*
- * audio_sup_free_persist_state()
- *
- * Description:
- * Search through the linked list of audio_apm_persist data structures
- * for this driver instance's persistent data for the specifed audio
- * personality module. When found remove it from the linked list and
- * free it.
- *
- * If the dev_type is set to AUDIO_ALL_DEVICES then we free all of
- * the entries.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to free data for
- *
- * Returns:
- * AUDIO_SUCCESS Memory freed
- * AUDIO_FAILURE Memory not found to free
- */
-int
-audio_sup_free_persist_state(audio_state_t *statep,
- audio_device_type_e dev_type)
-{
- audio_apm_persist_t **plist;
- audio_apm_persist_t *list;
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_free_persist_state()", statep);
- ATRACE_32("audio_sup_free_persist_state() dev_type", dev_type);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
- plist = &((audio_inst_persist_t *)statep->as_persistp)->amp_apmp;
-
- if (*plist == NULL) {
- /* no items on the list */
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_free_persist_state() empty list", plist);
- return (AUDIO_FAILURE);
- }
-
- list = *plist;
-
- /* see if we clear all, or just one that matches dev_type */
- if (dev_type == AUDIO_ALL_DEVICES) {
- /* clear all of them */
- ATRACE("audio_sup_free_persist_state() clear all", plist);
- while (list) {
- tmp = list;
- list = list->ap_next;
- kmem_free(tmp->ap_data, tmp->ap_size);
- kmem_free(tmp, sizeof (*tmp));
- }
- ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp = NULL;
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_persist_state() free all done", statep);
-
- return (AUDIO_SUCCESS);
-
- } else {
- /* clear just the match */
- ATRACE("audio_sup_free_persist_state() clear match", dev_type);
- while (list) {
- if (list->ap_apm_type == dev_type) {
- /* remove from the linked list */
- *plist = list->ap_next;
-
- ATRACE("audio_sup_free_persist_state() "
- "freeing state", list);
-
- kmem_free(list->ap_data, list->ap_size);
- kmem_free(list, sizeof (*list));
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
- return (AUDIO_SUCCESS);
- }
- plist = &list->ap_next;
- list = list->ap_next;
- }
- }
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_free_persist_state() not found, failed", 0);
-
- return (AUDIO_FAILURE);
-
-} /* audio_sup_free_persist_state() */
-
-/*
- * audio_sup_set_persist_state()
- *
- * Description:
- * Search through the list to see if we already have data for this
- * APM type. If so then free it, then update with the new data. If
- * the APM type isn't found then allocate an audio_apm_persist_t
- * structure and add to the list.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e dev_type APM to set data for
- * void *state_data The data to save
- * size_t state_size Size of the persistent data
- *
- * Returns:
- * AUDIO_SUCCESS Successfully set persistent state info
- * AUDIO_FAILURE Couldn't set persistent state info
- */
-int
-audio_sup_set_persist_state(audio_state_t *statep, audio_device_type_e dev_type,
- void *state_data, size_t state_size)
-{
- audio_apm_persist_t *anchor;
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_set_persist_state() statep", statep);
- ATRACE_32("audio_sup_set_persist_state() dev_type", dev_type);
- ATRACE("audio_sup_set_persist_state() data", state_data);
- ATRACE("audio_sup_set_persist_state() size", state_size);
-
- mutex_enter(&statep->as_lock);
- mutex_enter(&audio_persist_lock);
-
- ASSERT(statep->as_persistp);
-
- /* get the anchor */
- anchor = ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp;
-
- /* look for a matching device type */
- for (tmp = anchor; tmp; tmp = tmp->ap_next) {
- if (tmp->ap_apm_type == dev_type) {
- ATRACE("audio_sup_set_persist_state() found tmp", tmp);
- break;
- }
- }
-
- /*
- * If not found or first on list then allocate a new structure and
- * place on the list.
- */
- if (tmp == NULL) {
- /* allocate an audio_apm_persist struct */
- tmp = kmem_alloc(sizeof (*tmp), KM_SLEEP);
- tmp->ap_apm_type = dev_type;
-
- /* and place at the beginning of the list */
- tmp->ap_next = anchor;
- ((audio_inst_persist_t *)statep->as_persistp)->amp_apmp = tmp;
- } else {
- /* we found on the list, so free old data */
- kmem_free(tmp->ap_data, tmp->ap_size);
- }
-
- /* update the rest of the new data structure */
- tmp->ap_data = state_data;
- tmp->ap_size = state_size;
-
- mutex_exit(&audio_persist_lock);
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_set_persist_state() new return", tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_set_persist_state() */
-
-/*
- * Device Independent Driver Registration Routines
- */
-
-/*
- * audio_sup_register_apm()
- *
- * Description:
- * Register the Audio Personality Module with this instance of the
- * Audio Driver. This provides a place to store state information
- * for the APM.
- *
- * We only allow one instance of an APM present for each instance of
- * an Audio Driver.
- *
- * NOTE: Instance and type are mandatory.
- *
- * NOTE: It is okay for memory allocation to sleep.
- *
- * Arguments:
- * audio_state_t *statep Device state structure
- * audio_device_type_e type APM type
- * audio_apm_reg_t *reg_info Ptr to APM registration information
- *
- * Returns:
- * valid pointer The audio_apm_info structure registered
- * NULL Couldn't register the APM
- */
-audio_apm_info_t *
-audio_sup_register_apm(audio_state_t *statep, audio_device_type_e type,
- audio_apm_reg_t *reg_info)
-{
- audio_apm_info_t *apm_infop;
- audio_apm_info_t *tmp_apm_infop;
-
- ATRACE_32("in audio_sup_register_apm()", type);
-
- /* make sure the registration information data structure is okay */
- if (reg_info->aar_version != AM_AAR_VERSION) {
- ATRACE("audio_sup_register_apm() bad version",
- reg_info->aar_version);
- return (NULL);
- }
-
- /* we must have an open() and close() routine */
- if (reg_info->aar_apm_open == NULL || reg_info->aar_apm_close == NULL) {
- ATRACE("audio_sup_register_apm() aar_apm_open()",
- reg_info->aar_apm_open);
- ATRACE("audio_sup_register_apm() apm_close()",
- reg_info->aar_apm_close);
-
- return (NULL);
-
- }
-
- /* allocate the structure now so we won't sleep with as_lock held */
- tmp_apm_infop = kmem_zalloc(sizeof (*tmp_apm_infop), KM_SLEEP);
-
- /* first make sure we haven't already registered this type before */
- mutex_enter(&statep->as_lock);
-
- for (apm_infop = statep->as_apm_info_list; apm_infop != NULL;
- apm_infop = apm_infop->apm_next) {
- if (apm_infop->apm_type == type) {
- mutex_exit(&statep->as_lock);
- kmem_free(tmp_apm_infop, sizeof (*tmp_apm_infop));
- ATRACE("audio_sup_register_apm() "
- "duplicate diaudio type", 0);
-
- return (NULL);
-
- }
- }
- apm_infop = tmp_apm_infop;
-
- ATRACE("audio_sup_register_apm() not a duplicate, ok to continue", 0);
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- mutex_init(&apm_infop->apm_lock, NULL, MUTEX_DRIVER, NULL);
-
- apm_infop->apm_open = reg_info->aar_apm_open;
- apm_infop->apm_close = reg_info->aar_apm_close;
- apm_infop->apm_restore_state = reg_info->aar_apm_restore_state;
- apm_infop->apm_save_state = reg_info->aar_apm_save_state;
- apm_infop->apm_info = reg_info->aar_dev_info;
- apm_infop->apm_type = type;
- apm_infop->apm_private = reg_info->aar_private;
- apm_infop->apm_ad_infop = reg_info->aar_info;
- apm_infop->apm_ad_state = reg_info->aar_state;
-
- /* put at the head of the list */
- apm_infop->apm_next = statep->as_apm_info_list;
- statep->as_apm_info_list = apm_infop;
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*apm_infop))
-
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_register_apm() returning successful", apm_infop);
-
- return (apm_infop);
-
-} /* audio_sup_register_apm() */
-
-/*
- *
- * Description:
- * Unregister the Audio Personality Module from this instance of the
- * Audio Driver. If the APM wasn't registered we silently and
- * successfully fail and return. Otherwise we free the structure which
- * represents the APM. However, if the private data wasn't freed we
- * fail.
- *
- * Arguments:
- * audio_state_t *statep device state structure
- * audio_device_type_e type APM type
- *
- * Returns:
- * AUDIO_SUCCESS APM unregistered
- * AUDIO_FAILURE APM private data not freed
- */
-int
-audio_sup_unregister_apm(audio_state_t *statep, audio_device_type_e type)
-{
- audio_apm_info_t *apm_infop;
- audio_apm_info_t **papm_infop;
-
- ATRACE_32("in audio_sup_unregister_apm()", type);
-
- /* protect the personality module list */
- mutex_enter(&statep->as_lock);
-
- papm_infop = &statep->as_apm_info_list;
- apm_infop = *papm_infop;
-
- while (apm_infop) {
- if (apm_infop->apm_type == type) {
- break;
- }
- papm_infop = &apm_infop->apm_next;
- apm_infop = *papm_infop;
- }
- ATRACE("audio_sup_unregister_apm() while done", apm_infop);
-
- /* type not found on the list or the list is empty */
- if (apm_infop == NULL) {
- mutex_exit(&statep->as_lock);
- ATRACE_32("audio_sup_unregister_apm() not found on list", type);
-
- return (AUDIO_SUCCESS);
-
- }
-
- /* make sure the private data has been freed */
- if (apm_infop->apm_private) {
- mutex_exit(&statep->as_lock);
- ATRACE("audio_sup_unregister_apm() private data not cleared",
- apm_infop->apm_private);
-
- return (AUDIO_FAILURE);
-
- }
- ATRACE("audio_sup_unregister_apm() ok to unreregister", apm_infop);
-
- /* remove the item by bypassing it */
- *papm_infop = apm_infop->apm_next;
-
- /* APM off the list, so okay to release the lock */
- mutex_exit(&statep->as_lock);
-
- ATRACE("audio_sup_unregister_apm() freeing apm_infop", apm_infop);
- mutex_destroy(&apm_infop->apm_lock);
- kmem_free(apm_infop, sizeof (*apm_infop));
-
- ATRACE("audio_sup_unregister_apm() done", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_unregister_apm() */
-
-/*
- * Audio task queue routines
- */
-
-/*
- * audio_sup_taskq_create()
- *
- * Description:
- * Wrapper to abstract the creation of a kernel taskq. We pick some
- * defaults that make sense for audio, such as single threaded.
- *
- * Arguments:
- * const char *q_name Name of the task queue to create
- *
- * Returns:
- * handle Queue successfully created
- * NULL Couldn't allocate structs, failed
- */
-audio_taskq_t
-audio_sup_taskq_create(const char *q_name)
-{
- taskq_t *tq;
-
- ATRACE("in audio_sup_taskq_create()", q_name);
-
- tq = taskq_create(q_name, AUDIO_SUP_TASKQ_NTHREADS, minclsyspri,
- AUDIO_SUP_TASKQ_MINALLOC, AUDIO_SUP_TASKQ_MAXALLOC,
- TASKQ_PREPOPULATE);
-
- ATRACE("audio_sup_taskq_create() returning", tq);
-
- return (AUDIO_TQHDL2AUDIOTQHDL(tq));
-
-} /* audio_sup_taskq_create() */
-
-/*
- * audio_sup_taskq_destroy()
- *
- * Description:
- * Destroy the taskq.
- *
- * CAUTION: If the taskq is used after destroying then the system
- * will probably panic
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to destroy
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_destroy(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_destroy()", tq_handle);
-
- taskq_destroy(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_destroy() returning", tq_handle);
-
-} /* audio_sup_taskq_destroy() */
-
-/*
- * audio_sup_taskq_dispatch()
- *
- * Description:
- * Dispatch a task. The task_function pointer must not be NULL.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to destroy
- * void (*)() task_function Ptr to the function to execute
- * void *arg Ptr to argument for task_function
- * int sleep KM_SLEEP or KM_NOSLEEP
- *
- * Returns:
- * AUDIO_SUCCESS Task scheduled
- * AUDIO_FAILURE Task not scheduled or bad task_function
- * or bad sleep flags
- */
-int
-audio_sup_taskq_dispatch(audio_taskq_t tq_handle,
- void (*task_function)(void *arg), void *arg, int sleep)
-{
- taskq_t *tq;
- taskqid_t tid;
-
- ATRACE("in audio_sup_taskq_dispatch()", tq_handle);
-
- if (task_function == NULL) {
- ATRACE("audio_sup_taskq_dispatch() NULL function", tq_handle);
- return (AUDIO_FAILURE);
- }
-
- if (sleep != KM_SLEEP && sleep != KM_NOSLEEP) {
- ATRACE_32("audio_sup_taskq_dispatch() bad sleep", sleep);
- return (AUDIO_FAILURE);
- }
-
- tq = AUDIO_AUDIOTQHDL2TQHDL(tq_handle);
-
- if ((tid = taskq_dispatch(tq, task_function, arg, sleep))) {
- ATRACE("audio_sup_taskq_dispatch() successful", tid);
- return (AUDIO_SUCCESS);
- } else {
- ATRACE("audio_sup_taskq_dispatch() failed", tid);
- return (AUDIO_FAILURE);
- }
-
-} /* audio_sup_taskq_dispatch() */
-
-/*
- * audio_sup_taskq_resume()
- *
- * Description:
- * Resume task execution.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_resume(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_resume()", tq_handle);
-
- taskq_resume(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_resume() returning", tq_handle);
-
-} /* audio_sup_taskq_resume() */
-
-/*
- * audio_sup_taskq_suspended()
- *
- * Description:
- * Determine if the taskq is running or suspended.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * AUDIO_TASKQ_RUNNING The taskq is running
- * AUDIO_TASKQ_SUSPENDED The taskq is not running (suspended)
- */
-int
-audio_sup_taskq_suspended(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_suspend()", tq_handle);
-
- if (taskq_suspended(AUDIO_AUDIOTQHDL2TQHDL(tq_handle))) {
- ATRACE("audio_sup_taskq_suspend() returning suspended",
- tq_handle);
- return (AUDIO_TASKQ_SUSPENDED);
- } else {
- ATRACE("audio_sup_taskq_suspend() returning running",
- tq_handle);
- return (AUDIO_TASKQ_RUNNING);
- }
-
-} /* audio_sup_taskq_suspended() */
-
-/*
- * audio_sup_taskq_suspend()
- *
- * Description:
- * Tasks on the taskq are suspended when this routine returns.
- * Running tasks will continue to execute, but all new tasks will
- * be suspended.
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_suspend(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_suspend()", tq_handle);
-
- taskq_suspend(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_suspend() returning", tq_handle);
-
-} /* audio_sup_taskq_suspend() */
-
-/*
- * audio_sup_taskq_wait()
- *
- * Description:
- * Wait for all pending tasks to complete
- *
- * Arguments:
- * audio_taskq_t tq_handle Handle to the taskq to wait on
- *
- * Returns:
- * void
- */
-void
-audio_sup_taskq_wait(audio_taskq_t tq_handle)
-{
- ATRACE("in audio_sup_taskq_wait()", tq_handle);
-
- taskq_wait(AUDIO_AUDIOTQHDL2TQHDL(tq_handle));
-
- ATRACE("audio_sup_taskq_wait() returning", tq_handle);
-
-} /* audio_sup_taskq_wait() */
-
-
-/*
- * Audio Data Handling Routines
- */
-
-/*
- * audio_sup_flush_audio_data()
- *
- * Description:
- * Flush all the data queued up for a channel. We remain locked at
- * all times so no one else can sneak in and grab a data structure.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * void
- */
-void
-audio_sup_flush_audio_data(audio_ch_t *chptr)
-{
- audio_data_t *tmp;
-
- ATRACE("in audio_sup_flush_audio_data()", chptr);
-
- ASSERT(mutex_owned(&chptr->ch_lock));
-
- mutex_enter(&chptr->ch_adata_lock);
-
- while ((tmp = chptr->ch_adata) != 0) {
- /* set up for next loop */
- chptr->ch_adata = tmp->adata_next;
-
- ATRACE("audio_sup_flush_audio_data() freeing data", tmp);
- audio_sup_free_audio_data(tmp);
-
- chptr->ch_adata_cnt--;
- }
-
- ASSERT(chptr->ch_adata_cnt == 0);
-
- chptr->ch_adata = NULL;
- chptr->ch_adata_end = NULL;
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_flush_audio_data() finished", chptr);
-
-} /* audio_sup_flush_audio_data() */
-
-/*
- * audio_sup_free_audio_data()
- *
- * Description:
- * Free the audio data.
- *
- * NOTE: The audio data structure must already be off the list, so there
- * isn't a need to lock the data list.
- *
- * Arguments:
- * audio_data_t *adata The audio data structure to free
- *
- * Returns:
- * void
- */
-void
-audio_sup_free_audio_data(audio_data_t *adata)
-{
- ATRACE("in audio_sup_free_audio_data()", adata);
-
- if (adata == NULL) {
- ATRACE("audio_sup_free_audio_data() nothing to free", adata);
-
- return;
-
- }
-
- ATRACE("audio_sup_free_audio_data() adata differ, orig",
- adata->adata_orig);
- ATRACE("audio_sup_free_audio_data() adata differ, proc",
- adata->adata_proc);
- if (adata->adata_orig) {
- ATRACE("audio_sup_free_audio_data() freeing original data",
- adata->adata_orig);
- kmem_free(adata->adata_orig, adata->adata_osize);
- }
- if (adata->adata_proc) {
- ATRACE("audio_sup_free_audio_data() freeing processed data",
- adata->adata_proc);
- kmem_free(adata->adata_proc, adata->adata_psize);
- }
-
- ATRACE("audio_sup_free_audio_data() freeing adata structure", adata);
- kmem_free(adata, sizeof (*adata));
-
- ATRACE("audio_sup_free_audio_data() done", 0);
-
-} /* audio_sup_free_audio_data() */
-
-/*
- * audio_sup_get_audio_data()
- *
- * Description:
- * Get the oldest audio data structure off the channel's data list, which
- * would be the first message.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * Valid audio_data_t pointer The audio data structure
- * NULL No audio data available
- */
-audio_data_t *
-audio_sup_get_audio_data(audio_ch_t *chptr)
-{
- audio_data_t *tmp;
-
- ATRACE("in audio_sup_get_audio_data()", chptr);
-
- mutex_enter(&chptr->ch_adata_lock);
-
- tmp = chptr->ch_adata;
-
- if (tmp) {
- /* set up for next time */
- chptr->ch_adata = tmp->adata_next;
-
- chptr->ch_adata_cnt--;
-
- ASSERT(chptr->ch_adata_cnt >= 0);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data() found data to return", tmp);
-
- return (tmp);
-
- }
- ASSERT(chptr->ch_adata_cnt == 0);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data() NO data found", chptr);
-
- return (NULL);
-
-} /* audio_sup_get_audio_data() */
-
-/*
- * audio_sup_get_audio_data_cnt()
- *
- * Description:
- * Get the number of data structures currently queued on the data list.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * >= 0 The number of queued data structures
- */
-int
-audio_sup_get_audio_data_cnt(audio_ch_t *chptr)
-{
- int tmp;
-
- ATRACE("in audio_sup_get_audio_data_cnt()", chptr);
-
- mutex_enter(&chptr->ch_adata_lock);
- ASSERT(chptr->ch_adata_cnt >= 0);
- tmp = chptr->ch_adata_cnt;
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data_cnt() returning", tmp);
-
- return (tmp);
-
-} /* audio_sup_get_audio_data_cnt() */
-
-/*
- * audio_sup_get_audio_data_size()
- *
- * Description:
- * Get the number of bytes stored in data structures that are currently
- * queued on the data list. Look at the proc_size if it's there and
- * otherwise look at the orig_size.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * >= 0 The number of bytes queued
- */
-int
-audio_sup_get_audio_data_size(audio_ch_t *chptr)
-{
- audio_data_t *adata;
- int tmp = 0;
-
- ATRACE("in audio_sup_get_audio_data_size()", chptr);
-
- /* lock the structure */
- mutex_enter(&chptr->ch_adata_lock);
-
- ASSERT(chptr->ch_adata_cnt >= 0);
-
- adata = chptr->ch_adata;
- while (adata != 0) {
- if (adata->adata_proc) {
- tmp += adata->adata_psize;
- } else {
- tmp += adata->adata_osize;
- }
- adata = adata->adata_next;
- }
-
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_get_audio_data_size() returning", tmp);
-
- return (tmp);
-
-} /* audio_sup_get_audio_data_size() */
-
-/*
- * audio_sup_putback_audio_data()
- *
- * Description:
- * Put the audio data structure back onto the list. It will be the first
- * to be removed the next time audio_sup_get_audio_data() is called.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * audio_data_t *adata The message to put back on the list
- *
- * Returns:
- * void
- */
-void
-audio_sup_putback_audio_data(audio_ch_t *chptr, audio_data_t *adata)
-{
- ATRACE("in audio_sup_putback_audio_data()", chptr);
-
- if (adata == 0) {
- ATRACE("audio_sup_putback_audio_data() bad message pointer",
- adata);
-
- return;
-
- }
-
- ATRACE("audio_sup_putback_audio_data() putting data back", adata);
-
- /* lock the data list */
- mutex_enter(&chptr->ch_adata_lock);
-
- adata->adata_next = chptr->ch_adata;
-
- chptr->ch_adata = adata;
-
- chptr->ch_adata_cnt++;
-
- ASSERT(chptr->ch_adata_cnt >= 1);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- ATRACE("audio_sup_putback_audio_data() done", chptr);
-
-} /* audio_sup_putback_audio_data() */
-
-/*
- * audio_sup_save_audio_data()
- *
- * Description:
- * Save audio data on the channel's data list. New data is placed at
- * the end of the list.
- *
- * CAUTION: This routine may be called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * void *adata_orig Pointer to the original data to save
- * size_t adata_osize Size of the original data
- * void *adata_proc Pointer to the processed data to save
- * size_t adata_psize Size of the processed data
- *
- * Returns:
- * AUDIO_SUCCESS The message was successfully saved
- * AUDIO_FAILURE The message was not successfully saved
- */
-int
-audio_sup_save_audio_data(audio_ch_t *chptr, void *adata_orig,
- size_t adata_osize, void *adata_proc, size_t adata_psize)
-{
- audio_data_t *new;
-
- ATRACE("in audio_sup_save_audio_data()", chptr);
-
- /* first we allocate an audio_data_t structure (zeros out next field) */
- if ((new = kmem_zalloc(sizeof (*new), KM_NOSLEEP)) == NULL) {
- ATRACE("audio_sup_save_audio_data() kmem_zalloc() failed", 0);
-
- return (AUDIO_FAILURE);
-
- }
-
- if (adata_orig) {
- new->adata_orig = adata_orig; /* orig data from app */
- new->adata_optr = adata_orig;
- new->adata_oeptr = (char *)adata_orig + adata_osize;
- new->adata_osize = adata_osize;
- }
- if (adata_proc) {
- new->adata_proc = adata_proc; /* the processed data */
- new->adata_pptr = adata_proc;
- new->adata_peptr = (char *)adata_proc + adata_psize;
- new->adata_psize = adata_psize;
- }
-
- /* now we save the message */
- mutex_enter(&chptr->ch_adata_lock);
-
- /* see if this is the first message */
- if (chptr->ch_adata == NULL) { /* it is */
- ASSERT(chptr->ch_adata_cnt == 0);
- chptr->ch_adata = new; /* next is already set to 0 */
- chptr->ch_adata_cnt = 1;
- chptr->ch_adata_end = new;
- mutex_exit(&chptr->ch_adata_lock);
- ATRACE("audio_sup_save_audio_data() first message", new);
-
- return (AUDIO_SUCCESS);
-
- }
-
- ATRACE("audio_sup_save_audio_data() saving message", new);
-
- /* append new message to list */
- chptr->ch_adata_end->adata_next = new;
- chptr->ch_adata_end = new;
-
- chptr->ch_adata_cnt++;
-
- ASSERT(chptr->ch_adata_cnt >= 1);
-
- mutex_exit(&chptr->ch_adata_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_save_audio_data() */
-
-/*
- * Minor <--> Channel Routines:
- *
- * audio_sup_ch_to_minor()
- *
- * Description:
- * Return the minor number of the channel.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * int channel The device channel
- *
- * Returns:
- * >= 0 The minor number of the channel
- */
-int
-audio_sup_ch_to_minor(audio_state_t *statep, int channel)
-{
- ATRACE("in audio_sup_ch_to_minor(): statep", statep);
- ATRACE_32("audio_sup_ch_to_minor(): channel #", channel);
-
- ATRACE_32("audio_sup_ch_to_minor() returning",
- ((statep->as_dev_instance * statep->as_minors_per_inst) +
- channel + statep->as_audio_reserved));
-
- return ((statep->as_dev_instance * statep->as_minors_per_inst) +
- channel + statep->as_audio_reserved);
-
-} /* audio_sup_ch_to_minor() */
-
-/*
- * audio_sup_get_max_chs()
- *
- * Description:
- * Get the maximum number of supported channels per instance.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * > 0 The number of minor numbers per instance
- */
-int
-audio_sup_get_max_chs(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
-
- ATRACE_32("in audio_sup_get_max_chs() returning",
- statep->as_max_chs);
-
- return (statep->as_max_chs);
-
-} /* audio_sup_get_max_chs() */
-
-/*
- * audio_sup_get_minors_per_inst()
- *
- * Description:
- * Get the number of minor numbers allowed per instance.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * > 0 The number of minor numbers per instance
- */
-int
-audio_sup_get_minors_per_inst(audiohdl_t handle)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
-
- ATRACE_32("in audio_sup_get_minors_per_inst() returning",
- statep->as_minors_per_inst);
-
- return (statep->as_minors_per_inst);
-
-} /* audio_sup_get_minors_per_inst() */
-
-/*
- * audio_sup_construct_minor()
- *
- * Description:
- * construct a minor number for this dip and device type
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * device_type_e device_type type of audio device the channel is
- * associated with
- *
- * Returns:
- * >= 0 minor node number
- */
-int
-audio_sup_construct_minor(audiohdl_t handle, audio_device_type_e device_type)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- dev_info_t *dip = statep->as_dip;
- int minors_per_inst = statep->as_minors_per_inst;
- int minor;
-
- ATRACE_32("in audio_sup_construct_minor()", device_type);
-
- minor = (ddi_get_instance(dip) * minors_per_inst) +
- audio_sup_type_to_minor(device_type);
-
- ATRACE_32("audio_sup_construct_minor() returning", minor);
-
- return (minor);
-
-} /* audio_sup_construct_minor() */
-
-/*
- * audio_sup_minor_to_ch()
- *
- * Description:
- * Convert a minor number to a channel number.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * minor_t minor The minor number to convert
- *
- * Returns:
- * >= 0 The channel number
- */
-int
-audio_sup_minor_to_ch(audio_state_t *statep, minor_t minor)
-{
- int minors_per_inst = statep->as_minors_per_inst;
- int audio_reserved = statep->as_audio_reserved;
-
- ATRACE_32("in audio_sup_minor_to_ch()", minor);
- ATRACE_32("audio_sup_minor_to_ch() returning",
- ((minor % minors_per_inst) - audio_reserved));
-
- return ((minor % minors_per_inst) - audio_reserved);
-
-} /* audio_sup_minor_to_ch() */
-
-/*
- * audio_sup_type_to_minor()
- *
- * Description:
- * Normally a macro would be used to figure out the minor number. But
- * we don't want the Audio Driver using the Audio Support Module's
- * macros which might change. So we provide a call that will let us
- * change what we are doing later on if we wish.
- *
- * Arguments:
- * audio_device_type_e type The device type we want the minor # of
- *
- * Returns:
- * The device type
- * AUDIO_FAILURE Unrecognized audio device
- */
-int
-audio_sup_type_to_minor(audio_device_type_e type)
-{
- int minor;
-
- ATRACE_32("in audio_sup_type_to_minor()", type);
-
- switch (type) {
- case AUDIO:
- minor = AUDIO_MINOR_AUDIO;
- break;
- case AUDIOCTL:
- minor = AUDIO_MINOR_AUDIOCTL;
- break;
- case WTABLE:
- minor = AUDIO_MINOR_WAVE_TABLE;
- break;
- case MIDI:
- minor = AUDIO_MINOR_MIDI_PORT;
- break;
- case ATIME:
- minor = AUDIO_MINOR_TIME;
- break;
- case USER1:
- minor = AUDIO_MINOR_USER1;
- break;
- case USER2:
- minor = AUDIO_MINOR_USER2;
- break;
- case USER3:
- minor = AUDIO_MINOR_USER3;
- break;
- case UNDEFINED:
- /*FALLTHROUGH*/
- default:
- minor = AUDIO_FAILURE;
- break;
- }
-
- ATRACE_32("audio_sup_type_to_minor() returning minor", minor);
-
- return (minor);
-
-} /* audio_sup_type_to_minor() */
-
-/*
- * audio_sup_devt_to_instance()
- *
- * Description:
- * Convert a dev_t to instance
- *
- * Arguments:
- * dev_t dev The device we are getting the instance for
- *
- * Returns:
- * >= 0 The instance number
- */
-int
-audio_sup_devt_to_instance(dev_t devt)
-{
- return (AUDIO_MINOR_TO_INST(devt));
-
-} /* audio_sup_devt_to_instance() */
-
-/*
- * Miscellaneous Routines
- */
-
-/*
- * audio_sup_devt_to_ch_type()
- *
- * Description:
- * Given a channel's minor number figure out what kind of channel
- * it is. This works for both the reserved minor nodes as well as
- * the clone channels.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * dev_t dev The device we are getting the type of
- *
- * Returns:
- * The device type
- * AUDIO_FAILURE Couldn't get the state structure, so failed
- */
-audio_device_type_e
-audio_sup_devt_to_ch_type(audio_state_t *statep, dev_t dev)
-{
- audio_device_type_e type;
- minor_t minor;
- int minors_per_inst = statep->as_minors_per_inst;
- int audio_reserved = statep->as_audio_reserved;
-
- ATRACE("in audio_sup_devt_to_ch_type()", dev);
-
- /* figure out the minor number given an instance */
- minor = getminor(dev) % minors_per_inst;
-
- if (minor < audio_reserved) {
- ATRACE_32("audio_sup_devt_to_ch_type() reserved minor",
- minor);
-
- switch (minor) {
- case AUDIO_MINOR_AUDIO:
- type = AUDIO;
- break;
- case AUDIO_MINOR_AUDIOCTL:
- type = AUDIOCTL;
- break;
- case AUDIO_MINOR_WAVE_TABLE:
- type = WTABLE;
- break;
- case AUDIO_MINOR_MIDI_PORT:
- type = MIDI;
- break;
- case AUDIO_MINOR_TIME:
- type = TIME;
- break;
- case AUDIO_MINOR_USER1:
- type = USER1;
- break;
- case AUDIO_MINOR_USER2:
- type = USER2;
- break;
- case AUDIO_MINOR_USER3:
- type = USER3;
- break;
- default:
- type = UNDEFINED;
- break;
- }
-
- ATRACE_32("audio_sup_devt_to_ch_type() reserved, returning",
- type);
-
- return (type);
-
- } else {
- audio_state_t *statep;
- audio_ch_t *chptr;
-
- ATRACE_32("audio_sup_devt_to_ch_type() allocated channel",
- minor);
-
- if ((statep = audio_sup_devt_to_state(dev)) == NULL) {
- ATRACE("audio_sup_devt_to_ch_type() "
- "audio_sup_devt_to_ch_type() failed", 0);
-
- return ((audio_device_type_e)AUDIO_FAILURE);
-
- }
-
- ATRACE("audio_sup_devt_to_ch_type() statep", statep);
-
- chptr = &statep->as_channels[audio_sup_minor_to_ch(
- statep, minor)];
-
- ATRACE("audio_sup_devt_to_ch_type() chptr", chptr);
-
- ATRACE_32("audio_sup_devt_to_ch_type() returning type",
- chptr->ch_info.dev_type);
-
- return (chptr->ch_info.dev_type);
-
- }
-
-} /* audio_sup_devt_to_ch_type() */
-
-/*
- * audio_sup_get_channel_number()
- *
- * Description:
- * Get the channel number for the audio queue.
- *
- * Arguments:
- * queue_t *q Pointer to a queue structure
- *
- * Returns:
- * channel number The channel number for the audio queue.
- * AUDIO_FAILURE Bad q_ptr
- */
-int
-audio_sup_get_channel_number(queue_t *q)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_get_channel_number()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_get_channel_number() bad chptr", 0);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio_sup_get_channel_number() returning",
- chptr->ch_info.ch_number);
-
- return (chptr->ch_info.ch_number);
-
-} /* audio_sup_get_channel_number() */
-
-/*
- * audio_sup_get_apm_info()
- *
- * Description:
- * Get the audio_apm_info structure for the audio instance and
- * type passed in.
- *
- * NOTE: Since the apm_info list is created when the driver is
- * attached it should never change during normal operation
- * of the audio device. Therefore we don't need to lock
- * the list while we traverse it.
- *
- * Arguments:
- * audio_state_t *statep device state structure
- * audio_device_type_e type APM type
- *
- * Returns:
- * valid pointer Ptr to the returned audio_apm_info struct
- * NULL audio_apm_info struct not found
- */
-audio_apm_info_t *
-audio_sup_get_apm_info(audio_state_t *statep, audio_device_type_e type)
-{
- audio_apm_info_t *apm_infop;
-
- ATRACE("in audio_sup_get_apm_info()", statep);
-
- /* sanity check */
- if (type == UNDEFINED) {
- ATRACE("audio_sup_get_apm_info() returning NULL (fail)", 0);
-
- return (NULL);
-
- }
-
- mutex_enter(&statep->as_lock);
- apm_infop = statep->as_apm_info_list;
-
- while (apm_infop != NULL) {
- if (apm_infop->apm_type == type) {
- ATRACE_32("audio_sup_get_apm_info() found type", type);
- break;
- }
- apm_infop = apm_infop->apm_next;
- }
-
- mutex_exit(&statep->as_lock);
-
- /* make sure we got a structure */
- if (apm_infop == NULL) {
- ATRACE_32("audio_sup_get_apm_info() didn't find type", type);
-
- return (NULL);
-
- }
-
- ATRACE("audio_sup_get_apm_info() returning", apm_infop);
-
- return (apm_infop);
-
-} /* audio_sup_get_apm_info() */
-
-/*
- * audio_sup_get_dip()
- *
- * Description:
- * Get the dev_info_t pointer for the audio handle.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * dev_info_t * The dip for the handle, always returned
- */
-dev_info_t *
-audio_sup_get_dip(audiohdl_t handle)
-{
-
- return (AUDIO_HDL2STATE(handle)->as_dip);
-
-} /* audio_sup_get_dip() */
-
-/*
- * audio_sup_get_info()
- *
- * Description:
- * Get the info structure for the audio queue.
- *
- * Arguments:
- * queue_t *q Pointer to a queue structure
- *
- * Returns:
- * valid pointer Ptr to the returned audio_apm_info struct
- */
-void *
-audio_sup_get_info(queue_t *q)
-{
- audio_ch_t *chptr;
-
- ATRACE("in audio_sup_get_info()", q);
-
- if ((chptr = (audio_ch_t *)audio_sup_get_qptr_data(q)) == NULL) {
- ATRACE("audio_sup_close() bad chptr", 0);
- return (NULL);
- }
-
- ATRACE("audio_sup_get_info() returning", chptr->ch_info.info);
-
- return (chptr->ch_info.info);
-
-} /* audio_sup_get_info() */
-
-
-/*
- * audio_sup_mblk_alloc()
- *
- * Description:
- * Allocate a STREAMS message block if the current block isn't there or
- * is too small. This is placed into the continuation pointer for the
- * passed in message block.
- *
- * When we return the b_wptr is set to b_rptr + size;
- *
- * Arguments:
- * mblk_t *mp STREAMS message block to add to
- * size_t size Size of the message to allocate
- *
- * Returns:
- * AUDIO_SUCCESS Message block allocated
- * AUDIO_FAILURE Message block not allocated
- */
-int
-audio_sup_mblk_alloc(mblk_t *mp, size_t size)
-{
- /* first the easy case, the buffer is already big enough */
- if (msgdsize(mp->b_cont) >= size) {
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + size;
- return (AUDIO_SUCCESS);
- }
-
- /* the old message either isn't there or it's too small */
- if (mp->b_cont) {
- /* here, but too small */
- freemsg(mp->b_cont);
- }
-
- /* no memory leak, time to allocate the new message */
- mp->b_cont = allocb((size), BPRI_HI);
- if (mp->b_cont == NULL) {
- return (AUDIO_FAILURE);
- }
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + size;
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_mblk_alloc() */
-
-/*
- * audio_sup_get_private()
- *
- * Description:
- * Return the pointer to the audio driver's private state information.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- *
- * Returns:
- * Pointer to private data, even if it's set to NULL
- */
-void *
-audio_sup_get_private(audiohdl_t handle)
-{
-
- return (AUDIO_HDL2STATE(handle)->as_private);
-
-} /* audio_sup_get_private() */
-
-/*
- * audio_sup_set_private()
- *
- * Description:
- * Set the audio driver's private state in the audio handle. It may
- * be reset at any time.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *private Audio driver's private data
- *
- * Returns:
- * void
- */
-void
-audio_sup_set_private(audiohdl_t handle, void *private)
-{
- AUDIO_HDL2STATE(handle)->as_private = private;
-
-} /* audio_sup_set_private() */
-
-/*
- * audio_sup_log()
- *
- * Description:
- * similar to cmn_err but prefixes the message with
- * <drivername><instance>:
- *
- * Arguments:
- * audiohdl_t handle May be NULL in which case it behaves as
- * cmn_err()
- * uint_t level A constant indicating the severity
- * char *format The message to be displayed
- *
- * NOTE: ? ! ^ should work as expected
- */
-void
-audio_sup_log(audiohdl_t handle, uint_t level, char *fmt, ...)
-{
- va_list ap;
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- int n = 0;
- int skip = 0;
-
- mutex_enter(&audio_sup_log_lock);
-
- if (statep) {
- dev_info_t *dip = statep->as_dip;
-
- switch (fmt[0]) {
- case '?':
- case '!':
- case '^':
- audio_sup_log_buf[0] = fmt[n++];
- skip++;
- break;
- default:
- break;
- }
-
- (void) sprintf(&audio_sup_log_buf[n], "%s%d: ",
- ddi_driver_name(dip), ddi_get_instance(dip));
-
- n = strlen(audio_sup_log_buf);
- }
-
- va_start(ap, fmt);
- (void) vsprintf(&audio_sup_log_buf[n], &fmt[skip], ap);
- va_end(ap);
- cmn_err(level, audio_sup_log_buf);
-
- ATRACE(audio_sup_log_buf, 0);
-
- mutex_exit(&audio_sup_log_lock);
-
-} /* audio_sup_log() */
-
-/*
- * audio_sup_update_persist_key()
- *
- * Description:
- * Update the persistent key to a new value. Memory is freed from the old
- * key and allocated for the new key.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- * char *key Pointer to the new key string
- * int sleep_okay Non-zero if okay to sleep on mem. alloc.
- *
- * Returns:
- * AUDIO_SUCCESS Key successfully updated to new key
- * AUDIO_FAILURE Memory allocation failed, dip not found
- */
-int
-audio_sup_update_persist_key(dev_info_t *dip, char *key, int sleep_okay)
-{
- audio_inst_persist_t *tptr;
- char *new_key;
- size_t key_length;
- major_t major = ddi_driver_major(dip);
- int instance = ddi_get_instance(dip);
-
- ATRACE("in audio_sup_update_persist_key()", key);
-
- /* see audio_sup_persist() for an explaination on keys */
- if (key == NULL) {
- ATRACE("audio_sup_update_persist_key() NULL key", key);
- return (AUDIO_FAILURE);
- }
-
- key_length = strlen(audio_key_class);
- key_length += strlen(key);
- key_length++; /* make room for NULL at end of string */
-
- if (sleep_okay) {
- new_key = kmem_alloc(key_length, KM_SLEEP);
- } else {
- new_key = kmem_alloc(key_length, KM_NOSLEEP);
- if (new_key == NULL) {
- ATRACE("audio_sup_update_persist_key() no memory", key);
- return (AUDIO_FAILURE);
- }
- }
-
- (void) sprintf(new_key, "%s%s", audio_key_class, key);
- ATRACE("audio_sup_update_persist_key() key string", new_key);
-
- /*
- * Find our dip, we do this after getting the key so we hold the
- * locks for as short a time as possible.
- */
- mutex_enter(&audio_persist_lock);
- ASSERT(audio_main_anchor);
- for (tptr = *audio_main_anchor; tptr; tptr = tptr->amp_next) {
- if (tptr->amp_major == major &&
- tptr->amp_instance == instance) {
- break;
- }
- }
- if (tptr == NULL) {
- kmem_free(new_key, key_length);
- mutex_exit(&audio_persist_lock);
- ATRACE("audio_sup_update_persist_key() dip not found", dip);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio_sup_update_persist_key() dip found", dip);
- kmem_free(tptr->amp_key, strlen(tptr->amp_key)+1);
- tptr->amp_key = new_key;
-
- mutex_exit(&audio_persist_lock);
-
- ATRACE("audio_sup_update_persist_key() done", new_key);
-
- return (AUDIO_SUCCESS);
-
-
-} /* audio_sup_update_persist_key() */
-
-/*
- * STREAMS Private Data Routines
- */
-
-/*
- * audio_sup_set_qptr()
- *
- * Description:
- * Allocate an audio_qptr structure to hold the private STREAM data
- * structure. Then set the values and point both the RD() and WR()
- * STREAMS queues to this data structure. That way it'll be available
- * regardless of which direction the queue may be pointed.
- *
- * NOTE: open() and close() use the read queue, which is why we put it on
- * both the read and write side.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * dev_t dev Device name
- * void *data Pointer to the private data
- *
- * Returns:
- * void
- */
-void
-audio_sup_set_qptr(queue_t *q, dev_t dev, void *data)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_set_qptr()", q);
-
- tmp = (audio_qptr_t *)kmem_alloc(sizeof (audio_qptr_t), KM_SLEEP);
-
- tmp->aq_dev = dev;
- tmp->aq_data = data;
-
- RD(q)->q_ptr = (caddr_t)tmp;
- WR(q)->q_ptr = (caddr_t)tmp;
-
- ATRACE("audio_sup_set_qptr() done", tmp);
-
-} /* audio_sup_set_qptr() */
-
-/*
- * audio_sup_free_qptr()
- *
- * Description:
- * Free the private STREAMS data structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * void
- */
-void
-audio_sup_free_qptr(queue_t *q)
-{
- ATRACE("in audio_sup_free_qptr()", q);
-
- kmem_free(q->q_ptr, sizeof (audio_qptr_t));
-
- RD(q)->q_ptr = NULL;
- WR(q)->q_ptr = NULL;
-
- ATRACE("audio_sup_free_qptr() done", q);
-
-} /* audio_sup_free_qptr() */
-
-/*
- * audio_sup_get_qptr_dev()
- *
- * Description:
- * Get the device info from the private data.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * The dev_t that was saved
- */
-dev_t
-audio_sup_get_qptr_dev(queue_t *q)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_get_qptr_dev()", q);
-
- /* make sure the q_ptr is valid */
- if (q->q_ptr == NULL) {
- ATRACE("audio_sup_get_qptr_dev() null q_ptr", NULL);
- return (NULL);
- }
-
- tmp = (audio_qptr_t *)q->q_ptr;
-
- ATRACE("audio_sup_get_qptr_dev() dev_t", tmp->aq_dev);
-
- return (tmp->aq_dev);
-
-} /* audio_sup_get_qptr_dev() */
-
-/*
- * audio_sup_get_qptr_data()
- *
- * Description:
- * Get the data info from the private data.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * Pointer to the private data.
- */
-void *
-audio_sup_get_qptr_data(queue_t *q)
-{
- audio_qptr_t *tmp;
-
- ATRACE("in audio_sup_get_qptr_data()", q);
-
- /* make sure the q_ptr is valid */
- if (q->q_ptr == NULL) {
- ATRACE("audio_sup_get_qptr_data() null q_ptr", NULL);
- return (NULL);
- }
-
- tmp = (audio_qptr_t *)q->q_ptr;
-
- ATRACE("audio_sup_get_qptr_data() done, data", tmp->aq_data);
-
- return (tmp->aq_data);
-
-} /* audio_sup_get_qptr_data() */
-
-/*
- * audio_sup_get_qptr_instance()
- *
- * Description:
- * Get the instance number from the private data's dev_t.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- *
- * Returns:
- * >= 0 The instance number
- */
-int
-audio_sup_get_qptr_instance(queue_t *q)
-{
- dev_t dev = audio_sup_get_qptr_dev(q);
- audio_state_t *statep = audio_sup_devt_to_state(dev);
- int minor = getminor(dev);
- int instance;
-
- instance = minor / audio_sup_get_minors_per_inst(
- AUDIO_STATE2HDL(statep));
-
- ATRACE("in audio_sup_get_qptr_instance()", q);
- ATRACE_32("in audio_sup_get_qptr_instance() returning", instance);
-
- return (instance);
-
-} /* audio_sup_get_qptr_instance() */
-
-/*
- * State structure handling:
- */
-
-/*
- * audio_sup_devt_to_state()
- *
- * Description:
- * This routine is used to associate the device number with the
- * dev_info_t pointer. It returns the device's state structure when
- * it is done.
- *
- * Arguments:
- * dev_t dev Device name
- *
- * Returns:
- * Valid pointer Pointer to the state
- * NULL State pointer not found
- */
-audio_state_t *
-audio_sup_devt_to_state(dev_t dev)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
- dev_info_t *my_dip;
- audio_state_t *statep;
- int instance;
- major_t major = getmajor(dev);
- major_t my_major;
-
- ATRACE("in audio_sup_devt_to_state()", dev);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
-
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- statep = &list->ail_state;
- mutex_enter(&statep->as_lock);
- my_dip = statep->as_dip;
- my_major = statep->as_major;
- instance = getminor(dev) /
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
-
- if ((my_major == major) &&
- (instance == ddi_get_instance(my_dip))) {
- mutex_exit(&statep->as_lock);
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_devt_to_state() returning", statep);
-
- return (statep);
-
- }
- plist = &list->ail_next;
- list = list->ail_next;
- mutex_exit(&statep->as_lock);
- }
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_devt_to_state() returning NULL", 0);
-
- return (NULL);
-
-} /* audio_sup_devt_to_state() */
-
-/*
- * audio_sup_devinfo_to_state()
- *
- * Description:
- * Get the state pointer for the audio device given a devinfo_t *.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- *
- * Returns:
- * Valid pointer Pointer to the state
- * NULL State pointer not found
- */
-audio_state_t *
-audio_sup_devinfo_to_state(dev_info_t *dip)
-{
- audio_inst_info_t *instp;
-
- ATRACE("in audio_sup_devinfo_to_state(), dip", dip);
-
- mutex_enter(&audio_drv_list_lock);
- instp = audio_sup_lookup_drv_entry(dip);
-
- if (instp && (instp->ail_state.as_dip == dip)) {
- mutex_exit(&audio_drv_list_lock);
-
- /* verify, if given */
- ATRACE("audio_sup_devinfo_to_state() "
- "found dip match, returning", &instp->ail_state);
-
- return (&instp->ail_state);
-
- } else {
- mutex_exit(&audio_drv_list_lock);
- ATRACE("audio_sup_devinfo_to_state() no dip match", dip);
-
- return (NULL);
-
- }
-
-} /* audio_sup_devinfo_to_state() */
-
-/*
- * audio_sup_create_drv_entry()
- *
- * Description:
- * Create & add an entry in the instance list (audio_drv_list_head).
- * The whole linked list is scanned
- * to make sure we don't ever get a duplicate entry.
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device, what we use
- * to find the instance
- *
- * Returns:
- * Valid pointer Valid instance
- * NULL Instance already registered
- */
-static audio_inst_info_t *
-audio_sup_create_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist; /* for walking the list */
- audio_inst_info_t *entry; /* new entry */
-
- ATRACE("in audio_sup_create_drv_entry()", dip);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if (list->ail_state.as_dip == dip) {
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_create_drv_entry() "
- "instance already registered", dip);
- audio_sup_log(NULL, CE_NOTE,
- "%s%d already registered",
- ddi_driver_name(dip), ddi_get_instance(dip));
-
- return (NULL);
-
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
-
- /* "dip" is not registered, create new one and add to list */
- ATRACE("audio_sup_create_drv_entry() dip not registered", dip);
-
- entry = kmem_zalloc(sizeof (*entry), KM_SLEEP);
- *plist = entry;
- mutex_exit(&audio_drv_list_lock);
-
- return (entry);
-
-} /* audio_sup_create_drv_entry() */
-
-/*
- * audio_sup_free_drv_entry()
- *
- * Description:
- * This routine is used to clear entries in the driver list that
- * were added in by audio_sup_create_drv_entry().
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device.
- * if NULL, delete all entries
- *
- * Returns:
- * void
- */
-static void
-audio_sup_free_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
- audio_ch_t *chptr;
- audio_state_t *statep;
- int i;
- int num_chs;
-
- ATRACE("in audio_sup_free_drv_entry()", dip);
-
- /* protect the driver list */
- mutex_enter(&audio_drv_list_lock);
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if ((dip == NULL) || (list->ail_state.as_dip == dip)) {
- /* found it */
- *plist = list->ail_next;
- list->ail_next = NULL;
-
- statep = &list->ail_state;
-
- /* de-initialize the channel structures */
- num_chs = statep->as_max_chs;
- for (i = 0, chptr = &statep->as_channels[0];
- i < num_chs; i++, chptr++) {
- /*
- * All we have to worry about is locks and
- * condition variables.
- */
- mutex_destroy(&chptr->ch_lock);
- mutex_destroy(&chptr->ch_adata_lock);
- cv_destroy(&chptr->ch_cv);
- }
-
- /* destroy mutex, cv */
- mutex_destroy(&statep->as_lock);
- cv_destroy(&statep->as_cv);
-
- /* free the structure */
- kmem_free(list, sizeof (audio_inst_info_t));
-
- /* see if we need to go again */
- if (dip) {
- /* nope, done */
- break;
- }
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
- mutex_exit(&audio_drv_list_lock);
-
- ATRACE("audio_sup_free_drv_entry() done", 0);
-
-} /* audio_sup_free_drv_entry() */
-
-/*
- * audio_sup_free_apm_persist()
- *
- * Description:
- * Free the audio_apm_persist list that is associated with the instance.
- *
- * Arguments:
- * audio_state_t *statep Pointer to device state info
- * audio_apm_persist_t *instp Pointer to instance data
- *
- * Returns:
- * void Silently fails if key useless
- */
-static void
-audio_sup_free_apm_persist(audio_state_t *statep, audio_apm_persist_t *instp)
-{
- audio_apm_persist_t *tmp;
-
- ATRACE("in audio_sup_free_apm_persist() statep", statep);
- ATRACE("audio_sup_free_apm_persist() instp", instp);
-
- ASSERT(mutex_owned(&audio_persist_lock));
-
- tmp = instp;
- while (tmp) {
- tmp = tmp->ap_next;
- kmem_free(instp->ap_data, instp->ap_size);
- kmem_free(instp, sizeof (*instp));
- }
-
- ATRACE("audio_sup_free_apm_persist() done", statep);
-
-} /* audio_sup_free_apm_persist() */
-
-/*
- * audio_sup_free_inst_persist()
- *
- * Description:
- * Free the audio_inst_persist_t structure for this dip.
- *
- * Arguments:
- * audio_state_t *statep Pointer to device state info
- * audio_inst_persist_t *persistp Pointer to the struct to remove
- *
- * Returns:
- * void
- */
-static void
-audio_sup_free_inst_persist(audio_state_t *statep,
- audio_inst_persist_t *persistp)
-{
- audio_inst_persist_t **plist;
- audio_inst_persist_t *list;
-
- ATRACE("in audio_sup_free_inst_persist() statep", statep);
- ATRACE("audio_sup_free_inst_persist() persistp", persistp);
-
- ASSERT(mutex_owned(&audio_persist_lock));
- ASSERT(audio_main_anchor);
-
- plist = audio_main_anchor;
- list = *plist;
-
- while (list) {
- if (list == persistp) {
- /* found it, free the APM list and key */
- if (list->amp_key) {
- kmem_free(list->amp_key,
- strlen(list->amp_key)+1);
- }
- if (list->amp_apmp) {
- audio_sup_free_apm_persist(statep,
- list->amp_apmp);
- }
- /* remove from the list */
- *plist = list->amp_next;
- ATRACE("audio_sup_free_inst_persist() "
- "freeing dip & return", list);
- kmem_free(list, sizeof (*list));
- return;
- }
-
- plist = &list->amp_next;
- list = list->amp_next;
- }
-
- ATRACE("audio_sup_free_inst_persist() returning, not found", persistp);
-
-} /* audio_sup_free_inst_persist() */
-
-/*
- * audio_sup_lookup_drv_entry()
- *
- * Description:
- * Lookup audio_inst_info_t pointer corresponding to dip
- *
- * Arguments:
- * dev_info_t *dip dev_info_t pointer for the device
- *
- * Returns:
- * audio_inst_info_t pointer or NULL
- */
-static audio_inst_info_t *
-audio_sup_lookup_drv_entry(dev_info_t *dip)
-{
- audio_inst_info_t *list; /* for walking the list */
- audio_inst_info_t **plist /* for walking the list */;
-
- ATRACE("in audio_sup_lookup_drv_entry()", dip);
- ASSERT(mutex_owned(&audio_drv_list_lock));
-
- plist = &audio_drv_list_head;
- list = *plist;
- while (list) {
- if (list->ail_state.as_dip == dip) {
- break;
- }
- plist = &list->ail_next;
- list = list->ail_next;
- }
-
- ATRACE("audio_sup_lookup_drv_entry() done", list);
-
- return (list);
-
-} /* audio_sup_lookup_drv_entry() */
-
-/*
- * audio_sup_persist()
- *
- * Description:
- * Routine to initialize and find persistent state and its unique key.
- *
- * There are two types of persistent state, per instance and per APM
- * state. Per instance saves the key and dip. Thus the correct instance
- * may be found based on the key or the dip. It is also possible to
- * detect, given a driver provided unique key, when a device moves
- * from one port to another. Right now a linear search is used to find
- * the matching dip. If we get to the point of supporting 100s or 1000s
- * of instances then this will need to be changed to something more
- * sophisticated.
- *
- * The second type is used to save the state for each APM for the
- * instance. It is not a requirement for any APM to save persistent
- * state, thus we could be allocating the per instance state structure
- * for nothing. The APM is responsible for allocating the memory and
- * providing a pointer to that memory and the size.
- * audio_sup_free_persist_state() will free this memory for the APM.
- *
- * The per instance state structures are found by retreiving the
- * main anchor using the AUDIO_SUP_KEY unique key.
- *
- * If the reset-configuration property is set to non-zero then any
- * saved state is cleared and the APMs rebuild the persistent data
- * from scratch. This effectively resets them to their defaults.
- *
- * NOTE: All allocated memory is owned by the main anchor.
- *
- * Arguments:
- * audio_state_t *statep The device state structure
- * char *key Unique key to for finding memory
- *
- * Returns:
- * AUDIO_SUCCESS Persistent state allocated/found
- * AUDIO_FAILURE Couldn't allocate/find persistent state
- */
-static int
-audio_sup_persist(audio_state_t *statep, char *key)
-{
- audio_inst_persist_t *key_persistp = NULL;
- audio_inst_persist_t *inst_persistp;
- audio_inst_persist_t *main_anchor;
- audio_inst_persist_t *tmp_persistp;
- dev_info_t *dip = statep->as_dip;
- size_t key_length;
- major_t major = ddi_driver_major(dip);
- char *anchor_key = AUDIO_SUP_KEY;
- char *new_key;
- char pathbuf[MAXPATHLEN];
- int do_reset = 0;
- int instance = statep->as_dev_instance;
-
- ATRACE("in audio_sup_persist()", statep);
-
- /*
- * The 1st step is to make sure we have the anchor. It could have
- * been allocated on a previous audio framework load, or it could be
- * unallocated.
- */
- mutex_enter(&audio_persist_lock);
- ATRACE("audio_sup_persist() audio_main_anchor", audio_main_anchor);
- if (audio_main_anchor == NULL) {
- /* anchor not loaded, so find it */
- main_anchor = (audio_inst_persist_t *)space_fetch(anchor_key);
- ATRACE("audio_sup_persist() space_fetch() main_anchor",
- main_anchor);
- if (main_anchor == NULL) {
- /* 1st load, need to allocate the anchor memory */
- main_anchor = kmem_zalloc(sizeof (main_anchor),
- KM_SLEEP);
- if (space_store(anchor_key,
- (uintptr_t)main_anchor) != 0) {
- mutex_exit(&audio_persist_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "!cannot create persistent anchor");
- kmem_free(main_anchor, sizeof (main_anchor));
- return (AUDIO_FAILURE);
- }
- ATRACE("audio_sup_persist() space_store() main_anchor",
- main_anchor);
- }
- /* set this after the check above! */
- audio_main_anchor = (audio_inst_persist_t **)main_anchor;
- ATRACE("audio_sup_persist() new audio_main_anchor",
- audio_main_anchor);
- }
- mutex_exit(&audio_persist_lock);
-
- /*
- * Set up the instance key. Following the comments in space.c this
- * key is in one of two formats:
- *
- * AUDIO:key_string_from_driver
- *
- * or
- *
- * AUDIO:pathname
- *
- * The former is when the driver passes a string for the key. This
- * string MUST be unique. The later is when the driver passes a
- * NULL key string.
- */
- if (key == NULL) {
- key = ddi_pathname(dip, pathbuf);
- ATRACE("audio_sup_persist() NULL key string", key);
- } else {
- ATRACE("audio_sup_persist() provided key string", key);
- }
-
- key_length = strlen(audio_key_class);
- key_length += strlen(key);
- key_length++; /* make room for NULL at end of string */
-
- new_key = kmem_alloc(key_length, KM_SLEEP);
- (void) sprintf(new_key, "%s%s", audio_key_class, key);
- ATRACE("audio_sup_register() key string", new_key);
-
- /*
- * In order to determine if this device has moved to a different port
- * or if the key has changed we need to search through all of the dev
- * structures. Once this loop ends we'll know if the current key and
- * dev are present. This is one of the simple search algorithms that
- * would need to be changed if we need to support a huge number of
- * instances.
- */
- mutex_enter(&audio_persist_lock);
- for (tmp_persistp = *audio_main_anchor; tmp_persistp;
- tmp_persistp = tmp_persistp->amp_next) {
- if (strcmp(new_key, tmp_persistp->amp_key) == 0) {
- ATRACE("audio_sup_persist() dev: found key",
- tmp_persistp);
- ASSERT(!key_persistp);
- key_persistp = tmp_persistp;
- break;
- }
- }
-
- if (key_persistp) {
- key_persistp->amp_major = major;
- key_persistp->amp_instance = instance;
-
- ATRACE("audio_sup_persist() match", key_persistp);
- inst_persistp = key_persistp;
-
- /* free new_key so we don't have a memory leak */
- kmem_free(new_key, key_length);
- } else {
- ATRACE("audio_sup_persist() no match", statep);
- mutex_exit(&audio_persist_lock);
- inst_persistp = kmem_zalloc(sizeof (*inst_persistp), KM_SLEEP);
- mutex_enter(&audio_persist_lock);
-
- /* don't free new_key because we need it */
- inst_persistp->amp_key = new_key;
- inst_persistp->amp_major = major;
- inst_persistp->amp_instance = instance;
-
- /* put on list */
- inst_persistp->amp_next = *audio_main_anchor;
- *audio_main_anchor = inst_persistp;
- }
-
- /*
- * CAUTION: From here new_key must have been freed or placed in an
- * audio_inst_persist_t structure. Otherwise we'll have a memory
- * leak.
- *
- * We are done!
- */
-
- ASSERT(inst_persistp);
- mutex_exit(&audio_persist_lock);
-
- /* have statep point to instance persist info */
- mutex_enter(&statep->as_lock);
- statep->as_persistp = (void *)inst_persistp;
- ATRACE("audio_sup_register() as_persistp", statep->as_persistp);
- mutex_exit(&statep->as_lock);
-
- /*
- * The final piece of information we need is whether we need to
- * do a reset or not.
- */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "reset-configuration", 0)) {
- ATRACE("audio_sup_persist() need reset", statep);
- do_reset++;
- }
-
- /*
- * Now that we have good persistence data see if we need to reset it.
- * We don't block the attach() in this case because the driver is still
- * useful.
- */
- if (do_reset && audio_sup_free_persist_state(statep,
- AUDIO_ALL_DEVICES) == AUDIO_FAILURE) {
- audio_sup_log(NULL, CE_NOTE, "!state reset failed");
- }
-
- ATRACE("audio_sup_persist() returning, tmp_persistp", tmp_persistp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio_sup_persist() */
-
-/*
- * audio_sup_wiocdata()
- *
- * Description:
- * This routine is called by audio_sup_wput() to process the IOCDATA
- * messages that belong to the Audio Support Module's routines.
- *
- * We only support transparent ioctls.
- *
- * WARNING: Don't forget to free the mblk_t struct used to hold private
- * data. The done: jump point takes care of this.
- *
- * WARNING: Don't free the private mblk_t structure if the command is
- * going to call qreply(). This frees the private date that will
- * be needed for the next M_IOCDATA message.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes on return for
- * audio_sup_wput()
- */
-static int
-audio_sup_wiocdata(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- struct copyreq *cqp;
- struct copyresp *csp;
- audio_i_state_t *cmd;
- int error = 0;
-
- ATRACE("in audio_sup_wiocdata()", chptr);
-
- ASSERT(statep);
- ASSERT(chptr);
-
- csp = (struct copyresp *)mp->b_rptr; /* set up copy response ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
- cqp = (struct copyreq *)mp->b_rptr; /* set up copy request ptr */
-
- /* make sure we've got a good return value */
- if (csp->cp_rval) {
- ATRACE("audio_sup_wiocdata() bad return value", csp->cp_rval);
- error = EINVAL;
- goto done;
- }
-
- /* find the command */
- ATRACE_32("audio_sup_wiocdata() command", cmd->ais_command);
- switch (cmd->ais_command) {
-
- case AUDIO_COPY_OUT_CH_NUMBER: /* AUDIO_GET_CH_NUMBER */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CH_NUMBER", chptr);
- if (csp->cp_cmd != AUDIO_GET_CH_NUMBER) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_CH_TYPE: /* AUDIO_GET_CH_TYPE */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CH_TYPE", chptr);
- if (csp->cp_cmd != AUDIO_GET_CH_TYPE) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_NUM_CHS: /* AUDIO_GET_NUM_CHS */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_CHANNELS", chptr);
- if (csp->cp_cmd != AUDIO_GET_NUM_CHS) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_AD_DEV: /* AUDIO_GET_AD_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_AD_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_AD_DEV) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_APM_DEV: /* AUDIO_GET_APM_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_APM_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_APM_DEV) {
- error = EINVAL;
- }
- break;
-
- case AUDIO_COPY_OUT_AS_DEV: /* AUDIO_GET_AS_DEV */
- ATRACE("audio_sup_wiocdata() AUDIO_COPY_OUT_AS_DEV", chptr);
- if (csp->cp_cmd != AUDIO_GET_AS_DEV) {
- error = EINVAL;
- }
- break;
-
- default:
- ATRACE("audio_sup_wiocdata() default", chptr);
- error = EINVAL;
- break;
- }
-
- /* we always either ack or nack depending on if error is set or not */
- ATRACE_32("audio_sup_wiocdata() switch done", error);
-
-done:
- if (csp->cp_private) {
- ATRACE("audio_sup_wiocdata() freeing csp->cp_private",
- csp->cp_private);
- kmem_free(csp->cp_private, sizeof (audio_i_state_t));
- csp->cp_private = NULL;
- }
- if (cqp->cq_private) {
- ATRACE("audio_sup_wiocdata() freeing cqp->cq_private",
- cqp->cq_private);
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE_32("audio_sup_wiocdata() returning", error);
-
- return (0);
-
-} /* audio_sup_wiocdata() */
-
-/*
- * audio_sup_wioctl()
- *
- * Description:
- * This routine is called by audio_sup_wput() to process all M_IOCTL
- * messages that the Audio Support Module provides.
- *
- * We only support transparent ioctls. Since this is a driver we
- * nack unrecognized ioctls.
- *
- * The following ioctls are supported:
- * AUDIO_GET_CH_NUMBER
- * AUDIO_GET_CH_TYPE
- * AUDIO_GET_NUM_CHS
- * AUDIO_GET_AD_DEV
- * AUDIO_GET_APM_DEV
- * AUDIO_GET_AS_DEV
- * unknown nack back up the queue
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * WARNING: There cannot be any locks owned by calling routines.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * audio_sup_wput()
- */
-static int
-audio_sup_wioctl(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_device_t *devp;
- struct iocblk *iocbp;
- audio_i_state_t *state = NULL;
- audio_device_type_e type = chptr->ch_info.dev_type;
- int error;
-
- ATRACE("in audio_sup_wioctl()", chptr);
-
- ASSERT(statep);
- ASSERT(chptr);
-
- ASSERT(!mutex_owned(&statep->as_lock));
-
- iocbp = (struct iocblk *)mp->b_rptr; /* pointer to ioctl info */
-
- /* make sure this is a transparent ioctl */
- if (iocbp->ioc_count != TRANSPARENT) {
- ATRACE_32("audio_sup_wioctl() not TRANSPARENT",
- iocbp->ioc_count);
- error = EINVAL;
- goto nack;
- }
-
- /* get a buffer for private data */
- if ((state = kmem_alloc(sizeof (*state), KM_NOSLEEP)) == NULL) {
- ATRACE("audio_sup_wioctl() state kmem_alloc() failed", 0);
- error = ENOMEM;
- goto nack;
- }
-
- ATRACE_32("audio_sup_wioctl() command", iocbp->ioc_cmd);
- switch (iocbp->ioc_cmd) {
-
- case AUDIO_GET_CH_NUMBER:
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_NUMBER", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_CH_NUMBER;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = chptr->ch_info.ch_number;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (int);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_NUMBER returning",
- chptr);
-
- return (0);
-
- /* end AUDIO_GET_CH_NUMBER */
-
- case AUDIO_GET_CH_TYPE:
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_TYPE", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_CH_TYPE;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = type;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (AUDIO);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_CH_TYPE returning", chptr);
-
- return (0);
-
- /* end AUDIO_GET_CH_TYPE */
-
- case AUDIO_GET_NUM_CHS:
- ATRACE("audio_sup_wioctl() AUDIO_GET_NUM_CHS", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_NUM_CHS;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* only an int, so reuse the data block without checks */
- *(int *)mp->b_cont->b_rptr = statep->as_max_chs;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof (int);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (int), state->ais_address,
- NULL);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_NUM_CHS returning",
- chptr);
-
- return (0);
-
- /* end AUDIO_GET_NUM_CHS */
-
- case AUDIO_GET_AD_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_AD_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_AD_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (audio_device_t)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(chptr->ch_dev_info, devp, sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_AD_DEV returning", chptr);
-
- return (0);
-
- case AUDIO_GET_APM_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_APM_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_APM_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (*chptr->ch_dev_info)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(chptr->ch_apm_infop->apm_info, devp,
- sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_APM_DEV returning", chptr);
-
- return (0);
-
- case AUDIO_GET_AS_DEV:
- ATRACE("audio_sup_wioctl() AUDIO_GET_AS_DEV", chptr);
-
- /* save state for M_IOCDATA processing */
- state->ais_command = AUDIO_COPY_OUT_AS_DEV;
- /* user space addr */
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- mcopyout(mp, (mblk_t *)state, sizeof (*chptr->ch_dev_info),
- state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (MBLKSIZE(mp->b_cont) < sizeof (*chptr->ch_dev_info)) {
- freemsg(mp->b_cont);
- mp->b_cont = allocb(
- sizeof (*chptr->ch_dev_info), BPRI_MED);
- if (mp->b_cont == NULL) {
- error = EAGAIN;
- goto nack;
- }
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(&audio_device_info, devp, sizeof (*chptr->ch_dev_info));
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (*chptr->ch_dev_info);
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("audio_sup_wioctl() AUDIO_GET_AS_DEV returning", chptr);
-
- return (0);
-
- default: /* this should never happen */
- ATRACE_32("audio_sup_wioctl() default", iocbp->ioc_cmd);
- error = EINVAL;
- break;
- }
-
- /* we always nack */
- ATRACE_32("audio_sup_wioctl() switch done", error);
-
-nack:
- /* we always nack if we break out of the switch() */
- ATRACE("audio_sup_wioctl() nack", chptr);
-
- if (state) { /* free allocated state memory */
- ATRACE("audio_sup_wioctl() nack freeing state", state);
- kmem_free(state, sizeof (audio_i_state_t));
- }
-
- miocnak(q, mp, 0, error);
-
- ATRACE("audio_sup_wioctl() returning failure", chptr);
-
- return (0);
-
-} /* audio_sup_wioctl() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c b/usr/src/uts/common/io/audio/sada/mixer/am_ad.c
deleted file mode 100644
index 7d39aee5a7..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_ad.c
+++ /dev/null
@@ -1,5155 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * This file contains the code that the Audio Driver calls into and the
- * private routines that support these calls.
- *
- * NOTE: When allocating conversion buffers for recording we have to be
- * careful that the recording device isn't mono. Otherwise we won't
- * have enough memory for converting.
- *
- * These entry points are defined in audio_mixer.h:
- * am_attach()
- * am_detach()
- * am_get_audio()
- * am_play_shutdown()
- * am_send_audio()
- * am_hw_state_change()
- * am_get_src_data()
- * am_set_src_data()
- *
- * These additional functions are also provided:
- * am_ad_pause_play()
- * am_ad_set_config()
- * am_ad_set_format()
- * am_ad_setup()
- * am_ad_start_play()
- * am_ad_start_record()
- * am_ad_stop_play()
- * am_ad_stop_record()
- * am_ad_teadown()
- * am_ck_channels()
- * am_ck_combinations()
- * am_ck_sample_rate()
- * am_safe_putnext()
- * am_test_canputnext()
- */
-
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/stat.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/g711.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Local routine prototypes used only by this file.
- */
-static int am_attach_check(audio_state_t *,
- am_ad_info_t *, am_apm_private_t *, int);
-static int am_ck_sample_rate_sanity(am_ad_ch_cap_t *, int);
-static void am_convert_to_format(int *, void *, int, int, int, int);
-static int am_get_audio_multi(audio_state_t *, void *, int, int);
-static int am_get_audio_trad_compat(audio_state_t *, audio_apm_info_t *,
- void *, int);
-static int am_get_audio_trad_mixer(audio_state_t *, audio_apm_info_t *,
- void *, int);
-static int am_get_samples(audio_ch_t *, int, void *, int);
-static void am_play_shutdown_multi(audiohdl_t, int);
-static void am_play_shutdown_trad(audiohdl_t, audio_apm_info_t *);
-static void am_release_ad_access(am_apm_private_t *);
-static void am_send_audio_common(audio_ch_t *, void *, int);
-static void am_send_audio_multi(audio_state_t *, am_ad_info_t *, void *,
- int, int);
-static void am_send_audio_trad_compat(audio_state_t *, audio_apm_info_t *,
- int *, int);
-static void am_send_audio_trad_mixer(audio_state_t *, audio_apm_info_t *,
- int *, const int);
-static void am_serialize_ad_access(am_apm_private_t *);
-
-/*
- * Taskq callbacks.
- */
-static void am_hw_task(void *);
-
-/*
- * Module global hidden variables
- */
-static audio_device_t mixer_device_info = {
- MIXER_NAME,
- MIXER_VERSION,
- MIXER_CONFIGURATION
-};
-
-static int mixer_bufsize = AM_DEFAULT_MIX_BUFSIZE;
-
-/* XXX this is a lie */
-_NOTE(SCHEME_PROTECTS_DATA("this is a lie", mixer_bufsize))
-
-/*
- * The main routines for this file. These are the Audio Driver entry points.
- */
-
-/*
- * am_attach()
- *
- * TODO: Check for PLINK
- *
- * Description:
- * Attach an instance of the mixer. We initialize all the data structures
- * and register the APM for both AUDIO and AUDIOCTL. Two audio_apm_info
- * data structures are created, however they share the same private data
- * structure.
- *
- * We check both MIXER and COMPAT modes because we can switch between
- * them and thus we need to make sure everything is okay for both modes.
- * Plus we need the initial condition for both modes to support switching.
- *
- * NOTE: mutex_init() and cv_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * NOTE: It is okay for memory allocation to sleep.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * ddi_attach_cmd_t cmd Attach command
- * am_ad_info_t *ad_infop Ptr to the device's capabilities struct
- *
- * Returns:
- * AUDIO_SUCCESS If the mixer was initialized properly
- * AUDIO_FAILURE If the mixer couldn't be initialized properly
- */
-int
-am_attach(audiohdl_t handle, ddi_attach_cmd_t cmd, am_ad_info_t *ad_infop)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_info_t *hw_info;
- audio_apm_info_t *apm_infop1;
- audio_apm_info_t *apm_infop2;
- am_apm_persist_t *persistp;
- am_apm_private_t *stpptr;
- audio_apm_reg_t reg_info;
- minor_t minor;
- int mpgain = 0;
- int mpbal = 0;
- int mrgain = 0;
- int mrbal = 0;
- uint_t mgain = 0;
- uint_t pbalance = AUDIO_MID_BALANCE;
- uint_t pgain = 0;
- uint_t rbalance = AUDIO_MID_BALANCE;
- uint_t rgain = 0;
- int doread; /* device supports record */
- int dowrite; /* device supports play */
- int mode;
- int psr;
- int rsr;
-
- ATRACE("in am_attach()", ad_infop);
- ASSERT(statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- default:
- ATRACE_32("am_attach() unknown command failure", cmd);
- return (AUDIO_FAILURE);
- }
-
- /* before we do anything else make sure the interface versions are ok */
- if (ad_infop->ad_int_vers != AM_VERSION) {
- ATRACE_32("am_attach() unsupported interface versions",
- ad_infop->ad_int_vers);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() interface version not supported: %d",
- ad_infop->ad_int_vers);
- return (AUDIO_FAILURE);
- }
-
- /* get the properties from the .conf file */
- if ((mixer_bufsize = ddi_prop_get_int(DDI_DEV_T_ANY, statep->as_dip,
- DDI_PROP_DONTPASS, "mixer_bufsize", AM_DEFAULT_MIX_BUFSIZE)) ==
- AM_DEFAULT_MIX_BUFSIZE) {
- ATRACE_32("am_attach() setting mix buffer size",
- AM_DEFAULT_MIX_BUFSIZE);
-#ifdef DEBUG
- } else {
- ATRACE_32("am_attach() setting mix buffer size from .conf",
- mixer_bufsize);
-#else
- /*EMPTY*/
-#endif
- }
- if (mixer_bufsize < AM_DEFAULT_MIX_BUFSIZE) {
- ATRACE_32("am_attach() mix buffer too small", mixer_bufsize);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "ddi_prop_get_int() mix buffer too small, setting to %d",
- AM_DEFAULT_MIX_BUFSIZE);
- mixer_bufsize = AM_DEFAULT_MIX_BUFSIZE;
- ATRACE_32("am_attach() setting new mix buffer size",
- mixer_bufsize);
- }
-
- /* figure out the direction and sanity check */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
- if (!doread && !dowrite) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio device doesn't play or record");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach() doread", doread);
- ATRACE_32("am_attach() dowrite", dowrite);
-
- /* check the sample rate converter */
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* make sure the version is okay */
- if (dowrite &&
- ad_infop->ad_play.ad_conv->ad_version != AM_SRC_VERSION) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() bad play src version: %d",
- ad_infop->ad_play.ad_conv->ad_version);
- return (AUDIO_FAILURE);
- }
- if (doread &&
- ad_infop->ad_record.ad_conv->ad_version != AM_SRC_VERSION) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() bad record src version: %d",
- ad_infop->ad_record.ad_conv->ad_version);
- return (AUDIO_FAILURE);
- }
- }
-
- /* get the state pointer for this instance */
- if ((statep = audio_sup_devinfo_to_state(statep->as_dip)) == NULL) {
- ATRACE("am_attach() couldn't get state structure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't get state structure");
- return (AUDIO_FAILURE);
- }
-
- /* allocate the audio mixer private data */
- stpptr = kmem_zalloc(sizeof (*stpptr), KM_SLEEP);
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr));
-
- hw_info = &stpptr->am_hw_info;
-
- /* make sure we won't free the device state structure */
- hw_info->ref_cnt = 1;
-
- /* we assume the device is on line when we attach */
- stpptr->am_flags |= AM_PRIV_ON_LINE;
-
- /* initialize mutexes and cvs */
- mutex_init(&stpptr->am_mode_lock, NULL, MUTEX_DRIVER, NULL);
- mutex_init(&stpptr->am_ad_lock, NULL, MUTEX_DRIVER, NULL);
- cv_init(&stpptr->am_mode_cv, NULL, CV_DRIVER, NULL);
- cv_init(&stpptr->am_ad_cv, NULL, CV_DRIVER, NULL);
-
- /*
- * WARNING: From here on all error returns must be through one
- * of the error_? labels. Otherwise we'll have a memory leak.
- */
-
- /* start off with allocating the signal message buffer */
- if ((stpptr->am_sig_mp = allocb(sizeof (int8_t), BPRI_HI)) == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach() couldn't allocate message block to send signal");
- goto error_free_private;
- }
- ASSERT(stpptr->am_sig_mp->b_cont == 0);
- /* turn it into a signal */
- stpptr->am_sig_mp->b_datap->db_type = M_PCSIG;
- *stpptr->am_sig_mp->b_wptr++ = SIGPOLL;
-
- /* register the mixer with the Audio Support Module */
- reg_info.aar_version = AM_AAR_VERSION;
- reg_info.aar_apm_open = am_open_audio;
- reg_info.aar_apm_close = am_close_audio;
- reg_info.aar_apm_save_state = am_save_state;
- reg_info.aar_apm_restore_state = am_restore_state;
- reg_info.aar_private = stpptr;
- reg_info.aar_info = ad_infop;
- reg_info.aar_state = hw_info;
- reg_info.aar_dev_info = &mixer_device_info;
-
- if ((apm_infop1 = audio_sup_register_apm(statep, AUDIO,
- &reg_info)) == NULL) {
- ATRACE_32("am_attach() couldn't register AUDIO", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "couldn't register the AUDIO device with audiosup");
- goto error_free_msg;
- }
-
- reg_info.aar_apm_open = am_open_audioctl;
- reg_info.aar_apm_close = am_close_audioctl;
- reg_info.aar_apm_save_state = NULL;
- reg_info.aar_apm_restore_state = NULL;
-
- if ((apm_infop2 = audio_sup_register_apm(statep, AUDIOCTL,
- &reg_info)) == NULL) {
- ATRACE_32("am_attach() couldn't register AUDIOCTL", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN, "am_attach() "
- "couldn't register the AUDIOCTL device with audiosup");
- goto error_unregister;
- }
-
- /* set the max input and output channels, making sure they are sane */
- if (ad_infop->ad_record.ad_max_chs > statep->as_max_chs) {
- stpptr->am_max_in_chs = statep->as_max_chs;
- } else {
- stpptr->am_max_in_chs = ad_infop->ad_record.ad_max_chs;
- }
- if (ad_infop->ad_play.ad_max_chs > statep->as_max_chs) {
- stpptr->am_max_out_chs = statep->as_max_chs;
- } else {
- stpptr->am_max_out_chs = ad_infop->ad_play.ad_max_chs;
- }
- ATRACE_32("am_attach() am_max_in_chs", stpptr->am_max_in_chs);
- ATRACE_32("am_attach() am_max_out_chs", stpptr->am_max_out_chs);
-
- /* get the persistent state, if not there then first time so allocate */
- persistp = audio_sup_get_persist_state(statep, AUDIO);
- if (persistp == NULL) {
- ATRACE("am_attach() 1st time persist or reset state", persistp);
-
- /* allocate the structure and save */
- persistp = kmem_alloc(sizeof (*persistp), KM_SLEEP);
- if (audio_sup_set_persist_state(statep, AUDIO,
- persistp, sizeof (*persistp)) == AUDIO_FAILURE) {
- ATRACE("am_attach() cannot set persist", 0)
- goto error_unregister;
- }
-
- /* get the mode from the driver */
- mode = ad_infop->ad_mode;
-
- /* and also get the monitor gain */
- mgain = ad_infop->ad_defaults->monitor_gain;
-
- /* get the gains from the drive, based on mode */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (dowrite) {
- pgain = AM_DEFAULT_MIXER_GAIN;
- pbalance = AUDIO_MID_BALANCE;
- mpgain = pgain;
- mpbal = pbalance;
- }
- if (doread) {
- rgain = AUDIO_MID_GAIN;
- rbalance = AUDIO_MID_BALANCE;
- mrgain = rgain;
- mrbal = rbalance;
- }
- } else {
- if (dowrite) {
- pgain = ad_infop->ad_defaults->play.gain;
- pbalance = ad_infop->ad_defaults->play.balance;
- }
- if (doread) {
- rgain = ad_infop->ad_defaults->record.gain;
- rbalance =
- ad_infop->ad_defaults->record.balance;
- }
- }
-
- persistp->apm_mpgain = pgain;
- persistp->apm_mpbal = pbalance;
- persistp->apm_mrgain = rgain;
- persistp->apm_mrbal = rbalance;
- persistp->apm_mode = mode;
- persistp->apm_pgain = pgain;
- persistp->apm_pbal = pbalance;
- persistp->apm_rgain = rgain;
- persistp->apm_rbal = rbalance;
- persistp->apm_mgain = mgain;
-
- if (dowrite) {
- ad_infop->ad_defaults->play.port |=
- ad_infop->ad_defaults->play.avail_ports ^
- ad_infop->ad_defaults->play.mod_ports;
- }
- if (doread) {
- ad_infop->ad_defaults->record.port |=
- ad_infop->ad_defaults->record.avail_ports ^
- ad_infop->ad_defaults->record.mod_ports;
- }
- } else {
- /* the mode comes from the peristent data */
- mode = persistp->apm_mode;
- mpgain = persistp->apm_mpgain;
- mpbal = persistp->apm_mpbal;
- mrgain = persistp->apm_mrgain;
- mrbal = persistp->apm_mrbal;
- pgain = persistp->apm_pgain;
- pbalance = persistp->apm_pbal;
- ad_infop->ad_defaults->play.port = persistp->apm_pport;
- ad_infop->ad_defaults->output_muted = persistp->apm_pmute;
- rgain = persistp->apm_rgain;
- rbalance = persistp->apm_rbal;
- mgain = persistp->apm_mgain;
- ad_infop->ad_defaults->record.port = persistp->apm_rport;
- }
-
- /* save persistent state in private data structure */
- stpptr->am_pstate = persistp;
-
- /*
- * CAUTION: Keep the calls in am_restore_state() the same as in
- * this routine. There may be order dependencies and once the
- * audio driver works we don't want to break it if we change
- * the order.
- *
- * Check the write capabilities, if the device supports it.
- */
- ASSERT(stpptr->am_pflags == NULL);
- ASSERT(stpptr->am_rflags == NULL);
- if (dowrite) {
- if (am_attach_check(statep, ad_infop, stpptr, AUDIO_PLAY) ==
- AUDIO_FAILURE) {
- ATRACE("am_attach() am_attach_check() failed", 0);
- goto error_unregister_both;
- }
-
- /* get initial conditions */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- psr = stpptr->am_save_psr;
- } else {
- psr = ad_infop->ad_defaults->play.sample_rate;
- }
-
- /* see if we need to translate to unsigned */
- if (ad_infop->ad_translate_flags & AM_MISC_16_P_TRANSLATE) {
- stpptr->am_pflags |= AM_PRIV_16_TRANS;
- }
- if (ad_infop->ad_translate_flags & AM_MISC_8_P_TRANSLATE) {
- stpptr->am_pflags |= AM_PRIV_8_TRANS;
- }
-
- /* now that we've got the h/w info we set the initial format */
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_PLAY, psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_NO_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_WARN, "am_attach() "
- "couldn't set play data format: %d %d %d %d",
- psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc);
- goto error_unregister_both;
- }
-
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (am_set_gain(statep, apm_infop1,
- hw_info->play.channels, mpgain, mpbal, AUDIO_PLAY,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set mixer play gain");
- goto error_unregister_both;
- }
- } else {
- if (am_set_gain(statep, apm_infop1,
- hw_info->play.channels, pgain, pbalance, AUDIO_PLAY,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set compat play gain");
- goto error_unregister_both;
- }
- }
- } else {
- ASSERT(hw_info->play.sample_rate == 0);
- pgain = AUDIO_MIN_GAIN;
- pbalance = AUDIO_MID_BALANCE;
- }
- hw_info->play.gain = pgain;
- hw_info->play.balance = pbalance;
-
- /* now check the read capabilities, if the device supports it */
- if (doread) {
- if (am_attach_check(statep, ad_infop, stpptr, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- ATRACE("am_attach() am_attach_check() failed", 0);
- goto error_unregister_both;
- }
-
- /* get initial conditions */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- rsr = stpptr->am_save_rsr;
- } else {
- rsr = ad_infop->ad_defaults->record.sample_rate;
- }
-
- /* see if we need to translate to unsigned */
- if (ad_infop->ad_translate_flags & AM_MISC_16_R_TRANSLATE) {
- stpptr->am_rflags |= AM_PRIV_16_TRANS;
- }
- if (ad_infop->ad_translate_flags & AM_MISC_8_R_TRANSLATE) {
- stpptr->am_rflags |= AM_PRIV_8_TRANS;
- }
-
- /* now that we've got the h/w info we set the initial format */
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_RECORD, rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_NO_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set record data format: %d %d %d %d",
- rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc);
- goto error_unregister_both;
- }
-
- /* set the gains */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (am_set_gain(statep, apm_infop1,
- hw_info->record.channels, mrgain, mrbal,
- AUDIO_RECORD, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set mixer record gain");
- goto error_unregister_both;
- }
- } else {
- if (am_set_gain(statep, apm_infop1,
- hw_info->record.channels, rgain, rbalance,
- AUDIO_RECORD, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() "
- "couldn't set compat record gain");
- goto error_unregister_both;
- }
- }
- } else {
- ASSERT(hw_info->record.sample_rate == 0);
- rgain = AUDIO_MIN_GAIN;
- rbalance = AUDIO_MID_BALANCE;
- }
- hw_info->record.gain = rgain;
- hw_info->record.balance = rbalance;
-
- /* starting point for unmute */
- stpptr->am_save_hw_rgain = AUDIO_MID_GAIN;
-
- /*
- * Allocate mix and send buffers, but only if TRAD Codec and doing
- * this direction.
- */
- ASSERT(stpptr->am_mix_size == 0);
- ASSERT(stpptr->am_mix_buf == NULL);
- ASSERT(stpptr->am_send_size == 0);
- ASSERT(stpptr->am_send_buf == NULL);
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* allocate the mix buffer */
- if (dowrite) {
- stpptr->am_mix_buf = kmem_alloc(mixer_bufsize,
- KM_SLEEP);
- stpptr->am_mix_size = mixer_bufsize;
- }
-
- /* allocate the send buffer */
- if (doread) {
- stpptr->am_send_buf = kmem_alloc(mixer_bufsize,
- KM_SLEEP);
- stpptr->am_send_size = mixer_bufsize;
- }
- }
-
- /* create the devices for successive open()'s to clone off of */
- if ((minor = audio_sup_type_to_minor(AUDIO)) == AUDIO_FAILURE) {
- ATRACE("am_attach() sound,audio get minor failure", minor);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audio minor node failure");
- goto error_unregister_both;
- }
- minor += statep->as_dev_instance *
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
- if (ddi_create_minor_node(statep->as_dip, "sound,audio", S_IFCHR,
- minor, DDI_NT_AUDIO, 0) == DDI_FAILURE) {
- ATRACE("am_attach() sound,audio minor dev failure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audio minor node failure");
- goto error_unregister_both;
- }
-
- if ((minor = audio_sup_type_to_minor(AUDIOCTL)) == AUDIO_FAILURE) {
- ATRACE("am_attach() sound,audioctl get minor failure", minor);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audioctl minor node failure");
- goto error_rem_minor;
- }
- minor += statep->as_dev_instance *
- audio_sup_get_minors_per_inst(AUDIO_STATE2HDL(statep));
- if (ddi_create_minor_node(statep->as_dip, "sound,audioctl", S_IFCHR,
- minor, DDI_NT_AUDIO, 0) == DDI_FAILURE) {
- ATRACE("am_attach() sound,audioctl minor dev failure", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() create audioctl minor node failure");
- goto error_rem_minor;
- }
-
- ASSERT(hw_info->play.port == 0);
- ASSERT(hw_info->play.avail_ports == 0);
- ASSERT(hw_info->play.mod_ports == 0);
- /* turn on in the state structure those ports that will always be on */
- if (dowrite) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_PLAY,
- ad_infop->ad_defaults->play.port, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set play port: 0x%x",
- ad_infop->ad_defaults->play.port);
- goto error_rem_minor;
- } else {
- hw_info->play.port =
- ad_infop->ad_defaults->play.port;
- hw_info->play.avail_ports =
- ad_infop->ad_defaults->play.avail_ports;
- hw_info->play.mod_ports =
- ad_infop->ad_defaults->play.mod_ports;
- }
- }
- ASSERT(hw_info->record.port == 0);
- ASSERT(hw_info->record.avail_ports == 0);
- ASSERT(hw_info->record.mod_ports == 0);
- /* turn on in the state structure those ports that will always be on */
- if (doread) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_RECORD,
- ad_infop->ad_defaults->record.port, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set record port: 0x%x",
- ad_infop->ad_defaults->record.port);
- goto error_rem_minor;
- } else {
- hw_info->record.port =
- ad_infop->ad_defaults->record.port;
- hw_info->record.avail_ports =
- ad_infop->ad_defaults->record.avail_ports;
- hw_info->record.mod_ports =
- ad_infop->ad_defaults->record.mod_ports;
- }
- }
-
- if ((ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_IN2OUT) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, mgain, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set monitor gain: 0x%x", mgain);
- goto error_rem_minor;
- }
-
- if (dowrite && am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- ad_infop->ad_defaults->output_muted, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set output muted: 0x%x",
- ad_infop->ad_defaults->output_muted);
- goto error_rem_minor;
- }
-
- if (doread && (ad_infop->ad_assist_flags & AM_ASSIST_MIC) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_MIC_BOOST, AUDIO_RECORD,
- (ad_infop->ad_add_mode & AM_ADD_MODE_MIC_BOOST), NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't set mic boost: 0x%x",
- ad_infop->ad_add_mode);
- goto error_rem_minor;
- }
-
- /* set misc hardware state */
- if (dowrite) {
- hw_info->play.buffer_size =
- ad_infop->ad_defaults->play.buffer_size;
- } else {
- hw_info->play.buffer_size = 0;
- }
- ASSERT(hw_info->play.samples == 0);
- ASSERT(hw_info->play.eof == 0);
- ASSERT(hw_info->play.pause == 0);
- ASSERT(hw_info->play.error == 0);
- ASSERT(hw_info->play.waiting == 0);
- ASSERT(hw_info->play.minordev == 0);
- ASSERT(hw_info->play.open == 0);
- ASSERT(hw_info->play.active == 0);
- if (doread) {
- hw_info->record.buffer_size =
- ad_infop->ad_defaults->record.buffer_size;
- } else {
- hw_info->record.buffer_size = 0;
- }
- ASSERT(hw_info->record.samples == 0);
- ASSERT(hw_info->record.eof == 0);
- ASSERT(hw_info->record.pause == 0);
- ASSERT(hw_info->record.error == 0);
- ASSERT(hw_info->record.waiting == 0);
- ASSERT(hw_info->record.minordev == 0);
- ASSERT(hw_info->record.open == 0);
- ASSERT(hw_info->record.active == 0);
-
- hw_info->monitor_gain = mgain;
- hw_info->output_muted = ad_infop->ad_defaults->output_muted;
- hw_info->hw_features = ad_infop->ad_defaults->hw_features;
- hw_info->sw_features = ad_infop->ad_defaults->sw_features;
-
- if (mode == AM_MIXER_MODE) {
- hw_info->sw_features_enabled = AUDIO_SWFEATURE_MIXER;
- } else {
- hw_info->sw_features_enabled = 0;
- }
-
- /* create a single threaded task queue, this always succeeds */
- stpptr->am_taskq = audio_sup_taskq_create(AM_PRIV_TASKQ_NAME);
- if (stpptr->am_taskq == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() couldn't create the taskq, out of memory");
- goto error_rem_minor;
- }
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
-
- ATRACE_32("am_attach() returning", statep->as_dev_instance);
-
- return (AUDIO_SUCCESS);
-
-error_rem_minor:
- ATRACE("am_attach() failure, removing minor nodes", 0);
- /*
- * We don't use NULL because other APMs may own other minor devices
- * and we don't want to remove them from under them.
- */
- ddi_remove_minor_node(statep->as_dip, "sound,audio");
- ddi_remove_minor_node(statep->as_dip, "sound,audioctl");
-
-error_unregister_both:
- mutex_enter(&apm_infop2->apm_lock);
- apm_infop2->apm_private = NULL;
- mutex_exit(&apm_infop2->apm_lock);
- if (audio_sup_unregister_apm(statep, AUDIOCTL) == AUDIO_FAILURE) {
- ATRACE_32("am_attach() audio_sup_unregister_apm() "
- "AUDIOCTL failed", statep->as_dev_instance);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio_sup_unregister_apm() "
- "AUDIOCTL failed");
- }
-
-error_unregister:
- mutex_enter(&apm_infop1->apm_lock);
- apm_infop1->apm_private = NULL;
- mutex_exit(&apm_infop1->apm_lock);
- if (audio_sup_unregister_apm(statep, AUDIO) == AUDIO_FAILURE) {
- ATRACE_32("am_attach() audio_sup_unregister_apm() "
- "AUDIO failed", statep->as_dev_instance);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_attach() audio_sup_unregister_apm() "
- "AUDIO failed");
- }
-
-error_free_msg:
- freemsg(stpptr->am_sig_mp);
-
-error_free_private:
- /* destroy mutexes and cvs */
- mutex_destroy(&stpptr->am_mode_lock);
- mutex_destroy(&stpptr->am_ad_lock);
- cv_destroy(&stpptr->am_mode_cv);
- cv_destroy(&stpptr->am_ad_cv);
-
- ATRACE("am_attach() failure, freeing private structure", 0);
- if (stpptr->am_mix_buf) {
- kmem_free(stpptr->am_mix_buf, stpptr->am_mix_size);
- }
- if (stpptr->am_send_buf) {
- kmem_free(stpptr->am_send_buf, stpptr->am_send_size);
- }
- kmem_free(stpptr, sizeof (*stpptr));
-
-fail:
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
- ATRACE("am_attach() returning failure", 0);
-
- return (AUDIO_FAILURE);
-
-} /* am_attach() */
-
-/*
- * am_detach()
- *
- * Description:
- * Detach an instance of the mixer. Free up all data structures and
- * unregister the APM for both AUDIO and AUDIOCTL. We also remove
- * the device nodes. However it is possible another APM may still be
- * attached, so we are careful to only remove the audio and audioctl
- * devices.
- *
- * NOTE: This routine will never be called in the audio device
- * has any channels in use, so we don't need to check
- * for this.
- *
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * AUDIO_SUCCESS If the mixer was detached
- * AUDIO_FAILURE If the mixer couldn't be detached
- */
-int
-am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop1;
- audio_apm_info_t *apm_infop2;
- am_apm_private_t *stpptr;
- am_apm_persist_t *persistp;
- audio_info_t *hw_info;
-
- ATRACE_32("in am_detach()", cmd);
- ATRACE("am_detach() handle", handle);
- ASSERT(statep);
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- default:
- ATRACE_32("am_detach() unknown command failure", cmd);
- return (AUDIO_FAILURE);
- }
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr));
-
- /*
- * Remove only the AUDIO and AUDIOCTL minor nodes for this
- * dev_info. We don't want to free the nodes other APMs are
- * responsible for.
- */
- ddi_remove_minor_node(statep->as_dip, "sound,audio");
- ddi_remove_minor_node(statep->as_dip, "sound,audioctl");
-
- /* get rid of the private data structure */
- if ((apm_infop1 = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_detach() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_get_apm_info() AUDIO failed");
-
- goto fail;
- }
- if ((apm_infop2 =
- audio_sup_get_apm_info(statep, AUDIOCTL)) == NULL) {
- ATRACE("am_detach() audio_sup_get_apm_info() AUDIOCTL failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_get_apm_info() AUDIOCTL failed");
-
- goto fail;
- }
- /*
- * Both apm_info pointers use the same apm_private structure, so we
- * only need to clear it once.
- */
- stpptr = apm_infop1->apm_private;
- ASSERT(stpptr->am_channels == 0);
- ASSERT(stpptr->am_in_chs == 0);
- ASSERT(stpptr->am_out_chs == 0);
-
- /* save the current h/w state in persistent memory */
- hw_info = &stpptr->am_hw_info;
- persistp = stpptr->am_pstate;
- if (persistp->apm_mode == AM_MIXER_MODE) {
- persistp->apm_mpgain = hw_info->play.gain;
- persistp->apm_mpbal = hw_info->play.balance;
- persistp->apm_mrgain = hw_info->record.gain;
- persistp->apm_mrbal = hw_info->record.balance;
- }
- persistp->apm_pgain = hw_info->play.gain;
- persistp->apm_pbal = hw_info->play.balance;
- persistp->apm_pport = hw_info->play.port;
- persistp->apm_pmute = hw_info->output_muted;
- persistp->apm_rgain = hw_info->record.gain;
- persistp->apm_rbal = hw_info->record.balance;
- persistp->apm_rport = hw_info->record.port;
- persistp->apm_mgain = hw_info->monitor_gain;
-
- /* wait for the taskq to empty and then destroy it */
- audio_sup_taskq_wait(stpptr->am_taskq);
- audio_sup_taskq_destroy(stpptr->am_taskq);
-
- /* destroy mutexes and cvs */
- mutex_destroy(&stpptr->am_mode_lock);
- mutex_destroy(&stpptr->am_ad_lock);
- cv_destroy(&stpptr->am_mode_cv);
- cv_destroy(&stpptr->am_ad_cv);
-
- ASSERT(stpptr->am_sig_mp);
- freemsg(stpptr->am_sig_mp);
-
- if (stpptr->am_mix_buf) {
- ASSERT(stpptr->am_mix_size);
- kmem_free(stpptr->am_mix_buf, stpptr->am_mix_size);
- }
- if (stpptr->am_send_buf) {
- ASSERT(stpptr->am_send_size);
- kmem_free(stpptr->am_send_buf, stpptr->am_send_size);
- }
- kmem_free(stpptr, sizeof (*stpptr));
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
-
- mutex_enter(&apm_infop1->apm_lock);
- apm_infop1->apm_private = NULL;
- mutex_exit(&apm_infop1->apm_lock);
- mutex_enter(&apm_infop2->apm_lock);
- apm_infop2->apm_private = NULL;
- mutex_exit(&apm_infop2->apm_lock);
-
- if (audio_sup_unregister_apm(statep, AUDIO) == AUDIO_FAILURE) {
- ATRACE("am_detach() audio_sup_unregister_apm() "
- "AUDIO failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_unregister_apm() "
- "AUDIO failed");
- }
-
- if (audio_sup_unregister_apm(statep, AUDIOCTL) == AUDIO_FAILURE) {
- ATRACE("am_detach() audio_sup_unregister_apm() "
- "AUDIOCTL failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "detach() audio_sup_unregister_apm() "
- "AUDIOCTL failed");
- }
-
- ATRACE("am_detach() done", statep);
-
- return (AUDIO_SUCCESS);
-
-fail:
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr));
- return (AUDIO_FAILURE);
-
-} /* am_detach() */
-
-/*
- * am_get_audio()
- *
- * Description:
- * This routine directs the call to get audio depending on whether or
- * not the Codec is a traditional or multi-channel Codec. It also does
- * some error checking to make sure the call is valid.
- *
- * It is an error for the number of samples to not be modulo the
- * hardware's number of channels. The old diaudio driver would hang
- * the channel until it was closed. We throw away enough of the damaged
- * sample and press on.
- *
- * We support devices that accept only unsigned linear PCM by translating
- * the final data, if required.
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *buf The buffer to place the audio into
- * int channel For multi-channel Codecs this is the channel
- * that will be playing the sound.
- * int samples The number of samples to get
- *
- * Returns
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-int
-am_get_audio(audiohdl_t handle, void *buf, int channel, int samples)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- uint_t hw_channels;
- int mode;
- int rc;
-
- ATRACE_32("in am_get_audio() samples requested", samples);
- ASSERT(statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_get_audio() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "get_audio() "
- "audio_sup_get_apm_info() AUDIO failed, audio lost");
- return (AUDIO_FAILURE);
- }
-
- ad_infop = apm_infop->apm_ad_infop;
- stpptr = apm_infop->apm_private;
-
- /*
- * Make sure we don't ask for more data than the mixer can provide.
- * The mixer uses mixer_bufsize to allocate buffers so we must insure
- * that we don't try to mix too much and thus get into trouble.
- */
- if ((samples << AM_INT32_SHIFT) > mixer_bufsize) {
- samples = mixer_bufsize >> AM_INT32_SHIFT;
- ATRACE("am_get_audio() asking for too many samples, resetting",
- samples);
- }
-
- /* deal with multi-channel Codecs or regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_get_audio() calling am_get_audio_multi()", statep);
- ASSERT(channel != AUDIO_NO_CHANNEL);
- rc = am_get_audio_multi(statep, buf, channel, samples);
- ATRACE_32("am_get_audio() am_get_audio_multi() returning", rc);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ASSERT(channel == AUDIO_NO_CHANNEL);
-
- /* make sure the # of samples is modulo the # of H/W channels */
- hw_channels = stpptr->am_hw_pchs;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_get_audio() bad sample size", samples);
- samples -= samples % hw_channels;
- }
-
- mode = stpptr->am_pstate->apm_mode;
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_get_audio() "
- "calling am_get_audio_trad_mixer()", statep);
- rc = am_get_audio_trad_mixer(statep, apm_infop, buf,
- samples);
- ATRACE_32("am_get_audio() "
- "am_get_audio_trad_mixer() returning", rc);
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- ATRACE("am_get_audio() "
- "calling am_get_audio_trad_compat()", statep);
- rc = am_get_audio_trad_compat(statep, apm_infop, buf,
- samples);
- ATRACE_32("am_get_audio() "
- "am_get_audio_trad_compat() returning", rc);
- }
- }
-
- return (rc);
-
-} /* am_get_audio() */
-
-/*
- * am_hw_state_change()
- *
- * Description:
- * This routine provides feedback from the audio driver to the mixer
- * when a user has caused a state change. Usually this is by a button
- * or knob that the user presses or turns on a speaker or mic. Currently
- * support for this feedback is somewhat limited as we only support
- * gain, balance, and mute.
- *
- * NOTE: We don't include a channel argument because user input is
- * fairly limited, it is oriented towards the master hardware
- * device.
- *
- * NOTE: Unlike the ioctl()s, we don't increment acp_tq_cnt. acp_tq_cnt
- * is on a per channel basis and we aren't doing this work for any
- * one channel, but for the whole device. This means that there
- * aren't any close()s that are going to wait for these tasks to
- * complete.
- *
- * NOTE: Mute is a toggle from the current setting.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int cmd Command for update
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int value The value to scale
- * int sleep AUDIO_NO_SLEEP or AUDIO_SLEEP
- *
- * Returns:
- * AUDIO_SUCCESS Command queued up on the taskq
- * AUDIO_FAILURE Bad argument, can't allocate memory, etc
- */
-int
-am_hw_state_change(audiohdl_t handle, int cmd, int dir, int value, int sleep)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- am_state_ch_args_t *arg;
-
- ATRACE("in am_hw_state_change()", handle);
-
- /* make sure the handle is good */
- if (handle == NULL) {
- ATRACE("am_hw_state_change() bad handle", handle);
- return (AUDIO_FAILURE);
- }
-
- /* don't allow both play and record */
- if ((dir & AUDIO_BOTH) == AUDIO_BOTH) {
- ATRACE_32("am_hw_state_change() bad direction", dir);
- return (AUDIO_FAILURE);
- }
-
- /* don't allow both sleep and no sleep */
- if (sleep == (AUDIO_NO_SLEEP|AUDIO_SLEEP)) {
- ATRACE_32("am_hw_state_change() bad sleep", sleep);
- return (AUDIO_FAILURE);
- }
- if (sleep == AUDIO_SLEEP) {
- sleep = KM_SLEEP;
- } else {
- ASSERT(sleep == AUDIO_NO_SLEEP);
- sleep = KM_NOSLEEP;
- }
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_hw_state_change() "
- "audio_sup_get_apm_info() AUDIO failed", statep);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "am_hw_state_change() "
- "audio_sup_get_apm_info() AUDIO failed");
- return (AUDIO_FAILURE);
- }
- stpptr = apm_infop->apm_private;
-
- /* Check if we have a valid taskq */
- if (stpptr->am_taskq == NULL) {
- ATRACE("am_hw_state_change() taskq not setup", stpptr);
- return (AUDIO_FAILURE);
- }
-
- switch (cmd) {
- case AM_HWSC_SET_GAIN_ABS:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_BAL_ABS:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_GAIN_DELTA:
- /*FALLTHROUGH*/
- case AM_HWSC_SET_BAL_DELTA:
- /*FALLTHROUGH*/
- case AM_HWSC_MUTE_TOGGLE:
- /* does the h/w support the direction? */
- ad_infop = apm_infop->apm_ad_infop;
- if ((dir == AUDIO_PLAY &&
- !(ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_PLAY)) ||
- (dir == AUDIO_RECORD &&
- !(ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_RECORD))) {
- ATRACE_32("am_hw_state_change() dir !supported", dir);
- return (AUDIO_FAILURE);
- }
-
- /* allocate argument memory for taskq */
- if ((arg = kmem_alloc(sizeof (*arg), sleep)) == NULL) {
- ATRACE("am_hw_state_change() alloc failed", statep);
- return (AUDIO_FAILURE);
- }
- arg->asca_statep = statep;
- arg->asca_apm_infop = apm_infop;
- arg->asca_cmd = cmd;
- arg->asca_dir = dir;
- arg->asca_value = value;
-
- break;
- case AM_HWSC_ONLINE:
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags |= AM_PRIV_ON_LINE;
- mutex_exit(&apm_infop->apm_lock);
-
- return (AUDIO_SUCCESS);
- case AM_HWSC_OFFLINE:
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_ON_LINE;
- mutex_exit(&apm_infop->apm_lock);
-
- return (AUDIO_SUCCESS);
- default:
- ATRACE_32("am_hw_state_change() bad command", cmd);
- return (AUDIO_FAILURE);
- }
-
- /* schedule the task */
- if (audio_sup_taskq_dispatch(stpptr->am_taskq, am_hw_task,
- arg, sleep) == AUDIO_FAILURE) {
- kmem_free(arg, sizeof (*arg));
- ATRACE("am_hw_state_change() taskq sched failed", statep);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("am_hw_state_change() done", handle);
-
- return (AUDIO_SUCCESS);
-
-} /* am_hw_state_change() */
-
-/*
- * am_play_shutdown()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int channel For multi-stream Codecs this is the
- * stream to shutdown.
- *
- * Returns:
- * void
- */
-void
-am_play_shutdown(audiohdl_t handle, int channel)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
-
- ATRACE("in am_play_shutdown()", handle);
- ASSERT(statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_play_shutdown() audio_sup_get_apm_info() failed", 0);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "play_shutdown() audio_sup_get_apm_info() failed");
- return;
- }
- ad_infop = apm_infop->apm_ad_infop;
-
- /* deal with multi-channel Codecs vs. regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_play_shutdown() calling shutdown_multi()", ad_infop);
- am_play_shutdown_multi(handle, channel);
- ATRACE("am_play_shutdown() shutdown_multi() done", ad_infop);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ATRACE("am_play_shutdown() calling shutdown_trad()", ad_infop);
- am_play_shutdown_trad(handle, apm_infop);
- ATRACE("am_play_shutdown() shutdown_trad() done", ad_infop);
- }
-
- ATRACE("am_play_shutdown() returning", statep);
-
- return;
-
-} /* am_play_shutdown() */
-
-/*
- * am_send_audio()
- * This routine directs the call to send audio depending on whether or
- * not the Codec is a traditional or multi-channel Codec. It also does
- * some error checking to make sure the call is valid.
- *
- * It is an error for the number of samples to not be modulo the
- * hardware's number of channels. The old diaudio driver would hang
- * the channel until it was closed. We throw away enough of the damaged
- * sample and press on.
- *
- * We support devices that provide only unsigned linear PCM by translating
- * the data to signed before it is used.
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * sends. So it is samples at the hardware's sample rate.
- *
- * Description:
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * void *buf The buffer the audio is in
- * int channel For multi-channel Codecs this is the
- * channel that will be receiving the audio
- * int samples The number of samples to send
- *
- * Returns
- * void
- */
-void
-am_send_audio(audiohdl_t handle, void *buf, int channel, int samples)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- size_t size;
- uint_t hw_channels;
- int mode;
-
- ATRACE("in am_send_audio()", handle);
- ATRACE("am_send_audio() buf", buf);
- ATRACE("am_send_audio() channel", channel);
- ATRACE("am_send_audio() samples", samples);
- ASSERT(statep);
-
- /* reject processing 0 or less samples */
- if (samples <= 0 || samples > AM_MAX_SAMPLES) {
- ATRACE_32("am_send_audio() bad samples arg #1, returning",
- samples);
- return;
- }
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_send_audio() audio_sup_get_apm_info() AUDIO failed",
- statep);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "send_audio() audio_sup_get_apm_info() "
- "AUDIO failed, recorded audio lost");
- return;
- }
-
- ad_infop = apm_infop->apm_ad_infop;
-
- /* deal with multi-channel Codecs or regular Codecs */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- ATRACE("am_send_audio() calling am_send_audio_multi()", statep);
- ASSERT(channel != AUDIO_NO_CHANNEL);
- am_send_audio_multi(statep, apm_infop->apm_ad_infop, buf,
- channel, samples);
- ATRACE_32("am_send_audio() am_send_audio_multi() returning", 0);
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
- ASSERT(channel == AUDIO_NO_CHANNEL);
-
- /* make sure the # of samples is modulo the # of H/W channels */
- stpptr = apm_infop->apm_private;
- hw_channels = stpptr->am_hw_rchs;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_send_audio() bad sample size", samples);
- samples -= samples % hw_channels;
- ATRACE("am_send_audio() adjusted samples", samples);
- if (samples <= 0) {
- ATRACE_32("am_send_audio() bad samples arg #2",
- samples);
- return;
- }
- }
-
- /* make sure the send buffer is large enough */
- size = ((size_t)samples) << AM_TIMES_4_SHIFT;
- ATRACE("am_send_audio() size", size);
-
- mutex_enter(&apm_infop->apm_lock);
-
- if (stpptr->am_send_size < size) {
- ATRACE("am_send_audio() old am_send_buf",
- stpptr->am_send_buf);
- ATRACE("am_send_audio() old am_send_size",
- stpptr->am_send_size);
- if (stpptr->am_send_size) {
- kmem_free(stpptr->am_send_buf,
- stpptr->am_send_size);
- }
- stpptr->am_send_buf = kmem_alloc(size, KM_NOSLEEP);
- if (stpptr->am_send_buf == NULL) {
- stpptr->am_send_size = 0;
- mutex_exit(&apm_infop->apm_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "!mixer: send_audio_trad() "
- "couldn't allocate send buffer, audio "
- "lost");
- return;
- }
- stpptr->am_send_size = size;
- ATRACE("am_send_audio() new am_send_buf",
- stpptr->am_send_buf);
- ATRACE("am_send_audio() new am_send_size",
- stpptr->am_send_size);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /* convert to canonical format */
- am_convert_to_int(buf, stpptr->am_send_buf, samples,
- stpptr->am_hw_rprec, stpptr->am_hw_renc, stpptr->am_rflags);
-
- mode = stpptr->am_pstate->apm_mode;
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_send_audio() "
- "calling am_send_audio_trad_mixer()", statep);
- am_send_audio_trad_mixer(statep, apm_infop,
- stpptr->am_send_buf, samples);
- ATRACE_32("am_send_audio() "
- "am_send_audio_trad_mixer() returning", 0);
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- ATRACE("am_send_audio() "
- "calling am_send_audio_trad_compat()", statep);
- am_send_audio_trad_compat(statep, apm_infop,
- stpptr->am_send_buf, samples);
- ATRACE_32("am_send_audio() "
- "am_send_audio_trad_compat() returning", 0);
- }
- }
-
-} /* am_send_audio() */
-
-/*
- * am_get_src_data()
- *
- * Description:
- * This routine returns the PLAY or RECORD sample rate conversion
- * data structure that is saved in the channel's private data structure.
- *
- * Arguments:
- * srchdl_t handle SRC handle
- * int dir AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * void * Pointer to the sample rate conversion
- * structure
- */
-void *
-am_get_src_data(srchdl_t handle, int dir)
-{
- audio_ch_t *chptr = AM_SRC_HDL2CHPTR(handle);
- am_ch_private_t *chpptr = chptr->ch_private;
- void *data;
-
- ATRACE("in am_get_src_data()", chptr);
- ATRACE("am_get_src_data() chpptr", chpptr);
- ATRACE_32("am_get_src_data() dir", dir);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_get_src_data() PLAY returning",
- chpptr->acp_play_src_data);
- data = chpptr->acp_play_src_data;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- ATRACE("am_get_src_data() CAPTURE returning",
- chpptr->acp_rec_src_data);
- data = chpptr->acp_rec_src_data;
- }
-
- return (data);
-
-} /* am_get_src_data() */
-
-/*
- * am_set_src_data()
- *
- * Description:
- * This routine sets the PLAY or RECORD sample rate conversion
- * data structure pointer with the pointer passed in.
- *
- * Arguments:
- * srchdl_t handle SRC handle
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * void *data The sample rate conversion data
- *
- * Returns:
- * void
- */
-void
-am_set_src_data(srchdl_t handle, int dir, void *data)
-{
- audio_ch_t *chptr = AM_SRC_HDL2CHPTR(handle);
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_set_src_data()", chptr);
- ATRACE_32("am_set_src_data() dir", dir);
- ATRACE("am_set_src_data() data", data);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_set_src_data() setting PLAY", data);
- chpptr->acp_play_src_data = data;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- ATRACE("am_set_src_data() setting CAPTURE", data);
- chpptr->acp_rec_src_data = data;
- }
-
-} /* am_set_src_data() */
-
-/*
- * Private utilities used by this and other audio mixer files.
- */
-
-/*
- * am_ad_pause_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to pause
- *
- * Returns:
- * void
- */
-void
-am_ad_pause_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_pause_play()", statep);
- ATRACE_32("am_ad_pause_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_pause_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_pause_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_pause_play() calling ad_pause_play()", ad_infop);
- ad_infop->ad_entry->ad_pause_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_pause_play() ad_pause_play() done", ad_infop);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_pause_play() returning", 0);
-
-} /* am_ad_pause_play() */
-
-/*
- * am_ad_set_config()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set config
- * int command The configuration command
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int arg1 Command argument #1
- * int arg2 Command argument #2
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Configuration set
- * AUDIO_FAILURE Configuration not set
- */
-int
-am_ad_set_config(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int command, int dir, int arg1,
- int arg2, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_set_config()", statep);
- ATRACE_32("am_ad_set_config() stream", stream);
- ASSERT(statep);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_config() calling ad_set_config()", ad_infop);
- rc = ad_infop->ad_entry->ad_set_config(AUDIO_STATE2HDL(statep), stream,
- command, dir, arg1, arg2);
- ATRACE_32("am_ad_set_config() ad_set_config() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE_32("am_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* am_ad_set_config() */
-
-/*
- * am_ad_set_format()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Furthermore, if the device was active we call the proper start
- * routine. This kicks things off if the driver had to stop things
- * to change the format, but has a hard time restarting afterwards.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Sample rate to set
- * int channels Number of channels to set
- * int precision Precision to set
- * int encoding Encoding to set
- * int serialize Serialize access to audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Format set
- * AUDIO_FAILURE Format not set
- */
-int
-am_ad_set_format(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir, int sample_rate,
- int channels, int precision, int encoding, int serialize)
-{
- audio_info_t *hw_info = &stpptr->am_hw_info;
- int rc;
-
- ATRACE("in am_ad_set_format()", statep);
- ATRACE_32("am_ad_set_format() stream", stream);
- ASSERT(statep);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_format() calling ad_set_format()", ad_infop);
- rc = ad_infop->ad_entry->ad_set_format(AUDIO_STATE2HDL(statep), stream,
- dir, sample_rate, channels, precision, encoding);
- ATRACE_32("am_ad_set_format() ad_set_format() done", rc);
-
- if (dir == AUDIO_PLAY) {
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs != 0 && hw_info->play.active) {
- mutex_exit(&statep->as_lock);
- ATRACE("am_ad_set_format() restart play", hw_info);
- (void) ad_infop->ad_entry->ad_start_play(
- AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_set_format() restart play done", 0);
- } else {
- mutex_exit(&statep->as_lock);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs != 0 && hw_info->record.active) {
- mutex_exit(&statep->as_lock);
- ATRACE("am_ad_set_format() restart record", hw_info);
- (void) ad_infop->ad_entry->ad_start_record(
- AUDIO_STATE2HDL(statep), stream);
- ATRACE("am_ad_set_format() restart record done", 0);
- } else {
- mutex_exit(&statep->as_lock);
- }
- }
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_set_format() returning", rc);
-
- return (rc);
-
-} /* am_ad_set_format() */
-
-/*
- * am_ad_setup()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int flags Setup flags
- *
- * Returns:
- * AUDIO_SUCCESS Setup successful
- * AUDIO_FAILURE Setup failed
- */
-int
-am_ad_setup(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int flags)
-{
- int rc;
-
- ATRACE("in am_ad_setup()", statep);
- ATRACE_32("am_ad_setup() stream", stream);
- ASSERT(statep);
-
- /* if there isn't an ad_setup() routine then we just return success */
- if (ad_infop->ad_entry->ad_setup == NULL) {
- ATRACE("am_ad_setup() not defined, returning", statep);
- return (AUDIO_SUCCESS);
- }
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_setup() calling ad_setup()", ad_infop);
- rc = ad_infop->ad_entry->ad_setup(AUDIO_STATE2HDL(statep), stream,
- flags);
- ATRACE_32("am_ad_setup() ad_setup() done", rc);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_setup() returning", rc);
-
- return (rc);
-
-} /* am_ad_setup() */
-
-/*
- * am_ad_start_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to start play
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Start play successful
- * AUDIO_FAILURE Start play not successful
- */
-int
-am_ad_start_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_start_play()", statep);
- ATRACE_32("am_ad_start_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_start_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_ad_start_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_play() calling ad_start_play()", ad_infop);
- rc = ad_infop->ad_entry->ad_start_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_start_play() ad_start_play() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* am_ad_start_play() */
-
-/*
- * am_ad_start_record()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * record channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before record is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to start record
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS Start record successful
- * AUDIO_FAILURE Start record not successful
- */
-int
-am_ad_start_record(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int serialize)
-{
- int rc;
-
- ATRACE("in am_ad_start_record()", statep);
- ATRACE_32("am_ad_start_record() stream", stream);
- ASSERT(statep);
-
- /* make sure we can record */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs == 0) {
- ATRACE_32("am_ad_start_record() no record channels",
- stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_ad_start_record() record channels", stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- if (serialize) {
- am_serialize_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_record() calling ad_start_record()", ad_infop);
- rc = ad_infop->ad_entry->ad_start_record(AUDIO_STATE2HDL(statep),
- stream);
- ATRACE_32("am_ad_start_record() ad_start_record() done", rc);
-
- /* we're done, so release any waiting threads */
- if (serialize) {
- am_release_ad_access(stpptr);
- }
-
- ATRACE("am_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* am_ad_start_record() */
-
-/*
- * am_ad_stop_play()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * play channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before play is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to stop playing
- *
- * Returns:
- * void
- */
-void
-am_ad_stop_play(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_stop_play()", statep);
- ATRACE_32("am_ad_stop_play() stream", stream);
- ASSERT(statep);
-
- /* make sure we can play */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_out_chs == 0) {
- ATRACE_32("am_ad_stop_play() no playing channels",
- stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_stop_play() playing channels", stpptr->am_out_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_stop_play() calling ad_stop_play()", ad_infop);
- ad_infop->ad_entry->ad_stop_play(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_stop_play() ad_stop_play() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_stop_play() returning", stream);
-
-} /* am_ad_stop_play() */
-
-/*
- * am_ad_stop_record()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * We further restrict this call such that if there aren't any open
- * record channels we don't allow this call to succeed. This implies that
- * there has been at least one call to ad_setup() before record is started
- * and there is still an ad_teardown() call to come. This situation is
- * possible if only AUDIOCTL and no AUDIO channels are open and one of
- * the AUDIOCTL channels does an AUDIO_SETINFO to unpause.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to stop recording
- *
- * Returns:
- * void
- */
-void
-am_ad_stop_record(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream)
-{
- ATRACE("in am_ad_stop_record()", statep);
- ATRACE_32("am_ad_stop_record() stream", stream);
- ASSERT(statep);
-
- /* make sure we can record */
- mutex_enter(&statep->as_lock);
- if (stpptr->am_in_chs == 0) {
- ATRACE_32("am_ad_stop_record() no record channels",
- stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
- return;
- }
- ATRACE_32("am_ad_stop_record() record channels", stpptr->am_in_chs);
- mutex_exit(&statep->as_lock);
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_stop_record() calling ad_stop_record()", ad_infop);
- ad_infop->ad_entry->ad_stop_record(AUDIO_STATE2HDL(statep), stream);
- ATRACE_32("am_ad_stop_record() ad_stop_record() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_stop_record() returning", stream);
-
-} /* am_ad_stop_record() */
-
-/*
- * am_ad_teardown()
- *
- * Description:
- * The official way to call into the audio driver. This uses a CV
- * to ensure that only one call into the audio driver can be made
- * at any one time. Thus the audio driver doesn't have to worry about
- * serialization of the entry points.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * int stream Which stream to set format
- * int dir AUDIO_PLAY and/or AUDIO_RECORD
- *
- * Returns:
- * void
- */
-void
-am_ad_teardown(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir)
-{
- ATRACE("in am_ad_teardown()", statep);
- ATRACE_32("am_ad_teardown() stream", stream);
- ASSERT(statep);
-
- /* if there isn't an ad_teardown() routine then just return success */
- if (ad_infop->ad_entry->ad_teardown == NULL) {
- ATRACE("am_ad_teardown() not defined, returning", statep);
- return;
- }
-
- /* wait for all other calls into the audio driver to return */
- am_serialize_ad_access(stpptr);
-
- ATRACE("am_ad_teardown() calling ad_teardown()", ad_infop);
- ad_infop->ad_entry->ad_teardown(AUDIO_STATE2HDL(statep), stream, dir);
- ATRACE_32("am_ad_teardown() ad_teardown() done", stream);
-
- /* we're done, so release any waiting threads */
- am_release_ad_access(stpptr);
-
- ATRACE("am_ad_teardown() returning", stream);
-
-} /* am_ad_teardown() */
-
-/*
- * am_ck_channels()
- *
- * Description:
- * This routine checks to see if the number of channels passed is one of
- * the supported number of channels. If hw is set to B_TRUE then we check
- * against what the hardware can do. If it is set to B_FALSE then we check
- * against what we know how to translate.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * uint_t ch Number of channels to check
- * boolean_t hw If B_TRUE report the true H/W capability
- *
- * Returns:
- * AUDIO_SCCESS Valid number of channels
- * AUDIO_FAILURE Invalid number of channels
- */
-int
-am_ck_channels(am_ad_ch_cap_t *cptr, uint_t ch, boolean_t hw)
-{
- uint_t *iptr = cptr->ad_chs;
- int i;
-
- ATRACE("in am_ck_channels()", cptr);
-
- if (hw) {
- /* check against the hardware */
- for (i = 0; *iptr != 0; i++, iptr++) {
- if (*iptr == ch) {
- ATRACE("am_ck_channels() hw true succeeded",
- iptr);
- return (AUDIO_SUCCESS);
- }
- }
- ATRACE("am_ck_channels() hw true failed", cptr->ad_chs);
- return (AUDIO_FAILURE);
- }
-
- ASSERT(hw == B_FALSE);
-
- /* check against all legal number of channels */
- if (ch == AUDIO_CHANNELS_MONO || ch == AUDIO_CHANNELS_STEREO) {
- ATRACE_32("am_ck_channels() hw false succeeded", ch);
- return (AUDIO_SUCCESS);
- }
-
- ATRACE_32("am_ck_channels() hw false failed", hw);
- return (AUDIO_FAILURE);
-
-} /* am_ck_channels */
-
-/*
- * am_ck_combinations()
- *
- * Description:
- * This routine makes sure that the combination of encoding and
- * precision are legal. If hw is set to B_TRUE then we check against
- * what the hardware can do. If it is set to B_FALSE then we check
- * against what we know how to translate. We can translate between all
- * supported encoding and precision combinations.
- *
- * Arguments:
- * am_ad_cap_comb_t *comb Ptr to the play/rec legal combinations
- * int enc The encoding to check
- * int prec The precision to check
- * boolean_t hw If B_TRUE report the true H/W capability
- *
- * Returns:
- * AUDIO_SUCCESS It is a legal combination or value
- * AUDIO_FAILURE It is not a legal combination or value
- */
-int
-am_ck_combinations(am_ad_cap_comb_t *comb, int enc, int prec, boolean_t hw)
-{
- am_ad_cap_comb_t *ptr;
-
- ATRACE("in am_ck_combinations()", comb);
- ATRACE("am_ck_combinations() enc", enc);
- ATRACE("am_ck_combinations() prec", prec);
-
- if (hw) {
- /* check against the hardware */
- for (ptr = comb; ptr->ad_prec != 0; ptr++) {
- ATRACE_32("am_ck_combinations() enc", ptr->ad_enc);
- ATRACE_32("am_ck_combinations() prec", ptr->ad_prec);
- if (ptr->ad_prec == prec && ptr->ad_enc == enc) {
- ATRACE("am_ck_combinations() "
- "found a legal combination", ptr);
- return (AUDIO_SUCCESS);
- }
- }
- ATRACE("am_ck_combinations() not in combination array", 0);
- return (AUDIO_FAILURE);
- }
-
- ASSERT(hw == B_FALSE);
-
- /* check against all legal combinations */
- switch (prec) {
- case AUDIO_PRECISION_16:
- /* the only thing it can be is PCM */
- switch (enc) {
- case AUDIO_ENCODING_LINEAR:
- return (AUDIO_SUCCESS);
- default:
- return (AUDIO_FAILURE);
- }
- case AUDIO_PRECISION_8:
- /* we have more choices for 8-bit */
- switch (enc) {
- case AUDIO_ENCODING_LINEAR8:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_LINEAR:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_ULAW:
- /*FALLTHROUGH*/
- case AUDIO_ENCODING_ALAW:
- return (AUDIO_SUCCESS);
- default:
- return (AUDIO_FAILURE);
- }
- default:
- ATRACE_32("am_ck_combinations() illegal precision", prec);
- return (AUDIO_FAILURE);
- }
-
-} /* am_ck_combinations() */
-
-/*
- * am_ck_sample_rate()
- *
- * Description:
- * The sample rate information list is searched for the sample rate.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * int mode AM_MIXER_MODE or AM_COMPAT_MODE
- * int sr Sample rate to check
- *
- * Returns:
- * AUDIO_SUCCESS Sample rate found
- * AUDIO_FAILURE Invalid sample rate
- */
-int
-am_ck_sample_rate(am_ad_ch_cap_t *cptr, int mode, int sr)
-{
- am_ad_sample_rates_t *srs;
- uint_t *ptr;
-
- ATRACE("in am_ck_sample_rate()", cptr);
- ATRACE_32("am_ck_sample_rate() mode", mode);
- ATRACE_32("am_ck_sample_rate() sample rate", sr);
-
- if (mode == AM_MIXER_MODE) {
- srs = &cptr->ad_mixer_srs;
- } else {
- srs = &cptr->ad_compat_srs;
- }
- ptr = srs->ad_srs;
-
- /* check the passed in sample rate against the list */
- if (srs->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) {
- /*
- * We only check the limits and because we've already done the
- * sanity check in am_attach(). Therefore position 0 must be
- * the bottom limit and position 1 must be the top limit.
- */
- ATRACE_32("am_ck_sample_rate() limits, min sr", ptr[0]);
- ATRACE_32("am_ck_sample_rate() limits, max sr", ptr[1]);
- if (sr < ptr[0] || sr > ptr[1]) {
- ATRACE("am_ck_sample_rate() limit failed", srs);
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("am_ck_sample_rate() found in limit", sr);
- return (AUDIO_SUCCESS);
- }
-
- for (; *ptr != NULL; ptr++) {
- ATRACE_32("am_ck_sample_rate() not limits, test sr", *ptr);
- if (*ptr == sr) {
- ATRACE_32("am_ck_sample_rate() found", sr);
- return (AUDIO_SUCCESS);
- }
- if (*ptr > sr) {
- ATRACE_32("am_ck_sample_rate() past", sr);
- return (AUDIO_FAILURE);
- }
- }
-
- ATRACE("am_ck_sample_rate() failed", cptr->ad_sr_info);
-
- return (AUDIO_FAILURE);
-
-} /* am_ck_sample_rate */
-
-/*
- * am_safe_putnext()
- *
- * Description:
- * The usual reason for holding a lock across putnext() is we don't
- * want a channel to call qprocsoff() while we are building a STREAMS
- * message. This can happen because we have many different threads,
- * including kernel threads, that are running at the same time.
- *
- * If the channel has called qprocsoff() then we just return.
- *
- * CAUTION: This is only for the read queue.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * mblk_t *mp Pointer to the STREAMS message to send
- *
- * Returns:
- * void
- */
-void
-am_safe_putnext(audio_ch_t *chptr, mblk_t *mp)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_safe_putnext()", chptr);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- ASSERT(!MUTEX_HELD(&chptr->ch_statep->as_lock));
-
- /* make sure qprocsoff() hasn't been called */
- if (chpptr->acp_flags & AM_CHNL_QPROCSOFF) {
- /* it has, so cleanup and return */
- freemsg(mp);
-
- ATRACE("am_safe_putnext() msg not sent, qprocsoff()", chptr);
-
- return;
- }
-
- /* increment the number of putnext() calls outstanding */
- chpptr->acp_busy_cnt++;
- ATRACE_32("am_safe_putnext() inc acp_busy_cnt", chpptr->acp_busy_cnt);
-
- /* it's okay to release the lock and do the putnext() */
- mutex_exit(&chptr->ch_lock);
-
- putnext(RD(chptr->ch_qptr), mp);
- ATRACE("am_safe_putnext() putnext() done", chptr);
-
- /* now we can reaquire the lock and check to see if need to signal */
- mutex_enter(&chptr->ch_lock);
-
- chpptr->acp_busy_cnt--;
- ATRACE_32("am_safe_putnext() dec acp_busy_cnt", chpptr->acp_busy_cnt);
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_safe_putnext() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- ASSERT(!MUTEX_HELD(&chptr->ch_statep->as_lock));
-
-} /* am_safe_putnext() */
-
-/*
- * am_test_canputnext()
- *
- * Description:
- * The usual reason for holding a lock across putnext() is we don't
- * want a channel to call qprocsoff() while we are building a STREAMS
- * message. This can happen because we have many different threads,
- * including kernel threads, that are running at the same time.
- *
- * If the channel has called qprocsoff() then we just return.
- *
- * CAUTION: This is only for the read queue.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- *
- * Returns:
- * AUDIO_SUCCESS There is room in the next module's queue
- * AUDIO_FAILURE There is no room in the next module's queue
- * AM_CHNL_CLOSED The channel has been closed
- */
-int
-am_test_canputnext(audio_ch_t *chptr)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- int room;
-
- ATRACE("in am_test_canputnext()", chptr);
-
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
- mutex_enter(&chptr->ch_lock);
-
- /* make sure qprocsoff() hasn't been called */
- if (chpptr->acp_flags & AM_CHNL_QPROCSOFF) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_test_canputnext() channel closed", chptr);
- return (AM_CHNL_CLOSED);
- }
-
- /*
- * Increment the number of putnext() calls outstanding,
- * treat canputnext() like putnext().
- */
- chpptr->acp_busy_cnt++;
- ATRACE_32("am_test_canputnext() inc acp_busy_cnt",
- chpptr->acp_busy_cnt);
-
- mutex_exit(&chptr->ch_lock);
-
- room = canputnext(RD(chptr->ch_qptr));
-
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_busy_cnt--;
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_test_canputnext() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
- mutex_exit(&chptr->ch_lock);
-
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
-
- if (!room) {
- ATRACE("am_test_canputnext() returning failure", chptr);
- return (AUDIO_FAILURE);
- } else {
- ATRACE("am_test_canputnext() returning success", chptr);
- return (AUDIO_SUCCESS);
- }
-
-} /* am_test_canputnext() */
-
-
-/*
- * Private utilities used only by this file.
- */
-
-/*
- * am_attach_check()
- *
- * Description:
- * Verify all of the read/write parameters for the mixer. This includes
- * making sure the format configuration is legal. We also figure out all
- * the channel, encoding, and precision specifications and set flags. This
- * makes things a lot faster later on.
- *
- * NOTE: We don't set the am_hw_* members here so they'll still be set
- * to 0 when we return. Thus the first time am_set_format() is
- * called the hardware will be forced to be programmed.
- *
- * Arguments:
- * am_ad_info_t *ad_infop Ptr to the device's capabilities struct
- * am_apm_private_t *stpptr Pointer to private APM data
- * int dir AUDIO_PLAY or AUDIO_RECORD
- *
- * Returns:
- * AUDIO_SUCCESS The checks succeed
- * AUDIO_FAILURE The checks failed, device can't load
- */
-static int
-am_attach_check(audio_state_t *statep, am_ad_info_t *ad_infop,
- am_apm_private_t *stpptr, int dir)
-{
- am_ad_ch_cap_t *cptr = &ad_infop->ad_record;
- am_ad_cap_comb_t *comb;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_prinfo_t *prinfo;
- uint_t flags = 0;
- uint_t mch = 0; /* mixer channels */
- uint_t menc = 0; /* mixer encoding */
- uint_t mprec = 0; /* mixer precision */
- int csr; /* compat sample rate */
- int mode;
-
- ATRACE("in am_attach_check()", ad_infop);
- ASSERT(statep);
-
- if (dir == AUDIO_PLAY) {
- ATRACE("am_attach_check() dir PLAY", 0);
- cptr = &ad_infop->ad_play;
- comb = ad_infop->ad_play_comb;
- prinfo = &ad_infop->ad_defaults->play;
- } else if (dir == AUDIO_RECORD) {
- ATRACE("am_attach_check() dir RECORD", 0);
- cptr = &ad_infop->ad_record;
- comb = ad_infop->ad_rec_comb;
- prinfo = &ad_infop->ad_defaults->record;
- } else {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() illegal direction: %d", dir);
- return (AUDIO_FAILURE);
- }
-
- mode = stpptr->am_pstate->apm_mode;
-
- /*
- * Check the Audio Driver capabilities for good sample rate info. For
- * MIXER mode we get the default H/W sample rate. For COMPAT mode we
- * verify that the default is okay.
- *
- * Sanity check the record COMPAT mode sample rates.
- */
- if ((csr = am_ck_sample_rate_sanity(cptr, AM_COMPAT_MODE)) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT mode sample rate list");
- return (AUDIO_FAILURE);
- }
-
- /* make sure the default record SR for COMPAT mode is good */
- if (am_ck_sample_rate(cptr, AM_COMPAT_MODE, prinfo->sample_rate) ==
- AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT sample rate: %d",
- prinfo->sample_rate);
- return (AUDIO_FAILURE);
- }
-
- /* sanity check & find the best record MIXER mode sample rate */
- if (am_ck_sample_rate_sanity(cptr, AM_MIXER_MODE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad MIXER mode sample rate list");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT sample rate", prinfo->sample_rate);
- ATRACE_32("am_attach_check() COMPAT max sample rate", csr);
-
- /*
- * Figure out how many channel combinations we support. And also figure
- * out the best setting for MIXER mode. We try for stereo and then
- * settle for mono.
- */
- if (am_ck_channels(cptr, AUDIO_CHANNELS_STEREO, B_TRUE) ==
- AUDIO_SUCCESS) {
- flags |= AM_PRIV_CH_STEREO;
- mch = AUDIO_CHANNELS_STEREO;
- }
- if (am_ck_channels(cptr, AUDIO_CHANNELS_MONO, B_TRUE) ==
- AUDIO_SUCCESS) {
- flags |= AM_PRIV_CH_MONO;
- if (mch == 0) {
- mch = AUDIO_CHANNELS_MONO;
- }
- }
- ATRACE_32("am_attach_check() MIXER record channels", mch);
-
- /* make sure we have at least one of these set */
- if (!(flags & (AM_PRIV_CH_STEREO|AM_PRIV_CH_MONO))) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad channels list");
- return (AUDIO_FAILURE);
- }
-
- /* make sure the COMPAT mode default channel is legal */
- if (prinfo->channels != AUDIO_CHANNELS_MONO &&
- prinfo->channels != AUDIO_CHANNELS_STEREO) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT record channels list");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT channels", prinfo->channels);
-
- /*
- * Now check all possible encoding and precision combinations and
- * set flags to make translations easier later on. We also figure
- * out the best settings for the mixer. We prefer 16-bit linear PCM,
- * but we'll take whatever we can get.
- */
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR, AUDIO_PRECISION_16,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_16_PCM;
- mprec = AUDIO_PRECISION_16;
- menc = AUDIO_ENCODING_LINEAR;
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_PCM;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_LINEAR;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_LINEAR8, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_PCM;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_LINEAR8;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_ULAW, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_ULAW;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_ULAW;
- }
- }
- if (am_ck_combinations(comb, AUDIO_ENCODING_ALAW, AUDIO_PRECISION_8,
- B_TRUE) == AUDIO_SUCCESS) {
- flags |= AM_PRIV_8_ALAW;
- if (mprec == 0) {
- mprec = AUDIO_PRECISION_8;
- menc = AUDIO_ENCODING_ALAW;
- }
- }
- ATRACE_32("am_attach_check() MIXER precision", mprec);
- ATRACE_32("am_attach_check() MIXER encoding", menc);
-
- /* make sure we got the mixer settings, if we didn't then bad list */
- if (mprec == 0) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad combinations list");
- return (AUDIO_FAILURE);
- }
-
- /* now double check a default COMPAT mode configuration */
- if (am_ck_combinations(comb, prinfo->encoding, prinfo->precision,
- B_FALSE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "attach_check() bad COMPAT combinations defaults");
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_attach_check() COMPAT precision", prinfo->precision);
- ATRACE_32("am_attach_check() COMPAT encoding", prinfo->encoding);
-
- /*
- * Initialize the Codec's state. The sample rate is always set to
- * 0 which forces am_set_format() to program the Codec the first
- * time it is called for play and record.
- */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.sample_rate = 0;
- hw_info->play.channels = mch;
- hw_info->play.precision = mprec;
- hw_info->play.encoding = menc;
- } else {
- hw_info->record.sample_rate = 0;
- hw_info->record.channels = mch;
- hw_info->record.precision = mprec;
- hw_info->record.encoding = menc;
- }
- } else {
- if (dir == AUDIO_PLAY) {
- hw_info->play.sample_rate = 0;
- hw_info->play.channels = prinfo->channels;
- hw_info->play.precision = prinfo->precision;
- hw_info->play.encoding = prinfo->encoding;
- } else {
- hw_info->record.sample_rate = 0;
- hw_info->record.channels = prinfo->channels;
- hw_info->record.precision = prinfo->precision;
- hw_info->record.encoding = prinfo->encoding;
- }
- }
-
- /* initialize the saved state for when we go from COMPAT->MIXER mode */
- if (dir == AUDIO_PLAY) {
- /* once these get set they are set the same for life */
- stpptr->am_pflags |= flags;
- stpptr->am_save_psr = csr;
- stpptr->am_hw_pchs = mch;
- stpptr->am_hw_pprec = mprec;
- stpptr->am_hw_penc = menc;
- } else {
- /* once these get set they are set the same for life */
- stpptr->am_rflags |= flags;
- stpptr->am_save_rsr = csr;
- stpptr->am_hw_rchs = mch;
- stpptr->am_hw_rprec = mprec;
- stpptr->am_hw_renc = menc;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_attach_check() */
-
-/*
- * am_ck_sample_rate_sanity()
- *
- * Description:
- * Sanity check the sample rate list to make sure it is good. That
- * means it is ordered from smallest to largest. The largest sample
- * rate is returned if the list is okay.
- * AUDIO_FAILURE is returned.
- *
- * NOTE: The sample rate conversion information is specific to the routines
- * that perform the conversions. Therefore the audio mixer doesn't
- * check them for sanity. It could be done by creating another
- * call in am_ad_src_entry_t, but thorough testing is all that
- * is really needed.
- *
- * Arguments:
- * am_ad_ch_cap_t *cptr Pointer to the play/record capability struct
- * int mode AM_MIXER_MODE or AM_COMPAT_MODE
- *
- * Returns:
- * AUDIO_SUCCESS Sample rate list okay
- * AUDIO_FAILURE Bad sample rate list
- */
-static int
-am_ck_sample_rate_sanity(am_ad_ch_cap_t *cptr, int mode)
-{
- am_ad_sample_rates_t *srs;
- uint_t *ptr;
- uint_t big = 0;
- int i;
-
- ATRACE("in am_ck_sample_rate_sanity()", cptr);
- ATRACE_32("am_ck_sample_rate_sanity() mode", mode);
-
- if (mode == AM_MIXER_MODE) {
- srs = &cptr->ad_mixer_srs;
- } else {
- srs = &cptr->ad_compat_srs;
- }
- ptr = srs->ad_srs;
-
-
- /* do a sanity check on the list, it must be in increasing order */
- for (i = 0; *ptr != NULL; ptr++, i++) {
- if (*ptr > big) {
- big = *ptr;
- } else {
- ATRACE_32("am_ck_sample_rate_sanity() bad order, big",
- big);
- ATRACE_32("am_ck_sample_rate_sanity() *ptr", *ptr);
- return (AUDIO_FAILURE);
- }
- }
-
- /* if limits then there should be only two samples */
- if ((srs->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) && i != 2) {
- ATRACE_32("am_ck_sample_rate_sanity() "
- "too many samples for limits", i);
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("am_ck_sample_rate_sanity() found highest sample rate", big);
-
- return (big);
-
-} /* am_ck_sample_rate_sanity() */
-
-/*
- * am_convert_to_format()
- *
- * Description:
- * This routine takes the source buffer, which is 32-bit integers,
- * and converts it to whatever format the destination buffer is.
- * While the source buffer is a 32-bit buffer, the data is really
- * 16-bits. We use 32-bits to make sure we can sum audio streams
- * without loosing bits. When this routine is called we clip and
- * then convert the data. This includes doing any required translations.
- *
- * Other routines deal with the channel <--> channel conversion.
- * In addition the audio is already sample rate converted, if it is
- * needed. If the result needs to be unsigned PCM then we do that
- * conversion.
- *
- * The supported conversions are:
- * 32-bit signed linear -> 16-bit clipped signed linear
- * 32-bit signed linear -> 8-bit u-law
- * 32-bit signed linear -> 8-bit A-law
- * 32-bit signed linear -> 8-bit signed linear
- *
- * We also support translating to unsigned PCM for 8-bit and 16-bit linear.
- *
- * Arguments:
- * int *src Ptr to the src buffer, data to convert
- * void *dest Ptr to the dest buffer, for converted
- * data
- * int samples The number of samples to convert
- * int precision The precision of the output buffer
- * int encoding The encoding of the output buffer
- * int flags Flags, including AM_PRIV_8/16_TRANS
- *
- * Returns:
- * none
- */
-static void
-am_convert_to_format(int *src, void *dest, int samples, int precision,
- int encoding, int flags)
-{
- int val;
-
- ATRACE_32("in am_convert_to_format()", samples);
- ATRACE_32("am_convert_to_format() precision", precision);
- ATRACE_32("am_convert_to_format() encoding", encoding);
-
- /* this should have been stopped earlier */
- ASSERT(precision != AUDIO_PRECISION_16 ||
- encoding == AUDIO_ENCODING_LINEAR);
-
- /* make sure we have work to do */
- if (samples == 0) {
- ATRACE("am_convert_to_format() "
- "no samples to convert, returning", 0);
- return;
- }
-
- ATRACE_32("am_convert_to_format() NON-Linearize Audio", samples);
-
- if (precision == AUDIO_PRECISION_16) {
- int16_t *dptr = (int16_t *)dest;
-
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- if (flags & AM_PRIV_16_TRANS) {
- /* convert for unsigned int hardware */
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- val += -INT16_MIN;
- *dptr++ = (int16_t)val;
- }
- } else {
- /* hardware is signed */
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- *dptr++ = INT16_MAX;
- } else if (val < INT16_MIN) {
- *dptr++ = INT16_MIN;
- } else {
- *dptr++ = (int16_t)val;
- }
- }
- }
- ATRACE("am_convert_to_format() 16-bit linear done", 0);
- } else { /* end 16-bit, begin 8-bit */
- uint8_t *dptr = (uint8_t *)dest;
-
- ASSERT(precision == AUDIO_PRECISION_8);
-
- if (encoding == AUDIO_ENCODING_LINEAR8 ||
- (flags & AM_PRIV_8_TRANS)) {
- ATRACE_32(
- "am_convert_to_format() 8-bit unsigned linear",
- samples);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)((val >> AM_256_SHIFT) -
- INT8_MAX);
- }
- } else if (encoding == AUDIO_ENCODING_LINEAR) {
- ATRACE_32("am_convert_to_format() 8-bit signed linear",
- samples);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)(val >> AM_256_SHIFT);
- }
- } else { /* 8-bit U/A-Law */
- uint8_t *cptr;
- int shift;
-
- if (encoding == AUDIO_ENCODING_ULAW) {
- ATRACE("am_convert_to_format() 8-bit U-Law", 0);
- cptr = &_14linear2ulaw8[G711_ULAW_MIDPOINT];
- shift = 2;
- } else {
- ATRACE("am_convert_to_format() 8-bit A-Law", 0);
- ASSERT(encoding == AUDIO_ENCODING_ALAW);
- cptr = &_13linear2alaw8[G711_ALAW_MIDPOINT];
- shift = 3;
- }
-
- ATRACE_32("am_convert_to_format() 8-bit U/A-Law",
- encoding);
-
- for (; samples--; ) {
- val = *src++;
- if (val > INT16_MAX) {
- val = INT16_MAX;
- } else if (val < INT16_MIN) {
- val = INT16_MIN;
- }
- *dptr++ = (uint8_t)cptr[val >> shift];
- }
- }
- ATRACE("am_convert_to_format() 8-bit done", 0);
- }
-
- ATRACE_32("am_convert_to_format() done", encoding);
-
-} /* am_convert_to_format() */
-
-/*
- * am_get_audio_multi()
- *
- * Description:
- * This routine is used by multi-channel Codecs to get a single stream
- * of audio data for an individual channel.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * void *buf The buffer to place the audio into
- * int channel The device channel number.
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_multi(audio_state_t *statep, void *buf, int channel, int samples)
-{
- audio_ch_t *chptr = &statep->as_channels[channel];
- am_ch_private_t *chpptr;
- audio_info_t *info;
- int hw_channels;
- int ret_val;
-
- ATRACE("in am_get_audio_multi()", statep);
-
- ASSERT(statep);
- ASSERT(chptr->ch_info.ch_number == channel);
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /*
- * The channel may have been closed while we waited on the mutex.
- * So once we get it we make sure the channel is still valid. We also
- * make sure it's an AUDIO channel.
- */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
-
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.pid == 0 || chptr->ch_info.dev_type != AUDIO ||
- chpptr == NULL || ((chpptr->acp_flags & AM_CHNL_OPEN) == 0) ||
- (chpptr->acp_flags & AM_CHNL_QPROCSOFF) || info == NULL) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_multi() channel closed", chptr);
- return (AUDIO_FAILURE);
- }
-
- /* skip if the channel is paused */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_multi() channel paused", statep);
- return (0);
- }
-
- /* make sure the number of samples is module the # of channels */
- hw_channels = info->play.channels;
- if (hw_channels != AUDIO_CHANNELS_MONO &&
- (samples % hw_channels) != 0) {
- ATRACE_32("am_get_audio_multi() bad sample size", samples);
- samples -= samples % hw_channels;
- }
-
- /* get "samples" worth of data */
- ATRACE("am_get_audio_multi() calling am_get_samples()", chptr);
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples, buf, AM_COMPAT_MODE);
- chpptr->acp_busy_cnt--;
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- ATRACE_32("am_get_audio_multi() am_get_samples() failed",
- ret_val);
- goto done;
- }
-
- ATRACE_32("am_get_audio_multi() am_get_samples() succeeded", ret_val);
-
- /* XXX we need to convert to the hardware format */
-
-done:
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_multi() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_multi() done", buf);
-
- return (ret_val);
-
-} /* am_get_audio_multi() */
-
-/*
- * am_get_audio_trad_compat()
- *
- * Description:
- * This routine is used by traditional Codecs in COMPAT mode. The
- * audio samples are placed directly into the buffer provided by the
- * Audio Driver. Once one playing channel is found the search ends,
- * no reason to waste more time.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instances' state
- * audio_apm_info_t *apm_infop Personality module data struct
- * void *buf The buf to place the audio into
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop,
- void *buf, int samples)
-{
- audio_ch_t *chptr;
- audio_info_t *info;
- am_ch_private_t *chpptr;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- int i;
- int max_chs;
- int ret_val;
- size_t size = samples << AM_INT32_SHIFT;
-
- ATRACE("in am_get_audio_trad_compat()", statep);
-
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- /* go through the chs looking for the only playing AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is writing */
- if (!chpptr->acp_writing) {
- ATRACE("am_get_audio_trad_compat() not playing",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- return (0);
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE_32("am_get_audio_trad_compat() found channel", i);
- break;
- }
- if (i >= max_chs) {
- ATRACE("am_get_audio_trad_compat() done, no play channel", buf);
- return (0);
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /*
- * We had to free the lock above to make warlock happy. Unfortunately
- * it's possible that the channel closed between releasing and
- * reacquiring the lock. So we have to check again.
- */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO || chptr->ch_info.pid == 0 ||
- chpptr == NULL || (chpptr->acp_flags & AM_CHNL_QPROCSOFF)) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() ch closed on us", chptr);
- return (0);
- }
-
- /* make sure the buffer is big enough */
- if (chpptr->acp_psb_size < size) {
- ATRACE_32("am_get_audio_trad_compat() freeing buffer",
- chpptr->acp_psb_size);
- if (chpptr->acp_play_samp_buf) {
- /* free the old buffer */
- kmem_free(chpptr->acp_play_samp_buf,
- chpptr->acp_psb_size);
- }
- chpptr->acp_play_samp_buf = kmem_alloc(size, KM_NOSLEEP);
- if (chpptr->acp_play_samp_buf == NULL) {
- ATRACE_32("am_get_audio_trad_compat() "
- "kmem_alloc() play_samp_buf failed", i);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_get_audio_trad_compat() "
- "sample buffer %d not allocated", i);
- chpptr->acp_psb_size = 0;
- mutex_exit(&chptr->ch_lock);
- return (0);
- }
- chpptr->acp_psb_size = size;
- }
-
- ATRACE_32("am_get_audio_trad_compat() calling am_get_samples()",
- samples);
-
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples, chpptr->acp_play_samp_buf,
- AM_COMPAT_MODE);
- chpptr->acp_busy_cnt--;
-
- ATRACE_32("am_get_audio_trad_compat() am_get_samples() succeeded",
- ret_val);
-
- /* now we can see how well the am_get_samples() call did */
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- ATRACE_32("am_get_audio_trad_compat() am_get_samples() failed",
- ret_val);
- goto done;
- }
-
- /* now convert to the format the audio device uses */
- am_convert_to_format(chpptr->acp_play_samp_buf, buf, ret_val,
- stpptr->am_hw_pprec, stpptr->am_hw_penc, stpptr->am_pflags);
-
-done:
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_trad_compat() sending cv_signal()", chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_trad_compat() done", buf);
-
- return (ret_val);
-
-} /* am_get_audio_trad_compat() */
-
-/*
- * am_get_audio_trad_mixer()
- *
- * Description:
- * This routine is used by traditional Codecs in MIXER mode to get
- * multiple streams of audio data and mixing them down into one stream
- * for the Codec. play_samp_buf is used to get audio samples. These
- * samples are then mixed into the mix buffer. When all playing audio
- * channels are mixed we convert to the proper output format, along with
- * applying gain and balance, if needed.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instances' state
- * audio_apm_info_t *apm_infop Personality module data struct
- * void *buf The buf to place the audio into
- * int samples The number of samples to get
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * wants. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * >= 0 The number of samples transferred to the buffer
- * AUDIO_FAILURE An error has occurred
- */
-static int
-am_get_audio_trad_mixer(audio_state_t *statep, audio_apm_info_t *apm_infop,
- void *buf, int samples)
-{
- audio_ch_t *chptr;
- audio_info_t *info;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info;
- am_ch_private_t *chpptr;
- int *mix_dest;
- int *mix_src;
- size_t size = samples << AM_INT32_SHIFT;
- uint_t hw_channels = stpptr->am_hw_pchs;
- int balance;
- int i;
- int l_gain;
- int r_gain;
- int max_chs;
- int max_ret_val = 0;
- int ret_val;
-
- ATRACE("in am_get_audio_trad_mixer()", statep);
- ATRACE_32("am_get_audio_trad_mixer() samples", samples);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- hw_info = apm_infop->apm_ad_state;
-
- /* make sure the mix buffer is large enough */
- if (stpptr->am_mix_size < size) {
- /* mix buffer too small, adjust sample request */
- ATRACE_32("am_get_audio_trad_mixer() mix buffer too small",
- stpptr->am_mix_size);
- ATRACE_32("am_get_audio_trad_mixer() adjust num samples from",
- samples);
- samples = stpptr->am_mix_size >> AM_INT32_SHIFT;
- ATRACE_32("am_get_audio_trad_mixer() num samples now set to",
- samples);
- }
-
- /* zero the mix buffer, no reason to zero the whole buffer */
- bzero(stpptr->am_mix_buf, size);
-
- /* go through the chs looking for each AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- (chptr->ch_info.dev_type != AUDIO) ||
- (chptr->ch_info.pid == 0)) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
-
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_QPROCSOFF) ||
- (!chpptr->acp_writing)) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_mixer() not valid", chpptr);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->play.pause) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- ATRACE_32("am_get_audio_trad_mixer() found channel", i);
-
- info = chptr->ch_info.info;
-
- /* make sure the buffer is big enough */
- if (chpptr->acp_psb_size < size) {
-
- ATRACE_32("am_get_audio_trad_mixer() freeing buffer",
- chpptr->acp_psb_size);
- if (chpptr->acp_play_samp_buf) {
- /* free the old buffer */
- kmem_free(chpptr->acp_play_samp_buf,
- chpptr->acp_psb_size);
- }
- chpptr->acp_play_samp_buf =
- kmem_alloc(size, KM_NOSLEEP);
- if (chpptr->acp_play_samp_buf == NULL) {
- ATRACE_32("am_get_audio_trad_mixer() "
- "kmem_alloc() play_samp_buf failed", i);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_WARN,
- "am_get_audio_trad_mixer() "
- "sample buffer %d not allocated", i);
- chpptr->acp_psb_size = 0;
- mutex_exit(&chptr->ch_lock);
- continue;
- }
- chpptr->acp_psb_size = size;
- }
-
- /* get "samples" worth of audio */
- ATRACE_32("am_get_audio_trad_mixer() calling am_get_samples()",
- samples);
-
- chpptr->acp_busy_cnt++;
- ret_val = am_get_samples(chptr, samples,
- chpptr->acp_play_samp_buf, AM_MIXER_MODE);
- chpptr->acp_busy_cnt--;
-
- ATRACE_32("am_get_audio_trad_mixer() "
- "am_get_samples() succeeded", ret_val);
-
- /* now we can see how well the am_get_samples() call did */
- if (ret_val == AUDIO_FAILURE || ret_val == 0) {
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
- ATRACE_32("am_get_audio_trad_mixer() "
- "am_get_samples() failed", ret_val);
- continue;
- }
-
-
- /* we return the maximum # of samples found & processed */
- if (ret_val > max_ret_val) {
- /* update to a new value */
- max_ret_val = ret_val;
- ATRACE_32("am_get_audio_trad_mixer() "
- "updated max_ret_val", max_ret_val);
- }
-
- /* mix this channel into the mix buffer */
- mix_src = chpptr->acp_play_samp_buf;
- mix_dest = stpptr->am_mix_buf;
- ATRACE("am_get_audio_trad_mixer() mix_src before", mix_src);
- ATRACE("am_get_audio_trad_mixer() mix_dest before", mix_dest);
- /* apply gain and balance while summing */
- if (hw_channels == AUDIO_CHANNELS_MONO) {
- l_gain = info->play.gain;
-
- for (; ret_val; ret_val--) {
- *mix_dest++ +=
- (*mix_src++ * l_gain) >> AM_MAX_GAIN_SHIFT;
- }
- } else {
- ASSERT(hw_channels == AUDIO_CHANNELS_STEREO);
-
- l_gain = r_gain = info->play.gain;
- balance = info->play.balance;
-
- if (balance < AUDIO_MID_BALANCE) {
- /* leave l gain alone and scale down r gain */
- r_gain = (r_gain * balance) >> 5;
- } else if (balance > AUDIO_MID_BALANCE) {
- /* leave r gain alone and scale down l gain */
- l_gain = (l_gain * (64 - balance)) >> 5;
- }
-
- for (; ret_val; ret_val -= 2) {
- *mix_dest++ +=
- (*mix_src++ * l_gain) >> AM_MAX_GAIN_SHIFT;
- *mix_dest++ +=
- (*mix_src++ * r_gain) >> AM_MAX_GAIN_SHIFT;
- }
- }
-
- if ((chpptr->acp_busy_cnt == 0) &&
- (chpptr->acp_flags & AM_CHNL_SIGNAL_NEEDED)) {
- ATRACE("am_get_audio_trad_mixer() sending cv_signal()",
- chptr);
- cv_signal(&chptr->ch_cv);
- }
-
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_get_audio_trad_mixer() mix_src after", mix_src);
- ATRACE("am_get_audio_trad_mixer() mix_dest after", mix_dest);
-
- ATRACE_32("am_get_audio_trad_mixer() ret_val", ret_val);
- ATRACE_32("am_get_audio_trad_mixer() max_ret_val", max_ret_val);
-
- ATRACE("am_get_audio_trad_mixer() going again", chptr);
- }
-
- /* now convert into the format the hardware needs */
- ATRACE("am_get_audio_trad_mixer() calling am_convert_to_format()",
- stpptr->am_mix_buf);
- am_convert_to_format(stpptr->am_mix_buf, buf, max_ret_val,
- stpptr->am_hw_pprec, stpptr->am_hw_penc, stpptr->am_pflags);
-
- /* update hardware sample count */
- hw_info->play.samples += max_ret_val / stpptr->am_hw_pchs;
-
- ATRACE("am_get_audio_trad_mixer() done", buf);
-
- return (max_ret_val);
-
-} /* am_get_audio_trad_mixer() */
-
-/*
- * am_get_samples()
- *
- * Description:
- * This routine takes the first message off the channel's queue. It
- * then takes audio data until the requested number of samples has
- * been reached or there are no more samples. If the message isn't
- * empty it is put back onto the message queue.
- *
- * If the channel is muted then the requested number of samples is
- * updated in the buffer, the pointer for the message is advanced and
- * the buffer is zeroed, filling it with silence.
- *
- * If the "mode" argument is set to AM_COMPAT_MODE then the data size
- * is set by the channel's info structure. Otherwise it is set to the
- * size of an integer. Because multi-stream devices get raw data,
- * am_get_audio_multi() calls this with AM_COMPAT_MODE set.
- *
- * Keeping track of samples is complicated. When a complete message has
- * been played info->play.samples is incremented by the number of sample
- * frames in the original message. That way we don't build up errors by
- * approximating the sample rate converted sample frames. As each chunk
- * of samples is retrieved to be played we add this amount to
- * acp_psamples_c, the running count. Then the next time that this routine
- * is called the amount in acp_psamples_c is added to acp_psamples_p,
- * the partial count. This causes the delay between when the samples
- * are placed into the buffer and when it is actually played.
- * acp_psamples_p is used by am_fix_info() to adjust info->play.samples
- * in between full messages, including for sample rate conversion.
- *
- * No conversions are done in this routine.
- *
- * CAUTION: The channel must be locked before this routine is called.
- *
- * NOTE: The variable "samples" is the number of samples returned
- * ultimately to the hardware.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel's state structure
- * int samples The number of samples to get
- * void *buf The buffer to put the samples into
- * int mode Mixer mode
- *
- * Returns:
- * 0 -> samples The number of samples retrieved
- * AUDIO_FAILURE There was an error getting samples
- */
-static int
-am_get_samples(audio_ch_t *chptr, int samples, void *buf, int mode)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_data_t *data;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_info_t *info = chptr->ch_info.info;
-#ifdef FLOW_CONTROL
- queue_t *q;
-#endif
- size_t orig_size;
- int *bptr = buf;
- int *eptr;
- int *pstart;
- int *sptr;
- boolean_t active_signal = B_FALSE;
- boolean_t empty = B_FALSE;
- boolean_t mute;
- boolean_t EOF_processed = B_FALSE;
- uint_t ret_samples = 0;
- int bytes_needed;
- int count;
- int EOF_count;
- int hw_channels = stpptr->am_hw_pchs;
-
- ATRACE("in am_get_samples()", chptr);
- ATRACE_32("am_get_samples() samples", samples);
- ATRACE("am_get_samples() buffer", buf);
-
- ASSERT(statep);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* do this now where it's easier */
- mute = info->output_muted;
- if (mute) {
- /* we return zeros */
- bytes_needed = samples << AM_INT32_SHIFT;
- ATRACE("am_get_samples() bzero", buf);
- bzero(buf, bytes_needed);
- }
-
- /* update played samples */
- if (chpptr->acp_psamples_f) {
- chpptr->acp_psamples_p = 0;
- }
-
- info->play.samples += chpptr->acp_psamples_f;
- chpptr->acp_psamples_p += chpptr->acp_psamples_c;
-
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_c = 0;
-
- /* go through as many buffers as we need to get the samples */
- for (; samples > 0; ) {
- if (!(chpptr->acp_flags & AM_CHNL_OPEN)) {
- ATRACE_32("am_get_samples() not open",
- chpptr->acp_flags);
- return (0);
- }
-
- /* get the data off the list */
- data = audio_sup_get_audio_data(chptr);
-
-#ifdef FLOW_CONTROL
- /*
- * See if we should re-enable the queue. We do this now
- * because we always need to do it and the code branches below.
- */
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
- if ((chpptr->acp_flags & AM_CHNL_PFLOW) &&
- (audio_sup_get_audio_data_size(chptr) <
- (AM_MIN_QUEUED_MSGS_SIZE) &&
- audio_sup_get_audio_data_cnt(chptr) <
- AM_MIN_QUEUED_MSGS_CNT)) {
- /* yes, re-enable the q */
- chpptr->acp_flags &= ~AM_CHNL_PFLOW;
-
- q = WR(chptr->ch_qptr);
-
- ATRACE("am_get_samples() flow control disabled, q on",
- q);
-
- enableok(q);
- qenable(q);
- }
-#endif
-
- /* now we see if we got any data */
- if (data == NULL) {
- ATRACE("am_get_samples() no data", chptr);
- /* we underflowed, so up error count and send signal */
-
- mutex_enter(&chptr->ch_apm_infop->apm_lock);
-
- if (!(chpptr->acp_flags &
- (AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1)) &&
- !(stpptr->am_flags & AM_PRIV_SW_MODES)) {
- /* but only send it one time */
- info->play.error = 1;
- empty = B_TRUE;
- }
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- /* did we get any audio at all? */
- ATRACE_32("am_get_samples() ret_samples", ret_samples);
- if (ret_samples == 0) {
- ATRACE("am_get_samples() no data returning", chptr);
-
- /*
- * Marking the channel as empty is a two step
- * process because data is queued up and still
- * being played the first time we determine we
- * are empty. So the first time we set
- * ALMOST_EMPTY. The second time we set EMPTY.
- */
- if (!(chpptr->acp_flags & (AM_CHNL_ALMOST_EMPTY1|
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_EMPTY))) {
-
- chpptr->acp_flags |= AM_CHNL_ALMOST_EMPTY1;
- ATRACE("am_get_samples() no data empty1",
- chpptr->acp_flags);
- } else if
- ((chpptr->acp_flags & AM_CHNL_ALMOST_EMPTY1)) {
-
- chpptr->acp_flags &= ~AM_CHNL_ALMOST_EMPTY1;
- chpptr->acp_flags |= AM_CHNL_ALMOST_EMPTY2;
- ATRACE("am_get_samples() no data empty2",
- chpptr->acp_flags);
- } else {
- ASSERT(chpptr->acp_flags &
- (AM_CHNL_ALMOST_EMPTY2|AM_CHNL_EMPTY));
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|\
- AM_CHNL_DRAIN_NEXT_INT|AM_CHNL_DRAIN);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- ATRACE("am_get_samples() no data empty",
- chpptr->acp_flags);
- if (info->play.active) {
- active_signal = B_TRUE;
- info->play.active = 0;
- }
- }
- goto done_getting_samples;
- }
- ATRACE_32("am_get_samples() no data but samps",
- ret_samples);
- goto done_getting_samples;
- }
-
- mutex_enter(&chptr->ch_apm_infop->apm_lock);
- /*
- * See if we need to change modes. The following code makes
- * sure that this switch happens on a message boundary.
- *
- * It should be noted that it is possible to pause the
- * channel and then switch modes. Because pause may last
- * a long time we don't block the mode switch. When paused
- * it is very likely that we will not be on a message
- * boundary. If setting to mixer mode it is the responsibility
- * of the mode switch code to perform the sample rate
- * conversion of canonical audio and then set the pointers
- * to the approximate location for restarting, if setting
- * to mixer mode. It is also likely that there are additional
- * unprocessed messages. Code below will process each of
- * these as they come up.
- */
- if (stpptr->am_flags & AM_PRIV_SW_MODES &&
- ((mode == AM_MIXER_MODE && data->adata_proc &&
- data->adata_pptr == data->adata_proc) ||
- (mode == AM_COMPAT_MODE && data->adata_orig &&
- data->adata_optr == data->adata_orig))) {
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- audio_sup_putback_audio_data(chptr, data);
-
- ATRACE("am_get_samples() AM_PRIV_SW_MODES return", 0);
-
- goto done_getting_samples;
- }
- mutex_exit(&chptr->ch_apm_infop->apm_lock);
-
- /* check for EOF message, i.e., zero length buffer */
- if (data->adata_osize == 0) {
- ATRACE_32("am_get_samples() EOF",
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]);
-
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]++;
-
- EOF_processed = B_TRUE;
-
- ATRACE_32("am_get_samples() EOF, new count",
- chpptr->acp_EOF[chpptr->acp_EOF_toggle]);
-
- audio_sup_free_audio_data(data);
- continue;
- }
-
- ATRACE("am_get_samples() got data", data);
-
- /*
- * We may have changed modes or a previous attempt to process
- * the audio data failed. This gives us a second chance before
- * we have to throw the audio away.
- */
- if (mode == AM_MIXER_MODE && data->adata_proc == NULL &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- ATRACE("am_get_samples(M) calling am_reprocess()",
- data);
-
- /* if set to 0 then we've got a problem */
- if (data->adata_osize == 0) {
- ATRACE_32("am_get_samples(M) bad osize",
- data->adata_osize);
- audio_sup_free_audio_data(data);
- continue;
- }
-
- /* process the original data into src data */
- if (am_reprocess(chptr, data) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "get_samples() "
- "couldn't process message, data lost");
- audio_sup_free_audio_data(data);
- continue;
- }
- ATRACE("am_get_samples() process successful", data);
- }
-
- /*
- * Get the size of the original data, in sample frames.
- * First convert from bytes to samples, then adjust for
- * the number of channels.
- */
- orig_size = (data->adata_osize >> AM_INT32_SHIFT) / hw_channels;
-
- /* get the right buffer */
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- pstart = data->adata_pptr;
- eptr = data->adata_peptr;
- } else {
- ASSERT(mode == AM_COMPAT_MODE ||
- ad_infop->ad_codec_type == AM_MS_CODEC);
- pstart = data->adata_optr;
- eptr = data->adata_oeptr;
- }
-
- ATRACE("am_get_samples() beginning eptr", eptr);
- ATRACE_32("am_get_samples() samples needed", samples);
-
- /* get the data from the message and put into the buf */
-
- sptr = pstart;
- ASSERT(sptr >= pstart);
- ATRACE("am_get_samples() beginning sptr", sptr);
-
- if (mute == B_TRUE) {
- /* we already zeroed the buffer above */
- if ((eptr - sptr) < samples) {
- count = eptr - sptr;
- samples -= count;
- sptr = eptr;
- ASSERT(samples > 0);
- } else {
- count = samples;
- samples = 0;
- sptr += count;
- ASSERT(sptr <= eptr);
- }
- } else {
- /* copy into the buffer */
- for (count = 0; sptr < eptr && samples > 0;
- samples--, count++) {
- *bptr++ = *sptr++;
- }
- }
-
- ATRACE("am_get_samples() ending sptr", sptr);
- ATRACE_32("am_get_samples() ending samples needed", samples);
- ATRACE_32("am_get_samples() ending count", count);
-
- ASSERT(sptr <= eptr);
- ret_samples += count;
-
- ATRACE_32("am_get_samples() ret_samples #2", ret_samples);
-
- /* see if we need to go again */
- if (samples == 0) { /* nope */
- /* see if we're done with this message */
- if (sptr >= eptr) {
- ASSERT(sptr == eptr);
- /* update sample counts */
- chpptr->acp_psamples_f += orig_size;
- chpptr->acp_psamples_c = 0;
-
- /* end of data, so free */
- audio_sup_free_audio_data(data);
- data = NULL;
- } else { /* nope, use again next time */
- pstart = sptr;
- chpptr->acp_psamples_c += count / hw_channels;
- }
- break;
- } else {
- chpptr->acp_psamples_f += orig_size;
- chpptr->acp_psamples_c = 0;
- }
- /* we need to go again, but free data first */
- audio_sup_free_audio_data(data);
- buf = bptr; /* save for next go around */
-
- } /* get buffers for() loop */
-
- /* update pointers, if partial buffer used */
- if (data) {
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /* update the processed data pointer */
- data->adata_pptr = pstart;
- } else {
- /* update the original data pointer */
- data->adata_optr = pstart;
- }
- audio_sup_putback_audio_data(chptr, data);
- }
-
-done_getting_samples:
-
- /* see if we need to send any EOF signals */
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- EOF_count = 0;
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
-
- /*
- * If all we have are EOFs then we need to flush the EOF count.
- * This is done in am_wsvc() as well. This way the EOF count is
- * incremented as soon as it can be detected.
- */
- if (audio_sup_get_audio_data_cnt(chptr) == 0 && !hw_info->play.active) {
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
-
- /* if all we had was EOFs then we really are empty */
- if (EOF_processed && ret_samples == 0) {
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
- }
- mutex_exit(&chptr->ch_lock);
-
- /* Underflowed */
- if (empty == B_TRUE) {
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- /* EOF markers */
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- ATRACE("am_get_samples() done_getting_samples", chptr);
-
- /* now we are done, so return how many samples we have */
-
- ATRACE_32("am_get_samples() normal return", ret_samples);
-
- /* make sure virtual channels are still active */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (ret_samples) {
- if (info->play.active == 0) {
- active_signal = B_TRUE;
- info->play.active = 1;
- }
- hw_info->play.active = 1;
- }
- if (empty == B_TRUE) {
- if (info->play.active == 1) {
- active_signal = B_TRUE;
- info->play.active = 0;
- }
- /* we don't turn off the h/w active flag here */
- }
- }
- /* send the signals for active change */
- if (active_signal == B_TRUE) {
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- mutex_enter(&chptr->ch_lock);
-
- return (ret_samples);
-
-} /* am_get_samples() */
-
-/*
- * am_play_shutdown_multi()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * NOTE: We use the EOF_count to also determine if we have an active
- * flag change and thus need a signal sent.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * int channel For multi-stream Codecs this is the
- * stream to shutdown.
- *
- * Returns:
- * void
- */
-static void
-am_play_shutdown_multi(audiohdl_t handle, int channel)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_ch_t *chptr;
- am_apm_private_t *stpptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- int EOF_count = 0;
-
- ATRACE("in am_play_shutdown_multi()", handle);
- ASSERT(statep);
-
- chptr = &statep->as_channels[channel];
- stpptr = chptr->ch_apm_infop->apm_private;
-
- mutex_enter(&chptr->ch_lock);
- /*
- * The channel may have been closed while we waited on the mutex.
- * So once we get it we make sure the channel is still valid.
- */
- chpptr = chptr->ch_private;
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.pid == 0 ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- ATRACE("am_play_shutdown_multi() channel closed", chptr);
- mutex_exit(&chptr->ch_lock);
- return;
- } else if (chpptr->acp_flags &
- (AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|AM_CHNL_EMPTY|\
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2|AM_CHNL_CLOSING)) {
- /* clear a bunch of flags */
- chpptr->acp_flags &= ~(AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2);
-
- /* are we empty? */
- if (audio_sup_get_audio_data_cnt(chptr) == 0) {
- /* yes, so mark as empty */
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
-
- /* turn off the channel, but only if not paused */
- info = chptr->ch_info.info;
- if (!info->play.pause && info->play.active) {
- EOF_count++;
- info->play.active = 0;
- }
-
- am_audio_drained(chptr);
-
- /* make sure we send all pending signals */
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
-
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
- am_send_signal(statep, stpptr);
- }
- } else {
- /* we can free the lock now */
- mutex_exit(&chptr->ch_lock);
- }
-
- ATRACE("am_play_shutdown_multi() returning", statep);
-
- return;
-
-} /* am_play_shutdown_multi() */
-
-/*
- * am_play_shutdown_trad()
- *
- * Description:
- * This routine is used to clean things up when the Audio Driver will
- * no longer be servicing it's play interrupts. I.e., play interrupts
- * have been turned off.
- *
- * This routine makes sure that any DRAINs waiting for an interrupt are
- * cleared.
- *
- * It is also used to coordinate shutting down play so that we can
- * switch between MIXER and COMPAT modes.
- *
- * Arguments:
- * audiohdl_t handle Handle to the device
- * audio_apm_info_t *apm_infop Pointer to APM info
- *
- * Returns:
- * void
- */
-static void
-am_play_shutdown_trad(audiohdl_t handle, audio_apm_info_t *apm_infop)
-{
- audio_state_t *statep = AUDIO_HDL2STATE(handle);
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info;
- am_apm_private_t *stpptr;
- int EOF_count;
- int i;
- int max_chs;
-
- ATRACE("in am_play_shutdown_trad()", handle);
- ASSERT(statep);
-
- max_chs = statep->as_max_chs;
- stpptr = apm_infop->apm_private;
- hw_info = apm_infop->apm_ad_state;
-
- mutex_enter(&apm_infop->apm_lock);
- if (stpptr->am_flags & AM_PRIV_SW_MODES) {
- mutex_exit(&apm_infop->apm_lock);
-
- ATRACE("am_play_shutdown_trad() change mode shutdown", stpptr);
-
- /* don't worry about signal, the mode switch will send one */
- hw_info->play.active = 0;
-
- /* let the mode change proceed */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
-
- return;
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /* go through all the channels */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&chptr->ch_lock);
-
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- chpptr = chptr->ch_private;
-
- ATRACE_32("am_play_shutdown_trad() checking flags",
- chpptr->acp_flags);
-
- info = chptr->ch_info.info;
- if (chpptr->acp_flags &
- (AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|\
- AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_CLOSING)) {
- /* clear a bunch of flags */
- chpptr->acp_flags &=
- ~(AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT|\
- AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2);
-
- /* are we empty? */
- if (audio_sup_get_audio_data_cnt(chptr) == 0) {
- /* yes, so mark as empty */
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- }
-
- /* turn off the ch, but only if not paused */
- if (!info->play.pause) {
- info->play.active = 0;
- }
-
- ATRACE("am_play_shutdown_trad() regular drain", chptr);
-
- am_audio_drained(chptr);
- } else {
- /* turn off the ch, but only if not paused */
- if (!info->play.pause) {
- info->play.active = 0;
- }
- }
-
- /* make sure we send all pending signals */
- chpptr = chptr->ch_private;
-
- EOF_count = chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
-
- EOF_count += chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- info->play.eof++;
-
- am_send_signal(statep, stpptr);
- }
- }
-
- /* turn off the hardware active flag, always send a signal */
- hw_info->play.active = 0;
- am_send_signal(statep, stpptr);
-
- ATRACE("am_play_shutdown_trad() returning", statep);
-
- return;
-
-} /* am_play_shutdown_trad() */
-
-/*
- * am_release_ad_access()
- *
- * Description:
- * This routine is used to release the serial access to the audio driver
- * entry points.
- *
- * Arguments:
- * am_apm_private_t *stpptr Ptr to APM private data
- *
- * Returns:
- * Void
- */
-static void
-am_release_ad_access(am_apm_private_t *stpptr)
-{
- ATRACE("in am_release_ad_access()", stpptr);
- ATRACE("am_release_ad_access() curthread", curthread);
-
- /* wait for all other calls into the audio driver to return */
- mutex_enter(&stpptr->am_ad_lock);
-
- ASSERT(stpptr->am_ad_in & AM_APM_IN_DRIVER);
-
- /* we're done, so release any waiting threads */
- stpptr->am_ad_in &= ~AM_APM_IN_DRIVER;
-
- /* wake up one thread waiting on this CV */
- cv_signal(&stpptr->am_ad_cv);
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE("am_release_ad_access() done", curthread);
-
-} /* am_release_ad_access() */
-
-/*
- * am_set_record_streams()
- *
- * Description:
- * Set the STREAMS high and low water marks for the record channel. We try
- * this when the audio channel is initially opened. If that fails,
- * am_send_audio_common() will also make an attempt to set the water marks.
- * Otherwise, left alone the STREAMS default settings overflow almost
- * immediately at the higher sample rates.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- *
- * Returns:
- * AUDIO_SUCCESS High and Low water marks increased
- * AUDIO_FAILURE High and Low water marks not increased
- */
-int
-am_set_record_streams(audio_ch_t *chptr)
-{
- mblk_t *mop;
- struct stroptions *sop;
-
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*sop));
-
- if (mop = allocb(sizeof (struct stroptions), BPRI_HI)) {
- mop->b_datap->db_type = M_SETOPTS;
- mop->b_wptr += sizeof (struct stroptions);
- sop = (struct stroptions *)mop->b_rptr;
- sop->so_flags = SO_HIWAT | SO_LOWAT;
- sop->so_hiwat = AM_MAX_QUEUED_MSGS_SIZE;
- sop->so_lowat = AM_MIN_QUEUED_MSGS_SIZE;
-
- am_safe_putnext(chptr, mop);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*sop));
-
- ATRACE("am_set_record_streams() adjustment successful", 0);
-
- return (AUDIO_SUCCESS);
- }
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*sop));
-
- ATRACE("am_set_record_streams() adjustment failed", 0);
-
- return (AUDIO_FAILURE);
-
-} /* am_set_record_streams() */
-
-/*
- * am_send_audio_common()
- * Common code between am_send_audio_multi() and am_send_audio_trad().
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to the channel structure
- * void *buf The buffer to get audio from
- * int samples The number of samples the Codec sent
- *
- * Returns:
- * Void
- */
-static void
-am_send_audio_common(audio_ch_t *chptr, void *buf, int samples)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info = chptr->ch_info.info;
- am_ch_private_t *chpptr = chptr->ch_private;
- mblk_t *mp;
- queue_t *q = RD(chptr->ch_qptr);
- size_t size;
- int bytes_per_samplef;
- int channels = info->record.channels;
- int mp_size;
- int precision = info->record.precision;
- int remaining;
-
- ATRACE("in am_send_audio_common()", chptr);
-
- ASSERT(statep);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /*
- * Check if the STREAMS water marks for the record channel have been
- * properly set. If not, try and set them here.
- */
- if (!(chpptr->acp_flags & AM_CHNL_RSTREAMS_SET)) {
- ATRACE("am_send_audio_common() adjusting streams queue",
- chpptr);
- if (am_set_record_streams(chptr) == AUDIO_SUCCESS) {
- ATRACE("am_send_audio_common() streams queue adjustment"
- " successful", chpptr);
- chpptr->acp_flags |= AM_CHNL_RSTREAMS_SET;
- }
- }
-
- /* figure out how many bytes there are in a sample frame */
- bytes_per_samplef = channels * (precision >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("am_send_audio_common() bytes_per_samplef",
- bytes_per_samplef);
-
- /* figure out how many bytes we've got */
- size = samples * (precision >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("am_send_audio_common() size", size);
-
- /* first we see if we have a partial buffer waiting to be sent */
- if (chpptr->acp_rec_mp) { /* yup, we need to fill it first */
- ATRACE("am_send_audio_common() filling partial buffer",
- chpptr->acp_rec_mp);
-
- mp = chpptr->acp_rec_mp;
-
- /*
- * Figure out how much of the buffer is remaining. We don't
- * use the record buffer size because it may have changed
- * since the message was allocated.
- */
- remaining = chpptr->acp_rec_remaining;
- ATRACE_32("am_send_audio_common() remaining", remaining);
-
- /* make sure we've got enough to fill this buffer */
- if (remaining > size) {
- /* we don't, so use what we have and return */
- bcopy(buf, mp->b_wptr, size);
- mp->b_wptr += size;
- chpptr->acp_rec_remaining -= size;
- info->record.samples += size / bytes_per_samplef;
- ATRACE("am_send_audio_common() not enough", mp);
-
- /* make sure the channel is still active */
- info->record.active = 1;
-
- return;
- }
-
- /* we do, so fill and then go on to get a new buffer */
- bcopy(buf, mp->b_wptr, remaining);
- mp->b_wptr += remaining;
- info->record.samples += remaining / bytes_per_samplef;
- ASSERT(q == RD(q));
-
- am_safe_putnext(chptr, mp);
-
- chpptr->acp_rec_mp = NULL;
- chpptr->acp_rec_remaining = 0;
- buf = (char *)buf + remaining;
- size -= remaining;
- ATRACE_32("am_send_audio_common() partial buffer filled", size);
- ASSERT(chpptr->acp_rec_remaining == 0);
- }
- ASSERT(chpptr->acp_rec_mp == NULL);
-
- /* start with a full buffer */
- remaining = info->record.buffer_size;
-
- /* now place remaining data into new buffers */
- while (size) {
-
- /* buffer_size may change during loop */
- mp_size = info->record.buffer_size;
-
- if ((mp = allocb(mp_size, BPRI_HI)) == NULL) {
- /*
- * Often times when one allocb() fails we get many
- * more that fail. We don't want this error message
- * to spew uncontrolled. So we set this flag and the
- * next time if it's set we don't display the message.
- * Once we get a success we clear the flags, thus one
- * message per continuous set of failures.
- */
- if (!(chpptr->acp_flags & AM_CHNL_CLIMIT)) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "mixer: send_audio_c() "
- "allocb() failed, recorded audio lost");
- chpptr->acp_flags |= AM_CHNL_CLIMIT;
- }
-
- ATRACE("am_send_audio_common() allocb() failed",
- chptr);
- info->record.error = 1;
- return;
- }
- chpptr->acp_flags &= ~AM_CHNL_CLIMIT;
-
- mp->b_datap->db_type = M_DATA;
-
- if (mp_size > size) {
- /* partial buffer */
- bcopy(buf, mp->b_rptr, size);
- mp->b_wptr += size;
- chpptr->acp_rec_remaining = mp_size - size;
- info->record.samples += size / bytes_per_samplef;
- chpptr->acp_rec_mp = mp;
- ATRACE("am_send_audio_common() new not enough", mp);
- break;
- }
- /* full buffer */
- bcopy(buf, mp->b_rptr, mp_size);
- mp->b_wptr += mp_size;
- info->record.samples += mp_size / bytes_per_samplef;
- ASSERT(q == RD(q));
-
- am_safe_putnext(chptr, mp);
-
- ASSERT(chpptr->acp_rec_mp == NULL);
- chpptr->acp_rec_remaining = 0;
- buf = (char *)buf + mp_size;
- size -= mp_size;
-
- /* start with a full buffer for the next loop */
- remaining = info->record.buffer_size;
- }
-
- /* make sure the channel is still active */
- info->record.active = 1;
-
- ATRACE("am_send_audio_common() done", buf);
-
-} /* am_send_audio_common() */
-
-/*
- * am_send_audio_multi()
- *
- * Description:
- * This routine is used by multi-channel Codecs to send a single stream
- * of audio data to an individual channel.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * void *buf The buffer to get audio from
- * int channel The device channel number
- * int samples The number of samples the Codec sent
- *
- * NOTE: The variable "samples" is the number of samples the hardware
- * sent. So it is samples at the hardware's sample rate.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-am_send_audio_multi(audio_state_t *statep, am_ad_info_t *ad_infop, void *buf,
- int channel, int samples)
-{
- audio_ch_t *chptr = &statep->as_channels[channel];
- audio_info_t *info = chptr->ch_info.info;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- size_t size;
- size_t size_plus_rb;
- int channels = info->record.channels;
-
- ASSERT(statep);
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- return;
- }
-
- /* make sure we can put the audio before we waste time converting it */
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_multi() channel closed", chptr);
- return;
- case AUDIO_FAILURE:
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32("am_send_audio_multi() ch flow controlled",
- chptr->ch_info.ch_number);
- return;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
-
- /* make sure the # of samples is modulo the # of H/W channels */
- if (channels != AUDIO_CHANNELS_MONO && (samples % channels) != 0) {
- ATRACE_32("am_send_audio_multi() bad sample size", samples);
- samples -= samples % channels;
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /* make sure the conversion buffer is large enough */
- size = samples << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_multi() couldn't allocate "
- "conversion buffer, audio lost");
- return;
- }
-
- /* convert to canonical format */
- am_convert_to_int(buf, chpptr->acp_ch_rconv1, samples,
- info->record.precision, info->record.encoding, stpptr->am_rflags);
-
- /* send to the application */
- am_send_audio_common(chptr, chpptr->acp_ch_rconv1, samples);
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_send_audio_multi() done", buf);
-
-} /* am_send_audio_multi() */
-
-/*
- * am_send_audio_trad_compat()
- *
- * Description:
- * This routine is used by traditional Codecs to send a single recorded
- * audio stream up to applications in COMPAT mode. The data is converted
- * to the applications format, except the sample rate, which the hardware
- * must match.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Personality module data struct
- * int *buf The buffer to get audio from
- * int samples The # of samples the Codec sent
- *
- * Returns:
- * void
- */
-static void
-am_send_audio_trad_compat(audio_state_t *statep, audio_apm_info_t *apm_infop,
- int *buf, int samples)
-{
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- size_t size;
- size_t size_plus_rb;
- uint_t channels;
- uint_t hw_channels;
- int already_active;
- int i;
- int max_chs;
-
- ATRACE("in am_send_audio_trad_compat()", statep);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- /* go through the chs looking for the only recording AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0]; i < max_chs;
- i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_compat() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is reading */
- if (!chpptr->acp_reading) {
- ATRACE("am_send_audio_trad_compat() not recording",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- mutex_exit(&chptr->ch_lock);
- return;
- }
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE_32("am_send_audio_trad_compat() found channel", i);
- break;
- }
- if (i >= max_chs) {
- ATRACE("am_send_audio_trad_compat() done, no rec channel", buf);
- return;
- }
-
- /* make sure we can put the audio before we waste time converting it */
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_trad_compat() channel closed", chptr);
- return;
- case AUDIO_FAILURE:
- am_send_signal(statep, stpptr);
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32("am_send_audio_trad_compat() ch flow controlled",
- chptr->ch_info.ch_number);
- return;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
-
- mutex_enter(&chptr->ch_lock);
-
- /*
- * We had to free the lock above to make warlock happy. Unfortunately
- * it's possible that the channel closed between releasing and
- * reacquiring the lock. So we have to check again.
- */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO || chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_send_audio_trad_compat() ch closed on us", chptr);
- return;
- }
-
- hw_channels = stpptr->am_hw_rchs;
- channels = info->record.channels;
-
- size = (samples + AM_EXTRA_SAMPLES) << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
-
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't allocate "
- "conversion buffer, audio lost");
- return;
- }
-
- /* convert between mono <---> stereo */
- am_convert_int_mono_stereo(buf, chpptr->acp_ch_rconv1, &samples,
- hw_channels, channels);
-
- /* now convert to the application's format */
- am_convert_to_format(chpptr->acp_ch_rconv1, chpptr->acp_ch_rconv2,
- samples, info->record.precision, info->record.encoding, 0);
-
- /* update recorded sample count */
- hw_info->record.samples += samples / hw_channels;
-
- /* send to the application */
- already_active = info->record.active;
- am_send_audio_common(chptr, chpptr->acp_ch_rconv2, samples);
-
- mutex_exit(&chptr->ch_lock);
-
- if (already_active != info->record.active) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_send_audio_trad_compat() done", buf);
-
-} /* am_send_audio_trad_compat() */
-
-/*
- * am_send_audio_trad_mixer()
- *
- * Description:
- * This routine is used by traditional Codecs to send multiple recorded
- * audio stream up to applications in MIXER mode. The data is converted
- * to the applications format, including sample rate.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Personality module data struct
- * int *buf The buffer to get audio from
- * int samples The # of samples the Codec sent
- *
- * Returns:
- * void
- */
-static void
-am_send_audio_trad_mixer(audio_state_t *statep, audio_apm_info_t *apm_infop,
- int *buf, const int samples)
-{
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- audio_info_t *info;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ad_src_entry_t *rsrs = ad_infop->ad_record.ad_conv;
- int *conv_data;
- size_t size;
- size_t size_plus_rb;
- uint_t channels;
- uint_t hw_channels;
- int already_active;
- int i;
- int max_chs;
- int tmp_samples;
-
- ATRACE("in am_send_audio_trad_mixer()", statep);
- ASSERT(statep);
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- hw_channels = stpptr->am_hw_rchs;
- ATRACE_32("am_send_audio_trad_mixer() am_in_chs", stpptr->am_in_chs);
-
- /* go through the chs looking for each AUDIO ch */
- for (i = 0, chptr = &statep->as_channels[0];
- i < max_chs; i++, chptr++) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
-
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is valid */
- chpptr = chptr->ch_private;
- info = chptr->ch_info.info;
- if (chpptr == NULL || info == NULL ||
- (chpptr->acp_flags & AM_CHNL_OPEN) == 0) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_get_audio_trad_mixer() channel closed",
- chptr);
- continue;
- }
-
- /* make sure this channel is reading */
- if (!chpptr->acp_reading) {
- ATRACE("am_send_audio_trad_mixer() not recording",
- chpptr);
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* skip paused AUDIO channels */
- if (info->record.pause) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure we can put the audio before we waste time */
- mutex_exit(&chptr->ch_lock);
-
- switch (am_test_canputnext(chptr)) {
- case AM_CHNL_CLOSED:
- /* Channel closed on us */
- ATRACE("am_send_audio_trad_mixer() channel closed",
- chptr);
- return;
- case AUDIO_FAILURE:
- am_send_signal(statep, stpptr);
- info->record.active = 0;
- info->record.error = 1;
- ATRACE_32(
- "am_send_audio_trad_mixer() ch flow "
- "controlled", chptr->ch_info.ch_number);
- continue;
- case AUDIO_SUCCESS:
- /* FALLTHROUGH */
- default:
- break;
- }
- mutex_enter(&chptr->ch_lock);
-
- ATRACE_32("am_send_audio_trad_mixer() found channel", i);
-
- /* don't let samples get modified */
- tmp_samples = samples;
-
- channels = info->record.channels;
-
- /* use the mode lock to keep the mode from switching */
- mutex_enter(&stpptr->am_mode_lock);
-
- /*
- * Make sure there's enough memory to convert to int. We
- * ask for more so that after SRC we hopefully don't need
- * to free and allocate again. We also need to make sure
- * we've got enough to go from mono to stereo.
- */
- size = (tmp_samples + AM_EXTRA_SAMPLES) << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
-
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't "
- "allocate conversion buffer, audio lost");
- return;
- }
-
- /* convert between mono <---> stereo */
- am_convert_int_mono_stereo(buf,
- (int *)((char *)chpptr->acp_ch_rconv1 +
- chpptr->acp_ch_rbuf_size), &tmp_samples, hw_channels,
- channels);
-
- /*
- * Make sure we have the buffers to perform sample rate
- * conversion, then do the sample rate conversion.
- */
- if (am_update_src_buffer(chptr, samples, hw_channels,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(M) couldn't "
- "allocate src buffer, audio lost");
- continue;
- }
-
- conv_data = rsrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- info->record.channels, AUDIO_RECORD, chpptr->acp_ch_rconv1,
- chpptr->acp_ch_rsrc1, chpptr->acp_ch_rsrc2, &tmp_samples);
-
- ASSERT(tmp_samples <= (chpptr->acp_ch_rsrc_siz >>
- AM_TIMES_4_SHIFT));
-
- if (!conv_data) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(M) sample "
- "rate conversion failed, audio lost");
- continue;
- }
-
- /*
- * Make sure there's enough memory to convert to format.
- * We also need to make sure we've got enough to go from
- * mono to stereo
- */
- size = tmp_samples << AM_TIMES_8_SHIFT;
- size_plus_rb = size + chpptr->acp_ch_rbuf_size;
- if (am_update_conv_buffer(chptr, size_plus_rb, AUDIO_RECORD) ==
- AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!mixer: send_audio_trad(C) couldn't "
- "allocate conversion buffer, audio lost");
- return;
- }
-
- /* apply gain to the sample rate converted audio */
- am_apply_gain_balance(conv_data, tmp_samples, channels,
- info->record.gain, info->record.balance);
-
- /* now convert to the application's format */
- am_convert_to_format(conv_data, chpptr->acp_ch_rconv2,
- tmp_samples, info->record.precision, info->record.encoding,
- 0);
-
- mutex_exit(&stpptr->am_mode_lock);
-
- /* send to the application */
- already_active = info->record.active;
- am_send_audio_common(chptr, chpptr->acp_ch_rconv2, tmp_samples);
-
- ATRACE("am_send_audio_trad_mixer() done with channel", chptr);
-
- mutex_exit(&chptr->ch_lock);
-
- if (already_active != info->record.active) {
- am_send_signal(statep, stpptr);
- }
-
- }
-
- /* update recorded sample count */
- hw_info->record.samples += samples / hw_channels;
-
- ATRACE("am_send_audio_trad_mixer() done", buf);
-
-} /* am_send_audio_trad_mixer() */
-
-/*
- * am_serialize_ad_access()
- *
- * Description:
- * This routine is used to guarantee that all of the calls into the
- * audio driver, except for ad_ioctl() and ad_iocdata(), are serialized.
- *
- * Arguments:
- * am_apm_private_t *stpptr Ptr to APM private data
- *
- * Returns:
- * Void
- */
-static void
-am_serialize_ad_access(am_apm_private_t *stpptr)
-{
- ATRACE("in am_serialize_ad_access()", stpptr);
- ATRACE("am_serialize_ad_access() curthread", curthread);
-
- /* wait for all other calls into the audio driver to return */
- mutex_enter(&stpptr->am_ad_lock);
-
- while (stpptr->am_ad_in & (AM_APM_IN_DRIVER|AM_APM_FREEZE)) {
- ATRACE("am_serialize_ad_access() in cv_wait()", curthread);
- cv_wait(&stpptr->am_ad_cv, &stpptr->am_ad_lock);
- ATRACE("am_serialize_ad_access() cv_wait() returned",
- curthread);
- }
-
- ASSERT(!(stpptr->am_ad_in & AM_APM_IN_DRIVER));
-
- /* we have permission to enter, so flag as busy */
- stpptr->am_ad_in |= AM_APM_IN_DRIVER;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE("am_serialize_ad_access() done", curthread);
-
-} /* am_serialize_ad_access() */
-
-/*
- * Task queue callbacks.
- */
-
-/*
- * am_hw_task()
- *
- * Description:
- * Called by the task queue to update the hardware state based on
- * input from the audio driver. This is usually driven by the user
- * pressing a button, like volume up/down, on the audio device.
- *
- * NOTE: There isn't an input mute like there is an output mute, so we
- * set the input gain to 0 and save the old gain for unmute. If
- * another app raised the input gain then the input gain isn't
- * 0 and thus we are no longer muted.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_hw_task(void *arg)
-{
- audio_state_t *statep =
- ((am_state_ch_args_t *)arg)->asca_statep;
- audio_apm_info_t *apm_infop =
- ((am_state_ch_args_t *)arg)->asca_apm_infop;
- audio_info_t *hw_info =
- (audio_info_t *)apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- int cmd = ((am_state_ch_args_t *)arg)->asca_cmd;
- int dir = ((am_state_ch_args_t *)arg)->asca_dir;
- int value = ((am_state_ch_args_t *)arg)->asca_value;
- int balance;
- int gain;
- int send_signal = 0;
- uint_t channels;
-
- ATRACE("in am_hw_task() statep", statep);
- ATRACE_32("am_hw_task() cmd", cmd);
- ATRACE_32("am_hw_task() dir", dir);
- ATRACE_32("am_hw_task() value", value);
- ASSERT(statep);
-
- switch (cmd) {
- case AM_HWSC_SET_GAIN_ABS:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (gain >= AUDIO_MAX_GAIN) {
- ATRACE_32("am_hw_task() ABS gain already at max", gain);
- break;
- } else if (gain <= AUDIO_MIN_GAIN) {
- ATRACE_32("am_hw_task() ABS gain already at min", gain);
- break;
- }
-
- /* apply the new absolute gain */
- gain = value;
-
- /* make sure the result isn't too big or small */
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
- ATRACE_32("am_hw_task() new absolute gain", gain);
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.gain = gain;
- } else {
- hw_info->record.gain = gain;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_BAL_ABS:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (balance >= AUDIO_RIGHT_BALANCE) {
- ATRACE_32("am_hw_task() ABS balance"
- " already right", balance);
- break;
- } else if (balance <= AUDIO_LEFT_BALANCE) {
- ATRACE_32("am_hw_task() ABS balance"
- " already left", balance);
- break;
- }
-
- /* apply the new absolute balance */
- balance = value;
-
- /* make sure the result isn't too big or small */
- if (balance > AUDIO_RIGHT_BALANCE) {
- balance = AUDIO_RIGHT_BALANCE;
- } else if (balance < AUDIO_LEFT_BALANCE) {
- balance = AUDIO_LEFT_BALANCE;
- }
- ATRACE_32("am_hw_task() new absolute balance", balance);
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.balance = (uchar_t)balance;
- } else {
- hw_info->record.balance = (uchar_t)balance;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_GAIN_DELTA:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (value > 0 && gain >= AUDIO_MAX_GAIN) {
- ATRACE_32("am_hw_task() gain already at max", gain);
- break;
- } else if (value < 0 && gain <= AUDIO_MIN_GAIN) {
- ATRACE_32("am_hw_task() gain already at min", gain);
- break;
- }
-
- /* apply delta */
- gain += value;
-
- /* make sure the result isn't too big or small */
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.gain = gain;
- } else {
- hw_info->record.gain = gain;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_SET_BAL_DELTA:
- gain = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.gain : hw_info->record.gain);
- balance = (int)((dir == AUDIO_PLAY) ?
- hw_info->play.balance : hw_info->record.balance);
- channels = (dir == AUDIO_PLAY) ?
- stpptr->am_hw_pchs : stpptr->am_hw_rchs;
-
- /*
- * Check limits, jump out if we are already at the max or min
- * value
- */
- if (value > 0 && balance >= AUDIO_RIGHT_BALANCE) {
- ATRACE_32("am_hw_task() bal. already right", balance);
- break;
- } else if (value < 0 && balance <= AUDIO_LEFT_BALANCE) {
- ATRACE_32("am_hw_task() bal. already left", balance);
- break;
- }
-
- /* apply delta */
- balance += value;
-
- /* make sure the result isn't too big or small */
- if (balance > AUDIO_RIGHT_BALANCE) {
- balance = AUDIO_RIGHT_BALANCE;
- } else if (balance < AUDIO_LEFT_BALANCE) {
- balance = AUDIO_LEFT_BALANCE;
- }
-
- if (am_set_gain(statep, apm_infop, channels, (uint_t)gain,
- (uint_t)balance, dir, AM_SET_CONFIG_BOARD, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_SUCCESS) {
- if (dir == AUDIO_PLAY) {
- hw_info->play.balance = (uchar_t)balance;
- } else {
- hw_info->record.balance = (uchar_t)balance;
- }
- }
-
- send_signal++;
-
- break;
- case AM_HWSC_MUTE_TOGGLE:
- if (dir == AUDIO_PLAY) {
- /* toggle mute */
- if (hw_info->output_muted) {
- value = AM_NOT_MUTED;
- } else {
- value = AM_MUTED;
- }
-
- /* set new mute */
- ad_infop = apm_infop->apm_ad_infop;
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- value, NULL, AM_SERIALIZE) == AUDIO_SUCCESS) {
- hw_info->output_muted = (uchar_t)value;
- }
- } else {
- if (hw_info->record.gain) {
- stpptr->am_save_hw_rgain = hw_info->record.gain;
- value = AUDIO_MIN_GAIN;
- } else {
- value = stpptr->am_save_hw_rgain;
- }
-
- if (am_set_gain(statep, apm_infop,
- stpptr->am_hw_rchs, (uint_t)value,
- hw_info->record.balance, AUDIO_RECORD,
- AM_SET_CONFIG_BOARD, AM_NO_FORCE, AM_SERIALIZE) ==
- AUDIO_SUCCESS) {
- hw_info->record.gain = value;
- }
- }
-
- send_signal++;
-
- break;
- default:
- ATRACE_32("am_hw_task() unrecognized command", cmd);
- break;
- }
-
- /* free the argument memory */
-
- kmem_free(arg, sizeof (am_state_ch_args_t));
-
- if (send_signal) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_hw_task() done", statep);
-
-} /* am_hw_task() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c b/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c
deleted file mode 100644
index 86d849f9b1..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_ioctl.c
+++ /dev/null
@@ -1,5376 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * This file contains the code for implementing the ioctl()s that the audio.7I
- * and mixer.7I man pages define. This file also contains private routines to
- * support these calls.
- *
- * am_wput() in am_main.c just grabs the M_IOCTL and M_IOCDATA messages and
- * sends them to either am_wioctl() or am_wiocdata(), where all processing
- * takes place. am_svc() doesn't do any ioctl() processing at all.
- *
- * The following ioctl()s are supported:
- * AUDIO_DIAG_LOOPBACK
- * AUDIO_DRAIN
- * AUDIO_GETINFO
- * AUDIO_SETINFO
- * AUDIO_GETDEV
- * AUDIO_MIXER_MULTIPLE_OPEN
- * AUDIO_MIXER_SINGLE_OPEN
- * AUDIO_MIXER_GET_SAMPLE_RATES
- * AUDIO_MIXERCTL_GETINFO
- * AUDIO_MIXERCTL_SETINFO
- * AUDIO_MIXERCTL_GET_CHINFO
- * AUDIO_MIXERCTL_SET_CHINFO
- * AUDIO_MIXERCTL_GET_MODE
- * AUDIO_MIXERCTL_SET_MODE
- *
- * Most of the ioctl()s copy in a data structure for use by the ioctl().
- * am_wioctl() or am_wiocdata() will request the data. Based on the ioctl()
- * it then creates a data structure and enqueues a task request to execute
- * that ioctl() in a separate thread. This allows am_wput() and am_wsvc() to
- * continue working while the ioctl() is processed. When the ioctl() in it's
- * own thread is complete it creates the appropriate message and sends it
- * back up the queue. Further processing to copy out and ack/nack is done by
- * am_wiocdata().
- *
- * A task queue is used to serialize all access to the hardware state
- * structures and the hardware. This greatly simplifies the locking model.
- * When closing we wait for all of the tasks to complete. This may introduce
- * a delay in closing, but tests with 40 playing channels shows no noticable
- * delays.
- *
- * Two ioctl()s are not placed on the task queue. They are:
- *
- * AUDIO_GETINFO - Returns static data and thus the hardware state is
- * irrelevant.
- * AUDIO_DRAIN - This ioctl() doesn't change or get the device state.
- * It is also a very long lived ioctl() and is dependent on how
- * much audio is queued up. We don't want to block other channels
- * from being open()ed or their ioctl()s. Because this is a long
- * lived ioctl() it is handled in am_wsvc() instead of am_wput().
- * Otherwise it would block am_wput() and this is against the
- * rules.
- *
- * Signals are generated when the hardware is modified. The signal is sent
- * after the ioctl()'s ack or nack has been sent. That way we don't get an
- * interrupted system call.
- *
- * These routines are provided for use by the other mixer source code files:
- * am_wiocdata()
- * am_wioctl()
- * am_audio_drained()
- * am_audio_set_info()
- * am_set_format()
- * am_set_gain()
- */
-
-#include <sys/modctl.h>
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/strsun.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Local routine prototypes used only by this file.
- */
-static int am_ck_bits_set32(uint_t);
-static void am_exit_task(audio_ch_t *);
-static void am_fix_info(audio_ch_t *, audio_info_t *);
-static void am_fix_play_pause(audio_ch_t *);
-static void am_mixer_task_acknack(audio_i_state_t *, audio_ch_t *,
- queue_t *, mblk_t *, am_ioctl_args_t *, int);
-static void am_restart(audio_state_t *, audio_info_t *);
-static int am_sched_task(queue_t *, mblk_t *, audio_ch_t *,
- void (*func)(void *));
-static int am_set_compat_mode(audio_ch_t *, am_ad_info_t *, audio_ch_t *,
- audio_ch_t *);
-static int am_set_mixer_mode(audio_ch_t *, am_ad_info_t *, am_apm_private_t *,
- audio_ch_t *, audio_ch_t *);
-static int am_wiocdata_mixerctl_chinfo(queue_t *, mblk_t *, audio_i_state_t *);
-static int am_wiocdata_mixerctl_get_chinfo(queue_t *, mblk_t *,
- audio_i_state_t *);
-static int am_wiocdata_sr(queue_t *, mblk_t *, struct copyreq *,
- audio_i_state_t *);
-static int am_wioctl_copyin(queue_t *, mblk_t *, audio_ch_t *,
- audio_i_state_t *, int);
-static void am_wioctl_drain(queue_t *, mblk_t *, audio_ch_t *,
- struct copyreq *);
-static int am_wioctl_getdev(queue_t *, mblk_t *, audio_ch_t *,
- audio_i_state_t *);
-
-/*
- * Taskq callbacks.
- */
-static void am_diag_loopback_task(void *);
-static void am_get_chinfo_task(void *);
-static void am_get_mode_task(void *);
-static void am_getinfo_task(void *);
-static void am_mixerctl_getinfo_task(void *);
-static void am_mixerctl_setinfo_task(void *);
-static void am_multiple_open_task(void *);
-static void am_sample_rate_task(void *);
-static void am_set_chinfo_task(void *);
-static void am_set_mode_task(void *);
-static void am_setinfo_task(void *);
-static void am_single_open_task(void *);
-
-/* this simulates the rw lock handling by taskq framework */
-#ifdef __lock_lint
-extern krwlock_t q_lock;
-
-static void
-am_enter_rwlock()
-{
- _NOTE(READ_LOCK_ACQUIRED_AS_SIDE_EFFECT(&q_lock));
- rw_enter(&q_lock, RW_READER);
-}
-
-static void
-am_release_rwlock()
-{
- _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&q_lock));
- rw_exit(&q_lock);
-}
-#else
-#define am_enter_rwlock()
-#define am_release_rwlock()
-#endif
-
-/*
- * The main routines for this file.
- */
-
-/*
- * am_wiocdata()
- *
- * Description:
- * This routine is called by am_wput() to process all M_IOCDATA
- * messages.
- *
- * We only support transparent ioctls.
- *
- * This routine also is used to return a IOCNAK if the state pointer
- * or the channel pointer, setup in am_wsvc(), are invalid.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * WARNING: Don't forget to free the mblk_t struct used to hold private
- * data. The ack: and nack: jump points take care of this.
- *
- * WARNING: Don't free the private mblk_t structure if the command is
- * going to call qreply(). This frees the private data that will
- * be needed for the next M_IOCDATA message.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * am_wsvc()
- */
-int
-am_wiocdata(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- struct copyreq *cqp;
- struct copyresp *csp;
- audio_i_state_t *cmd;
- int error = 0;
- int send_sig = 0;
-
- ATRACE("in am_wiocdata()", chptr);
- ATRACE_32("am_wiocdata() channel type", chptr->ch_info.dev_type);
-
- ASSERT(statep);
- ASSERT(!MUTEX_HELD(&apm_infop->apm_lock));
-
- csp = (struct copyresp *)mp->b_rptr; /* setup copy response ptr */
- cqp = (struct copyreq *)mp->b_rptr; /* setup copy request ptr */
- cmd = (audio_i_state_t *)csp->cp_private; /* get state info */
-
- /* make sure we've got a good return value */
- if (csp->cp_rval) {
- ATRACE("am_wiocdata() bad return value", csp->cp_rval);
- error = EINVAL;
- goto done;
- }
-
- /*
- * Work through the iocdata messages. These are arranged so that
- * the messages that need to do further work are ordered first and
- * then the ACKs.
- */
- if (cmd != NULL) {
- ATRACE_32("am_wiocdata() command", cmd->ais_command);
- switch (cmd->ais_command) {
-
- case AM_COPY_IN_AUDIOINFO:
- /* AUDIO_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_AUDIOINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_SETINFO);
-
- error = am_sched_task(q, mp, chptr, am_setinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_DIAG_LOOPB:
- /* AUDIO_DIAG_LOOPBACK */
- ATRACE("am_wiocdata() AM_COPY_IN_DIAG_LOOPB", chptr);
- ASSERT(csp->cp_cmd == AUDIO_DIAG_LOOPBACK);
-
- error = am_sched_task(q, mp, chptr,
- am_diag_loopback_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_SAMP_RATES:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_IN_SAMP_RATES", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- error = am_wiocdata_sr(q, mp, cqp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_SAMP_RATES2:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_IN_SAMP_RATES2", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- error = am_sched_task(q, mp, chptr,
- am_sample_rate_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTLINFO:
- /* AUDIO_MIXERCTL_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTLINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SETINFO);
-
- error = am_sched_task(q, mp, chptr,
- am_mixerctl_setinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_GET_CHINFO:
- /* AUDIO_MIXERCTL_GET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO);
-
- error = am_sched_task(q, mp, chptr, am_get_chinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_OUT_MIXCTL_GET_CHINFO:
- /* AUDIO_MIXERCTL_GET/SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_GET_CHINFO",
- chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_wiocdata_mixerctl_get_chinfo(q, mp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_SET_CHINFO:
- /* AUDIO_MIXERCTL_SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_wiocdata_mixerctl_chinfo(q, mp, cmd);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_SET_CHINFO2:
- /* AUDIO_MIXERCTL_SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_CHINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- error = am_sched_task(q, mp, chptr, am_set_chinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_IN_MIXCTL_MODE:
- /* AUDIO_MIXERCTL_SET_MODE */
- ATRACE("am_wiocdata() AM_COPY_IN_MIXCTL_MODE", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_SET_MODE);
-
- error = am_sched_task(q, mp, chptr, am_set_mode_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AM_COPY_OUT_AUDIOINFO:
- /* AUDIO_GETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_AUDIOINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_GETINFO);
-
- goto done;
-
- case AM_COPY_OUT_AUDIOINFO2:
- /* AUDIO_SETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_AUDIOINFO2", chptr);
- ASSERT(csp->cp_cmd == AUDIO_SETINFO);
-
- send_sig++;
-
- goto done;
-
- case AM_COPY_OUT_GETDEV:
- /* AUDIO_GETDEV */
- ATRACE("am_wiocdata() AM_COPY_OUT_GETDEV", chptr);
- ASSERT(csp->cp_cmd == AUDIO_GETDEV);
-
- goto done;
-
- case AM_COPY_OUT_SAMP_RATES:
- /* AUDIO_MIXER_GET_SAMPLE_RATES */
- ATRACE("am_wiocdata() AM_COPY_OUT_SAMP_RATES", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXER_GET_SAMPLE_RATES);
-
- goto done;
-
- case AM_COPY_OUT_MIXCTLINFO:
- /* AUDIO_MIXERCTL_GET/SETINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTLINFO", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GETINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SETINFO);
-
- /* generate a signal ONLY when we set the info */
- if (csp->cp_cmd == AUDIO_MIXERCTL_SETINFO) {
- send_sig++;
- }
-
- goto done;
-
- case AM_COPY_OUT_MIXCTL_GET_CHINFO2:
- /* AUDIO_MIXERCTL_GET/SET_CHINFO */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_GET_CHINFO2",
- chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_CHINFO ||
- csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO);
-
- /* generate a signal ONLY when we set the info */
- if (csp->cp_cmd == AUDIO_MIXERCTL_SET_CHINFO) {
- send_sig++;
- }
-
- goto done;
-
- case AM_COPY_OUT_MIXCTL_MODE:
- /* AUDIO_MIXERCTL_GET_MODE */
- ATRACE("am_wiocdata() AM_COPY_OUT_MIXCTL_MODE", chptr);
- ASSERT(csp->cp_cmd == AUDIO_MIXERCTL_GET_MODE);
-
- goto done;
-
- default:
- ATRACE("am_wiocdata() No framework cmds found, "
- "check driver entry points next", chptr);
- break;
- }
- }
-
- /* see if we have an entry pt in the Audio Driver */
- if (ad_infop->ad_entry->ad_iocdata) {
- /* we do, so call it */
- ATRACE("am_wiocdata(): "
- "calling Audio Driver iocdata() routine",
- ad_infop->ad_entry);
-
- switch (ad_infop->ad_entry->ad_iocdata(
- AUDIO_STATE2HDL(statep), chptr->ch_info.ch_number,
- q, mp, &error)) {
- case AM_WIOCDATA:
- return (0);
- case AM_ACK:
- goto done;
- case AM_NACK:
- goto done;
- default:
- break;
- }
- }
-
- /* no driver entry, so we nack unrecognized iocdata cmds */
- ATRACE("am_wiocdata() no entry", chptr);
- error = EINVAL;
-
- /* Done checking */
- ATRACE("am_wiocdata() switch & driver check done", chptr);
-
-done:
- ATRACE("am_wiocdata() done", chptr);
-
- if (csp->cp_private) {
- kmem_free(csp->cp_private, sizeof (audio_i_state_t));
- csp->cp_private = NULL;
- }
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- if (send_sig) {
- am_send_signal(statep, stpptr);
- }
-
- ATRACE("am_wiocdata() returning success", chptr);
-
- return (0);
-
-} /* am_wiocdata() */
-
-/*
- * am_wioctl()
- *
- * Description:
- * This routine is called by am_wput() to process all M_IOCTL
- * messages.
- *
- * We only support transparent ioctls. Since this is a driver we
- * nack unrecognized ioctls.
- *
- * This routine also is used to return a IOCNAK if the state pointer
- * or the channel pointer, setup in am_wsvc(), are invalid.
- *
- * The following ioctls are supported:
- * AUDIO_DIAG_LOOPBACK special diagnostics mode
- * AUDIO_DRAIN
- * AUDIO_GETDEV
- * AUDIO_GETINFO
- * AUDIO_SETINFO
- * AUDIO_MIXER_MULTIPLE_OPEN
- * AUDIO_MIXER_SINGLE_OPEN
- * AUDIO_MIXER_GET_SAMPLE_RATES
- * AUDIO_MIXERCTL_GETINFO
- * AUDIO_MIXERCTL_SETINFO
- * AUDIO_MIXERCTL_GET_CHINFO
- * AUDIO_MIXERCTL_SET_CHINFO
- * AUDIO_MIXERCTL_GET_MODE
- * AUDIO_MIXERCTL_SET_MODE
- * unknown call Audio Driver ioctl() routine
- *
- * WARNING: There cannot be any locks owned by calling routines.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- *
- * Returns:
- * 0 Always returns a 0, becomes a return for
- * am_wsvc()
- */
-int
-am_wioctl(queue_t *q, mblk_t *mp, audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- struct iocblk *iocbp;
- struct copyreq *cqp;
- audio_i_state_t *state = NULL;
- audio_device_type_e type = chptr->ch_info.dev_type;
- int command;
- int error = 0;
-
- ATRACE("in am_wioctl()", chptr);
- ATRACE_32("am_wioctl() channel type", chptr->ch_info.dev_type);
-
- ASSERT(statep);
- ASSERT(type == AUDIO || type == AUDIOCTL);
- ASSERT(!MUTEX_HELD(&apm_infop->apm_lock));
-
- iocbp = (struct iocblk *)mp->b_rptr; /* pointer to ioctl info */
- cqp = (struct copyreq *)mp->b_rptr; /* setup copyreq ptr */
-
- command = iocbp->ioc_cmd;
-
- /* make sure this is a transparent ioctl */
- if (iocbp->ioc_count != TRANSPARENT) {
- ATRACE_32("am_wioctl() not TRANSPARENT", iocbp->ioc_count);
- error = EINVAL;
- goto done;
- }
-
- /* get a buffer for priv. data, but only if this isn't an AUDIO_DRAIN */
- if (command != AUDIO_DRAIN) {
- if ((state = kmem_zalloc(sizeof (*state), KM_NOSLEEP)) ==
- NULL) {
- ATRACE("am_wioctl() state kmem_zalloc() failed", 0);
- error = ENOMEM;
- goto done;
- }
- }
-
- ATRACE_32("am_wioctl() command", iocbp->ioc_cmd);
- switch (command) {
-
- case AUDIO_DIAG_LOOPBACK:
- ATRACE("am_wioctl() AUDIO_DIAG_LOOPBACK", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_DIAG_LOOPBACK);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_DRAIN:
- ATRACE("am_wioctl() AUDIO_DRAIN", chptr);
-
- cqp->cq_private = NULL;
- am_wioctl_drain(q, mp, chptr, cqp);
- return (0);
-
- case AUDIO_GETDEV:
- ATRACE("am_wioctl() AUDIO_GETDEV", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_getdev(q, mp, chptr, state);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_GETINFO:
- ATRACE("am_wioctl() AUDIO_GETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_sched_task(q, mp, chptr, am_getinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_SETINFO:
- ATRACE("am_wioctl() AUDIO_SETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_SETINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_MULTIPLE_OPEN:
- ATRACE("am_wioctl() AUDIO_MIXER_MULTIPLE_OPEN", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- if (chptr->ch_info.dev_type != AUDIO) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_multiple_open_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_SINGLE_OPEN:
- ATRACE("am_wioctl() AUDIO_MIXER_SINGLE_OPEN", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- if (chptr->ch_info.dev_type != AUDIO) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_single_open_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXER_GET_SAMPLE_RATES:
- ATRACE("am_wioctl() AUDIO_MIXER_GET_SAMPLE_RATES", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXER_GET_SAMPLE_RATES);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GETINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_sched_task(q, mp, chptr, am_mixerctl_getinfo_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SETINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SETINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SETINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GET_CHINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GET_CHINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_GET_CHINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SET_CHINFO:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SET_CHINFO", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SET_CHINFO);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_GET_MODE:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_GET_MODE", chptr);
-
- cqp->cq_private = (mblk_t *)state;
-
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- error = EINVAL;
- goto done;
- }
-
- error = am_sched_task(q, mp, chptr, am_get_mode_task);
- if (error) {
- goto done;
- }
- return (0);
-
- case AUDIO_MIXERCTL_SET_MODE:
- ATRACE("am_wioctl() AUDIO_MIXERCTL_SET_MODE", chptr);
-
- cqp->cq_private = (mblk_t *)state;
- error = am_wioctl_copyin(q, mp, chptr, state,
- AUDIO_MIXERCTL_SET_MODE);
- if (error) {
- goto done;
- }
- return (0);
-
- default: /* see if we have an entry pt in the Audio Driver */
- if (ad_infop->ad_entry->ad_ioctl) {
- /* we do, so call it */
- ATRACE("am_wioctl(): "
- "calling Audio Driver ioctl() routine",
- ad_infop->ad_entry);
- ASSERT(ad_infop->ad_entry->ad_iocdata);
-
- switch (ad_infop->ad_entry->ad_ioctl(
- AUDIO_STATE2HDL(statep), chptr->ch_info.ch_number,
- q, mp, &error)) {
- case AM_WIOCDATA:
- return (0);
- case AM_ACK:
- goto done;
- case AM_NACK:
- goto done;
- default:
- break;
- }
- }
-
- /* no - we're a driver, so we nack unrecognized ioctls */
- ATRACE_32("am_wioctl() default", iocbp->ioc_cmd);
-
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "wioctl() unrecognized ioc_cmd: 0x%x",
- iocbp->ioc_cmd);
- error = EINVAL;
- break;
- }
-
- /* we always either ack or nack depending on if error is set or not */
- ATRACE_32("am_wioctl() switch done", error);
-
-done:
- ATRACE("am_wioctl() done", chptr);
-
- /* free allocated state memory */
- if (state) {
- kmem_free(state, sizeof (*state));
- }
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE_32("am_wioctl() returning", error);
-
- return (0);
-
-} /* am_wioctl() */
-
-/*
- * Private utilities used by this and other audio mixer files.
- */
-
-/*
- * am_audio_drained()
- *
- * Description:
- * There's an AUDIO_DRAIN ioctl() that is waiting. When the channel
- * goes empty this routine is called to send the ack back to the
- * STREAMS head, which lets the ioctl() return.
- *
- * We also generate a CV signal so that waiting close()s will wakeup.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- *
- * Returns:
- * void
- */
-void
-am_audio_drained(audio_ch_t *chptr)
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = (am_ch_private_t *)chptr->ch_private;
- mblk_t *mp;
-
- ATRACE("in am_audio_drained()", chptr);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* make sure the channel is empty, while locked */
- if (!(chpptr->acp_flags & AM_CHNL_EMPTY)) {
- ATRACE("am_audio_drained() returned, not empty", chptr);
- return;
- }
-
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|AM_CHNL_ALMOST_EMPTY2|\
- AM_CHNL_DRAIN|AM_CHNL_DRAIN_NEXT_INT);
- mp = chpptr->acp_drain_mp;
- chpptr->acp_drain_mp = NULL;
- cv_signal(&chptr->ch_cv);
- ATRACE("am_audio_drained() MP", mp);
-
- /*
- * By definition we don't have any audio to play thus if we need to
- * switch modes we can go ahead and do it now.
- */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
-
- /* ack only if we have an mblk_t */
- if (mp) {
- miocack(WR(chptr->ch_qptr), mp, 0, 0);
- ATRACE("am_audio_drained() AUDIO_DRAIN acked", mp);
- }
-
- ATRACE("am_audio_drained() returning", chptr);
-
-} /* am_audio_drained() */
-
-/*
- * am_audio_set_info()
- *
- * Description:
- * This routine double checks the passed in audio_info_t structure to
- * make sure the values are legal. If they are then they are used to
- * update the audio hardware. In COMPAT mode all the hardware is updated,
- * as it is for a multi-stream Codec. However traditional Codecs in MIXER
- * mode don't update the data format or gain. Everything else can be
- * updated.
- *
- * After the checks are completed and the hardware has been updated
- * the reti pointer is checked. If NULL we are done. Otherwise the
- * structure pointed to by reti is filled in with the new hardware
- * configuration.
- *
- * The mixer only supports a few formats, 16-bit linear and 8-bit
- * u-law, A-law and linear. Any other format will cause the check to
- * fail.
- *
- * We don't bother checking the read only members, silently ignoring any
- * modifications.
- *
- * XXX Need to set hardware to original state if error, especially
- * if src_update() fails. Also, maybe move src_update() up higher so it
- * can fail before we change hardware. Plus, it's easier to undo
- * src_update().
- *
- * NOTE: The Codec's lock must NOT be held when calling this routine.
- *
- * NOTE: reti will be NULL only when this routine is being called by
- * am_open().
- *
- * NOTE: The calling routine is responsible for sending the hardware
- * change signal.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * audio_info_t *newi Pointer to the struct with new values
- * audio_info_t *reti Pointer to the updated struct that is
- * returned
- *
- * Returns:
- * AUDIO_SUCCESS Successful
- * AUDIO_FAILURE Failed
- */
-int
-am_audio_set_info(audio_ch_t *chptr, audio_info_t *newi, audio_info_t *reti)
-{
- audio_info_t *curi; /* current state */
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t tempi; /* approved values in here */
- audio_device_type_e type = chptr->ch_info.dev_type;
- boolean_t ch_ctl = B_FALSE;
- boolean_t new_play_samples = B_FALSE;
- boolean_t new_record_samples = B_FALSE;
- boolean_t play = B_FALSE;
- boolean_t record = B_FALSE;
- boolean_t start_play = B_FALSE;
- boolean_t start_record = B_FALSE;
- boolean_t stop_play = B_FALSE;
- boolean_t stop_record = B_FALSE;
- int codec_type = ad_infop->ad_codec_type;
- int doread;
- int dowrite;
- int mode = stpptr->am_pstate->apm_mode;
- int stream;
-
- ATRACE("in am_audio_set_info()", chptr);
- ATRACE_32("am_audio_set_info() mode", mode);
-
- ASSERT(!mutex_owned(&statep->as_lock));
- ASSERT(apm_infop);
-
- /*
- * Are we playing and/or recording? For AUDIOCTL channels we
- * force play and record, thus checking to see if it is changing
- * the format. Since AUDIOCTL channels can't change the format
- * we fail if the format isn't the same.
- */
- curi = chptr->ch_info.info;
- if ((chptr->ch_dir & AUDIO_PLAY) || type == AUDIOCTL) {
- play = B_TRUE;
- }
- if ((chptr->ch_dir & AUDIO_RECORD) || type == AUDIOCTL) {
- record = B_TRUE;
- }
-
- /*
- * If hardware supports both play and record then we need to do the
- * play vs. record checks.
- */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
-
- /*
- * The AUDIO_MIXERCTL_SETINFO ioctl() creates a pseudo channel that
- * has it's ch_info.info set to hw_info. When in mixer mode this is
- * the only time this happens. For this ioctl() we set only a small
- * number of the h/w specific entries. So we fake out compat mode
- * so that the h/w does get set.
- */
- if (mode == AM_MIXER_MODE && chptr->ch_info.info == hw_info) {
- ATRACE("am_audio_set_info() AUDIO_MIXERCTL_SETINFO ioctl()",
- NULL);
- mode = AM_COMPAT_MODE;
- }
-
- /* we use curi to get info to check against */
- if (mode == AM_COMPAT_MODE) {
- curi = hw_info;
-#ifdef DEBUG
- } else {
- /* this was set above, just be a bit paranoid */
- ASSERT(mode == AM_MIXER_MODE);
- ASSERT(curi == chptr->ch_info.info);
-#endif
- }
-
- /* first make sure the new data format is legal */
- if (play && Modify(newi->play.sample_rate) &&
- newi->play.sample_rate != curi->play.sample_rate) {
- if (type != AUDIO || am_ck_sample_rate(&ad_infop->ad_play,
- mode, newi->play.sample_rate) == AUDIO_FAILURE) {
- goto error;
- }
- tempi.play.sample_rate = newi->play.sample_rate;
- } else {
- tempi.play.sample_rate = curi->play.sample_rate;
- }
- if (record && Modify(newi->record.sample_rate) &&
- newi->record.sample_rate != curi->record.sample_rate) {
- if (type != AUDIO || am_ck_sample_rate(&ad_infop->ad_record,
- mode, newi->record.sample_rate) == AUDIO_FAILURE) {
- goto error;
- }
- tempi.record.sample_rate = newi->record.sample_rate;
- } else {
- tempi.record.sample_rate = curi->record.sample_rate;
- }
- mutex_enter(&statep->as_lock);
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_SR) &&
- tempi.play.sample_rate != tempi.record.sample_rate) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.sample_rate =
- tempi.record.sample_rate;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.sample_rate =
- tempi.play.sample_rate;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /*
- * There's a bug in audiotool which after doing an
- * AUDIO_SETINFO it updates the state in AudioDevice.cc
- * SetState() it uses the record side to get the new
- * sample rate! So work around if write only. Who knows,
- * perhaps other apps are as stupid!
- */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same sample rate, gads! */
- tempi.record.sample_rate =
- tempi.play.sample_rate;
- }
- }
- }
-
- ATRACE_32("am_audio_set_info() PLAY sample rate set",
- tempi.play.sample_rate);
- ATRACE_32("am_audio_set_info() RECORD sample rate set",
- tempi.record.sample_rate);
-
- if (play && Modify(newi->play.channels) &&
- newi->play.channels != curi->play.channels) {
- if (type != AUDIO || am_ck_channels(&ad_infop->ad_play,
- newi->play.channels, B_FALSE) == AUDIO_FAILURE) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.channels = newi->play.channels;
- } else {
- tempi.play.channels = curi->play.channels;
- }
- if (record && Modify(newi->record.channels) &&
- newi->record.channels != curi->record.channels) {
- if (type != AUDIO || am_ck_channels(&ad_infop->ad_record,
- newi->record.channels, B_FALSE) == AUDIO_FAILURE) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.channels = newi->record.channels;
- } else {
- tempi.record.channels = curi->record.channels;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_CH) &&
- tempi.play.channels != tempi.record.channels) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.channels = tempi.record.channels;
- } else if (stpptr->am_in_chs != 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.channels = tempi.play.channels;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same channels, gads! */
- tempi.record.channels = tempi.play.channels;
- }
- }
- }
- ATRACE_32("am_audio_set_info() PLAY channels set",
- tempi.play.channels);
- ATRACE_32("am_audio_set_info() RECORD channels set",
- tempi.record.channels);
-
- if (play && Modify(newi->play.precision) &&
- newi->play.precision != curi->play.precision) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.precision = newi->play.precision;
- } else {
- tempi.play.precision = curi->play.precision;
- }
- if (record && Modify(newi->record.precision) &&
- newi->record.precision != curi->record.precision) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.precision = newi->record.precision;
- } else {
- tempi.record.precision = curi->record.precision;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_PREC) &&
- tempi.play.precision != tempi.record.precision) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.precision = tempi.record.precision;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.precision = tempi.play.precision;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same precision, gads! */
- tempi.record.precision = tempi.play.precision;
- }
- }
- }
- ATRACE_32("am_audio_set_info() PLAY precision set",
- tempi.play.precision);
- ATRACE_32("am_audio_set_info() RECORD precision set",
- tempi.record.precision);
-
- if (play && Modify(newi->play.encoding) &&
- newi->play.encoding != curi->play.encoding) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.play.encoding = newi->play.encoding;
- } else {
- tempi.play.encoding = curi->play.encoding;
- }
- if (record && Modify(newi->record.encoding) &&
- newi->record.encoding != curi->record.encoding) {
- if (type != AUDIO) {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- tempi.record.encoding = newi->record.encoding;
- } else {
- tempi.record.encoding = curi->record.encoding;
- }
- if (doread && dowrite) {
- if (mode == AM_COMPAT_MODE &&
- !(ad_infop->ad_diff_flags & AM_DIFF_ENC) &&
- tempi.play.encoding != tempi.record.encoding) {
- /* if only play or record we can fix this */
- if (stpptr->am_in_chs && stpptr->am_out_chs == 0) {
- /* set play to capture sample rate */
- tempi.play.encoding = tempi.record.encoding;
- } else if (stpptr->am_in_chs == 0 &&
- stpptr->am_out_chs) {
- /* set capture to play sample rate */
- tempi.record.encoding = tempi.play.encoding;
- } else {
- mutex_exit(&statep->as_lock);
- goto error;
- }
- } else {
- /* see audiotool bug description above */
- if (stpptr->am_out_chs != 0 && stpptr->am_in_chs == 0) {
- /* set to the same encoding, gads! */
- tempi.record.encoding = tempi.play.encoding;
- }
- }
- }
- mutex_exit(&statep->as_lock);
-
- ATRACE_32("am_audio_set_info() PLAY encoding set",
- tempi.play.encoding);
- ATRACE_32("am_audio_set_info() RECORD encoding set",
- tempi.record.encoding);
-
- /*
- * In COMPAT mode or with multi-channel Codecs we check against
- * what the hardware allows. Otherwise, we check against what the
- * mixer can deal with. But only if an AUDIO channel.
- */
- if (type == AUDIO) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC) {
- if (dowrite && am_ck_combinations(
- ad_infop->ad_play_comb, tempi.play.encoding,
- tempi.play.precision, B_FALSE) == AUDIO_FAILURE) {
- goto error;
- }
- if (doread && am_ck_combinations(ad_infop->ad_rec_comb,
- tempi.record.encoding, tempi.record.precision,
- B_FALSE) == AUDIO_FAILURE) {
- goto error;
- }
-
- } else { /* AM_MIXER_MODE */
- /* make sure the mixer can deal with the combinations */
- ASSERT(mode == AM_MIXER_MODE);
-
- switch ((int)tempi.play.channels) {
- case -1: /* no change to channel */
- case AUDIO_CHANNELS_MONO:
- case AUDIO_CHANNELS_STEREO:
- break;
- default:
- goto error;
- }
- switch ((int)tempi.record.channels) {
- case -1: /* no change to channel */
- case AUDIO_CHANNELS_MONO:
- case AUDIO_CHANNELS_STEREO:
- break;
- default:
- goto error;
- }
-
- switch ((int)tempi.play.encoding) {
- case -1: /* no change to encoding */
- break;
- case AUDIO_ENCODING_LINEAR: /* signed */
- /* we support 8 & 16-bit linear */
- if (tempi.play.precision != AUDIO_PRECISION_16 &&
- tempi.play.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- case AUDIO_ENCODING_LINEAR8: /* unsigned */
- case AUDIO_ENCODING_ULAW:
- case AUDIO_ENCODING_ALAW:
- /* support 8-bit unsigned linear, u-law & A-law */
- if (tempi.play.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- default:
- goto error;
- }
- switch ((int)tempi.record.encoding) {
- case -1: /* no change to encoding */
- break;
- case AUDIO_ENCODING_LINEAR: /* signed */
- /* we support 8 & 16-bit linear */
- if (tempi.record.precision != AUDIO_PRECISION_16 &&
- tempi.record.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- case AUDIO_ENCODING_LINEAR8: /* unsigned */
- case AUDIO_ENCODING_ULAW:
- case AUDIO_ENCODING_ALAW:
- /* support 8-bit unsigned linear, u-law & A-law */
- if (tempi.record.precision != AUDIO_PRECISION_8) {
- goto error;
- }
- break;
- default:
- goto error;
- }
- }
- }
- ATRACE("am_audio_set_info() precision/encoding checked OK", &tempi);
-
- if (Modify(newi->play.gain)) {
- if (newi->play.gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.play.gain = newi->play.gain;
- } else {
- tempi.play.gain = curi->play.gain;
- }
- if (Modify(newi->record.gain)) {
- if (newi->record.gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.record.gain = newi->record.gain;
- } else {
- tempi.record.gain = curi->record.gain;
- }
- ATRACE_32("am_audio_set_info() PLAY gain set", tempi.play.gain);
- ATRACE_32("am_audio_set_info() RECORD gain set", tempi.record.gain);
-
- if (Modify(newi->play.port)) {
- tempi.play.port = newi->play.port;
- } else {
- tempi.play.port = hw_info->play.port;
- }
- if (tempi.play.port & ~hw_info->play.avail_ports) { /* legal port? */
- goto error;
- }
- /* always turn on un-modifiable ports */
- tempi.play.port |= hw_info->play.avail_ports & ~hw_info->play.mod_ports;
- if (ad_infop->ad_misc_flags & AM_MISC_PP_EXCL) { /* check exclusivity */
- if (am_ck_bits_set32(tempi.play.port) > 1) {
- goto error;
- }
- }
- if (Modify(newi->record.port)) {
- tempi.record.port = newi->record.port;
- } else {
- tempi.record.port = hw_info->record.port;
- }
- if (tempi.record.port & ~hw_info->record.avail_ports) { /* legal ? */
- goto error;
- }
- /* always turn on un-modifiable ports */
- tempi.record.port |=
- hw_info->record.avail_ports & ~hw_info->record.mod_ports;
- /* check exclusivity */
- if (ad_infop->ad_misc_flags & AM_MISC_RP_EXCL) {
- if (am_ck_bits_set32(tempi.record.port) > 1) {
- goto error;
- }
- }
- ATRACE_32("am_audio_set_info() PLAY ports set", tempi.play.port);
- ATRACE_32("am_audio_set_info() RECORD ports set", tempi.record.port);
-
- if (Modifyc(newi->play.balance)) {
- if (newi->play.balance > AUDIO_RIGHT_BALANCE) {
- goto error;
- }
- tempi.play.balance = newi->play.balance;
- } else {
- tempi.play.balance = curi->play.balance;
- }
- if (Modifyc(newi->record.balance)) {
- if (newi->record.balance > AUDIO_RIGHT_BALANCE) {
- goto error;
- }
- tempi.record.balance = newi->record.balance;
- } else {
- tempi.record.balance = curi->record.balance;
- }
-
- ATRACE_32("am_audio_set_info() PLAY balance set", tempi.play.balance);
- ATRACE_32("am_audio_set_info() REC balance set", tempi.record.balance);
-
- if (Modify(newi->monitor_gain)) {
- if (ad_infop->ad_defaults->hw_features &
- AUDIO_HWFEATURE_IN2OUT) {
- if (newi->monitor_gain > AUDIO_MAX_GAIN) {
- goto error;
- }
- tempi.monitor_gain = newi->monitor_gain;
- } else {
- if (newi->monitor_gain != hw_info->monitor_gain) {
- ATRACE("am_audio_set_info() "
- "monitor gain cannot be set", 0);
- goto error;
- }
- tempi.monitor_gain = hw_info->monitor_gain;
- }
- } else {
- tempi.monitor_gain = hw_info->monitor_gain;
- }
- ATRACE_32("am_audio_set_info() monitor gain set", tempi.monitor_gain);
-
- if (dowrite && Modifyc(newi->output_muted)) {
- tempi.output_muted = newi->output_muted;
- } else {
- tempi.output_muted = curi->output_muted;
- }
- ATRACE_32("am_audio_set_info() output muted set", tempi.output_muted);
-
- /*
- * Now that we've got the new values verified we need to update the
- * hardware. The following is updated:
- * COMPAT Mode, All Devices
- * play.minordev (H/W) record.minordev (H/W)
- * COMPAT Mode, AUDIO Device
- * play.sample_rate (H/W) record.sample_rate (H/W)
- * play.channels (H/W) record.channels (H/W)
- * play.precision (H/W) record.precision (H/W)
- * play.encoding (H/W) record.encoding (H/W)
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * COMPAT Mode, AUDIOCTL Device
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * MIXER Mode, All Devices
- * play.minordev (CH) record.minordev (CH)
- * MIXER Mode, AUDIO Device, Traditional Codec
- * play.sample_rate (CH) record.sample_rate (CH)
- * play.channels (CH) record.channels (CH)
- * play.precision (CH) record.precision (CH)
- * play.encoding (CH) record.encoding (CH)
- * play.gain (CH) record.gain (CH)
- * play.balance (CH) record.balance (CH)
- * output_muted (CH)
- * MIXER Mode, AUDIOCTL Device, Traditional Codec, Same Process As
- * An AUDIO Channel, ch_ctl == TRUE
- * play.gain (CH) record.gain (CH)
- * play.balance (CH) record.balance (CH)
- * output_muted (CH)
- * MIXER Mode, AUDIOCTL Device, Traditional Codec, Different Proc.
- * From An AUDIO Channel, ch_ctl == FALSE
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * MIXER Mode, AUDIO Device, Multi-Channel Codec
- * play.sample_rate (CH H/W) record.sample_rate (CH H/W)
- * play.channels (CH H/W) record.channels (CH H/W)
- * play.precision (CH H/W) record.precision (CH H/W)
- * play.encoding (CH H/W) record.encoding (CH H/W)
- * play.gain (CH H/W) record.gain (CH H/W)
- * play.balance (CH H/W) record.balance (CH H/W)
- * output_muted (CH H/W)
- * MIXER Mode, AUDIOCTL Device, Multi-Channel Codec, Same Proc. As
- * An AUDIO Channel, ch_ctl == TRUE
- * play.gain (CH H/W) record.gain (CH H/W)
- * play.balance (CH H/W) record.balance (CH H/W)
- * output_muted (CH H/W)
- * MIXER Mode, AUDIOCTL Device, Multi-Channel Codec, Different
- * Process From An AUDIO, ch_ctl == FALSE
- * play.gain (H/W) record.gain (H/W)
- * play.balance (H/W) record.balance (H/W)
- * output_muted (H/W)
- * All May Modify These Fields
- * play.port (H/W) record.port (H/W)
- * monitor_gain (H/W)
- *
- * If we are in AM_COMPAT_MODE then output_muted controls the hardware,
- * otherwise it just affects the channel, if it is a ch_ctl.
- */
-
- /* only AUDIO channels can affect the data format */
- if (type == AUDIO) {
- /* figure out our "stream number" */
- if (codec_type == AM_MS_CODEC) {
- stream = chptr->ch_info.ch_number;
- } else {
- stream = AM_SET_CONFIG_BOARD;
- }
-
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC) {
- /*
- * We only set the format if there's been a change.
- * Otherwise we risk introducing noise, pops, etc.,
- * for little good reason.
- */
- if (dowrite && (hw_info->play.sample_rate !=
- tempi.play.sample_rate ||
- hw_info->play.channels !=
- tempi.play.channels ||
- hw_info->play.precision !=
- tempi.play.precision ||
- hw_info->play.encoding !=
- tempi.play.encoding)) {
- if (am_set_format(statep, stpptr, ad_infop,
- stream, AUDIO_PLAY,
- tempi.play.sample_rate,
- stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- if (doread && (hw_info->record.sample_rate !=
- tempi.record.sample_rate ||
- hw_info->record.channels !=
- tempi.record.channels ||
- hw_info->record.precision !=
- tempi.record.precision ||
- hw_info->record.encoding !=
- tempi.record.encoding)) {
- if (am_set_format(statep, stpptr, ad_infop,
- stream, AUDIO_RECORD,
- tempi.record.sample_rate,
- stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- }
- /* lock state while updating so ISR calls will be okay */
- mutex_enter(&chptr->ch_lock);
- if (mode == AM_MIXER_MODE) {
- curi->play.sample_rate = tempi.play.sample_rate;
- curi->play.channels = tempi.play.channels;
- curi->play.precision = tempi.play.precision;
- curi->play.encoding = tempi.play.encoding;
- curi->record.sample_rate = tempi.record.sample_rate;
- curi->record.channels = tempi.record.channels;
- curi->record.precision = tempi.record.precision;
- curi->record.encoding = tempi.record.encoding;
- } else {
- hw_info->play.sample_rate = tempi.play.sample_rate;
- hw_info->play.channels = tempi.play.channels;
- hw_info->play.precision = tempi.play.precision;
- hw_info->play.encoding = tempi.play.encoding;
- hw_info->record.sample_rate = tempi.record.sample_rate;
- hw_info->record.channels = tempi.record.channels;
- hw_info->record.precision = tempi.record.precision;
- hw_info->record.encoding = tempi.record.encoding;
- }
-
- /* see if we need to update the sample rate conv. routines */
- if (mode == AM_MIXER_MODE && codec_type == AM_TRAD_CODEC) {
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
-
- if (chpptr->acp_writing) {
- ATRACE("am_audio_set_info() PLAY, "
- "calling src update", chpptr);
- if (ad_infop->ad_play.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(chptr),
- &((audio_info_t *)chptr->ch_info.info)->
- play,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- play,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_play.ad_sr_info,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- ATRACE("am_audio_set_info() "
- "play src_update() failed", 0);
- mutex_exit(&chptr->ch_lock);
- goto error;
- }
- }
- if (chpptr->acp_reading) {
- ATRACE("am_audio_set_info() RECORD, "
- "calling src update", chpptr);
- if (ad_infop->ad_record.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(chptr),
- &((audio_info_t *)chptr->ch_info.info)->
- record,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- record,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_record.ad_sr_info,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- ATRACE("am_audio_set_info() "
- "record src_update() failed", 0);
- mutex_exit(&chptr->ch_lock);
- goto error;
- }
- }
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- /* is this an AUDIOCTL ch with the PID as another AUDIO ch? */
- mutex_enter(&chptr->ch_lock);
- ch_ctl = (chpptr->acp_flags & AM_CHNL_CONTROL) ? B_TRUE : B_FALSE;
- mutex_exit(&chptr->ch_lock);
-
- /* re-figure out our "stream number" */
- if (mode == AM_COMPAT_MODE || (mode == AM_MIXER_MODE && !ch_ctl)) {
- stream = AM_SET_CONFIG_BOARD;
- } else {
- stream = chptr->ch_info.ch_number;
- }
-
- /*
- * AUDIO and AUDIOCTL can affect gains, ports, etc. If in COMPAT
- * mode or a MS Codec we affect hardware. Otherwise this is a
- * virtual ch. and only that channel's parameters are affected,
- * i.e., no hardware update. Also, if a MS Codec and an AUDIOCTL
- * channel isn't associated with a particular stream then we don't
- * muck with hardware either.
- */
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- (type == AUDIOCTL && !ch_ctl)) {
- if (dowrite && am_set_gain(statep, apm_infop,
- stpptr->am_hw_pchs, (tempi.play.gain & 0x0ff),
- tempi.play.balance, AUDIO_PLAY, stream, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- if (doread && am_set_gain(statep, apm_infop,
- stpptr->am_hw_rchs, (tempi.record.gain & 0x0ff),
- tempi.record.balance, AUDIO_RECORD, stream, AM_NO_FORCE,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- /* only if output_muted actually changed */
- if (hw_info->output_muted != tempi.output_muted) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_OUTPUT_MUTE, AUDIO_PLAY, tempi.output_muted,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- }
- if (mode == AM_MIXER_MODE) {
- curi->play.gain = tempi.play.gain;
- curi->play.balance = tempi.play.balance;
- curi->record.gain = tempi.record.gain;
- curi->record.balance = tempi.record.balance;
- curi->output_muted = tempi.output_muted;
- tempi.play.minordev = curi->play.minordev;
- tempi.record.minordev = curi->record.minordev;
- } else {
- hw_info->play.gain = tempi.play.gain;
- hw_info->play.balance = tempi.play.balance;
- hw_info->record.gain = tempi.record.gain;
- hw_info->record.balance = tempi.record.balance;
- hw_info->output_muted = tempi.output_muted;
- tempi.play.minordev = hw_info->play.minordev;
- tempi.record.minordev = hw_info->record.minordev;
- }
-
- /* now we can set the ports and monitor gain, since all can set them */
- if (tempi.play.port != hw_info->play.port) {
- /* only if the play port actually changed */
- if (hw_info->play.port != tempi.play.port) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_PORT, AUDIO_PLAY, tempi.play.port, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->play.port = tempi.play.port;
- }
- if (tempi.record.port != hw_info->record.port) {
- /* only if the record port actually changed */
- if (hw_info->record.port != tempi.record.port) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_PORT, AUDIO_RECORD, tempi.record.port,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->record.port = tempi.record.port;
- }
- if (tempi.monitor_gain != hw_info->monitor_gain) {
- /* only if the monitor gain actually changed */
- if (hw_info->monitor_gain != tempi.monitor_gain) {
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, tempi.monitor_gain,
- NULL, AM_SERIALIZE) == AUDIO_FAILURE) {
- goto error;
- }
- }
- hw_info->monitor_gain = tempi.monitor_gain;
- }
-
- /* we need to update the virtual channel, if we have one */
- if (mode == AM_MIXER_MODE) {
- curi->play.port = tempi.play.port;
- curi->record.port = tempi.record.port;
- curi->monitor_gain = tempi.monitor_gain;
- }
-
- /* now fix virtual channel parameters */
- if (Modify(newi->play.buffer_size)) {
- tempi.play.buffer_size = newi->play.buffer_size;
- } else {
- tempi.play.buffer_size = curi->play.buffer_size;
- }
- if (Modify(newi->record.buffer_size)) {
- tempi.record.buffer_size = newi->record.buffer_size;
- } else {
- tempi.record.buffer_size = curi->record.buffer_size;
- }
- ATRACE("am_audio_set_info() buffer size set", &tempi);
-
- if (Modify(newi->play.samples)) {
- tempi.play.samples = newi->play.samples;
- new_play_samples = B_TRUE;
- } else {
- tempi.play.samples = curi->play.samples;
- }
- if (Modify(newi->record.samples)) {
- tempi.record.samples = newi->record.samples;
- new_record_samples = B_TRUE;
- } else {
- tempi.record.samples = curi->record.samples;
- }
- ATRACE("am_audio_set_info() samples updated", &tempi);
-
- if (Modify(newi->play.eof)) {
- tempi.play.eof = newi->play.eof;
- } else {
- tempi.play.eof = curi->play.eof;
- }
- ATRACE("am_audio_set_info() eof updated", &tempi);
-
- if (Modifyc(newi->play.pause)) {
- tempi.play.pause = newi->play.pause;
- } else {
- tempi.play.pause = curi->play.pause;
- }
- if (Modifyc(newi->record.pause)) {
- tempi.record.pause = newi->record.pause;
- } else {
- tempi.record.pause = curi->record.pause;
- }
- /* if we unpaused we need to make sure we start up again */
- if (!tempi.play.pause && curi->play.pause) {
- start_play = B_TRUE;
- } else if (tempi.play.pause && !curi->play.pause &&
- (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC)) {
- stop_play = B_TRUE;
- }
- if (!tempi.record.pause && curi->record.pause) {
- start_record = B_TRUE;
- } else if (tempi.record.pause && !curi->record.pause &&
- (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC)) {
- stop_record = B_TRUE;
- }
- ATRACE("am_audio_set_info() pause set", &tempi);
-
- if (Modifyc(newi->play.error)) {
- tempi.play.error = newi->play.error;
- } else {
- tempi.play.error = curi->play.error;
- }
- if (Modifyc(newi->record.error)) {
- tempi.record.error = newi->record.error;
- } else {
- tempi.record.error = curi->record.error;
- }
- ATRACE("am_audio_set_info() error updated", &tempi);
-
- if (Modifyc(newi->play.waiting)) {
- tempi.play.waiting = newi->play.waiting;
- } else {
- tempi.play.waiting = curi->play.waiting;
- }
- if (Modifyc(newi->record.waiting)) {
- tempi.record.waiting = newi->record.waiting;
- } else {
- tempi.record.waiting = curi->record.waiting;
- }
- ATRACE("am_audio_set_info() waiting updated", &tempi);
-
- /*
- * For MIXER mode we must update virtual channel parameters, because
- * as soon as we restart the DMA engine(s) it's going to ask for audio.
- * If the pause is still in effect then no data is going to be
- * transferred.
- */
- if (mode == AM_MIXER_MODE) {
- mutex_enter(&chptr->ch_lock);
- curi->play.buffer_size = tempi.play.buffer_size;
- curi->play.pause = tempi.play.pause;
- curi->play.eof = tempi.play.eof;
- curi->play.error = tempi.play.error;
- curi->play.waiting = tempi.play.waiting;
- curi->record.buffer_size = tempi.record.buffer_size;
- curi->record.pause = tempi.record.pause;
- curi->record.error = tempi.record.error;
- curi->record.waiting = tempi.record.waiting;
- mutex_exit(&chptr->ch_lock);
- }
-
- /* before we leave, we need to restart the DMA engines, or ... */
- if (start_play == B_TRUE) {
- /* make sure the play DMA engine is running */
- ASSERT(stop_play == B_FALSE);
- ATRACE("am_audio_set_info() start play", chptr);
- curi->play.pause = 0; /* must be before the call */
- curi->play.active = 1; /* set before start for mode switch */
- hw_info->play.active = 1;
- if (am_ad_start_play(statep, stpptr, ad_infop, stream,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- /* we don't change pause flag if failed to start */
- curi->play.active = 0;
- hw_info->play.active = 0;
- /*
- * Since we are serialized we don't worry about the
- * mode switch CV like am_wsvc() has to.
- */
- } else {
- am_send_signal(statep, stpptr);
- }
- } else if (stop_play == B_TRUE) {
- /* make sure the play DMA engine is paused */
- ATRACE("am_audio_set_info() pause play", chptr);
- am_ad_pause_play(statep, stpptr, ad_infop, stream);
- curi->play.active = 0;
- hw_info->play.active = 0;
- curi->play.pause = 1;
- am_send_signal(statep, stpptr);
- }
- if (start_record == B_TRUE) {
- /* make sure the record DMA engine is running */
- ASSERT(stop_record == B_FALSE);
- ATRACE("am_audio_set_info() start record", chptr);
- curi->record.pause = 0; /* must be before the call */
- curi->record.active = 1; /* set before start for mode switch */
- hw_info->record.active = 1;
- if (am_ad_start_record(statep, stpptr, ad_infop, stream,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- curi->record.active = 0;
- hw_info->record.active = 0;
- /* we don't change pause flag if failed to start */
- } else {
- am_send_signal(statep, stpptr);
- }
- } else if (stop_record == B_TRUE) {
- /* make sure the record DMA engine is stopped */
- ATRACE("am_audio_set_info() stop record", chptr);
- am_ad_stop_record(statep, stpptr, ad_infop, stream);
- curi->record.pause = 1;
- curi->record.active = 0;
- hw_info->record.active = 0;
- am_send_signal(statep, stpptr);
- }
-
- /*
- * For COMPAT mode we are dealing with the hardware, not a virtual
- * channel. So the true state of the hardware can't be modified before
- * starting or stopping the DMA engine(s).
- */
- if (mode == AM_COMPAT_MODE) {
- mutex_enter(&chptr->ch_lock);
- hw_info->play.buffer_size = tempi.play.buffer_size;
- hw_info->play.pause = tempi.play.pause;
- hw_info->play.eof = tempi.play.eof;
- hw_info->play.error = tempi.play.error;
- hw_info->play.waiting = tempi.play.waiting;
- hw_info->record.buffer_size = tempi.record.buffer_size;
- hw_info->record.pause = tempi.record.pause;
- hw_info->record.error = tempi.record.error;
- hw_info->record.waiting = tempi.record.waiting;
- mutex_exit(&chptr->ch_lock);
- }
-
- /* everything passed so we can update the samples count */
- if (new_play_samples) {
- curi->play.samples = tempi.play.samples;
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_psamples_c = 0;
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_p = 0;
- mutex_exit(&chptr->ch_lock);
- }
- if (new_record_samples) {
- curi->record.samples = tempi.record.samples;
- }
-
- /*
- * If we don't have a reti pointer we ignore the R/O members. If we
- * need them we get them directly from the channel that is active.
- * So if reti == NULL we are done. Otherwise copy tempi into the
- * memory pointed to by reti and then copy over the R/O members.
- *
- * We pass the reserved members, just in case.
- * play._xxx[1] record._xxx[1]
- * _xxx[1]
- * _xxx[2]
- */
- if (reti != NULL) {
- ATRACE("am_audio_set_info() reti succeeded", chptr);
-
- /* do a quick copy, and then fill in the special fields */
- bcopy(curi, reti, sizeof (*curi));
-
- mutex_enter(&chptr->ch_lock);
- reti->play.avail_ports = hw_info->play.avail_ports;
- reti->record.avail_ports = hw_info->record.avail_ports;
- reti->play.mod_ports = hw_info->play.mod_ports;
- reti->record.mod_ports = hw_info->record.mod_ports;
- reti->record.eof = 0;
- reti->monitor_gain = hw_info->monitor_gain;
- reti->output_muted = hw_info->output_muted;
- reti->hw_features = hw_info->hw_features;
- reti->sw_features = hw_info->sw_features;
- reti->sw_features_enabled = hw_info->sw_features_enabled;
- mutex_exit(&chptr->ch_lock);
- }
-
- ATRACE("am_audio_set_info() succeeded", chptr);
-
- return (AUDIO_SUCCESS);
-
-error:
- ATRACE("am_audio_set_info() failed", chptr);
-
- return (AUDIO_FAILURE);
-
-} /* am_audio_set_info() */
-
-/*
- * am_set_format()
- *
- * Description:
- * Set the hardware to the desired format. If the format is not
- * supported we set it to the next best thing. Then the audio is
- * translated to the desired format during playback or record.
- *
- * NOTE: All setting of the hardware format MUST be done via this
- * routine. Thus this is the only place the am_hw_* members
- * are updated.
- *
- * NOTE: We don't worry about checking the sample rate. This routine
- * won't be called with a sample rate that isn't legal according
- * to the audio driver's configuration tables.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * am_apm_private_t *stpptr Ptr to APM private data
- * am_ad_info_t *ad_infop Ptr to the AD's config info
- * int stream Audio stream
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Sample rate to set
- * int channels The number of channels to set
- * int precision The sample precision
- * int encoding The encoding method
- * int force Force the format to be set
- * int serialize Serialize calls into driver
- *
- * Returns:
- * AUDIO_SUCCESS The format was successfully set
- * AUDIO_FAILURE The format wasn't set
- */
-int
-am_set_format(audio_state_t *statep, am_apm_private_t *stpptr,
- am_ad_info_t *ad_infop, int stream, int dir, int sample_rate,
- int channels, int precision, int encoding, int force, int serialize)
-{
- uint_t hw_sr;
- uint_t hw_chs;
- uint_t hw_enc;
- uint_t hw_prec;
- uint_t new_chs;
- uint_t new_enc;
- uint_t new_prec;
- int flags;
-
- ATRACE("in am_set_format()", statep);
- ATRACE_32("am_set_format() passed sample rate", sample_rate);
-
- if (dir == AUDIO_PLAY) {
- flags = stpptr->am_pflags;
- hw_sr = stpptr->am_hw_info.play.sample_rate;
- hw_chs = stpptr->am_hw_pchs;
- hw_enc = stpptr->am_hw_penc;
- hw_prec = stpptr->am_hw_pprec;
- } else if (dir == AUDIO_RECORD) {
- flags = stpptr->am_rflags;
- hw_sr = stpptr->am_hw_info.record.sample_rate;
- hw_chs = stpptr->am_hw_rchs;
- hw_enc = stpptr->am_hw_renc;
- hw_prec = stpptr->am_hw_rprec;
- } else {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "set_format() bad direction: %d", dir);
- return (AUDIO_FAILURE);
- }
-
- /* start with channels */
- switch (channels) {
- case AUDIO_CHANNELS_MONO:
- /* try to set the same 1st */
- if (flags & AM_PRIV_CH_MONO) {
- new_chs = AUDIO_CHANNELS_MONO;
- } else {
- /* we have to use stereo, so will need to translate */
- ASSERT(flags & AM_PRIV_CH_STEREO);
- new_chs = AUDIO_CHANNELS_STEREO;
- }
- break;
- case AUDIO_CHANNELS_STEREO:
- /* try to set the same 1st */
- if (flags & AM_PRIV_CH_STEREO) {
- new_chs = AUDIO_CHANNELS_STEREO;
- } else {
- /* we have to use mono, so will need to translate */
- ASSERT(flags & AM_PRIV_CH_MONO);
- new_chs = AUDIO_CHANNELS_MONO;
- }
- break;
- default:
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_NOTE, "set_format() bad channels: %d",
- channels);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_set_format() passed channels", channels);
- ATRACE_32("am_set_format() derived channels", new_chs);
-
- /* check the precision */
- if (precision == AUDIO_PRECISION_16) {
- /* see if the hardware supports what we want */
- if (flags & AM_PRIV_16_PCM) {
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- /* the h/w doesn't, so pick an alternative */
- new_prec = AUDIO_PRECISION_8;
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- ASSERT(flags & AM_PRIV_8_PCM);
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else {
- ASSERT(precision == AUDIO_PRECISION_8);
- /* just like above go through the list to see what we can use */
- new_prec = AUDIO_PRECISION_8;
- if (encoding == AUDIO_ENCODING_LINEAR) {
- if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else if (encoding == AUDIO_ENCODING_ULAW) {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else {
- if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- } else {
- ASSERT(encoding == AUDIO_ENCODING_ALAW);
- if (flags & AM_PRIV_8_ALAW) {
- new_enc = AUDIO_ENCODING_ALAW;
- } else {
- if (flags & AM_PRIV_8_ULAW) {
- new_enc = AUDIO_ENCODING_ULAW;
- } else if (flags & AM_PRIV_8_PCM) {
- new_enc = AUDIO_ENCODING_LINEAR;
- } else {
- ASSERT(flags & AM_PRIV_16_PCM);
- new_prec = AUDIO_PRECISION_16;
- new_enc = AUDIO_ENCODING_LINEAR;
- }
- }
- }
- }
- ATRACE_32("am_set_format() passed precision", precision);
- ATRACE_32("am_set_format() derived precision", new_prec);
- ATRACE_32("am_set_format() passed encoding", encoding);
- ATRACE_32("am_set_format() derived encoding", new_enc);
-
- /*
- * We now have the best possible h/w configuration. We see if
- * it matches what we already have. If so then there's nothing
- * to do. Otherwise the driver is called to set the hardware.
- * If we do call the h/w we use the derived format, not the
- * format passed to this routine.
- */
- if (hw_sr != sample_rate || hw_chs != new_chs ||
- hw_enc != new_enc || hw_prec != new_prec || force) {
- ATRACE("am_set_format() calling am_ad_set_format()", 0);
- if (am_ad_set_format(statep, stpptr, ad_infop, stream, dir,
- sample_rate, new_chs, new_prec, new_enc, serialize) ==
- AUDIO_FAILURE) {
- ATRACE("am_set_format() am_ad_set_format() failed", 0);
- return (AUDIO_FAILURE);
- }
- /* update the true hardware image */
- /* XXX this is probably not right! */
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*stpptr))
- if (dir == AUDIO_PLAY) {
- stpptr->am_hw_info.play.sample_rate = sample_rate;
- stpptr->am_hw_pchs = new_chs;
- stpptr->am_hw_pprec = new_prec;
- stpptr->am_hw_penc = new_enc;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- stpptr->am_hw_info.record.sample_rate = sample_rate;
- stpptr->am_hw_rchs = new_chs;
- stpptr->am_hw_rprec = new_prec;
- stpptr->am_hw_renc = new_enc;
- }
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*stpptr))
- }
-
- /* there's no hardware change so just return */
- ATRACE("am_set_format() just returning", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_set_format() */
-
-/*
- * am_set_gain()
- *
- * Description:
- * This routine is used to set the gain of all channels in the Codec.
- * The gain is modified by balance. We try two different methods, the
- * first with the gain and balance, and the second with gain and balance
- * mixed down into left and right gain. This lets the Audio Driver accept
- * whichever format it prefers. If the Audio Driver doesn't like the
- * first method it returns AUDIO_FAILURE and the second is tried.
- *
- * Some Codecs, like the Crystal 4231, will copy a mono input signal
- * over to the 2nd channel. If this is the case then we apply balance
- * to the left and right channels. Otherwise we adjust the only left
- * gain.
- *
- * NOTE: We change the gain only if it actually did change.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * audio_apm_info_t *apm_infop Ptr to driver's audio_apm_info structure
- * uint_t channels The number of h/w channels
- * uint_t gain The gain to set
- * uint_t balance The balance to set
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int stream The hardware stream to set gain on
- * int force Force the gain to be set
- * int serialize Serialize access to the audio driver
- *
- * Returns:
- * AUDIO_SUCCESS The gain was successfully set
- * AUDIO_FAILURE The gain was not successfully set
- */
-int
-am_set_gain(audio_state_t *statep, audio_apm_info_t *apm_infop, uint_t channels,
- uint_t gain, uint_t balance, int dir, int stream, int force,
- int serialize)
-{
- audio_prinfo_t *hw_pinfo;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- uint_t g;
-
- ATRACE("in am_set_gain()", apm_infop);
- ATRACE("am_set_gain() channels", channels);
- ATRACE("am_set_gain() gain", gain);
- ATRACE("am_set_gain() balance", balance);
-
- if (dir == AUDIO_PLAY) {
- hw_pinfo = &((audio_info_t *)apm_infop->apm_ad_state)->play;
- } else {
- ASSERT(dir == AUDIO_RECORD);
- hw_pinfo = &((audio_info_t *)apm_infop->apm_ad_state)->record;
- }
-
- /* 1st try the gain and balance method since it's the easiest for us */
- if (am_ad_set_config(statep, stpptr, ad_infop, stream, AM_SET_GAIN_BAL,
- dir, gain, balance, serialize) == AUDIO_SUCCESS) {
- ATRACE("am_set_gain() AM_SET_GAIN_BAL successful", 0);
- return (AUDIO_SUCCESS);
- }
-
- if (channels == 1 && !(ad_infop->ad_misc_flags & AM_MISC_MONO_DUP)) {
- /* make sure there was a change */
- if (!force && (hw_pinfo->gain == gain)) {
- ATRACE_32("am_set_gain() mono, the same gain", gain);
- return (AUDIO_SUCCESS);
- }
-
- /* we always set left gain */
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) == AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- return (AUDIO_SUCCESS);
- } else {
- /* make sure there was a change */
- if (!force &&
- (hw_pinfo->gain == gain) &&
- (hw_pinfo->balance == balance)) {
- ATRACE_32("am_set_gain() stereo, the same gain", gain);
- ATRACE_32("am_set_gain() stereo, the same balance",
- balance);
- return (AUDIO_SUCCESS);
- }
-
- /*
- * Balance adjusts gain. If balance < 32 then left is
- * enhanced by attenuating right. If balance > 32 then
- * right is enhanced by attenuating left.
- */
- if (balance == AUDIO_MID_BALANCE) { /* no adj. */
- /* left channel */
- ATRACE_32("am_set_gain() L1 gain", gain);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R1 gain", gain);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, gain, 1, serialize));
- } else if (balance < AUDIO_MID_BALANCE) {
- /*
- * l = gain
- * r = (gain * balance) / 32
- */
- g = (gain * balance) >> AM_BALANCE_SHIFT;
- /* left channel */
- ATRACE_32("am_set_gain() L2 gain", gain);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, gain, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R2 gain", g);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, g, 1, serialize));
- } else {
- /*
- * l = (gain * (64 - balance)) / 32
- * r = gain
- */
- g = (gain * (AUDIO_RIGHT_BALANCE - balance)) >>
- AM_BALANCE_SHIFT;
- /* left channel */
- ATRACE_32("am_set_gain() L3 gain", g);
- if (am_ad_set_config(statep, stpptr, ad_infop, stream,
- AM_SET_GAIN, dir, g, 0, serialize) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
- /* right channel */
- ATRACE_32("am_set_gain() R3 gain", gain);
- return (am_ad_set_config(statep, stpptr, ad_infop,
- stream, AM_SET_GAIN, dir, gain, 1, serialize));
- }
- }
-
-} /* am_set_gain() */
-
-/*
- * Private utilities used only by this file.
- */
-
-/*
- * am_ck_bits_set32()
- *
- * Description:
- * This routine figures out how many bits are set in the passed in val.
- *
- * Arguments:
- * uint val The argument to test
- *
- * Returns:
- * 0 - 32 The number of bits set
- */
-int
-am_ck_bits_set32(uint_t val)
-{
- uint_t mask = 0x00000001u;
- int count;
- int i;
-
- ATRACE_32("in am_ck_bits_set32()", val);
-
- for (i = 0, count = 0; i < 32; i++) {
- if (mask & val) {
- count++;
- }
- mask <<= 1;
- }
-
- ATRACE_32("am_ck_bits_set32() done", count);
-
- return (count);
-
-} /* am_ck_bits_set32() */
-
-/*
- * am_exit_task()
- *
- * Description:
- * Exit from a task. This means decrementing the task counter so a
- * blocked close() may continue.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel's struct
- *
- * Returns:
- * void
- */
-static void
-am_exit_task(audio_ch_t *chptr)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_exit_task()", chptr);
-
- mutex_enter(&chptr->ch_lock);
-
- /* clear the taskq flag */
- chpptr->acp_flags &= ~AM_CHNL_IOCTL_TASK;
-
- ATRACE_32("am_exit_task() flag cleared", chpptr->acp_flags);
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_exit_task() done", chpptr);
-
-} /* am_exit_task() */
-
-/*
- * am_fix_info()
- *
- * Description:
- * When in mixer mode we usually play at a different sample rate
- * than the data stream from the application. Therefore the sample
- * count from the Codec is meaningless. This routine adjusts for the
- * difference in sample rates.
- *
- * We only adjust the play sample count because when recording you send
- * x samples so you always know how many samples you sent so you don't
- * have to adjust.
- *
- * If this is an AUDIOCTL channel and it is associated with the H/W
- * we don't do anything.
- *
- * We also fix port and pause info, as well as other H/W related info,
- * depending on the mixer mode.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel's state structure
- * audio_info_t *info Ptr to the info structure to update
- *
- * Returns:
- * void
- */
-static void
-am_fix_info(audio_ch_t *chptr, audio_info_t *info)
-{
- audio_device_type_e type = chptr->ch_info.dev_type;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- int mode = stpptr->am_pstate->apm_mode;
-
- ATRACE("in am_fix_info()", chptr);
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- /* first, update the features */
- info->hw_features = hw_info->hw_features;
- info->sw_features = hw_info->sw_features;
- info->sw_features_enabled = hw_info->sw_features_enabled;
-
- /* now fix various other things */
- if (mode == AM_MIXER_MODE) {
- ATRACE("am_fix_info() fixing other things", 0);
- if (info->play.pause) {
- info->play.active = 0;
- }
- info->play.port = hw_info->play.port;
- if (info->record.pause) {
- info->record.active = 0;
-
- }
- info->record.port = hw_info->record.port;
- info->monitor_gain = hw_info->monitor_gain;
- }
-
- /*
- * CAUTION: Don't place anything related to record below this
- * point. Otherwise it may not execute.
- *
- * Finally, fix play samples, if we need to.
- */
- if (!chpptr->acp_writing || (type == AUDIOCTL &&
- hw_info == chptr->ch_info.info)) {
-
- ATRACE_32("am_fix_info() not writing, returning",
- chpptr->acp_writing);
-
- return;
- } else {
- if (mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- ATRACE("am_fix_info() sample conversion", 0);
-
- info->play.samples +=
- ad_infop->ad_play.ad_conv->ad_src_adjust(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY,
- chpptr->acp_psamples_p);
- } else {
- ATRACE("am_fix_info() NO sample conversion",
- info->play.samples);
-
- info->play.samples += chpptr->acp_psamples_p;
- }
- }
-
- ATRACE("am_fix_info() done", info);
-
-} /* am_fix_info() */
-
-/*
- * am_fix_play_pause()
- *
- * Description:
- * Convenience routine to clean up the code for switching to
- * mixer mode while paused.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel
- *
- * Returns:
- * void
- */
-static void
-am_fix_play_pause(audio_ch_t *chptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info = chptr->ch_info.info;
- audio_data_t *data;
-
- ATRACE("in am_fix_play_pause()", chptr);
-
- /*
- * It is possible that the channel was paused and then the mode
- * was switched. Thus we are most likely changing modes not on
- * a message boundary. Thus we need to make a best guess as to
- * where to start playing.
- */
- if (info->play.pause &&
- (data = audio_sup_get_audio_data(chptr)) != NULL) {
- /* it's remotely possible that we happen to be at the end */
- if (data->adata_optr >= data->adata_oeptr) {
- ATRACE("am_fix_play_pause() end of message", statep);
-
- /* don't let it be played again! */
- audio_sup_free_audio_data(data);
- return;
- } else if (data->adata_orig == data->adata_optr) {
- /* or that we are just about to use a new msg */
- ATRACE("am_fix_play_pause() new message", statep);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(chptr, data);
- return;
- }
-
- /* see if we need to process the data */
- mutex_enter(&chptr->ch_lock);
- if (data->adata_proc == NULL && am_reprocess(chptr, data) ==
- AUDIO_FAILURE) {
- mutex_exit(&chptr->ch_lock);
- /*
- * For some reason we can't convert the message and
- * there isn't much we can do, so just blow it away
- * and live with the gap in audio. We don't fail
- * changing modes because that went okay.
- */
- ATRACE("am_fix_play_pause() am_reprocess() failed",
- statep);
- return;
- }
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_fix_play_pause() process successful", data);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(chptr, data);
- }
-
- ATRACE("am_fix_play_pause() successful", statep);
-
-} /* am_fix_play_pause() */
-
-/*
- * am_mixer_task_acknack()
- *
- * Description:
- * Sometimes when a taskq thread is done the ioctl() is also done.
- * To finish off an ioctl() an M_IOCACK or M_IOCNAK message must be sent
- * up to the STREAMS head. This routine performs that task.
- *
- * Arguments:
- * audio_i_state_t *state Pointer to the ioctl() state structure
- * audio_ch_t *chptr Ptr 2 the channel's state structure
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the STREAMS message to use
- * am_ioctl_args_t *arg Argument structure
- * int error 0 if no error, errno otherwise
- *
- * Returns:
- * void
- */
-static void
-am_mixer_task_acknack(audio_i_state_t *state, audio_ch_t *chptr,
- queue_t *q, mblk_t *mp, am_ioctl_args_t *arg, int error)
-{
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
-
- ATRACE("in am_mixer_task_acknack()", state);
-
- /* no memory leaks allowed */
- if (state->ais_address2) {
- freemsg((mblk_t *)state->ais_address2);
- }
-
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
-
- ATRACE_32("am_mixer_task_acknack() error", error);
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- /* let am_close() proceed */
- am_exit_task(chptr);
-
- kmem_free(arg, sizeof (*arg));
-
- ATRACE("am_mixer_task_acknack() done", mp);
-
-} /* am_mixer_task_acknack() */
-
-/*
- * am_restart()
- *
- * Description:
- * This routine is used to restart playing and recording audio when
- * they have been stopped to switch mixer modes.
- *
- * NOTE: This can only be for traditional Codecs, multi-stream Codecs
- * aren't stopped to changed modes.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * audio_info_t *hw_info Pointer to the hardware state
- *
- * Returns:
- * void
- */
-static void
-am_restart(audio_state_t *statep, audio_info_t *hw_info)
-{
- audio_ch_t *tchptr;
- am_ch_private_t *chpptr;
- audio_apm_info_t *apm_infop;
- am_apm_private_t *stpptr;
- am_ad_info_t *ad_infop;
- audio_info_t *tinfo;
- int i;
- int max_chs = statep->as_max_chs;
-
- ATRACE("in am_restart()", statep);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_restart() failed");
- return;
- }
- stpptr = apm_infop->apm_private;
- ad_infop = apm_infop->apm_ad_infop;
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
-
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
-
- chpptr = tchptr->ch_private;
- tinfo = tchptr->ch_info.info;
-
- if (chpptr->acp_writing) {
- /* turn the Q back on */
- enableok(WR(tchptr->ch_qptr));
- qenable(WR(tchptr->ch_qptr));
-
- /* make sure we'll be flow controlled in am_wsvc() */
- chpptr->acp_flags &= ~AM_CHNL_PFLOW;
-
- /*
- * It is possible we switched modes right when the last
- * message was played and there's no way we're going
- * to get the three calls to am_get_samples() we need
- * to call cv_signal() for AUDIO_DRAIN. Therefore we
- * set AM_CHNL_EMPTY, which means the next time
- * am_get_samples() is called, which will happen when
- * we start playing below, it does the cv_signal().
- * We can subvert the number of times am_get_samples()
- * needs to be called because we know the DMA buffers
- * have been drained.
- */
- if (audio_sup_get_audio_data_cnt(tchptr) == 0 &&
- chpptr->acp_flags & AM_CHNL_DRAIN) {
- chpptr->acp_flags &= ~(AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2|AM_CHNL_DRAIN|\
- AM_CHNL_DRAIN_NEXT_INT);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- /* signal any DRAIN situation */
- am_audio_drained(tchptr);
- }
- ATRACE("am_restart() starting playing again", tchptr);
-
- mutex_exit(&tchptr->ch_lock);
- if (!tinfo->play.pause) {
- /* set before start for mode switch */
- if (tinfo->play.active == 0) {
- am_send_signal(statep, stpptr);
- }
- tinfo->play.active = 1;
- hw_info->play.active = 1;
- if (am_ad_start_play(statep, stpptr, ad_infop,
- tchptr->ch_info.ch_number, AM_SERIALIZE) ==
- AUDIO_FAILURE) {
- /*
- * We don't change pause if failed to
- * start.
- */
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- /*
- * Since we are part of the mode switch
- * we don't have to worry about the
- * mode switch CV like am_wsvc() has to.
- */
- }
- }
- mutex_enter(&tchptr->ch_lock);
- }
-
- if (chpptr->acp_reading) {
- ATRACE("am_restart() starting recording again", tchptr);
- if (!tinfo->record.pause) {
- /* set before start for mode switch */
- mutex_exit(&tchptr->ch_lock);
- if (tinfo->record.active == 0) {
- am_send_signal(statep, stpptr);
- }
- tinfo->record.active = 1;
- hw_info->record.active = 1;
- if (am_ad_start_record(statep, stpptr, ad_infop,
- tchptr->ch_info.ch_number, AM_SERIALIZE) ==
- AUDIO_FAILURE) {
- /*
- * We don't change pause if failed to
- * start.
- */
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- }
- } else {
- mutex_exit(&tchptr->ch_lock);
- }
- } else {
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
-} /* am_restart() */
-
-/*
- * am_sched_task()
- *
- * Description:
- * Common routine called to place a task on the taskq.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * void (*func)(void *) Pointer to the task to schedule
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_sched_task(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- void (*func)(void *))
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ioctl_args_t *arg;
-
- ATRACE("in am_sched_task()", q);
-
- /* get the arg structure and fill it in */
- if ((arg = kmem_alloc(sizeof (*arg), KM_NOSLEEP)) == NULL) {
- return (ENOMEM);
- }
-
- arg->aia_q = q;
- arg->aia_mp = mp;
-
- /* schedule the task */
- if (audio_sup_taskq_dispatch(stpptr->am_taskq, func, arg, KM_NOSLEEP) ==
- AUDIO_FAILURE) {
- /* let am_close() proceed and free the arg structure */
- kmem_free(arg, sizeof (*arg));
- am_exit_task(chptr);
- return (EIO);
- }
-
- ATRACE("am_sched_task() returning", chptr);
-
- return (0);
-
-} /* am_sched_task() */
-
-/*
- * am_set_compat_mode()
- *
- * Description:
- * This routine is used to convert the mixer from MIXER mode to COMPAT
- * mode. Any playing and recording channels should have been stopped
- * before this routine is called.
- *
- * When this routine is called there may be one playing and one recording
- * channel.
- *
- * We don't have to worry about resetting psamples_f after calling
- * am_audio_set_info() because am_get_samples() has been called twice
- * while we wait to shutdown. Thus it has already been added into the
- * sample count.
- *
- * NOTE: Only traditional Codecs will use this code.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel changing the mode
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * audio_ch_t *pchptr Ptr to the play channel
- * audio_ch_t *pchptr Ptr to the record channel
- *
- * Returns:
- * AUDIO_SUCCESS Mode change completed successfully.
- * AUDIO_FAILURE Mode change failed.
- */
-static int
-am_set_compat_mode(audio_ch_t *chptr, am_ad_info_t *ad_infop,
- audio_ch_t *pchptr, audio_ch_t *rchptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop;
- audio_data_t *data;
- audio_info_t *hw_info;
- am_apm_persist_t *persistp;
- am_apm_private_t *stpptr;
- audio_ch_t nchptr;
- audio_info_t new_info;
- am_ch_private_t ch_private;
- long tmp;
- int tmp_pgain;
- int tmp_pbal;
- int tmp_rgain;
- int tmp_rbal;
- uchar_t popen = 0;
- uchar_t ropen = 0;
-
- ATRACE("in am_set_compat_mode()", chptr);
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_set_compat_mode() audio_sup_get_apm_info() failed",
- statep);
- return (AUDIO_FAILURE);
- }
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- tmp_pgain = hw_info->play.gain;
- tmp_pbal = hw_info->play.balance;
- tmp_rgain = hw_info->record.gain;
- tmp_rbal = hw_info->record.balance;
-
- /* copy the original channel structure to the temp, just in case */
- bcopy(chptr, &nchptr, sizeof (nchptr));
-
- /* we only reset the hardware if we are playing or recording */
- AUDIO_INIT(&new_info, sizeof (new_info));
- bzero(&ch_private, sizeof (ch_private));
-
- nchptr.ch_dir = 0;
-
- if (pchptr) {
- audio_info_t *p_info = pchptr->ch_info.info;
-
- new_info.play.sample_rate = p_info->play.sample_rate;
- new_info.play.channels = p_info->play.channels;
- new_info.play.precision = p_info->play.precision;
- new_info.play.encoding = p_info->play.encoding;
- new_info.play.gain = p_info->play.gain;
- new_info.play.balance = p_info->play.balance;
- new_info.play.samples = p_info->play.samples;
- new_info.play.eof = p_info->play.eof;
- popen = p_info->play.open;
- ch_private.acp_writing = 1;
- nchptr.ch_dir |= AUDIO_PLAY;
- }
- if (rchptr) {
- audio_info_t *r_info = rchptr->ch_info.info;
-
- new_info.record.sample_rate = r_info->record.sample_rate;
- new_info.record.channels = r_info->record.channels;
- new_info.record.precision = r_info->record.precision;
- new_info.record.encoding = r_info->record.encoding;
- new_info.record.gain = r_info->record.gain;
- new_info.record.balance = r_info->record.balance;
- new_info.record.samples = r_info->record.samples;
- ropen = r_info->record.open;
- ch_private.acp_reading = 1;
- nchptr.ch_dir |= AUDIO_RECORD;
- }
-
- /* we always save the hardware state, even if no play/rec channels */
- stpptr->am_pstate->apm_mode = AM_COMPAT_MODE;
- hw_info->sw_features_enabled &= ~AUDIO_SWFEATURE_MIXER;
-
- /* change the hardware, if we had active play/record channels */
- if (pchptr || rchptr) {
- nchptr.ch_qptr = chptr->ch_qptr;
- nchptr.ch_statep = chptr->ch_statep;
- nchptr.ch_info.dev_type = AUDIO;
- nchptr.ch_apm_infop = apm_infop;
- nchptr.ch_private = &ch_private;
- nchptr.ch_info.info = &new_info;
- /*
- * It's possible that when the bcopy above happens,
- * the ch_lock is held by someone else. It should be
- * cleared. Or, later when we try to hold it and find
- * it's held, deadlock may happen.
- */
- mutex_init(&nchptr.ch_lock, NULL, MUTEX_DRIVER, NULL);
-
- if (am_audio_set_info(&nchptr, &new_info, NULL) ==
- AUDIO_FAILURE) {
- ATRACE("am_set_compat_mode() am_audio_set_info()"
- "failed", &nchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "set_compat() couldn't reconfigure hardware");
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- hw_info->sw_features_enabled |= AUDIO_SWFEATURE_MIXER;
- mutex_destroy(&nchptr.ch_lock);
- return (AUDIO_FAILURE);
- }
- mutex_destroy(&nchptr.ch_lock);
- }
-
- /* update the hardware open flags */
- hw_info->play.open = popen;
- hw_info->record.open = ropen;
-
- /* update persistent memory */
- persistp = stpptr->am_pstate;
- persistp->apm_mpgain = tmp_pgain;
- persistp->apm_mpbal = tmp_pbal;
- persistp->apm_mrgain = tmp_rgain;
- persistp->apm_mrbal = tmp_rbal;
-
- /*
- * It is possible that the channel was paused and then the mode
- * was switched. Thus we are most likely changing modes not on
- * a message boundary. Thus we need to make a best guess as to
- * where to start playing.
- */
- if (pchptr &&
- ((audio_info_t *)pchptr->ch_info.info)->play.pause &&
- (data = audio_sup_get_audio_data(pchptr)) != NULL) {
- /* it's remotely possible that we happen to be at the end */
- if (data->adata_pptr >= data->adata_peptr) {
- ATRACE("am_set_compat_mode() end of data", statep);
-
- /* don't let it be played again! */
- audio_sup_free_audio_data(data);
- return (AUDIO_SUCCESS);
- } else if (data->adata_pptr == data->adata_proc) {
- /* or that we are just about to use new data */
- ATRACE("am_set_compat_mode() new message", statep);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(pchptr, data);
- return (AUDIO_SUCCESS);
- }
-
- /*
- * Make a guess as to where to point to. We make sure we are
- * on a 4 byte boundary. That way we don't have to worry
- * about being in the middle of sample.
- *
- * The equation:
- * (offset of proc data from start)*(length of orig data)
- * --------------------------------------------------------
- * (length of proc data)
- */
- ATRACE("am_set_compat_mode() orig", data->adata_orig);
- ATRACE("am_set_compat_mode() optr", data->adata_optr);
- ATRACE("am_set_compat_mode() oeptr", data->adata_oeptr);
- ATRACE_32("am_set_compat_mode(): osize", data->adata_osize);
- ATRACE("am_set_compat_mode() proc", data->adata_proc);
- ATRACE("am_set_compat_mode() pptr", data->adata_pptr);
- ATRACE("am_set_compat_mode() peptr", data->adata_peptr);
- ATRACE_32("am_set_compat_mode(): psize", data->adata_psize);
-
- tmp = (((char *)data->adata_pptr - (char *)data->adata_proc) *
- data->adata_osize) / data->adata_psize;
-
- /*
- * tmp is an offset, which must be added to adata_orig to
- * get adata_optr. We mask off adata_optr so that regardless
- * of the format of the data we always are on a sample frame
- * boundary.
- */
- data->adata_optr = (char *)data->adata_orig +
- (tmp & ~AM_MISC_MASK);
- ATRACE("am_set_compat_mode() new optr", data->adata_optr);
-
- /* put it back to use next */
- audio_sup_putback_audio_data(pchptr, data);
- }
-
- ATRACE("am_set_compat_mode() done", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* am_set_compat_mode() */
-
-/*
- * am_set_mixer_mode()
- *
- * Description:
- * This routine is used to convert the mixer from COMPAT mode to MIXER
- * mode. Any playing and recording channels should have been stopped
- * before this routine is called.
- *
- * When this routine is called there may be one playing and one recording
- * channel.
- *
- * Just like am_set_compat_mode(), psamples_f has already been added into
- * the played sample count. So we don't need to do anything with it here.
- *
- * NOTE: Only traditional Codecs will use this code.
- *
- * Arguments:
- * audio_ch_t *chptr Ptr to the channel changing the mode
- * am_ad_info_t *ad_infop Ptr to the Audio Driver's config info
- * am_apm_private_t **stpptr Ptr to the mixer's private state data
- * audio_apm_info_t *apm_infop Ptr to the mixer's APM info structure
- * audio_ch_t *pchptr Ptr to the play channel
- * audio_ch_t *rchptr Ptr to the record channel
- *
- * Returns:
- * AUDIO_SUCCESS Mode change completed successfully.
- * AUDIO_FAILURE Mode change failed.
- */
-static int
-am_set_mixer_mode(audio_ch_t *chptr, am_ad_info_t *ad_infop,
- am_apm_private_t *stpptr, audio_ch_t *pchptr, audio_ch_t *rchptr)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t nchptr;
- am_ch_private_t ch_private;
- audio_info_t *hw_info;
- audio_info_t new_info;
- am_apm_persist_t *persistp;
-
- ATRACE("in am_set_mixer_mode()", statep);
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_set_mixer_mode() audio_sup_get_apm_info() failed",
- statep);
- return (AUDIO_FAILURE);
- }
- persistp = stpptr->am_pstate;
- hw_info = apm_infop->apm_ad_state;
-
- /*
- * see if we need to update the sample rate conv. routines. This should
- * be done before setting the apm_mode to AM_MIXER_MODE. Or, other code
- * path,e.g. am_flush, may find apm_mode == AM_MIXER_MODE and then find
- * the src module has not been update correctly and panic the system.
- * We update the src module before update the hardware so that if it
- * fails, the hardware state is still correct.
- */
- if (pchptr) {
- ATRACE("am_set_mixer_mode(), "
- "calling play src update", pchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_set_mixer_mode calling play src update");
- if (ad_infop->ad_play.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(pchptr),
- &((audio_info_t *)pchptr->ch_info.info)->
- play,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- play,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_play.ad_sr_info,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() "
- "play src_update() failed", 0);
- return (AUDIO_FAILURE);
- }
- }
- if (rchptr) {
- ATRACE("am_set_mixer_mode(), "
- "calling record src update", rchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_set_mixer_mode calling record src update");
- if (ad_infop->ad_record.ad_conv->ad_src_update(
- AM_SRC_CHPTR2HDL(rchptr),
- &((audio_info_t *)rchptr->ch_info.info)->
- record,
- &((audio_info_t *)apm_infop->apm_ad_state)->
- record,
- ((am_ad_info_t *)apm_infop->apm_ad_infop)->
- ad_record.ad_sr_info,
- AUDIO_RECORD) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() "
- "record src_update() failed", 0);
- return (AUDIO_FAILURE);
- }
- }
-
- /* copy the original channel structure to the temp, just in case */
- bcopy(chptr, &nchptr, sizeof (nchptr));
-
- /* we always reset the hardware, even if no play/rec channels */
- AUDIO_INIT(&new_info, sizeof (new_info));
- bzero(&ch_private, sizeof (ch_private));
-
- if (pchptr) {
- if (am_ck_sample_rate(&ad_infop->ad_play, AM_MIXER_MODE,
- hw_info->play.sample_rate) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() mixer can't play using "
- "unsupported sample rate",
- hw_info->play.sample_rate);
- return (AUDIO_FAILURE);
- }
- new_info.play.samples =
- ((audio_info_t *)pchptr->ch_info.info)->play.samples;
- ch_private.acp_writing = 1;
- }
- if (rchptr) {
- if (am_ck_sample_rate(&ad_infop->ad_record, AM_MIXER_MODE,
- hw_info->record.sample_rate) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() mixer can't record using "
- "unsupported sample rate",
- hw_info->record.sample_rate);
- return (AUDIO_FAILURE);
- }
- new_info.record.samples =
- ((audio_info_t *)rchptr->ch_info.info)->record.samples;
- ch_private.acp_reading = 1;
- }
-
- if (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY) {
- new_info.play.sample_rate = stpptr->am_save_psr;
- new_info.play.gain = persistp->apm_mpgain;
- new_info.play.balance = persistp->apm_mpbal;
- }
-
- if (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD) {
- new_info.record.sample_rate = stpptr->am_save_rsr;
- new_info.record.gain = persistp->apm_mrgain;
- new_info.record.balance = persistp->apm_mrbal;
- }
-
- nchptr.ch_qptr = chptr->ch_qptr;
- nchptr.ch_statep = chptr->ch_statep;
- nchptr.ch_dir = AUDIO_BOTH;
- nchptr.ch_info.dev_type = AUDIO;
- nchptr.ch_apm_infop = apm_infop;
- nchptr.ch_private = &ch_private;
- nchptr.ch_info.info = &new_info;
- /*
- * It's possible that when the bcopy above happens,
- * the ch_lock is held by someone else. It should be
- * cleared. Or, later when we try to hold it and find
- * it's held, deadlock may happen.
- */
- mutex_init(&nchptr.ch_lock, NULL, MUTEX_DRIVER, NULL);
-
- if (am_audio_set_info(&nchptr, &new_info, &new_info) == AUDIO_FAILURE) {
- ATRACE("am_set_mixer_mode() am_audio_set_info() failed",
- &nchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "set_mixer() "
- "couldn't reconfigure hardware");
- mutex_destroy(&nchptr.ch_lock);
- return (AUDIO_FAILURE);
- }
- mutex_destroy(&nchptr.ch_lock);
-
-
- /*
- * We need to look like we've changed modes AFTER we try to set hw.
- * Otherwise am_audio_set_info() won't update the hardware. It'll
- * try to update the virtual channel.
- */
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- hw_info->sw_features_enabled |= AUDIO_SWFEATURE_MIXER;
-
- /* clear the open flags in the hardware */
- hw_info->play.open = 0;
- hw_info->record.open = 0;
-
- /* clear the hardware's waiting flags */
- hw_info->play.waiting = 0;
- hw_info->record.waiting = 0;
-
- /* clear misc flags */
- hw_info->play.eof = 0;
-
- /*
- * Also update the hardware info for the number of channels,
- * precision, and encoding.
- */
- hw_info->play.channels = stpptr->am_hw_pchs;
- hw_info->record.channels = stpptr->am_hw_rchs;
-
- hw_info->play.precision = stpptr->am_hw_pprec;
- hw_info->record.precision = stpptr->am_hw_rprec;
-
- hw_info->play.encoding = stpptr->am_hw_penc;
- hw_info->record.encoding = stpptr->am_hw_renc;
-
- ATRACE("am_set_mixer_mode() successful", statep);
-
- return (AUDIO_SUCCESS);
-
-} /* am_set_mixer_mode() */
-
-/*
- * am_wiocdata_mixerctl_chinfo()
- *
- * Description:
- * We have the audio_channel_t data structure so we know how big the info
- * structure is. We make sure the size of the info structure is correct,
- * that there is a buffer, and that the channel number is reasonable.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_mixerctl_chinfo(queue_t *q, mblk_t *mp, audio_i_state_t *state)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- audio_info_t *info;
- int ch_number;
-
- ATRACE("in am_wiocdata_mixerctl_chinfo()", q);
-
- /* get ready to do the model conversion */
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag,
- (audio_channel_t *)mp->b_cont->b_rptr);
-
- /*
- * Make sure the size is good, fortunately audio_info_t doesn't have
- * any pointers in it, so it's the same size, regardless of _ILP32
- * or _LP64.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_wiocdata_mixerctl_chinfo() bad size",
- STRUCT_FGET(audio_channel, info_size));
- return (EINVAL);
- }
-
- /* make sure the app has a buffer to place the data into */
- if ((info = STRUCT_FGETP(audio_channel, info)) == NULL) {
- ATRACE("am_wiocdata_mixerctl_chinfo() no buffer",
- STRUCT_FGETP(audio_channel, info));
- return (EINVAL);
- }
-
- /* get the channel number and make sure it's good */
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_wiocdata_mixerctl_chinfo() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- return (EINVAL);
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- mutex_exit(&tchptr->ch_lock);
- ATRACE("am_wiocdata_mixerctl_chinfo() bad ch", tchptr);
- return (EINVAL);
- }
- mutex_exit(&tchptr->ch_lock);
-
- /*
- * We have a good audio_channel_t structure so we can do the next
- * step in the process, which is to ask for the audio_info structure.
- * But first we save the audio_channel structure for later use.
- * The STREAMS head will give us a new mp->b_cont message block
- * when it gives us the audio_info structure.
- */
- state->ais_command = AM_COPY_IN_MIXCTL_SET_CHINFO2;
- state->ais_address = (caddr_t)info;
- state->ais_address2 = (caddr_t)mp->b_cont;
-
- /* Set mp->b_cont = NULL so mcopyin() does not free the saved message */
- mp->b_cont = NULL;
-
- /* Setup for copyin */
- ASSERT(state->ais_address != NULL);
- mcopyin(mp, state, sizeof (audio_info_t), (caddr_t)state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wiocdata_mixerctl_chinfo() returning", q);
-
- return (0);
-
-} /* am_wiocdata_mixerctl_chinfo() */
-
-/*
- * am_wiocdata_mixerctl_get_chinfo()
- *
- * Description:
- * The audio_info_t data structure has been copied out, so now we copy
- * out the updated audio_channel_t structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_mixerctl_get_chinfo(queue_t *q, mblk_t *mp, audio_i_state_t *state)
-{
- mblk_t *tmp;
-
- ATRACE("in am_wiocdata_mixerctl_get_chinfo()", q);
-
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO2;
-
- tmp = (mblk_t *)state->ais_address2;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, tmp->b_wptr - tmp->b_rptr, state->ais_address, tmp);
-
- state->ais_address2 = NULL;
-
- qreply(q, mp);
-
- ATRACE("am_wiocdata_mixerctl_get_chinfo() done", q);
-
- return (0);
-
-} /* am_wiocdata_mixerctl_get_chinfo() */
-
-/*
- * am_wiocdata_sr()
- *
- * Description:
- * The next step in getting the sample rates. We've got the
- * am_sample_rates_t structure so we can now get the number of sample
- * rates to ask for, which we do. Thus we copy in the structure a
- * second time, but this time it'll be larger.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * struct copyreq *cqp Pointer to copy request register
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wiocdata_sr(queue_t *q, mblk_t *mp, struct copyreq *cqp,
- audio_i_state_t *state)
-{
- am_sample_rates_t *new;
- size_t size;
-
- ATRACE("in am_wiocdata_sr()", q);
-
- /*
- * We copy in just the am_sample_rates_t structure to get the
- * number of sample rates the samp_rates array can support.
- * Once we know this we make another call to get the whole
- * thing.
- */
-
- /* get a pointer to the user supplied structure */
- new = (am_sample_rates_t *)mp->b_cont->b_rptr;
-
- /* make sure the number of array elements is sane */
- if (new->num_samp_rates <= 0) {
- ATRACE_32("am_wiocdata_sr() AM_COPY_IN_SAMP_RATES "
- "bad num_samp_rates", new->num_samp_rates);
- return (EINVAL);
- }
-
- ATRACE("am_wiocdata_sr() new", new);
- ATRACE_32("am_wiocdata_sr() num_samp_rates", new->num_samp_rates);
- size = AUDIO_MIXER_SAMP_RATES_STRUCT_SIZE(new->num_samp_rates);
-
- /*
- * Now that we know the number of array elements, we can ask
- * for the right number of bytes.
- *
- * Reuse the cq_private buffer, saving data for M_IOCDATA processing.
- */
- state->ais_command = AM_COPY_IN_SAMP_RATES2;
- ASSERT(cqp->cq_private == (mblk_t *)state);
-
- /* Setup for copyin */
- ASSERT(state->ais_address != NULL);
- mcopyin(mp, state, size, (caddr_t)state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wiocdata_sr() returning success", 0);
-
- return (0);
-
-} /* am_wiocdata_sr() */
-
-/*
- * am_wioctl_copyin()
- *
- * Description:
- * Common routine used to start the copy in process for many ioctl()s.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * audio_i_state_t *state Pointer to ioctl() state structure
- * int cmd IOCTL command
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wioctl_copyin(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- audio_i_state_t *state, int cmd)
-{
- size_t size;
- int new_cmd;
-
- ATRACE("in am_wioctl_copyin()", q);
-
- /* set copyin based on the ioctl() command */
- switch (cmd) {
- case AUDIO_DIAG_LOOPBACK: {
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
-
- /* not all Audio Drivers and their hardware support loopbacks */
- if (!(ad_infop->ad_diag_flags & AM_DIAG_INTERNAL_LOOP)) {
- ATRACE_32("am_wioctl_diag_loopback() no loopbacks",
- ad_infop->ad_diag_flags);
- return (ENOTTY);
- }
-
- new_cmd = AM_COPY_IN_DIAG_LOOPB;
- size = sizeof (int);
-
- break;
- }
-
- case AUDIO_SETINFO:
- new_cmd = AM_COPY_IN_AUDIOINFO;
- size = sizeof (audio_info_t);
-
- break;
- case AUDIO_MIXER_GET_SAMPLE_RATES:
- new_cmd = AM_COPY_IN_SAMP_RATES;
- size = sizeof (am_sample_rates_t);
-
- break;
- case AUDIO_MIXERCTL_SETINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- new_cmd = AM_COPY_IN_MIXCTLINFO;
- /*
- * We only need the dev_info part of am_control_t. Fortunately
- * this is at the front of the structure. So set the size to
- * copy in only the dev_info part. Otherwise we'll blow an
- * assert in am_mixerctl_setinfo_task().
- */
- size = sizeof (audio_info_t);
-
- break;
- case AUDIO_MIXERCTL_GET_CHINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- /* size can be different, depending on _ILP32 and _LP64 */
- new_cmd = AM_COPY_IN_MIXCTL_GET_CHINFO;
- size = SIZEOF_STRUCT(audio_channel,
- ((struct iocblk *)mp->b_rptr)->ioc_flag);
-
- break;
- case AUDIO_MIXERCTL_SET_CHINFO:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- /* size can be different, depending on _ILP32 and _LP64 */
- new_cmd = AM_COPY_IN_MIXCTL_SET_CHINFO;
- size = SIZEOF_STRUCT(audio_channel,
- ((struct iocblk *)mp->b_rptr)->ioc_flag);
-
- break;
- case AUDIO_MIXERCTL_SET_MODE:
- /* allowed only on AUDIOCTL channels */
- if (chptr->ch_info.dev_type != AUDIOCTL) {
- return (EINVAL);
- }
-
- new_cmd = AM_COPY_IN_MIXCTL_MODE;
- size = sizeof (int);
-
- break;
- default:
- return (EIO);
- }
-
- /* set up the message */
- state->ais_command = new_cmd;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyin */
- if (state->ais_address == NULL) {
- return (EINVAL);
- }
- mcopyin(mp, state, size, state->ais_address);
-
- /* send the copy in request */
- qreply(q, mp);
-
- ATRACE("am_wioctl_copyin() returning", chptr);
-
- return (0);
-
-} /* am_wioctl_copyin() */
-
-/*
- * am_wioctl_drain()
- *
- * Description:
- * First make sure this is an AUDIO channel. Then see if there is
- * any queued up audio. If there is then just return after setting
- * a flag. Otherwise we've got an AUDIO_DRAIN before there's any
- * played audio or after it has all played, thus we ACK.
- *
- * Once all audio has been played am_audio_drained() is called and
- * it generates the ACK.
- *
- * This ioctl() doesn't use the taskq. Thus other channels won't be
- * blocked by this ioctl().
- *
- * Like all ioctl()s, AUDIO_DRAIN may be interrupted by a signal.
- * The STREAMS head will let the ioctl() return to the app. We have
- * no way of knowing this has happened, unless we use cv_wait_sig().
- * This would block am_wput() so we aren't going to use it. However
- * the fact we don't know about the signal is okay. The STREAMS head
- * keeps a sequence number and as long as we save the original mp it
- * can tell if this is an old ioctl() or not. If it is it just ignores
- * the ACK. Further, am_close() will call am_audio_drained() which
- * will send the ACK, which the STREAMS head will ignore if it wishes.
- * Or we'll get another AUDIO_DRAIN and we still have the old mp, and
- * thus we'll know the old AUDIO_DRAIN was interrupted. So we just
- * free the mp and we're still okay.
- *
- * XXX - I don't understand what this means if there's a mux pushed
- * on top of the mixer. If this happens it is possible to have multiple
- * AUDIO_DRAINs at once, but then you can also have multiple audio
- * streams on one channel. So audio isn't going to work very well in
- * that case anyway.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * struct copyreq *cqp Pointer to copy request register
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-am_wioctl_drain(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- struct copyreq *cqp)
-{
- am_ch_private_t *chpptr = (am_ch_private_t *)chptr->ch_private;
- int error = 0;
-
- ATRACE("in am_wioctl_drain() chptr", chptr);
-
- /* must be on a play audio channel */
- mutex_enter(&chptr->ch_lock);
- if (!chpptr->acp_writing || chptr->ch_info.dev_type != AUDIO) {
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wioctl_drain() AUDIO_DRAIN bad type", chptr);
- error = EINVAL;
- goto done;
- }
-
- /*
- * See if we've got a new AUDIO_DRAIN, which means the last one
- * was interrupted.
- */
- if (chpptr->acp_drain_mp) {
- /* free it, it's lost and the STREAM head knows this */
- freemsg(chpptr->acp_drain_mp);
- }
-
- /* see if we are empty, the easy case */
- if (!(chpptr->acp_flags & AM_CHNL_MSG_ON_QUEUE) &&
- audio_sup_get_audio_data_cnt(chptr) == 0) {
- chpptr->acp_drain_mp = NULL;
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wioctl_drain() no messages", chptr);
- goto done;
- }
-
- /* we need to wait for empty */
- chpptr->acp_flags |= AM_CHNL_DRAIN;
- chpptr->acp_drain_mp = mp;
-
- ATRACE_32("am_wioctl_drain() messages, acp_flags", chpptr->acp_flags);
- ATRACE("am_wioctl_drain() MP", mp);
-
- mutex_exit(&chptr->ch_lock);
-
- return;
-
-done:
- ASSERT(cqp->cq_private == NULL);
-
- if (error) {
- miocnak(q, mp, 0, error);
- } else {
- miocack(q, mp, 0, 0);
- }
-
- ATRACE("am_wioctl_drain() drained", chptr);
-
-} /* am_wioctl_drain() */
-
-/*
- * am_wioctl_getdev()
- *
- * Description:
- * The first half of the AUDIO_GETDEV ioctl(). Ask to copy out
- * the audio driver's device information structure.
- *
- * Arguments:
- * queue_t *q Pointer to the STREAMS queue
- * mblk_t *mp Pointer to the message block
- * audio_ch_t *chptr Pointer to this channel's state information
- * audio_i_state_t *state Pointer to ioctl() state structure
- *
- * Returns:
- * 0 No error
- * errno Error number for the error
- */
-static int
-am_wioctl_getdev(queue_t *q, mblk_t *mp, audio_ch_t *chptr,
- audio_i_state_t *state)
-{
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- audio_device_t *devp;
-
- ATRACE("in am_wioctl_getdev()", q);
-
- /* set STREAMS for copy out of the audio_device structure */
- state->ais_command = AM_COPY_OUT_GETDEV;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- return (EINVAL);
- }
- mcopyout(mp, state, sizeof (*ad_infop->ad_dev_info), state->ais_address,
- NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (*ad_infop->ad_dev_info)) ==
- AUDIO_FAILURE) {
- return (ENOMEM);
- }
-
- /*
- * We don't bother to lock the state structure because this
- * is static data.
- */
-
- devp = (audio_device_t *)mp->b_cont->b_rptr;
-
- bcopy(ad_infop->ad_dev_info, devp,
- sizeof (*ad_infop->ad_dev_info));
-
- /* send the copy out request */
- qreply(q, mp);
-
- ATRACE("am_wioctl_getdev() returning", chptr);
-
- return (0);
-
-} /* am_wioctl_getdev() */
-
-/*
- * Task queue callbacks.
- */
-
-/*
- * am_diag_loopback_task()
- *
- * Description:
- * Called by the task queue to set the loopback mode in the audio
- * driver.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_diag_loopback_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_diag_lookback() arg", arg);
-
- am_enter_rwlock();
-
- if (*(int *)mp->b_cont->b_rptr) {
- ATRACE_32("am_diag_loopback_task() enable",
- *(int *)mp->b_cont->b_rptr);
-
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_DIAG_MODE, NULL, 1, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- ATRACE("am_diag_loopback_task() "
- "AM_COPY_IN_DIAG_LOOPB enable failed", 0);
- error = EIO;
- }
- } else {
- ATRACE_32("am_diag_loopback_task() disable",
- *(int *)mp->b_cont->b_rptr);
-
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_DIAG_MODE, NULL, 0, NULL,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- ATRACE("am_diag_loopback_task() "
- "AM_COPY_IN_DIAG_LOOPB disable failed", 0);
- error = EIO;
- }
- }
-
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_diag_lookback() done", error);
-
-} /* am_diag_loopback_task() */
-
-/*
- * am_get_chinfo_task()
- *
- * Description:
- * Called by the task queue to get the channel's info. If the size of
- * the info structure doesn't match then we return an EINVAL. This is
- * better than trying to copy out to much data and cause a core dump
- * in the application.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_get_chinfo_task(void *arg)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- audio_info_t *info;
- mblk_t *tmp;
- int ch_number;
- int error = 0;
-
- ATRACE("in am_get_chinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_get_chinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get ready to do the model conversion */
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag,
- (audio_channel_t *)mp->b_cont->b_rptr);
-
- /*
- * Make sure the size is good, fortunately audio_info_t doesn't have
- * any pointers in it, so it's the same size, regardless of _ILP32
- * or _LP64.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_get_chinfo_task() bad size",
- STRUCT_FGET(audio_channel, info_size));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure the app has a buffer to place the data into */
- if ((info = STRUCT_FGETP(audio_channel, info)) == NULL) {
- ATRACE("am_get_chinfo_task() no buffer",
- STRUCT_FGETP(audio_channel, info));
- error = EINVAL;
- goto nack;
- }
-
- /* get the channel number and make sure it's good */
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_get_chinfo_task() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- ATRACE("am_get_chinfo_task() bad ch", tchptr);
- error = EINVAL;
- mutex_exit(&tchptr->ch_lock);
- goto nack;
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* okay to update the channel's info */
- STRUCT_FSET(audio_channel, pid, tchptr->ch_info.pid);
- STRUCT_FSET(audio_channel, dev_type, tchptr->ch_info.dev_type);
-
- /*
- * We have consistent data so now we can start the copy out,
- * beginning with the audio_info_t structure. That's because
- * we've got the _IPL32/_LP64 environment. Also, we can't use
- * the macros here because of the special address. So we save
- * the audio_channel_t data structure for later. And then get
- * a new mblk to put the audio_info structure into.
- */
- if ((tmp = allocb(sizeof (audio_info_t), BPRI_HI)) == 0) {
- error = ENOMEM;
- goto nack;
- }
- state->ais_address2 = (caddr_t)mp->b_cont;
-
- /*
- * Set mp->b_cont = NULL so the mcopyout() below does not free the
- * saved message in state->ais_address2 above when it sets
- * mp->b_cont = tmp
- */
- mp->b_cont = NULL;
-
- bcopy(tchptr->ch_info.info, tmp->b_wptr, sizeof (audio_info_t));
- tmp->b_wptr = tmp->b_rptr + sizeof (audio_info_t);
-
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (audio_info_t), (caddr_t)info, tmp);
-
- ASSERT(mp->b_cont == tmp);
-
- /* send the copy in request */
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_get_chinfo_task() return", chptr);
-
- return;
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_get_chinfo_task() returning nack", chptr);
-
-} /* am_get_chinfo_task() */
-
-/*
- * am_get_mode_task()
- *
- * Description:
- * This task gets the current mixer mode while the state is stable.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_get_mode_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_get_mode_task() arg", arg);
-
- am_enter_rwlock();
-
- /* set STREAMS for copy out of the mode */
- state->ais_command = AM_COPY_OUT_MIXCTL_MODE;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- error = EINVAL;
- goto done;
- }
- mcopyout(mp, state, sizeof (int), state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (int)) == AUDIO_FAILURE) {
- error = ENOMEM;
- goto done;
- } else {
- *((int *)mp->b_cont->b_rptr) = stpptr->am_pstate->apm_mode;
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (stpptr->am_pstate->apm_mode);
- qreply(q, mp);
- }
-
-done:
- if (error) {
- if (cqp->cq_private) {
- kmem_free(cqp->cq_private, sizeof (audio_i_state_t));
- cqp->cq_private = NULL;
- }
- miocnak(q, mp, 0, error);
- }
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_get_mode_task() returning", chptr);
-
-} /* am_get_mode_task() */
-
-/*
- * am_getinfo_task()
- *
- * Description:
- * This is the task that gets serial access to the info data structure
- * and copies out the audio_info data structure.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_getinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_info_t *info = chptr->ch_info.info;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *info_out;
- int error = 0;
-
- ATRACE("in am_getinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* set STREAMS for copy out of the audio_info structure */
- state->ais_command = AM_COPY_OUT_AUDIOINFO;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- error = EINVAL;
- ATRACE("am_getinfo_task() with invalid address", chptr);
- goto done;
- }
- mcopyout(mp, state, sizeof (*info_out), state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, sizeof (*info_out)) == AUDIO_FAILURE) {
- error = ENOMEM;
- ATRACE("am_getinfo_task() failing to alloc mblk", chptr);
- goto done;
- }
-
- info_out = (audio_info_t *)mp->b_cont->b_rptr;
-
- bcopy(info, info_out, sizeof (*info_out));
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, info_out);
- mutex_exit(&chptr->ch_lock);
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
-done:
- if (error) {
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
- }
- am_release_rwlock();
-
- ATRACE("am_getinfo_task() returning", chptr);
-
-} /* am_getinfo_task() */
-
-/*
- * am_mixerctl_getinfo_task()
- *
- * Description:
- * This task gets serial access to the state to copy out the am_control
- * data structure.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_mixerctl_getinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *info_out;
- am_control_t *ptr;
- size_t size;
- int i;
- int error = 0;
- int max_chs = statep->as_max_chs;
-
- ATRACE("in am_mixerctl_getinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable, we also check the type */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE ||
- chptr->ch_info.dev_type != AUDIOCTL) {
- ATRACE_32("am_mixerctl_getinfo_task() bad mode/type",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- size = AUDIO_MIXER_CTL_STRUCT_SIZE(max_chs);
-
- /* set STREAMS for copy out of the audio_info structure */
- state->ais_command = AM_COPY_OUT_MIXCTLINFO;
- state->ais_address = (caddr_t)(*(caddr_t *)mp->b_cont->b_rptr);
-
- /* Setup for copyout */
- if (state->ais_address == NULL) {
- ATRACE("am_mixerctl_getinfo_task() bad address from user",
- NULL);
- error = EINVAL;
- goto nack;
- }
- mcopyout(mp, state, size, state->ais_address, NULL);
-
- /* put the data in the buffer, but try to reuse it first */
- if (audio_sup_mblk_alloc(mp, size) == AUDIO_FAILURE) {
- ATRACE("am_mixerctl_getinfo_task() can't get memory", 0);
- error = ENOMEM;
- goto nack;
- }
-
- ptr = (am_control_t *)mp->b_cont->b_rptr;
- info_out = &ptr->dev_info;
-
- /*
- * We have to assemble this one by pieces. First we take
- * care of the hardware state, then extended hardware state.
- */
-
- bcopy(apm_infop->apm_ad_state, info_out, sizeof (audio_info_t));
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, info_out);
- mutex_exit(&chptr->ch_lock);
-
- /* now get the channel information */
- mutex_enter(&statep->as_lock); /* freeze ch state */
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
- mutex_enter(&tchptr->ch_lock);
- if (tchptr->ch_info.pid) {
- ptr->ch_open[i] = 1;
- } else {
- ptr->ch_open[i] = 0;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- mutex_exit(&statep->as_lock);
-
- /* send the copy out request */
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_getinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_getinfo_task() returning nack", chptr);
-
-} /* am_mixerctl_getinfo_task() */
-
-/*
- * am_mixerctl_setinfo_task()
- *
- * Description:
- * This task gets serial access to the state to set it based on the
- * am_control data structure. Can only set a few global things. The
- * ch_open argument of the am_control data structure since this is
- * read only.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_mixerctl_setinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t ninfo;
- audio_ch_t ch;
- audio_info_t *tinfo;
- am_control_t *new;
- int error = 0;
-
- ATRACE("in am_mixerctl_setinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_mixerctl_setinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get a pointer to the user supplied structure */
- new = (am_control_t *)mp->b_cont->b_rptr;
- tinfo = &new->dev_info;
-
- /* we can only modify a few things so make sure that's all we touch */
- AUDIO_INIT(&ninfo, sizeof (ninfo));
- ninfo.play.gain = tinfo->play.gain;
- ninfo.play.balance = tinfo->play.balance;
- ninfo.play.port = tinfo->play.port;
- ninfo.play.pause = tinfo->play.pause;
- ninfo.record.gain = tinfo->record.gain;
- ninfo.record.balance = tinfo->record.balance;
- ninfo.record.port = tinfo->record.port;
- ninfo.record.pause = tinfo->record.pause;
- ninfo.monitor_gain = tinfo->monitor_gain;
- ninfo.output_muted = tinfo->output_muted;
-
- /* we always create a pseudo channel that points to the h/w */
- bcopy(chptr, &ch, sizeof (*chptr));
- ch.ch_info.info = hw_info;
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_mixerctl_setinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(&ch, &ninfo, &ninfo) == AUDIO_FAILURE) {
- ATRACE("am_mixerctl_setinfo_task() am_audio_set_info() failed",
- chptr);
- error = EINVAL;
- goto nack;
- }
-
- /* since there wasn't an error we succeeded, so return struct */
- tinfo->play.gain = ninfo.play.gain;
- tinfo->play.balance = ninfo.play.balance;
- tinfo->play.port = ninfo.play.port;
- tinfo->play.pause = ninfo.play.pause;
- tinfo->record.gain = ninfo.record.gain;
- tinfo->record.balance = ninfo.record.balance;
- tinfo->record.port = ninfo.record.port;
- tinfo->record.pause = ninfo.record.pause;
- tinfo->monitor_gain = ninfo.monitor_gain;
- tinfo->output_muted = ninfo.output_muted;
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_MIXCTLINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_setinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_mixerctl_setinfo_task() returning error", chptr);
-
-} /* am_mixerctl_setinfo_task() */
-
-/*
- * am_multiple_open_task()
- *
- * Description:
- * The second part of the AUDIO_MIXER_MULTIPLE_OPEN ioctl(). We check
- * the state here so we can rely on the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_multiple_open_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- int error = 0;
-
- ATRACE("in am_multiple_open_task() arg", arg);
-
- am_enter_rwlock();
-
- /*
- * Don't allow this ioctl() if not in MIXER mode. We have to do this
- * check in the task because that's the only way we can rely on the
- * state.
- */
- if (stpptr->am_pstate->apm_mode == AM_COMPAT_MODE) {
- ATRACE_32("am_multiple_open_task() bad mode",
- stpptr->am_pstate->apm_mode);
- error = EINVAL;
- goto done;
- }
-
- /* just set the mode without checking what it is */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_MULTI_OPEN;
- ATRACE_32("am_multiple_open_task() flags", chpptr->acp_flags);
- mutex_exit(&chptr->ch_lock);
-
- /* wake up any channels waiting on multiple open()s */
- mutex_enter(&chptr->ch_statep->as_lock);
- cv_broadcast(&chptr->ch_statep->as_cv);
- mutex_exit(&chptr->ch_statep->as_lock);
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_multiple_open_task() done", error);
-
-} /* am_multiple_open_task() */
-
-/*
- * am_sample_rate_task()
- *
- * Description:
- * Now that we will know how many sample rates to return we can get
- * them. We do this in a task because we need to know the mixer mode.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_sample_rate_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_sample_rates_t *new;
- am_ad_sample_rates_t *src;
- size_t size;
- int error = 0;
- int i;
- int mode = stpptr->am_pstate->apm_mode;
- int num;
-
- ATRACE("in am_sample_rate_task() arg", arg);
-
- am_enter_rwlock();
-
- /* get a pointer to the user supplied structure */
- new = (am_sample_rates_t *)mp->b_cont->b_rptr;
- /* new->flags is random data, so clear */
- new->flags = 0;
-
- /* make sure the number of array elements is sane */
- if (new->num_samp_rates <= 0) {
- ATRACE_32("am_sample_rate_task() AM_COPY_IN_SAMP_RATES2 "
- "bad num_samp_rates", new->num_samp_rates);
- error = EINVAL;
- goto nack;
- }
-
- size = AUDIO_MIXER_SAMP_RATES_STRUCT_SIZE(new->num_samp_rates);
-
- ATRACE_32("am_sample_rate_task() AM_COPY_IN_SAMP_RATES2 type",
- new->type);
- if (new->type == AUDIO_PLAY &&
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY)) {
- if (mode == AM_MIXER_MODE) {
- src = &ad_infop->ad_play.ad_mixer_srs;
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- src = &ad_infop->ad_play.ad_compat_srs;
- }
- } else if (new->type == AUDIO_RECORD &&
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD)) {
- if (mode == AM_MIXER_MODE) {
- src = &ad_infop->ad_record.ad_mixer_srs;
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
- src = &ad_infop->ad_record.ad_compat_srs;
- }
- } else {
- error = EINVAL;
- goto nack;
- }
-
- /* figure out how many sample rates we have */
- for (num = 0; src->ad_srs[num] != 0; num++);
-
- /* we don't copy more sample rates than we have */
- if (num < new->num_samp_rates) {
- new->num_samp_rates = num;
- }
-
- /* we reuse the buffer we got from user space */
- for (i = 0; i < new->num_samp_rates; i++) {
- /* get sample rate for array elements */
- if (src->ad_srs[i] == 0) {
- /* at the end of sample rates */
- break;
- }
- new->samp_rates[i] = src->ad_srs[i];
- }
-
- /* let the app know there are more */
- if (num > new->num_samp_rates) {
- new->num_samp_rates = num;
- }
-
- /* type remains the same, but update others */
- if (src->ad_limits & MIXER_SRS_FLAG_SR_LIMITS) {
- new->flags = MIXER_SR_LIMITS;
- }
-
- /* ready to send the filled in structure back */
- state->ais_command = AM_COPY_OUT_SAMP_RATES;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, size, state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + size));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE_32("am_sample_rate_task() done", error);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_sample_rate_task() returning error", error);
-
-} /* am_sample_rate_task() */
-
-/*
- * am_set_chinfo_task()
- *
- * Description:
- * Called by the task queue to set the channel's state. We've already
- * verified the size and channel are okay, as well as there is a buffer.
- * We have the audio_info structure, in mp->b_cont, so new we can set
- * the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_set_chinfo_task(void *arg)
-{
- STRUCT_HANDLE(audio_channel, audio_channel);
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *tinfo = (audio_info_t *)mp->b_cont->b_rptr;
- audio_channel_t *ch;
- struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
- int ch_number;
- int error = 0;
-
- ATRACE("in am_set_chinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- /* we have to check the mode when it's stable */
- if (stpptr->am_pstate->apm_mode != AM_MIXER_MODE) {
- ATRACE_32("am_set_chinfo_task() bad mode",
- chptr->ch_info.dev_type);
- error = EINVAL;
- goto nack;
- }
-
- /* get ready to do the model conversion */
- ch = (audio_channel_t *)((mblk_t *)state->ais_address2)->b_rptr;
- STRUCT_SET_HANDLE(audio_channel, iocbp->ioc_flag, ch);
-
- /*
- * We check things again because since the last check it could have
- * changed on us.
- */
- if (STRUCT_FGET(audio_channel, info_size) != sizeof (audio_info_t)) {
- ATRACE_32("am_set_chinfo_task() bad size",
- STRUCT_FGET(audio_channel, info_size));
- error = EINVAL;
- goto nack;
- }
- if (STRUCT_FGETP(audio_channel, info) == NULL) {
- ATRACE("am_set_chinfo_task() no buffer",
- STRUCT_FGETP(audio_channel, info));
- error = EINVAL;
- goto nack;
- }
- ch_number = STRUCT_FGET(audio_channel, ch_number);
- if (ch_number >= statep->as_max_chs || ch_number < 0) {
- ATRACE_32("am_set_chinfo_task() bad ch number",
- STRUCT_FGET(audio_channel, ch_number));
- error = EINVAL;
- goto nack;
- }
-
- /* make sure this is a valid AUDIO/AUDIOCTL ch */
- tchptr = &statep->as_channels[ch_number];
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.pid == 0 ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL)) {
- mutex_exit(&tchptr->ch_lock);
- ATRACE("am_set_chinfo_task() bad ch", tchptr);
- error = EINVAL;
- goto nack;
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* because the channels are stable we update the audio_channel struct */
- STRUCT_FSET(audio_channel, pid, tchptr->ch_info.pid);
- STRUCT_FSET(audio_channel, dev_type, tchptr->ch_info.dev_type);
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_set_chinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(tchptr, tinfo, tinfo) == AUDIO_FAILURE) {
- error = EINVAL;
- goto nack;
- }
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, tinfo);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_MIXCTL_GET_CHINFO;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_set_chinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE("am_set_chinfo_task() returning error", chptr);
-
-} /* am_set_chinfo_task() */
-
-/*
- * am_set_mode_task()
- *
- * Description:
- * Switch modes. We have to shut down play and record first, then change
- * modes, and finally restart. Since we are a low priority thread we
- * can sleep!
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_set_mode_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_ad_info_t *ad_infop = apm_infop->apm_ad_infop;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_ch_t *pchptr = NULL;
- audio_ch_t *rchptr = NULL;
- audio_ch_t *tchptr;
- am_ch_private_t *tchpptr;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t *new_pinfo = NULL;
- audio_info_t *new_rinfo = NULL;
- audio_info_t old_hw_info;
- audio_info_t *tinfo;
- int doread;
- int dowrite;
- int error = 0;
- int i;
- int max_chs = statep->as_max_chs;
- int mode = stpptr->am_pstate->apm_mode;
- int new_mode;
- int ppid = 0;
- int rpid = 0;
-#ifdef DEBUG
- int pcount = 0;
- int rcount = 0;
-#endif
-
- ATRACE("in am_set_mode_task() arg", arg);
-
- am_enter_rwlock();
-
- /* get the new_mode and make sure it's good */
- new_mode = *((int *)mp->b_cont->b_rptr);
- ATRACE_32("am_set_mode_task() new mode", new_mode);
- if (new_mode != AM_MIXER_MODE && new_mode != AM_COMPAT_MODE) {
- ATRACE_32("am_set_mode_task() bad mode", new_mode);
- error = EINVAL;
- goto done;
- }
-
- /* make sure we aren't going into the same mode */
- if (mode == new_mode) {
- ATRACE_32("am_set_mode_task() same mode", new_mode);
- goto done;
- }
-
- /* figure out the direction */
- doread = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD;
- dowrite = ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY;
-
- /* we allocate this memory while it's easy to back out */
- if (new_mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- new_pinfo = kmem_alloc(sizeof (*new_pinfo), KM_SLEEP);
- new_rinfo = kmem_alloc(sizeof (*new_rinfo), KM_SLEEP);
- }
-
- /* get the AUDIO apm_info pointer, we've got one for AUDIOCTL */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- if (new_pinfo) {
- kmem_free(new_pinfo, sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo, sizeof (*new_rinfo));
- }
- error = EIO;
- goto done;
- }
-
- /*
- * Make sure we can go to COMPAT mode while we're locked. By
- * definition if we are going to MIXER mode we can't have more
- * than one in and one out channel allocated.
- */
- mutex_enter(&statep->as_lock);
- if (new_mode == AM_COMPAT_MODE && (stpptr->am_in_chs > 1 ||
- stpptr->am_out_chs > 1)) {
- ATRACE("am_set_mode_task() AM_COPY_IN_MIXCTL_MODE busy", chptr);
- ASSERT(new_pinfo == NULL);
- ASSERT(new_rinfo == NULL);
-
- error = EBUSY;
- mutex_exit(&statep->as_lock);
- goto done;
- } else {
- ASSERT(stpptr->am_in_chs <= 1);
- ASSERT(stpptr->am_out_chs <= 1);
- }
- mutex_exit(&statep->as_lock);
-
- /* once playing/recording has stopped we can clear this flag */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags |= AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* how we do the switch is different based on the device */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- /* find the reading and writing channels */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- mutex_enter(&tchptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* is this channel playing?, recording? */
- tchpptr = tchptr->ch_private;
- ATRACE("am_set_mode_task() found ch flags",
- chpptr->acp_flags);
- if (tchpptr->acp_writing) {
- ATRACE_32("am_set_mode_task() MS found play ch",
- tchptr->ch_info.ch_number);
- ASSERT(pchptr == NULL);
- ASSERT(dowrite);
- pchptr = tchptr;
-#ifdef DEBUG
- pcount++;
-#endif
- }
- if (tchpptr->acp_reading) {
- ATRACE_32(
- "am_set_mode_task() MS found record ch",
- tchptr->ch_info.ch_number);
- ASSERT(rchptr == 0);
- ASSERT(doread);
- rchptr = tchptr;
-#ifdef DEBUG
- rcount++;
-#endif
- }
- mutex_exit(&tchptr->ch_lock);
-
- /* are we done finding active channels? */
- if ((pchptr || !dowrite) && (rchptr || !doread)) {
- break;
- }
- }
- ASSERT(pcount <= 1);
- ASSERT(rcount <= 1);
-
- /* pause playing & recording, so the ISR isn't called */
- if (dowrite) {
- ATRACE("am_set_mode_task() pause play", chptr);
- tinfo = pchptr->ch_info.info;
- am_ad_pause_play(statep, stpptr, ad_infop,
- pchptr->ch_info.ch_number);
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- tinfo->play.pause = 1;
- }
- if (doread) {
- ATRACE("am_set_mode_task() stop record", chptr);
- tinfo = rchptr->ch_info.info;
- am_ad_stop_record(statep, stpptr, ad_infop,
- rchptr->ch_info.ch_number);
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- tinfo->record.pause = 0;
- }
-
- /*
- * Multi-stream Codecs already use the virtual channel
- * configuration to set the hardware, so this is a trivial
- * change to make. Everything is halted so we don't need
- * to lock this.
- */
- if (new_mode == AM_COMPAT_MODE) {
- stpptr->am_pstate->apm_mode = AM_COMPAT_MODE;
- } else {
- ASSERT(new_mode == AM_MIXER_MODE);
- stpptr->am_pstate->apm_mode = AM_MIXER_MODE;
- }
-
- ATRACE("am_set_mode_task() AM_MS_CODEC switch done", ad_infop);
-
- } else {
- ASSERT(ad_infop->ad_codec_type == AM_TRAD_CODEC);
-
- /* wait for playing to end */
- mutex_enter(&stpptr->am_mode_lock);
-
- while (dowrite && hw_info->play.active) {
- ATRACE_32("am_set_mode_task() wait to stop playing",
- hw_info->play.active);
- if (cv_wait_sig(&stpptr->am_mode_cv,
- &stpptr->am_mode_lock) <= 0) {
-
- ATRACE("am_set_mode_task() signal interrupt",
- hw_info->play.active);
-
- mutex_exit(&stpptr->am_mode_lock);
-
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- if (new_mode == AM_MIXER_MODE) {
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
- }
-
- error = EINTR;
- goto done;
- }
- ATRACE(
- "am_set_mode_task() signal returned normally", 0);
- }
- mutex_exit(&stpptr->am_mode_lock);
-
- /*
- * Now we shutdown the record channel, if active.
- * We have to lock to make this call.
- */
- if (doread && hw_info->record.active) {
- am_ad_stop_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
- hw_info->record.active = 0;
- }
-
- /* wait as long as possible to save the old state for later */
- bcopy(hw_info, &old_hw_info, sizeof (*hw_info));
-
- /* find the play and record channels */
- ASSERT(pcount == 0);
- ASSERT(rcount == 0);
- ASSERT(pchptr == 0);
- ASSERT(rchptr == 0);
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip non-AUDIO and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* is this channel playing?, recording? */
- tchpptr = tchptr->ch_private;
- ATRACE("am_set_mode_task() found ch flags",
- tchpptr->acp_flags);
- if (dowrite && tchpptr->acp_writing) {
- ATRACE_32("am_set_mode_task() T found play ch",
- tchptr->ch_info.ch_number);
- /*
- * Disable the queue so that am_wsvc() won't
- * process any more data messages.
- */
- noenable(tchptr->ch_qptr);
-
- pchptr = tchptr;
-#ifdef DEBUG
- pcount++;
-#endif
- }
- if (doread && tchpptr->acp_reading) {
- ATRACE_32(
- "am_set_mode_task() T found record ch",
- tchptr->ch_info.ch_number);
- rchptr = tchptr;
-#ifdef DEBUG
- rcount++;
-#endif
- }
-
- mutex_exit(&tchptr->ch_lock);
-
- /* are we done finding active channels? */
- if ((pchptr || !dowrite) && (rchptr || !doread)) {
- break;
- }
- }
- ASSERT(pcount <= 1);
- ASSERT(rcount <= 1);
-
- /*
- * We stop playing because we have to force it to restart from
- * scratch, which means flushing the DMA engine. Otherwise
- * there's old data with the wrong format. This a problem only
- * when we are paused.
- */
- if (pchptr &&
- ((audio_info_t *)pchptr->ch_info.info)->play.pause) {
- am_ad_stop_play(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD);
- }
-
- if (new_mode == AM_MIXER_MODE) {
- if (am_set_mixer_mode(chptr, ad_infop, stpptr,
- pchptr, rchptr) == AUDIO_FAILURE) {
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
-
- error = EIO;
- goto done;
- }
- } else {
- if (am_set_compat_mode(chptr, ad_infop,
- pchptr, rchptr) == AUDIO_FAILURE) {
- /* we aren't switching modes any longer */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we are bailing, so we need to restart */
- am_restart(statep, hw_info);
-
- ASSERT(new_pinfo == NULL);
- ASSERT(new_rinfo == NULL);
-
- error = EIO;
- goto done;
- }
- }
- }
- /* save the mode in persistent memory */
- stpptr->am_pstate->apm_mode = new_mode;
-
- /*
- * CAUTION: From here on out we cannot fail. We've changed modes
- * and to fail would require setting it back. It is better
- * to have a gap in audio then to go back at this point.
- */
-
- /* we're in a new mode now, so fix the play/rec info pointers */
- hw_info = &stpptr->am_hw_info;
- if (new_mode == AM_MIXER_MODE) {
- int tpid;
- /* rebuild info structures and get pids */
- if (pchptr && pchptr == rchptr) {
- /* this is play/record channel */
- mutex_enter(&pchptr->ch_lock);
- ppid = pchptr->ch_info.pid;
- rpid = ppid;
-
- tinfo = new_pinfo;
- pchptr->ch_info.info = tinfo;
- mutex_exit(&pchptr->ch_lock);
-
- if (new_rinfo) {
- kmem_free(new_rinfo, sizeof (*new_rinfo));
- }
- new_rinfo = NULL;
-
- /* copy in the old play state */
- bcopy(&old_hw_info.play, &tinfo->play,
- (2 * sizeof (old_hw_info.play)));
-
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- } else {
- /* play or record channels */
- ASSERT(pchptr != rchptr ||
- (pchptr == 0 && rchptr == 0));
- if (pchptr) {
- mutex_enter(&pchptr->ch_lock);
- ppid = pchptr->ch_info.pid;
-
- tinfo = new_pinfo;
- AUDIO_INIT(tinfo, sizeof (*tinfo));
- pchptr->ch_info.info = tinfo;
-
- /* copy in the old play state */
- bcopy(&old_hw_info.play, &tinfo->play,
- sizeof (tinfo->play));
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- mutex_exit(&pchptr->ch_lock);
- } else {
- if (new_pinfo) {
- kmem_free(new_pinfo,
- sizeof (*new_pinfo));
- }
- new_pinfo = NULL;
- }
- if (rchptr) {
- mutex_enter(&rchptr->ch_lock);
- rpid = rchptr->ch_info.pid;
-
- tinfo = new_rinfo;
- AUDIO_INIT(tinfo, sizeof (*tinfo));
- rchptr->ch_info.info = tinfo;
-
- /* copy in the old record state */
- bcopy(&old_hw_info.record, &tinfo->record,
- sizeof (old_hw_info.record));
- /* copy the current dev state */
- tinfo->monitor_gain = hw_info->monitor_gain;
- tinfo->output_muted = hw_info->output_muted;
- tinfo->hw_features = hw_info->hw_features;
- tinfo->sw_features = hw_info->sw_features;
- tinfo->sw_features_enabled =
- hw_info->sw_features_enabled;
- tinfo->ref_cnt = 1;
- mutex_exit(&rchptr->ch_lock);
- } else {
- if (new_rinfo) {
- kmem_free(new_rinfo,
- sizeof (*new_rinfo));
- }
- new_rinfo = NULL;
- }
- }
-
- /* start over with the reference count */
- hw_info->ref_cnt = 1;
-
- /* find AUDIOCTL channels to assoc. with AUDIO chs */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip if not AUDIOCTL or allocated chs */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ASSERT(hw_info == tchptr->ch_info.info);
-
- tpid = tchptr->ch_info.pid;
-
- if (ppid && tpid == ppid) {
- tchptr->ch_info.info = new_pinfo;
- new_pinfo->ref_cnt++;
- } else if (rpid && tpid == rpid) {
- tchptr->ch_info.info = new_rinfo;
- new_rinfo->ref_cnt++;
- } else {
- tchptr->ch_info.info = hw_info;
- hw_info->ref_cnt++;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- /* now we need to re-initialize the src structures */
- if (pchptr) {
- ATRACE("am_set_mode_task() calling am_fix_play_pause",
- pchptr->ch_private);
-
- am_fix_play_pause(pchptr);
- }
- } else {
- /* start over with the reference count */
- hw_info->ref_cnt = 1;
-
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /*
- * Skip if ! AUDIO, AUDIOCTL or allocated channels.
- *
- * It is possible that new audio will arrive in
- * am_wsvc(), thus we need to make sure we have this
- * lock and hold it if we have to manipulate the
- * channel's info structure.
- */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- (tchptr->ch_info.dev_type != AUDIO &&
- tchptr->ch_info.dev_type != AUDIOCTL) ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* see if we need to free the info structure */
- tinfo = tchptr->ch_info.info;
- if (tinfo != hw_info) {
- /* not set to hw */
- if (tinfo->ref_cnt == 1) {
- /* not set to hw, and only ref so clr */
- kmem_free(tinfo, sizeof (*tinfo));
- } else {
- /* someone else has a link to it */
- tinfo->ref_cnt--;
- }
- }
- /* now set to hardware */
- tchptr->ch_info.info = hw_info;
- hw_info->ref_cnt++;
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
- /* we don't need this flag anymore, re-enabling ioctls */
- mutex_enter(&apm_infop->apm_lock);
- stpptr->am_flags &= ~AM_PRIV_SW_MODES;
- mutex_exit(&apm_infop->apm_lock);
-
- /* we're in the new mode, so restart I/O */
- am_restart(statep, hw_info);
-
- mutex_enter(&statep->as_lock);
- /* if we have blocked processes they should unblock */
- if (new_mode == AM_MIXER_MODE) {
- cv_broadcast(&statep->as_cv);
- }
- mutex_exit(&statep->as_lock);
-
- ATRACE_32("am_set_mode_task() done, new mode", new_mode);
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- am_send_signal(statep, stpptr);
-
- ATRACE_32("am_set_mode_task() returning ack", error);
-
-} /* am_set_mode_task() */
-
-/*
- * am_setinfo_task()
- *
- * Description:
- * The third part of the AUDIO_SETINFO ioctl(). This is the task that
- * gets serial access to the info data structure and hardware.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_setinfo_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- audio_info_t *tinfo = (audio_info_t *)mp->b_cont->b_rptr;
- int error = 0;
-
- ATRACE("in am_setinfo_task() arg", arg);
-
- am_enter_rwlock();
-
- if (cqp->cq_cmd != AUDIO_SETINFO) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO bad command", cqp->cq_cmd);
- error = EINVAL;
- goto nack;
- }
-
- /*
- * Don't allow this ioctl() when on an audioctl channel when multiple
- * audio channel open()s are allowed. We have to do this in the task
- * because that's the only way we can rely on the state.
- */
- mutex_enter(&chptr->ch_lock);
- if (chptr->ch_info.dev_type == AUDIOCTL &&
- (chpptr->acp_flags & AM_CHNL_MULTI_OPEN)) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO bad type",
- chptr->ch_info.dev_type);
- mutex_exit(&chptr->ch_lock);
- error = EINVAL;
- goto nack;
- }
- mutex_exit(&chptr->ch_lock);
-
- /* too ugly to check here, so send to a utility routine */
- ATRACE("am_setinfo_task() calling am_audio_set_info()", chptr);
- if (am_audio_set_info(chptr, tinfo, tinfo) == AUDIO_FAILURE) {
- ATRACE_32("am_wioctl() AUDIO_SETINFO setinfo failed command",
- cqp->cq_cmd);
- error = EINVAL;
- goto nack;
- }
-
- /* update the played sample count */
- mutex_enter(&chptr->ch_lock);
- am_fix_info(chptr, tinfo);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * Since there wasn't an error we were successful, now return
- * the updated structure.
- */
- state->ais_command = AM_COPY_OUT_AUDIOINFO2;
-
- /* Setup for copyout */
- ASSERT(state->ais_address != NULL);
- mcopyout(mp, state, sizeof (*tinfo), state->ais_address, NULL);
- ASSERT(mp->b_cont->b_wptr == (mp->b_cont->b_rptr + sizeof (*tinfo)));
-
- qreply(q, mp);
-
- kmem_free(arg, sizeof (am_ioctl_args_t));
-
- am_exit_task(chptr);
-
- am_release_rwlock();
-
- ATRACE("am_setinfo_task() returning", chptr);
-
- return;
-
-nack:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_setinfo_task() returning nack", error);
-
-} /* am_setinfo_task() */
-
-/*
- * am_single_open_task()
- *
- * Description:
- * The second part of the AUDIO_MIXER_SINGLE_OPEN ioctl(). We check
- * the state here so we can rely on the state.
- *
- * Arguments:
- * void *arg Argument structure
- *
- * Returns:
- * void
- */
-static void
-am_single_open_task(void *arg)
-{
- queue_t *q = ((am_ioctl_args_t *)arg)->aia_q;
- mblk_t *mp = ((am_ioctl_args_t *)arg)->aia_mp;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- struct copyreq *cqp = (struct copyreq *)mp->b_rptr;
- audio_i_state_t *state = (audio_i_state_t *)cqp->cq_private;
- am_ch_private_t *tchpptr;
- pid_t tpid;
- int error = 0;
- int i;
- int max_chs = statep->as_max_chs;
- int num_rd = 0;
- int num_wr = 0;
-
- ATRACE("in am_single_open_task() arg", arg);
-
- am_enter_rwlock();
-
- /*
- * Don't allow this ioctl() if not in MIXER mode. We have to do this
- * check in the task because that's the only way we can rely on the
- * state.
- */
- if (stpptr->am_pstate->apm_mode == AM_COMPAT_MODE) {
- ATRACE_32("am_single_open_task() bad mode",
- stpptr->am_pstate->apm_mode);
- error = EINVAL;
- goto done;
- }
-
- /* see if there are multiple open()s already */
- tpid = chptr->ch_info.pid;
-
- /* we need to freeze channel allocation */
- mutex_enter(&statep->as_lock);
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
- /* ignore different processes */
- mutex_enter(&tchptr->ch_lock);
- if (tchptr->ch_info.pid != tpid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- tchpptr = tchptr->ch_private;
- if (tchpptr->acp_reading) {
- num_rd++;
- }
- if (tchpptr->acp_writing) {
- num_wr++;
- }
- mutex_exit(&tchptr->ch_lock);
- }
- mutex_exit(&statep->as_lock);
-
- /* we change back only if at most 1 read or write ch. open */
- if (num_rd > 1 || num_wr > 1) {
- /* too many channels open, so we have to fail */
- error = EIO;
- } else {
- /* if we get here we know there is only 1 ch, ours */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags &= ~AM_CHNL_MULTI_OPEN;
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_single_open_task() flags", chpptr->acp_flags);
- }
-
-done:
- am_mixer_task_acknack(state, chptr, q, mp, arg, error);
-
- am_release_rwlock();
-
- ATRACE_32("am_single_open_task() done", error);
-
-} /* am_single_open_task() */
diff --git a/usr/src/uts/common/io/audio/sada/mixer/am_main.c b/usr/src/uts/common/io/audio/sada/mixer/am_main.c
deleted file mode 100644
index 856d21bef0..0000000000
--- a/usr/src/uts/common/io/audio/sada/mixer/am_main.c
+++ /dev/null
@@ -1,4273 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * Mixer Audio Personality Module (mixer)
- *
- * This module is used by Audio Drivers that wish to have the audio(7I)
- * and mixer(7I) semantics for /dev/audio and /dev/audioctl. In general,
- * the mixer(7I) semantics are a superset of the audio(7I) semantics. Either
- * semantics may be enforced, depending on the mode of the mixer, AM_MIXER_MODE
- * or AM_COMPAT_MODE, respectively. The initial mode is set by the Audio
- * Driver and may be changed on the fly, even while playing or recording
- * audio. When mixing is enabled multiple play and record streams are allowed,
- * and new ioctls are also available. Some legacy applications may not behave
- * well in this mode, thus the availability of the compatibility mode.
- *
- * In addition to providing two sets of semantics, this module also supports
- * two types of audio Codecs, those that have a single play and record stream
- * (traditional Codecs) and those that allow multiple play and record streams
- * (multi-stream Codecs). Because multi-streaming Codecs must do sample rate
- * conversion in hardware in order to mix, the audio stream is not sample rate
- * converted. However, for traditional Codecs the audio streams must be sample
- * rate converted.
- *
- * The mixer supports a number of data formats on all hardware devices. To do
- * this all incoming audio is converted to a canonical format, which is 16-bit
- * linear PCM. This audio is held in 32-bit integers, which allows it to be
- * mixed with other streams without losing data due to overflowing as would
- * happen if it was stored as a 16-bit short. It is also converted to mono or
- * stereo to match the hardware. When audio is played it is converted to the
- * format the hardware supports.
- *
- * Once the hardware format is set it is never changed again, except for the
- * sample rate.
- *
- * The following formats are supported:
- * 16-bit linear PCM, mono and stereo
- * 8-bit linear PCM, mono and stereo
- * 8-bit u-law, mono and stereo
- * 8-bit a-law, mono and stereo
- *
- * In order to present a uniform view of audio there are three different
- * views of the hardware.
- * 1. The true configuration of the audio device. This view is not
- * visible by applications. However it is used by the mixer to properly
- * format audio for the device.
- * 2. The COMPAT mode view. The is the view AUDIOCTL channels get when
- * there aren't any AUDIO channels open in the application. This is
- * called the master view. The reason this is not the true hardware view
- * is because some hardware cannot support all formats. For example,
- * many devices do not support u-law or a-law. The mixer can do this
- * translation. However it would be confusing to show apps that the
- * device was really set to linear PCM.
- * 2. The MIXER mode view. This is the view AUDIO channels and AUDIOCTL
- * channels in apps that have an AUDIO channel open see. It is mostly
- * virtual. It always reflects how the channel was programmed. This
- * becomes the COMPAT view when put into compatibility mode.
- *
- * Most ioctl()s are executed from a task queue. This gives them their own
- * thread and thus they can block without violating the STREAMS blocking rules.
- * The task queue is limited to just one thread. Thus these ioctl()s are
- * serialized and thus access to the hardware state structures and hardware
- * are protected.
- *
- * NOTE: statep->as_max_chs is set when the audiosup module loads, so we
- * don't need to protect it when we access it.
- *
- * NOTE: All linear PCM is assumed to be signed. Therefore if the device
- * only supports unsigned linear PCM we need to translate either
- * before we send it to the device or after we take it from the
- * device. This way we save each Audio Driver from having to do
- * this.
- *
- * NOTE: This module depends on the misc/audiosup module being loaded 1st.
- *
- * The audio mixer source code is broken up into three components:
- * am_main.c: module load and STREAMS entry points
- * am_ad.c: Audio Driver entry points
- * am_ioctl.c: ioctl() code
- *
- * These routines are called by the audio support module:
- * am_open_audio()
- * am_open_audioctl()
- * am_close_audio()
- * am_close_audioctl()
- * am_restore_state()
- * am_save_state()
- * am_rput() - private
- * am_rsvc() - private
- * am_wput() - private
- * am_wsvc() - private
- *
- * These routines are provided for use by the other mixer source code files:
- * am_apply_gain_balance()
- * am_convert_int_mono_stereo()
- * am_convert_to_int()
- * am_send_signal()
- * am_update_conv_buffer()
- * am_update_src_buffer()
- */
-
-#include <sys/modctl.h>
-#include <sys/debug.h>
-#include <sys/kmem.h>
-#include <sys/errno.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/file.h>
-#include <sys/fcntl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_apm.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/impl/audio_mixer_impl.h>
-
-/*
- * Private primary routines provided by this file. These are provided to the
- * audio support module via am_open_audio() and am_open_audioctl().
- */
-static int am_rput(queue_t *, mblk_t *);
-static int am_rsvc(queue_t *);
-static int am_wput(queue_t *, mblk_t *);
-static int am_wsvc(queue_t *);
-
-/*
- * Local routine prototypes used only by this file.
- */
-static void am_flush(queue_t *, mblk_t *);
-static int am_p_process(audio_ch_t *, void *, size_t, int **, size_t *, int **,
- size_t *);
-static void am_set_waiting(audio_state_t *, pid_t, int, boolean_t, boolean_t);
-
-/*
- * Module Linkage Structures
- */
-/* Linkage structure for loadable drivers */
-static struct modlmisc mixer_modlmisc = {
- &mod_miscops, /* drv_modops */
- MIXER_MOD_NAME, /* drv_linkinfo */
-};
-
-static struct modlinkage mixer_modlinkage =
-{
- MODREV_1, /* ml_rev */
- (void*)&mixer_modlmisc, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-/*
- * Loadable Module Configuration Entry Points
- *
- *
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in mixer _init()", 0);
-
- /* standard linkage call */
- if ((error = mod_install(&mixer_modlinkage)) != 0) {
- ATRACE_32("mixer _init() error 1", error);
- return (error);
- }
-
- ATRACE("mixer _init() successful", 0);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description
- * Module de-initialization, called when driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in mixer _fini()", 0);
-
- if ((error = mod_remove(&mixer_modlinkage)) != 0) {
- ATRACE_32("mixer _fini() mod_remove failed", error);
- return (error);
- }
-
- ATRACE_32("mixer _fini() successful", error);
-
- return (error);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to an opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int rc;
-
- rc = mod_info(&mixer_modlinkage, modinfop);
-
- ATRACE_32("mixer _info() returning", rc);
-
- return (rc);
-
-} /* _info() */
-
-/*
- * The public main routines for this file.
- */
-
-/*
- * am_open_audio()
- *
- * Description:
- * AUDIO channel specific open() routine. There are lots of rules here,
- * depending on audio vs. audioctl and backward compatibility vs. mixer
- * mode. Thus mode switching must be frozen, which we do by freezing the
- * taskq.
- *
- * NOTE: In user context so it is okay for memory allocation to sleep.
- *
- * NOTE: audio(7I) redefines the O_NONBLOCK/O_NDELAY open() flags to also
- * mean don't block waiting for a play/record channel to exit.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int oflag Open flags
- * int sflag STREAMS flag
- * cred_t *credp Ptr to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully opened the device
- * errno Error number for failed open()
- */
-/*ARGSUSED*/
-int
-am_open_audio(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- am_ch_private_t *chpptr = NULL;
- audio_ch_t *chptr;
- audio_ch_t *tchptr;
- audio_info_t *default_info;
- audio_info_t *hw_info;
- audio_info_t *iptr;
- pid_t pid;
- boolean_t wantread = B_FALSE;
- boolean_t wantwrite = B_FALSE;
- ulong_t minor;
- int ch_flags = 0;
- int error;
- int i;
- int max_chs;
- int multi_open = 0;
- int mode;
- int rc;
-
- ATRACE("in am_open_audio()", devp);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "am_open_audio() audio_sup_devt_to_state() failed", 0);
- return (EIO);
- }
-
- /* this driver does only a conventional open(), i.e., no clone opens */
- if (sflag) {
- ATRACE("am_open_audio() clone open() failure", sflag);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "only conventional open()s are supported");
- return (EIO);
- }
-
- /*
- * Determine if opening to FREAD and/or FWRITE. We also make sure
- * that at least one of FREAD or FWRITE is set.
- */
- if (oflag & FREAD) {
- wantread = B_TRUE;
- ch_flags |= AUDIO_RECORD;
- ATRACE_32("am_open_audio() allocate channel with read limits",
- ch_flags);
- } else {
- wantread = B_FALSE;
- }
- if (oflag & FWRITE) {
- wantwrite = B_TRUE;
- ch_flags |= AUDIO_PLAY;
- ATRACE_32("am_open_audio() allocate channel with write limits",
- ch_flags);
- } else {
- wantwrite = B_FALSE;
- }
- if (wantread == B_FALSE && wantwrite == B_FALSE) {
- ATRACE_32("am_open_audio(): must be RD, WR or RDWR", oflag);
- return (EINVAL);
- }
-
- /* figure out if allocates should sleep or not */
- ch_flags |= (oflag & (O_NONBLOCK|O_NDELAY)) ?
- AUDIO_NO_SLEEP : AUDIO_SLEEP;
-
- /* get the PID for the process opening the channel */
- pid = ddi_get_pid();
-
- /* get pointers to various data structures */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIO)) == NULL) {
- ATRACE("am_open_audio() audio_sup_get_apm_info() failed", 0);
- return (EIO);
- }
-
- mutex_enter(&apm_infop->apm_lock);
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- ad_infop = apm_infop->apm_ad_infop;
- default_info = ad_infop->ad_defaults;
- max_chs = statep->as_max_chs;
-
- /* see if we've been offlined */
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline #1", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- return (EIO);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * The hardware may support only play or record and not the other.
- * If this is the case and the application asked for the direction
- * that isn't supported there's no way it can ever succeed. So we
- * fail right away.
- */
- if ((wantwrite &&
- !(default_info->hw_features & AUDIO_HWFEATURE_PLAY)) ||
- (wantread &&
- !(default_info->hw_features & AUDIO_HWFEATURE_RECORD))) {
- ATRACE("am_open_audio() trying to do illegal direction",
- default_info);
- return (EINVAL);
- }
-
- /*
- * The hardware may be limited to simplex operation, i.e., it may
- * only play or record at any one time. We make sure we haven't
- * asked for something the hardware can't do before we continue.
- */
- if ((default_info->hw_features & AUDIO_HWFEATURE_DUPLEX) == 0) {
- ATRACE_32("am_open_audio() simplex", default_info->hw_features);
- /* make sure we didn't open read/write */
- if (wantread && wantwrite) {
- /* we can never, ever succeed, so fail now */
- ATRACE("am_open_audio() simplex failed, RD_WR", stpptr);
- return (EBUSY);
- }
-
- /* we have to freeze the channels while we look at them */
- mutex_enter(&statep->as_lock);
-
- /* make sure we are asking for something we can have */
- while ((stpptr->am_in_chs && wantwrite) ||
- (stpptr->am_out_chs && wantread)) {
-
- ATRACE("am_open_audio() simplex blocked", stpptr);
-
- /* is it okay to block and wait for the hw? */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- return (EBUSY);
- }
-
- /*
- * Mark all AUDIO ch waiting flags. We may be
- * re-marking some, but there may be new chs since
- * the last loop through the channels. We also
- * mark both directions so that one direction knows
- * that the other is waiting.
- */
- am_set_waiting(statep, AM_NO_PID, AM_SET_WAITING,
- AM_SET_PLAY, AM_SET_RECORD);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /* wait for a channel to be freed */
- ATRACE("am_open_audio() simplex blocked", stpptr);
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
-
- ATRACE("am_open_audio() simplex signal wakeup",
- statep);
- /*
- * This channel may have had a signal, but
- * that doesn't mean any of the other channels
- * may proceed. So make sure every channel
- * gets another go. We clear the waiting flags
- * and then any others loop back and reset if
- * needed. That's why we do the cv_broadcast().
- */
- am_set_waiting(statep, AM_NO_PID,
- AM_CLEAR_WAITING, AM_SET_PLAY,
- AM_SET_RECORD);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- return (EINTR);
- }
- /*
- * Normal wakeup, clear the waiting flags. If the
- * channels need to wait they'll set the flags. That's
- * why we wake all the channels up, so they'll go
- * through their loop.
- */
- am_set_waiting(statep, AM_NO_PID, AM_CLEAR_WAITING,
- AM_SET_PLAY, AM_SET_RECORD);
- cv_broadcast(&statep->as_cv);
-
- ATRACE("am_open_audio() simplex normal wakeup", statep);
- }
-
- mutex_exit(&statep->as_lock);
- }
-
- ASSERT(!mutex_owned(&statep->as_lock));
-
- /*
- * Before we go any further we allocate all the memory we'll need.
- * We do it now so that we can sleep while not holding any locks
- * or freezing the taskq, which would be bad if we have to wait
- * a long time.
- */
- if ((chptr = audio_sup_alloc_ch(statep, &error, AUDIO, ch_flags)) ==
- NULL) {
- ATRACE_32("am_open_audio() alloc returning", error);
- return (error);
- }
- ASSERT(chptr->ch_info.pid == 0);
-
- /*
- * Before we get the rest of the memory we need we make sure that we
- * can allocate a channel in the audio driver, if needed. This may
- * block for a while, which is why we do it now.
- */
- if (am_ad_setup(statep, stpptr, ad_infop, chptr->ch_info.ch_number,
- ch_flags) == AUDIO_FAILURE) {
- /*
- * This should always succeed because we have the
- * configuration information. So if we don't there's
- * something wrong and we fail.
- */
- ATRACE("am_open_audio() ad_setup() failed", 0);
- (void) audio_sup_free_ch(chptr);
- return (EIO);
- }
- ATRACE("am_open_audio() ad_setup() succeeded", 0);
-
- /*
- * CAUTION: From here on we have to call ad_teardown() to
- * free the stream resources in the Audio Driver if
- * there is an error.
- *
- * Now allocate the rest of memory.
- */
- _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*chpptr));
- chpptr = kmem_zalloc(sizeof (*chpptr), KM_SLEEP);
- chpptr->acp_psb_size = ad_infop->ad_play.ad_bsize;
- chpptr->acp_play_samp_buf = kmem_zalloc(chpptr->acp_psb_size, KM_SLEEP);
-
- /* get an audio structure to use */
- iptr = kmem_alloc(sizeof (*iptr), KM_SLEEP);
-
- /*
- * CAUTION: From here on we must free the channel and memory if we
- * need to return on an error.
- *
- * Getting to here means there aren't any conflicts with the hardware,
- * so now the semantics of MIXER and COMPAT modes come to play. Because
- * these semantics depend on the mixer mode we have to block it from
- * changing. We do this by taking control of the taskq. Once we have
- * the taskq we know there's no way for the mode to change.
- */
- ATRACE("am_open_audio() entering again:", chptr);
-
-again: /* we loop back to here when cv_wait_sig returns due to a wakeup */
- ATRACE("am_open_audio() again: loop", chptr);
-
- ASSERT(!MUTEX_HELD(&statep->as_lock));
-
- /* check again to see if we've been offlined */
- mutex_enter(&apm_infop->apm_lock);
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline #2", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- rc = EIO;
- goto error;
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * CAUTION: We must keep the taskq blocked until we have everything
- * done. Otherwise a mode switch will make the state inconsistent.
- * Every time we jump to again: the taskq has been released so it
- * is possible for ioctl()s to make progress. This also means we
- * have to do a complete check every time since the hardware state
- * could have changed.
- */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* freeze the channels after freezing the taskq */
- mutex_enter(&statep->as_lock);
-
- mode = stpptr->am_pstate->apm_mode; /* reget, it may have changed */
-
- /*
- * If in MIXER mode then we look for multiple open()s with the same
- * PID. If no other AUDIO channels for the PID then we always succeed.
- * If in COMPAT mode we look for any open()s in the same direction.
- */
- ASSERT(pid != 0);
- if (mode == AM_MIXER_MODE) {
- for (i = 0, multi_open = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip non-audio channels and those not allocated */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr == tchptr ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * The same process can have separate read and write
- * open()s. But it can't have two reads or writes,
- * unless multiple open()s per process are allowed.
- */
- if (((am_ch_private_t *)tchptr->ch_private)->
- acp_flags & AM_CHNL_MULTI_OPEN) {
- mutex_exit(&tchptr->ch_lock);
- ch_flags |= AM_CHNL_MULTI_OPEN;
- /* don't need to look any further */
- break;
- } else if (
- (wantread && (tchptr->ch_dir & AUDIO_RECORD)) ||
- (wantwrite && (tchptr->ch_dir & AUDIO_PLAY))) {
- mutex_exit(&tchptr->ch_lock);
- /*
- * Multiple open()s not supported. So let the
- * taskq continue.
- */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING,
- wantwrite, wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /*
- * Wait for channels to be freed so we can
- * try again.
- */
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags
- * for the PID. We wakeup all waiting
- * channels, thus they go through their
- * loops and remark waiting.
- */
- am_set_waiting(statep, pid,
- AM_CLEAR_WAITING, wantwrite,
- wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If
- * the channels need to wait they'll set the
- * flags. That's why we wake all the channels
- * up, so they'll go through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
-
- }
- mutex_exit(&tchptr->ch_lock);
- }
- } else {
- ASSERT(mode == AM_COMPAT_MODE);
-
- /* we can't have two reads or writes at one once */
- mutex_enter(&chptr->ch_lock);
- if ((wantread && stpptr->am_in_chs) ||
- (wantwrite && stpptr->am_out_chs)) {
- mutex_exit(&chptr->ch_lock);
- /*
- * Multiple open()s not supported. So let the
- * taskq continue.
- */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING, wantwrite,
- wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- /* wait for channels to be freed so we can try again */
- if (cv_wait_sig(&statep->as_cv,
- &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags for the
- * PID. We wakeup all waiting channels, thus
- * they go through their loops and remark
- * waiting.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If the
- * channels need to wait they'll set the flags. That's
- * why we wake all the channels up, so they'll go
- * through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
-
- }
- mutex_exit(&chptr->ch_lock);
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /*
- * If we get here there are no conflicting open()s. However, if in
- * MIXER mode then we may be limited by the max number of channels,
- * max number of read channels, and the max number of write channels.
- * It wasn't easy to check above, so we do it now.
- */
- if (mode == AM_MIXER_MODE &&
- (stpptr->am_channels >= max_chs ||
- (wantread && stpptr->am_in_chs >= stpptr->am_max_in_chs) ||
- (wantwrite && stpptr->am_out_chs >= stpptr->am_max_out_chs))) {
- /* let the taskq continue working */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* if O_NDELAY then we just return */
- if (ch_flags & AUDIO_NO_SLEEP) {
- mutex_exit(&statep->as_lock);
- rc = EBUSY;
- goto error;
- }
-
- /* set waiting flags and wait */
- am_set_waiting(statep, pid, AM_SET_WAITING, wantwrite,
- wantread);
-
- /* send a signal so other procs will wake up */
- mutex_exit(&statep->as_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&statep->as_lock);
-
- if (cv_wait_sig(&statep->as_cv, &statep->as_lock) <= 0) {
- /*
- * Signal wakeup, clear waiting flags for the PID.
- * We wakeup all waiting channels, thus they go
- * through their loops and remark waiting.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING,
- wantwrite, wantread);
- mutex_exit(&statep->as_lock);
- rc = EINTR;
- goto error;
- }
- /*
- * Normal wakeup, clear the waiting flags. If the channels
- * need to wait they'll set the flags. That's why we wake all
- * the channels up, so they'll go through their loop.
- */
- am_set_waiting(statep, pid, AM_CLEAR_WAITING, wantwrite,
- wantread);
- cv_broadcast(&statep->as_cv);
- mutex_exit(&statep->as_lock);
- goto again;
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /*
- * We have a good channel, all open() semantics pass, so init the ch.
- *
- * CAUTION: pid isn't filled in until the very end. Otherwise
- * other routines that look for AUDIO or AUDIOCTL channels may
- * think that the channel is fully allocated and available for
- * use.
- */
- mutex_enter(&chptr->ch_lock);
- ASSERT(chptr->ch_statep == statep);
-
- chptr->ch_qptr = q;
- chptr->ch_wput = am_wput;
- chptr->ch_wsvc = am_wsvc;
- chptr->ch_rput = am_rput;
- chptr->ch_rsvc = am_rsvc;
- chptr->ch_dir = ch_flags & AUDIO_BOTH;
- chptr->ch_dev = *devp;
- chptr->ch_private = chpptr;
- chptr->ch_info.info_size = sizeof (audio_info_t);
- chptr->ch_dev_info = ad_infop->ad_dev_info;
-
- chpptr->acp_flags = multi_open;
- chpptr->acp_reading = wantread;
- chpptr->acp_writing = wantwrite;
-
- /* get the minor device for the new channel */
- minor = audio_sup_ch_to_minor(statep, chptr->ch_info.ch_number);
- ATRACE_32("am_open_audio() channel number", chptr->ch_info.ch_number);
- ATRACE_32("am_open_audio() new minor number", minor);
-
- /*
- * Setup the channel. We use the audio_info structure allocated above.
- * If we are in MIXER mode then we keep this structure and it becomes
- * the virtual state. If in COMPAT mode we free it after we set the
- * state.
- *
- * We init both play and record, that way it is always filled in.
- * Not all members are filled in, that happens in the ioctl() code.
- * Thus we have to init the structure so am_audio_set_info() will
- * ignore them.
- */
- AUDIO_INIT(iptr, sizeof (*iptr));
-
- iptr->record.sample_rate = default_info->record.sample_rate;
- iptr->record.channels = AUDIO_CHANNELS_MONO;
- iptr->record.precision = AUDIO_PRECISION_8;
- iptr->record.encoding = AUDIO_ENCODING_ULAW;
- iptr->record.buffer_size = ad_infop->ad_record.ad_bsize;
- iptr->record.samples = 0;
- iptr->record.eof = 0;
- iptr->record.pause = 0;
- iptr->record.error = 0;
- iptr->record.waiting = 0;
- iptr->record.minordev = minor;
- iptr->record.open = 0;
- iptr->record.active = 0;
-
- iptr->play.sample_rate = default_info->play.sample_rate;
- iptr->play.channels = AUDIO_CHANNELS_MONO;
- iptr->play.precision = AUDIO_PRECISION_8;
- iptr->play.encoding = AUDIO_ENCODING_ULAW;
- iptr->play.buffer_size = 0;
- iptr->play.samples = 0;
- iptr->play.eof = 0;
- iptr->play.pause = 0;
- iptr->play.error = 0;
- iptr->play.waiting = 0;
- iptr->play.minordev = minor;
- iptr->play.open = 0;
- iptr->play.active = 0;
-
- if (mode == AM_MIXER_MODE) { /* virtual channel */
- iptr->record.gain = stpptr->am_pstate->apm_rgain;
- iptr->record.balance = stpptr->am_pstate->apm_rbal;
- iptr->play.gain = stpptr->am_pstate->apm_pgain;
- iptr->play.balance = stpptr->am_pstate->apm_pbal;
- chptr->ch_info.info = iptr;
- iptr->output_muted = 0;
- iptr->ref_cnt = 1;
- } else { /* AM_COMPAT_MODE, physical channel */
- iptr->record.gain = hw_info->record.gain;
- iptr->record.balance = hw_info->record.balance;
- iptr->play.gain = hw_info->play.gain;
- iptr->play.balance = hw_info->play.balance;
- chptr->ch_info.info = hw_info;
- iptr->output_muted = hw_info->output_muted;
- iptr->ref_cnt = 0; /* delete struct when done */
- }
- iptr->monitor_gain = hw_info->monitor_gain;
-
- mutex_exit(&chptr->ch_lock);
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
- /* before we setup the hardware we need to init src */
- if (ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- if (wantread) {
- ATRACE("am_open_audio() REC., calling src init", chptr);
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_ch_rbuf_size =
- ad_infop->ad_record.ad_conv->ad_src_init(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- mutex_exit(&chptr->ch_lock);
- }
- if (wantwrite) {
- ATRACE("am_open_audio() PLAY, calling src init", chptr);
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_ch_pbuf_size =
- ad_infop->ad_play.ad_conv->ad_src_init(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- mutex_exit(&chptr->ch_lock);
- }
- }
-
- /* set the open flags and increment the counts */
- if (wantread) {
- stpptr->am_in_chs++;
- }
- if (wantwrite) {
- stpptr->am_out_chs++;
- }
- stpptr->am_channels++;
-
- /* setting the hardware can take a long time, so let channels go */
- mutex_exit(&statep->as_lock);
-
- /* setup the hardware */
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
- if (am_audio_set_info(chptr, iptr, NULL) == AUDIO_FAILURE) {
- ATRACE("am_open_audio() hw set failed", chptr);
-
- mutex_enter(&statep->as_lock);
- if (wantread) {
- stpptr->am_in_chs--;
- }
- if (wantwrite) {
- stpptr->am_out_chs--;
- }
- stpptr->am_channels--;
- mutex_exit(&statep->as_lock);
-
- /* let the taskq continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- rc = EINVAL;
-
- /* free up any sample rate conv. memory we allocated earlier */
- if (wantread) {
- ad_infop->ad_record.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- }
- if (wantwrite) {
- ad_infop->ad_play.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- }
-
- goto error;
- }
-
- /*
- * From here on we can't fail. If in COMPAT mode we need to clean up
- * the hardware reference counts.
- */
- if (mode == AM_COMPAT_MODE) {
- kmem_free(iptr, sizeof (*iptr));
- iptr = hw_info;
- iptr->ref_cnt++;
- }
- if (wantread) {
- iptr->record.open = 1;
- }
- if (wantwrite) {
- iptr->play.open = 1;
- }
-
- /*
- * For mixer mode we see if there are any AUDIOCTL channels with
- * this process. If there are then we need to re-associate them
- * to this channel.
- *
- * NOTE: We must still have the taskq frozen.
- */
- mutex_enter(&statep->as_lock);
-
- if (mode == AM_MIXER_MODE) {
- /* we have to keep the channels stable */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
-
- /* skip myself, unallocated, and closing channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr == tchptr ||
- (tchptr->ch_private &&
- ((am_ch_private_t *)tchptr->ch_private)->
- acp_flags & AM_CHNL_CLOSING)) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * Skip if different PIDs, including 0. pid is set
- * to 0 when am_close_audio*() is entered, so we aren't
- * associated with a closing channel.
- */
- if (tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* same PID, make sure it's AUDIOCTL */
- if (tchptr->ch_info.dev_type != AUDIOCTL) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /*
- * Yes! It's possible that the AUDIOCTL ch is
- * already attached to an AUDIO ch. If so we
- * don't muck with it. From this point it is
- * indeterminate as to what happens with
- * AUDIOCTL channels. If it isn't we associate
- * it with this AUDIO channel.
- */
- if (tchptr->ch_info.info == hw_info) {
- hw_info->ref_cnt--;
- ASSERT(hw_info->ref_cnt >= 1);
-
- ((am_ch_private_t *)
- tchptr->ch_private)->acp_flags |=
- AM_CHNL_CONTROL;
- tchptr->ch_info.info = iptr;
- iptr->ref_cnt++;
- }
-
- /*
- * we don't break because there can be more
- * than one AUDIOCTL for any one AUDIO channel.
- */
- mutex_exit(&tchptr->ch_lock);
- }
-
- /*
- * Above we set Codec info, but we need to set the
- * rest of the info in the iptr structure, except for
- * hardware related members, which we fill in when
- * needed.
- */
- iptr->play.avail_ports = hw_info->play.avail_ports;
- iptr->play.mod_ports = hw_info->play.mod_ports;
- iptr->record.avail_ports = hw_info->record.avail_ports;
- iptr->record.mod_ports = hw_info->record.mod_ports;
- }
-
- ASSERT(iptr != NULL);
- ASSERT(audio_sup_taskq_suspended(stpptr->am_taskq) ==
- AUDIO_TASKQ_SUSPENDED);
-
- /* we start out open and empty */
- chpptr->acp_flags |= (AM_CHNL_OPEN | AM_CHNL_EMPTY);
-
- /* we've made it through all the checks, so it's safe to make the dev */
- *devp = makedevice(getmajor(*devp), minor);
- ATRACE("am_open_audio() made device", devp);
-
- mutex_enter(&chptr->ch_lock);
- chptr->ch_dev = *devp;
- mutex_exit(&chptr->ch_lock);
-
- ASSERT(chptr->ch_info.ch_number ==
- audio_sup_minor_to_ch(statep, minor));
-
- ATRACE("am_open_audio() qprocson()", chptr);
-
- /*
- * WARNING: Do this after we can no longer fail or we will have a
- * potential memory leak. Also, do it before qprocson().
- */
- audio_sup_set_qptr(q, *devp, chptr);
-
- /* schedule the queue */
- qprocson(q);
-
- /*
- * Now we can set the pid. We don't need to lock the structure because
- * the worst thing that will happen is the channel will be skipped and
- * then picked up on the next sweep through the channels. Once this is
- * set the other mixer routines will see the channel.
- *
- * CAUTION: This must be after qprocson(), otherwise other threads will
- * try to process STREAMS messages on a partially started stream.
- * This will cause a panic. This shows up in am_send_signal().
- */
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.pid = pid;
- mutex_exit(&chptr->ch_lock);
-
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chpptr));
-
- /* thaw the taskq AFTER setting the pid */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- mutex_exit(&statep->as_lock);
-
- /* MUST be after inc. above - not locked any more, start recording */
- if (wantread) {
- mutex_enter(&chptr->ch_lock);
- if (am_set_record_streams(chptr) == AUDIO_SUCCESS) {
- chpptr->acp_flags |= AM_CHNL_RSTREAMS_SET;
- ATRACE("am_open() record STREAMS water marks adjusted",
- 0);
-#ifdef DEBUG
- } else {
- ATRACE("am_open() record STREAMS water marks not "
- "adjusted", 0);
-#endif
- }
- mutex_exit(&chptr->ch_lock);
-
- /* start recording, regardless of mode or Codec type */
- ATRACE("am_open_audio() starting record DMA engine", statep);
- /* set before start for mode switch */
- hw_info->record.active = 1;
- iptr->record.active = 1;
- iptr->record.pause = 0;
- if (am_ad_start_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number, AM_SERIALIZE) == AUDIO_FAILURE) {
- iptr->record.active = 0;
- hw_info->record.active = 0;
- /* we don't change pause flag if failed to start */
- }
- }
-
- ATRACE("am_open_audio() successful", statep);
-
- am_send_signal(statep, stpptr);
-
- return (AUDIO_SUCCESS);
-
-error:
- kmem_free(chpptr->acp_play_samp_buf, chpptr->acp_psb_size);
- kmem_free(chpptr, sizeof (*chpptr));
- if (iptr && iptr != hw_info) {
- kmem_free(iptr, sizeof (*iptr));
- }
- _NOTE(NOW_VISIBLE_TO_OTHER_THREADS(*chpptr));
-
- mutex_enter(&chptr->ch_lock);
- chptr->ch_private = NULL;
- chptr->ch_info.info = NULL;
- mutex_exit(&chptr->ch_lock);
-
- (void) audio_sup_free_ch(chptr);
-
- /* tell the Audio Driver to free up ch resources */
- am_ad_teardown(statep, stpptr, ad_infop, chptr->ch_info.ch_number,
- (ch_flags & AUDIO_BOTH));
- ATRACE("am_open_audio() ad_teardown() returned", 0);
-
- ATRACE_32("am_open_audio() at \"error\"", rc);
-
- return (rc);
-
-} /* am_open_audio() */
-
-/*
- * am_open_audioctl()
- *
- * Description:
- * AUDIOCTL channel specific open() routine. There are lots of rules here,
- * but not as bad audio am_open_audio(). We don't worry about whether the
- * channel is opened for read or writing as we don't read() or write()
- * the device.
- *
- * How AUDIOCTL channels are allocated:
- * COMPAT MODE
- * always points to the hardware
- * MIXER MODE
- * if no AUDIO channels open() for the process then points to
- * the hardware
- * if one AUDIO channel open() for the process then point to that
- * channel, thus it is virtual
- * if more than one AUDIO channel open() for the process then
- * point to the first AUDIO channel, this includes multiple open()s
- * as well as one for read and one for write, which isn't the same
- * as a multiple open()
- *
- * NOTE: In user context so it is okay for memory allocation to sleep.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * dev_t *devp Pointer to the device
- * int oflag Open flags
- * int sflag STREAMS flag
- * cred_t *credp Ptr to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully opened the device
- * errno Error number for failed open()
- */
-/*ARGSUSED*/
-int
-am_open_audioctl(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *credp)
-{
- audio_state_t *statep;
- audio_apm_info_t *apm_infop;
- audio_ch_t *chptr;
- audio_ch_t *tchptr;
- audio_info_t *hw_info;
- audio_info_t *iptr;
- am_ch_private_t *chpptr = 0;
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr;
- pid_t pid;
- ulong_t minor;
- int ch_flags;
- int error;
- int i;
- int max_chs;
- int mode;
-
- ATRACE("in am_open_audioctl()", devp);
-
- /* get the state structure */
- if ((statep = audio_sup_devt_to_state(*devp)) == NULL) {
- ATRACE_32(
- "am_open_audioctl() audio_sup_devt_to_state() failed", 0);
- return (EIO);
- }
-
- /* this driver does only a conventional open(), i.e., no clone opens */
- if (sflag) {
- ATRACE("am_open_audioctl() clone open() failure", sflag);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE, "mixer:"
- "only conventional open()s are supported");
- return (EIO);
- }
-
- /* figure out if allocates should sleep or not */
- ch_flags = (oflag & (O_NONBLOCK|O_NDELAY)) ?
- AUDIO_NO_SLEEP : AUDIO_SLEEP;
-
- /* get the PID for the process opening the channel */
- pid = ddi_get_pid();
-
- /* get pointers to various data structures */
- if ((apm_infop = audio_sup_get_apm_info(statep, AUDIOCTL)) == NULL) {
- ATRACE("am_open_audioctl() audio_sup_get_apm_info() failed", 0);
- return (EIO);
- }
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
- ad_infop = apm_infop->apm_ad_infop;
- max_chs = statep->as_max_chs;
-
- /* see if we've been offlined */
- mutex_enter(&apm_infop->apm_lock);
- if (!(stpptr->am_flags & AM_PRIV_ON_LINE)) {
- ATRACE_32("am_open_audio() offline", stpptr->am_flags);
- mutex_exit(&apm_infop->apm_lock);
- return (EIO);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- /*
- * Before we go any further we allocate the channel and all memory
- * that we'll need. That way we don't sleep holding any locks or
- * the taskq.
- */
- if ((chptr = audio_sup_alloc_ch(statep, &error, AUDIOCTL, ch_flags)) ==
- NULL) {
- ATRACE("am_open_audioctl() alloc returning", statep);
- return (error);
- }
-
- ASSERT(chptr->ch_info.pid == 0);
-
- chpptr = kmem_zalloc(sizeof (*chpptr), KM_SLEEP);
-
-
- /*
- * CAUTION: We must keep the taskq blocked until we have everything
- * done. Otherwise a mode switch will make the state inconsistent.
- */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* freeze channel allocation */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- /* mode may have changed, so re-get */
- mode = stpptr->am_pstate->apm_mode;
-
- /*
- * We have a good channel, all open() semantics pass, so init the ch.
- *
- * CAUTION: pid isn't filled in until the very end. Otherwise
- * other routines that look for AUDIO or AUDIOCTL channels may
- * think that the channel is fully allocated and available for
- * use.
- */
- chptr->ch_qptr = q;
- ASSERT(chptr->ch_statep == statep);
- chptr->ch_wput = am_wput;
- chptr->ch_wsvc = am_wsvc;
- chptr->ch_rput = am_rput;
- chptr->ch_rsvc = am_rsvc;
- chptr->ch_dir = 0;
- chptr->ch_dev = *devp;
- chptr->ch_private = chpptr;
- chptr->ch_info.info_size = sizeof (audio_info_t);
- chptr->ch_dev_info = ad_infop->ad_dev_info;
-
- chpptr->acp_flags = 0;
-
- /* get the minor device for the new channel */
- minor = audio_sup_ch_to_minor(statep, chptr->ch_info.ch_number);
- ATRACE_32("am_open_audioctl() channel number",
- chptr->ch_info.ch_number);
- ATRACE_32("am_open_audioctl() new minor number", minor);
-
- /*
- * Update the number of AUDIOCTL chs open for the mixer. We
- * don't bother updating the read or write counts because
- * they don't make sense for AUDIOCTL channels.
- */
- stpptr->am_channels++;
-
- mutex_exit(&chptr->ch_lock);
-
- /* figure out the audio_info structure, and initialize */
- if (mode == AM_MIXER_MODE) {
- /* is this AUDIOCTL channel related to an AUDIO ch? */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip myself, unallocated & diff. PID channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* yes, so link the info structs */
- ATRACE("am_open_audioctl() AUDIOCTL related", chptr);
-
- /* we lock the channel, not the state */
- iptr = tchptr->ch_info.info;
- chptr->ch_info.info = iptr;
- iptr->ref_cnt++;
- chpptr->acp_flags |= AM_CHNL_CONTROL;
- mutex_exit(&tchptr->ch_lock);
- break;
- }
-
- if (i == max_chs) { /* no, so link to HW */
- ATRACE("am_open_audioctl() AUDIOCTL not related",
- chptr);
-
- iptr = hw_info;
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.info = iptr;
- mutex_exit(&chptr->ch_lock);
- iptr->ref_cnt++;
- }
- } else {
- /* in COMPAT mode there is only one state structure */
- ATRACE("am_open_audioctl() AUDIOCTL: mode == AM_COMPAT_MODE",
- chptr);
-
- iptr = hw_info;
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.info = iptr;
- mutex_exit(&chptr->ch_lock);
- iptr->ref_cnt++;
- }
-
- /* we have all the state info, so we can let the state go */
- mutex_exit(&statep->as_lock);
-
- ATRACE("am_open_audioctl() AUDIOCTL iptr", iptr);
- ASSERT(iptr != NULL);
-
- mutex_enter(&chptr->ch_lock);
- /* we start out open and empty */
- chpptr->acp_flags |= (AM_CHNL_OPEN | AM_CHNL_EMPTY);
-
- ASSERT(iptr != NULL);
-
- /* we've made it through all the checks, so it's safe to make the dev */
- *devp = makedevice(getmajor(*devp), minor);
- ATRACE("am_open_audioctl() made device", devp);
-
- ASSERT(chptr->ch_info.ch_number ==
- audio_sup_minor_to_ch(statep, minor));
-
- ATRACE("am_open_audioctl() qprocson()", chptr);
- mutex_exit(&chptr->ch_lock);
-
- /*
- * WARNING: Do this after we can no longer fail or we will have a
- * potential memory leak. Also, do it before qprocson().
- */
- audio_sup_set_qptr(q, *devp, chptr);
-
- /* schedule the queue */
- qprocson(q);
-
- /*
- * Now we can set the pid. We don't need to lock the structure because
- * the worst thing that will happen is the channel will be skipped and
- * then picked up on the next sweep through the channels. Once this is
- * set the other mixer routines will see the channel.
- *
- * CAUTION: This must be after qprocson(), otherwise other threads will
- * try to process STREAMS messages on a partially started stream.
- * This will cause a panic. This shows up in am_send_signal().
- */
- mutex_enter(&chptr->ch_lock);
- chptr->ch_info.pid = pid;
- mutex_exit(&chptr->ch_lock);
-
- /* thaw the taskq AFTER setting the pid */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- ATRACE("am_open_audioctl() successful", statep);
-
- am_send_signal(statep, stpptr);
-
- return (AUDIO_SUCCESS);
-
-} /* am_open_audioctl() */
-
-/*
- * am_close_audio()
- *
- * Description:
- * Close a minor device, returning the minor number to the pool so that
- * open(2) may use it again.
- *
- * chpptr->acp_flags is used to coordinate draining the write queue.
- * am_close_audio() sets flags to AM_CHNL_CLOSING. It then waits for the
- * flags to have AM_CHNL_EMPTY set by am_get_audio() when all available
- * data has been drained and played. If a signal interrupts the draining
- * the queue is flushed and the AM_CHNL_OPEN flag is cleared.
- * am_get_audio() then ignores this channel until it is open()ed again.
- *
- * There are a number of rules that have to be followed when closing
- * an audio channel. Some of them depend on the state of the mixer.
- * Thus we must stop any mode switching. This is done by freezing the
- * taskq.
- *
- * NOTE: When ch_info.info is set and ref_cnt is changed statep->as_lock
- * is used and the taskq MUST be frozen. Otherwise a mode switch
- * will mess things up.
- *
- * NOTE: We need to behave differently for a normal close() vs. the user
- * app calling exit(). Unfortunately there isn't a DDI compliant
- * method for doing this, so we take a look at the current thread
- * and see if it's exiting or not. This is how the old diaudio
- * module did it.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag File status flag
- * cred_t *credp Pointer to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully closed the device
- * errno Error number for failed close()
- */
-/*ARGSUSED*/
-int
-am_close_audio(queue_t *q, int flag, cred_t *credp)
-{
- audio_info_t *info;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_ch_t *tchptr;
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- audio_info_t *alt_info = NULL;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- mblk_t *rec_mp;
- pid_t save_pid;
- int codec_type = ad_infop->ad_codec_type;
- int dir = 0;
- int i;
- int max_chs;
- int mode;
- int tmp_stream;
- int was_reading;
- int was_writing;
-
- ATRACE("in am_close_audio()", chptr);
- ATRACE_32("am_close_audio() channel number", chptr->ch_info.ch_number);
-
- ASSERT(q == chptr->ch_qptr);
-
- /* mark the channel as in the process of being closed */
- mutex_enter(&chptr->ch_lock);
- was_reading = chpptr->acp_reading;
- was_writing = chpptr->acp_writing;
- chpptr->acp_flags |= AM_CHNL_CLOSING;
- mutex_exit(&chptr->ch_lock);
-
- /* set the direction for ad_teardown() */
- if (was_reading) {
- dir |= AUDIO_RECORD;
- }
- if (was_writing) {
- dir |= AUDIO_PLAY;
- }
-
- /*
- * Wait for queue to drain, unless we were signaled in AUDIO_DRAIN
- * or the process is exiting (in which case we use the hack).
- */
- ATRACE("am_close_audio() checking to see if need to wait", chptr);
-
- if (was_writing) {
- /* we now need the info, so protect it by freezing the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mutex_enter(&chptr->ch_lock);
-
- info = chptr->ch_info.info;
-
- if (info->play.active && !info->play.pause) {
- /* release the taskq so it can continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
- ATRACE("am_close_audio() need to wait", chptr);
- while (!(chpptr->acp_flags & AM_CHNL_EMPTY) &&
- !(curthread->t_proc_flag & TP_LWPEXIT)) {
- ATRACE_32("am_close_audio() not empty",
- chpptr->acp_flags);
-
- /* wait for drain to complete */
- if (cv_wait_sig(&chptr->ch_cv,
- &chptr->ch_lock) <= 0) {
- ATRACE("am_close_audio() signal wakeup",
- chptr);
-
- break;
- }
- ATRACE_32("am_close_audio() normal wakeup",
- chpptr->acp_flags);
- }
- ATRACE_32("am_close_audio() empty", chpptr->acp_flags);
-
- /* clear the writing flag, for mode switching */
- chpptr->acp_writing = 0;
-
- mutex_exit(&chptr->ch_lock);
- } else {
- mutex_exit(&chptr->ch_lock);
- /* release the taskq so it can continue */
- audio_sup_taskq_resume(stpptr->am_taskq);
- }
- }
-
- /*
- * It is possible an old AUDIO_DRAIN, which was interrupted, is
- * still outstanding. So just in case, we see of there's an mblk_t
- * hanging around. If so then we send it back. The STREAMS head will
- * ignore it if appropriate.
- *
- * The channel is marked as empty. Thus if the process is killed or
- * the cv_wait_sig() returns we force the AUDIO_DRAIN ioctl() to
- * return. This is okay since we will be flushing any queued up audio
- * and closing the STREAMS q.
- */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
-
- /* wait for queued tasks to clear */
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- /* the mode & info struct mean something ONLY when the mode is frozen */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mode = stpptr->am_pstate->apm_mode;
- info = chptr->ch_info.info;
-
- /*
- * Shutdown play and record. We shut down play first because it could
- * take a long time to shut down and we don't want to stop recording
- * too soon.
- */
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- /* mark the channel closed so we can shut down the STREAMS queue */
- chpptr->acp_flags &= ~AM_CHNL_OPEN;
-
- /*
- * We shutdown the device if in COMPAT mode or for multi-stream
- * Codecs, or if this is the last playing/recording stream.
- */
- if (was_writing) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- stpptr->am_out_chs == 1) {
- ATRACE("am_close_audio() stopping play", statep);
- mutex_exit(&statep->as_lock);
- tmp_stream = chptr->ch_info.ch_number;
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_play(statep, stpptr, ad_infop, tmp_stream);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
- info->play.active = 0;
- hw_info->play.active = 0;
- info->play.pause = 0;
-
- /* make sure a mode switch wakes up */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
- }
-
- /* clear the writing flag, for mode switching */
- chpptr->acp_writing = 0;
- }
- if (was_reading) {
- if (mode == AM_COMPAT_MODE || codec_type == AM_MS_CODEC ||
- stpptr->am_in_chs == 1) {
- ATRACE("am_close_audio() stopping record", statep);
- mutex_exit(&statep->as_lock);
- tmp_stream = chptr->ch_info.ch_number;
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_record(statep, stpptr, ad_infop, tmp_stream);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
- info->record.active = 0;
- hw_info->record.active = 0;
- info->record.pause = 0;
- }
-
- /* send any recorded data that may still be hanging around */
- if (chpptr->acp_rec_mp) {
- info->record.samples += (chpptr->acp_rec_mp->b_wptr -
- chpptr->acp_rec_mp->b_rptr) /
- (info->record.channels *
- (info->record.precision >> AUDIO_PRECISION_SHIFT));
-
- rec_mp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
-
- mutex_exit(&chptr->ch_lock);
- mutex_exit(&statep->as_lock);
- putnext(RD(q), rec_mp);
- mutex_enter(&statep->as_lock);
- mutex_enter(&chptr->ch_lock);
-
- chpptr->acp_rec_mp = NULL;
- }
-
- /* clear the reading flag, for mode switching */
- chpptr->acp_reading = 0;
- }
-
- /* save the gain and balance for the next open() */
- if (was_writing) {
- stpptr->am_pstate->apm_pgain = info->play.gain;
- stpptr->am_pstate->apm_pbal = info->play.balance;
- }
- if (was_reading) {
- stpptr->am_pstate->apm_rgain = info->record.gain;
- stpptr->am_pstate->apm_rbal = info->record.balance;
- }
-
- /*
- * Clear the pid field - keeps this channel from being used while the
- * contents are being freed. But save the pid because we need it later.
- *
- * CAUTION: The taskq must be blocked before the PID is set to 0.
- * Otherwise switching modes can happen in the middle of closing,
- * which results in a bad reference count.
- */
- save_pid = chptr->ch_info.pid;
- chptr->ch_info.pid = 0;
-
- mutex_exit(&chptr->ch_lock);
-
- /* we are modifying mixer global data, so lock the mixer */
- mutex_enter(&apm_infop->apm_lock);
-
- ASSERT(stpptr->am_channels > 0);
- ASSERT(stpptr->am_in_chs >= 0);
- ASSERT(stpptr->am_out_chs >= 0);
-
- stpptr->am_channels--;
-
- if (was_reading) {
- ASSERT(stpptr->am_in_chs > 0);
- stpptr->am_in_chs--;
- if (stpptr->am_in_chs == 0) {
- /* turn off capture */
- info->record.active = 0;
- }
-
- info->record.open = 0;
- info->record.waiting = 0;
- info->record.active = 0;
- info->record.pause = 0;
- info->record.samples = 0;
- info->record.error = 0;
- }
-
- if (was_writing) {
- ASSERT(stpptr->am_out_chs > 0);
- stpptr->am_out_chs--;
-
- info->play.open = 0;
- info->play.waiting = 0;
- info->play.active = 0;
- info->play.pause = 0;
- info->play.samples = 0;
- info->play.eof = 0;
- info->play.error = 0;
- }
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&statep->as_lock);
-
- /*
- * If in MIXER mode the next step for closing the AUDIO channel is to
- * fix any AUDIOCTL channels that were pointing to this channel. Even
- * if multiple open()s aren't allowed we can still have one channel for
- * read and one for write. If there are multiple open()s then there
- * could be many channels. Thus we just look for the first AUDIO
- * channel with the same PID. If there isn't then we point to the
- * hardware.
- *
- * If in COMPAT mode then we are already pointing to hardware so
- * we skip this step.
- */
- max_chs = statep->as_max_chs;
- mutex_enter(&statep->as_lock); /* freeze the channels */
-
- if (mode == AM_MIXER_MODE) {
- /* first find the first AUDIO channel */
- ASSERT(alt_info == 0);
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip the same and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* skip if not AUDIOCTL or different PIDs */
- if (tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid != save_pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- alt_info = tchptr->ch_info.info;
-
- mutex_exit(&tchptr->ch_lock);
-
- break;
- }
- if (alt_info == NULL) {
- /* no match found, so set to hardware */
- alt_info = &stpptr->am_hw_info;
- }
-
- /* next update the AUDIOCTL chs to point to the correct ch */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip the same and unallocated channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr == chptr ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* skip if not AUDIOCTL or different PIDs */
- if (tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid != save_pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE("am_close_audio() setting AUDIOCTL info",
- alt_info);
- ATRACE_32("am_close_audio() setting AUDIOCTL info, ch",
- i);
-
- /*
- * This is the same PID, so fix info pointers. We check
- * to see if the AUDIOCTL channel is already pointing
- * to alt_info. If so then we don't have to do a thing.
- * But if it doesn't then we have to decrement the
- * count for where it points and then reset and
- * increment the new reference count.
- */
- if (tchptr->ch_info.info == alt_info) {
- /* the same, so continue */
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* different, so update counters and pointer */
- ((audio_info_t *)tchptr->ch_info.info)->ref_cnt--;
- tchptr->ch_info.info = alt_info;
- alt_info->ref_cnt++;
- mutex_exit(&tchptr->ch_lock);
- }
- }
-
- mutex_exit(&statep->as_lock);
-
- /* make sure we aren't closing while someone is busy */
- mutex_enter(&chptr->ch_lock);
- while (chpptr->acp_busy_cnt) {
- ATRACE_32("am_close_audio() in putnext(), calling cv_wait()",
- chpptr->acp_flags);
-
- chpptr->acp_flags |= AM_CHNL_SIGNAL_NEEDED;
-
- /* wait for the count to go to 0 */
- cv_wait(&chptr->ch_cv, &chptr->ch_lock);
- ATRACE("am_close_audio() putnext() cv wakeup", chptr);
- }
-
- /*
- * Mark that qprocsoff() has been called, even though technically it
- * hasn't. However, it will eliminate the race condition between
- * releasing the lock and the qprocsoff() below.
- */
- chpptr->acp_flags |= AM_CHNL_QPROCSOFF;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audio() flushing q", chptr);
- flushq(RD(q), FLUSHALL);
-
- /* unschedule the queue */
- ATRACE("am_close_audio() qprocsoff()", chptr);
- qprocsoff(q);
-
- /*
- * Remove the private data from the q, AFTER turning the q off.
- * If this is done before qprocsoff() then any STREAMS call
- * between these two would find bad qptr data and panic.
- */
- audio_sup_free_qptr(q);
-
- /* we have to reget this because it could have changed */
- info = chptr->ch_info.info;
-
- /* take care of references to the audio state structure */
- mutex_enter(&statep->as_lock);
- if (info->ref_cnt <= 1) {
- /*
- * Need to free the buffer. We don't need to lock because
- * only this thread can now be using this channel.
- */
- ASSERT(info != apm_infop->apm_ad_state);
- kmem_free(info, sizeof (audio_info_t));
- } else {
- info->ref_cnt--;
- }
- mutex_exit(&statep->as_lock);
-
- /* release the taskq AFTER we don't care about the mode */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- /* free the sample rate conversion routine buffers */
- if (codec_type == AM_TRAD_CODEC) {
- if (was_writing) {
- ad_infop->ad_play.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY);
- }
- if (was_reading) {
- ad_infop->ad_record.ad_conv->ad_src_exit(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_RECORD);
- }
- }
-
- /*
- * Tell the Audio Driver to free up any channel config info.
- * This may block, which is why we do it without any locks held
- * or the taskq frozen.
- */
- am_ad_teardown(statep, stpptr, ad_infop, chptr->ch_info.ch_number, dir);
- ATRACE("am_close_audio() ad_teardown() returned", 0);
-
- mutex_enter(&chptr->ch_lock);
-
- /* free all the buffers */
- if (chpptr->acp_play_samp_buf) {
- kmem_free(chpptr->acp_play_samp_buf, chpptr->acp_psb_size);
- chpptr->acp_play_samp_buf = NULL;
- chpptr->acp_psb_size = 0;
- }
- if (chpptr->acp_ch_psrc1) {
- kmem_free(chpptr->acp_ch_psrc1, chpptr->acp_ch_psrc_siz);
- chpptr->acp_ch_psrc1 = NULL;
- }
- if (chpptr->acp_ch_psrc2) {
- kmem_free(chpptr->acp_ch_psrc2, chpptr->acp_ch_psrc_siz);
- chpptr->acp_ch_psrc2 = NULL;
- }
- chpptr->acp_ch_psrc_siz = 0;
- if (chpptr->acp_ch_pconv1) {
- kmem_free(chpptr->acp_ch_pconv1, chpptr->acp_ch_pconv_siz);
- chpptr->acp_ch_pconv1 = NULL;
- }
- if (chpptr->acp_ch_pconv2) {
- kmem_free(chpptr->acp_ch_pconv2, chpptr->acp_ch_pconv_siz);
- chpptr->acp_ch_pconv2 = NULL;
- }
- chpptr->acp_ch_pconv_siz = 0;
- if (chpptr->acp_ch_rsrc1) {
- kmem_free(chpptr->acp_ch_rsrc1, chpptr->acp_ch_rsrc_siz);
- chpptr->acp_ch_rsrc1 = NULL;
- }
- if (chpptr->acp_ch_rsrc2) {
- kmem_free(chpptr->acp_ch_rsrc2, chpptr->acp_ch_rsrc_siz);
- chpptr->acp_ch_rsrc2 = NULL;
- }
- chpptr->acp_ch_rsrc_siz = 0;
- if (chpptr->acp_ch_rconv1) {
- kmem_free(chpptr->acp_ch_rconv1, chpptr->acp_ch_rconv_siz);
- chpptr->acp_ch_rconv1 = NULL;
- }
- if (chpptr->acp_ch_rconv2) {
- kmem_free(chpptr->acp_ch_rconv2, chpptr->acp_ch_rconv_siz);
- chpptr->acp_ch_rconv2 = NULL;
- }
- chpptr->acp_ch_rconv_siz = 0;
-
- ASSERT(chpptr->acp_rec_mp == NULL);
-
- /* send the close signal */
- mutex_exit(&chptr->ch_lock);
- am_send_signal(statep, stpptr);
- mutex_enter(&chptr->ch_lock);
-
- kmem_free(chpptr, sizeof (*chpptr));
- chptr->ch_private = NULL;
-
- /* wait until the very end to flush */
- ATRACE("am_close_audio() flushing messages", chptr);
- audio_sup_flush_audio_data(chptr);
-
- /* audio_sup_free_ch() requires the info ptr to be NULLed */
- chptr->ch_info.info = NULL;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audio() calling audio_free_ch()", chptr);
- if (audio_sup_free_ch(chptr) == AUDIO_FAILURE) {
- /* not much we can do if this fails */
- ATRACE("am_close_audio() audio_sup_free_ch() failed", chptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "close_audio() audio_sup_free_ch() error");
- }
-
- ATRACE("am_close_audio() successful", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_close_audio() */
-
-/*
- * am_close_audioctl()
- *
- * Description:
- * Close a minor device, returning the minor number to the pool so that
- * open(2) may use it again.
- *
- * NOTE: When ch_info.info is set and ref_cnt is changed statep->as_lock
- * is used and the taskq MUST be frozen. Otherwise a mode switch
- * will mess things up.
- *
- * Arguments:
- * queue_t *q Pointer to the read queue
- * int flag File status flag
- * cred_t *credp Pointer to the user's credential structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully closed the device
- * errno Error number for failed close()
- */
-/*ARGSUSED*/
-int
-am_close_audioctl(queue_t *q, int flag, cred_t *credp)
-{
- audio_info_t *info;
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
-
- ATRACE("in am_close_audioctl()", chptr);
- ATRACE_32("am_close_audioctl() channel number",
- chptr->ch_info.ch_number);
-
- ASSERT(q == chptr->ch_qptr);
-
- /* mark the channel as in the process of being closed */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags |= AM_CHNL_CLOSING;
- mutex_exit(&chptr->ch_lock);
-
- /* wait for queued tasks to clear */
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- /* we now need everything stable, so freeze the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- /* mark the channel as being closed */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags = 0;
-
- /*
- * Clear the pid field - keeps this channel from being used while the
- * contents are being freed.
- *
- * CAUTION: The taskq must be blocked before the PID is set to 0.
- * Otherwise switching modes can happen in the middle of closing,
- * which results in a bad reference count.
- */
- chptr->ch_info.pid = 0;
-
- /* make sure we aren't closing while someone is busy */
- while (chpptr->acp_busy_cnt) {
- ATRACE_32("am_close_audioctl() in putnext(), calling cv_wait()",
- chpptr->acp_flags);
-
- chpptr->acp_flags |= AM_CHNL_SIGNAL_NEEDED;
-
- /* wait for the count to go to 0 */
- cv_wait(&chptr->ch_cv, &chptr->ch_lock);
- ATRACE("am_close_audioctl() putnext() cv wakeup", chptr);
- }
-
- /*
- * Mark that qprocsoff() has been called, even though technically it
- * hasn't. However, it will eliminate the race condition between
- * releasing the lock and the qprocsoff() below.
- */
- chpptr->acp_flags |= AM_CHNL_QPROCSOFF;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audioctl() flushing q", chptr);
- flushq(RD(q), FLUSHALL);
-
- /* unschedule the queue */
- ATRACE("am_close_audioctl() qprocsoff()", chptr);
- qprocsoff(q);
-
- /*
- * Remove the private data from the q, AFTER turning the q off.
- * If this is done before qprocsoff() then any STREAMS call
- * between these two would find bad qptr data and panic.
- */
- audio_sup_free_qptr(q);
-
- /* we are modifying mixer global data, so lock the mixer */
- mutex_enter(&statep->as_lock);
- mutex_enter(&apm_infop->apm_lock);
-
- ASSERT(stpptr->am_channels > 0);
- ASSERT(stpptr->am_in_chs >= 0);
- ASSERT(stpptr->am_out_chs >= 0);
-
- stpptr->am_channels--;
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&statep->as_lock);
-
- info = chptr->ch_info.info;
-
- /*
- * Unlike AUDIO channels the reference count can never be 1. That's
- * because AUDIOCTL channels in COMPAT mode always increment the
- * count, as they do in MIXER mode when the process doesn't have an
- * AUDIO channel open as well. If in MIXER mode with an AUDIO channel
- * in the same process then the AUDIO channels reference count is
- * used, not the hardware.
- */
- mutex_enter(&statep->as_lock);
- info->ref_cnt--;
- ASSERT(info->ref_cnt);
- mutex_exit(&statep->as_lock);
-
- /* release the taskq AFTER we don't care about the mode */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
-#ifdef DEBUG
- mutex_enter(&chptr->ch_lock);
- ASSERT(chpptr->acp_play_samp_buf == NULL);
- ASSERT(chpptr->acp_ch_psrc1 == NULL);
- ASSERT(chpptr->acp_ch_psrc2 == NULL);
- ASSERT(chpptr->acp_ch_pconv1 == NULL);
- ASSERT(chpptr->acp_ch_pconv2 == NULL);
- ASSERT(chpptr->acp_ch_rsrc1 == NULL);
- ASSERT(chpptr->acp_ch_rsrc2 == NULL);
- ASSERT(chpptr->acp_ch_rconv1 == NULL);
- ASSERT(chpptr->acp_ch_rconv2 == NULL);
- ASSERT(chpptr->acp_rec_mp == NULL);
- mutex_exit(&chptr->ch_lock);
-#endif
-
- /* send the close signal */
- am_send_signal(statep, stpptr);
-
- mutex_enter(&chptr->ch_lock);
-
- kmem_free(chpptr, sizeof (*chpptr));
- chptr->ch_private = NULL;
-
- /* audio_sup_free_ch() requires the info ptr to be NULLed */
- chptr->ch_info.info = NULL;
-
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_close_audioctl() calling audio_free_ch()", chptr);
- if (audio_sup_free_ch(chptr) == AUDIO_FAILURE) {
- /* not much we can do if this fails */
- ATRACE("am_close_audioctl() audio_sup_free_ch() failed", chptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "close_audioctl() audio_sup_free_ch() error");
- }
-
- ATRACE("am_close_audioctl() successful", 0);
- return (AUDIO_SUCCESS);
-
-} /* am_close_audioctl() */
-
-/*
- * am_restore_state()
- *
- * Description:
- * Restore the device's hardware state and restart playing and recording.
- * If am_save_state() was called then we have the taskq frozen. Otherwise
- * it isn't and we have to freeze it. That way hot unplug and hot plug
- * events won't mess with open(), close(), or ioctl().
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Ptr to the APM's state info
- * int dir Direction to restore
- *
- * Returns:
- * AUDIO_SUCCESS State restored and restarted
- * AUDIO_FAILURE State not restored or restart failed
- */
-int
-am_restore_state(audio_state_t *statep, audio_apm_info_t *apm_infop, int dir)
-{
- am_ad_info_t *ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- audio_info_t *hw_info;
- audiohdl_t handle = AUDIO_STATE2HDL(statep);
- uint_t pgain; /* play gain to set h/w */
- uint_t pbalance; /* play balance to set h/w */
- uint_t rgain; /* record gain to set h/w */
- uint_t rbalance; /* record balance to set h/w */
- int doread; /* device supports record */
- int dowrite; /* device supports play */
- int psr;
- int rsr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("in am_restore_state()", statep);
-
- ad_infop = apm_infop->apm_ad_infop;
- stpptr = apm_infop->apm_private;
- hw_info = &stpptr->am_hw_info;
-
- psr = hw_info->play.sample_rate;
- pgain = hw_info->play.gain;
- pbalance = hw_info->play.balance;
- rsr = hw_info->record.sample_rate;
- rgain = hw_info->record.gain;
- rbalance = hw_info->record.balance;
-
- /* figure out the direction, am_attach() already did the sanity ck */
- dowrite =
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_PLAY) &&
- (dir & AUDIO_PLAY);
- doread =
- (ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_RECORD) &&
- (dir & AUDIO_RECORD);
- if (!doread && !dowrite) {
- ATRACE("am_restore_state() nothing to do", dir);
- mutex_enter(&stpptr->am_ad_lock);
- stpptr->am_ad_in &= ~AM_APM_FREEZE;
- mutex_exit(&stpptr->am_ad_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* freeze the taskq */
- audio_sup_taskq_suspend(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- /*
- * Set state saved in preparation for restore. We set this because it
- * is possible that am_save_state() was not called first, so this
- * simulates this call. Don't both with a check if it is set, this
- * wastes more time than just setting.
- */
- stpptr->am_ad_in |= AM_APM_FREEZE;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ASSERT(doread || dowrite);
-
- ATRACE("am_restore_state() dowrite", dowrite);
- ATRACE("am_restore_state() doread", doread);
-
- /*
- * CAUTION: Keep the calls the same as in am_attach(). There may be
- * order dependencies and once the audio driver works we don't
- * want to break it if we change the order.
- *
- * Set the play format and gain, if present.
- */
- if (dowrite) {
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_PLAY, psr, stpptr->am_hw_pchs, stpptr->am_hw_pprec,
- stpptr->am_hw_penc, AM_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN, "am_restore_state() "
- "couldn't set play data format: %d %d %d %d",
- hw_info->play.sample_rate, stpptr->am_hw_pchs,
- stpptr->am_hw_pprec, stpptr->am_hw_penc);
-
- goto error;
- }
-
- if (am_set_gain(statep, apm_infop, stpptr->am_hw_pchs,
- pgain, pbalance, AUDIO_PLAY, AM_SET_CONFIG_BOARD,
- AM_FORCE, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set play gain");
-
- goto error;
- }
- }
-
- /* set the record format and gain, if present */
- if (doread) {
- if (am_set_format(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AUDIO_RECORD, rsr, stpptr->am_hw_rchs, stpptr->am_hw_rprec,
- stpptr->am_hw_renc, AM_FORCE, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() "
- "couldn't set record data format: %d %d %d %d",
- hw_info->record.sample_rate, stpptr->am_hw_rchs,
- stpptr->am_hw_rprec, stpptr->am_hw_renc);
-
- goto error;
- }
-
- /* set the gains */
- if (am_set_gain(statep, apm_infop, stpptr->am_hw_rchs,
- rgain, rbalance, AUDIO_RECORD, AM_SET_CONFIG_BOARD,
- AM_FORCE, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set record gain");
-
- goto error;
- }
- }
-
- /* now set the ports, monitor gain, etc. */
- if (dowrite) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_PLAY,
- hw_info->play.port, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set play port: 0x%x",
- ad_infop->ad_defaults->play.port);
-
- goto error;
- }
- }
-
- if (doread) {
- if (am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_SET_PORT, AUDIO_RECORD,
- hw_info->record.port, NULL, AM_NO_SERIALIZE) ==
- AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set record port: 0x%x",
- ad_infop->ad_defaults->record.port);
-
- goto error;
- }
- }
-
- if ((ad_infop->ad_defaults->hw_features & AUDIO_HWFEATURE_IN2OUT) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_SET_MONITOR_GAIN, AUDIO_BOTH, hw_info->monitor_gain, NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set monitor gain: 0x%x",
- ad_infop->ad_defaults->monitor_gain);
-
- goto error;
- }
-
- if (dowrite && am_ad_set_config(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_OUTPUT_MUTE, AUDIO_PLAY,
- hw_info->output_muted, NULL, AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set output muted: 0x%x",
- ad_infop->ad_defaults->output_muted);
-
- goto error;
- }
-
- if (doread && (ad_infop->ad_assist_flags & AM_ASSIST_MIC) &&
- am_ad_set_config(statep, stpptr, ad_infop, AM_SET_CONFIG_BOARD,
- AM_MIC_BOOST, AUDIO_RECORD,
- (ad_infop->ad_add_mode & AM_ADD_MODE_MIC_BOOST), NULL,
- AM_NO_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(handle, CE_WARN,
- "am_restore_state() couldn't set mic boost: 0x%x",
- ad_infop->ad_add_mode);
-
- goto error;
- }
-
- /*
- * Restart play and record, if there are any apps that have the
- * device open for the direction. If not then we don't waste time
- * restarting.
- *
- * It is legal for a play restart calls to fail. This can happen
- * when there's no audio to play. If it does fail due to no audio
- * then we are already stopped and the active flags should be cleared.
- * If play is restarted then the active flags should be set. We don't
- * check because there is a race condition and with this routine
- * and am_wsvc(). The flags will get set correctly very quickly, so
- * there's no reason to try to work around this race, which would not
- * be easy.
- *
- * The same is not true for record. If we start record for no recording
- * apps then the mixer will turn off the record later after the 1st
- * interrupt.
- */
- if (ad_infop->ad_codec_type == AM_MS_CODEC) {
- audio_ch_t *chptr;
- am_ch_private_t *chpptr;
- int i;
- int max_chs = statep->as_max_chs;
- int restore_dir = 0;
-
- restore_dir = doread | dowrite;
- ATRACE_32("am_restore_state() restore_dir", restore_dir);
-
- ATRACE("am_restore_state() restarting MS", 0);
- for (i = 0, chptr = &statep->as_channels[0]; i < max_chs;
- i++, chptr++, restore_dir = 0) {
-
- /* lock the channel before we check it out */
- mutex_enter(&chptr->ch_lock);
-
- /* skip non-AUDIO and unallocated channels */
- if (!(chptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- chptr->ch_info.dev_type != AUDIO ||
- chptr->ch_info.pid == 0) {
- mutex_exit(&chptr->ch_lock);
- continue;
- }
-
- /* make sure this channel is writing */
- chpptr = chptr->ch_private;
-
- /*
- * Figure which to restart for this channel. We do it
- * this way so we can free the mutex fore calling the
- * device's start routines.
- */
- if (dowrite && chpptr->acp_writing) {
- restore_dir |= AUDIO_PLAY;
- }
- if (doread && chpptr->acp_reading) {
- restore_dir |= AUDIO_RECORD;
- }
-
- mutex_exit(&chptr->ch_lock);
-
- if (restore_dir & AUDIO_PLAY) {
- ATRACE("am_restore_state() MS restart play",
- chptr);
- /*
- * Don't set active flags because they
- * should already be set.
- */
- (void) am_ad_start_play(statep, stpptr,
- ad_infop, i, AM_NO_SERIALIZE);
- }
-
- if (restore_dir & AUDIO_RECORD) {
- ATRACE("am_restore_state() MS restart record",
- chptr);
- /*
- * Don't set active flags because they
- * should already be set.
- */
- (void) am_ad_start_record(statep, stpptr,
- ad_infop, i, AM_NO_SERIALIZE);
- }
- }
- } else {
- mutex_enter(&statep->as_lock);
- if (dowrite) {
- /* do restart */
- mutex_exit(&statep->as_lock);
- ATRACE_32("am_restore_state() restarting play TRAD",
- stpptr->am_out_chs);
-
- /*
- * We don't bother with the individual channel or
- * hardware active flags because they should already
- * be set.
- */
- (void) am_ad_start_play(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_NO_SERIALIZE);
- mutex_enter(&statep->as_lock);
- }
-
- if (doread) {
- /* do restart */
- mutex_exit(&statep->as_lock);
- ATRACE_32("am_restore_state() restarting record TRAD",
- stpptr->am_in_chs);
-
- /*
- * We don't bother with the individual channel or
- * hardware active flags because they should already
- * be set.
- */
- (void) am_ad_start_record(statep, stpptr, ad_infop,
- AM_SET_CONFIG_BOARD, AM_NO_SERIALIZE);
- } else {
- mutex_exit(&statep->as_lock);
- }
- }
-
- ATRACE("am_restore_state() done - success", statep);
-
- rc = AUDIO_SUCCESS;
-
-error:
- /* restore error, thaw that taskq and free flags */
- audio_sup_taskq_resume(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- stpptr->am_ad_in &= ~AM_APM_FREEZE;
-
- /* wake up a blocked driver access, just in case */
- cv_signal(&stpptr->am_ad_cv);
-
- mutex_exit(&stpptr->am_ad_lock);
-
- ATRACE_32("am_restore_state() returning", rc);
-
- return (rc);
-
-} /* am_restore_state() */
-
-/*
- * am_save_state()
- *
- * Description:
- * Flag that we are frozen. This stops calls into the audio driver,
- * except for ioctl()s.
- *
- * We don't care about which direction. Both act the same.
- *
- * There is a very tiny window of opportunity between taskq_wait()
- * and the mutex_enter() where in theory we could get another task added
- * to the queue, would execute, and potentially cause problems.
- *
- * Arguments:
- * audio_state_t *statep Ptr to the dev instance's state
- * audio_apm_info_t *apm_infop Ptr to the APM's state info
- * int dir Direction to save
- *
- * Returns:
- * AUDIO_SUCCESS State restored and restarted
- * AUDIO_FAILURE State not restored or restart failed
- */
-/*ARGSUSED*/
-int
-am_save_state(audio_state_t *statep, audio_apm_info_t *apm_infop, int dir)
-{
- am_apm_private_t *stpptr = apm_infop->apm_private;
-
- ATRACE("in am_save_state()", statep);
-
- audio_sup_taskq_wait(stpptr->am_taskq);
-
- mutex_enter(&stpptr->am_ad_lock);
-
- /* flag that we're frozen */
- stpptr->am_ad_in |= AM_APM_FREEZE;
-
- mutex_exit(&stpptr->am_ad_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_save_state() */
-
-/*
- * The private main routines for this file.
- */
-
-/*
- * am_rput()
- *
- * Description:
- * We have this here just for symmetry. There aren't any modules/drivers
- * below this, so this should never be called. But just in case, we
- * return.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-/*ARGSUSED*/
-static int
-am_rput(queue_t *q, mblk_t *mp)
-{
- ATRACE("in am_rput()", q);
-
- ATRACE("am_rput() returning 0", q);
-
- freemsg(mp);
-
- return (0);
-
-} /* am_rput() */
-
-/*
- * am_rsvc()
- *
- * Description:
- * We have this here just for symmetry. There aren't any modules/drivers
- * below this, so this should never be called. But just in case, we
- * return
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-/*ARGSUSED*/
-static int
-am_rsvc(queue_t *q)
-{
- mblk_t *mp;
-
- ATRACE("in am_rsvc()", q);
-
- /* we always have to drain the queue */
- while ((mp = getq(q)) != NULL) {
- freemsg(mp);
- }
-
- ATRACE("am_rsvc() returning 0", q);
-
- return (0);
-
-} /* am_rsvc() */
-
-/*
- * am_wput()
- *
- * Description:
- * All messages to the mixer arrive here. We don't support very many
- * messages.
- * M_DATA Passed on to the write svc() routine
- * M_IOCTL Calls am_wioctl() for further processing
- * M_IOCDATA Calls am_wiocdata() for further processing
- * M_FLUSH Flushes the input and/or output queues
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * 0 Always returns 0
- */
-static int
-am_wput(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- int error = EIO;
-
- ATRACE("in am_wput()", q);
-
- ASSERT(chptr);
-
- /* figure out what kind of message we've got */
- ATRACE_32("am_wput() type", mp->b_datap->db_type);
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- ATRACE("am_wput() FLUSH", chptr);
-
- ASSERT(WR(q) == q);
-
- am_flush(q, mp);
- return (0);
-
- case M_IOCTL:
- ATRACE("am_wput() IOCTL", chptr);
- return (am_wioctl(q, mp, chptr));
-
- case M_IOCDATA:
- ATRACE("am_wput() IOCDATA", chptr);
- return (am_wiocdata(q, mp, chptr));
-
- case M_DATA:
- ATRACE("am_wput() DATA", chptr);
- /* make sure the write is on an AUDIO channel */
- mutex_enter(&chptr->ch_lock);
- if (chptr->ch_info.dev_type != AUDIO ||
- !((am_ch_private_t *)chptr->ch_private)->acp_writing) {
-
- /* NOT an AUDIO channel, we don't allow write */
- ATRACE_32("am_wput() not AUDIO",
- chptr->ch_info.dev_type);
- mutex_exit(&chptr->ch_lock);
- goto done;
- }
- mutex_exit(&chptr->ch_lock);
- ATRACE("am_wput() putting msg on q", mp);
-
- /*
- * First, concatenate the message. If in mixer mode
- * with a traditional Codec we do sample rate conversion
- * on the concatenated buffer before we save the data
- * for later use.
- */
- if (pullupmsg(mp, -1)) {
- ATRACE("am_wput() pullupmsg() successful", mp);
- (void) putq(q, mp); /* does qenable() */
- } else {
- ATRACE("am_wput() pullupmsg() failed", mp);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "wput() pullupmsg() failed, sound lost");
- freemsg(mp);
- }
- ATRACE_32("am_wput() putting msg on q done", 0);
-
- /* don't break because then we free a msg we've already freed */
- ATRACE_32("am_wput() returning", 0);
- return (0);
-
- default:
- ATRACE("am_wput() default", chptr);
- break;
- }
-
- /* if we get here there was some kind of error, so send an M_ERROR */
-done:
- ATRACE("am_wput() done:", chptr);
-
- if (error) {
- ATRACE_32("am_wput() error", error);
- mp->b_datap->db_type = M_ERROR;
- mp->b_rptr = mp->b_datap->db_base;
- *(int *)mp->b_rptr = EIO;
- mp->b_wptr = mp->b_rptr + sizeof (int *);
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
- qreply(q, mp);
- } else {
- if (mp) {
- freemsg(mp);
- }
- }
-
- ATRACE("am_wput() returning", chptr);
-
- return (0);
-
-} /* am_wput() */
-
-/*
- * am_wsvc()
- *
- * Description:
- * Write service routine. By definition, this service routine grabs
- * all messages from the queue before it returns.
- *
- * The only message that we ever get is an M_DATA message, which is
- * audio data. The audio data is converted to the canonical data format.
- * If we need to sample rate convert then the data is converted.
- *
- * We also make sure the play DMA engine is running.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- *
- * Returns:
- * 0 Always returns 0
- */
-static int
-am_wsvc(queue_t *q)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_state_t *statep = chptr->ch_statep;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = &stpptr->am_hw_info;
- audio_info_t *tinfo;
- mblk_t *mp;
- int EOF_count;
- int *orig_data;
- int *proc_data;
- size_t size;
- size_t orig_size;
- size_t proc_size;
-
- ATRACE("in am_wsvc()", q);
- ATRACE("am_wsvc() chptr", chptr);
- ASSERT(RD(q) == chptr->ch_qptr);
- ASSERT(!MUTEX_HELD(&chptr->ch_lock));
-
- /* we always have to drain the queue */
- while ((mp = getq(q)) != NULL) {
- /* this is an AUDIO channel */
- ATRACE("am_wsvc() processing data", mp);
-
- /*
- * If this is an EOF marker, 0 size write(), we place an
- * empty audio data structure on the data list.
- */
- size = mp->b_wptr - mp->b_rptr;
- if (size == 0) {
- ATRACE("am_wsvc() EOF message, putting on list", mp);
- if (audio_sup_save_audio_data(chptr, NULL, 0, NULL,
- 0) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_wsvc() EOF marker lost");
- }
- freemsg(mp);
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
-
- /* not an EOF message, so process it */
- ATRACE("am_wsvc() calling am_p_process()", size);
-
- /* don't let mode switch happen while we sample rate convert */
- mutex_enter(&chptr->ch_lock);
- mutex_enter(&stpptr->am_mode_lock);
-
- /* if we are switching modes then return */
- mutex_enter(&apm_infop->apm_lock);
- if (stpptr->am_flags & AM_PRIV_SW_MODES) {
- ATRACE_32("am_wsvc() switching modes",
- stpptr->am_flags);
-
- /* put the message back on the queue */
- (void) putbq(q, mp);
-
- /* make sure the queue is off */
- noenable(WR(q));
-
- /* for AUDIO_DRAIN */
- chpptr->acp_flags |= AM_CHNL_MSG_ON_QUEUE;
-
- mutex_exit(&apm_infop->apm_lock);
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- return (0);
- }
- mutex_exit(&apm_infop->apm_lock);
-
- if (am_p_process(chptr, mp->b_rptr, size, &orig_data,
- &orig_size, &proc_data, &proc_size) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_wsvc() am_p_process() failed", chptr);
-
- freemsg(mp);
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
- mutex_exit(&stpptr->am_mode_lock);
- mutex_exit(&chptr->ch_lock);
-
- freemsg(mp);
-
- /* save the audio data */
- if (audio_sup_save_audio_data(chptr, orig_data, orig_size,
- proc_data, proc_size) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "am_wsvc() data save failed, audio lost");
-#ifdef FLOW_CONTROL
- goto flow;
-#else
- continue;
-#endif
- }
-
- /*
- * Mark the channel as busy and not empty, but only if we
- * actually processed the message. If that failed then we
- * give up on this message and try again on the next one.
- */
- mutex_enter(&chptr->ch_lock);
- chpptr->acp_flags &= ~(AM_CHNL_EMPTY|AM_CHNL_ALMOST_EMPTY1|\
- AM_CHNL_ALMOST_EMPTY2);
- mutex_exit(&chptr->ch_lock);
-
-#ifdef FLOW_CONTROL
-flow:
- /* do we need to do flow control? */
- mutex_enter(&chptr->ch_lock);
- if (!(chpptr->acp_flags & AM_CHNL_PFLOW) &&
- (audio_sup_get_audio_data_size(chptr) >
- AM_MAX_QUEUED_MSGS_SIZE ||
- audio_sup_get_audio_data_cnt(chptr) >
- AM_MAX_QUEUED_MSGS_CNT)) {
- /* yes, do flow control */
- chpptr->acp_flags |= AM_CHNL_PFLOW;
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_wsvc() flow control enabled, q off", q);
-
- noenable(q); /* keep putq() from enabling */
-
- break;
- }
- mutex_exit(&chptr->ch_lock);
-#endif
- }
-
- /*
- * If !paused make sure the play engine is on.
- *
- * It is possible during a mode switch that the channel info
- * structure can change on us. So we use the channel lock to
- * make sure it remains stable.
- */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
-
- /* for AUDIO_DRAIN */
- chpptr->acp_flags &= ~AM_CHNL_MSG_ON_QUEUE;
- ATRACE("am_wsvc() starting play eng", statep);
- if (!tinfo->play.pause) {
- /*
- * Set the active bits before starting play so a switch mode
- * will sleep on the CV.
- */
- tinfo = chptr->ch_info.info;
- tinfo->play.active = 1;
- hw_info->play.active = 1;
- tinfo->play.pause = 0;
- mutex_exit(&chptr->ch_lock);
- if (am_ad_start_play(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number, AM_SERIALIZE) == AUDIO_FAILURE) {
- /* we don't change pause if failed to start */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
- tinfo->play.active = 0;
- hw_info->play.active = 0;
-
- /*
- * If we turn off the hardware then make sure any
- * queued up EOF messages go out. This is done in
- * am_get_samples(). Hopefully most of the EOFs will
- * be caught there. However, especially when in mixer
- * mode, it can be difficult to catch them all when
- * only EOFs are being written. Doing it again here
- * costs very little and we know nothing is lost.
- */
- EOF_count = 0;
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count +=
- chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
- AUDIO_TOGGLE(chpptr->acp_EOF_toggle);
- if (chpptr->acp_EOF[chpptr->acp_EOF_toggle]) {
- EOF_count +=
- chpptr->acp_EOF[chpptr->acp_EOF_toggle];
- chpptr->acp_EOF[chpptr->acp_EOF_toggle] = 0;
- }
- mutex_exit(&chptr->ch_lock);
-
- for (; EOF_count; EOF_count--) {
- tinfo->play.eof++;
- am_send_signal(chptr->ch_statep, stpptr);
- }
-
- /*
- * It is possible that we tried to start playing
- * while in the middle of the audio driver calling
- * am_play_shutdown(). Thus the start would reload
- * the transfer engine but it would be shut down by
- * the ISR after am_play_shutdown() returns. The
- * appropriate flags in the audio driver will keep
- * the transfer engine from being shut back down.
- * However, if a mode switch happens after
- * am_play_shutdown() checks the mode switch flag
- * then when the ISR calls am_get_audio() the switch
- * mode flag will be set and no audio will ever be
- * transferred. Thus playing will be deadlocked with
- * the mode switch.
- *
- * The easiest way to expose this is to run showmetv
- * with 1894.mov and do insane mode switching. The
- * switch modes CV will never wake up, so we go ahead
- * and wake it up. The switch mode code will deal
- * with a bogus cv_signal().
- */
- mutex_enter(&stpptr->am_mode_lock);
- cv_signal(&stpptr->am_mode_cv);
- mutex_exit(&stpptr->am_mode_lock);
- }
- } else {
- mutex_exit(&chptr->ch_lock);
- }
- ATRACE("am_wsvc() start play eng ret", statep);
-
- ATRACE("am_wsvc() returning", chptr);
-
- return (0);
-
-} /* am_wsvc() */
-
-/*
- * am_apply_gain_balance()
- *
- * Description:
- * Apply gain and balance to the canonical audio data buffer.
- *
- * Arguments:
- * int *buf Pointer to the canonical audio data
- * int samples Number of samples
- * int channels MONO or STEREO
- * int gain Gain, 0 - 255
- * int balance Balance, 0 - 64
- *
- * Returns:
- * void
- */
-void
-am_apply_gain_balance(int *buf, int samples, int channels, int gain,
- int balance)
-{
- int l_gain;
- int r_gain;
-
- ATRACE("in am_apply_gain_balance()", buf);
- ATRACE_32("am_apply_gain_balance() samples", samples);
- ATRACE_32("am_apply_gain_balance() channels", channels);
- ATRACE_32("am_apply_gain_balance() gain", gain);
- ATRACE_32("am_apply_gain_balance() balance", balance);
-
- if (channels == AUDIO_CHANNELS_MONO) {
- l_gain = gain;
- for (; samples; buf++, samples--) {
- *buf = (*buf * l_gain) >> AM_MAX_GAIN_SHIFT;
- }
- } else {
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT((samples % 1) == 0);
-
- l_gain = r_gain = gain;
-
- if (balance < AUDIO_MID_BALANCE) {
- /* leave l gain alone and scale down r gain */
- r_gain = (r_gain * balance) >> AM_TIMES_32_SHIFT;
- } else if (balance > AUDIO_MID_BALANCE) {
- /* leave r gain alone and scale down l gain */
- l_gain = (l_gain * (64 - balance)) >> AM_TIMES_32_SHIFT;
- }
-
- for (; samples; buf += 2, samples -= 2) {
- buf[0] = (buf[0] * l_gain) >> AM_MAX_GAIN_SHIFT;
- buf[1] = (buf[1] * r_gain) >> AM_MAX_GAIN_SHIFT;
- }
- }
-
- ATRACE("am_apply_gain_balance() done", buf);
-
-} /* am_apply_gain_balance() */
-
-/*
- * am_convert_int_mono_stereo()
- *
- * Description:
- * Convert a buffer between mono and stereo. Both the source and
- * destination buffers are 32-bit integers. The number of samples
- * is updated to match the new number of samples.
- *
- * CAUTION: The calling routine must ensure that the dest is large
- * enough for the data, or we'll panic.
- *
- * Arguments:
- * int *src Input data buffer
- * int *dest Output data buffer
- * int *samples Ptr to he number of samples to convert
- * int src_chs Input channels
- * int dest_chs Output channels
- *
- * Returns:
- * void
- */
-void
-am_convert_int_mono_stereo(int *src, int *dest, int *samples, int src_chs,
- int dest_chs)
-{
- size_t size;
- int i;
- int val;
-
- ATRACE("in am_convert_int_mono_stereo()", src);
-
- if (src_chs == dest_chs) {
- /*
- * The same size so no translation needed, just copy.
- * size = samples * sizeof (int)
- */
- size = *samples << AM_TIMES_4_SHIFT;
- bcopy(src, dest, size);
-
- } else if (src_chs > dest_chs) {
- /* convert from stereo to mono */
- *samples >>= AM_TIMES_2_SHIFT;
- for (i = *samples; i--; ) {
- /* average the left and right channels */
- val = *src++;
- val += *src++;
- *dest++ = val >> AM_HALF_ENERGY_SHIFT;
- }
- } else {
- ASSERT(src_chs < dest_chs);
- /* convert from mono to stereo */
- for (i = *samples; i--; ) {
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
- *samples <<= AM_TIMES_2_SHIFT;
- }
-
- ATRACE("am_convert_int_mono_stereo() done", dest);
-
-} /* am_convert_int_mono_stereo() */
-
-/*
- * am_convert_to_int()
- *
- * Description:
- * Convert a buffer of various precisions and encodings into 16-bit
- * linear PCM stored in a 32-bit int. If the input is unsigned PCM
- * we convert it to signed PCM while converting it.
- *
- * CAUTION: The calling routine must ensure that the outbuf is large
- * enough for the data, or we'll panic.
- *
- * Arguments:
- * void *inbuf Input data buffer
- * int *outbuf Output data buffer
- * int samples The number of samples to convert
- * int precision The precision of the input buffer.
- * int encoding The encoding of the input buffer.
- * int flags Flags, including AM_PRIV_8/16_TRANS
- *
- * Returns:
- * void
- */
-void
-am_convert_to_int(void *inbuf, int *outbuf, int samples, int precision,
- int encoding, int flags)
-{
- int i;
-
- ATRACE("in am_convert_to_int()", inbuf);
-
- if (precision == AUDIO_PRECISION_16) { /* do the easy case first */
- int16_t *src = (int16_t *)inbuf;
-
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
-
- ATRACE_32("am_convert_to_int() 16-Bit", samples);
-
- if (flags & AM_PRIV_16_TRANS) {
- for (i = samples; i--; ) {
- *outbuf++ = (int)*src++ + INT16_MIN;
- }
- } else {
- for (i = samples; i--; ) {
- *outbuf++ = (int)*src++;
- }
- }
- } else { /* now the hard case, 8-bit */
- int16_t *aptr;
- int8_t *src = (int8_t *)inbuf;
-
- ASSERT(precision == AUDIO_PRECISION_8);
-
- if (encoding == AUDIO_ENCODING_ULAW) {
- aptr = _8ulaw2linear16;
- ATRACE("am_convert_to_int() 8-bit u-law", aptr);
-
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- /* the conv. array does the scaling */
- *outbuf++ = (int)aptr[(unsigned char)*src++];
- }
- } else if (encoding == AUDIO_ENCODING_ALAW) {
- aptr = _8alaw2linear16;
- ATRACE("am_convert_to_int() 8-bit A-law", aptr);
-
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- /* the conv. array does the scaling */
- *outbuf++ = (int)aptr[(unsigned char)*src++];
- }
- } else if (encoding == AUDIO_ENCODING_LINEAR8 ||
- (flags & AM_PRIV_8_TRANS)) {
- /*
- * Copy the data into the buffer with a shift to
- * make signed.
- */
- for (i = samples; i--; ) {
- *outbuf++ = (((int)*src++ & AM_CHAR2INT_MASK) -
- INT8_MAX) << AM_256_SHIFT;
- }
- } else {
- ASSERT(encoding == AUDIO_ENCODING_LINEAR);
- /*
- * Copy the data into the buf. acp_ch_pptr1,
- * char -> int.
- */
- for (i = samples; i--; ) {
- *outbuf++ = (int)(*src++) << AM_256_SHIFT;
- }
- }
- }
-
- ATRACE("am_convert_to_int() done", outbuf);
-
-} /* am_convert_to_int() */
-
-/*
- * am_reprocess()
- *
- * Description:
- * Process the original data, which am_p_process() created, into sample
- * rate converted audio.
- *
- * Unlike am_p_process() we don't have the opportunity to minimize the
- * sample rate conversion processing because we can't take advantage of
- * converting between mono and stereo.
- *
- * It is possible we need to convert original audio that has been
- * partially played. So see if we may need to fix the processed
- * data pointers.
- *
- * CAUTION: This routine can be called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * CAUTION: It is not possible to update the sample rate converter in
- * this routine because it may be called when switching modes
- * and thus the configuration information may be in transition
- * and not accurate. Thus the calling routines must ensure the
- * the converter is ready.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * audio_data_t *data Original and new processed data struct
- *
- * Returns:
- * AUDIO_SUCCESS Data converted and saved
- * AUDIO_FAILURE Data conversion and save failed, audio lost
- */
-int
-am_reprocess(audio_ch_t *chptr, audio_data_t *data)
-{
- audio_state_t *statep = chptr->ch_statep;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *psrs = ad_infop->ad_play.ad_conv;
- int *tmp;
- int tmp_size;
- uint_t hw_channels = stpptr->am_hw_pchs;
- int mode = stpptr->am_pstate->apm_mode;
- int orig_samples;
- int src_samples;
- int *data_start;
- int *conv;
- size_t orig_size_plus_pb;
- size_t orig_size;
-
- ATRACE("in am_reprocess()", data);
-
- /* don't let mode switch happen while we sample rate convert */
- mutex_enter(&stpptr->am_mode_lock);
-
- /* make sure we need to process the data */
- if (mode != AM_MIXER_MODE || ad_infop->ad_codec_type != AM_TRAD_CODEC) {
- /* we don't SRC this data */
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() don't SRC", mode);
- return (AUDIO_FAILURE);
- }
-
- /* figure out the number of samples */
- orig_samples = data->adata_osize >> AM_TIMES_4_SHIFT;
- orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = orig_size + chpptr->acp_ch_pbuf_size;
- ATRACE_32("am_reprocess() BUF orig_samples", orig_samples);
-
- /*
- * Make sure we've got good sample rate converter buffers. If we fail
- * the calling routine will throw away the audio. There aren't more
- * chances to process the audio.
- */
- if (am_update_src_buffer(chptr, orig_samples, hw_channels,
- AUDIO_PLAY) == AUDIO_SUCCESS) {
- ATRACE("am_reprocess() update_src_buffer() okay", 0);
- src_samples = orig_samples;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() calling update_src_buffer() failed",
- mode);
- return (AUDIO_FAILURE);
- }
- ATRACE_32("am_reprocess() src_samples", src_samples);
-
- /* Only do extra work if necessary */
- if (chpptr->acp_ch_pbuf_size > 0) {
-
- /* Make sure we have good conversion buffers */
- if (am_update_conv_buffer(chptr, orig_size_plus_pb,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- mutex_exit(&stpptr->am_mode_lock);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(1) couldn't allocate memory, "
- "audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* Set conv pointing to pconv2 */
- conv = chpptr->acp_ch_pconv2;
-
- /* Set data_start pointing to where incoming data begins */
- data_start = conv + (chpptr->acp_ch_pbuf_size >>
- AM_TIMES_4_SHIFT);
-
- /* We have to copy orig data to data_start */
- bcopy(data->adata_orig, data_start, orig_size);
- } else {
- /* Set conv pointing to orig data */
- conv = data->adata_orig;
- }
-
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr), hw_channels,
- AUDIO_PLAY, conv, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >> AM_TIMES_4_SHIFT));
-
- /* if successful then copy to proc */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- data->adata_proc = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (data->adata_proc) {
- bcopy(tmp, data->adata_proc, tmp_size);
- data->adata_psize = tmp_size;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() couldn't allocate new buffer",
- 0);
- return (AUDIO_FAILURE);
- }
- data->adata_psize = tmp_size;
- data->adata_peptr = (char *)data->adata_proc + tmp_size;
- } else {
- mutex_exit(&stpptr->am_mode_lock);
- ATRACE_32("am_reprocess() SRC failed", 0);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("am_reprocess() orig", data->adata_orig);
- ATRACE("am_reprocess() optr", data->adata_optr);
- ATRACE("am_reprocess() oeptr", data->adata_oeptr);
- ATRACE_32("am_reprocess() osize", data->adata_osize);
-
- /* see if we need to fix the processed data pointers */
- if (data->adata_optr != data->adata_orig) {
- long tmp;
-
- /*
- * Make a guess as to where to point to. We make sure we are
- * on a 4 byte boundary. That way we don't have to worry
- * about being in the middle of a sample.
- *
- * The equation:
- * (offset of orig data from start)*(length of proc data)
- * --------------------------------------------------------
- * (length of orig data)
- */
- tmp = ((char *)data->adata_optr - (char *)data->adata_orig) *
- data->adata_psize / data->adata_osize;
-
- /*
- * tmp is an offset, which must be added to adata_proc to
- * get adata_pptr. We mask off adata_pptr so that regardless
- * of the format of the data we always are on a sample frame
- * boundary.
- */
- data->adata_pptr = (char *)data->adata_proc +
- (tmp & ~AM_MISC_MASK);
- } else {
- /* on a boundary, so the pointers are easy */
- data->adata_pptr = data->adata_proc;
- }
-
- ATRACE("am_reprocess() proc", data->adata_proc);
- ATRACE("am_reprocess() pptr", data->adata_pptr);
- ATRACE("am_reprocess() peptr", data->adata_peptr);
- ATRACE_32("am_reprocess() psize", data->adata_psize);
-
- /* we don't need to block mode switching now */
- mutex_exit(&stpptr->am_mode_lock);
-
- return (AUDIO_SUCCESS);
-
-} /* am_reprocess() */
-
-/*
- * am_send_signal()
- *
- * Description:
- * This routine is used to send signals back to user land processes.
- *
- * We always create a prototype signal message, but we use dupb() to
- * actually send up the queue.
- *
- * NOTE: We don't lock the tchptr because the state is frozen thus
- * channels can't be allocated or freed. However they can
- * have their state updated. The worst that can happen is
- * we miss a channel to send a signal on, which isn't that
- * bad. And this is only when open()ing or close()ing. Since
- * those operations send a signal we're covered.
- *
- * NOTE: This routine must be called with as_lock held.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * am_apm_private_t *stpptr Pointer to APM private data
- *
- * Returns:
- * void
- */
-void
-am_send_signal(audio_state_t *statep, am_apm_private_t *stpptr)
-{
- audio_ch_t *tchptr;
- mblk_t *mp = stpptr->am_sig_mp;
- mblk_t *dup_mp;
- int i;
- int max_chs;
-
- ATRACE("in am_send_signal()", statep);
-
- ASSERT(!MUTEX_HELD(&statep->as_lock));
-
- /* get the number of chs for this instance */
- max_chs = statep->as_max_chs;
-
- ATRACE("am_send_signal() AM_SIGNAL_ALL_CTL", mp);
-
- /* look for AUDIOCTL channels */
- for (i = 0, tchptr = &statep->as_channels[0];
- i < max_chs; i++, tchptr++) {
- /* skip unallocated, non-AUDIOCTL and closing channels */
-
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIOCTL ||
- tchptr->ch_info.pid == 0 ||
- (((am_ch_private_t *)tchptr->ch_private)->acp_flags &
- AM_CHNL_CLOSING)) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE("am_send_signal() tchptr", tchptr);
- if ((dup_mp = dupb(mp)) == NULL) {
- ATRACE("am_send_signal() AUDIOCTL "
- "couldn't allocate duplicate message", tchptr);
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "signal() couldn't allocate duplicate "
- "message to send signal, signal lost");
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- ATRACE_32("am_send_signal() AM_SIGNAL_ALL_CTL putnext()",
- tchptr->ch_info.ch_number);
- ASSERT((((am_ch_private_t *)tchptr->ch_private)->acp_flags &
- AM_CHNL_CLOSING) == 0);
-
- am_safe_putnext(tchptr, dup_mp);
-
- ATRACE("am_send_signal() "
- "AM_SIGNAL_ALL_CTL putnext() done", dup_mp);
-
- mutex_exit(&tchptr->ch_lock);
- }
-
- ATRACE("am_send_signal() done", statep);
-
-} /* am_send_signal() */
-
-/*
- * am_update_conv_buffer()
- *
- * Description:
- * Make sure the conversion to 32-bit linear PCM buffers are large
- * enough. If not then the ones are allocated. Both buffers are always
- * set to the same size.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * size_t size The size we need
- * int dir AUDIO_PLAY or AUDIO_RECORD, not both
- *
- * Returns:
- * AUDIO_SUCCESS Buffers okay
- * AUDIO_FAILURE Buffer allocation failed
- */
-int
-am_update_conv_buffer(audio_ch_t *chptr, size_t size, int dir)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- void *tmp1;
- void *tmp2;
-
- ATRACE("in am_update_conv_buffer()", chptr);
- ATRACE("am_update_conv_buffer() size", size);
-
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- ASSERT(dir != AUDIO_BOTH);
-
- if (dir == AUDIO_PLAY) {
- if (chpptr->acp_ch_pconv_siz &&
- size <= chpptr->acp_ch_pconv_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_pconv1);
- ASSERT(chpptr->acp_ch_pconv2);
- return (AUDIO_SUCCESS);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- if (chpptr->acp_ch_rconv_siz &&
- size <= chpptr->acp_ch_rconv_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_rconv1);
- ASSERT(chpptr->acp_ch_rconv2);
- return (AUDIO_SUCCESS);
- }
- }
-
- if ((tmp1 = kmem_zalloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_conv_buffer() kmem_zalloc(1) failed", NULL);
- return (AUDIO_FAILURE);
- }
- if ((tmp2 = kmem_zalloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_conv_buffer() kmem_zalloc(2) failed", NULL);
- kmem_free(tmp1, size);
- return (AUDIO_FAILURE);
- }
- ATRACE("am_update_conv_buffer() new buffers", size);
-
- if (dir == AUDIO_PLAY) {
- ASSERT(size >= chpptr->acp_ch_pbuf_size);
- if (chpptr->acp_ch_pconv1) {
- bcopy(chpptr->acp_ch_pconv1, tmp1,
- chpptr->acp_ch_pbuf_size);
- kmem_free(chpptr->acp_ch_pconv1,
- chpptr->acp_ch_pconv_siz);
- }
- if (chpptr->acp_ch_pconv2) {
- bcopy(chpptr->acp_ch_pconv2, tmp2,
- chpptr->acp_ch_pbuf_size);
- kmem_free(chpptr->acp_ch_pconv2,
- chpptr->acp_ch_pconv_siz);
- }
- chpptr->acp_ch_pconv1 = tmp1;
- chpptr->acp_ch_pconv2 = tmp2;
- chpptr->acp_ch_pconv_siz = size;
- } else {
- ASSERT(size >= chpptr->acp_ch_rbuf_size);
- if (chpptr->acp_ch_rconv1) {
- bcopy(chpptr->acp_ch_rconv1, tmp1,
- chpptr->acp_ch_rbuf_size);
- kmem_free(chpptr->acp_ch_rconv1,
- chpptr->acp_ch_rconv_siz);
- }
- if (chpptr->acp_ch_rconv2) {
- bcopy(chpptr->acp_ch_rconv2, tmp2,
- chpptr->acp_ch_rbuf_size);
- kmem_free(chpptr->acp_ch_rconv2,
- chpptr->acp_ch_rconv_siz);
- }
- chpptr->acp_ch_rconv1 = tmp1;
- chpptr->acp_ch_rconv2 = tmp2;
- chpptr->acp_ch_rconv_siz = size;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_update_conv_buffer() */
-
-/*
- * am_update_src_buffer()
- *
- * Description:
- * Make sure the sample rate conversion buffers are large enough. If
- * not then the ones are allocated. Both buffers are always set to
- * the same size.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * int samples The number of samples to convert
- * uint_t hw_channels Number of hardware channels
- * int dir AUDIO_PLAY or AUDIO_RECORD, not both
- *
- * Returns:
- * AUDIO_SUCCESS Buffers okay
- * AUDIO_FAILURE Buffer allocation failed, buffers 0ed
- */
-int
-am_update_src_buffer(audio_ch_t *chptr, int samples, uint_t hw_channels,
- int dir)
-{
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *srs;
- audio_info_t *info = chptr->ch_info.info;
- size_t size;
- void *tmp1;
- void *tmp2;
-
- ATRACE("in am_update_src_buffer()", chptr);
- ATRACE_32("am_update_src_buffer() samples", samples);
-
- ASSERT(MUTEX_HELD(&stpptr->am_mode_lock));
- ASSERT(MUTEX_HELD(&chptr->ch_lock));
-
- ASSERT(dir != AUDIO_BOTH);
-
- if (dir == AUDIO_PLAY) {
- srs = ad_infop->ad_play.ad_conv;
- size = srs->ad_src_size(AM_SRC_CHPTR2HDL(chptr),
- &info->play, AUDIO_PLAY, samples, hw_channels);
- if (chpptr->acp_ch_psrc_siz &&
- size <= chpptr->acp_ch_psrc_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_psrc1);
- ASSERT(chpptr->acp_ch_psrc2);
- return (AUDIO_SUCCESS);
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
- srs = ad_infop->ad_record.ad_conv;
- size = srs->ad_src_size(AM_SRC_CHPTR2HDL(chptr),
- &info->record, AUDIO_RECORD, samples, hw_channels);
- if (chpptr->acp_ch_rsrc_siz &&
- size <= chpptr->acp_ch_rsrc_siz) {
- /* buffers large enough */
- ASSERT(chpptr->acp_ch_rsrc1);
- ASSERT(chpptr->acp_ch_rsrc2);
- return (AUDIO_SUCCESS);
- }
- }
-
- if ((tmp1 = kmem_alloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_src_buffer() kmem_alloc(1) failed", NULL);
- return (AUDIO_FAILURE);
- }
- if ((tmp2 = kmem_alloc(size, KM_NOSLEEP)) == NULL) {
- ATRACE("am_update_src_buffer() kmem_alloc(2) failed", NULL);
- kmem_free(tmp1, size);
- return (AUDIO_FAILURE);
- }
-
- if (dir == AUDIO_PLAY) {
- if (chpptr->acp_ch_psrc1) {
- kmem_free(chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc_siz);
- }
- if (chpptr->acp_ch_psrc2) {
- kmem_free(chpptr->acp_ch_psrc2,
- chpptr->acp_ch_psrc_siz);
- }
- chpptr->acp_ch_psrc1 = tmp1;
- chpptr->acp_ch_psrc2 = tmp2;
- chpptr->acp_ch_psrc_siz = size;
- } else {
- if (chpptr->acp_ch_rsrc1) {
- kmem_free(chpptr->acp_ch_rsrc1,
- chpptr->acp_ch_rsrc_siz);
- }
- if (chpptr->acp_ch_rsrc2) {
- kmem_free(chpptr->acp_ch_rsrc2,
- chpptr->acp_ch_rsrc_siz);
- }
- chpptr->acp_ch_rsrc1 = tmp1;
- chpptr->acp_ch_rsrc2 = tmp2;
- chpptr->acp_ch_rsrc_siz = size;
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_update_src_buffer() */
-
-/*
- * Private routines used only by this file.
- */
-
-/*
- * am_flush()
- *
- * Description:
- * Flush the data stream. We handle both play and record. In order
- * to flush we have to clear out any play buffers so we have to stop
- * and then restart. This applies to both play and record.
- *
- * Arguments:
- * queue_t *q Pointer to a queue
- * mblk_t *mp Ptr to the msg block being passed to the queue
- *
- * Returns:
- * void
- */
-static void
-am_flush(queue_t *q, mblk_t *mp)
-{
- audio_ch_t *chptr = (audio_ch_t *)
- audio_sup_get_qptr_data(q);
- audio_state_t *statep = chptr->ch_statep;
- audio_apm_info_t *apm_infop = chptr->ch_apm_infop;
- audio_info_t *hw_info = apm_infop->apm_ad_state;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_apm_private_t *stpptr = apm_infop->apm_private;
- am_ch_private_t *chpptr = chptr->ch_private;
- audio_info_t *tinfo;
- mblk_t *tmp;
-
- ATRACE("in am_flush()", q);
-
- ASSERT(chptr);
-
- /* are we flushing the play side? */
- if (*mp->b_rptr & FLUSHW) {
- ATRACE("am_flush() flushing play side", 0);
- flushq(q, FLUSHDATA);
- *mp->b_rptr &= ~FLUSHW;
-
- mutex_enter(&chptr->ch_lock);
-
- /* flush accumulated data */
- audio_sup_flush_audio_data(chptr);
-
- /*
- * Flush the DMA engine and Codec, but only if this
- * channel points to the hardware and is an AUDIO
- * channel.
- */
- tinfo = chptr->ch_info.info;
- chpptr->acp_flags |= AM_CHNL_EMPTY;
- if (chptr->ch_info.dev_type == AUDIO &&
- (chptr->ch_info.info == apm_infop->apm_ad_state ||
- ad_infop->ad_codec_type == AM_MS_CODEC)) {
- /* before we can flush the DMA engine we must stop it */
- mutex_exit(&chptr->ch_lock);
- am_ad_stop_play(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
- mutex_enter(&chptr->ch_lock);
-
- tinfo->play.active = 0;
- hw_info->play.active = 0;
- /* we don't change pause flag, it can be set */
- }
-
- /* update the played sample count */
- if (stpptr->am_pstate->apm_mode == AM_MIXER_MODE &&
- ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- tinfo->play.samples +=
- ad_infop->ad_play.ad_conv->ad_src_adjust(
- AM_SRC_CHPTR2HDL(chptr), AUDIO_PLAY,
- chpptr->acp_psamples_p);
- } else {
- tinfo->play.samples += chpptr->acp_psamples_p;
- }
- chpptr->acp_psamples_c = 0;
- chpptr->acp_psamples_f = 0;
- chpptr->acp_psamples_p = 0;
-
- /* by definition we are empty */
- am_audio_drained(chptr);
- mutex_exit(&chptr->ch_lock);
-
- ATRACE("am_flush() flushing play done", q);
- }
-
- /* now for the record side */
- if (*mp->b_rptr & FLUSHR) {
- ATRACE("am_flush() flushing record side", 0);
-
- /*
- * Flush the DMA engine and Codec, but only if this channel
- * points to the hardware and is an AUDIO channel.
- */
- if (chptr->ch_info.dev_type == AUDIO) {
- /*
- * We only flush AUDIO channels, there's nothing on
- * AUDIOCTL channels to flush.
- */
- mutex_enter(&chptr->ch_lock);
- tinfo = chptr->ch_info.info;
- if (tinfo->record.active &&
- (chptr->ch_info.info == apm_infop->apm_ad_state ||
- ad_infop->ad_codec_type == AM_MS_CODEC)) {
- /*
- * Before we can flush the DMA engine we
- * must stop it.
- */
- mutex_exit(&chptr->ch_lock);
-
- am_ad_stop_record(statep, stpptr, ad_infop,
- chptr->ch_info.ch_number);
-
- /*
- * Flush any partially captured data. This
- * needs to be done before we restart recording.
- */
- mutex_enter(&chptr->ch_lock);
- if (chpptr->acp_rec_mp) {
- tmp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
- mutex_exit(&chptr->ch_lock);
-
- freemsg(tmp);
- } else {
- mutex_exit(&chptr->ch_lock);
- }
-
- /* restart the record */
- if (am_ad_start_record(statep,
- apm_infop->apm_private, ad_infop,
- chptr->ch_info.ch_number,
- AM_SERIALIZE) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep),
- CE_WARN, "couldn't restart record "
- "after flush");
- tinfo->record.active = 0;
- hw_info->record.active = 0;
- }
- } else {
- /*
- * Not currently recording but we still
- * need to flush any partial buffers.
- */
- if (chpptr->acp_rec_mp) {
- tmp = chpptr->acp_rec_mp;
- chpptr->acp_rec_mp = NULL;
- mutex_exit(&chptr->ch_lock);
-
- freemsg(tmp);
- } else {
- mutex_exit(&chptr->ch_lock);
- }
- }
- }
-
- /* send the flush back up to the STREAMS head */
- *mp->b_rptr &= ~FLUSHW; /* clear the write */
- qreply(q, mp);
- mp = NULL; /* stop freemsg() */
-
- ATRACE("am_flush() flushing read done", q);
- }
-
- if (mp) {
- freemsg(mp);
- }
-
- ATRACE("am_flush() returning", q);
-
-} /* am_flush() */
-
-/*
- * am_p_process()
- *
- * Description:
- * Process the message block into canonical form. If in MIXER mode
- * then we also sample rate convert it to match the hardware. When
- * done the original data and the converted data, if present, are
- * saved in an audio_data_t structure. If sample rate conversion
- * fails we don't worry about it. There is a second chance when
- * the samples are mixed.
- *
- * CAUTION: This routine is called from interrupt context, so memory
- * allocation cannot sleep.
- *
- * Arguments:
- * audio_ch_t *chptr Pointer to this channel's state info
- * void *buf Ptr to the original msg block being
- * processed
- * size_t size The size of the data buffer in bytes
- * int **orig_data Ptr to the original canonical audio ptr
- * size_t *orig_size Ptr to the original audio size
- * int **proc_data Ptr to the processed canonical audio ptr
- * size_t *proc_size Ptr to the processed audio size
- *
- * Returns:
- * AUDIO_SUCCESS Data converted and saved
- * AUDIO_FAILURE Data conversion and save failed, audio lost
- */
-static int
-am_p_process(audio_ch_t *chptr, void *buf, size_t size, int **orig_data,
- size_t *orig_size, int **proc_data, size_t *proc_size)
-{
- audio_state_t *statep = chptr->ch_statep;
- audio_info_t *info;
- am_ch_private_t *chpptr = chptr->ch_private;
- am_apm_private_t *stpptr = chptr->ch_apm_infop->apm_private;
- am_ad_info_t *ad_infop = chptr->ch_apm_infop->apm_ad_infop;
- am_ad_src_entry_t *psrs = ad_infop->ad_play.ad_conv;
- int *dest;
- int *src;
- int *tmp;
- int tmp_size;
- uint_t channels;
- uint_t encoding;
- uint_t precision;
- uint_t hw_channels;
- int i;
- int mode;
- int orig_samples;
- int src_samples;
- int val;
- int *conv;
- int *data_start;
- size_t orig_size_plus_pb;
-
- ATRACE("in am_p_process()", buf);
- ATRACE("am_p_process() size", size);
-
- ASSERT(MUTEX_HELD(&stpptr->am_mode_lock));
-
- /* set after we are frozen */
- info = chptr->ch_info.info;
- channels = info->play.channels;
- encoding = info->play.encoding;
- precision = info->play.precision;
- hw_channels = stpptr->am_hw_pchs;
- mode = stpptr->am_pstate->apm_mode;
-
- /* figure out the number of samples */
- orig_samples = size / (precision >> AUDIO_PRECISION_SHIFT);
- *orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = *orig_size + chpptr->acp_ch_pbuf_size;
- ATRACE_32("am_p_process() BUF orig_size", *orig_size);
- ATRACE_32("am_p_process() BUF orig_samples", orig_samples);
-
- /*
- * It is possible that an odd sample write has happened. This can
- * happen when the system is very busy and partial STREAMS messages
- * are created. Or when an application just plain makes a mistake.
- * We chop off the partial sample and press on. This does mean it is
- * possible that the next buffer will be out of sync. If it was due to
- * the STREAMS message being chopped off then hopefully this just
- * finish off the messed up buffer and all will be back in sync. If it
- * was because the app is in error, then there's not much hope.
- *
- * This applies only for stereo, mono can be odd.
- */
- if (channels == AUDIO_CHANNELS_STEREO) {
- if ((orig_samples % AUDIO_CHANNELS_STEREO) != 0) {
- ATRACE("am_p_process() stereo samples chopped",
- orig_samples);
-
- /* fix */
- orig_samples = orig_samples -
- (orig_samples % AUDIO_CHANNELS_STEREO);
- *orig_size = orig_samples << AM_INT32_SHIFT;
- orig_size_plus_pb = *orig_size +
- chpptr->acp_ch_pbuf_size;
-
- ATRACE_32("am_p_process() new BUF orig_size",
- *orig_size);
- ATRACE_32("am_p_process() new BUF orig_samples",
- orig_samples);
- }
- ATRACE("am_p_process() stereo samples okay", orig_samples);
- }
-
- /*
- * If we are going to need to do sample rate conversion then make sure
- * we've got good buffers.
- */
- if (mode == AM_MIXER_MODE && ad_infop->ad_codec_type == AM_TRAD_CODEC) {
- /*
- * Make sure we've got good sample rate converter buffers.
- * However, even if we fail we still proceed. We get a second
- * chance later on to do the sample rate conversion.
- */
- if (am_update_src_buffer(chptr, orig_samples, hw_channels,
- AUDIO_PLAY) == AUDIO_SUCCESS) {
- ATRACE("am_p_process() update_src_buffer() okay", 0);
- src_samples = orig_samples;
- } else {
- /* mark the failure */
- ATRACE_32(
- "am_p_process() calling update_src_buffer() failed",
- mode);
- src_samples = 0;
- }
- } else {
- /* setting to 0 also means don't do src */
- src_samples = 0;
- }
- ATRACE_32("am_p_process() src_samples", src_samples);
-
- /*
- * We convert to 16-bit linear in a 32-bit integer only if buf != NULL.
- *
- * For converting to canonical format or sample rate conversion
- * we need several buffers. We use acp_ch_pconv* for conversion and
- * acp_ch_pptr* for sample rate conversion. There are two buffers
- * for each, which gives us the space to toggle. We need different
- * buffers because we could be converting to 32-bit linear PCM the
- * same time we are sample rate converting.
- */
- if (am_update_conv_buffer(chptr, orig_size_plus_pb,
- AUDIO_PLAY) == AUDIO_FAILURE) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(1) couldn't allocate memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* prepare for failure */
- *proc_data = NULL;
- *proc_size = 0;
-
- /*
- * Do the conversions. We try to minimize data copies as much as
- * possible. There are three possible situations, and how we deal
- * with the conversions. We make sure we do the sample rate conversion
- * on the minimum amount of audio data
- *
- * same (mono --> mono or stereo --> stereo)
- * am_convert_to_int(buf) --> orig data
- * SRC(orig data) --> proc data
- *
- * mono --> stereo
- * am_convert_to_int(buf) --> tmp data
- * inline mono2stereo(tmp data) --> orig data
- * SRC(tmp data) --> tmp data
- * inline mono2stereo(tmp data) --> proc data
- *
- * stereo --> mono
- * am_convert_to_int(buf) --> tmp data
- * inline stereo2mono(tmp data) --> orig data
- * SRC(orig data) --> proc data
- */
- if (channels == hw_channels) {
- /* either mono --> mono or stereo --> stereo */
- ATRACE("am_p_process() channels == hw_channels", 0);
-
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(2) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to int and place in orig data */
- am_convert_to_int(buf, *orig_data, orig_samples, precision,
- encoding, 0);
-
- /* SRC the data if we need to */
- if (src_samples) {
-
- /* only do extra work if necessary */
- if (chpptr->acp_ch_pbuf_size > 0) {
-
- /* set conv pointing to pconv1 */
- conv = chpptr->acp_ch_pconv1;
-
- /* set data_start pointing to incoming data */
- data_start = conv + (chpptr->acp_ch_pbuf_size
- >> AM_TIMES_4_SHIFT);
-
- /* we have to copy orig data to data_start */
- bcopy(*orig_data, data_start, *orig_size);
- } else {
- /* set conv pointing to orig data */
- conv = *orig_data;
- }
-
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- channels, AUDIO_PLAY, conv, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then update info */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- bcopy(tmp, *proc_data, tmp_size);
- *proc_size = tmp_size;
- }
- }
- }
- } else if (channels < hw_channels) {
- /* mono --> stereo */
- ATRACE_32("am_p_process() to stereo", channels);
- ASSERT(channels == AUDIO_CHANNELS_MONO);
- ASSERT(hw_channels == AUDIO_CHANNELS_STEREO);
-
- /* set data_start pointing to incoming data */
- data_start = (int *)chpptr->acp_ch_pconv1 +
- (chpptr->acp_ch_pbuf_size >> AM_TIMES_4_SHIFT);
-
- /*
- * Convert to int and save. We need this mono data twice,
- * as the source for SRC and to be converted to stereo. If
- * we converted directly to stereo then we would have to
- * do SRC on stereo instead of mono.
- */
- am_convert_to_int(buf, data_start, orig_samples, precision,
- encoding, 0);
-
- /* double in size and allocate orig data to save */
- *orig_size <<= AM_TIMES_2_SHIFT;
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(2) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to stereo */
- src = data_start;
- dest = *orig_data;
- for (i = orig_samples; i--; ) {
- /* dup to left and right channels */
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
-
- /* SRC the data and then convert to stereo */
- if (src_samples) {
- /* SRC the old mono data, not the new stereo data */
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- AUDIO_CHANNELS_MONO, AUDIO_PLAY,
- chpptr->acp_ch_pconv1, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then convert to stereo and save */
- if (tmp) {
- /* sizeof (int) * 2 = 8 */
- tmp_size = src_samples << AM_TIMES_8_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- src = tmp;
- dest = *proc_data;
- for (i = src_samples; i--; ) {
- /* dup to left & right chs */
- val = *src++;
- *dest++ = val;
- *dest++ = val;
- }
- *proc_size = tmp_size;
- }
- }
- }
- } else {
- /* stereo --> mono */
- ATRACE_32("am_p_process() to mono", channels);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
- ASSERT(hw_channels == AUDIO_CHANNELS_MONO);
-
- /* set data_start pointing to incoming data */
- data_start = (int *)chpptr->acp_ch_pconv1 +
- (chpptr->acp_ch_pbuf_size >> AM_TIMES_4_SHIFT);
-
- /* convert to int and then from stereo --> mono */
- am_convert_to_int(buf, data_start, orig_samples, precision,
- encoding, 0);
-
- /* divide in half the size and allocate orig data to save */
- *orig_size >>= AM_TIMES_2_SHIFT;
- *orig_data = kmem_alloc(*orig_size, KM_NOSLEEP);
- if (*orig_data == NULL) {
- audio_sup_log(AUDIO_STATE2HDL(statep), CE_NOTE,
- "!process(3) couldn't allocate"
- " memory, audio lost");
- return (AUDIO_FAILURE);
- }
-
- /* convert to mono */
- src = data_start;
- dest = *orig_data;
- for (i = (orig_samples >> AM_TIMES_2_SHIFT); i--; ) {
- /* average the left and right channels */
- val = *src++;
- val += *src++;
- *dest++ = val >> AM_HALF_ENERGY_SHIFT;
- }
-
- /* SRC the data, which is already mono */
- if (src_samples) {
- tmp = psrs->ad_src_convert(AM_SRC_CHPTR2HDL(chptr),
- AUDIO_CHANNELS_MONO, AUDIO_PLAY,
- chpptr->acp_ch_pconv1, chpptr->acp_ch_psrc1,
- chpptr->acp_ch_psrc2, &src_samples);
-
- ASSERT(src_samples <= (chpptr->acp_ch_psrc_siz >>
- AM_TIMES_4_SHIFT));
-
- /* if successful then update info */
- if (tmp) {
- /* sizeof (int) = 4 */
- tmp_size = src_samples << AM_TIMES_4_SHIFT;
- *proc_data = kmem_alloc(tmp_size, KM_NOSLEEP);
- if (*proc_data) {
- bcopy(tmp, *proc_data, tmp_size);
- *proc_size = tmp_size;
- }
- }
- }
- }
-
- return (AUDIO_SUCCESS);
-
-} /* am_p_process() */
-
-/*
- * am_set_waiting()
- *
- * Description:
- * Go through all of the channels. If PID is set then we set the read
- * and write waiting flags for that PID only. If PID is 0 then we set
- * all of the AUDIO channels. We set the flag to the argument value.
- * This lets this routine to be used to both set and clear the flag.
- *
- * Arguments:
- * audio_state_t *statep Pointer to the device instance's state
- * pid_t pid The PID to match
- * int value Value to set the waiting flag
- * boolean_t wantwrite If not 0 then set play.waiting
- * boolean_t wantread If not 0 then set record.waiting
- *
- * Returns:
- * void
- */
-static void
-am_set_waiting(audio_state_t *statep, pid_t pid, int value, boolean_t wantwrite,
- boolean_t wantread)
-{
- audio_ch_t *tchptr;
- audio_info_t *info;
- int i;
- int max_chs = statep->as_max_chs;
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
- for (i = 0, tchptr = &statep->as_channels[0]; i < max_chs;
- i++, tchptr++) {
-
- /* skip non-audio channels */
- mutex_enter(&tchptr->ch_lock);
- if (!(tchptr->ch_flags & AUDIO_CHNL_ALLOCATED) ||
- tchptr->ch_info.dev_type != AUDIO ||
- tchptr->ch_info.pid == 0) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* if pid then look for that PID, otherwise all others */
- if (pid && tchptr->ch_info.pid != pid) {
- mutex_exit(&tchptr->ch_lock);
- continue;
- }
-
- /* pid == 0 or pid's match, so set flags */
- info = tchptr->ch_info.info;
- if (wantwrite) {
- info->play.waiting = (uchar_t)value;
- }
- if (wantread) {
- info->record.waiting = (uchar_t)value;
- }
- mutex_exit(&tchptr->ch_lock);
- }
-
- ASSERT(MUTEX_HELD(&statep->as_lock));
-
-} /* am_set_waiting() */
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c
new file mode 100644
index 0000000000..66abd593d9
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.c
@@ -0,0 +1,1956 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/note.h>
+#include <sys/varargs.h>
+#include <sys/stream.h>
+#include <sys/modctl.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/strsun.h>
+#include <sys/strsubr.h>
+#include <sys/taskq.h>
+
+#include <sys/audio.h>
+#include <sys/audio/audio_support.h>
+#include <sys/mixer.h>
+#include <sys/audio/audio_mixer.h>
+
+#include <sys/usb/usba/usbai_version.h>
+#include <sys/usb/usba.h>
+#include <sys/usb/clients/audio/usb_audio.h>
+#include <sys/usb/clients/audio/usb_mixer.h>
+#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
+
+#include "audio_shim.h"
+
+extern void *usb_ac_statep;
+
+extern struct cb_ops audio_cb_ops;
+
+
+/*
+ * The code here is a "shim" connecting legacy SADA USB drivers with the
+ * Boomer audio framework, translating interfaces between the two.
+ * This is an interim measure until new Boomer-native USB drivers are in place.
+ */
+
+extern void audio_dump_bytes(const uint8_t *, int);
+extern void audio_dump_words(const uint16_t *, int);
+extern void audio_dump_dwords(const uint32_t *, int);
+
+
+#define ASHIM_ENG_PLAY 0
+#define ASHIM_ENG_REC 1
+
+#define ASHIM_GET_ENG(statep, which) (&(statep)->engines[(which)])
+#define ASHIM_ENG_DIR(engp) \
+ (((engp)->af_eflags & ENGINE_OUTPUT_CAP) ? AUDIO_PLAY : AUDIO_RECORD)
+
+static int ashim_eng_start(ashim_eng_t *);
+static void ashim_eng_stop(ashim_eng_t *);
+
+static int ashim_af_open(void *arg, int flag,
+ unsigned *fragszp, unsigned *nfragsp, caddr_t *bufp);
+static void ashim_af_close(void *arg);
+static uint64_t ashim_af_count(void *arg);
+static int ashim_af_start(void *arg);
+static void ashim_af_stop(void *arg);
+static int ashim_af_format(void *arg);
+static int ashim_af_channels(void *arg);
+static int ashim_af_rate(void *arg);
+static void ashim_af_sync(void *arg, unsigned nframes);
+static size_t ashim_af_qlen(void *arg);
+
+audio_engine_ops_t ashim_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ ashim_af_open,
+ ashim_af_close,
+ ashim_af_start,
+ ashim_af_stop,
+ ashim_af_count,
+ ashim_af_format,
+ ashim_af_channels,
+ ashim_af_rate,
+ ashim_af_sync,
+ ashim_af_qlen,
+};
+
+
+#define ASHIM_BUFSCALE_MIN 1
+#define ASHIM_BUFSCALE_MAX 2000
+#define ASHIM_BUFSCALE_DEF 10
+
+/* engine buffer size in terms of fragments */
+int ashim_bufscale = ASHIM_BUFSCALE_DEF;
+
+/* use driver specified buffer size instead */
+int ashim_use_drvbuf = 0;
+
+/* format override */
+uint_t ashim_fmt_sr = 0;
+uint_t ashim_fmt_ch = 0;
+uint_t ashim_fmt_prec = 0;
+uint_t ashim_fmt_enc = 0; /* use SADA values e.g. AUDIO_ENCODING_LINEAR = 3 */
+
+/* open without starting engine */
+int ashim_eng_disable = 0;
+
+/* dump audio data */
+uint64_t ashim_dump_audio_start = 0;
+uint64_t ashim_dump_audio_len = 0;
+int ashim_dump_audio_bufsel = 0; /* 0 = shim buf; 1 = drv/dma buf */
+
+/* dump i/o related counters */
+uint64_t ashim_dump_counters_start = 0;
+uint64_t ashim_dump_counters_len = 0;
+
+/* ignore errors when setting control values */
+int ashim_ctrl_ignore_errors = 0;
+
+/*
+ * *************************************************************************
+ * audio controls
+ *
+ * Note: we cannot determine if a SADA device truly supports play or record
+ * gain adjustment until we actually try the command. Messages showing
+ * failed control updates will be printed at the DINFO ashim_debug level.
+ */
+
+#define AUDIO_CTRL_STEREO_LEFT(v) ((uint8_t)((v) & 0xff))
+#define AUDIO_CTRL_STEREO_RIGHT(v) ((uint8_t)(((v) >> 8) & 0xff))
+#define AUDIO_CTRL_STEREO_VAL(l, r) (((l) & 0xff) | (((r) & 0xff) << 8))
+
+/*
+ * framework gain range
+ */
+#define AF_MAX_GAIN 100
+#define AF_MIN_GAIN 0
+
+#define AF_MAX_GAIN_ST AUDIO_CTRL_STEREO_VAL(AF_MAX_GAIN, AF_MAX_GAIN)
+#define AF_MIN_GAIN_ST AUDIO_CTRL_STEREO_VAL(AF_MIN_GAIN, AF_MIN_GAIN)
+
+/*
+ * convert between framework and driver gain values
+ * must multiply (n) before dividing else D2F_GAIN result will be 0
+ */
+#define F2D_GAIN(n) (((n) * AUDIO_MAX_GAIN) / AF_MAX_GAIN)
+#define D2F_GAIN(n) (((n) * AF_MAX_GAIN) / AUDIO_MAX_GAIN)
+
+typedef struct ashim_ctrl_map ashim_ctrl_map_t;
+
+static uint64_t ashim_ctrl_defval(ashim_state_t *statep,
+ ashim_ctrl_map_t *mapp);
+static int ashim_ctrl_set_defaults(ashim_state_t *statep);
+static int ashim_ctrl_restore(ashim_state_t *statep);
+
+static int ashim_ctrl_rd(void *, uint64_t *);
+static int ashim_ctrl_wr_st(void *, uint64_t);
+static int ashim_ctrl_wr_mn(void *, uint64_t);
+static int ashim_ctrl_wr_bool(void *, uint64_t);
+static int ashim_ctrl_wr_ports(void *, uint64_t);
+
+static void ashim_rem_controls(ashim_state_t *statep);
+static int ashim_add_controls(ashim_state_t *statep);
+
+
+/*
+ * map framework port definitions to SADA ports
+ */
+
+typedef struct {
+ int dport;
+ const char *pname;
+} ashim_port_map_t;
+
+
+static ashim_port_map_t ashim_play_pmap[] = {
+ {AUDIO_SPEAKER, AUDIO_PORT_SPEAKER},
+ {AUDIO_HEADPHONE, AUDIO_PORT_HEADPHONES},
+ {AUDIO_LINE_OUT, AUDIO_PORT_LINEOUT},
+ {AUDIO_SPDIF_OUT, AUDIO_PORT_SPDIFOUT},
+ {AUDIO_AUX1_OUT, AUDIO_PORT_AUX1OUT},
+ {AUDIO_AUX2_OUT, AUDIO_PORT_AUX2OUT}
+};
+static int ashim_play_pmap_len =
+ sizeof (ashim_play_pmap) / sizeof (ashim_port_map_t);
+
+
+static ashim_port_map_t ashim_rec_pmap[] = {
+ {AUDIO_MICROPHONE, AUDIO_PORT_MIC},
+ {AUDIO_LINE_IN, AUDIO_PORT_LINEIN},
+ {AUDIO_CD, AUDIO_PORT_CD},
+ {AUDIO_SPDIF_IN, AUDIO_PORT_SPDIFIN},
+ {AUDIO_AUX1_IN, AUDIO_PORT_AUX1IN},
+ {AUDIO_AUX2_IN, AUDIO_PORT_AUX2IN},
+ {AUDIO_CODEC_LOOPB_IN, AUDIO_PORT_STEREOMIX}
+};
+static int ashim_rec_pmap_len =
+ sizeof (ashim_rec_pmap) / sizeof (ashim_port_map_t);
+
+
+/*
+ * map frameowork controls to SADA controls
+ */
+struct ashim_ctrl_map {
+ int dcmd;
+ int dir;
+ audio_ctrl_desc_t acd;
+ audio_ctrl_wr_t af_wr;
+ audio_ctrl_rd_t af_rd;
+};
+
+#define DESC_ST(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_STEREO, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = AF_MAX_GAIN, \
+ .acd_minvalue = AF_MIN_GAIN, \
+}
+#define FUNC_ST \
+ &ashim_ctrl_wr_st, &ashim_ctrl_rd
+
+
+#define DESC_MN(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_MONO, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = AF_MAX_GAIN, \
+ .acd_minvalue = AF_MIN_GAIN, \
+}
+#define FUNC_MN \
+ &ashim_ctrl_wr_mn, &ashim_ctrl_rd
+
+
+#define DESC_BOOL(n, f) { \
+ .acd_name = (n), \
+ .acd_type = AUDIO_CTRL_TYPE_BOOLEAN, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = 1, \
+ .acd_minvalue = 0, \
+}
+#define FUNC_BOOL \
+ &ashim_ctrl_wr_bool, &ashim_ctrl_rd
+
+
+#define DESC_OUTS(n, f) { \
+ .acd_name = AUDIO_CTRL_ID_OUTPUTS, \
+ .acd_type = AUDIO_CTRL_TYPE_ENUM, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE | \
+ AUDIO_CTRL_FLAG_MULTI, \
+ .acd_maxvalue = (n), \
+ .acd_minvalue = (n), \
+}
+
+#define DESC_INS(n, f) { \
+ .acd_name = AUDIO_CTRL_ID_INPUTS, \
+ .acd_type = AUDIO_CTRL_TYPE_ENUM, \
+ .acd_flags = (f) | \
+ AUDIO_CTRL_FLAG_READABLE | AUDIO_CTRL_FLAG_WRITEABLE, \
+ .acd_maxvalue = (n), \
+ .acd_minvalue = (n), \
+}
+#define FUNC_PORTS \
+ &ashim_ctrl_wr_ports, &ashim_ctrl_rd
+
+
+/*
+ * sada <-> framework translation table
+ * a DESC_NULL() for audio_ctrl_desc_t is used to indicate a
+ * non-registered sada control that needs some initialization or be used
+ * internally by the shim
+ *
+ * Note: currently, usb_ac only notifies the framework of play volume changes
+ * from HID so the volume control the only one using AUDIO_CTRL_FLAG_POLL
+ */
+static ashim_ctrl_map_t ashim_ctrl_map[] = {
+ {AM_SET_GAIN, AUDIO_PLAY,
+ DESC_ST(AUDIO_CTRL_ID_VOLUME, AUDIO_CTRL_FLAG_MAINVOL |
+ AUDIO_CTRL_FLAG_PLAY | AUDIO_CTRL_FLAG_POLL),
+ FUNC_ST},
+
+ {AM_SET_GAIN, AUDIO_PLAY,
+ DESC_MN(AUDIO_CTRL_ID_VOLUME, AUDIO_CTRL_FLAG_MAINVOL |
+ AUDIO_CTRL_FLAG_PLAY | AUDIO_CTRL_FLAG_POLL),
+ FUNC_MN},
+
+ {AM_SET_GAIN, AUDIO_RECORD,
+ DESC_ST(AUDIO_CTRL_ID_RECGAIN, AUDIO_CTRL_FLAG_RECVOL |
+ AUDIO_CTRL_FLAG_REC),
+ FUNC_ST},
+
+ {AM_SET_GAIN, AUDIO_RECORD,
+ DESC_MN(AUDIO_CTRL_ID_RECGAIN, AUDIO_CTRL_FLAG_RECVOL |
+ AUDIO_CTRL_FLAG_REC),
+ FUNC_MN},
+
+ {AM_SET_MONITOR_GAIN, AUDIO_RECORD,
+ DESC_MN(AUDIO_CTRL_ID_MONGAIN, AUDIO_CTRL_FLAG_MONVOL |
+ AUDIO_CTRL_FLAG_MONITOR),
+ FUNC_MN},
+
+ {AM_MIC_BOOST, AUDIO_RECORD,
+ DESC_BOOL(AUDIO_CTRL_ID_MICBOOST, 0),
+ FUNC_BOOL},
+
+ {AM_SET_PORT, AUDIO_PLAY,
+ DESC_OUTS(0, 0),
+ FUNC_PORTS},
+
+ {AM_SET_PORT, AUDIO_RECORD,
+ DESC_INS(0, 0),
+ FUNC_PORTS},
+};
+static int ashim_ctrl_map_len =
+ sizeof (ashim_ctrl_map) / sizeof (ashim_ctrl_map_t);
+
+
+/*
+ * *************************************************************************
+ * shim support routines
+ */
+
+int ashim_debug = DBG_WARN;
+
+void
+vdprint(debug_level_t lvl, const char *fmt, va_list adx)
+{
+ if (ashim_debug < lvl)
+ return;
+
+ vcmn_err(CE_CONT, fmt, adx);
+}
+
+void
+dprint(debug_level_t lvl, const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(lvl, fmt, adx);
+ va_end(adx);
+}
+
+void
+dwarn(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_WARN, fmt, adx);
+ va_end(adx);
+}
+
+void
+dinfo(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_INFO, fmt, adx);
+ va_end(adx);
+}
+
+void
+ddtl(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vdprint(DBG_DETAIL, fmt, adx);
+ va_end(adx);
+}
+
+
+/*
+ * get the maximum format specification the device supports
+ */
+static void
+ashim_max_fmt(ashim_state_t *statep, int dir, ashim_fmt_t *fmtp)
+{
+ am_ad_ch_cap_t *capp = &statep->ad_infop->ad_play;
+ am_ad_cap_comb_t *combp = statep->ad_infop->ad_play_comb;
+
+ uint_t *srs, *chs;
+ uint_t sr, ch, prec, enc, val;
+ int i;
+
+ if (dir == AUDIO_RECORD) {
+ capp = &statep->ad_infop->ad_record;
+ combp = statep->ad_infop->ad_rec_comb;
+ }
+ srs = capp->ad_mixer_srs.ad_srs;
+ chs = capp->ad_chs;
+
+ for (i = 0, sr = 0; srs[i]; i++) {
+ val = srs[i];
+ if (val > sr)
+ sr = val;
+ }
+
+ for (i = 0, ch = 0; chs[i]; i++) {
+ val = chs[i];
+ if (val > ch)
+ ch = val;
+ }
+
+ for (i = 0, prec = 0, enc = 0; combp[i].ad_prec; i++) {
+ val = combp[i].ad_prec;
+ if (val > prec)
+ prec = val;
+
+ val = combp[i].ad_enc;
+ if (val > enc)
+ enc = val;
+ }
+
+ fmtp->sr = ashim_fmt_sr ? ashim_fmt_sr : sr;
+ fmtp->ch = ashim_fmt_ch ? ashim_fmt_ch : ch;
+ fmtp->prec = ashim_fmt_prec ? ashim_fmt_prec : prec;
+ fmtp->enc = ashim_fmt_enc ? ashim_fmt_enc : enc;
+}
+
+
+/*
+ * calls the driver's setup routine if present
+ * For USB audio, this opens a pipe to the endpoint usb_as
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static int
+ashim_ad_setup(ashim_state_t *statep, int dir)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ if (ad_entry->ad_setup == NULL)
+ return (AUDIO_SUCCESS);
+
+ return (ad_entry->ad_setup(AUDIO_SHIMST2HDL(statep), dir));
+}
+
+
+/*
+ * calls the driver's teardown routine if present.
+ * Note that the amount of teardowns must match the amount of setups used
+ * in each direction.
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static void
+ashim_ad_teardown(ashim_state_t *statep, int dir)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ if (ad_entry->ad_teardown != NULL)
+ ad_entry->ad_teardown(AUDIO_SHIMST2HDL(statep), dir);
+}
+
+
+/*
+ * sets the audio format (sample rate, channels, precision, encoding)
+ * returns AUDIO_SUCCESS or AUDIO_FAILURE
+ */
+static int
+ashim_set_fmt(ashim_state_t *statep, int dir, ashim_fmt_t *fmtp)
+{
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ return (ad_entry->ad_set_format(AUDIO_SHIMST2HDL(statep), dir,
+ fmtp->sr, fmtp->ch, fmtp->prec, fmtp->enc));
+}
+
+
+static int
+ashim_af_fmt(ashim_fmt_t *fmtp)
+{
+ switch (fmtp->enc) {
+ case AUDIO_ENCODING_ULAW:
+ return (AUDIO_FORMAT_ULAW);
+ case AUDIO_ENCODING_ALAW:
+ return (AUDIO_FORMAT_ALAW);
+ case AUDIO_ENCODING_DVI:
+ return (AUDIO_FORMAT_NONE);
+ case AUDIO_ENCODING_LINEAR8:
+ return (AUDIO_FORMAT_U8);
+ case AUDIO_ENCODING_LINEAR:
+ break;
+ default:
+ return (AUDIO_FORMAT_NONE);
+ }
+
+ switch (fmtp->prec) {
+ case 8:
+ return (AUDIO_FORMAT_S8);
+ case 16:
+ return (AUDIO_FORMAT_S16_NE);
+ case 24:
+ return (AUDIO_FORMAT_S24_NE);
+ case 32:
+ return (AUDIO_FORMAT_S32_NE);
+ default:
+ break;
+ }
+ return (AUDIO_FORMAT_NONE);
+}
+
+
+static void
+ashim_rem_eng(ashim_state_t *statep, ashim_eng_t *engp)
+{
+ if (statep->af_devp == NULL || engp->af_engp == NULL)
+ return;
+
+ audio_dev_remove_engine(statep->af_devp, engp->af_engp);
+ audio_engine_free(engp->af_engp);
+ engp->af_engp = NULL;
+
+ if (statep->engcnt > 0)
+ statep->engcnt--;
+}
+
+
+static int
+ashim_add_eng(ashim_state_t *statep, int dir)
+{
+ audio_dev_t *af_devp = statep->af_devp;
+ ashim_eng_t *engp;
+ audio_engine_t *af_engp;
+ int rv = AUDIO_FAILURE;
+ int which;
+
+ if (dir == AUDIO_PLAY) {
+ which = ASHIM_ENG_PLAY;
+ engp = ASHIM_GET_ENG(statep, which);
+ engp->af_eflags = ENGINE_OUTPUT_CAP;
+ engp->prinfop = &statep->ad_infop->ad_defaults->play;
+ engp->name = "PLAY";
+ } else {
+ which = ASHIM_ENG_REC;
+ engp = ASHIM_GET_ENG(statep, which);
+ engp->af_eflags = ENGINE_INPUT_CAP;
+ engp->prinfop = &statep->ad_infop->ad_defaults->record;
+ engp->name = "RECORD";
+ }
+
+ mutex_init(&engp->lock, NULL, MUTEX_DRIVER, NULL);
+
+ engp->statep = statep;
+
+ ashim_max_fmt(statep, dir, &engp->fmt);
+ engp->af_fmt = ashim_af_fmt(&engp->fmt);
+
+ af_engp = audio_engine_alloc(&ashim_engine_ops, engp->af_eflags);
+ if (af_engp == NULL) {
+ audio_dev_warn(af_devp, "audio_engine_alloc failed");
+ goto OUT;
+ }
+
+ engp->af_engp = af_engp;
+ audio_engine_set_private(af_engp, engp);
+ audio_dev_add_engine(af_devp, af_engp);
+
+ engp->flags = ENG_ENABLED;
+
+ statep->engcnt++;
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ ashim_rem_eng(statep, engp);
+
+ return (rv);
+}
+
+
+static int
+ashim_set_config(ashim_state_t *statep, ashim_ctrl_t *ctrlp, int cmd, int dir,
+ int arg1, int arg2)
+{
+ int (*fn)(audiohdl_t, int, int, int, int) =
+ statep->ad_infop->ad_entry->ad_set_config;
+
+ ddtl("%s - ashim_set_config: cmd 0x%x, dir %d, arg1 0x%x, arg2 0x%x\n",
+ statep->dstr, cmd, dir, arg1, arg2);
+
+ if (fn(AUDIO_SHIMST2HDL(statep), cmd, dir, arg1, arg2) !=
+ AUDIO_SUCCESS) {
+ dinfo("%s: failed update control %s "
+ "with cmd 0x%x, dir %d, arg1 0x%x, arg2 0x%x",
+ statep->dstr, ctrlp->acd.acd_name, cmd, dir, arg1, arg2);
+ return (EIO);
+ }
+
+ return (0);
+}
+
+
+static int
+ashim_ctrl_set_defaults(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp;
+ int rv = AUDIO_SUCCESS;
+
+ for (ctrlp = statep->controls; ctrlp; ctrlp = ctrlp->nextp) {
+ if (audio_control_write(ctrlp->af_ctrlp, ctrlp->defval)) {
+ dinfo("%s: setting control %s to default value "
+ "0x%llx failed\n",
+ statep->dstr, ctrlp->acd.acd_name,
+ (long long unsigned)ctrlp->defval);
+ rv = AUDIO_FAILURE;
+ }
+ }
+ return (rv);
+}
+
+
+static int
+ashim_ctrl_restore(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp;
+ int rv = AUDIO_SUCCESS;
+
+ for (ctrlp = statep->controls; ctrlp; ctrlp = ctrlp->nextp) {
+ if (ctrlp->af_wr((void *)ctrlp, ctrlp->cval) != 0) {
+ dinfo("%s: restoring "
+ "control %s to value 0x%llx failed",
+ statep->dstr, ctrlp->acd.acd_name,
+ (long long unsigned)ctrlp->cval);
+ rv = AUDIO_FAILURE;
+ }
+ }
+ return (rv);
+}
+
+
+static inline void
+ashim_dump_audio(ashim_eng_t *engp, void *buf, int sz)
+{
+ if (engp->io_count >= ashim_dump_audio_start &&
+ engp->io_count - ashim_dump_audio_start < ashim_dump_audio_len) {
+ int samples = sz >> engp->smszshift;
+ int frames = samples >> engp->frsmshift;
+
+ cmn_err(CE_NOTE, "\n\n======= %s - %s: REQUEST #%llu, "
+ "BUF I/O #%llu, SAMPLES %d (%d frames, %d bytes), "
+ "BUF ADDR 0x%p =======\n",
+ engp->statep->dstr, engp->name,
+ (unsigned long long)engp->io_count,
+ (unsigned long long)engp->bufio_count,
+ samples, frames, sz, buf);
+
+ if (sz <= 0)
+ return;
+
+ switch (engp->fmt.prec) {
+ case 8:
+ case 24:
+ audio_dump_bytes((uint8_t *)buf, sz);
+ break;
+ case 16:
+ audio_dump_words((uint16_t *)buf, sz >> 1);
+ break;
+ case 32:
+ audio_dump_dwords((uint32_t *)buf, sz >> 2);
+ break;
+ }
+ }
+}
+
+
+static inline void
+ashim_dump_counters(ashim_eng_t *engp, unsigned frames, int bufcnt)
+{
+ if (engp->io_count >= ashim_dump_counters_start &&
+ engp->io_count - ashim_dump_counters_start <
+ ashim_dump_counters_len) {
+ int samples = frames << engp->frsmshift;
+ int sz = samples << engp->smszshift;
+
+ if (bufcnt >= 0) {
+ cmn_err(CE_CONT, "======= %s - %s: buf i/o %d of "
+ "REQUEST #%llu, SAMPLES %d "
+ "(%d frames, %d bytes)\n",
+ engp->statep->dstr, engp->name, bufcnt,
+ (unsigned long long)engp->io_count, samples,
+ frames, sz);
+ } else {
+ cmn_err(CE_CONT, "======= %s - %s: REQUEST #%llu, "
+ "SAMPLES %d (%d frames, %d bytes)\n",
+ engp->statep->dstr, engp->name,
+ (unsigned long long)engp->io_count,
+ samples, frames, sz);
+ }
+ }
+}
+
+
+/*
+ * moves data between driver buffer and framework/shim buffer
+ */
+static void
+ashim_eng_bufio(ashim_eng_t *engp, void *buf, size_t sz)
+{
+ size_t cpsz = sz;
+ caddr_t *src, *dst, *dp;
+
+ if (engp->af_eflags & ENGINE_OUTPUT_CAP) {
+ src = &engp->bufpos;
+ dst = (caddr_t *)&buf;
+ } else {
+ src = (caddr_t *)&buf;
+ dst = &engp->bufpos;
+ }
+ dp = ashim_dump_audio_bufsel ? (caddr_t *)&buf : &engp->bufpos;
+
+ /*
+ * Wrap. If sz is exactly the remainder of the buffer
+ * (bufpos + sz == bufendp) then the second cpsz should be 0 and so
+ * the second memcpy() should have no effect, with bufpos updated
+ * to the head of the buffer.
+ */
+ if (engp->bufpos + sz >= engp->bufendp) {
+ cpsz = (size_t)engp->bufendp - (size_t)engp->bufpos;
+ (void) memcpy(*dst, *src, cpsz);
+
+ if (ashim_dump_audio_len)
+ ashim_dump_audio(engp, *dp, cpsz);
+
+ buf = (caddr_t)buf + cpsz;
+ engp->bufpos = engp->bufp;
+ cpsz = sz - cpsz;
+ }
+
+ if (cpsz) {
+ (void) memcpy(*dst, *src, cpsz);
+
+ if (ashim_dump_audio_len)
+ ashim_dump_audio(engp, *dp, cpsz);
+
+ engp->bufpos += cpsz;
+ }
+ engp->bufio_count++;
+}
+
+
+static void
+ashim_prtstats(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+
+ dinfo("%s - %s: driver i/o: %llu, framework i/o: %llu, "
+ "frames: %llu\n", statep->dstr, engp->name,
+ (long long unsigned)engp->io_count,
+ (long long unsigned)engp->bufio_count,
+ (long long unsigned)engp->frames);
+}
+
+
+/*
+ * *************************************************************************
+ * audio control routines
+ */
+
+static uint64_t
+ashim_ctrl_defval(ashim_state_t *statep, ashim_ctrl_map_t *mapp)
+{
+ audio_prinfo_t *play_prp = &statep->ad_infop->ad_defaults->play;
+ audio_prinfo_t *rec_prp = &statep->ad_infop->ad_defaults->record;
+ const char *cname = mapp->acd.acd_name;
+ uint64_t cval = 0;
+ uint64_t gain;
+ ashim_fmt_t fmt;
+
+ if (strcmp(cname, AUDIO_CTRL_ID_VOLUME) == 0) {
+ ashim_max_fmt(statep, AUDIO_PLAY, &fmt);
+ if (fmt.ch == 0)
+ return (0);
+
+ gain = D2F_GAIN(play_prp->gain);
+ if (fmt.ch == 1)
+ cval = gain;
+ else
+ cval = AUDIO_CTRL_STEREO_VAL(gain, gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_RECGAIN) == 0) {
+ ashim_max_fmt(statep, AUDIO_RECORD, &fmt);
+ if (fmt.ch == 0)
+ return (0);
+
+ gain = D2F_GAIN(rec_prp->gain);
+ if (fmt.ch == 1)
+ cval = gain;
+ else
+ cval = AUDIO_CTRL_STEREO_VAL(gain, gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_MONGAIN) == 0) {
+ cval = D2F_GAIN(statep->ad_infop->ad_defaults->monitor_gain);
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_MICBOOST) == 0) {
+ cval = 0;
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_OUTPUTS) == 0) {
+ cval = play_prp->port;
+
+ } else if (strcmp(cname, AUDIO_CTRL_ID_INPUTS) == 0) {
+ cval = rec_prp->port;
+ }
+
+ return (cval);
+}
+
+
+static ashim_ctrl_t *
+ashim_find_ctrl_dcmd(ashim_state_t *statep, int dcmd, int dir)
+{
+ ashim_ctrl_t *ctrlp;
+
+ for (ctrlp = statep->controls; ctrlp != NULL; ctrlp = ctrlp->nextp) {
+ if (ctrlp->dcmd == dcmd && ctrlp->dir == dir)
+ break;
+ }
+ return (ctrlp);
+}
+
+
+/*
+ * control callback and related routines
+ */
+
+static int
+ashim_ctrl_gain_mutable(ashim_ctrl_t *ctrlp, int left, int right)
+{
+ ashim_state_t *statep = ctrlp->statep;
+ int gain;
+
+ if (left == 0 && right == 0)
+ gain = 0;
+ else if (left != 0)
+ gain = left;
+ else
+ gain = right;
+
+ if (ctrlp->dcmd == AM_SET_GAIN && ctrlp->dir == AUDIO_PLAY) {
+ /*
+ * mute when gain = 0, and on the transition when gain != 0
+ * but do not set unmute cmds during non-zero changes
+ */
+ if (gain == 0) {
+ ctrlp->flags |= CTRL_MUTED;
+
+ if (ashim_set_config(statep, ctrlp, AM_OUTPUT_MUTE,
+ AUDIO_PLAY, 1, 0) != AUDIO_SUCCESS)
+ return (EIO);
+
+ } else if (ctrlp->flags & CTRL_MUTED) {
+ ctrlp->flags &= ~CTRL_MUTED;
+
+ if (ashim_set_config(statep, ctrlp, AM_OUTPUT_MUTE,
+ AUDIO_PLAY, 0, 0) != AUDIO_SUCCESS)
+ return (EIO);
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+ * control read callback
+ */
+static int
+ashim_ctrl_rd(void *arg, uint64_t *cvalp)
+{
+ ashim_ctrl_t *ctrlp = arg;
+
+ mutex_enter(&ctrlp->lock);
+ *cvalp = ctrlp->cval;
+ mutex_exit(&ctrlp->lock);
+
+ return (0);
+}
+
+
+/*
+ * stereo level control callback
+ */
+static int
+ashim_ctrl_wr_st(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int left, right;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ left = AUDIO_CTRL_STEREO_LEFT(cval);
+ right = AUDIO_CTRL_STEREO_RIGHT(cval);
+
+ if (left < AF_MIN_GAIN || left > AF_MAX_GAIN ||
+ right < AF_MIN_GAIN || right > AF_MAX_GAIN) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ left = F2D_GAIN(left);
+ right = F2D_GAIN(right);
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, left,
+ 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, right,
+ 1) != AUDIO_SUCCESS) {
+ /* restore previous left gain value */
+ (void) ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ left, 0);
+ goto OUT;
+ }
+
+ rv = ashim_ctrl_gain_mutable(ctrlp, left, right);
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * mono level control callback
+ */
+static int
+ashim_ctrl_wr_mn(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int gain;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ if (cval < (uint64_t)AF_MIN_GAIN || cval > (uint64_t)AF_MAX_GAIN) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ gain = (int)F2D_GAIN(cval);
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ gain, 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = ashim_ctrl_gain_mutable(ctrlp, gain, 0);
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * boolean control callback
+ */
+/*ARGSUSED*/
+static int
+ashim_ctrl_wr_bool(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir,
+ (int)cval, 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * port selection control callback
+ */
+static int
+ashim_ctrl_wr_ports(void *arg, uint64_t cval)
+{
+ ashim_ctrl_t *ctrlp = arg;
+ ashim_state_t *statep = ctrlp->statep;
+ int rv = EIO;
+ int dports = cval & 0xff;
+
+ ddtl("%s - control %s WRITE: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+
+ if ((cval & ~ctrlp->acd.acd_minvalue) !=
+ (ctrlp->acd.acd_maxvalue & ~ctrlp->acd.acd_minvalue)) {
+ dinfo("%s - control %s invalid value: 0x%llx\n", statep->dstr,
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (EINVAL);
+ }
+
+ mutex_enter(&ctrlp->lock);
+ ctrlp->cval = cval;
+
+ if (ashim_set_config(statep, ctrlp, ctrlp->dcmd, ctrlp->dir, dports,
+ 0) != AUDIO_SUCCESS)
+ goto OUT;
+
+ rv = 0;
+
+OUT:
+ mutex_exit(&ctrlp->lock);
+ return (ashim_ctrl_ignore_errors ? 0 : rv);
+}
+
+
+/*
+ * audio control registration related routines
+ */
+
+static ashim_ctrl_t *
+ashim_ctrl_alloc(void)
+{
+ return (kmem_zalloc(sizeof (ashim_ctrl_t), KM_SLEEP));
+}
+
+
+static void
+ashim_ctrl_free(ashim_ctrl_t *ctrlp)
+{
+ kmem_free(ctrlp, sizeof (ashim_ctrl_t));
+}
+
+
+static void
+ashim_ctrl_insert(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ ctrlp->nextp = statep->controls;
+ statep->controls = ctrlp;
+}
+
+
+/*
+ * returns the amount of modifiable ports
+ */
+static int
+ashim_ctrl_init_ports(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ audio_prinfo_t *prp;
+ ashim_port_map_t *pmap;
+ int pmaplen;
+ int i;
+ int count = 0;
+
+ if (ctrlp->dir == AUDIO_PLAY) {
+ prp = &statep->ad_infop->ad_defaults->play;
+ pmap = ashim_play_pmap;
+ pmaplen = ashim_play_pmap_len;
+ } else {
+ prp = &statep->ad_infop->ad_defaults->record;
+ pmap = ashim_rec_pmap;
+ pmaplen = ashim_rec_pmap_len;
+ }
+
+ /*
+ * look at all SADA supported ports then set the corresponding
+ * framework defined bits in the control description if the driver
+ * informs us that it is present (avail_ports) and if it can be
+ * toggled on/off (mod_ports)
+ */
+ for (i = 0; i < pmaplen; i++) {
+ ctrlp->acd.acd_enum[i] = pmap[i].pname;
+
+ if (pmap[i].dport & prp->avail_ports) {
+ ctrlp->acd.acd_maxvalue |= pmap[i].dport;
+
+ dinfo("%s: available port: "
+ "driver 0x%x, framework 0x%s\n",
+ statep->dstr, pmap[i].dport, pmap[i].pname);
+ }
+ if (pmap[i].dport & prp->mod_ports) {
+ ctrlp->acd.acd_minvalue |= pmap[i].dport;
+
+ dinfo("%s: modifiable port: "
+ "(driver 0x%x, framework %s)\n",
+ statep->dstr, pmap[i].dport, pmap[i].pname);
+
+ count++;
+ }
+ }
+
+ return (count);
+}
+
+
+static void
+ashim_ctrl_fini(ashim_ctrl_t *ctrlp)
+{
+ mutex_destroy(&ctrlp->lock);
+}
+
+
+/*
+ * returns 0 if initialization is successful; failure to initialize is
+ * not fatal so caller should deallocate and continue on to the next control
+ */
+static int
+ashim_ctrl_init(ashim_state_t *statep, ashim_ctrl_t *ctrlp,
+ ashim_ctrl_map_t *mapp)
+{
+ ctrlp->dcmd = mapp->dcmd;
+ ctrlp->dir = mapp->dir;
+ ctrlp->acd = mapp->acd;
+ ctrlp->af_ctrlp = NULL;
+ ctrlp->defval = ashim_ctrl_defval(statep, mapp);
+ ctrlp->cval = ctrlp->defval;
+ ctrlp->af_wr = mapp->af_wr;
+ ctrlp->statep = statep;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_ENUM &&
+ ashim_ctrl_init_ports(statep, ctrlp) <= 1) {
+ dinfo("%s: no more than one modifiable port detected for "
+ "control %s, enabling and skipping\n",
+ statep->dstr, ctrlp->acd.acd_name);
+
+ (void) ctrlp->af_wr((void *)ctrlp, ctrlp->defval);
+ return (1);
+ }
+
+ mutex_init(&ctrlp->lock, NULL, MUTEX_DRIVER, NULL);
+ return (0);
+}
+
+
+/*
+ * heuristic to determine if a control is actually present by writing the
+ * default value and checking if the operation succeeds
+ */
+/*ARGSUSED*/
+static int
+ashim_ctrl_test(ashim_state_t *statep, ashim_ctrl_t *ctrlp)
+{
+ return (ctrlp->af_wr((void *)ctrlp, ctrlp->defval));
+}
+
+
+static void
+ashim_rem_controls(ashim_state_t *statep)
+{
+ ashim_ctrl_t *ctrlp = statep->controls;
+ ashim_ctrl_t *nextp;
+
+ while (ctrlp != NULL) {
+ if (ctrlp->af_ctrlp != NULL)
+ audio_dev_del_control(ctrlp->af_ctrlp);
+
+ nextp = ctrlp->nextp;
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ ctrlp = nextp;
+ }
+
+ /* required */
+ statep->controls = NULL;
+}
+
+
+static int
+ashim_add_controls(ashim_state_t *statep)
+{
+ int rv = AUDIO_FAILURE;
+ int i;
+ ashim_ctrl_map_t *mapp;
+ ashim_ctrl_t *ctrlp;
+ audio_ctrl_t *af_ctrlp;
+ ashim_fmt_t playfmt = {0};
+ ashim_fmt_t recfmt = {0};
+ ashim_fmt_t *fmtp;
+ int ad_feat = statep->ad_infop->ad_defaults->hw_features;
+
+ if (ad_feat & AUDIO_HWFEATURE_PLAY)
+ ashim_max_fmt(statep, AUDIO_PLAY, &playfmt);
+
+ if (ad_feat & AUDIO_HWFEATURE_RECORD)
+ ashim_max_fmt(statep, AUDIO_RECORD, &recfmt);
+
+ for (i = 0; i < ashim_ctrl_map_len; i++) {
+ mapp = &ashim_ctrl_map[i];
+ fmtp = NULL;
+
+ if (mapp->dir == AUDIO_PLAY) {
+ if (!(ad_feat & AUDIO_HWFEATURE_PLAY))
+ continue;
+
+ fmtp = &playfmt;
+ }
+ if (mapp->dir == AUDIO_RECORD) {
+ if (!(ad_feat & AUDIO_HWFEATURE_RECORD))
+ continue;
+
+ fmtp = &recfmt;
+ }
+
+ if (mapp->dcmd == AM_SET_GAIN) {
+ if (fmtp->ch == 0)
+ continue;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_MONO &&
+ fmtp->ch != 1)
+ continue;
+
+ if (mapp->acd.acd_type == AUDIO_CTRL_TYPE_STEREO &&
+ fmtp->ch != 2)
+ continue;
+ }
+
+ ctrlp = ashim_ctrl_alloc();
+
+ if (ashim_ctrl_init(statep, ctrlp, mapp)) {
+ ashim_ctrl_free(ctrlp);
+ continue;
+ }
+
+ if (ashim_ctrl_test(statep, ctrlp)) {
+ dinfo("%s: control %s tested invalid, ignoring\n",
+ statep->dstr, ctrlp->acd.acd_name);
+
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ continue;
+ }
+
+ af_ctrlp = audio_dev_add_control(statep->af_devp, &ctrlp->acd,
+ mapp->af_rd, mapp->af_wr, (void *)ctrlp);
+
+ if (af_ctrlp == NULL) {
+ audio_dev_warn(statep->af_devp, "failed to add "
+ "control %s", ctrlp->acd.acd_name);
+ ashim_ctrl_fini(ctrlp);
+ ashim_ctrl_free(ctrlp);
+ goto OUT;
+ }
+
+ dinfo("%s: added control %s, type: %d, "
+ "flags: 0x%x, min: 0x%llx, max: 0x%llx, default: 0x%llx\n",
+ statep->dstr, ctrlp->acd.acd_name, ctrlp->acd.acd_type,
+ ctrlp->acd.acd_flags,
+ ctrlp->acd.acd_minvalue, ctrlp->acd.acd_maxvalue,
+ ctrlp->defval);
+
+ ctrlp->af_ctrlp = af_ctrlp;
+ ashim_ctrl_insert(statep, ctrlp);
+ }
+
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ ashim_rem_controls(statep);
+ return (rv);
+}
+
+
+/*
+ * **************************************************************************
+ * replacements for SADA framework interfaces
+ */
+
+void *
+audio_sup_get_private(audiohdl_t handle)
+{
+ return (AUDIO_HDL2SHIMST(handle)->private);
+}
+
+
+void
+audio_sup_set_private(audiohdl_t handle, void *private)
+{
+ AUDIO_HDL2SHIMST(handle)->private = private;
+}
+
+
+int
+audio_sup_unregister(audiohdl_t handle)
+{
+ ashim_state_t *statep;
+
+ if (handle == NULL)
+ return (AUDIO_SUCCESS);
+
+ statep = AUDIO_HDL2SHIMST(handle);
+
+ kmem_free(statep, sizeof (*statep));
+ return (AUDIO_SUCCESS);
+}
+
+
+audiohdl_t
+audio_sup_register(dev_info_t *dip)
+{
+ ashim_state_t *statep = NULL;
+ int inst;
+ const char *nm;
+
+ statep = kmem_zalloc(sizeof (*statep), KM_SLEEP);
+ statep->dip = dip;
+
+ inst = ddi_get_instance(dip);
+ nm = ddi_driver_name(dip);
+
+ (void) snprintf(statep->dstr, sizeof (statep->dstr),
+ "%s#%d", nm, inst);
+
+ return (AUDIO_SHIMST2HDL(statep));
+}
+
+
+int
+am_unregister(audiohdl_t handle)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+
+ if (statep->af_devp == NULL)
+ return (AUDIO_SUCCESS);
+
+ if (statep->flags & AF_REGISTERED) {
+ if (audio_dev_unregister(statep->af_devp) != DDI_SUCCESS) {
+ dwarn("%s: am_unregister: audio_dev_unregister() "
+ "failed\n", statep->dstr);
+
+ return (AUDIO_FAILURE);
+ }
+ statep->flags &= ~AF_REGISTERED;
+ }
+
+ return (AUDIO_SUCCESS);
+}
+
+
+/*ARGSUSED*/
+int
+am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ int i;
+
+ if (statep == NULL)
+ return (AUDIO_SUCCESS);
+
+ if (statep->af_devp == NULL)
+ return (AUDIO_SUCCESS);
+
+ if ((statep->flags & AF_REGISTERED) &&
+ audio_dev_unregister(statep->af_devp) != DDI_SUCCESS) {
+ dwarn("%s: am_detach: audio_dev_unregister() failed\n",
+ statep->dstr);
+ return (AUDIO_FAILURE);
+ }
+ statep->flags &= ~AF_REGISTERED;
+
+ for (i = 0; i < statep->engcnt; i++)
+ ashim_rem_eng(statep, &statep->engines[i]);
+
+ if (statep->controls != NULL)
+ ashim_rem_controls(statep);
+
+ audio_dev_free(statep->af_devp);
+ statep->af_devp = NULL;
+
+ return (AUDIO_SUCCESS);
+}
+
+
+int
+am_attach(audiohdl_t handle, ddi_attach_cmd_t cmd,
+ am_ad_info_t *ad_infop)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ audio_dev_t *af_devp;
+ int ad_feat = ad_infop->ad_defaults->hw_features;
+ int rv = AUDIO_FAILURE;
+
+ if (cmd != DDI_ATTACH)
+ return (AUDIO_FAILURE);
+
+ af_devp = audio_dev_alloc(statep->dip, 0);
+ audio_dev_set_description(af_devp, ad_infop->ad_dev_info->name);
+ audio_dev_set_version(af_devp, ad_infop->ad_dev_info->version);
+
+ statep->af_devp = af_devp;
+ statep->ad_infop = ad_infop;
+
+ /*
+ * setup the engines
+ */
+ statep->engcnt = 0;
+
+ /*
+ * If the device supports both play and record we require duplex
+ * functionality. However, there are no known simplex SADA devices.
+ * In this case we limit the device to play only.
+ */
+ if ((ad_feat & AUDIO_HWFEATURE_PLAY) &&
+ (ad_feat & AUDIO_HWFEATURE_RECORD) &&
+ !(ad_feat & AUDIO_HWFEATURE_DUPLEX)) {
+ audio_dev_warn(af_devp, "missing duplex feature "
+ "required for record");
+
+ ad_feat &= ~AUDIO_HWFEATURE_RECORD;
+ ad_infop->ad_defaults->hw_features = ad_feat;
+ }
+
+ if (ad_feat & AUDIO_HWFEATURE_PLAY) {
+ if (ashim_add_eng(statep, AUDIO_PLAY) != AUDIO_SUCCESS)
+ goto OUT;
+ }
+ if (ad_feat & AUDIO_HWFEATURE_RECORD) {
+ if (ashim_add_eng(statep, AUDIO_RECORD) != AUDIO_SUCCESS)
+ goto OUT;
+ }
+
+ if (ashim_add_controls(statep) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (ashim_ctrl_set_defaults(statep) != AUDIO_SUCCESS)
+ goto OUT;
+
+ if (audio_dev_register(af_devp) != DDI_SUCCESS) {
+ audio_dev_warn(af_devp, "audio_dev_register() failed");
+ goto OUT;
+ }
+ statep->flags |= AF_REGISTERED;
+
+ rv = AUDIO_SUCCESS;
+
+OUT:
+ if (rv != AUDIO_SUCCESS)
+ (void) am_detach(handle, DDI_DETACH);
+ return (rv);
+}
+
+
+int
+am_get_audio(audiohdl_t handle, void *buf, int samples)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp = ASHIM_GET_ENG(statep, ASHIM_ENG_PLAY);
+ unsigned reqframes = samples >> engp->frsmshift;
+ unsigned frames;
+ unsigned i;
+ size_t sz;
+ int bufcnt = 0;
+ caddr_t bp = buf;
+
+ mutex_enter(&engp->lock);
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, reqframes, -1);
+
+ if (!(engp->flags & ENG_STARTED)) {
+ ddtl("%s - am_get_audio: stop in progress, ignoring\n",
+ statep->dstr);
+ mutex_exit(&engp->lock);
+ return (0);
+ }
+ mutex_exit(&engp->lock);
+
+ /* break requests from the driver into fragment sized chunks */
+ for (i = 0; i < reqframes; i += frames) {
+ mutex_enter(&engp->lock);
+
+ frames = reqframes - i;
+ if (frames > engp->fragfr)
+ frames = engp->fragfr;
+
+ sz = (frames << engp->frsmshift) << engp->smszshift;
+
+ if (ashim_dump_counters_len) {
+ ashim_dump_counters(engp, frames, bufcnt);
+ }
+ bufcnt++;
+
+ /* must move data before updating framework */
+ ashim_eng_bufio(engp, bp, sz);
+ engp->frames += frames;
+ bp += sz;
+
+ mutex_exit(&engp->lock);
+ audio_engine_consume(engp->af_engp);
+ }
+
+ mutex_enter(&engp->lock);
+ engp->io_count++;
+ mutex_exit(&engp->lock);
+
+ return (samples);
+}
+
+
+void
+am_play_shutdown(audiohdl_t handle)
+{
+
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+
+ ad_entry->ad_stop_play(handle);
+
+ /*
+ * XXX
+ * used to notify framework that device's engine has stopped
+ */
+}
+
+
+void
+am_send_audio(audiohdl_t handle, void *buf, int samples)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp = ASHIM_GET_ENG(statep, ASHIM_ENG_REC);
+ unsigned reqframes = samples >> engp->frsmshift;
+ unsigned frames;
+ unsigned i;
+ size_t sz;
+ int bufcnt = 0;
+ caddr_t bp = buf;
+
+ mutex_enter(&engp->lock);
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, reqframes, -1);
+
+ if (!(engp->flags & ENG_STARTED)) {
+ ddtl("%s - am_send_audio: stop in progress, ignoring\n",
+ statep->dstr);
+
+ mutex_exit(&engp->lock);
+ return;
+ }
+ mutex_exit(&engp->lock);
+
+ /* break requests from the driver into fragment sized chunks */
+ for (i = 0; i < reqframes; i += frames) {
+ mutex_enter(&engp->lock);
+
+ frames = reqframes - i;
+ if (frames > engp->fragfr)
+ frames = engp->fragfr;
+
+ sz = (frames << engp->frsmshift) << engp->smszshift;
+
+ if (ashim_dump_counters_len)
+ ashim_dump_counters(engp, frames, bufcnt);
+ bufcnt++;
+
+ /* must move data before updating framework */
+ ashim_eng_bufio(engp, bp, sz);
+ engp->frames += frames;
+ bp += sz;
+
+ mutex_exit(&engp->lock);
+ audio_engine_produce(engp->af_engp);
+ }
+
+ mutex_enter(&engp->lock);
+ engp->io_count++;
+ mutex_exit(&engp->lock);
+}
+
+void
+audio_sup_restore_state(audiohdl_t handle)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_eng_t *engp;
+ int i;
+ int start = 0;
+
+ (void) ashim_ctrl_restore(statep);
+
+ for (i = 0; i < statep->engcnt; i++) {
+ engp = &statep->engines[i];
+
+ mutex_enter(&engp->lock);
+ start = (engp->flags & ENG_STARTED);
+ mutex_exit(&engp->lock);
+
+ if (start)
+ (void) ashim_eng_start(engp);
+ }
+}
+
+
+/*
+ * **************************************************************************
+ * audio framework engine callbacks
+ */
+
+/*ARGSUSED*/
+static int
+ashim_af_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ ashim_state_t *statep = engp->statep;
+ int rv = EIO;
+ int dir = ASHIM_ENG_DIR(engp);
+
+
+ if (usb_ac_open(statep->dip) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "usb_ac_open failed");
+ return (EIO);
+ }
+
+ mutex_enter(&engp->lock);
+
+ if (ashim_set_fmt(statep, dir, &engp->fmt) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "set format failed");
+ goto OUT;
+ }
+
+ engp->intrate = (engp->af_eflags & ENGINE_OUTPUT_CAP) ?
+ statep->ad_infop->ad_play.ad_int_rate :
+ statep->ad_infop->ad_record.ad_int_rate;
+
+ engp->sampsz = engp->fmt.prec / 8;
+ engp->framesz = engp->sampsz * engp->fmt.ch;
+
+ if (engp->fmt.ch > 2) {
+ audio_dev_warn(statep->af_devp, "unsupported ",
+ "channel count: %u", engp->fmt.ch);
+ goto OUT;
+ }
+ if (engp->fmt.prec > 16) {
+ audio_dev_warn(statep->af_devp, "unsupported ",
+ "precision: %u", engp->fmt.prec);
+ goto OUT;
+ }
+
+ engp->frsmshift = engp->fmt.ch / 2;
+ engp->smszshift = engp->sampsz / 2;
+
+ /*
+ * In order to match the requested number of samples per interrupt
+ * from SADA drivers when computing the fragment size,
+ * we need to first truncate the floating point result from
+ * sample rate * channels / intr rate
+ * then adjust up to an even number, before multiplying it
+ * with the sample size
+ */
+ engp->fragsz = engp->fmt.sr * engp->fmt.ch / engp->intrate;
+ if (engp->fragsz & 1)
+ engp->fragsz++;
+ engp->fragsz *= engp->sampsz;
+ engp->fragfr = engp->fragsz / engp->framesz;
+
+ if (ashim_use_drvbuf) {
+ engp->bufsz = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ statep->ad_infop->ad_play.ad_bsize :
+ statep->ad_infop->ad_record.ad_bsize;
+
+ engp->nfrags = engp->bufsz / engp->fragsz;
+
+ /* adjust buf size to frag boundary */
+ if (engp->nfrags * engp->fragsz < engp->bufsz)
+ engp->nfrags++;
+
+ engp->bufsz = engp->nfrags * engp->fragsz;
+ } else {
+ if (ashim_bufscale < ASHIM_BUFSCALE_MIN ||
+ ashim_bufscale > ASHIM_BUFSCALE_MAX)
+ engp->nfrags = ASHIM_BUFSCALE_DEF;
+ else
+ engp->nfrags = ashim_bufscale;
+ engp->bufsz = engp->fragsz * engp->nfrags;
+ }
+
+ engp->bufp = kmem_zalloc(engp->bufsz, KM_SLEEP);
+ engp->bufpos = engp->bufp;
+ engp->bufendp = engp->bufp + engp->bufsz;
+ engp->frames = 0;
+ engp->io_count = 0;
+ engp->bufio_count = 0;
+
+ *fragfrp = engp->fragfr;
+ *nfragsp = engp->nfrags;
+ *bufp = engp->bufp;
+
+ if (ashim_ad_setup(statep, dir) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "device setup failed");
+ goto OUT;
+ }
+ statep->flags |= AD_SETUP;
+
+ rv = 0;
+
+ dinfo("%s - %s: "
+ "frames per frag: %u, frags in buffer: %u, frag size: %u, "
+ "intr rate: %u, buffer size: %u, buffer: 0x%p - 0x%p\n",
+ statep->dstr, engp->name,
+ *fragfrp, *nfragsp, engp->fragsz,
+ engp->intrate, engp->bufsz, *bufp, engp->bufendp);
+
+OUT:
+ mutex_exit(&engp->lock);
+ if (rv != 0)
+ ashim_af_close(arg);
+
+ return (rv);
+}
+
+
+static void
+ashim_af_close(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ ashim_state_t *statep = engp->statep;
+
+ mutex_enter(&engp->lock);
+
+ if (statep->flags & AD_SETUP) {
+ ashim_ad_teardown(statep, ASHIM_ENG_DIR(engp));
+ statep->flags &= ~AD_SETUP;
+ }
+
+ if (engp->bufp != NULL) {
+ kmem_free(engp->bufp, engp->bufsz);
+ engp->bufp = NULL;
+ engp->bufpos = NULL;
+ engp->bufendp = NULL;
+ }
+
+ ashim_prtstats(engp);
+ mutex_exit(&engp->lock);
+
+ usb_ac_close(statep->dip);
+}
+
+
+static int
+ashim_eng_start(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+ int (*start)(audiohdl_t);
+ int rv = 0;
+
+ start = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ ad_entry->ad_start_play : ad_entry->ad_start_record;
+
+ dinfo("%s: starting device %s engine\n", statep->dstr, engp->name);
+
+ if ((*start)(AUDIO_SHIMST2HDL(statep)) != AUDIO_SUCCESS) {
+ audio_dev_warn(statep->af_devp, "failed to start %s engine",
+ engp->name);
+ rv = EIO;
+ }
+
+ return (rv);
+}
+
+
+static void
+ashim_eng_stop(ashim_eng_t *engp)
+{
+ ashim_state_t *statep = engp->statep;
+ am_ad_entry_t *ad_entry = statep->ad_infop->ad_entry;
+ void (*stop)(audiohdl_t);
+
+ stop = ((engp)->af_eflags & ENGINE_OUTPUT_CAP) ?
+ ad_entry->ad_stop_play : ad_entry->ad_stop_record;
+
+ dinfo("%s: stopping device %s engine\n", statep->dstr, engp->name);
+
+ (*stop)(AUDIO_SHIMST2HDL(statep));
+}
+
+
+static int
+ashim_af_start(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+ int rv = EIO;
+
+ if (ashim_eng_disable)
+ return (rv);
+
+ mutex_enter(&engp->lock);
+ engp->flags |= ENG_STARTED;
+ mutex_exit(&engp->lock);
+
+ rv = ashim_eng_start(engp);
+
+ return (rv);
+}
+
+
+static void
+ashim_af_stop(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+
+ mutex_enter(&engp->lock);
+ engp->flags &= ~ENG_STARTED;
+ mutex_exit(&engp->lock);
+
+ ashim_eng_stop(engp);
+}
+
+
+static uint64_t
+ashim_af_count(void *arg)
+{
+ ashim_eng_t *engp = arg;
+ uint64_t val;
+
+ mutex_enter(&engp->lock);
+ val = engp->frames;
+ mutex_exit(&engp->lock);
+
+ return (val);
+}
+
+
+static int
+ashim_af_format(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->af_fmt);
+}
+
+static int
+ashim_af_channels(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->fmt.ch);
+}
+
+
+static int
+ashim_af_rate(void *arg)
+{
+ ashim_eng_t *engp = arg;
+
+ return (engp->fmt.sr);
+}
+
+
+/*ARGSUSED*/
+static void
+ashim_af_sync(void *arg, unsigned nframes)
+{
+ /*
+ * drivers will call ddi_dma_sync() themselves after requesting data
+ * on playback and before sending data on record through the shim
+ */
+}
+
+
+static size_t
+ashim_af_qlen(void *arg)
+{
+ ashim_eng_t *engp = (ashim_eng_t *)arg;
+
+ return (engp->fragfr);
+}
+
+
+/*
+ * **************************************************************************
+ * interfaces used by USB audio
+ */
+
+/*ARGSUSED*/
+int
+am_hw_state_change(audiohdl_t handle, int cmd, int dir, int value,
+ int sleep)
+{
+ ashim_state_t *statep = AUDIO_HDL2SHIMST(handle);
+ ashim_ctrl_t *ctrlp;
+ uint64_t cval = 0;
+ int64_t left, right, delta = 0;
+ int dcmd = AM_SET_GAIN;
+
+ /* only known HWSC command used */
+ if (cmd != AM_HWSC_SET_GAIN_DELTA) {
+ audio_dev_warn(statep->af_devp, "invalid HW state change "
+ "command recieved");
+ return (AUDIO_FAILURE);
+ }
+
+ ctrlp = ashim_find_ctrl_dcmd(statep, dcmd, dir);
+ if (ctrlp == NULL) {
+ audio_dev_warn(statep->af_devp, "driver control command %d "
+ "not found for HW state change command %d", dcmd, cmd);
+ return (AUDIO_FAILURE);
+ }
+
+ mutex_enter(&ctrlp->lock);
+
+ delta = D2F_GAIN(value);
+ left = AUDIO_CTRL_STEREO_LEFT(ctrlp->cval) + delta;
+ right = AUDIO_CTRL_STEREO_RIGHT(ctrlp->cval) + delta;
+
+ if (left > AF_MAX_GAIN)
+ left = AF_MAX_GAIN;
+ if (right > AF_MAX_GAIN)
+ right = AF_MAX_GAIN;
+
+ if (left < AF_MIN_GAIN)
+ left = AF_MIN_GAIN;
+ if (right < AF_MIN_GAIN)
+ right = AF_MIN_GAIN;
+
+ cval = AUDIO_CTRL_STEREO_VAL(left, right);
+ mutex_exit(&ctrlp->lock);
+
+ if (audio_control_write(ctrlp->af_ctrlp, cval)) {
+ audio_dev_warn(statep->af_devp, "updating "
+ "control %s to value 0x%llx by driver failed",
+ ctrlp->acd.acd_name, (long long unsigned)cval);
+ return (AUDIO_FAILURE);
+ }
+ return (AUDIO_SUCCESS);
+}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h
new file mode 100644
index 0000000000..3ec22cda37
--- /dev/null
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/audio_shim.h
@@ -0,0 +1,161 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+#ifndef _AUDIO_SHIM_H
+#define _AUDIO_SHIM_H
+
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio.h>
+#include <sys/audio/audio_support.h>
+#include <sys/mixer.h>
+#include <sys/audio/audio_mixer.h>
+
+#include <sys/audio/audio_driver.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {DBG_WARN = 1, DBG_INFO, DBG_DETAIL} debug_level_t;
+
+void vdprint(debug_level_t lvl, const char *fmt, va_list adx);
+void dprint(debug_level_t lvl, const char *fmt, ...);
+void dwarn(const char *fmt, ...);
+void dinfo(const char *fmt, ...);
+void ddtl(const char *fmt, ...);
+
+
+int am_unregister(audiohdl_t handle);
+
+#define CTRL_MUTED 0x1 /* muted output gain */
+
+#define TQ_NM_MAX 64
+#define DSTR_MAX 64
+
+typedef struct ashim_config_arg ashim_config_arg_t;
+typedef struct ashim_ctrl ashim_ctrl_t;
+typedef struct ashim_fmt ashim_fmt_t;
+typedef struct ashim_eng ashim_eng_t;
+typedef struct ashim_state ashim_state_t;
+
+struct ashim_config_arg {
+ int cmd;
+ int dir;
+ int arg1;
+ int arg2;
+};
+
+struct ashim_ctrl {
+ int dcmd; /* SADA command */
+ int dir; /* play or record */
+ audio_ctrl_desc_t acd; /* description */
+ audio_ctrl_t *af_ctrlp; /* framework handle */
+ uint64_t cval; /* current control value */
+ uint64_t defval; /* default control value */
+ audio_ctrl_wr_t af_wr; /* write callback */
+
+ int flags; /* CTRL_XXX flags */
+ kmutex_t lock;
+
+ ashim_state_t *statep;
+ ashim_ctrl_t *nextp;
+};
+
+struct ashim_fmt {
+ int sr; /* sample rate */
+ uint_t ch; /* channels */
+ uint_t prec; /* precision */
+ uint_t enc; /* encoding */
+};
+
+struct ashim_eng {
+ ashim_state_t *statep;
+ audio_engine_t *af_engp;
+ int af_eflags; /* ENGINE_* flags */
+ int af_fmt; /* AUDIO_FORMAT_* flags */
+ ashim_fmt_t fmt;
+
+ unsigned intrate; /* interrupt rate */
+ unsigned sampsz; /* sample size */
+ unsigned framesz; /* frame size */
+ unsigned fragsz; /* fragment size */
+ unsigned nfrags; /* number of fragments in buffer */
+ unsigned fragfr; /* number of frames per fragment */
+ unsigned frsmshift; /* right shift: frames in sample cnt */
+ unsigned smszshift; /* left shift: sample cnt * sampsz */
+
+ caddr_t bufp; /* I/O buf; framework to/from drv */
+ unsigned bufsz; /* buffer size */
+ caddr_t bufpos; /* buffer position */
+ caddr_t bufendp; /* end of buffer */
+
+ audio_prinfo_t *prinfop; /* SADA ad_defaults play/record */
+
+ uint64_t frames; /* total frames processed since open */
+ uint64_t io_count; /* i/o requests from the driver */
+ uint64_t bufio_count; /* i/o requests to the framework */
+ char *name;
+
+#define ENG_STARTED 0x1
+#define ENG_ENABLED 0x10
+ int flags;
+
+ kmutex_t lock;
+};
+
+struct ashim_state {
+ dev_info_t *dip;
+ void *private; /* private audio driver data */
+ audio_dev_t *af_devp;
+ am_ad_info_t *ad_infop;
+
+#define ASHIM_ENG_MAX 2
+ ashim_eng_t engines[ASHIM_ENG_MAX];
+ int engcnt;
+
+ ashim_ctrl_t *controls;
+
+ char *devnm;
+ char dstr[DSTR_MAX];
+
+#define AF_REGISTERED 0x1
+#define AD_SETUP 0x10
+ int flags;
+};
+
+/*
+ * Macros used to convert between audio handles and the shim state structure.
+ */
+#define AUDIO_HDL2SHIMST(hdl) ((ashim_state_t *)(hdl))
+#define AUDIO_SHIMST2HDL(statep) ((audiohdl_t)(statep))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _AUDIO_SHIM_H */
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
index a26ba4b87b..57e9c3c0bd 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.c
@@ -23,13 +23,19 @@
* Use is subject to license terms.
*/
-
/*
- * AUDIO CONTROL Driver: usb_ac is a streams multiplexor that sits
- * on top of usb_as and hid and is responsible for
- * (1) providing the entry points to audio mixer framework, (2) passing
- * streams messages to and from usb_as and hid and (3) processing
- * control messages that it can handle.
+ * AUDIO CONTROL Driver:
+ * This driver is derived from the legacy SADA streams-based usb_ac driver
+ * and serves as an intermediate measure before the full conversion to the
+ * to the Boomer framework in a follow-on phase of the Boomer project, which
+ * will utilize more comprehensive USB audio features as well. Multiplexor
+ * plumbing functionality that used to be in the usb_ac_dacf DACF module is
+ * now located here.
+ *
+ * usb_ac is a multiplexor that sits on top of usb_as and hid and is
+ * responsible for (1) providing the entry points to audio mixer framework,
+ * (2) passing control commands to and from usb_as and hid and (3) processing
+ * control messages from hid/usb_ah that it can handle.
*
* 1. Mixer entry points are: usb_ac_setup(), usb_ac_teardown(),
* usb_ac_set_config(), usb_ac_set_format(), usb_ac_start_play(),
@@ -43,10 +49,8 @@
* of sound control interface of the audio device in a synchronous
* manner.
*
- * Serialization: usb_ac being a streams driver and having the requirement
- * of making non-blockings calls (USBA or streams or mixer) needs to drop
- * mutexes over such calls. But at the same time, a competing thread
- * can't be allowed to interfere with (1) pipe, (2) streams state.
+ * Serialization: A competing thread can't be allowed to interfere with
+ * (1) pipe, (2) streams state.
* So we need some kind of serialization among the asynchronous
* threads that can run in the driver. The serialization is mostly
* needed to avoid races among open/close/events/power entry points
@@ -58,9 +62,6 @@
* PM model in usb_ac: Raise power during attach. If a device is not at full
* power, raise power in the entry points. After the command is over,
* pm_idle_component() is called. The power is lowered in detach().
- *
- * locking: Warlock is not aware of the automatic locking mechanisms for
- * streams drivers.
*/
#include <sys/usb/usba/usbai_version.h>
#include <sys/usb/usba.h>
@@ -69,11 +70,12 @@
#include <sys/ndi_impldefs.h>
#include <sys/strsubr.h>
#include <sys/strsun.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/sunldi.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
@@ -81,18 +83,22 @@
#include <sys/usb/clients/audio/usb_mixer.h>
#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
+/* for getting the minor node info from hid */
+#include <sys/usb/clients/hid/hidminor.h>
+#include <sys/usb/clients/audio/usb_as/usb_as.h>
+
+#include "audio_shim.h"
+
/* debug support */
uint_t usb_ac_errlevel = USB_LOG_L4;
uint_t usb_ac_errmask = (uint_t)-1;
uint_t usb_ac_instance_debug = (uint_t)-1;
-#ifdef DEBUG
/*
- * tunable timeout for usb_as response, allow at least 10 secs for control
- * cmd to timeout
+ * wait period in seconds for the HID message processing thread
+ * used primarily to check when the stream has closed
*/
-int usb_ac_wait_timeout = 10000000;
-#endif
+uint_t usb_ac_wait_hid = 1;
/*
* table for converting term types of input and output terminals
@@ -143,28 +149,19 @@ static struct {
/*
* Module linkage routines for the kernel
*/
-static int usb_ac_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
static int usb_ac_attach(dev_info_t *, ddi_attach_cmd_t);
static int usb_ac_detach(dev_info_t *, ddi_detach_cmd_t);
static int usb_ac_power(dev_info_t *, int, int);
-/*
- * STREAMS module entry points
- */
-static int usb_ac_open(queue_t *, dev_t *, int, int, cred_t *);
-static int usb_ac_close(queue_t *, int, cred_t *);
-static int usb_ac_uwput(queue_t *, mblk_t *);
-static int usb_ac_lrput(queue_t *, mblk_t *);
-
/* plumbing */
static usb_ac_plumbed_t *usb_ac_get_plumb_info(usb_ac_state_t *, char *,
uchar_t);
-static usb_ac_plumbed_t *usb_ac_get_plumb_info_from_lrq(usb_ac_state_t *,
- queue_t *);
static uint_t usb_ac_get_featureID(usb_ac_state_t *, uchar_t, uint_t,
uint_t);
-static void usb_ac_plumb_ioctl(queue_t *, mblk_t *);
+/* module entry points */
+int usb_ac_open(dev_info_t *);
+void usb_ac_close(dev_info_t *);
/* registration */
static int usb_ac_get_curr_n_channels(usb_ac_state_t *, int);
@@ -246,36 +243,52 @@ static int usb_ac_set_mute(usb_ac_state_t *, uint_t, uint_t,
static int usb_ac_set_volume(usb_ac_state_t *, uint_t, short, int dir,
int);
static int usb_ac_get_maxmin_volume(usb_ac_state_t *, uint_t, int, int,
- int);
-static void usb_ac_free_mblk(mblk_t *);
-static mblk_t *usb_ac_allocate_req_mblk(usb_ac_state_t *, int,
- void *, uint_t);
+ int, short *);
static int usb_ac_send_as_cmd(usb_ac_state_t *, usb_ac_plumbed_t *,
int, void *);
-static int usb_ac_send_format_cmd(audiohdl_t, int, int, int,
- int, int, int);
-static int usb_ac_do_setup(audiohdl_t, int, int);
-static void usb_ac_do_teardown(audiohdl_t, int, int);
-static void usb_ac_do_pause_play(audiohdl_t, int);
-static void usb_ac_do_stop_record(audiohdl_t, int);
+static int usb_ac_send_format_cmd(audiohdl_t, int, int, int, int, int);
+static int usb_ac_do_setup(audiohdl_t, int);
+static void usb_ac_do_teardown(audiohdl_t, int);
+static void usb_ac_do_stop_play(audiohdl_t);
+static void usb_ac_do_stop_record(audiohdl_t);
/* Mixer entry points */
-static int usb_ac_setup(audiohdl_t, int, int);
-static void usb_ac_teardown(audiohdl_t, int, int);
-static int usb_ac_set_config(audiohdl_t, int, int, int, int, int);
-static int usb_ac_set_format(audiohdl_t, int, int, int, int, int, int);
-static int usb_ac_start_play(audiohdl_t, int);
-static void usb_ac_pause_play(audiohdl_t, int);
-static void usb_ac_stop_play(audiohdl_t, int);
-static int usb_ac_start_record(audiohdl_t, int);
-static void usb_ac_stop_record(audiohdl_t, int);
+static int usb_ac_setup(audiohdl_t, int);
+static void usb_ac_teardown(audiohdl_t, int);
+static int usb_ac_set_config(audiohdl_t, int, int, int, int);
+static int usb_ac_set_format(audiohdl_t, int, int, int, int, int);
+static int usb_ac_start_play(audiohdl_t);
+static void usb_ac_stop_play(audiohdl_t);
+static int usb_ac_start_record(audiohdl_t);
+static void usb_ac_stop_record(audiohdl_t);
static int usb_ac_restore_audio_state(usb_ac_state_t *, int);
/*
- * External functions
+ * Mux
*/
-extern int space_store(char *key, uintptr_t ptr);
-extern void space_free(char *);
+static int usb_ac_mux_walk_siblings(usb_ac_state_t *);
+static void usb_ac_print_reg_data(usb_ac_state_t *,
+ usb_as_registration_t *);
+static int usb_ac_get_reg_data(usb_ac_state_t *, ldi_handle_t, int);
+static int usb_ac_setup_plumbed(usb_ac_state_t *, int, int, int);
+static int usb_ac_mixer_registration(usb_ac_state_t *);
+static void usb_ac_hold_siblings(usb_ac_state_t *);
+static int usb_ac_online_siblings(usb_ac_state_t *);
+static void usb_ac_rele_siblings(usb_ac_state_t *);
+static int usb_ac_mux_plumbing(usb_ac_state_t *);
+static void usb_ac_mux_plumbing_tq(void *);
+static int usb_ac_mux_unplumbing(usb_ac_state_t *);
+static void usb_ac_mux_unplumbing_tq(void *);
+static int usb_ac_plumb(usb_ac_plumbed_t *);
+static void usb_ac_unplumb(usb_ac_plumbed_t *);
+static void usb_ac_reader(void *);
+static int usb_ac_read_msg(usb_ac_plumbed_t *, mblk_t *);
+static int usb_ac_do_plumbing(usb_ac_state_t *);
+static int usb_ac_do_unplumbing(usb_ac_state_t *);
+
+/* just generic, USB Audio, 1.0 spec-compliant */
+static audio_device_t usb_dev_info =
+ { {"USB Audio"}, {"1.0"}, {"external"} };
/*
@@ -287,120 +300,30 @@ static am_ad_entry_t usb_ac_entry = {
usb_ac_set_config, /* ad_set_config() */
usb_ac_set_format, /* ad_set_format() */
usb_ac_start_play, /* ad_start_play() */
- usb_ac_pause_play, /* ad_pause_play() */
usb_ac_stop_play, /* ad_stop_play() */
usb_ac_start_record, /* ad_start_record() */
usb_ac_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
};
/* anchor for soft state structures */
-static void *usb_ac_statep;
-
-/* for passing soft state etc. to usb_ac_dacf module */
-static usb_ac_state_space_t ssp;
-
-/* STREAMS driver id and limit value structure */
-static struct module_info usb_ac_modinfo = {
- 0xffff, /* module ID number */
- "usb_ac", /* module name */
- USB_AUDIO_MIN_PKTSZ, /* minimum packet size */
- USB_AUDIO_MAX_PKTSZ, /* maximum packet size */
- USB_AC_HIWATER, /* high water mark */
- USB_AC_LOWATER /* low water mark */
-};
+void *usb_ac_statep;
-/* STREAMS queue processing procedures structures */
-/* upper read queue */
-static struct qinit usb_ac_urqueue = {
- NULL, /* put procedure */
- NULL, /* service procedure */
- usb_ac_open, /* open procedure */
- usb_ac_close, /* close procedure */
- NULL, /* unused */
- &usb_ac_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* upper write queue */
-static struct qinit usb_ac_uwqueue = {
- usb_ac_uwput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &usb_ac_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* lower read queue */
-static struct qinit usb_ac_lrqueue = {
- usb_ac_lrput,
- NULL,
- NULL,
- NULL,
- NULL,
- &usb_ac_modinfo, /* module parameters */
- NULL
-};
-
-/* lower write queue */
-static struct qinit usb_ac_lwqueue = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- &usb_ac_modinfo, /* module parameters */
- NULL
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab usb_ac_str_info = {
- &usb_ac_urqueue, /* upper read queue */
- &usb_ac_uwqueue, /* upper write queue */
- &usb_ac_lrqueue, /* lower read queue */
- &usb_ac_lwqueue, /* lower write queue */
-};
/*
* DDI Structures
- *
- * Entry points structure
*/
-static struct cb_ops usb_ac_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &usb_ac_str_info, /* cb_str */
- D_MP | D_MTPERQ, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
/* Device operations structure */
static struct dev_ops usb_ac_dev_ops = {
DEVO_REV, /* devo_rev */
0, /* devo_refcnt */
- usb_ac_getinfo, /* devo_getinfo */
+ NULL, /* devo_getinfo */
nulldev, /* devo_identify - obsolete */
nulldev, /* devo_probe - not needed */
usb_ac_attach, /* devo_attach */
usb_ac_detach, /* devo_detach */
nodev, /* devo_reset */
- &usb_ac_cb_ops, /* devi_cb_ops */
+ NULL, /* devi_cb_ops */
NULL, /* devo_busb_ac_ops */
usb_ac_power, /* devo_power */
ddi_quiesce_not_needed, /* devo_quiesce */
@@ -420,12 +343,6 @@ static struct modlinkage usb_ac_modlinkage = {
NULL /* NULL terminates the list */
};
-/* warlock directives */
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", datab))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("unique per call", queue))
-_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_pipe_policy_t))
/* standard entry points */
int
@@ -439,19 +356,11 @@ _init(void)
return (rval);
}
+ audio_init_ops(&usb_ac_dev_ops, "usb_ac");
+
if ((rval = mod_install(&usb_ac_modlinkage)) != 0) {
ddi_soft_state_fini(&usb_ac_statep);
- }
-
- if (!rval) {
- ssp.sp = usb_ac_statep;
- ssp.restore_func = usb_ac_restore_audio_state;
- ssp.get_featureID_func = usb_ac_get_featureID;
- ssp.ac_entryp = &usb_ac_entry;
- ssp.pm_busy_component = usb_ac_pm_busy_component;
- ssp.pm_idle_component = usb_ac_pm_idle_component;
-
- rval = space_store("usb_ac", (uintptr_t)&ssp);
+ audio_fini_ops(&usb_ac_dev_ops);
}
return (rval);
@@ -466,7 +375,7 @@ _fini(void)
if ((rval = mod_remove(&usb_ac_modlinkage)) == 0) {
/* Free the soft state internal structures */
ddi_soft_state_fini(&usb_ac_statep);
- space_free("usb_ac");
+ audio_fini_ops(&usb_ac_dev_ops);
}
return (rval);
@@ -479,39 +388,6 @@ _info(struct modinfo *modinfop)
return (mod_info(&usb_ac_modlinkage, modinfop));
}
-/*ARGSUSED*/
-static int
-usb_ac_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- usb_ac_state_t *uacp = NULL;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((uacp = ddi_get_soft_state(usb_ac_statep,
- instance)) != NULL) {
- *result = uacp->usb_ac_dip;
- if (*result != NULL) {
- error = DDI_SUCCESS;
- }
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
extern uint_t nproc;
#define INIT_PROCESS_CNT 3
@@ -520,11 +396,7 @@ static int
usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
usb_ac_state_t *uacp = NULL;
- audio_sup_reg_data_t reg_data;
int instance = ddi_get_instance(dip);
- int minor;
- char *key;
- size_t key_len, len;
switch (cmd) {
case DDI_ATTACH:
@@ -580,6 +452,9 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uacp->usb_ac_instance = instance;
uacp->usb_ac_dip = dip;
+ (void) snprintf(uacp->dstr, sizeof (uacp->dstr), "%s#%d",
+ ddi_driver_name(dip), instance);
+
if (usb_client_attach(dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
"usb_client_attach failed");
@@ -608,46 +483,7 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uacp->usb_ac_default_ph = uacp->usb_ac_dev_data->dev_default_ph;
- /* register with audiosup */
- reg_data.asrd_version = AUDIOSUP_VERSION;
-
- /*
- * we register with pathname, the mgf, product, and serial number
- * strings, vid.pid, and driver name which should be pretty unique
- */
- key_len = 2 * MAXNAMELEN;
- if (uacp->usb_ac_dev_data->dev_mfg) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_mfg);
- }
- if (uacp->usb_ac_dev_data->dev_product) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_product);
- }
- if (uacp->usb_ac_dev_data->dev_serial) {
- key_len += strlen(uacp->usb_ac_dev_data->dev_serial);
- }
-
- key = kmem_alloc(key_len, KM_SLEEP);
- (void) ddi_pathname(dip, key);
-
- len = strlen(key);
- (void) snprintf(&key[len], key_len - len, ",%s,%s,%s,%x.%x,%s",
- (uacp->usb_ac_dev_data->dev_mfg ?
- uacp->usb_ac_dev_data->dev_mfg : "-"),
- (uacp->usb_ac_dev_data->dev_product ?
- uacp->usb_ac_dev_data->dev_product : "-"),
- (uacp->usb_ac_dev_data->dev_serial ?
- uacp->usb_ac_dev_data->dev_serial : "-"),
- uacp->usb_ac_dev_data->dev_descr->idVendor,
- uacp->usb_ac_dev_data->dev_descr->idProduct,
- ddi_driver_name(dip));
-
- reg_data.asrd_key = key;
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "registering with key: %s", key);
-
- uacp->usb_ac_audiohdl = audio_sup_register(dip, &reg_data);
- kmem_free(key, key_len);
+ uacp->usb_ac_audiohdl = audio_sup_register(dip);
if (uacp->usb_ac_audiohdl == NULL) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
@@ -668,28 +504,9 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
/* we no longer need the descr tree */
usb_free_descr_tree(dip, uacp->usb_ac_dev_data);
- /* read .conf file properties */
- uacp->usb_ac_mixer_mode_enable = ddi_prop_get_int(DDI_DEV_T_ANY,
- dip, DDI_PROP_DONTPASS, "mixer-enabled", 1);
-
uacp->usb_ac_ser_acc = usb_init_serialization(dip,
USB_INIT_SER_CHECK_SAME_THREAD);
- /* create minor node */
- minor = audio_sup_construct_minor(uacp->usb_ac_audiohdl, USER1);
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "minor=%d", minor);
-
- if ((ddi_create_minor_node(dip, "mux", S_IFCHR,
- minor, NULL, 0)) != DDI_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_attach: couldn't create minor node mux");
-
- goto fail;
- }
- uacp->usb_ac_mux_minor = minor;
-
mutex_enter(&uacp->usb_ac_mutex);
/* we are online */
@@ -715,17 +532,28 @@ usb_ac_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
goto fail;
}
+ USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
+ "usb_ac_attach: End");
+
/* report device */
ddi_report_dev(dip);
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_attach: End");
+ if (usb_ac_do_plumbing(uacp) != USB_SUCCESS)
+ goto fail;
return (DDI_SUCCESS);
+
fail:
if (uacp) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
"attach failed");
+
+ /* wait for plumbing thread to finish */
+ if (uacp->tqp != NULL) {
+ ddi_taskq_wait(uacp->tqp);
+ ddi_taskq_destroy(uacp->tqp);
+ uacp->tqp = NULL;
+ }
(void) usb_ac_cleanup(dip, uacp);
}
@@ -738,19 +566,67 @@ usb_ac_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
{
int instance = ddi_get_instance(dip);
usb_ac_state_t *uacp;
- int rval;
+ int rval = USB_FAILURE;
+ char *nm = "usb_ac_detach";
uacp = ddi_get_soft_state(usb_ac_statep, instance);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_detach:");
-
switch (cmd) {
case DDI_DETACH:
- rval = usb_ac_cleanup(dip, uacp);
+ dinfo("%s: %s - detaching\n", uacp->dstr, nm);
+
+ /* wait for plumbing thread to finish */
+ if (uacp->tqp != NULL)
+ ddi_taskq_wait(uacp->tqp);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ /* do not allow detach if still busy */
+ if (uacp->usb_ac_busy_count) {
+ dinfo("%s: %s - still busy: %d\n", uacp->dstr, nm,
+ uacp->usb_ac_busy_count);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ return (USB_FAILURE);
+ }
+
+ /*
+ * call am_unregister() to stop calls into our driver from
+ * the framework; can fail if the framework is still busy
+ */
+ if (uacp->usb_ac_audiohdl != NULL) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if (am_unregister(uacp->usb_ac_audiohdl) !=
+ AUDIO_SUCCESS) {
+ dinfo("%s: %s - am_unregister failed, "
+ "framework still busy\n",
+ uacp->dstr, nm);
+
+ return (USB_FAILURE);
+ }
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /*
+ * unplumb to stop activity from other modules, then
+ * cleanup, which will also teardown audio framework state
+ */
+ if (usb_ac_do_unplumbing(uacp) == USB_SUCCESS)
+ rval = usb_ac_cleanup(dip, uacp);
+
+ if (rval != USB_SUCCESS) {
+ USB_DPRINTF_L2(PRINT_MASK_ATTA,
+ uacp->usb_ac_log_handle, "detach failed: %s%d",
+ ddi_driver_name(dip), instance);
+ }
return ((rval == USB_SUCCESS) ? DDI_SUCCESS : DDI_FAILURE);
case DDI_SUSPEND:
+ dinfo("%s: %s - suspending\n", uacp->dstr, nm);
+
rval = usb_ac_cpr_suspend(dip);
return ((rval == USB_SUCCESS) ? DDI_SUCCESS : DDI_FAILURE);
@@ -776,8 +652,7 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
mutex_enter(&uacp->usb_ac_mutex);
uacpm = uacp->usb_ac_pm;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_cleanup: uacpm=0x%p", (void *)uacpm);
+ dinfo("%s: usb_ac_cleanup: uacpm=0x%p\n", uacp->dstr, (void *)uacpm);
ASSERT(uacp->usb_ac_busy_count == 0);
@@ -858,8 +733,6 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
usb_fini_serialization(uacp->usb_ac_ser_acc);
- ddi_remove_minor_node(dip, NULL);
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_cleanup: Ending");
@@ -877,275 +750,79 @@ usb_ac_cleanup(dev_info_t *dip, usb_ac_state_t *uacp)
}
-/*
- * usb_ac_open:
- * Open entry point. Called on the plumbing minor node or
- * audio or audioctl minor nodes which we pass to audio_sup_open()
- * We do not raise power here and wait for the setup callback
- */
-/*ARGSUSED*/
-static int
-usb_ac_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
-{
- int minor = getminor(*devp);
- int instance;
- int rval;
- usb_ac_state_t *uacp;
-
- instance = audio_sup_devt_to_instance(*devp);
-
- uacp = ddi_get_soft_state(usb_ac_statep, instance);
- if (uacp == NULL) {
-
- return (ENXIO);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_busy_count++; /* This will prevent unplumbing */
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: Begin q=0x%p, minor=0x%x instance=%d "
- "open cnt=%d", (void *)q, minor, instance, uacp->usb_ac_busy_count);
-
- if (sflag) {
- USB_DPRINTF_L2(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: clone open not supported");
-
- uacp->usb_ac_busy_count--;
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (ENXIO);
- }
-
- if (minor == uacp->usb_ac_mux_minor) {
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: opening mux");
- /*
- * This is the plumbing open, initiated during attach/
- * connect_event_callback/cpr_resume/first user open.
- */
- uacp->usb_ac_busy_count--;
-
- /* Save the dev_t value of pluming q to use for lower q's */
- uacp->usb_ac_dev = *devp;
- audio_sup_set_qptr(q, *devp, (void *)uacp);
-
- /* Initialize the queue pointers */
- uacp->usb_ac_rq = q;
- uacp->usb_ac_wq = WR(q);
-
- /* release mutex while making streams framework call */
- mutex_exit(&uacp->usb_ac_mutex);
- qprocson(q);
- mutex_enter(&uacp->usb_ac_mutex);
-
- } else if (uacp->usb_ac_plumbing_state != USB_AC_STATE_PLUMBED) {
- uacp->usb_ac_busy_count--;
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (EIO);
- } else {
- /* pass the open to audio_sup_open so SADA can do its work */
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: calling audio_sup_open, q=0x%p, open_cnt=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /*
- * go to full power
- */
- usb_ac_pm_busy_component(uacp);
- (void) pm_raise_power(uacp->usb_ac_dip, 0, USB_DEV_OS_FULL_PWR);
-
- rval = audio_sup_open(q, devp, flag, sflag, credp);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (rval != 0) {
- USB_DPRINTF_L4(PRINT_MASK_OPEN,
- uacp->usb_ac_log_handle,
- "audio_sup_open rval=%d", rval);
-
- uacp->usb_ac_busy_count--;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- usb_ac_pm_idle_component(uacp);
-
- return (rval);
- }
- }
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uacp->usb_ac_log_handle,
- "usb_ac_open: End q=0x%p, open cnt=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (0);
-}
-
-
-/*
- * usb_ac_close :
- * Close entry point
- */
-/*ARGSUSED*/
-static int
-usb_ac_close(queue_t *q, int flag, cred_t *credp)
+int
+usb_ac_open(dev_info_t *dip)
{
- dev_t dev = audio_sup_get_qptr_dev(q);
- int minor = getminor(dev);
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- int rval;
+ int inst = ddi_get_instance(dip);
+ usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, inst);
mutex_enter(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: Begin q=0x%p, opencount=%d",
- (void *)q, uacp->usb_ac_busy_count);
-
- /* closing the mux? */
- if (minor == uacp->usb_ac_mux_minor) {
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: closing mux plumbing stream");
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* Wait till all activity in the default pipe has drained */
- usb_ac_serialize_access(uacp);
- usb_ac_release_access(uacp);
-
- audio_sup_free_qptr(q);
- qprocsoff(q);
-
- return (0);
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- rval = audio_sup_close(q, flag, credp);
-
- if (rval != 0) {
- USB_DPRINTF_L2(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "audio_sup_close fails %d", rval);
-
- return (rval);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- /* normal streams closing */
- ASSERT(uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED);
-
- uacp->usb_ac_busy_count --;
-
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, uacp->usb_ac_log_handle,
- "usb_ac_close: End rval=%d q=0x%p, opencount=%d",
- rval, (void *)q, uacp->usb_ac_busy_count);
+ uacp->usb_ac_busy_count++;
mutex_exit(&uacp->usb_ac_mutex);
- usb_ac_pm_idle_component(uacp);
+ usb_ac_pm_busy_component(uacp);
+ (void) pm_raise_power(uacp->usb_ac_dip, 0, USB_DEV_OS_FULL_PWR);
return (0);
}
-/*
- * usb_ac_uwput:
- * write put entry point for the upper mux. Only PLUMB/UNPLUMB ioctls
- * are processed here. All other ioctls are passed to audio_sup routines
- * for further processing.
- */
-static int
-usb_ac_uwput(queue_t *q, mblk_t *mp)
+void
+usb_ac_close(dev_info_t *dip)
{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- int error = DDI_SUCCESS;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_uwput: q=0x%p, mp=0x%p", (void *)q, (void *)mp);
-
- ASSERT(mp != NULL);
- ASSERT(mp->b_datap != NULL);
+ int inst = ddi_get_instance(dip);
+ usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, inst);
mutex_enter(&uacp->usb_ac_mutex);
- if (uacp->usb_ac_wq == q) {
- ASSERT(mp->b_datap->db_type == M_IOCTL);
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* ioctl from plumbing thread (namely P_LINK) */
- usb_ac_plumb_ioctl(q, mp);
+ if (uacp->usb_ac_busy_count > 0)
+ uacp->usb_ac_busy_count--;
- return (error);
- }
mutex_exit(&uacp->usb_ac_mutex);
- /* Pass to audio_sup routine */
- (void) audio_sup_wput(q, mp);
-
- return (error);
+ usb_ac_pm_idle_component(uacp);
}
/*
- * usb_ac_lrput:
- * read put entry point for the lower mux. Get the response from the
- * lower module, signal usb_ac_send_as_cmd(), the thread that is waiting
- * for a response to a message sent earlier anbd pass the response
- * message block.
+ * usb_ac_read_msg:
+ * Handle asynchronous response from opened streams
*/
static int
-usb_ac_lrput(queue_t *q, mblk_t *mp)
+usb_ac_read_msg(usb_ac_plumbed_t *plumb_infop, mblk_t *mp)
{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp;
+ usb_ac_state_t *uacp = plumb_infop->acp_uacp;
int error = DDI_SUCCESS;
- usb_ac_plumbed_t *plumb_infop;
- usb_ac_streams_info_t *streams_infop = NULL;
int val;
char val1;
struct iocblk *iocp;
- uacp = ddi_get_soft_state(usb_ac_statep, instance);
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_lrput: q=0x%p, mp=0x%p, instance=%d",
- (void *)q, (void *)mp, instance);
- ASSERT(mp != NULL);
+ "usb_ac_read_msg: mp=0x%p, instance=%d", (void *)mp,
+ ddi_get_instance(uacp->usb_ac_dip));
- mutex_enter(&uacp->usb_ac_mutex);
- plumb_infop = usb_ac_get_plumb_info_from_lrq(uacp, q);
- ASSERT(plumb_infop != NULL);
+ ASSERT(mp != NULL);
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+ /*
+ * typically an M_CTL is used between modules but in order to pass
+ * through the streamhead, an M_PROTO type must be used instead
+ */
switch (mp->b_datap->db_type) {
- case M_CTL:
+ case M_PROTO:
case M_ERROR:
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"M_CTL/M_ERROR");
switch (plumb_infop->acp_driver) {
- case USB_AS_PLUMBED:
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reply from usb_as, lrq=0x%p", (void *)q);
- streams_infop = (usb_ac_streams_info_t *)
- plumb_infop->acp_data;
- ASSERT(streams_infop != NULL);
- streams_infop->acs_ac_to_as_req.acr_reply_mp = mp;
- streams_infop->acs_ac_to_as_req.acr_wait_flag = 0;
- cv_signal(&streams_infop->acs_ac_to_as_req.acr_cv);
-
- break;
case USB_AH_PLUMBED:
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "M_CTL from hid, lrq=0x%p", (void *)q);
+ "message from hid, instance=%d",
+ ddi_get_instance(plumb_infop->acp_dip));
- iocp = (struct iocblk *)mp->b_rptr;
+ iocp = (struct iocblk *)(void *)mp->b_rptr;
ASSERT(mp->b_cont != NULL);
if (uacp->usb_ac_registered_with_mixer) {
@@ -1187,7 +864,7 @@ usb_ac_lrput(queue_t *q, mblk_t *mp)
break;
default:
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "M_CTL from unknown module(%s)",
+ "message from unknown module(%s)",
ddi_driver_name(plumb_infop->acp_dip));
freemsg(mp);
}
@@ -1196,15 +873,11 @@ usb_ac_lrput(queue_t *q, mblk_t *mp)
default:
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"Unknown type=%d", mp->b_datap->db_type);
- usb_ac_free_mblk(mp);
+ freemsg(mp);
}
- mutex_exit(&uacp->usb_ac_mutex);
- /*
- * Nobody is waiting; nothing to send up.
- */
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_lrput: done");
+ "usb_ac_read_msg: done");
return (error);
}
@@ -1408,121 +1081,6 @@ usb_ac_create_pm_components(dev_info_t *dip, usb_ac_state_t *uacp)
/*
- * usb_ac_plumb_ioctl:
- * IOCTL issued from plumbing thread (only P_LINK_LH/P_UNLINK for now
- * caused by ldi_ioctl). Maybe we will need to use this function
- * to issue other IOCTLS to children in future from plumbing thread
- */
-static void
-usb_ac_plumb_ioctl(queue_t *q, mblk_t *mp)
-{
- int instance = audio_sup_get_qptr_instance(q);
- usb_ac_state_t *uacp = ddi_get_soft_state(usb_ac_statep, instance);
- struct iocblk *iocp;
- struct linkblk *linkp;
- int n;
- usb_ac_streams_info_t *streams_infop;
-
- ASSERT(uacp != NULL);
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl, q=0x%p mp=0x%p instance=%d",
- (void *)q, (void *)mp, instance);
-
- iocp = (struct iocblk *)mp->b_rptr;
- mutex_enter(&uacp->usb_ac_mutex);
- n = uacp->usb_ac_current_plumbed_index;
-
- switch (iocp->ioc_cmd) {
- case I_PLINK:
- linkp = (struct linkblk *)mp->b_cont->b_rptr;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "LINK ioctl, index=%d linkblk ptr=0x%p", n, (void *)linkp);
-
- /*
- * We keep track of the module that is being
- * currently plumbed through usb_ac_current_plumbed_index
- * to the plumb structure array. We set the lwq field
- * of the plumb structure here.
- */
- ASSERT(uacp->usb_ac_plumbed[n].acp_lwq == NULL);
- uacp->usb_ac_plumbed[n].acp_lwq = linkp->l_qbot;
- uacp->usb_ac_plumbed[n].acp_lrq = RD(linkp->l_qbot);
-
- audio_sup_set_qptr(uacp->usb_ac_plumbed[n].acp_lrq,
- uacp->usb_ac_dev, (void *)uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "index=%d lwq=0x%p lrq=0x%p", n, (void *)linkp->l_qbot,
- (void *)RD(linkp->l_qbot));
- break;
- case I_UNLINK:
- case I_PUNLINK:
- linkp = (struct linkblk *)mp->b_cont->b_rptr;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "UNLINK ioctl, linkblk ptr=0x%p", (void *)linkp);
-
- audio_sup_free_qptr(RD(linkp->l_qbot));
- uacp->usb_ac_dev = 0;
-
- if (uacp->usb_ac_plumbed[n].acp_driver == USB_AS_PLUMBED) {
-
- /*
- * we bzero the streams info and plumbed structure
- * since there is no guarantee that the next plumbing
- * will be identical
- */
- streams_infop = (usb_ac_streams_info_t *)
- uacp->usb_ac_plumbed[n].acp_data;
- cv_destroy(&(streams_infop->acs_ac_to_as_req.acr_cv));
-
- /* bzero the relevant plumbing structure */
- bzero(streams_infop, sizeof (usb_ac_streams_info_t));
- }
- bzero(&uacp->usb_ac_plumbed[n], sizeof (usb_ac_plumbed_t));
-
- iocp->ioc_count = 0;
- break;
- default:
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "Unknown ioctl, cmd=%d", iocp->ioc_cmd);
- iocp->ioc_error = EINVAL;
- mutex_exit(&uacp->usb_ac_mutex);
-
- goto iocnak;
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /*
- * Common exit path for calls that return a positive
- * acknowledgment with a return value of 0.
- */
- iocp->ioc_rval = 0;
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
- qreply(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl: End (ACK)");
-
- return;
-
-iocnak:
-
- iocp->ioc_rval = 0;
- mp->b_datap->db_type = M_IOCNAK;
- qreply(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_plumb_ioctl: End: (NAK)");
-}
-
-
-/*
* usb_ac_get_plumb_info:
* Get plumb_info pointer that matches module "name"
* If name = "usb_as", match the direction also (record or play)
@@ -1565,26 +1123,6 @@ usb_ac_get_plumb_info(usb_ac_state_t *uacp, char *name, uchar_t reg_play_type)
/*
- * usb_ac_get_pinfo_from_lrq:
- * Get plumb_info pointer that matches the lrq passed
- */
-static usb_ac_plumbed_t *
-usb_ac_get_plumb_info_from_lrq(usb_ac_state_t *uacp, queue_t *lrq)
-{
- int n;
-
- for (n = 0; n < USB_AC_MAX_PLUMBED; n++) {
- if (uacp->usb_ac_plumbed[n].acp_lrq == lrq) {
-
- return (&uacp->usb_ac_plumbed[n]);
- }
- }
-
- return (NULL);
-}
-
-
-/*
* usb_ac_get_featureID:
* find out if there is at least one feature unit that supports
* the request controls.
@@ -2945,9 +2483,9 @@ usb_ac_disconnect_event_cb(dev_info_t *dip)
{
usb_ac_state_t *uacp = (usb_ac_state_t *)ddi_get_soft_state(
usb_ac_statep, ddi_get_instance(dip));
+ char *nm = "usb_ac_disconnect_event_cb";
- USB_DPRINTF_L4(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_disconnect_event_cb: dip=0x%p", (void *)dip);
+ dinfo("%s: %s - dip=%p\n", uacp->dstr, nm, (void *)dip);
usb_ac_serialize_access(uacp);
@@ -2962,10 +2500,8 @@ usb_ac_disconnect_event_cb(dev_info_t *dip)
}
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L3(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_disconnect_event_cb: done");
-
usb_ac_release_access(uacp);
+ dinfo("%s: %s done\n", uacp->dstr, nm);
return (USB_SUCCESS);
}
@@ -3008,9 +2544,9 @@ usb_ac_reconnect_event_cb(dev_info_t *dip)
{
usb_ac_state_t *uacp = (usb_ac_state_t *)ddi_get_soft_state(
usb_ac_statep, ddi_get_instance(dip));
+ char *nm = "usb_ac_reconnect_event_cb";
- USB_DPRINTF_L4(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
- "usb_ac_reconnect_event_cb: dip=0x%p", (void *)dip);
+ dinfo("%s: %s - dip=%p\n", uacp->dstr, nm, (void *)dip);
mutex_enter(&uacp->usb_ac_mutex);
mutex_exit(&uacp->usb_ac_mutex);
@@ -3032,9 +2568,11 @@ usb_ac_reconnect_event_cb(dev_info_t *dip)
USB_DPRINTF_L0(PRINT_MASK_EVENTS, uacp->usb_ac_log_handle,
"busy device has been reconnected");
}
+
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
+ dinfo("%s: %s done\n", uacp->dstr, nm);
return (USB_SUCCESS);
}
@@ -3149,8 +2687,7 @@ usb_ac_am_restore_state(void *arg)
*/
delay(USB_AC_RESTORE_DELAY);
- (void) audio_sup_restore_state(uacp->usb_ac_audiohdl,
- AUDIO_ALL_DEVICES, AUDIO_BOTH);
+ audio_sup_restore_state(uacp->usb_ac_audiohdl);
mutex_enter(&uacp->usb_ac_mutex);
uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
@@ -3233,18 +2770,15 @@ usb_ac_restore_audio_state(usb_ac_state_t *uacp, int flag)
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
+usb_ac_setup(audiohdl_t ahdl, int flag)
{
int rval = AUDIO_SUCCESS;
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup: Begin ahdl=0x%p, stream=%d, flag=%d",
- (void *)ahdl, stream, flag);
-
mutex_enter(&uacp->usb_ac_mutex);
+
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3255,18 +2789,15 @@ usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
usb_ac_serialize_access(uacp);
if (flag & AUDIO_PLAY) {
- rval = usb_ac_do_setup(ahdl, stream, AUDIO_PLAY);
+ rval = usb_ac_do_setup(ahdl, AUDIO_PLAY);
}
if ((rval == USB_SUCCESS) && (flag & AUDIO_RECORD)) {
- rval = usb_ac_do_setup(ahdl, stream, AUDIO_RECORD);
+ rval = usb_ac_do_setup(ahdl, AUDIO_RECORD);
}
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup: rval=%d", rval);
-
return ((rval == USB_SUCCESS) ? AUDIO_SUCCESS : AUDIO_FAILURE);
}
@@ -3277,7 +2808,7 @@ usb_ac_setup(audiohdl_t ahdl, int stream, int flag)
* either from audio framework for usb_ac_set_format
*/
static int
-usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
+usb_ac_do_setup(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -3286,10 +2817,6 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_setup: Begin ahdl=0x%p, stream=%d, flag=%d",
- (void *)ahdl, stream, flag);
-
mutex_enter(&uacp->usb_ac_mutex);
dir = (flag & AUDIO_PLAY) ? AUDIO_PLAY : AUDIO_RECORD;
@@ -3320,20 +2847,14 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
"usb_ac_do_setup: failure");
streams_infop->acs_setup_teardown_count--;
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_setup: End");
-
return (USB_SUCCESS);
}
@@ -3345,30 +2866,23 @@ usb_ac_do_setup(audiohdl_t ahdl, int stream, int flag)
* NOTE: allow teardown when disconnected
*/
static void
-usb_ac_teardown(audiohdl_t ahdl, int stream, int flag)
+usb_ac_teardown(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_teardown: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
usb_ac_serialize_access(uacp);
if (flag & AUDIO_PLAY) {
- usb_ac_do_teardown(ahdl, stream, AUDIO_PLAY);
+ usb_ac_do_teardown(ahdl, AUDIO_PLAY);
}
if (flag & AUDIO_RECORD) {
- usb_ac_do_teardown(ahdl, stream, AUDIO_RECORD);
+ usb_ac_do_teardown(ahdl, AUDIO_RECORD);
}
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_teardown: End");
}
@@ -3377,7 +2891,7 @@ usb_ac_teardown(audiohdl_t ahdl, int stream, int flag)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
+usb_ac_do_teardown(audiohdl_t ahdl, int flag)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -3386,10 +2900,6 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_teardown: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
dir = (flag & AUDIO_PLAY) ? AUDIO_PLAY : AUDIO_RECORD;
@@ -3426,15 +2936,12 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
"usb_ac_do_teardown: failure");
streams_infop->acs_setup_teardown_count++;
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return;
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
@@ -3450,8 +2957,7 @@ usb_ac_do_teardown(audiohdl_t ahdl, int stream, int flag)
* Check power is done here since we will access the default pipe
*/
static int
-usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
- int arg1, int arg2)
+usb_ac_set_config(audiohdl_t ahdl, int command, int flag, int arg1, int arg2)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
char *what;
@@ -3463,12 +2969,8 @@ usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_config: Begin ahdl=0x%p\n\t"
- "stream=%d, cmd=%d, flag=%d, arg1=%d, arg2=%d",
- (void *)ahdl, stream, command, flag, arg1, arg2);
-
mutex_enter(&uacp->usb_ac_mutex);
+
if (uacp->usb_ac_plumbing_state < USB_AC_STATE_PLUMBED) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3606,10 +3108,6 @@ usb_ac_set_config(audiohdl_t ahdl, int stream, int command, int flag,
what = "mic boost";
rval = AUDIO_SUCCESS;
break;
- case AM_SET_GAIN_BAL:
- what = "set gain bal";
- rval = AUDIO_FAILURE;
- break;
default:
what = "unknown";
rval = AUDIO_FAILURE;
@@ -3737,8 +3235,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
return (USB_FAILURE);
}
- if ((max = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_MAX, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_MAX, dir, featureID, &max) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting max gain failed");
@@ -3748,8 +3246,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: channel %d, max=%d", channel, max);
- if ((min = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_MIN, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_MIN, dir, featureID, &min) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting min gain failed");
@@ -3759,8 +3257,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: channel=%d, min=%d", channel, min);
- if ((current = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_CUR, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_CUR, dir, featureID, &current) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting cur gain failed");
@@ -3798,8 +3296,8 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
}
/* just curious, read it back, device may round up/down */
- if ((current = usb_ac_get_maxmin_volume(uacp, channel,
- USB_AUDIO_GET_CUR, dir, featureID)) == USB_FAILURE) {
+ if (usb_ac_get_maxmin_volume(uacp, channel,
+ USB_AUDIO_GET_CUR, dir, featureID, &current) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_set_gain: getting cur gain failed");
}
@@ -3827,7 +3325,7 @@ usb_ac_set_gain(usb_ac_state_t *uacp, uint_t featureID,
* usb_ac_send_as_cmd().
*/
static int
-usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
+usb_ac_set_format(audiohdl_t ahdl, int flag,
int sample, int channels, int precision, int encoding)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
@@ -3841,11 +3339,6 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_format: Begin ahdl=0x%p, stream=%d, flag=%d, "
- "sr=%d, chnls=%d, prec=%d, enc=%d", (void *)ahdl, stream, flag,
- sample, channels, precision, encoding);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -3879,7 +3372,7 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
mutex_exit(&uacp->usb_ac_mutex);
- rval = usb_ac_send_format_cmd(ahdl, stream, dir, sample,
+ rval = usb_ac_send_format_cmd(ahdl, dir, sample,
channels, precision, encoding);
usb_ac_release_access(uacp);
@@ -3903,15 +3396,15 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
mutex_exit(&uacp->usb_ac_mutex);
if (dir == AUDIO_PLAY) {
- usb_ac_do_pause_play(ahdl, stream);
+ usb_ac_do_stop_play(ahdl);
} else if (dir == AUDIO_RECORD) {
- usb_ac_do_stop_record(ahdl, stream);
+ usb_ac_do_stop_record(ahdl);
}
/* This blocks until the current isoc xfer is over */
- usb_ac_do_teardown(ahdl, stream, dir);
+ usb_ac_do_teardown(ahdl, dir);
- if (usb_ac_send_format_cmd(ahdl, stream, dir, sample,
+ if (usb_ac_send_format_cmd(ahdl, dir, sample,
channels, precision, encoding) != USB_SUCCESS) {
/*
* Setting new alternate has failed, try restoring
@@ -3920,13 +3413,13 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
* till bandwidth is available. Also we know that
* there is a matching alternate, so that can't fail.
*/
- if (usb_ac_send_format_cmd(ahdl, stream, dir,
+ if (usb_ac_send_format_cmd(ahdl, dir,
old_format.fmt_sr, old_format.fmt_chns,
old_format.fmt_precision, old_format.fmt_encoding) ==
USB_FAILURE) {
/* We closed the pipe; reopen it */
- (void) usb_ac_do_setup(ahdl, stream, dir);
+ (void) usb_ac_do_setup(ahdl, dir);
mutex_enter(&uacp->usb_ac_mutex);
streams_infop->acs_setup_teardown_count =
@@ -3940,7 +3433,7 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
}
/* This should block until successful */
- (void) usb_ac_do_setup(ahdl, stream, dir);
+ (void) usb_ac_do_setup(ahdl, dir);
mutex_enter(&uacp->usb_ac_mutex);
streams_infop->acs_setup_teardown_count = old_setup_teardown_count;
@@ -3948,9 +3441,6 @@ usb_ac_set_format(audiohdl_t ahdl, int stream, int flag,
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_set_format: End");
-
return (AUDIO_SUCCESS);
}
@@ -4002,7 +3492,7 @@ usb_ac_get_curr_format(usb_ac_state_t *uacp, int dir)
* Send the set sample freq command down to usb_as.
*/
static int
-usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
+usb_ac_send_format_cmd(audiohdl_t ahdl, int dir,
int sample, int channels, int precision, int encoding)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
@@ -4012,11 +3502,6 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_format_cmd: Begin ahdl=0x%p, stream=%d, dir=%d, "
- "sr=%d, chnls=%d, prec=%d, enc=%d", (void *)ahdl, stream, dir,
- sample, channels, precision, encoding);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4059,13 +3544,13 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
USB_DPRINTF_L2(PRINT_MASK_ALL,
uacp->usb_ac_log_handle,
"usb_ac_send_format_cmd: failed");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
} else {
- /* alternate number stored and reply mp freed */
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
+ /* store matching alternate number */
+ streams_infop->acs_ac_to_as_req.acr_curr_format.fmt_alt =
+ format->fmt_alt;
}
/* Set the sample rate */
@@ -4074,19 +3559,13 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_send_format_cmd: setting format failed");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
return (USB_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
-
mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_format_cmd: End");
-
return (USB_SUCCESS);
}
@@ -4097,7 +3576,7 @@ usb_ac_send_format_cmd(audiohdl_t ahdl, int stream, int dir,
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_start_play(audiohdl_t ahdl, int stream)
+usb_ac_start_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_audio_formats_t *cur_fmt;
@@ -4108,10 +3587,6 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4156,7 +3631,6 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_start_play: failure");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
@@ -4164,34 +3638,26 @@ usb_ac_start_play(audiohdl_t ahdl, int stream)
return (AUDIO_FAILURE);
}
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_play: End");
-
return (AUDIO_SUCCESS);
}
/*
- * usb_ac_pause_play:
- * Wrapper function for usb_ac_do_pause_play and gets
+ * usb_ac_stop_play:
+ * Wrapper function for usb_ac_do_stop_play and gets
* called from mixer framework.
*/
static void
-usb_ac_pause_play(audiohdl_t ahdl, int stream)
+usb_ac_stop_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_pause_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4201,11 +3667,8 @@ usb_ac_pause_play(audiohdl_t ahdl, int stream)
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_serialize_access(uacp);
- usb_ac_do_pause_play(ahdl, stream);
+ usb_ac_do_stop_play(ahdl);
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_pause_play: End");
}
/*
@@ -4214,7 +3677,7 @@ usb_ac_pause_play(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
+usb_ac_do_stop_play(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4222,10 +3685,6 @@ usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_pause_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
plumb_infop = usb_ac_get_plumb_info(uacp, "usb_as", AUDIO_PLAY);
@@ -4240,37 +3699,9 @@ usb_ac_do_pause_play(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_do_pause_play: failure");
-
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
}
mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_pause_play: End");
-}
-
-
-/*
- * usb_ac_stop_play:
- * Wrapper function for usb_ac_pause_play and gets
- * called from mixer framework.
- */
-static void
-usb_ac_stop_play(audiohdl_t ahdl, int stream)
-{
- usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
-
- ASSERT(uacp != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_play: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
- usb_ac_pause_play(ahdl, stream);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_play: End");
}
@@ -4280,7 +3711,7 @@ usb_ac_stop_play(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static int
-usb_ac_start_record(audiohdl_t ahdl, int stream)
+usb_ac_start_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4288,10 +3719,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
if (uacp->usb_ac_dev_state != USB_DEV_ONLINE) {
mutex_exit(&uacp->usb_ac_mutex);
@@ -4316,7 +3743,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_start_record: failure");
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
mutex_exit(&uacp->usb_ac_mutex);
usb_ac_release_access(uacp);
@@ -4328,9 +3754,6 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
usb_ac_release_access(uacp);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_start_record: End");
-
return (AUDIO_SUCCESS);
}
@@ -4341,22 +3764,15 @@ usb_ac_start_record(audiohdl_t ahdl, int stream)
* called form mixer framework.
*/
static void
-usb_ac_stop_record(audiohdl_t ahdl, int stream)
+usb_ac_stop_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
usb_ac_serialize_access(uacp);
- usb_ac_do_stop_record(ahdl, stream);
+ usb_ac_do_stop_record(ahdl);
usb_ac_release_access(uacp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_stop_record: End");
}
@@ -4366,7 +3782,7 @@ usb_ac_stop_record(audiohdl_t ahdl, int stream)
* Check power is done in usb_ac_send_as_cmd()
*/
static void
-usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
+usb_ac_do_stop_record(audiohdl_t ahdl)
{
usb_ac_state_t *uacp = audio_sup_get_private(ahdl);
usb_ac_plumbed_t *plumb_infop = NULL;
@@ -4374,10 +3790,6 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
ASSERT(uacp != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_stop_record: Begin ahdl=0x%p, stream=%d",
- (void *)ahdl, stream);
-
mutex_enter(&uacp->usb_ac_mutex);
plumb_infop = usb_ac_get_plumb_info(uacp, "usb_as", AUDIO_RECORD);
@@ -4392,14 +3804,9 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_do_stop_record: failure");
-
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
}
mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_do_stop_record: End");
}
@@ -4413,12 +3820,12 @@ usb_ac_do_stop_record(audiohdl_t ahdl, int stream)
*/
static int
usb_ac_get_maxmin_volume(usb_ac_state_t *uacp, uint_t channel, int cmd,
- int dir, int feature_unitID)
+ int dir, int feature_unitID, short *max_or_minp)
{
mblk_t *data = NULL;
- short max_or_min;
usb_cr_t cr;
usb_cb_flags_t cb_flags;
+
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
"usb_ac_get_maxmin_volume: channel=%d, cmd=%d dir=%d",
channel, cmd, dir);
@@ -4454,14 +3861,14 @@ usb_ac_get_maxmin_volume(usb_ac_state_t *uacp, uint_t channel, int cmd,
mutex_enter(&uacp->usb_ac_mutex);
ASSERT(MBLKL(data) == 2);
- max_or_min = (*(data->b_rptr+1) << 8) | *data->b_rptr;
+ *max_or_minp = (*(data->b_rptr+1) << 8) | *data->b_rptr;
USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_get_maxmin_volume: max_or_min=0x%x", max_or_min);
+ "usb_ac_get_maxmin_volume: max_or_min=0x%x", *max_or_minp);
freemsg(data);
- return (max_or_min);
+ return (USB_SUCCESS);
}
@@ -4581,11 +3988,11 @@ static int
usb_ac_send_as_cmd(usb_ac_state_t *uacp, usb_ac_plumbed_t *plumb_infop,
int cmd, void *arg)
{
- mblk_t *mp = NULL;
- struct iocblk *iocp;
- queue_t *lwq = plumb_infop->acp_lwq;
usb_ac_streams_info_t *streams_infop;
- int error = USB_FAILURE;
+ int rv;
+ int rval;
+ ldi_handle_t lh;
+ char *nm = "usb_ac_send_as_cmd";
ASSERT(mutex_owned(&uacp->usb_ac_mutex));
ASSERT(plumb_infop != NULL);
@@ -4593,276 +4000,1209 @@ usb_ac_send_as_cmd(usb_ac_state_t *uacp, usb_ac_plumbed_t *plumb_infop,
streams_infop = (usb_ac_streams_info_t *)plumb_infop->acp_data;
ASSERT(streams_infop != NULL);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: Begin lwq=0x%p, cmd=0x%x, arg=0x%p",
- (void *)lwq, cmd, arg);
+ dinfo("%s: %s - cmd=0x%x, arg=0x%p\n", uacp->dstr, nm, cmd, arg);
- if (!canputnext(lwq)) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: canputnext failed");
+ lh = plumb_infop->acp_lh;
- return (error);
+ rv = ldi_ioctl(lh, cmd, (intptr_t)arg, FKIOCTL, kcred, &rval);
+ if (rv != 0) {
+ dinfo("%s: %s - ldi_ioctl failed, error=%d\n", uacp->dstr, nm,
+ rv);
+
+ return (USB_FAILURE);
}
- /*
- * Allocate mblk for a particular command
- */
- switch (cmd) {
- case USB_AUDIO_SET_FORMAT:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (usb_audio_formats_t));
- break;
- case USB_AUDIO_TEARDOWN:
- case USB_AUDIO_STOP_RECORD:
- case USB_AUDIO_PAUSE_PLAY:
- case USB_AUDIO_SETUP:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, NULL, 0);
- break;
- case USB_AUDIO_START_RECORD:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (audiohdl_t *));
- break;
- case USB_AUDIO_SET_SAMPLE_FREQ:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (int));
- break;
- case USB_AUDIO_START_PLAY:
- mp = usb_ac_allocate_req_mblk(uacp, cmd, (void *)arg,
- sizeof (usb_audio_play_req_t));
- break;
- default:
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * usb_ac_serialize/release_access:
+ */
+static void
+usb_ac_serialize_access(usb_ac_state_t *uacp)
+{
+ (void) usb_serialize_access(uacp->usb_ac_ser_acc, USB_WAIT, 0);
+}
+
+static void
+usb_ac_release_access(usb_ac_state_t *uacp)
+{
+ usb_release_access(uacp->usb_ac_ser_acc);
+}
+
+
+static void
+usb_ac_pm_busy_component(usb_ac_state_t *usb_ac_statep)
+{
+ ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+
+ if (usb_ac_statep->usb_ac_pm != NULL) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy++;
+
+ USB_DPRINTF_L4(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_busy_component: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+
+ if (pm_busy_component(usb_ac_statep->usb_ac_dip, 0) !=
+ DDI_SUCCESS) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+
+ USB_DPRINTF_L2(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_busy_component failed: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ }
+ }
+}
+
+
+static void
+usb_ac_pm_idle_component(usb_ac_state_t *usb_ac_statep)
+{
+ ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+
+ if (usb_ac_statep->usb_ac_pm != NULL) {
+ if (pm_idle_component(usb_ac_statep->usb_ac_dip, 0) ==
+ DDI_SUCCESS) {
+ mutex_enter(&usb_ac_statep->usb_ac_mutex);
+ ASSERT(usb_ac_statep->usb_ac_pm->acpm_pm_busy > 0);
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+
+ USB_DPRINTF_L4(PRINT_MASK_PM,
+ usb_ac_statep->usb_ac_log_handle,
+ "usb_ac_pm_idle_component: %d",
+ usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+
+ mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ }
+ }
+}
+
+
+/*
+ * handle read from plumbed drivers
+ */
+static void
+usb_ac_reader(void *argp)
+{
+ usb_ac_plumbed_t *acp = (usb_ac_plumbed_t *)argp;
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ ldi_handle_t lh;
+ mblk_t *mp;
+ int rv;
+ timestruc_t tv = {0};
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ lh = acp->acp_lh;
+ tv.tv_sec = usb_ac_wait_hid;
+
+ while (acp->acp_flags & ACP_ENABLED) {
+ mp = NULL;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ rv = ldi_getmsg(lh, &mp, &tv);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if ((acp->acp_flags & ACP_ENABLED) && mp != NULL && rv == 0)
+ rv = usb_ac_read_msg(acp, mp);
+
+ USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "%s%d read from %s%d, rv=%d",
+ ddi_driver_name(uacp->usb_ac_dip),
+ ddi_get_instance(uacp->usb_ac_dip),
+ ddi_driver_name(acp->acp_dip),
+ ddi_get_instance(acp->acp_dip), rv);
+ }
+ mutex_exit(&uacp->usb_ac_mutex);
+}
+
+
+/*
+ * setup threads to read from the other usb modules that may send unsolicited
+ * or asynchronous messages, which is only hid currently
+ */
+static int
+usb_ac_plumb(usb_ac_plumbed_t *acp)
+{
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ dev_info_t *dip;
+ dev_info_t *acp_dip;
+ int acp_inst;
+ char *acp_name;
+ char tq_nm[128];
+ int rv = USB_FAILURE;
+ char *nm = "usb_ac_plumb";
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dip = uacp->usb_ac_dip;
+
+ acp_dip = acp->acp_dip;
+ acp_inst = ddi_get_instance(acp_dip);
+ acp_name = (char *)ddi_driver_name(acp_dip);
+
+ dinfo("%s: %s on %s%d\n", uacp->dstr, nm, acp_name, acp_inst);
+
+ if (strcmp(acp_name, "hid") != 0) {
+ rv = USB_SUCCESS;
+ goto OUT;
+ }
+
+ (void) snprintf(tq_nm, sizeof (tq_nm), "%s_%d_tq",
+ ddi_driver_name(acp_dip), acp_inst);
+
+ acp->acp_tqp = ddi_taskq_create(dip, tq_nm, 1, TASKQ_DEFAULTPRI, 0);
+ if (acp->acp_tqp == NULL)
+ goto OUT;
+
+ if (ddi_taskq_dispatch(acp->acp_tqp, usb_ac_reader, (void *)acp,
+ DDI_SLEEP) != DDI_SUCCESS)
+ goto OUT;
+
+ dinfo("%s: dispatched reader for %s%d\n", uacp->dstr,
+ acp_name, acp_inst);
+
+ rv = USB_SUCCESS;
+
+OUT:
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s on %s%d done, rv=%d\n", uacp->dstr, nm,
+ acp_name, acp_inst, rv);
+
+ return (rv);
+}
+
+
+static void
+usb_ac_mux_plumbing_tq(void *arg)
+{
+ usb_ac_state_t *uacp = (usb_ac_state_t *)arg;
+
+ if (usb_ac_mux_plumbing(uacp) != USB_SUCCESS)
+ dwarn("%s: usb_ac_mux_plumbing failed\n", uacp->dstr);
+}
+
+
+static int
+usb_ac_do_plumbing(usb_ac_state_t *uacp)
+{
+ dev_info_t *dip = uacp->usb_ac_dip;
+ int inst = ddi_get_instance(dip);
+ char tq_nm[128];
+ int rv = USB_FAILURE;
+
+ (void) snprintf(tq_nm, sizeof (tq_nm), "%s_%d_tq",
+ ddi_driver_name(dip), inst);
+
+ uacp->tqp = ddi_taskq_create(dip, tq_nm, 1, TASKQ_DEFAULTPRI, 0);
+ if (uacp->tqp == NULL) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: unknown cmd=%d", cmd);
+ "usb_ac_do_plumbing: ddi_taskq_create failed");
+ goto OUT;
+ }
- return (error);
+ if (ddi_taskq_dispatch(uacp->tqp, usb_ac_mux_plumbing_tq, (void *)uacp,
+ DDI_SLEEP) != DDI_SUCCESS) {
+ USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_do_plumbing: ddi_taskq_dispatch failed");
+ goto OUT;
}
- if (mp == NULL) {
+ rv = USB_SUCCESS;
+
+OUT:
+ return (rv);
+}
+
+
+
+static void
+usb_ac_mux_unplumbing_tq(void *arg)
+{
+ usb_ac_state_t *uacp = (usb_ac_state_t *)arg;
+
+ if (usb_ac_mux_unplumbing(uacp) != USB_SUCCESS)
+ dwarn("%s: usb_ac_mux_unplumbing failed\n", uacp->dstr);
+}
+
+
+static int
+usb_ac_do_unplumbing(usb_ac_state_t *uacp)
+{
+ int rv = USB_FAILURE;
+
+ if (uacp->tqp == NULL)
+ return (USB_SUCCESS);
+
+ if (ddi_taskq_dispatch(uacp->tqp, usb_ac_mux_unplumbing_tq,
+ (void *)uacp, DDI_SLEEP) != DDI_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: can't get mblk to send cmd down");
+ "usb_ac_do_unplumbing: ddi_taskq_dispatch failed");
+ goto OUT;
+ }
+
+ dinfo("%s: waiting for unplumb thread\n", uacp->dstr);
+
+ ddi_taskq_wait(uacp->tqp);
+ rv = USB_SUCCESS;
+
+ dinfo("%s: unplumb thread done\n", uacp->dstr);
- return (error);
+OUT:
+ if (uacp->tqp != NULL) {
+ ddi_taskq_destroy(uacp->tqp);
+ uacp->tqp = NULL;
}
+ return (rv);
+}
- /*
- * Set wait flag and send message down; we have made sure
- * before that canputnext succeeds. Note mp will be freed down
- */
- streams_infop->acs_ac_to_as_req.acr_wait_flag = 1;
+
+/*
+ * teardown threads to the other usb modules
+ * and clear structures as part of unplumbing
+ */
+static void
+usb_ac_unplumb(usb_ac_plumbed_t *acp)
+{
+ usb_ac_streams_info_t *streams_infop;
+ usb_ac_state_t *uacp = acp->acp_uacp;
+ dev_info_t *acp_dip;
+ int acp_inst;
+ char *nm = "usb_ac_unplumb";
+ char *acp_name;
+
+ acp_dip = acp->acp_dip;
+ acp_inst = ddi_get_instance(acp_dip);
+ acp_name = (char *)ddi_driver_name(acp_dip);
+
+ dinfo("%s: %s on %s%d\n", uacp->dstr, nm, acp_name, acp_inst);
+
+ if (acp->acp_tqp != NULL) {
+ dinfo("%s: %s - destroying taskq for %s%d\n", uacp->dstr, nm,
+ acp_name, acp_inst);
+
+ ddi_taskq_destroy(acp->acp_tqp);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (acp->acp_driver == USB_AS_PLUMBED) {
+ /*
+ * we bzero the streams info and plumbed structure
+ * since there is no guarantee that the next plumbing
+ * will be identical
+ */
+ streams_infop = (usb_ac_streams_info_t *)acp->acp_data;
+
+ /* bzero the relevant plumbing structure */
+ bzero(streams_infop, sizeof (usb_ac_streams_info_t));
+ }
+ bzero(acp, sizeof (usb_ac_plumbed_t));
mutex_exit(&uacp->usb_ac_mutex);
- putnext(lwq, mp);
+
+ dinfo("%s: %s on %s done\n", uacp->dstr, nm, acp_name, acp_inst);
+}
+
+
+/*ARGSUSED*/
+static int
+usb_ac_mux_plumbing(usb_ac_state_t *uacp)
+{
+ dev_info_t *dip;
+ char *nm = "usb_ac_mux_plumbing";
+
+ /* get the usb_ac dip */
+ dip = uacp->usb_ac_dip;
+
+ /* Access to the global variables is synchronized */
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s state=%d\n", uacp->dstr, nm,
+ uacp->usb_ac_plumbing_state);
+
+ if (uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED) {
+ mutex_exit(&uacp->usb_ac_mutex);
+ dinfo("%s: audio streams driver already plumbed\n",
+ uacp->dstr);
+
+ return (USB_SUCCESS);
+ }
+
+ /* usb_as and hid should be attached but double check */
+ if (usb_ac_online_siblings(uacp) != USB_SUCCESS) {
+ mutex_exit(&uacp->usb_ac_mutex);
+ dinfo("%s: no audio streams driver plumbed\n", uacp->dstr);
+
+ return (USB_FAILURE);
+ }
+
+ dinfo("%s: (%s) raising power\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* bring the device to full power */
+ usb_ac_pm_busy_component(uacp);
+ (void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
+
+ /* avoid dips disappearing while we are plumbing */
+ usb_ac_hold_siblings(uacp);
+
mutex_enter(&uacp->usb_ac_mutex);
/*
- * Wait for the response; reply will arrive through rput()
- * M_CTL and the cv_wait will be signaled there and wait flag
- * will be reset
+ * walk all siblings and create the usb_ac<->usb_as and
+ * usb_ac<->hid streams. return of 0 indicates no or
+ * partial/failed plumbing
*/
- while (streams_infop->acs_ac_to_as_req.acr_wait_flag) {
-#ifndef DEBUG
- cv_wait(&streams_infop->acs_ac_to_as_req.acr_cv,
- &uacp->usb_ac_mutex);
-#else
- clock_t tm = ddi_get_lbolt() +
- drv_usectohz(usb_ac_wait_timeout);
- int rval;
-
- rval = cv_timedwait(&streams_infop->acs_ac_to_as_req.acr_cv,
- &uacp->usb_ac_mutex, tm);
-
- if (streams_infop->acs_ac_to_as_req.acr_wait_flag) {
- if (rval == -1) {
- USB_DPRINTF_L3(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd:"
- " timeout happen before cmd complete.");
- } else {
- USB_DPRINTF_L3(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd:"
- " not signaled by USB_AS_PLUMBED.");
+ if (usb_ac_mux_walk_siblings(uacp) == 0) {
+ /* pretend that we are plumbed so we can unplumb */
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ (void) usb_ac_mux_unplumbing(uacp);
+
+ dinfo("%s: no audio streams driver plumbed\n", uacp->dstr);
+
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ return (USB_FAILURE);
+ }
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
+
+ /* restore state if we have already registered with the mixer */
+ if (uacp->usb_ac_registered_with_mixer) {
+ dinfo("%s: already registered with mixer, restoring state\n",
+ uacp->dstr);
+
+ (void) usb_ac_restore_audio_state(uacp, USB_FLAGS_SLEEP);
+
+ } else if (usb_ac_mixer_registration(uacp) != USB_SUCCESS) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dwarn("%s: mixer registration failed\n", uacp->dstr);
+
+ (void) usb_ac_mux_unplumbing(uacp);
+
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ return (USB_FAILURE);
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ usb_ac_rele_siblings(uacp);
+
+ usb_ac_pm_idle_component(uacp);
+
+ dinfo("%s: %s done\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
+}
+
+
+static int
+usb_ac_mux_unplumbing(usb_ac_state_t *uacp)
+{
+ usb_ac_plumbed_t *acp;
+ ldi_handle_t lh;
+ dev_info_t *acp_dip;
+ int inst;
+ int i;
+ dev_t devt;
+ minor_t minor;
+ int maxlinked = 0;
+ char *nm = "usb_ac_mux_unplumbing";
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s state=%d\n", uacp->dstr, nm, uacp->usb_ac_plumbing_state);
+
+ if (uacp->usb_ac_plumbing_state == USB_AC_STATE_UNPLUMBED) {
+ dinfo("%s: %s - already unplumbed!\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_SUCCESS);
+ }
+
+ /* usb_ac might not have anything plumbed yet */
+ if (uacp->usb_ac_current_plumbed_index == -1) {
+ dinfo("%s: %s - nothing plumbed!\n", uacp->dstr, nm);
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_SUCCESS);
+ }
+
+ /* do not allow detach if still busy */
+ if (uacp->usb_ac_busy_count) {
+ dinfo("%s: %s - mux still busy (%d)\n", uacp->dstr, nm,
+ uacp->usb_ac_busy_count);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ }
+
+ uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
+
+ /* close ac-as and ac-hid streams */
+ maxlinked = uacp->usb_ac_current_plumbed_index + 1;
+ dinfo("%s: %s - maxlinked %d\n", uacp->dstr, nm, maxlinked);
+
+ for (i = 0; i < maxlinked; i++) {
+ /*
+ * we must save members of usb_ac_plumbed[] before calling
+ * usb_ac_unplumb() because it clears the structure
+ */
+ acp = &uacp->usb_ac_plumbed[i];
+ lh = acp->acp_lh;
+ acp_dip = acp->acp_dip;
+ devt = acp->acp_devt;
+
+ if (acp_dip == NULL) {
+ dinfo("%s: %s [%d] - skipping\n", uacp->dstr, nm, i);
+ continue;
+ }
+
+ minor = getminor(devt);
+ inst = ddi_get_instance(acp_dip);
+
+ uacp->usb_ac_current_plumbed_index = i;
+
+ dinfo("%s: %s [%d] - %s%d minor 0x%x\n", uacp->dstr, nm, i,
+ ddi_driver_name(acp_dip), inst, minor);
+
+ if (lh != NULL) {
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ acp->acp_flags &= ~ACP_ENABLED;
+
+ dinfo("%s: %s [%d] - closing\n", uacp->dstr, nm, i);
+
+ /* must close stream first before destroying thread */
+ (void) ldi_close(lh, FREAD|FWRITE, kcred);
+
+ usb_ac_unplumb(acp);
+
+ dinfo("%s: %s [%d] - unplumbed\n", uacp->dstr, nm, i);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* Wait till all activity in the default pipe has drained */
+ usb_ac_serialize_access(uacp);
+ usb_ac_release_access(uacp);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ uacp->usb_ac_current_plumbed_index = -1;
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s done\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
+}
+
+
+/*
+ * walk all siblings and create the ac<->as and ac<->hid streams
+ */
+static int
+usb_ac_mux_walk_siblings(usb_ac_state_t *uacp)
+{
+ dev_info_t *pdip;
+ dev_info_t *child_dip;
+ major_t drv_major;
+ minor_t drv_minor;
+ int drv_instance;
+ char *drv_name;
+ dev_t drv_devt;
+ ldi_handle_t drv_lh;
+ ldi_ident_t li;
+ int error;
+ int count = 0;
+ char *nm = "usb_ac_mux_walk_siblings";
+
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+ child_dip = ddi_get_child(pdip);
+
+ dinfo("%s: %s parent=%s%d\n", uacp->dstr, nm,
+ ddi_driver_name(pdip), ddi_get_instance(pdip));
+
+ while ((child_dip != NULL) && (count < USB_AC_MAX_PLUMBED)) {
+ drv_instance = ddi_get_instance(child_dip);
+ drv_name = (char *)ddi_driver_name(child_dip);
+
+ dinfo("%s: plumbing %s%d count=%d\n", uacp->dstr,
+ drv_name, drv_instance, count);
+
+ /* ignore own dip */
+ if (child_dip == uacp->usb_ac_dip) {
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
+ }
+ drv_instance = ddi_get_instance(child_dip);
+
+ /* ignore other dip other than usb_as and hid */
+ if (strcmp(ddi_driver_name(child_dip), "usb_as") == 0) {
+ uacp->usb_ac_plumbed[count].acp_driver = USB_AS_PLUMBED;
+ drv_minor = USB_AS_CONSTRUCT_MINOR(drv_instance);
+ } else if (strcmp(ddi_driver_name(child_dip), "hid") == 0) {
+ uacp->usb_ac_plumbed[count].acp_driver = USB_AH_PLUMBED;
+ drv_minor = HID_CONSTRUCT_EXTERNAL_MINOR(drv_instance);
+ } else {
+ drv_minor = drv_instance;
+ uacp->usb_ac_plumbed[count].acp_driver =
+ UNKNOWN_PLUMBED;
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ if (!i_ddi_devi_attached(child_dip)) {
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ if (DEVI_IS_DEVICE_REMOVED(child_dip)) {
+ child_dip = ddi_get_next_sibling(child_dip);
+
+ continue;
+ }
+
+ drv_major = ddi_driver_major(child_dip);
+
+ uacp->usb_ac_current_plumbed_index = count;
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ drv_devt = makedevice(drv_major, drv_minor);
+
+ dinfo("%s: opening %s%d devt=(%d, 0x%x)\n", uacp->dstr,
+ drv_name, drv_instance, drv_major, drv_minor);
+
+ error = ldi_ident_from_dip(uacp->usb_ac_dip, &li);
+ if (error == 0) {
+ uacp->usb_ac_plumbed[count].acp_flags |= ACP_ENABLED;
+
+ error = ldi_open_by_dev(&drv_devt, OTYP_CHR,
+ FREAD|FWRITE, kcred, &drv_lh, li);
+ ldi_ident_release(li);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+ if (error) {
+ dinfo("%s: open of devt=(%d, 0x%x) failed error=%d\n",
+ uacp->dstr, drv_major, drv_minor, error);
+
+ return (0);
+ }
+
+ uacp->usb_ac_plumbed[count].acp_uacp = uacp;
+ uacp->usb_ac_plumbed[count].acp_devt = drv_devt;
+ uacp->usb_ac_plumbed[count].acp_lh = drv_lh;
+ uacp->usb_ac_plumbed[count].acp_dip = child_dip;
+ uacp->usb_ac_plumbed[count].acp_ifno =
+ usb_get_if_number(child_dip);
+
+ if (uacp->usb_ac_plumbed[count].acp_driver == USB_AS_PLUMBED) {
+ /* get registration data */
+ if (usb_ac_get_reg_data(uacp, drv_lh, count) !=
+ USB_SUCCESS) {
+
+ dinfo("%s: usb_ac_get_reg_data failed on "
+ "%s%d\n", uacp->dstr,
+ drv_name, drv_instance);
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ return (0);
+ }
+ } else if (uacp->usb_ac_plumbed[count].acp_driver ==
+ USB_AH_PLUMBED) {
+ int rval;
+
+ dinfo("%s: pushing usb_ah on %s%d\n", uacp->dstr,
+ drv_name, drv_instance);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ /* push usb_ah module on top of hid */
+ error = ldi_ioctl(drv_lh, I_PUSH, (intptr_t)"usb_ah",
+ FKIOCTL, kcred, &rval);
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (error) {
+ dinfo("%s: ldi_ioctl I_PUSH failed on "
+ "%s%d, error=%d\n", uacp->dstr,
+ drv_name, drv_instance, error);
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ /* skip plumbing the hid driver */
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
}
+ } else {
+ /* should not be here */
+ dinfo("%s: %s - unknown module %s%d\n",
+ uacp->dstr, nm, drv_name, drv_instance);
+ count--;
+
+ uacp->usb_ac_plumbed[count].acp_dip = NULL;
+
+ /* skip plumbing an unknown module */
+ child_dip = ddi_get_next_sibling(child_dip);
+ continue;
}
-#endif
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ error = usb_ac_plumb(&uacp->usb_ac_plumbed[count]);
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ if (error != USB_SUCCESS) {
+ dinfo("%s: %s - usb_ac_plumb failed for %s%d\n",
+ uacp->dstr, nm, drv_name, drv_instance);
+
+ return (0);
+ }
+
+ dinfo("%s: plumbed %s%d, minor 0x%x\n", uacp->dstr,
+ drv_name, drv_instance, drv_minor);
+
+ child_dip = ddi_get_next_sibling(child_dip);
+ count++;
}
- /* Wait is over, get the reply data */
- mp = streams_infop->acs_ac_to_as_req.acr_reply_mp;
- ASSERT(mp != NULL);
+ dinfo("%s: %s - %d drivers plumbed under usb_ac mux", uacp->dstr, nm,
+ count);
- iocp = (struct iocblk *)mp->b_rptr;
+ return (count);
+}
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_send_as_cmd: db_type=0x%x cmd=0x%x",
- mp->b_datap->db_type, iocp->ioc_cmd);
- switch (mp->b_datap->db_type) {
- case M_CTL:
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- /*
- * This command sets mixer format data
- * and returns alternate setting that matches
- */
- ASSERT(mp->b_cont != NULL);
- ASSERT(MBLKL(mp->b_cont) == sizeof (int));
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "alternate returned %d",
- *((int *)(mp->b_cont->b_rptr)));
-
- streams_infop->acs_ac_to_as_req.acr_curr_format.
- fmt_alt = *((int *)(mp->b_cont->b_rptr));
-
- /*FALLTHROUGH*/
- case USB_AUDIO_SET_SAMPLE_FREQ:
- case USB_AUDIO_SETUP:
- case USB_AUDIO_START_PLAY:
- case USB_AUDIO_PAUSE_PLAY:
- case USB_AUDIO_START_RECORD:
- case USB_AUDIO_STOP_RECORD:
- case USB_AUDIO_TEARDOWN:
- error = USB_SUCCESS;
- break;
- default:
+/*
+ * usb_ac_find_default_port:
+ */
+static int
+usb_ac_find_default_port(uint_t port)
+{
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ if (port & (1 << i)) {
+
+ return (1 << i);
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+ * Register with mixer only after first plumbing.
+ * Also do not register if earlier reg data
+ * couldn't be received from at least one
+ * streaming interface
+ */
+_NOTE(SCHEME_PROTECTS_DATA("private", am_ad_info))
+
+static int
+usb_ac_mixer_registration(usb_ac_state_t *uacp)
+{
+ am_ad_info_t *info = &uacp->usb_ac_am_ad_info;
+ audio_info_t *dflts = &uacp->usb_ac_am_ad_defaults;
+ usb_as_registration_t *asreg;
+ int n, nplay, nrec;
+ char *nm = "usb_ac_mixer_registration";
+
+ ASSERT(uacp != NULL);
+
+ dinfo("%s: %s infp=0x%p, dflts=0x%p, already registered=%d\n",
+ uacp->dstr, nm, (void *)info, (void *)dflts,
+ uacp->usb_ac_registered_with_mixer);
+
+ ASSERT(dflts != NULL);
+ ASSERT(info != NULL);
+
+ if (uacp->usb_ac_registered_with_mixer) {
+ return (USB_SUCCESS);
+ }
+
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
+ if (uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
break;
}
- break;
- case M_ERROR:
- default:
- error = USB_FAILURE;
}
- if (mp) {
- usb_ac_free_mblk(mp);
- streams_infop->acs_ac_to_as_req.acr_reply_mp = NULL;
+ /* Haven't found a streaming interface; fail mixer registration */
+ if (n > USB_AC_MAX_AS_PLUMBED) {
+ dinfo("%s: %s - no streaming interface found\n",
+ uacp->dstr, nm);
+
+ return (USB_FAILURE);
}
- return (error);
+ info->ad_defaults = dflts;
+
+ dflts->monitor_gain = 0;
+ dflts->output_muted = B_FALSE;
+ dflts->hw_features = 0;
+ dflts->sw_features = AUDIO_SWFEATURE_MIXER;
+
+ /*
+ * Fill out streaming interface specific stuff
+ * Note that we handle only one playing and one recording
+ * streaming interface at the most
+ */
+ nplay = nrec = 0;
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
+ int ch, chs, default_gain, id;
+
+ if (uacp->usb_ac_streams[n].acs_rcvd_reg_data == 0) {
+ continue;
+ }
+
+ asreg = uacp->usb_ac_streams[n].acs_streams_reg;
+ if (asreg->reg_valid == 0) {
+ continue;
+ }
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ dinfo("%s: %s [%d] - setting format on %s%d\n",
+ uacp->dstr, nm, n,
+ uacp->usb_ac_streams[n].acs_plumbed->acp_dip);
+
+ /* set first format so get_featureID can be succeed */
+ (void) usb_ac_set_format(uacp->usb_ac_audiohdl,
+ asreg->reg_mode,
+ asreg->reg_srs[0],
+ asreg->reg_formats[0].fmt_chns,
+ asreg->reg_formats[0].fmt_precision,
+ asreg->reg_formats[0].fmt_encoding);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ chs = asreg->reg_formats[0].fmt_chns;
+
+ /* check if any channel supports vol. control for this fmt */
+ for (ch = 0; ch <= chs; ch++) {
+ if ((id = usb_ac_get_featureID(uacp,
+ asreg->reg_mode, ch,
+ USB_AUDIO_VOLUME_CONTROL)) != -1) {
+ ddtl("%s: %s [%d] - dir=%d featureID=%d\n",
+ uacp->dstr, nm, n, asreg->reg_mode, id);
+
+ break;
+ }
+ }
+ default_gain = (id == USB_AC_ID_NONE) ?
+ AUDIO_MAX_GAIN : (AUDIO_MAX_GAIN/2);
+
+ ddtl("%s: %s [%d] - mode=%d chs=%d default_gain=%d id=%d\n",
+ uacp->dstr, nm, n, asreg->reg_mode, chs, default_gain, id);
+
+ if (asreg->reg_mode == AUDIO_PLAY) {
+ nplay++;
+ ASSERT(nplay == 1);
+
+ dflts->play.sample_rate =
+ asreg->reg_srs[0];
+ dflts->play.channels =
+ asreg->reg_formats[0].fmt_chns;
+ dflts->play.precision =
+ asreg->reg_formats[0].fmt_precision;
+ dflts->play.encoding =
+ asreg->reg_formats[0].fmt_encoding;
+ dflts->play.gain = default_gain;
+ dflts->play.port = usb_ac_find_default_port(
+ uacp->usb_ac_output_ports);
+ dflts->play.avail_ports = uacp->usb_ac_output_ports;
+ dflts->play.mod_ports = 0;
+ /* no support for mixer unit */
+ dflts->play.buffer_size = 8*1024;
+ dflts->hw_features |= AUDIO_HWFEATURE_PLAY;
+
+ info->ad_play.ad_mixer_srs.ad_srs = asreg->reg_srs;
+
+ info->ad_play.ad_chs = asreg->reg_channels;
+ info->ad_play.ad_int_rate = 1000; /* every 1 ms */
+ info->ad_play.ad_bsize = 8 * 1024;
+ info->ad_play_comb = asreg->reg_combinations;
+ } else {
+ nrec++;
+ ASSERT(nrec == 1);
+
+ dflts->record.sample_rate =
+ asreg->reg_srs[0];
+ dflts->record.channels =
+ asreg->reg_formats[0].fmt_chns;
+ dflts->record.precision =
+ asreg->reg_formats[0].fmt_precision;
+ dflts->record.encoding =
+ asreg->reg_formats[0].fmt_encoding;
+ dflts->record.gain = default_gain;
+ dflts->record.port = usb_ac_find_default_port(
+ uacp->usb_ac_input_ports);
+ dflts->record.avail_ports = uacp->usb_ac_input_ports;
+ dflts->record.mod_ports = uacp->usb_ac_input_ports;
+ dflts->record.buffer_size = 8*1024;
+ dflts->hw_features |= AUDIO_HWFEATURE_RECORD;
+
+ info->ad_record.ad_mixer_srs.ad_srs = asreg->reg_srs;
+
+ info->ad_record.ad_chs = asreg->reg_channels;
+ info->ad_record.ad_int_rate = 1000; /* every 1 ms */
+ info->ad_record.ad_bsize = 8 * 1024;
+ info->ad_num_mics = 1;
+ info->ad_rec_comb = asreg->reg_combinations;
+ }
+ }
+
+ if (nplay && nrec) {
+ dflts->hw_features |= AUDIO_HWFEATURE_DUPLEX;
+ }
+
+ /* the rest */
+ info->ad_entry = &usb_ac_entry;
+ info->ad_dev_info = &usb_dev_info;
+
+ dinfo("%s: %s - calling am_attach\n", uacp->dstr, nm);
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if (am_attach(uacp->usb_ac_audiohdl, DDI_ATTACH, info) ==
+ AUDIO_FAILURE) {
+ dinfo("%s: %s - am_attach failed\n", uacp->dstr, nm);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ }
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ uacp->usb_ac_registered_with_mixer = 1;
+
+ dinfo("%s: %s - am_attach succeeded\n", uacp->dstr, nm);
+
+ return (USB_SUCCESS);
}
/*
- * usb_ac_allocate_req_mblk:
- * Allocate a message block with the specified M_CTL cmd,
- * The 2nd mblk contains the data for the command with a length len
+ * get registration data from usb_as driver unless we already
+ * have 2 registrations
*/
-static mblk_t *
-usb_ac_allocate_req_mblk(usb_ac_state_t *uacp, int cmd, void *buf, uint_t len)
+static int
+usb_ac_get_reg_data(usb_ac_state_t *uacp, ldi_handle_t drv_lh, int index)
{
- mblk_t *mp, *mp2;
- struct iocblk *mctlmsg;
+ int n, error, rval;
+ usb_as_registration_t *streams_reg;
+ char *nm = "usb_ac_get_reg_data";
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_allocate_req_mblk: cmd=0x%x, buf=0x%p, len=%d",
- cmd, buf, len);
+ dinfo("%s: %s index=%d, mixer registered=%d\n", uacp->dstr, nm, index,
+ uacp->usb_ac_registered_with_mixer);
- mp = allocb_wait(sizeof (struct iocblk), BPRI_HI, STR_NOSIG, NULL);
- mp->b_datap->db_type = M_CTL;
- mctlmsg = (struct iocblk *)mp->b_datap->db_base;
- mctlmsg->ioc_cmd = cmd;
- mctlmsg->ioc_count = len;
+ /* if already registered, just setup data structures again */
+ if (uacp->usb_ac_registered_with_mixer) {
- mp->b_wptr = mp->b_wptr + sizeof (struct iocblk);
+ return (usb_ac_setup_plumbed(uacp, index, -1, -1));
+ }
- if ((len == 0) || (buf == NULL)) {
+ for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n ++) {
+ /*
+ * We haven't received registration data
+ * from n-th streaming interface in the array
+ */
+ if (!uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
+ break;
+ }
+ }
+
+ if (n >= USB_AC_MAX_AS_PLUMBED) {
+ dwarn("%s: More than 2 streaming interfaces (play "
+ "and/or record) currently not supported\n", uacp->dstr);
- return (mp);
+ return (USB_FAILURE);
}
- mp2 = allocb_wait(len, BPRI_HI, STR_NOSIG, NULL);
- mp->b_cont = mp2;
- bcopy(buf, mp->b_cont->b_datap->db_base, len);
- mp->b_cont->b_wptr = mp->b_cont->b_wptr + len;
+ /* take the stream reg struct with the same index */
+ streams_reg = &uacp->usb_ac_streams_reg[n];
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_allocate_req_mblk: mp=0x%p", (void *)mp);
+ dinfo("%s: regdata from usb_as: streams_reg=0x%p, n=%d\n", uacp->dstr,
+ (void *)streams_reg, n);
+
+ mutex_exit(&uacp->usb_ac_mutex);
+
+ if ((error = ldi_ioctl(drv_lh, USB_AUDIO_MIXER_REGISTRATION,
+ (intptr_t)streams_reg, FKIOCTL, kcred, &rval)) != 0) {
+ dinfo("%s: %s - ldi_ioctl failed for mixer registration, "
+ "error=%d", uacp->dstr, nm, error);
+
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ return (USB_FAILURE);
+ } else {
+ mutex_enter(&uacp->usb_ac_mutex);
+
+ rval = usb_ac_setup_plumbed(uacp, index, n, n);
+
+ dinfo("%s: %s - usb_ac_streams[%d]: "
+ "received_reg_data=%d type=%s", uacp->dstr, nm, index,
+ uacp->usb_ac_streams[n].acs_rcvd_reg_data,
+ ((streams_reg->reg_mode == AUDIO_PLAY) ?
+ "play" : "record"));
- return (mp);
+ usb_ac_print_reg_data(uacp, streams_reg);
+
+ return (rval);
+ }
}
/*
- * usb_ac_free_mblk:
- * Free the message block
+ * setup plumbed and stream info structure, either initially or
+ * after replumbing
+ * On replumbing, str_idx and reg_idx are -1
*/
-static void
-usb_ac_free_mblk(mblk_t *mp)
+static int
+usb_ac_setup_plumbed(usb_ac_state_t *uacp, int plb_idx, int str_idx,
+ int reg_idx)
{
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
+ int i;
+ char *nm = "usb_ac_setup_plumbed";
+
+ dinfo("%s: %s plb_idx=%d str_idx=%d\n", uacp->dstr, nm,
+ plb_idx, str_idx);
+
+ if (str_idx == -1) {
+ /* find a free streams info structure */
+ for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
+ if (uacp->usb_ac_streams[i].acs_plumbed == NULL) {
+ break;
+ }
+ }
+ ASSERT(i < USB_AC_MAX_AS_PLUMBED);
+ str_idx = i;
}
- freemsg(mp);
+
+ uacp->usb_ac_plumbed[plb_idx].acp_data =
+ &uacp->usb_ac_streams[str_idx];
+ uacp->usb_ac_streams[str_idx].acs_plumbed =
+ &uacp->usb_ac_plumbed[plb_idx];
+ uacp->usb_ac_streams[str_idx].acs_rcvd_reg_data = 1;
+
+ if (reg_idx == -1) {
+ /*
+ * find the corresponding registration structure, match
+ * on interface number and not on dip since dip may have
+ * changed
+ */
+ for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
+ if (uacp->usb_ac_streams_reg[i].reg_ifno ==
+ uacp->usb_ac_plumbed[plb_idx].acp_ifno) {
+ break;
+ }
+ }
+ if (i == USB_AC_MAX_AS_PLUMBED) {
+ dinfo("%s: %s - no corresponding registration "
+ "structure\n", uacp->dstr, nm);
+
+ return (USB_FAILURE);
+ }
+ reg_idx = i;
+ }
+ uacp-> usb_ac_streams[str_idx].acs_streams_reg =
+ &uacp->usb_ac_streams_reg[reg_idx];
+
+ dinfo("%s: %s done - plb_idx=%d str_idx=%d reg_idx=%d", uacp->dstr, nm,
+ plb_idx, str_idx, reg_idx);
+
+ return (USB_SUCCESS);
}
/*
- * usb_ac_serialize/release_access:
+ * function to dump registration data
*/
static void
-usb_ac_serialize_access(usb_ac_state_t *uacp)
+usb_ac_print_reg_data(usb_ac_state_t *uacp,
+ usb_as_registration_t *reg)
{
- (void) usb_serialize_access(uacp->usb_ac_ser_acc, USB_WAIT, 0);
+ int n;
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_print_reg_data: Begin valid=%d, play=%d, "
+ "n_formats=%d, compat srs ptr=0x%p",
+ reg->reg_valid, reg->reg_mode, reg->reg_n_formats,
+ (void *)&reg->reg_srs);
+
+ for (n = 0; n < reg->reg_n_formats; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "format%d: alt=%d chns=%d prec=%d enc=%d", n,
+ reg->reg_formats[n].fmt_alt,
+ reg->reg_formats[n].fmt_chns,
+ reg->reg_formats[n].fmt_precision,
+ reg->reg_formats[n].fmt_encoding);
+ }
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "combinations: %d %d %d %d %d %d %d %d",
+ reg->reg_combinations[0].ad_prec, reg->reg_combinations[0].ad_enc,
+ reg->reg_combinations[1].ad_prec, reg->reg_combinations[1].ad_enc,
+ reg->reg_combinations[2].ad_prec, reg->reg_combinations[2].ad_enc,
+ reg->reg_combinations[3].ad_prec, reg->reg_combinations[3].ad_enc);
+
+
+ for (n = 0; n < USB_AS_N_FORMATS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_formats[%d] ptr=0x%p", n,
+ (void *)&reg->reg_formats[n]);
+ }
+
+ for (n = 0; n < USB_AS_N_CHANNELS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_channels[%d]=%d", n, reg->reg_channels[n]);
+ }
+
+ for (n = 0; n < USB_AS_N_COMBINATIONS; n++) {
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "reg_combinations[%d] ptr=0x%p", n,
+ (void *)&reg->reg_combinations[n]);
+ }
+
+ USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
+ "usb_ac_print_reg_data: End");
}
-static void
-usb_ac_release_access(usb_ac_state_t *uacp)
+
+static int
+usb_ac_online_siblings(usb_ac_state_t *uacp)
{
- usb_release_access(uacp->usb_ac_ser_acc);
+ dev_info_t *pdip, *child_dip;
+ int rval = USB_SUCCESS;
+ char *nm = "usb_ac_online_siblings";
+
+ ASSERT(mutex_owned(&uacp->usb_ac_mutex));
+
+ dinfo("%s: %s\n", uacp->dstr, nm);
+
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+
+ dinfo("%s: onlining %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip),
+ ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
+
+ /* Online the child_dip of usb_as and hid, if not already */
+ if ((strcmp(ddi_driver_name(child_dip), "usb_as") == 0) ||
+ (strcmp(ddi_driver_name(child_dip), "hid") == 0)) {
+
+ mutex_exit(&uacp->usb_ac_mutex);
+ if (ndi_devi_online(child_dip, NDI_ONLINE_ATTACH) !=
+ NDI_SUCCESS) {
+ dinfo("%s: failed to online device %s%d\n",
+ uacp->dstr,
+ ddi_driver_name(child_dip),
+ ddi_get_instance(child_dip));
+
+ /* only onlining usb_as is fatal */
+ if (strcmp(ddi_driver_name(child_dip),
+ "usb_as") == 0) {
+ mutex_enter(&uacp->usb_ac_mutex);
+ rval = USB_FAILURE;
+ break;
+ }
+ }
+ mutex_enter(&uacp->usb_ac_mutex);
+ }
+ child_dip = ddi_get_next_sibling(child_dip);
+ }
+
+ return (rval);
}
+/*
+ * hold all audio children before or after plumbing
+ * online usb_as and hid, if not already
+ */
static void
-usb_ac_pm_busy_component(usb_ac_state_t *usb_ac_statep)
+usb_ac_hold_siblings(usb_ac_state_t *uacp)
{
- ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+ int circ;
+ dev_info_t *pdip, *child_dip;
+ char *nm = "usb_ac_hold_siblings";
- if (usb_ac_statep->usb_ac_pm != NULL) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy++;
-
- USB_DPRINTF_L4(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_busy_component: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ dinfo("%s: %s\n", uacp->dstr, nm);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
+ /* hold all siblings and ourselves */
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
- if (pm_busy_component(usb_ac_statep->usb_ac_dip, 0) !=
- DDI_SUCCESS) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+ /* hold the children */
+ ndi_devi_enter(pdip, &circ);
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+ ndi_hold_devi(child_dip);
- USB_DPRINTF_L2(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_busy_component failed: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ dinfo("%s: held %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip), ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
- }
+ child_dip = ddi_get_next_sibling(child_dip);
}
+ ndi_devi_exit(pdip, circ);
}
+/*
+ * release all audio children before or after plumbing
+ */
static void
-usb_ac_pm_idle_component(usb_ac_state_t *usb_ac_statep)
+usb_ac_rele_siblings(usb_ac_state_t *uacp)
{
- ASSERT(!mutex_owned(&usb_ac_statep->usb_ac_mutex));
+ int circ;
+ dev_info_t *pdip, *child_dip;
+ char *nm = "usb_ac_rele_siblings";
- if (usb_ac_statep->usb_ac_pm != NULL) {
- if (pm_idle_component(usb_ac_statep->usb_ac_dip, 0) ==
- DDI_SUCCESS) {
- mutex_enter(&usb_ac_statep->usb_ac_mutex);
- ASSERT(usb_ac_statep->usb_ac_pm->acpm_pm_busy > 0);
- usb_ac_statep->usb_ac_pm->acpm_pm_busy--;
+ dinfo("%s: %s\n", uacp->dstr, nm);
- USB_DPRINTF_L4(PRINT_MASK_PM,
- usb_ac_statep->usb_ac_log_handle,
- "usb_ac_pm_idle_component: %d",
- usb_ac_statep->usb_ac_pm->acpm_pm_busy);
+ /* release all siblings and ourselves */
+ pdip = ddi_get_parent(uacp->usb_ac_dip);
+ ndi_devi_enter(pdip, &circ);
+ child_dip = ddi_get_child(pdip);
+ while (child_dip != NULL) {
+ ndi_rele_devi(child_dip);
- mutex_exit(&usb_ac_statep->usb_ac_mutex);
- }
+ dinfo("%s: released %s%d ref=%d\n", uacp->dstr,
+ ddi_driver_name(child_dip), ddi_get_instance(child_dip),
+ DEVI(child_dip)->devi_ref);
+
+ child_dip = ddi_get_next_sibling(child_dip);
}
+ ndi_devi_exit(pdip, circ);
}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
index 6318d089bd..cf1da6fa0d 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac.conf
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
@@ -29,15 +29,6 @@
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-enabled = 0; <-- mixer disabled, old audio(7I) behavior
-# mixer-enabled = 1; <-- mixer enabled
-#
-
-mixer-enabled = 1;
#
# Uncomment reset-configuration to cause the usb_ac driver's state to
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c b/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c
deleted file mode 100644
index d23b379c7c..0000000000
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ac/usb_ac_dacf.c
+++ /dev/null
@@ -1,1202 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * This is a dacf module for usb audio plumbing/unplumbing based
- * upon the Extensions to Device Autoconfiguration project. See
- * PSARC/1998/212 for more details.
- *
- * This module provides the dacf functions to be called after a
- * driver has attached and before it detaches.
- * Particularly, the usb_ac_mux_plumbing() is called after
- * usb_ac_attach() is called and usb_ac_mux_unplumbing() is called
- * before usb_ac_detach() is going to be called. This facilitates
- * the configuration of usb_as and hid under usb_ac and also
- * provides * usb_ac and usb_as hotplugging.
- *
- * This dacf module only supports usb_as and hid plumbing under
- * usb_ac.
- *
- * Note: This module shares some common data structures with usb_ac
- * module. So it would require dependency on usb_ac for the module
- * loading. But the side effect for usb_ac_dacf to depend on usb_ac
- * is a deadlock situation created when doing "modunload -i
- * <usb_ac_dacf_mod_id>" before "modunload -i <usb_ac_mod_id".
- * To avoid the dependency, space_store() and space_fetch() are
- * used to share the usb_ac data structure with usb_ac_dacf.
- */
-#include <sys/usb/usba/usbai_version.h>
-#include <sys/usb/usba.h>
-#include <sys/sunndi.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-
-#include <sys/usb/clients/audio/usb_audio.h>
-#include <sys/usb/clients/audio/usb_mixer.h>
-#include <sys/usb/clients/audio/usb_ac/usb_ac.h>
-
-#include <sys/stropts.h>
-#include <sys/dacf.h>
-
-/* for getting the minor node info from hid */
-#include <sys/usb/clients/hid/hidminor.h>
-#include <sys/usb/clients/audio/usb_as/usb_as.h>
-
-/*
- * Dacf entry points
- */
-static int usb_ac_mux_plumbing(dacf_infohdl_t, dacf_arghdl_t, int);
-static int usb_ac_mux_unplumbing(dacf_infohdl_t, dacf_arghdl_t, int);
-
-/*
- * External functions
- */
-extern uint_t nproc;
-#define INIT_PROCESS_CNT 3
-
-extern uintptr_t space_fetch(char *);
-
-/*
- * Internal functions
- */
-static int usb_ac_mux_walk_siblings(usb_ac_state_t *, ldi_handle_t);
-static void usb_ac_print_reg_data(usb_ac_state_t *,
- usb_as_registration_t *);
-static int usb_ac_get_reg_data(usb_ac_state_t *, ldi_handle_t, int);
-static int usb_ac_setup_plumbed(usb_ac_state_t *, int, int, int);
-static int usb_ac_mixer_registration(usb_ac_state_t *,
- usb_ac_state_space_t *);
-static void usb_ac_hold_siblings(usb_ac_state_t *);
-static int usb_ac_online_siblings(usb_ac_state_t *);
-static void usb_ac_rele_siblings(usb_ac_state_t *);
-
-static am_ad_entry_t *usb_ac_entry;
-_NOTE(SCHEME_PROTECTS_DATA("stable data", usb_ac_entry))
-
-
-/* just generic, USB Audio, 1.0 spec-compliant */
-static audio_device_t usb_dev_info =
- { {"USB Audio"}, {"1.0"}, {"external"} };
-
-static dacf_op_t usb_ac_plumb_op[] = {
- { DACF_OPID_POSTATTACH, usb_ac_mux_plumbing },
- { DACF_OPID_PREDETACH, usb_ac_mux_unplumbing },
- { DACF_OPID_END, NULL },
-};
-
-static dacf_opset_t opsets[] = {
- { "usb_audio_config", usb_ac_plumb_op },
- { NULL, NULL }
-};
-
-struct dacfsw usb_audio_dacfsw = {
- DACF_MODREV_1,
- opsets,
-};
-
-struct modldacf usb_audio_dacf = {
- &mod_dacfops, /* Type of module */
- "USB_AC_DACF",
- &usb_audio_dacfsw
-};
-
-struct modlinkage usb_audio_modlinkage = {
- MODREV_1, (void *)&usb_audio_dacf, NULL
-};
-
-
-int
-_init(void)
-{
- return (mod_install(&usb_audio_modlinkage));
-}
-
-
-int
-_fini()
-{
- return (mod_remove(&usb_audio_modlinkage));
-}
-
-
-int
-_info(struct modinfo *modinfop)
-{
- return (mod_info(&usb_audio_modlinkage, modinfop));
-}
-
-
-/*
- * This routine is called at post attach time for the usb_ac module
- * by the DACF framework.
- */
-/*ARGSUSED*/
-static int
-usb_ac_mux_plumbing(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
-{
- major_t major;
- minor_t minor;
- int instance;
- usb_ac_state_t *uacp;
- usb_ac_state_space_t *ssp;
- dev_info_t *dip;
- int error;
- ldi_handle_t mux_lh;
- dev_t mux_devt;
- ldi_ident_t li;
-
- /* get the usb_ac dip */
- dip = dacf_devinfo_node(info_hdl);
- instance = ddi_get_instance(dip);
-
- /* Retrieve the soft state information */
- if ((ssp = (usb_ac_state_space_t *)space_fetch("usb_ac")) ==
- NULL) {
-
- return (DACF_FAILURE);
- }
-
- if ((uacp = (usb_ac_state_t *)ddi_get_soft_state(ssp->sp,
- instance)) == NULL) {
-
- return (DACF_FAILURE);
- }
- ASSERT(dip == uacp->usb_ac_dip);
-
- usb_ac_entry = ssp->ac_entryp;
-
- /* Access to the global variables is synchronized */
- mutex_enter(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_plumbing callback, state=%d",
- uacp->usb_ac_plumbing_state);
-
- /*
- * by design, dacf will try to plumb again if an unplumb failed.
- * therefore, just return success
- */
- if (uacp->usb_ac_plumbing_state >= USB_AC_STATE_PLUMBED) {
- mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "audio streams driver already plumbed");
-
- return (DACF_SUCCESS);
- }
-
- /* usb_as and hid should be attached but double check */
- if (usb_ac_online_siblings(uacp) != USB_SUCCESS) {
- mutex_exit(&uacp->usb_ac_mutex);
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "no audio streams driver plumbed");
-
- return (DACF_FAILURE);
- }
-
- major = ddi_driver_major(dip);
- ASSERT(major != (major_t)-1);
-
- minor = dacf_minor_number(info_hdl);
- ASSERT(minor == uacp->usb_ac_mux_minor);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "major 0x%x, minor %d usb_ac_mux_plumbing: driver name "
- "%s\n", major, minor, (char *)dacf_driver_name(info_hdl));
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* bring the device to full power */
- (ssp->pm_busy_component)(uacp);
- (void) pm_raise_power(dip, 0, USB_DEV_OS_FULL_PWR);
-
- /* avoid dips disappearing while we are plumbing */
- usb_ac_hold_siblings(uacp);
-
- /* opening usb_ac for plumbing underneath */
- mux_devt = makedevice(major, minor);
- error = ldi_ident_from_mod(&usb_audio_modlinkage, &li);
- if (error == 0) {
- error = ldi_open_by_dev(&mux_devt, OTYP_CHR,
- FREAD|FWRITE|FNOCTTY|FNONBLOCK, kcred, &mux_lh, li);
- ldi_ident_release(li);
- }
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "open failed, error=%d", error);
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_mux_lh = mux_lh;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "mux_lh=0x%p", (void *)mux_lh);
-
- /*
- * walk all siblings and create the usb_ac<->usb_as and
- * usb_ac<->hid streams. return of 0 indicates no or
- * partial/failed plumbing
- */
- if (usb_ac_mux_walk_siblings(uacp, mux_lh) == 0) {
- /* pretend that we are plumbed so we can unplumb */
- uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- (void) usb_ac_mux_unplumbing(info_hdl, arg_hdl, flags);
-
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "no audio streams driver plumbed");
-
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
- uacp->usb_ac_plumbing_state = USB_AC_STATE_PLUMBED;
-
- /* restore state if we have already registered with the mixer */
- if (uacp->usb_ac_registered_with_mixer) {
-
- (void) (ssp->restore_func)(uacp, USB_FLAGS_SLEEP);
-
- } else if (usb_ac_mixer_registration(uacp, ssp) != USB_SUCCESS) {
- mutex_exit(&uacp->usb_ac_mutex);
-
- (void) usb_ac_mux_unplumbing(info_hdl, arg_hdl, flags);
-
- USB_DPRINTF_L1(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "mixer registration failed");
-
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_FAILURE);
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
- usb_ac_rele_siblings(uacp);
-
- (ssp->pm_idle_component)(uacp);
-
- return (DACF_SUCCESS);
-}
-
-
-/*
- * This is the pre-detach routine invoked for usb_ac module by DACF framework
- */
-/*ARGSUSED*/
-static int
-usb_ac_mux_unplumbing(dacf_infohdl_t info_hdl, dacf_arghdl_t arg_hdl, int flags)
-{
- usb_ac_state_t *uacp;
- usb_ac_state_space_t *ssp;
- dev_info_t *dip;
- ldi_handle_t mux_lh;
- dev_info_t *child_dip;
- int i, error;
- int maxlinked = 0;
-
- /* this is the usb_ac dip */
- dip = dacf_devinfo_node(info_hdl);
-
- /* Retrieve the soft state information */
- if ((ssp = (usb_ac_state_space_t *)space_fetch("usb_ac")) ==
- NULL) {
-
- return (DACF_FAILURE);
- }
-
- if ((uacp = (usb_ac_state_t *)ddi_get_soft_state(ssp->sp,
- ddi_get_instance(dip))) == NULL) {
-
- return (DACF_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing callback, state=%d",
- uacp->usb_ac_plumbing_state);
-
- ASSERT(uacp->usb_ac_plumbing_state != USB_AC_STATE_UNPLUMBED);
-
- if (uacp->usb_ac_plumbing_state == USB_AC_STATE_UNPLUMBED) {
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "already unplumbed!");
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (DACF_SUCCESS);
- }
-
- ASSERT(dip == uacp->usb_ac_dip);
-
- mux_lh = uacp->usb_ac_mux_lh;
-
- /* usb_ac might not have anything plumbed yet */
- if (uacp->usb_ac_current_plumbed_index == -1) {
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "nothing plumbed!");
- uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
-
- goto close_mux;
- }
-
- /* do not allow detach if still busy */
- if (uacp->usb_ac_busy_count) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "mux still open (%d %d)", uacp->usb_ac_busy_count,
- e_ddi_devi_holdcnt(dip));
- mutex_exit(&uacp->usb_ac_mutex);
-
- return (DACF_FAILURE);
- }
-
- uacp->usb_ac_plumbing_state = USB_AC_STATE_UNPLUMBED;
-
- /* wait till tasks have drained using save state */
- mutex_exit(&uacp->usb_ac_mutex);
- (void) audio_sup_save_state(uacp->usb_ac_audiohdl,
- AUDIO_ALL_DEVICES, AUDIO_BOTH);
- mutex_enter(&uacp->usb_ac_mutex);
-
- mux_lh = uacp->usb_ac_mux_lh;
- ASSERT(mux_lh != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing mux_lh 0x%p", (void *)mux_lh);
-
- /* unlink and close ac-as and ac-hid streams */
- maxlinked = uacp->usb_ac_current_plumbed_index + 1;
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing maxlinked %d", maxlinked);
-
- for (i = 0; i < maxlinked; i++) {
- int linkid = uacp->usb_ac_plumbed[i].acp_linkid;
-
- child_dip = uacp->usb_ac_plumbed[i].acp_dip;
- uacp->usb_ac_current_plumbed_index = i;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing linkid %d ", linkid);
-
- if (child_dip) {
- int rval;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- error = ldi_ioctl(mux_lh, I_PUNLINK, (intptr_t)linkid,
- FKIOCTL, kcred, &rval);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "%s%d: unplink, error=%d",
- ddi_driver_name(child_dip),
- ddi_get_instance(child_dip), error);
-
- mutex_enter(&uacp->usb_ac_mutex);
- }
-
- }
-
-close_mux:
- if (mux_lh) {
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(mux_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "closed mux");
- uacp->usb_ac_mux_lh = NULL;
- }
-
- uacp->usb_ac_current_plumbed_index = -1;
- mutex_exit(&uacp->usb_ac_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_unplumbing: done");
-
- return (DACF_SUCCESS);
-}
-
-
-/*
- * walk all siblings and create the ac<->as and ac<->hid streams
- */
-static int
-usb_ac_mux_walk_siblings(usb_ac_state_t *uacp, ldi_handle_t mux_lh)
-{
- dev_info_t *pdip;
- dev_info_t *child_dip;
- major_t drv_major;
- minor_t drv_minor;
- int drv_instance;
- dev_t drv_devt;
- ldi_handle_t drv_lh;
- ldi_ident_t li;
- int linkid;
- int error;
- int count = 0;
-
- ASSERT(mutex_owned(&uacp->usb_ac_mutex));
-
- mutex_exit(&uacp->usb_ac_mutex);
- pdip = ddi_get_parent(uacp->usb_ac_dip);
- mutex_enter(&uacp->usb_ac_mutex);
-
- child_dip = ddi_get_child(pdip);
-
- while ((child_dip != NULL) && (count < USB_AC_MAX_PLUMBED)) {
- drv_instance = ddi_get_instance(child_dip);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "plumbing %s%d", ddi_driver_name(child_dip), drv_instance);
-
- /* ignore own dip */
- if (child_dip == uacp->usb_ac_dip) {
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
- drv_instance = ddi_get_instance(child_dip);
-
- /* ignore other dip other than usb_as and hid */
- if (strcmp(ddi_driver_name(child_dip), "usb_as") == 0) {
- uacp->usb_ac_plumbed[count].acp_driver = USB_AS_PLUMBED;
- drv_minor = USB_AS_CONSTRUCT_MINOR(drv_instance);
- } else if (strcmp(ddi_driver_name(child_dip), "hid") == 0) {
- uacp->usb_ac_plumbed[count].acp_driver = USB_AH_PLUMBED;
- drv_minor = HID_CONSTRUCT_EXTERNAL_MINOR(drv_instance);
- } else {
- drv_minor = drv_instance;
- uacp->usb_ac_plumbed[count].acp_driver =
- UNKNOWN_PLUMBED;
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
- if (!i_ddi_devi_attached(child_dip)) {
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
- if (DEVI_IS_DEVICE_REMOVED(child_dip)) {
- child_dip = ddi_get_next_sibling(child_dip);
-
- continue;
- }
-
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "opening %s%d", ddi_driver_name(child_dip), drv_instance);
-
- drv_major = ddi_driver_major(child_dip);
-
- uacp->usb_ac_current_plumbed_index = count;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- drv_devt = makedevice(drv_major, drv_minor);
-
- error = ldi_ident_from_mod(&usb_audio_modlinkage, &li);
- if (error == 0) {
- error = ldi_open_by_dev(&drv_devt, OTYP_CHR,
- FREAD|FWRITE, kcred, &drv_lh, li);
- ldi_ident_release(li);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "ldi_open_by_dev failed on major = %d minor = %d, "
- "name = %s error=%d", drv_major, drv_instance,
- ddi_driver_name(child_dip), error);
- mutex_exit(&uacp->usb_ac_mutex);
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (0);
- }
-
- uacp->usb_ac_plumbed[count].acp_dip = child_dip;
- uacp->usb_ac_plumbed[count].acp_ifno =
- usb_get_if_number(child_dip);
-
- if (uacp->usb_ac_plumbed[count].acp_driver == USB_AS_PLUMBED) {
- /* get registration data */
- if (usb_ac_get_reg_data(uacp, drv_lh, count) !=
- USB_SUCCESS) {
-
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "get_reg_data failed on major = %d "
- "minor = %d, name = %s", drv_major,
- drv_instance,
- ddi_driver_name(child_dip));
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- return (0);
- }
- } else if (uacp->usb_ac_plumbed[count].acp_driver ==
- USB_AH_PLUMBED) {
- int rval;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* push usb_ah module on top of hid */
- error = ldi_ioctl(drv_lh, I_PUSH, (intptr_t)"usb_ah",
- FKIOCTL, kcred, &rval);
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "ldi_ioctl failed for usb_ah, "
- "major:%d minor:%d name:%s",
- drv_major, drv_instance,
- ddi_driver_name(child_dip));
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- /* skip plumbing the hid driver */
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
- } else {
- /* should not be here */
- USB_DPRINTF_L2(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_mux_plumbing: unknown module");
- count --;
-
- mutex_exit(&uacp->usb_ac_mutex);
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_plumbed[count].acp_dip = NULL;
-
- /* skip plumbing an unknown module */
- child_dip = ddi_get_next_sibling(child_dip);
- continue;
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "linking %s%d", ddi_driver_name(child_dip), drv_instance);
-
- /* usb_ac_plumb_ioctl sets lwq, this entry should be free */
- ASSERT(uacp->usb_ac_plumbed[count].acp_lwq == NULL);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* plumbing one at a time */
- error = ldi_ioctl(mux_lh, I_PLINK, (intptr_t)drv_lh,
- FREAD|FWRITE|FNOCTTY|FKIOCTL, kcred, &linkid);
-
- (void) ldi_close(drv_lh, FREAD|FWRITE, kcred);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- if (error) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "plink failed for major:%d minor:%d"
- "name:%s", drv_major, drv_instance,
- ddi_driver_name(child_dip));
-
- return (0);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "link id %s%d 0x%x", ddi_driver_name(child_dip),
- ddi_get_instance(child_dip), linkid);
-
- /* lwq should be set by usb_ac_plumb_ioctl by now */
- ASSERT(uacp->usb_ac_plumbed[count].acp_lwq != NULL);
-
- uacp->usb_ac_plumbed[count++].acp_linkid = linkid;
-
- child_dip = ddi_get_next_sibling(child_dip);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "%d drivers plumbed under usb_ac mux", count);
-
- return (count);
-}
-
-
-/*
- * usb_ac_find_default_port:
- */
-static int
-usb_ac_find_default_port(uint_t port)
-{
- int i;
-
- for (i = 0; i < 32; i++) {
- if (port & (1 << i)) {
-
- return (1 << i);
- }
- }
-
- return (0);
-}
-
-
-/*
- * Register with mixer only after first plumbing.
- * Also do not register if earlier reg data
- * couldn't be received from at least one
- * streaming interface
- */
-_NOTE(SCHEME_PROTECTS_DATA("private", am_ad_info))
-
-static int
-usb_ac_mixer_registration(usb_ac_state_t *uacp, usb_ac_state_space_t *ssp)
-{
- am_ad_info_t *info = &uacp->usb_ac_am_ad_info;
- audio_info_t *dflts = &uacp->usb_ac_am_ad_defaults;
- usb_as_registration_t *asreg;
- int n, nplay, nrec;
-
- ASSERT(uacp != NULL);
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_mixer_registration: infp=0x%p, dflts=0x%p",
- (void *)info, (void *)dflts);
-
- ASSERT(dflts != NULL);
- ASSERT(info != NULL);
-
- if (uacp->usb_ac_registered_with_mixer) {
-
- return (USB_SUCCESS);
- }
-
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
- if (uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
- break;
- }
- }
-
- /* Haven't found a streaming interface; fail mixer registration */
- if (n > USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "no streaming interface");
-
- return (USB_FAILURE);
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "usb_ac_mixer_registration: mixer enabled =%d",
- uacp->usb_ac_mixer_mode_enable);
-
- info->ad_int_vers = AM_VERSION;
- info->ad_mode = (uacp->usb_ac_mixer_mode_enable ?
- AM_MIXER_MODE : AM_COMPAT_MODE);
-
- info->ad_add_mode = 0;
- info->ad_codec_type = AM_TRAD_CODEC;
- info->ad_defaults = dflts;
-
- dflts->monitor_gain = 0;
- dflts->output_muted = B_FALSE;
- dflts->hw_features = 0;
- dflts->sw_features = AUDIO_SWFEATURE_MIXER;
-
- /*
- * Fill out streaming interface specific stuff
- * Note that we handle only one playing and one recording
- * streaming interface at the most
- */
- nplay = nrec = 0;
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n++) {
- int ch, chs, default_gain, id;
-
- if (uacp->usb_ac_streams[n].acs_rcvd_reg_data == 0) {
- continue;
- }
-
- asreg = uacp->usb_ac_streams[n].acs_streams_reg;
- if (asreg->reg_valid == 0) {
- continue;
- }
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- /* set first format so get_featureID can be succeed */
- (void) ssp->ac_entryp->ad_set_format(uacp->usb_ac_audiohdl, 0,
- asreg->reg_mode,
- asreg->reg_compat_srs.ad_srs[0],
- asreg->reg_formats[0].fmt_chns,
- asreg->reg_formats[0].fmt_precision,
- asreg->reg_formats[0].fmt_encoding);
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- chs = asreg->reg_formats[0].fmt_chns;
-
- /* check if any channel supports vol. control for this fmt */
- for (ch = 0; ch <= chs; ch++) {
- if ((id = ssp->get_featureID_func(uacp,
- asreg->reg_mode, ch,
- USB_AUDIO_VOLUME_CONTROL)) != -1) {
- USB_DPRINTF_L3(PRINT_MASK_ATTA,
- uacp->usb_ac_log_handle,
- "dir=%d featureID=%d",
- asreg->reg_mode, id);
-
- break;
- }
- }
- default_gain = (id == USB_AC_ID_NONE) ?
- AUDIO_MAX_GAIN : (AUDIO_MAX_GAIN/2);
-
- USB_DPRINTF_L3(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "mode=%d chs=%d default_gain=%d id=%d",
- asreg->reg_mode, chs, default_gain, id);
-
- if (asreg->reg_mode == AUDIO_PLAY) {
- nplay++;
- ASSERT(nplay == 1);
-
- dflts->play.sample_rate =
- asreg->reg_compat_srs.ad_srs[0];
- dflts->play.channels =
- asreg->reg_formats[0].fmt_chns;
- dflts->play.precision =
- asreg->reg_formats[0].fmt_precision;
- dflts->play.encoding =
- asreg->reg_formats[0].fmt_encoding;
- dflts->play.gain = default_gain;
- dflts->play.port = usb_ac_find_default_port(
- uacp->usb_ac_output_ports);
- dflts->play.avail_ports = uacp->usb_ac_output_ports;
- dflts->play.mod_ports = 0;
- /* no support for mixer unit */
- dflts->play.buffer_size = 8*1024;
- dflts->play.balance = AUDIO_MID_BALANCE;
- dflts->hw_features |= AUDIO_HWFEATURE_PLAY;
-
- info->ad_play.ad_mixer_srs = asreg->reg_mixer_srs;
- info->ad_play.ad_compat_srs = asreg->reg_compat_srs;
- info->ad_play.ad_conv = &am_src2;
- info->ad_play.ad_sr_info = NULL;
- info->ad_play.ad_chs = asreg->reg_channels;
- info->ad_play.ad_int_rate = 1000; /* every 1 ms */
- info->ad_play.ad_max_chs = 200;
- info->ad_play.ad_bsize = 8 * 1024;
- info->ad_play_comb = asreg->reg_combinations;
- } else {
- nrec++;
- ASSERT(nrec == 1);
-
- dflts->record.sample_rate =
- asreg->reg_compat_srs.ad_srs[0];
- dflts->record.channels =
- asreg->reg_formats[0].fmt_chns;
- dflts->record.precision =
- asreg->reg_formats[0].fmt_precision;
- dflts->record.encoding =
- asreg->reg_formats[0].fmt_encoding;
- dflts->record.gain = default_gain;
- dflts->record.port = usb_ac_find_default_port(
- uacp->usb_ac_input_ports);
- dflts->record.avail_ports = uacp->usb_ac_input_ports;
- dflts->record.mod_ports = uacp->usb_ac_input_ports;
- dflts->record.buffer_size = 8*1024;
- dflts->record.balance = AUDIO_MID_BALANCE;
- dflts->hw_features |= AUDIO_HWFEATURE_RECORD;
-
- info->ad_record.ad_mixer_srs = asreg->reg_mixer_srs;
- info->ad_record.ad_compat_srs = asreg->reg_compat_srs;
- info->ad_record.ad_conv = &am_src2;
- info->ad_record.ad_sr_info = NULL;
- info->ad_record.ad_chs = asreg->reg_channels;
- info->ad_record.ad_int_rate = 1000; /* every 1 ms */
- info->ad_record.ad_max_chs = 200;
- info->ad_record.ad_bsize = 8 * 1024;
- info->ad_num_mics = 1;
- info->ad_rec_comb = asreg->reg_combinations;
- }
- }
-
- if (nplay && nrec) {
- /*
- * we pretend to always support AUDIO_HWFEATURE_IN2OUT
- * since there is no simple way to find out at this
- * point
- */
- dflts->hw_features |= AUDIO_HWFEATURE_DUPLEX |
- AUDIO_HWFEATURE_IN2OUT;
- }
-
- /* the rest */
- info->ad_entry = usb_ac_entry;
- info->ad_dev_info = &usb_dev_info;
- info->ad_diag_flags = 0;
- info->ad_diff_flags = AM_DIFF_SR|AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- info->ad_assist_flags = 0;
- info->ad_misc_flags = AM_MISC_RP_EXCL;
- info->ad_translate_flags = 0;
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- if (am_attach(uacp->usb_ac_audiohdl, DDI_ATTACH, info) ==
- AUDIO_FAILURE) {
- USB_DPRINTF_L2(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "am_attach: failed");
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (USB_FAILURE);
- }
-
- mutex_enter(&uacp->usb_ac_mutex);
-
- uacp->usb_ac_registered_with_mixer = 1;
-
- USB_DPRINTF_L4(PRINT_MASK_ATTA, uacp->usb_ac_log_handle,
- "am_attach succeeded");
-
- return (USB_SUCCESS);
-}
-
-
-/*
- * get registration data from usb_as driver unless we already
- * have 2 registrations
- */
-static int
-usb_ac_get_reg_data(usb_ac_state_t *uacp, ldi_handle_t drv_lh, int index)
-{
- int n, error, rval;
- usb_as_registration_t *streams_reg;
-
- /* if already registered, just setup data structures again */
- if (uacp->usb_ac_registered_with_mixer) {
-
- return (usb_ac_setup_plumbed(uacp, index, -1, -1));
- }
-
- for (n = 0; n < USB_AC_MAX_AS_PLUMBED; n ++) {
- /*
- * We haven't received registration data
- * from n-th streaming interface in the array
- */
- if (!uacp->usb_ac_streams[n].acs_rcvd_reg_data) {
- break;
- }
- }
-
- if (n >= USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L1(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "More than 2 streaming interfaces (play "
- "and/or record) currently not supported");
-
- return (USB_FAILURE);
- }
-
- /* take the stream reg struct with the same index */
- streams_reg = &uacp->usb_ac_streams_reg[n];
-
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "regdata from usb_as: streams_reg=0x%p, n=%d",
- (void *)streams_reg, n);
-
- mutex_exit(&uacp->usb_ac_mutex);
-
- if ((error = ldi_ioctl(drv_lh, USB_AUDIO_MIXER_REGISTRATION,
- (intptr_t)streams_reg, FKIOCTL, kcred, &rval)) != USB_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "ldi_ioctl fails for mixer registration, error=%d", error);
- mutex_enter(&uacp->usb_ac_mutex);
-
- return (USB_FAILURE);
- } else {
- mutex_enter(&uacp->usb_ac_mutex);
-
- rval = usb_ac_setup_plumbed(uacp, index, n, n);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_streams: index=%d, received_reg_data=%d type=%s",
- index, uacp->usb_ac_streams[n].acs_rcvd_reg_data,
- ((streams_reg->reg_mode == AUDIO_PLAY) ?
- "play" : "record"));
-
- usb_ac_print_reg_data(uacp, streams_reg);
-
- return (rval);
- }
-}
-
-
-/*
- * setup plumbed and stream info structure, either initially or
- * after replumbing
- * On replumbing, str_idx and reg_idx are -1
- */
-static int
-usb_ac_setup_plumbed(usb_ac_state_t *uacp, int plb_idx, int str_idx,
- int reg_idx)
-{
- int i;
-
- if (str_idx == -1) {
- /* find a free streams info structure */
- for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
- if (uacp->usb_ac_streams[i].acs_plumbed == NULL) {
- break;
- }
- }
- ASSERT(i < USB_AC_MAX_AS_PLUMBED);
- str_idx = i;
- }
-
- uacp->usb_ac_plumbed[plb_idx].acp_data =
- &uacp->usb_ac_streams[str_idx];
- uacp->usb_ac_streams[str_idx].acs_plumbed =
- &uacp->usb_ac_plumbed[plb_idx];
- uacp->usb_ac_streams[str_idx].acs_rcvd_reg_data = 1;
- cv_init(&(uacp->usb_ac_streams[str_idx].
- acs_ac_to_as_req.acr_cv), NULL, CV_DRIVER, NULL);
-
- if (reg_idx == -1) {
- /*
- * find the corresponding registration structure, match
- * on interface number and not on dip since dip may have
- * changed
- */
- for (i = 0; i < USB_AC_MAX_AS_PLUMBED; i++) {
- if (uacp->usb_ac_streams_reg[i].reg_ifno ==
- uacp->usb_ac_plumbed[plb_idx].acp_ifno) {
- break;
- }
- }
- if (i == USB_AC_MAX_AS_PLUMBED) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "no corresponding registration structure");
-
- return (USB_FAILURE);
- }
- reg_idx = i;
- }
- uacp-> usb_ac_streams[str_idx].acs_streams_reg =
- &uacp->usb_ac_streams_reg[reg_idx];
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_setup_plumbed: plb_idx=%d str_idx=%d reg_idx=%d",
- plb_idx, str_idx, reg_idx);
-
- return (USB_SUCCESS);
-}
-
-
-/*
- * function to dump registration data
- */
-static void
-usb_ac_print_reg_data(usb_ac_state_t *uacp,
- usb_as_registration_t *reg)
-{
- int n;
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_print_reg_data: Begin valid=%d, play=%d, "
- "n_formats=%d, mixer srs ptr=0x%p, compat srs ptr=0x%p",
- reg->reg_valid, reg->reg_mode, reg->reg_n_formats,
- (void *)&reg->reg_mixer_srs, (void *)&reg->reg_compat_srs);
-
- for (n = 0; n < reg->reg_n_formats; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "format%d: alt=%d chns=%d prec=%d enc=%d", n,
- reg->reg_formats[n].fmt_alt,
- reg->reg_formats[n].fmt_chns,
- reg->reg_formats[n].fmt_precision,
- reg->reg_formats[n].fmt_encoding);
- }
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "combinations: %d %d %d %d %d %d %d %d",
- reg->reg_combinations[0].ad_prec, reg->reg_combinations[0].ad_enc,
- reg->reg_combinations[1].ad_prec, reg->reg_combinations[1].ad_enc,
- reg->reg_combinations[2].ad_prec, reg->reg_combinations[2].ad_enc,
- reg->reg_combinations[3].ad_prec, reg->reg_combinations[3].ad_enc);
-
-
- for (n = 0; n < USB_AS_N_FORMATS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_formats[%d] ptr=0x%p", n,
- (void *)&reg->reg_formats[n]);
- }
-
- for (n = 0; n < USB_AS_N_CHANNELS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_channels[%d]=%d", n, reg->reg_channels[n]);
- }
-
- for (n = 0; n < USB_AS_N_COMBINATIONS; n++) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "reg_combinations[%d] ptr=0x%p", n,
- (void *)&reg->reg_combinations[n]);
- }
-
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "usb_ac_print_reg_data: End");
-}
-
-
-static int
-usb_ac_online_siblings(usb_ac_state_t *uacp)
-{
- dev_info_t *pdip, *child_dip;
- int rval = USB_SUCCESS;
-
- ASSERT(mutex_owned(&uacp->usb_ac_mutex));
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_onlining siblings");
-
- pdip = ddi_get_parent(uacp->usb_ac_dip);
-
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
- USB_DPRINTF_L3(PRINT_MASK_ALL, uacp->usb_ac_log_handle,
- "onlining %s%d ref=%d", ddi_driver_name(child_dip),
- ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
-
- /* Online the child_dip of usb_as and hid, if not already */
- if ((strcmp(ddi_driver_name(child_dip), "usb_as") == 0) ||
- (strcmp(ddi_driver_name(child_dip), "hid") == 0)) {
- mutex_exit(&uacp->usb_ac_mutex);
- if (ndi_devi_online(child_dip, NDI_ONLINE_ATTACH) !=
- NDI_SUCCESS) {
- USB_DPRINTF_L2(PRINT_MASK_ALL,
- uacp->usb_ac_log_handle,
- "failure to online driver %s%d",
- ddi_driver_name(child_dip),
- ddi_get_instance(child_dip));
-
- /* only onlining usb_as is fatal */
- if (strcmp(ddi_driver_name(child_dip),
- "usb_as") == 0) {
- mutex_enter(&uacp->usb_ac_mutex);
- rval = USB_FAILURE;
- break;
- }
- }
- mutex_enter(&uacp->usb_ac_mutex);
- }
- child_dip = ddi_get_next_sibling(child_dip);
- }
-
- return (rval);
-}
-
-
-/*
- * hold all audio children before or after plumbing
- * online usb_as and hid, if not already
- */
-static void
-usb_ac_hold_siblings(usb_ac_state_t *uacp)
-{
- int circ;
- dev_info_t *pdip, *child_dip;
-
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_hold_siblings:");
-
- /* hold all siblings and ourselves */
- pdip = ddi_get_parent(uacp->usb_ac_dip);
-
- /* hold the children */
- ndi_devi_enter(pdip, &circ);
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
-
- ndi_hold_devi(child_dip);
-
- USB_DPRINTF_L3(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_hold_siblings: %s%d ref=%d",
- ddi_driver_name(child_dip), ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
-
- child_dip = ddi_get_next_sibling(child_dip);
- }
- ndi_devi_exit(pdip, circ);
-}
-
-
-/*
- * release all audio children before or after plumbing
- */
-static void
-usb_ac_rele_siblings(usb_ac_state_t *uacp)
-{
- int circ;
- dev_info_t *pdip, *child_dip;
-
- USB_DPRINTF_L4(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_rele_siblings:");
-
- /* release all siblings and ourselves */
- pdip = ddi_get_parent(uacp->usb_ac_dip);
- ndi_devi_enter(pdip, &circ);
- child_dip = ddi_get_child(pdip);
- while (child_dip != NULL) {
- ndi_rele_devi(child_dip);
- USB_DPRINTF_L3(PRINT_MASK_PM, uacp->usb_ac_log_handle,
- "usb_ac_rele_siblings: %s%d ref=%d",
- ddi_driver_name(child_dip), ddi_get_instance(child_dip),
- DEVI(child_dip)->devi_ref);
- child_dip = ddi_get_next_sibling(child_dip);
- }
- ndi_devi_exit(pdip, circ);
-}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c b/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
index 796408aebc..e0358f5ecf 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_ah/usb_ah.c
@@ -19,28 +19,28 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* USB audio hid streams module - processes hid data
- * from HID driver and converts to a format that SADA
+ * from HID driver and converts to a format that usb_ac
* understands. The stack looks like this :
* hid --> usb_ah --> usb_ac --> audio framework
* usb_ac just acts as a passthrough layer for the converted data.
*
- * During open, usb_ah gets the parser handle from hid and gets
- * the hardware information passed as report descriptor. Then
- * it finds out the relevant usages and stores the bitmap and other
- * information in internal data structure. When a button is pressed
- * to. say, increase/decrease the volume, a report is generated and
- * hid sends that data up through the streams. usb_ah, upon getting
- * this information and with the prior knowledge about the bitmap
- * for each button, calculates the value and sends up to SADA
- * through usb_ac. SADA in turn sends a command down to speaker to
- * increase the volume of the speaker that is managed by usb_ac.
+ * During open, usb_ah gets the parser handle from hid and gets the
+ * hardware information passed as report descriptor. Then it finds out
+ * the relevant usages and stores the bitmap and other information in
+ * internal data structure. When a button is pressed to. say,
+ * increase/decrease the volume, a report is generated and hid sends
+ * that data up through the streams. usb_ah, upon getting this
+ * information and with the prior knowledge about the bitmap for each
+ * button, calculates the value and sends up to usb_ac. usb_ac in
+ * turn sends a command down to speaker to increase the volume of the
+ * speaker that is managed by usb_ac.
*/
#include <sys/usb/usba.h>
#include <sys/usb/clients/hid/hid.h>
@@ -49,12 +49,9 @@
#include <sys/strsun.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
#include <sys/usb/clients/audio/usb_audio.h>
#include <sys/usb/clients/audio/usb_mixer.h>
@@ -76,12 +73,12 @@ static void usb_ah_repeat_send(usb_ah_state_t *, usb_ah_button_descr_t *,
static void usb_ah_cancel_timeout(usb_ah_state_t *);
static void usb_ah_check_usage_send_data(usb_ah_state_t *, mblk_t *);
static int usb_ah_get_cooked_rd(usb_ah_state_t *);
+static mblk_t *usb_ah_mk_mctl(struct iocblk, void *, size_t);
/* stream qinit functions defined here */
static int usb_ah_open(queue_t *, dev_t *, int, int, cred_t *);
static int usb_ah_close(queue_t *, int, cred_t *);
-static void usb_ah_wput(queue_t *, mblk_t *);
-static void usb_ah_rput(queue_t *, mblk_t *);
+static int usb_ah_rput(queue_t *, mblk_t *);
/*
* Global Variables
@@ -137,21 +134,21 @@ static struct module_info usb_ah_minfo = {
/* read side for key data and ioctl replies */
static struct qinit usb_ah_rinit = {
- (int (*)())usb_ah_rput,
- (int (*)())NULL, /* service not used */
+ usb_ah_rput,
+ NULL, /* service not used */
usb_ah_open,
usb_ah_close,
- (int (*)())NULL,
+ NULL,
&usb_ah_minfo
};
-/* write side for ioctls */
+/* write side -- just pass everything down */
static struct qinit usb_ah_winit = {
- (int (*)())usb_ah_wput,
- (int (*)())NULL,
+ (int (*)(queue_t *, mblk_t *))putnext,
+ NULL,
usb_ah_open,
usb_ah_close,
- (int (*)())NULL,
+ NULL,
&usb_ah_minfo
};
@@ -218,17 +215,8 @@ usb_ah_open(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *crp)
return (0); /* already opened */
}
- switch (sflag) {
- case MODOPEN:
-
- break;
- case CLONEOPEN:
- USB_DPRINTF_L3(PRINT_MASK_OPEN, usb_ah_log_handle,
- "usb_ah_open: Clone open not supported");
-
- /* FALLTHRU */
- default:
-
+ if (sflag != MODOPEN) {
+ /* Only module open supported */
return (EINVAL);
}
@@ -323,9 +311,6 @@ usb_ah_open(queue_t *q, dev_t *devp, int oflag, int sflag, cred_t *crp)
usb_ahd->usb_ah_flags |= USB_AH_OPEN;
- USB_DPRINTF_L3(PRINT_MASK_OPEN, usb_ah_log_handle,
- "usb_ah_open exiting");
-
return (0);
}
@@ -362,81 +347,33 @@ usb_ah_close(register queue_t *q, int flag, cred_t *crp)
mutex_destroy(&usb_ahd->usb_ah_mutex);
kmem_free(usb_ahd, sizeof (usb_ah_state_t));
- USB_DPRINTF_L4(PRINT_MASK_CLOSE, usb_ah_log_handle,
- "usb_ah_close exiting");
-
return (0);
}
/*
- * usb_ah_wput :
- * usb_ah module output queue put procedure: handles M_IOCTL
- * messages.
- */
-static void
-usb_ah_wput(register queue_t *q, register mblk_t *mp)
-{
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_wput entering");
-
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- if (*mp->b_rptr & FLUSHW) {
- flushq(q, FLUSHDATA);
- }
- if (*mp->b_rptr & FLUSHR) {
- flushq(RD(q), FLUSHDATA);
- }
-
- break;
- default:
- break;
- }
-
- putnext(q, mp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_wput exiting:3");
-}
-
-
-/*
* usb_ah_rput :
* Put procedure for input from driver end of stream (read queue).
*/
-static void
+static int
usb_ah_rput(register queue_t *q, register mblk_t *mp)
{
usb_ah_state_t *usb_ahd;
usb_ahd = (usb_ah_state_t *)q->q_ptr;
- USB_DPRINTF_L3(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_rput: Begin, usb_ah state=0x%p, q=0x%p, mp=0x%p",
- (void *)usb_ahd, (void *)q, (void *)mp);
-
if (usb_ahd == 0) {
freemsg(mp); /* nobody's listening */
- return;
+ return (0);
}
switch (mp->b_datap->db_type) {
- case M_FLUSH:
- if (*mp->b_rptr & FLUSHW)
- flushq(WR(q), FLUSHDATA);
- if (*mp->b_rptr & FLUSHR)
- flushq(q, FLUSHDATA);
- freemsg(mp);
- return;
case M_DATA:
if (!(usb_ahd->usb_ah_flags & USB_AH_OPEN)) {
freemsg(mp); /* not ready to listen */
- return;
} else if (MBLKL(mp) == usb_ahd->usb_ah_packet_size) {
/*
@@ -463,20 +400,23 @@ usb_ah_rput(register queue_t *q, register mblk_t *mp)
}
break;
+
case M_CTL:
usb_ah_mctl_receive(q, mp);
+ break;
- return;
+ case M_FLUSH:
case M_IOCACK:
case M_IOCNAK:
putnext(q, mp);
+ break;
- return;
default:
putnext(q, mp);
-
- return;
+ break;
}
+
+ return (0);
}
@@ -546,7 +486,7 @@ usb_ah_repeat_send(usb_ah_state_t *usb_ahd, usb_ah_button_descr_t *bd,
{
mblk_t *dup_mp;
- bd->mblk = usba_mk_mctl(mctlmsg, buf, len);
+ bd->mblk = usb_ah_mk_mctl(mctlmsg, buf, len);
if (bd->mblk != NULL) {
dup_mp = usb_ah_cp_mblk(bd->mblk);
@@ -579,8 +519,6 @@ usb_ah_timeout(void *addr)
usb_ahd = (usb_ah_state_t *)bd->uahp;
mutex_enter(&usb_ahd->usb_ah_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_timeout: tid=0x%p", usb_ahd->usb_ah_tid);
/*
* If a release event still hasn't reached, tid will be non-zero
@@ -612,9 +550,6 @@ usb_ah_cancel_timeout(usb_ah_state_t *usb_ahd)
{
queue_t *rq = usb_ahd->usb_ah_readq;
- USB_DPRINTF_L4(PRINT_MASK_ALL, usb_ah_log_handle,
- "usb_ah_cancel_timeout: tid=0x%p", usb_ahd->usb_ah_tid);
-
if (usb_ahd->usb_ah_tid) {
(void) quntimeout(rq, usb_ahd->usb_ah_tid);
usb_ahd->usb_ah_tid = 0;
@@ -816,7 +751,7 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
/* Relative volume */
mctlmsg.ioc_cmd = USB_AUDIO_VOL_CHANGE;
mctlmsg.ioc_count = sizeof (uint_t);
- mctl_ptr = usba_mk_mctl(mctlmsg,
+ mctl_ptr = usb_ah_mk_mctl(mctlmsg,
&val, mctlmsg.ioc_count);
if (mctl_ptr != NULL) {
mutex_exit(&usb_ahd->
@@ -865,7 +800,7 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
if (val) {
mctlmsg.ioc_cmd = USB_AUDIO_MUTE;
mctlmsg.ioc_count = sizeof (uint_t);
- mctl_ptr = usba_mk_mctl(mctlmsg,
+ mctl_ptr = usb_ah_mk_mctl(mctlmsg,
&val, mctlmsg.ioc_count);
if (mctl_ptr != NULL) {
mutex_exit(&usb_ahd->usb_ah_mutex);
@@ -887,3 +822,21 @@ usb_ah_check_usage_send_data(usb_ah_state_t *usb_ahd, mblk_t *mp)
mutex_exit(&usb_ahd->usb_ah_mutex);
freemsg(mp);
}
+
+
+/*
+ * since usb_ac now uses LDI to access HID streams, we must change the msg
+ * type from M_CTL to M_PROTO since the streamhead will not pass M_CTLs up
+ */
+static mblk_t *
+usb_ah_mk_mctl(struct iocblk mctlmsg, void *buf, size_t len)
+{
+ mblk_t *mp;
+
+ mp = usba_mk_mctl(mctlmsg, buf, len);
+ if (mp == NULL)
+ return (NULL);
+
+ mp->b_datap->db_type = M_PROTO;
+ return (mp);
+}
diff --git a/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c b/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
index 75ae231c8a..aad709cb37 100644
--- a/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
+++ b/usr/src/uts/common/io/usb/clients/audio/usb_as/usb_as.c
@@ -23,27 +23,25 @@
* Use is subject to license terms.
*/
-
/*
- * Audio Streams Driver: This driver is responsible for
- * (1) Processing audio data messages during play and record and
- * management of isoc pipe, (2) Selecting correct alternate that matches
- * a set of parameters and management of control pipe. This streams driver
- * is pushed under usb_ac and interacts with usb_ac using streams messages.
- * When a streams message has been received from usb_ac, it is immediately
- * put on WQ. The write side service routine loops thru all the queued
- * messages, processes them and sends up a reply. If the processing involves
- * an async USBA command, the reqly is sent up after completion of the
- * command.
+ * Audio Streams Interface Driver:
+ * This driver is derived from the legacy SADA streams-based usb_as driver
+ * and serves as an intermediate measure before the full conversion to the
+ * to the Boomer framework in a follow-on phase of the Boomer project, which
+ * will utilize more comprehensive USB audio features as well.
+ *
+ * usb_as is responsible for (1) Processing audio data messages during
+ * play and record and management of isoc pipe, (2) Selecting correct
+ * alternate that matches a set of parameters and management of control pipe.
+ * This driver is opened by usb_ac and interacts with usb_ac synchronously
+ * using ioctls. If the processing involves an async USBA command, the ioctl
+ * returns after completion of the command.
*
- * Note: (1) All streams messages from usb_ac are M_CTL messages.
- * (2) When there is a play/record, usb_as calls mixer routines directly for
- * data (play) or sends data to mixer (record).
+ * Note: When there is a play/record, usb_as calls framework routines
+ * directly for data (play) or sends data to mixer (record).
*
- * Serialization: usb_as being a streams driver and having the requirement
- * making non-blockings calls (USBA or streams or mixer) needs to drop
- * mutexes over such calls. But at the same time, a competing thread
- * can't be allowed to interfere with (1) pipe, (2) streams state.
+ * Serialization: A competing thread can't be allowed to interfere with
+ * (1) pipe, (2) streams state.
* So we need some kind of serialization among the asynchronous
* threads that can run in the driver. The serialization is mostly
* needed to avoid races among open/close/events/power entry points
@@ -54,34 +52,23 @@
*
* PM Model in usb_as: Raise power during attach and lower power in detach.
* If device is not fully powered, synchronous raise power in wsrv entry points.
- *
- * locking: Warlock is not aware of the automatic locking mechanisms for
- * streams drivers. This driver is single threaded per queue instance.
- *
- * TODO:
- * - mdb dcmds
- * - dump
- * - kstat
*/
#include <sys/usb/usba/usbai_version.h>
#include <sys/usb/usba.h>
-#include <sys/stropts.h>
-#include <sys/strsun.h>
-#include <sys/strsubr.h>
-#include <sys/strsun.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
#include <sys/audio.h>
-#include <sys/audiovar.h>
#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
#include <sys/mixer.h>
#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
#include <sys/usb/clients/audio/usb_audio.h>
#include <sys/usb/clients/audio/usb_mixer.h>
#include <sys/usb/clients/audio/usb_as/usb_as.h>
+#include "../usb_ac/audio_shim.h"
+
/* debug support */
uint_t usb_as_errlevel = USB_LOG_L4;
uint_t usb_as_errmask = (uint_t)-1;
@@ -95,12 +82,9 @@ static int usb_as_detach(dev_info_t *, ddi_detach_cmd_t);
static int usb_as_power(dev_info_t *, int, int);
static int usb_as_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-/*
- * STREAMS module entry points
- */
-static int usb_as_open();
-static int usb_as_close();
-static int usb_as_wsrv();
+static int usb_as_open(dev_t *, int, int, cred_t *);
+static int usb_as_close(dev_t, int, int, cred_t *);
+
/* support functions */
static void usb_as_cleanup(dev_info_t *, usb_as_state_t *);
@@ -118,11 +102,7 @@ static int usb_as_reconnect_event_cb(dev_info_t *);
static int usb_as_cpr_suspend(dev_info_t *);
static void usb_as_cpr_resume(dev_info_t *);
-static int usb_as_ioctl(queue_t *, mblk_t *);
-static int usb_as_mctl_rcv(queue_t *, mblk_t *);
-
-static void usb_as_default_xfer_cb(usb_pipe_handle_t, usb_ctrl_req_t *);
-static void usb_as_default_xfer_exc_cb(usb_pipe_handle_t, usb_ctrl_req_t *);
+static int usb_as_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
static int usb_as_pwrlvl0(usb_as_state_t *);
static int usb_as_pwrlvl1(usb_as_state_t *);
@@ -132,80 +112,32 @@ static void usb_as_pm_busy_component(usb_as_state_t *);
static void usb_as_pm_idle_component(usb_as_state_t *);
static void usb_as_restore_device_state(dev_info_t *, usb_as_state_t *);
-static int usb_as_setup(usb_as_state_t *, mblk_t *);
-static void usb_as_teardown(usb_as_state_t *, mblk_t *);
-static int usb_as_start_play(usb_as_state_t *, mblk_t *);
+static int usb_as_setup(usb_as_state_t *);
+static void usb_as_teardown(usb_as_state_t *);
+static int usb_as_start_play(usb_as_state_t *, usb_audio_play_req_t *);
static void usb_as_continue_play(usb_as_state_t *);
-static void usb_as_pause_play(usb_as_state_t *, mblk_t *);
+static void usb_as_pause_play(usb_as_state_t *);
-static void usb_as_qreply_error(usb_as_state_t *, queue_t *, mblk_t *);
-static void usb_as_send_merr_up(usb_as_state_t *, mblk_t *);
-static void usb_as_send_mctl_up(usb_as_state_t *, mblk_t *);
-static int usb_as_set_format(usb_as_state_t *, mblk_t *);
-static int usb_as_set_sample_freq(usb_as_state_t *, mblk_t *);
+static int usb_as_set_format(usb_as_state_t *, usb_audio_formats_t *);
+static int usb_as_set_sample_freq(usb_as_state_t *, int);
static int usb_as_send_ctrl_cmd(usb_as_state_t *, uchar_t, uchar_t,
ushort_t, ushort_t, ushort_t, mblk_t *, boolean_t);
-static void usb_as_isoc_close_cb(usb_pipe_handle_t ph,
- usb_opaque_t arg, int, usb_cb_flags_t);
-static int usb_as_start_record(usb_as_state_t *, mblk_t *);
-static int usb_as_stop_record(usb_as_state_t *, mblk_t *);
+static int usb_as_start_record(usb_as_state_t *, audiohdl_t);
+static int usb_as_stop_record(usb_as_state_t *);
static void usb_as_play_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_record_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_play_exc_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static void usb_as_record_exc_cb(usb_pipe_handle_t, usb_isoc_req_t *);
static int usb_as_get_pktsize(usb_as_state_t *, usb_audio_formats_t *,
- usb_frame_number_t);
-static void usb_as_handle_shutdown(usb_as_state_t *, mblk_t *);
-static int usb_as_play_isoc_data(usb_as_state_t *, mblk_t *);
+ usb_frame_number_t);
+static void usb_as_handle_shutdown(usb_as_state_t *);
+static int usb_as_play_isoc_data(usb_as_state_t *,
+ usb_audio_play_req_t *);
/* anchor for soft state structures */
static void *usb_as_statep;
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info usb_as_modinfo = {
- 0xffff, /* module ID number */
- "usb_as", /* module name */
- USB_AUDIO_MIN_PKTSZ, /* minimum packet size */
- USB_AUDIO_MAX_PKTSZ, /* maximum packet size */
- USB_AS_HIWATER, /* high water mark */
- USB_AS_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit usb_as_rqueue = {
- NULL, /* put procedure */
- NULL, /* service procedure */
- usb_as_open, /* open procedure */
- usb_as_close, /* close procedure */
- NULL, /* unused */
- &usb_as_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit usb_as_wqueue = {
- putq, /* put procedure */
- usb_as_wsrv, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &usb_as_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab usb_as_str_info = {
- &usb_as_rqueue, /* read queue */
- &usb_as_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
/*
* DDI Structures
@@ -213,21 +145,21 @@ static struct streamtab usb_as_str_info = {
/* Entry points structure */
static struct cb_ops usb_as_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
+ usb_as_open, /* cb_open */
+ usb_as_close, /* cb_close */
nodev, /* cb_strategy */
nodev, /* cb_print */
nodev, /* cb_dump */
nodev, /* cb_read */
nodev, /* cb_write */
- nodev, /* cb_ioctl */
+ usb_as_ioctl, /* cb_ioctl */
nodev, /* cb_devmap */
nodev, /* cb_mmap */
nodev, /* cb_segmap */
nochpoll, /* cb_chpoll */
ddi_prop_op, /* cb_prop_op */
- &usb_as_str_info, /* cb_str */
- D_MP | D_MTPERQ, /* cb_flag */
+ NULL, /* cb_str */
+ D_MP | D_64BIT, /* cb_flag */
CB_REV, /* cb_rev */
nodev, /* cb_aread */
nodev, /* cb_arwite */
@@ -263,14 +195,6 @@ static struct modlinkage usb_as_modlinkage = {
NULL /* NULL terminates the list */
};
-/* warlock directives */
-_NOTE(SCHEME_PROTECTS_DATA("unshared", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", datab))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", queue))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_pipe_policy_t))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_isoc_pkt_descr))
-_NOTE(SCHEME_PROTECTS_DATA("unshared", usb_isoc_req))
static usb_event_t usb_as_events = {
usb_as_disconnect_event_cb,
@@ -289,10 +213,6 @@ static uint_t usb_as_default_srs[] = {
32000, 33075, 37800, 44100, 48000, 0
};
-static uint_t usb_as_mixer_srs[] = {
- 8000, 48000, 0
-};
-
int
_init(void)
@@ -413,6 +333,9 @@ usb_as_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
uasp->usb_as_instance = instance;
uasp->usb_as_dip = dip;
+ (void) snprintf(uasp->dstr, sizeof (uasp->dstr), "%s#%d",
+ ddi_driver_name(dip), instance);
+
if (usb_client_attach(dip, USBDRV_VERSION, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ATTA, uasp->usb_as_log_handle,
"usb_client_attach failed");
@@ -605,42 +528,40 @@ usb_as_cleanup(dev_info_t *dip, usb_as_state_t *uasp)
*/
/*ARGSUSED*/
static int
-usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
+usb_as_open(dev_t *devp, int flag, int otyp, cred_t *credp)
{
- usb_as_state_t *uasp =
- ddi_get_soft_state(usb_as_statep,
- USB_AS_MINOR_TO_INSTANCE(getminor(*devp)));
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(*devp));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
+ char *nm = "usb_as_open";
+
if (uasp == NULL) {
return (ENXIO);
}
/* Do mux plumbing stuff */
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: Begin q=0x%p", (void *)q);
+ dinfo("%s: %s\n", uasp->dstr, nm);
+
+ mutex_enter(&uasp->usb_as_mutex);
- if (sflag) {
- USB_DPRINTF_L2(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: clone open not supported");
+ if (uasp->usb_as_flag == USB_AS_OPEN || credp != kcred) {
+ dwarn("%s: multiple opens or opens from userspace not "
+ "supported\n", uasp->dstr);
+ mutex_exit(&uasp->usb_as_mutex);
return (ENXIO);
}
- mutex_enter(&uasp->usb_as_mutex);
-
/* fail open on a disconnected device */
if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
+ dinfo("%s: %s disconnected\n", uasp->dstr, nm);
mutex_exit(&uasp->usb_as_mutex);
return (ENODEV);
}
- /* Initialize the queue pointers */
- q->q_ptr = uasp;
- WR(q)->q_ptr = uasp;
- uasp->usb_as_rq = q;
- uasp->usb_as_wq = WR(q);
- uasp->usb_as_streams_flag = USB_AS_STREAMS_OPEN;
+ /* Initialize state */
+ uasp->usb_as_flag = USB_AS_OPEN;
mutex_exit(&uasp->usb_as_mutex);
/*
@@ -649,10 +570,7 @@ usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
usb_as_pm_busy_component(uasp);
(void) pm_raise_power(uasp->usb_as_dip, 0, USB_DEV_OS_FULL_PWR);
- qprocson(q);
-
- USB_DPRINTF_L4(PRINT_MASK_OPEN, uasp->usb_as_log_handle,
- "usb_as_open: End q=0x%p", (void *)q);
+ dinfo("%s: %s done\n", uasp->dstr, nm);
return (0);
}
@@ -664,15 +582,16 @@ usb_as_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp)
*/
/*ARGSUSED*/
static int
-usb_as_close(queue_t *q, int flag, cred_t *credp)
+usb_as_close(dev_t dev, int flag, int otyp, cred_t *credp)
{
- usb_as_state_t *uasp = (usb_as_state_t *)q->q_ptr;
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(dev));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
USB_DPRINTF_L4(PRINT_MASK_CLOSE, uasp->usb_as_log_handle,
- "usb_as_close: q=0x%p", (void *)q);
+ "usb_as_close: inst=%d", inst);
mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_streams_flag = USB_AS_STREAMS_DISMANTLING;
+ uasp->usb_as_flag = USB_AS_DISMANTLING;
mutex_exit(&uasp->usb_as_mutex);
/*
@@ -685,256 +604,88 @@ usb_as_close(queue_t *q, int flag, cred_t *credp)
usb_release_access(uasp->usb_as_ser_acc);
- qprocsoff(q);
-
/* we can now power down */
usb_as_pm_idle_component(uasp);
- return (0);
-}
-
-
-static void
-usb_as_qreply_error(usb_as_state_t *uasp, queue_t *q, mblk_t *mp)
-{
mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_def_mblk = NULL;
+ uasp->usb_as_flag = 0;
mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(RD(q))) {
- freemsg(mp);
- } else {
- /*
- * Pass an error message up.
- */
- mp->b_datap->db_type = M_ERROR;
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
- mp->b_rptr = mp->b_datap->db_base;
- mp->b_wptr = mp->b_rptr + sizeof (char);
- *mp->b_rptr = EINVAL;
- qreply(q, mp);
- }
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_qreply_error: sending M_ERROR up q=0x%p,mp=0x%p",
- (void *)q, (void *)mp);
-}
-
-
-/*
- * usb_as_wsrv
- * write service routine, processes all the queued mblks.
- * returns DDI_SUCCESS or DDI_FAILURE
- */
-static int
-usb_as_wsrv(queue_t *q)
-{
- int error;
- usb_as_state_t *uasp = q->q_ptr;
- mblk_t *mp = NULL;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_wsrv: Begin q=0x%p", (void *)q);
-
- /* process all message blocks on the queue */
- while ((mp = getq(q)) != NULL) {
- ASSERT(mp->b_datap != NULL);
-
- switch (mp->b_datap->db_type) {
- case M_FLUSH:
- /*
- * Canonical flush handling :
- * mp will be freed by usb_ac since it passes
- * the same mp
- */
- if (*mp->b_rptr & FLUSHW) {
- flushq(q, FLUSHDATA);
- }
- /* read queue not used so just send up */
- if (*mp->b_rptr & FLUSHR) {
- *mp->b_rptr &= ~FLUSHW;
- qreply(q, mp);
- } else {
- freemsg(mp);
- }
-
- break;
- case M_IOCTL:
- /* only ioctl is mixer registration data */
- error = usb_as_ioctl(q, mp);
-
- break;
- case M_CTL:
- /* process the message */
- mutex_enter(&uasp->usb_as_mutex);
- ASSERT(uasp->usb_as_def_mblk == NULL);
- uasp->usb_as_def_mblk = mp;
- mutex_exit(&uasp->usb_as_mutex);
-
- error = usb_as_mctl_rcv(q, mp);
- if (error != USB_SUCCESS) {
- usb_as_qreply_error(uasp, q, mp);
- }
-
- break;
- default:
- usb_as_qreply_error(uasp, q, mp);
-
- break;
- }
- }
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_wsrv: End q=0x%p", (void *)q);
-
- return (DDI_SUCCESS);
+ return (0);
}
/*
- * usb_as_ioctl:
- * usb_as handles only USB_AUDIO_MIXER_REGISTRATION ioctl
- * NACK all other ioctl requests
- * Returns USB_SUCCESS or USB_FAILURE
+ *
*/
+/*ARGSUSED*/
static int
-usb_as_ioctl(queue_t *q, mblk_t *mp)
+usb_as_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
+ int *rvalp)
{
- int error = USB_FAILURE;
- usb_as_state_t *uasp = q->q_ptr;
- register struct iocblk *iocp;
-
- iocp = (struct iocblk *)mp->b_rptr;
+ int inst = USB_AS_MINOR_TO_INSTANCE(getminor(dev));
+ usb_as_state_t *uasp = ddi_get_soft_state(usb_as_statep, inst);
+ int rv = USB_SUCCESS;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: Begin q=0x%p, mp=0x%p", (void *)q, (void *)mp);
+ "usb_as_ioctl: Begin inst=%d, cmd=0x%x, arg=0x%p",
+ inst, cmd, (void *)arg);
- if (mp->b_cont == NULL) {
+ if (!(mode & FKIOCTL)) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: no data block, q=0x%p, mp=0x%p",
- (void *)q, (void *)mp);
- } else {
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_MIXER_REGISTRATION:
- USB_DPRINTF_L4(PRINT_MASK_ALL,
- uasp->usb_as_log_handle,
- "usb_as_ioctl(mixer reg): q=0x%p, "
- "mp=0x%p, b_cont_rptr=0x%p, b_cont_wptr=0x%p",
- (void *)q, (void *)mp, (void *)mp->b_cont->b_rptr,
- (void *)mp->b_cont->b_wptr);
-
- mutex_enter(&uasp->usb_as_mutex);
-
- /*
- * Copy the usb_as_reg structure to the structure
- * that usb_ac passed. Note that this is a structure
- * assignment and not a pointer assignment!
- */
- *((usb_as_registration_t *)(*((
- usb_as_registration_t **)mp->
- b_cont->b_rptr))) = uasp->usb_as_reg;
-
- mp->b_cont->b_wptr = mp->b_cont->b_rptr +
- sizeof (usb_as_registration_t *);
-
- mutex_exit(&uasp->usb_as_mutex);
- error = USB_SUCCESS;
- break;
- default:
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: unknown IOCTL, cmd=%d",
- iocp->ioc_cmd);
- break;
- }
- }
-
- iocp->ioc_rval = 0;
- if (error == USB_FAILURE) {
- iocp->ioc_error = ENOTTY;
- mp->b_datap->db_type = M_IOCNAK;
- } else {
- iocp->ioc_error = 0;
- mp->b_datap->db_type = M_IOCACK;
+ "usb_as_ioctl: inst=%d, user space not supported", inst);
+ return (ENXIO);
}
- /*
- * Send the response up
- */
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_ioctl: error=%d, q=0x%p, mp=0x%p", error,
- (void *)q, (void *)mp);
-
- qreply(q, mp);
-
- return (error);
-}
-
-
-/*
- * usb_as_mctl_rcv:
- * Handle M_CTL requests from usb_ac.
- * Returns USB_SUCCESS/FAILURE
- */
-static int
-usb_as_mctl_rcv(queue_t *q, mblk_t *mp)
-{
- int error = USB_FAILURE;
- usb_as_state_t *uasp = q->q_ptr;
- struct iocblk *iocp;
+ mutex_enter(&uasp->usb_as_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_mctl_rcv: Begin q=0x%p mp=0x%p",
- (void *)q, (void *)mp);
+ switch (cmd) {
+ case USB_AUDIO_MIXER_REGISTRATION:
+ USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
+ "usb_as_ioctl(mixer reg): inst=%d", inst);
- ASSERT(mp != NULL);
+ /*
+ * Copy the usb_as_reg structure to the structure
+ * that usb_ac passed. Note that this is a structure
+ * assignment and not a pointer assignment!
+ */
+ *(usb_as_registration_t *)arg = uasp->usb_as_reg;
- /*
- * Uopn success, each function sends up a reply either immediately,
- * or on callback. On failure, reply is send up in the wsrv.
- */
- iocp = (struct iocblk *)mp->b_rptr;
- mutex_enter(&uasp->usb_as_mutex);
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- error = usb_as_set_format(uasp, mp);
- break;
- case USB_AUDIO_SET_SAMPLE_FREQ:
- error = usb_as_set_sample_freq(uasp, mp);
- break;
- case USB_AUDIO_SETUP:
- error = usb_as_setup(uasp, mp);
- break;
- case USB_AUDIO_TEARDOWN:
- usb_as_teardown(uasp, mp);
- error = USB_SUCCESS;
- break;
- case USB_AUDIO_START_PLAY:
- error = usb_as_start_play(uasp, mp);
- break;
- case USB_AUDIO_STOP_PLAY:
- case USB_AUDIO_PAUSE_PLAY:
- usb_as_pause_play(uasp, mp);
- error = USB_SUCCESS;
- break;
- case USB_AUDIO_START_RECORD:
- error = usb_as_start_record(uasp, mp);
- break;
- case USB_AUDIO_STOP_RECORD:
- error = usb_as_stop_record(uasp, mp);
- break;
- default:
- break;
+ break;
+ case USB_AUDIO_SET_FORMAT:
+ rv = usb_as_set_format(uasp, (usb_audio_formats_t *)arg);
+ break;
+ case USB_AUDIO_SET_SAMPLE_FREQ:
+ rv = usb_as_set_sample_freq(uasp, *(int *)arg);
+ break;
+ case USB_AUDIO_SETUP:
+ rv = usb_as_setup(uasp);
+ break;
+ case USB_AUDIO_TEARDOWN:
+ usb_as_teardown(uasp);
+ break;
+ case USB_AUDIO_START_PLAY:
+ rv = usb_as_start_play(uasp, (usb_audio_play_req_t *)arg);
+ break;
+ case USB_AUDIO_STOP_PLAY:
+ case USB_AUDIO_PAUSE_PLAY:
+ usb_as_pause_play(uasp);
+ break;
+ case USB_AUDIO_START_RECORD:
+ rv = usb_as_start_record(uasp, *(audiohdl_t *)arg);
+ break;
+ case USB_AUDIO_STOP_RECORD:
+ rv = usb_as_stop_record(uasp);
+ break;
+ default:
+ USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
+ "usb_as_ioctl: unknown IOCTL, cmd=%d", cmd);
+ break;
}
mutex_exit(&uasp->usb_as_mutex);
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_mctl_rcv: End q=0x%p mp=0x%p error=%d",
- (void *)q, (void *)mp, error);
-
- return (error);
+ return (rv == USB_SUCCESS ? 0 : ENXIO);
}
@@ -948,35 +699,25 @@ usb_as_mctl_rcv(queue_t *q, mblk_t *mp)
* Therefore, we ignore errors and carry on regardless
*/
static int
-usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_set_sample_freq(usb_as_state_t *uasp, int freq)
{
- int freq, alt, ep;
+ int alt, ep;
mblk_t *data;
int rval = USB_FAILURE;
boolean_t ignore_errors;
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
alt = uasp->usb_as_alternate;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_sample_freq: mp=0x%p cont_sr=%d", (void *)mp,
- uasp->usb_as_alts[alt].alt_continuous_sr);
+ "usb_as_set_sample_freq: inst=%d cont_sr=%d freq=%d",
+ ddi_get_instance(uasp->usb_as_dip),
+ uasp->usb_as_alts[alt].alt_continuous_sr, freq);
ignore_errors = B_TRUE;
ep = uasp->usb_as_alts[alt].alt_ep->bEndpointAddress;
- freq = *((int *)mp->b_cont->b_rptr);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_sample_freq: freq = %d", freq);
-
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
data = allocb(4, BPRI_HI);
if (data) {
@@ -998,11 +739,10 @@ usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
ignore_errors)) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_sample_freq: set sample freq failed");
-
- freemsg(data);
}
mutex_enter(&uasp->usb_as_mutex);
}
+ freemsg(data);
return (rval);
}
@@ -1011,25 +751,23 @@ usb_as_set_sample_freq(usb_as_state_t *uasp, mblk_t *mp)
/*
* usb_as_set_format:
* Matches channel, encoding and precision and find out
- * the right alternate. Sets alternate interface.
+ * the right alternate. Sets alternate interface and returns it.
*/
static int
-usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_set_format(usb_as_state_t *uasp, usb_audio_formats_t *format)
{
int n;
usb_as_registration_t *reg;
- usb_audio_formats_t *format;
int alt, rval;
uint_t interface;
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
if (uasp->usb_as_request_count) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_format: failing mp=0x%p, rq_cnt=%d",
- (void *)mp, uasp->usb_as_request_count);
+ "usb_as_set_format: failing inst=%d, rq_cnt=%d",
+ ddi_get_instance(uasp->usb_as_dip),
+ uasp->usb_as_request_count);
return (USB_FAILURE);
}
@@ -1038,13 +776,12 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
reg = &uasp->usb_as_reg;
interface = uasp->usb_as_ifno;
- format = (usb_audio_formats_t *)mp->b_cont->b_rptr;
- bcopy(format, &uasp->usb_as_curr_format, sizeof (usb_audio_formats_t));
+ uasp->usb_as_curr_format = *format;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_set_format: mp=0x%p, reg=0x%p, format=0x%p",
- (void *)mp, (void *)reg, (void *)format);
+ "usb_as_set_format: inst=%d, reg=0x%p, format=0x%p",
+ ddi_get_instance(uasp->usb_as_dip), (void *)reg, (void *)format);
for (n = 0; n < reg->reg_n_formats; n++) {
if ((format->fmt_chns == reg->reg_formats[n].fmt_chns) &&
@@ -1060,7 +797,7 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
}
}
- if (n > reg->reg_n_formats) {
+ if (n >= reg->reg_n_formats) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_format: Didn't find a matching alt");
@@ -1075,19 +812,23 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
mutex_exit(&uasp->usb_as_mutex);
- if ((rval = usb_as_send_ctrl_cmd(uasp,
+ rval = usb_as_send_ctrl_cmd(uasp,
/* bmRequestType */
USB_DEV_REQ_HOST_TO_DEV | USB_DEV_REQ_RCPT_IF,
USB_REQ_SET_IF, /* bRequest */
alt, /* wValue */
interface, /* wIndex */
0, /* wLength */
- NULL, B_FALSE)) != USB_SUCCESS) {
+ NULL, B_FALSE);
+
+ mutex_enter(&uasp->usb_as_mutex);
+
+ if (rval != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_set_format: set_alternate failed");
-
+ } else {
+ format->fmt_alt = (uchar_t)alt;
}
- mutex_enter(&uasp->usb_as_mutex);
return (rval);
}
@@ -1099,17 +840,17 @@ usb_as_set_format(usb_as_state_t *uasp, mblk_t *mp)
* is available.
*/
static int
-usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_setup(usb_as_state_t *uasp)
{
int alt = uasp->usb_as_alternate;
usb_ep_descr_t *ep = (usb_ep_descr_t *)uasp->usb_as_alts[alt].alt_ep;
int rval;
- ASSERT(mp != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_setup: Begin usb_as_setup, mp=0x%p", (void *)mp);
+ "usb_as_setup: Begin usb_as_setup, inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
ASSERT(uasp->usb_as_request_count == 0);
@@ -1124,7 +865,7 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
/* open isoc pipe, may fail if there is no bandwidth */
rval = usb_pipe_open(uasp->usb_as_dip, ep, &uasp->usb_as_isoc_pp,
- 0, &uasp->usb_as_isoc_ph);
+ USB_FLAGS_SLEEP, &uasp->usb_as_isoc_ph);
if (rval != USB_SUCCESS) {
switch (rval) {
@@ -1151,11 +892,9 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
(void) usb_pipe_set_private(uasp->usb_as_isoc_ph, (usb_opaque_t)uasp);
- /* return reply up */
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_audio_state = USB_AS_IDLE;
uasp->usb_as_setup_cnt++;
- usb_as_send_mctl_up(uasp, NULL);
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_setup: End");
@@ -1169,10 +908,12 @@ usb_as_setup(usb_as_state_t *uasp, mblk_t *mp)
*
*/
static void
-usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_teardown(usb_as_state_t *uasp)
{
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_teardown: Begin mp=0x%p", (void *)mp);
+ "usb_as_teardown: Begin inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
+
ASSERT(mutex_owned(&uasp->usb_as_mutex));
uasp->usb_as_audio_state = USB_AS_IDLE;
@@ -1185,10 +926,9 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
mutex_exit(&uasp->usb_as_mutex);
/* reply mp will be sent up in isoc close callback */
- usb_pipe_close(uasp->usb_as_dip, uasp->usb_as_isoc_ph, 0,
- usb_as_isoc_close_cb, (usb_opaque_t)uasp);
+ usb_pipe_close(uasp->usb_as_dip, uasp->usb_as_isoc_ph,
+ USB_FLAGS_SLEEP, NULL, (usb_opaque_t)NULL);
- /* wait for callback to send up a reply */
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_isoc_ph = NULL;
@@ -1198,8 +938,6 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_teardown: Pipe already closed");
-
- usb_as_send_mctl_up(uasp, NULL);
}
ASSERT(uasp->usb_as_setup_cnt == 0);
@@ -1210,32 +948,24 @@ usb_as_teardown(usb_as_state_t *uasp, mblk_t *mp)
/*
- * usb_as_start_play:
- * this function is called from usb_as_mctl_rcv
+ * usb_as_start_play
*/
static int
-usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_start_play(usb_as_state_t *uasp, usb_audio_play_req_t *play_req)
{
- usb_audio_play_req_t *play_req;
- int samples;
int n_requests;
int rval = USB_FAILURE;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_start_play: Begin mp=0x%p, req_cnt=%d",
- (void *)mp, uasp->usb_as_request_count);
+ "usb_as_start_play: Begin inst=%d, req_cnt=%d",
+ ddi_get_instance(uasp->usb_as_dip), uasp->usb_as_request_count);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
- ASSERT(mp && mp->b_cont);
-
- play_req = (usb_audio_play_req_t *)mp->b_cont->b_rptr;
uasp->usb_as_request_samples = play_req->up_samples;
uasp->usb_as_ahdl = play_req->up_handle;
uasp->usb_as_audio_state = USB_AS_ACTIVE;
- samples = uasp->usb_as_request_samples;
-
if ((uasp->usb_as_request_count >= USB_AS_MAX_REQUEST_COUNT) ||
(uasp->usb_as_audio_state == USB_AS_IDLE) ||
(uasp->usb_as_audio_state == USB_AS_PLAY_PAUSED)) {
@@ -1246,27 +976,18 @@ usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_start_play: samples=%d requestcount=%d ",
- samples, uasp->usb_as_request_count);
+ uasp->usb_as_request_samples, uasp->usb_as_request_count);
/* queue up as many requests as allowed */
for (n_requests = uasp->usb_as_request_count;
n_requests < USB_AS_MAX_REQUEST_COUNT; n_requests++) {
- if ((rval = usb_as_play_isoc_data(uasp, mp)) !=
+ if ((rval = usb_as_play_isoc_data(uasp, play_req)) !=
USB_SUCCESS) {
break;
}
}
}
- /*
- * send mctl up for success. For failure, usb_as_wsrv
- * will send an merr up.
- */
- if (rval == USB_SUCCESS) {
- usb_as_send_mctl_up(uasp, NULL);
- }
-
-
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_start_play: End");
@@ -1281,7 +1002,6 @@ usb_as_start_play(usb_as_state_t *uasp, mblk_t *mp)
static void
usb_as_continue_play(usb_as_state_t *uasp)
{
- int samples;
int n_requests;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
@@ -1291,13 +1011,11 @@ usb_as_continue_play(usb_as_state_t *uasp)
ASSERT(mutex_owned(&uasp->usb_as_mutex));
if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
return;
}
- samples = uasp->usb_as_request_samples;
-
if ((uasp->usb_as_request_count >= USB_AS_MAX_REQUEST_COUNT) ||
(uasp->usb_as_audio_state == USB_AS_IDLE) ||
(uasp->usb_as_audio_state == USB_AS_PLAY_PAUSED)) {
@@ -1307,7 +1025,7 @@ usb_as_continue_play(usb_as_state_t *uasp)
} else {
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_continue_play: samples=%d requestcount=%d ",
- samples, uasp->usb_as_request_count);
+ uasp->usb_as_request_samples, uasp->usb_as_request_count);
/* queue up as many requests as allowed */
for (n_requests = uasp->usb_as_request_count;
@@ -1326,16 +1044,13 @@ usb_as_continue_play(usb_as_state_t *uasp)
static void
-usb_as_handle_shutdown(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_handle_shutdown(usb_as_state_t *uasp)
{
audiohdl_t ahdl;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_handl_shutdown, mp=0x%p", (void *)mp);
-
- if (mp != NULL) {
- usb_as_send_mctl_up(uasp, NULL);
- }
+ "usb_as_handle_shutdown, inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_handle_shutdown: am_play_shutdown");
@@ -1345,13 +1060,13 @@ usb_as_handle_shutdown(usb_as_state_t *uasp, mblk_t *mp)
ahdl = uasp->usb_as_ahdl;
mutex_exit(&uasp->usb_as_mutex);
- am_play_shutdown(ahdl, AUDIO_NO_CHANNEL);
+ am_play_shutdown(ahdl);
mutex_enter(&uasp->usb_as_mutex);
}
static int
-usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_play_isoc_data(usb_as_state_t *uasp, usb_audio_play_req_t *play_req)
{
int rval = USB_FAILURE;
@@ -1389,8 +1104,8 @@ usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
}
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_play_isoc_data: Begin bufsize=0x%lx, mp=0x%p", bufsize,
- (void *)mp);
+ "usb_as_play_isoc_data: Begin bufsize=0x%lx, inst=%d", bufsize,
+ ddi_get_instance(uasp->usb_as_dip));
mutex_exit(&uasp->usb_as_mutex);
@@ -1402,14 +1117,22 @@ usb_as_play_isoc_data(usb_as_state_t *uasp, mblk_t *mp)
goto done;
}
- if ((count = am_get_audio(ahdl, (void *)data->b_wptr,
- AUDIO_NO_CHANNEL, bufsize / precision)) == 0) {
+ /*
+ * restriction of Boomer: cannot call am_get_audio() in the context
+ * of start so we play a fragment of silence at first
+ */
+ if (play_req != NULL) {
+ bzero(data->b_wptr, bufsize);
+ count = bufsize / precision;
+
+ } else if ((count = am_get_audio(ahdl, (void *)data->b_wptr,
+ bufsize / precision)) == 0) {
mutex_enter(&uasp->usb_as_mutex);
if (uasp->usb_as_request_count == 0) {
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
/* Don't return failure for 0 bytes of data sent */
- if (mp) {
+ if (play_req) {
/*
* Since we set rval to SUCCESS
* we treat it as a special case
@@ -1536,13 +1259,13 @@ done:
}
-/*ARGSUSED*/
static void
-usb_as_pause_play(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_pause_play(usb_as_state_t *uasp)
{
ASSERT(mutex_owned(&uasp->usb_as_mutex));
+
+ /* this will stop the isoc request in the play callback */
uasp->usb_as_audio_state = USB_AS_PLAY_PAUSED;
- usb_as_send_mctl_up(uasp, NULL);
}
@@ -1628,7 +1351,7 @@ usb_as_play_exc_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
mutex_enter(&uasp->usb_as_mutex);
uasp->usb_as_rcv_debug_count++;
uasp->usb_as_request_count--;
- usb_as_handle_shutdown(uasp, NULL);
+ usb_as_handle_shutdown(uasp);
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_play_exc_cb: SEND CNT=%d, RCV COUNT=%d",
@@ -1646,7 +1369,7 @@ usb_as_play_exc_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
* usb_as_start_record
*/
static int
-usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_start_record(usb_as_state_t *uasp, audiohdl_t ahdl)
{
int rval = USB_FAILURE;
usb_isoc_req_t *isoc_req;
@@ -1654,10 +1377,9 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
ushort_t n_pkt = 1, pkt;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_start_record: mp=0x%p", (void *)mp);
+ "usb_as_start_record: inst=%d",
+ ddi_get_instance(uasp->usb_as_dip));
- ASSERT(mp != NULL);
- ASSERT(mp->b_cont != NULL);
ASSERT(mutex_owned(&uasp->usb_as_mutex));
/*
@@ -1668,7 +1390,7 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
if (uasp->usb_as_audio_state == USB_AS_IDLE) {
- uasp->usb_as_ahdl = *((audiohdl_t *)mp->b_cont->b_rptr);
+ uasp->usb_as_ahdl = ahdl;
uasp->usb_as_audio_state = USB_AS_ACTIVE;
mutex_exit(&uasp->usb_as_mutex);
@@ -1712,8 +1434,6 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
usb_free_isoc_req(isoc_req);
isoc_req = NULL;
}
- } else {
- usb_as_send_mctl_up(uasp, NULL);
}
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
@@ -1723,20 +1443,16 @@ usb_as_start_record(usb_as_state_t *uasp, mblk_t *mp)
}
-/*ARGSUSED*/
static int
-usb_as_stop_record(usb_as_state_t *uasp, mblk_t *mp)
+usb_as_stop_record(usb_as_state_t *uasp)
{
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_stop_record: ");
ASSERT(mutex_owned(&uasp->usb_as_mutex));
/* if we are disconnected, the pipe will be closed anyways */
- if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED) {
- usb_as_send_mctl_up(uasp, NULL);
-
+ if (uasp->usb_as_dev_state == USB_DEV_DISCONNECTED)
return (USB_SUCCESS);
- }
switch (uasp->usb_as_audio_state) {
case USB_AS_ACTIVE:
@@ -1750,17 +1466,14 @@ usb_as_stop_record(usb_as_state_t *uasp, mblk_t *mp)
USB_FLAGS_SLEEP);
mutex_enter(&uasp->usb_as_mutex);
- usb_as_send_mctl_up(uasp, NULL);
-
break;
case USB_AS_STOP_POLLING_STARTED:
/* A stop polling in progress, wait for completion and reply */
break;
default:
- usb_as_send_mctl_up(uasp, NULL);
+ break;
}
-
return (USB_SUCCESS);
}
@@ -1895,8 +1608,7 @@ usb_as_record_cb(usb_pipe_handle_t ph, usb_isoc_req_t *isoc_req)
am_send_audio(ahdl,
isoc_req->isoc_data->b_rptr + offset,
- AUDIO_NO_CHANNEL, isoc_req->
- isoc_pkt_descr[i].isoc_pkt_actual_length /
+ isoc_req->isoc_pkt_descr[i].isoc_pkt_actual_length /
precision);
mutex_enter(&uasp->usb_as_mutex);
@@ -2000,250 +1712,36 @@ usb_as_send_ctrl_cmd(usb_as_state_t *uasp,
ushort_t wValue, ushort_t wIndex, ushort_t wLength,
mblk_t *data, boolean_t ignore_errors)
{
- usb_ctrl_req_t *reqp;
-
+ usb_ctrl_setup_t setup;
+ usb_cr_t cr;
+ usb_cb_flags_t cf;
USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
"usb_as_send_ctrl_cmd: Begin bmRequestType=%d,\n\t"
"bRequest=%d, wValue=%d, wIndex=%d, wLength=%d, data=0x%p",
bmRequestType, bRequest, wValue, wIndex, wLength, (void *)data);
- if ((reqp = usb_alloc_ctrl_req(uasp->usb_as_dip, 0, 0)) == NULL) {
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mutex_exit(&uasp->usb_as_mutex);
-
- return (USB_FAILURE);
- }
-
- reqp->ctrl_bmRequestType = bmRequestType;
- reqp->ctrl_bRequest = bRequest;
- reqp->ctrl_wValue = wValue;
- reqp->ctrl_wIndex = wIndex;
- reqp->ctrl_wLength = wLength;
- reqp->ctrl_data = data;
- reqp->ctrl_attributes = 0;
- reqp->ctrl_client_private = (usb_opaque_t)uasp;
- reqp->ctrl_cb = usb_as_default_xfer_cb;
- reqp->ctrl_exc_cb = ignore_errors ?
- usb_as_default_xfer_cb : usb_as_default_xfer_exc_cb;
-
- /* Send async command down */
- if (usb_pipe_ctrl_xfer(uasp->usb_as_default_ph, reqp, 0) !=
- USB_SUCCESS) {
+ setup.bmRequestType = bmRequestType & ~USB_DEV_REQ_DEV_TO_HOST;
+ setup.bRequest = bRequest;
+ setup.wValue = wValue;
+ setup.wIndex = wIndex;
+ setup.wLength = wLength;
+ setup.attrs = 0;
+ if (usb_pipe_ctrl_xfer_wait(uasp->usb_as_default_ph, &setup, &data,
+ &cr, &cf, 0) != USB_SUCCESS) {
USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_ctrl_cmd: usba xfer failed (req=%d)",
- bRequest);
+ "usb_as_send_ctrl_cmd: usba xfer failed (req=%d), "
+ "completion reason: 0x%x, completion flags: 0x%x",
+ bRequest, cr, cf);
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mutex_exit(&uasp->usb_as_mutex);
- usb_free_ctrl_req(reqp);
-
- return (USB_FAILURE);
+ return (ignore_errors ? USB_SUCCESS: USB_FAILURE);
}
return (USB_SUCCESS);
}
-static void
-usb_as_send_merr_up(usb_as_state_t *uasp, mblk_t *mp)
-{
- queue_t *q;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_merr_up: data=0x%p", (void *)mp);
-
- ASSERT(mutex_owned(&uasp->usb_as_mutex));
- q = uasp->usb_as_rq;
-
- mp->b_datap->db_type = M_ERROR;
-
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
-
- mp->b_rptr = mp->b_datap->db_base;
- mp->b_wptr = mp->b_rptr + sizeof (char);
- *mp->b_rptr = EINVAL;
-
- mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(RD(q))) {
- freemsg(mp);
- mp = NULL;
- } else {
- putnext(RD(q), mp);
- }
- mutex_enter(&uasp->usb_as_mutex);
-}
-
-
-static void
-usb_as_send_mctl_up(usb_as_state_t *uasp, mblk_t *data)
-{
- mblk_t *tmp, *mp;
- queue_t *q;
- struct iocblk *iocp;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_mctl_up: data=0x%p", (void *)data);
- ASSERT(mutex_owned(&uasp->usb_as_mutex));
-
- q = uasp->usb_as_rq;
- mp = uasp->usb_as_def_mblk;
- ASSERT(mp != NULL);
-
- /* Free the b_cont of the original mblk_t, if any */
- if (mp->b_cont) {
- freemsg(mp->b_cont);
- mp->b_cont = NULL;
- }
-
- /*
- * If we have response to send up, attach it at the b_cont
- * of the mctl message. Otherwise just send the mctl message
- * up and the module above will decode the command
- */
- iocp = (struct iocblk *)mp->b_rptr;
- iocp->ioc_error = 0;
-
- switch (iocp->ioc_cmd) {
- case USB_AUDIO_SET_FORMAT:
- freemsg(data);
-
- /*
- * we cannot easily recover if we can't get an mblk
- * so we have to sleep here
- */
- tmp = allocb_wait(sizeof (int), BPRI_HI,
- STR_NOSIG, NULL);
- iocp->ioc_count = sizeof (int);
- *(int *)tmp->b_wptr = uasp->usb_as_alternate;
- tmp->b_wptr += sizeof (int);
- mp->b_cont = tmp;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_send_mctl_up: set_format returning,alt=%d",
- uasp->usb_as_alternate);
-
- break;
- default:
- if (data != NULL) {
- /*
- * Use the original mp to send the message up
- * This should already have the right ioc_cmd in.
- */
- iocp->ioc_count = MBLKL(data);
- mp->b_cont = data;
- } else {
- iocp->ioc_count = 0;
- }
- break;
- }
- uasp->usb_as_def_mblk = NULL;
- mutex_exit(&uasp->usb_as_mutex);
- if (!canputnext(q)) {
- freemsg(mp);
- mp = NULL;
- } else {
- putnext(q, mp);
- }
- mutex_enter(&uasp->usb_as_mutex);
-}
-
-
-/*
- * usb_as_default_xfer_cb:
- * Callback routine for the async control xfer. Reply mctl here.
- */
-/*ARGSUSED*/
-static void
-usb_as_default_xfer_cb(usb_pipe_handle_t def, usb_ctrl_req_t *reqp)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)reqp->ctrl_client_private;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_cb: ph=0x%p, reqp=0x%p",
- (void *)def, (void *)reqp);
-
- ASSERT((reqp->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MCTL;
- usb_as_send_mctl_up(uasp, NULL);
- mutex_exit(&uasp->usb_as_mutex);
-
- usb_free_ctrl_req(reqp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_cb: End");
-}
-
-
-/*
- * usb_as_isoc_close_cb()
- * called from teardown usb_pipe_close
- */
-static void
-usb_as_isoc_close_cb(usb_pipe_handle_t ph, usb_opaque_t arg,
- int rval, usb_cb_flags_t cb_flags)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)arg;
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_isoc_close_cb: ph=0x%p arg=0x%p cb_flags=0x%x",
- (void *)ph, (void *)arg, cb_flags);
-
- /* pipe close cannot fail */
- ASSERT(rval == USB_SUCCESS);
-
- mutex_enter(&uasp->usb_as_mutex);
- usb_as_send_mctl_up(uasp, NULL);
- mutex_exit(&uasp->usb_as_mutex);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_isoc_close_cb: End");
-}
-
-
-/*
- * usb_as_default_exc_cb:
- * Exception callback for the default pipe. Autoclearing took care
- * of the recovery
- */
-/*ARGSUSED*/
-static void
-usb_as_default_xfer_exc_cb(usb_pipe_handle_t def, usb_ctrl_req_t *reqp)
-{
- usb_as_state_t *uasp = (usb_as_state_t *)reqp->ctrl_client_private;
- mblk_t *mp;
-
- USB_DPRINTF_L2(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_exc_cb: ph=0x%p, reqp=0x%p",
- (void *)def, (void *)reqp);
-
- ASSERT((reqp->ctrl_cb_flags & USB_CB_INTR_CONTEXT) == 0);
-
- mutex_enter(&uasp->usb_as_mutex);
- uasp->usb_as_xfer_cr = USB_AS_SEND_MERR;
- mp = uasp->usb_as_def_mblk;
- uasp->usb_as_def_mblk = NULL;
-
- usb_as_send_merr_up(uasp, mp);
-
- mutex_exit(&uasp->usb_as_mutex);
-
- usb_free_ctrl_req(reqp);
-
- USB_DPRINTF_L4(PRINT_MASK_ALL, uasp->usb_as_log_handle,
- "usb_as_default_xfer_exc_cb: End");
-}
-
-
/*
* Power management
*/
@@ -2801,30 +2299,9 @@ usb_as_prepare_registration_data(usb_as_state_t *uasp)
}
}
- /*
- * we prefer that a valid format supports all our
- * default sample rates. If not we delete sample rates
- * to get a set that is supported by all formats.
- *
- * Continuous sample rate will be checked in set_format
- * command for a particular alternate. This is interface
- * specific registration data and not per alternate.
- */
- reg->reg_mixer_srs.ad_srs = reg->reg_mixer_srs_list;
- reg->reg_mixer_srs.ad_limits = MIXER_SRS_FLAG_SR_LIMITS;
-
- /* copy over sample rate table but zero it first */
- bzero(reg->reg_mixer_srs_list, sizeof (reg->reg_mixer_srs_list));
- bcopy(usb_as_mixer_srs, reg->reg_mixer_srs_list,
- sizeof (usb_as_mixer_srs));
-
- reg->reg_compat_srs.ad_srs = reg->reg_compat_srs_list;
- reg->reg_compat_srs.ad_limits = MIXER_SRS_FLAG_SR_NOT_LIMITS;
-
/* copy over sample rate table but zero it first */
- bzero(reg->reg_compat_srs_list, sizeof (reg->reg_compat_srs_list));
- bcopy(usb_as_default_srs, reg->reg_compat_srs_list,
- sizeof (usb_as_default_srs));
+ bzero(reg->reg_srs, sizeof (reg->reg_srs));
+ bcopy(usb_as_default_srs, reg->reg_srs, sizeof (usb_as_default_srs));
channels[1] = channels[2] = 0;
@@ -2841,8 +2318,8 @@ usb_as_prepare_registration_data(usb_as_state_t *uasp)
if (uasp->usb_as_alts[alt].alt_valid &&
(n < USB_AS_N_FORMATS) &&
(usb_as_valid_format(uasp, alt,
- reg->reg_compat_srs_list,
- (sizeof (reg->reg_compat_srs_list)/
+ reg->reg_srs,
+ (sizeof (reg->reg_srs)/
sizeof (uint_t)) - 1)) == USB_SUCCESS) {
reg->reg_formats[n].fmt_termlink =
uasp->usb_as_alts[alt].alt_general->
diff --git a/usr/src/uts/common/io/usb/inc.flg b/usr/src/uts/common/io/usb/inc.flg
deleted file mode 100644
index f130c48245..0000000000
--- a/usr/src/uts/common/io/usb/inc.flg
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/bin/sh
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-
-#
-# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-
-
-# This file brings down all that is needed to build just
-# USB drivers.
-#
-
-find_files "s.*.x" \
- usr/src/uts/common/rpc \
- usr/src/uts/common/rpcsvc \
- usr/src/uts/common/gssapi
-
-find_files "s.*.h" \
- usr/src/uts/common/vm \
- usr/src/uts/common/sys \
- usr/src/uts/common/rpc \
- usr/src/uts/common/gssapi \
- usr/src/uts/common/netinet \
- usr/src/uts/common/net \
- usr/src/uts/intel/sys \
- usr/src/uts/sparc/sys \
- usr/src/uts/sparc/v7/sys \
- usr/src/uts/sparc/v9/sys \
- usr/src/uts/sun/sys
-
-echo_file usr/src/uts/common/io/cmlb.c
-
-find_files "s.*" \
- usr/src/uts/common/io/warlock \
- usr/src/uts/common/io/scsi \
- usr/src/uts/common/io/audio \
- usr/src/uts/sparc/hid \
- usr/src/uts/sparc/hidparser \
- usr/src/uts/sparc/usba \
- usr/src/uts/sparc/usba10 \
- usr/src/uts/sparc/uhci \
- usr/src/uts/sparc/ohci \
- usr/src/uts/sparc/ehci \
- usr/src/uts/sparc/hubd \
- usr/src/uts/sparc/usb_mid \
- usr/src/uts/sparc/usb_ia \
- usr/src/uts/sparc/usbkbm \
- usr/src/uts/sparc/usbms \
- usr/src/uts/sparc/scsa2usb \
- usr/src/uts/sparc/scsi \
- usr/src/uts/sparc/sd \
- usr/src/uts/sparc/st \
- usr/src/uts/sparc/cmlb \
- usr/src/uts/sparc/usbprn \
- usr/src/uts/sparc/usb_ac \
- usr/src/uts/sparc/usb_ac_dacf \
- usr/src/uts/sparc/usb_as \
- usr/src/uts/sparc/usb_ah \
- usr/src/uts/sparc/audiosup \
- usr/src/uts/sparc/mixer \
- usr/src/uts/sparc/amsrc2 \
- usr/src/uts/sparc/ugen \
- usr/src/uts/sparc/usbftdi \
- usr/src/uts/sparc/usbser \
- usr/src/uts/sparc/usbsksp \
- usr/src/uts/sparc/usbsprl \
- usr/src/uts/sparc/usbsacm \
- usr/src/uts/sparc/usbvc \
- usr/src/uts/sparc/wusb_ca \
- usr/src/uts/sparc/hwa1480_fw \
- usr/src/uts/sparc/hwahc \
- usr/src/uts/sparc/hwarc \
- usr/src/uts/sparc/wusb_df \
- usr/src/uts/sparc/uwba \
- usr/src/uts/sparc/usbskel \
- usr/src/uts/sparc/warlock \
- usr/src/uts/sparc/asm \
- usr/src/uts/intel/hid \
- usr/src/uts/intel/hidparser \
- usr/src/uts/intel/usba \
- usr/src/uts/intel/usba10 \
- usr/src/uts/intel/uhci \
- usr/src/uts/intel/ohci \
- usr/src/uts/intel/ehci \
- usr/src/uts/intel/hubd \
- usr/src/uts/intel/usb_mid \
- usr/src/uts/intel/usb_ia \
- usr/src/uts/intel/usbkbm \
- usr/src/uts/intel/usbms \
- usr/src/uts/intel/scsa2usb \
- usr/src/uts/intel/scsi \
- usr/src/uts/intel/sd \
- usr/src/uts/intel/st \
- usr/src/uts/intel/cmlb \
- usr/src/uts/intel/usbprn \
- usr/src/uts/intel/usb_ac \
- usr/src/uts/intel/usb_ac_dacf \
- usr/src/uts/intel/usb_as \
- usr/src/uts/intel/usb_ah \
- usr/src/uts/intel/audiosup \
- usr/src/uts/intel/mixer \
- usr/src/uts/intel/amsrc2 \
- usr/src/uts/intel/ugen \
- usr/src/uts/intel/usbftdi \
- usr/src/uts/intel/usbser \
- usr/src/uts/intel/usbsksp \
- usr/src/uts/intel/usbsprl \
- usr/src/uts/intel/usbsacm \
- usr/src/uts/intel/usbvc \
- usr/src/uts/intel/wusb_ca \
- usr/src/uts/intel/hwa1480_fw \
- usr/src/uts/intel/hwahc \
- usr/src/uts/intel/hwarc \
- usr/src/uts/intel/wusb_df \
- usr/src/uts/intel/uwba \
- usr/src/uts/intel/usbskel \
- usr/src/uts/intel/warlock \
- usr/src/uts/intel/ia32 \
- usr/src/uts/intel/amd64 \
- usr/src/uts/intel/asm
-
-
-echo_file usr/src/uts/sparc/os/driver_classes
-echo_file usr/src/uts/sparc/os/driver_aliases
-echo_file usr/src/uts/sparc/os/name_to_major
-echo_file usr/src/uts/intel/os/driver_classes
-echo_file usr/src/uts/intel/os/driver_aliases
-echo_file usr/src/uts/intel/os/name_to_major
-
-echo_file usr/src/Makefile.master
-echo_file usr/src/Makefile.master.64
-echo_file usr/src/req.flg
-echo_file usr/src/Makefile.psm
-echo_file usr/src/Makefile.psm.targ
-echo_file usr/src/uts/Makefile
-echo_file usr/src/uts/Makefile.targ
-echo_file usr/src/uts/Makefile.uts
-echo_file usr/src/uts/sun/Makefile.files
-echo_file usr/src/uts/sun/Makefile.rules
-echo_file usr/src/uts/common/Makefile.files
-echo_file usr/src/uts/common/Makefile.rules
-echo_file usr/src/uts/common/sys/Makefile.syshdrs
-echo_file usr/src/uts/sparc/Makefile
-echo_file usr/src/uts/sparc/Makefile.files
-echo_file usr/src/uts/sparc/Makefile.rules
-echo_file usr/src/uts/sparc/Makefile.sparc
-echo_file usr/src/uts/sparc/Makefile.sparc.shared
-echo_file usr/src/uts/sparc/Makefile.targ
-echo_file usr/src/uts/sparc/Makefile.targ.shared
-echo_file usr/src/uts/sparc/req.flg
-echo_file usr/src/uts/sparc/ml/sparc.il
-echo_file usr/src/uts/sparc/v9/Makefile.files
-echo_file usr/src/uts/sparc/v9/Makefile.rules
-echo_file usr/src/uts/sun4u/Makefile.rules
-echo_file usr/src/uts/sun4/Makefile.rules
-echo_file usr/src/uts/intel/Makefile
-echo_file usr/src/uts/intel/Makefile.files
-echo_file usr/src/uts/intel/Makefile.rules
-echo_file usr/src/uts/intel/Makefile.intel
-echo_file usr/src/uts/intel/Makefile.intel.shared
-echo_file usr/src/uts/intel/Makefile.targ
-echo_file usr/src/uts/intel/Makefile.targ.shared
-echo_file usr/src/uts/sparc/v9/Makefile.files
-echo_file usr/src/uts/sparc/v9/Makefile.rules
-echo_file usr/src/uts/sun4u/Makefile.rules
-echo_file usr/src/uts/sun4/Makefile.rules
-echo_file usr/src/uts/common/sys/Makefile
-echo_file usr/src/uts/common/os/privs.awk
-echo_file usr/src/uts/common/os/priv_defs
-echo_file usr/src/uts/common/rpc/Makefile
-echo_file usr/src/uts/common/rpcsvc/Makefile
-echo_file usr/src/uts/common/gssapi/Makefile
diff --git a/usr/src/uts/common/io/warlock/usb_ac.wlcmd b/usr/src/uts/common/io/warlock/usb_ac.wlcmd
index 37bf53167a..6a68d90059 100644
--- a/usr/src/uts/common/io/warlock/usb_ac.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac.wlcmd
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
one usb_ac_state
@@ -46,9 +45,6 @@ root usb_ac_stop_play
root usb_ac_stop_record
root usb_ac_teardown
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
-
add bus_ops::bus_add_eventcall targets warlock_dummy
add bus_ops::bus_get_eventcookie targets warlock_dummy
add bus_ops::bus_post_event targets warlock_dummy
diff --git a/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd b/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
index 67cc818a42..9442430d7f 100644
--- a/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac_with_sada.wlcmd
@@ -19,10 +19,9 @@
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
# warlock command file
@@ -86,8 +85,6 @@ root am_single_open_task
root am_hw_task
### specify the usb_ac root functions
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
root usb_ac_open
root usb_ac_close
root usb_ac_disconnect_event_cb
diff --git a/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd b/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
index e5441a38e2..aba4357455 100644
--- a/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
+++ b/usr/src/uts/common/io/warlock/usb_ac_with_usba.wlcmd
@@ -1,5 +1,5 @@
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# CDDL HEADER START
@@ -21,7 +21,6 @@
#
# CDDL HEADER END
#
-#ident "%Z%%M% %I% %E% SMI"
one ohci_state
one ehci_state
@@ -147,8 +146,6 @@ root ohci_intr
root ehci_intr
### specify the usb_ac root functions
-root usb_ac_dacf.c:usb_ac_mux_plumbing
-root usb_ac_dacf.c:usb_ac_mux_unplumbing
root usb_ac_open
root usb_ac_close
root usb_ac_disconnect_event_cb
diff --git a/usr/src/uts/common/sys/Makefile b/usr/src/uts/common/sys/Makefile
index 75a8d27fc0..4f0cb2dd1c 100644
--- a/usr/src/uts/common/sys/Makefile
+++ b/usr/src/uts/common/sys/Makefile
@@ -43,9 +43,6 @@ i386_HDRS= \
agp/agptarget_io.h \
agpgart.h \
asy.h \
- audio/audio810.h \
- audio/audiohd.h \
- audio/audioixp.h \
fd_debug.h \
fdc.h \
fdmedia.h \
@@ -55,8 +52,6 @@ i386_HDRS= \
ucode.h
sparc_HDRS= \
- audio/audiots.h \
- audio/am_src2.h \
mouse.h \
scsi/targets/ssddef.h \
$(MDESCHDRS)
@@ -85,7 +80,6 @@ CHKHDRS= \
attr.h \
audio.h \
audioio.h \
- audiovar.h \
autoconf.h \
auxv.h \
auxv_386.h \
@@ -505,6 +499,7 @@ CHKHDRS= \
socketvar.h \
sockio.h \
sodirect.h \
+ soundcard.h \
squeue.h \
squeue_impl.h \
srn.h \
@@ -653,12 +648,9 @@ HDRS= \
AUDIOHDRS= \
ac97.h \
- am_src1.h \
- audio_apm.h \
- audio_mixer.h \
- audio_src.h \
- audio_support.h \
- audio_trace.h \
+ audio_common.h \
+ audio_driver.h \
+ audio_oss.h \
g711.h
AVHDRS= \
diff --git a/usr/src/uts/common/sys/audio/ac97.h b/usr/src/uts/common/sys/audio/ac97.h
index 2a2f7afb33..ebeae69d2e 100644
--- a/usr/src/uts/common/sys/audio/ac97.h
+++ b/usr/src/uts/common/sys/audio/ac97.h
@@ -20,20 +20,15 @@
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-/*
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
#ifndef _SYS_AC97_H
#define _SYS_AC97_H
-#pragma ident "%Z%%M% %I% %E% SMI"
+#include <sys/types.h>
+#include <sys/audio/audio_common.h>
#ifdef __cplusplus
extern "C" {
@@ -42,89 +37,12 @@ extern "C" {
#ifdef _KERNEL
/*
- * This header file describes the AC-97 V2.1 Codec register set. See the
+ * This header file describes the AC-97 Codec register set. See the
* spec for a detailed description of each register.
*/
-struct ac97_v21 {
- uint16_t ac97_reset; /* 00h */
- uint16_t ac97_master_volume; /* 02h */
- uint16_t ac97_headphone_volume; /* 04h, optional */
- uint16_t ac97_master_mono_volume; /* 06h, optional */
- uint16_t ac97_master_tone; /* 08h, optional */
- uint16_t ac97_pc_beep_volume; /* 0ah, optional */
- uint16_t ac97_phone_volume; /* 0ch, optional */
- uint16_t ac97_mic_volume; /* 0eh */
- uint16_t ac97_line_in_volume; /* 10h */
- uint16_t ac97_cd_volume; /* 12h */
- uint16_t ac97_video_volume; /* 14h, optional */
- uint16_t ac97_aux_volume; /* 16h, optional */
- uint16_t ac97_PCM_out_volume; /* 18h */
- uint16_t ac97_record_select; /* 1ah */
- uint16_t ac97_record_gain; /* 1ch */
- uint16_t ac97_record_gain_mic; /* 1eh, optional */
- uint16_t ac97_general_purpose; /* 20h, optional */
- uint16_t ac97_threeD_control; /* 22h, optional */
- uint16_t ac97_reserved_1; /* 24h */
- uint16_t ac97_pwrdwn_ctrl_stat; /* 26h */
-
- /* extended audio registers */
-
- uint16_t ac97_ext_audio_id; /* 28h, optional */
- uint16_t ac97_ext_audio_stat_ctrl; /* 2ah, optional */
- uint16_t ac97_ext_front_DAC_rate; /* 2ch, optional */
- uint16_t ac97_ext_surround_DAC_rate; /* 2eh, optional */
- uint16_t ac97_ext_LFE_DAC_rate; /* 30h, optional */
- uint16_t ac97_ext_LR_ADC_rate; /* 32h, optional */
- uint16_t ac97_ext_mic_ADC_rate; /* 34h, optional */
- uint16_t ac97_ext_C_LFE_volume; /* 36h, optional */
- uint16_t ac97_ext_LR_surround_volume; /* 38h, optional */
- uint16_t ac97_ext_reserved_1; /* 3ah, optional */
-
- /* extended modem registers */
-
- uint16_t ac97_ext_modem_id; /* 3ch, optional */
- uint16_t ac97_ext_modem_stat_ctrl; /* 3eh, optional */
- uint16_t ac97_ext_line1_DAC_ADC_rate; /* 40h, optional */
- uint16_t ac97_ext_line2_DAC_ADC_rate; /* 42h, optional */
- uint16_t ac97_ext_hndst_DAC_ADC_rate; /* 44h, optional */
- uint16_t ac97_ext_line1_DAC_ADC_level; /* 46h, optional */
- uint16_t ac97_ext_line2_DAC_ADC_level; /* 48h, optional */
- uint16_t ac97_ext_hndst_DAC_ADC_level; /* 4ah, optional */
- uint16_t ac97_ext_GPIO_pin_config; /* 4ch, optional */
- uint16_t ac97_ext_GPIO_pin_polarity; /* 4eh, optional */
- uint16_t ac97_ext_GPIO_pin_sticky; /* 50h, optional */
- uint16_t ac97_ext_GPIO_pin_wakeup; /* 52h, optional */
- uint16_t ac97_ext_GPIO_pin_status; /* 54h, optional */
- uint16_t ac97_ext_modem_AFE_stat_ctrl; /* 56h, optional */
- uint16_t ac97_ext_reserved_2; /* 58h, optional */
-
- /* reserved for vendor usage */
- uint16_t ac97_vendor_01; /* 5ah, optional */
- uint16_t ac97_vendor_02; /* 5ch, optional */
- uint16_t ac97_vendor_03; /* 5eh, optional */
- uint16_t ac97_vendor_04; /* 60h, optional */
- uint16_t ac97_vendor_05; /* 62h, optional */
- uint16_t ac97_vendor_06; /* 64h, optional */
- uint16_t ac97_vendor_07; /* 66h, optional */
- uint16_t ac97_vendor_08; /* 68h, optional */
- uint16_t ac97_vendor_09; /* 6ah, optional */
- uint16_t ac97_vendor_10; /* 6ch, optional */
- uint16_t ac97_vendor_11; /* 6eh, optional */
- uint16_t ac97_vendor_12; /* 70h, optional */
- uint16_t ac97_vendor_13; /* 72h, optional */
- uint16_t ac97_vendor_14; /* 74h, optional */
- uint16_t ac97_vendor_15; /* 76h, optional */
- uint16_t ac97_vendor_16; /* 78h, optional */
- uint16_t ac97_vendor_17; /* 7ah, optional */
-
- uint16_t ac97_vendor_id1; /* 7ch */
- uint16_t ac97_vendor_id2; /* 7eh */
-};
-typedef struct ac97_v21 ac97_v21_t;
-
/*
- * Defines for the V2.1 registers.
+ * Defines for the registers.
*/
/* Reset Register Index 00h */
@@ -162,7 +80,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define HPVR_MUTE 0x8000
/* Mono Master Volume Register Index 06h - Optional */
-#define AC97_MONO_MASTER_VOLUME_REGSITER 0x06
+#define AC97_MONO_MASTER_VOLUME_REGISTER 0x06
#define MMVR_MASK 0x001f
#define MMVR_0dB_ATTEN 0x0000
#define MMVR_OPTIONAL_MASK 0x003f
@@ -239,7 +157,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define AUXVR_LEFT_MAX_ATTEN 0x1f00
#define AUXVR_MUTE 0x8000
-/* PCM Out Input Volume Register Index 18h */
+/* PCM Out Volume Register Index 18h */
#define AC97_PCM_OUT_VOLUME_REGISTER 0x18
#define PCMOVR_RIGHT_GAIN_MASK 0x001f
#define PCMOVR_RIGHT_0dB_GAIN 0x0010
@@ -306,6 +224,14 @@ typedef struct ac97_v21 ac97_v21_t;
#define TDCR_CENTER_MASK 0x0f00
#define TDCR_NULL 0x0000
+/* Audio Interrupt and Paging Mechanism Index 24h - r2.3 */
+#define AC97_INTERRUPT_PAGING_REGISTER 0x24
+#define IPR_IS 0x8000
+#define IPR_CAUSE_MASK 0x6000
+#define IPR_SC 0x1000
+#define IPR_IE 0x0800
+#define IPR_PG_MASK 0x000f
+
/* Powerdown Control Status Register Index 26h */
#define AC97_POWERDOWN_CTRL_STAT_REGISTER 0x26
#define PCSR_ADC 0x0001
@@ -327,11 +253,17 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_AUDIO_REGISTER 0x28
#define EAR_VRA 0x0001
#define EAR_DRA 0x0002
+#define EAR_SPDIF 0x0004
#define EAR_VRM 0x0008
+#define EAR_DSA_MASK 0x0030
#define EAR_CDAC 0x0040
#define EAR_SDAC 0x0080
#define EAR_LDAC 0x0100
#define EAR_AMAP 0x0200
+#define EAR_REV_MASK 0x0c00
+#define EAR_REV_21 0x0000
+#define EAR_REV_22 0x0400
+#define EAR_REV_23 0x0800
#define EAR_PRIMARY_CODEC 0x0000
#define EAR_SECONDARY_01_CODEC 0x4000
#define EAR_SECONDARY_10_CODEC 0x8000
@@ -341,15 +273,23 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER 0x2a
#define EASCR_VRA 0x0001
#define EASCR_DRA 0x0002
+#define EASCR_SPDIF 0x0004
#define EASCR_VRM 0x0008
+#define EASCR_SPSA_MASK 0x0030
+#define EASCR_SPSA_3_4 0x0000
+#define EASCR_SPSA_7_8 0x0010
+#define EASCR_SPSA_6_9 0x0020
+#define EASCR_SPSA_10_11 0x0030
#define EASCR_CDAC 0x0040
#define EASCR_SDAC 0x0080
#define EASCR_LDAC 0x0100
#define EASCR_MADC 0x0200
+#define EASCR_SPCV 0x0400
#define EASCR_PRI 0x0800
#define EASCR_PRJ 0x1000
#define EASCR_PRK 0x2000
#define EASCR_PRL 0x4000
+#define EASCR_VCFG 0x8000
/* Extended Front DAC Rate Register 2ch - Optional */
#define AC97_EXTENDED_FRONT_DAC_RATE_REGISTER 0x2c
@@ -371,7 +311,7 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_EXTENDED_C_LFE_VOLUME_REGISTER 0x36
#define EXLFEVR_CENTER_MASK 0x001f
#define EXLFEVR_CENTER_OPTIONAL_MASK 0x003f
-#define EXLFEVR_CENTER_MTUE 0x0080
+#define EXLFEVR_CENTER_MUTE 0x0080
#define EXLFEVR_LFE_MASK 0x1f00
#define EXLFEVR_LFE_OPTIONAL_MASK 0x3f00
#define EXLFEVR_LFE_MUTE 0x8000
@@ -385,6 +325,25 @@ typedef struct ac97_v21 ac97_v21_t;
#define EXLFEVR_LEFT_OPTIONAL_MASK 0x3f00
#define EXLFEVR_LEFT_MUTE 0x8000
+/* S/PDIF Control Register 3ah - Optional */
+#define AC97_SPDIF_CONTROL_REGISTER 0x3a
+#define SPCR_PRO 0x0001
+#define SPCR_AUDIO 0x0002
+#define SPCR_COPY 0x0004
+#define SPCR_PRE 0x0008
+#define SPCR_CC_MASK 0x07f0
+#define SPCR_L 0x0800
+#define SPCR_SPSR_MASK 0x3000
+#define SPCR_SPSR_44100 0x0000
+#define SPCR_SPSR_48000 0x2000
+#define SPCR_SPSR_32000 0x3000
+#define SPCR_DRS 0x4000
+#define SPCR_V 0x8000
+
+/*
+ * Modem only registers from 3ch - 58h.
+ */
+
/* Extended Modem ID Register 3ch - Optional */
#define AC97_EXTENDED_MODEM_ID_REGISTER 0x3c
#define EMIDR_LINE1 0x0001
@@ -478,7 +437,11 @@ typedef struct ac97_v21 ac97_v21_t;
#define EMAFESCR_CID1 0x4000
#define EMAFESCR_CID2 0x8000
-/* Vender Reserved Registers 5ah - 7ah - Optional */
+/* Vendor Reserved Registers 5ah - 7ah - Optional */
+/*
+ * Note that 60h - 6eh is also defined as the extended codec page area in
+ * AC'97 r2.3.
+ */
#define AC97_VENDOR_REGISTER_01 0x5a
#define AC97_VENDOR_REGISTER_02 0x5c
#define AC97_VENDOR_REGISTER_03 0x5e
@@ -497,6 +460,18 @@ typedef struct ac97_v21 ac97_v21_t;
#define AC97_VENDOR_REGISTER_16 0x78
#define AC97_VENDOR_REGISTER_17 0x7a
+/*
+ * Page 01 Extended Codec Registers
+ */
+#define AC97_PAGE01_CODEC_CLASS_REV_REGISTER 0x60
+#define AC97_PAGE01_PCI_SVID_REGISTER 0x62
+#define AC97_PAGE01_PCI_SID_REGISTER 0x64
+#define AC97_PAGE01_FUNCTION_SELECT_REGISTER 0x66
+#define AC97_PAGE01_FUNCTION_INFORMATION_REGISTER 0x68
+#define AC97_PAGE01_SENSE_DETAILS_REGISTER 0x6a
+#define AC97_PAGE01_DAC_SLOT_MAPPING_REGISTER 0x6c
+#define AC97_PAGE01_ADC_SLOT_MAPPING_REGISTER 0x6e
+
/* Vendor ID1 Register 7ch */
#define AC97_VENDOR_ID1_REGISTER 0x7c
#define VID1R_CHAR2_MASK 0x00ff
@@ -507,6 +482,133 @@ typedef struct ac97_v21 ac97_v21_t;
#define VID2R_REVISION_MASK 0x00ff
#define VID2R_CHAR3_MASK 0xff00
+/*
+ * Property names used by AC97. We should probably have a better way
+ * of dealing with some of these. (LINEIN_FUNC and MIC_FUNC should really
+ * be saved/restored with other global settings.)
+ */
+#define AC97_PROP_AMPLIFIER "ac97-amplifier"
+#define AC97_PROP_SPEAKER "ac97-speaker"
+#define AC97_PROP_MICBOOST "ac97-micboost"
+#define AC97_PROP_NO_HEADPHONE "ac97-no-headphone"
+#define AC97_PROP_NO_AUXOUT "ac97-no-auxout"
+#define AC97_PROP_NO_CDROM "ac97-no-cdrom"
+#define AC97_PROP_NO_VIDEO "ac97-no-video"
+#define AC97_PROP_NO_AUXIN "ac97-no-auxin"
+#define AC97_PROP_NO_MIC "ac97-no-mic"
+#define AC97_PROP_NO_LINEIN "ac97-no-linein"
+#define AC97_PROP_LINEIN_FUNC "ac97-linein-function" /* 1=linein, 2=surr */
+#define AC97_PROP_MIC_FUNC "ac97-mic-function" /* 1=mic, 2=cen/lfe */
+#define AC97_PROP_DOWNMIX "ac97-downmix"
+#define AC97_PROP_SPREAD "ac97-spread"
+
+/*
+ * Known Codec vendors.
+ */
+#define AC97_VENDOR_ADS 0x41445300 /* Analog Devices */
+#define AC97_VENDOR_AKM 0x414b4d00 /* Asahi Kasei */
+#define AC97_VENDOR_ALC 0x414c4300 /* Realtek */
+#define AC97_VENDOR_ALG 0x414c4700 /* Realtek */
+#define AC97_VENDOR_CMI 0x43d44900 /* Cmedia */
+#define AC97_VENDOR_CRY 0x43525900 /* Cirrus Logic */
+#define AC97_VENDOR_CXT 0x43585400 /* Conexant */
+#define AC97_VENDOR_EMC 0x454d4300 /* eMicro */
+#define AC97_VENDOR_EV 0x000f8300 /* Ectiva */
+#define AC97_VENDOR_ESS 0x45838300 /* ESS */
+#define AC97_VENDOR_ICE 0x49434500 /* ICEnsemble */
+#define AC97_VENDOR_ST 0x83847600 /* SigmaTel */
+#define AC97_VENDOR_TRA 0x54524100 /* TriTech */
+#define AC97_VENDOR_VIA 0x56494100 /* VIA */
+#define AC97_VENDOR_WML 0x574d4c00 /* Wolfson */
+#define AC97_VENDOR_YMH 0x594d4800 /* Yamaha */
+
+/*
+ * Known Codec IDs.
+ */
+#define AC97_CODEC_AD1819B 0x41445303
+#define AC97_CODEC_AD1881 0x41445340
+#define AC97_CODEC_AD1881A 0x41445348
+#define AC97_CODEC_AD1885 0x41445360
+#define AC97_CODEC_AD1886 0x41445361
+#define AC97_CODEC_AD1887 0x41445362
+#define AC97_CODEC_AD1888 0x41445368
+#define AC97_CODEC_AD1980 0x41445370
+#define AC97_CODEC_AD1981A 0x41445371
+#define AC97_CODEC_AD1981 0x41445372
+#define AC97_CODEC_AD1981B 0x41445374
+#define AC97_CODEC_AD1985 0x41445375
+#define AC97_CODEC_AK4540 0x414b4d00
+#define AC97_CODEC_ALC100 0x414c4326
+#define AC97_CODEC_ALC200P 0x414c4710
+#define AC97_CODEC_ALC202 0x414c4740
+#define AC97_CODEC_ALC203 0x414c4770
+#define AC97_CODEC_ALC250 0x414c4750
+#define AC97_CODEC_ALC250_2 0x414c4752
+#define AC97_CODEC_ALC650 0x414c4720
+#define AC97_CODEC_ALC655 0x414c4760
+#define AC97_CODEC_ALC658 0x414c4780
+#define AC97_CODEC_ALC850 0x414c4790
+#define AC97_CODEC_CMI9738 0x434d4941
+#define AC97_CODEC_CMI9739 0x434d4961
+#define AC97_CODEC_CMI9780 0x434d4969
+#define AC97_CODEC_CMI9761 0x434d4978
+#define AC97_CODEC_CMI9761_2 0x434d4982
+#define AC97_CODEC_CMI9761_3 0x434d4983
+#define AC97_CODEC_CS4202 0x43525970
+#define AC97_CODEC_CS4205 0x43525950
+#define AC97_CODEC_CS4294 0x43525920
+#define AC97_CODEC_CS4297 0x43525900
+#define AC97_CODEC_CS4297A 0x43525910
+#define AC97_CODEC_CS4299 0x43525930
+#define AC97_CODEC_CX20468 0x43585428
+#define AC97_CODEC_CX20468_2 0x43585429
+#define AC97_CODEC_CX20468_21 0x43585430
+#define AC97_CODEC_EM28028 0x454d4328
+#define AC97_CODEC_ES1921 0x45838308
+#define AC97_CODEC_EV1938 0x000f8384
+#define AC97_CODEC_ICE1232 0x49434511
+#define AC97_CODEC_STAC9700 0x83847600
+#define AC97_CODEC_STAC9701 0x83847601
+#define AC97_CODEC_STAC9701_2 0xc250c250
+#define AC97_CODEC_STAC9704 0x83847604
+#define AC97_CODEC_STAC9705 0x83847605
+#define AC97_CODEC_STAC9708 0x83847608
+#define AC97_CODEC_STAC9721 0x83847609
+#define AC97_CODEC_STAC9744 0x83847644
+#define AC97_CODEC_STAC9750 0x83847650
+#define AC97_CODEC_STAC9752 0x83847652
+#define AC97_CODEC_STAC9756 0x83847656
+#define AC97_CODEC_STAC9758 0x83847658
+#define AC97_CODEC_STAC9766 0x83847666
+#define AC97_CODEC_TR28023 0x54524103
+#define AC97_CODEC_TR28023_2 0x54524123
+#define AC97_CODEC_TR28028 0x54524108
+#define AC97_CODEC_TR28028_2 0x54524128
+#define AC97_CODEC_VT1612A 0x56494161
+#define AC97_CODEC_VT1617A 0x56494170
+#define AC97_CODEC_VT1616 0x49434551
+#define AC97_CODEC_VT1616A 0x49434552
+#define AC97_CODEC_VT1618 0x56494182
+#define AC97_CODEC_WM9701A 0x574d4c00
+#define AC97_CODEC_WM9703 0x574d4c03
+#define AC97_CODEC_WM9704 0x574d4c04
+#define AC97_CODEC_YMF743 0x594d4800
+#define AC97_CODEC_YMF753 0x594d4803
+
+/*
+ * Functions for drivers to interact with the common ac97 module.
+ */
+typedef struct ac97 ac97_t;
+typedef void (*ac97_wr_t)(void *, uint8_t, uint16_t);
+typedef uint16_t (*ac97_rd_t)(void *, uint8_t);
+
+ac97_t *ac97_alloc(dev_info_t *, ac97_rd_t, ac97_wr_t, void *);
+void ac97_free(ac97_t *);
+int ac97_init(ac97_t *, audio_dev_t *);
+void ac97_suspend(ac97_t *);
+void ac97_resume(ac97_t *);
+void ac97_reset(ac97_t *);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/common/sys/audio/am_src1.h b/usr/src/uts/common/sys/audio/am_src1.h
deleted file mode 100644
index 9e5fcd41f9..0000000000
--- a/usr/src/uts/common/sys/audio/am_src1.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * This header file defines the public interfaces for the default
- * audio mixer sample rate converter.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AM_SRC1_H
-#define _SYS_AM_SRC1_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define AM_SRC1_MOD_NAME "Audio Sample Rate Conv. #1"
-
-#ifdef _KERNEL
-
-/*
- * am_ad_src1_info_t - mixer mode Audio Driver sample rate conversion #1 info
- */
-struct am_ad_src1_info {
- uint_t ad_from_sr; /* going from this sample rate */
- uint_t ad_to_sr; /* to this sample rate */
- uint_t ad_nconv; /* number of conversions */
- uint_t ad_u0; /* up conversion parameter #1 */
- uint_t ad_u1; /* up conversion parameter #2 */
- uint_t ad_u2; /* up conversion parameter #3 */
- uint_t ad_u3; /* up conversion parameter #4 */
- uint_t ad_d0; /* conversion parameter #1 */
- uint_t ad_d1; /* conversion parameter #2 */
- uint_t ad_d2; /* conversion parameter #3 */
- uint_t ad_d3; /* conversion parameter #4 */
- uint_t ad_k; /* filter shift */
-};
-typedef struct am_ad_src1_info am_ad_src1_info_t;
-
-#define AM_SRC1_FILTER 0x40000000 /* filter if ORed with ad_p?? */
-
-extern am_ad_src_entry_t am_src1; /* sample rate conversion routine #1 */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC1_H */
diff --git a/usr/src/uts/common/sys/audio/am_src2.h b/usr/src/uts/common/sys/audio/am_src2.h
deleted file mode 100644
index 7c11d904c9..0000000000
--- a/usr/src/uts/common/sys/audio/am_src2.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the public interfaces for the alternative
- * audio mixer sample rate converter.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AM_SRC2_H
-#define _SYS_AM_SRC2_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AM_SRC2_MOD_NAME "Audio Sample Rate Conv. #2"
-
-#ifdef _KERNEL
-
-extern am_ad_src_entry_t am_src2; /* sample rate conversion routine #2 */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_H */
diff --git a/usr/src/uts/common/sys/audio/audio810.h b/usr/src/uts/common/sys/audio/audio810.h
deleted file mode 100644
index 9af6f9c382..0000000000
--- a/usr/src/uts/common/sys/audio/audio810.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO810_H_
-#define _SYS_AUDIO810_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audio810 device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define I810_DEV_NAME "SUNW,audio810"
-#define I810_DEV_CONFIG "onboard1"
-#define I810_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define I810_NAME "audio810"
-#define I810_MOD_NAME "mixer audio driver"
-
-#define I810_SAMPR5510 (5510)
-#define I810_SAMPR6620 (6620)
-#define I810_SAMPR8000 (8000)
-#define I810_SAMPR9600 (9600)
-#define I810_SAMPR11025 (11025)
-#define I810_SAMPR16000 (16000)
-#define I810_SAMPR18900 (18900)
-#define I810_SAMPR22050 (22050)
-#define I810_SAMPR27420 (27420)
-#define I810_SAMPR32000 (32000)
-#define I810_SAMPR33075 (33075)
-#define I810_SAMPR37800 (37800)
-#define I810_SAMPR44100 (44100)
-#define I810_SAMPR48000 (48000)
-
-#define I810_DEFAULT_SR I810_SAMPR8000
-#define I810_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define I810_DEFAULT_PREC AUDIO_PRECISION_8
-#define I810_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define I810_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define I810_DEFAULT_RGAIN (127)
-#define I810_DEFAULT_MONITOR_GAIN (0)
-#define I810_DEFAULT_BAL AUDIO_MID_BALANCE
-#define I810_INTS (175) /* default interrupt rate */
-#define I810_MIN_INTS (24) /* minimum interrupt rate */
-#define I810_MAX_INTS (5000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO810_H_ */
diff --git a/usr/src/uts/common/sys/audio/audio_apm.h b/usr/src/uts/common/sys/audio/audio_apm.h
deleted file mode 100644
index bf79a12b40..0000000000
--- a/usr/src/uts/common/sys/audio/audio_apm.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2003 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the audio support module's public interfaces
- * that may be used by audio personality modules. Audio drivers must NOT
- * include this header file.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_APM_H
-#define _SYS_AUDIO_APM_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-/*
- * Miscellaneous defines.
- */
-#define AUDIO_NUM_DEVS 10 /* /dev/audio, /dev/audioctl, etc. */
-#define AUDIO_MINOR_PER_INST 128 /* max # of channels to each instance */
-#define AUDIO_MIN_CLONE_CHS 1 /* minimum number of clone channels */
-#define AUDIO_CLONE_CHANLIM (AUDIO_MINOR_PER_INST - AUDIO_NUM_DEVS)
- /* max # of clones to each instance */
-
-#define AUDIO_MINOR_TO_INST(d) (getminor(d) >> 7)
-
-#define AUDIO_TASKQ_SUSPENDED 0
-#define AUDIO_TASKQ_RUNNING (~AUDIO_TASKQ_SUSPENDED)
-
-/*
- * audio_data_t - struct used to store original and processed audio data
- */
-struct audio_data {
- void *adata_orig; /* the original data */
- void *adata_optr; /* marker into the orig. data */
- void *adata_oeptr; /* end of the original data */
- size_t adata_osize; /* size of the original data */
- void *adata_proc; /* the processed data */
- void *adata_pptr; /* marker into the proc. data */
- void *adata_peptr; /* ptr to end of proc. data */
- size_t adata_psize; /* size of the processed data */
- struct audio_data *adata_next; /* pointer to the next struct */
-};
-typedef struct audio_data audio_data_t;
-
-/*
- * The members of the audio_data structure, except adata_next, are protected
- * by scheme because audio_sup_get_audio_data() removes one of these structures
- * from the list and only that thread has access to the data structure.
- */
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_orig))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_optr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_oeptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_osize))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_proc))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_pptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_peptr))
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_data::adata_psize))
-
-/*
- * audio_ch_t - per channel state and operation data
- */
-struct audio_ch {
- queue_t *ch_qptr; /* channel queue pointer */
- struct audio_state *ch_statep; /* channel instance state ptr */
- kmutex_t ch_lock; /* channel lock */
- kcondvar_t ch_cv; /* available for use by ch */
- struct audio_apm_info *ch_apm_infop; /* pointer to ch APM info */
- int (*ch_wput)(queue_t *, mblk_t *);
- /* APM's write put rtn */
- int (*ch_wsvc)(queue_t *);
- /* APM's write svc rtn */
- int (*ch_rput)(queue_t *, mblk_t *);
- /* APM's read put routine */
- int (*ch_rsvc)(queue_t *);
- /* APM's read svc routine */
- int ch_dir; /* I/O direction */
- uint_t ch_flags; /* channel state flags */
- dev_t ch_dev; /* channel device number */
- void *ch_private; /* channel private data */
- audio_channel_t ch_info; /* channel state info */
- audio_device_t *ch_dev_info; /* Audio Driver device info */
- kmutex_t ch_adata_lock; /* audio data list lock */
- audio_data_t *ch_adata; /* audio data structure list */
- audio_data_t *ch_adata_end; /* end of audio data list */
- int ch_adata_cnt; /* # of queued data structs */
-};
-typedef struct audio_ch audio_ch_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_lock, audio_ch))
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata_cnt))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_ch::ch_adata_end))
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_adata_lock, audio_data::adata_next))
-
-/*
- * Further analysis is needed for these structure members. We are
- * deferring this analysis until later.
- */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_qptr))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_statep))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_apm_infop))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_wput))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_wsvc))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_rput))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_rsvc))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dir))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_private))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_info))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dev_info))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_ch::ch_dev))
-
-/* audio_ch.ch_flags defines */
-#define AUDIO_CHNL_ALLOCATED 0x0001u /* the channel is allocated */
-#define AUDIO_CHNL_ACTIVE 0x0002u /* the channel is active */
-
-/*
- * audio_state_t - per instance state and operation data
- */
-struct audio_state {
- kmutex_t as_lock; /* instance state lock */
- kcondvar_t as_cv; /* cv for blocked ch alloc */
- int as_max_chs; /* max # of open channels */
- int as_minors_per_inst; /* #minors per instance */
- int as_audio_reserved; /* #audio devices */
- dev_info_t *as_dip; /* known at attach time */
- int as_dev_instance; /* Audio Driver dev inst. # */
- major_t as_major; /* Audio Driver major number */
- uint_t as_ch_inuse; /* # of channels in use */
- struct audio_apm_info *as_apm_info_list; /* APM info list */
- void *as_private; /* private audio driver data */
- void *as_persistp; /* persistent data */
- audio_ch_t as_channels[AUDIO_CLONE_CHANLIM]; /* channels */
-};
-typedef struct audio_state audio_state_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, audio_state))
-
-/* these audio_state structure members are read only once set */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_max_chs))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_dip))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_dev_instance))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_max_chs))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_audio_reserved))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_state::as_minors_per_inst))
-
-/*
- * Further analysis is needed for this structure member. We are
- * deferring this analysis until later.
- */
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_state::as_private))
-
-/*
- * audio_apm_info_t - audio personality module state information
- */
-struct audio_apm_info {
- kmutex_t apm_lock; /* APM structure state lock */
- int (*apm_open)(queue_t *, dev_t *,
- int, int, cred_t *);
- /* APM open() routine */
- int (*apm_close)(queue_t *, int, cred_t *);
- /* APM close() routine */
- int (*apm_restore_state)(audio_state_t *,
- struct audio_apm_info *, int);
- /* APM state retsore routine */
- int (*apm_save_state)(audio_state_t *,
- struct audio_apm_info *, int);
- /* APM state save routine */
- audio_device_t *apm_info; /* audio_device_t structure */
- audio_device_type_e apm_type; /* the device type */
- void *apm_private; /* private APM data */
- void *apm_ad_infop; /* device capabilities */
- void *apm_ad_state; /* state of the device */
- struct audio_apm_info *apm_next; /* pointer to the next struct */
-};
-typedef struct audio_apm_info audio_apm_info_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock, audio_apm_info))
-/* these audio_apm_info structure members are read only once set */
-_NOTE(DATA_READABLE_WITHOUT_LOCK(
- audio_apm_info::apm_private audio_apm_info::apm_type
- audio_apm_info::apm_close audio_apm_info::apm_open
- audio_apm_info::apm_restore_state audio_apm_info::apm_save_state
- audio_apm_info::apm_info audio_apm_info::apm_ad_infop
- audio_apm_info::apm_ad_state))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(audio_apm_info::apm_next))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, audio_apm_info::apm_next))
-
-/*
- * audio_apm_reg - This structure holds all of the data needed to
- * register an Audio Personality Module for use.
- */
-struct audio_apm_reg {
- int aar_version; /* structure version */
- int (*aar_apm_open)
- (queue_t *q, dev_t *devp, int flag, int sflags,
- cred_t *credp);
- /* APM open() routine */
- int (*aar_apm_close)(queue_t *q, int flag, cred_t *credp);
- /* APM close() routine */
- int (*aar_apm_save_state)(audio_state_t *statep,
- audio_apm_info_t *, int);
- /* APM save routine */
- int (*aar_apm_restore_state)(audio_state_t *statep,
- audio_apm_info_t *, int dir);
- /* APM restore routine */
- void *aar_private; /* APM private data */
- void *aar_info; /* APM info structure */
- void *aar_state; /* APM state structure */
- audio_device_t *aar_dev_info; /* APM device info pointer */
-};
-typedef struct audio_apm_reg audio_apm_reg_t;
-#define AM_AAR_VERSION AM_AAR_VERS1
-#define AM_AAR_VERS1 1 /* supported register version */
-
-/*
- * Macros used to convert between audio handles and the state structure.
- */
-#define AUDIO_HDL2STATE(hdl) ((audio_state_t *)(hdl))
-#define AUDIO_STATE2HDL(statep) ((audiohdl_t)(statep))
-
-/*
- * Audio Support Module Channel Routines
- */
-audio_ch_t *audio_sup_alloc_ch(audio_state_t *statep, int *error,
- audio_device_type_e type, int oflag);
-int audio_sup_free_ch(audio_ch_t *chptr);
-
-/*
- * Audio Support Module State Routines
- */
-audio_state_t *audio_sup_devt_to_state(dev_t dev);
-audio_state_t *audio_sup_devinfo_to_state(dev_info_t *dip);
-
-/*
- * Audio Support Module Persistent Memory Routines
- */
-void *audio_sup_get_persist_state(audio_state_t *state,
- audio_device_type_e dev_type);
-int audio_sup_free_persist_state(audio_state_t *state,
- audio_device_type_e dev_type);
-int audio_sup_set_persist_state(audio_state_t *state,
- audio_device_type_e dev_type, void *state_data, size_t state_size);
-
-/*
- * Audio Support Module Minor Routines
- */
-int audio_sup_ch_to_minor(audio_state_t *statep, int channel);
-int audio_sup_minor_to_ch(audio_state_t *statep, minor_t minor);
-int audio_sup_type_to_minor(audio_device_type_e type);
-
-/*
- * Audio Support Module Audio Data Routines
- */
-void audio_sup_flush_audio_data(audio_ch_t *chptr);
-void audio_sup_free_audio_data(audio_data_t *adata);
-audio_data_t *audio_sup_get_audio_data(audio_ch_t *chptr);
-int audio_sup_get_audio_data_cnt(audio_ch_t *chptr);
-int audio_sup_get_audio_data_size(audio_ch_t *chptr);
-void audio_sup_putback_audio_data(audio_ch_t *chptr, audio_data_t *adata);
-int audio_sup_save_audio_data(audio_ch_t *chptr, void *adata_orig,
- size_t adata_osize, void *adata_proc, size_t adata_psize);
-
-/*
- * Audio Support Module Registration Routines
- */
-audio_apm_info_t *audio_sup_register_apm(audio_state_t *statep,
- audio_device_type_e type, audio_apm_reg_t *reg_info);
-int audio_sup_unregister_apm(audio_state_t *statep, audio_device_type_e type);
-
-/*
- * Audio Support Module Task Queue Routines
- */
-audio_taskq_t audio_sup_taskq_create(const char *q_name);
-void audio_sup_taskq_destroy(audio_taskq_t tq_handle);
-int audio_sup_taskq_dispatch(audio_taskq_t tq_handle,
- void (*task_function)(void *arg), void *arg, int sleep);
-void audio_sup_taskq_resume(audio_taskq_t tq_handle);
-void audio_sup_taskq_suspend(audio_taskq_t tq_handle);
-int audio_sup_taskq_suspended(audio_taskq_t tq_handle);
-void audio_sup_taskq_wait(audio_taskq_t tq_handle);
-
-/*
- * Audio Support Module Miscellaneous Routines
- */
-audio_device_type_e audio_sup_devt_to_ch_type(audio_state_t *statep,
- dev_t dev);
-int audio_sup_get_channel_number(queue_t *q);
-audio_apm_info_t *audio_sup_get_apm_info(audio_state_t *statep,
- audio_device_type_e);
-void *audio_sup_get_info(queue_t *q);
-int audio_sup_mblk_alloc(mblk_t *mp, size_t size);
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_APM_H */
diff --git a/usr/src/uts/common/sys/audio/audio_common.h b/usr/src/uts/common/sys/audio/audio_common.h
new file mode 100644
index 0000000000..296880b6f7
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_common.h
@@ -0,0 +1,304 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AUDIO_AUDIO_COMMON_H
+#define _SYS_AUDIO_AUDIO_COMMON_H
+
+#include <sys/mkdev.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+/* Shared data structures */
+typedef struct audio_parms audio_parms_t;
+typedef struct audio_buffer audio_buffer_t;
+typedef struct audio_stream audio_stream_t;
+typedef struct audio_engine audio_engine_t;
+typedef struct audio_client audio_client_t;
+typedef struct audio_dev audio_dev_t;
+typedef struct audio_mixer_ops audio_mixer_ops_t;
+typedef struct audio_engine_ops audio_engine_ops_t;
+typedef struct audio_ctrl audio_ctrl_t;
+typedef struct audio_ctrl_desc audio_ctrl_desc_t;
+
+struct audio_ctrl_desc {
+ const char *acd_name; /* Controls Mnemonic */
+ uint32_t acd_type; /* Entry type */
+ uint64_t acd_flags; /* Characteristics */
+ /*
+ * Minimum and Maximum values for this control. The value
+ * must be between these values inclusive. For
+ * AUDIO_CTRL_TYPE_ENUM, the maxvalue is a bitmask of
+ * supported controls.
+ */
+ uint64_t acd_maxvalue; /* max value control */
+ uint64_t acd_minvalue; /* min value control */
+ /*
+ * Array of pointers to names for each enum position. This
+ * should be null for all but AUDIO_CTRL_TYPE_ENUM.
+ */
+ const char *acd_enum[64];
+};
+
+/*
+ * Audio data formats. Note that these are represented int a bit
+ * field, to allow for multiple values to be represented in the same
+ * integer (in certain portions of the API.)
+ */
+#define AUDIO_FORMAT_NONE 0x00000000U
+#define AUDIO_FORMAT_ULAW 0x00000001U
+#define AUDIO_FORMAT_ALAW 0x00000002U
+#define AUDIO_FORMAT_S8 0x00000004U
+#define AUDIO_FORMAT_U8 0x00000008U
+#define AUDIO_FORMAT_S16_LE 0x00000010U
+#define AUDIO_FORMAT_S16_BE 0x00000020U
+#define AUDIO_FORMAT_U16_LE 0x00000040U
+#define AUDIO_FORMAT_U16_BE 0x00000080U
+#define AUDIO_FORMAT_S24_LE 0x00000100U
+#define AUDIO_FORMAT_S24_BE 0x00000200U
+#define AUDIO_FORMAT_S32_LE 0x00000400U
+#define AUDIO_FORMAT_S32_BE 0x00000800U
+#define AUDIO_FORMAT_S24_PACKED 0x00001000U
+#define AUDIO_FORMAT_AC3 0x00010000U
+#define AUDIO_FORMAT_OPAQUE_MASK 0xffff0000U
+#define AUDIO_FORMAT_CONVERTIBLE 0x0000ffffU
+/*
+ * We only support signed 16, 24, and 32 bit format conversions in the
+ * engines, for simplicity. (We haven't run into any engines that
+ * require other formats.)
+ */
+#define AUDIO_FORMAT_PCM 0x00000f30
+
+/*
+ * Some big endian/little endian handling macros (native endian and opposite
+ * endian formats). The usage of these macros is described in the OSS
+ * Programmer's Manual.
+ */
+
+#if defined(_BIG_ENDIAN)
+
+#define AUDIO_FORMAT_S16_NE AUDIO_FORMAT_S16_BE
+#define AUDIO_FORMAT_U16_NE AUDIO_FORMAT_U16_BE
+#define AUDIO_FORMAT_S32_NE AUDIO_FORMAT_S32_BE
+#define AUDIO_FORMAT_S24_NE AUDIO_FORMAT_S24_BE
+#define AUDIO_FORMAT_S16_OE AUDIO_FORMAT_S16_LE
+#define AUDIO_FORMAT_U16_OE AUDIO_FORMAT_U16_LE
+#define AUDIO_FORMAT_S32_OE AUDIO_FORMAT_S32_LE
+#define AUDIO_FORMAT_S24_OE AUDIO_FORMAT_S24_LE
+
+#elif defined(_LITTLE_ENDIAN)
+#define AUDIO_FORMAT_S16_NE AUDIO_FORMAT_S16_LE
+#define AUDIO_FORMAT_U16_NE AUDIO_FORMAT_U16_LE
+#define AUDIO_FORMAT_S32_NE AUDIO_FORMAT_S32_LE
+#define AUDIO_FORMAT_S24_NE AUDIO_FORMAT_S24_LE
+#define AUDIO_FORMAT_S16_OE AUDIO_FORMAT_S16_BE
+#define AUDIO_FORMAT_U16_OE AUDIO_FORMAT_U16_BE
+#define AUDIO_FORMAT_S32_OE AUDIO_FORMAT_S32_BE
+#define AUDIO_FORMAT_S24_OE AUDIO_FORMAT_S24_BE
+
+#else
+#error "Machine endianness undefined"
+#endif
+
+/*
+ * These are parameterized around the maximum minor number available
+ * for use in the filesystem. Unfortunately, we have to use 32-bit limits,
+ * because we could have 32-bit userland apps (we usually will, in fact).
+ */
+#define AUDIO_MN_CLONE_NBITS (NBITSMINOR32 - 1)
+#define AUDIO_MN_CLONE_MASK (1U << (AUDIO_MN_CLONE_NBITS - 1))
+#define AUDIO_MN_TYPE_NBITS (4)
+#define AUDIO_MN_TYPE_SHIFT (0)
+#define AUDIO_MN_TYPE_MASK ((1U << AUDIO_MN_TYPE_NBITS) - 1)
+#define AUDIO_MN_INST_NBITS ((NBITSMINOR32 - 1) - AUDIO_MN_TYPE_NBITS)
+#define AUDIO_MN_INST_MASK ((1U << AUDIO_MN_INST_NBITS) - 1)
+#define AUDIO_MN_INST_SHIFT (AUDIO_MN_TYPE_NBITS)
+#define AUDIO_MKMN(inst, typ) \
+ (((inst) << AUDIO_MN_INST_SHIFT) | ((typ) << AUDIO_MN_TYPE_SHIFT))
+
+#define AUDIO_MINOR_MIXER (0)
+#define AUDIO_MINOR_DSP (1)
+/* 2 is reserved for now */
+#define AUDIO_MINOR_DEVAUDIO (3)
+#define AUDIO_MINOR_DEVAUDIOCTL (4)
+#define AUDIO_MINOR_SNDSTAT (AUDIO_MN_TYPE_MASK)
+
+/* reserved minors for driver specific use */
+#define AUDIO_MINOR_DRV1 (AUDIO_MINOR_SNDSTAT - 1)
+#define AUDIO_MINOR_DRV2 (AUDIO_MINOR_SNDSTAT - 2)
+
+
+/* Various controls */
+#define AUDIO_CTRL_ID_VOLUME "volume"
+#define AUDIO_CTRL_ID_LINEOUT "line-out"
+#define AUDIO_CTRL_ID_FRONT "front"
+#define AUDIO_CTRL_ID_REAR "rear"
+#define AUDIO_CTRL_ID_HEADPHONE "headphones"
+#define AUDIO_CTRL_ID_CENTER "center"
+#define AUDIO_CTRL_ID_LFE "lfe"
+#define AUDIO_CTRL_ID_SURROUND "surround"
+#define AUDIO_CTRL_ID_SPEAKER "speaker"
+#define AUDIO_CTRL_ID_AUX1OUT "aux1-out"
+#define AUDIO_CTRL_ID_AUX2OUT "aux2-out"
+#define AUDIO_CTRL_ID_BASS "bass"
+#define AUDIO_CTRL_ID_TREBLE "treble"
+#define AUDIO_CTRL_ID_3DDEPTH "3d-depth"
+#define AUDIO_CTRL_ID_3DCENT "3d-center"
+#define AUDIO_CTRL_ID_3DENHANCE "3d-enhance"
+#define AUDIO_CTRL_ID_PHONE "phone"
+#define AUDIO_CTRL_ID_MIC "mic"
+#define AUDIO_CTRL_ID_LINEIN "line-in"
+#define AUDIO_CTRL_ID_CD "cd"
+#define AUDIO_CTRL_ID_VIDEO "video"
+#define AUDIO_CTRL_ID_AUX1IN "aux1-in"
+#define AUDIO_CTRL_ID_PCMIN "pcm"
+#define AUDIO_CTRL_ID_RECGAIN "record-gain"
+#define AUDIO_CTRL_ID_AUX2IN "aux2-in"
+#define AUDIO_CTRL_ID_MICBOOST "micboost"
+#define AUDIO_CTRL_ID_LOOPBACK "loopback"
+#define AUDIO_CTRL_ID_LOUDNESS "loudness"
+#define AUDIO_CTRL_ID_OUTPUTS "outputs"
+#define AUDIO_CTRL_ID_INPUTS "inputs"
+#define AUDIO_CTRL_ID_RECSRC "record-source"
+#define AUDIO_CTRL_ID_MONSRC "monitor-source"
+#define AUDIO_CTRL_ID_DIAG "diag"
+#define AUDIO_CTRL_ID_BEEP "beep"
+#define AUDIO_CTRL_ID_MONGAIN "monitor-gain"
+#define AUDIO_CTRL_ID_STEREOSIM "stereo-simulate" /* AC'97 feature */
+#define AUDIO_CTRL_ID_MICGAIN "mic-gain" /* mono mic gain */
+#define AUDIO_CTRL_ID_SPKSRC "speaker-source" /* AC'97 feature */
+#define AUDIO_CTRL_ID_MICSRC "mic-source" /* AC'97 feature */
+#define AUDIO_CTRL_ID_JACK1 "jack1" /* jack repurposing */
+#define AUDIO_CTRL_ID_JACK2 "jack2"
+#define AUDIO_CTRL_ID_JACK3 "jack3"
+#define AUDIO_CTRL_ID_JACK4 "jack4"
+#define AUDIO_CTRL_ID_JACK5 "jack5"
+#define AUDIO_CTRL_ID_JACK6 "jack6"
+#define AUDIO_CTRL_ID_JACK7 "jack7"
+#define AUDIO_CTRL_ID_DOWNMIX "downmix"
+#define AUDIO_CTRL_ID_SPREAD "spread"
+
+/*
+ * Names for ports.
+ */
+#define AUDIO_PORT_MIC "mic"
+#define AUDIO_PORT_CD "cd"
+#define AUDIO_PORT_VIDEO "video"
+#define AUDIO_PORT_AUX1OUT "aux1-out"
+#define AUDIO_PORT_AUX2OUT "aux2-out"
+#define AUDIO_PORT_LINEOUT "line-out"
+#define AUDIO_PORT_STEREOMIX "stereo-mix"
+#define AUDIO_PORT_MONOMIX "mono-mix"
+#define AUDIO_PORT_PHONE "phone"
+#define AUDIO_PORT_REAR "rear"
+#define AUDIO_PORT_CENTER "center"
+#define AUDIO_PORT_SURROUND "surround"
+#define AUDIO_PORT_LFE "lfe"
+#define AUDIO_PORT_SPEAKER "speaker"
+#define AUDIO_PORT_LINEIN "line-in"
+#define AUDIO_PORT_AUX1IN "aux1-in"
+#define AUDIO_PORT_AUX2IN "aux2-in"
+#define AUDIO_PORT_HEADPHONES "headphones"
+#define AUDIO_PORT_SPDIFIN "spdif-in"
+#define AUDIO_PORT_SPDIFOUT "spdif-out"
+#define AUDIO_PORT_CENLFE "center/lfe" /* combined jack use */
+#define AUDIO_PORT_MIC1 "mic1"
+#define AUDIO_PORT_MIC2 "mic2"
+#define AUDIO_PORT_DIGOUT "digital-out"
+#define AUDIO_PORT_DIGIN "digital-in"
+#define AUDIO_PORT_HDMI "hdmi"
+#define AUDIO_PORT_MODEM "modem"
+#define AUDIO_PORT_HANDSET "handset"
+#define AUDIO_PORT_OTHER "other"
+#define AUDIO_PORT_STEREO "stereo" /* e.g. mic array */
+#define AUDIO_PORT_NONE "none"
+
+/*
+ * A few common values that sometimes we see.
+ */
+#define AUDIO_VALUE_ON "on"
+#define AUDIO_VALUE_OFF "off"
+#define AUDIO_VALUE_VERYLOW "very-low"
+#define AUDIO_VALUE_LOW "low"
+#define AUDIO_VALUE_MEDIUM "medium"
+#define AUDIO_VALUE_HIGH "high"
+#define AUDIO_VALUE_VERYHIGH "very-high"
+
+/*
+ * Posible return values for walk callback function
+ */
+#define AUDIO_WALK_CONTINUE 1 /* continue walk */
+#define AUDIO_WALK_STOP 2 /* stop the walk */
+#define AUDIO_WALK_RESTART 3 /* restart the walk from beginning */
+
+/*
+ * Control types
+ */
+#define AUDIO_CTRL_TYPE_BOOLEAN 1 /* ON/OFF control */
+#define AUDIO_CTRL_TYPE_ENUM 2 /* Enumerated list */
+#define AUDIO_CTRL_TYPE_STEREO 3 /* stereo level control */
+#define AUDIO_CTRL_TYPE_MONO 4 /* mono level control */
+#define AUDIO_CTRL_TYPE_METER 5 /* VU meter */
+
+/*
+ * Control characteristics flags
+ */
+#define AUDIO_CTRL_FLAG_READABLE 0x00000001 /* Control readable */
+#define AUDIO_CTRL_FLAG_WRITEABLE 0x00000002 /* Control writable */
+#define AUDIO_CTRL_FLAG_RW 0x00000003 /* Read/writeable */
+#define AUDIO_CTRL_FLAG_VUPEAK 0x00000004 /* peak meter */
+#define AUDIO_CTRL_FLAG_CENTIBEL 0x00000008 /* Centibel (0.1 dB) */
+#define AUDIO_CTRL_FLAG_DECIBEL 0x00000010 /* Step size of 1 dB */
+#define AUDIO_CTRL_FLAG_POLL 0x00000020 /* May change itself */
+#define AUDIO_CTRL_FLAG_MAINVOL 0x00000100 /* Main volume ctrl */
+#define AUDIO_CTRL_FLAG_PCMVOL 0x00000200 /* PCM output volume */
+#define AUDIO_CTRL_FLAG_RECVOL 0x00000400 /* PCM record volume */
+#define AUDIO_CTRL_FLAG_MONVOL 0x00000800 /* Monitor volume */
+#define AUDIO_CTRL_FLAG_PLAY 0x00001000 /* Playback control */
+#define AUDIO_CTRL_FLAG_REC 0x00002000 /* Record control */
+#define AUDIO_CTRL_FLAG_3D 0x00004000 /* 3D effect control */
+#define AUDIO_CTRL_FLAG_TONE 0x00008000 /* Tone control */
+#define AUDIO_CTRL_FLAG_MONITOR 0x00010000 /* Monitor control */
+#define AUDIO_CTRL_FLAG_DIGITAL 0x00020000 /* Digital control */
+
+/*
+ * AUDIO_CTRL_TYPE_ENUM might allow more than a single value to be
+ * selected. (Value is a bitmask.)
+ */
+#define AUDIO_CTRL_FLAG_MULTI 0x00000040
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_AUDIO_COMMON_H */
diff --git a/usr/src/uts/common/sys/audio/audio_driver.h b/usr/src/uts/common/sys/audio/audio_driver.h
new file mode 100644
index 0000000000..256698c1fe
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_driver.h
@@ -0,0 +1,241 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_AUDIO_AUDIO_DRIVER_H
+#define _SYS_AUDIO_AUDIO_DRIVER_H
+
+#include <sys/types.h>
+#include <sys/list.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/audio/audio_common.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+struct audio_engine_ops {
+ int audio_engine_version;
+#define AUDIO_ENGINE_VERSION 0
+
+ /*
+ * Initialize engine, including buffer allocation. Arguments
+ * that are pointers are hints. On return, they are updated with
+ * the actual values configured by the driver.
+ */
+ int (*audio_engine_open)(void *, int flags,
+ unsigned *fragfr, unsigned *nfrags, caddr_t *buf);
+ void (*audio_engine_close)(void *);
+
+ /*
+ * Start and stop are used to actually get the hardware running
+ * or stop the hardware. Until this is kicked off, the engine
+ * will not actually transfer data. These are not destructive to
+ * ring positions, etc. (Think of it like pause/play).
+ */
+ int (*audio_engine_start)(void *);
+ void (*audio_engine_stop)(void *);
+
+ /*
+ * Obtain the engine offset. Offsets start at zero at engine_open,
+ * and keep counting upwards. Count is returned in frames.
+ */
+ uint64_t (*audio_engine_count)(void *);
+
+ /*
+ * The following entry points return the currently configured
+ * status of the engine. It is assumed that the engine's
+ * configuration is relatively fixed, and does not change
+ * while open, or in response to open.
+ *
+ * However, in the future we might like to allow for the
+ * device to change the settings while it is not open, which
+ * could allow for mixerctl to change the configured channels,
+ * for example. In order to synchronize this properly, we'll
+ * need the engine to perform a notification/request. That
+ * will be added later.
+ *
+ * AC3: We will have to figure out how to support dynamically
+ * selecting different sampling frequencies for AC3, since
+ * it needs to be able to support 32, 44.1, and 48 kHz.
+ * Perhaps special flags used during open() would do the trick.
+ */
+ int (*audio_engine_format)(void *);
+ int (*audio_engine_channels)(void *);
+ int (*audio_engine_rate)(void *);
+
+ /*
+ * DMA cache synchronization. The framework does this on
+ * behalf of the driver for both input and output. The driver
+ * is responsible for tracking the direction (based on the
+ * flags passed to ae_open()), and dealing with any partial
+ * synchronization if any is needed.
+ */
+ void (*audio_engine_sync)(void *, unsigned);
+
+ /*
+ * The framework may like to know how deep the device queues data.
+ * This can be used to provide a more accurate latency calculation.
+ */
+ size_t (*audio_engine_qlen)(void *);
+
+ /*
+ * If the driver doesn't use simple interleaving, then we need to
+ * know more about the offsets of channels within the buffer.
+ * We obtain both the starting offset within the buffer, and the
+ * increment for each new sample. As usual, these are given in
+ * samples. If this entry point is NULL, the framework assumes
+ * that simple interlevaing is used instead.
+ */
+ void (*audio_engine_chinfo)(void *, int chan, unsigned *offset,
+ unsigned *incr);
+};
+
+void audio_init_ops(struct dev_ops *, const char *);
+void audio_fini_ops(struct dev_ops *);
+
+audio_dev_t *audio_dev_alloc(dev_info_t *, int);
+void audio_dev_free(audio_dev_t *);
+
+void audio_dev_set_description(audio_dev_t *, const char *);
+void audio_dev_set_version(audio_dev_t *, const char *);
+void audio_dev_add_info(audio_dev_t *, const char *);
+
+audio_engine_t *audio_engine_alloc(audio_engine_ops_t *, unsigned);
+void audio_engine_set_private(audio_engine_t *, void *);
+void *audio_engine_get_private(audio_engine_t *);
+void audio_engine_free(audio_engine_t *);
+
+void audio_dev_add_engine(audio_dev_t *, audio_engine_t *);
+void audio_dev_remove_engine(audio_dev_t *, audio_engine_t *);
+int audio_dev_register(audio_dev_t *);
+int audio_dev_unregister(audio_dev_t *);
+void audio_dev_warn(audio_dev_t *, const char *, ...);
+/* DEBUG ONLY */
+void audio_dump_bytes(const uint8_t *w, int dcount);
+void audio_dump_words(const uint16_t *w, int dcount);
+void audio_dump_dwords(const uint32_t *w, int dcount);
+
+/*
+ * Drivers call these.
+ */
+void audio_engine_consume(audio_engine_t *);
+void audio_engine_produce(audio_engine_t *);
+void audio_engine_reset(audio_engine_t *);
+
+/* Engine flags */
+#define ENGINE_OUTPUT_CAP (1U << 2)
+#define ENGINE_INPUT_CAP (1U << 3)
+#define ENGINE_CAPS (ENGINE_OUTPUT_CAP | ENGINE_INPUT_CAP)
+#define ENGINE_DRIVER_FLAGS (0xffff) /* flags usable by driver */
+
+#define ENGINE_OUTPUT (1U << 16) /* fields not for driver use */
+#define ENGINE_INPUT (1U << 17)
+#define ENGINE_OPEN (1U << 18)
+#define ENGINE_RUNNING (1U << 19)
+#define ENGINE_EXCLUSIVE (1U << 20) /* exclusive use, e.g. AC3 */
+#define ENGINE_NDELAY (1U << 21) /* non-blocking open */
+#define ENGINE_WAKE (1U << 22) /* wakeup tq running */
+
+/*
+ * entry points used by legacy SADA drivers
+ */
+int audio_legacy_open(queue_t *, dev_t *, int, int, cred_t *);
+int audio_legacy_close(queue_t *, int, cred_t *);
+int audio_legacy_wput(queue_t *, mblk_t *);
+int audio_legacy_wsrv(queue_t *);
+
+
+
+/*
+ * Audio device controls
+ */
+
+/*
+ * Control read or write driver function type.
+ *
+ * Returns zero on success, errno on failure.
+ */
+typedef int (*audio_ctrl_wr_t)(void *, uint64_t);
+typedef int (*audio_ctrl_rd_t)(void *, uint64_t *);
+
+
+/*
+ * This will allocate and register a control for my audio device.
+ *
+ * On success this will return a control structure else NULL.
+ */
+audio_ctrl_t *audio_dev_add_control(audio_dev_t *,
+ audio_ctrl_desc_t *, audio_ctrl_rd_t, audio_ctrl_wr_t, void *);
+
+/*
+ * Add a synthetic PCM volume control. This should only be used by
+ * devices which have no physical PCM volume controls. The control
+ * implements a simple attenuator on the PCM data; unlike AC'97 there
+ * is no "gain", so using this instead of a hardware control may
+ * result in loss range. The control is implemented using
+ * AUDIO_CTRL_ID_VOLUME.
+ */
+int audio_dev_add_soft_volume(audio_dev_t *);
+
+/*
+ * This will remove a control from an audio device.
+ */
+void audio_dev_del_control(audio_ctrl_t *);
+
+/*
+ * This will tell the framework that controls have changed
+ * and it should update its values.
+ */
+void audio_dev_update_controls(audio_dev_t *);
+
+/*
+ * This is used to read the current value of a control.
+ * Note, this will cause a callback into the driver to get the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int audio_control_read(audio_ctrl_t *, uint64_t *);
+
+/*
+ * This is used to write a value to a control.
+ * Note, this will cause a callback into the driver to write the value.
+ *
+ * On return zero is returned on success else errno is returned.
+ */
+int audio_control_write(audio_ctrl_t *, uint64_t);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_AUDIO_DRIVER_H */
diff --git a/usr/src/uts/common/sys/audio/audio_mixer.h b/usr/src/uts/common/sys/audio/audio_mixer.h
index 4e6571dba8..4f84acb44f 100644
--- a/usr/src/uts/common/sys/audio/audio_mixer.h
+++ b/usr/src/uts/common/sys/audio/audio_mixer.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,8 +19,8 @@
* CDDL HEADER END
*/
/*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
*
* This header file defines the public interfaces for the audio mixer
* audio personality module.
@@ -34,8 +33,6 @@
#ifndef _SYS_AUDIO_MIXER_H
#define _SYS_AUDIO_MIXER_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -45,17 +42,16 @@ extern "C" {
/*
* Miscellaneous defines
*/
-#define AM_MAX_QUEUED_MSGS_SIZE (49000*2*4) /* ~1 secs of audio */
-#define AM_MIN_QUEUED_MSGS_SIZE (24500*2*4) /* ~0.5 secs of audio */
+struct am_ad_sample_rates {
+ uint_t *ad_srs; /* NULL term. list of sample rates */
+};
+typedef struct am_ad_sample_rates am_ad_sample_rates_t;
/*
* am_ad_ch_cap_t - Audio Driver play/record capabilities
*/
struct am_ad_ch_cap {
am_ad_sample_rates_t ad_mixer_srs; /* mixer mode sample rates */
- am_ad_sample_rates_t ad_compat_srs; /* compat mode sample rates */
- am_ad_src_entry_t *ad_conv; /* sample rate conv. routines */
- void *ad_sr_info; /* sample rate conv. info */
uint_t *ad_chs; /* list of channel types */
int ad_int_rate; /* interrupt rate */
int ad_max_chs; /* max channels */
@@ -76,50 +72,31 @@ typedef struct am_ad_cap_comb am_ad_cap_comb_t;
* am_ad_entry_t - Audio Driver ops vector definition
*/
struct am_ad_entry {
- int (*ad_setup)(audiohdl_t handle, int stream, int flags);
- void (*ad_teardown)(audiohdl_t handle, int stream, int dir);
- int (*ad_set_config)(audiohdl_t handle, int stream,
+ int (*ad_setup)(audiohdl_t handle, int flags);
+ void (*ad_teardown)(audiohdl_t handle, int dir);
+ int (*ad_set_config)(audiohdl_t handle,
int command, int dir, int arg1, int arg2);
- int (*ad_set_format)(audiohdl_t handle, int stream,
+ int (*ad_set_format)(audiohdl_t handle,
int dir, int sample_rate, int channels,
int precision, int encoding);
- int (*ad_start_play)(audiohdl_t handle, int stream);
- void (*ad_pause_play)(audiohdl_t handle, int stream);
- void (*ad_stop_play)(audiohdl_t handle, int stream);
- int (*ad_start_record)(audiohdl_t handle, int stream);
- void (*ad_stop_record)(audiohdl_t handle, int stream);
- int (*ad_ioctl)(audiohdl_t handle, int channel,
- queue_t *q, mblk_t *mp, int *error);
- int (*ad_iocdata)(audiohdl_t handle, int channel,
- queue_t *q, mblk_t *mp, int *error);
+ int (*ad_start_play)(audiohdl_t handle);
+ void (*ad_stop_play)(audiohdl_t handle);
+ int (*ad_start_record)(audiohdl_t handle);
+ void (*ad_stop_record)(audiohdl_t handle);
};
typedef struct am_ad_entry am_ad_entry_t;
-/* ad_set_config() and ad_set_format() stream # */
-#define AM_SET_CONFIG_BOARD (-1) /* for the whole board */
-
/* ad_set_config() commands */
#define AM_SET_GAIN 0x01 /* set input/ouput channel gain */
-#define AM_SET_GAIN_BAL 0x02 /* set input/ouput channel gain */
#define AM_SET_PORT 0x03 /* set input/output port */
#define AM_SET_MONITOR_GAIN 0x04 /* set monitor gain */
#define AM_OUTPUT_MUTE 0x05 /* mute output */
-#define AM_MONO_MIC 0x06 /* set which mono microphone */
#define AM_MIC_BOOST 0x07 /* enable/disable mic preamp */
-#define AM_BASS_BOOST 0x08 /* boost output bass */
-#define AM_MID_BOOST 0x09 /* boost output mid range */
-#define AM_TREBLE_BOOST 0x0a /* boost output treble */
-#define AM_LOUDNESS 0x0b /* enable/disable output loudness */
-#define AM_SET_DIAG_MODE 0x0c /* set diagnostics mode */
/*
* am_ad_info_t - Audio Driver configuration information structure
*/
struct am_ad_info {
- int ad_int_vers; /* Audio Driver interface version */
- int ad_mode; /* MIXER or COMPAT mode */
- uint_t ad_add_mode; /* additional mode information */
- int ad_codec_type; /* Codec type */
audio_info_t *ad_defaults; /* Audio Driver audio_info_t struct */
am_ad_ch_cap_t ad_play; /* play capabilities */
am_ad_ch_cap_t ad_record; /* record capabilities */
@@ -127,66 +104,13 @@ struct am_ad_info {
am_ad_cap_comb_t *ad_rec_comb; /* list of rec cap. combinations */
am_ad_entry_t *ad_entry; /* Audio Driver entry points */
audio_device_t *ad_dev_info; /* device information */
- uint_t ad_diag_flags; /* flags that specify diagnostics sup */
- uint_t ad_diff_flags; /* format difference flags */
- uint_t ad_assist_flags; /* audio stream assist flags */
- uint_t ad_misc_flags; /* misc. flags */
- uint_t ad_translate_flags; /* translate flags */
int ad_num_mics; /* # of mic inputs */
- uint_t _xxx[4]; /* reserved for future use */
};
typedef struct am_ad_info am_ad_info_t;
/* the taskq lock must be held in order for ad_mode to be valid */
_NOTE(SCHEME_PROTECTS_DATA("method", am_ad_info::ad_mode))
-/* am_ad_info.ad_int_vers defines */
-#define AM_VERSION AM_VERS2
-#define AM_VERS2 2 /* Supported interface version */
-
-/* am_ad_info.ad_add_mode defines */
-#define AM_ADD_MODE_DIAG_MODE 0x00000001u /* dev supports diagnostics */
-#define AM_ADD_MODE_MIC_BOOST 0x00000002u /* mic boost enabled */
-
-/* am_ad_info.ad_codec_type defines */
-#define AM_TRAD_CODEC 0x00000001u /* traditional Codec */
-#define AM_MS_CODEC 0x00000002u /* multi-stream Codec */
-
-/* am_ad_info.ad_diag_flags defines */
-#define AM_DIAG_INTERNAL_LOOP 0x00000001u /* dev has internal loopbacks */
-
-/* am_ad_info.ad_diff_flags defines */
-#define AM_DIFF_SR 0x00000001u /* p/r sample rate may differ */
-#define AM_DIFF_CH 0x00000002u /* p/r channels may differ */
-#define AM_DIFF_PREC 0x00000004u /* p/r precision may differ */
-#define AM_DIFF_ENC 0x00000008u /* p/r encoding may differ */
-
-/* am_ad_info.ad_assist_flags defines */
-#define AM_ASSIST_BASE 0x00000001u /* device has base boost */
-#define AM_ASSIST_MID 0x00000002u /* device has mid range boost */
-#define AM_ASSIST_TREBLE 0x00000004u /* device has treble boost */
-#define AM_ASSIST_LOUDNESS 0x00000008u /* device has loudness boost */
-#define AM_ASSIST_MIC 0x00000010u /* mic has preamp boost */
-
-/* am_ad_info.ad_misc_flags defines */
-#define AM_MISC_PP_EXCL 0x00000001u /* play ports are exclusive */
-#define AM_MISC_RP_EXCL 0x00000002u /* record ports are exclusive */
-#define AM_MISC_MONO_MIC 0x00000004u /* mono mic */
-#define AM_MISC_MONO_DUP 0x00000008u /* mono is duped to all chs */
-
-/* am_ad_info.ad_translate_flags */
-#define AM_MISC_8_P_TRANSLATE 0x00000001u /* trans. signed to unsigned */
-#define AM_MISC_16_P_TRANSLATE 0x00000002u /* trans. signed to unsigned */
-#define AM_MISC_8_R_TRANSLATE 0x00010000u /* trans. unsigned to signed */
-#define AM_MISC_16_R_TRANSLATE 0x00020000u /* trans. unsigned to signed */
-
-/*
- * Support for custom audio driver ioctl()s.
- */
-#define AM_WIOCDATA 0 /* returned by Audio Driver */
-#define AM_ACK 1 /* with private ioctl() & */
-#define AM_NACK 2 /* iocdata() routines */
-
/*
* Audio Mixer Driver Entry Point Routines
*/
@@ -196,13 +120,13 @@ int am_detach(audiohdl_t handle, ddi_detach_cmd_t cmd);
/*
* Audio Mixer Driver Device Dependent Driver Play Routines
*/
-int am_get_audio(audiohdl_t handle, void *buf, int channel, int samples);
-void am_play_shutdown(audiohdl_t handle, int channel);
+int am_get_audio(audiohdl_t handle, void *buf, int samples);
+void am_play_shutdown(audiohdl_t handle);
/*
* Audio Mixer Driver Device Dependent Driver Record Routines
*/
-void am_send_audio(audiohdl_t handle, void *buf, int channel, int samples);
+void am_send_audio(audiohdl_t handle, void *buf, int samples);
/*
* Audio Mixer Driver Device Dependent Driver Miscellaneous Routines
diff --git a/usr/src/uts/common/sys/audio/audio_oss.h b/usr/src/uts/common/sys/audio/audio_oss.h
new file mode 100644
index 0000000000..3cb3b9548a
--- /dev/null
+++ b/usr/src/uts/common/sys/audio/audio_oss.h
@@ -0,0 +1,908 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+#ifndef _SYS_AUDIO_OSS_H
+#define _SYS_AUDIO_OSS_H
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+/*
+ * These are the ioctl calls for all Solaris /dev/dsp and /dev/mixer audio
+ * devices.
+ *
+ * Note that the contents of this file include definitions which exist
+ * primarily for compatibility. Many of the defines here are not
+ * actually implemented, but exist solely to facilitate compilation of
+ * programs from other operating systems. Other definitions here may
+ * not be fully supported or may otherwise be obsolete. There are many
+ * things in this file which should not be used on SunOS.
+ *
+ * Please read the documentation to determine which portions of the
+ * API are fully supported and recommended for use in new
+ * applications.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Buffer status queries.
+ * SNDCTL_DSP_GETOSPACE and SNDCTL_DSP_GETISPACE
+ */
+typedef struct audio_buf_info {
+ int fragments; /* # of available fragments */
+ int fragstotal; /* Total # of fragments allocated */
+ int fragsize; /* Size of a fragment in bytes */
+ int bytes; /* Available space in bytes */
+ /* Note! 'bytes' could be more than fragments*fragsize */
+} audio_buf_info;
+
+/*
+ * Sync groups for audio devices.
+ * SNDCTL_DSP_SYNCGROUP and SNDCTL_DSP_SYNCSTART
+ */
+typedef struct oss_syncgroup {
+ int id;
+ int mode;
+ int filler[16];
+} oss_syncgroup;
+
+/*
+ * SNDCTL_DSP_GETERROR
+ */
+typedef struct audio_errinfo {
+ int play_underruns;
+ int rec_overruns;
+ unsigned int play_ptradjust;
+ unsigned int rec_ptradjust;
+ int play_errorcount;
+ int rec_errorcount;
+ int play_lasterror;
+ int rec_lasterror;
+ int play_errorparm;
+ int rec_errorparm;
+ int filler[16];
+} audio_errinfo;
+
+/*
+ * SNDCTL_DSP_GETIPTR and SNDCTL_DSP_GETOPTR
+ */
+typedef struct count_info {
+ unsigned int bytes; /* Total # of bytes processed */
+ int blocks; /* # of fragment transitions since last time */
+ int ptr; /* Current DMA pointer value */
+} count_info;
+
+/*
+ * SNDCTL_DSP_CURENT_IPTR and SNDCTL_DSP_CURRENT_OPTR
+ */
+typedef struct {
+ long long samples; /* Total # of samples */
+ int fifo_samples; /* Samples in device FIFO */
+ int filler[32]; /* For future use */
+} oss_count_t;
+
+/*
+ * SNDCTL_DSP_GET_RECSRC_NAMES and SNDCTL_DSP_GET_PLAYTGT_NAMES
+ */
+#define OSS_ENUM_MAXVALUE 255
+typedef struct oss_mixer_enuminfo {
+ int dev;
+ int ctrl;
+ int nvalues;
+ int version;
+ short strindex[OSS_ENUM_MAXVALUE];
+ char strings[3000];
+} oss_mixer_enuminfo;
+
+/*
+ * Digital interface (S/PDIF) control interface
+ * SNDCTL_DSP_READCTL and SNDCTL_DSP_WRITECTL
+ */
+typedef struct oss_digital_control {
+ unsigned int caps;
+#define DIG_CBITIN_NONE 0x00000000
+#define DIG_CBITIN_LIMITED 0x00000001
+#define DIG_CBITIN_DATA 0x00000002
+#define DIG_CBITIN_BYTE0 0x00000004
+#define DIG_CBITIN_FULL 0x00000008
+#define DIG_CBITIN_MASK 0x0000000f
+#define DIG_CBITOUT_NONE 0x00000000
+#define DIG_CBITOUT_LIMITED 0x00000010
+#define DIG_CBITOUT_BYTE0 0x00000020
+#define DIG_CBITOUT_FULL 0x00000040
+#define DIG_CBITOUT_DATA 0x00000080
+#define DIG_CBITOUT_MASK 0x000000f0
+#define DIG_UBITIN 0x00000100
+#define DIG_UBITOUT 0x00000200
+#define DIG_VBITOUT 0x00000400
+#define DIG_OUTRATE 0x00000800
+#define DIG_INRATE 0x00001000
+#define DIG_INBITS 0x00002000
+#define DIG_OUTBITS 0x00004000
+#define DIG_EXACT 0x00010000
+#define DIG_PRO 0x00020000
+#define DIG_CONSUMER 0x00040000
+#define DIG_PASSTHROUGH 0x00080000
+#define DIG_OUTSEL 0x00100000
+
+ unsigned int valid;
+#define VAL_CBITIN 0x00000001
+#define VAL_UBITIN 0x00000002
+#define VAL_CBITOUT 0x00000004
+#define VAL_UBITOUT 0x00000008
+#define VAL_ISTATUS 0x00000010
+#define VAL_IRATE 0x00000020
+#define VAL_ORATE 0x00000040
+#define VAL_INBITS 0x00000080
+#define VAL_OUTBITS 0x00000100
+#define VAL_REQUEST 0x00000200
+#define VAL_OUTSEL 0x00000400
+
+#define VAL_OUTMASK (VAL_CBITOUT|VAL_UBITOUT|VAL_ORATE|VAL_OUTBITS|VAL_OUTSEL)
+
+ unsigned int request;
+ unsigned int param;
+#define SPD_RQ_PASSTHROUGH 1
+
+ unsigned char cbitin[24];
+ unsigned char ubitin[24];
+ unsigned char cbitout[24];
+ unsigned char ubitout[24];
+
+ unsigned int outsel;
+#define OUTSEL_DIGITAL 1
+#define OUTSEL_ANALOG 2
+#define OUTSEL_BOTH (OUTSEL_DIGITAL|OUTSEL_ANALOG)
+
+ int in_data; /* Audio/data if autodetectable by receiver */
+#define IND_UNKNOWN 0
+#define IND_AUDIO 1
+#define IND_DATA 2
+
+ int in_locked; /* Receiver locked */
+#define LOCK_NOT_INDICATED 0
+#define LOCK_UNLOCKED 1
+#define LOCK_LOCKED 2
+
+ int in_quality; /* Input signal quality */
+#define IN_QUAL_NOT_INDICATED 0
+#define IN_QUAL_POOR 1
+#define IN_QUAL_GOOD 2
+
+ int in_vbit;
+ int out_vbit; /* V bits */
+#define VBIT_NOT_INDICATED 0
+#define VBIT_OFF 1
+#define VBIT_ON 2
+
+ unsigned int in_errors; /* Various input error conditions */
+#define INERR_CRC 0x0001
+#define INERR_QCODE_CRC 0x0002
+#define INERR_PARITY 0x0004
+#define INERR_BIPHASE 0x0008
+
+ int srate_in;
+ int srate_out;
+ int bits_in;
+ int bits_out;
+
+ int filler[32];
+} oss_digital_control;
+
+/*
+ * The "new" mixer API.
+ *
+ * This improved mixer API makes it possible to access every possible feature
+ * of every possible device. However you should read the mixer programming
+ * section of the OSS API Developer's Manual. There is no chance that you
+ * could use this interface correctly just by examining this header.
+ */
+#define OSS_VERSION 0x040003
+#define SOUND_VERSION OSS_VERSION
+
+typedef struct oss_sysinfo {
+ char product[32]; /* E.g. SunOS Audio */
+ char version[32]; /* E.g. 4.0a */
+ int versionnum; /* See OSS_GETVERSION */
+ char options[128]; /* NOT SUPPORTED */
+
+ int numaudios; /* # of audio/dsp devices */
+ int openedaudio[8]; /* Mask of audio devices are busy */
+
+ int numsynths; /* NOT SUPPORTED, always 0 */
+ int nummidis; /* NOT SUPPORTED, always 0 */
+ int numtimers; /* NOT SUPPORTED, always 0 */
+ int nummixers; /* # of mixer devices */
+
+ int openedmidi[8]; /* Mask of midi devices are busy */
+ int numcards; /* Number of sound cards in the system */
+ int numaudioengines; /* Number of audio engines in the system */
+ char license[16]; /* E.g. "GPL" or "CDDL" */
+ char revision_info[256]; /* For internal use */
+ int filler[172]; /* For future expansion */
+} oss_sysinfo;
+
+typedef struct oss_mixext {
+ int dev; /* Mixer device number */
+ int ctrl; /* Extension number */
+ int type; /* Entry type */
+#define MIXT_DEVROOT 0 /* Device root entry */
+#define MIXT_GROUP 1 /* Controller group */
+#define MIXT_ONOFF 2 /* OFF (0) or ON (1) */
+#define MIXT_ENUM 3 /* Enumerated (0 to maxvalue) */
+#define MIXT_MONOSLIDER 4 /* Mono slider (0 to 255) */
+#define MIXT_STEREOSLIDER 5 /* Stereo slider (dual 0 to 255) */
+#define MIXT_MESSAGE 6 /* (Readable) textual message */
+#define MIXT_MONOVU 7 /* VU meter value (mono) */
+#define MIXT_STEREOVU 8 /* VU meter value (stereo) */
+#define MIXT_MONOPEAK 9 /* VU meter peak value (mono) */
+#define MIXT_STEREOPEAK 10 /* VU meter peak value (stereo) */
+#define MIXT_RADIOGROUP 11 /* Radio button group */
+#define MIXT_MARKER 12 /* Separator between entries */
+#define MIXT_VALUE 13 /* Decimal value entry */
+#define MIXT_HEXVALUE 14 /* Hexadecimal value entry */
+#define MIXT_MONODB 15 /* OBSOLETE */
+#define MIXT_STEREODB 16 /* OBSOLETE */
+#define MIXT_SLIDER 17 /* Slider (mono, 31 bit int range) */
+#define MIXT_3D 18
+#define MIXT_MONOSLIDER16 19 /* Mono slider (0-32767) */
+#define MIXT_STEREOSLIDER16 20 /* Stereo slider (dual 0-32767) */
+#define MIXT_MUTE 21 /* Mute=1, unmute=0 */
+
+ /* Possible value range (minvalue to maxvalue) */
+ /* Note that maxvalue may also be smaller than minvalue */
+ int maxvalue;
+ int minvalue;
+
+ int flags;
+#define MIXF_READABLE 0x00000001 /* Has readable value */
+#define MIXF_WRITEABLE 0x00000002 /* Has writeable value */
+#define MIXF_POLL 0x00000004 /* May change itself */
+#define MIXF_HZ 0x00000008 /* Hertz scale */
+#define MIXF_STRING 0x00000010 /* Use dynamic extensions for value */
+#define MIXF_DYNAMIC 0x00000010 /* Supports dynamic extensions */
+#define MIXF_OKFAIL 0x00000020 /* Interpret value as 1=OK, 0=FAIL */
+#define MIXF_FLAT 0x00000040 /* NOT SUPPORTED */
+#define MIXF_LEGACY 0x00000080 /* NOT SUPPORTED */
+#define MIXF_CENTIBEL 0x00000100 /* Centibel (0.1 dB) step size */
+#define MIXF_DECIBEL 0x00000200 /* Step size of 1 dB */
+#define MIXF_MAINVOL 0x00000400 /* Main volume control */
+#define MIXF_PCMVOL 0x00000800 /* PCM output volume control */
+#define MIXF_RECVOL 0x00001000 /* PCM recording volume control */
+#define MIXF_MONVOL 0x00002000 /* Input->output monitor volume */
+#define MIXF_WIDE 0x00004000 /* NOT SUPPORTED */
+#define MIXF_DESCR 0x00008000 /* NOT SUPPORTED */
+#define MIXF_DISABLE 0x00010000 /* Control has been disabled */
+
+ char id[16]; /* Mnemonic ID (internal use) */
+ int parent; /* Entry# of parent (-1 if root) */
+
+ int dummy; /* NOT SUPPORTED */
+
+ int timestamp;
+
+ char data[64]; /* Misc data (entry type dependent) */
+ unsigned char enum_present[32]; /* Mask of allowed enum values */
+ int control_no; /* NOT SUPPORTED, always -1 */
+
+ unsigned int desc; /* Scope flags, etc */
+#define MIXEXT_SCOPE_MASK 0x0000003f
+#define MIXEXT_SCOPE_OTHER 0x00000000
+#define MIXEXT_SCOPE_INPUT 0x00000001
+#define MIXEXT_SCOPE_OUTPUT 0x00000002
+#define MIXEXT_SCOPE_MONITOR 0x00000003
+#define MIXEXT_SCOPE_RECSWITCH 0x00000004
+
+ char extname[32];
+ int update_counter;
+#ifdef _KERNEL
+ int filler[6];
+ int enumbit;
+#else
+ int filler[7];
+#endif
+} oss_mixext;
+
+typedef struct oss_mixext_root {
+ char id[16];
+ char name[48];
+} oss_mixext_root;
+
+typedef struct oss_mixer_value {
+ int dev;
+ int ctrl;
+ int value;
+ int flags; /* Reserved for future use. Initialize to 0 */
+ int timestamp; /* Must be set to oss_mixext.timestamp */
+ int filler[8]; /* Reserved for future use. Initialize to 0 */
+} oss_mixer_value;
+
+#define OSS_LONGNAME_SIZE 64
+#define OSS_LABEL_SIZE 16
+#define OSS_DEVNODE_SIZE 32
+typedef char oss_longname_t[OSS_LONGNAME_SIZE];
+typedef char oss_label_t[OSS_LABEL_SIZE];
+typedef char oss_devnode_t[OSS_DEVNODE_SIZE];
+
+
+typedef struct oss_audioinfo {
+ int dev; /* Audio device number */
+ char name[64];
+ int busy; /* 0, OPEN_READ, OPEN_WRITE, OPEN_READWRITE */
+ int pid; /* Process ID, not used in SunOS */
+ int caps; /* PCM_CAP_INPUT, PCM_CAP_OUTPUT */
+ int iformats; /* Supported input formats */
+ int oformats; /* Supported output formats */
+ int magic; /* Internal use only */
+ char cmd[64]; /* Command using the device (if known) */
+ int card_number;
+ int port_number;
+ int mixer_dev;
+ int legacy_device; /* Obsolete field. Replaced by devnode */
+ int enabled; /* 1=enabled, 0=device not ready */
+ int flags; /* internal use only - no practical meaning */
+ int min_rate; /* Minimum sample rate */
+ int max_rate; /* Maximum sample rate */
+ int min_channels; /* Minimum number of channels */
+ int max_channels; /* Maximum number of channels */
+ int binding; /* DSP_BIND_FRONT, etc. 0 means undefined */
+ int rate_source;
+ char handle[32];
+#define OSS_MAX_SAMPLE_RATES 20 /* Cannot be changed */
+ unsigned int nrates; /* Array of supported sample rates */
+ unsigned int rates[OSS_MAX_SAMPLE_RATES];
+ oss_longname_t song_name; /* Song name (if given) */
+ oss_label_t label; /* Device label (if given) */
+ int latency; /* In usecs, -1=unknown */
+ oss_devnode_t devnode; /* Device special file name (absolute path) */
+ int next_play_engine;
+ int next_rec_engine;
+ int filler[184];
+} oss_audioinfo;
+
+typedef struct oss_mixerinfo {
+ int dev;
+ char id[16];
+ char name[32];
+ int modify_counter;
+ int card_number;
+ int port_number;
+ char handle[32];
+ int magic; /* Reserved */
+ int enabled; /* Reserved */
+ int caps;
+#define MIXER_CAP_VIRTUAL 0x00000001
+#define MIXER_CAP_LAYOUT_B 0x00000002 /* For internal use only */
+#define MIXER_CAP_NARROW 0x00000004 /* Conserve horiz space */
+ int flags; /* Reserved */
+ int nrext;
+ /*
+ * The priority field can be used to select the default
+ * (motherboard) mixer device. The mixer with the highest
+ * priority is the most preferred one. -2 or less means that
+ * this device cannot be used as the default mixer.
+ */
+ int priority;
+ oss_devnode_t devnode; /* Device special file name (absolute path) */
+ int legacy_device;
+ int filler[245]; /* Reserved */
+} oss_mixerinfo;
+
+typedef struct oss_card_info {
+ int card;
+ char shortname[16];
+ char longname[128];
+ int flags;
+ char hw_info[400];
+ int intr_count;
+ int ack_count;
+ int filler[154];
+} oss_card_info;
+
+typedef struct mixer_info { /* OBSOLETE */
+ char id[16];
+ char name[32];
+ int modify_counter;
+ int card_number;
+ int port_number;
+ char handle[32];
+} mixer_info;
+
+#define MAX_PEAK_CHANNELS 128
+typedef unsigned short oss_peaks_t[MAX_PEAK_CHANNELS];
+
+/* For use with SNDCTL_DSP_GET_CHNORDER */
+#define CHID_UNDEF 0
+#define CHID_L 1
+#define CHID_R 2
+#define CHID_C 3
+#define CHID_LFE 4
+#define CHID_LS 5
+#define CHID_RS 6
+#define CHID_LR 7
+#define CHID_RR 8
+#define CHNORDER_UNDEF 0x0000000000000000ULL
+#define CHNORDER_NORMAL 0x0000000087654321ULL
+
+
+#define OSSIOCPARM_MASK 0x1fff /* parameters must be < 8192 bytes */
+#define OSSIOC_VOID 0x00000000 /* no parameters */
+#define OSSIOC_OUT 0x20000000 /* copy out parameters */
+#define OSSIOC_IN 0x40000000 /* copy in parameters */
+#define OSSIOC_INOUT (OSSIOC_IN|OSSIOC_OUT)
+#define OSSIOC_SZ(t) ((sizeof (t) & OSSIOCPARM_MASK) << 16)
+#define OSSIOC_GETSZ(x) (((x) >> 16) & OSSIOCPARM_MASK)
+
+#define __OSSIO(x, y) ((int)(OSSIOC_VOID|(x<<8)|y))
+#define __OSSIOR(x, y, t) ((int)(OSSIOC_OUT|OSSIOC_SZ(t)|(x<<8)|y))
+#define __OSSIOW(x, y, t) ((int)(OSSIOC_IN|OSSIOC_SZ(t)|(x<<8)|y))
+#define __OSSIOWR(x, y, t) ((int)(OSSIOC_INOUT|OSSIOC_SZ(t)|(x<<8)|y))
+
+#define SNDCTL_SYSINFO __OSSIOR('X', 1, oss_sysinfo)
+#define OSS_SYSINFO SNDCTL_SYSINFO /* Old name */
+
+#define SNDCTL_MIX_NRMIX __OSSIOR('X', 2, int)
+#define SNDCTL_MIX_NREXT __OSSIOWR('X', 3, int)
+#define SNDCTL_MIX_EXTINFO __OSSIOWR('X', 4, oss_mixext)
+#define SNDCTL_MIX_READ __OSSIOWR('X', 5, oss_mixer_value)
+#define SNDCTL_MIX_WRITE __OSSIOWR('X', 6, oss_mixer_value)
+
+#define SNDCTL_AUDIOINFO __OSSIOWR('X', 7, oss_audioinfo)
+#define SNDCTL_MIX_ENUMINFO __OSSIOWR('X', 8, oss_mixer_enuminfo)
+#define SNDCTL_MIDIINFO __OSSIO('X', 9)
+#define SNDCTL_MIXERINFO __OSSIOWR('X', 10, oss_mixerinfo)
+#define SNDCTL_CARDINFO __OSSIOWR('X', 11, oss_card_info)
+#define SNDCTL_ENGINEINFO __OSSIOWR('X', 12, oss_audioinfo)
+#define SNDCTL_AUDIOINFO_EX __OSSIOWR('X', 13, oss_audioinfo)
+#define SNDCTL_MIX_DESCRIPTION __OSSIOWR('X', 14, oss_mixer_enuminfo)
+
+/* ioctl codes 'X', 200-255 are reserved for internal use */
+
+/*
+ * Few more "globally" available ioctl calls.
+ */
+#define SNDCTL_SETSONG __OSSIOW('Y', 2, oss_longname_t)
+#define SNDCTL_GETSONG __OSSIOR('Y', 2, oss_longname_t)
+#define SNDCTL_SETNAME __OSSIOW('Y', 3, oss_longname_t)
+#define SNDCTL_SETLABEL __OSSIOW('Y', 4, oss_label_t)
+#define SNDCTL_GETLABEL __OSSIOR('Y', 4, oss_label_t)
+
+/*
+ * IOCTL commands for /dev/dsp
+ */
+#define SNDCTL_DSP_HALT __OSSIO('P', 0)
+#define SNDCTL_DSP_RESET SNDCTL_DSP_HALT /* Old name */
+#define SNDCTL_DSP_SYNC __OSSIO('P', 1)
+#define SNDCTL_DSP_SPEED __OSSIOWR('P', 2, int)
+
+#define SNDCTL_DSP_STEREO __OSSIOWR('P', 3, int) /* OBSOLETE */
+
+#define SNDCTL_DSP_GETBLKSIZE __OSSIOWR('P', 4, int)
+#define SNDCTL_DSP_SAMPLESIZE SNDCTL_DSP_SETFMT
+#define SNDCTL_DSP_CHANNELS __OSSIOWR('P', 6, int)
+#define SNDCTL_DSP_POST __OSSIO('P', 8)
+#define SNDCTL_DSP_SUBDIVIDE __OSSIOWR('P', 9, int)
+#define SNDCTL_DSP_SETFRAGMENT __OSSIOWR('P', 10, int)
+
+#define SNDCTL_DSP_GETFMTS __OSSIOR('P', 11, int) /* Returns a mask */
+#define SNDCTL_DSP_SETFMT __OSSIOWR('P', 5, int) /* Selects ONE fmt */
+
+#define SNDCTL_DSP_GETOSPACE __OSSIOR('P', 12, audio_buf_info)
+#define SNDCTL_DSP_GETISPACE __OSSIOR('P', 13, audio_buf_info)
+#define SNDCTL_DSP_GETCAPS __OSSIOR('P', 15, int)
+
+#define SNDCTL_DSP_GETTRIGGER __OSSIOR('P', 16, int)
+#define SNDCTL_DSP_SETTRIGGER __OSSIOW('P', 16, int)
+
+#define SNDCTL_DSP_GETIPTR __OSSIOR('P', 17, count_info)
+#define SNDCTL_DSP_GETOPTR __OSSIOR('P', 18, count_info)
+
+#define SNDCTL_DSP_SETSYNCRO __OSSIO('P', 21)
+#define SNDCTL_DSP_SETDUPLEX __OSSIO('P', 22)
+
+#define SNDCTL_DSP_PROFILE __OSSIOW('P', 23, int) /* OBSOLETE */
+#define APF_NORMAL 0 /* Normal applications */
+#define APF_NETWORK 1 /* Underruns caused by "external" delay */
+#define APF_CPUINTENS 2 /* Underruns caused by "overheating" the CPU */
+
+
+#define SNDCTL_DSP_GETODELAY __OSSIOR('P', 23, int)
+
+#define SNDCTL_DSP_GETPLAYVOL __OSSIOR('P', 24, int)
+#define SNDCTL_DSP_SETPLAYVOL __OSSIOWR('P', 24, int)
+#define SNDCTL_DSP_GETERROR __OSSIOR('P', 25, audio_errinfo)
+
+#define SNDCTL_DSP_READCTL __OSSIOWR('P', 26, oss_digital_control)
+#define SNDCTL_DSP_WRITECTL __OSSIOWR('P', 27, oss_digital_control)
+
+#define SNDCTL_DSP_SYNCGROUP __OSSIOWR('P', 28, oss_syncgroup)
+#define SNDCTL_DSP_SYNCSTART __OSSIOW('P', 29, int)
+
+#define SNDCTL_DSP_COOKEDMODE __OSSIOW('P', 30, int)
+
+#define SNDCTL_DSP_SILENCE __OSSIO('P', 31)
+#define SNDCTL_DSP_SKIP __OSSIO('P', 32)
+
+#define SNDCTL_DSP_HALT_INPUT __OSSIO('P', 33)
+#define SNDCTL_DSP_RESET_INPUT SNDCTL_DSP_HALT_INPUT /* Old name */
+#define SNDCTL_DSP_HALT_OUTPUT __OSSIO('P', 34)
+#define SNDCTL_DSP_RESET_OUTPUT SNDCTL_DSP_HALT_OUTPUT /* Old name */
+
+#define SNDCTL_DSP_LOW_WATER __OSSIOW('P', 34, int)
+
+#define SNDCTL_DSP_CURRENT_IPTR __OSSIOR('P', 35, oss_count_t)
+#define SNDCTL_DSP_CURRENT_OPTR __OSSIOR('P', 36, oss_count_t)
+
+#define SNDCTL_DSP_GET_RECSRC_NAMES __OSSIOR('P', 37, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_RECSRC __OSSIOR('P', 38, int)
+#define SNDCTL_DSP_SET_RECSRC __OSSIOWR('P', 38, int)
+
+#define SNDCTL_DSP_GET_PLAYTGT_NAMES __OSSIOR('P', 39, oss_mixer_enuminfo)
+#define SNDCTL_DSP_GET_PLAYTGT __OSSIOR('P', 40, int)
+#define SNDCTL_DSP_SET_PLAYTGT __OSSIOWR('P', 40, int)
+#define SNDCTL_DSP_GETRECVOL __OSSIOR('P', 41, int)
+#define SNDCTL_DSP_SETRECVOL __OSSIOWR('P', 41, int)
+
+#define SNDCTL_DSP_GET_CHNORDER __OSSIOR('P', 42, unsigned long long)
+#define SNDCTL_DSP_SET_CHNORDER __OSSIOWR('P', 42, unsigned long long)
+
+#define SNDCTL_DSP_GETIPEAKS __OSSIOR('P', 43, oss_peaks_t)
+#define SNDCTL_DSP_GETOPEAKS __OSSIOR('P', 44, oss_peaks_t)
+
+#define SNDCTL_DSP_POLICY __OSSIOW('P', 45, int) /* See the manual */
+
+#define SNDCTL_DSP_GETCHANNELMASK __OSSIOWR('P', 64, int)
+#define SNDCTL_DSP_BIND_CHANNEL __OSSIOWR('P', 65, int)
+
+/*
+ * These definitions are here for the benefit of compiling application
+ * code. Most of these are NOT implemented in the Solaris code,
+ * however. This is the older 3.x OSS API, and only the master input and
+ * output levels are actually supported.
+ */
+#define SOUND_MIXER_NRDEVICES 28
+#define SOUND_MIXER_VOLUME 0
+#define SOUND_MIXER_BASS 1
+#define SOUND_MIXER_TREBLE 2
+#define SOUND_MIXER_SYNTH 3
+#define SOUND_MIXER_PCM 4
+#define SOUND_MIXER_SPEAKER 5
+#define SOUND_MIXER_LINE 6
+#define SOUND_MIXER_MIC 7
+#define SOUND_MIXER_CD 8
+#define SOUND_MIXER_IMIX 9 /* Recording monitor */
+#define SOUND_MIXER_ALTPCM 10
+#define SOUND_MIXER_RECLEV 11 /* Recording level */
+#define SOUND_MIXER_IGAIN 12 /* Input gain */
+#define SOUND_MIXER_OGAIN 13 /* Output gain */
+#define SOUND_MIXER_LINE1 14 /* Input source 1 (aux1) */
+#define SOUND_MIXER_LINE2 15 /* Input source 2 (aux2) */
+#define SOUND_MIXER_LINE3 16 /* Input source 3 (line) */
+#define SOUND_MIXER_DIGITAL1 17 /* Digital I/O 1 */
+#define SOUND_MIXER_DIGITAL2 18 /* Digital I/O 2 */
+#define SOUND_MIXER_DIGITAL3 19 /* Digital I/O 3 */
+#define SOUND_MIXER_PHONE 20 /* Phone */
+#define SOUND_MIXER_MONO 21 /* Mono Output */
+#define SOUND_MIXER_VIDEO 22 /* Video/TV (audio) in */
+#define SOUND_MIXER_RADIO 23 /* Radio in */
+#define SOUND_MIXER_DEPTH 24 /* Surround depth */
+#define SOUND_MIXER_REARVOL 25 /* Rear/Surround speaker vol */
+#define SOUND_MIXER_CENTERVOL 26 /* Center/LFE speaker vol */
+#define SOUND_MIXER_SIDEVOL 27 /* Side-Surround (8speaker) vol */
+#define SOUND_MIXER_SURRVOL SOUND_MIXER_SIDEVOL
+#define SOUND_ONOFF_MIN 28
+#define SOUND_ONOFF_MAX 30
+#define SOUND_MIXER_NONE 31
+
+#define SOUND_MIXER_RECSRC 0xff /* Recording sources */
+#define SOUND_MIXER_DEVMASK 0xfe /* Supported devices */
+#define SOUND_MIXER_RECMASK 0xfd /* Recording sources */
+#define SOUND_MIXER_CAPS 0xfc /* Mixer capabilities (do not use) */
+#define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */
+#define SOUND_MIXER_OUTSRC 0xfa
+#define SOUND_MIXER_OUTMASK 0xf9
+
+#define SOUND_MIXER_ENHANCE SOUND_MIXER_NONE
+#define SOUND_MIXER_MUTE SOUND_MIXER_NONE
+#define SOUND_MIXER_LOUD SOUND_MIXER_NONE
+
+#define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
+#define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
+#define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
+#define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
+#define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
+#define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
+#define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
+#define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
+#define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
+#define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
+#define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
+#define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
+#define SOUND_MASK_IGAIN (1 << SOUND_MIXER_IGAIN)
+#define SOUND_MASK_OGAIN (1 << SOUND_MIXER_OGAIN)
+#define SOUND_MASK_LINE1 (1 << SOUND_MIXER_LINE1)
+#define SOUND_MASK_LINE2 (1 << SOUND_MIXER_LINE2)
+#define SOUND_MASK_LINE3 (1 << SOUND_MIXER_LINE3)
+#define SOUND_MASK_DIGITAL1 (1 << SOUND_MIXER_DIGITAL1)
+#define SOUND_MASK_DIGITAL2 (1 << SOUND_MIXER_DIGITAL2)
+#define SOUND_MASK_DIGITAL3 (1 << SOUND_MIXER_DIGITAL3)
+#define SOUND_MASK_MONO (1 << SOUND_MIXER_MONO)
+#define SOUND_MASK_PHONE (1 << SOUND_MIXER_PHONE)
+#define SOUND_MASK_RADIO (1 << SOUND_MIXER_RADIO)
+#define SOUND_MASK_VIDEO (1 << SOUND_MIXER_VIDEO)
+#define SOUND_MASK_DEPTH (1 << SOUND_MIXER_DEPTH)
+#define SOUND_MASK_REARVOL (1 << SOUND_MIXER_REARVOL)
+#define SOUND_MASK_CENTERVOL (1 << SOUND_MIXER_CENTERVOL)
+#define SOUND_MASK_SIDEVOL (1 << SOUND_MIXER_SIDEVOL)
+#define SOUND_MASK_SURRVOL SOUND_MASK_SIDEVOL
+#define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
+#define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
+#define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
+
+/*
+ * Again, DO NOT USE the following two macros. They are here for SOURCE
+ * COMPATIBILITY ONLY.
+ */
+#define SOUND_DEVICE_LABELS { \
+ "Vol ", "Bass ", "Treble", "Synth", "Pcm ", "Speaker ", "Line ", \
+ "Mic ", "CD ", "Mix ", "Pcm2 ", "Rec ", "IGain", "OGain", \
+ "Aux1", "Aux2", "Aux3", "Digital1", "Digital2", "Digital3", \
+ "Phone", "Mono", "Video", "Radio", "Depth", \
+ "Rear", "Center", "Side" }
+
+#define SOUND_DEVICE_NAMES { \
+ "vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
+ "mic", "cd", "mix", "pcm2", "rec", "igain", "ogain", \
+ "aux1", "aux2", "aux3", "dig1", "dig2", "dig3", \
+ "phone", "mono", "video", "radio", "depth", \
+ "rear", "center", "side" }
+
+#define MIXER_READ(dev) __OSSIOR('M', dev, int)
+#define MIXER_WRITE(dev) __OSSIOWR('M', dev, int)
+#define SOUND_MIXER_INFO __OSSIOR('M', 101, mixer_info)
+#define OSS_GETVERSION __OSSIOR('M', 118, int)
+
+/*
+ * These macros are useful for some applications. They are implemented
+ * as soft values for the application, and do not affect real hardware.
+ */
+#define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_READ_OGAIN MIXER_READ(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
+#define SOUND_MIXER_READ_IGAIN MIXER_READ(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
+#define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
+#define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
+#define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
+#define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
+#define SOUND_MIXER_READ_RECGAIN __OSSIOR('M', 119, int)
+#define SOUND_MIXER_READ_MONGAIN __OSSIOR('M', 120, int)
+
+#define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
+#define SOUND_MIXER_WRITE_OGAIN MIXER_WRITE(SOUND_MIXER_OGAIN)
+#define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
+#define SOUND_MIXER_WRITE_IGAIN MIXER_WRITE(SOUND_MIXER_IGAIN)
+#define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
+#define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
+#define SOUND_MIXER_WRITE_RECGAIN __OSSIOWR('M', 119, int)
+#define SOUND_MIXER_WRITE_MONGAIN __OSSIOWR('M', 120, int)
+
+/*
+ * These macros are here for source compatibility. They intentionally don't
+ * map to any real hardware. NOT SUPPORTED!
+ */
+#define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
+#define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
+#define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
+#define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
+#define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_READ_LINE1 MIXER_READ(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_READ_LINE2 MIXER_READ(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_READ_LINE3 MIXER_READ(SOUND_MIXER_LINE3)
+
+#define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
+#define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
+#define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
+#define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
+#define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
+#define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
+#define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
+#define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
+#define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
+#define SOUND_MIXER_WRITE_LINE1 MIXER_WRITE(SOUND_MIXER_LINE1)
+#define SOUND_MIXER_WRITE_LINE2 MIXER_WRITE(SOUND_MIXER_LINE2)
+#define SOUND_MIXER_WRITE_LINE3 MIXER_WRITE(SOUND_MIXER_LINE3)
+
+/*
+ * Audio encoding types (Note! U8=8 and S16_LE=16 for compatibility)
+ */
+#define AFMT_QUERY 0x00000000 /* Return current fmt */
+#define AFMT_MU_LAW 0x00000001
+#define AFMT_A_LAW 0x00000002
+#define AFMT_IMA_ADPCM 0x00000004
+#define AFMT_U8 0x00000008
+#define AFMT_S16_LE 0x00000010
+#define AFMT_S16_BE 0x00000020
+#define AFMT_S8 0x00000040
+#define AFMT_U16_LE 0x00000080
+#define AFMT_U16_BE 0x00000100
+#define AFMT_MPEG 0x00000200 /* NOT SUPPORTED: MPEG (2) audio */
+#define AFMT_AC3 0x00000400 /* NOT SUPPORTED: AC3 compressed */
+#define AFMT_VORBIS 0x00000800 /* NOT SUPPORTED: Ogg Vorbis */
+#define AFMT_S32_LE 0x00001000
+#define AFMT_S32_BE 0x00002000
+#define AFMT_FLOAT 0x00004000 /* NOT SUPPORTED: IEEE double float */
+#define AFMT_S24_LE 0x00008000 /* LSB aligned in 32 bit word */
+#define AFMT_S24_BE 0x00010000 /* LSB aligned in 32 bit word */
+#define AFMT_SPDIF_RAW 0x00020000 /* NOT SUPPORTED: Raw S/PDIF frames */
+#define AFMT_S24_PACKED 0x00040000 /* 24 bit packed little endian */
+/*
+ * Some big endian/little endian handling macros (native endian and
+ * opposite endian formats).
+ */
+#if defined(_BIG_ENDIAN)
+#define AFMT_S16_NE AFMT_S16_BE
+#define AFMT_U16_NE AFMT_U16_BE
+#define AFMT_S32_NE AFMT_S32_BE
+#define AFMT_S24_NE AFMT_S24_BE
+#define AFMT_S16_OE AFMT_S16_LE
+#define AFMT_S32_OE AFMT_S32_LE
+#define AFMT_S24_OE AFMT_S24_LE
+#else
+#define AFMT_S16_NE AFMT_S16_LE
+#define AFMT_U16_NE AFMT_U16_LE
+#define AFMT_S32_NE AFMT_S32_LE
+#define AFMT_S24_NE AFMT_S24_LE
+#define AFMT_S16_OE AFMT_S16_BE
+#define AFMT_S32_OE AFMT_S32_BE
+#define AFMT_S24_OE AFMT_S24_BE
+#endif
+
+/*
+ * SNDCTL_DSP_GETCAPS bits
+ */
+#define PCM_CAP_REVISION 0x000000ff /* Revision level (0 to 255) */
+#define PCM_CAP_DUPLEX 0x00000100 /* Full duplex rec/play */
+#define PCM_CAP_REALTIME 0x00000200 /* NOT SUPPORTED */
+#define PCM_CAP_BATCH 0x00000400 /* NOT SUPPORTED */
+#define PCM_CAP_COPROC 0x00000800 /* NOT SUPPORTED */
+#define PCM_CAP_TRIGGER 0x00001000 /* Supports SETTRIGGER */
+#define PCM_CAP_MMAP 0x00002000 /* Supports mmap() */
+#define PCM_CAP_MULTI 0x00004000 /* Supports multiple open */
+#define PCM_CAP_BIND 0x00008000 /* Supports channel binding */
+#define PCM_CAP_INPUT 0x00010000 /* Supports recording */
+#define PCM_CAP_OUTPUT 0x00020000 /* Supports playback */
+#define PCM_CAP_VIRTUAL 0x00040000 /* Virtual device */
+#define PCM_CAP_ANALOGOUT 0x00100000 /* NOT SUPPORTED */
+#define PCM_CAP_ANALOGIN 0x00200000 /* NOT SUPPORTED */
+#define PCM_CAP_DIGITALOUT 0x00400000 /* NOT SUPPORTED */
+#define PCM_CAP_DIGITALIN 0x00800000 /* NOT SUPPORTED */
+#define PCM_CAP_ADMASK 0x00f00000 /* NOT SUPPORTED */
+#define PCM_CAP_SHADOW 0x01000000 /* "Shadow" device */
+#define PCM_CAP_CH_MASK 0x06000000 /* See DSP_CH_MASK below */
+#define PCM_CAP_HIDDEN 0x08000000 /* NOT SUPPORTED */
+#define PCM_CAP_FREERATE 0x10000000
+#define PCM_CAP_MODEM 0x20000000 /* NOT SUPPORTED */
+#define PCM_CAP_DEFAULT 0x40000000 /* "Default" device */
+
+/*
+ * Preferred channel usage. These bits can be used to give
+ * recommendations to the application. Used by few drivers. For
+ * example if ((caps & DSP_CH_MASK) == DSP_CH_MONO) means that the
+ * device works best in mono mode. However it doesn't necessarily mean
+ * that the device cannot be used in stereo. These bits should only be
+ * used by special applications such as multi track hard disk
+ * recorders to find out the initial setup. However the user should be
+ * able to override this selection.
+ *
+ * To find out which modes are actually supported the application
+ * should try to select them using SNDCTL_DSP_CHANNELS.
+ */
+#define DSP_CH_MASK 0x06000000 /* Mask */
+#define DSP_CH_ANY 0x00000000 /* No preferred mode */
+#define DSP_CH_MONO 0x02000000
+#define DSP_CH_STEREO 0x04000000
+#define DSP_CH_MULTI 0x06000000 /* More than two channels */
+
+
+/*
+ * The PCM_CAP_* capability names used to be known as DSP_CAP_*, so
+ * it's necessary to define the older names too.
+ */
+#define DSP_CAP_ADMASK PCM_CAP_ADMASK
+#define DSP_CAP_ANALOGIN PCM_CAP_ANALOGIN
+#define DSP_CAP_ANALOGOUT PCM_CAP_ANALOGOUT
+#define DSP_CAP_BATCH PCM_CAP_BATCH
+#define DSP_CAP_BIND PCM_CAP_BIND
+#define DSP_CAP_COPROC PCM_CAP_COPROC
+#define DSP_CAP_DEFAULT PCM_CAP_DEFAULT
+#define DSP_CAP_DIGITALIN PCM_CAP_DIGITALIN
+#define DSP_CAP_DIGITALOUT PCM_CAP_DIGITALOUT
+#define DSP_CAP_DUPLEX PCM_CAP_DUPLEX
+#define DSP_CAP_FREERATE PCM_CAP_FREERATE
+#define DSP_CAP_HIDDEN PCM_CAP_HIDDEN
+#define DSP_CAP_INPUT PCM_CAP_INPUT
+#define DSP_CAP_MMAP PCM_CAP_MMAP
+#define DSP_CAP_MODEM PCM_CAP_MODEM
+#define DSP_CAP_MULTI PCM_CAP_MULTI
+#define DSP_CAP_OUTPUT PCM_CAP_OUTPUT
+#define DSP_CAP_REALTIME PCM_CAP_REALTIME
+#define DSP_CAP_REVISION PCM_CAP_REVISION
+#define DSP_CAP_SHADOW PCM_CAP_SHADOW
+#define DSP_CAP_TRIGGER PCM_CAP_TRIGGER
+#define DSP_CAP_VIRTUAL PCM_CAP_VIRTUAL
+
+/*
+ * SNDCTL_DSP_GETTRIGGER and SNDCTL_DSP_SETTRIGGER
+ */
+#define PCM_ENABLE_INPUT 0x00000001
+#define PCM_ENABLE_OUTPUT 0x00000002
+
+/*
+ * SNDCTL_DSP_BIND_CHANNEL
+ */
+#define DSP_BIND_QUERY 0x00000000
+#define DSP_BIND_FRONT 0x00000001
+#define DSP_BIND_SURR 0x00000002
+#define DSP_BIND_CENTER_LFE 0x00000004
+#define DSP_BIND_HANDSET 0x00000008
+#define DSP_BIND_MIC 0x00000010
+#define DSP_BIND_MODEM1 0x00000020
+#define DSP_BIND_MODEM2 0x00000040
+#define DSP_BIND_I2S 0x00000080
+#define DSP_BIND_SPDIF 0x00000100
+#define DSP_BIND_REAR 0x00000200
+
+/*
+ * SOUND_MIXER_READ_CAPS
+ */
+#define SOUND_CAP_EXCL_INPUT 0x00000001
+#define SOUND_CAP_NOLEGACY 0x00000004
+#define SOUND_CAP_NORECSRC 0x00000008
+
+/*
+ * The following ioctl is for internal use only -- it is used to
+ * coordinate /dev/sndstat numbering with file names in /dev/sound.
+ * Applications must not use it. (This is duplicated in sys/audioio.h
+ * as well.)
+ */
+#define SNDCTL_SUN_SEND_NUMBER __OSSIOW('X', 200, int)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_AUDIO_OSS_H */
diff --git a/usr/src/uts/common/sys/audio/audio_src.h b/usr/src/uts/common/sys/audio/audio_src.h
deleted file mode 100644
index 55ee5071dc..0000000000
--- a/usr/src/uts/common/sys/audio/audio_src.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the public interfaces for the audio mixer
- * sample rate conversion routines. Only the audio mixer and sample rate
- * conversion routines may include this header file.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_SRC_H
-#define _SYS_AUDIO_SRC_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-#define AM_SRC_VERSION AM_SRC_VERSION2
-#define AM_SRC_VERSION2 2
-
-/*
- * The handle used by the mixer and the sample rate conversion routine.
- */
-typedef struct src_handle *srchdl_t;
-
-/*
- * am_ad_src_entry_t - Audio Driver sample rate conversion routines
- */
-struct am_ad_src_entry {
- int ad_version;
- size_t (*ad_src_init)(srchdl_t handle, int dir);
- void (*ad_src_exit)(srchdl_t handle, int dir);
- int (*ad_src_update)(srchdl_t handle,
- audio_prinfo_t *ch_prinfo,
- audio_prinfo_t *hw_prinfo,
- void *src_info, int dir);
- int (*ad_src_adjust)(srchdl_t handle, int dir,
- int samples);
- int *(*ad_src_convert)(srchdl_t handle, int channels,
- int dir, int *src, int *ptr1, int *ptr2,
- int *samples);
- size_t (*ad_src_size)(srchdl_t handle, audio_prinfo_t *prinfo,
- int dir, int samples, int hw_channels);
-};
-typedef struct am_ad_src_entry am_ad_src_entry_t;
-
-/*
- * am_ad_sample_rates_t - supported sample rates
- */
-struct am_ad_sample_rates {
- int ad_limits; /* 0 if sample rates not limits */
- uint_t *ad_srs; /* NULL term. list of sample rates */
-};
-typedef struct am_ad_sample_rates am_ad_sample_rates_t;
-
-/* am_ad_ample_rates.ad_limits */
-#define MIXER_SRS_FLAG_SR_NOT_LIMITS 0x00000000u
- /* samp rates not limits */
-#define MIXER_SRS_FLAG_SR_LIMITS MIXER_SR_LIMITS
- /* samp rates set limits */
-
-/*
- * Audio Mixer Audio Driver Miscellaneous Routines
- */
-void *am_get_src_data(srchdl_t handle, int dir);
-void am_set_src_data(srchdl_t handle, int dir, void *data);
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_SRC_H */
diff --git a/usr/src/uts/common/sys/audio/audio_support.h b/usr/src/uts/common/sys/audio/audio_support.h
index 46e7ecdf78..d6e5504156 100644
--- a/usr/src/uts/common/sys/audio/audio_support.h
+++ b/usr/src/uts/common/sys/audio/audio_support.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,11 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
- * This header file defines the public interfaces for the audio support
- * module. These definitions are available for use by all audio modules
- * and drivers.
+ * This header file defines a legacy interface for audio drivers.
+ * It should not be used in any code.
*
* CAUTION: This header file has not gone through a formal review process.
* Thus its commitment level is very low and may change or be removed
@@ -35,8 +33,6 @@
#ifndef _SYS_AUDIO_SUPPORT_H
#define _SYS_AUDIO_SUPPORT_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -50,121 +46,23 @@ extern "C" {
#define AUDIO_FAILURE (-1)
/*
- * Miscellaneous defines.
- */
-#define AUDIO_PRECISION_SHIFT 3
-#define AUDIO_NO_CHANNEL (-1)
-#define AUDIO_TOGGLE(X) (X) ^= 1
-
-/*
* Opaque handle used by all audio drivers to reference the audio
* support module and all audio personality modules.
*/
typedef struct audio_handle *audiohdl_t;
/*
- * Opaque handle used by all audio personality modules to reference the
- * audio task queue.
- */
-typedef struct audio_taskq *audio_taskq_t;
-
-/*
- * audio_i_state - This structure is used to hold state information
- * between M_IOCTL and M_IOCDATA messages from the
- * STREAMS head.
- */
-struct audio_i_state {
- long ais_command; /* the M_IOCDATA command to execute next */
- caddr_t ais_address; /* address to M_COPYOUT/M_COPYIN data from/to */
- caddr_t ais_address2; /* address to M_COPYOUT/M_COPYIN data from/to */
-};
-typedef struct audio_i_state audio_i_state_t;
-
-/*
- * audio_sup_reg_data - This structure is used to provide registration
- * data from the audio driver to the audiosup module.
- */
-struct audio_sup_reg_data {
- int asrd_version; /* version of this data structure */
- char *asrd_key; /* unique string used to ID drvr inst */
-};
-typedef struct audio_sup_reg_data audio_sup_reg_data_t;
-
-_NOTE(SCHEME_PROTECTS_DATA("private data", audio_sup_reg_data::asrd_key))
-
-#define AUDIOSUP_VERSION AUDIOSUP_VERSION1
-#define AUDIOSUP_VERSION1 1
-
-/*
* Audio Support Module Entry Point Routines
*/
-audiohdl_t audio_sup_register(dev_info_t *dip, audio_sup_reg_data_t *data);
+audiohdl_t audio_sup_register(dev_info_t *dip);
int audio_sup_unregister(audiohdl_t handle);
-int audio_sup_open(queue_t *q, dev_t *devp, int flag, int sflags,
- cred_t *credp);
-int audio_sup_close(queue_t *q, int flag, cred_t *credp);
-int audio_sup_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result);
-int audio_sup_restore_state(audiohdl_t handle, audio_device_type_e device,
- int dir);
-int audio_sup_save_state(audiohdl_t handle, audio_device_type_e device,
- int dir);
-
-#define AUDIO_ALL_DEVICES UNDEFINED
-
-int audio_sup_rput(queue_t *q, mblk_t *mp);
-int audio_sup_rsvc(queue_t *q);
-int audio_sup_wput(queue_t *q, mblk_t *mp);
-int audio_sup_wsvc(queue_t *q);
-
-/*
- * Audio Support Module Entry Point Routines
- * CAUTION: These routines will be removed from the next
- * release of Solaris. Migrate to audio_sup_register()
- * and audio_sup_unregister().
- */
-audiohdl_t audio_sup_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
-int audio_sup_detach(audiohdl_t handle, ddi_detach_cmd_t cmd);
-
-/*
- * Audio Support Module STREAMS Private Data Routines
- */
-void audio_sup_set_qptr(queue_t *q, dev_t dev, void *data);
-void audio_sup_free_qptr(queue_t *q);
-dev_t audio_sup_get_qptr_dev(queue_t *q);
-void *audio_sup_get_qptr_data(queue_t *q);
-int audio_sup_get_qptr_instance(queue_t *q);
-
-/*
- * Audio Support Module Minor Routines
- */
-int audio_sup_get_max_chs(audiohdl_t handle);
-int audio_sup_get_minors_per_inst(audiohdl_t handle);
-int audio_sup_construct_minor(audiohdl_t handle, audio_device_type_e type);
-int audio_sup_devt_to_instance(dev_t devt);
+void audio_sup_restore_state(audiohdl_t handle);
/*
* Audio Support Module Miscellaneous Routines
*/
-dev_info_t *audio_sup_get_dip(audiohdl_t handle);
void *audio_sup_get_private(audiohdl_t handle);
void audio_sup_set_private(audiohdl_t handle, void *private);
-/*PRINTFLIKE3*/
-extern void audio_sup_log(audiohdl_t handle, uint_t level, char *fmt, ...)
- __KPRINTFLIKE(3);
-int audio_sup_update_persist_key(dev_info_t *dip, char *new_key, int sleep);
-
-
-#ifdef _SYSCALL32
-/* ILP32 view of the audio_channel structure */
-struct audio_channel32 {
- pid32_t pid; /* process ID */
- uint32_t ch_number; /* channel number */
- int32_t dev_type; /* device type */
- size32_t info_size; /* size of info structure */
- caddr32_t info; /* pointer to info structure */
-};
-#endif
#endif /* _KERNEL */
diff --git a/usr/src/uts/common/sys/audio/audio_trace.h b/usr/src/uts/common/sys/audio/audio_trace.h
deleted file mode 100644
index 61eeb45ed0..0000000000
--- a/usr/src/uts/common/sys/audio/audio_trace.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * This header file defines the public interfaces for audio tracing.
- *
- * CAUTION: This header file has not gone through a formal review process.
- * Thus its commitment level is very low and may change or be removed
- * at any time.
- */
-
-#ifndef _SYS_AUDIO_TRACE_H
-#define _SYS_AUDIO_TRACE_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-/*
- * Trace declarations and defines.
- */
-
-struct audio_trace_buf {
- uint_t atb_seq; /* trace sequence number */
- char *atb_comment; /* trace comment string */
- uintptr_t atb_data; /* data to go with string */
-};
-typedef struct audio_trace_buf audio_trace_buf_t;
-
-#define AUDIO_TRACE_BUFFER_SIZE 1024
-
-#ifdef DEBUG
-
-#ifndef __lock_lint
-extern audio_trace_buf_t audio_trace_buffer[AUDIO_TRACE_BUFFER_SIZE];
-extern kmutex_t audio_tb_lock; /* global trace buffer lock */
-extern size_t audio_tb_siz;
-extern int audio_tb_pos;
-extern uint_t audio_tb_seq;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_tb_pos))
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_tb_seq))
-_NOTE(MUTEX_PROTECTS_DATA(audio_tb_lock, audio_trace_buffer))
-
-#define ATRACE(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = (uintptr_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_64(M, D) ATRACE(M, D)
-
-#define ATRACE_32(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint32_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_16(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint16_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-
-#define ATRACE_8(M, D) { \
- mutex_enter(&audio_tb_lock); \
- audio_trace_buffer[audio_tb_pos].atb_seq = audio_tb_seq++; \
- audio_trace_buffer[audio_tb_pos].atb_comment = (M); \
- audio_trace_buffer[audio_tb_pos++].atb_data = \
- (uintptr_t)(uint8_t)(D); \
- if (audio_tb_pos >= audio_tb_siz) \
- audio_tb_pos = 0; \
- mutex_exit(&audio_tb_lock); \
- }
-#else
-
-#define ATRACE(M, D)
-#define ATRACE_32(M, D)
-#define ATRACE_16(M, D)
-#define ATRACE_8(M, D)
-
-#endif
-
-#else /* DEBUG */
-
-#define ATRACE(M, D)
-#define ATRACE_32(M, D)
-#define ATRACE_16(M, D)
-#define ATRACE_8(M, D)
-
-#endif /* DEBUG */
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_TRACE_H */
diff --git a/usr/src/uts/common/sys/audio/audiohd.h b/usr/src/uts/common/sys/audio/audiohd.h
deleted file mode 100755
index 81f660c614..0000000000
--- a/usr/src/uts/common/sys/audio/audiohd.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOHD_H_
-#define _SYS_AUDIOHD_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/types.h>
-#include <sys/thread.h>
-#include <sys/synch.h>
-#include <sys/kstat.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_support.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-
-
-#define AUDIOHD_SAMPR5510 5510
-#define AUDIOHD_SAMPR6620 6620
-#define AUDIOHD_SAMPR8000 8000
-#define AUDIOHD_SAMPR9600 9600
-#define AUDIOHD_SAMPR11025 11025
-#define AUDIOHD_SAMPR16000 16000
-#define AUDIOHD_SAMPR18900 18900
-#define AUDIOHD_SAMPR22050 22050
-#define AUDIOHD_SAMPR27420 27420
-#define AUDIOHD_SAMPR32000 32000
-#define AUDIOHD_SAMPR33075 33075
-#define AUDIOHD_SAMPR37800 37800
-#define AUDIOHD_SAMPR44100 44100
-#define AUDIOHD_SAMPR48000 48000
-
-#define AUDIOHD_SAMPLER_MAX AUDIOHD_SAMPR48000
-#define AUDIOHD_MIN_INTS 32
-#define AUDIOHD_MAX_INTS 1500
-#define AUDIOHD_INTS 50
-#define AUDIOHD_MAX_PRECISION AUDIO_PRECISION_16
-#define AUDIOHD_MAX_CHANNELS AUDIO_CHANNELS_STEREO
-#define AUDIOHD_MAX_OUT_CHANNELS 32
-#define AUDIOHD_MAX_IN_CHANNELS AUDIOHD_MAX_OUT_CHANNELS
-
-#define AUDIOHD_BSIZE 8192
-#define AUDIOHD_DEFAULT_SR 8000
-#define AUDIOHD_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define AUDIOHD_DEFAULT_PREC AUDIO_PRECISION_8
-#define AUDIOHD_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define AUDIOHD_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define AUDIOHD_DEFAULT_RGAIN 127
-#define AUDIOHD_DEFAULT_BAL AUDIO_MID_BALANCE
-#define AUDIOHD_DEFAULT_MONITOR_GAIN 0
-
-#define AUDIOHD_DEV_NAME "SUNW,audiohd"
-#define AUDIOHD_DEV_CONFIG "onboard1"
-#define AUDIOHD_DEV_VERSION "a"
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOHD_H_ */
diff --git a/usr/src/uts/common/sys/audio/audioixp.h b/usr/src/uts/common/sys/audio/audioixp.h
deleted file mode 100644
index 3d0d6ed17a..0000000000
--- a/usr/src/uts/common/sys/audio/audioixp.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOIXP_H_
-#define _SYS_AUDIOIXP_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audioixp device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define IXP_DEV_NAME "SUNW,audioixp"
-#define IXP_DEV_CONFIG "onboard1"
-#define IXP_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define IXP_NAME "audioixp"
-#define IXP_MOD_NAME "mixer audio driver"
-
-#define IXP_SAMPR8000 (8000)
-#define IXP_SAMPR11025 (11025)
-#define IXP_SAMPR16000 (16000)
-#define IXP_SAMPR22050 (22050)
-#define IXP_SAMPR24000 (24000)
-#define IXP_SAMPR32000 (32000)
-#define IXP_SAMPR44100 (44100)
-#define IXP_SAMPR48000 (48000)
-
-#define IXP_DEFAULT_SR IXP_SAMPR8000
-#define IXP_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define IXP_DEFAULT_PREC AUDIO_PRECISION_8
-#define IXP_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define IXP_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define IXP_DEFAULT_RGAIN (127)
-#define IXP_DEFAULT_MONITOR_GAIN (0)
-#define IXP_DEFAULT_BAL AUDIO_MID_BALANCE
-#define IXP_INTS (175) /* default interrupt rate */
-#define IXP_MIN_INTS (24) /* minimum interrupt rate */
-#define IXP_MAX_INTS (500) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOIXP_H_ */
diff --git a/usr/src/uts/common/sys/audio/audiots.h b/usr/src/uts/common/sys/audio/audiots.h
deleted file mode 100644
index 686ba89062..0000000000
--- a/usr/src/uts/common/sys/audio/audiots.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIOTS_H
-#define _SYS_AUDIOTS_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audiots device driver.
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define TS_DEV_NAME "SUNW,audiots"
-#define TS_DEV_CONFIG "onboard1"
-#define TS_DEV_VERSION_A "a" /* grover, sngl strming play */
-#define TS_DEV_VERSION_B "b" /* birdsnest, sngl strm play */
-
-/*
- * Driver supported configuration information
- */
-#define TS_NAME "audiots"
-#define TS_MOD_NAME "mixer audio driver"
-
-#define TS_SAMPR4000 (4000)
-#define TS_SAMPR5510 (5510)
-#define TS_SAMPR6620 (6620)
-#define TS_SAMPR8000 (8000)
-#define TS_SAMPR9600 (9600)
-#define TS_SAMPR11025 (11025)
-#define TS_SAMPR16000 (16000)
-#define TS_SAMPR18900 (18900)
-#define TS_SAMPR22050 (22050)
-#define TS_SAMPR27420 (27420)
-#define TS_SAMPR32000 (32000)
-#define TS_SAMPR33075 (33075)
-#define TS_SAMPR37800 (37800)
-#define TS_SAMPR44100 (44100)
-#define TS_SAMPR48000 (48000)
-
-#define TS_DEFAULT_SR TS_SAMPR8000
-#define TS_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define TS_DEFAULT_PREC AUDIO_PRECISION_8
-#define TS_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define TS_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3 / 4)
-#define TS_DEFAULT_RGAIN (127)
-#define TS_DEFAULT_MONITOR_GAIN (0)
-#define TS_DEFAULT_BAL AUDIO_MID_BALANCE /* MUST be mid */
-#define TS_INTS (175) /* default interrupt rate */
-#define TS_MIN_INTS (24) /* minimum interrupt rate */
-#define TS_MAX_INTS (2000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOTS_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src1_impl.h b/usr/src/uts/common/sys/audio/impl/am_src1_impl.h
deleted file mode 100644
index ca5e04cbf1..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src1_impl.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 2000-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- *
- * This header file defines the internal interfaces for the default audio
- * mixer sample rate converted. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AM_SRC1_IMPL_H
-#define _SYS_AM_SRC1_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/note.h>
-#include <sys/types.h>
-#include <sys/audio/am_src1.h>
-
-/*
- * am_src1_data_t - sample rate conversion algorithm #1 data
- */
-#define AM_SRC1_MUPSIZE1 4 /* max up/down conversions */
-struct am_src1_data {
- kmutex_t src1_lock; /* protects this structure */
- uint_t src1_inFs; /* input sample rate */
- uint_t src1_outFs; /* device sample rate */
- int src1_k; /* filter parameter */
- int src1_up[AM_SRC1_MUPSIZE1]; /* up sample steps */
- int src1_down[AM_SRC1_MUPSIZE1]; /* down sample steps */
- int src1_ustart1[AM_SRC1_MUPSIZE1];
- /* up smpl saved samps, L */
- int src1_ustart2[AM_SRC1_MUPSIZE1];
- /* up smpl saved samps, R */
- int src1_dstart[AM_SRC1_MUPSIZE1];
- /* dwn sample saved samples */
- int src1_out1[AM_SRC1_MUPSIZE1];
- /* down sample saved samples */
- int src1_out2[AM_SRC1_MUPSIZE1];
- /* down sample saved samples */
- int (*src1_up0)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up1)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up2)(struct am_src1_data *, int, int,
- int *, int *, int);
- int (*src1_up3)(struct am_src1_data *, int, int,
- int *, int *, int);
- int src1_up_factor; /* total up conversions */
- int src1_down_factor; /* total down conversions */
- int src1_count; /* number of up conversions */
-};
-typedef struct am_src1_data am_src1_data_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(am_src1_data::src1_lock, am_src1_data))
-
-/* fudge factor to make sure we've got enough memory */
-#define AM_SRC1_BUFFER (8 * sizeof (int))
-
-/* misc. defines */
-#define AM_SRC1_SHIFT1 1
-#define AM_SRC1_SHIFT2 2
-#define AM_SRC1_SHIFT3 3
-#define AM_SRC1_SHIFT8 8
-#define AM_INT32_SHIFT 2
-#define SRC_MAX(a, b) ((a) > (b) ? (a) : (b))
-#define SRC_MAX4(w, x, y, z) SRC_MAX(SRC_MAX(w, x), SRC_MAX(y, z))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC1_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src2_impl.h b/usr/src/uts/common/sys/audio/impl/am_src2_impl.h
deleted file mode 100644
index 5b2ce698ba..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src2_impl.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the alternative audio
- * mixer sample rate converter. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AM_SRC2_IMPL_H
-#define _SYS_AM_SRC2_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <sys/note.h>
-#include <sys/types.h>
-#include <sys/audio/am_src2.h>
-
-/* misc. defines */
-#define AM_SRC2_NZCS (10) /* number of zero crossings */
-#define AM_SRC2_CPZC (256) /* coeffs per zero crossing */
-#define AM_SRC2_CPZC_SHIFT (8) /* 1 << CPZC_SHIFT = CPZC */
-#define AM_SRC2_CPZC_MASK (0xFF) /* for modulo arithmetic */
-#define AM_SRC2_STEREO_MASK (0x1) /* for modulo arithmetic */
-#define AM_SRC2_COFF_SHIFT (16) /* for scaling output */
-#define AM_SRC2_COFFS ((2 * AM_SRC2_NZCS) + 1) /* coefficients */
-#define AM_SRC2_SHIFT1 (1)
-#define AM_SRC2_SHIFT2 (2)
-
-/* We define the location of the first, middle and last coefficients */
-#define AM_SRC2_START (AM_SRC2_NZCS)
-#define AM_SRC2_MIDDLE ((AM_SRC2_NZCS * AM_SRC2_CPZC) + AM_SRC2_CPZC)
-#define AM_SRC2_END ((2 * AM_SRC2_NZCS * AM_SRC2_CPZC) + \
- AM_SRC2_CPZC)
-
-/*
- * We define the maximum amount of prebuffer room required.
- * If playing, it is assumed we are increasing the sample rate
- * in which case the amount of room required is given by
- * 2 * max_channels * nzcs.
- */
-#define AM_SRC2_PBUFFER (2 * 2 * AM_SRC2_NZCS)
-
-/*
- * When down sampling the amount of prebuffer room required
- * depends on the conversion factor. Here we assume that this
- * factor will never be greater than 12 (i.e. 48kHz -> 4kHz)
- * and we allocate enough memory to cope with that. A little
- * wasteful but worth it for the simplicity achieved. Here
- * the room required is 2 * max_channels * max_factor * nzcs.
- */
-#define AM_SRC2_RBUFFER (2 * 2 * 12 * AM_SRC2_NZCS)
-
-/*
- * am_src2_data_t - sample rate conversion algorithm #2 data
- */
-struct am_src2_data {
- kmutex_t src2_lock; /* protects this structure */
- int src2_inFs; /* input sample rate */
- int src2_outFs; /* device sample rate */
- int (*src2_resample)(struct am_src2_data *, int *, int *,
- int); /* resampling function */
- int src2_pbsize; /* room in front of samples */
- int src2_delta_c; /* distance to nearest input sample */
- int src2_delta_n; /* normalised delta_c */
- int src2_i_index; /* start point in input */
- int src2_csteps; /* step size through input */
- int src2_cmod; /* fraction of csteps left over */
- int src2_cover; /* fraction of csteps counter */
- int src2_tsteps; /* step size through filter */
- int *src2_table; /* filter coefficients */
- int **src2_tables; /* individual tables */
-};
-
-typedef struct am_src2_data am_src2_data_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(am_src2_data::src2_lock, am_src2_data))
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/am_src2_table.h b/usr/src/uts/common/sys/audio/impl/am_src2_table.h
deleted file mode 100644
index 294d756df3..0000000000
--- a/usr/src/uts/common/sys/audio/impl/am_src2_table.h
+++ /dev/null
@@ -1,1493 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file contains sample rate conversion tables for amsrc2.
- */
-
-#ifndef _SYS_AM_SRC2_TABLE_H
-#define _SYS_AM_SRC2_TABLE_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* The table used in down sampling */
-int32_t _amsrc2table[5377] = {
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0, 0,
-0, -1, -1, -2, -2, -3, -3, -4,
--4, -5, -6, -6, -7, -7, -8, -9,
--9, -10, -10, -11, -12, -12, -13, -14,
--14, -15, -16, -16, -17, -18, -19, -19,
--20, -21, -21, -22, -23, -24, -24, -25,
--26, -26, -27, -28, -29, -29, -30, -31,
--32, -33, -33, -34, -35, -36, -36, -37,
--38, -39, -40, -40, -41, -42, -43, -43,
--44, -45, -46, -47, -47, -48, -49, -50,
--51, -51, -52, -53, -54, -54, -55, -56,
--57, -58, -58, -59, -60, -61, -61, -62,
--63, -64, -64, -65, -66, -67, -67, -68,
--69, -69, -70, -71, -71, -72, -73, -73,
--74, -75, -75, -76, -77, -77, -78, -78,
--79, -80, -80, -81, -81, -82, -82, -83,
--83, -84, -84, -85, -85, -86, -86, -87,
--87, -88, -88, -88, -89, -89, -89, -90,
--90, -90, -91, -91, -91, -91, -92, -92,
--92, -92, -93, -93, -93, -93, -93, -93,
--93, -93, -93, -93, -94, -94, -94, -93,
--93, -93, -93, -93, -93, -93, -93, -93,
--92, -92, -92, -92, -92, -91, -91, -91,
--90, -90, -90, -89, -89, -88, -88, -87,
--87, -86, -86, -85, -85, -84, -84, -83,
--82, -82, -81, -80, -80, -79, -78, -77,
--76, -76, -75, -74, -73, -72, -71, -70,
--69, -68, -67, -66, -65, -64, -63, -62,
--61, -60, -58, -57, -56, -55, -54, -52,
--51, -50, -48, -47, -46, -44, -43, -41,
--40, -38, -37, -35, -34, -32, -31, -29,
--28, -26, -24, -23, -21, -19, -18, -16,
--14, -13, -11, -9, -7, -6, -4, -2,
-0, 2, 4, 6, 8, 9, 11, 13,
-15, 17, 19, 21, 23, 25, 27, 29,
-31, 33, 36, 38, 40, 42, 44, 46,
-48, 50, 52, 55, 57, 59, 61, 63,
-65, 68, 70, 72, 74, 76, 79, 81,
-83, 85, 87, 90, 92, 94, 96, 99,
-101, 103, 105, 107, 110, 112, 114, 116,
-119, 121, 123, 125, 127, 129, 132, 134,
-136, 138, 140, 142, 145, 147, 149, 151,
-153, 155, 157, 159, 161, 163, 165, 167,
-169, 171, 173, 175, 177, 179, 181, 183,
-185, 187, 188, 190, 192, 194, 195, 197,
-199, 201, 202, 204, 206, 207, 209, 210,
-212, 213, 215, 216, 218, 219, 220, 222,
-223, 224, 226, 227, 228, 229, 230, 231,
-233, 234, 235, 236, 237, 237, 238, 239,
-240, 241, 242, 242, 243, 244, 244, 245,
-245, 246, 246, 247, 247, 247, 248, 248,
-248, 248, 249, 249, 249, 249, 249, 249,
-249, 248, 248, 248, 248, 248, 247, 247,
-246, 246, 245, 245, 244, 244, 243, 242,
-241, 240, 240, 239, 238, 237, 236, 234,
-233, 232, 231, 230, 228, 227, 225, 224,
-222, 221, 219, 218, 216, 214, 212, 211,
-209, 207, 205, 203, 201, 199, 196, 194,
-192, 190, 187, 185, 182, 180, 177, 175,
-172, 170, 167, 164, 161, 159, 156, 153,
-150, 147, 144, 141, 138, 134, 131, 128,
-125, 121, 118, 115, 111, 108, 104, 100,
-97, 93, 90, 86, 82, 78, 74, 71,
-67, 63, 59, 55, 51, 47, 43, 38,
-34, 30, 26, 22, 17, 13, 9, 4,
-0, -4, -9, -13, -18, -22, -27, -31,
--36, -41, -45, -50, -54, -59, -64, -69,
--73, -78, -83, -88, -92, -97, -102, -107,
--112, -116, -121, -126, -131, -136, -141, -146,
--151, -155, -160, -165, -170, -175, -180, -185,
--190, -195, -199, -204, -209, -214, -219, -224,
--229, -234, -238, -243, -248, -253, -258, -262,
--267, -272, -277, -281, -286, -291, -295, -300,
--305, -309, -314, -318, -323, -327, -332, -336,
--340, -345, -349, -353, -358, -362, -366, -370,
--374, -378, -382, -386, -390, -394, -398, -402,
--406, -410, -413, -417, -421, -424, -428, -431,
--435, -438, -441, -445, -448, -451, -454, -457,
--460, -463, -466, -469, -471, -474, -477, -479,
--482, -484, -487, -489, -491, -493, -495, -497,
--499, -501, -503, -505, -507, -508, -510, -511,
--513, -514, -515, -516, -518, -519, -519, -520,
--521, -522, -522, -523, -523, -524, -524, -524,
--525, -525, -525, -524, -524, -524, -524, -523,
--523, -522, -521, -520, -520, -519, -518, -516,
--515, -514, -512, -511, -509, -508, -506, -504,
--502, -500, -498, -496, -493, -491, -488, -486,
--483, -480, -478, -475, -472, -468, -465, -462,
--458, -455, -451, -448, -444, -440, -436, -432,
--428, -424, -419, -415, -411, -406, -401, -397,
--392, -387, -382, -377, -372, -366, -361, -356,
--350, -344, -339, -333, -327, -321, -315, -309,
--303, -297, -290, -284, -278, -271, -264, -258,
--251, -244, -237, -230, -223, -216, -209, -201,
--194, -187, -179, -172, -164, -156, -149, -141,
--133, -125, -117, -109, -101, -93, -85, -76,
--68, -60, -51, -43, -34, -26, -17, -9,
-0, 9, 17, 26, 35, 44, 53, 62,
-71, 80, 89, 98, 107, 116, 125, 135,
-144, 153, 162, 172, 181, 190, 199, 209,
-218, 228, 237, 246, 256, 265, 274, 284,
-293, 303, 312, 321, 331, 340, 349, 359,
-368, 377, 387, 396, 405, 414, 424, 433,
-442, 451, 460, 469, 479, 488, 497, 506,
-514, 523, 532, 541, 550, 558, 567, 576,
-584, 593, 601, 610, 618, 626, 634, 643,
-651, 659, 667, 675, 682, 690, 698, 706,
-713, 721, 728, 735, 742, 750, 757, 764,
-770, 777, 784, 791, 797, 803, 810, 816,
-822, 828, 834, 840, 846, 851, 857, 862,
-867, 872, 877, 882, 887, 892, 896, 901,
-905, 909, 914, 917, 921, 925, 929, 932,
-935, 939, 942, 944, 947, 950, 952, 955,
-957, 959, 961, 963, 964, 966, 967, 969,
-970, 971, 971, 972, 972, 973, 973, 973,
-973, 973, 972, 972, 971, 970, 969, 968,
-966, 965, 963, 961, 959, 957, 955, 952,
-950, 947, 944, 941, 937, 934, 930, 927,
-923, 919, 914, 910, 905, 900, 896, 890,
-885, 880, 874, 869, 863, 857, 850, 844,
-838, 831, 824, 817, 810, 803, 795, 787,
-780, 772, 764, 755, 747, 738, 730, 721,
-712, 702, 693, 684, 674, 664, 654, 644,
-634, 624, 613, 603, 592, 581, 570, 559,
-547, 536, 524, 513, 501, 489, 477, 464,
-452, 440, 427, 414, 401, 388, 375, 362,
-349, 335, 322, 308, 294, 281, 267, 253,
-238, 224, 210, 195, 181, 166, 152, 137,
-122, 107, 92, 77, 62, 46, 31, 15,
-0, -16, -31, -47, -63, -78, -94, -110,
--126, -142, -158, -174, -190, -206, -223, -239,
--255, -271, -288, -304, -320, -337, -353, -370,
--386, -402, -419, -435, -452, -468, -485, -501,
--517, -534, -550, -567, -583, -599, -616, -632,
--648, -664, -680, -697, -713, -729, -745, -761,
--777, -792, -808, -824, -840, -855, -871, -886,
--901, -917, -932, -947, -962, -977, -992, -1007,
--1022, -1036, -1051, -1065, -1079, -1093, -1107, -1121,
--1135, -1149, -1162, -1176, -1189, -1202, -1215, -1228,
--1241, -1254, -1266, -1279, -1291, -1303, -1315, -1327,
--1338, -1350, -1361, -1372, -1383, -1394, -1404, -1415,
--1425, -1435, -1445, -1454, -1464, -1473, -1482, -1491,
--1500, -1508, -1517, -1525, -1533, -1540, -1548, -1555,
--1562, -1569, -1576, -1582, -1588, -1594, -1600, -1605,
--1611, -1616, -1621, -1625, -1630, -1634, -1638, -1641,
--1645, -1648, -1651, -1653, -1656, -1658, -1660, -1662,
--1663, -1664, -1665, -1666, -1666, -1666, -1666, -1666,
--1665, -1665, -1663, -1662, -1660, -1658, -1656, -1654,
--1651, -1648, -1645, -1641, -1637, -1633, -1629, -1624,
--1619, -1614, -1609, -1603, -1597, -1591, -1584, -1577,
--1570, -1563, -1555, -1547, -1539, -1531, -1522, -1513,
--1504, -1494, -1485, -1475, -1464, -1454, -1443, -1432,
--1420, -1409, -1397, -1384, -1372, -1359, -1346, -1333,
--1320, -1306, -1292, -1278, -1263, -1248, -1233, -1218,
--1203, -1187, -1171, -1154, -1138, -1121, -1104, -1087,
--1070, -1052, -1034, -1016, -997, -979, -960, -941,
--922, -902, -883, -863, -842, -822, -802, -781,
--760, -739, -717, -696, -674, -652, -630, -608,
--585, -563, -540, -517, -494, -470, -447, -423,
--400, -376, -351, -327, -303, -278, -254, -229,
--204, -179, -154, -128, -103, -77, -52, -26,
-0, 26, 52, 78, 104, 131, 157, 184,
-210, 237, 263, 290, 317, 344, 371, 398,
-425, 452, 479, 506, 533, 560, 587, 615,
-642, 669, 696, 723, 751, 778, 805, 832,
-859, 886, 913, 940, 967, 994, 1021, 1048,
-1075, 1101, 1128, 1154, 1181, 1207, 1234, 1260,
-1286, 1312, 1338, 1364, 1389, 1415, 1440, 1466,
-1491, 1516, 1541, 1565, 1590, 1615, 1639, 1663,
-1687, 1711, 1734, 1758, 1781, 1804, 1827, 1850,
-1872, 1895, 1917, 1938, 1960, 1982, 2003, 2024,
-2044, 2065, 2085, 2105, 2125, 2144, 2164, 2183,
-2201, 2220, 2238, 2256, 2273, 2291, 2308, 2325,
-2341, 2357, 2373, 2388, 2404, 2419, 2433, 2447,
-2461, 2475, 2488, 2501, 2514, 2526, 2538, 2550,
-2561, 2572, 2582, 2592, 2602, 2611, 2621, 2629,
-2637, 2645, 2653, 2660, 2667, 2673, 2679, 2685,
-2690, 2695, 2699, 2703, 2707, 2710, 2713, 2715,
-2717, 2719, 2720, 2721, 2721, 2721, 2720, 2719,
-2718, 2716, 2714, 2711, 2708, 2705, 2701, 2697,
-2692, 2686, 2681, 2675, 2668, 2661, 2654, 2646,
-2638, 2629, 2620, 2610, 2600, 2589, 2579, 2567,
-2555, 2543, 2530, 2517, 2504, 2490, 2475, 2460,
-2445, 2429, 2413, 2397, 2379, 2362, 2344, 2326,
-2307, 2288, 2268, 2248, 2228, 2207, 2186, 2164,
-2142, 2119, 2096, 2073, 2049, 2025, 2000, 1975,
-1950, 1924, 1898, 1872, 1845, 1817, 1790, 1761,
-1733, 1704, 1675, 1645, 1616, 1585, 1555, 1524,
-1492, 1461, 1429, 1396, 1363, 1330, 1297, 1263,
-1229, 1195, 1160, 1125, 1090, 1055, 1019, 983,
-946, 910, 873, 835, 798, 760, 722, 684,
-645, 607, 568, 528, 489, 449, 409, 369,
-329, 289, 248, 207, 166, 125, 83, 42,
-0, -42, -84, -126, -168, -211, -253, -296,
--339, -382, -425, -468, -511, -554, -598, -641,
--685, -728, -772, -815, -859, -903, -946, -990,
--1034, -1078, -1121, -1165, -1209, -1252, -1296, -1340,
--1383, -1427, -1470, -1514, -1557, -1600, -1643, -1686,
--1729, -1772, -1815, -1857, -1900, -1942, -1984, -2026,
--2068, -2110, -2152, -2193, -2234, -2275, -2316, -2357,
--2397, -2437, -2477, -2517, -2556, -2595, -2634, -2673,
--2712, -2750, -2788, -2825, -2862, -2899, -2936, -2972,
--3008, -3044, -3079, -3114, -3149, -3183, -3217, -3251,
--3284, -3317, -3349, -3381, -3413, -3444, -3475, -3505,
--3535, -3565, -3594, -3623, -3651, -3679, -3706, -3733,
--3759, -3785, -3810, -3835, -3859, -3883, -3906, -3929,
--3951, -3973, -3995, -4015, -4035, -4055, -4074, -4093,
--4110, -4128, -4145, -4161, -4177, -4192, -4206, -4220,
--4233, -4246, -4258, -4269, -4280, -4290, -4300, -4309,
--4317, -4325, -4332, -4339, -4344, -4349, -4354, -4358,
--4361, -4363, -4365, -4367, -4367, -4367, -4366, -4365,
--4362, -4360, -4356, -4352, -4347, -4341, -4335, -4328,
--4320, -4312, -4303, -4293, -4283, -4271, -4260, -4247,
--4234, -4220, -4205, -4190, -4174, -4157, -4139, -4121,
--4102, -4083, -4063, -4042, -4020, -3997, -3974, -3951,
--3926, -3901, -3875, -3848, -3821, -3793, -3765, -3735,
--3705, -3675, -3643, -3611, -3578, -3545, -3511, -3476,
--3441, -3405, -3368, -3330, -3292, -3254, -3214, -3174,
--3134, -3092, -3051, -3008, -2965, -2921, -2877, -2832,
--2786, -2740, -2693, -2646, -2598, -2549, -2500, -2450,
--2400, -2349, -2298, -2246, -2193, -2140, -2087, -2033,
--1978, -1923, -1867, -1811, -1755, -1698, -1640, -1582,
--1524, -1465, -1405, -1345, -1285, -1224, -1163, -1102,
--1040, -977, -915, -851, -788, -724, -660, -595,
--530, -465, -400, -334, -268, -201, -134, -67,
-0, 68, 135, 203, 272, 340, 409, 478,
-547, 616, 686, 755, 825, 895, 965, 1035,
-1106, 1176, 1247, 1317, 1388, 1459, 1530, 1600,
-1671, 1742, 1813, 1884, 1955, 2026, 2097, 2167,
-2238, 2309, 2379, 2450, 2520, 2591, 2661, 2731,
-2801, 2870, 2940, 3009, 3079, 3148, 3216, 3285,
-3353, 3421, 3489, 3557, 3624, 3691, 3758, 3824,
-3890, 3956, 4021, 4086, 4151, 4215, 4279, 4343,
-4406, 4468, 4531, 4592, 4654, 4714, 4775, 4835,
-4894, 4953, 5011, 5069, 5126, 5183, 5239, 5294,
-5349, 5404, 5457, 5511, 5563, 5615, 5666, 5717,
-5766, 5815, 5864, 5912, 5959, 6005, 6051, 6095,
-6139, 6183, 6225, 6267, 6308, 6348, 6387, 6426,
-6464, 6501, 6537, 6572, 6606, 6639, 6672, 6703,
-6734, 6764, 6793, 6821, 6848, 6874, 6899, 6923,
-6947, 6969, 6990, 7010, 7030, 7048, 7065, 7082,
-7097, 7111, 7124, 7136, 7148, 7158, 7167, 7175,
-7181, 7187, 7192, 7196, 7198, 7200, 7200, 7199,
-7197, 7194, 7190, 7185, 7179, 7171, 7162, 7153,
-7142, 7130, 7117, 7102, 7087, 7070, 7052, 7033,
-7013, 6992, 6969, 6946, 6921, 6895, 6868, 6840,
-6810, 6779, 6748, 6715, 6680, 6645, 6609, 6571,
-6532, 6492, 6451, 6408, 6365, 6320, 6274, 6227,
-6179, 6130, 6079, 6028, 5975, 5921, 5866, 5809,
-5752, 5693, 5634, 5573, 5511, 5448, 5384, 5318,
-5252, 5185, 5116, 5046, 4976, 4904, 4831, 4757,
-4682, 4606, 4529, 4451, 4371, 4291, 4210, 4128,
-4044, 3960, 3875, 3789, 3701, 3613, 3524, 3434,
-3343, 3251, 3158, 3064, 2970, 2874, 2778, 2681,
-2582, 2483, 2384, 2283, 2182, 2079, 1976, 1872,
-1768, 1662, 1556, 1449, 1342, 1234, 1125, 1015,
-905, 794, 682, 570, 457, 344, 230, 115,
-0, -116, -232, -349, -466, -584, -702, -821,
--940, -1059, -1179, -1299, -1420, -1541, -1663, -1784,
--1907, -2029, -2152, -2274, -2398, -2521, -2645, -2769,
--2893, -3017, -3141, -3265, -3390, -3515, -3639, -3764,
--3889, -4014, -4139, -4263, -4388, -4513, -4638, -4762,
--4887, -5011, -5135, -5259, -5383, -5507, -5630, -5753,
--5876, -5999, -6121, -6243, -6365, -6486, -6607, -6728,
--6848, -6968, -7087, -7206, -7324, -7442, -7559, -7676,
--7792, -7907, -8022, -8136, -8250, -8363, -8475, -8587,
--8697, -8808, -8917, -9025, -9133, -9240, -9346, -9451,
--9555, -9658, -9761, -9862, -9963, -10062, -10161, -10258,
--10354, -10450, -10544, -10637, -10729, -10820, -10909, -10998,
--11085, -11171, -11256, -11340, -11422, -11503, -11583, -11661,
--11738, -11813, -11888, -11960, -12032, -12102, -12170, -12237,
--12302, -12366, -12429, -12490, -12549, -12607, -12663, -12717,
--12770, -12821, -12870, -12918, -12964, -13009, -13051, -13092,
--13131, -13168, -13204, -13238, -13269, -13299, -13327, -13354,
--13378, -13400, -13421, -13439, -13456, -13471, -13483, -13494,
--13503, -13509, -13514, -13516, -13517, -13515, -13512, -13506,
--13498, -13488, -13476, -13462, -13445, -13427, -13406, -13383,
--13358, -13330, -13301, -13269, -13235, -13198, -13160, -13119,
--13076, -13031, -12983, -12933, -12881, -12826, -12769, -12710,
--12648, -12584, -12518, -12449, -12378, -12305, -12229, -12151,
--12071, -11988, -11902, -11815, -11725, -11632, -11537, -11440,
--11340, -11238, -11134, -11027, -10917, -10806, -10691, -10575,
--10455, -10334, -10210, -10084, -9955, -9824, -9690, -9554,
--9415, -9274, -9131, -8985, -8837, -8686, -8533, -8378,
--8220, -8060, -7897, -7732, -7564, -7394, -7222, -7048,
--6871, -6691, -6509, -6325, -6139, -5950, -5759, -5566,
--5370, -5172, -4971, -4769, -4564, -4357, -4147, -3935,
--3721, -3505, -3287, -3066, -2843, -2618, -2391, -2161,
--1929, -1696, -1460, -1222, -982, -739, -495, -248,
-0, 251, 503, 758, 1014, 1273, 1533, 1796,
-2061, 2327, 2595, 2866, 3138, 3412, 3688, 3965,
-4245, 4526, 4809, 5094, 5380, 5669, 5959, 6250,
-6544, 6839, 7135, 7434, 7733, 8035, 8338, 8642,
-8948, 9255, 9564, 9875, 10186, 10499, 10814, 11130,
-11447, 11765, 12085, 12406, 12728, 13052, 13376, 13702,
-14029, 14357, 14686, 15016, 15348, 15680, 16013, 16347,
-16682, 17018, 17355, 17693, 18031, 18371, 18711, 19052,
-19394, 19736, 20079, 20423, 20767, 21112, 21457, 21803,
-22150, 22497, 22844, 23192, 23540, 23889, 24238, 24587,
-24937, 25286, 25636, 25987, 26337, 26688, 27038, 27389,
-27740, 28090, 28441, 28792, 29143, 29493, 29844, 30194,
-30544, 30894, 31244, 31593, 31943, 32291, 32640, 32988,
-33336, 33683, 34029, 34376, 34721, 35067, 35411, 35755,
-36098, 36441, 36783, 37124, 37464, 37804, 38142, 38480,
-38817, 39153, 39488, 39822, 40155, 40487, 40818, 41148,
-41477, 41805, 42131, 42456, 42780, 43103, 43424, 43744,
-44063, 44381, 44697, 45011, 45324, 45636, 45946, 46254,
-46561, 46866, 47170, 47472, 47772, 48071, 48368, 48663,
-48956, 49248, 49537, 49825, 50111, 50395, 50677, 50957,
-51235, 51511, 51785, 52057, 52326, 52594, 52859, 53123,
-53384, 53643, 53899, 54154, 54406, 54656, 54903, 55148,
-55391, 55631, 55869, 56104, 56337, 56568, 56796, 57021,
-57244, 57464, 57682, 57897, 58109, 58319, 58526, 58730,
-58932, 59131, 59327, 59521, 59711, 59899, 60084, 60266,
-60446, 60622, 60796, 60966, 61134, 61299, 61461, 61620,
-61775, 61928, 62078, 62225, 62369, 62510, 62647, 62782,
-62914, 63042, 63167, 63290, 63409, 63525, 63638, 63747,
-63854, 63957, 64057, 64154, 64247, 64338, 64425, 64509,
-64589, 64667, 64741, 64812, 64880, 64944, 65005, 65063,
-65117, 65168, 65216, 65261, 65302, 65340, 65374, 65405,
-65433, 65458, 65479, 65497, 65511, 65523, 65530, 65535,
-65536, 65535, 65530, 65523, 65511, 65497, 65479, 65458,
-65433, 65405, 65374, 65340, 65302, 65261, 65216, 65168,
-65117, 65063, 65005, 64944, 64880, 64812, 64741, 64667,
-64589, 64509, 64425, 64338, 64247, 64154, 64057, 63957,
-63854, 63747, 63638, 63525, 63409, 63290, 63167, 63042,
-62914, 62782, 62647, 62510, 62369, 62225, 62078, 61928,
-61775, 61620, 61461, 61299, 61134, 60966, 60796, 60622,
-60446, 60266, 60084, 59899, 59711, 59521, 59327, 59131,
-58932, 58730, 58526, 58319, 58109, 57897, 57682, 57464,
-57244, 57021, 56796, 56568, 56337, 56104, 55869, 55631,
-55391, 55148, 54903, 54656, 54406, 54154, 53899, 53643,
-53384, 53123, 52859, 52594, 52326, 52057, 51785, 51511,
-51235, 50957, 50677, 50395, 50111, 49825, 49537, 49248,
-48956, 48663, 48368, 48071, 47772, 47472, 47170, 46866,
-46561, 46254, 45946, 45636, 45324, 45011, 44697, 44381,
-44063, 43744, 43424, 43103, 42780, 42456, 42131, 41805,
-41477, 41148, 40818, 40487, 40155, 39822, 39488, 39153,
-38817, 38480, 38142, 37804, 37464, 37124, 36783, 36441,
-36098, 35755, 35411, 35067, 34721, 34376, 34029, 33683,
-33336, 32988, 32640, 32291, 31943, 31593, 31244, 30894,
-30544, 30194, 29844, 29493, 29143, 28792, 28441, 28090,
-27740, 27389, 27038, 26688, 26337, 25987, 25636, 25286,
-24937, 24587, 24238, 23889, 23540, 23192, 22844, 22497,
-22150, 21803, 21457, 21112, 20767, 20423, 20079, 19736,
-19394, 19052, 18711, 18371, 18031, 17693, 17355, 17018,
-16682, 16347, 16013, 15680, 15348, 15016, 14686, 14357,
-14029, 13702, 13376, 13052, 12728, 12406, 12085, 11765,
-11447, 11130, 10814, 10499, 10186, 9875, 9564, 9255,
-8948, 8642, 8338, 8035, 7733, 7434, 7135, 6839,
-6544, 6250, 5959, 5669, 5380, 5094, 4809, 4526,
-4245, 3965, 3688, 3412, 3138, 2866, 2595, 2327,
-2061, 1796, 1533, 1273, 1014, 758, 503, 251,
-0, -248, -495, -739, -982, -1222, -1460, -1696,
--1929, -2161, -2391, -2618, -2843, -3066, -3287, -3505,
--3721, -3935, -4147, -4357, -4564, -4769, -4971, -5172,
--5370, -5566, -5759, -5950, -6139, -6325, -6509, -6691,
--6871, -7048, -7222, -7394, -7564, -7732, -7897, -8060,
--8220, -8378, -8533, -8686, -8837, -8985, -9131, -9274,
--9415, -9554, -9690, -9824, -9955, -10084, -10210, -10334,
--10455, -10575, -10691, -10806, -10917, -11027, -11134, -11238,
--11340, -11440, -11537, -11632, -11725, -11815, -11902, -11988,
--12071, -12151, -12229, -12305, -12378, -12449, -12518, -12584,
--12648, -12710, -12769, -12826, -12881, -12933, -12983, -13031,
--13076, -13119, -13160, -13198, -13235, -13269, -13301, -13330,
--13358, -13383, -13406, -13427, -13445, -13462, -13476, -13488,
--13498, -13506, -13512, -13515, -13517, -13516, -13514, -13509,
--13503, -13494, -13483, -13471, -13456, -13439, -13421, -13400,
--13378, -13354, -13327, -13299, -13269, -13238, -13204, -13168,
--13131, -13092, -13051, -13009, -12964, -12918, -12870, -12821,
--12770, -12717, -12663, -12607, -12549, -12490, -12429, -12366,
--12302, -12237, -12170, -12102, -12032, -11960, -11888, -11813,
--11738, -11661, -11583, -11503, -11422, -11340, -11256, -11171,
--11085, -10998, -10909, -10820, -10729, -10637, -10544, -10450,
--10354, -10258, -10161, -10062, -9963, -9862, -9761, -9658,
--9555, -9451, -9346, -9240, -9133, -9025, -8917, -8808,
--8697, -8587, -8475, -8363, -8250, -8136, -8022, -7907,
--7792, -7676, -7559, -7442, -7324, -7206, -7087, -6968,
--6848, -6728, -6607, -6486, -6365, -6243, -6121, -5999,
--5876, -5753, -5630, -5507, -5383, -5259, -5135, -5011,
--4887, -4762, -4638, -4513, -4388, -4263, -4139, -4014,
--3889, -3764, -3639, -3515, -3390, -3265, -3141, -3017,
--2893, -2769, -2645, -2521, -2398, -2274, -2152, -2029,
--1907, -1784, -1663, -1541, -1420, -1299, -1179, -1059,
--940, -821, -702, -584, -466, -349, -232, -116,
-0, 115, 230, 344, 457, 570, 682, 794,
-905, 1015, 1125, 1234, 1342, 1449, 1556, 1662,
-1768, 1872, 1976, 2079, 2182, 2283, 2384, 2483,
-2582, 2681, 2778, 2874, 2970, 3064, 3158, 3251,
-3343, 3434, 3524, 3613, 3701, 3789, 3875, 3960,
-4044, 4128, 4210, 4291, 4371, 4451, 4529, 4606,
-4682, 4757, 4831, 4904, 4976, 5046, 5116, 5185,
-5252, 5318, 5384, 5448, 5511, 5573, 5634, 5693,
-5752, 5809, 5866, 5921, 5975, 6028, 6079, 6130,
-6179, 6227, 6274, 6320, 6365, 6408, 6451, 6492,
-6532, 6571, 6609, 6645, 6680, 6715, 6748, 6779,
-6810, 6840, 6868, 6895, 6921, 6946, 6969, 6992,
-7013, 7033, 7052, 7070, 7087, 7102, 7117, 7130,
-7142, 7153, 7162, 7171, 7179, 7185, 7190, 7194,
-7197, 7199, 7200, 7200, 7198, 7196, 7192, 7187,
-7181, 7175, 7167, 7158, 7148, 7136, 7124, 7111,
-7097, 7082, 7065, 7048, 7030, 7010, 6990, 6969,
-6947, 6923, 6899, 6874, 6848, 6821, 6793, 6764,
-6734, 6703, 6672, 6639, 6606, 6572, 6537, 6501,
-6464, 6426, 6387, 6348, 6308, 6267, 6225, 6183,
-6139, 6095, 6051, 6005, 5959, 5912, 5864, 5815,
-5766, 5717, 5666, 5615, 5563, 5511, 5457, 5404,
-5349, 5294, 5239, 5183, 5126, 5069, 5011, 4953,
-4894, 4835, 4775, 4714, 4654, 4592, 4531, 4468,
-4406, 4343, 4279, 4215, 4151, 4086, 4021, 3956,
-3890, 3824, 3758, 3691, 3624, 3557, 3489, 3421,
-3353, 3285, 3216, 3148, 3079, 3009, 2940, 2870,
-2801, 2731, 2661, 2591, 2520, 2450, 2379, 2309,
-2238, 2167, 2097, 2026, 1955, 1884, 1813, 1742,
-1671, 1600, 1530, 1459, 1388, 1317, 1247, 1176,
-1106, 1035, 965, 895, 825, 755, 686, 616,
-547, 478, 409, 340, 272, 203, 135, 68,
-0, -67, -134, -201, -268, -334, -400, -465,
--530, -595, -660, -724, -788, -851, -915, -977,
--1040, -1102, -1163, -1224, -1285, -1345, -1405, -1465,
--1524, -1582, -1640, -1698, -1755, -1811, -1867, -1923,
--1978, -2033, -2087, -2140, -2193, -2246, -2298, -2349,
--2400, -2450, -2500, -2549, -2598, -2646, -2693, -2740,
--2786, -2832, -2877, -2921, -2965, -3008, -3051, -3092,
--3134, -3174, -3214, -3254, -3292, -3330, -3368, -3405,
--3441, -3476, -3511, -3545, -3578, -3611, -3643, -3675,
--3705, -3735, -3765, -3793, -3821, -3848, -3875, -3901,
--3926, -3951, -3974, -3997, -4020, -4042, -4063, -4083,
--4102, -4121, -4139, -4157, -4174, -4190, -4205, -4220,
--4234, -4247, -4260, -4271, -4283, -4293, -4303, -4312,
--4320, -4328, -4335, -4341, -4347, -4352, -4356, -4360,
--4362, -4365, -4366, -4367, -4367, -4367, -4365, -4363,
--4361, -4358, -4354, -4349, -4344, -4339, -4332, -4325,
--4317, -4309, -4300, -4290, -4280, -4269, -4258, -4246,
--4233, -4220, -4206, -4192, -4177, -4161, -4145, -4128,
--4110, -4093, -4074, -4055, -4035, -4015, -3995, -3973,
--3951, -3929, -3906, -3883, -3859, -3835, -3810, -3785,
--3759, -3733, -3706, -3679, -3651, -3623, -3594, -3565,
--3535, -3505, -3475, -3444, -3413, -3381, -3349, -3317,
--3284, -3251, -3217, -3183, -3149, -3114, -3079, -3044,
--3008, -2972, -2936, -2899, -2862, -2825, -2788, -2750,
--2712, -2673, -2634, -2595, -2556, -2517, -2477, -2437,
--2397, -2357, -2316, -2275, -2234, -2193, -2152, -2110,
--2068, -2026, -1984, -1942, -1900, -1857, -1815, -1772,
--1729, -1686, -1643, -1600, -1557, -1514, -1470, -1427,
--1383, -1340, -1296, -1252, -1209, -1165, -1121, -1078,
--1034, -990, -946, -903, -859, -815, -772, -728,
--685, -641, -598, -554, -511, -468, -425, -382,
--339, -296, -253, -211, -168, -126, -84, -42,
-0, 42, 83, 125, 166, 207, 248, 289,
-329, 369, 409, 449, 489, 528, 568, 607,
-645, 684, 722, 760, 798, 835, 873, 910,
-946, 983, 1019, 1055, 1090, 1125, 1160, 1195,
-1229, 1263, 1297, 1330, 1363, 1396, 1429, 1461,
-1492, 1524, 1555, 1585, 1616, 1645, 1675, 1704,
-1733, 1761, 1790, 1817, 1845, 1872, 1898, 1924,
-1950, 1975, 2000, 2025, 2049, 2073, 2096, 2119,
-2142, 2164, 2186, 2207, 2228, 2248, 2268, 2288,
-2307, 2326, 2344, 2362, 2379, 2397, 2413, 2429,
-2445, 2460, 2475, 2490, 2504, 2517, 2530, 2543,
-2555, 2567, 2579, 2589, 2600, 2610, 2620, 2629,
-2638, 2646, 2654, 2661, 2668, 2675, 2681, 2686,
-2692, 2697, 2701, 2705, 2708, 2711, 2714, 2716,
-2718, 2719, 2720, 2721, 2721, 2721, 2720, 2719,
-2717, 2715, 2713, 2710, 2707, 2703, 2699, 2695,
-2690, 2685, 2679, 2673, 2667, 2660, 2653, 2645,
-2637, 2629, 2621, 2611, 2602, 2592, 2582, 2572,
-2561, 2550, 2538, 2526, 2514, 2501, 2488, 2475,
-2461, 2447, 2433, 2419, 2404, 2388, 2373, 2357,
-2341, 2325, 2308, 2291, 2273, 2256, 2238, 2220,
-2201, 2183, 2164, 2144, 2125, 2105, 2085, 2065,
-2044, 2024, 2003, 1982, 1960, 1938, 1917, 1895,
-1872, 1850, 1827, 1804, 1781, 1758, 1734, 1711,
-1687, 1663, 1639, 1615, 1590, 1565, 1541, 1516,
-1491, 1466, 1440, 1415, 1389, 1364, 1338, 1312,
-1286, 1260, 1234, 1207, 1181, 1154, 1128, 1101,
-1075, 1048, 1021, 994, 967, 940, 913, 886,
-859, 832, 805, 778, 751, 723, 696, 669,
-642, 615, 587, 560, 533, 506, 479, 452,
-425, 398, 371, 344, 317, 290, 263, 237,
-210, 184, 157, 131, 104, 78, 52, 26,
-0, -26, -52, -77, -103, -128, -154, -179,
--204, -229, -254, -278, -303, -327, -351, -376,
--400, -423, -447, -470, -494, -517, -540, -563,
--585, -608, -630, -652, -674, -696, -717, -739,
--760, -781, -802, -822, -842, -863, -883, -902,
--922, -941, -960, -979, -997, -1016, -1034, -1052,
--1070, -1087, -1104, -1121, -1138, -1154, -1171, -1187,
--1203, -1218, -1233, -1248, -1263, -1278, -1292, -1306,
--1320, -1333, -1346, -1359, -1372, -1384, -1397, -1409,
--1420, -1432, -1443, -1454, -1464, -1475, -1485, -1494,
--1504, -1513, -1522, -1531, -1539, -1547, -1555, -1563,
--1570, -1577, -1584, -1591, -1597, -1603, -1609, -1614,
--1619, -1624, -1629, -1633, -1637, -1641, -1645, -1648,
--1651, -1654, -1656, -1658, -1660, -1662, -1663, -1665,
--1665, -1666, -1666, -1666, -1666, -1666, -1665, -1664,
--1663, -1662, -1660, -1658, -1656, -1653, -1651, -1648,
--1645, -1641, -1638, -1634, -1630, -1625, -1621, -1616,
--1611, -1605, -1600, -1594, -1588, -1582, -1576, -1569,
--1562, -1555, -1548, -1540, -1533, -1525, -1517, -1508,
--1500, -1491, -1482, -1473, -1464, -1454, -1445, -1435,
--1425, -1415, -1404, -1394, -1383, -1372, -1361, -1350,
--1338, -1327, -1315, -1303, -1291, -1279, -1266, -1254,
--1241, -1228, -1215, -1202, -1189, -1176, -1162, -1149,
--1135, -1121, -1107, -1093, -1079, -1065, -1051, -1036,
--1022, -1007, -992, -977, -962, -947, -932, -917,
--901, -886, -871, -855, -840, -824, -808, -792,
--777, -761, -745, -729, -713, -697, -680, -664,
--648, -632, -616, -599, -583, -567, -550, -534,
--517, -501, -485, -468, -452, -435, -419, -402,
--386, -370, -353, -337, -320, -304, -288, -271,
--255, -239, -223, -206, -190, -174, -158, -142,
--126, -110, -94, -78, -63, -47, -31, -16,
-0, 15, 31, 46, 62, 77, 92, 107,
-122, 137, 152, 166, 181, 195, 210, 224,
-238, 253, 267, 281, 294, 308, 322, 335,
-349, 362, 375, 388, 401, 414, 427, 440,
-452, 464, 477, 489, 501, 513, 524, 536,
-547, 559, 570, 581, 592, 603, 613, 624,
-634, 644, 654, 664, 674, 684, 693, 702,
-712, 721, 730, 738, 747, 755, 764, 772,
-780, 787, 795, 803, 810, 817, 824, 831,
-838, 844, 850, 857, 863, 869, 874, 880,
-885, 890, 896, 900, 905, 910, 914, 919,
-923, 927, 930, 934, 937, 941, 944, 947,
-950, 952, 955, 957, 959, 961, 963, 965,
-966, 968, 969, 970, 971, 972, 972, 973,
-973, 973, 973, 973, 972, 972, 971, 971,
-970, 969, 967, 966, 964, 963, 961, 959,
-957, 955, 952, 950, 947, 944, 942, 939,
-935, 932, 929, 925, 921, 917, 914, 909,
-905, 901, 896, 892, 887, 882, 877, 872,
-867, 862, 857, 851, 846, 840, 834, 828,
-822, 816, 810, 803, 797, 791, 784, 777,
-770, 764, 757, 750, 742, 735, 728, 721,
-713, 706, 698, 690, 682, 675, 667, 659,
-651, 643, 634, 626, 618, 610, 601, 593,
-584, 576, 567, 558, 550, 541, 532, 523,
-514, 506, 497, 488, 479, 469, 460, 451,
-442, 433, 424, 414, 405, 396, 387, 377,
-368, 359, 349, 340, 331, 321, 312, 303,
-293, 284, 274, 265, 256, 246, 237, 228,
-218, 209, 199, 190, 181, 172, 162, 153,
-144, 135, 125, 116, 107, 98, 89, 80,
-71, 62, 53, 44, 35, 26, 17, 9,
-0, -9, -17, -26, -34, -43, -51, -60,
--68, -76, -85, -93, -101, -109, -117, -125,
--133, -141, -149, -156, -164, -172, -179, -187,
--194, -201, -209, -216, -223, -230, -237, -244,
--251, -258, -264, -271, -278, -284, -290, -297,
--303, -309, -315, -321, -327, -333, -339, -344,
--350, -356, -361, -366, -372, -377, -382, -387,
--392, -397, -401, -406, -411, -415, -419, -424,
--428, -432, -436, -440, -444, -448, -451, -455,
--458, -462, -465, -468, -472, -475, -478, -480,
--483, -486, -488, -491, -493, -496, -498, -500,
--502, -504, -506, -508, -509, -511, -512, -514,
--515, -516, -518, -519, -520, -520, -521, -522,
--523, -523, -524, -524, -524, -524, -525, -525,
--525, -524, -524, -524, -523, -523, -522, -522,
--521, -520, -519, -519, -518, -516, -515, -514,
--513, -511, -510, -508, -507, -505, -503, -501,
--499, -497, -495, -493, -491, -489, -487, -484,
--482, -479, -477, -474, -471, -469, -466, -463,
--460, -457, -454, -451, -448, -445, -441, -438,
--435, -431, -428, -424, -421, -417, -413, -410,
--406, -402, -398, -394, -390, -386, -382, -378,
--374, -370, -366, -362, -358, -353, -349, -345,
--340, -336, -332, -327, -323, -318, -314, -309,
--305, -300, -295, -291, -286, -281, -277, -272,
--267, -262, -258, -253, -248, -243, -238, -234,
--229, -224, -219, -214, -209, -204, -199, -195,
--190, -185, -180, -175, -170, -165, -160, -155,
--151, -146, -141, -136, -131, -126, -121, -116,
--112, -107, -102, -97, -92, -88, -83, -78,
--73, -69, -64, -59, -54, -50, -45, -41,
--36, -31, -27, -22, -18, -13, -9, -4,
-0, 4, 9, 13, 17, 22, 26, 30,
-34, 38, 43, 47, 51, 55, 59, 63,
-67, 71, 74, 78, 82, 86, 90, 93,
-97, 100, 104, 108, 111, 115, 118, 121,
-125, 128, 131, 134, 138, 141, 144, 147,
-150, 153, 156, 159, 161, 164, 167, 170,
-172, 175, 177, 180, 182, 185, 187, 190,
-192, 194, 196, 199, 201, 203, 205, 207,
-209, 211, 212, 214, 216, 218, 219, 221,
-222, 224, 225, 227, 228, 230, 231, 232,
-233, 234, 236, 237, 238, 239, 240, 240,
-241, 242, 243, 244, 244, 245, 245, 246,
-246, 247, 247, 248, 248, 248, 248, 248,
-249, 249, 249, 249, 249, 249, 249, 248,
-248, 248, 248, 247, 247, 247, 246, 246,
-245, 245, 244, 244, 243, 242, 242, 241,
-240, 239, 238, 237, 237, 236, 235, 234,
-233, 231, 230, 229, 228, 227, 226, 224,
-223, 222, 220, 219, 218, 216, 215, 213,
-212, 210, 209, 207, 206, 204, 202, 201,
-199, 197, 195, 194, 192, 190, 188, 187,
-185, 183, 181, 179, 177, 175, 173, 171,
-169, 167, 165, 163, 161, 159, 157, 155,
-153, 151, 149, 147, 145, 142, 140, 138,
-136, 134, 132, 129, 127, 125, 123, 121,
-119, 116, 114, 112, 110, 107, 105, 103,
-101, 99, 96, 94, 92, 90, 87, 85,
-83, 81, 79, 76, 74, 72, 70, 68,
-65, 63, 61, 59, 57, 55, 52, 50,
-48, 46, 44, 42, 40, 38, 36, 33,
-31, 29, 27, 25, 23, 21, 19, 17,
-15, 13, 11, 9, 8, 6, 4, 2,
-0, -2, -4, -6, -7, -9, -11, -13,
--14, -16, -18, -19, -21, -23, -24, -26,
--28, -29, -31, -32, -34, -35, -37, -38,
--40, -41, -43, -44, -46, -47, -48, -50,
--51, -52, -54, -55, -56, -57, -58, -60,
--61, -62, -63, -64, -65, -66, -67, -68,
--69, -70, -71, -72, -73, -74, -75, -76,
--76, -77, -78, -79, -80, -80, -81, -82,
--82, -83, -84, -84, -85, -85, -86, -86,
--87, -87, -88, -88, -89, -89, -90, -90,
--90, -91, -91, -91, -92, -92, -92, -92,
--92, -93, -93, -93, -93, -93, -93, -93,
--93, -93, -94, -94, -94, -93, -93, -93,
--93, -93, -93, -93, -93, -93, -93, -92,
--92, -92, -92, -91, -91, -91, -91, -90,
--90, -90, -89, -89, -89, -88, -88, -88,
--87, -87, -86, -86, -85, -85, -84, -84,
--83, -83, -82, -82, -81, -81, -80, -80,
--79, -78, -78, -77, -77, -76, -75, -75,
--74, -73, -73, -72, -71, -71, -70, -69,
--69, -68, -67, -67, -66, -65, -64, -64,
--63, -62, -61, -61, -60, -59, -58, -58,
--57, -56, -55, -54, -54, -53, -52, -51,
--51, -50, -49, -48, -47, -47, -46, -45,
--44, -43, -43, -42, -41, -40, -40, -39,
--38, -37, -36, -36, -35, -34, -33, -33,
--32, -31, -30, -29, -29, -28, -27, -26,
--26, -25, -24, -24, -23, -22, -21, -21,
--20, -19, -19, -18, -17, -16, -16, -15,
--14, -14, -13, -12, -12, -11, -10, -10,
--9, -9, -8, -7, -7, -6, -6, -5,
--4, -4, -3, -3, -2, -2, -1, -1, 0,
-};
-
-/* The table used in up sampling */
-int32_t _amsrc2tables[5397] = {
-0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 0, 65536, 0, 0,
-0, 0, 0, 0, 0, 0, 0,
-0, -1, 2, -4, 9, -16, 26,
--42, 68, -116, 251, 65535, -248, 115,
--67, 42, -26, 15, -9, 4, -2,
-0, -1, 4, -9, 17, -31, 52,
--84, 135, -232, 503, 65530, -495, 230,
--134, 83, -52, 31, -17, 9, -4,
-0, -2, 6, -13, 26, -47, 78,
--126, 203, -349, 758, 65523, -739, 344,
--201, 125, -77, 46, -26, 13, -6,
-0, -2, 8, -18, 35, -63, 104,
--168, 272, -466, 1014, 65511, -982, 457,
--268, 166, -103, 62, -34, 17, -7,
-0, -3, 9, -22, 44, -78, 131,
--211, 340, -584, 1273, 65497, -1222, 570,
--334, 207, -128, 77, -43, 22, -9,
-0, -3, 11, -27, 53, -94, 157,
--253, 409, -702, 1533, 65479, -1460, 682,
--400, 248, -154, 92, -51, 26, -11,
-0, -4, 13, -31, 62, -110, 184,
--296, 478, -821, 1796, 65458, -1696, 794,
--465, 289, -179, 107, -60, 30, -13,
-0, -4, 15, -36, 71, -126, 210,
--339, 547, -940, 2061, 65433, -1929, 905,
--530, 329, -204, 122, -68, 34, -14,
-0, -5, 17, -41, 80, -142, 237,
--382, 616, -1059, 2327, 65405, -2161, 1015,
--595, 369, -229, 137, -76, 38, -16,
-0, -6, 19, -45, 89, -158, 263,
--425, 686, -1179, 2595, 65374, -2391, 1125,
--660, 409, -254, 152, -85, 43, -18,
-0, -6, 21, -50, 98, -174, 290,
--468, 755, -1299, 2866, 65340, -2618, 1234,
--724, 449, -278, 166, -93, 47, -19,
-0, -7, 23, -54, 107, -190, 317,
--511, 825, -1420, 3138, 65302, -2843, 1342,
--788, 489, -303, 181, -101, 51, -21,
-0, -7, 25, -59, 116, -206, 344,
--554, 895, -1541, 3412, 65261, -3066, 1449,
--851, 528, -327, 195, -109, 55, -23,
-0, -8, 27, -64, 125, -223, 371,
--598, 965, -1663, 3688, 65216, -3287, 1556,
--915, 568, -351, 210, -117, 59, -24,
-0, -9, 29, -69, 135, -239, 398,
--641, 1035, -1784, 3965, 65168, -3505, 1662,
--977, 607, -376, 224, -125, 63, -26,
-0, -9, 31, -73, 144, -255, 425,
--685, 1106, -1907, 4245, 65117, -3721, 1768,
--1040, 645, -400, 238, -133, 67, -28,
-0, -10, 33, -78, 153, -271, 452,
--728, 1176, -2029, 4526, 65063, -3935, 1872,
--1102, 684, -423, 253, -141, 71, -29,
-0, -10, 36, -83, 162, -288, 479,
--772, 1247, -2152, 4809, 65005, -4147, 1976,
--1163, 722, -447, 267, -149, 74, -31,
-0, -11, 38, -88, 172, -304, 506,
--815, 1317, -2274, 5094, 64944, -4357, 2079,
--1224, 760, -470, 281, -156, 78, -32,
-0, -12, 40, -92, 181, -320, 533,
--859, 1388, -2398, 5380, 64880, -4564, 2182,
--1285, 798, -494, 294, -164, 82, -34,
-0, -12, 42, -97, 190, -337, 560,
--903, 1459, -2521, 5669, 64812, -4769, 2283,
--1345, 835, -517, 308, -172, 86, -35,
-0, -13, 44, -102, 199, -353, 587,
--946, 1530, -2645, 5959, 64741, -4971, 2384,
--1405, 873, -540, 322, -179, 90, -37,
-0, -14, 46, -107, 209, -370, 615,
--990, 1600, -2769, 6250, 64667, -5172, 2483,
--1465, 910, -563, 335, -187, 93, -38,
-0, -14, 48, -112, 218, -386, 642,
--1034, 1671, -2893, 6544, 64589, -5370, 2582,
--1524, 946, -585, 349, -194, 97, -40,
-0, -15, 50, -116, 228, -402, 669,
--1078, 1742, -3017, 6839, 64509, -5566, 2681,
--1582, 983, -608, 362, -201, 100, -41,
-0, -16, 52, -121, 237, -419, 696,
--1121, 1813, -3141, 7135, 64425, -5759, 2778,
--1640, 1019, -630, 375, -209, 104, -43,
-0, -16, 55, -126, 246, -435, 723,
--1165, 1884, -3265, 7434, 64338, -5950, 2874,
--1698, 1055, -652, 388, -216, 108, -44,
-0, -17, 57, -131, 256, -452, 751,
--1209, 1955, -3390, 7733, 64247, -6139, 2970,
--1755, 1090, -674, 401, -223, 111, -46,
-0, -18, 59, -136, 265, -468, 778,
--1252, 2026, -3515, 8035, 64154, -6325, 3064,
--1811, 1125, -696, 414, -230, 115, -47,
-0, -19, 61, -141, 274, -485, 805,
--1296, 2097, -3639, 8338, 64057, -6509, 3158,
--1867, 1160, -717, 427, -237, 118, -48,
-0, -19, 63, -146, 284, -501, 832,
--1340, 2167, -3764, 8642, 63957, -6691, 3251,
--1923, 1195, -739, 440, -244, 121, -50,
-0, -20, 65, -151, 293, -517, 859,
--1383, 2238, -3889, 8948, 63854, -6871, 3343,
--1978, 1229, -760, 452, -251, 125, -51,
-0, -21, 68, -155, 303, -534, 886,
--1427, 2309, -4014, 9255, 63747, -7048, 3434,
--2033, 1263, -781, 464, -258, 128, -52,
-0, -21, 70, -160, 312, -550, 913,
--1470, 2379, -4139, 9564, 63638, -7222, 3524,
--2087, 1297, -802, 477, -264, 131, -54,
-0, -22, 72, -165, 321, -567, 940,
--1514, 2450, -4263, 9875, 63525, -7394, 3613,
--2140, 1330, -822, 489, -271, 134, -55,
-0, -23, 74, -170, 331, -583, 967,
--1557, 2520, -4388, 10186, 63409, -7564, 3701,
--2193, 1363, -842, 501, -278, 138, -56,
-0, -24, 76, -175, 340, -599, 994,
--1600, 2591, -4513, 10499, 63290, -7732, 3789,
--2246, 1396, -863, 513, -284, 141, -57,
-0, -24, 79, -180, 349, -616, 1021,
--1643, 2661, -4638, 10814, 63167, -7897, 3875,
--2298, 1429, -883, 524, -290, 144, -58,
-0, -25, 81, -185, 359, -632, 1048,
--1686, 2731, -4762, 11130, 63042, -8060, 3960,
--2349, 1461, -902, 536, -297, 147, -60,
-0, -26, 83, -190, 368, -648, 1075,
--1729, 2801, -4887, 11447, 62914, -8220, 4044,
--2400, 1492, -922, 547, -303, 150, -61,
-0, -26, 85, -195, 377, -664, 1101,
--1772, 2870, -5011, 11765, 62782, -8378, 4128,
--2450, 1524, -941, 559, -309, 153, -62,
-0, -27, 87, -199, 387, -680, 1128,
--1815, 2940, -5135, 12085, 62647, -8533, 4210,
--2500, 1555, -960, 570, -315, 156, -63,
-0, -28, 90, -204, 396, -697, 1154,
--1857, 3009, -5259, 12406, 62510, -8686, 4291,
--2549, 1585, -979, 581, -321, 159, -64,
-0, -29, 92, -209, 405, -713, 1181,
--1900, 3079, -5383, 12728, 62369, -8837, 4371,
--2598, 1616, -997, 592, -327, 161, -65,
-0, -29, 94, -214, 414, -729, 1207,
--1942, 3148, -5507, 13052, 62225, -8985, 4451,
--2646, 1645, -1016, 603, -333, 164, -66,
-0, -30, 96, -219, 424, -745, 1234,
--1984, 3216, -5630, 13376, 62078, -9131, 4529,
--2693, 1675, -1034, 613, -339, 167, -67,
-0, -31, 99, -224, 433, -761, 1260,
--2026, 3285, -5753, 13702, 61928, -9274, 4606,
--2740, 1704, -1052, 624, -344, 170, -68,
-0, -32, 101, -229, 442, -777, 1286,
--2068, 3353, -5876, 14029, 61775, -9415, 4682,
--2786, 1733, -1070, 634, -350, 172, -69,
-0, -33, 103, -234, 451, -792, 1312,
--2110, 3421, -5999, 14357, 61620, -9554, 4757,
--2832, 1761, -1087, 644, -356, 175, -70,
-0, -33, 105, -238, 460, -808, 1338,
--2152, 3489, -6121, 14686, 61461, -9690, 4831,
--2877, 1790, -1104, 654, -361, 177, -71,
-0, -34, 107, -243, 469, -824, 1364,
--2193, 3557, -6243, 15016, 61299, -9824, 4904,
--2921, 1817, -1121, 664, -366, 180, -72,
-0, -35, 110, -248, 479, -840, 1389,
--2234, 3624, -6365, 15348, 61134, -9955, 4976,
--2965, 1845, -1138, 674, -372, 182, -73,
-0, -36, 112, -253, 488, -855, 1415,
--2275, 3691, -6486, 15680, 60966, -10084, 5046,
--3008, 1872, -1154, 684, -377, 185, -74,
-0, -36, 114, -258, 497, -871, 1440,
--2316, 3758, -6607, 16013, 60796, -10210, 5116,
--3051, 1898, -1171, 693, -382, 187, -75,
-0, -37, 116, -262, 506, -886, 1466,
--2357, 3824, -6728, 16347, 60622, -10334, 5185,
--3092, 1924, -1187, 702, -387, 190, -76,
-0, -38, 119, -267, 514, -901, 1491,
--2397, 3890, -6848, 16682, 60446, -10455, 5252,
--3134, 1950, -1203, 712, -392, 192, -76,
-0, -39, 121, -272, 523, -917, 1516,
--2437, 3956, -6968, 17018, 60266, -10575, 5318,
--3174, 1975, -1218, 721, -397, 194, -77,
-0, -40, 123, -277, 532, -932, 1541,
--2477, 4021, -7087, 17355, 60084, -10691, 5384,
--3214, 2000, -1233, 730, -401, 196, -78,
-0, -40, 125, -281, 541, -947, 1565,
--2517, 4086, -7206, 17693, 59899, -10806, 5448,
--3254, 2025, -1248, 738, -406, 199, -79,
-0, -41, 127, -286, 550, -962, 1590,
--2556, 4151, -7324, 18031, 59711, -10917, 5511,
--3292, 2049, -1263, 747, -411, 201, -80,
-0, -42, 129, -291, 558, -977, 1615,
--2595, 4215, -7442, 18371, 59521, -11027, 5573,
--3330, 2073, -1278, 755, -415, 203, -80,
-0, -43, 132, -295, 567, -992, 1639,
--2634, 4279, -7559, 18711, 59327, -11134, 5634,
--3368, 2096, -1292, 764, -419, 205, -81,
-0, -43, 134, -300, 576, -1007, 1663,
--2673, 4343, -7676, 19052, 59131, -11238, 5693,
--3405, 2119, -1306, 772, -424, 207, -82,
-0, -44, 136, -305, 584, -1022, 1687,
--2712, 4406, -7792, 19394, 58932, -11340, 5752,
--3441, 2142, -1320, 780, -428, 209, -82,
-0, -45, 138, -309, 593, -1036, 1711,
--2750, 4468, -7907, 19736, 58730, -11440, 5809,
--3476, 2164, -1333, 787, -432, 211, -83,
-0, -46, 140, -314, 601, -1051, 1734,
--2788, 4531, -8022, 20079, 58526, -11537, 5866,
--3511, 2186, -1346, 795, -436, 212, -84,
-0, -47, 142, -318, 610, -1065, 1758,
--2825, 4592, -8136, 20423, 58319, -11632, 5921,
--3545, 2207, -1359, 803, -440, 214, -84,
-0, -47, 145, -323, 618, -1079, 1781,
--2862, 4654, -8250, 20767, 58109, -11725, 5975,
--3578, 2228, -1372, 810, -444, 216, -85,
-0, -48, 147, -327, 626, -1093, 1804,
--2899, 4714, -8363, 21112, 57897, -11815, 6028,
--3611, 2248, -1384, 817, -448, 218, -85,
-0, -49, 149, -332, 634, -1107, 1827,
--2936, 4775, -8475, 21457, 57682, -11902, 6079,
--3643, 2268, -1397, 824, -451, 219, -86,
-0, -50, 151, -336, 643, -1121, 1850,
--2972, 4835, -8587, 21803, 57464, -11988, 6130,
--3675, 2288, -1409, 831, -455, 221, -86,
-0, -51, 153, -340, 651, -1135, 1872,
--3008, 4894, -8697, 22150, 57244, -12071, 6179,
--3705, 2307, -1420, 838, -458, 222, -87,
-0, -51, 155, -345, 659, -1149, 1895,
--3044, 4953, -8808, 22497, 57021, -12151, 6227,
--3735, 2326, -1432, 844, -462, 224, -87,
-0, -52, 157, -349, 667, -1162, 1917,
--3079, 5011, -8917, 22844, 56796, -12229, 6274,
--3765, 2344, -1443, 850, -465, 225, -88,
-0, -53, 159, -353, 675, -1176, 1938,
--3114, 5069, -9025, 23192, 56568, -12305, 6320,
--3793, 2362, -1454, 857, -468, 227, -88,
-0, -54, 161, -358, 682, -1189, 1960,
--3149, 5126, -9133, 23540, 56337, -12378, 6365,
--3821, 2379, -1464, 863, -472, 228, -89,
-0, -54, 163, -362, 690, -1202, 1982,
--3183, 5183, -9240, 23889, 56104, -12449, 6408,
--3848, 2397, -1475, 869, -475, 230, -89,
-0, -55, 165, -366, 698, -1215, 2003,
--3217, 5239, -9346, 24238, 55869, -12518, 6451,
--3875, 2413, -1485, 874, -478, 231, -90,
-0, -56, 167, -370, 706, -1228, 2024,
--3251, 5294, -9451, 24587, 55631, -12584, 6492,
--3901, 2429, -1494, 880, -480, 232, -90,
-0, -57, 169, -374, 713, -1241, 2044,
--3284, 5349, -9555, 24937, 55391, -12648, 6532,
--3926, 2445, -1504, 885, -483, 233, -90,
-0, -58, 171, -378, 721, -1254, 2065,
--3317, 5404, -9658, 25286, 55148, -12710, 6571,
--3951, 2460, -1513, 890, -486, 234, -91,
-0, -58, 173, -382, 728, -1266, 2085,
--3349, 5457, -9761, 25636, 54903, -12769, 6609,
--3974, 2475, -1522, 896, -488, 236, -91,
-0, -59, 175, -386, 735, -1279, 2105,
--3381, 5511, -9862, 25987, 54656, -12826, 6645,
--3997, 2490, -1531, 900, -491, 237, -91,
-0, -60, 177, -390, 742, -1291, 2125,
--3413, 5563, -9963, 26337, 54406, -12881, 6680,
--4020, 2504, -1539, 905, -493, 238, -92,
-0, -61, 179, -394, 750, -1303, 2144,
--3444, 5615, -10062, 26688, 54154, -12933, 6715,
--4042, 2517, -1547, 910, -496, 239, -92,
-0, -61, 181, -398, 757, -1315, 2164,
--3475, 5666, -10161, 27038, 53899, -12983, 6748,
--4063, 2530, -1555, 914, -498, 240, -92,
-0, -62, 183, -402, 764, -1327, 2183,
--3505, 5717, -10258, 27389, 53643, -13031, 6779,
--4083, 2543, -1563, 919, -500, 240, -92,
-0, -63, 185, -406, 770, -1338, 2201,
--3535, 5766, -10354, 27740, 53384, -13076, 6810,
--4102, 2555, -1570, 923, -502, 241, -92,
-0, -64, 187, -410, 777, -1350, 2220,
--3565, 5815, -10450, 28090, 53123, -13119, 6840,
--4121, 2567, -1577, 927, -504, 242, -93,
-0, -64, 188, -413, 784, -1361, 2238,
--3594, 5864, -10544, 28441, 52859, -13160, 6868,
--4139, 2579, -1584, 930, -506, 243, -93,
-0, -65, 190, -417, 791, -1372, 2256,
--3623, 5912, -10637, 28792, 52594, -13198, 6895,
--4157, 2589, -1591, 934, -508, 244, -93,
-0, -66, 192, -421, 797, -1383, 2273,
--3651, 5959, -10729, 29143, 52326, -13235, 6921,
--4174, 2600, -1597, 937, -509, 244, -93,
-0, -67, 194, -424, 803, -1394, 2291,
--3679, 6005, -10820, 29493, 52057, -13269, 6946,
--4190, 2610, -1603, 941, -511, 245, -93,
-0, -67, 195, -428, 810, -1404, 2308,
--3706, 6051, -10909, 29844, 51785, -13301, 6969,
--4205, 2620, -1609, 944, -512, 245, -93,
-0, -68, 197, -431, 816, -1415, 2325,
--3733, 6095, -10998, 30194, 51511, -13330, 6992,
--4220, 2629, -1614, 947, -514, 246, -93,
-0, -69, 199, -435, 822, -1425, 2341,
--3759, 6139, -11085, 30544, 51235, -13358, 7013,
--4234, 2638, -1619, 950, -515, 246, -93,
-0, -69, 201, -438, 828, -1435, 2357,
--3785, 6183, -11171, 30894, 50957, -13383, 7033,
--4247, 2646, -1624, 952, -516, 247, -93,
-0, -70, 202, -441, 834, -1445, 2373,
--3810, 6225, -11256, 31244, 50677, -13406, 7052,
--4260, 2654, -1629, 955, -518, 247, -94,
-0, -71, 204, -445, 840, -1454, 2388,
--3835, 6267, -11340, 31593, 50395, -13427, 7070,
--4271, 2661, -1633, 957, -519, 248, -94,
-0, -71, 206, -448, 846, -1464, 2404,
--3859, 6308, -11422, 31943, 50111, -13445, 7087,
--4283, 2668, -1637, 959, -520, 248, -94,
-0, -72, 207, -451, 851, -1473, 2419,
--3883, 6348, -11503, 32291, 49825, -13462, 7102,
--4293, 2675, -1641, 961, -520, 248, -93,
-0, -73, 209, -454, 857, -1482, 2433,
--3906, 6387, -11583, 32640, 49537, -13476, 7117,
--4303, 2681, -1645, 963, -521, 248, -93,
-0, -73, 210, -457, 862, -1491, 2447,
--3929, 6426, -11661, 32988, 49248, -13488, 7130,
--4312, 2686, -1648, 965, -522, 248, -93,
-0, -74, 212, -460, 867, -1500, 2461,
--3951, 6464, -11738, 33336, 48956, -13498, 7142,
--4320, 2692, -1651, 966, -523, 249, -93,
-0, -75, 213, -463, 872, -1508, 2475,
--3973, 6501, -11813, 33683, 48663, -13506, 7153,
--4328, 2697, -1654, 968, -523, 249, -93,
-0, -75, 215, -466, 877, -1517, 2488,
--3995, 6537, -11888, 34029, 48368, -13512, 7162,
--4335, 2701, -1656, 969, -524, 249, -93,
-0, -76, 216, -469, 882, -1525, 2501,
--4015, 6572, -11960, 34376, 48071, -13515, 7171,
--4341, 2705, -1658, 970, -524, 249, -93,
-0, -77, 218, -471, 887, -1533, 2514,
--4035, 6606, -12032, 34721, 47772, -13517, 7179,
--4347, 2708, -1660, 971, -524, 249, -93,
-0, -77, 219, -474, 892, -1540, 2526,
--4055, 6639, -12102, 35067, 47472, -13516, 7185,
--4352, 2711, -1662, 972, -524, 249, -93,
-0, -78, 220, -477, 896, -1548, 2538,
--4074, 6672, -12170, 35411, 47170, -13514, 7190,
--4356, 2714, -1663, 972, -525, 249, -93,
-0, -78, 222, -479, 901, -1555, 2550,
--4093, 6703, -12237, 35755, 46866, -13509, 7194,
--4360, 2716, -1665, 973, -525, 248, -92,
-0, -79, 223, -482, 905, -1562, 2561,
--4110, 6734, -12302, 36098, 46561, -13503, 7197,
--4362, 2718, -1665, 973, -525, 248, -92,
-0, -80, 224, -484, 909, -1569, 2572,
--4128, 6764, -12366, 36441, 46254, -13494, 7199,
--4365, 2719, -1666, 973, -524, 248, -92,
-0, -80, 226, -487, 914, -1576, 2582,
--4145, 6793, -12429, 36783, 45946, -13483, 7200,
--4366, 2720, -1666, 973, -524, 248, -92,
-0, -81, 227, -489, 917, -1582, 2592,
--4161, 6821, -12490, 37124, 45636, -13471, 7200,
--4367, 2721, -1666, 973, -524, 247, -91,
-0, -81, 228, -491, 921, -1588, 2602,
--4177, 6848, -12549, 37464, 45324, -13456, 7198,
--4367, 2721, -1666, 972, -523, 247, -91,
-0, -82, 229, -493, 925, -1594, 2611,
--4192, 6874, -12607, 37804, 45011, -13439, 7196,
--4367, 2721, -1666, 972, -523, 247, -91,
-0, -82, 230, -495, 929, -1600, 2621,
--4206, 6899, -12663, 38142, 44697, -13421, 7192,
--4365, 2720, -1665, 971, -522, 246, -91,
-0, -83, 231, -497, 932, -1605, 2629,
--4220, 6923, -12717, 38480, 44381, -13400, 7187,
--4363, 2719, -1664, 971, -522, 246, -90,
-0, -83, 233, -499, 935, -1611, 2637,
--4233, 6947, -12770, 38817, 44063, -13378, 7181,
--4361, 2717, -1663, 970, -521, 245, -90,
-0, -84, 234, -501, 939, -1616, 2645,
--4246, 6969, -12821, 39153, 43744, -13354, 7175,
--4358, 2715, -1662, 969, -520, 245, -90,
-0, -84, 235, -503, 942, -1621, 2653,
--4258, 6990, -12870, 39488, 43424, -13327, 7167,
--4354, 2713, -1660, 967, -519, 244, -89,
-0, -85, 236, -505, 944, -1625, 2660,
--4269, 7010, -12918, 39822, 43103, -13299, 7158,
--4349, 2710, -1658, 966, -519, 244, -89,
-0, -85, 237, -507, 947, -1630, 2667,
--4280, 7030, -12964, 40155, 42780, -13269, 7148,
--4344, 2707, -1656, 964, -518, 243, -89,
-0, -86, 237, -508, 950, -1634, 2673,
--4290, 7048, -13009, 40487, 42456, -13238, 7136,
--4339, 2703, -1653, 963, -516, 242, -88,
-0, -86, 238, -510, 952, -1638, 2679,
--4300, 7065, -13051, 40818, 42131, -13204, 7124,
--4332, 2699, -1651, 961, -515, 242, -88,
-0, -87, 239, -511, 955, -1641, 2685,
--4309, 7082, -13092, 41148, 41805, -13168, 7111,
--4325, 2695, -1648, 959, -514, 241, -88,
-0, -87, 240, -513, 957, -1645, 2690,
--4317, 7097, -13131, 41477, 41477, -13131, 7097,
--4317, 2690, -1645, 957, -513, 240, -87,
-0, -88, 241, -514, 959, -1648, 2695,
--4325, 7111, -13168, 41805, 41148, -13092, 7082,
--4309, 2685, -1641, 955, -511, 239, -87,
-0, -88, 242, -515, 961, -1651, 2699,
--4332, 7124, -13204, 42131, 40818, -13051, 7065,
--4300, 2679, -1638, 952, -510, 238, -86,
-0, -88, 242, -516, 963, -1653, 2703,
--4339, 7136, -13238, 42456, 40487, -13009, 7048,
--4290, 2673, -1634, 950, -508, 237, -86,
-0, -89, 243, -518, 964, -1656, 2707,
--4344, 7148, -13269, 42780, 40155, -12964, 7030,
--4280, 2667, -1630, 947, -507, 237, -85,
-0, -89, 244, -519, 966, -1658, 2710,
--4349, 7158, -13299, 43103, 39822, -12918, 7010,
--4269, 2660, -1625, 944, -505, 236, -85,
-0, -89, 244, -519, 967, -1660, 2713,
--4354, 7167, -13327, 43424, 39488, -12870, 6990,
--4258, 2653, -1621, 942, -503, 235, -84,
-0, -90, 245, -520, 969, -1662, 2715,
--4358, 7175, -13354, 43744, 39153, -12821, 6969,
--4246, 2645, -1616, 939, -501, 234, -84,
-0, -90, 245, -521, 970, -1663, 2717,
--4361, 7181, -13378, 44063, 38817, -12770, 6947,
--4233, 2637, -1611, 935, -499, 233, -83,
-0, -90, 246, -522, 971, -1664, 2719,
--4363, 7187, -13400, 44381, 38480, -12717, 6923,
--4220, 2629, -1605, 932, -497, 231, -83,
-0, -91, 246, -522, 971, -1665, 2720,
--4365, 7192, -13421, 44697, 38142, -12663, 6899,
--4206, 2621, -1600, 929, -495, 230, -82,
-0, -91, 247, -523, 972, -1666, 2721,
--4367, 7196, -13439, 45011, 37804, -12607, 6874,
--4192, 2611, -1594, 925, -493, 229, -82,
-0, -91, 247, -523, 972, -1666, 2721,
--4367, 7198, -13456, 45324, 37464, -12549, 6848,
--4177, 2602, -1588, 921, -491, 228, -81,
-0, -91, 247, -524, 973, -1666, 2721,
--4367, 7200, -13471, 45636, 37124, -12490, 6821,
--4161, 2592, -1582, 917, -489, 227, -81,
-0, -92, 248, -524, 973, -1666, 2720,
--4366, 7200, -13483, 45946, 36783, -12429, 6793,
--4145, 2582, -1576, 914, -487, 226, -80,
-0, -92, 248, -524, 973, -1666, 2719,
--4365, 7199, -13494, 46254, 36441, -12366, 6764,
--4128, 2572, -1569, 909, -484, 224, -80,
-0, -92, 248, -525, 973, -1665, 2718,
--4362, 7197, -13503, 46561, 36098, -12302, 6734,
--4110, 2561, -1562, 905, -482, 223, -79,
-0, -92, 248, -525, 973, -1665, 2716,
--4360, 7194, -13509, 46866, 35755, -12237, 6703,
--4093, 2550, -1555, 901, -479, 222, -78,
-0, -93, 249, -525, 972, -1663, 2714,
--4356, 7190, -13514, 47170, 35411, -12170, 6672,
--4074, 2538, -1548, 896, -477, 220, -78,
-0, -93, 249, -524, 972, -1662, 2711,
--4352, 7185, -13516, 47472, 35067, -12102, 6639,
--4055, 2526, -1540, 892, -474, 219, -77,
-0, -93, 249, -524, 971, -1660, 2708,
--4347, 7179, -13517, 47772, 34721, -12032, 6606,
--4035, 2514, -1533, 887, -471, 218, -77,
-0, -93, 249, -524, 970, -1658, 2705,
--4341, 7171, -13515, 48071, 34376, -11960, 6572,
--4015, 2501, -1525, 882, -469, 216, -76,
-0, -93, 249, -524, 969, -1656, 2701,
--4335, 7162, -13512, 48368, 34029, -11888, 6537,
--3995, 2488, -1517, 877, -466, 215, -75,
-0, -93, 249, -523, 968, -1654, 2697,
--4328, 7153, -13506, 48663, 33683, -11813, 6501,
--3973, 2475, -1508, 872, -463, 213, -75,
-0, -93, 249, -523, 966, -1651, 2692,
--4320, 7142, -13498, 48956, 33336, -11738, 6464,
--3951, 2461, -1500, 867, -460, 212, -74,
-0, -93, 248, -522, 965, -1648, 2686,
--4312, 7130, -13488, 49248, 32988, -11661, 6426,
--3929, 2447, -1491, 862, -457, 210, -73,
-0, -93, 248, -521, 963, -1645, 2681,
--4303, 7117, -13476, 49537, 32640, -11583, 6387,
--3906, 2433, -1482, 857, -454, 209, -73,
-0, -93, 248, -520, 961, -1641, 2675,
--4293, 7102, -13462, 49825, 32291, -11503, 6348,
--3883, 2419, -1473, 851, -451, 207, -72,
-0, -94, 248, -520, 959, -1637, 2668,
--4283, 7087, -13445, 50111, 31943, -11422, 6308,
--3859, 2404, -1464, 846, -448, 206, -71,
-0, -94, 248, -519, 957, -1633, 2661,
--4271, 7070, -13427, 50395, 31593, -11340, 6267,
--3835, 2388, -1454, 840, -445, 204, -71,
-0, -94, 247, -518, 955, -1629, 2654,
--4260, 7052, -13406, 50677, 31244, -11256, 6225,
--3810, 2373, -1445, 834, -441, 202, -70,
-0, -93, 247, -516, 952, -1624, 2646,
--4247, 7033, -13383, 50957, 30894, -11171, 6183,
--3785, 2357, -1435, 828, -438, 201, -69,
-0, -93, 246, -515, 950, -1619, 2638,
--4234, 7013, -13358, 51235, 30544, -11085, 6139,
--3759, 2341, -1425, 822, -435, 199, -69,
-0, -93, 246, -514, 947, -1614, 2629,
--4220, 6992, -13330, 51511, 30194, -10998, 6095,
--3733, 2325, -1415, 816, -431, 197, -68,
-0, -93, 245, -512, 944, -1609, 2620,
--4205, 6969, -13301, 51785, 29844, -10909, 6051,
--3706, 2308, -1404, 810, -428, 195, -67,
-0, -93, 245, -511, 941, -1603, 2610,
--4190, 6946, -13269, 52057, 29493, -10820, 6005,
--3679, 2291, -1394, 803, -424, 194, -67,
-0, -93, 244, -509, 937, -1597, 2600,
--4174, 6921, -13235, 52326, 29143, -10729, 5959,
--3651, 2273, -1383, 797, -421, 192, -66,
-0, -93, 244, -508, 934, -1591, 2589,
--4157, 6895, -13198, 52594, 28792, -10637, 5912,
--3623, 2256, -1372, 791, -417, 190, -65,
-0, -93, 243, -506, 930, -1584, 2579,
--4139, 6868, -13160, 52859, 28441, -10544, 5864,
--3594, 2238, -1361, 784, -413, 188, -64,
-0, -93, 242, -504, 927, -1577, 2567,
--4121, 6840, -13119, 53123, 28090, -10450, 5815,
--3565, 2220, -1350, 777, -410, 187, -64,
-0, -92, 241, -502, 923, -1570, 2555,
--4102, 6810, -13076, 53384, 27740, -10354, 5766,
--3535, 2201, -1338, 770, -406, 185, -63,
-0, -92, 240, -500, 919, -1563, 2543,
--4083, 6779, -13031, 53643, 27389, -10258, 5717,
--3505, 2183, -1327, 764, -402, 183, -62,
-0, -92, 240, -498, 914, -1555, 2530,
--4063, 6748, -12983, 53899, 27038, -10161, 5666,
--3475, 2164, -1315, 757, -398, 181, -61,
-0, -92, 239, -496, 910, -1547, 2517,
--4042, 6715, -12933, 54154, 26688, -10062, 5615,
--3444, 2144, -1303, 750, -394, 179, -61,
-0, -92, 238, -493, 905, -1539, 2504,
--4020, 6680, -12881, 54406, 26337, -9963, 5563,
--3413, 2125, -1291, 742, -390, 177, -60,
-0, -91, 237, -491, 900, -1531, 2490,
--3997, 6645, -12826, 54656, 25987, -9862, 5511,
--3381, 2105, -1279, 735, -386, 175, -59,
-0, -91, 236, -488, 896, -1522, 2475,
--3974, 6609, -12769, 54903, 25636, -9761, 5457,
--3349, 2085, -1266, 728, -382, 173, -58,
-0, -91, 234, -486, 890, -1513, 2460,
--3951, 6571, -12710, 55148, 25286, -9658, 5404,
--3317, 2065, -1254, 721, -378, 171, -58,
-0, -90, 233, -483, 885, -1504, 2445,
--3926, 6532, -12648, 55391, 24937, -9555, 5349,
--3284, 2044, -1241, 713, -374, 169, -57,
-0, -90, 232, -480, 880, -1494, 2429,
--3901, 6492, -12584, 55631, 24587, -9451, 5294,
--3251, 2024, -1228, 706, -370, 167, -56,
-0, -90, 231, -478, 874, -1485, 2413,
--3875, 6451, -12518, 55869, 24238, -9346, 5239,
--3217, 2003, -1215, 698, -366, 165, -55,
-0, -89, 230, -475, 869, -1475, 2397,
--3848, 6408, -12449, 56104, 23889, -9240, 5183,
--3183, 1982, -1202, 690, -362, 163, -54,
-0, -89, 228, -472, 863, -1464, 2379,
--3821, 6365, -12378, 56337, 23540, -9133, 5126,
--3149, 1960, -1189, 682, -358, 161, -54,
-0, -88, 227, -468, 857, -1454, 2362,
--3793, 6320, -12305, 56568, 23192, -9025, 5069,
--3114, 1938, -1176, 675, -353, 159, -53,
-0, -88, 225, -465, 850, -1443, 2344,
--3765, 6274, -12229, 56796, 22844, -8917, 5011,
--3079, 1917, -1162, 667, -349, 157, -52,
-0, -87, 224, -462, 844, -1432, 2326,
--3735, 6227, -12151, 57021, 22497, -8808, 4953,
--3044, 1895, -1149, 659, -345, 155, -51,
-0, -87, 222, -458, 838, -1420, 2307,
--3705, 6179, -12071, 57244, 22150, -8697, 4894,
--3008, 1872, -1135, 651, -340, 153, -51,
-0, -86, 221, -455, 831, -1409, 2288,
--3675, 6130, -11988, 57464, 21803, -8587, 4835,
--2972, 1850, -1121, 643, -336, 151, -50,
-0, -86, 219, -451, 824, -1397, 2268,
--3643, 6079, -11902, 57682, 21457, -8475, 4775,
--2936, 1827, -1107, 634, -332, 149, -49,
-0, -85, 218, -448, 817, -1384, 2248,
--3611, 6028, -11815, 57897, 21112, -8363, 4714,
--2899, 1804, -1093, 626, -327, 147, -48,
-0, -85, 216, -444, 810, -1372, 2228,
--3578, 5975, -11725, 58109, 20767, -8250, 4654,
--2862, 1781, -1079, 618, -323, 145, -47,
-0, -84, 214, -440, 803, -1359, 2207,
--3545, 5921, -11632, 58319, 20423, -8136, 4592,
--2825, 1758, -1065, 610, -318, 142, -47,
-0, -84, 212, -436, 795, -1346, 2186,
--3511, 5866, -11537, 58526, 20079, -8022, 4531,
--2788, 1734, -1051, 601, -314, 140, -46,
-0, -83, 211, -432, 787, -1333, 2164,
--3476, 5809, -11440, 58730, 19736, -7907, 4468,
--2750, 1711, -1036, 593, -309, 138, -45,
-0, -82, 209, -428, 780, -1320, 2142,
--3441, 5752, -11340, 58932, 19394, -7792, 4406,
--2712, 1687, -1022, 584, -305, 136, -44,
-0, -82, 207, -424, 772, -1306, 2119,
--3405, 5693, -11238, 59131, 19052, -7676, 4343,
--2673, 1663, -1007, 576, -300, 134, -43,
-0, -81, 205, -419, 764, -1292, 2096,
--3368, 5634, -11134, 59327, 18711, -7559, 4279,
--2634, 1639, -992, 567, -295, 132, -43,
-0, -80, 203, -415, 755, -1278, 2073,
--3330, 5573, -11027, 59521, 18371, -7442, 4215,
--2595, 1615, -977, 558, -291, 129, -42,
-0, -80, 201, -411, 747, -1263, 2049,
--3292, 5511, -10917, 59711, 18031, -7324, 4151,
--2556, 1590, -962, 550, -286, 127, -41,
-0, -79, 199, -406, 738, -1248, 2025,
--3254, 5448, -10806, 59899, 17693, -7206, 4086,
--2517, 1565, -947, 541, -281, 125, -40,
-0, -78, 196, -401, 730, -1233, 2000,
--3214, 5384, -10691, 60084, 17355, -7087, 4021,
--2477, 1541, -932, 532, -277, 123, -40,
-0, -77, 194, -397, 721, -1218, 1975,
--3174, 5318, -10575, 60266, 17018, -6968, 3956,
--2437, 1516, -917, 523, -272, 121, -39,
-0, -76, 192, -392, 712, -1203, 1950,
--3134, 5252, -10455, 60446, 16682, -6848, 3890,
--2397, 1491, -901, 514, -267, 119, -38,
-0, -76, 190, -387, 702, -1187, 1924,
--3092, 5185, -10334, 60622, 16347, -6728, 3824,
--2357, 1466, -886, 506, -262, 116, -37,
-0, -75, 187, -382, 693, -1171, 1898,
--3051, 5116, -10210, 60796, 16013, -6607, 3758,
--2316, 1440, -871, 497, -258, 114, -36,
-0, -74, 185, -377, 684, -1154, 1872,
--3008, 5046, -10084, 60966, 15680, -6486, 3691,
--2275, 1415, -855, 488, -253, 112, -36,
-0, -73, 182, -372, 674, -1138, 1845,
--2965, 4976, -9955, 61134, 15348, -6365, 3624,
--2234, 1389, -840, 479, -248, 110, -35,
-0, -72, 180, -366, 664, -1121, 1817,
--2921, 4904, -9824, 61299, 15016, -6243, 3557,
--2193, 1364, -824, 469, -243, 107, -34,
-0, -71, 177, -361, 654, -1104, 1790,
--2877, 4831, -9690, 61461, 14686, -6121, 3489,
--2152, 1338, -808, 460, -238, 105, -33,
-0, -70, 175, -356, 644, -1087, 1761,
--2832, 4757, -9554, 61620, 14357, -5999, 3421,
--2110, 1312, -792, 451, -234, 103, -33,
-0, -69, 172, -350, 634, -1070, 1733,
--2786, 4682, -9415, 61775, 14029, -5876, 3353,
--2068, 1286, -777, 442, -229, 101, -32,
-0, -68, 170, -344, 624, -1052, 1704,
--2740, 4606, -9274, 61928, 13702, -5753, 3285,
--2026, 1260, -761, 433, -224, 99, -31,
-0, -67, 167, -339, 613, -1034, 1675,
--2693, 4529, -9131, 62078, 13376, -5630, 3216,
--1984, 1234, -745, 424, -219, 96, -30,
-0, -66, 164, -333, 603, -1016, 1645,
--2646, 4451, -8985, 62225, 13052, -5507, 3148,
--1942, 1207, -729, 414, -214, 94, -29,
-0, -65, 161, -327, 592, -997, 1616,
--2598, 4371, -8837, 62369, 12728, -5383, 3079,
--1900, 1181, -713, 405, -209, 92, -29,
-0, -64, 159, -321, 581, -979, 1585,
--2549, 4291, -8686, 62510, 12406, -5259, 3009,
--1857, 1154, -697, 396, -204, 90, -28,
-0, -63, 156, -315, 570, -960, 1555,
--2500, 4210, -8533, 62647, 12085, -5135, 2940,
--1815, 1128, -680, 387, -199, 87, -27,
-0, -62, 153, -309, 559, -941, 1524,
--2450, 4128, -8378, 62782, 11765, -5011, 2870,
--1772, 1101, -664, 377, -195, 85, -26,
-0, -61, 150, -303, 547, -922, 1492,
--2400, 4044, -8220, 62914, 11447, -4887, 2801,
--1729, 1075, -648, 368, -190, 83, -26,
-0, -60, 147, -297, 536, -902, 1461,
--2349, 3960, -8060, 63042, 11130, -4762, 2731,
--1686, 1048, -632, 359, -185, 81, -25,
-0, -58, 144, -290, 524, -883, 1429,
--2298, 3875, -7897, 63167, 10814, -4638, 2661,
--1643, 1021, -616, 349, -180, 79, -24,
-0, -57, 141, -284, 513, -863, 1396,
--2246, 3789, -7732, 63290, 10499, -4513, 2591,
--1600, 994, -599, 340, -175, 76, -24,
-0, -56, 138, -278, 501, -842, 1363,
--2193, 3701, -7564, 63409, 10186, -4388, 2520,
--1557, 967, -583, 331, -170, 74, -23,
-0, -55, 134, -271, 489, -822, 1330,
--2140, 3613, -7394, 63525, 9875, -4263, 2450,
--1514, 940, -567, 321, -165, 72, -22,
-0, -54, 131, -264, 477, -802, 1297,
--2087, 3524, -7222, 63638, 9564, -4139, 2379,
--1470, 913, -550, 312, -160, 70, -21,
-0, -52, 128, -258, 464, -781, 1263,
--2033, 3434, -7048, 63747, 9255, -4014, 2309,
--1427, 886, -534, 303, -155, 68, -21,
-0, -51, 125, -251, 452, -760, 1229,
--1978, 3343, -6871, 63854, 8948, -3889, 2238,
--1383, 859, -517, 293, -151, 65, -20,
-0, -50, 121, -244, 440, -739, 1195,
--1923, 3251, -6691, 63957, 8642, -3764, 2167,
--1340, 832, -501, 284, -146, 63, -19,
-0, -48, 118, -237, 427, -717, 1160,
--1867, 3158, -6509, 64057, 8338, -3639, 2097,
--1296, 805, -485, 274, -141, 61, -19,
-0, -47, 115, -230, 414, -696, 1125,
--1811, 3064, -6325, 64154, 8035, -3515, 2026,
--1252, 778, -468, 265, -136, 59, -18,
-0, -46, 111, -223, 401, -674, 1090,
--1755, 2970, -6139, 64247, 7733, -3390, 1955,
--1209, 751, -452, 256, -131, 57, -17,
-0, -44, 108, -216, 388, -652, 1055,
--1698, 2874, -5950, 64338, 7434, -3265, 1884,
--1165, 723, -435, 246, -126, 55, -16,
-0, -43, 104, -209, 375, -630, 1019,
--1640, 2778, -5759, 64425, 7135, -3141, 1813,
--1121, 696, -419, 237, -121, 52, -16,
-0, -41, 100, -201, 362, -608, 983,
--1582, 2681, -5566, 64509, 6839, -3017, 1742,
--1078, 669, -402, 228, -116, 50, -15,
-0, -40, 97, -194, 349, -585, 946,
--1524, 2582, -5370, 64589, 6544, -2893, 1671,
--1034, 642, -386, 218, -112, 48, -14,
-0, -38, 93, -187, 335, -563, 910,
--1465, 2483, -5172, 64667, 6250, -2769, 1600,
--990, 615, -370, 209, -107, 46, -14,
-0, -37, 90, -179, 322, -540, 873,
--1405, 2384, -4971, 64741, 5959, -2645, 1530,
--946, 587, -353, 199, -102, 44, -13,
-0, -35, 86, -172, 308, -517, 835,
--1345, 2283, -4769, 64812, 5669, -2521, 1459,
--903, 560, -337, 190, -97, 42, -12,
-0, -34, 82, -164, 294, -494, 798,
--1285, 2182, -4564, 64880, 5380, -2398, 1388,
--859, 533, -320, 181, -92, 40, -12,
-0, -32, 78, -156, 281, -470, 760,
--1224, 2079, -4357, 64944, 5094, -2274, 1317,
--815, 506, -304, 172, -88, 38, -11,
-0, -31, 74, -149, 267, -447, 722,
--1163, 1976, -4147, 65005, 4809, -2152, 1247,
--772, 479, -288, 162, -83, 36, -10,
-0, -29, 71, -141, 253, -423, 684,
--1102, 1872, -3935, 65063, 4526, -2029, 1176,
--728, 452, -271, 153, -78, 33, -10,
-0, -28, 67, -133, 238, -400, 645,
--1040, 1768, -3721, 65117, 4245, -1907, 1106,
--685, 425, -255, 144, -73, 31, -9,
-0, -26, 63, -125, 224, -376, 607,
--977, 1662, -3505, 65168, 3965, -1784, 1035,
--641, 398, -239, 135, -69, 29, -9,
-0, -24, 59, -117, 210, -351, 568,
--915, 1556, -3287, 65216, 3688, -1663, 965,
--598, 371, -223, 125, -64, 27, -8,
-0, -23, 55, -109, 195, -327, 528,
--851, 1449, -3066, 65261, 3412, -1541, 895,
--554, 344, -206, 116, -59, 25, -7,
-0, -21, 51, -101, 181, -303, 489,
--788, 1342, -2843, 65302, 3138, -1420, 825,
--511, 317, -190, 107, -54, 23, -7,
-0, -19, 47, -93, 166, -278, 449,
--724, 1234, -2618, 65340, 2866, -1299, 755,
--468, 290, -174, 98, -50, 21, -6,
-0, -18, 43, -85, 152, -254, 409,
--660, 1125, -2391, 65374, 2595, -1179, 686,
--425, 263, -158, 89, -45, 19, -6,
-0, -16, 38, -76, 137, -229, 369,
--595, 1015, -2161, 65405, 2327, -1059, 616,
--382, 237, -142, 80, -41, 17, -5,
-0, -14, 34, -68, 122, -204, 329,
--530, 905, -1929, 65433, 2061, -940, 547,
--339, 210, -126, 71, -36, 15, -4,
-0, -13, 30, -60, 107, -179, 289,
--465, 794, -1696, 65458, 1796, -821, 478,
--296, 184, -110, 62, -31, 13, -4,
-0, -11, 26, -51, 92, -154, 248,
--400, 682, -1460, 65479, 1533, -702, 409,
--253, 157, -94, 53, -27, 11, -3,
-0, -9, 22, -43, 77, -128, 207,
--334, 570, -1222, 65497, 1273, -584, 340,
--211, 131, -78, 44, -22, 9, -3,
-0, -7, 17, -34, 62, -103, 166,
--268, 457, -982, 65511, 1014, -466, 272,
--168, 104, -63, 35, -18, 8, -2,
-0, -6, 13, -26, 46, -77, 125,
--201, 344, -739, 65523, 758, -349, 203,
--126, 78, -47, 26, -13, 6, -2,
-0, -4, 9, -17, 31, -52, 83,
--134, 230, -495, 65530, 503, -232, 135,
--84, 52, -31, 17, -9, 4, -1,
-0, -2, 4, -9, 15, -26, 42,
--67, 115, -248, 65535, 251, -116, 68,
--42, 26, -16, 9, -4, 2, -1,
-0, 0, 0, 0, 0, 0, 0,
-0, 0, 0, 65536, 0, 0, 0,
-0, 0, 0, 0, 0, 0, 0,
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AM_SRC2_TABLE_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audio810_impl.h b/usr/src/uts/common/sys/audio/impl/audio810_impl.h
deleted file mode 100644
index 05baf89564..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio810_impl.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO810_IMPL_H_
-#define _SYS_AUDIO810_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-
-/*
- * Misc. defines
- */
-#define I810_IDNUM (0x6175)
-#define I810_MINPACKET (0)
-#define I810_MAXPACKET (1*1024)
-#define I810_HIWATER (64*1024)
-#define I810_LOWATER (32*1024)
-
-#define I810_DMA_PCM_IN (1)
-#define I810_DMA_PCM_OUT (2)
-
-#define I810_LAST_AC_REG (0x3A)
-
-#define I810_INIT_NO_RESTORE (1)
-#define I810_INIT_RESTORE (0)
-#define I810_CODEC_REG(r) ((r) >> 1)
-
-#define I845_AM_REGS_SIZE (0x200)
-#define I845_BM_REGS_SIZE (0x100)
-#define I810_AM_REGS_SIZE (0x100)
-#define I810_BM_REGS_SIZE (0x40)
-#define I810_BD_NUMS (32)
-#define I810_BD_SIZE \
- (I810_BD_NUMS * sizeof (i810_bd_entry_t))
-
-#define I810_BSIZE (8*1024)
-
-#define I810_NOT_SUSPENDED (0)
-#define I810_SUSPENDED (~I810_NOT_SUSPENDED)
-
-#define I810_MAX_CHANNELS (200) /* force max # chs */
-#define I810_MAX_HW_CHANNELS (32)
-#define I810_MAX_IN_CHANNELS (1)
-#define I810_MAX_OUT_CHANNELS \
- (I810_MAX_HW_CHANNELS - I810_MAX_IN_CHANNELS)
-#define I810_INPUT_STREAM (31)
-#define I810_PORT_UNMUTE (0xffffffff)
-
-#define I810_KIOP(X) ((kstat_intr_t *)(X->i810_ksp->ks_data))
-
-#define I810_MOD_SIZE (16)
-#define I810_PLAY_BUF_SZ (1024)
-#define I810_RECORD_BUF_SZ (1024)
-#define I810_BUF_MIN (512)
-#define I810_BUF_MAX (8192)
-
-/* The size of each entry of "reg" property is 5 integers */
-#define I810_INTS_PER_REG_PROP 5
-
-/* The index to the size of address space for each entry of "reg" property */
-#define I810_REG_PROP_ADDR_LEN_IDX 4
-
-/* offset from the base of specified DMA engine */
-#define I810_OFFSET_BD_BASE (0x00)
-#define I810_OFFSET_CIV (0x04)
-#define I810_OFFSET_LVI (0x05)
-#define I810_OFFSET_SR (0x06)
-#define I810_OFFSET_PICB (0x08)
-#define I810_OFFSET_PIV (0x0A)
-#define I810_OFFSET_CR (0x0B)
-
-/* DMA engine offset from base */
-#define I810_BASE_PCM_IN (0x00)
-#define I810_BASE_PCM_OUT (0x10)
-#define I810_BASE_MIC (0x20)
-
-/* PCM in bus master registers */
-#define I810_PCM_IN_BD_BASE (I810_OFFSET_BD_BASE)
-#define I810_PCM_IN_CIV (I810_OFFSET_CIV)
-#define I810_PCM_IN_LVI (I810_OFFSET_LVI)
-#define I810_PCM_IN_SR (I810_OFFSET_SR)
-#define I810_PCM_IN_PICB (I810_OFFSET_PICB)
-#define I810_PCM_IN_PIV (I810_OFFSET_PIV)
-#define I810_PCM_IN_CR (I810_OFFSET_CR)
-
-#define I810_PCM_OUT_BD_BASE (I810_OFFSET_BD_BASE + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_CIV (I810_OFFSET_CIV + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_LVI (I810_OFFSET_LVI + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_SR (I810_OFFSET_SR + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_PICB (I810_OFFSET_PICB + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_PIV (I810_OFFSET_PIV + I810_BASE_PCM_OUT)
-#define I810_PCM_OUT_CR (I810_OFFSET_CR + I810_BASE_PCM_OUT)
-
-
-#define I810_MIC_BD_BASE (I810_OFFSET_BD_BASE + I810_BASE_MIC)
-#define I810_MIC_CIV (I810_OFFSET_CIV + I810_BASE_MIC)
-#define I810_MIC_LVI (I810_OFFSET_LVI +I810_BASE_MIC)
-#define I810_MIC_SR (I810_OFFSET_SR + I810_BASE_MIC)
-#define I810_MIC_PICB (I810_OFFSET_PICB + I810_BASE_MIC)
-#define I810_MIC_PIV (I810_OFFSET_PIV + I810_BASE_MIC)
-#define I810_MIC_CR (I810_OFFSET_CR + I810_BASE_MIC)
-
-#define I810_REG_GCR 0x2C
-#define I810_REG_GSR 0x30
-#define I810_REG_CASR 0x34
-
-/* bits of bus master status register */
-#define I810_BM_SR_DCH 0x01
-#define I810_BM_SR_CELV 0x02
-#define I810_BM_SR_LVBCI 0x04
-#define I810_BM_SR_BCIS 0x08
-#define I810_BM_SR_FIFOE 0x10
-
-/* bits of bus master control register */
-#define I810_BM_CR_RUN 0x01
-#define I810_BM_CR_RST 0x02
-#define I810_BM_CR_LVBIE 0x04
-#define I810_BM_CR_FEIE 0x08
-#define I810_BM_CR_IOCE 0x10
-
-#define I810_BM_CR_PAUSE 0x00
-
-/*
- * Global Control Register
- */
-#define I810_GCR_GPIE 0x00000001
-#define I810_GCR_COLD_RST 0x00000002
-#define I810_GCR_WARM_RST 0x00000004
-#define I810_GCR_ACLINK_OFF 0x00000008
-#define I810_GCR_PRI_INTR_ENABLE 0x00000010
-#define I810_GCR_SEC_INTR_ENABLE 0x00000020
-
-/* For ICH2 or more, bit21:20 is the PCM 4/6-channel enable bits */
-#define I810_GCR_2_CHANNELS (0 << 20)
-#define I810_GCR_4_CHANNELS (1 << 20)
-#define I810_GCR_6_CHANNELS (2 << 20)
-#define I810_GCR_CHANNELS_MASK (3 << 20)
-
-/*
- * Global Status Register
- */
-#define I810_GSR_TRI_READY 0x10000000 /* for ICH4/5 */
-#define I810_GSR_READ_COMPL 0x00008000
-#define I810_GSR_INTR_SEC_RESUME 0x00000800
-#define I810_GSR_INTR_PRI_RESUME 0x00000400
-#define I810_GSR_SEC_READY 0x00000200
-#define I810_GSR_PRI_READY 0x00000100
-#define I810_GSR_INTR_MIC 0x00000080
-#define I810_GSR_INTR_POUT 0x00000040
-#define I810_GSR_INTR_PIN 0x00000020
-#define I810_GSR_INTR_MO 0x00000004
-#define I810_GSR_INTR_MI 0x00000002
-#define I810_GSR_INTR_GSI 0x00000001
-#define I810_GSR_USE_INTR 0x00000060 /* PCM-IN ,PCM-OUT */
-
-/*
- * Macro for AD1980 codec
- */
-#define AD1980_VID1 0x4144
-#define AD1980_VID2 0x5370
-#define AD1985_VID2 0x5375
-#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
-#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
-#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
-#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
-/*
- * chunk buffer
- */
-struct i810_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct i810_bdlist_chunk i810_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct i810_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- i810_bdlist_chunk_t chunk[2]; /* 2 chunks for each buffers */
-};
-typedef struct i810_sample_buf i810_sample_buf_t;
-
-
-/*
- * buffer descripter list entry, sees datasheet
- */
-struct i810_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t reserved:14;
- uint8_t cmd_bup:1;
- uint8_t cmd_ioc:1;
-};
-typedef struct i810_bd_entry i810_bd_entry_t;
-
-/*
- * audio810_state_t -per instance state and operation data
- */
-struct audio810_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audio810_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64]; /* shadow of AC97 registers */
-
- boolean_t var_sr; /* variable sample rate ? */
- boolean_t swap_out; /* swap line-out and sur-out */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- ddi_acc_handle_t bm_regs_handle; /* for bus master register */
- caddr_t am_regs_base; /* base of audio mixer regs */
- caddr_t bm_regs_base; /* base of bus master regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- void *bdl_virtual; /* virtual address of BDL */
- size_t bdl_size; /* real len of BDL */
- i810_bd_entry_t *bdl_virt_pin; /* vaddr of PCM in BDL */
- i810_bd_entry_t *bdl_virt_pout; /* vaddr of PCM out BDL */
- uint32_t bdl_phys_pin; /* phys addr of PCM in BDL */
- uint32_t bdl_phys_pout; /* phys addr of PCM in BDL */
-
- i810_sample_buf_t play_buf; /* buffer for playback */
- i810_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t i810_defaults; /* default state for dev */
- audio_device_t i810_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *i810_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t i810_psample_rate; /* play sample rate */
- uint_t i810_pchannels; /* play channels */
- uint_t i810_pprecision; /* play precision */
- uint_t i810_csample_rate; /* record sample rate */
- uint_t i810_cchannels; /* record channels */
- uint_t i810_cprecision; /* record precision */
- uint_t i810_output_port; /* current out port */
- uint_t i810_input_port; /* current input port */
- uint_t i810_monitor_gain; /* monitor gain */
- int i810_csamples; /* pcm-in samples/interrupt */
- int i810_psamples; /* pcm-out samples/intr */
-
- uint32_t i810_res_flags; /* resource flags */
- int i810_suspended; /* suspend/resume state */
- int i810_busy_cnt; /* device busy count */
- kcondvar_t i810_cv; /* suspend/resume cond. var */
-};
-typedef struct audio810_state audio810_state_t;
-
-/* audio810_state_t.flags defines */
-#define I810_DMA_PLAY_STARTED 0x00000001 /* play DMA eng. initialized */
-#define I810_DMA_PLAY_PAUSED 0x00000002 /* play DMA engine paused */
-#define I810_DMA_PLAY_EMPTY 0x00000004 /* play DMA engine empty */
-#define I810_DMA_RECD_STARTED 0x00000010 /* record DMA engine started */
-
-
-
-/* bits of audio810_state_t.i810_res_flags */
-#define I810_RS_PCI_REGS 0x0001
-#define I810_RS_AM_REGS 0x0002
-#define I810_RS_BM_REGS 0x0004
-#define I810_RS_DMA_BDL_HANDLE 0x0008
-#define I810_RS_DMA_BDL_MEM 0x0010
-#define I810_RS_DMA_BDL_BIND 0x0020
-
-
-/*
- * Useful bit twiddlers
- */
-#define I810_BM_GET8(reg) \
- ddi_get8(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_GET16(reg) \
- ddi_get16(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_GET32(reg) \
- ddi_get32(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)))
-
-#define I810_BM_PUT8(reg, val) \
- ddi_put8(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_BM_PUT16(reg, val) \
- ddi_put16(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_BM_PUT32(reg, val) \
- ddi_put32(statep->bm_regs_handle, \
- (void *)((char *)statep->bm_regs_base + (reg)), (val))
-
-#define I810_AM_GET16(reg) \
- ddi_get16(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)))
-
-#define I810_AM_PUT16(reg, val) \
- ddi_put16(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)), (val))
-
-#endif /* _KERNEL */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO810_IMPL_H_ */
diff --git a/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h b/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h
deleted file mode 100644
index 0dec342e63..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio_mixer_impl.h
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the audio mixer
- * audio personality module. It is NOT to be distributed with Solaris or
- * included in any audio drivers.
- */
-
-#ifndef _SYS_AUDIO_MIXER_IMPL_H
-#define _SYS_AUDIO_MIXER_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AM_MAX_GAIN_SHIFT 8 /* 1 more then 255, but close */
-#define AM_BALANCE_SHIFT 5
-
-#define AM_MIN_CHS 1
-
-/*
- * Flow control is used to keep too many buffers from being allocated.
- * However, sometimes we come across apps that have a problem with flow
- * control. Therefore we can comment out and turn off flow control temporarily
- * so we can debug the app and come up with a work around.
- */
-#define FLOW_CONTROL
-
-/*
- * Miscellaneous defines
- */
-#define AM_INT16_SHIFT 1
-#define AM_INT32_SHIFT 2
-#define AM_256_SHIFT 8
-#define AM_8_SHIFT 3
-#define AM_HALF_ENERGY_SHIFT 1
-#define AM_TIMES_2_SHIFT 1
-#define AM_TIMES_4_SHIFT 2
-#define AM_TIMES_8_SHIFT 3
-#define AM_TIMES_16_SHIFT 4
-#define AM_TIMES_32_SHIFT 5
-
-#define AM_MIN_MIX_BUFSIZE 48000
-#define AM_DEFAULT_MIX_BUFSIZE (AM_MIN_MIX_BUFSIZE * 4 * 2)
-#define AM_MAX_QUEUED_MSGS_CNT 500
-#define AM_MIN_QUEUED_MSGS_CNT 200
-
-#define AM_DEFAULT_MIXER_GAIN (AUDIO_MAX_GAIN*3/4)
-
-#define AM_MAX_QUEUED_MSGS 4
-
-#define AM_MAX_SAMPLES (1024*1024)
-
-#define AM_SINGLE_OPEN 0
-#define AM_MULTIPLE_OPEN 1
-
-#define AM_NOT_MUTED 0
-#define AM_MUTED (~AM_NOT_MUTED)
-
-#define AM_NO_FORCE 0
-#define AM_FORCE (~AM_NO_FORCE)
-
-#define AM_NO_SERIALIZE 0
-#define AM_SERIALIZE (~AM_NO_SERIALIZE)
-
-#define AM_MISC_MASK 0x00000003
-#define AM_CHAR2INT_MASK 0x000000ff
-
-#define AM_NO_PID 0
-#define AM_SET_WAITING 1
-#define AM_CLEAR_WAITING 0
-#define AM_SET_RECORD 1
-#define AM_NOT_RECORD 0
-#define AM_SET_PLAY 1
-#define AM_NOT_PLAY 0
-
-#define AM_EXTRA_SAMPLES 16
-
-/* Private mixer return codes */
-#define AM_CHNL_CLOSED (-2) /* Channel closed while processing */
-
-/*
- * The sample rate conversion handle is implemented as the channel pointer.
- * But the sample rate converter doesn't have to know about this at all.
- */
-#define AM_SRC_CHPTR2HDL(chptr) ((srchdl_t)(chptr))
-#define AM_SRC_HDL2CHPTR(hdl) ((audio_ch_t *)(hdl))
-
-/* audio mixer ioctl/iocdata commands */
-#define AM_COPY_OUT_AUDIOINFO (MIOC|1) /* AUDIO_GETINFO */
-#define AM_COPY_OUT_AUDIOINFO2 (MIOC|2) /* AUDIO_SETINFO */
-#define AM_COPY_IN_AUDIOINFO (MIOC|3) /* AUDIO_SETINFO */
-#define AM_COPY_IN_DIAG_LOOPB (MIOC|4) /* AUDIO_DIAG_LOOPBACK */
-#define AM_COPY_OUT_GETDEV (MIOC|5) /* AUDIO_GETDEV */
-#define AM_COPY_OUT_SAMP_RATES (MIOC|6) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_IN_SAMP_RATES (MIOC|7) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_IN_SAMP_RATES2 (MIOC|8) /* AUDIO_MIXER_GET_SAMPLE... */
-#define AM_COPY_OUT_MIXCTLINFO (MIOC|9) /* AUDIO_MIXERCTL_GETINFO */
-#define AM_COPY_IN_MIXCTLINFO (MIOC|10) /* AUDIO_MIXERCTL_SETINFO */
-#define AM_COPY_OUT_MIXCTL_CHINFO (MIOC|11) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_CHINFO2 (MIOC|12) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_IN_MIXCTL_GET_CHINFO (MIOC|13) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_GET_CHINFO (MIOC|14) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_GET_CHINFO2 (MIOC|15) /* AUDIO_MIXERCTL_GET_CHINFO */
-#define AM_COPY_IN_MIXCTL_SET_CHINFO (MIOC|16) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_IN_MIXCTL_SET_CHINFO2 (MIOC|17) /* AUDIO_MIXERCTL_SET_CHINFO */
-#define AM_COPY_OUT_MIXCTL_MODE (MIOC|18) /* AUDIO_MIXERCTL_GET_MODE */
-#define AM_COPY_IN_MIXCTL_MODE (MIOC|19) /* AUDIO_MIXERCTL_SET_MODE */
-
-/*
- * am_ch_private_t - audio mixer channel private data
- */
-struct am_ch_private {
- uint_t acp_flags; /* channel flags */
- boolean_t acp_reading; /* true for RD channel */
- boolean_t acp_writing; /* true for WR channel */
- int acp_EOF[2]; /* # of EOF signals to send */
- int acp_EOF_toggle; /* toggle for EOF signals */
- int acp_psamples_f; /* sample frame count mp_orig */
- int acp_psamples_c; /* samples in buf to play */
- int acp_psamples_p; /* samples in played buf */
- int acp_busy_cnt; /* # of calls outstanding */
- mblk_t *acp_drain_mp; /* saved mblk_t for DRAIN */
- mblk_t *acp_rec_mp; /* record message block */
- int acp_rec_remaining; /* # bytes left in mp buf */
- int *acp_play_samp_buf; /* play sample buf space */
- size_t acp_psb_size; /* size of play_samp_buf */
- void *acp_play_src_data; /* play src data */
- void *acp_rec_src_data; /* rec. src data */
- void *acp_ch_psrc1; /* play src buffer #1 */
- void *acp_ch_psrc2; /* play src buffer #2 */
- void *acp_ch_pconv1; /* play conversion buffer #1 */
- void *acp_ch_pconv2; /* play conversion buffer #1 */
- size_t acp_ch_psrc_siz; /* play src buffer size */
- size_t acp_ch_pconv_siz; /* play converter buf. size */
- size_t acp_ch_pbuf_size; /* play prebuffer size */
- void *acp_ch_rsrc1; /* record src buffer #1 */
- void *acp_ch_rsrc2; /* record src buffer #2 */
- void *acp_ch_rconv1; /* record conv. buffer #1 */
- void *acp_ch_rconv2; /* record conv. buffer #1 */
- size_t acp_ch_rsrc_siz; /* record src buffer size */
- size_t acp_ch_rconv_siz; /* record converter buf siz */
- size_t acp_ch_rbuf_size; /* record prebuffer size */
-};
-typedef struct am_ch_private am_ch_private_t;
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_ch::ch_lock, am_ch_private))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_ch_private::acp_play_src_data))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_ch_private::acp_rec_src_data))
-
-/* am_ch_private.acp_flags defines */
-#define AM_CHNL_OPEN 0x00001u /* channel open if set */
-#define AM_CHNL_MULTI_OPEN 0x00002u /* PID may open multiple streams */
-#define AM_CHNL_DRAIN 0x00004u /* want drain semantics if set */
-#define AM_CHNL_DRAIN_NEXT_INT 0x00008u /* signal drain on next intr, step 1 */
-#define AM_CHNL_CLOSING 0x00010u /* the channel is being closed */
-#define AM_CHNL_ALMOST_EMPTY1 0x00020u /* 0 data for ch but data in DMA buf */
-#define AM_CHNL_ALMOST_EMPTY2 0x00040u /* 0 data for ch but data in DMA buf */
-#define AM_CHNL_EMPTY 0x00080u /* the channel doesn't have any data */
-#define AM_CHNL_CONTROL 0x00100u /* AUDIOCTL in same proc as AUDIO */
-#define AM_CHNL_CLIMIT 0x00200u /* used 2 limit allocb() failed msgs */
-#define AM_CHNL_PFLOW 0x00400u /* play side has been flow cntrlled */
-#define AM_CHNL_RSTREAMS_SET 0x00800u /* rec side's STREAMS H2O marks set */
-#define AM_CHNL_MSG_ON_QUEUE 0x01000u /* data message on STREAMS Q */
-#define AM_CHNL_IOCTL_TASK 0x08000u /* ioctl() task scheduled */
-#define AM_CHNL_QPROCSOFF 0x10000u /* qprocsoff() has been called */
-#define AM_CHNL_SIGNAL_NEEDED 0x20000u /* someone needs to send a signal */
-
-/*
- * am_apm_persist_t - audio mixer persistent private state data
- */
-struct am_apm_persist {
- int apm_mode; /* mixer mode */
- int apm_mpgain; /* saved master play gain, mixer mode */
- int apm_mpbal; /* saved master play bal, mixer mode */
- int apm_mrgain; /* saved master rec. gain, mixer mode */
- int apm_mrbal; /* saved master rec. bal, mixer mode */
- uint_t apm_pgain; /* saved play gain */
- uint_t apm_pbal; /* saved play balance */
- uint_t apm_pport; /* saved play port */
- uint_t apm_pmute; /* saved output muted */
- uint_t apm_rgain; /* saved record gain */
- uint_t apm_rbal; /* saved record balance */
- uint_t apm_rport; /* saved record port */
- uint_t apm_mgain; /* saved monitor gain */
-};
-typedef struct am_apm_persist am_apm_persist_t;
-
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mode))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mpgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mpbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mrgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mrbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pport))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_pmute))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rgain))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rbal))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_rport))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_persist::apm_mgain))
-
-/*
- * am_apm_private_t - audio mixer state private data
- */
-struct am_apm_private {
- kmutex_t am_mode_lock; /* lock for mode switch cv */
- kcondvar_t am_mode_cv; /* used to switch modes only */
- kmutex_t am_ad_lock; /* lock for calling driver */
- kcondvar_t am_ad_cv; /* serializes calls into drvr */
- int am_ad_in; /* set when calling driver */
- audio_info_t am_hw_info; /* pseudo hardware state */
- mblk_t *am_sig_mp; /* signal STREAMS message */
- audio_taskq_t am_taskq; /* h/w task queue */
- void *am_args; /* qtimeout() args */
- int *am_mix_buf; /* buffer to mix audio in */
- size_t am_mix_size; /* the size of the buffer */
- int *am_send_buf; /* buffer to send audio from */
- size_t am_send_size; /* the size of the buffer */
- uint_t am_flags; /* flags for the audio mixer */
- uint_t am_pflags; /* play flags for the mixer */
- uint_t am_rflags; /* record flags for the mixer */
- int am_channels; /* current channels */
- int am_in_chs; /* current record channels */
- int am_out_chs; /* current play channels */
- int am_max_in_chs; /* R/O, max input channels */
- int am_max_out_chs; /* R/O, max output channels */
- uint_t am_hw_pchs; /* the real h/w play channels */
- uint_t am_hw_pprec; /* the real h/w play prec. */
- uint_t am_hw_penc; /* the real h/w play encoding */
- uint_t am_hw_rchs; /* the real h/w rec. channels */
- uint_t am_hw_rprec; /* the real h/w rec. prec. */
- uint_t am_hw_renc; /* the real h/w rec. encoding */
- uint_t am_save_psr; /* saved play sample rate */
- uint_t am_save_rsr; /* saved record sample rate */
- uint_t am_save_hw_rgain; /* saved h/w record gain */
- am_apm_persist_t *am_pstate; /* persistent state */
-};
-typedef struct am_apm_private am_apm_private_t;
-
-/* defines for am_apm_private.am_ad_in */
-#define AM_APM_IN_DRIVER 0x00000001 /* mixer is calling driver */
-#define AM_APM_FREEZE 0x00000002 /* mixer can't call driver */
-#define AM_APM_FORCE 0x00000004 /* force driver calls */
-
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock, am_apm_private::am_flags))
-_NOTE(MUTEX_PROTECTS_DATA(audio_apm_info::apm_lock,
- am_apm_private::am_send_size))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_channels))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_in_chs))
-_NOTE(MUTEX_PROTECTS_DATA(audio_state::as_lock, am_apm_private::am_out_chs))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_send_buf))
-
-/*
- * These are modified only when the taskq lock is held, which ensures a
- * single thread.
- */
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_hw_info))
-_NOTE(SCHEME_PROTECTS_DATA("method", am_apm_private::am_save_hw_rgain))
-
-/*
- * Further analysis is needed on the structure members of am_apm_private.
- */
-_NOTE(MUTEX_PROTECTS_DATA(am_apm_private::am_ad_lock, am_apm_private::am_ad_in))
-
-_NOTE(READ_ONLY_DATA(am_apm_private::am_hw_pchs
- am_apm_private::am_hw_penc
- am_apm_private::am_hw_pprec
- am_apm_private::am_hw_rchs
- am_apm_private::am_hw_renc
- am_apm_private::am_hw_rprec))
-
-/* am_apm_private.am_flags defines */
-#define AM_PRIV_ON_LINE 0x00000001u /* device on line */
-#define AM_PRIV_SW_MODES 0x00000002u /* switch between M & C mode */
-
-/* am_apm_private.am_pflags and .am_rflags defines */
-#define AM_PRIV_CH_MONO 0x00000001u /* mono supported */
-#define AM_PRIV_CH_STEREO 0x00000002u /* stereo supported */
-#define AM_PRIV_16_PCM 0x00000004u /* 16-bit PCM supported */
-#define AM_PRIV_8_PCM 0x00000008u /* 8-bit PCM supported */
-#define AM_PRIV_8_ULAW 0x00000010u /* 8-bit u-Law supported */
-#define AM_PRIV_8_ALAW 0x00000020u /* 8-bit A-Law supported */
-#define AM_PRIV_16_TRANS 0x00000040u /* do 16-bit unsigned trans */
-#define AM_PRIV_8_TRANS 0x00000080u /* do 8-bit unsigned trans */
-
-#define AM_PRIV_TASKQ_NAME "audio_mixer_taskq" /* taskq name */
-
-/*
- * The following data structures are used by taskq_dispatch() to queue up
- * ioctl() requests.
- */
-struct am_ioctl_args {
- queue_t *aia_q; /* STREAMS queue */
- mblk_t *aia_mp; /* ioctl() message block */
-};
-typedef struct am_ioctl_args am_ioctl_args_t;
-
-struct am_state_ch_args {
- audio_state_t *asca_statep; /* device state structure */
- audio_apm_info_t *asca_apm_infop; /* mixer infop */
- int asca_cmd; /* hw state change command */
- int asca_dir; /* direction for the update */
- int asca_value; /* value for cmd to use */
-};
-typedef struct am_state_ch_args am_state_ch_args_t;
-
-/*
- * Used only to execute a task off the taskq, so it is not shared.
- * am_sample_rates_t is defined in mixer.h.
- */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_state_ch_args))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_sample_rates))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", am_ioctl_args))
-
-/* steams stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyreq))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", copyresp))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", datab))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", iocblk))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", msgb))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", queue))
-
-/* other unshared/stable or no lock needed stuff */
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_channel))
-_NOTE(SCHEME_PROTECTS_DATA("Unshared data", audio_i_state))
-_NOTE(SCHEME_PROTECTS_DATA("method", audio_info))
-
-
-/*
- * The following routines are provided by the different source code
- * modules that make up the audio mixer.
- *
- * From am_main.c
- */
-int am_open_audio(queue_t *, dev_t *, int, int, cred_t *);
-int am_open_audioctl(queue_t *, dev_t *, int, int, cred_t *);
-int am_close_audio(queue_t *, int, cred_t *);
-int am_close_audioctl(queue_t *, int, cred_t *);
-int am_restore_state(audio_state_t *, audio_apm_info_t *, int);
-int am_save_state(audio_state_t *, audio_apm_info_t *, int);
-void am_apply_gain_balance(int *, int, int, int, int);
-void am_convert_int_mono_stereo(int *, int *, int *, int, int);
-void am_convert_to_int(void *, int *, int, int, int, int);
-int am_reprocess(audio_ch_t *, audio_data_t *data);
-void am_send_signal(audio_state_t *, am_apm_private_t *);
-int am_update_conv_buffer(audio_ch_t *, size_t, int);
-int am_update_src_buffer(audio_ch_t *, int, uint_t, int);
-
-/*
- * From am_ad.c
- */
-void am_ad_pause_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int);
-int am_ad_set_config(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int);
-int am_ad_set_format(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int, int);
-int am_ad_setup(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int, int);
-int am_ad_start_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int);
-int am_ad_start_record(audio_state_t *, am_apm_private_t *, am_ad_info_t *,
- int, int);
-void am_ad_stop_play(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int);
-void am_ad_stop_record(audio_state_t *, am_apm_private_t *, am_ad_info_t *,
- int);
-void am_ad_teardown(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int);
-int am_ck_channels(am_ad_ch_cap_t *, uint_t, boolean_t);
-int am_ck_combinations(am_ad_cap_comb_t *, int, int, boolean_t);
-int am_ck_sample_rate(am_ad_ch_cap_t *, int, int);
-void am_safe_putnext(audio_ch_t *, mblk_t *);
-int am_test_canputnext(audio_ch_t *);
-int am_set_record_streams(audio_ch_t *);
-
-/*
- * From am_ioctl.c
- */
-int am_wiocdata(queue_t *, mblk_t *, audio_ch_t *);
-int am_wioctl(queue_t *, mblk_t *, audio_ch_t *);
-void am_audio_drained(audio_ch_t *);
-int am_audio_set_info(audio_ch_t *, audio_info_t *, audio_info_t *);
-int am_set_format(audio_state_t *, am_apm_private_t *, am_ad_info_t *, int,
- int, int, int, int, int, int, int);
-int am_set_gain(audio_state_t *, audio_apm_info_t *, uint_t, uint_t,
- uint_t, int, int, int, int);
-
-/*
- * From g711.h
- */
-extern int16_t _8alaw2linear16[256];
-extern int8_t _8alaw2linear8[256];
-extern int16_t _8ulaw2linear16[256];
-extern int8_t _8ulaw2linear8[256];
-extern uint8_t _13linear2alaw8[0x2000];
-extern uint8_t _14linear2ulaw8[0x4000];
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_MIXER_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audio_support_impl.h b/usr/src/uts/common/sys/audio/impl/audio_support_impl.h
deleted file mode 100644
index 8b77323ef6..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audio_support_impl.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- *
- * This header file defines the internal interfaces for the audio support
- * module. It is NOT to be distributed with Solaris.
- */
-
-#ifndef _SYS_AUDIO_SUPPORT_IMPL_H
-#define _SYS_AUDIO_SUPPORT_IMPL_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define AUDIO_MINOR_AUDIO 0 /* /dev/audio */
-#define AUDIO_MINOR_AUDIOCTL 1 /* /dev/audioctl */
-#define AUDIO_MINOR_WAVE_TABLE 2 /* reserved for future */
-#define AUDIO_MINOR_MIDI_PORT 3 /* reserved for future */
-#define AUDIO_MINOR_TIME 4 /* reserved for future */
-#define AUDIO_MINOR_USER1 7 /* reserved for future */
-#define AUDIO_MINOR_USER2 8 /* reserved for future */
-#define AUDIO_MINOR_USER3 9 /* reserved for future */
-
-#define AUDIO_MAX(a, b) ((a) > (b) ? (a) : (b))
-#define AUDIO_MAX4(w, x, y, z) AUDIO_MAX(AUDIO_MAX(w, x), \
- AUDIO_MAX(y, z))
-
-/* audio support ioctl/iocdata commands */
-#define AUDIO_COPY_OUT_CH_NUMBER (AIOC|1) /* AUDIO_GET_CH_NUM */
-#define AUDIO_COPY_OUT_CH_TYPE (AIOC|2) /* AUDIO_GET_CH_TYPE */
-#define AUDIO_COPY_OUT_NUM_CHS (AIOC|3) /* AUDIO_GET_NUM_CHS */
-#define AUDIO_COPY_OUT_AD_DEV (AIOC|4) /* AUDIO_GET_AD_DEV */
-#define AUDIO_COPY_OUT_APM_DEV (AIOC|5) /* AUDIO_GET_APM_DEV */
-#define AUDIO_COPY_OUT_AS_DEV (AIOC|6) /* AUDIO_GET_AS_DEV */
-
-/*
- * Macros used to convert between the opaque audio taskq handles and the
- * true taskq handles. Also standard taskq defines.
- */
-#define AUDIO_AUDIOTQHDL2TQHDL(atqhdl) ((taskq_t *)(atqhdl))
-#define AUDIO_TQHDL2AUDIOTQHDL(tqhdl) ((audio_taskq_t)(tqhdl))
-
-#define AUDIO_SUP_TASKQ_NTHREADS (1)
-#define AUDIO_SUP_TASKQ_MINALLOC 4 /* min taskq structs */
-#define AUDIO_SUP_TASKQ_MAXALLOC 100 /* max taskq structs */
-
-/*
- * audio_inst_list_t - structure that describes the audio device instance
- */
-struct audio_inst_info {
- struct audio_inst_info *ail_next; /* linking in driver list */
- audio_state_t ail_state; /* state struct for this inst */
-};
-typedef struct audio_inst_info audio_inst_info_t;
-
-/*
- * audio_qptr_t - structure used to store private data in the STREAM
- */
-struct audio_qptr {
- dev_t aq_dev; /* device name */
- void *aq_data; /* STREAM private data */
-};
-typedef struct audio_qptr audio_qptr_t;
-
-/* audiosup module key for persistent memory, one per system */
-#define AUDIO_SUP_KEY "AUDIO:audiosup master anchor key"
-
-/* audiosup module instance key for persistent memory, one per dev instance */
-#define AUDIO_KEY_CLASS "AUDIO:"
-
-/*
- * audio_apm_persist_t - structure for instance APM persistent memory storage
- */
-struct audio_apm_persist {
- audio_device_type_e ap_apm_type; /* APM type, one per instance */
- void *ap_data; /* per APM data */
- size_t ap_size; /* size of the data */
- struct audio_apm_persist *ap_next; /* next item */
-};
-typedef struct audio_apm_persist audio_apm_persist_t;
-
-/*
- * audio_inst_persist_t - instance persistent data
- */
-struct audio_inst_persist {
- char *amp_key; /* persistent data key */
- major_t amp_major; /* device major number */
- int amp_instance; /* instance number */
- audio_apm_persist_t *amp_apmp; /* ptr to APM persistent data */
- struct audio_inst_persist *amp_next; /* next structure */
-};
-typedef struct audio_inst_persist audio_inst_persist_t;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_SUPPORT_IMPL_H */
diff --git a/usr/src/uts/common/sys/audio/impl/audioixp_impl.h b/usr/src/uts/common/sys/audio/impl/audioixp_impl.h
deleted file mode 100644
index 4ce55d8e16..0000000000
--- a/usr/src/uts/common/sys/audio/impl/audioixp_impl.h
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIOIXP_IMPL_H_
-#define _SYS_AUDIOIXP_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _KERNEL
-
-#define IXP_CONFIG_REGS (0) /* PCI configure register */
-#define IXP_IO_AM_REGS (1) /* PCI base register 0x10 */
-
-#define IXP_IDNUM (0x6175)
-#define IXP_MINPACKET (0)
-#define IXP_MAXPACKET (1*1024)
-#define IXP_HIWATER (64*1024)
-#define IXP_LOWATER (32*1024)
-
-#define IXP_DMA_PCM_IN (1)
-#define IXP_DMA_PCM_OUT (2)
-
-#define IXP_KIOP(X) ((kstat_intr_t *)(X->ixp_ksp->ks_data))
-
-/*
- * PCI configuration registers and bits
- */
-#define IXP_PCI_REG_VID (0x00)
-#define IXP_PCI_VID (0x1002)
-
-#define IXP_PCI_REG_DID (0x02)
-#define IXP_PCI_DID (0x4370)
-
-#define IXP_PCI_REG_CMD (0x04)
-#define IXP_PCI_CMD_MEM_ACC_EN (0x0002)
-#define IXP_PCI_CMD_MASTER_EN (0x0004)
-#define IXP_PCI_CMD_MEM_WR_INVAL_EN (0x0010)
-#define IXP_PCI_CMD_PARITY_ERR_RESP (0x0040)
-#define IXP_PCI_CMD_SERR_EN (0x0100)
-#define IXP_PCI_CMD_INTA_EN (0x0400)
-
-#define IXP_PCI_REG_STS (0x06)
-#define IXP_PCI_STS_INTA (0x0008)
-#define IXP_PCI_STS_CAP_LIST (0x0010)
-#define IXP_PCI_STS_66M_CAP (0x0020)
-#define IXP_PCI_STS_FAST_B2B_CAP (0x0080)
-#define IXP_PCI_STS_MASTER_PARITY_ERROR (0x0100)
-#define IXP_PCI_STS_RECEIVED_TARGET_ABORT (0x1000)
-#define IXP_PCI_STS_RECEIVED_MASTER_ABORT (0x2000)
-#define IXP_PCI_STS_SERR (0x4000)
-#define IXP_PCI_STS_PARITY_ERR (0x8000)
-
-#define IXP_PCI_REG_REV_ID_CLS_CODE (0x08)
-#define IXP_PCI_REV_ID_400 (0x00)
-#define IXP_PCI_REV_ID_450 (0x80)
-#define IXP_PCI_CLS_CODE (0x040100)
-
-#define IXP_PCI_REG_CACHE_LINE_SIZE (0x0c)
-#define IXP_PCI_REG_LATENCY_TIMER (0x0d)
-#define IXP_PCI_REG_HEADER_TYPE (0x0e)
-#define IXP_PCI_REG_BUILTIN_SELF_TEST (0x0f)
-#define IXP_PCI_REG_BA0 (0x10)
-#define IXP_PCI_REG_BA1 (0x14)
-#define IXP_PCI_REG_BA2 (0x18)
-#define IXP_PCI_REG_BA3 (0x1c)
-#define IXP_PCI_REG_BA4 (0x20)
-#define IXP_PCI_REG_BA5 (0x24)
-#define IXP_PCI_REG_CARDBUS_CIS_POINTER (0x28)
-#define IXP_PCI_REG_SUB_ID (0x2c)
-#define IXP_PCI_REG_EX_ROM_BA (0x30)
-#define IXP_PCI_REG_CAP_P (0x34)
-#define IXP_PCI_REG_INT_LINE (0x3c)
-#define IXP_PCI_REG_INT_PIN (0x3d)
-#define IXP_PCI_REG_MIN_GRANT (0x3e)
-#define IXP_PCI_REG_MAX_LATENCY (0x3f)
-#define IXP_PCI_REG_MSI_CAP_REG_SET_ID (0x40)
-#define IXP_PCI_REG_MSI_MSG_CTRL (0x42)
-#define IXP_PCI_REG_MSI_MSG_ADDR (0x44)
-#define IXP_PCI_REG_MSI_MSG_DATA (0x48)
-#define IXP_PCI_REG_MSI_PROGRAM_WEIGHT (0x4c)
-#define IXP_PCI_REG_UNMASK_LATENCY_TIMER_EXPIRATION (0x50)
-
-/*
- * Audio controller registers and bits
- */
-#define IXP_AUDIO_INT (0x00)
-#define IXP_AUDIO_INT_IN_DMA_OVERFLOW (1U<<0)
-#define IXP_AUDIO_INT_IN_DMA (1U<<1)
-#define IXP_AUDIO_INT_OUT_DMA_UNDERFLOW (1U<<2)
-#define IXP_AUDIO_INT_OUT_DMA (1U<<3)
-#define IXP_AUDIO_INT_CODEC0_NOT_READY (1U<<10)
-#define IXP_AUDIO_INT_CODEC1_NOT_READY (1U<<11)
-#define IXP_AUDIO_INT_CODEC2_NOT_READY (1U<<12)
-#define IXP_AUDIO_INT_NEW_FRAME (1U<<13)
-
-#define IXP_AUDIO_INT_EN (0x04)
-#define IXP_AUDIO_INT_EN_IN_DMA_OVERFLOW (1U<<0)
-#define IXP_AUDIO_INT_EN_STATUS (1U<<1)
-#define IXP_AUDIO_INT_EN_OUT_DMA_UNDERFLOW (1U<<2)
-#define IXP_AUDIO_INT_EN_CODEC0_NOT_READY (1U<<10)
-#define IXP_AUDIO_INT_EN_CODEC1_NOT_READY (1U<<11)
-#define IXP_AUDIO_INT_EN_CODEC2_NOT_READY (1U<<12)
-#define IXP_AUDIO_INT_EN_NEW_FRAME (1U<<13)
-
-#define IXP_AUDIO_CMD (0x08)
-#define IXP_AUDIO_CMD_POWER_DOWN (1U<<0)
-#define IXP_AUDIO_CMD_EN_IN (1U<<1)
-#define IXP_AUDIO_CMD_EN_OUT (1U<<2)
-#define IXP_AUDIO_CMD_EN_IN_DMA (1U<<8)
-#define IXP_AUDIO_CMD_EN_OUT_DMA (1U<<9)
-#define IXP_AUDIO_CMD_INTER_IN (1U<<21)
-#define IXP_AUDIO_CMD_INTER_OUT (1U<<22)
-#define IXP_AUDIO_CMD_BURST_EN (1U<<25)
-#define IXP_AUDIO_CMD_AC_ACTIVE (1U<<28)
-#define IXP_AUDIO_CMD_AC_SOFT_RESET (1U<<29)
-#define IXP_AUDIO_CMD_AC_SYNC (1U<<30)
-#define IXP_AUDIO_CMD_AC_RESET (1U<<31)
-
-#define IXP_AUDIO_OUT_PHY_ADDR_DATA (0x0c)
-#define IXP_AUDIO_OUT_PHY_PRIMARY_CODEC (0u)
-#define IXP_AUDIO_OUT_PHY_SECOND_CODEC (1u)
-#define IXP_AUDIO_OUT_PHY_THIRD_CODEC (2u)
-#define IXP_AUDIO_OUT_PHY_READ (1u<<2)
-#define IXP_AUDIO_OUT_PHY_WRITE (0u)
-#define IXP_AUDIO_OUT_PHY_EN (1u<<8)
-#define IXP_AUDIO_OUT_PHY_ADDR_SHIFT (9)
-#define IXP_AUDIO_OUT_PHY_ADDR_MASK (0x7fu<<9)
-#define IXP_AUDIO_OUT_PHY_DATA_SHIFT (16)
-#define IXP_AUDIO_OUT_PHY_DATA_MASK (0xffffu<<16)
-
-#define IXP_AUDIO_IN_PHY_ADDR_DATA (0x10)
-#define IXP_AUDIO_IN_PHY_READY (1u<<8)
-#define IXP_AUDIO_IN_PHY_ADDR_SHIFT (9)
-#define IXP_AUDIO_IN_PHY_ADDR_MASK (0x7fu<<9)
-#define IXP_AUDIO_IN_PHY_DATA_SHIFT (16)
-#define IXP_AUDIO_IN_PHY_DATA_MASK (0xffffu<<16)
-
-#define IXP_AUDIO_SLOTREQ (0x14)
-#define IXP_AUDIO_COUNTER (0x18)
-#define IXP_AUDIO_IN_FIFO_THREASHOLD (0x1c)
-#define IXP_AUDIO_IN_DMA_LINK_P (0x20)
-#define IXP_AUDIO_IN_DMA_LINK_P_EN (1u<<0)
-
-#define IXP_AUDIO_IN_DMA_DT_START (0x24)
-#define IXP_AUDIO_IN_DMA_DT_NEXT (0x28)
-#define IXP_AUDIO_IN_DMA_DT_CUR (0x2c)
-#define IXP_AUDIO_IN_DT_SIZE_FIFO_INFO (0x30)
-
-#define IXP_AUDIO_OUT_DMA_SLOT_EN_THRESHOLD (0x34)
-#define IXP_AUDIO_OUT_DMA_SLOT_3 (1U<<0)
-#define IXP_AUDIO_OUT_DMA_SLOT_4 (1U<<1)
-#define IXP_AUDIO_OUT_DMA_SLOT_5 (1U<<2)
-#define IXP_AUDIO_OUT_DMA_SLOT_6 (1U<<3)
-#define IXP_AUDIO_OUT_DMA_SLOT_7 (1U<<4)
-#define IXP_AUDIO_OUT_DMA_SLOT_8 (1U<<5)
-#define IXP_AUDIO_OUT_DMA_SLOT_9 (1U<<6)
-#define IXP_AUDIO_OUT_DMA_SLOT_10 (1U<<7)
-#define IXP_AUDIO_OUT_DMA_SLOT_11 (1U<<8)
-#define IXP_AUDIO_OUT_DMA_SLOT_12 (1U<<9)
-#define IXP_AUDIO_OUT_DMA_THRESHOLD_MASK (0x7fU<<11)
-#define IXP_AUDIO_OUT_DMA_THRESHOLD_SHIFT (11)
-
-#define IXP_AUDIO_OUT_DMA_LINK_P (0x38)
-#define IXP_AUDIO_OUT_DMA_LINK_P_EN (1U<<0)
-
-#define IXP_AUDIO_OUT_DMA_DT_START (0x3c)
-#define IXP_AUDIO_OUT_DMA_DT_NEXT (0x40)
-#define IXP_AUDIO_OUT_DMA_DT_CUR (0x44)
-#define IXP_AUDIO_OUT_DT_SIZE_USED_FREE (0x48)
-#define IXP_AUDIO_SPDIF_CMD (0x4c)
-#define IXP_AUDIO_SPDIF_LINK_P (0x50)
-#define IXP_AUDIO_SPDIF_DT_START (0x54)
-#define IXP_AUDIO_SPDIF_DT_NEXT (0x58)
-#define IXP_AUDIO_SPDIF_DT_CUR (0x5c)
-#define IXP_AUDIO_SPDIF_DT_SIZE_FIFO_INFO (0x60)
-#define IXP_AUDIO_MODEM_MIRROR (0x7c)
-#define IXP_AUDIO_AUDIO_MIRROR (0x80)
-#define IXP_AUDIO_6CH_RECORDER_EN (0x84)
-#define IXP_AUDIO_FIFO_FLUSH (0x88)
-#define IXP_AUDIO_FIFO_FLUSH_OUT (1u<<0)
-#define IXP_AUDIO_FIFO_FLUSH_IN (1u<<1)
-
-#define IXP_AUDIO_OUT_FIFO_INFO (0x8c)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG1 (0x90)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG2 (0x94)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG3 (0x98)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG4 (0x9c)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG5 (0xa0)
-#define IXP_AUDIO_SPDIF_STATUS_BITS_REG6 (0xa4)
-#define IXP_AUDIO_PHY_SEMA (0xa8)
-
-#define IXP_INIT_NO_RESTORE (1)
-#define IXP_INIT_RESTORE (0)
-#define IXP_CODEC_REG(r) ((r) >> 1)
-
-/*
- * AC97 status and link control registers are located
- * in PCI configuration space.
- */
-#define IXP_REG_GSR 0x40
-#define IXP_REG_GCR 0x41
-
-/* AC link interface status register */
-#define IXP_GSR_PRI_READY 0x01
-#define IXP_GSR_SEC_READY 0x04
-#define IXP_GSR_TRI_READY 0x10
-#define IXP_GSR_FOUR_READY 0x20
-
-#define IXP_LAST_AC_REG (0x3a)
-
-/* AC link interface control register */
-#define IXP_GCR_ENAC97 0x80
-#define IXP_GCR_RST 0x40
-#define IXP_GCR_RSYNCHI 0x20
-#define IXP_GCR_SDO 0x10
-#define IXP_GCR_VSR 0x08
-#define IXP_GCR_3D_AUDIO_CHANNEL 0x04
-
-/*
- * Macro for AD1980 codec
- */
-#define AD1980_VID1 0x4144
-#define AD1980_VID2 0x5370
-#define AD1985_VID2 0x5375
-#define CODEC_AD_REG_MISC 0x76 /* offset of ad1980 misc control reg */
-#define AD1980_MISC_LOSEL 0x0020 /* Line-out amplifier output selector */
-#define AD1980_MISC_HPSEL 0x0400 /* HP-out amplifier output selector */
-#define AD1980_SURR_MUTE 0x8080 /* Mute for surround volume register */
-
-/*
- * Macro for ALC202 codec
- */
-#define ALC202_VID1 0x414c
-#define ALC202_VID2 0x4740
-
-/* audioixp_state_t.flags defines */
-#define IXP_DMA_PLAY_STARTED 0x00000001
-#define IXP_DMA_PLAY_PAUSED 0x00000002
-#define IXP_DMA_PLAY_EMPTY 0x00000004
-#define IXP_DMA_RECD_STARTED 0x00000010
-
-#define IXP_BD_NUMS (2)
-
-/* we always have 2 chunks */
-#define IXP_CHUNK_MASK (0x1l)
-
-#define IXP_BSIZE (8*1024)
-
-#define IXP_MAX_CHANNELS (200) /* force max # chs */
-#define IXP_MAX_HW_CHANNELS (32)
-#define IXP_MAX_IN_CHANNELS (1)
-#define IXP_MAX_OUT_CHANNELS \
- (IXP_MAX_HW_CHANNELS - IXP_MAX_IN_CHANNELS)
-#define IXP_IN_STREAM (31)
-#define IXP_PORT_UNMUTE (0xffffffff)
-
-#define IXP_MOD_SIZE (32)
-#define IXP_PLAY_BUF_SZ (1024)
-#define IXP_RECORD_BUF_SZ (1024)
-#define IXP_BUF_MIN (512)
-#define IXP_BUF_MAX (8192)
-
-/*
- * chunk buffer
- */
-struct audioixp_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct audioixp_bdlist_chunk audioixp_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct audioixp_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- uint8_t avail; /* the number of available chunk(s) */
- uint8_t next; /* next bd entry to process */
- audioixp_bdlist_chunk_t
- chunk[2]; /* 2 chunks for each buffers */
- uint32_t last_hw_pointer;
-};
-typedef struct audioixp_sample_buf audioixp_sample_buf_t;
-
-
-/*
- * buffer descriptor list entry, see datasheet
- */
-struct audioixp_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t status; /* status of the buffer */
- uint16_t buf_len; /* size of the buffer in DWORD */
- uint32_t next; /* physical addr of next bd_entry */
-};
-typedef struct audioixp_bd_entry audioixp_bd_entry_t;
-
-
-/*
- * we allocate all buffer descriptors lists in continuous dma memory,
- * so just define the struct
- */
-struct audioixp_bd_list {
- audioixp_bd_entry_t pcm_in[IXP_BD_NUMS];
- audioixp_bd_entry_t pcm_out[IXP_BD_NUMS];
-};
-typedef struct audioixp_bd_list audioixp_bd_list_t;
-
-
-/*
- * audioixp_state_t -per instance state and operation data
- */
-struct audioixp_state {
- kmutex_t inst_lock; /* state protection lock */
- ddi_iblock_cookie_t intr_iblock;
- dev_info_t *dip; /* used by audioixp_getinfo() */
- audiohdl_t audio_handle; /* audio handle */
- am_ad_info_t ad_info; /* audio device info state */
- uint16_t codec_shadow[64];
- /* shadow of AC97 registers */
- boolean_t var_sr; /* variable sample rate ? */
- boolean_t swap_out; /* swap line-out and sur-out */
- ddi_acc_handle_t pci_conf_handle; /* pci configuration space */
- ddi_acc_handle_t am_regs_handle; /* for audio mixer register */
- caddr_t am_regs_base; /* base of audio mixer regs */
-
- ddi_dma_handle_t bdl_dma_handle; /* for buffer descriptor list */
- ddi_acc_handle_t bdl_acc_handle; /* access handle of bdlist */
- audioixp_bd_list_t *bdl_virtual; /* virtual address of BDL */
- audioixp_bd_list_t *bdl_phys; /* Physical address of BDL */
- size_t bdl_size; /* real len of BDL */
-
- audioixp_sample_buf_t play_buf; /* buffer for playback */
- audioixp_sample_buf_t record_buf; /* buffer for record */
- int play_buf_size; /* the size of play buffer */
- int record_buf_size; /* size of in buffer */
-
- audio_info_t ixp_defaults; /* default state for dev */
- audio_device_t ixp_dev_info; /* audio device info state */
- uint16_t vol_bits_mask; /* bits used to ctrl volume */
-
- kstat_t *ixp_ksp; /* kernel statistics */
- uint32_t flags; /* state flags */
-
- uint_t ixp_psample_rate; /* play sample rate */
- uint_t ixp_pchannels; /* play channels */
- uint_t ixp_pprecision; /* play precision */
- uint_t ixp_csample_rate; /* record sample rate */
- uint_t ixp_cchannels; /* record channels */
- uint_t ixp_cprecision; /* record precision */
- uint_t ixp_output_port; /* current out port */
- uint_t ixp_input_port; /* current input port */
- uint_t ixp_monitor_gain; /* monitor gain */
- int ixp_csamples; /* pcm-in samples/intr */
- int ixp_psamples; /* pcm-out samples/intr */
-
- uint32_t ixp_res_flags; /* resource flags */
- uint32_t ixp_codec_not_ready_bits; /* for codec detect */
-};
-typedef struct audioixp_state audioixp_state_t;
-
-/* bits of audioixp_state_t.IXP_res_flags */
-#define IXP_RS_PCI_REGS (1u<<0)
-#define IXP_RS_AM_REGS (1u<<1)
-#define IXP_RS_DMA_BDL_HANDLE (1u<<2)
-#define IXP_RS_DMA_BDL_MEM (1u<<3)
-#define IXP_RS_DMA_BDL_BIND (1u<<4)
-
-/*
- * Useful bit twiddlers
- */
-#define IXP_BM_GET8(reg) \
- pci_config_get8(statep->pci_conf_handle, reg)
-
-#define IXP_BM_GET16(reg) \
- pci_config_get16(statep->pci_conf_handle, reg)
-
-#define IXP_BM_GET32(reg) \
- pci_config_get32(statep->pci_conf_handle, reg)
-
-#define IXP_BM_PUT8(reg, val) \
- pci_config_put8(statep->pci_conf_handle, reg, val)
-
-#define IXP_BM_PUT16(reg, val) \
- pci_config_put16(statep->pci_conf_handle, reg, val)
-
-#define IXP_BM_PUT32(reg, val) \
- pci_config_put32(statep->pci_conf_handle, reg, val)
-
-#define IXP_AM_GET32(reg) \
- ddi_get32(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)))
-
-#define IXP_AM_PUT32(reg, val) \
- ddi_put32(statep->am_regs_handle, \
- (void *)((char *)statep->am_regs_base + (reg)), (val))
-
-#define IXP_AM_UPDATE8(reg, mask, value) \
- { \
- int8_t tmp; \
- tmp = IXP_AM_GET8((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_PUT8((reg), (tmp)); \
- }
-
-#define IXP_AM_UPDATE16(reg, mask, value) \
- { \
- int16_t tmp; \
- tmp = IXP_AM_GET16((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_PUT16((reg), (tmp)); \
- }
-
-#define IXP_AM_UPDATE32(reg, mask, value) \
- { \
- int32_t tmp; \
- tmp = IXP_AM_GET32((reg)); \
- tmp &= ~(mask); \
- tmp |= (value); \
- IXP_AM_PUT32((reg), (tmp)); \
- }
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOIXP_IMPL_H_ */
diff --git a/usr/src/uts/common/sys/audioio.h b/usr/src/uts/common/sys/audioio.h
index 2814eb7040..d8b4e25e68 100644
--- a/usr/src/uts/common/sys/audioio.h
+++ b/usr/src/uts/common/sys/audioio.h
@@ -19,15 +19,13 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_AUDIOIO_H
#define _SYS_AUDIOIO_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/types32.h>
#include <sys/time.h>
@@ -266,22 +264,6 @@ typedef struct audio_device audio_device_t;
*/
#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int)
-
-/*
- * Structure sent up as a M_PROTO message on trace streams
- */
-struct audtrace_hdr {
- uint_t seq; /* Sequence number (per-aud_stream) */
- int type; /* device-dependent */
-#if defined(_LP64) || defined(_I32LPx)
- struct timeval32 timestamp;
-#else
- struct timeval timestamp;
-#endif
- char _f[8]; /* filler */
-};
-typedef struct audtrace_hdr audtrace_hdr_t;
-
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/common/sys/audiovar.h b/usr/src/uts/common/sys/audiovar.h
deleted file mode 100644
index 83aff40454..0000000000
--- a/usr/src/uts/common/sys/audiovar.h
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 1991-1992, 1997-2000 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIOVAR_H
-#define _SYS_AUDIOVAR_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * The audio driver is divided into generic (device-independent) and
- * device-specific modules. The generic routines handle most STREAMS
- * protocol issues, communicating with the device-specific code via
- * function callouts and a chained control block structure.
- *
- * Separate control block lists are maintained for reading (record) and
- * writing (play). These control blocks simulate a chained-DMA
- * structure, in that each block controls the transfer of data between
- * the device and a single contiguous memory segment.
- *
- * The command block contains buffer start and stop addresses, a link
- * address to the next block in the chain, a 'done' flag, a 'skip' flag
- * (indicating that this command block contains no data), and a pointer
- * to the STREAMS data block structure which is private to the generic
- * driver.
- *
- * The device-specific audio driver code is expected to honor the 'skip'
- * flag and set the 'done' flag when it has completed processing the
- * command block (i.e., the data transfer, if any, is complete). For
- * record command blocks, it is also expected to add to the 'data'
- * pointer the number of bytes successfully read from the device.
- *
- * The device-specific driver module must initialize the static STREAMS
- * control structures and must provide an identify routine (sbus-only),
- * an attach routine, and an open routine. The open routine verifies the
- * device unit number and calls the generic open routine with the address
- * of the audio_state structure for that unit.
- *
- * The generic audio driver makes calls to the device-specific code
- * through an ops-vector table. The following routines must be provided:
- *
- * The 'close' routine is called after either the play or record stream
- * is closed. It may perform device-specific cleanup and initialization.
- *
- * void dev_close(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'ioctl' routine is called from the STREAMS write put procedure
- * when a non-generic ioctl is encountered (AUDIO_SETINFO, AUDIO_GETINFO,
- * and AUDIO_DRAIN are the generic ioctls). Any required data mblk_t is
- * allocated; its address is given by mp->b_cont (if this is a read/write
- * ioctl, the user-supplied buffer at mp->b_cont is reused). If data is
- * successfully returned, the iocp->ioc_count field should be set with
- * the number of bytes returned. If an error occurs, the 'ioctl' routine
- * should set iocp->ioc_error to the appropriate error code. Otherwise,
- * the returned value should be AUDRETURN_CHANGE if a device state change
- * occurred (in which case a signal is sent to the control device, if
- * any) and AUDRETURN_NOCHANGE if no signal should be sent. If the ioctl
- * can not complete right away, it should return AUDRETURN_DELAYED
- * indicating that it will ack the ioctl at a later time.
- *
- * aud_return_t dev_ioctl(as, mp, iocp)
- * aud_stream_t *as; // Pointer to audio device state
- * mblk_t *mp; // ioctl STREAMS message block
- * struct iocblk *iocp; // M_IOCTL message data
- *
- *
- * The 'start' routine is called to start i/o. Ordinarily, it is called
- * from the device-specific 'queuecmd' routine, but it is also called
- * when paused output is resumed.
- *
- * void dev_start(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'stop' routine is called to stop i/o. It is called when i/o is
- * paused, flushed, or the device is closed. Note that currently queued
- * command blocks should not be flushed by this routine, since i/o may be
- * resumed from the current point.
- *
- * void dev_stop(as)
- * aud_stream_t *as; // Pointer to audio device state
- *
- *
- * The 'setflag' routine is called to get a single device-specific flag.
- * The flag argument is either AUD_ACTIVE (return the active flag) or
- * AUD_ERRORRESET (zero the error flag, returning its previous value).
- * (The val argument is currently ignored.)
- *
- * void dev_setflag(as, flag, val)
- * aud_stream_t *as; // Pointer to audio device state
- * enum aud_opflag flag; // AUD_ACTIVE || AUD_ERRORESET
- *
- *
- * The 'setinfo' routine is called to get or set device-specific fields
- * in the audio state structure. If mp is NULL, the sample counters and
- * active flags should be set in v. If mp is not NULL, then
- * mp->b_cont->data points to the audio_info_t structure supplied in an
- * AUDIO_SETINFO ioctl (ip). All device-specific fields (gains, ports,
- * sample counts) in both v and the device itself should be updated, as
- * long as the corresponding field in ip is not set to AUD_INIT_VALUE.
- * When the sample counters are set, the value returned in v should be
- * the previous value. If the setinfo can not complete right away, it
- * should return AUDRETURN_DELAYED indicating that it will ack the ioctl
- * at a later time. If an error occurs on setinfo, the iocp->ioc_error
- * should be set as in dev_ioctl
- *
- * aud_return_t dev_setinfo(as, mp, iocp)
- * aud_stream_t *as; // Pointer to audio device state
- * mblk_t *mp; // user info structure or NULL
- * struct iocblk *iocp; // M_IOCTL message data
- *
- *
- * The 'queuecmd' routine is called whenever a new command block is
- * linked into the chained command list. The device-specific code must
- * ensure that the command is enqueued to the device and that i/o, if not
- * currently active, is started.
- *
- * void dev_queuecmd(as, cmdp)
- * aud_stream_t *as; // Pointer to audio device state
- * struct aud_cmd *cmdp; // new command block to queue
- *
- *
- * The 'flushcmd' routine is called whenever the chained command list is
- * flushed. It is only called after i/o has been stopped (via the 'stop'
- * routine) and after the command list in the audio state structure has
- * been cleared. The device-specific code should flush the device's
- * queued command list.
- *
- * void dev_flushcmd(as)
- * aud_stream_t *as; // Pointer to audio device state
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*
- * Various generic audio driver constants
- */
-#define AUD_INITVALUE (~0)
-#define Modify(X) ((uint_t)(X) != AUD_INITVALUE)
-#define Modifys(X) ((X) != (ushort_t)AUD_INITVALUE)
-#define Modifyc(X) ((X) != (uchar_t)AUD_INITVALUE)
-
-
-/*
- * Define the virtual chained-DMA control structure
- */
-typedef struct aud_cmd aud_cmd_t;
-struct aud_cmd {
- /*
- * Data pointers
- */
- uchar_t *data; /* address of next transfer */
- uchar_t *enddata; /* address+1 of last transfer */
-
- /*
- * Linked list management
- */
- aud_cmd_t *next; /* pointer to next or NULL */
- aud_cmd_t *lastfragment; /* last fragment in packet */
-
- /*
- * Flags
- */
- uint_t :0; /* Force word alignment */
- uchar_t skip; /* TRUE => no xfers on buffer */
- uchar_t done; /* TRUE => buffer processed */
-
- uchar_t iotype; /* copy of mblk's db_type */
- boolean_t processed; /* TRUE if processed cmd at head of list */
-
- audtrace_hdr_t tracehdr; /* trace info */
-
- /*
- * Device-independent private, opaque storage
- */
- void *dihandle;
-};
-
-
-/*
- * Define the list-head for queued control structures
- */
-typedef struct aud_cmdlist aud_cmdlist_t;
-struct aud_cmdlist {
- aud_cmd_t *head; /* First queued command block */
- aud_cmd_t *tail; /* Last queued command block */
- aud_cmd_t *free; /* Head of free list */
-};
-
-
-/*
- * Define possible return values from the setinfo and ioctl calls
- */
-typedef enum {
- AUDRETURN_CHANGE,
- AUDRETURN_NOCHANGE,
- AUDRETURN_DELAYED
-} aud_return_t;
-
-
-/*
- * Define legal values for the 'flag' argument to the 'setflag' callout
- */
-enum aud_opflag {
- AUD_ACTIVE, /* active flag */
- AUD_ERRORRESET /* error flag (reset after read) */
-};
-
-
-/*
- * The audio stream type determines the legal operations for a stream in the
- * generic portion of an audio driver.
- */
-typedef enum {
- AUDTYPE_NONE = 00, /* Not a legal device */
- AUDTYPE_DATA = 01, /* Data, IOCTL, etc., but not signals */
- AUDTYPE_CONTROL = 02, /* IOCTL, etc., but not M_DATA */
- AUDTYPE_BOTH = 03 /* Anything is ok, signals delivered */
-} aud_streamtype_t;
-
-#define ISPLAYSTREAM(as) (ISDATASTREAM(as) && (as->openflag & FWRITE))
-#define ISRECORDSTREAM(as) (ISDATASTREAM(as) && (as->openflag & FREAD))
-#define ISDATASTREAM(as) (((as->type) & (AUDTYPE_DATA)) != 0)
-#define ISCONTROLSTREAM(as) (((as->type) & (AUDTYPE_CONTROL)) != 0)
-
-
-typedef enum {
- AUDMODE_NONE = 00, /* Not a legal mode */
- AUDMODE_AUDIO = 01, /* Transparent audio mode */
- AUDMODE_HDLC = 02 /* HDLC datacomm mode */
-} aud_modetype_t;
-
-
-/*
- * This structure describes the state of the audio device and queues
- */
-typedef struct aud_state aud_state_t;
-struct aud_state {
- /*
- * Back-pointer to the device-dependent audio state
- */
- void *ddstate;
-
- /*
- * Device-independent audio state
- */
- uint_t monitor_gain; /* input to output mix: 0 - 255 */
- boolean_t output_muted; /* true if output is muted */
- uint_t hw_features; /* hardware features this driver supports */
- uint_t sw_features; /* software features this driver supports */
- uint_t sw_features_enabled; /* supported SW features enabled */
-
- /*
- * Audio ops vector
- */
- struct aud_ops *ops;
-};
-
-/*
- * STREAMS routines pass the address of a 'struct audstream' when calling
- * put and service procedures. This structure points to the STREAMS
- * queues and back to the containing 'struct aud_state'.
- */
-typedef struct aud_stream aud_stream_t;
-struct aud_stream {
- aud_state_t *distate; /* pointer to driver data */
- aud_streamtype_t type; /* defines legal operations */
- aud_modetype_t mode; /* Audio or HDLC data */
- boolean_t signals_okay; /* Can send sigs up this aud_stream */
-
- /*
- * Sideways pointers to related aud_stream_t structures
- */
- aud_stream_t *control_as; /* control stream */
- aud_stream_t *output_as; /* play stream */
- aud_stream_t *input_as; /* record stream */
-
- /*
- * Software state
- */
- aud_cmdlist_t cmdlist; /* command chains */
- audio_prinfo_t info; /* info for this stream side */
- int openflag; /* open flag & (FREAD|FWRITE) */
- boolean_t draining; /* TRUE if output draining */
- int maxfrag_size; /* max aud_cmd_t fragment size */
- struct {
- int action; /* IOCTL action */
- mblk_t *mp; /* Pending ioctl */
- ulong_t priv; /* private state */
- uint_t ioctl_id; /* from ioc_id */
- cred_t *credp; /* from ioc_cr */
- int reason; /* HW implementation dep. reason */
- boolean_t (*handler)(aud_stream_t *, mblk_t *, int,
- boolean_t);
- } dioctl; /* Delayed ioctls */
- uint_t sequence; /* packet sequence number */
-
- /*
- * STREAMS information
- */
- queue_t *readq; /* STREAMS read queue */
- queue_t *writeq; /* STREAMS write queue */
- queue_t *traceq; /* STREAMS trace queue */
-
- /*
- * OS-Dependent information
- *
- * NB - For now we lock on a per-unit basis, so this points to
- * the mutex of the unit it belongs to. Other arrangements can
- * be made later
- *
- * The condition variable in a output stream is used to wait for
- * output to drain.
- *
- * The condition variable in a control stream is used to wait on
- * open if the device is in use.
- */
- kmutex_t *lock; /* low-level lock */
- kcondvar_t cv; /* generic condition variable */
-};
-
-#define LOCK_AS(as) mutex_enter((as)->lock)
-#define UNLOCK_AS(as) mutex_exit((as)->lock)
-#define ASSERT_ASLOCKED(as) ASSERT(MUTEX_HELD((as)->lock))
-
-#define AUDIOCACTION_INIT (0) /* no ioctl in progress */
-#define AUDIOCACTION_WAIT (1) /* copyout response not received */
-#define AUDIOCACTION_WAITING (2) /* read to ack/nak */
-
-
-/*
- * Argument for audio_sensig
- */
-typedef enum {
- AUDIO_SENDSIG_NONE = 0, /* Default */
- AUDIO_SENDSIG_EXPLICIT, /* Send signal up this aud_stream only */
- AUDIO_SENDSIG_ALL /* Send signal up all related aud_streams */
-} audio_sendsig_t;
-
-
-/*
- * Define the ops-vector table for device-specific callouts
- *
- * close close routine
- * ioctl ioctl routine
- * start routine to start I/O on a stream
- * stop routine to stop I/O on a stream
- * setflag routine to get or set a flag value
- * setinfo routine to get or set the audio state structure
- * queuecmd routine to queue a command on the HW command list
- * flushcmd routine to flush the HW's command list
- */
-typedef struct aud_ops aud_ops_t;
-struct aud_ops {
-#ifdef __STDC__
- void (*close)(aud_stream_t *);
- aud_return_t (*ioctl)(aud_stream_t *, queue_t *, mblk_t *);
- aud_return_t (*mproto)(aud_stream_t *, mblk_t *);
- void (*start)(aud_stream_t *);
- void (*stop)(aud_stream_t *);
- uint_t (*setflag)(aud_stream_t *, enum aud_opflag, uint_t);
- aud_return_t (*setinfo)(aud_stream_t *, mblk_t *, int *);
- void (*queuecmd)(aud_stream_t *, aud_cmd_t *);
- void (*flushcmd)(aud_stream_t *);
-#else /* __STDC__ */
- void (*close)();
- aud_return_t (*ioctl)();
- aud_return_t (*mproto)();
- void (*start)();
- void (*stop)();
- uint_t (*setflag)();
- aud_return_t (*setinfo)();
- void (*queuecmd)();
- void (*flushcmd)();
-#endif /* __STDC__ */
-};
-
-
-/*
- * Define pseudo-routine names for the device-specific callouts
- */
-#define AUD_CLOSE(A) (*(A)->distate->ops->close)(A)
-#define AUD_IOCTL(A, Q, M) (*(A)->distate->ops->ioctl)(A, Q, M)
-#define AUD_MPROTO(A, M) (*(A)->distate->ops->mproto)(A, M)
-#define AUD_START(A) (*(A)->distate->ops->start)(A)
-#define AUD_STOP(A) (*(A)->distate->ops->stop)(A)
-#define AUD_SETFLAG(A, F, X) (*(A)->distate->ops->setflag)(A, F, X)
-#define AUD_GETFLAG(A, F) (*(A)->distate->ops->setflag)(A, F, \
- AUD_INITVALUE)
-#define AUD_SETINFO(A, M, E) (*(A)->distate->ops->setinfo)(A, M, E)
-#define AUD_GETINFO(A) (*(A)->distate->ops->setinfo)(A, NULL, NULL)
-#define AUD_QUEUECMD(A, C) (*(A)->distate->ops->queuecmd)(A, C)
-#define AUD_FLUSHCMD(A) (*(A)->distate->ops->flushcmd)(A)
-
-
-/*
- * Device Independent Audio driver function prototypes
- */
-#ifdef __STDC__
-extern int audio_open(aud_stream_t *, queue_t *, dev_t *, int, int);
-extern int audio_close(queue_t *, int, cred_t *);
-extern int audio_wput(queue_t *, mblk_t *);
-extern int audio_wsrv(queue_t *);
-extern int audio_rput(queue_t *, mblk_t *);
-extern int audio_rsrv(queue_t *);
-extern void audio_gc_output(aud_stream_t *);
-extern void audio_process_output(aud_stream_t *);
-extern void audio_process_input(aud_stream_t *);
-extern void audio_sendsig(aud_stream_t *, audio_sendsig_t);
-extern void audio_flush_cmdlist(aud_stream_t *);
-extern void audio_ack(queue_t *, mblk_t *, int);
-extern void audio_copyout(queue_t *, mblk_t *, caddr_t, uint_t);
-extern void audio_pause_play(aud_stream_t *);
-extern void audio_pause_record(aud_stream_t *);
-extern void audio_resume_play(aud_stream_t *);
-extern void audio_resume_record(aud_stream_t *);
-extern void audio_trace(aud_stream_t *, aud_cmd_t *);
-extern void audio_trace_hdr(aud_stream_t *, audtrace_hdr_t *);
-#else /* __STDC__ */
-extern int audio_open();
-extern int audio_close();
-extern int audio_wput();
-extern int audio_wsrv();
-extern int audio_rput();
-extern int audio_rsrv();
-extern void audio_gc_output();
-extern void audio_process_output();
-extern void audio_process_input();
-extern void audio_sendsig();
-extern void audio_flush_cmdlist();
-extern void audio_ack();
-extern void audio_copyout();
-extern void audio_pause_play();
-extern void audio_pause_record();
-extern void audio_resume_play();
-extern void audio_resume_record();
-extern void audio_trace()
-extern void audio_trace_hdr();
-#endif /* __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIOVAR_H */
diff --git a/usr/src/uts/common/sys/mixer.h b/usr/src/uts/common/sys/mixer.h
index 8491fc73a6..9abcd6121d 100644
--- a/usr/src/uts/common/sys/mixer.h
+++ b/usr/src/uts/common/sys/mixer.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,26 +19,19 @@
* CDDL HEADER END
*/
/*
- * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
- * All rights reserved
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
*/
#ifndef _SYS_MIXER_H
#define _SYS_MIXER_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/audio.h>
-#define MIXER_NAME "audio mixer" /* STREAMS module name */
-#define MIXER_VERSION "Rev 1" /* 1st version of audio mixer */
-#define MIXER_CONFIGURATION "Config A" /* 1st configuration */
-#define MIXER_MOD_NAME "Audio Mixer" /* STREAMS modldrv name */
-
#define AM_MIXER_MODE 0
#define AM_COMPAT_MODE 1
diff --git a/usr/src/uts/common/sys/soundcard.h b/usr/src/uts/common/sys/soundcard.h
new file mode 100644
index 0000000000..5167b1720c
--- /dev/null
+++ b/usr/src/uts/common/sys/soundcard.h
@@ -0,0 +1,31 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SOUNDCARD_H
+#define _SYS_SOUNDCARD_H
+
+#include <sys/audio/audio_oss.h>
+
+#endif /* _SYS_SOUNDCARD_H */
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h b/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
index 5ed299cccb..55e3d72d06 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -35,9 +35,8 @@ extern "C" {
#include <sys/sunldi.h>
#include <sys/usb/usba/usbai_private.h>
-/* driver specific macros */
-#define USB_AC_HIWATER (AM_MAX_QUEUED_MSGS_SIZE)
-#define USB_AC_LOWATER (32*1024)
+int usb_ac_open(dev_info_t *);
+void usb_ac_close(dev_info_t *);
/* structure for each unit described by descriptors */
@@ -57,12 +56,17 @@ typedef struct usb_ac_unit_list {
* plumbing data; info per plumbed module
*/
typedef struct usb_ac_plumbed {
+ struct usb_ac_state *acp_uacp; /* usb_ac state pointer */
dev_info_t *acp_dip; /* devinfo pointer */
uint_t acp_ifno; /* interface number */
- int acp_linkid; /* link ID for plumbing */
int acp_driver; /* Plumbed driver, see value below */
- queue_t *acp_lrq; /* lower read queue */
- queue_t *acp_lwq; /* lower write queue */
+
+ ldi_handle_t acp_lh; /* ldi handle of plumbed driver */
+ dev_t acp_devt; /* devt of plumbed driver */
+ ddi_taskq_t *acp_tqp; /* taskq for I/O to plumbed driver */
+ int acp_flags;
+#define ACP_ENABLED 1
+
void *acp_data; /* ptr to streams or hid data */
} usb_ac_plumbed_t;
@@ -72,9 +76,6 @@ typedef struct usb_ac_plumbed {
* only one active at a time.
*/
typedef struct usb_ac_to_as_req {
- int acr_wait_flag; /* an mblk sent wait on this flag */
- kcondvar_t acr_cv; /* an mblk sent; wait on this cv */
- mblk_t *acr_reply_mp; /* response to current request */
usb_audio_formats_t acr_curr_format; /* format data from mixer */
int acr_curr_dir;
} usb_ac_to_as_req_t;
@@ -164,11 +165,6 @@ typedef struct usb_ac_state {
/* pipe handle */
usb_pipe_handle_t usb_ac_default_ph;
- /* streams management */
- queue_t *usb_ac_rq; /* read q ptr */
- queue_t *usb_ac_wq; /* write q ptr */
- dev_t usb_ac_dev; /* dev_t of plumbing open */
-
/* serial access */
usb_serialization_t usb_ac_ser_acc;
@@ -176,13 +172,10 @@ typedef struct usb_ac_state {
usb_ac_power_t *usb_ac_pm; /* power capabilities */
/* mixer registration data */
- uint_t usb_ac_mixer_mode_enable;
uint_t usb_ac_registered_with_mixer;
/* plumbing management */
- int usb_ac_mux_minor;
uint_t usb_ac_plumbing_state;
- ldi_handle_t usb_ac_mux_lh;
ushort_t usb_ac_busy_count;
usb_ac_plumbed_t usb_ac_plumbed[USB_AC_MAX_PLUMBED];
@@ -197,25 +190,11 @@ typedef struct usb_ac_state {
* copy registration data
*/
usb_as_registration_t usb_ac_streams_reg[USB_AC_MAX_AS_PLUMBED];
-} usb_ac_state_t;
-typedef struct usb_ac_state_space {
- void *sp; /* soft state for the instance */
- /* ptr to usb_ac_restore_audio_state */
- int (*restore_func)
- (usb_ac_state_t *, int);
- /* ptr to usb_ac_get_featureID */
- uint_t (* get_featureID_func)
- (usb_ac_state_t *, uchar_t,
- uint_t, uint_t);
- /* ptr to the usb_ac entry points */
- am_ad_entry_t *ac_entryp;
- /* ptr to pm_busy/idle calls */
- void (*pm_busy_component)
- (usb_ac_state_t *);
- void (*pm_idle_component)
- (usb_ac_state_t *);
-} usb_ac_state_space_t;
+ ddi_taskq_t *tqp;
+
+ char dstr[64];
+} usb_ac_state_t;
/* warlock directives, stable data */
_NOTE(MUTEX_PROTECTS_DATA(usb_ac_state_t::usb_ac_mutex, usb_ac_state_t))
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h b/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
index 7592a78663..e88168b391 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_as/usb_as.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -86,9 +86,7 @@ typedef struct usb_as_state {
uint_t usb_as_dev_state;
uint_t usb_as_ifno;
kmutex_t usb_as_mutex;
- queue_t *usb_as_rq; /* read q ptr */
- queue_t *usb_as_wq; /* write q ptr */
- uint_t usb_as_streams_flag; /* streams status */
+ uint_t usb_as_flag; /* status */
/* mblk containing the current control command */
mblk_t *usb_as_def_mblk;
@@ -133,6 +131,7 @@ typedef struct usb_as_state {
/* debug support */
uint_t usb_as_send_debug_count;
uint_t usb_as_rcv_debug_count;
+ char dstr[64];
} usb_as_state_t;
/* warlock directives, stable data */
@@ -141,8 +140,6 @@ _NOTE(MUTEX_PROTECTS_DATA(usb_as_state_t::usb_as_mutex, usb_as_power_t))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_pm))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_instance))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_rq))
-_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_wq))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_default_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_isoc_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(usb_as_state_t::usb_as_log_handle))
@@ -202,9 +199,9 @@ typedef struct usb_as_req {
} usb_as_req_t;
-/* Streams status */
-#define USB_AS_STREAMS_OPEN 1
-#define USB_AS_STREAMS_DISMANTLING 2
+/* status */
+#define USB_AS_OPEN 1
+#define USB_AS_DISMANTLING 2
#define USB_AS_BUFFER_SIZE 256 /* descriptor buffer size */
diff --git a/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h b/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
index c6e2220944..87a0d2953e 100644
--- a/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
+++ b/usr/src/uts/common/sys/usb/clients/audio/usb_mixer.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -62,10 +62,7 @@ typedef struct usb_as_registration {
uchar_t reg_mode; /* play or record */
uchar_t reg_n_formats;
int reg_ifno;
- am_ad_sample_rates_t reg_mixer_srs;
- am_ad_sample_rates_t reg_compat_srs;
- uint_t reg_mixer_srs_list[USB_AS_N_SRS];
- uint_t reg_compat_srs_list[USB_AS_N_SRS];
+ uint_t reg_srs[USB_AS_N_SRS];
usb_audio_formats_t reg_formats[USB_AS_N_FORMATS];
uint_t reg_channels[USB_AS_N_CHANNELS];
am_ad_cap_comb_t reg_combinations[USB_AS_N_COMBINATIONS];
diff --git a/usr/src/uts/intel/Makefile.intel.shared b/usr/src/uts/intel/Makefile.intel.shared
index c45b46cefa..f597720339 100644
--- a/usr/src/uts/intel/Makefile.intel.shared
+++ b/usr/src/uts/intel/Makefile.intel.shared
@@ -195,9 +195,14 @@ DRV_KMODS += asy
DRV_KMODS += ata
DRV_KMODS += ath
DRV_KMODS += atu
+DRV_KMODS += audio
DRV_KMODS += audio810
+DRV_KMODS += audioens
DRV_KMODS += audiohd
DRV_KMODS += audioixp
+DRV_KMODS += audiopci
+DRV_KMODS += audiovia823x
+DRV_KMODS += austr
DRV_KMODS += bl
DRV_KMODS += bge
DRV_KMODS += bofi
@@ -351,8 +356,6 @@ DRV_KMODS += ii rdc rdcsrv rdcstub
#
$(CLOSED_BUILD)DRV_KMODS += dca
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audioens
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audiovia823x
$(CLOSED_BUILD)CLOSED_DRV_KMODS += bmc
$(CLOSED_BUILD)CLOSED_DRV_KMODS += elxl
$(CLOSED_BUILD)CLOSED_DRV_KMODS += glm
@@ -546,10 +549,9 @@ SYS_KMODS += acctctl
# MISC_KMODS_32 are built only 32-bit
# MISC_KMODS_64 are built only 64-bit
#
+MISC_KMODS += ac97
MISC_KMODS += acpica
MISC_KMODS += agpmaster
-MISC_KMODS += amsrc2
-MISC_KMODS += audiosup
MISC_KMODS += bignum
MISC_KMODS += blk2scsa
MISC_KMODS += bootdev
@@ -582,7 +584,6 @@ MISC_KMODS += kmech_dummy
MISC_KMODS += kmech_krb5
MISC_KMODS += ksocket
MISC_KMODS += mac
-MISC_KMODS += mixer
MISC_KMODS += net80211
MISC_KMODS += nfs_dlboot
MISC_KMODS += nfssrv
@@ -621,7 +622,6 @@ MISC_KMODS += qlc_fw_8100
MISC_KMODS += hwa1480_fw
MISC_KMODS += uwba
-$(CLOSED_BUILD)CLOSED_MISC_KMODS += amsrc1
$(CLOSED_BUILD)CLOSED_MISC_KMODS += klmmod klmops
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_lsi
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_emc
@@ -688,7 +688,6 @@ $(CLOSED_BUILD)CLOSED_XMODS = \
#
# 'Dacf' Modules (/kernel/dacf):
#
-DACF_KMODS += usb_ac_dacf
#
# Performance Counter BackEnd modules (/usr/kernel/pcbe)
diff --git a/usr/src/uts/intel/amsrc2/Makefile b/usr/src/uts/intel/ac97/Makefile
index 7de69fa670..1161de1ade 100644
--- a/usr/src/uts/intel/amsrc2/Makefile
+++ b/usr/src/uts/intel/ac97/Makefile
@@ -18,17 +18,14 @@
#
# CDDL HEADER END
#
-
-# uts/intel/amsrc2/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# uts/intel/ac97/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
-
#
-# This makefile drives the production of the audio mixer
-# sample rate conversion routine #1 (amsrc2).
+# This makefile drives the production of the ac97 support module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -38,12 +35,13 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = amsrc2
-OBJECTS = $(AMSRC2_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AMSRC2_OBJS:%.o=$(LINTS_DIR)/%.ln)
+MODULE = ac97
+OBJECTS = $(AC97_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AC97_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AMSRC2_OBJS:%.o=%.ll)
+WARLOCK_OUT = $(AC97_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
+WLCMD_DIR = $(UTSBASE)/common/io/warlock
#
# Include common rules.
@@ -57,10 +55,7 @@ ALL_TARGET = $(BINARY)
LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-#
-# Depends on misc/amsrc2, misc/audiosup, and misc/mixer
-#
-LDFLAGS += -dy -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -89,22 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-WARLOCK = warlock
-WLCC = wlcc
-TOUCH = touch
-TEST = test
-
-#
-# Warlock rules
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT)
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
diff --git a/usr/src/uts/intel/audio/Makefile b/usr/src/uts/intel/audio/Makefile
new file mode 100644
index 0000000000..e9c4ca1bc3
--- /dev/null
+++ b/usr/src/uts/intel/audio/Makefile
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audio/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio support module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audio
+OBJECTS = $(AUDIO_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIO_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/audio810/Makefile b/usr/src/uts/intel/audio810/Makefile
index d1714978f0..a3d3df4247 100644
--- a/usr/src/uts/intel/audio810/Makefile
+++ b/usr/src/uts/intel/audio810/Makefile
@@ -19,14 +19,12 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audio810/Makefile
#
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of Metropolis audio driver
# (audio810) kernel module.
#
@@ -42,34 +40,17 @@ MODULE = audio810
OBJECTS = $(AUDIO810_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIO810_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audio810
-WARLOCK_OUT = $(AUDIO810_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audio810
#
# Include common rules.
#
include $(UTSBASE)/intel/Makefile.intel
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-DEBUG_FLGS =
-$(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
#
-# Depends on misc/audiosup
+# Depends on drv/audio and misc/ac97
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -88,10 +69,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -105,47 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio810_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audio810.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audioens/Makefile b/usr/src/uts/intel/audioens/Makefile
new file mode 100644
index 0000000000..2a03ba5668
--- /dev/null
+++ b/usr/src/uts/intel/audioens/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audioens/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audioens driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audioens
+OBJECTS = $(AUDIOENS_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOENS_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioens
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/audiohd/Makefile b/usr/src/uts/intel/audiohd/Makefile
index 4659db6c74..a0487ca3f7 100644
--- a/usr/src/uts/intel/audiohd/Makefile
+++ b/usr/src/uts/intel/audiohd/Makefile
@@ -19,14 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audiohd/Makefile
#
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of high definition audio
# driver (audiohd) kernel module.
#
@@ -42,10 +39,7 @@ MODULE = audiohd
OBJECTS = $(AUDIOHD_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOHD_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiohd
-WARLOCK_OUT = $(AUDIOHD_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiohd
#
# Include common rules.
@@ -67,10 +61,7 @@ $(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio
#
# Define targets
@@ -92,7 +83,6 @@ clean: $(CLEAN_DEPS)
$(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -106,47 +96,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiohd_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiohd.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audioixp/Makefile b/usr/src/uts/intel/audioixp/Makefile
index 414ee60224..ead1d79da8 100644
--- a/usr/src/uts/intel/audioixp/Makefile
+++ b/usr/src/uts/intel/audioixp/Makefile
@@ -19,14 +19,12 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/audioixp/Makefile
#
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of high definition audio
# driver (audioixp) kernel module.
#
@@ -42,10 +40,7 @@ MODULE = audioixp
OBJECTS = $(AUDIOIXP_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOIXP_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audioixp
-WARLOCK_OUT = $(AUDIOIXP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioixp
#
# Include common rules.
@@ -62,7 +57,7 @@ $(NOT_RELEASE_BUILD)DEBUG_DEFS += $(DEBUG_FLGS)
#
# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -72,13 +67,6 @@ LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -88,10 +76,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -105,50 +91,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audioixp_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../../intel/warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audioixp.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp.wlcmd $(WARLOCK_OUT) \
- -l ../../intel/warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../../intel/warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../../intel/audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../../intel/amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../../intel/mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/audiopci/Makefile b/usr/src/uts/intel/audiopci/Makefile
new file mode 100644
index 0000000000..ca07ef76cd
--- /dev/null
+++ b/usr/src/uts/intel/audiopci/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/audiopci/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audiopci driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audiopci
+OBJECTS = $(AUDIOPCI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOPCI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiopci
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/usb_ac_dacf/Makefile b/usr/src/uts/intel/audiovia823x/Makefile
index 0c119ec8a1..4f6dbb58be 100644
--- a/usr/src/uts/intel/usb_ac_dacf/Makefile
+++ b/usr/src/uts/intel/audiovia823x/Makefile
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,29 +19,28 @@
# CDDL HEADER END
#
#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# uts/intel/usb_ac_dacf/Makefile
+# uts/intel/audiovia823x/Makefile
#
-# This makefile drives the production of the usb_ac driver
-# kernel module. Intel architecture dependent
#
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
+# This makefile drives the production of the Via 823x audio driver
+# (audiovia823x) kernel module.
+#
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
#
-UTSBASE = ../..
+UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = usb_ac_dacf
-OBJECTS = $(USB_AC_DACF_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(USB_AC_DACF_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
+MODULE = audiovia823x
+OBJECTS = $(AUDIOVIA823X_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOVIA823X_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiovia823x
#
# Include common rules.
@@ -50,23 +48,18 @@ ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
include $(UTSBASE)/intel/Makefile.intel
#
-# Define targets
+# Depends on drv/audio and misc/ac97
#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
-# Override defaults to build a unique, local modstubs.o.
+# Define targets
#
-MODSTUBS_DIR = $(OBJS_DIR)
-CLEANFILES += $(MODSTUBS_O)
+ALL_TARGET = $(BINARY) $(SRC_CONFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
-# depends on misc/usba
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
-#
# Default build targets.
#
.KEEP_STATE:
@@ -91,4 +84,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/intel/Makefile.targ
-
diff --git a/usr/src/uts/intel/austr/Makefile b/usr/src/uts/intel/austr/Makefile
new file mode 100644
index 0000000000..e839641126
--- /dev/null
+++ b/usr/src/uts/intel/austr/Makefile
@@ -0,0 +1,85 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/intel/austr/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio streams module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = austr
+OBJECTS = $(AUSTR_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUSTR_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/intel/Makefile.intel
+
+#
+# Depends on drv/audio
+#
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/intel/Makefile.targ
diff --git a/usr/src/uts/intel/mixer/Makefile b/usr/src/uts/intel/mixer/Makefile
deleted file mode 100644
index cf6b5094a5..0000000000
--- a/usr/src/uts/intel/mixer/Makefile
+++ /dev/null
@@ -1,154 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/intel/mixer/Makefile
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio mixer (mixer)
-# Audio Personality Module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = mixer
-OBJECTS = $(MIXER_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(MIXER_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(MIXER_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/intel/Makefile.intel
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/audiosup
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC1_FILES = $(AMSRC1_OBJS:%.o=$(CLOSED)/uts/intel/amsrc1/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
-
-WARLOCK_TARGETS = $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
- warlock_standalone $(WLCMD_DIR)/mixer_with_audiosup.wlcmd
-
-$(CLOSED_BUILD)WARLOCK_CLOSED = warlock_closed
-
-warlock: warlock_open $(WARLOCK_CLOSED)
- $(TOUCH) $(WARLOCK_OK)
-
-warlock_open: $(WARLOCK_TARGETS) warlock_amsrc2.files
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_closed: $(WARLOCK_TARGETS) warlock_amsrc1.files
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd \
- $(WARLOCK_OUT) $(AUDIO_SUP_FILES) $(AMSRC1_FILES) \
- -l ../warlock/ddi_dki_impl.ll
-
-%.ll: $(UTSBASE)/common/io/audio/sada/mixer/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files \
- $(WLCMD_DIR)/mixer.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc1.files:
- @cd $(CLOSED)/uts/intel/amsrc1; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/os/dacf.conf b/usr/src/uts/intel/os/dacf.conf
index 9ccb1b8282..0475a5c840 100644
--- a/usr/src/uts/intel/os/dacf.conf
+++ b/usr/src/uts/intel/os/dacf.conf
@@ -19,14 +19,13 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# NOTICE: This file contains important KERNEL STATE. Do not edit this file.
# Its format and contents are subject to change in future releases of Solaris.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
#
# keyboard and mouse configuration rules
@@ -61,13 +60,6 @@ driver-minorname="mouse8042:internal_mouse" consconfig_dacf:ms_config post-attac
driver-minorname="mouse8042:internal_mouse" consconfig_dacf:ms_config pre-detach - pushmod="vuid3ps2"
#
-# Configure and/or unconfigure usb audio devices.
-# usb_ac as a mux for hid and usb_as devices.
-#
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config post-attach -
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config pre-detach -
-
-#
# Configure and/or unconfigure DDI_NT_NET devices.
#
minor-nodetype="ddi_network" net_dacf:net_config post-attach -
diff --git a/usr/src/uts/intel/usb_ac/Makefile b/usr/src/uts/intel/usb_ac/Makefile
index cfeb9d8525..29ce6e73fb 100644
--- a/usr/src/uts/intel/usb_ac/Makefile
+++ b/usr/src/uts/intel/usb_ac/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/usb_ac/Makefile
@@ -42,7 +42,7 @@ OBJECTS = $(USB_AC_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(USB_AC_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/audio/usb_ac
-WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll) usb_ac_dacf.ll
+WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
@@ -67,14 +67,7 @@ CLEANFILES += $(MODSTUBS_O)
#
# depends on misc/usba
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Nmisc/usba -Ndrv/audio
#
# Default build targets.
@@ -119,9 +112,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=../mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=../audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
#
@@ -138,7 +128,6 @@ warlock_with_sada: $(WLCMD_DIR)/usb_ac_with_sada.wlcmd \
$(WARLOCK_OUT) \
warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_ac_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
diff --git a/usr/src/uts/intel/usb_ah/Makefile b/usr/src/uts/intel/usb_ah/Makefile
index 534aa9e7e9..eaa8cb675d 100644
--- a/usr/src/uts/intel/usb_ah/Makefile
+++ b/usr/src/uts/intel/usb_ah/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/usb_ah/Makefile
@@ -66,7 +66,7 @@ CLEANFILES += $(MODSTUBS_O)
#
# depends on misc/usba
#
-LDFLAGS += -dy -Nmisc/usba -Nhidparser -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Nhidparser -Ndrv/usb_ac
#
# For now, disable these lint checks; maintainers should endeavor
diff --git a/usr/src/uts/intel/usb_as/Makefile b/usr/src/uts/intel/usb_as/Makefile
index f4a62920ee..9d82ee38a0 100644
--- a/usr/src/uts/intel/usb_as/Makefile
+++ b/usr/src/uts/intel/usb_as/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_as/Makefile
@@ -63,11 +63,7 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
MODSTUBS_DIR = $(OBJS_DIR)
CLEANFILES += $(MODSTUBS_O)
-#
-# do not remove depends on amsrc2. If removed, amsrc2 gets unloaded when
-# usb_ac_dacf gets unloaded
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer -Nmisc/amsrc2
+LDFLAGS += -dy -Nmisc/usba -Ndrv/usb_ac
#
# For now, disable these lint checks; maintainers should endeavor
@@ -120,22 +116,18 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/intel/mixer/%.ll)
AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/intel/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/intel/amsrc2/%.ll)
# Warlock targets
#
warlock: $(WARLOCK_OK)
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
+$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
warlock_standalone warlock_with_usba warlock_with_sada
$(TOUCH) $(WARLOCK_OK)
warlock_with_sada: $(WLCMD_DIR)/usb_as_with_sada.wlcmd \
- $(WARLOCK_OUT) \
- warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
+ $(WARLOCK_OUT) warlock_audiosup.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_as_with_sada.wlcmd $(WARLOCK_OUT) \
$(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
@@ -171,9 +163,3 @@ warlock_ddi.files:
warlock_audiosup.files:
@cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/intel/warlock/Makefile b/usr/src/uts/intel/warlock/Makefile
index fbefb9b95d..2b877db841 100644
--- a/usr/src/uts/intel/warlock/Makefile
+++ b/usr/src/uts/intel/warlock/Makefile
@@ -20,7 +20,7 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/intel/warlock/Makefile
@@ -51,7 +51,7 @@ include $(UTSBASE)/intel/Makefile.intel
#
# lock_lint rules
#
-all: warlock warlock.1394 warlock.audio warlock.ecpp warlock.scsi \
+all: warlock warlock.1394 warlock.ecpp warlock.scsi \
warlock.usb warlock.ib warlock.sata warlock.sdcard warlock.wc
warlock: $(MODULE).ok
@@ -101,21 +101,6 @@ warlock.1394:
warlock.ecpp:
@cd ../ecpp; $(MAKE) clean; $(MAKE) warlock
-warlock.audio:
- @cd ../audiosup; $(MAKE) clean; $(MAKE) warlock
- @cd ../mixer; $(MAKE) clean; $(MAKE) warlock
- @cd ../amsrc2; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audio810; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audiohd; $(MAKE) clean; $(MAKE) warlock
- @cd ../../intel/audioixp; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ac; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_as; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ah; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/amsrc1; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/audiovia823x; \
- $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/intel/audioens; $(MAKE) clean; $(MAKE) warlock
-
warlock.ib:
@cd ../ibmf; $(MAKE) clean; $(MAKE) warlock
@cd ../ib; $(MAKE) clean; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/Makefile.sparc.shared b/usr/src/uts/sparc/Makefile.sparc.shared
index a452f8ef67..4829b38c36 100644
--- a/usr/src/uts/sparc/Makefile.sparc.shared
+++ b/usr/src/uts/sparc/Makefile.sparc.shared
@@ -261,7 +261,7 @@ $(CLOSED_BUILD)CLOSED_DRV_KMODS += ixgb
#
# Machine Specific Driver Modules (/kernel/drv):
#
-DRV_KMODS += audio1575 audio810 audiohd audiocs audiots
+DRV_KMODS += audio audio1575 audioens audiocs audiots audiopci austr
DRV_KMODS += bge bpp dmfe eri esp fas hme qfe
DRV_KMODS += openeepr options sd ses st
DRV_KMODS += ssd
@@ -306,8 +306,6 @@ DRV_KMODS += ii rdc rdcsrv rdcstub
DRV_KMODS += iscsi
DRV_KMODS += emlxs
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audioens
-$(CLOSED_BUILD)CLOSED_DRV_KMODS += audiovia823x
$(CLOSED_BUILD)CLOSED_DRV_KMODS += ifp
$(CLOSED_BUILD)CLOSED_DRV_KMODS += uata
$(CLOSED_BUILD)CLOSED_DRV_KMODS += usbser_edge
@@ -378,7 +376,7 @@ SYS_KMODS += doorfs pset acctctl portfs
#
# 'User' Modules (/kernel/misc):
#
-MISC_KMODS += amsrc2 audiosup mixer
+MISC_KMODS += ac97
MISC_KMODS += bignum
MISC_KMODS += consconfig gld ipc nfs_dlboot nfssrv scsi
MISC_KMODS += strplumb swapgeneric tlimod
@@ -420,7 +418,6 @@ MISC_KMODS += sda
MISC_KMODS += spuni
MISC_KMODS += hwa1480_fw uwba
-$(CLOSED_BUILD)CLOSED_MISC_KMODS += amsrc1
$(CLOSED_BUILD)CLOSED_MISC_KMODS += klmmod klmops
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_lsi
$(CLOSED_BUILD)CLOSED_MISC_KMODS += scsi_vhci_f_asym_emc
@@ -483,7 +480,7 @@ $(CLOSED_BUILD)CLOSED_XMODS = \
#
# 'Dacf' Modules (/kernel/dacf):
#
-DACF_KMODS += usb_ac_dacf net_dacf
+DACF_KMODS += net_dacf
#
# MAC-Type Plugin Modules (/kernel/mac)
diff --git a/usr/src/uts/intel/audiosup/Makefile b/usr/src/uts/sparc/ac97/Makefile
index 2285741889..84b7c69ea7 100644
--- a/usr/src/uts/intel/audiosup/Makefile
+++ b/usr/src/uts/sparc/ac97/Makefile
@@ -19,15 +19,13 @@
# CDDL HEADER END
#
#
-# uts/intel/audiosup/Makefile
+# uts/sparc/ac97/Makefile
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# This makefile drives the production of the audio support (audiosup)
-# module.
+# This makefile drives the production of the ac97 support module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -37,18 +35,18 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = audiosup
-OBJECTS = $(AUDIO_SUP_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO_SUP_OBJS:%.o=$(LINTS_DIR)/%.ln)
+MODULE = ac97
+OBJECTS = $(AC97_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AC97_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AUDIO_SUP_OBJS:%.o=%.ll)
+WARLOCK_OUT = $(AC97_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
#
# Include common rules.
#
-include $(UTSBASE)/intel/Makefile.intel
+include $(UTSBASE)/sparc/Makefile.sparc
#
# Define targets
@@ -57,12 +55,7 @@ ALL_TARGET = $(BINARY)
LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -90,28 +83,4 @@ install: $(INSTALL_DEPS)
#
# Include common targets.
#
-include $(UTSBASE)/intel/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiosup.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/framework/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/amsrc2/main.c b/usr/src/uts/sparc/amsrc2/main.c
deleted file mode 100644
index 613e960581..0000000000
--- a/usr/src/uts/sparc/amsrc2/main.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * main.c - A pseudo-kernel to use when analyzing am_src2.c with warlock.
- *
- * The main idea here is to represent all of the ways that the kernel can
- * call into the amsrc2, so that warlock has the correct view of the call
- * graph.
- */
-
-#include <sys/modctl.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/am_src2_impl.h>
-
-am_ad_src_entry_t *src = &am_src2;
-
-main() {
-
- _init();
- _fini();
- _info(NULL);
-
- /*
- * ad_src_init() is called by am_open() before audio may begin playing
- * or recording. So this can be viewed as single threaded.
- */
- src->ad_src_init(NULL, 0);
-
- _NOTE(COMPETING_THREADS_NOW)
-
- src->ad_src_adjust(NULL, 0, 0);
- src->ad_src_convert(NULL, 0, 0, NULL, NULL, NULL, NULL);
- src->ad_src_size(NULL, NULL, 0, 0, 0);
- src->ad_src_update(NULL, NULL, NULL, NULL, 0);
-
- _NOTE(NO_COMPETING_THREADS_NOW)
-
- /*
- * ad_src_exit() is called by am_close() only when play and record have
- * stopped, thus it also is single threaded.
- */
- src->ad_src_exit(NULL, 0);
-
- return (0);
-}
diff --git a/usr/src/uts/sparc/audio/Makefile b/usr/src/uts/sparc/audio/Makefile
new file mode 100644
index 0000000000..2bb577fac6
--- /dev/null
+++ b/usr/src/uts/sparc/audio/Makefile
@@ -0,0 +1,80 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audio/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audio support module.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audio
+OBJECTS = $(AUDIO_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIO_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audio1575/Makefile b/usr/src/uts/sparc/audio1575/Makefile
index 0abcdcdd1c..76706de77e 100644
--- a/usr/src/uts/sparc/audio1575/Makefile
+++ b/usr/src/uts/sparc/audio1575/Makefile
@@ -19,13 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/audio1575/Makefile
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the M1575 audio driver
# (audio1575) kernel module.
#
@@ -41,10 +39,7 @@ MODULE = audio1575
OBJECTS = $(AUDIO1575_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIO1575_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/sun/io/audio/sada/drv/audio1575
-WARLOCK_OUT = $(AUDIO1575_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audio1575
#
# Include common rules.
@@ -57,9 +52,9 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# Depends on misc/audiosup
+# Depends on drv/audio and misc/ac97
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
#
# Define targets
@@ -76,13 +71,6 @@ DEF_BUILDS = $(DEF_BUILDSONLY64)
CLEANLINTFILES += $(LINT32_FILES)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -92,10 +80,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -109,51 +95,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio1575_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio1575_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files \
- $(WLCMD_DIR)/audio1575.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio1575.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audio810/Makefile b/usr/src/uts/sparc/audio810/Makefile
deleted file mode 100644
index a087988ac4..0000000000
--- a/usr/src/uts/sparc/audio810/Makefile
+++ /dev/null
@@ -1,155 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audio810/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of Metropolis audio driver
-# (audio810) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audio810
-OBJECTS = $(AUDIO810_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO810_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audio810
-WARLOCK_OUT = $(AUDIO810_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/audiosup, misc/mixer
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY) $(SRC_CONFILE)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE_64)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS) lint32
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audio810_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audio810_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audio810/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audio810.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audio810.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiocs/Makefile b/usr/src/uts/sparc/audiocs/Makefile
index 7371d07fa8..f4fd53c27f 100644
--- a/usr/src/uts/sparc/audiocs/Makefile
+++ b/usr/src/uts/sparc/audiocs/Makefile
@@ -21,11 +21,9 @@
#
# uts/sparc/audiocs/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the Crystal 4231
# audio driver (audiocs) kernel module.
#
@@ -42,10 +40,7 @@ MODULE = audiocs
OBJECTS = $(AUDIOCS_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOCS_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/sun/io/audio/sada/drv/audiocs
-WARLOCK_OUT = $(AUDIOCS_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/sun/io/audio/drv/audiocs
#
# Include common rules.
@@ -65,16 +60,9 @@ INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
CFLAGS += $(CCVERBOSE)
#
-# Depends on misc/audiosup and misc/mixer
+# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/audiosup -Nmisc/mixer
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
+LDFLAGS += -dy -Ndrv/audio
#
# Default build targets.
@@ -86,10 +74,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -103,47 +89,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- warlock_standalone $(WLCMD_DIR)/audiocs_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiocs_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiocs.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiocs.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audioens/Makefile b/usr/src/uts/sparc/audioens/Makefile
new file mode 100644
index 0000000000..da0b7b2125
--- /dev/null
+++ b/usr/src/uts/sparc/audioens/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audioens/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audioens driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audioens
+OBJECTS = $(AUDIOENS_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOENS_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audioens
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio -Nmisc/ac97
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audiohd/Makefile b/usr/src/uts/sparc/audiohd/Makefile
deleted file mode 100644
index 38c21c1f70..0000000000
--- a/usr/src/uts/sparc/audiohd/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audiohd/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of high definition audio
-# driver (audiohd) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audiohd
-OBJECTS = $(AUDIOHD_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIOHD_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiohd
-WARLOCK_OUT = $(AUDIOHD_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/audiosup, misc/mixer
-#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY) $(SRC_CONFILE)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE_64)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS) lint32
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiohd_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiohd/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiohd.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiohd.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audioixp/Makefile b/usr/src/uts/sparc/audioixp/Makefile
deleted file mode 100644
index bace3949f0..0000000000
--- a/usr/src/uts/sparc/audioixp/Makefile
+++ /dev/null
@@ -1,117 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# uts/sparc/audioixp/Makefile
-#
-# ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of hight definition audio
-# driver (audioixp) kernel module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audioixp
-WARLOCK_OUT = $(AUDIOIXP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: warlock
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audioixp_with_sada.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audioixp/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audioixp.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audioixp.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiopci/Makefile b/usr/src/uts/sparc/audiopci/Makefile
new file mode 100644
index 0000000000..fcf95b3443
--- /dev/null
+++ b/usr/src/uts/sparc/audiopci/Makefile
@@ -0,0 +1,82 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# uts/sparc/audiopci/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# This makefile drives the production of the audiopci driver.
+#
+
+#
+# Path to the base of the uts directory tree (usually /usr/src/uts).
+#
+UTSBASE = ../..
+
+#
+# Define the module and object file sets.
+#
+MODULE = audiopci
+OBJECTS = $(AUDIOPCI_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUDIOPCI_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiopci
+
+#
+# Include common rules.
+#
+include $(UTSBASE)/sparc/Makefile.sparc
+
+#
+# Define targets
+#
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
+LINT_TARGET = $(MODULE).lint
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
+
+LDFLAGS += -dy -Ndrv/audio
+
+#
+# Default build targets.
+#
+.KEEP_STATE:
+
+def: $(DEF_DEPS)
+
+all: $(ALL_DEPS)
+
+clean: $(CLEAN_DEPS)
+
+clobber: $(CLOBBER_DEPS)
+
+lint: $(LINT_DEPS)
+
+modlintlib: $(MODLINTLIB_DEPS)
+
+clean.lint: $(CLEAN_LINT_DEPS)
+
+install: $(INSTALL_DEPS)
+
+#
+# Include common targets.
+#
+include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/audiosup/Makefile b/usr/src/uts/sparc/audiosup/Makefile
deleted file mode 100644
index 47bbf5e7e1..0000000000
--- a/usr/src/uts/sparc/audiosup/Makefile
+++ /dev/null
@@ -1,128 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/audiosup/Makefile
-#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio support (audiosup)
-# module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = audiosup
-OBJECTS = $(AUDIO_SUP_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AUDIO_SUP_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AUDIO_SUP_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Turn off -xspace so we get all optimizations.
-#
-SPACEFLAG =
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiosup.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/framework/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/audiots/Makefile b/usr/src/uts/sparc/audiots/Makefile
index 94887e61d1..0bb9e744e7 100644
--- a/usr/src/uts/sparc/audiots/Makefile
+++ b/usr/src/uts/sparc/audiots/Makefile
@@ -19,13 +19,11 @@
# CDDL HEADER END
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/audiots/Makefile
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# This makefile drives the production of the T2 audio driver
# (audiots) kernel module.
#
@@ -41,10 +39,7 @@ MODULE = audiots
OBJECTS = $(AUDIOTS_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(AUDIOTS_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
-CONF_SRCDIR = $(UTSBASE)/common/io/audio/sada/drv/audiots
-WARLOCK_OUT = $(AUDIOTS_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/drv/audiots
#
# Include common rules.
@@ -59,7 +54,7 @@ CFLAGS += $(CCVERBOSE)
#
# Depends on misc/audiosup
#
-LDFLAGS += -dy -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
+LDFLAGS += -dy -N misc/ac97 -N drv/audio
#
# Define targets
@@ -76,14 +71,6 @@ DEF_BUILDS = $(DEF_BUILDSONLY64)
CLEANLINTFILES += $(LINT32_FILES)
#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
# Default build targets.
#
.KEEP_STATE:
@@ -93,10 +80,8 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
lint: $(LINT_DEPS)
@@ -110,50 +95,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-# NOTE: there will be warnings about q_lock which is the simulated
-# rwlock of the taskq framework
-#
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_standalone \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
- $(WLCMD_DIR)/audiots_with_sada.wlcmd warlock_standalone
- $(WARLOCK) -c $(WLCMD_DIR)/audiots_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/drv/audiots/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/audiots.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/audiots.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/amsrc2/Makefile b/usr/src/uts/sparc/austr/Makefile
index 0d2672896c..f02bc322bb 100644
--- a/usr/src/uts/sparc/amsrc2/Makefile
+++ b/usr/src/uts/sparc/austr/Makefile
@@ -18,15 +18,14 @@
#
# CDDL HEADER END
#
-# uts/sparc/amsrc2/Makefile
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# uts/sparc/austr/Makefile
+#
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# This makefile drives the production of the audio mixer
-# sample rate conversion routine #1 (amsrc2).
+# This makefile drives the production of the audio streams module.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# Path to the base of the uts directory tree (usually /usr/src/uts).
@@ -36,12 +35,11 @@ UTSBASE = ../..
#
# Define the module and object file sets.
#
-MODULE = amsrc2
-OBJECTS = $(AMSRC2_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(AMSRC2_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(AMSRC2_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
+MODULE = austr
+OBJECTS = $(AUSTR_OBJS:%=$(OBJS_DIR)/%)
+LINTS = $(AUSTR_OBJS:%.o=$(LINTS_DIR)/%.ln)
+ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
+CONF_SRCDIR = $(UTSBASE)/common/io/audio/impl
#
# Include common rules.
@@ -49,33 +47,16 @@ WARLOCK_OK = $(MODULE).ok
include $(UTSBASE)/sparc/Makefile.sparc
#
-# Turn off -xspace so we get all optimizations.
+# Depends on drv/audio
#
-SPACEFLAG =
+LDFLAGS += -dy -Ndrv/audio
#
# Define targets
#
-ALL_TARGET = $(BINARY)
+ALL_TARGET = $(BINARY) $(SRC_CONFFILE)
LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides
-#
-ALL_BUILDS = $(ALL_BUILDSONLY64)
-DEF_BUILDS = $(DEF_BUILDSONLY64)
-CLEANLINTFILES += $(LINT32_FILES)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Depends on misc/amsrc2, misc/audiosup, and misc/mixer
-#
-LDFLAGS += -dy -Nmisc/audiosup -Nmisc/mixer
+INSTALL_TARGET = $(BINARY) $(ROOTMODULE) $(ROOT_CONFFILE)
#
# Default build targets.
@@ -87,14 +68,12 @@ def: $(DEF_DEPS)
all: $(ALL_DEPS)
clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK) main.ll
clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK) main.ll
lint: $(LINT_DEPS)
-modlintlib: $(MODLINTLIB_DEPS) lint32
+modlintlib: $(MODLINTLIB_DEPS)
clean.lint: $(CLEAN_LINT_DEPS)
@@ -104,27 +83,3 @@ install: $(INSTALL_DEPS)
# Include common targets.
#
include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-WARLOCK = warlock
-WLCC = wlcc
-TOUCH = touch
-TEST = test
-
-#
-# Warlock rules
-#
-
-warlock: main.ll $(WARLOCK_OK)
-
-main.ll: main.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ main.c
-
-$(WARLOCK_OK): $(WARLOCK_OUT)
- $(WARLOCK) $(WARLOCK_OUT) -l main.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/amsrc2/%.c main.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
diff --git a/usr/src/uts/sparc/mixer/Makefile b/usr/src/uts/sparc/mixer/Makefile
deleted file mode 100644
index 0f23f2e6b0..0000000000
--- a/usr/src/uts/sparc/mixer/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/mixer/Makefile
-#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-# This makefile drives the production of the audio mixer (mixer)
-# Audio Personality Module.
-#
-#ident "%Z%%M% %I% %E% SMI"
-
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = mixer
-OBJECTS = $(MIXER_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(MIXER_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_MISC_DIR)/$(MODULE)
-WARLOCK_OUT = $(MIXER_OBJS:%.o=%.ll)
-WARLOCK_OK = $(MODULE).ok
-WLCMD_DIR = $(UTSBASE)/common/io/warlock
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# Turn off -xspace so we get all optimizations.
-#
-SPACEFLAG =
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-#
-# Overrides, lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_SUSPICIOUS_COMPARISON
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_SUPPRESSION_DIRECTIVE_UNUSED
-LINTTAGS += -erroff=E_STATIC_UNUSED
-LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
-#
-# Depends on misc/audiosup
-#
-LDFLAGS += -dy -Nmisc/audiosup
-
-#
-# Default build targets.
-#
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-clobber: $(CLOBBER_DEPS)
- $(RM) $(WARLOCK_OUT) $(WARLOCK_OK)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
-
-#
-# Defines for local commands.
-#
-TEST = test
-WLCC = wlcc
-TOUCH = touch
-WARLOCK = warlock
-
-#
-# Warlock targets
-#
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
-
-warlock: $(WARLOCK_OK)
-
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_amsrc2.files \
- warlock_standalone $(WLCMD_DIR)/mixer_with_audiosup.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(WARLOCK) -c $(WLCMD_DIR)/mixer_with_audiosup.wlcmd $(WARLOCK_OUT) \
- $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
- -l ../warlock/ddi_dki_impl.ll
- $(TOUCH) $(WARLOCK_OK)
-
-%.ll: $(UTSBASE)/common/io/audio/sada/mixer/%.c
- $(WLCC) $(CPPFLAGS) -DDEBUG -o $@ $<
-
-warlock_standalone: $(WARLOCK_OUT) warlock_ddi.files $(WLCMD_DIR)/mixer.wlcmd
- $(WARLOCK) -c $(WLCMD_DIR)/mixer.wlcmd $(WARLOCK_OUT) \
- -l ../warlock/ddi_dki_impl.ll
-
-warlock_ddi.files:
- @cd ../warlock; pwd; $(MAKE) warlock
-
-warlock_audiosup.files:
- @cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/os/dacf.conf b/usr/src/uts/sparc/os/dacf.conf
index de9e672a68..199afd894f 100644
--- a/usr/src/uts/sparc/os/dacf.conf
+++ b/usr/src/uts/sparc/os/dacf.conf
@@ -19,14 +19,13 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#
# NOTICE: This file contains important KERNEL STATE. Do not edit this file.
# Its format and contents are subject to change in future releases of Solaris.
#
-#ident "%Z%%M% %I% %E% SMI"
#
# keyboard and mouse configuration rules
@@ -60,13 +59,6 @@ driver-minorname="su_pnp:mouse" consconfig_dacf:ms_config post-attach - pushmod=
driver-minorname="ttymux:con" ttymux_dacf:ttymux_config post-attach -
#
-# Configure and/or unconfigure usb audio devices.
-# usb_ac as a mux for hid and usb_as devices.
-#
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config post-attach -
-driver-minorname="usb_ac:mux" usb_ac_dacf:usb_audio_config pre-detach -
-
-#
# Devices directly supporting the keyboard API need no device-specific module,
# but do need to be linked to the console stream.
#
diff --git a/usr/src/uts/sparc/usb_ac/Makefile b/usr/src/uts/sparc/usb_ac/Makefile
index 7e5ccf3df5..bf3840846c 100644
--- a/usr/src/uts/sparc/usb_ac/Makefile
+++ b/usr/src/uts/sparc/usb_ac/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_ac/Makefile
@@ -40,7 +40,7 @@ OBJECTS = $(USB_AC_OBJS:%=$(OBJS_DIR)/%)
LINTS = $(USB_AC_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_DRV_DIR)/$(MODULE)
CONF_SRCDIR = $(UTSBASE)/common/io/usb/clients/audio/usb_ac
-WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll) usb_ac_dacf.ll
+WARLOCK_OUT = $(USB_AC_OBJS:%.o=%.ll)
WARLOCK_OK = $(MODULE).ok
WLCMD_DIR = $(UTSBASE)/common/io/warlock
@@ -55,7 +55,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Ndrv/audio
#
# Define targets
@@ -111,9 +111,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
@@ -130,7 +127,6 @@ warlock_with_sada: $(WLCMD_DIR)/usb_ac_with_sada.wlcmd \
$(WARLOCK_OUT) \
warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_ac_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
warlock_with_usba: $(WLCMD_DIR)/usb_ac_with_usba.wlcmd $(WARLOCK_OUT) \
diff --git a/usr/src/uts/sparc/usb_ac_dacf/Makefile b/usr/src/uts/sparc/usb_ac_dacf/Makefile
deleted file mode 100644
index 16f567e113..0000000000
--- a/usr/src/uts/sparc/usb_ac_dacf/Makefile
+++ /dev/null
@@ -1,89 +0,0 @@
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-#
-# uts/sparc/usb_ac_dacf/Makefile
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-#ident "%Z%%M% %I% %E% SMI"
-#
-# This makefile drives the production of the usb_ac_dacf module.
-#
-#
-# Path to the base of the uts directory tree (usually /usr/src/uts).
-#
-UTSBASE = ../..
-
-#
-# Define the module and object file sets.
-#
-MODULE = usb_ac_dacf
-OBJECTS = $(USB_AC_DACF_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(USB_AC_DACF_OBJS:%.o=$(LINTS_DIR)/%.ln)
-ROOTMODULE = $(ROOT_DACF_DIR)/$(MODULE)
-
-#
-# Include common rules.
-#
-include $(UTSBASE)/sparc/Makefile.sparc
-
-#
-# lint pass one enforcement
-#
-CFLAGS += $(CCVERBOSE)
-
-#
-# Dependencies
-#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/amsrc2 -Nmisc/mixer -Nmisc/audiosup
-
-#
-# Define targets
-#
-ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
-INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
-
-
-.KEEP_STATE:
-
-def: $(DEF_DEPS)
-
-all: $(ALL_DEPS)
-
-clean: $(CLEAN_DEPS)
-
-clobber: $(CLOBBER_DEPS)
-
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
-install: $(INSTALL_DEPS)
-
-#
-# Include common targets.
-#
-include $(UTSBASE)/sparc/Makefile.targ
diff --git a/usr/src/uts/sparc/usb_ah/Makefile b/usr/src/uts/sparc/usb_ah/Makefile
index cfc1d5b7fe..bd65518c1f 100644
--- a/usr/src/uts/sparc/usb_ah/Makefile
+++ b/usr/src/uts/sparc/usb_ah/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_ah/Makefile
@@ -56,9 +56,9 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# depends on usba, hidparser and mixer related misc modules
+# depends on usba, hidparser and audio related misc modules
#
-LDFLAGS += -dy -Nmisc/usba -Nmisc/hidparser -Nmisc/audiosup -Nmisc/mixer
+LDFLAGS += -dy -Nmisc/usba -Nmisc/hidparser -Ndrv/usb_ac
#
# Define targets
diff --git a/usr/src/uts/sparc/usb_as/Makefile b/usr/src/uts/sparc/usb_as/Makefile
index e258576618..bc7db4c381 100644
--- a/usr/src/uts/sparc/usb_as/Makefile
+++ b/usr/src/uts/sparc/usb_as/Makefile
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# uts/sparc/usb_as/Makefile
@@ -56,9 +56,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
CFLAGS += $(CCVERBOSE)
#
-# do not remove depends on amsrc2. If removed, amsrc2 gets unloaded when
-# usb_ac_dacf gets unloaded
-LDFLAGS += -dy -Nmisc/usba -Nmisc/audiosup -Nmisc/mixer -Nmisc/amsrc2
+LDFLAGS += -dy -Nmisc/usba -Ndrv/usb_ac
#
# Define targets
@@ -114,9 +112,6 @@ USBA_FILES = $(USBA_OBJS:%.o=../usba/%.ll)
UHCI_FILES = $(UHCI_OBJS:%.o=../uhci/%.ll)
OHCI_FILES = $(OHCI_OBJS:%.o=../ohci/%.ll)
EHCI_FILES = $(EHCI_OBJS:%.o=../ehci/%.ll)
-MIXER_FILES = $(MIXER_OBJS:%.o=$(UTSBASE)/sparc/mixer/%.ll)
-AUDIO_SUP_FILES = $(AUDIO_SUP_OBJS:%.o=$(UTSBASE)/sparc/audiosup/%.ll)
-AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
@@ -124,16 +119,13 @@ AMSRC2_FILES = $(AMSRC2_OBJS:%.o=$(UTSBASE)/sparc/amsrc2/%.ll)
#
warlock: $(WARLOCK_OK)
-$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files \
- warlock_audiosup.files warlock_mixer.files warlock_amsrc2.files \
+$(WARLOCK_OK): $(WARLOCK_OUT) warlock_ddi.files warlock_audiosup.files \
warlock_standalone warlock_with_usba warlock_with_sada
$(TOUCH) $(WARLOCK_OK)
warlock_with_sada: $(WLCMD_DIR)/usb_as_with_sada.wlcmd \
- $(WARLOCK_OUT) \
- warlock_audiosup.files warlock_amsrc2.files warlock_mixer.files
+ $(WARLOCK_OUT) warlock_audiosup.files
$(WARLOCK) -c $(WLCMD_DIR)/usb_as_with_sada.wlcmd $(WARLOCK_OUT) \
- $(MIXER_FILES) $(AUDIO_SUP_FILES) $(AMSRC2_FILES) \
-l ../warlock/ddi_dki_impl.ll
warlock_with_usba: $(WLCMD_DIR)/usb_as_with_usba.wlcmd $(WARLOCK_OUT) \
@@ -168,9 +160,3 @@ warlock_ddi.files:
warlock_audiosup.files:
@cd ../audiosup; pwd; $(MAKE) warlock
-
-warlock_amsrc2.files:
- @cd ../amsrc2; pwd; $(MAKE) warlock
-
-warlock_mixer.files:
- @cd ../mixer; pwd; $(MAKE) warlock
diff --git a/usr/src/uts/sparc/warlock/Makefile b/usr/src/uts/sparc/warlock/Makefile
index 746c15d646..4cbe0e4e15 100644
--- a/usr/src/uts/sparc/warlock/Makefile
+++ b/usr/src/uts/sparc/warlock/Makefile
@@ -18,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# sparc architecture dependent
@@ -51,7 +51,7 @@ include $(UTSBASE)/sparc/Makefile.sparc
#
# lock_lint rules
#
-all: warlock warlock.1394 warlock.audio warlock.ecpp warlock.scsi \
+all: warlock warlock.1394 warlock.ecpp warlock.scsi \
warlock.smartcard warlock.usb warlock.ib warlock.sata warlock.wc
warlock: $(MODULE).ok
@@ -109,24 +109,6 @@ warlock.1394:
warlock.ecpp:
@cd ../ecpp; $(MAKE) clean; $(MAKE) warlock
-warlock.audio:
- @cd ../audiosup; $(MAKE) clean; $(MAKE) warlock
- @cd ../mixer; $(MAKE) clean; $(MAKE) warlock
- @cd ../amsrc2; $(MAKE) clean; $(MAKE) warlock
- @cd ../audio1575; $(MAKE) clean; $(MAKE) warlock
- @cd ../audio810; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiohd; $(MAKE) clean; $(MAKE) warlock
- @cd ../audioixp; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiocs; $(MAKE) clean; $(MAKE) warlock
- @cd ../audiots; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ac; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_as; $(MAKE) clean; $(MAKE) warlock
- @cd ../usb_ah; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/amsrc1; $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/audiovia823x; \
- $(MAKE) clean; $(MAKE) warlock
-$(CLOSED_BUILD) @cd $(CLOSED)/uts/sparc/audioens; $(MAKE) clean; $(MAKE) warlock
-
warlock.smartcard:
$(CLOSED_BUILD) @cd $(CLOSED)/uts/sun4u/scmi2c; $(MAKE) clean; $(MAKE) warlock
diff --git a/usr/src/uts/sun/Makefile.files b/usr/src/uts/sun/Makefile.files
index b8da4818f3..9821c7e90b 100644
--- a/usr/src/uts/sun/Makefile.files
+++ b/usr/src/uts/sun/Makefile.files
@@ -20,11 +20,9 @@
#
#
-# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# uts/sun/Makefile.files
#
# This Makefile defines file modules and build rules for the directory
@@ -48,7 +46,6 @@ GENUNIX_OBJS += \
# Driver Modules
#
AUDIOCS_OBJS += audio_4231.o audio_4231_apcdma.o audio_4231_eb2dma.o
-AUDIO1575_OBJS += audio1575.o
BPP_OBJS += bpp.o
diff --git a/usr/src/uts/sun/Makefile.rules b/usr/src/uts/sun/Makefile.rules
index cd583af7ac..22d0d3ec10 100644
--- a/usr/src/uts/sun/Makefile.rules
+++ b/usr/src/uts/sun/Makefile.rules
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-# ident "%Z%%M% %I% %E% SMI"
-#
# uts/sun/Makefile.rules
#
# This Makefile defines all build rules for the directory uts/sun and
@@ -48,11 +46,7 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
-$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- $(COMPILE.c) -o $@ $<
- $(CTFCONVERT_O)
-
-$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
+$(OBJS_DIR)/%.o: $(UTSBASE)/sun/io/audio/drv/audiocs/%.c
$(COMPILE.c) -o $@ $<
$(CTFCONVERT_O)
@@ -99,10 +93,7 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/scsi/adapters/%.c
$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
-$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/sada/drv/audiocs/%.c
- @($(LHEAD) $(LINT.c) $< $(LTAIL))
-
-$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/sada/drv/audio1575/%.c
+$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/audio/drv/audiocs/%.c
@($(LHEAD) $(LINT.c) $< $(LTAIL))
$(LINTS_DIR)/%.ln: $(UTSBASE)/sun/io/eri/%.c
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c
new file mode 100644
index 0000000000..5c1b6db44b
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.c
@@ -0,0 +1,2406 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ * audiocs Audio Driver
+ *
+ * This Audio Driver controls the Crystal CS4231 Codec used on many SPARC
+ * platforms. It does not support the CS4231 on Power PCs or x86 PCs. It
+ * does support two different DMA engines, the APC and EB2. The code for
+ * those DMA engines is split out and a well defined, but private, interface
+ * is used to control those DMA engines.
+ *
+ * For some reason setting the CS4231's registers doesn't always
+ * succeed. Therefore every time we set a register we always read it
+ * back to make sure it was set. If not we wait a little while and
+ * then try again. This is all taken care of in the routines
+ * audiocs_put_index() and audiocs_sel_index() and the macros ORIDX()
+ * and ANDIDX(). We don't worry about the status register because it
+ * is cleared by writing anything to it. So it doesn't matter what
+ * the value written is.
+ *
+ * This driver supports suspending and resuming. A suspend just stops playing
+ * and recording. The play DMA buffers end up getting thrown away, but when
+ * you shut down the machine there is a break in the audio anyway, so they
+ * won't be missed and it isn't worth the effort to save them. When we resume
+ * we always start playing and recording. If they aren't needed they get
+ * shut off by the mixer.
+ *
+ * Power management is supported by this driver.
+ *
+ * NOTE: This module depends on drv/audio being loaded first.
+ */
+
+#include <sys/modctl.h>
+#include <sys/kmem.h>
+#include <sys/stropts.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Module linkage routines for the kernel
+ */
+static int audiocs_ddi_attach(dev_info_t *, ddi_attach_cmd_t);
+static int audiocs_ddi_detach(dev_info_t *, ddi_detach_cmd_t);
+static int audiocs_ddi_power(dev_info_t *, int, int);
+
+/*
+ * Entry point routine prototypes
+ */
+static int audiocs_open(void *, int, unsigned *, unsigned *, caddr_t *);
+static void audiocs_close(void *);
+static int audiocs_start(void *);
+static void audiocs_stop(void *);
+static int audiocs_format(void *);
+static int audiocs_channels(void *);
+static int audiocs_rate(void *);
+static uint64_t audiocs_count(void *);
+static void audiocs_sync(void *, unsigned);
+static size_t audiocs_qlen(void *);
+
+/*
+ * Control callbacks.
+ */
+static int audiocs_get_value(void *, uint64_t *);
+static int audiocs_set_ogain(void *, uint64_t);
+static int audiocs_set_igain(void *, uint64_t);
+static int audiocs_set_mgain(void *, uint64_t);
+static int audiocs_set_inputs(void *, uint64_t);
+static int audiocs_set_outputs(void *, uint64_t);
+static int audiocs_set_micboost(void *, uint64_t);
+
+/* Local Routines */
+static int audiocs_resume(dev_info_t *);
+static int audiocs_attach(dev_info_t *);
+static int audiocs_detach(dev_info_t *);
+static int audiocs_suspend(dev_info_t *);
+
+static void audiocs_destroy(CS_state_t *);
+static int audiocs_init_state(CS_state_t *);
+static int audiocs_chip_init(CS_state_t *);
+static int audiocs_alloc_engine(CS_state_t *, int);
+static void audiocs_free_engine(CS_engine_t *);
+static void audiocs_reset_engine(CS_engine_t *);
+static int audiocs_start_engine(CS_engine_t *);
+static void audiocs_stop_engine(CS_engine_t *);
+static void audiocs_get_ports(CS_state_t *);
+static void audiocs_configure_input(CS_state_t *);
+static void audiocs_configure_output(CS_state_t *);
+static CS_ctrl_t *audiocs_alloc_ctrl(CS_state_t *, uint32_t, uint64_t);
+static void audiocs_free_ctrl(CS_ctrl_t *);
+static int audiocs_add_controls(CS_state_t *);
+static void audiocs_del_controls(CS_state_t *);
+static void audiocs_power_up(CS_state_t *);
+static void audiocs_power_down(CS_state_t *);
+static int audiocs_poll_ready(CS_state_t *);
+#ifdef DEBUG
+static void audiocs_put_index(CS_state_t *, uint8_t, uint8_t, int);
+static void audiocs_sel_index(CS_state_t *, uint8_t, int);
+#define SELIDX(s, idx) audiocs_sel_index(s, idx, __LINE__)
+#define PUTIDX(s, val, mask) audiocs_put_index(s, val, mask, __LINE__)
+#else
+static void audiocs_put_index(CS_state_t *, uint8_t, uint8_t);
+static void audiocs_sel_index(CS_state_t *, uint8_t);
+#define SELIDX(s, idx) audiocs_sel_index(s, idx)
+#define PUTIDX(s, val, mask) audiocs_put_index(s, val, mask)
+#endif
+
+#define ORIDX(s, val, mask) \
+ PUTIDX(s, \
+ (ddi_get8((handle), &CS4231_IDR) | (uint8_t)(val)), \
+ (uint8_t)(mask))
+
+#define ANDIDX(s, val, mask) \
+ PUTIDX(s, (ddi_get8((handle), &CS4231_IDR) & (uint8_t)(val)), \
+ (uint8_t)(mask))
+
+static audio_engine_ops_t audiocs_engine_ops = {
+ AUDIO_ENGINE_VERSION,
+ audiocs_open,
+ audiocs_close,
+ audiocs_start,
+ audiocs_stop,
+ audiocs_count,
+ audiocs_format,
+ audiocs_channels,
+ audiocs_rate,
+ audiocs_sync,
+ audiocs_qlen
+};
+
+#define OUTPUT_SPEAKER 0
+#define OUTPUT_HEADPHONES 1
+#define OUTPUT_LINEOUT 2
+
+static const char *audiocs_outputs[] = {
+ AUDIO_PORT_SPEAKER,
+ AUDIO_PORT_HEADPHONES,
+ AUDIO_PORT_LINEOUT,
+ NULL
+};
+
+#define INPUT_MIC 0
+#define INPUT_LINEIN 1
+#define INPUT_STEREOMIX 2
+#define INPUT_CD 3
+
+static const char *audiocs_inputs[] = {
+ AUDIO_PORT_MIC,
+ AUDIO_PORT_LINEIN,
+ AUDIO_PORT_STEREOMIX,
+ AUDIO_PORT_CD,
+ NULL
+};
+
+/*
+ * Global variables, but viewable only by this file.
+ */
+
+/* play gain array, converts linear gain to 64 steps of log10 gain */
+static uint8_t cs4231_atten[] = {
+ 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, /* [000] -> [004] */
+ 0x3a, 0x39, 0x38, 0x37, 0x36, /* [005] -> [009] */
+ 0x35, 0x34, 0x33, 0x32, 0x31, /* [010] -> [014] */
+ 0x30, 0x2f, 0x2e, 0x2d, 0x2c, /* [015] -> [019] */
+ 0x2b, 0x2a, 0x29, 0x29, 0x28, /* [020] -> [024] */
+ 0x28, 0x27, 0x27, 0x26, 0x26, /* [025] -> [029] */
+ 0x25, 0x25, 0x24, 0x24, 0x23, /* [030] -> [034] */
+ 0x23, 0x22, 0x22, 0x21, 0x21, /* [035] -> [039] */
+ 0x20, 0x20, 0x1f, 0x1f, 0x1f, /* [040] -> [044] */
+ 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, /* [045] -> [049] */
+ 0x1d, 0x1c, 0x1c, 0x1c, 0x1b, /* [050] -> [054] */
+ 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, /* [055] -> [059] */
+ 0x1a, 0x19, 0x19, 0x19, 0x19, /* [060] -> [064] */
+ 0x18, 0x18, 0x18, 0x18, 0x17, /* [065] -> [069] */
+ 0x17, 0x17, 0x17, 0x16, 0x16, /* [070] -> [074] */
+ 0x16, 0x16, 0x16, 0x15, 0x15, /* [075] -> [079] */
+ 0x15, 0x15, 0x15, 0x14, 0x14, /* [080] -> [084] */
+ 0x14, 0x14, 0x14, 0x13, 0x13, /* [085] -> [089] */
+ 0x13, 0x13, 0x13, 0x12, 0x12, /* [090] -> [094] */
+ 0x12, 0x12, 0x12, 0x12, 0x11, /* [095] -> [099] */
+ 0x11, 0x11, 0x11, 0x11, 0x11, /* [100] -> [104] */
+ 0x10, 0x10, 0x10, 0x10, 0x10, /* [105] -> [109] */
+ 0x10, 0x0f, 0x0f, 0x0f, 0x0f, /* [110] -> [114] */
+ 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, /* [114] -> [119] */
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, /* [120] -> [124] */
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, /* [125] -> [129] */
+ 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, /* [130] -> [134] */
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, /* [135] -> [139] */
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, /* [140] -> [144] */
+ 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, /* [145] -> [149] */
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x09, /* [150] -> [154] */
+ 0x09, 0x09, 0x09, 0x09, 0x09, /* [155] -> [159] */
+ 0x09, 0x09, 0x08, 0x08, 0x08, /* [160] -> [164] */
+ 0x08, 0x08, 0x08, 0x08, 0x08, /* [165] -> [169] */
+ 0x08, 0x07, 0x07, 0x07, 0x07, /* [170] -> [174] */
+ 0x07, 0x07, 0x07, 0x07, 0x07, /* [175] -> [179] */
+ 0x06, 0x06, 0x06, 0x06, 0x06, /* [180] -> [184] */
+ 0x06, 0x06, 0x06, 0x06, 0x05, /* [185] -> [189] */
+ 0x05, 0x05, 0x05, 0x05, 0x05, /* [190] -> [194] */
+ 0x05, 0x05, 0x05, 0x05, 0x04, /* [195] -> [199] */
+ 0x04, 0x04, 0x04, 0x04, 0x04, /* [200] -> [204] */
+ 0x04, 0x04, 0x04, 0x04, 0x03, /* [205] -> [209] */
+ 0x03, 0x03, 0x03, 0x03, 0x03, /* [210] -> [214] */
+ 0x03, 0x03, 0x03, 0x03, 0x03, /* [215] -> [219] */
+ 0x02, 0x02, 0x02, 0x02, 0x02, /* [220] -> [224] */
+ 0x02, 0x02, 0x02, 0x02, 0x02, /* [225] -> [229] */
+ 0x02, 0x01, 0x01, 0x01, 0x01, /* [230] -> [234] */
+ 0x01, 0x01, 0x01, 0x01, 0x01, /* [235] -> [239] */
+ 0x01, 0x01, 0x01, 0x00, 0x00, /* [240] -> [244] */
+ 0x00, 0x00, 0x00, 0x00, 0x00, /* [245] -> [249] */
+ 0x00, 0x00, 0x00, 0x00, 0x00, /* [250] -> [254] */
+ 0x00 /* [255] */
+};
+
+/*
+ * STREAMS Structures
+ */
+
+/*
+ * DDI Structures
+ */
+
+/* Device operations structure */
+static struct dev_ops audiocs_dev_ops = {
+ DEVO_REV, /* devo_rev */
+ 0, /* devo_refcnt */
+ NULL, /* devo_getinfo */
+ nulldev, /* devo_identify - obsolete */
+ nulldev, /* devo_probe - not needed */
+ audiocs_ddi_attach, /* devo_attach */
+ audiocs_ddi_detach, /* devo_detach */
+ nodev, /* devo_reset */
+ NULL, /* devi_cb_ops */
+ NULL, /* devo_bus_ops */
+ audiocs_ddi_power, /* devo_power */
+ ddi_quiesce_not_supported, /* devo_quiesce */
+};
+
+/* Linkage structure for loadable drivers */
+static struct modldrv audiocs_modldrv = {
+ &mod_driverops, /* drv_modops */
+ CS4231_MOD_NAME, /* drv_linkinfo */
+ &audiocs_dev_ops /* drv_dev_ops */
+};
+
+/* Module linkage structure */
+static struct modlinkage audiocs_modlinkage = {
+ MODREV_1, /* ml_rev */
+ (void *)&audiocs_modldrv, /* ml_linkage */
+ NULL /* NULL terminates the list */
+};
+
+
+/* ******* Loadable Module Configuration Entry Points ********************* */
+
+/*
+ * _init()
+ *
+ * Description:
+ * Implements _init(9E).
+ *
+ * Returns:
+ * mod_install() status, see mod_install(9f)
+ */
+int
+_init(void)
+{
+ int rv;
+
+ audio_init_ops(&audiocs_dev_ops, CS4231_NAME);
+
+ if ((rv = mod_install(&audiocs_modlinkage)) != 0) {
+ audio_fini_ops(&audiocs_dev_ops);
+ }
+
+ return (rv);
+}
+
+/*
+ * _fini()
+ *
+ * Description:
+ * Implements _fini(9E).
+ *
+ * Returns:
+ * mod_remove() status, see mod_remove(9f)
+ */
+int
+_fini(void)
+{
+ int rv;
+
+ if ((rv = mod_remove(&audiocs_modlinkage)) == 0) {
+ audio_fini_ops(&audiocs_dev_ops);
+ }
+
+ return (rv);
+}
+
+/*
+ * _info()
+ *
+ * Description:
+ * Implements _info(9E).
+ *
+ * Arguments:
+ * modinfo *modinfop Pointer to the opaque modinfo structure
+ *
+ * Returns:
+ * mod_info() status, see mod_info(9f)
+ */
+int
+_info(struct modinfo *modinfop)
+{
+ return (mod_info(&audiocs_modlinkage, modinfop));
+}
+
+
+/* ******* Driver Entry Points ******************************************** */
+
+/*
+ * audiocs_ddi_attach()
+ *
+ * Description:
+ * Implement attach(9e).
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_attach_cmd_t cmd Attach command
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_ddi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_ATTACH:
+ return (audiocs_attach(dip));
+
+ case DDI_RESUME:
+ return (audiocs_resume(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audiocs_ddi_detach()
+ *
+ * Description:
+ * Implement detach(9e).
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ * ddi_detach_cmd_t cmd Detach command
+ *
+ * Returns:
+ * DDI_SUCCESS Success.
+ * DDI_FAILURE Failure.
+ */
+static int
+audiocs_ddi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
+{
+ switch (cmd) {
+ case DDI_DETACH:
+ return (audiocs_detach(dip));
+
+ case DDI_SUSPEND:
+ return (audiocs_suspend(dip));
+
+ default:
+ return (DDI_FAILURE);
+ }
+}
+
+/*
+ * audiocs_ddi_power()
+ *
+ * Description:
+ * Implements power(9E).
+ *
+ * Arguments:
+ * def_info_t *dip Ptr to the device's dev_info structure
+ * int component Which component to power up/down
+ * int level The power level for the component
+ *
+ * Returns:
+ * DDI_SUCCESS Power level changed, we always succeed
+ */
+static int
+audiocs_ddi_power(dev_info_t *dip, int component, int level)
+{
+ CS_state_t *state;
+
+ if (component != CS4231_COMPONENT)
+ return (DDI_FAILURE);
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ /* make sure we have some work to do */
+ mutex_enter(&state->cs_lock);
+
+ /*
+ * We don't do anything if we're suspended. Suspend/resume diddles
+ * with power anyway.
+ */
+ if (!state->cs_suspended) {
+
+ /* check the level change to see what we need to do */
+ if (level == CS4231_PWR_OFF && state->cs_powered) {
+
+ /* power down and save the state */
+ audiocs_power_down(state);
+ state->cs_powered = B_FALSE;
+
+ } else if (level == CS4231_PWR_ON && !state->cs_powered) {
+
+ /* power up */
+ audiocs_power_up(state);
+ state->cs_powered = B_TRUE;
+ }
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ return (DDI_SUCCESS);
+}
+
+/* ******* Local Routines *************************************************** */
+
+static void
+audiocs_destroy(CS_state_t *state)
+{
+ if (state == NULL)
+ return;
+
+ /*
+ * Unregister any interrupts. That way we can't get called by and
+ * interrupt after the audio framework is removed.
+ */
+ CS4231_DMA_REM_INTR(state);
+
+ for (int i = CS4231_PLAY; i <= CS4231_REC; i++) {
+ audiocs_free_engine(state->cs_engines[i]);
+ }
+ audiocs_del_controls(state);
+
+ /* free the kernel statistics structure */
+ if (state->cs_ksp) {
+ kstat_delete(state->cs_ksp);
+ }
+
+ if (state->cs_adev) {
+ audio_dev_free(state->cs_adev);
+ }
+
+ /* unmap the registers */
+ CS4231_DMA_UNMAP_REGS(state);
+
+ /* destroy the state mutex */
+ mutex_destroy(&state->cs_lock);
+ kmem_free(state, sizeof (*state));
+}
+
+/*
+ * audiocs_attach()
+ *
+ * Description:
+ * Attach an instance of the CS4231 driver. This routine does the device
+ * dependent attach tasks. When it is complete it calls
+ * audio_dev_register() to register with the framework.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_attach(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+
+ /* allocate the state structure */
+ state = kmem_zalloc(sizeof (*state), KM_SLEEP);
+ state->cs_dip = dip;
+ ddi_set_driver_private(dip, state);
+
+ /* get the iblock cookie needed for interrupt context */
+ if (ddi_get_iblock_cookie(dip, 0, &state->cs_iblock) != DDI_SUCCESS) {
+ audio_dev_warn(NULL, "cannot get iblock cookie");
+ kmem_free(state, sizeof (*state));
+ return (DDI_FAILURE);
+ }
+
+ /* now fill it in, initialize the state mutexs first */
+ mutex_init(&state->cs_lock, NULL, MUTEX_DRIVER, state->cs_iblock);
+
+ /*
+ * audio state initialization... should always succeed,
+ * framework will message failure.
+ */
+ if ((state->cs_adev = audio_dev_alloc(dip, 0)) == NULL) {
+ goto error;
+ }
+ adev = state->cs_adev;
+ audio_dev_set_description(adev, CS_DEV_CONFIG_ONBRD1);
+ audio_dev_add_info(adev, "Legacy codec: Crystal Semiconductor CS4231");
+
+ /* initialize the audio state structures */
+ if ((audiocs_init_state(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "init_state() failed");
+ goto error;
+ }
+
+ /* initialize the audio chip */
+ if ((audiocs_chip_init(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "chip_init() failed");
+ goto error;
+ }
+ /* chip init will have powered us up */
+ state->cs_powered = B_TRUE;
+
+ /* set up kernel statistics */
+ if ((state->cs_ksp = kstat_create(ddi_driver_name(dip),
+ ddi_get_instance(dip), ddi_driver_name(dip),
+ "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
+ kstat_install(state->cs_ksp);
+ }
+
+ /* we're ready, set up the interrupt handler */
+ if (CS4231_DMA_ADD_INTR(state) != DDI_SUCCESS) {
+ goto error;
+ }
+
+ /* finally register with framework to kick everything off */
+ if (audio_dev_register(state->cs_adev) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "unable to register audio dev");
+ }
+
+ /* everything worked out, so report the device */
+ ddi_report_dev(dip);
+
+ return (DDI_SUCCESS);
+
+error:
+ audiocs_destroy(state);
+ return (DDI_FAILURE);
+}
+
+/*
+ * audiocs_resume()
+ *
+ * Description:
+ * Resume a suspended device instance.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was initialized properly
+ * DDI_FAILURE The driver couldn't be initialized properly
+ */
+static int
+audiocs_resume(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+
+ /* we've already allocated the state structure so get ptr */
+ state = ddi_get_driver_private(dip);
+ adev = state->cs_adev;
+
+ ASSERT(dip == state->cs_dip);
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ /* mark the Codec busy -- this should keep power(9e) away */
+ (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
+
+ /* power it up */
+ audiocs_power_up(state);
+ state->cs_powered = B_TRUE;
+
+ /* initialize the audio chip */
+ if ((audiocs_chip_init(state)) == DDI_FAILURE) {
+ audio_dev_warn(adev, "chip_init() failed");
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+ return (DDI_FAILURE);
+ }
+
+ mutex_enter(&state->cs_lock);
+ state->cs_suspended = B_FALSE;
+
+ /* restore mixer settings */
+ audiocs_configure_output(state);
+ audiocs_configure_input(state);
+
+ for (int i = CS4231_PLAY; i <= CS4231_REC; i++) {
+ CS_engine_t *eng = state->cs_engines[i];
+
+ audiocs_reset_engine(eng);
+ if (eng->ce_started) {
+ (void) audiocs_start_engine(eng);
+ } else {
+ audiocs_stop_engine(eng);
+ }
+ }
+ mutex_exit(&state->cs_lock);
+
+ /*
+ * We have already powered up the chip, but this alerts the
+ * framework to the fact.
+ */
+ (void) pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON);
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_detach()
+ *
+ * Description:
+ * Detach an instance of the CS4231 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached (busy)
+ */
+static int
+audiocs_detach(dev_info_t *dip)
+{
+ CS_state_t *state;
+ audio_dev_t *adev;
+ ddi_acc_handle_t handle;
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+ handle = CODEC_HANDLE;
+ adev = state->cs_adev;
+
+ /* don't detach if still in use */
+ if (audio_dev_unregister(adev) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ if (state->cs_powered) {
+ /*
+ * Make sure the Codec and DMA engine are off.
+ */
+ SELIDX(state, INTC_REG);
+ ANDIDX(state, ~(INTC_PEN|INTC_CEN), INTC_VALID_MASK);
+
+ /* make sure the DMA engine isn't going to do anything */
+ CS4231_DMA_RESET(state);
+
+ /*
+ * power down the device, no reason to waste power without
+ * a driver
+ */
+ (void) pm_lower_power(dip, CS4231_COMPONENT, CS4231_PWR_OFF);
+ }
+
+ audiocs_destroy(state);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_suspend()
+ *
+ * Description:
+ * Suspend an instance of the CS4231 driver.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's dev_info struct
+ *
+ * Returns:
+ * DDI_SUCCESS The driver was detached
+ * DDI_FAILURE The driver couldn't be detached
+ */
+static int
+audiocs_suspend(dev_info_t *dip)
+{
+ CS_state_t *state;
+
+ /* get the state structure */
+ state = ddi_get_driver_private(dip);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+
+ mutex_enter(&state->cs_lock);
+
+ ASSERT(!state->cs_suspended);
+
+ if (state->cs_powered) {
+ /* stop playing and recording */
+ CS4231_DMA_STOP(state, state->cs_engines[CS4231_PLAY]);
+ CS4231_DMA_STOP(state, state->cs_engines[CS4231_REC]);
+
+ /* now we can power down the Codec */
+ audiocs_power_down(state);
+ state->cs_powered = B_FALSE;
+ }
+ state->cs_suspended = B_TRUE; /* stop new ops */
+ mutex_exit(&state->cs_lock);
+
+ ASSERT(!mutex_owned(&state->cs_lock));
+ return (DDI_SUCCESS);
+}
+
+#define PLAYCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_PLAY)
+#define RECCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_REC)
+#define MONCTL (AUDIO_CTRL_FLAG_RW | AUDIO_CTRL_FLAG_MONITOR)
+#define PCMVOL (PLAYCTL | AUDIO_CTRL_FLAG_PCMVOL)
+#define MAINVOL (PLAYCTL | AUDIO_CTRL_FLAG_MAINVOL)
+#define RECVOL (RECCTL | AUDIO_CTRL_FLAG_RECVOL)
+#define MONVOL (MONCTL | AUDIO_CTRL_FLAG_MONVOL)
+
+/*
+ * audiocs_alloc_ctrl
+ *
+ * Description:
+ * Allocates a control structure for the audio mixer.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ * uint32_t num Control number to allocate.
+ * uint64_t val Initial value.
+ *
+ * Returns:
+ * Pointer to newly allocated CS_ctrl_t structure.
+ */
+static CS_ctrl_t *
+audiocs_alloc_ctrl(CS_state_t *state, uint32_t num, uint64_t val)
+{
+ audio_ctrl_desc_t desc;
+ audio_ctrl_wr_t fn;
+ CS_ctrl_t *cc;
+
+ cc = kmem_zalloc(sizeof (*cc), KM_SLEEP);
+ cc->cc_state = state;
+ cc->cc_num = num;
+
+ bzero(&desc, sizeof (desc));
+
+ switch (num) {
+ case CTL_VOLUME:
+ desc.acd_name = AUDIO_CTRL_ID_VOLUME;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = PCMVOL;
+ fn = audiocs_set_ogain;
+ break;
+
+ case CTL_IGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_RECGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_STEREO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = RECVOL;
+ fn = audiocs_set_igain;
+ break;
+
+ case CTL_MGAIN:
+ desc.acd_name = AUDIO_CTRL_ID_MONGAIN;
+ desc.acd_type = AUDIO_CTRL_TYPE_MONO;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 100;
+ desc.acd_flags = MONVOL;
+ fn = audiocs_set_mgain;
+ break;
+
+ case CTL_INPUTS:
+ desc.acd_name = AUDIO_CTRL_ID_RECSRC;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = state->cs_imask;
+ desc.acd_maxvalue = state->cs_imask;
+ desc.acd_flags = RECCTL;
+ for (int i = 0; audiocs_inputs[i]; i++) {
+ desc.acd_enum[i] = audiocs_inputs[i];
+ }
+ fn = audiocs_set_inputs;
+
+ break;
+
+ case CTL_OUTPUTS:
+ desc.acd_name = AUDIO_CTRL_ID_OUTPUTS;
+ desc.acd_type = AUDIO_CTRL_TYPE_ENUM;
+ desc.acd_minvalue = state->cs_omod;
+ desc.acd_maxvalue = state->cs_omask;
+ desc.acd_flags = PLAYCTL | AUDIO_CTRL_FLAG_MULTI;
+ for (int i = 0; audiocs_outputs[i]; i++) {
+ desc.acd_enum[i] = audiocs_outputs[i];
+ }
+ fn = audiocs_set_outputs;
+ break;
+
+ case CTL_MICBOOST:
+ desc.acd_name = AUDIO_CTRL_ID_MICBOOST;
+ desc.acd_type = AUDIO_CTRL_TYPE_BOOLEAN;
+ desc.acd_minvalue = 0;
+ desc.acd_maxvalue = 1;
+ desc.acd_flags = RECCTL;
+ fn = audiocs_set_micboost;
+ break;
+ }
+
+ cc->cc_val = val;
+ cc->cc_ctrl = audio_dev_add_control(state->cs_adev, &desc,
+ audiocs_get_value, fn, cc);
+
+ return (cc);
+}
+
+/*
+ * audiocs_free_ctrl
+ *
+ * Description:
+ * Frees a control and all resources associated with it.
+ *
+ * Arguments:
+ * CS_ctrl_t *cc Pointer to control structure.
+ */
+static void
+audiocs_free_ctrl(CS_ctrl_t *cc)
+{
+ if (cc == NULL)
+ return;
+ if (cc->cc_ctrl)
+ audio_dev_del_control(cc->cc_ctrl);
+ kmem_free(cc, sizeof (*cc));
+}
+
+/*
+ * audiocs_add_controls
+ *
+ * Description:
+ * Allocates and registers all controls for this device.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ *
+ * Returns:
+ * DDI_SUCCESS All controls added and registered
+ * DDI_FAILURE At least one control was not added or registered.
+ */
+static int
+audiocs_add_controls(CS_state_t *state)
+{
+#define ADD_CTRL(CTL, ID, VAL) \
+ state->cs_##CTL = audiocs_alloc_ctrl(state, ID, VAL); \
+ if (state->cs_##CTL == NULL) { \
+ audio_dev_warn(state->cs_adev, \
+ "unable to allocate %s control", #ID); \
+ return (DDI_FAILURE); \
+ }
+
+ ADD_CTRL(ogain, CTL_VOLUME, 0x4b4b);
+ ADD_CTRL(igain, CTL_IGAIN, 0x3232);
+ ADD_CTRL(mgain, CTL_MGAIN, 0);
+ ADD_CTRL(micboost, CTL_MICBOOST, 0);
+ ADD_CTRL(outputs, CTL_OUTPUTS, (state->cs_omask & ~state->cs_omod) |
+ (1U << OUTPUT_SPEAKER));
+ ADD_CTRL(inputs, CTL_INPUTS, (1U << INPUT_MIC));
+
+ mutex_enter(&state->cs_lock);
+ audiocs_configure_output(state);
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (DDI_SUCCESS);
+}
+/*
+ * audiocs_del_controls
+ *
+ * Description:
+ * Unregisters and frees all controls for this device.
+ *
+ * Arguments:
+ * CS_state_t *state Device soft state.
+ */
+void
+audiocs_del_controls(CS_state_t *state)
+{
+ audiocs_free_ctrl(state->cs_ogain);
+ audiocs_free_ctrl(state->cs_igain);
+ audiocs_free_ctrl(state->cs_mgain);
+ audiocs_free_ctrl(state->cs_micboost);
+ audiocs_free_ctrl(state->cs_inputs);
+ audiocs_free_ctrl(state->cs_outputs);
+}
+
+
+/*
+ * audiocs_chip_init()
+ *
+ * Description:
+ * Power up the audio core, initialize the audio Codec, prepare the chip
+ * for use.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Chip initialized and ready to use
+ * DDI_FAILURE Chip not initialized and not ready
+ */
+static int
+audiocs_chip_init(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ /* make sure we are powered up */
+ CS4231_DMA_POWER(state, CS4231_PWR_ON);
+
+ CS4231_DMA_RESET(state);
+
+ /* activate registers 16 -> 31 */
+ SELIDX(state, MID_REG);
+ ddi_put8(handle, &CS4231_IDR, MID_MODE2);
+
+ /* now figure out what version we have */
+ SELIDX(state, VID_REG);
+ if (ddi_get8(handle, &CS4231_IDR) & VID_A) {
+ state->cs_revA = B_TRUE;
+ } else {
+ state->cs_revA = B_FALSE;
+ }
+
+ /* get rid of annoying popping by muting the output channels */
+ SELIDX(state, LDACO_REG);
+ PUTIDX(state, LDACO_LDM | LDACO_MID_GAIN, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ PUTIDX(state, RDACO_RDM | RDACO_MID_GAIN, RDAC0_VALID_MASK);
+
+ /* initialize aux input channels to known gain values & muted */
+ SELIDX(state, LAUX1_REG);
+ PUTIDX(state, LAUX1_LX1M | LAUX1_UNITY_GAIN, LAUX1_VALID_MASK);
+ SELIDX(state, RAUX1_REG);
+ PUTIDX(state, RAUX1_RX1M | RAUX1_UNITY_GAIN, RAUX1_VALID_MASK);
+ SELIDX(state, LAUX2_REG);
+ PUTIDX(state, LAUX2_LX2M | LAUX2_UNITY_GAIN, LAUX2_VALID_MASK);
+ SELIDX(state, RAUX2_REG);
+ PUTIDX(state, RAUX2_RX2M | RAUX2_UNITY_GAIN, RAUX2_VALID_MASK);
+
+ /* initialize aux input channels to known gain values & muted */
+ SELIDX(state, LLIC_REG);
+ PUTIDX(state, LLIC_LLM | LLIC_UNITY_GAIN, LLIC_VALID_MASK);
+ SELIDX(state, RLIC_REG);
+ PUTIDX(state, RLIC_RLM | RLIC_UNITY_GAIN, RLIC_VALID_MASK);
+
+ /* program the sample rate, play and capture must be the same */
+ SELIDX(state, FSDF_REG | IAR_MCE);
+ PUTIDX(state, FS_48000 | PDF_LINEAR16NE | PDF_STEREO, FSDF_VALID_MASK);
+ SELIDX(state, FSDF_REG);
+ SELIDX(state, CDF_REG | IAR_MCE);
+ PUTIDX(state, CDF_LINEAR16NE | CDF_STEREO, CDF_VALID_MASK);
+ SELIDX(state, CDF_REG);
+
+ /*
+ * Set up the Codec for playback and capture disabled, dual DMA, and
+ * playback and capture DMA.
+ */
+ SELIDX(state, (INTC_REG | IAR_MCE));
+ PUTIDX(state, INTC_DDC | INTC_PDMA | INTC_CDMA, INTC_VALID_MASK);
+
+ /* turn off the MCE bit */
+ SELIDX(state, LADCI_REG);
+
+ /* wait for the Codec before we continue XXX - do we need this? */
+ if (audiocs_poll_ready(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Turn on the output level bit to be 2.8 Vpp. Also, don't go to 0 on
+ * underflow.
+ */
+ SELIDX(state, AFE1_REG);
+ PUTIDX(state, AFE1_OLB, AFE1_VALID_MASK);
+
+ /* turn on the high pass filter if Rev A */
+ SELIDX(state, AFE2_REG);
+ if (state->cs_revA) {
+ PUTIDX(state, AFE2_HPF, AFE2_VALID_MASK);
+ } else {
+ PUTIDX(state, 0, AFE2_VALID_MASK);
+ }
+
+ /* clear the play and capture interrupt flags */
+ SELIDX(state, AFS_REG);
+ ddi_put8(handle, &CS4231_STATUS, (AFS_RESET_STATUS));
+
+ /* the play and record gains will be set by the audio mixer */
+
+ /* unmute the output */
+ SELIDX(state, LDACO_REG);
+ ANDIDX(state, ~LDACO_LDM, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ ANDIDX(state, ~RDACO_RDM, RDAC0_VALID_MASK);
+
+ /* unmute the mono speaker and mute mono in */
+ SELIDX(state, MIOC_REG);
+ PUTIDX(state, MIOC_MIM, MIOC_VALID_MASK);
+
+ /* clear the mode change bit */
+ SELIDX(state, RDACO_REG);
+
+ /* wait for the Codec before we continue XXX - do we need this? */
+ if (audiocs_poll_ready(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_init_state()
+ *
+ * Description:
+ * This routine initializes the audio driver's state structure and
+ * maps in the registers. This also includes reading the properties.
+ *
+ * CAUTION: This routine maps the registers and initializes a mutex.
+ * Failure cleanup is handled by cs4231_attach(). It is not
+ * handled locally by this routine.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS State structure initialized
+ * DDI_FAILURE State structure not initialized
+ */
+static int
+audiocs_init_state(CS_state_t *state)
+{
+ audio_dev_t *adev = state->cs_adev;
+ dev_info_t *dip = state->cs_dip;
+ char *prop_str;
+ char *pm_comp[] = {
+ "NAME=audiocs audio device",
+ "0=off",
+ "1=on" };
+
+ /* set up the pm-components */
+ if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
+ "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
+ audio_dev_warn(adev, "couldn't create pm-components property");
+ return (DDI_FAILURE);
+ }
+
+ /* figure out which DMA engine hardware we have */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "dma-model", &prop_str) == DDI_PROP_SUCCESS) {
+ if (strcmp(prop_str, "eb2dma") == 0) {
+ state->cs_dma_engine = EB2_DMA;
+ state->cs_dma_ops = &cs4231_eb2dma_ops;
+ } else {
+ state->cs_dma_engine = APC_DMA;
+ state->cs_dma_ops = &cs4231_apcdma_ops;
+ }
+ ddi_prop_free(prop_str);
+ } else {
+ state->cs_dma_engine = APC_DMA;
+ state->cs_dma_ops = &cs4231_apcdma_ops;
+ }
+
+ /* cs_regs, cs_eb2_regs and cs_handles filled in later */
+
+ /* most of what's left is filled in when the registers are mapped */
+
+ audiocs_get_ports(state);
+
+ /* Allocate engines, must be done before register mapping called */
+ if ((audiocs_alloc_engine(state, CS4231_PLAY) != DDI_SUCCESS) ||
+ (audiocs_alloc_engine(state, CS4231_REC) != DDI_SUCCESS)) {
+ return (DDI_FAILURE);
+ }
+
+ /* Map in the registers */
+ if (CS4231_DMA_MAP_REGS(state) == DDI_FAILURE) {
+ return (DDI_FAILURE);
+ }
+
+
+ /* Allocate and add controls, must be done *after* registers mapped */
+ if (audiocs_add_controls(state) != DDI_SUCCESS) {
+ return (DDI_FAILURE);
+ }
+
+ state->cs_suspended = B_FALSE;
+ state->cs_powered = B_FALSE;
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_get_ports()
+ *
+ * Description:
+ * Get which audiocs h/w version we have and use this to
+ * determine the input and output ports as well whether or not
+ * the hardware has internal loopbacks or not. We also have three
+ * different ways for the properties to be specified, which we
+ * also need to worry about.
+ *
+ * Vers Platform(s) DMA eng. audio-module** loopback
+ * a SS-4+/SS-5+ apcdma no no
+ * b Ultra-1&2 apcdma no yes
+ * c positron apcdma no yes
+ * d PPC - retired
+ * e x86 - retired
+ * f tazmo eb2dma Perigee no
+ * g tazmo eb2dma Quark yes
+ * h darwin+ eb2dma no N/A
+ *
+ * Vers model~ aux1* aux2*
+ * a N/A N/A N/A
+ * b N/A N/A N/A
+ * c N/A N/A N/A
+ * d retired
+ * e retired
+ * f SUNW,CS4231f N/A N/A
+ * g SUNW,CS4231g N/A N/A
+ * h SUNW,CS4231h cdrom none
+ *
+ * * = Replaces internal-loopback for latest property type, can be
+ * set to "cdrom", "loopback", or "none".
+ *
+ * ** = For plugin audio modules only. Starting with darwin, this
+ * property is replaces by the model property.
+ *
+ * ~ = Replaces audio-module.
+ *
+ * + = Has the capability of having a cable run from the internal
+ * CD-ROM to the audio device.
+ *
+ * N/A = Not applicable, the property wasn't created for early
+ * platforms, or the property has been retired.
+ *
+ * NOTE: Older tazmo and quark machines don't have the model property.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_get_ports(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+ audio_dev_t *adev = state->cs_adev;
+ char *prop_str;
+
+ /* First we set the common ports, etc. */
+ state->cs_omask = state->cs_omod =
+ (1U << OUTPUT_SPEAKER) |
+ (1U << OUTPUT_HEADPHONES) |
+ (1U << OUTPUT_LINEOUT);
+ state->cs_imask =
+ (1U << INPUT_MIC) |
+ (1U << INPUT_LINEIN) |
+ (1U << INPUT_STEREOMIX);
+
+ /* now we try the new "model" property */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
+ "model", &prop_str) == DDI_PROP_SUCCESS) {
+ if (strcmp(prop_str, "SUNW,CS4231h") == 0) {
+ /* darwin */
+ audio_dev_set_version(adev, CS_DEV_VERSION_H);
+ state->cs_imask |= (1U << INPUT_CD);
+ state->cs_omod = (1U << OUTPUT_SPEAKER);
+ } else if (strcmp(prop_str, "SUNW,CS4231g") == 0) {
+ /* quark audio module */
+ audio_dev_set_version(adev, CS_DEV_VERSION_G);
+ /*
+ * NB: This could do SUNVTS LOOPBACK, but we
+ * don't support it for now... owing to no
+ * support in framework.
+ */
+ } else if (strcmp(prop_str, "SUNW,CS4231f") == 0) {
+ /* tazmo */
+ audio_dev_set_version(adev, CS_DEV_VERSION_F);
+ } else {
+ audio_dev_set_version(adev, prop_str);
+ audio_dev_warn(adev,
+ "unknown audio model: %s, some parts of "
+ "audio may not work correctly", prop_str);
+ }
+ ddi_prop_free(prop_str); /* done with the property */
+ } else { /* now try the older "audio-module" property */
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "audio-module", &prop_str) ==
+ DDI_PROP_SUCCESS) {
+ switch (*prop_str) {
+ case 'Q': /* quark audio module */
+ audio_dev_set_version(adev, CS_DEV_VERSION_G);
+ /* See quark comment above about SunVTS */
+ break;
+ case 'P': /* tazmo */
+ audio_dev_set_version(adev, CS_DEV_VERSION_F);
+ break;
+ default:
+ audio_dev_set_version(adev, prop_str);
+ audio_dev_warn(adev,
+ "unknown audio module: %s, some "
+ "parts of audio may not work correctly",
+ prop_str);
+ break;
+ }
+ ddi_prop_free(prop_str); /* done with the prop */
+ } else { /* now try heuristics, ;-( */
+ if (ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, "internal-loopback", B_FALSE)) {
+ if (state->cs_dma_engine == EB2_DMA) {
+ audio_dev_set_version(adev,
+ CS_DEV_VERSION_C);
+ } else {
+ audio_dev_set_version(adev,
+ CS_DEV_VERSION_B);
+ }
+ /*
+ * Again, we don't support SunVTS for these
+ * boards, although we potentially could.
+ */
+ } else {
+ audio_dev_set_version(adev, CS_DEV_VERSION_A);
+ state->cs_imask |= (1U << INPUT_CD);
+ }
+ }
+ }
+}
+
+/*
+ * audiocs_power_up()
+ *
+ * Description:
+ * Power up the Codec and restore the codec's registers.
+ *
+ * NOTE: We don't worry about locking since the only routines
+ * that may call us are attach() and power() Both of
+ * which should be the only threads in the driver.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_power_up(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ int i;
+
+ /* turn on the Codec */
+ CS4231_DMA_POWER(state, CS4231_PWR_ON);
+
+ /* reset the DMA engine(s) */
+ CS4231_DMA_RESET(state);
+
+ /*
+ * Reload the Codec's registers, the DMA engines will be
+ * taken care of when play and record start up again. But
+ * first enable registers 16 -> 31.
+ */
+ SELIDX(state, MID_REG);
+ PUTIDX(state, state->cs_save[MID_REG], MID_VALID_MASK);
+
+ for (i = 0; i < CS4231_REGS; i++) {
+ /* restore Codec registers */
+ SELIDX(state, (i | IAR_MCE));
+ ddi_put8(handle, &CS4231_IDR, state->cs_save[i]);
+ drv_usecwait(500); /* chip bug */
+ }
+ /* clear MCE bit */
+ SELIDX(state, 0);
+}
+
+/*
+ * audiocs_power_down()
+ *
+ * Description:
+ * Power down the Codec and save the codec's registers.
+ *
+ * NOTE: See the note in cs4231_power_up() about locking.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_power_down(CS_state_t *state)
+{
+ ddi_acc_handle_t handle;
+ int i;
+
+ handle = state->cs_handles.cs_codec_hndl;
+
+ /*
+ * We are powering down, so we don't need to do a thing with
+ * the DMA engines. However, we do need to save the Codec
+ * registers.
+ */
+
+ for (i = 0; i < CS4231_REGS; i++) {
+ /* save Codec regs */
+ SELIDX(state, i);
+ state->cs_save[i] = ddi_get8(handle, &CS4231_IDR);
+ }
+
+ /* turn off the Codec */
+ CS4231_DMA_POWER(state, CS4231_PWR_OFF);
+
+} /* cs4231_power_down() */
+
+/*
+ * audiocs_configure_input()
+ *
+ * Description:
+ * Configure input properties of the mixer (e.g. igain, ports).
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_configure_input(CS_state_t *state)
+{
+ uint8_t l, r;
+ uint64_t inputs;
+ uint64_t micboost;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (state->cs_suspended)
+ return;
+
+ inputs = state->cs_inputs->cc_val;
+ micboost = state->cs_micboost->cc_val;
+ r = (state->cs_igain->cc_val & 0xff);
+ l = ((state->cs_igain->cc_val & 0xff00) >> 8);
+
+ /* rescale these for our atten array */
+ l = (((uint32_t)l * 255) / 100) & 0xff;
+ r = (((uint32_t)r * 255) / 100) & 0xff;
+
+ /* we downshift by 4 bits -- igain only has 16 possible values */
+ /* NB: that we do not scale here! The SADA driver didn't do so. */
+ l = l >> 4;
+ r = r >> 4;
+
+ if (inputs & (1U << INPUT_MIC)) {
+ l |= LADCI_LMIC;
+ r |= RADCI_RMIC;
+ }
+ if (inputs & (1U << INPUT_LINEIN)) {
+ l |= LADCI_LLINE;
+ r |= RADCI_RLINE;
+ }
+ if (inputs & (1U << INPUT_CD)) {
+ /* note that SunVTS also uses this */
+ l |= LADCI_LAUX1;
+ r |= RADCI_RAUX1;
+ }
+ if (inputs & (1U << INPUT_STEREOMIX)) {
+ l |= LADCI_LLOOP;
+ r |= RADCI_RLOOP;
+ }
+ if (micboost) {
+ l |= LADCI_LMGE;
+ r |= RADCI_RMGE;
+ }
+
+ SELIDX(state, LADCI_REG);
+ PUTIDX(state, l, LADCI_VALID_MASK);
+
+ SELIDX(state, RADCI_REG);
+ PUTIDX(state, r, RADCI_VALID_MASK);
+}
+
+/*
+ * audiocs_configure_output()
+ *
+ * Description:
+ * Configure output properties of the mixer (e.g. ogain, mgain).
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ */
+static void
+audiocs_configure_output(CS_state_t *state)
+{
+ uint64_t outputs;
+ uint8_t l, r;
+ uint8_t rmute, lmute;
+ uint8_t mgain;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ rmute = lmute = 0;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (state->cs_suspended)
+ return;
+
+ outputs = state->cs_outputs->cc_val;
+
+ /* port selection */
+ SELIDX(state, MIOC_REG);
+ if (outputs & (1U << OUTPUT_SPEAKER)) {
+ ANDIDX(state, ~MIOC_MONO_SPKR_MUTE, MIOC_VALID_MASK);
+ } else {
+ ORIDX(state, MIOC_MONO_SPKR_MUTE, MIOC_VALID_MASK);
+ }
+ SELIDX(state, PC_REG);
+ if (outputs & (1U << OUTPUT_HEADPHONES)) {
+ ANDIDX(state, ~PC_HEADPHONE_MUTE, PC_VALID_MASK);
+ } else {
+ ORIDX(state, PC_HEADPHONE_MUTE, PC_VALID_MASK);
+ }
+ SELIDX(state, PC_REG);
+ if (outputs & (1U << OUTPUT_LINEOUT)) {
+ ANDIDX(state, ~PC_LINE_OUT_MUTE, PC_VALID_MASK);
+ } else {
+ ORIDX(state, PC_LINE_OUT_MUTE, PC_VALID_MASK);
+ }
+
+ /* monitor gain */
+ mgain = cs4231_atten[((state->cs_mgain->cc_val * 255) / 100) & 0xff];
+ SELIDX(state, LC_REG);
+ if (mgain == 0) {
+ /* disable loopbacks when gain == 0 */
+ PUTIDX(state, LC_OFF, LC_VALID_MASK);
+ } else {
+ /* we use cs4231_atten[] to linearize attenuation */
+ PUTIDX(state, (mgain << 2) | LC_LBE, LC_VALID_MASK);
+ }
+
+ /* output gain */
+ l = ((state->cs_ogain->cc_val >> 8) & 0xff);
+ r = (state->cs_ogain->cc_val & 0xff);
+ if (l == 0) {
+ lmute = LDACO_LDM;
+ }
+ if (r == 0) {
+ rmute = RDACO_RDM;
+ }
+
+ /* rescale these for our atten array */
+ l = cs4231_atten[(((uint32_t)l * 255) / 100) & 0xff] | lmute;
+ r = cs4231_atten[(((uint32_t)r * 255) / 100) & 0xff] | rmute;
+
+ SELIDX(state, LDACO_REG);
+ PUTIDX(state, l, LDAC0_VALID_MASK);
+ SELIDX(state, RDACO_REG);
+ PUTIDX(state, r, RDAC0_VALID_MASK);
+}
+
+/*
+ * audiocs_get_value()
+ *
+ * Description:
+ * Get a control value
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t *valp Pointer to store value.
+ *
+ * Returns:
+ * 0 The Codec parameter has been retrieved.
+ */
+static int
+audiocs_get_value(void *arg, uint64_t *valp)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ mutex_enter(&state->cs_lock);
+ *valp = cc->cc_val;
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+
+/*
+ * audiocs_set_ogain()
+ *
+ * Description:
+ * Set the play gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (both left and right)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_ogain(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~0xffff) ||
+ ((val & 0xff) > 100) ||
+ (((val & 0xff00) >> 8) > 100))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_set_micboost()
+ *
+ * Description:
+ * Set the 20 dB microphone boost.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The 1 to enable, 0 to disable.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_micboost(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val ? B_TRUE : B_FALSE;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_set_igain()
+ *
+ * Description:
+ * Set the record gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (both left and right)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_igain(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~0xffff) ||
+ ((val & 0xff) > 100) ||
+ (((val & 0xff00) >> 8) > 100))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_inputs()
+ *
+ * Description:
+ * Set the input ports.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The mask of output ports.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_inputs(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if (val & ~(state->cs_imask))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_input(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_outputs()
+ *
+ * Description:
+ * Set the output ports.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The mask of input ports.
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_outputs(void *arg, uint64_t val)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if ((val & ~(state->cs_omod)) !=
+ (state->cs_omask & ~state->cs_omod))
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = val;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_set_mgain()
+ *
+ * Description:
+ * Set the monitor gain.
+ *
+ * Arguments:
+ * void *arg The device's state structure
+ * uint64_t val The gain to set (monoaural).)
+ *
+ * Returns:
+ * 0 The Codec parameter has been set
+ */
+static int
+audiocs_set_mgain(void *arg, uint64_t gain)
+{
+ CS_ctrl_t *cc = arg;
+ CS_state_t *state = cc->cc_state;
+
+ if (gain > 100)
+ return (EINVAL);
+
+ mutex_enter(&state->cs_lock);
+ cc->cc_val = gain;
+ audiocs_configure_output(state);
+ mutex_exit(&state->cs_lock);
+
+ return (0);
+}
+
+/*
+ * audiocs_open()
+ *
+ * Description:
+ * Opens a DMA engine for use.
+ *
+ * Arguments:
+ * void *arg The DMA engine to set up
+ * int flag Open flags
+ * unsigned *fragfrp Receives number of frames per fragment
+ * unsigned *nfragsp Receives number of fragments
+ * caddr_t *bufp Receives kernel data buffer
+ *
+ * Returns:
+ * 0 on success
+ * errno on failure
+ */
+static int
+audiocs_open(void *arg, int flag,
+ unsigned *fragfrp, unsigned *nfragsp, caddr_t *bufp)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ dev_info_t *dip = state->cs_dip;
+
+ _NOTE(ARGUNUSED(flag));
+
+ (void) pm_busy_component(dip, CS4231_COMPONENT);
+ if (pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON) ==
+ DDI_FAILURE) {
+
+ /* match the busy call above */
+ (void) pm_idle_component(dip, CS4231_COMPONENT);
+
+ audio_dev_warn(state->cs_adev, "power up failed");
+ }
+
+ eng->ce_started = B_FALSE;
+ eng->ce_count = 0;
+
+ *fragfrp = eng->ce_fragfr;
+ *nfragsp = CS4231_NFRAGS;
+ *bufp = eng->ce_kaddr;
+
+ mutex_enter(&state->cs_lock);
+ audiocs_reset_engine(eng);
+ mutex_exit(&state->cs_lock);
+ return (0);
+}
+
+/*
+ * audiocs_close()
+ *
+ * Description:
+ * Closes an audio DMA engine that was previously opened. Since
+ * nobody is using it, we take this opportunity to possibly power
+ * down the entire device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to shut down
+ */
+static void
+audiocs_close(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+
+ mutex_enter(&state->cs_lock);
+ audiocs_stop_engine(eng);
+ eng->ce_started = B_FALSE;
+ mutex_exit(&state->cs_lock);
+
+ (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
+}
+
+/*
+ * audiocs_stop()
+ *
+ * Description:
+ * This is called by the framework to stop an engine that is
+ * transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to stop
+ */
+static void
+audiocs_stop(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+
+ mutex_enter(&state->cs_lock);
+ if (eng->ce_started) {
+ audiocs_stop_engine(eng);
+ eng->ce_started = B_FALSE;
+ }
+ mutex_exit(&state->cs_lock);
+}
+
+/*
+ * audiocs_start()
+ *
+ * Description:
+ * This is called by the framework to start an engine transferring data.
+ *
+ * Arguments:
+ * void *arg The DMA engine to start
+ *
+ * Returns:
+ * 0 on success, an errno otherwise
+ */
+static int
+audiocs_start(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ int rv = 0;
+
+ mutex_enter(&state->cs_lock);
+ if (!eng->ce_started) {
+ if (audiocs_start_engine(eng) == DDI_SUCCESS) {
+ eng->ce_started = B_TRUE;
+ } else {
+ rv = EIO;
+ }
+ }
+ mutex_exit(&state->cs_lock);
+ return (rv);
+}
+
+/*
+ * audiocs_format()
+ *
+ * Description:
+ * Called by the framework to query the format of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * AUDIO_FORMAT_S16_NE
+ */
+static int
+audiocs_format(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (AUDIO_FORMAT_S16_NE);
+}
+
+/*
+ * audiocs_channels()
+ *
+ * Description:
+ * Called by the framework to query the channels of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 2 (stereo)
+ */
+static int
+audiocs_channels(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (2);
+}
+
+/*
+ * audiocs_rates()
+ *
+ * Description:
+ * Called by the framework to query the sample rate of the device.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * 48000
+ */
+static int
+audiocs_rate(void *arg)
+{
+ _NOTE(ARGUNUSED(arg));
+
+ return (48000);
+}
+
+/*
+ * audiocs_count()
+ *
+ * Description:
+ * This is called by the framework to get the engine's frame counter
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * frame count for current engine
+ */
+static uint64_t
+audiocs_count(void *arg)
+{
+ CS_engine_t *eng = arg;
+ CS_state_t *state = eng->ce_state;
+ uint64_t val;
+
+ mutex_enter(&state->cs_lock);
+ val = eng->ce_count;
+ mutex_exit(&state->cs_lock);
+
+ return (val);
+}
+
+/*
+ * audiocs_sync()
+ *
+ * Description:
+ * This is called by the framework to synchronize DMA caches.
+ *
+ * Arguments:
+ * void *arg The DMA engine to sync
+ */
+static void
+audiocs_sync(void *arg, unsigned nframes)
+{
+ CS_engine_t *eng = arg;
+ _NOTE(ARGUNUSED(nframes));
+
+ (void) ddi_dma_sync(eng->ce_dmah, 0, 0, eng->ce_syncdir);
+}
+
+/*
+ * audiocs_qlen()
+ *
+ * Description:
+ * This is called by the framework to determine on-device queue length.
+ *
+ * Arguments:
+ * void *arg The DMA engine to query
+ *
+ * Returns:
+ * hardware queue length not reported by count (0 for this device)
+ */
+static size_t
+audiocs_qlen(void *arg)
+{
+ CS_engine_t *eng = arg;
+
+ return (eng->ce_fragfr);
+}
+
+
+/*
+ * audiocs_reset_engine()
+ *
+ * Description:
+ * This routine resets the DMA engine pareparing it for work.
+ *
+ * Arguments:
+ * CS_engine_t *engine DMA engine to stop.
+ */
+void
+audiocs_reset_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ uint8_t mask;
+ uint8_t value;
+ uint8_t reg;
+
+ if (eng->ce_num == CS4231_PLAY) {
+ /* sample rate only set on play side */
+ value = FS_48000 | PDF_STEREO | PDF_LINEAR16NE;
+ reg = FSDF_REG;
+ mask = FSDF_VALID_MASK;
+ } else {
+ value = CDF_STEREO | CDF_LINEAR16NE;
+ reg = CDF_REG;
+ mask = CDF_VALID_MASK;
+ }
+
+ SELIDX(state, reg | IAR_MCE);
+ PUTIDX(state, value, mask);
+
+ (void) audiocs_poll_ready(state);
+
+ /* clear the mode change bit */
+ SELIDX(state, reg);
+}
+
+/*
+ * audiocs_alloc_engine()
+ *
+ * Description:
+ * Allocates the DMA handles and the memory for the DMA engine.
+ *
+ * Arguments:
+ * CS_state_t *dip Pointer to the device's soft state
+ * int num Engine number, CS4231_PLAY or CS4231_REC.
+ *
+ * Returns:
+ * DDI_SUCCESS Engine initialized.
+ * DDI_FAILURE Engine not initialized.
+ */
+int
+audiocs_alloc_engine(CS_state_t *state, int num)
+{
+ char *prop;
+ unsigned caps;
+ int dir;
+ int rc;
+ audio_dev_t *adev;
+ dev_info_t *dip;
+ CS_engine_t *eng;
+ uint_t ccnt;
+ ddi_dma_cookie_t dmac;
+
+ static ddi_device_acc_attr_t buf_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_NEVERSWAP_ACC,
+ DDI_STRICTORDER_ACC
+ };
+
+ adev = state->cs_adev;
+ dip = state->cs_dip;
+
+ eng = kmem_zalloc(sizeof (*eng), KM_SLEEP);
+ eng->ce_state = state;
+ eng->ce_started = B_FALSE;
+ eng->ce_num = num;
+
+ switch (num) {
+ case CS4231_REC:
+ prop = "record-interrupts";
+ dir = DDI_DMA_READ;
+ caps = ENGINE_INPUT_CAP;
+ eng->ce_syncdir = DDI_DMA_SYNC_FORKERNEL;
+ eng->ce_codec_en = INTC_CEN;
+ break;
+ case CS4231_PLAY:
+ prop = "play-interrupts";
+ dir = DDI_DMA_WRITE;
+ caps = ENGINE_OUTPUT_CAP;
+ eng->ce_syncdir = DDI_DMA_SYNC_FORDEV;
+ eng->ce_codec_en = INTC_PEN;
+ break;
+ default:
+ kmem_free(eng, sizeof (*eng));
+ audio_dev_warn(adev, "bad engine number (%d)!", num);
+ return (DDI_FAILURE);
+ }
+ state->cs_engines[num] = eng;
+
+ eng->ce_intrs = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
+ DDI_PROP_DONTPASS, prop, CS4231_INTS);
+
+ /* make sure the values are good */
+ if (eng->ce_intrs < CS4231_MIN_INTS) {
+ audio_dev_warn(adev, "%s too low, %d, resetting to %d",
+ prop, eng->ce_intrs, CS4231_INTS);
+ eng->ce_intrs = CS4231_INTS;
+ } else if (eng->ce_intrs > CS4231_MAX_INTS) {
+ audio_dev_warn(adev, "%s too high, %d, resetting to %d",
+ prop, eng->ce_intrs, CS4231_INTS);
+ eng->ce_intrs = CS4231_INTS;
+ }
+
+ /*
+ * Figure out how much space we need. Sample rate is 48kHz, and
+ * we need to store 8 chunks. (Note that this means that low
+ * interrupt frequencies will require more RAM. We could probably
+ * do some cleverness to use a more dynamic list.)
+ */
+ eng->ce_fragfr = 48000 / eng->ce_intrs;
+ eng->ce_fragfr &= ~(64 - 1); /* align @ 64B boundaries */
+ eng->ce_fragfr = max(eng->ce_fragfr, 64);
+ eng->ce_fragsz = eng->ce_fragfr * 4; /* each frame is 4 bytes */
+ eng->ce_size = eng->ce_fragsz * CS4231_NFRAGS;
+
+ /* allocate dma handle */
+ rc = ddi_dma_alloc_handle(dip, CS4231_DMA_ATTR(state), DDI_DMA_SLEEP,
+ NULL, &eng->ce_dmah);
+ if (rc != DDI_SUCCESS) {
+ audio_dev_warn(adev, "ddi_dma_alloc_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+ /* allocate DMA buffer */
+ rc = ddi_dma_mem_alloc(eng->ce_dmah, eng->ce_size, &buf_attr,
+ DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &eng->ce_kaddr,
+ &eng->ce_size, &eng->ce_acch);
+ if (rc == DDI_FAILURE) {
+ audio_dev_warn(adev, "dma_mem_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ /* bind DMA buffer */
+ rc = ddi_dma_addr_bind_handle(eng->ce_dmah, NULL,
+ eng->ce_kaddr, eng->ce_size, dir | DDI_DMA_CONSISTENT,
+ DDI_DMA_SLEEP, NULL, &dmac, &ccnt);
+ if ((rc != DDI_DMA_MAPPED) || (ccnt != 1)) {
+ audio_dev_warn(adev,
+ "ddi_dma_addr_bind_handle failed: %d", rc);
+ return (DDI_FAILURE);
+ }
+
+ /* save off phys addresses for each frag */
+ for (int i = 0; i < CS4231_NFRAGS; i++) {
+ eng->ce_paddr[i] = dmac.dmac_address;
+ dmac.dmac_address += eng->ce_fragsz;
+ }
+
+ eng->ce_engine = audio_engine_alloc(&audiocs_engine_ops, caps);
+ if (eng->ce_engine == NULL) {
+ audio_dev_warn(adev, "audio_engine_alloc failed");
+ return (DDI_FAILURE);
+ }
+
+ audio_engine_set_private(eng->ce_engine, eng);
+ audio_dev_add_engine(adev, eng->ce_engine);
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_free_engine()
+ *
+ * Description:
+ * This routine fress the engine and all associated resources.
+ *
+ * Arguments:
+ * CS_engine_t *eng Engine to free.
+ */
+void
+audiocs_free_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ audio_dev_t *adev = state->cs_adev;
+
+ if (eng == NULL)
+ return;
+ if (eng->ce_engine) {
+ audio_dev_remove_engine(adev, eng->ce_engine);
+ audio_engine_free(eng->ce_engine);
+ }
+ if (eng->ce_paddr[0]) {
+ (void) ddi_dma_unbind_handle(eng->ce_dmah);
+ }
+ if (eng->ce_acch) {
+ ddi_dma_mem_free(&eng->ce_acch);
+ }
+ if (eng->ce_dmah) {
+ ddi_dma_free_handle(&eng->ce_dmah);
+ }
+ kmem_free(eng, sizeof (*eng));
+}
+
+/*
+ * audiocs_start_port()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * Arguments:
+ * CS_engine_t *eng Port of DMA engine to start.
+ *
+ * Returns:
+ * DDI_SUCCESS DMA engine started.
+ * DDI_FAILURE DMA engine not started.
+ */
+int
+audiocs_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /*
+ * If we are suspended, we can't touch hardware.
+ */
+ if (state->cs_suspended)
+ return (DDI_SUCCESS);
+
+ /*
+ * Start the DMA engine.
+ */
+ if (CS4231_DMA_START(state, eng) != DDI_SUCCESS)
+ return (DDI_FAILURE);
+
+ /*
+ * Start the codec.
+ */
+ SELIDX(state, INTC_REG);
+ ORIDX(state, eng->ce_codec_en, INTC_VALID_MASK);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * audiocs_stop_engine()
+ *
+ * Description:
+ * This routine stop the DMA engine.
+ *
+ * Arguments:
+ * CS_engine_t *eng DMA engine to stop.
+ */
+void
+audiocs_stop_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /*
+ * If we are suspended, we can't touch hardware.
+ */
+ if (state->cs_suspended)
+ return;
+
+ /*
+ * Stop the DMA engine.
+ */
+ CS4231_DMA_STOP(state, eng);
+
+ /*
+ * Stop the codec.
+ */
+ SELIDX(state, INTC_REG);
+ ANDIDX(state, ~(eng->ce_codec_en), INTC_VALID_MASK);
+}
+
+/*
+ * audiocs_poll_ready()
+ *
+ * Description:
+ * This routine waits for the Codec to complete its initialization
+ * sequence and is done with its autocalibration.
+ *
+ * Early versions of the Codec have a bug that can take as long as
+ * 15 seconds to complete its initialization. For these cases we
+ * use a timeout mechanism so we don't keep the machine locked up.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The Codec is ready to continue
+ * DDI_FAILURE The Codec isn't ready to continue
+ */
+int
+audiocs_poll_ready(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ int x = 0;
+ uint8_t iar;
+ uint8_t idr;
+
+ ASSERT(state->cs_regs != NULL);
+ ASSERT(handle != NULL);
+
+ /* wait for the chip to initialize itself */
+ iar = ddi_get8(handle, &CS4231_IAR);
+
+ while ((iar & IAR_INIT) && x++ < CS4231_TIMEOUT) {
+ drv_usecwait(50);
+ iar = ddi_get8(handle, &CS4231_IAR);
+ }
+
+ if (x >= CS4231_TIMEOUT) {
+ return (DDI_FAILURE);
+ }
+
+ x = 0;
+
+ /*
+ * Now wait for the chip to complete its autocalibration.
+ * Set the test register.
+ */
+ SELIDX(state, ESI_REG);
+
+ idr = ddi_get8(handle, &CS4231_IDR);
+
+ while ((idr & ESI_ACI) && x++ < CS4231_TIMEOUT) {
+ drv_usecwait(50);
+ idr = ddi_get8(handle, &CS4231_IDR);
+ }
+
+ if (x >= CS4231_TIMEOUT) {
+ return (DDI_FAILURE);
+ }
+
+
+ return (DDI_SUCCESS);
+
+}
+
+/*
+ * audiocs_sel_index()
+ *
+ * Description:
+ * Select a cs4231 register. The cs4231 has a hardware bug where a
+ * register is not always selected the first time. We try and try
+ * again until the proper register is selected or we time out and
+ * print an error message.
+ *
+ * Arguments:
+ * audiohdl_t ahandle Handle to this device
+ * ddi_acc_handle_t handle A handle to the device's registers
+ * uint8_t addr The register address to program
+ * int reg The register to select
+ *
+ * Returns:
+ * void
+ */
+void
+#ifdef DEBUG
+audiocs_sel_index(CS_state_t *state, uint8_t reg, int n)
+#else
+audiocs_sel_index(CS_state_t *state, uint8_t reg)
+#endif
+{
+ int x;
+ uint8_t T;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ uint8_t *addr = &CS4231_IAR;
+
+ for (x = 0; x < CS4231_RETRIES; x++) {
+ ddi_put8(handle, addr, reg);
+ T = ddi_get8(handle, addr);
+ if (T == reg) {
+ break;
+ }
+ drv_usecwait(1000);
+ }
+
+ if (x == CS4231_RETRIES) {
+ audio_dev_warn(state->cs_adev,
+#ifdef DEBUG
+ "line %d: Couldn't select index (0x%02x 0x%02x)", n,
+#else
+ "Couldn't select index (0x%02x 0x%02x)",
+#endif
+ T, reg);
+ audio_dev_warn(state->cs_adev,
+ "audio may not work correctly until it is stopped and "
+ "restarted");
+ }
+}
+
+/*
+ * audiocs_put_index()
+ *
+ * Description:
+ * Program a cs4231 register. The cs4231 has a hardware bug where a
+ * register is not programmed properly the first time. We program a value,
+ * then immediately read back the value and reprogram if nescessary.
+ * We do this until the register is properly programmed or we time out and
+ * print an error message.
+ *
+ * Arguments:
+ * CS_state_t state Handle to this device
+ * uint8_t mask Mask to not set reserved register bits
+ * int val The value to program
+ *
+ * Returns:
+ * void
+ */
+void
+#ifdef DEBUG
+audiocs_put_index(CS_state_t *state, uint8_t val, uint8_t mask, int n)
+#else
+audiocs_put_index(CS_state_t *state, uint8_t val, uint8_t mask)
+#endif
+{
+ int x;
+ uint8_t T;
+ ddi_acc_handle_t handle = CODEC_HANDLE;
+ uint8_t *addr = &CS4231_IDR;
+
+ val &= mask;
+
+ for (x = 0; x < CS4231_RETRIES; x++) {
+ ddi_put8(handle, addr, val);
+ T = ddi_get8(handle, addr);
+ if (T == val) {
+ break;
+ }
+ drv_usecwait(1000);
+ }
+
+ if (x == CS4231_RETRIES) {
+#ifdef DEBUG
+ audio_dev_warn(state->cs_adev,
+ "line %d: Couldn't set value (0x%02x 0x%02x)", n, T, val);
+#else
+ audio_dev_warn(state->cs_adev,
+ "Couldn't set value (0x%02x 0x%02x)", T, val);
+#endif
+ audio_dev_warn(state->cs_adev,
+ "audio may not work correctly until it is stopped and "
+ "restarted");
+ }
+}
diff --git a/usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h
index db378f458d..3f5cbe1135 100644
--- a/usr/src/uts/sun/sys/audio/impl/audio_4231_impl.h
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231.h
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,32 +19,65 @@
* CDDL HEADER END
*/
/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#ifndef _SYS_AUDIO4231_IMPL_H
-#define _SYS_AUDIO4231_IMPL_H
+#ifndef _AUDIO_4231_H
+#define _AUDIO_4231_H
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
+#ifdef __cplusplus
extern "C" {
#endif
/*
- * Implementation specific header file for the audiocs device driver.
+ * Header file for the audiocs device driver.
*/
-#ifdef _KERNEL
+/*
+ * Values returned by the AUDIO_GETDEV ioctl()
+ */
+#define CS_DEV_NAME "SUNW,CS4231"
+#define CS_DEV_CONFIG_ONBRD1 "onboard1"
+#define CS_DEV_VERSION "a" /* SS5 */
+#define CS_DEV_VERSION_A CS_DEV_VERSION
+#define CS_DEV_VERSION_B "b" /* Electron - internal loopback */
+#define CS_DEV_VERSION_C "c" /* Positron */
+#define CS_DEV_VERSION_D "d" /* PowerPC - Retired */
+#define CS_DEV_VERSION_E "e" /* x86 - Retired */
+#define CS_DEV_VERSION_F "f" /* Tazmo */
+#define CS_DEV_VERSION_G "g" /* Quark Audio Module */
+#define CS_DEV_VERSION_H "h" /* Darwin */
/*
- * Global routines.
+ * Driver supported configuration information
*/
-void cs4231_reg_select(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *,
- uint8_t, int, char *);
-void cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *, uint8_t,
- uint8_t, int, char *);
+#define CS4231_NAME "audiocs"
+#define CS4231_MOD_NAME "CS4231 audio driver"
+
+#define CS4231_INTS (175) /* default interrupt rate */
+#define CS4231_MIN_INTS (10) /* minimum interrupt rate */
+#define CS4231_MAX_INTS (2000) /* maximum interrupt rate */
+
+/*
+ * Implementation specific header file for the audiocs device driver.
+ */
+
+#ifdef _KERNEL
+
+enum {
+ CTL_VOLUME = 0,
+ CTL_IGAIN,
+ CTL_MGAIN,
+ CTL_INPUTS,
+ CTL_OUTPUTS,
+ CTL_MICBOOST,
+ CTL_NUM
+};
+
+typedef struct CS_engine CS_engine_t;
+typedef struct CS_ctrl CS_ctrl_t;
+typedef struct CS_state CS_state_t;
/*
* These are the registers for the APC DMA channel interface to the
@@ -56,7 +88,7 @@ void cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t, uint8_t *, uint8_t,
struct cs4231_apc {
uint32_t dmacsr; /* APC CSR */
uint32_t lpad[3]; /* PAD */
- uint32_t dmacva; /* Captue Virtual Address */
+ uint32_t dmacva; /* Capture Virtual Address */
uint32_t dmacc; /* Capture Count */
uint32_t dmacnva; /* Capture Next VAddress */
uint32_t dmacnc; /* Capture next count */
@@ -67,7 +99,6 @@ struct cs4231_apc {
};
typedef struct cs4231_apc cs4231_apc_t;
-#define APC_HANDLE state->cs_handles.cs_codec_hndl
#define APC_DMACSR state->cs_regs->apc.dmacsr
#define APC_DMACVA state->cs_regs->apc.dmacva
#define APC_DMACC state->cs_regs->apc.dmacc
@@ -140,10 +171,6 @@ struct cs4231_eb2regs {
};
typedef struct cs4231_eb2regs cs4231_eb2regs_t;
-#define EB2_CODEC_HNDL state->cs_handles.cs_codec_hndl
-#define EB2_PLAY_HNDL state->cs_handles.cs_eb2_play_hndl
-#define EB2_REC_HNDL state->cs_handles.cs_eb2_rec_hndl
-#define EB2_AUXIO_HNDL state->cs_handles.cs_eb2_auxio_hndl
#define EB2_PLAY_CSR state->cs_eb2_regs.play->eb2csr
#define EB2_PLAY_ACR state->cs_eb2_regs.play->eb2acr
#define EB2_PLAY_BCR state->cs_eb2_regs.play->eb2bcr
@@ -189,16 +216,13 @@ typedef struct cs4231_eb2regs cs4231_eb2regs_t;
#define EB2_DEV_ID 0xf0000000u /* Device ID -0x0C, R/O */
#define EB2_ID_VALUE 0xC0000000u /* ID read from CSR */
-#define EB2_PCLEAR_RESET_VALUE (EB2_READ|EB2_EN_NEXT)
-#define EB2_RCLEAR_RESET_VALUE (EB2_WRITE|EB2_EN_NEXT)
+#define EB2_PCLEAR_RESET_VALUE (EB2_READ|EB2_EN_NEXT|EB2_EN_CNT)
+#define EB2_RCLEAR_RESET_VALUE (EB2_WRITE|EB2_EN_NEXT|EB2_EN_CNT)
-#define EB2_PINTR_MASK (EB2_INT_EN)
-#define EB2_RINTR_MASK (EB2_INT_EN)
-
-#define EB2_PLAY_ENABLE (EB2_PINTR_MASK|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
+#define EB2_PLAY_ENABLE (EB2_INT_EN|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
EB2_PCLEAR_RESET_VALUE)
-#define EB2_REC_ENABLE (EB2_RINTR_MASK|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
+#define EB2_REC_ENABLE (EB2_INT_EN|EB2_EN_DMA|EB2_EN_CNT|EB2_64|\
EB2_RCLEAR_RESET_VALUE)
#define EB2_FIFO_DRAIN (EB2_DRAIN|EB2_CYC_PENDING)
@@ -206,22 +230,16 @@ typedef struct cs4231_eb2regs cs4231_eb2regs_t;
/*
* Misc. defines
*/
-#define CS4231_IDNUM (0x6175)
-#define CS4231_MINPACKET (0)
-#define CS4231_MAXPACKET (1*1024)
-#define CS4231_HIWATER (AM_MAX_QUEUED_MSGS_SIZE)
-#define CS4231_LOWATER (AM_MIN_QUEUED_MSGS_SIZE)
-#define CS4231_MAX_CHANNELS (200) /* force max # chs */
#define CS4231_REGS (32)
#define CS4231_NCOMPONENTS (1)
#define CS4231_COMPONENT (0)
#define CS4231_PWR_OFF (0)
#define CS4231_PWR_ON (1)
#define CS4231_TIMEOUT (100000)
-#define CS4231_NOT_SUSPENDED (0)
-#define CS4231_SUSPENDED (~CS4231_NOT_SUSPENDED)
-#define CS4231_BSIZE (8*1024)
#define CS4231_300MS (300*1000)
+#define CS4231_PLAY 0
+#define CS4231_REC 1
+#define CS4231_NFRAGS 8
/*
* Supported dma engines and the ops vector
@@ -244,6 +262,7 @@ struct cs4231_pioregs {
};
typedef struct cs4231_pioregs cs4231_pioregs_t;
+
struct cs4231_eb2 {
cs4231_eb2regs_t *play; /* play EB2 registers */
cs4231_eb2regs_t *record; /* record EB2 registers */
@@ -265,9 +284,6 @@ typedef struct cs4231_regs cs4231_regs_t;
/*
* Misc. state enumerations and structures
*/
-enum cs_cd {NO_INTERNAL_CD, INTERNAL_CD_ON_AUX1, INTERNAL_CD_ON_AUX2};
-typedef enum cs_cd cs_cd_e;
-
struct cs4231_handle {
ddi_acc_handle_t cs_codec_hndl; /* CODEC handle, APC & EB2 */
ddi_acc_handle_t cs_eb2_play_hndl; /* EB2 only, play handle */
@@ -275,6 +291,48 @@ struct cs4231_handle {
ddi_acc_handle_t cs_eb2_auxio_hndl; /* EB2 only, auxio handle */
};
typedef struct cs4231_handle cs4231_handle_t;
+#define CODEC_HANDLE state->cs_handles.cs_codec_hndl
+#define APC_HANDLE state->cs_handles.cs_codec_hndl
+#define EB2_PLAY_HNDL state->cs_handles.cs_eb2_play_hndl
+#define EB2_REC_HNDL state->cs_handles.cs_eb2_rec_hndl
+#define EB2_AUXIO_HNDL state->cs_handles.cs_eb2_auxio_hndl
+
+/*
+ * CS_port_t - per port (playback or record) state
+ */
+struct CS_engine {
+ CS_state_t *ce_state;
+ audio_engine_t *ce_engine;
+ int ce_num;
+ unsigned ce_syncdir;
+ unsigned ce_intrs;
+ unsigned ce_fragfr;
+ unsigned ce_fragsz;
+ unsigned ce_nframes;
+ unsigned ce_cfrag;
+ boolean_t ce_started;
+ uint64_t ce_count;
+
+ size_t ce_size;
+ caddr_t ce_kaddr;
+ ddi_dma_handle_t ce_dmah;
+ ddi_acc_handle_t ce_acch;
+ uint32_t ce_paddr[CS4231_NFRAGS];
+
+ /* registers (EB2 only) */
+ ddi_acc_handle_t ce_regsh;
+ cs4231_eb2regs_t *ce_eb2regs; /* EB2 registers */
+
+ /* codec enable */
+ uint8_t ce_codec_en;
+};
+
+struct CS_ctrl {
+ CS_state_t *cc_state;
+ audio_ctrl_t *cc_ctrl;
+ uint32_t cc_num;
+ uint64_t cc_val;
+};
/*
* CS_state_t - per instance state and operation data
@@ -283,84 +341,39 @@ struct CS_state {
kmutex_t cs_lock; /* state protection lock */
kcondvar_t cs_cv; /* suspend/resume cond. var. */
ddi_iblock_cookie_t cs_iblock; /* iblock cookie */
- uint_t cs_flags; /* flags */
kstat_t *cs_ksp; /* kernel statistics */
dev_info_t *cs_dip; /* used by cs4231_getinfo() */
- audiohdl_t cs_ahandle; /* audio handle */
- audio_info_t cs_defaults; /* default state for the dev */
- am_ad_info_t cs_ad_info; /* audio device info state */
+ audio_dev_t *cs_adev; /* audio device state */
+
cs_dmae_types_e cs_dma_engine; /* dma engine for this h/w */
struct cs4231_dma_ops *cs_dma_ops; /* dma engine ops vector */
cs4231_regs_t *cs_regs; /* hardware registers */
cs4231_eb2_t cs_eb2_regs; /* eb2 DMA registers */
cs4231_handle_t cs_handles; /* hardware handles */
- audio_device_t cs_dev_info; /* device info strings */
- int cs_instance; /* device instance */
- int cs_suspended; /* power management state */
- int cs_powered; /* device powered up? */
- int cs_busy_cnt; /* device busy count */
- ddi_dma_attr_t *cs_dma_attr; /* dma attributes */
- ddi_dma_handle_t cs_ph[2]; /* play DMA handles */
- ddi_dma_handle_t cs_ch[2]; /* capture DMA handles */
- ddi_dma_cookie_t cs_pc[2]; /* play DMA cookies */
- ddi_dma_cookie_t cs_cc[2]; /* capture DMA cookies */
- ddi_acc_handle_t cs_pmh[2]; /* play DMA memory handles */
- ddi_acc_handle_t cs_cmh[2]; /* capture DMA memory handles */
- size_t cs_pml[2]; /* play DMA memory length */
- size_t cs_cml[2]; /* capture DMA memory length */
- caddr_t cs_pb[2]; /* play DMA buffers */
- caddr_t cs_cb[2]; /* capture DMA buffers */
- int cs_pcnt[2]; /* play count, in samples */
- int cs_ccnt[2]; /* capture count, in bytes */
- int cs_pbuf_toggle; /* play DMA buffer toggle */
- int cs_cbuf_toggle; /* capture DMA buffer toggle */
- uint_t cs_play_sr; /* play sample rate */
- uint_t cs_play_ch; /* play channels */
- uint_t cs_play_prec; /* play precision */
- uint_t cs_play_enc; /* play encoding */
- uint_t cs_record_sr; /* record sample rate */
- uint_t cs_record_ch; /* record channels */
- uint_t cs_record_prec; /* record precision */
- uint_t cs_record_enc; /* record encoding */
- uint_t cs_output_muted; /* output muted */
- cs_cd_e cs_cd_input_line; /* AUX1, AUX2 or none */
+
+ boolean_t cs_suspended; /* power management state */
+ boolean_t cs_powered; /* device powered up? */
+
+ CS_engine_t *cs_engines[2];
+
boolean_t cs_revA; /* B_TRUE if Rev A CODEC */
- boolean_t cs_autocal; /* auto calibrate if B_TRUE */
uint8_t cs_save[CS4231_REGS]; /* PM reg. storage */
- uint8_t cs_save_ce; /* save capture encoding */
- uint8_t cs_save_pe; /* save play encoding */
+
+ /*
+ * Control related fields.
+ */
+ uint64_t cs_imask;
+ uint64_t cs_omask;
+ uint64_t cs_omod; /* modifiable ports */
+
+ CS_ctrl_t *cs_ogain;
+ CS_ctrl_t *cs_igain;
+ CS_ctrl_t *cs_micboost;
+ CS_ctrl_t *cs_mgain;
+ CS_ctrl_t *cs_outputs;
+ CS_ctrl_t *cs_inputs;
};
-typedef struct CS_state CS_state_t;
-_NOTE(MUTEX_PROTECTS_DATA(CS_state::cs_lock, CS_state))
-_NOTE(READ_ONLY_DATA(CS_state::cs_dip))
-_NOTE(READ_ONLY_DATA(CS_state::cs_ahandle))
-_NOTE(READ_ONLY_DATA(CS_state::cs_instance))
-_NOTE(READ_ONLY_DATA(CS_state::cs_handles))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_cb))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pb))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_cbuf_toggle))
-_NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pbuf_toggle))
-
-/* CS_state.flags defines */
-#define PDMA_ENGINE_INITIALIZED 0x0001u /* play DMA engine initialized */
-#define REC_INTR_PENDING 0x0002u /* record interrupt pending */
-#define APC_P_STOPPED 0x0004u /* APC playing has been shutdown */
-#define RDMA_ENGINE_INITIALIZED 0x0008u /* record DMA engine initialized */
-#define PLAY_ACTIVE 0x0010u /* play active, for PM */
-
-#define PLAY_DMA_HANDLE state->cs_ph[state->cs_pbuf_toggle]
-#define PLAY_DMA_COOKIE state->cs_pc[state->cs_pbuf_toggle]
-#define PLAY_DMA_BUF state->cs_pb[state->cs_pbuf_toggle]
-#define PLAY_DMA_MEM_HANDLE state->cs_pmh[state->cs_pbuf_toggle]
-#define PLAY_DMA_MEM_LENGTH state->cs_pml[state->cs_pbuf_toggle]
-#define PLAY_COUNT state->cs_pcnt[state->cs_pbuf_toggle]
-#define CAP_DMA_HANDLE state->cs_ch[state->cs_cbuf_toggle]
-#define CAP_DMA_COOKIE state->cs_cc[state->cs_cbuf_toggle]
-#define CAP_DMA_BUF state->cs_cb[state->cs_cbuf_toggle]
-#define CAP_DMA_MEM_HANDLE state->cs_cmh[state->cs_cbuf_toggle]
-#define CAP_DMA_MEM_LENGTH state->cs_cml[state->cs_cbuf_toggle]
-#define CAP_COUNT state->cs_ccnt[state->cs_cbuf_toggle]
#define KIOP(X) ((kstat_intr_t *)(X->cs_ksp->ks_data))
/*
@@ -368,17 +381,14 @@ _NOTE(SCHEME_PROTECTS_DATA("method", CS_state::cs_pbuf_toggle))
*/
struct cs4231_dma_ops {
char *dma_device;
- int (*cs_dma_map_regs)(dev_info_t *, CS_state_t *, size_t, size_t);
+ ddi_dma_attr_t *cs_dma_attr;
+ int (*cs_dma_map_regs)(CS_state_t *);
void (*cs_dma_unmap_regs)(CS_state_t *);
void (*cs_dma_reset)(CS_state_t *);
int (*cs_dma_add_intr)(CS_state_t *);
- void (*cs_dma_rem_intr)(dev_info_t *);
- int (*cs_dma_p_start)(CS_state_t *);
- void (*cs_dma_p_pause)(CS_state_t *);
- void (*cs_dma_p_restart)(CS_state_t *);
- void (*cs_dma_p_stop)(CS_state_t *);
- int (*cs_dma_r_start)(CS_state_t *);
- void (*cs_dma_r_stop)(CS_state_t *);
+ void (*cs_dma_rem_intr)(CS_state_t *);
+ int (*cs_dma_start)(CS_engine_t *);
+ void (*cs_dma_stop)(CS_engine_t *);
void (*cs_dma_power)(CS_state_t *, int);
};
typedef struct cs4231_dma_ops cs4231_dma_ops_t;
@@ -386,42 +396,28 @@ typedef struct cs4231_dma_ops cs4231_dma_ops_t;
extern cs4231_dma_ops_t cs4231_apcdma_ops;
extern cs4231_dma_ops_t cs4231_eb2dma_ops;
-#define CS4231_DMA_MAP_REGS(DIP, S, P, C) \
- ((S)->cs_dma_ops->cs_dma_map_regs)(DIP, S, P, C)
+#define CS4231_DMA_MAP_REGS(S) ((S)->cs_dma_ops->cs_dma_map_regs)(S)
#define CS4231_DMA_UNMAP_REGS(S) ((S)->cs_dma_ops->cs_dma_unmap_regs)(S)
#define CS4231_DMA_RESET(S) ((S)->cs_dma_ops->cs_dma_reset)(S)
#define CS4231_DMA_ADD_INTR(S) ((S)->cs_dma_ops->cs_dma_add_intr)(S)
-#define CS4231_DMA_REM_INTR(DIP, S) ((S)->cs_dma_ops->cs_dma_rem_intr)(DIP)
-#define CS4231_DMA_START_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_start)(S)
-#define CS4231_DMA_PAUSE_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_pause)(S)
-#define CS4231_DMA_RESTART_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_restart)(S)
-#define CS4231_DMA_STOP_PLAY(S) ((S)->cs_dma_ops->cs_dma_p_stop)(S)
-#define CS4231_DMA_START_RECORD(S) ((S)->cs_dma_ops->cs_dma_r_start)(S)
-#define CS4231_DMA_STOP_RECORD(S) ((S)->cs_dma_ops->cs_dma_r_stop)(S)
+#define CS4231_DMA_REM_INTR(S) ((S)->cs_dma_ops->cs_dma_rem_intr)(S)
+#define CS4231_DMA_START(S, E) ((S)->cs_dma_ops->cs_dma_start)(E)
+#define CS4231_DMA_STOP(S, E) ((S)->cs_dma_ops->cs_dma_stop)(E)
#define CS4231_DMA_POWER(S, L) ((S)->cs_dma_ops->cs_dma_power)(S, L)
+#define CS4231_DMA_ATTR(S) ((S)->cs_dma_ops->cs_dma_attr)
/*
* Useful bit twiddlers
*/
#define CS4231_RETRIES 10
-#define OR_SET_BYTE(handle, addr, val, mask) \
- cs4231_put8((state->cs_ahandle), (handle), (uint8_t *)(addr), \
- (ddi_get8((handle), (uint8_t *)(addr)) | (uint8_t)(val)), \
- (uint8_t)(mask), (__LINE__), (thisfile));
-
#define OR_SET_WORD(handle, addr, val) \
ddi_put32((handle), (uint_t *)(addr), \
- (ddi_get32((handle), (uint_t *)(addr)) | (uint_t)(val)));
-
-#define AND_SET_BYTE(handle, addr, val, mask) \
- cs4231_put8((state->cs_ahandle), (handle), (uint8_t *)(addr), \
- (ddi_get8((handle), (uint8_t *)(addr)) & (uint8_t)(val)), \
- (uint8_t)(mask), (__LINE__), (thisfile));
+ (ddi_get32((handle), (uint_t *)(addr)) | (uint_t)(val)))
#define AND_SET_WORD(handle, addr, val) \
ddi_put32((handle), (uint_t *)(addr), \
- (ddi_get32((handle), (uint_t *)(addr)) & (uint_t)(val)));
+ (ddi_get32((handle), (uint_t *)(addr)) & (uint_t)(val)))
/*
* CS4231 Register Set Definitions
@@ -532,6 +528,11 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#define PDF_ADPCM4 0xa0 /* ADPCM, 4-bit, IMA compatible */
#define PDF_LINEAR16BE 0xc0 /* Linear, 16-bit signed, big endian */
#define FSDF_VALID_MASK 0xff /* Valid bits mask */
+#ifdef _BIG_ENDIAN
+#define PDF_LINEAR16NE PDF_LINEAR16BE
+#else
+#define PDF_LINEAR16NE PDF_LINEAR16LE
+#endif
/* Index 09 - Interface Configuration, Mode 1&2 */
#define INTC_REG 0x09 /* Interrupt Configuration Register */
@@ -624,7 +625,7 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
/* Index 22 and 23 are reserved */
/* Index 24 - Alternate Feature Status, Mode 2 only */
-#define AFS_REG 0x18 /* Alternate Feature Status Registure */
+#define AFS_REG 0x18 /* Alternate Feature Status Register */
#define AFS_PU 0x01 /* Playback Underrun */
#define AFS_PO 0x02 /* Playback Overrun */
#define AFS_CO 0x04 /* Capture Overrun */
@@ -664,6 +665,11 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#define CDF_ADPCM4 0xa0 /* ADPCM, 4-bit, IMA compatible */
#define CDF_LINEAR16BE 0xc0 /* Linear, 16-bit signed, big endian */
#define CDF_VALID_MASK 0xf0 /* Valid bits mask */
+#ifdef _BIG_ENDIAN
+#define CDF_LINEAR16NE CDF_LINEAR16BE
+#else
+#define CDF_LINEAR16NE CDF_LINEAR16LE
+#endif
/* Index 29 is reserved */
@@ -677,8 +683,8 @@ extern cs4231_dma_ops_t cs4231_eb2dma_ops;
#endif /* _KERNEL */
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif
-#endif /* _SYS_AUDIO4231_IMPL_H */
+#endif /* _AUDIO_4231_H */
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c
new file mode 100644
index 0000000000..64b1cbe12a
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_apcdma.c
@@ -0,0 +1,567 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Platform specifc code for the APC DMA controller. The APC is an SBus
+ * IC that includes play and record DMA engines and an interface for
+ * the CS4231.
+ */
+
+#include <sys/systm.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Attribute structure for the APC, used to create DMA handles.
+ */
+static ddi_dma_attr_t apc_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000000fffLL, /* DMA counter register */
+ 0x0000000000000001LL, /* DMA address alignment */
+ 0x00000014, /* 4 and 16 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x0000000000000fffLL, /* maximum transfer size, 8k */
+ 0x000000000000ffffLL, /* segment boundary, 32k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t acc_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_BE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * Local routines
+ */
+static uint_t apc_intr(caddr_t);
+static void apc_load_fragment(CS_engine_t *);
+
+/*
+ * DMA ops vector functions
+ */
+static int apc_map_regs(CS_state_t *);
+static void apc_unmap_regs(CS_state_t *);
+static void apc_reset(CS_state_t *);
+static int apc_add_intr(CS_state_t *);
+static void apc_rem_intr(CS_state_t *);
+static int apc_start_engine(CS_engine_t *);
+static void apc_stop_engine(CS_engine_t *);
+static void apc_power(CS_state_t *, int);
+
+cs4231_dma_ops_t cs4231_apcdma_ops = {
+ "APC DMA controller",
+ &apc_dma_attr,
+ apc_map_regs,
+ apc_unmap_regs,
+ apc_reset,
+ apc_add_intr,
+ apc_rem_intr,
+ apc_start_engine,
+ apc_stop_engine,
+ apc_power,
+};
+
+/*
+ * apc_map_regs()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie. Finally, the registers
+ * are mapped in.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls will almost always succeed.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * AUDIO_SUCCESS Registers successfully mapped
+ * AUDIO_FAILURE Registers not successfully mapped
+ */
+static int
+apc_map_regs(CS_state_t *state)
+{
+ ddi_acc_handle_t *handle = &APC_HANDLE;
+ dev_info_t *dip = state->cs_dip;
+
+ /* map in the registers, getting a handle */
+ if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
+ sizeof (cs4231_regs_t), &acc_attr, handle) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "ddi_regs_map_setup() failed");
+ return (DDI_FAILURE);
+ }
+
+ /* clear the CSR so we have all interrupts disabled */
+ ddi_put32(*handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
+
+ return (DDI_SUCCESS);
+} /* apc_map_regs() */
+
+/*
+ * apc_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps the Codec's and DMA engine's registers.
+ * It must be idempotent.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_unmap_regs(CS_state_t *state)
+{
+ if (APC_HANDLE)
+ ddi_regs_map_free(&APC_HANDLE);
+
+} /* apc_unmap_regs() */
+
+/*
+ * apc_reset()
+ *
+ * Description:
+ * Reset both the play and record DMA engines. The engines are left
+ * with interrupts and the DMA engine disabled.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo structure
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_reset(CS_state_t *state)
+{
+ ddi_acc_handle_t handle = APC_HANDLE;
+
+ /*
+ * The APC has a bug where the reset is not done
+ * until you do the next pio to the APC. This
+ * next write to the CSR causes the posted reset to
+ * happen.
+ */
+
+ ddi_put32(handle, &APC_DMACSR, APC_RESET);
+ ddi_put32(handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
+
+} /* apc_reset() */
+
+/*
+ * apc_add_intr()
+ *
+ * Description:
+ * Register the APC interrupts with the kernel.
+ *
+ * NOTE: This does NOT turn on interrupts.
+ *
+ * CAUTION: While the interrupts are added, the Codec interrupts are
+ * not enabled.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+apc_add_intr(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* first we make sure this isn't a high level interrupt */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ audio_dev_warn(state->cs_adev,
+ "unsupported high level interrupt");
+ return (DDI_FAILURE);
+ }
+
+ /* okay to register the interrupt */
+ if (ddi_add_intr(dip, 0, NULL, NULL, apc_intr, (caddr_t)state) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "bad interrupt specification");
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+
+} /* apc_add_intr() */
+
+/*
+ * apc_rem_intr()
+ *
+ * Description:
+ * Unregister the APC interrupts from the kernel.
+ *
+ * CAUTION: While the interrupts are removed, the Codec interrupts are
+ * not disabled, but then, they never should have been on in
+ * the first place.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_rem_intr(CS_state_t *state)
+{
+ ddi_remove_intr(state->cs_dip, 0, NULL);
+} /* apc_rem_intr() */
+
+/*
+ * apc_start_engine()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * For hard starts the DMA engine is started by programming the
+ * Next Virtual Address and then the Next Counter twice, and
+ * finally enabling the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * CAUTION: ?!? This routine doesn't start the Codec because the first
+ * interrupt causes a recursive mutex_enter.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to start
+ *
+ * Returns:
+ * DDI_SUCCESS The DMA engine was started
+ * DDI_FAILURE The DMA engine was not started
+ */
+static int
+apc_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t csr;
+ uint32_t enable;
+ uint32_t dirty;
+ int x;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (eng->ce_num == CS4231_PLAY) {
+ enable = APC_PLAY_ENABLE;
+ dirty = APC_PD;
+ } else {
+ enable = APC_CAP_ENABLE;
+ dirty = APC_CD;
+ }
+
+ /* make sure it's okay to program the Next Address/Count registers */
+ csr = ddi_get32(handle, &APC_DMACSR);
+ for (x = 0; !(csr & dirty) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* no reason to beat on the bus */
+ csr = ddi_get32(handle, &APC_DMACSR);
+ }
+ if (x >= CS4231_TIMEOUT) {
+ audio_dev_warn(state->cs_adev,
+ "timeout waiting for engine, not started!");
+ return (DDI_FAILURE);
+ }
+
+ /*
+ * Program the first fragment.
+ */
+ apc_load_fragment(eng);
+
+ /*
+ * Start the DMA engine, including interrupts.
+ */
+ OR_SET_WORD(handle, &APC_DMACSR, enable);
+
+ /*
+ * Program the second fragment.
+ */
+ apc_load_fragment(eng);
+
+ return (DDI_SUCCESS);
+}
+
+/*
+ * apc_stop_engine()
+ *
+ * Description:
+ * This routine stops the engine.
+ *
+ * The DMA engine is stopped by using the CAP_ABORT bit.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to sotp
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_stop_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t reg;
+ uint32_t intren;
+ uint32_t abort;
+ uint32_t drainbit;
+ uint32_t disable;
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ if (eng->ce_num == CS4231_PLAY) {
+ intren = APC_PINTR_ENABLE;
+ abort = APC_P_ABORT;
+ drainbit = APC_PM;
+ disable = APC_PLAY_DISABLE;
+ } else {
+ intren = APC_CINTR_ENABLE;
+ abort = APC_C_ABORT;
+ drainbit = APC_CX;
+ disable = APC_CAP_DISABLE;
+ }
+
+ /* clear the interrupts so the ISR doesn't get involved */
+ AND_SET_WORD(handle, &APC_DMACSR, ~intren);
+
+ /* first, abort the DMA engine */
+ OR_SET_WORD(handle, &APC_DMACSR, abort);
+
+ /* wait for the pipeline to empty */
+ reg = ddi_get32(handle, &APC_DMACSR);
+ for (int x = 0; (!(reg & drainbit)) && (x < CS4231_TIMEOUT); x++) {
+ drv_usecwait(1); /* don't beat on bus */
+ reg = ddi_get32(handle, &APC_DMACSR);
+ }
+
+ /* now clear the enable and abort bits */
+ AND_SET_WORD(handle, &APC_DMACSR, ~(abort|disable));
+}
+
+
+/*
+ * apc_power()
+ *
+ * Description:
+ * This routine turns the Codec off by using the COD_PDWN bit in the
+ * apc chip. To turn power on we have to reset the APC, which clears
+ * the COD_PDWN bit. However, this is a settling bug in the APC which
+ * requires the driver to delay quite a while before we may continue.
+ * Since this is the first time this feature has actually been used
+ * it isn't too surprising that it has some problems.
+ *
+ * NOTE: The state structure must be locked when this routine is called.
+ *
+ * Arguments:
+ * CS_state_t *state Ptr to the device's state structure
+ * int level Power level to set
+ *
+ * Returns:
+ * void
+ */
+static void
+apc_power(CS_state_t *state, int level)
+{
+ ddi_acc_handle_t handle = APC_HANDLE;
+
+ if (level == CS4231_PWR_ON) { /* turn power on */
+ AND_SET_WORD(handle, &APC_DMACSR, ~APC_COD_PDWN);
+ OR_SET_WORD(handle, &APC_DMACSR, APC_RESET);
+ AND_SET_WORD(handle, &APC_DMACSR, ~APC_RESET);
+
+ /*
+ * wait for state change,
+ */
+ delay(drv_usectohz(CS4231_300MS));
+ } else { /* turn power off */
+ ASSERT(level == CS4231_PWR_OFF);
+ OR_SET_WORD(handle, &APC_DMACSR, APC_COD_PDWN);
+ }
+
+} /* apc_power() */
+
+
+/* ******* Local Routines ************************************************** */
+
+/*
+ * apc_intr()
+ *
+ * Description:
+ * APC interrupt service routine, which services both play and capture
+ * interrupts. First we find out why there was an interrupt, then we
+ * take the appropriate action.
+ *
+ * Because this ISR deals with both play and record interrupts we have
+ * to be careful to not lose an interrupt. So we service the record
+ * interrupt first and save the incoming data until later. This is all
+ * done without releasing the lock, thus there can be no race conditions.
+ * Then we process the play interrupt. While processing the play interrupt
+ * we have to release the lock. When this happens we send recorded data
+ * to the mixer and then get the next chunk of data to play. If there
+ * wasn't a play interrupt then we finish by sending the recorded data,
+ * if any.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+apc_intr(caddr_t T)
+{
+ CS_state_t *state = (void *)T;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint_t csr;
+ int rc = DDI_INTR_UNCLAIMED;
+
+ /* the state must be protected */
+ mutex_enter(&state->cs_lock);
+
+ if (state->cs_suspended) {
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* get the APC CSR */
+ csr = ddi_get32(handle, &APC_DMACSR);
+
+ /* make sure this device sent the interrupt */
+ if (!(csr & APC_IP)) {
+ if (csr & APC_PMI_EN) {
+ /*
+ * Clear device generated interrupt while play is
+ * active (Only seen while playing and insane mode
+ * switching)
+ */
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_CLAIMED);
+ } else {
+ /* nope, this isn't our interrupt */
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+ }
+
+ /* clear all interrupts we captured this time */
+ ddi_put32(handle, &APC_DMACSR, csr);
+
+ if (csr & APC_CINTR_MASK) {
+ /* try to load the next record buffer */
+ apc_load_fragment(state->cs_engines[CS4231_REC]);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+ if (csr & APC_PINTR_MASK) {
+ /* try to load the next play buffer */
+ apc_load_fragment(state->cs_engines[CS4231_PLAY]);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+done:
+
+ /* APC error interrupt, not sure what to do here */
+ if (csr & APC_EI) {
+ audio_dev_warn(state->cs_adev, "error interrupt: 0x%x", csr);
+ rc = DDI_INTR_CLAIMED;
+ }
+
+ /* update the kernel interrupt statistics */
+ if (state->cs_ksp) {
+ if (rc == DDI_INTR_CLAIMED) {
+ KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ if (csr & APC_CINTR_MASK) {
+ CS_engine_t *eng = state->cs_engines[CS4231_REC];
+ if (eng->ce_started)
+ audio_engine_produce(eng->ce_engine);
+ }
+ if (csr & APC_PINTR_MASK) {
+ CS_engine_t *eng = state->cs_engines[CS4231_PLAY];
+ if (eng->ce_started)
+ audio_engine_consume(eng->ce_engine);
+ }
+
+ return (rc);
+
+} /* apc_intr() */
+
+static void
+apc_load_fragment(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = APC_HANDLE;
+ uint32_t dirty;
+ uint32_t *nva; /* next VA reg */
+ uint32_t *nc; /* next count reg */
+
+ if (eng->ce_num == CS4231_PLAY) {
+ dirty = APC_PD;
+ nva = &APC_DMAPNVA;
+ nc = &APC_DMAPNC;
+ } else {
+ dirty = APC_CD;
+ nva = &APC_DMACNVA;
+ nc = &APC_DMACNC;
+ }
+
+ /* if we can't load another address, then don't */
+ if ((ddi_get32(handle, &APC_DMACSR) & dirty) == 0) {
+ return;
+ }
+
+ /* read the NVA, as per APC document */
+ (void) ddi_get32(handle, nva);
+
+ /* write the address of the next fragment */
+ ddi_put32(handle, nva, eng->ce_paddr[eng->ce_cfrag]);
+
+ /* now program the NC reg., which enables the state machine */
+ ddi_put32(handle, nc, eng->ce_fragsz);
+
+ eng->ce_cfrag++;
+ eng->ce_cfrag %= CS4231_NFRAGS;
+ eng->ce_count += eng->ce_fragfr;
+}
diff --git a/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c
new file mode 100644
index 0000000000..4c81bdd51b
--- /dev/null
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audio_4231_eb2dma.c
@@ -0,0 +1,573 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/*
+ * Platform specifc code for the EB2 DMA controller. The EB2 is a PCI bus
+ * IC that includes play and record DMA engines and an interface for
+ * the CS4231.
+ */
+
+#include <sys/systm.h>
+#include <sys/ddi.h>
+#include <sys/sunddi.h>
+#include <sys/note.h>
+#include <sys/audio/audio_driver.h>
+#include "audio_4231.h"
+
+/*
+ * Attribute structure for the APC, used to create DMA handles.
+ */
+static ddi_dma_attr_t eb2_dma_attr = {
+ DMA_ATTR_V0, /* version */
+ 0x0000000000000000LL, /* dlim_addr_lo */
+ 0x00000000ffffffffLL, /* dlim_addr_hi */
+ 0x0000000000ffffffLL, /* DMA counter register */
+ 0x0000000000000001LL, /* DMA address alignment */
+ 0x00000074, /* 4 and 16 byte burst sizes */
+ 0x00000001, /* min effective DMA size */
+ 0x000000000000ffffLL, /* maximum transfer size, 8k */
+ 0x000000000000ffffLL, /* segment boundary, 32k */
+ 0x00000001, /* s/g list length, no s/g */
+ 0x00000001, /* granularity of device, don't care */
+ 0 /* DMA flags */
+};
+
+static ddi_device_acc_attr_t codec_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_BE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+static ddi_device_acc_attr_t eb2_attr = {
+ DDI_DEVICE_ATTR_V0,
+ DDI_STRUCTURE_LE_ACC,
+ DDI_STRICTORDER_ACC
+};
+
+/*
+ * Local routines
+ */
+static uint_t eb2_intr(caddr_t);
+static void eb2_load_fragment(CS_engine_t *);
+
+/*
+ * DMA ops vector functions
+ */
+static int eb2_map_regs(CS_state_t *);
+static void eb2_unmap_regs(CS_state_t *);
+static void eb2_reset(CS_state_t *);
+static int eb2_add_intr(CS_state_t *);
+static void eb2_rem_intr(CS_state_t *);
+static int eb2_start_engine(CS_engine_t *);
+static void eb2_stop_engine(CS_engine_t *);
+static void eb2_power(CS_state_t *, int);
+
+cs4231_dma_ops_t cs4231_eb2dma_ops = {
+ "EB2 DMA controller",
+ &eb2_dma_attr,
+ eb2_map_regs,
+ eb2_unmap_regs,
+ eb2_reset,
+ eb2_add_intr,
+ eb2_rem_intr,
+ eb2_start_engine,
+ eb2_stop_engine,
+ eb2_power,
+};
+
+/*
+ * eb2_map_regs()
+ *
+ * Description:
+ * This routine allocates the DMA handles and the memory for the
+ * DMA engines to use. It then binds each of the buffers to its
+ * respective handle, getting a DMA cookie. Finally, the registers
+ * are mapped in.
+ *
+ * NOTE: All of the ddi_dma_... routines sleep if they cannot get
+ * memory. This means these calls will almost always succeed.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state
+ *
+ * Returns:
+ * DDI_SUCCESS Registers successfully mapped
+ * DDI_FAILURE Registers not successfully mapped
+ */
+static int
+eb2_map_regs(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* now, map the codec */
+ if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
+ sizeof (cs4231_pioregs_t), &codec_attr, &CODEC_HANDLE) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping codec regs");
+ goto error;
+ }
+
+ /* next the play registers */
+ if (ddi_regs_map_setup(dip, 1, (caddr_t *)&state->cs_eb2_regs.play, 0,
+ sizeof (cs4231_eb2regs_t), &eb2_attr, &EB2_PLAY_HNDL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping play regs");
+ goto error;
+ }
+ state->cs_engines[CS4231_PLAY]->ce_regsh = EB2_PLAY_HNDL;
+ state->cs_engines[CS4231_PLAY]->ce_eb2regs = state->cs_eb2_regs.play;
+
+ /* now the capture registers */
+ if (ddi_regs_map_setup(dip, 2, (caddr_t *)&state->cs_eb2_regs.record, 0,
+ sizeof (cs4231_eb2regs_t), &eb2_attr, &EB2_REC_HNDL) !=
+ DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping rec regs");
+ goto error;
+ }
+ state->cs_engines[CS4231_REC]->ce_regsh = EB2_REC_HNDL;
+ state->cs_engines[CS4231_REC]->ce_eb2regs = state->cs_eb2_regs.record;
+
+ /* finally the auxio register */
+ if (ddi_regs_map_setup(dip, 3, (caddr_t *)&state->cs_eb2_regs.auxio, 0,
+ sizeof (uint_t), &eb2_attr, &EB2_AUXIO_HNDL) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "failed mapping auxio reg");
+ goto error;
+ }
+
+ /* disable play and record interrupts */
+ ddi_put32(EB2_PLAY_HNDL, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
+ ddi_put32(EB2_REC_HNDL, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
+
+ return (DDI_SUCCESS);
+
+error:
+ eb2_unmap_regs(state);
+ return (DDI_FAILURE);
+
+} /* eb2_map_regs() */
+
+/*
+ * eb2_unmap_regs()
+ *
+ * Description:
+ * This routine unmaps the Codec's and DMA engine's registers.
+ * It must be idempotent.
+ *
+ * Arguments:
+ * CS_state_t *state The device's state
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_unmap_regs(CS_state_t *state)
+{
+ if (CODEC_HANDLE)
+ ddi_regs_map_free(&CODEC_HANDLE);
+ if (EB2_PLAY_HNDL)
+ ddi_regs_map_free(&EB2_PLAY_HNDL);
+ if (EB2_REC_HNDL)
+ ddi_regs_map_free(&EB2_REC_HNDL);
+ if (EB2_AUXIO_HNDL)
+ ddi_regs_map_free(&EB2_AUXIO_HNDL);
+
+} /* eb2_unmap_regs() */
+
+/*
+ * eb2_reset()
+ *
+ * Description:
+ * Reset both the play and record DMA engines. The engines are left
+ * with interrupts and the DMA engine disabled.
+ *
+ * Arguments:
+ * dev_info_t *dip Pointer to the device's devinfo structure
+ * CS_state_t *state The device's state structure
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_reset(CS_state_t *state)
+{
+ ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
+ ddi_acc_handle_t rhandle = EB2_REC_HNDL;
+ uint_t reg;
+ int x;
+
+ /* start with the play side */
+ ddi_put32(phandle, &EB2_PLAY_CSR, EB2_RESET);
+ /* wait for play data to drain */
+ reg = ddi_get32(phandle, &EB2_PLAY_CSR);
+ for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ reg = ddi_get32(phandle, &EB2_PLAY_CSR);
+ }
+ /* clear the reset bit and program for chaining */
+ ddi_put32(phandle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
+
+ /* now do the record side and program for chaining */
+ ddi_put32(rhandle, &EB2_REC_CSR, EB2_RESET);
+ /* wait for record data to drain */
+ reg = ddi_get32(rhandle, &EB2_REC_CSR);
+ for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ reg = ddi_get32(rhandle, &EB2_REC_CSR);
+ }
+ /* clear the reset bit */
+ ddi_put32(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
+
+} /* eb2_reset() */
+
+/*
+ * eb2_add_intr()
+ *
+ * Description:
+ * Register the EB2 interrupts with the kernel.
+ *
+ * NOTE: This does NOT turn on interrupts.
+ *
+ * CAUTION: While the interrupts are added, the Codec interrupts are
+ * not enabled.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS Interrupts added
+ * DDI_FAILURE Interrupts not added
+ */
+static int
+eb2_add_intr(CS_state_t *state)
+{
+ dev_info_t *dip = state->cs_dip;
+
+ /* first we make sure these aren't high level interrupts */
+ if (ddi_intr_hilevel(dip, 0) != 0) {
+ audio_dev_warn(state->cs_adev, "unsupported hi level intr 0");
+ return (DDI_FAILURE);
+ }
+ if (ddi_intr_hilevel(dip, 1) != 0) {
+ audio_dev_warn(state->cs_adev, "unsupported hi level intr 1");
+ return (DDI_FAILURE);
+ }
+
+ /* okay to register the interrupts */
+ if (ddi_add_intr(dip, 0, NULL, NULL, eb2_intr,
+ (caddr_t)state->cs_engines[CS4231_REC]) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "bad record interrupt spec");
+ return (DDI_FAILURE);
+ }
+
+ if (ddi_add_intr(dip, 1, NULL, NULL, eb2_intr,
+ (caddr_t)state->cs_engines[CS4231_PLAY]) != DDI_SUCCESS) {
+ audio_dev_warn(state->cs_adev, "play interrupt spec");
+ ddi_remove_intr(dip, 0, NULL);
+ return (DDI_FAILURE);
+ }
+
+ return (DDI_SUCCESS);
+
+} /* eb2_add_intr() */
+
+/*
+ * eb2_rem_intr()
+ *
+ * Description:
+ * Unregister the EB2 interrupts from the kernel.
+ *
+ * CAUTION: While the interrupts are removed, the Codec interrupts are
+ * not disabled, but then, they never should have been on in
+ * the first place.
+ *
+ * Arguments:
+ * CS_state_t *state Pointer to the device's soft state
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_rem_intr(CS_state_t *state)
+{
+ ddi_remove_intr(state->cs_dip, 0, NULL);
+ ddi_remove_intr(state->cs_dip, 1, NULL);
+} /* eb2_rem_intr() */
+
+/*
+ * eb2_start_engine()
+ *
+ * Description:
+ * This routine starts the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The DMA engine's state structure
+ *
+ * Returns:
+ * DDI_SUCCESS The DMA engine was started
+ * DDI_FAILURE The DMA engine was not started
+ */
+static int
+eb2_start_engine(CS_engine_t *eng)
+{
+ CS_state_t *state = eng->ce_state;
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ uint_t csr;
+ int x;
+ uint32_t reset;
+ uint32_t enable;
+
+ if (eng->ce_num == CS4231_PLAY) {
+ reset = EB2_PCLEAR_RESET_VALUE;
+ enable = EB2_PLAY_ENABLE;
+ } else {
+ reset = EB2_RCLEAR_RESET_VALUE;
+ enable = EB2_REC_ENABLE;
+ }
+
+ ASSERT(mutex_owned(&state->cs_lock));
+
+ /* reset the DMA engine so we have a good starting place */
+ OR_SET_WORD(handle, &regs->eb2csr, EB2_RESET);
+
+ /* wait for the FIFO to drain, it should be empty */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* no reason to beat on the bus */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+ if (x >= CS4231_TIMEOUT) {
+ audio_dev_warn(state->cs_adev,
+ "timeout waiting for engine, not started!");
+ return (DDI_FAILURE);
+ }
+
+ /* now clear the RESET and EN_DMA bits */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_RESET|EB2_EN_DMA));
+
+ /* put into chaining mode, enable byte counts */
+ OR_SET_WORD(handle, &regs->eb2csr, reset);
+
+ /*
+ * Program the DMA engine.
+ */
+ eb2_load_fragment(eng);
+
+ /*
+ * Start playing before we load the next fragment.
+ */
+ OR_SET_WORD(handle, &regs->eb2csr, enable);
+
+ /*
+ * Program a 2nd fragment.
+ */
+ eb2_load_fragment(eng);
+
+ return (DDI_SUCCESS);
+
+} /* eb2_start_engine() */
+
+/*
+ * eb2_stop_engine()
+ *
+ * Description:
+ * This routine stops the DMA engine.
+ *
+ * NOTE: The state structure must be locked before this routine is called.
+ *
+ * Arguments:
+ * CS_engine_t *eng The engine to stop
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_stop_engine(CS_engine_t *eng)
+{
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ uint_t csr;
+
+ /* shut off DMA and disable interrupts */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_EN_DMA | EB2_INT_EN));
+
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (int x = 0; (csr & EB2_CYC_PENDING) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1);
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+
+ /* set the RESET bit to stop audio, also clear any TC interrupt */
+ OR_SET_WORD(handle, &regs->eb2csr, EB2_RESET | EB2_TC);
+
+ /* wait for the FIFO to drain */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ for (int x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
+ drv_usecwait(1); /* don't beat on the bus */
+ csr = ddi_get32(handle, &regs->eb2csr);
+ }
+
+ /* clear the RESET and EN_DMA bits */
+ AND_SET_WORD(handle, &regs->eb2csr, ~(EB2_RESET|EB2_EN_DMA));
+
+} /* eb2_stop_engine() */
+
+/*
+ * eb2_power()
+ *
+ * Description:
+ * This routine turns the Codec on or off using the auxio register
+ * in the eb2 device (cheerio or rio). Fortunately we don't need
+ * to delay like we do with the APC.
+ *
+ * NOTE: The state structure must be locked when this routine is called.
+ *
+ * Arguments:
+ * CS_state_t *state Ptr to the device's state structure
+ * int level Power level to set
+ *
+ * Returns:
+ * void
+ */
+static void
+eb2_power(CS_state_t *state, int level)
+{
+ ddi_acc_handle_t xhandle = EB2_AUXIO_HNDL;
+
+ if (level == CS4231_PWR_ON) { /* turn power on */
+ AND_SET_WORD(xhandle, EB2_AUXIO_REG, ~EB2_AUXIO_COD_PDWN);
+ } else { /* turn power off */
+ OR_SET_WORD(xhandle, EB2_AUXIO_REG, EB2_AUXIO_COD_PDWN);
+ }
+
+} /* eb2_power() */
+
+
+/* ******* Local Routines ************************************************** */
+
+/*
+ * eb2_intr()
+ *
+ * Description:
+ * EB2 interrupt serivce routine. First we find out why there was an
+ * interrupt, then we take the appropriate action.
+ *
+ * Arguments:
+ * caddr_t T Pointer to the interrupting device's state
+ * structure
+ *
+ * Returns:
+ * DDI_INTR_CLAIMED Interrupt claimed and processed
+ * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
+ */
+static uint_t
+eb2_intr(caddr_t T)
+{
+ CS_engine_t *eng = (void *)T;
+ CS_state_t *state = eng->ce_state;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ uint32_t csr;
+ boolean_t doit = B_FALSE;
+
+ /* the state must be protected */
+ mutex_enter(&state->cs_lock);
+ if (state->cs_suspended) {
+ mutex_exit(&state->cs_lock);
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* get the EB2 CSR */
+ csr = ddi_get32(handle, &regs->eb2csr);
+
+ /* make sure this device sent the interrupt */
+ if (!(csr & EB2_INT_PEND)) {
+ mutex_exit(&state->cs_lock);
+ /* nope, this isn't our interrupt */
+ return (DDI_INTR_UNCLAIMED);
+ }
+
+ /* clear all interrupts we captured at this time */
+ ddi_put32(handle, &regs->eb2csr, (csr|EB2_TC));
+
+ if (csr & EB2_TC) {
+
+ /* try to load the next audio buffer */
+ eb2_load_fragment(eng);
+
+ /* if engine was started, then we want to consume later */
+ doit = eng->ce_started;
+
+ } else if (csr & EB2_ERR_PEND) {
+ audio_dev_warn(state->cs_adev, "error intr: 0x%x", csr);
+
+ } else {
+ audio_dev_warn(state->cs_adev, "unknown intr: 0x%x", csr);
+ }
+
+ /* update the kernel interrupt statisitcs */
+ if (state->cs_ksp) {
+ KIOP(state)->intrs[KSTAT_INTR_HARD]++;
+ }
+
+ mutex_exit(&state->cs_lock);
+
+ if (doit) {
+ if (eng->ce_num == CS4231_PLAY) {
+ audio_engine_consume(eng->ce_engine);
+ } else {
+ audio_engine_produce(eng->ce_engine);
+ }
+ }
+
+ return (DDI_INTR_CLAIMED);
+
+} /* eb2_intr() */
+
+static void
+eb2_load_fragment(CS_engine_t *eng)
+{
+ ddi_acc_handle_t handle = eng->ce_regsh;
+ cs4231_eb2regs_t *regs = eng->ce_eb2regs;
+
+ /* if next address already loaded, then we're done */
+ if ((ddi_get32(handle, &regs->eb2csr) & EB2_NA_LOADED)) {
+ return;
+ }
+
+ /*
+ * For eb2 we first program the Next Byte Count Register.
+ */
+ ddi_put32(handle, &regs->eb2bcr, eng->ce_fragsz);
+
+ /* now program the Next Address Register */
+ ddi_put32(handle, &regs->eb2acr, eng->ce_paddr[eng->ce_cfrag]);
+
+ eng->ce_cfrag++;
+ eng->ce_cfrag %= CS4231_NFRAGS;
+ eng->ce_count += eng->ce_fragfr;
+}
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf b/usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf
index 984e9e7abf..60424b03f0 100644
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audiocs.conf
+++ b/usr/src/uts/sun/io/audio/drv/audiocs/audiocs.conf
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -20,25 +19,14 @@
# CDDL HEADER END
#
#
-# Copyright 1999-2002 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#pragma ident "%Z%%M% %I% %E% SMI"
-#
# Configuration file for the audiocs audio driver.
#
# WARNING: This is an UNSTABLE configuration file. Its contents
# may change at any time.
#
-# mixer-mode determines the mode the mixer audio personality module
-# sets for this driver when it is loaded. The mixerctl(1) command may
-# be used to change modes on the fly.
-#
-# mixer-mode=1; <-- mixer enabled
-# mixer-mode=0; <-- mixer disabled, old audio(7I) behavior
-#
-
-mixer-mode=1;
#
# play-interrupts sets the number of interrupts per second when playing.
@@ -57,10 +45,3 @@ mixer-mode=1;
#
play-interrupts=175;
record-interrupts=175;
-
-#
-# Uncomment reset-configuration to cause the audiocs driver's state to
-# be reset to the default when the driver is loaded. Otherwise this state
-# is retained across driver unload/reload cycles, but not across reboots.
-#
-#reset-configuration=1;
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c b/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c
deleted file mode 100644
index 8a9c92de1c..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audio1575/audio1575.c
+++ /dev/null
@@ -1,4119 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audio1575 Audio Driver
- *
- * The driver is primarily targeted at providing audio support for
- * those sparc systems which use the Uli M1575 audio core
- * and the Analog Devices AD1981 codec.
- *
- * This driver uses the mixer Audio Personality Module to implement
- * audio(7I) and mixer(7I) semantics. Both play and record are single
- * streaming.
- *
- * The M1575 audio core, in AC'97 controller mode, has independent
- * channels for PCM in, PCM out, mic in, modem in, and modem out.
- *
- * The AC'97 controller is a PCI bus master with scatter/gather
- * support. Each channel has a DMA engine. Currently, we use only
- * the PCM in and PCM out channels. Each DMA engine uses one buffer
- * descriptor list. And the buffer descriptor list is an array of up
- * to 32 entries, each of which describes a data buffer. Each entry
- * contains a pointer to a data buffer, control bits, and the length
- * of the buffer being pointed to, where the length is expressed as
- * the number of samples. This, combined with the 16-bit sample size,
- * gives the actual physical length of the buffer.
- *
- * We use the BD list (buffer descriptor list) as a round-robin FIFO.
- * Both the software and hardware loop around the BD list. For playback,
- * the software writes to the buffers pointed by the BD entries of BD
- * list, and the hardware sends the data in the buffers out. For record,
- * the process is reversed. So we define the struct, m1575_sample_buf,
- * to handle the BD. The software uses the head, tail and avail fields of
- * this structure to manipulate the FIFO. The head field indicates the
- * first valid BD hardware can manipulate. The tail field indicates the
- * BD after the last valid BD. And the avail field indicates how many
- * buffers are available. There're also two hardware registers to index
- * the FIFO, the CIV (current index value) indicating the current BD the
- * hardware is transferring, and the LVI (last valid index) indicating
- * the last valid BD that contains proper data which the hardware should
- * not pass over. Each time a BD is processed, the hardware will issue an
- * interrupt. If the system is busy, there can be more than one BD to be
- * processed when the OS have chance to handle the interrupt. When an
- * interrupt generated, the interrupt handler will first reclaim the BD(s)
- * which had been transferred, which will be the limit [head, CIV-1], then
- * update the value of the head field to CIV, update the value of avail to
- * CIV - head. And then it will process avail BDs from tail, and set the
- * LVI to the last processed BD and update tail to LVI + 1, and update the
- * avail to 0.
- *
- * We allocate N blocks of DMA memory, say A and B, for every DMA
- * engine, and bind the first, Block A, to the even entries of BDL,
- * while bind the second to the odd entries. That's say, for each buffer
- * descriptor list of DMA engine, entry 0, 2,,, 30 would be bound to Block
- * A, and entry 1, 3,,, 31 would be bound to Block B. Take the playback as
- * an example. At the beginning of playback, we set the entry 0 and 1 to
- * point to block A and B separately, and tell the DMA engine that the last
- * valid entry is entry 1. So the DMA engine doesn't access the entries after
- * entry 1. When the first playback interrupt generated, we reclaim entry
- * 0, and fill the BD entry 2 with the address of Block A, then set the
- * entry 2 to be the last valid entry, and so on. So at any time there are
- * at most two entries available for per DMA engine.
- *
- * Every time we program AC97 codec, we save the value in codec_shadow[].
- * This means that register state information is saved for power management
- * shutdown (we'll support this later). When the codec is started back up
- * we use this saved state to restore codec's state in audio1575_chip_init()
- *
- * TODO: System power management is not yet supported by the driver.
- *
- * NOTE:
- * This driver depends on the misc/audiosup, misc/amsrc2 and
- * misc/mixer modules being loaded first.
- */
-
-#include <sys/types.h>
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/conf.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/ac97.h>
-#include <sys/audio/impl/audio1575_impl.h>
-#include <sys/audio/audio1575.h>
-#include <sys/cpuvar.h>
-
-/*
- * Module linkage routines for the kernel
- */
-static int audio1575_getinfo(dev_info_t *, ddi_info_cmd_t, void*, void**);
-static int audio1575_attach(dev_info_t *, ddi_attach_cmd_t);
-static int audio1575_detach(dev_info_t *, ddi_detach_cmd_t);
-
-/*
- * Entry point routine prototypes
- */
-static int audio1575_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int audio1575_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int audio1575_ad_start_play(audiohdl_t, int);
-static void audio1575_ad_pause_play(audiohdl_t, int);
-static void audio1575_ad_stop_play(audiohdl_t, int);
-static int audio1575_ad_start_record(audiohdl_t, int);
-static void audio1575_ad_stop_record(audiohdl_t, int);
-
-/*
- * interrupt handler
- */
-static uint_t audio1575_intr(caddr_t);
-
-/*
- * Local Routine Prototypes
- */
-static int audio1575_init_ac97(audio1575_state_t *, int);
-static int audio1575_reset_ac97(audio1575_state_t *);
-static int audio1575_codec_sync(audio1575_state_t *);
-static int audio1575_write_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_read_ac97(audio1575_state_t *, int, uint16_t *);
-static int audio1575_and_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_or_ac97(audio1575_state_t *, int, uint16_t);
-static int audio1575_chip_init(audio1575_state_t *, int);
-static int audio1575_init_state(audio1575_state_t *, dev_info_t *);
-static int audio1575_map_regs(dev_info_t *, audio1575_state_t *);
-static void audio1575_unmap_regs(audio1575_state_t *);
-static int audio1575_alloc_sample_buf(audio1575_state_t *, int, int);
-static void audio1575_free_sample_buf(audio1575_state_t *, int);
-static void audio1575_dma_stop(audio1575_state_t *);
-static int audio1575_fill_play_buf(audio1575_state_t *);
-static void audio1575_reclaim_play_buf(audio1575_state_t *);
-static int audio1575_prepare_record_buf(audio1575_state_t *);
-static void audio1575_reclaim_record_buf(audio1575_state_t *);
-static int audio1575_set_gain(audio1575_state_t *, int, int, int);
-static int audio1575_set_port(audio1575_state_t *, int, int);
-static int audio1575_set_monitor_gain(audio1575_state_t *, int);
-static void audio1575_pci_enable(audio1575_state_t *);
-static void audio1575_pci_disable(audio1575_state_t *);
-static int audio1575_dma_pause(audio1575_state_t *, int);
-static int audio1575_dma_resume(audio1575_state_t *, int);
-static int audio1575_dma_reset(audio1575_state_t *, int);
-
-/*
- * Global variables, but used only by this file.
- */
-
-/* anchor for soft state structures */
-static void *audio1575_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audio1575_name = M1575_NAME;
-
-/*
- * STREAMS structures
- */
-
-/* STREAMS driver id and limit value struct */
-static struct module_info audio1575_modinfo = {
- M1575_IDNUM, /* module ID number */
- M1575_NAME, /* module name */
- M1575_MINPACKET, /* minimum packet size */
- M1575_MAXPACKET, /* maximum packet size */
- M1575_HIWATER, /* high water mark */
- M1575_LOWATER, /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit audio1575_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &audio1575_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit audio1575_wqueue = {
- audio_sup_wput, /* write procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &audio1575_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab audio1575_str_info = {
- &audio1575_rqueue, /* read queue */
- &audio1575_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops audio1575_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &audio1575_str_info, /* cb_str */
- D_NEW | D_MP | D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_awrite */
-};
-
-/* Device operations structure */
-static struct dev_ops audio1575_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- audio1575_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe */
- audio1575_attach, /* devo_attach */
- audio1575_detach, /* devo_detach */
- nodev, /* devo_reset */
- &audio1575_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- NULL, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv audio1575_modldrv = {
- &mod_driverops, /* drv_modops */
- M1575_MOD_NAME, /* drv_linkinfo */
- &audio1575_dev_ops, /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage audio1575_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&audio1575_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-static uint_t audio1575_mixer_srs[] = {
- M1575_SAMPR5510,
- M1575_SAMPR48000,
- 0
-};
-
-static uint_t audio1575_compat_srs [] = {
- M1575_SAMPR8000, M1575_SAMPR9600, M1575_SAMPR11025,
- M1575_SAMPR16000, M1575_SAMPR18900, M1575_SAMPR22050,
- M1575_SAMPR27420, M1575_SAMPR32000, M1575_SAMPR33075,
- M1575_SAMPR37800, M1575_SAMPR44100, M1575_SAMPR48000,
- 0
-};
-
-static am_ad_sample_rates_t audio1575_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- audio1575_mixer_srs
-};
-
-static am_ad_sample_rates_t audio1575_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- audio1575_compat_srs
-};
-
-static uint_t audio1575_channels[] = {
- AUDIO_CHANNELS_STEREO,
- 0
-};
-
-static am_ad_cap_comb_t audio1575_combinations[] = {
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-/* AD1981B Equalization Biquad IIR Filter coefficient address table */
-static m1575_biquad_t filters[] = {
- {0x1b, 0x0f}, {0x1a, 0x00}, {0x19, 0x00}, {0x1d, 0x00}, {0x1c, 0x00},
- {0x20, 0x0f}, {0x1f, 0x00}, {0x1e, 0x00}, {0x22, 0x00}, {0x21, 0x00},
- {0x25, 0x0f}, {0x24, 0x00}, {0x23, 0x00}, {0x27, 0x00}, {0x26, 0x00},
- {0x2a, 0x0f}, {0x29, 0x00}, {0x28, 0x00}, {0x2c, 0x00}, {0x2b, 0x00},
- {0x2f, 0x0f}, {0x2e, 0x00}, {0x2d, 0x00}, {0x31, 0x00}, {0x30, 0x00},
- {0x34, 0x0f}, {0x33, 0x00}, {0x32, 0x00}, {0x36, 0x00}, {0x35, 0x00},
- {0x39, 0x0f}, {0x38, 0x00}, {0x37, 0x00}, {0x3b, 0x00}, {0x3a, 0x00},
-};
-
-/*
- * device access attributes for register mapping
- */
-static struct ddi_device_acc_attr dev_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_LE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * DMA attributes of buffer descriptor list
- */
-static ddi_dma_attr_t bdlist_dma_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x000000000000ffffLL, /* DMA counter register - 64 bits */
- 0x0000000000000008LL, /* DMA address align must be 8-bytes */
- 0x0000003c, /* 1 through 64 byte burst sizes */
- 0x00000008, /* min xfer DMA size BDList entry */
- 0x00000000000ffffLL, /* max xfer size, 64K */
- 0x000000000001fffLL, /* seg, set to PAGESIZE */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000008, /* granularity of device minxfer */
- 0 /* DMA flags use virtual address */
-};
-
-/*
- * DMA attributes of buffers to be used to receive/send audio data
- */
-static ddi_dma_attr_t sample_buf_dma_attr = {
- DMA_ATTR_V0,
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x000000000001fffeLL, /* DMA counter register - 16 bits */
- 0x0000000000000002LL, /* DMA address align 2-byte boundary */
- 0x0000003c, /* 1 through 60 byte burst sizes */
- 0x00000004, /* min xfer DMA size BDList entry */
- 0x000000000001ffffLL, /* max xfer size, 64K */
- 0x000000000001ffffLL, /* seg, set to 64K */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000004, /* granularity of device minxfer */
- 0 /* DMA flags use virtual address */
-};
-
-static am_ad_entry_t audio1575_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- audio1575_ad_set_config, /* ad_set_config() */
- audio1575_ad_set_format, /* ad_set_format() */
- audio1575_ad_start_play, /* ad_start_play() */
- audio1575_ad_pause_play, /* ad_pause_play() */
- audio1575_ad_stop_play, /* ad_stop_play() */
- audio1575_ad_start_record, /* ad_start_record() */
- audio1575_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("audio1575 _init() entering", NULL);
-
- if ((error = ddi_soft_state_init(&audio1575_statep,
- sizeof (audio1575_state_t), 1)) != 0) {
- ATRACE("audio1575 ddi_soft_state_init() failure",
- error);
-
- return (error);
- }
-
- if ((error = mod_install(&audio1575_modlinkage)) != 0) {
- ddi_soft_state_fini(&audio1575_statep);
- }
-
- ATRACE("audio1575 _init() returning", error);
-
- return (error);
-
-} /* _init() */
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("audio1575 _fini() entering", audio1575_statep);
-
- if ((error = mod_remove(&audio1575_modlinkage)) != 0) {
-
- return (error);
- }
-
- ddi_soft_state_fini(&audio1575_statep);
-
- ATRACE("audio1575 _fini() returning", error);
-
- return (0);
-
-} /* _fini() */
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns information about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("audio1575 _info() entering", NULL);
-
- error = mod_info(&audio1575_modlinkage, modinfop);
-
- ATRACE("audio1575 _info() returning", error);
-
- return (error);
-
-} /* _info() */
-
-
-/* ******************* Driver Entry Points ********************************* */
-
-/*
- * audio1575_getinfo()
- */
-static int
-audio1575_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
-{
- audio1575_state_t *statep;
- int instance;
- int error = DDI_FAILURE;
-
- ATRACE("audio1575_getinfo() entering", dip);
-
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((statep = ddi_get_soft_state(audio1575_statep,
- instance)) != NULL) {
- *result = statep->m1575_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
-
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
-
- default:
- break;
- }
-
- ATRACE("audio1575_getinfo() returning", error);
-
- return (error);
-
-} /* audio1575_getinfo() */
-
-/*
- * audio1575_attach()
- *
- * Description:
- * Attach an instance of the audio1575 driver. This routine does the
- * device dependent attach tasks. When it is completed, it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-audio1575_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- audio1575_state_t *statep;
- uint32_t intrsr;
- uint32_t intrcr;
- int instance;
- audio_sup_reg_data_t data;
-
- ATRACE("audio1575_attach() entering", dip);
-
- instance = ddi_get_instance(dip);
-
- switch (cmd) {
- case DDI_ATTACH:
- ATRACE("audio1575_attach() DDI_ATTACH", NULL);
- break;
- case DDI_RESUME:
- ATRACE("audio1575_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) ==
- NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failure",
- audio1575_name, instance);
-
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT((statep->m1575_flags & M1575_DMA_SUSPENDED) ==
- M1575_DMA_SUSPENDED);
-
- statep->m1575_flags &= ~M1575_DMA_SUSPENDED;
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /*
- * Restore the audio1575 chip's state and
- * put the DMA Engines in a known state
- */
- if ((audio1575_chip_init(statep, M1575_INIT_RESTORE)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_attach()chip init failure",
- DDI_FAILURE);
-
- return (DDI_FAILURE);
- }
-
- /*
- * Start playing and recording, if not needed they'll stop
- * on their own. But, we don't start them if the hardware has
- * failed.
- */
- if (audio_sup_restore_state(statep->m1575_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() audio restart failure");
- }
-
- ATRACE("audio1575_attach() DDI_RESUME done", NULL);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE("audio1575_attach() unknown command", cmd);
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() unknown command: 0x%x",
- audio1575_name, instance, cmd);
-
- return (DDI_FAILURE);
- }
-
- /* allocate the soft state structure */
- if (ddi_soft_state_zalloc(audio1575_statep, instance) != DDI_SUCCESS) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- /* get the state structure */
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() ddi_get_soft_state() failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- statep->m1575_inst = instance;
-
- /* call audiosup module registration routine */
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
-
- /* register the driver with the audio support module */
- if ((statep->m1575_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() audio_sup_register() failure",
- audio1575_name, instance);
- goto error_state;
- }
-
- /* map in the audio registers */
- if (audio1575_map_regs(dip, statep) != AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() couldn't map registers");
- goto error_audiosup;
- }
-
- /* Enable PCI I/O and Memory Spaces */
- audio1575_pci_enable(statep);
-
- /*
- * clear the interrupt control and status register
- * READ/WRITE/READ workaround required
- * for buggy hardware
- */
-
- intrcr = 0L;
- M1575_AM_PUT32(M1575_INTRCR_REG, intrcr);
- intrcr = M1575_AM_GET32(M1575_INTRCR_REG);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* initialize the audio state structures */
- if ((audio1575_init_state(statep, dip)) != AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() init state structure failure");
- goto error_pci_disable;
- }
-
- /* from here on, must destroy the mutex on error */
- mutex_init(&statep->m1575_intr_mutex, NULL, MUTEX_DRIVER,
- DDI_INTR_PRI(statep->m1575_intr_pri));
-
- /* allocate play and record sample buffers */
- if ((audio1575_alloc_sample_buf(statep, M1575_DMA_PCM_OUT,
- statep->m1575_play_buf_size) == AUDIO_FAILURE) ||
- (audio1575_alloc_sample_buf(statep, M1575_DMA_PCM_IN,
- statep->m1575_record_buf_size) == AUDIO_FAILURE)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() couldn't alloc sample buffers");
- goto error_destroy;
- }
-
- /* initialize audio controller and AC97 codec */
- if (audio1575_chip_init(statep, M1575_INIT_NO_RESTORE) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() failure to init chip");
- goto error_dealloc;
- }
-
- /* save private state */
- audio_sup_set_private(statep->m1575_ahandle, statep);
-
- /* call the mixer attach() routine */
- if (am_attach(statep->m1575_ahandle, cmd, &statep->m1575_ad_info) !=
- AUDIO_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() am_attach() failure");
- goto error_dealloc;
- }
-
- /* set up kernel statistics */
- if ((statep->m1575_ksp = kstat_create(M1575_NAME, instance,
- M1575_NAME, "controller", KSTAT_TYPE_INTR, 1,
- KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(statep->m1575_ksp);
- }
-
- /* now add our interrupt handler */
- if (ddi_intr_add_handler(statep->m1575_h_table[0],
- (ddi_intr_handler_t *)audio1575_intr, (caddr_t)statep, NULL)) {
- audio_sup_log(statep->m1575_ahandle,
- CE_WARN, "!attach() ddi_intr_add_handler() failure");
- ATRACE("audio1575_attach() ddi_intr_add_handler() failure",
- NULL);
- goto error_kstat;
- }
-
- /* Enable PCI Interrupts */
- M1575_PCI_PUT8(M1575_PCIMISC_REG, M1575_PCIMISC_INTENB);
-
- /* enable audio interrupts */
- if (ddi_intr_enable(statep->m1575_h_table[0]) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!attach() - ddi_intr_enable() failure");
- ATRACE("audio1575_attach() ddi_add_intr failure", NULL);
- goto error_intr_enable;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_attach() returning DDI_SUCCESS", NULL);
-
- return (DDI_SUCCESS);
-
-error_intr_enable:
- ATRACE("audio1575_attach() error_intr_enable", NULL)
- /* Disable PCI Interrupts */
- M1575_PCI_PUT8(M1575_PCIMISC_REG, 0);
- (void) ddi_intr_remove_handler(statep->m1575_h_table[0]);
-
-error_kstat:
- ATRACE("audio1575_attach() error_kstat", NULL);
- if (statep->m1575_ksp) {
- kstat_delete(statep->m1575_ksp);
- }
-
- (void) am_detach(statep->m1575_ahandle, DDI_DETACH);
-
-error_dealloc:
- ATRACE("audio1575_attach() error_dealloc", NULL);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_IN);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_OUT);
-
-error_destroy:
- ATRACE("audio1575_attach() error_destroy", statep);
- (void) ddi_intr_free(statep->m1575_h_table[0]);
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
- mutex_destroy(&statep->m1575_intr_mutex);
-
-error_pci_disable:
- ATRACE("audio1575_attach() error_pci_disable", NULL)
- audio1575_pci_disable(statep);
-
-error_unmap:
- ATRACE("audio1575_attach() error_unmap", NULL);
- audio1575_unmap_regs(statep);
-
-error_audiosup:
- ATRACE("audio1575_attach() error_audiosup", statep);
- (void) audio_sup_unregister(statep->m1575_ahandle);
-
-error_state:
- ATRACE("audio1575_attach() error_state", statep);
- ddi_soft_state_free(audio1575_statep, instance);
-
- ATRACE("audio1575_attach() returning DDI_FAILURE", NULL);
-
- return (DDI_FAILURE);
-
-} /* audio1575_attach() */
-
-/*
- * audio1575_detach()
- *
- * Description:
- * Detach an instance of the audio1575 driver. After the Codec is detached
- * we call am_detach() and audio_sup_register() so they may do their work.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-audio1575_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- audio1575_state_t *statep;
- int instance;
-
- instance = ddi_get_instance(dip);
-
- ATRACE("audio1575_detach() entering", instance);
-
- if ((statep = ddi_get_soft_state(audio1575_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failure",
- audio1575_name, instance);
- ATRACE("audio1575_detach() get soft state failure", instance);
-
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("audio1575_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT((statep->m1575_flags & M1575_DMA_SUSPENDED) !=
- M1575_DMA_SUSPENDED);
-
- /* stop all new operations */
- statep->m1575_flags |= M1575_DMA_SUSPENDED;
-
- /*
- * stop all DMA operations
- */
- (void) audio1575_dma_stop(statep);
-
- /*
- * Save the controller state. The Codec's state is
- * already in codec_shadow[].
- */
- if (audio_sup_save_state(statep->m1575_ahandle,
- AUDIO_ALL_DEVICES, AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!detach() audio save failure");
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_detach() SUSPEND successful", statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (DDI_SUCCESS);
-
- default:
- ATRACE("audio1575_detach() unknown command", cmd);
-
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!%s%d: detach() unknown command: 0x%x",
- audio1575_name, instance, cmd);
-
- return (DDI_FAILURE);
- }
-
- /* stop DMA engines */
- mutex_enter(&statep->m1575_intr_mutex);
- audio1575_dma_stop(statep);
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* disable interrupts */
- (void) ddi_intr_disable(statep->m1575_h_table[0]);
-
- /* Remove the interrupt handler */
- (void) ddi_intr_remove_handler(statep->m1575_h_table[0]);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the AD1981B codec */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-
- /* turn off the AC_LINK clock */
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 4);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* detach audio mixer */
- (void) am_detach(statep->m1575_ahandle, cmd);
-
- /*
- * call the audio support module's detach routine to remove this
- * driver completely from the audio driver architecture.
- */
- (void) audio_sup_unregister(statep->m1575_ahandle);
-
- /* free the interrupt handle */
- (void) ddi_intr_free(statep->m1575_h_table[0]);
-
- /* free memory */
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
-
- /* free DMA memory */
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_IN);
- audio1575_free_sample_buf(statep, M1575_DMA_PCM_OUT);
-
- /* free the kernel statistics structure */
- if (statep->m1575_ksp) {
- kstat_delete(statep->m1575_ksp);
- }
-
- /* Disable PCI I/O and Memory Spaces */
- audio1575_pci_disable(statep);
-
- /* unmap the registers */
- audio1575_unmap_regs(statep);
-
- /* destroy the state mutex */
- mutex_destroy(&statep->m1575_intr_mutex);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(audio1575_statep, instance);
-
- ATRACE("audio1575_detach() returning success", NULL);
-
- return (DDI_SUCCESS);
-
-} /* audio1575_detach */
-
-/*
- * audio1575_intr()
- *
- * Description:
- * Interrupt service routine for both play and record. For play we
- * get the next buffers worth of audio. For record we send it on to
- * the mixer.
- *
- * Each of buffer descriptor has a field IOC(interrupt on completion)
- * When both this and the IOC bit of correspondent dma control register
- * is set, it means that the controller should issue an interrupt upon
- * completion of this buffer. Note that in the clearing of the interrupts
- * below that the PCM IN and PCM out interrupts ar cleared by their
- * respective control registers and not by writing a '1' to the INTRSR
- * the interrupt status register. Only CPRINTR,SPINTR,and GPIOINTR
- * require a '1' written to the INTRSR register to clear those
- * interrupts. See comments below.
- *
- * Arguments:
- * caddr_t arg Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-audio1575_intr(caddr_t arg)
-{
- audio1575_state_t *statep = (audio1575_state_t *)arg;
- uint32_t intrsr;
- uint16_t sr;
-
- ATRACE("in audio1575_intr()", statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* check if device is interrupting */
- if (intrsr == 0) {
- if (statep->m1575_ksp) {
- /* increment the spurious ino5 interrupt cnt */
- M1575_KIOP(statep)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_intr() not our interrupt", intrsr);
-
- return (DDI_INTR_UNCLAIMED);
- }
-
- /*
- * The Uli M1575 generates an interrupt for each interrupt
- * type. therefore we only process one interrupt type
- * per invocation of the audio1575_intr() routine.
- * WARNING: DO NOT attempt to optimize this by looping
- * until the INTRSR register is clear as this will
- * generate spurious ino5 interrupts.
- */
- if (intrsr & M1575_INTRSR_PCMIINTR) {
- /* Clear PCM IN interrupt */
- ATRACE("audio1575_intr() PCMIINTR", intrsr);
- sr = M1575_AM_GET16(M1575_PCMISR_REG);
- M1575_AM_PUT16(M1575_PCMISR_REG, sr & M1575_STATUS_CLR);
- /*
- * Note: This interrupt is not cleared by writing a '1'
- * to the M1575_INTRSR_REG according to the M1575 Super I/O
- * data sheet on page 189.
- */
-
- if (statep->m1575_flags & M1575_DMA_RECD_STARTED) {
- audio1575_reclaim_record_buf(statep);
- (void) audio1575_prepare_record_buf(statep);
- }
- } else if (intrsr & M1575_INTRSR_PCMOINTR) {
- /* Clear PCM OUT interrupt */
- ATRACE("audio1575_intr() PCMOINTR", intrsr);
- sr = M1575_AM_GET16(M1575_PCMOSR_REG);
- M1575_AM_PUT16(M1575_PCMOSR_REG, sr & M1575_STATUS_CLR);
- /*
- * Note: This interrupt is not cleared by writing a '1'
- * to the M1575_INTRSR_REG according to the M1575 Super I/O
- * data sheet on page 189.
- */
-
- if (statep->m1575_flags & M1575_DMA_PLAY_STARTED) {
- audio1575_reclaim_play_buf(statep);
- (void) audio1575_fill_play_buf(statep);
- }
- } else if (intrsr & M1575_INTRSR_SPRINTR) {
- /* Clear Status Register Available Interrupt */
- ATRACE("audio1575_intr() SPRINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_SPRINTR);
-
- } else if (intrsr & M1575_INTRSR_CPRINTR) {
- /* Clear Command Register Available Interrupt */
- ATRACE("audio1575_intr() CPRINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_CPRINTR);
- } else if (intrsr & M1575_INTRSR_GPIOINTR) {
- /* Clear General Purpose I/O Register Interrupt */
- ATRACE("audio1575_intr() GPIOINTR", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, M1575_INTRSR_GPIOINTR);
- } else {
- /* Clear Unknown Interrupt */
- ATRACE("audio1575_intr() Unknown Interrupt", intrsr);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- }
-
- /* update the kernel interrupt statistics */
- if (statep->m1575_ksp) {
- M1575_KIOP(statep)->intrs[KSTAT_INTR_HARD]++;
- }
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_intr() done", statep);
-
- return (DDI_INTR_CLAIMED);
-
-} /* audio1575_intr() */
-
-
-/* *********************** Mixer Entry Point Routines ******************* */
-
-/*
- * audio1575_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set,
- * or the parameter couldn't be set
- */
-static int
-audio1575_ad_set_config(audiohdl_t ahandle, int stream, int command,
- int dir, int arg1, int arg2)
-{
- audio1575_state_t *statep;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_set_config() entering", stream);
- ATRACE("audio1575_ad_set_config() command", command);
- ATRACE("audio1575_ad_set_config() dir", dir);
- ATRACE("audio1575_ad_set_config() arg1", arg1);
- ATRACE("audio1575_ad_set_config() arg2", arg2);
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, of balance on gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 == left, 1 == right
- */
- rc = audio1575_set_gain(statep, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of in ports, as well as which ports
- * are modifiable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
- rc = audio1575_set_port(statep, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * AUDIO_MIN_GAIN <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
- rc = audio1575_set_monitor_gain(statep, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 == mute, 0 == enable
- * arg2 --> not used
- */
- if (arg1) { /* mute */
- (void) audio1575_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- (void) audio1575_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, HPVR_MUTE);
- (void) audio1575_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MMVR_MUTE);
- rc = AUDIO_SUCCESS;
- } else { /* not muted */
- /* by setting the port we unmute only active ports */
- rc = audio1575_set_port(statep,
- AUDIO_PLAY, statep->m1575_output_port);
- }
-
- break;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- if (arg1) { /* enable */
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, MICVR_20dB_BOOST);
- statep->m1575_ad_info.ad_add_mode |=
- AM_ADD_MODE_MIC_BOOST;
- } else { /* disable */
- (void) audio1575_and_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- (uint16_t)~MICVR_20dB_BOOST);
- statep->m1575_ad_info.ad_add_mode &=
- ~AM_ADD_MODE_MIC_BOOST;
- }
-
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- *
- * AM_SET_GAIN_BAL
- * AM_SET_MONO_MIC
- * AM_BASS_BOOST
- * AM_MID_BOOST
- * AM_TREBLE_BOOST
- * AM_LOUDNESS
- */
- ATRACE("audio1575_ad_set_config() unsupported cmd", command);
- break;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_set_config() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_set_config() */
-
-/*
- * audio1575_ad_set_format()
- *
- * Description:
- * This routine is used to set a new audio control data format.
- * We only support 16 bit signed linear.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number
- * int dir AUDIO_PLAY or AUDIO_RECORD
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 16
- * int encoding Encoding method, linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-static int
-audio1575_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- audio1575_state_t *statep;
- int rc = AUDIO_FAILURE;
-
- ASSERT(precision == AUDIO_PRECISION_16);
- ASSERT(channels == AUDIO_CHANNELS_STEREO);
-
- ATRACE("audio1575_ad_set_format() entering", stream);
- ATRACE("audio1575_ad_set_format() dir", dir);
- ATRACE("audio1575_ad_set_format() sample_rate", sample_rate);
- ATRACE("audio1575_ad_set_format() channels", channels);
- ATRACE("audio1575_ad_set_format() precision", precision);
- ATRACE("audio1575_ad_set_format() encoding", encoding);
-
- if (encoding != AUDIO_ENCODING_LINEAR) {
- ATRACE("audio1575_ad_set_format() bad encoding", encoding);
- return (rc);
- }
-
- /* get the soft state structure */
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- switch (sample_rate) {
- case M1575_SAMPR8000:
- case M1575_SAMPR9600:
- case M1575_SAMPR11025:
- case M1575_SAMPR16000:
- case M1575_SAMPR18900:
- case M1575_SAMPR22050:
- case M1575_SAMPR27420:
- case M1575_SAMPR32000:
- case M1575_SAMPR33075:
- case M1575_SAMPR37800:
- case M1575_SAMPR44100:
- case M1575_SAMPR48000:
- rc = AUDIO_SUCCESS;
- break;
-
- default:
- ATRACE("audio1575_ad_set_format() bad sample rate",
- sample_rate);
- goto done;
- }
-
- switch (dir) {
- case AUDIO_PLAY:
- rc = audio1575_write_ac97(statep,
- AC97_EXTENDED_FRONT_DAC_RATE_REGISTER, sample_rate);
- statep->m1575_psample_rate = sample_rate;
- statep->m1575_pchannels = channels;
- statep->m1575_pprecision = precision;
- break;
-
- case AUDIO_RECORD:
- rc = audio1575_write_ac97(statep,
- AC97_EXTENDED_LR_DAC_RATE_REGISTER, sample_rate);
- statep->m1575_csample_rate = sample_rate;
- statep->m1575_cchannels = channels;
- statep->m1575_cprecision = precision;
- break;
-
- default:
- rc = AUDIO_FAILURE;
- ATRACE("audio1575_set_format() bad audio dir", dir);
- break;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_set_format() returning", rc);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- return (rc);
-
-} /* audio1575_ad_set_format() */
-
-/*
- * audio1575_ad_start_play()
- *
- * Description:
- * This routine starts the playback DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Play not started/restarted, no audio to play
- */
-static int
-audio1575_ad_start_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
- uint8_t pcmocr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_start_play() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* get ptr to play buffer */
- buf = &statep->m1575_play_buf;
-
- /* we are already PLAYING audio */
- if (statep->m1575_flags & M1575_DMA_PLAY_STARTED) {
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* If play was PAUSED then Start Playing */
- if (statep->m1575_flags & M1575_DMA_PLAY_PAUSED) {
- if ((audio1575_dma_resume(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
-
- statep->m1575_flags &= ~M1575_DMA_PLAY_PAUSED;
- statep->m1575_flags |= M1575_DMA_PLAY_STARTED;
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* we are here for the first time to play audio */
- if (!buf->io_started) {
- /* Prepare the DMA Engine */
- if ((audio1575_dma_pause(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- goto done;
- }
- /* set last valid index to zero */
- M1575_AM_PUT8(M1575_PCMOLVIV_REG, 0);
-
- /* set the buffer base */
- M1575_AM_PUT32(M1575_PCMOBDBAR_REG,
- statep->m1575_bdl_phys_pout);
- buf->head = 0;
- buf->tail = 0;
- buf->avail = M1575_PLAY_BUFS;
-
- /* Set the IOCE bit */
- pcmocr = M1575_AM_GET8(M1575_PCMOCR_REG);
- pcmocr |= M1575_PCMOCR_IOCE;
- M1575_AM_PUT8(M1575_PCMOCR_REG, pcmocr);
- }
-
- if ((audio1575_fill_play_buf(statep)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- } else {
- buf->io_started = B_TRUE;
- statep->m1575_flags |= M1575_DMA_PLAY_STARTED;
- rc = AUDIO_SUCCESS;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_start_play() */
-
-/*
- * audio1575_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- uint32_t dmacr;
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ATRACE("audio1575_ad_pause_play() entering", ahandle);
- ATRACE("audio1575_ad_pause_play() stream", stream);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* do nothing if not running */
- if ((statep->m1575_flags & M1575_DMA_PLAY_STARTED) == 0) {
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if ((dmacr & M1575_DMACR_PCMOSTART) !=
- M1575_DMACR_PCMOSTART) {
- ATRACE("audio1575_pause_play() DMA engine "
- "already stopped", statep);
- goto done;
- }
- }
-
- /* Stop the DMA and set DMA pause flag */
- if ((audio1575_dma_pause(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_PLAY_PAUSED;
- ATRACE("audio1575_ad_pause_play() failure", NULL);
- goto done;
- }
-
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
- statep->m1575_flags |= M1575_DMA_PLAY_PAUSED;
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ATRACE("audio1575_ad_pause_play() returning", NULL);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
-} /* audio1575_ad_pause_play() */
-
-/*
- * audio1575_ad_stop_play()
- *
- * Description:
- * This routine stops the playback DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream Codecs,
- * which is not how we program the device
- * for now.
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
-
- ATRACE("audio1575_ad_stop_play() entering", ahandle);
- ATRACE("audio1575_ad_stop_play() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the DMA Play engine */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_OUT)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_ad_stop_play() failure", NULL);
- goto done;
- }
-
- /* Clear the PCM Out Control Register */
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
-
- /* clear the play started and paused flags */
- buf = &statep->m1575_play_buf;
- buf->io_started = B_FALSE;
- statep->m1575_flags &= ~(M1575_DMA_PLAY_STARTED | \
- M1575_DMA_PLAY_PAUSED | M1575_DMA_PLAY_EMPTY);
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_stop_play() returning", NULL);
-
-} /* audio1575_ad_stop_play() */
-
-/*
- * audio1575_ad_start_record()
- *
- * Description:
- * This routine starts the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which isn't going to apply for record
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Record not started
- */
-static int
-audio1575_ad_start_record(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
- uint8_t pcmicr;
- int rc = AUDIO_FAILURE;
-
- ATRACE("audio1575_ad_start_record() entering", ahandle);
- ATRACE("audio1575_ad_start_record() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* get our record buffer ptr */
- buf = &statep->m1575_record_buf;
-
- if (statep->m1575_flags & M1575_DMA_RECD_STARTED) {
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /* Prepare DMA engine */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_IN)) ==
- AUDIO_FAILURE) {
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- goto done;
- }
-
- /* DMA Engine reset was successful */
- buf->head = 0;
- buf->tail = 0;
- buf->avail = M1575_REC_BUFS;
-
- /* Set the IOCE bit */
- pcmicr = M1575_AM_GET8(M1575_PCMICR_REG);
- pcmicr |= M1575_PCMICR_IOCE;
- M1575_AM_PUT8(M1575_PCMICR_REG, pcmicr);
-
- /* set last valid index to 0 */
- M1575_AM_PUT8(M1575_PCMILVIV_REG, 0);
-
- /* setup the Base Address Register */
- M1575_AM_PUT32(M1575_PCMIBDBAR_REG, statep->m1575_bdl_phys_pin);
-
- if ((audio1575_prepare_record_buf(statep)) ==
- AUDIO_SUCCESS) {
- statep->m1575_flags |= M1575_DMA_RECD_STARTED;
- rc = AUDIO_SUCCESS;
- } else {
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- }
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* audio1575_ad_start_record() */
-
-/*
- * audio1575_ad_stop_record()
- *
- * Description:
- * This routine stops the PCM in DMA engine
- *
- * Arguments:
- * audiohdl_t ahandle Handle for this driver
- * int stream Stream number for multi-stream
- * Codecs, which isn't going to apply
- * for record
- *
- * Returns:
- * void
- */
-static void
-audio1575_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- audio1575_state_t *statep;
- m1575_sample_buf_t *buf;
-
- ATRACE("audio1575_ad_stop_record() entering", ahandle);
- ATRACE("audio1575_ad_stop_record() stream", stream);
-
- statep = audio_sup_get_private(ahandle);
- ASSERT(statep);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
- mutex_enter(&statep->m1575_intr_mutex);
-
- /* reset the DMA input registers */
- if ((audio1575_dma_reset(statep, M1575_DMA_PCM_IN)) ==
- AUDIO_FAILURE) {
- ATRACE("audio1575_ad_stop_record() failure", NULL);
- goto done;
- }
-
- /* clear the PCM In Control Register */
- M1575_AM_PUT8(M1575_PCMICR_REG, 0);
-
- /* clear the record started flag */
- statep->m1575_flags &= ~M1575_DMA_RECD_STARTED;
- buf = &statep->m1575_record_buf;
- buf->io_started = B_FALSE;
-
-done:
- mutex_exit(&statep->m1575_intr_mutex);
-
- ASSERT(!mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_ad_stop_record() returning", NULL);
-
-} /* audio1575_ad_stop_record() */
-
-
-/* *********************** Local Routines *************************** */
-
-/*
- * audio1575_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure
- *
- * CAUTION: This routine cannot allocate resources, unless it frees
- * them before returning from an error. Also, error_destroy:
- * in audio1575_attach() would need to be fixed as well.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's
- * dev_info struct
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-audio1575_init_state(audio1575_state_t *statep, dev_info_t *dip)
-{
- int rints;
- int pints;
- int count = 0;
- int actual = 0;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio1575_init_state() entering", NULL);
-
- statep->m1575_dip = dip;
-
- /* default to 5 bit volume */
- statep->m1575_vol_bits_mask = 5;
-
- /* see if we support internal CDROM */
- statep->m1575_cdrom = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cdrom", 0);
-
- /* get the mode from the .conf file */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- statep->m1575_mode = AM_MIXER_MODE;
- } else {
- statep->m1575_mode = AM_COMPAT_MODE;
- }
-
- /* get play interrupts */
- pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", M1575_INTS);
- if (pints > M1575_MAX_INTS) {
- ATRACE("audio1575_init_state() "
- "play interrupt rate too high, resetting", pints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too high, %d, resetting to %d",
- pints, M1575_INTS);
- pints = M1575_INTS;
- } else if (pints < M1575_MIN_INTS) {
- ATRACE("audio1575_init_state() "
- "play interrupt rate too low, resetting", pints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "play interrupt rate set too low, %d, resetting to %d",
- pints, M1575_INTS);
- pints = M1575_INTS;
- }
-
- /* get record interrupts */
- rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", M1575_INTS);
- if (rints > M1575_MAX_INTS) {
- ATRACE("audio1575_init_state() "
- "record interrupt rate too high, resetting", rints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too high, %d, resetting to %d",
- rints, M1575_INTS);
- rints = M1575_INTS;
- } else if (rints < M1575_MIN_INTS) {
- ATRACE("audio1575_init_state() "
- "record interrupt rate too low, resetting", rints);
- audio_sup_log(statep->m1575_ahandle, CE_NOTE,
- "init_state() "
- "record interrupt rate set too low, %d "
- "resetting to %d", rints, M1575_INTS);
- rints = M1575_INTS;
- }
-
- /* get supported interrupt types */
- rc = ddi_intr_get_supported_types(dip, &statep->m1575_intr_type);
-
- if ((rc != DDI_SUCCESS) ||
- (!(statep->m1575_intr_type & DDI_INTR_TYPE_FIXED))) {
- audio_sup_log(statep->m1575_ahandle,
- CE_WARN, "!init_state() Fixed type interrupts not "
- "supported");
- ATRACE("audio1575_init_state() fixed type INTR not supported",
- NULL);
- goto error_intr;
- }
-
- /* make sure we only have one fixed type interrupt */
- rc = ddi_intr_get_nintrs(dip, DDI_INTR_TYPE_FIXED, &count);
-
- if ((rc != DDI_SUCCESS) || (count != 1)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() no fixed interrupts");
- ATRACE("audio1575_init_state() no fixed interrupts",
- NULL);
- goto error_intr;
- }
-
- /* allocate interrupt table */
- statep->m1575_h_table = kmem_zalloc(sizeof (ddi_intr_handle_t),
- KM_SLEEP);
-
- rc = ddi_intr_alloc(dip, statep->m1575_h_table, DDI_INTR_TYPE_FIXED, 0,
- count, &actual, DDI_INTR_ALLOC_NORMAL);
- if ((rc != DDI_SUCCESS) || (actual != 1)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() ddi_intr_alloc() failure");
- ATRACE("audio1575_init_state() ddi_intr_alloc failure", actual);
- goto error_alloc;
- }
-
- ASSERT(count == actual);
- /* Get the interrupt priority for initializing the m1575_intr_mutex */
- if ((ddi_intr_get_pri(statep->m1575_h_table[0],
- &statep->m1575_intr_pri)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() ddi_intr_get_pri() failure");
- ATRACE("audio1575_init_state() ddi_intr_get_pri() failure",
- NULL);
- goto error_free;
- }
-
- /* test for a high level interrupt */
- if (statep->m1575_intr_pri >= ddi_intr_get_hilevel_pri()) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!init_state() unsupported high level interrupt");
- ATRACE("audio1575_init_state() high level interrupt not "
- "supported", NULL);
- goto error_free;
- }
-
- /* fill in the device default state */
- statep->m1575_defaults.play.sample_rate = M1575_DEFAULT_SR;
- statep->m1575_defaults.play.channels = M1575_DEFAULT_CH;
- statep->m1575_defaults.play.precision = M1575_DEFAULT_PREC;
- statep->m1575_defaults.play.encoding = M1575_DEFAULT_ENC;
- statep->m1575_defaults.play.gain = M1575_DEFAULT_PGAIN;
- statep->m1575_defaults.play.port = AUDIO_SPEAKER;
- statep->m1575_defaults.play.avail_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT | AUDIO_HEADPHONE;
- statep->m1575_defaults.play.mod_ports =
- AUDIO_SPEAKER | AUDIO_LINE_OUT | AUDIO_HEADPHONE;
- statep->m1575_defaults.play.buffer_size = M1575_BSIZE;
- statep->m1575_defaults.play.balance = M1575_DEFAULT_BAL;
- statep->m1575_defaults.record.sample_rate = M1575_DEFAULT_SR;
- statep->m1575_defaults.record.channels = M1575_DEFAULT_CH;
- statep->m1575_defaults.record.precision = M1575_DEFAULT_PREC;
- statep->m1575_defaults.record.encoding = M1575_DEFAULT_ENC;
- statep->m1575_defaults.record.gain = M1575_DEFAULT_RGAIN;
- statep->m1575_defaults.record.port = AUDIO_MICROPHONE;
- statep->m1575_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->m1575_defaults.record.mod_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- statep->m1575_defaults.record.buffer_size = M1575_BSIZE;
- statep->m1575_defaults.record.balance = M1575_DEFAULT_BAL;
-
- statep->m1575_defaults.monitor_gain = M1575_DEFAULT_MONITOR_GAIN;
- statep->m1575_defaults.output_muted = B_FALSE;
- statep->m1575_defaults.ref_cnt = B_FALSE;
- statep->m1575_defaults.hw_features =
- AUDIO_HWFEATURE_DUPLEX|AUDIO_HWFEATURE_PLAY|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_RECORD;
- statep->m1575_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- if (statep->m1575_cdrom) {
- statep->m1575_defaults.record.avail_ports |= AUDIO_CD;
- statep->m1575_defaults.record.mod_ports |= AUDIO_CD;
- }
-
- statep->m1575_psample_rate = statep->m1575_defaults.play.sample_rate;
- statep->m1575_pchannels = statep->m1575_defaults.play.channels;
- statep->m1575_pprecision = statep->m1575_defaults.play.precision;
- statep->m1575_csample_rate = statep->m1575_defaults.record.sample_rate;
- statep->m1575_cchannels = statep->m1575_defaults.record.channels;
- statep->m1575_cprecision = statep->m1575_defaults.record.precision;
-
- /*
- * fill in the ad_info structure
- */
- statep->m1575_ad_info.ad_mode = statep->m1575_mode;
- statep->m1575_ad_info.ad_int_vers = AM_VERSION;
- statep->m1575_ad_info.ad_add_mode = NULL;
- statep->m1575_ad_info.ad_codec_type = AM_TRAD_CODEC;
- statep->m1575_ad_info.ad_defaults = &statep->m1575_defaults;
- statep->m1575_ad_info.ad_play_comb = audio1575_combinations;
- statep->m1575_ad_info.ad_rec_comb = audio1575_combinations;
- statep->m1575_ad_info.ad_entry = &audio1575_entry;
- statep->m1575_ad_info.ad_dev_info = &statep->m1575_dev_info;
- statep->m1575_ad_info.ad_diag_flags = AM_DIAG_INTERNAL_LOOP;
- statep->m1575_ad_info.ad_diff_flags =
- AM_DIFF_SR | AM_DIFF_CH | AM_DIFF_PREC | AM_DIFF_ENC;
- statep->m1575_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- statep->m1575_ad_info.ad_misc_flags = AM_MISC_RP_EXCL;
- statep->m1575_ad_info.ad_misc_flags |= AM_MISC_MONO_DUP;
- statep->m1575_ad_info.ad_translate_flags = AM_MISC_8_R_TRANSLATE;
- statep->m1575_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- statep->m1575_ad_info.ad_play.ad_mixer_srs =
- audio1575_mixer_sample_rates;
- statep->m1575_ad_info.ad_play.ad_compat_srs =
- audio1575_compat_sample_rates;
- statep->m1575_ad_info.ad_play.ad_conv = &am_src2;
- statep->m1575_ad_info.ad_play.ad_sr_info = NULL;
- statep->m1575_ad_info.ad_play.ad_chs = audio1575_channels;
- statep->m1575_ad_info.ad_play.ad_int_rate = pints;
- statep->m1575_ad_info.ad_play.ad_max_chs = M1575_MAX_OUT_CHANNELS;
- statep->m1575_ad_info.ad_play.ad_bsize = M1575_BSIZE;
-
- /* record capabilities */
- statep->m1575_ad_info.ad_record.ad_mixer_srs =
- audio1575_mixer_sample_rates;
- statep->m1575_ad_info.ad_record.ad_compat_srs =
- audio1575_compat_sample_rates;
- statep->m1575_ad_info.ad_record.ad_conv = &am_src2;
- statep->m1575_ad_info.ad_record.ad_sr_info = NULL;
- statep->m1575_ad_info.ad_record.ad_chs = audio1575_channels;
- statep->m1575_ad_info.ad_record.ad_int_rate = rints;
- statep->m1575_ad_info.ad_record.ad_max_chs = M1575_MAX_CHANNELS;
- statep->m1575_ad_info.ad_record.ad_bsize = M1575_BSIZE;
-
- /* fill in device info strings */
- (void) strcpy(statep->m1575_dev_info.name, M1575_DEV_NAME);
- (void) strcpy(statep->m1575_dev_info.config, M1575_DEV_CONFIG);
- (void) strcpy(statep->m1575_dev_info.version, M1575_DEV_VERSION);
-
- /* compute play and record buffer sizes */
- statep->m1575_play_buf_size = M1575_SAMPR48000 *
- AUDIO_CHANNELS_STEREO * (AUDIO_PRECISION_16 >>
- AUDIO_PRECISION_SHIFT) / pints;
- statep->m1575_play_buf_size += M1575_MOD_SIZE -
- (statep->m1575_play_buf_size % M1575_MOD_SIZE);
- statep->m1575_record_buf_size = M1575_SAMPR48000 *
- AUDIO_CHANNELS_STEREO * (AUDIO_PRECISION_16 >>
- AUDIO_PRECISION_SHIFT) / rints;
- statep->m1575_record_buf_size += M1575_MOD_SIZE -
- (statep->m1575_record_buf_size % M1575_MOD_SIZE);
-
- statep->m1575_flags = 0;
-
- ATRACE("audio1575_init_state() returning", NULL);
-
- return (AUDIO_SUCCESS);
-
-error_free:
- (void) ddi_intr_free(statep->m1575_h_table[0]);
-error_alloc:
- kmem_free(statep->m1575_h_table, sizeof (ddi_intr_handle_t));
-error_intr:
- ATRACE("audio1575_init_state() failure", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_init_state() */
-
-/*
- * audio1575_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. Finally, the registers are mapped in.
- *
- * CAUTION: Make sure all errors call audio_sup_log().
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-audio1575_map_regs(dev_info_t *dip, audio1575_state_t *statep)
-{
- ddi_dma_cookie_t cookie;
- uint_t count;
-
- ATRACE("in audio1575_map_regs() entering", statep);
-
- statep->m1575_res_flags = 0;
-
- /* Check for fault management capabilities */
- if (DDI_FM_ACC_ERR_CAP(ddi_fm_capable(dip))) {
- dev_attr.devacc_attr_access = DDI_FLAGERR_ACC;
- }
-
- /* map the M1575 Audio PCI Cfg Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_PCICFG_SPACE,
- (caddr_t *)&statep->m1575_pci_regs, 0, 0, &dev_attr,
- &statep->m1575_pci_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() PCI Config mapping failure");
- ATRACE("audio1575_map_regs() PCI Cfg Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_PCI_REGS;
-
- /* map the M1575 Audio registers in PCI IO Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_IO_SPACE,
- (caddr_t *)&statep->m1575_am_regs, 0, 0, &dev_attr,
- &statep->m1575_am_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() Audio IO mapping failure");
- ATRACE("audio1575_map_regs() PCI IO Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_AM_REGS;
-
- /* map the M1575 Audio registers in PCI MEM32 Space */
- if ((ddi_regs_map_setup(dip, M1575_AUDIO_MEM_SPACE,
- (caddr_t *)&statep->m1575_bm_regs, 0, 0, &dev_attr,
- &statep->m1575_bm_regs_handle)) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() Audio MEM32 mapping failure");
- ATRACE("audio1575_map_regs() PCI MEM32 Space failure", NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_BM_REGS;
-
- /*
- * Here we allocate DMA memory for the buffer descriptor list.
- * we allocate adjacent DMA memory for all DMA engines.
- */
- if (ddi_dma_alloc_handle(dip, &bdlist_dma_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &statep->m1575_bdl_dma_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() ddi_dma_alloc_handle "
- "(bdlist) failure");
- ATRACE("audio1575_map_regs() ddi_dma_alloc_handle() failure",
- NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_HANDLE;
-
- /*
- * we allocate all buffer descriptors lists in contiguous dma memory.
- */
- if (ddi_dma_mem_alloc(statep->m1575_bdl_dma_handle,
- sizeof (m1575_bd_entry_t) * M1575_BD_NUMS * 2,
- &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- (caddr_t *)&statep->m1575_bdl_virtual, &statep->m1575_bdl_size,
- &statep->m1575_bdl_acc_handle) != DDI_SUCCESS) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() ddi_dma_mem_alloc(bdlist) failure");
- ATRACE("audio1575_map_regs() ddi_dma_mem_alloc(bdlist) failure",
- NULL);
- goto error;
- }
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_MEM;
-
- if (ddi_dma_addr_bind_handle(statep->m1575_bdl_dma_handle, NULL,
- (caddr_t)statep->m1575_bdl_virtual, statep->m1575_bdl_size,
- DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, &cookie,
- &count) != DDI_DMA_MAPPED) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!audio1575_map_regs() addr_bind_handle failure");
- ATRACE("audio1575_map_regs() ddi_dma_addr_bind_handle failure",
- NULL);
- goto error;
- }
-
- statep->m1575_bdl_virt_pin =
- (m1575_bd_entry_t *)(statep->m1575_bdl_virtual);
- statep->m1575_bdl_virt_pout =
- statep->m1575_bdl_virt_pin + M1575_BD_NUMS;
- statep->m1575_bdl_phys_pin = (uint32_t)(cookie.dmac_address);
- statep->m1575_bdl_phys_pout = statep->m1575_bdl_phys_pin +
- sizeof (m1575_bd_entry_t) * M1575_BD_NUMS;
- statep->m1575_res_flags |= M1575_RS_DMA_BDL_BIND;
-
- ATRACE("audio1575_map_regs() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-error:
- audio1575_unmap_regs(statep);
-
- ATRACE("audio1575_map_regs() returning AUDIO_FAILURE", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_map_regs() */
-
-/*
- * audio1575_unmap_regs()
- *
- * Description:
- * This routine unbinds the play and record DMA handles, frees
- * the DMA buffers and the unmaps control registers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_unmap_regs(audio1575_state_t *statep)
-{
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_BIND) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_BIND;
- (void) ddi_dma_unbind_handle(statep->m1575_bdl_dma_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_MEM) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_MEM;
- ddi_dma_mem_free(&statep->m1575_bdl_acc_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_DMA_BDL_HANDLE) {
- statep->m1575_res_flags &= ~M1575_RS_DMA_BDL_HANDLE;
- ddi_dma_free_handle(&statep->m1575_bdl_dma_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_BM_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_BM_REGS;
- ddi_regs_map_free(&statep->m1575_bm_regs_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_AM_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_AM_REGS;
- ddi_regs_map_free(&statep->m1575_am_regs_handle);
- }
-
- if (statep->m1575_res_flags & M1575_RS_PCI_REGS) {
- statep->m1575_res_flags &= ~M1575_RS_PCI_REGS;
- pci_config_teardown(&statep->m1575_pci_regs_handle);
- }
-
-} /* audio1575_unmap_regs() */
-
-/*
- * audio1575_alloc_sample_buf()
- *
- * Description:
- * This routine allocates DMA buffers for the sample buffer. It
- * allocates two DMA chunks (buffers) to the specified DMA engine
- * (sample buffer structure). The two data chunks will be bound
- * to the buffer descriptor entries of corresponding buffer
- * descriptor list, and be used to transfer audio sample data to
- * and from the audio controller.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- * M1575_DMA_PCM_IN ---PCM in DMA engine
- * M1575_DMA_PCM_OUT---PCM out DMA engine
- * int len The length of the DMA buffers
- *
- * Returns:
- * AUDIO_SUCCESS Allocating DMA buffers successfully
- * AUDIO_FAILURE Failed to allocate dma buffers
- */
-static int
-audio1575_alloc_sample_buf(audio1575_state_t *statep, int which, int len)
-{
- m1575_sample_buf_t *buf;
- m1575_bdlist_chunk_t *chunk;
- ddi_dma_cookie_t cookie;
- uint_t count;
- int i;
- int j;
- int handle_cnt = 0;
- int buf_cnt = 0;
- int bind_cnt = 0;
-
- ATRACE("audio1575_alloc_sample_buf() entering", which);
-
- switch (which) {
- case M1575_DMA_PCM_OUT:
- buf = &statep->m1575_play_buf;
- for (i = 0; i < M1575_PLAY_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- if (ddi_dma_alloc_handle(statep->m1575_dip,
- &sample_buf_dma_attr,
- DDI_DMA_SLEEP, NULL,
- &chunk->dma_handle) != DDI_SUCCESS) {
- goto error;
- }
- handle_cnt++;
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len,
- &dev_attr, DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &chunk->data_buf,
- &chunk->real_len, &chunk->acc_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
- buf_cnt++;
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle,
- NULL, chunk->data_buf, chunk->real_len,
- DDI_DMA_WRITE|DDI_DMA_STREAMING,
- DDI_DMA_SLEEP, NULL, &cookie, &count) !=
- DDI_DMA_MAPPED) {
- goto error;
- }
- bind_cnt++;
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
- break;
-
- case M1575_DMA_PCM_IN:
- buf = &statep->m1575_record_buf;
- for (i = 0; i < M1575_REC_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- if (ddi_dma_alloc_handle(statep->m1575_dip,
- &sample_buf_dma_attr, DDI_DMA_SLEEP,
- NULL, &chunk->dma_handle) !=
- DDI_SUCCESS) {
- goto error;
- }
- handle_cnt++;
-
- if (ddi_dma_mem_alloc(chunk->dma_handle, len,
- &dev_attr, DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &chunk->data_buf, &chunk->real_len,
- &chunk->acc_handle) != DDI_SUCCESS) {
- goto error;
- }
- buf_cnt++;
-
- if (ddi_dma_addr_bind_handle(chunk->dma_handle, NULL,
- chunk->data_buf, chunk->real_len,
- DDI_DMA_READ|DDI_DMA_STREAMING, DDI_DMA_SLEEP,
- NULL, &cookie, &count) != DDI_DMA_MAPPED) {
- goto error;
- }
- bind_cnt++;
-
- chunk->addr_phy = (uint32_t)cookie.dmac_address;
- }
- break;
-
- default:
- ATRACE("audio1575_alloc_sample_buf() unknown buffer type",
- which);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio1575_alloc_sample_buf() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-error:
- for (j = 0; j < bind_cnt; j++) {
- (void) ddi_dma_unbind_handle((buf->chunk[j].dma_handle));
- }
- for (j = 0; j < buf_cnt; j++) {
- ddi_dma_mem_free(&(buf->chunk[j].acc_handle));
- }
- for (j = 0; j < handle_cnt; j++) {
- ddi_dma_free_handle(&(buf->chunk[j].dma_handle));
- }
-
- ATRACE("audio1575_alloc_sample_buf() returning", AUDIO_FAILURE);
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_alloc_sample_buf() */
-
-/*
- * audio1575_free_sample_buf()
- *
- * Description:
- * This routine frees the DMA buffers of the sample buffer. The DMA
- * buffers were allocated by calling audio1575_alloc_sample_buf().
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int which Which sample buffer, PCM in or PCM out
- *
- * Returns:
- * void
- */
-static void
-audio1575_free_sample_buf(audio1575_state_t *statep, int which)
-{
- m1575_sample_buf_t *buf;
- m1575_bdlist_chunk_t *chunk;
- int i;
-
- ATRACE("audio1575_free_sample_buf() entering", statep);
-
- switch (which) {
- case M1575_DMA_PCM_IN:
- buf = &statep->m1575_record_buf;
- for (i = 0; i < M1575_REC_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- }
- break;
-
- case M1575_DMA_PCM_OUT:
- buf = &statep->m1575_play_buf;
- for (i = 0; i < M1575_PLAY_BUFS; i++) {
- chunk = &(buf->chunk[i]);
- (void) ddi_dma_unbind_handle(chunk->dma_handle);
- ddi_dma_mem_free(&chunk->acc_handle);
- ddi_dma_free_handle(&chunk->dma_handle);
- }
- break;
-
- default:
- ATRACE("audio1575_free_sample() unknown buffer type",
- which);
- break;
- }
-
- ATRACE("audio1575_free_sample_buf() returning", NULL);
-
-} /* audio1575_free_sample_buf() */
-
-/*
- * audio1575_reclaim_play_buf()
- *
- * Description:
- * When the audio controller finishes fetching the data from DMA
- * buffers, this routine will be called by interrupt handler to
- * reclaim the DMA buffers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_reclaim_play_buf(audio1575_state_t *statep)
-{
- m1575_sample_buf_t *buf;
- int16_t pcmociv;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* get the play buf ptr */
- buf = &statep->m1575_play_buf;
-
- /* get out current index value */
- pcmociv = M1575_AM_GET8(M1575_PCMOCIV_REG);
-
- while (buf->head != pcmociv) {
- buf->avail++;
- buf->head++;
- buf->head &= M1575_BD_MSK;
- }
-
-} /* audio1575_reclaim_play_buf() */
-
-/*
- * audio1575_init_ac97()
- *
- * Description:
- * This routine initializes the AC97 codec.
- * The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int restore If M1575_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio1575_init_ac97(audio1575_state_t *statep, int restore)
-{
- uint16_t sr;
- uint16_t *shadow;
- uint16_t tmp;
- uint16_t addr;
- int i;
- clock_t ticks;
-
- ATRACE("audio1575_init_ac97() entering", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ticks = drv_usectohz(AD1981_POWERON_DELAY_USEC);
-
- /* AC97 register reset */
- if (audio1575_reset_ac97(statep) != AUDIO_SUCCESS) {
- ATRACE("audio1575_ac97_init() codec not reset", NULL);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* turn on the AD1981B codec power and wait for analog i/o be ready */
- (void) audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &sr);
- (void) audio1575_write_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, sr & 0x00ff);
-
- /*
- * Wait 1 sec for the analog section to power up
- * checking every 10 ms.
- */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- (void) audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &sr);
- if ((sr & PCSR_POWERD_UP) == PCSR_POWERD_UP) {
- break;
- }
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* return failure if the codec did not power up */
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!failure to power up the AC97 Codec");
- ATRACE("audio1575_ac97_init() codec not powered up", sr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* point to our codec shadow registers */
- shadow = statep->m1575_codec_shadow;
-
- if (restore == M1575_INIT_NO_RESTORE) {
- for (i = 0; i < M1575_LAST_AC_REG; i += 2) {
- (void) audio1575_read_ac97(statep, i,
- &(shadow[M1575_CODEC_REG(i)]));
- }
-
- /* 02h - set master line out volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_MASTER_VOLUME_REGISTER)] =
- MVR_MUTE;
-
- /* 04h - set alternate line out volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_HEADPHONE_VOLUME_REGISTER)] =
- HPVR_MUTE;
-
- /* 06h - set master mono volume, muted, 0dB */
- shadow[M1575_CODEC_REG(AC97_MONO_MASTER_VOLUME_REGSITER)] =
- MMVR_MUTE | MMVR_0dB_ATTEN;
-
- /* 0ch - set phone input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_PHONE_VOLUME_REGISTER)] =
- PVR_MUTE|PVR_0dB_GAIN;
-
- /*
- * 0eh - set mic input, mute, +20dB attenuation
- * actually this is 30dB when MICVR_20dB_Boost
- * is set. (see misc. register 0x76 setting
- * of MIC_30dB_GAIN below.)
- */
- shadow[M1575_CODEC_REG(AC97_MIC_VOLUME_REGISTER)] =
- MICVR_MUTE | MICVR_20dB_BOOST | MICVR_0dB_GAIN;
- statep->m1575_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
-
- /* 10h - set line input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_LINE_IN_VOLUME_REGISTER)] =
- LIVR_MUTE|LIVR_RIGHT_0dB_GAIN|LIVR_LEFT_0dB_GAIN;
-
- /* 12h - set cd input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_CD_VOLUME_REGISTER)] =
- CDVR_MUTE|CDVR_RIGHT_0dB_GAIN|CDVR_LEFT_0dB_GAIN;
-
- /* 16h - set aux input, mute, 0dB attenuation */
- shadow[M1575_CODEC_REG(AC97_AUX_VOLUME_REGISTER)] =
- AUXVR_MUTE|AUXVR_RIGHT_0dB_GAIN|AUXVR_LEFT_0dB_GAIN;
-
- /* 18h - set PCM out input, NOT muted, 0dB gain */
- shadow[M1575_CODEC_REG(AC97_PCM_OUT_VOLUME_REGISTER)] =
- PCMOVR_RIGHT_0dB_GAIN|PCMOVR_LEFT_0dB_GAIN;
-
- /* 1ah - set input device as mic */
- shadow[M1575_CODEC_REG(AC97_RECORD_SELECT_CTRL_REGISTER)] =
- RSCR_R_MIC|RSCR_L_MIC;
-
- /* 1ch - set record gain to 0dB and not muted */
- shadow[M1575_CODEC_REG(AC97_RECORD_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN;
-
- /* 20h - set GP register, mic 1, everything else off */
- shadow[M1575_CODEC_REG(AC97_GENERAL_PURPOSE_REGISTER)] =
- GPR_MS_MIC1|GPR_MONO_MIX_IN;
-
- /* 28h - set to use Primary Codec channels 1 & 2 */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_AUDIO_REGISTER)] =
- EAR_PRIMARY_CODEC;
-
- /* 2ah - set to use Primary Codec channels 1 & 2 */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER)]
- = 0;
-
- /* 2ch - PCM Front DAC Sample Rate */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_FRONT_DAC_RATE_REGISTER)] =
- AC97_SAMPLE_RATE_48000;
-
- /* 32h - PCM ADC Sample Rate */
- shadow[M1575_CODEC_REG(AC97_EXTENDED_LR_DAC_RATE_REGISTER)] =
- AC97_SAMPLE_RATE_48000;
-
- /* 64h - Mixer ADC Gain Register */
- shadow[M1575_CODEC_REG(AC97_MIXER_ADC_GAIN_REGISTER)] =
- RGR_RIGHT_0db_GAIN|RGR_LEFT_0db_GAIN|RGR_MUTE;
-
- /* 76h - Misc. Control Bit Register */
- shadow[M1575_CODEC_REG(AC97_MISC_CONTROL_BIT_REGISTER)] =
- MIC_30dB_GAIN | C1MIC;
- }
-
- /* Now we set the AC97 codec registers to the saved values */
- for (i = 2; i <= M1575_LAST_AC_REG; i += 2) {
- (void) audio1575_write_ac97(statep, i,
- shadow[M1575_CODEC_REG(i)]);
- }
-
- /*
- * Now we setup the EQ register to scale 16 bit linear pcm
- * values into 20 bit DAC values.
- */
-
- /* 60h - EQ Control Register */
-
- /*
- * Here we set up the 6 biquad IIR filters to use
- * coefficient a0 as our scaling factor. The equation for
- * this filter is:
- *
- * Y(n) = a0(a1(y(n-1))+a2(y(n-2))+b2(x(n-2))+b1(x(n-1)))
- * we use the following coefficient values:
- *
- * a0 = 0x000f;
- * a1 = 0x0001;
- * a2 = 0x0001;
- * b1 = 0x0001;
- * b2 = 0x0001;
- */
- for (i = 0; i < AD1981_MAX_FILTERS; i++) {
- addr = filters[i].addr | AD1981_EQCTRL_SYM | AD1981_EQCTRL_EQM;
- tmp = filters[i].coeff;
- (void) audio1575_write_ac97(statep, AD1981_EQCTRL_REG, addr);
- (void) audio1575_write_ac97(statep, AD1981_EQDATA_REG, tmp);
- }
-
- /* The AD1981B Codec only implements 5 bit volume register */
- (void) audio1575_read_ac97(statep, AC97_MASTER_VOLUME_REGISTER, &tmp);
- if ((tmp & 0x7fff) != (MVR_RIGHT_MASK | MVR_LEFT_MASK)) {
- statep->m1575_vol_bits_mask = 6;
- }
-
- /* resume the master volume to mute */
- (void) audio1575_write_ac97(statep, AC97_MASTER_VOLUME_REGISTER,
- MVR_MUTE);
-
- /*
- * if the codec chip do support variable sample rate,
- * we set the sample rate to 48K
- */
- (void) audio1575_read_ac97(statep, AC97_EXTENDED_AUDIO_REGISTER, &tmp);
- if (!(tmp & EAR_VRA)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!AD8191B codec does not support VRA");
- ATRACE("audio1575_ac97_init() AD1981 EAR_VRA not set", tmp);
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_FAILURE);
-
- } else {
- /* set variable sample rate mode */
- (void) audio1575_write_ac97(statep,
- AC97_EXTENDED_AUDIO_STAT_CTRL_REGISTER, EASCR_VRA);
- }
-
- ATRACE("audio1575_ac97_init() sample rate",
- statep->m1575_defaults.play.sample_rate);
-
- ATRACE("audio1575_ac97_init() returning", AUDIO_SUCCESS);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_init_ac97() */
-
-/*
- * audio1575_chip_init()
- *
- * Description:
- * This routine initializes the M1575 AC97 audio controller and the AC97
- * codec. The AC97 codec registers are programmed from codec_shadow[].
- * If we are not doing a restore, we initialize codec_shadow[], otherwise
- * we use the current values of shadow. This routine expects that the
- * PCI IO and Memory spaces have been mapped and enabled already.
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int restore If M1575_INIT_RESTORE then
- * restore from codec_shadow[]
- * Returns:
- * AUDIO_SUCCESS The hardware was initialized properly
- * AUDIO_FAILURE The hardware couldn't be initialized properly
- */
-static int
-audio1575_chip_init(audio1575_state_t *statep, int restore)
-{
- uint32_t scr;
- uint32_t ssr;
- uint32_t rtsr;
- uint32_t intfcr;
- int i;
- int j;
- int rc;
- uint8_t clk_detect;
- clock_t ticks;
-
- ATRACE("audio1575_chip_init() entering", NULL);
-
- mutex_enter(&statep->m1575_intr_mutex);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ticks = drv_usectohz(M1575_LOOP_CTR);
-
- /*
- * SADA only supports stereo, so we set the channel bits
- * to "00" to select 2 channels.
- * will also set the following:
- *
- * Disable double rate enable
- * no SPDIF output selected
- * 16 bit audio record mode
- * 16 bit pcm out mode
- * PCM Out 6 chan mode FL FR CEN BL BR LFE
- * PCM Out 2 channel mode (00)
- */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Reset the AC97 Codec and default to 2 channel 16 bit mode */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-#ifndef __lock_lint
- delay(ticks<<1);
-#endif
- /* Read the System Status Reg */
- ssr = M1575_AM_GET32(M1575_SSR_REG);
-
- /* make sure and release the blocked reset bit */
- if (ssr & M1575_SSR_RSTBLK) {
- ATRACE("audio1575_chip_init()! RSTBLK detected", ssr);
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= M1575_INTFCR_RSTREL;
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
-#ifndef __lock_lint
- delay(ticks);
-#endif
- /* Read the System Status Reg */
- ssr = M1575_AM_GET32(M1575_SSR_REG);
-
- /* make sure and release the blocked reset bit */
- if (ssr & M1575_SSR_RSTBLK) {
- ATRACE("audio1575_chip_init()! RSTBLK failure",
- ssr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* Reset the controller */
- M1575_AM_PUT32(M1575_SCR_REG, M1575_SCR_COLDRST);
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* according AC'97 spec, wait for codec reset */
- for (j = 0; j < M1575_LOOP_CTR; j++) {
- scr = M1575_AM_GET32(M1575_SCR_REG);
- if ((scr & M1575_SCR_COLDRST) == 0) {
- break;
- }
-#ifndef __lock_lint
- delay(ticks);
-#endif
- }
-
- /* codec reset failed */
- if (j >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!failure to reset codec");
- ATRACE("audio1575_chip_init() "
- "!AC97 COLDRST failure", scr);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Wait for FACRDY First codec ready. The hardware can
- * provide the state of
- * codec ready bit on SDATA_IN[0] and as reflected in
- * the Recv Tag Slot Reg.
- */
- rtsr = M1575_AM_GET32(M1575_RTSR_REG);
- if (rtsr & M1575_RTSR_FACRDY) {
- break;
- } else { /* reset the status and wait for new status to set */
- rtsr |= M1575_RTSR_FACRDY;
- M1575_AM_PUT32(M1575_RTSR_REG, rtsr);
- drv_usecwait(10);
- }
- }
-
- /* if we could not reset the AC97 codec then report failure */
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!chip_init() no codec ready signal received");
- ATRACE("audio1575_chip_init() AC97 Codec init "
- "failure - BAD Board", rtsr);
- mutex_exit(&statep->m1575_intr_mutex);
-
- return (AUDIO_FAILURE);
- }
-
- /* Magic code from ULi to Turn on the AC_LINK clock */
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 4);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- (void) M1575_PCI_GET8(M1575_PCIACD_REG);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 2);
- M1575_PCI_PUT8(M1575_PCIACD_REG, 0);
- clk_detect = M1575_PCI_GET8(M1575_PCIACD_REG);
-
- if (clk_detect != 1) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!chip_init() No AC97 Clock Detected");
- ATRACE("audio1575_chip_init() no AC97 Clock detected",
- clk_detect);
- mutex_exit(&statep->m1575_intr_mutex);
- return (AUDIO_FAILURE);
- }
-
- /* Magic code from Uli to Init FIFO1 and FIFO2 */
- M1575_AM_PUT32(M1575_FIFOCR1_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR2_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR3_REG, 0x81818181);
-
- /* Disable SPDIF Output */
- M1575_AM_PUT8(M1575_CSPOCR_REG, 0);
-
- /* Disable Everyone */
- M1575_AM_PUT32(M1575_INTFCR_REG, 0L);
-
- audio1575_dma_stop(statep);
-
- mutex_exit(&statep->m1575_intr_mutex);
-
- /* now initialize the AC97 codec */
- rc = audio1575_init_ac97(statep, restore);
-
- ATRACE("audio1575_chip_init() returning", rc);
-
- return (rc);
-
-} /* audio1575_chip_init() */
-
-/*
- * audio1575_dma_stop()
- *
- * Description:
- * This routine is used to put each DMA engine into the quiet state.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_dma_stop(audio1575_state_t *statep)
-{
- uint32_t dmacr;
- uint32_t intrsr;
- uint32_t intrcr;
- uint16_t sr;
- int i;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- ATRACE("audio1575_dma_stop() entering", NULL);
-
- /* pause bus master (needed for the following reset register) */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- dmacr |= M1575_DMACR_PAUSE_ALL;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if (dmacr & M1575_DMACR_PAUSE_ALL) {
- break;
- }
- drv_usecwait(10);
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- }
-
- if (i >= M1575_LOOP_CTR) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!dma_stop() failed to stop DMA engines");
- ATRACE("audio1575_dma_stop() failure "
- "to stop DMA engines", dmacr);
- return;
- }
-
- /* Pause bus master (needed for the following reset register) */
- M1575_AM_PUT8(M1575_PCMICR_REG, 0);
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
- M1575_AM_PUT8(M1575_MICICR_REG, 0);
- M1575_AM_PUT8(M1575_CSPOCR_REG, 0);
- M1575_AM_PUT8(M1575_PCMI2CR_RR, 0);
- M1575_AM_PUT8(M1575_MICI2CR_RR, 0);
-
- /* Reset the bus master registers for all DMA engines */
- M1575_AM_PUT8(M1575_PCMICR_REG, M1575_PCMICR_RR);
- M1575_AM_PUT8(M1575_PCMOCR_REG, M1575_PCMOCR_RR);
- M1575_AM_PUT8(M1575_MICICR_REG, M1575_MICICR_RR);
- M1575_AM_PUT8(M1575_CSPOCR_REG, M1575_CSPOCR_RR);
- M1575_AM_PUT8(M1575_PCMI2CR_REG, M1575_PCMI2CR_RR);
- M1575_AM_PUT8(M1575_MICI2CR_REG, M1575_MICI2CR_RR);
-
- /* Reset FIFOS */
- M1575_AM_PUT32(M1575_FIFOCR1_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR2_REG, 0x81818181);
- M1575_AM_PUT32(M1575_FIFOCR3_REG, 0x81818181);
-
- /* Clear Interrupts */
- sr = M1575_AM_GET16(M1575_PCMISR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMISR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_PCMOSR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMOSR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_MICISR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_MICISR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_CSPOSR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_CSPOSR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_PCMI2SR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_PCMI2SR_REG, sr);
-
- sr = M1575_AM_GET16(M1575_MICI2SR_REG) | M1575_STATUS_CLR;
- M1575_AM_PUT16(M1575_MICI2SR_REG, sr);
-
- /*
- * clear the interrupt control and status register
- * READ/WRITE/READ workaround required
- * for buggy hardware
- */
-
- intrcr = 0L;
- M1575_AM_PUT32(M1575_INTRCR_REG, intrcr);
- intrcr = M1575_AM_GET32(M1575_INTRCR_REG);
-
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
- M1575_AM_PUT32(M1575_INTRSR_REG, (intrsr & M1575_INTR_MASK));
- intrsr = M1575_AM_GET32(M1575_INTRSR_REG);
-
- /* clear all flags except DMA suspend flag */
- statep->m1575_flags &= M1575_DMA_SUSPENDED;
-
- ATRACE("audio1575_stop_dma() returning", NULL);
-
-} /* audio1575_dma_stop() */
-
-/*
- * audio1575_set_gain()
- *
- * Description:
- * Set the play/record gain.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 The gain to set
- * int arg2 The channel, 0 == left
- * or 1 == right
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio1575_set_gain(audio1575_state_t *statep, int dir, int gain, int channel)
-{
- uint16_t tmp;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if (gain > AUDIO_MAX_GAIN) {
- gain = AUDIO_MAX_GAIN;
- } else if (gain < AUDIO_MIN_GAIN) {
- gain = AUDIO_MIN_GAIN;
- }
-
- switch (dir) {
- case AUDIO_PLAY:
- /*
- * For play we use PCM so all volumes change with just
- * one write. This way we get line out, headphone and
- * internal speaker in one shot.
- *
- * The AC97 Codec goes from -34.5 dB (11111) to 0 dB
- * (01000) to +12.0 dB (00000). We turn gain into attenuation
- * The AD1981B codec uses attenuation instead of gain as well.
- * abs(-34.5dB)+12.dB = 46.5dB of dynamic range/1.5dB per bit
- * gives a range of 0x00-0x1f (0-31) values.
- */
-
- /* read the play gain register */
- (void) audio1575_read_ac97(statep, AC97_PCM_OUT_VOLUME_REGISTER,
- &tmp);
- tmp &= ~PCMOVR_MUTE;
-
- if (channel == 0) { /* left channel */
- tmp &= ~PCMOVR_LEFT_GAIN_MASK;
- tmp |= (((AUDIO_MAX_GAIN - gain) >>
- M1575_GAIN_SHIFT3) << M1575_BYTE_SHIFT) &
- PCMOVR_LEFT_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp &= ~PCMOVR_RIGHT_GAIN_MASK;
- tmp |= ((AUDIO_MAX_GAIN - gain) >>
- M1575_GAIN_SHIFT3) & PCMOVR_RIGHT_GAIN_MASK;
- }
-
- /* update the play gain register */
- (void) audio1575_write_ac97(statep,
- AC97_PCM_OUT_VOLUME_REGISTER, tmp);
- (void) audio1575_read_ac97(statep, AC97_PCM_OUT_VOLUME_REGISTER,
- &tmp);
- break;
-
- case AUDIO_RECORD:
- /*
- * For record we use the master record gain with all
- * of the inputs set to 0dB.
- * The AC97 Codec goes from 0 dB (0000) to +22.5 dB
- * (1111) 22.5 dB/1.5dB per bit = range of 0x0-0xf;
- * Note: this is gain not attenuation.
- */
-
- /* read the record gain register */
- (void) audio1575_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
-
- if (channel == 0) { /* left channel */
- tmp &= ~RGR_LEFT_MASK;
- tmp |= (gain << M1575_GAIN_SHIFT4) & RGR_LEFT_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- tmp &= ~RGR_RIGHT_MASK;
- tmp |= (gain >> M1575_GAIN_SHIFT4) & RGR_RIGHT_MASK;
- }
-
- /* update the record gain register */
- (void) audio1575_write_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, tmp);
- (void) audio1575_read_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, &tmp);
- break;
-
- default:
- ATRACE("audio1575_set_gain() Unknown audio direction", dir);
-
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_set_gain() */
-
-/*
- * audio1575_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * which is not how we program
- * the device for now.
- * int dir AUDIO_PLAY or AUDIO_RECORD,
- * if direction is important
- * int port The port to set:
- * AUDIO_SPEAKER output to built-in speaker
- * AUDIO_HEADPHONE output to headphone
- * AUDIO_LINE_OUT output to line out
- *
- * AUDIO_MICROPHONE input from microphone
- * AUDIO_LINE_IN input from line in
- * AUDIO_CD input from internal CD
- * AUDIO_CODEC_LOOPB_IN input from Codec
- * internal loopback
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-audio1575_set_port(audio1575_state_t *statep, int dir, int port)
-{
- uint16_t tmp = 0;
- uint16_t reg = 0;
- uint32_t intfcr = 0;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- switch (dir) {
- case AUDIO_PLAY: /* output port */
- if (port == M1575_PORT_UNMUTE) {
- port = statep->m1575_output_port;
- }
-
- if (port & AUDIO_SPEAKER) {
- (void) audio1575_and_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_SPEAKER;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_MONO_MASTER_VOLUME_REGSITER, MVR_MUTE);
- }
-
- if (port & AUDIO_LINE_OUT) {
- (void) audio1575_and_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_LINE_OUT;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_MASTER_VOLUME_REGISTER, MVR_MUTE);
- }
-
- if (port & AUDIO_HEADPHONE) {
- (void) audio1575_and_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER,
- (uint16_t)~MVR_MUTE);
- tmp |= AUDIO_HEADPHONE;
- } else {
- (void) audio1575_or_ac97(statep,
- AC97_HEADPHONE_VOLUME_REGISTER, MVR_MUTE);
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= (M1575_INTFCR_PCMOENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
-
- ATRACE("audio1575_set_port() out port", tmp);
- statep->m1575_output_port = tmp;
- if (tmp != port) {
- ATRACE("audio1575_set_port() bad out port", port);
-
- return (AUDIO_FAILURE);
- }
- break;
-
- case AUDIO_RECORD: /* input port */
- switch (port) {
- case AUDIO_NONE:
- /* set to an unused input */
- tmp = RSCR_R_PHONE | RSCR_L_PHONE;
- ATRACE("audio1575_set_port() AUDIO_NONE", NULL);
-
- /* mute the master record input */
- (void) audio1575_or_ac97(statep,
- AC97_RECORD_GAIN_REGISTER, RGR_MUTE);
-
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER, CDVR_MUTE);
- }
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_PCMIENB|M1575_INTFCR_MICENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_MICROPHONE:
- /* set to the mic input */
- tmp = RSCR_R_MIC | RSCR_L_MIC;
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port == AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
-
- /* Enable the MIC input on AC Link Channel 3 */
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr |= (M1575_INTFCR_PCMIENB);
- intfcr &= ~(M1575_INTFCR_MICISEL|M1575_INTFCR_MICENB |
- M1575_INTFCR_MICI2SEL| M1575_INTFCR_MICI2ENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_LINE_IN:
- /* set to the line in input */
- tmp = RSCR_R_LINE_IN | RSCR_L_LINE_IN;
- ATRACE("audio1575_set_port() LINE_IN", tmp);
- /* see if we need to update monitor loopback */
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- CDVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
-
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- break;
-
- case AUDIO_CD:
- /* set to the line in input */
- tmp = RSCR_R_CD|RSCR_L_CD;
- /* see if we need to update monitor loopback */
- if (statep->m1575_monitor_gain) {
- reg = AC97_LINE_IN_VOLUME_REGISTER;
- if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- reg, LIVR_MUTE);
- }
- (void) audio1575_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER,
- statep->m1575_monitor_gain);
- }
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* set to the loopback input */
- tmp = RSCR_R_STEREO_MIX | RSCR_L_STEREO_MIX;
- ATRACE("audio1575_set_port() LPBK", tmp);
- if (statep->m1575_monitor_gain) {
- if (statep->m1575_input_port == AUDIO_LINE_IN) {
- (void) audio1575_or_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, LIVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_MICROPHONE) {
- (void) audio1575_or_ac97(statep,
- AC97_MIC_VOLUME_REGISTER,
- MICVR_MUTE);
- } else if (statep->m1575_input_port ==
- AUDIO_CD) {
- (void) audio1575_or_ac97(statep,
- AC97_CD_VOLUME_REGISTER, CDVR_MUTE);
- }
- }
- intfcr = M1575_AM_GET32(M1575_INTFCR_REG);
- intfcr &= ~(M1575_INTFCR_MICENB | M1575_INTFCR_MICISEL);
- intfcr |= (M1575_INTFCR_PCMIENB);
- M1575_AM_PUT32(M1575_INTFCR_REG, intfcr);
- break;
-
- default:
- ATRACE("audio1575_set_port bad in port", port);
-
- return (AUDIO_FAILURE);
- }
-
- /* select the input */
- (void) audio1575_write_ac97(statep,
- AC97_RECORD_SELECT_CTRL_REGISTER, tmp);
-
- if ((port != AUDIO_NONE) &&
- (statep->m1575_codec_shadow[M1575_CODEC_REG(
- AC97_RECORD_GAIN_REGISTER)] & RGR_MUTE)) {
- (void) audio1575_and_ac97(statep,
- AC97_RECORD_GAIN_REGISTER,
- (uint16_t)~RGR_MUTE);
- }
- statep->m1575_input_port = port;
- break;
- }
-
- ATRACE("audio1575_set_port() returning", port);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_set_port() */
-
-/*
- * audio1575_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-audio1575_set_monitor_gain(audio1575_state_t *statep, int gain)
-{
- uint16_t tmp_short;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("audio1575_set_monitor_gain() entering", statep);
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- tmp_short = MVR_MUTE;
- } else {
- /* Adjust the value of gain to the requirement of AC'97 */
- tmp_short = (((AUDIO_MAX_GAIN - gain) >> M1575_GAIN_SHIFT3) <<
- M1575_BYTE_SHIFT) & PCMOVR_LEFT_GAIN_MASK;
- tmp_short |= ((AUDIO_MAX_GAIN - gain) >> M1575_GAIN_SHIFT3) &
- PCMOVR_RIGHT_GAIN_MASK;
- }
-
- switch (statep->m1575_input_port) {
- case AUDIO_NONE:
- /*
- * It is possible to set the value of gain before any input
- * is selected. So, we just save the gain and then return
- * SUCCESS.
- */
- break;
-
- case AUDIO_MICROPHONE:
- tmp_short |= statep->m1575_codec_shadow[M1575_CODEC_REG(
- AC97_MIC_VOLUME_REGISTER)] & MICVR_20dB_BOOST;
- (void) audio1575_write_ac97(statep,
- AC97_MIC_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_LINE_IN:
- (void) audio1575_write_ac97(statep,
- AC97_LINE_IN_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CD:
- (void) audio1575_write_ac97(statep,
- AC97_CD_VOLUME_REGISTER, tmp_short);
- break;
-
- case AUDIO_CODEC_LOOPB_IN:
- /* we already are setting the loopback, so done */
- goto done;
-
- default:
- /* this should never happen! */
- ATRACE("audio1575_ad_set_config() monitor gain bad device",
- statep->m1575_input_port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- if (gain == 0) {
- statep->m1575_monitor_gain = 0;
- } else {
- statep->m1575_monitor_gain = tmp_short;
- }
-
-done:
- ATRACE("audio1575_set_monitor_gain() returning", rc);
-
- return (rc);
-
-} /* audio1575_set_monitor_gain() */
-
-/*
- * audio1575_codec_sync()
- *
- * Description:
- * Serialize access to the AC97 audio mixer registers.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Ready for an I/O access to the codec
- * AUDIO_FAILURE An I/O access is currently in progress, can't
- * perform another I/O access.
- */
-static int
-audio1575_codec_sync(audio1575_state_t *statep)
-{
- int i;
- int j;
- uint32_t casr;
- uint32_t cspsr;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* do the Uli Shuffle ... */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Read the semaphore */
- casr = M1575_AM_GET32(M1575_CASR_REG);
- /* loop till we own the semaphore */
- if ((casr & 1) == 0) {
- for (j = 0; j < M1575_LOOP_CTR; j++) {
- /* Wait for CWRSUCC 0x8 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_SUCC) ==
- M1575_CSPSR_SUCC) {
- return (AUDIO_SUCCESS);
- }
- drv_usecwait(1);
- }
- }
- drv_usecwait(10);
- }
-
- return (AUDIO_FAILURE);
-
-} /* audio1575_codec_sync() */
-
-/*
- * audio1575_and_ac97()
- *
- * Description:
- * Logically AND the value with the specified ac97 codec register
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to AND
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_and_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if ((audio1575_write_ac97(statep, reg, data &
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)])) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_and_ac97() */
-
-/*
- * audio1575_or_ac97()
- *
- * Description:
- * Logically OR the value with the specified ac97 codec register
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The value to OR
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_or_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint16_t tmp;
-
- if ((audio1575_write_ac97(statep, reg, data |
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)])) ==
- AUDIO_FAILURE) {
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_or_ac97() */
-
-/*
- * audio1575_write_ac97()
- *
- * Description:
- * Set the specific AC97 Codec register.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t data The data want to be set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set
- */
-static int
-audio1575_write_ac97(audio1575_state_t *statep, int reg, uint16_t data)
-{
- uint32_t cspsr;
- uint16_t tmp;
- int i;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if (audio1575_codec_sync(statep) != AUDIO_SUCCESS) {
- return (AUDIO_FAILURE);
- }
-
- /* write the data to WRITE to the lo word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG, data);
-
- /* write the address to WRITE to the hi word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG+2, reg);
-
- /* wait until command is completed sucessfully */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Wait for Write Ready 0x01 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_WRRDY) == M1575_CSPSR_WRRDY) {
- break;
- }
- drv_usecwait(1);
- }
-
- if (i >= M1575_LOOP_CTR) {
- ATRACE("audio1575_write_ac97() failure", i);
-
- return (AUDIO_FAILURE);
- }
-
- (void) audio1575_read_ac97(statep, reg, &tmp);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_write_ac97() */
-
-/*
- * audio1575_read_ac97()
- *
- * Description:
- * Get the specific AC97 Codec register. It also updates codec_shadow[]
- * with the register value.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- * int reg AC97 register number
- * uint16_t *data The data to be returned
- *
- * Returns:
- * AUDIO_SUCCESS Reading the codec register successfully
- * AUDIO_FAILURE Failed to read the register
- */
-static int
-audio1575_read_ac97(audio1575_state_t *statep, int reg, uint16_t *data)
-{
- uint32_t cspsr;
- uint16_t addr = 0;
- int i;
-
- ATRACE("audio1575_read_ac97() entering", NULL);
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- if ((audio1575_codec_sync(statep)) != AUDIO_SUCCESS) {
- *data = 0xffff;
- ATRACE("audio1575_read_ac97() sync failure", NULL);
-
- return (AUDIO_FAILURE);
- }
-
- /*
- * at this point we has the CASR semaphore
- * and the codec is r/w ready
- * OR in the READ opcode into the address field
- */
-
- addr = (reg | M1575_CPR_READ);
-
- /* write the address to READ to the hi word of the CPR register */
- M1575_AM_PUT16(M1575_CPR_REG+2, addr);
-
- /* wait until command is completed sucessfully */
- for (i = 0; i < M1575_LOOP_CTR; i++) {
- /* Wait for Read Ready 0x02 */
- cspsr = M1575_AM_GET32(M1575_CSPSR_REG);
- if ((cspsr & M1575_CSPSR_RDRDY) == M1575_CSPSR_RDRDY) {
- break;
- }
- drv_usecwait(1);
- }
-
- if (i >= M1575_LOOP_CTR) {
- *data = 0xffff;
- ATRACE("audio1575_read_ac97() CSPSR NOT READY", cspsr);
-
- return (AUDIO_FAILURE);
- }
-
- /* read back the data and address */
- *data = M1575_AM_GET16(M1575_SPR_REG);
- addr = M1575_AM_GET16(M1575_SPR_REG+2);
-
- if (addr != reg) {
- ATRACE("audio1575_read_ac97() bad read address", addr);
-
- return (AUDIO_FAILURE);
- }
-
- /* store new value in codec shadow register */
- statep->m1575_codec_shadow[M1575_CODEC_REG(reg)] = *data;
-
- ATRACE("audio1575_read_ac97() returning successfully", NULL);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_read_ac97() */
-
-/*
- * audio1575_reset_ac97()
- *
- * Description:
- * Reset AC97 Codec register.
- *
- * Arguments:
- * audio1575_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Reset the codec successfully
- * AUDIO_FAILURE Failed to reset the codec
- */
-static int
-audio1575_reset_ac97(audio1575_state_t *statep)
-{
- uint16_t tmp;
-
- if (audio1575_read_ac97(statep,
- AC97_POWERDOWN_CTRL_STAT_REGISTER, &tmp) != AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- if (audio1575_write_ac97(statep, AC97_RESET_REGISTER, 0xffff) !=
- AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- if (audio1575_read_ac97(statep, AC97_RESET_REGISTER, &tmp) !=
- AUDIO_SUCCESS) {
-
- return (AUDIO_FAILURE);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_reset_ac97() */
-
-/*
- * audio1575_fill_play_buf()
- *
- * Description:
- * This routine is called by m1575_ad_start_play() and the interrupt
- * handler. It fills playback samples into the DMA memory, sets the
- * BDL entries, and starts the playback DMA engine.
- * the m1575_intr_mutex must be held on entry.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Starting PCM out engine successfully
- * AUDIO_FAILURE Failed to start PCM out engine.
- */
-static int
-audio1575_fill_play_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- m1575_bd_entry_t *bdesc;
- int samples;
- uint32_t dmacr;
- int rs;
- int bufcount = 0;
- int rc = AUDIO_SUCCESS;
-
- ASSERT(mutex_owned(&statep->m1575_intr_mutex));
-
- /* get the play buffer pointer */
- buf = &statep->m1575_play_buf;
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- /* compute number of samples */
- samples = statep->m1575_psample_rate * statep->m1575_pchannels /
- statep->m1575_ad_info.ad_play.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- while (buf->avail > 0) {
- chunk = &(buf->chunk[buf->tail & M1575_PLAY_BUF_MSK]);
- mutex_exit(&statep->m1575_intr_mutex);
- rs = am_get_audio(statep->m1575_ahandle,
- (char *)(chunk->data_buf), AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->m1575_intr_mutex);
-
- if (((statep->m1575_flags & M1575_DMA_PLAY_STARTED) == 0) &&
- (buf->io_started)) {
- audio_sup_log(statep->m1575_ahandle, CE_WARN,
- "!fill_play_buf() Err:PLAY started and IO started");
- ATRACE("audio1575_fill_play_buf() Err:PLAY STARTED "
- "and IO STARTED", NULL);
-
- return (AUDIO_FAILURE);
- }
- /* no more samples to play */
- if (rs <= 0) {
- if (statep->m1575_flags & M1575_DMA_PLAY_EMPTY) {
- if (bufcount != 0) {
- break;
- }
- /*
- * Clear the flag so if audio is restarted while
- * in am_play_shutdown() we can detect it and
- * not mess things up.
- */
- statep->m1575_flags &= ~M1575_DMA_PLAY_STARTED;
-
- /* shutdown the mixer */
- mutex_exit(&statep->m1575_intr_mutex);
- am_play_shutdown(statep->m1575_ahandle, NULL);
- mutex_enter(&statep->m1575_intr_mutex);
-
- /*
- * Make sure playing wasn't restarted when lock
- * lost if reopened, should return success
- */
- if (statep->m1575_flags &
- M1575_DMA_PLAY_STARTED) {
- return (AUDIO_SUCCESS);
- }
-
- /* Finished playing, then stop it */
- rc = audio1575_dma_reset(statep,
- M1575_DMA_PCM_OUT);
- if (rc == AUDIO_FAILURE) {
- ATRACE("audio1575_fill_play_buf() "
- "dma_reset failure", rc);
- return (rc);
- }
-
- /* clear the PCM Out ctrl reg */
- M1575_AM_PUT8(M1575_PCMOCR_REG, 0);
- buf->io_started = B_FALSE;
-
- /* clr the flags getting ready for next start */
- statep->m1575_flags &= ~(M1575_DMA_PLAY_PAUSED |
- M1575_DMA_PLAY_EMPTY);
-
- /* return the value for m1575_ad_start_play() */
- return (AUDIO_FAILURE);
-
- } else {
- /* M1575_DMA_PLAY_EMPTY */
- statep->m1575_flags |= M1575_DMA_PLAY_EMPTY;
- }
- } else {
- /* !M1575_DMA_PLAY_EMPTY */
- statep->m1575_flags &= ~M1575_DMA_PLAY_EMPTY;
- bufcount++;
- (void) ddi_dma_sync(chunk->dma_handle, 0, rs << 1,
- DDI_DMA_SYNC_FORDEV);
- }
-
- /* put the samples into buffer descriptor list entry */
- bdesc = &(statep->m1575_bdl_virt_pout[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)rs;
- bdesc->buf_cmd |= IOC;
- M1575_AM_PUT8(M1575_PCMOLVIV_REG, buf->tail);
- buf->tail++;
- buf->tail &= M1575_BD_MSK;
- buf->avail--;
- }
-
- /* start PCM out engine */
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if (buf->avail < M1575_PLAY_BUFS &&
- !(dmacr & M1575_DMACR_PCMOSTART)) {
- dmacr |= M1575_DMACR_PCMOSTART;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- ATRACE("audio1575_fill_play_buf() PLAY DMA STARTED", dmacr);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_fill_play_buf() */
-
-/*
- * audio1575_prepare_record_buf()
- *
- * Description:
- * This routine is called by audio1575_ad_start_record(). It prepares DMA
- * memory for PCM in engine, sets the buffer descriptor entries for PCM
- * in engine, and starts PCM in engine for recording.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Started PCM in engine successfully
- * AUDIO_FAILURE Failed to start PCM in engine.
- */
-static int
-audio1575_prepare_record_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- m1575_bd_entry_t *bdesc;
- uint32_t dmacr;
- int samples;
-
- /* get the record buf ptr */
- buf = &statep->m1575_record_buf;
-
- if (buf->avail == 0) {
- return (AUDIO_SUCCESS);
- }
-
- samples = statep->m1575_csample_rate * statep->m1575_cchannels /
- statep->m1575_ad_info.ad_record.ad_int_rate;
-
- /* if not an even number of samples we panic! */
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples & 1) != 0) {
- samples++;
- }
-
- statep->m1575_csamples = samples;
-
- while (buf->avail > 0) {
- chunk = &buf->chunk[buf->tail & M1575_REC_BUF_MSK];
- bdesc = &(statep->m1575_bdl_virt_pin[buf->tail]);
- bdesc->buf_base = chunk->addr_phy;
- bdesc->buf_len = (uint16_t)samples;
- bdesc->buf_cmd |= IOC;
- M1575_AM_PUT8(M1575_PCMILVIV_REG, buf->tail);
- buf->tail++;
- buf->tail &= M1575_BD_MSK;
- buf->avail--;
- }
-
- if (!buf->io_started) {
- buf->io_started = B_TRUE;
- }
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- if ((buf->avail < M1575_REC_BUFS) && !(dmacr & M1575_DMACR_PCMISTART)) {
- /* start PCM In engine */
- dmacr |= M1575_DMACR_PCMISTART;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- ATRACE("audio1575_prepare_record_buf() "
- "RECORD DMA STARTED", dmacr);
- }
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_prepare_record_buf() */
-
-/*
- * audio1575_reclaim_record_buf()
- *
- * Description:
- * This routine is called by the interrupt handler. It sends the PCM
- * samples (record data) up to the mixer module by calling am_send_audio(),
- * and reclaims the buffer descriptor entries for PCM in engine.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_reclaim_record_buf(audio1575_state_t *statep)
-{
- m1575_bdlist_chunk_t *chunk;
- m1575_sample_buf_t *buf;
- int16_t pcmiciv;
- int samples;
-
- /* get record buf ptr */
- buf = &statep->m1575_record_buf;
-
- /* get our current index value */
- pcmiciv = M1575_AM_GET8(M1575_PCMICIV_REG);
-
- /* get number of samples */
- samples = statep->m1575_csamples;
-
- /* While we have record buffers to process */
- while ((buf->head != pcmiciv && buf->avail < M1575_REC_BUFS)) {
- chunk = &buf->chunk[buf->head & M1575_REC_BUF_MSK];
- (void) ddi_dma_sync(chunk->dma_handle, 0,
- chunk->real_len, DDI_DMA_SYNC_FORCPU);
- mutex_exit(&statep->m1575_intr_mutex);
- am_send_audio(statep->m1575_ahandle, chunk->data_buf,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&statep->m1575_intr_mutex);
- buf->avail++;
- buf->head++;
- buf->head &= M1575_BD_MSK;
- if ((statep->m1575_flags & M1575_DMA_RECD_STARTED) == 0) {
- break;
- }
- }
-
-} /* audio1575_reclaim_record_buf() */
-
-/*
- * audio1575_pci_enable()
- *
- * Description:
- * This routine Enables all PCI IO and MEMORY accesses
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_pci_enable(audio1575_state_t *statep)
-{
- uint16_t pcics_reg;
-
- ATRACE("audio1575_pci_enable() entering", statep);
-
- pcics_reg = pci_config_get16(statep->m1575_pci_regs_handle,
- PCI_CONF_COMM);
- ATRACE("audio1575_pci_enable() PCICS Reg ", pcics_reg);
- pcics_reg |= (PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
- pci_config_put16(statep->m1575_pci_regs_handle, PCI_CONF_COMM,
- pcics_reg);
-
- ATRACE("audio1575_pci_enable() returning", pcics_reg);
-
-} /* audio1575_pci_enable() */
-
-/*
- * audio1575_pci_disable()
- *
- * Description:
- * This routine Disables all PCI IO and MEMORY accesses
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- *
- * Returns:
- * void
- */
-static void
-audio1575_pci_disable(audio1575_state_t *statep)
-{
- uint16_t pcics_reg;
-
- ATRACE("audio1575_pci_disable() entering", statep);
-
- pcics_reg = pci_config_get16(statep->m1575_pci_regs_handle,
- PCI_CONF_COMM);
- pcics_reg &= ~(PCI_COMM_IO | PCI_COMM_MAE | PCI_COMM_ME);
- pci_config_put16(statep->m1575_pci_regs_handle, PCI_CONF_COMM,
- pcics_reg);
-
- ATRACE("audio1575_pci_disable() returning", pcics_reg);
-
-} /* audio1575_pci_disable() */
-
-/*
- * audio1575_dma_pause()
- *
- * Description:
- * This routine pauses DMA on a particular channel
- * It does not reset andy registers so play/record can be resumed.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA paused successfully
- * AUDIO_FAILURE DMA failed to pause
- */
-static int
-audio1575_dma_pause(audio1575_state_t *statep, int chan)
-{
- uint32_t dmacr;
-
- ATRACE("audio1575_dma_pause() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- dmacr |= M1575_DMACR_PCMIPAUSE;
- break;
-
- case M1575_DMA_PCM_OUT:
- dmacr |= M1575_DMACR_PCMOPAUSE;
- break;
-
- default:
- ATRACE("audio1575_dma_pause() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
-
- ATRACE("audio1575_dma_pause() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_pause() */
-
-/*
- * audio1575_dma_resume()
- *
- * Description:
- * This routine resumes DMA on a particular channel
- * It does not resume if the BDL list is empty.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel
- * PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA resumed successfully
- * AUDIO_FAILURE DMA failed to resume
- */
-static int
-audio1575_dma_resume(audio1575_state_t *statep, int chan)
-{
- uint32_t dmacr;
- uint32_t fifocr1;
-
- ATRACE("audio1575_dma_resume() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- /* ULi says do fifo resets here */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMIRST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr &= ~M1575_DMACR_PCMIPAUSE;
- dmacr |= M1575_DMACR_PCMISTART;
- break;
-
- case M1575_DMA_PCM_OUT:
- dmacr &= ~M1575_DMACR_PCMOPAUSE;
- dmacr |= M1575_DMACR_PCMOSTART;
- break;
- default:
- ATRACE("audio1575_dma_resume() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
-
- ATRACE("audio1575_dma_resume() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_resume() */
-
-/*
- * audio1575_dma reset()
- *
- * Description:
- * This routine resets the DMA on a particular channel
- * All DMA registers are RESET.
- *
- * Arguments:
- * audio1575_state_t *statep The device's state structure
- * int chan The DMA channel PCM_IN,PCM_OUT,MIC_IN
- *
- * Returns:
- * AUDIO_SUCCESS DMA reset successfully
- * AUDIO_FAILURE DMA failed to reset
- */
-static int
-audio1575_dma_reset(audio1575_state_t *statep, int chan)
-{
- uint8_t cr;
- uint32_t fifocr1;
- uint32_t dmacr;
-
- ATRACE("audio1575_dma_reset() entering", NULL);
-
- dmacr = M1575_AM_GET32(M1575_DMACR_REG);
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
-
- switch (chan) {
- case M1575_DMA_PCM_IN:
- /* Uli FIFO madness ... */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMIRST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr |= M1575_DMACR_PCMIPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- cr = M1575_AM_GET8(M1575_PCMICR_REG);
- cr |= M1575_PCMICR_RR;
- M1575_AM_PUT8(M1575_PCMICR_REG, cr);
- dmacr &= ~M1575_DMACR_PCMIPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- break;
-
- case M1575_DMA_PCM_OUT:
- /* Uli FIFO madness ... */
- fifocr1 = M1575_AM_GET32(M1575_FIFOCR1_REG);
- fifocr1 |= M1575_FIFOCR1_PCMORST;
- M1575_AM_PUT32(M1575_FIFOCR1_REG, fifocr1);
- dmacr |= M1575_DMACR_PCMOPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- cr = M1575_AM_GET8(M1575_PCMOCR_REG);
- cr |= M1575_PCMOCR_RR;
- M1575_AM_PUT8(M1575_PCMOCR_REG, cr);
- dmacr &= ~M1575_DMACR_PCMOPAUSE;
- M1575_AM_PUT32(M1575_DMACR_REG, dmacr);
- break;
-
- default:
- ATRACE("audio1575_dma_reset() bad channel", chan);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE("audio1575_dma_reset() returning", AUDIO_SUCCESS);
-
- return (AUDIO_SUCCESS);
-
-} /* audio1575_dma_reset() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c
deleted file mode 100644
index af340d964d..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231.c
+++ /dev/null
@@ -1,3020 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-
-/*
- * audiocs Audio Driver
- *
- * This Audio Driver controls the Crystal CS4231 Codec used on many SPARC
- * platforms. It does not support the CS4231 on Power PCs or x86 PCs. It
- * does support two different DMA engines, the APC and EB2. The code for
- * those DMA engines is split out and a well defined, but private, interface
- * is used to control those DMA engines.
- *
- * For some reason setting the CS4231's registers doesn't always succeed.
- * Therefore every time we set a register we always read it back to make
- * sure it was set. If not we wait a little while and then try again. This
- * is all taken care of in the routines cs4231_put8() and cs4231_reg_select()
- * and the macros OR_SET_BYTE() and AND_SET_BYTE(). We don't worry about
- * the status register because it is cleared by writing anything to it.
- * So it doesn't matter what the value written is.
- *
- * This driver uses the mixer Audio Personality Module to implement audio(7I)
- * and mixer(7I) semantics. Unfortunately this is a single stream Codec,
- * forcing the mixer to do sample rate conversion.
- *
- * This driver supports suspending and resuming. A suspend just stops playing
- * and recording. The play DMA buffers end up getting thrown away, but when
- * you shut down the machine there is a break in the audio anyway, so they
- * won't be missed and it isn't worth the effort to save them. When we resume
- * we always start playing and recording. If they aren't needed they get
- * shut off by the mixer.
- *
- * System power management is supported by this driver. To facilitate
- * this feature the routines audiocs_set_busy() and audiocs_set_idle()
- * are provided.
- * audiocs_set_busy() is called at the beginning of all audiocs_ad_*()
- * entry point routines. It blocks if the driver is being suspended.
- * Once it unblocks it increments a busy count and raises power.
- * Once this busy count is incremented any calls to suspend the driver
- * will block until the count goes back to zero.
- *
- * audiocs_set_idle() is called at the end of all audiocs_ad_*() entry
- * points. It decrements the busy count. Once that count reaches zero
- * it wakes up a sleeping suspend.
- *
- * Component power management is also supported by this driver. As long as
- * the busy count raised by audiocs_set_busy() is non-zero or audio is
- * actively playing or recording power can not be lowered.
- *
- * The ad_start_play()/record() routines call pm_busy_component() so that
- * as long as playing/recording is going on the device won't be powered down.
- * The ad_stop_play()/record() routines call pm_idle_component() so that when
- * the busy count goes to 0 the device will be powered down.
- *
- * NOTE: This module depends on the misc/audiosup and misc/mixer modules
- * being loaded first.
- */
-
-#include <sys/modctl.h>
-#include <sys/kmem.h>
-#include <sys/stropts.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src2.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Global routines.
- */
-int cs4231_poll_ready(CS_state_t *);
-
-/*
- * Module linkage routines for the kernel
- */
-static int cs4231_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
-static int cs4231_attach(dev_info_t *, ddi_attach_cmd_t);
-static int cs4231_detach(dev_info_t *, ddi_detach_cmd_t);
-static int cs4231_power(dev_info_t *, int, int);
-
-/*
- * Entry point routine prototypes
- */
-static int cs4231_ad_set_config(audiohdl_t, int, int, int, int, int);
-static int cs4231_ad_set_format(audiohdl_t, int, int, int, int, int, int);
-static int cs4231_ad_start_play(audiohdl_t, int);
-static void cs4231_ad_pause_play(audiohdl_t, int);
-static void cs4231_ad_stop_play(audiohdl_t, int);
-static int cs4231_ad_start_record(audiohdl_t, int);
-static void cs4231_ad_stop_record(audiohdl_t, int);
-
-/* Local Routines */
-static int cs4231_init_state(CS_state_t *, dev_info_t *);
-static int cs4231_chip_init(CS_state_t *);
-static void cs4231_get_ports(CS_state_t *, dev_info_t *);
-static int cs4231_set_port(CS_state_t *, int, int);
-static int cs4231_set_gain(CS_state_t *, int, int, int, int);
-static int cs4231_set_monitor_gain(CS_state_t *, int);
-static int cs4231_set_busy(CS_state_t *);
-static void cs4231_set_idle(CS_state_t *);
-static void cs4231_power_up(CS_state_t *);
-static void cs4231_power_down(CS_state_t *);
-
-/*
- * Global variables, but viewable only by this file.
- */
-
-/* anchor for soft state structures */
-static void *cs_statep;
-
-/* driver name, so we don't have to call ddi_driver_name() or hard code strs */
-static char *audiocs_name = CS4231_NAME;
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-static uint_t cs_mixer_srs[] = {
- CS4231_SAMPR5510, CS4231_SAMPR48000, 0
-};
-
-static uint_t cs_compat_srs[] = {
- CS4231_SAMPR5510, CS4231_SAMPR6620, CS4231_SAMPR8000,
- CS4231_SAMPR9600, CS4231_SAMPR11025, CS4231_SAMPR16000,
- CS4231_SAMPR18900, CS4231_SAMPR22050, CS4231_SAMPR27420,
- CS4231_SAMPR32000, CS4231_SAMPR33075, CS4231_SAMPR37800,
- CS4231_SAMPR44100, CS4231_SAMPR48000, 0
-};
-
-static am_ad_sample_rates_t cs_mixer_sample_rates = {
- MIXER_SRS_FLAG_SR_LIMITS,
- cs_mixer_srs
-};
-
-static am_ad_sample_rates_t cs_compat_sample_rates = {
- MIXER_SRS_FLAG_SR_NOT_LIMITS,
- cs_compat_srs
-};
-
-static uint_t cs_channels[] = {
- AUDIO_CHANNELS_MONO, AUDIO_CHANNELS_STEREO, 0
-};
-
-static am_ad_cap_comb_t cs_combinations[] = {
- { AUDIO_PRECISION_8, AUDIO_ENCODING_LINEAR },
- { AUDIO_PRECISION_8, AUDIO_ENCODING_ULAW },
- { AUDIO_PRECISION_8, AUDIO_ENCODING_ALAW },
- { AUDIO_PRECISION_16, AUDIO_ENCODING_LINEAR },
- { 0 }
-};
-
-static am_ad_entry_t cs_entry = {
- NULL, /* ad_setup() */
- NULL, /* ad_teardown() */
- cs4231_ad_set_config, /* ad_set_config() */
- cs4231_ad_set_format, /* ad_set_format() */
- cs4231_ad_start_play, /* ad_start_play() */
- cs4231_ad_pause_play, /* ad_pause_play() */
- cs4231_ad_stop_play, /* ad_stop_play() */
- cs4231_ad_start_record, /* ad_start_record() */
- cs4231_ad_stop_record, /* ad_stop_record() */
- NULL, /* ad_ioctl() */
- NULL /* ad_iocdata() */
-};
-
-/* play gain array, converts linear gain to 64 steps of log10 gain */
-static uint8_t cs4231_atten[] = {
- 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, /* [000] -> [004] */
- 0x3a, 0x39, 0x38, 0x37, 0x36, /* [005] -> [009] */
- 0x35, 0x34, 0x33, 0x32, 0x31, /* [010] -> [014] */
- 0x30, 0x2f, 0x2e, 0x2d, 0x2c, /* [015] -> [019] */
- 0x2b, 0x2a, 0x29, 0x29, 0x28, /* [020] -> [024] */
- 0x28, 0x27, 0x27, 0x26, 0x26, /* [025] -> [029] */
- 0x25, 0x25, 0x24, 0x24, 0x23, /* [030] -> [034] */
- 0x23, 0x22, 0x22, 0x21, 0x21, /* [035] -> [039] */
- 0x20, 0x20, 0x1f, 0x1f, 0x1f, /* [040] -> [044] */
- 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, /* [045] -> [049] */
- 0x1d, 0x1c, 0x1c, 0x1c, 0x1b, /* [050] -> [054] */
- 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, /* [055] -> [059] */
- 0x1a, 0x19, 0x19, 0x19, 0x19, /* [060] -> [064] */
- 0x18, 0x18, 0x18, 0x18, 0x17, /* [065] -> [069] */
- 0x17, 0x17, 0x17, 0x16, 0x16, /* [070] -> [074] */
- 0x16, 0x16, 0x16, 0x15, 0x15, /* [075] -> [079] */
- 0x15, 0x15, 0x15, 0x14, 0x14, /* [080] -> [084] */
- 0x14, 0x14, 0x14, 0x13, 0x13, /* [085] -> [089] */
- 0x13, 0x13, 0x13, 0x12, 0x12, /* [090] -> [094] */
- 0x12, 0x12, 0x12, 0x12, 0x11, /* [095] -> [099] */
- 0x11, 0x11, 0x11, 0x11, 0x11, /* [100] -> [104] */
- 0x10, 0x10, 0x10, 0x10, 0x10, /* [105] -> [109] */
- 0x10, 0x0f, 0x0f, 0x0f, 0x0f, /* [110] -> [114] */
- 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, /* [114] -> [119] */
- 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, /* [120] -> [124] */
- 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, /* [125] -> [129] */
- 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, /* [130] -> [134] */
- 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, /* [135] -> [139] */
- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, /* [140] -> [144] */
- 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, /* [145] -> [149] */
- 0x0a, 0x0a, 0x0a, 0x0a, 0x09, /* [150] -> [154] */
- 0x09, 0x09, 0x09, 0x09, 0x09, /* [155] -> [159] */
- 0x09, 0x09, 0x08, 0x08, 0x08, /* [160] -> [164] */
- 0x08, 0x08, 0x08, 0x08, 0x08, /* [165] -> [169] */
- 0x08, 0x07, 0x07, 0x07, 0x07, /* [170] -> [174] */
- 0x07, 0x07, 0x07, 0x07, 0x07, /* [175] -> [179] */
- 0x06, 0x06, 0x06, 0x06, 0x06, /* [180] -> [184] */
- 0x06, 0x06, 0x06, 0x06, 0x05, /* [185] -> [189] */
- 0x05, 0x05, 0x05, 0x05, 0x05, /* [190] -> [194] */
- 0x05, 0x05, 0x05, 0x05, 0x04, /* [195] -> [199] */
- 0x04, 0x04, 0x04, 0x04, 0x04, /* [200] -> [204] */
- 0x04, 0x04, 0x04, 0x04, 0x03, /* [205] -> [209] */
- 0x03, 0x03, 0x03, 0x03, 0x03, /* [210] -> [214] */
- 0x03, 0x03, 0x03, 0x03, 0x03, /* [215] -> [219] */
- 0x02, 0x02, 0x02, 0x02, 0x02, /* [220] -> [224] */
- 0x02, 0x02, 0x02, 0x02, 0x02, /* [225] -> [229] */
- 0x02, 0x01, 0x01, 0x01, 0x01, /* [230] -> [234] */
- 0x01, 0x01, 0x01, 0x01, 0x01, /* [235] -> [239] */
- 0x01, 0x01, 0x01, 0x00, 0x00, /* [240] -> [244] */
- 0x00, 0x00, 0x00, 0x00, 0x00, /* [245] -> [249] */
- 0x00, 0x00, 0x00, 0x00, 0x00, /* [250] -> [254] */
- 0x00 /* [255] */
-};
-
-/*
- * STREAMS Structures
- */
-
-/* STREAMS driver id and limit value structure */
-static struct module_info cs4231_modinfo = {
- CS4231_IDNUM, /* module ID number */
- CS4231_NAME, /* module name */
- CS4231_MINPACKET, /* minimum packet size */
- CS4231_MAXPACKET, /* maximum packet size */
- CS4231_HIWATER, /* high water mark */
- CS4231_LOWATER /* low water mark */
-};
-
-/* STREAMS queue processing procedures structures */
-/* read queue */
-static struct qinit cs4231_rqueue = {
- audio_sup_rput, /* put procedure */
- audio_sup_rsvc, /* service procedure */
- audio_sup_open, /* open procedure */
- audio_sup_close, /* close procedure */
- NULL, /* unused */
- &cs4231_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* write queue */
-static struct qinit cs4231_wqueue = {
- audio_sup_wput, /* put procedure */
- audio_sup_wsvc, /* service procedure */
- NULL, /* open procedure */
- NULL, /* close procedure */
- NULL, /* unused */
- &cs4231_modinfo, /* module parameters */
- NULL /* module statistics */
-};
-
-/* STREAMS entity declaration structure */
-static struct streamtab cs4231_str_info = {
- &cs4231_rqueue, /* read queue */
- &cs4231_wqueue, /* write queue */
- NULL, /* mux lower read queue */
- NULL, /* mux lower write queue */
-};
-
-/*
- * DDI Structures
- */
-
-/* Entry points structure */
-static struct cb_ops cs4231_cb_ops = {
- nulldev, /* cb_open */
- nulldev, /* cb_close */
- nodev, /* cb_strategy */
- nodev, /* cb_print */
- nodev, /* cb_dump */
- nodev, /* cb_read */
- nodev, /* cb_write */
- nodev, /* cb_ioctl */
- nodev, /* cb_devmap */
- nodev, /* cb_mmap */
- nodev, /* cb_segmap */
- nochpoll, /* cb_chpoll */
- ddi_prop_op, /* cb_prop_op */
- &cs4231_str_info, /* cb_str */
- D_NEW|D_MP|D_64BIT, /* cb_flag */
- CB_REV, /* cb_rev */
- nodev, /* cb_aread */
- nodev, /* cb_arwite */
-};
-
-/* Device operations structure */
-static struct dev_ops cs4231_dev_ops = {
- DEVO_REV, /* devo_rev */
- 0, /* devo_refcnt */
- cs4231_getinfo, /* devo_getinfo */
- nulldev, /* devo_identify - obsolete */
- nulldev, /* devo_probe - not needed */
- cs4231_attach, /* devo_attach */
- cs4231_detach, /* devo_detach */
- nodev, /* devo_reset */
- &cs4231_cb_ops, /* devi_cb_ops */
- NULL, /* devo_bus_ops */
- cs4231_power, /* devo_power */
- ddi_quiesce_not_supported, /* devo_quiesce */
-};
-
-/* Linkage structure for loadable drivers */
-static struct modldrv cs4231_modldrv = {
- &mod_driverops, /* drv_modops */
- CS4231_MOD_NAME, /* drv_linkinfo */
- &cs4231_dev_ops /* drv_dev_ops */
-};
-
-/* Module linkage structure */
-static struct modlinkage cs4231_modlinkage = {
- MODREV_1, /* ml_rev */
- (void *)&cs4231_modldrv, /* ml_linkage */
- NULL /* NULL terminates the list */
-};
-
-
-/* ******* Loadable Module Configuration Entry Points ********************* */
-
-/*
- * _init()
- *
- * Description:
- * Driver initialization, called when driver is first loaded.
- * This is how access is initially given to all the static structures.
- *
- * Arguments:
- * None
- *
- * Returns:
- * ddi_soft_state_init() status, see ddi_soft_state_init(9f), or
- * mod_install() status, see mod_install(9f)
- */
-int
-_init(void)
-{
- int error;
-
- ATRACE("in audiocs _init()", 0);
-
- /* initialize the soft state */
- if ((error = ddi_soft_state_init(&cs_statep, sizeof (CS_state_t), 0)) !=
- 0) {
- ATRACE("audiocs ddi_soft_state_init() failed", cs_statep);
- return (error);
- }
-
- if ((error = mod_install(&cs4231_modlinkage)) != 0) {
- ddi_soft_state_fini(&cs_statep);
- }
-
- ATRACE("audiocs _init() cs_statep", cs_statep);
- ATRACE_32("audiocs _init() returning", error);
-
- return (error);
-}
-
-/*
- * _fini()
- *
- * Description:
- * Module de-initialization, called when the driver is to be unloaded.
- *
- * Arguments:
- * None
- *
- * Returns:
- * mod_remove() status, see mod_remove(9f)
- */
-int
-_fini(void)
-{
- int error;
-
- ATRACE("in audiocs _fini()", cs_statep);
-
- if ((error = mod_remove(&cs4231_modlinkage)) != 0) {
- return (error);
- }
-
- /* free the soft state internal structures */
- ddi_soft_state_fini(&cs_statep);
-
- ATRACE_32("audiocs _fini() returning", error);
-
- return (0);
-}
-
-/*
- * _info()
- *
- * Description:
- * Module information, returns infomation about the driver.
- *
- * Arguments:
- * modinfo *modinfop Pointer to the opaque modinfo structure
- *
- * Returns:
- * mod_info() status, see mod_info(9f)
- */
-int
-_info(struct modinfo *modinfop)
-{
- int error;
-
- ATRACE("in audiocs _info()", 0);
-
- error = mod_info(&cs4231_modlinkage, modinfop);
-
- ATRACE_32("audiocs _info() returning", error);
-
- return (error);
-}
-
-
-/* ******* Driver Entry Points ******************************************** */
-/*
- * cs4231_getinfo()
- */
-/*ARGSUSED*/
-static int
-cs4231_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd,
- void *arg, void **result)
-{
- CS_state_t *state;
- int error = DDI_FAILURE;
- int instance;
-
- switch (infocmd) {
- case DDI_INFO_DEVT2DEVINFO:
- instance = audio_sup_devt_to_instance((dev_t)arg);
- if ((state = ddi_get_soft_state(cs_statep,
- instance)) != NULL) {
- *result = state->cs_dip;
- error = DDI_SUCCESS;
- } else {
- *result = NULL;
- }
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = (void *)(uintptr_t)
- audio_sup_devt_to_instance((dev_t)arg);
- error = DDI_SUCCESS;
- break;
- default:
- break;
- }
-
- return (error);
-}
-
-/*
- * cs4231_attach()
- *
- * Description:
- * Attach an instance of the CS4231 driver. This routine does the device
- * dependent attach tasks. When it is complete it calls
- * audio_sup_register() and am_attach() so they may do their work.
- *
- * NOTE: mutex_init() no longer needs a name string, so set
- * to NULL to save kernel space.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_attach_cmd_t cmd Attach command
- *
- * Returns:
- * DDI_SUCCESS The driver was initialized properly
- * DDI_FAILURE The driver couldn't be initialized properly
- */
-static int
-cs4231_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
-{
- CS_state_t *state;
- audiohdl_t ahandle;
- audio_sup_reg_data_t data;
- int instance;
-
- ATRACE("in cs_attach()", dip);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_attach() instance", instance);
- ATRACE("cs_attach() cs_statep", cs_statep);
-
- switch (cmd) {
- case DDI_ATTACH:
- break;
- case DDI_RESUME:
- ATRACE("cs_attach() DDI_RESUME", NULL);
-
- /* we've already allocated the state structure so get ptr */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() RESUME get soft state failed",
- audiocs_name, instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(dip == state->cs_dip);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- ahandle = state->cs_ahandle;
-
- /* power up the Codec */
- ASSERT(state->cs_powered == CS4231_PWR_OFF);
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
- if (pm_raise_power(dip, CS4231_COMPONENT, CS4231_PWR_ON)
- == DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->cs_dip,
- CS4231_COMPONENT);
- audio_sup_log(ahandle, CE_WARN,
- "!attach() DDI_RESUME failed");
- return (DDI_FAILURE);
- }
- mutex_enter(&state->cs_lock);
-
- ASSERT(mutex_owned(&state->cs_lock));
- ASSERT(state->cs_suspended == CS4231_SUSPENDED);
-
- state->cs_suspended = CS4231_NOT_SUSPENDED;
-
- cv_broadcast(&state->cs_cv); /* let entry points continue */
-
- mutex_exit(&state->cs_lock);
-
- /* now restart playing and recording */
- if (audio_sup_restore_state(ahandle, AUDIO_ALL_DEVICES,
- AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!attach() audio restart failed");
- }
-
- /* we're no longer busy */
- ASSERT(state->cs_powered == CS4231_PWR_ON);
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- ATRACE("cs_attach() DDI_RESUME succeeded", NULL);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (DDI_SUCCESS);
- default:
- audio_sup_log(NULL, CE_NOTE,
- "!%s%d: attach() unknown command 0x%x", audiocs_name,
- instance, cmd);
- return (DDI_FAILURE);
- }
-
- /* allocate the state structure */
- if (ddi_soft_state_zalloc(cs_statep, instance) == DDI_FAILURE) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() soft state allocate failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- /*
- * WARNING: From here on all errors require that we free memory,
- * including the state structure.
- */
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: attach() get soft state failed", audiocs_name,
- instance);
- goto error_mem;
- }
-
- /* call audiosup module registration routine */
- ATRACE("cs_attach() calling audio_sup_register()", NULL);
- data.asrd_version = AUDIOSUP_VERSION;
- data.asrd_key = NULL;
- if ((state->cs_ahandle = audio_sup_register(dip, &data)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: cs4231_attach() audio_sup_register() failed",
- audiocs_name, instance);
- goto error_mem;
- }
-
- ahandle = state->cs_ahandle;
-
- /* initialize the audio state structures */
- if ((cs4231_init_state(state, dip)) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!attach() init_state() failed");
- goto error_audiosup;
- }
-
- /* initialize the audio chip */
- ATRACE("cs_attach() calling chip_init()", NULL);
- if ((cs4231_chip_init(state)) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN, "!attach() chip_init() failed");
- goto error_destroy;
- }
-
- /* save private state */
- audio_sup_set_private(ahandle, state);
-
- /* call the mixer attach() routine */
- ATRACE("cs_attach() calling am_attach()", &state->cs_ad_info);
- if (am_attach(ahandle, cmd, &state->cs_ad_info) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN, "!attach() am_attach() failed");
- goto error_destroy;
- }
-
- /* set up kernel statistics */
- if ((state->cs_ksp = kstat_create(audiocs_name, instance, audiocs_name,
- "controller", KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT)) != NULL) {
- kstat_install(state->cs_ksp);
- }
-
- /* we're ready, set up the interrupt handler */
- ATRACE("cs_attach() calling DMA_ADD_INTR()", state);
- if (CS4231_DMA_ADD_INTR(state) != AUDIO_SUCCESS) {
- ATRACE("cs_attach() DMA_ADD_INTR() failed", state);
- goto error_kstat;
- }
-
- /* everything worked out, so report the device */
- ddi_report_dev(dip);
-
- ATRACE("cs_attach() returning success", state);
-
- return (DDI_SUCCESS);
-
-error_kstat:
- ATRACE("cs_attach() error_kstat", state);
- if (state->cs_ksp) {
- kstat_delete(state->cs_ksp);
- }
-
- (void) am_detach(ahandle, DDI_DETACH);
-
-error_destroy:
- ATRACE("cs_attach() error_destroy", state);
- CS4231_DMA_UNMAP_REGS(state);
- mutex_destroy(&state->cs_lock);
- cv_destroy(&state->cs_cv);
-
-error_audiosup:
- ATRACE("cs_attach() error_audiosup", state);
- (void) audio_sup_unregister(ahandle);
-
-error_mem:
- ATRACE("cs_attach() error_mem", state);
- ddi_soft_state_free(cs_statep, instance);
-
- ATRACE("cs_attach() returning failure", NULL);
-
- return (DDI_FAILURE);
-
-} /* cs4231_attach() */
-
-/*
- * cs4231_detach()
- *
- * Description:
- * Detach an instance of the CS4231 driver. After the Codec is detached
- * we call am_detach() and audio_sup_unregister() so they may do their
- * work.
- *
- * Power management is pretty simple. If active we fail, otherwise
- * we save the Codec state.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's dev_info struct
- * ddi_detach_cmd_t cmd Detach command
- *
- * Returns:
- * DDI_SUCCESS The driver was detached
- * DDI_FAILURE The driver couldn't be detached
- */
-static int
-cs4231_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
-{
- CS_state_t *state;
- audiohdl_t ahandle;
- ddi_acc_handle_t handle;
- int instance;
-
- ATRACE_32("in cs_detach()", cmd);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_detach() instance", instance);
- ATRACE("cs_detach() cs_statep", cs_statep);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: detach() get soft state failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
- ahandle = state->cs_ahandle;
-
- switch (cmd) {
- case DDI_DETACH:
- break;
- case DDI_SUSPEND:
- ATRACE("cs_detach() DDI_SUSPEND", NULL);
-
- mutex_enter(&state->cs_lock);
-
- ASSERT(state->cs_suspended == CS4231_NOT_SUSPENDED);
- state->cs_suspended = CS4231_SUSPENDED; /* stop new ops */
-
- /* wait for current operations to complete */
- while (state->cs_busy_cnt != 0) {
- cv_wait(&state->cs_cv, &state->cs_lock);
- }
-
- if (state->cs_powered == CS4231_PWR_ON) {
- /* stop playing and recording */
- CS4231_DMA_STOP_RECORD(state);
- CS4231_DMA_STOP_PLAY(state);
-
- /* now we can power down the Codec */
- cs4231_power_down(state);
-
- if (audio_sup_save_state(ahandle, AUDIO_ALL_DEVICES,
- AUDIO_BOTH) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!detach() audio save failed");
- }
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_detach() SUSPEND successful", state);
- ASSERT(!mutex_owned(&state->cs_lock));
- return (DDI_SUCCESS);
- default:
- ATRACE_32("cs_detach() unknown command failure", cmd);
- audio_sup_log(ahandle, CE_NOTE,
- "!detach() unknown command 0x%x", cmd);
- return (DDI_FAILURE);
- }
-
- if (state->cs_powered == CS4231_PWR_ON) {
- /*
- * Make sure the Codec and DMA engine are off.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~(INTC_PEN|INTC_CEN),
- INTC_VALID_MASK);
-
- /* make sure the DMA engine isn't going to do anything */
- CS4231_DMA_RESET(state);
-
- /*
- * power down the device, no reason to waste power without
- * a driver
- */
- (void) pm_lower_power(state->cs_dip, CS4231_COMPONENT,
- CS4231_PWR_OFF);
- }
-
- /*
- * unregister the interrupt. That way we can't get called by and
- * interrupt after the audio framework is removed.
- */
- ATRACE("cs_detach() calling DMA_REM_INTR", state);
- CS4231_DMA_REM_INTR(dip, state);
-
- /*
- * Call the mixer detach routine to tear down the mixer before
- * we lose the hardware.
- */
- ATRACE("cs_detach() calling am_detach()", dip);
- if (am_detach(ahandle, cmd) == AUDIO_FAILURE) {
- ATRACE_32("cs_detach() am_detach() failed", cmd);
- return (DDI_FAILURE);
- }
- ATRACE("cs_detach() calling audio_sup_unregister()", dip);
- if (audio_sup_unregister(ahandle) == AUDIO_FAILURE) {
- ATRACE_32("cs_detach() audio_sup_unregister() failed", cmd);
- return (DDI_FAILURE);
- }
-
- ASSERT(state->cs_busy_cnt == 0);
-
- /* unmap the registers */
- CS4231_DMA_UNMAP_REGS(state);
-
- /* free the kernel statistics structure */
- if (state->cs_ksp) {
- kstat_delete(state->cs_ksp);
- }
- state->cs_ksp = NULL;
-
- /* destroy the state mutex */
- mutex_destroy(&state->cs_lock);
- cv_destroy(&state->cs_cv);
-
- /* free the memory for the state pointer */
- ddi_soft_state_free(cs_statep, instance);
-
- ATRACE("cs_detach() returning success", cs_statep);
-
- return (DDI_SUCCESS);
-
-} /* cs4231_detach() */
-
-/*
- * cs4231_power()
- *
- * Description:
- * This routine is used to turn the power to the Codec on and off.
- * The different DMA engines have different ways to turn on/off the
- * power to the Codec. Therefore we call the DMA engine specific code
- * to do the work, if we need to make a change.
- *
- * If the level is CS4231_PWR_OFF then we call cs4231_power_down(). If the
- * level is CS4231_PWR_ON then we call cs4231_power_up().
- *
- * This routine doesn't stop or restart play and record. Other routines
- * are responsible for that.
- *
- * Arguments:
- * def_info_t *dip Ptr to the device's dev_info structure
- * int component Which component to power up/down
- * int level The power level for the component
- *
- * Returns:
- * DDI_SUCCESS Power level changed, we always succeed
- */
-static int
-cs4231_power(dev_info_t *dip, int component, int level)
-{
- CS_state_t *state;
- int instance;
- int rc = DDI_FAILURE;
-
- ATRACE("in cs_power()", dip);
- ATRACE("cs_power() cs_statep", cs_statep);
- ASSERT(component == 0);
-
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_power() instance", instance);
-
- /* get the state structure */
- if ((state = ddi_get_soft_state(cs_statep, instance)) == NULL) {
- audio_sup_log(NULL, CE_WARN,
- "!%s%d: power() get soft state failed", audiocs_name,
- instance);
- return (DDI_FAILURE);
- }
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* make sure we have some work to do */
- mutex_enter(&state->cs_lock);
-
- /* check the level change to see what we need to do */
- if (level == CS4231_PWR_OFF && state->cs_powered == CS4231_PWR_ON) {
-
- /* don't power off if we're busy */
- if (state->cs_busy_cnt) {
- /* device is busy, so don't power off */
- mutex_exit(&state->cs_lock);
-
- /* reset the timer */
- (void) pm_idle_component(dip, CS4231_COMPONENT);
-
- ATRACE("cs_power() power off failed, busy",
- state->cs_busy_cnt);
- ASSERT(rc == DDI_FAILURE);
-
- goto done;
- }
- /* power down and save the state */
- cs4231_power_down(state);
-
- } else if (level == CS4231_PWR_ON &&
- state->cs_powered == CS4231_PWR_OFF) {
-
- /* power up */
- cs4231_power_up(state);
-
-#ifdef DEBUG
- } else {
- ATRACE_32("cs_power() no change to make", level);
-#endif
- }
-
- mutex_exit(&state->cs_lock);
-
- rc = DDI_SUCCESS;
-
-done:
- ASSERT(!mutex_owned(&state->cs_lock));
- ATRACE("cs4231_power() done", level);
-
- return (rc);
-
-} /* cs4231_power() */
-
-
-/* ******* Audio Driver Entry Point Routines ******************************* */
-
-/*
- * cs4231_ad_pause_play()
- *
- * Description:
- * This routine pauses the play DMA engine.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_pause_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
-
- ATRACE("in cs_ad_pause_play()", ahandle);
- ATRACE("cs_ad_pause_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!pause_play() set_busy() failed");
- return;
- }
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- ATRACE("cs_ad_pause_play() calling DMA_PAUSE_PLAY()", state);
- CS4231_DMA_PAUSE_PLAY(state);
- ATRACE("cs_ad_pause_play() DMA_PAUSE_PLAY() returned", state);
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs_ad_pause_play() returning", state);
-
-} /* cs4231_ad_pause_play() */
-
-/*
- * cs4231_ad_set_config()
- *
- * Description:
- * This routine is used to set new Codec parameters, except the data
- * format which has it's own routine. If the Codec doesn't support a
- * particular parameter and it is asked to set it then we return
- * AUDIO_FAILURE.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int command The configuration to set
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int arg1 Argument #1
- * int arg2 Argument #2, not always needed
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The Codec parameter has not been set, or the
- * parameter couldn't be set
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_set_config(audiohdl_t ahandle, int stream, int command, int dir,
- int arg1, int arg2)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("in cs_ad_set_config()", command);
- ATRACE_32("cs_ad_set_config() stream", stream);
- ATRACE_32("cs_ad_set_config() command", command);
- ATRACE_32("cs_ad_set_config() dir", dir);
- ATRACE_32("cs_ad_set_config() arg1", arg1);
- ATRACE_32("cs_ad_set_config() arg2", arg2);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!set_config() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- /* CAUTION: From here on we must goto done to exit. */
-
- handle = state->cs_handles.cs_codec_hndl;
-
- switch (command) {
- case AM_SET_GAIN:
- /*
- * Set the gain for a channel. The audio mixer calculates the
- * impact, if any, on the channel's gain.
- *
- * 0 <= gain <= AUDIO_MAX_GAIN
- *
- * arg1 --> gain
- * arg2 --> channel #, 0 = left, 1 = right
- */
-
- rc = cs4231_set_gain(state, stream, dir, arg1, arg2);
- break;
-
- case AM_SET_PORT:
- /*
- * Enable/disable the input or output ports. The audio mixer
- * enforces exclusiveness of ports, as well as which ports
- * are modifyable. We just turn on the ports that match the
- * bits.
- *
- * arg1 --> port bit pattern
- * arg2 --> not used
- */
-
- rc = cs4231_set_port(state, dir, arg1);
- break;
-
- case AM_SET_MONITOR_GAIN:
- /*
- * Set the loopback monitor gain.
- *
- * 0 <= gain <= AUDIO_MAX_GAIN
- *
- * dir ---> N/A
- * arg1 --> gain
- * arg2 --> not used
- */
-
- rc = cs4231_set_monitor_gain(state, arg1);
- break;
-
- case AM_OUTPUT_MUTE:
- /*
- * Mute or enable the output.
- *
- * dir ---> N/A
- * arg1 --> ~0 = mute, 0 = unmute
- * arg2 --> not used
- */
- mutex_enter(&state->cs_lock);
-
- if (arg1) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LDACO_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, LDACO_LDM,
- LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RDACO_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, RDACO_RDM,
- RDAC0_VALID_MASK);
- state->cs_output_muted = B_TRUE;
- } else { /* Unmute */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LDACO_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LDACO_LDM,
- LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RDACO_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RDACO_RDM,
- RDAC0_VALID_MASK);
- state->cs_output_muted = B_FALSE;
- }
- mutex_exit(&state->cs_lock);
-
- rc = AUDIO_SUCCESS;
- goto done;
-
- case AM_MIC_BOOST:
- /*
- * Enable or disable the mic's 20 dB boost preamplifier.
- *
- * dir ---> N/A
- * arg1 --> ~0 == enable, 0 == disabled
- * arg2 --> not used
- */
- mutex_enter(&state->cs_lock);
- if (arg1) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, LADCI_LMGE,
- LADCI_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, RADCI_RMGE,
- RADCI_VALID_MASK);
- state->cs_ad_info.ad_add_mode |= AM_ADD_MODE_MIC_BOOST;
- } else {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LADCI_LMGE,
- LADCI_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RADCI_RMGE,
- RADCI_VALID_MASK);
- state->cs_ad_info.ad_add_mode &= ~AM_ADD_MODE_MIC_BOOST;
- }
- mutex_exit(&state->cs_lock);
-
- rc = AUDIO_SUCCESS;
- goto done;
-
- default:
- /*
- * We let default catch commands we don't support, as well
- * as bad commands.
- */
- ATRACE_32("cs_ad_set_config() unsupported command", command);
- goto done;
- }
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE_32("cs4231_ad_set_config() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_ad_set_config() */
-
-/*
- * cs4231_ad_set_format()
- *
- * Description:
- * This routine is used to set a new Codec data format.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int sample_rate Data sample rate
- * int channels Number of channels, 1 or 2
- * int precision Bits per sample, 8 or 16
- * int encoding Encoding method, u-law, A-law and linear
- *
- * Returns:
- * AUDIO_SUCCESS The Codec data format has been set
- * AUDIO_FAILURE The Codec data format has not been set, or the
- * data format couldn't be set
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_set_format(audiohdl_t ahandle, int stream, int dir,
- int sample_rate, int channels, int precision, int encoding)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- uint8_t mask;
- uint8_t value;
- int rc = AUDIO_FAILURE;
-
- ATRACE_32("in cs_ad_set_format()", sample_rate);
- ATRACE("cs_ad_set_format() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* wait on suspend, power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!set_format() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /*
- * CAUTION: From here on we must goto done to exit.
- */
-
- if (dir == AUDIO_PLAY) { /* sample rate set on play side only */
- switch (sample_rate) {
- case CS4231_SAMPR5510: value = FS_5510; break;
- case CS4231_SAMPR6620: value = FS_6620; break;
- case CS4231_SAMPR8000: value = FS_8000; break;
- case CS4231_SAMPR9600: value = FS_9600; break;
- case CS4231_SAMPR11025: value = FS_11025; break;
- case CS4231_SAMPR16000: value = FS_16000; break;
- case CS4231_SAMPR18900: value = FS_18900; break;
- case CS4231_SAMPR22050: value = FS_22050; break;
- case CS4231_SAMPR27420: value = FS_27420; break;
- case CS4231_SAMPR32000: value = FS_32000; break;
- case CS4231_SAMPR33075: value = FS_33075; break;
- case CS4231_SAMPR37800: value = FS_37800; break;
- case CS4231_SAMPR44100: value = FS_44100; break;
- case CS4231_SAMPR48000: value = FS_48000; break;
- default:
- ATRACE_32("cs_ad_set_format() bad sample rate",
- sample_rate);
- goto done;
- }
- } else {
- value = 0;
- }
-
- /* if not mono then must be stereo, i.e., the default */
- if (channels == AUDIO_CHANNELS_STEREO) {
- ATRACE_32("cs_ad_set_format() STEREO", channels);
- value |= PDF_STEREO;
- } else if (channels != AUDIO_CHANNELS_MONO) {
- ATRACE_32("cs_ad_set_format() bad # of channels", channels);
- goto done;
-#ifdef DEBUG
- } else {
- ATRACE_32("cs_ad_set_format() MONO", channels);
-#endif
- }
-
- if (precision == AUDIO_PRECISION_8) {
- ATRACE_32("cs_ad_set_format() 8-bit", precision);
- switch (encoding) {
- case AUDIO_ENCODING_ULAW:
- value |= PDF_ULAW8;
- break;
- case AUDIO_ENCODING_ALAW:
- value |= PDF_ALAW8;
- break;
- case AUDIO_ENCODING_LINEAR:
- value |= PDF_LINEAR8;
- break;
- default:
- goto done;
- }
- } else { /* 16 bit, default, and there is only one choice */
- ATRACE_32("cs_ad_set_format() 16-bit", precision);
- if (encoding != AUDIO_ENCODING_LINEAR) {
- goto done;
- }
-
- value |= PDF_LINEAR16BE;
- }
-
- mutex_enter(&state->cs_lock);
- if (dir == AUDIO_PLAY) { /* play side */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- ATRACE_8("cs_ad_set_format() programming FSDF_REG", value);
- state->cs_play_sr = sample_rate;
- state->cs_play_ch = channels;
- state->cs_play_prec = precision;
- state->cs_play_enc = encoding;
- state->cs_save_pe = value;
- mask = FSDF_VALID_MASK;
- } else { /* capture side */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (CDF_REG | IAR_MCE), __LINE__, thisfile);
- ATRACE_8("cs_ad_set_format() programming CDF_REG", value);
- state->cs_record_sr = sample_rate;
- state->cs_record_ch = channels;
- state->cs_record_prec = precision;
- state->cs_record_enc = encoding;
- state->cs_save_ce = value;
- mask = CDF_VALID_MASK;
- }
-
- cs4231_put8(ahandle, handle, &CS4231_IDR, value, mask,
- __LINE__, thisfile);
-
- (void) cs4231_poll_ready(state);
-
- /* clear the mode change bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, FSDF_REG, __LINE__,
- thisfile);
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("cs_ad_set_format() returning", sample_rate);
-
- rc = AUDIO_SUCCESS;
-
-done:
- /* we're no longer busy */
- cs4231_set_idle(state);
-
- ATRACE_32("cs_ad_set_format() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_ad_set_format() */
-
-/*
- * cs4231_ad_start_play()
- *
- * Description:
- * This routine starts the play DMA engine. It checks to make sure the
- * DMA engine is off before it does anything, otherwise it may mess
- * things up.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * AUDIO_SUCCESS Playing started/restarted
- * AUDIO_FAILURE Audio not restarted, no audio to play
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_start_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc;
-
- ATRACE("in cs_ad_start_play()", ahandle);
- ATRACE("cs_ad_start_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!start_play() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- /* see if we are already playing */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG, __LINE__,
- thisfile);
- if (INTC_PEN & ddi_get8(handle, &CS4231_IDR)) {
- mutex_exit(&state->cs_lock);
- ATRACE("cs_ad_start_play() already playing", NULL);
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- ATRACE("cs_ad_start_play() calling DMA_RESTART_PLAY()", state);
- CS4231_DMA_RESTART_PLAY(state);
- ATRACE_32("cs_ad_start_play() DMA_RESTART_PLAY() returned", 0);
- rc = AUDIO_SUCCESS;
- } else {
- /*
- * The newer versions of the EB2 DMA engine reset on a non-even
- * sample boundary. Then when it restarts it'll be in mid sample
- * which results in loud static. When we start again we reload
- * the format register, which resets the Codec, starting on an
- * even boundary, and thus no static. We end up doing this for
- * the APC DMA engine as well, but it's harmless.
- *
- * CAUTION: Don't do this for record. It causes SunVTS to
- * fail. Also, do not reset the DMA engine if record is
- * active. This occasionally upsets everything.
- */
- if (!(state->cs_flags & RDMA_ENGINE_INITIALIZED)) {
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- state->cs_save_pe, FSDF_VALID_MASK,
- __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- FSDF_REG, __LINE__, thisfile);
- ATRACE("cs_ad_start_play() play DMA engine reset",
- state);
- }
-
- ATRACE("cs_ad_start_play() calling DMA_START_PLAY()", state);
- rc = CS4231_DMA_START_PLAY(state);
- ATRACE_32("cs_ad_start_play() DMA_START_PLAY() returned", rc);
-
- if (rc == AUDIO_SUCCESS) {
- ATRACE("cs_ad_start_play() programming Codec to play",
- state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- INTC_REG, __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_PEN,
- INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_start_play() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
- (void) pm_busy_component(state->cs_dip,
- CS4231_COMPONENT);
- state->cs_flags |= PLAY_ACTIVE;
-#ifdef DEBUG
- } else {
- ATRACE("cs_ad_start_play() Codec not started", rc);
-#endif
- }
-
- }
-
- mutex_exit(&state->cs_lock);
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_start_play() returning", rc);
-
- return (rc);
-
-} /* cs4231_ad_start_play() */
-
-/*
- * cs4231_ad_stop_play()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_stop_play(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("cs_ad_stop_play() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!stop_play() set_busy() failed");
- return;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- ATRACE_8("cs_ad_stop_play() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- /* stop the play DMA engine */
- ATRACE("cs_ad_stop_play() calling DMA_STOP_PLAY()", state);
- CS4231_DMA_STOP_PLAY(state);
- ATRACE("cs_ad_stop_play() DMA_STOP_PLAY() returned", state);
- /* DMA_STOP() returns with the PEN cleared */
-
- if (state->cs_flags & PLAY_ACTIVE) {
- state->cs_flags &= ~PLAY_ACTIVE;
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
- }
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_stop_play() returning", state);
-
-} /* cs4231_ad_stop_play() */
-
-/*
- * cs4231_ad_start_record()
- *
- * Description:
- * This routine starts the record DMA engine. It checks to make sure the
- * DMA engine is off before it does anything, otherwise it may mess
- * things up.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * AUDIO_SUCCESS Recording successfully started
- * AUDIO_FAILURE Recording not successfully started
- */
-/*ARGSUSED*/
-static int
-cs4231_ad_start_record(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
- int rc = AUDIO_FAILURE;
-
- ATRACE("cs_ad_start_record() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!start_record() set_busy() failed");
- return (AUDIO_FAILURE);
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- /* see if we are already recording */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG, __LINE__,
- thisfile);
- if (INTC_CEN & ddi_get8(handle, &CS4231_IDR)) {
- mutex_exit(&state->cs_lock);
- ATRACE("cs_ad_start_record() already recording", NULL);
- rc = AUDIO_SUCCESS;
- goto done;
- }
-
- /*
- * Enable record DMA on the Codec, do NOT reprogram the Codec as
- * done for play. This will cause SunVTS to fail.
- */
- ATRACE("cs_ad_start_record() calling DMA_START_RECORD()", state);
- rc = CS4231_DMA_START_RECORD(state);
- ATRACE("cs_ad_start_record() DMA_START_RECORD() returned", rc);
-
- if (rc == AUDIO_SUCCESS) {
- ATRACE("cs_ad_start_record() programming Codec to rec.", state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_CEN, INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_start_record() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
-
-#ifdef DEBUG
- } else {
- ATRACE("cs_ad_start_record() Codec not started", rc);
-#endif
- }
-
- mutex_exit(&state->cs_lock);
-
-done:
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_start_record() returning", rc);
-
- return (rc);
-
-} /* cs4231_ad_start_record() */
-
-/*
- * cs4231_ad_stop_record()
- *
- * Description:
- * This routine stops the record DMA engine.
- *
- * The stream argument is ignored because this isn't a multi-stream Codec.
- *
- * NOTE: This routine must be called with the state unlocked.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- *
- * Returns:
- * void
- */
-/*ARGSUSED*/
-static void
-cs4231_ad_stop_record(audiohdl_t ahandle, int stream)
-{
- CS_state_t *state;
- ddi_acc_handle_t handle;
-
- ATRACE("cs_ad_stop_record() cs_statep", cs_statep);
-
- /* get the state structure */
- state = audio_sup_get_private(ahandle);
- ASSERT(state);
-
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* power up and mark as busy */
- if (cs4231_set_busy(state) == AUDIO_FAILURE) {
- audio_sup_log(ahandle, CE_WARN,
- "!stop_record() set_busy() failed");
- return;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* we need to protect the state structure */
- mutex_enter(&state->cs_lock);
-
- /* stop the record DMA engine and clear the active flag */
- ATRACE("cs_ad_stop_record() calling DMA_STOP_RECORD()", state);
- CS4231_DMA_STOP_RECORD(state);
- ATRACE("cs_ad_stop_record() DMA_STOP_RECORD() returned", state);
-
- ATRACE("cs_ad_stop_record() programming Codec to rec.", state);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- ATRACE_8("cs_ad_stop_record() Codec INTC_REG",
- ddi_get8(handle, &CS4231_IDR));
-
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- mutex_exit(&state->cs_lock);
-
- /* need an idle for the busy above */
- cs4231_set_idle(state);
-
- ATRACE("cs4231_ad_stop_record() returning", state);
-
-} /* cs4231_ad_stop_record() */
-
-
-/* ******* Local Routines *************************************************** */
-
-/*
- * cs4231_chip_init()
- *
- * Description:
- * Power up the audio core, initialize the audio Codec, prepare the chip
- * for use.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Chip initialized and ready to use
- * AUDIO_FAILURE Chip not initialized and not ready
- */
-static int
-cs4231_chip_init(CS_state_t *state)
-{
- ddi_acc_handle_t handle;
- audiohdl_t ahandle = state->cs_ahandle;
-
- /* make sure we are powered up */
- mutex_enter(&state->cs_lock);
- CS4231_DMA_POWER(state, CS4231_PWR_ON);
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_attach() calling DMA_RESET()", state);
- CS4231_DMA_RESET(state);
-
- /* no autocalibrate */
- state->cs_autocal = B_FALSE;
-
- /* initialize the Codec */
- handle = state->cs_handles.cs_codec_hndl;
-
- /* activate registers 16 -> 31 */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MID_REG,
- __LINE__, thisfile);
- ddi_put8(handle, &CS4231_IDR, MID_MODE2);
-
- /* now figure out what version we have */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, VID_REG,
- __LINE__, thisfile);
- if (ddi_get8(handle, &CS4231_IDR) & VID_A) {
- ATRACE("cs_attach() revA", state);
- state->cs_revA = B_TRUE;
- } else {
- ATRACE("cs_attach() !revA", state);
- state->cs_revA = B_FALSE;
- }
-
- /* get rid of annoying popping by muting the output channels */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LDACO_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LDACO_LDM | LDACO_MID_GAIN), LDAC0_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RDACO_RDM | RDACO_MID_GAIN), RDAC0_VALID_MASK, __LINE__,
- thisfile);
-
- /* initialize aux input channels to known gain values & muted */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LAUX1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LAUX1_LX1M | LAUX1_UNITY_GAIN), LAUX1_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RAUX1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RAUX1_RX1M | RAUX1_UNITY_GAIN), RAUX1_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LAUX2_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (LAUX2_LX2M | LAUX2_UNITY_GAIN), LAUX2_VALID_MASK, __LINE__,
- thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RAUX2_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (RAUX2_RX2M | RAUX2_UNITY_GAIN), RAUX2_VALID_MASK, __LINE__,
- thisfile);
-
- /* initialize aux input channels to known gain values & muted */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LLIC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (LLIC_LLM | LLIC_UNITY_GAIN),
- LLIC_VALID_MASK, __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RLIC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (RLIC_RLM | RLIC_UNITY_GAIN),
- RLIC_VALID_MASK, __LINE__, thisfile);
-
- /* program the sample rate, play and capture must be the same */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (FSDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (FS_8000 | PDF_ULAW8 | PDF_MONO), FSDF_VALID_MASK,
- __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (CDF_REG | IAR_MCE), __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, (CDF_ULAW8 | CDF_MONO),
- CDF_VALID_MASK, __LINE__, thisfile);
-
- /*
- * Set up the Codec for playback and capture disabled, dual DMA, and
- * playback and capture DMA. Also, set autocal if we are supposed to.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (INTC_REG | IAR_MCE), __LINE__, thisfile);
- if (state->cs_autocal == B_TRUE) {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (INTC_ACAL|INTC_DDC|INTC_PDMA|INTC_CDMA), INTC_VALID_MASK,
- __LINE__, thisfile);
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (INTC_DDC | INTC_PDMA | INTC_CDMA), INTC_VALID_MASK,
- __LINE__, thisfile);
- }
-
- /* turn off the MCE bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LADCI_REG,
- __LINE__, thisfile);
-
- /* wait for the Codec before we continue XXX - do we need this? */
- if (cs4231_poll_ready(state) == AUDIO_FAILURE) {
- ATRACE("cs_attach() poll_ready() #1 failed", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Turn on the output level bit to be 2.8 Vpp. Also, don't go to 0 on
- * underflow.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFE1_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, AFE1_OLB, AFE1_VALID_MASK,
- __LINE__, thisfile);
-
- /* turn on the high pass filter if Rev A */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFE2_REG,
- __LINE__, thisfile);
- if (state->cs_revA) {
- cs4231_put8(ahandle, handle, &CS4231_IDR, AFE2_HPF,
- AFE2_VALID_MASK, __LINE__, thisfile);
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR, 0,
- AFE2_VALID_MASK, __LINE__, thisfile);
- }
-
- /* clear the play and capture interrupt flags */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, AFS_REG,
- __LINE__, thisfile);
- ddi_put8(handle, &CS4231_STATUS, (AFS_RESET_STATUS));
-
- /* the play and record gains will be set by the audio mixer */
-
- /* unmute the output */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LDACO_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~LDACO_LDM, LDAC0_VALID_MASK);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~RDACO_RDM, RDAC0_VALID_MASK);
-
- /* unmute the mono speaker and mute mono in */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MIOC_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, MIOC_MIM, MIOC_VALID_MASK,
- __LINE__, thisfile);
-
- /* clear the mode change bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, RDACO_REG,
- __LINE__, thisfile);
-
- /* wait for the Codec before we continue XXX - do we need this? */
- if (cs4231_poll_ready(state) == AUDIO_FAILURE) {
- ATRACE("attach() poll_ready() #2 failed", state);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("cs_attach() chip initialized", state);
- return (AUDIO_SUCCESS);
-
-} /* cs4231_chip_init() */
-
-/*
- * audiocs_init_state()
- *
- * Description:
- * This routine initializes the audio driver's state structure and
- * maps in the registers. This also includes reading the properties.
- *
- * CAUTION: This routine maps the registers and initializes a mutex.
- * Failure cleanup is handled by cs4231_attach(). It is not
- * handled locally by this routine.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * AUDIO_SUCCESS State structure initialized
- * AUDIO_FAILURE State structure not initialized
- */
-static int
-cs4231_init_state(CS_state_t *state, dev_info_t *dip)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- char *prop_str;
- char *pm_comp[] = {
- "NAME=audiocs audio device",
- "0=off",
- "1=on" };
- int cs4231_pints;
- int cs4231_rints;
- size_t cbuf_size;
- size_t pbuf_size;
- int instance;
-
- ATRACE("in cs_init_state()", dip);
- instance = ddi_get_instance(dip);
- ATRACE_32("cs_attach() instance", instance);
-
- /*
- * get the play and record interrupts per second,
- * look for either cs4231_XXXX or XXXX-interrupts.
- */
- if ((cs4231_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_pints", -1)) == -1) {
- cs4231_pints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "play-interrupts", CS4231_INTS);
- }
- ATRACE_32("cs_init_state() play interrupts per sec", cs4231_pints);
-
- if ((cs4231_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_rints", -1)) == -1) {
- cs4231_rints = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "record-interrupts", CS4231_INTS);
- }
- ATRACE_32("cs_init_state() record interrupts per sec", cs4231_rints);
-
- if (cs4231_pints < CS4231_MIN_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() play interrupt rate set too low: %d, resetting"
- " to %d", cs4231_pints, CS4231_INTS);
- cs4231_pints = CS4231_INTS;
- } else if (cs4231_pints > CS4231_MAX_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() play interrupt rate set too high: %d, resetting"
- " to %d", cs4231_pints, CS4231_INTS);
- cs4231_pints = CS4231_INTS;
- }
-
- if (cs4231_rints < CS4231_MIN_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() record interrupt rate set too low: %d, resetting"
- " to %d", cs4231_rints, CS4231_INTS);
- cs4231_rints = CS4231_INTS;
- } else if (cs4231_rints > CS4231_MAX_INTS) {
- audio_sup_log(ahandle, CE_NOTE,
- "attach() record interrupt rate set too high: %d, resetting"
- " to %d", cs4231_rints, CS4231_INTS);
- cs4231_rints = CS4231_INTS;
- }
-
- /*
- * Figure out the largest transfer size for the DMA engine. Then
- * map in the CS4231 and the DMA registers and reset the DMA engine.
- */
- pbuf_size = CS4231_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / cs4231_pints;
- cbuf_size = CS4231_SAMPR48000 * AUDIO_CHANNELS_STEREO *
- (AUDIO_PRECISION_16 >> AUDIO_PRECISION_SHIFT) / cs4231_rints;
-
- /* get the mode from the .conf file */
-
- if ((state->cs_ad_info.ad_mode = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "cs4231_mode", -1)) == -1) {
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "mixer-mode", AM_MIXER_MODE)) {
- state->cs_ad_info.ad_mode = AM_MIXER_MODE;
- } else {
- state->cs_ad_info.ad_mode = AM_COMPAT_MODE;
- }
- }
- ATRACE_32("cs_init_state() setting mode", state->cs_ad_info.ad_mode);
-
- /* set up the pm-components */
- if (ddi_prop_update_string_array(DDI_DEV_T_NONE, dip,
- "pm-components", pm_comp, 3) != DDI_PROP_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!init_state() couldn't create component");
- return (AUDIO_FAILURE);
- }
-
- /* save the device info pointer */
- state->cs_dip = dip;
-
- /* get the iblock cookie needed for interrupt context */
- if (ddi_get_iblock_cookie(dip, (uint_t)0, &state->cs_iblock) !=
- DDI_SUCCESS) {
- audio_sup_log(ahandle, CE_WARN,
- "!init_state() cannot get iblock cookie");
- return (AUDIO_FAILURE);
- }
-
- /* now fill it in, initialize the state mutexs first */
- mutex_init(&state->cs_lock, NULL, MUTEX_DRIVER, state->cs_iblock);
- cv_init(&state->cs_cv, NULL, CV_DRIVER, NULL);
-
- /* fill in the device default state */
- state->cs_defaults.play.sample_rate = CS4231_DEFAULT_SR;
- state->cs_defaults.play.channels = CS4231_DEFAULT_CH;
- state->cs_defaults.play.precision = CS4231_DEFAULT_PREC;
- state->cs_defaults.play.encoding = CS4231_DEFAULT_ENC;
- state->cs_defaults.play.gain = CS4231_DEFAULT_PGAIN;
- state->cs_defaults.play.port = AUDIO_SPEAKER;
- state->cs_defaults.play.buffer_size = CS4231_BSIZE;
- state->cs_defaults.play.balance = CS4231_DEFAULT_BAL;
- state->cs_defaults.record.sample_rate = CS4231_DEFAULT_SR;
- state->cs_defaults.record.channels = CS4231_DEFAULT_CH;
- state->cs_defaults.record.precision = CS4231_DEFAULT_PREC;
- state->cs_defaults.record.encoding = CS4231_DEFAULT_ENC;
- state->cs_defaults.record.gain = CS4231_DEFAULT_PGAIN;
- state->cs_defaults.record.port = AUDIO_MICROPHONE;
- state->cs_defaults.record.buffer_size = CS4231_BSIZE;
- state->cs_defaults.record.balance = CS4231_DEFAULT_BAL;
- state->cs_defaults.monitor_gain = CS4231_DEFAULT_MONITOR_GAIN;
- state->cs_defaults.output_muted = B_FALSE;
- state->cs_defaults.hw_features = AUDIO_HWFEATURE_DUPLEX|
- AUDIO_HWFEATURE_IN2OUT|AUDIO_HWFEATURE_PLAY|AUDIO_HWFEATURE_RECORD;
- state->cs_defaults.sw_features = AUDIO_SWFEATURE_MIXER;
-
- /* fill in the ad_info structure */
- state->cs_ad_info.ad_int_vers = AM_VERSION;
-
- state->cs_ad_info.ad_add_mode = 0;
- state->cs_ad_info.ad_codec_type = AM_TRAD_CODEC;
- state->cs_ad_info.ad_defaults = &state->cs_defaults;
- state->cs_ad_info.ad_play_comb = cs_combinations;
- state->cs_ad_info.ad_rec_comb = cs_combinations;
- state->cs_ad_info.ad_entry = &cs_entry;
- state->cs_ad_info.ad_dev_info = &state->cs_dev_info;
- state->cs_ad_info.ad_diag_flags = 0;
- state->cs_ad_info.ad_diff_flags = AM_DIFF_CH|AM_DIFF_PREC|AM_DIFF_ENC;
- state->cs_ad_info.ad_assist_flags = AM_ASSIST_MIC;
- state->cs_ad_info.ad_misc_flags = AM_MISC_RP_EXCL|AM_MISC_MONO_DUP;
- state->cs_ad_info.ad_translate_flags =
- AM_MISC_8_P_TRANSLATE|AM_MISC_8_R_TRANSLATE;
- state->cs_ad_info.ad_num_mics = 1;
-
- /* play capabilities */
- state->cs_ad_info.ad_play.ad_mixer_srs = cs_mixer_sample_rates;
- state->cs_ad_info.ad_play.ad_compat_srs = cs_compat_sample_rates;
- state->cs_ad_info.ad_play.ad_conv = &am_src2;
- state->cs_ad_info.ad_play.ad_sr_info = NULL;
- state->cs_ad_info.ad_play.ad_chs = cs_channels;
- state->cs_ad_info.ad_play.ad_int_rate = cs4231_pints;
- state->cs_ad_info.ad_play.ad_max_chs = CS4231_MAX_CHANNELS;
- state->cs_ad_info.ad_play.ad_bsize = CS4231_BSIZE;
-
- /* record capabilities */
- state->cs_ad_info.ad_record.ad_mixer_srs = cs_mixer_sample_rates;
- state->cs_ad_info.ad_record.ad_compat_srs = cs_compat_sample_rates;
- state->cs_ad_info.ad_record.ad_conv = &am_src2;
- state->cs_ad_info.ad_record.ad_sr_info = NULL;
- state->cs_ad_info.ad_record.ad_chs = cs_channels;
- state->cs_ad_info.ad_record.ad_int_rate = cs4231_rints;
- state->cs_ad_info.ad_record.ad_max_chs = CS4231_MAX_CHANNELS;
- state->cs_ad_info.ad_record.ad_bsize = CS4231_BSIZE;
-
- /* figure out which DMA engine hardware we have */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "dma-model", &prop_str) == DDI_PROP_SUCCESS) {
- if (strcmp(prop_str, "eb2dma") == 0) {
- ATRACE("cs_attach() eb2dma", state);
- state->cs_dma_engine = EB2_DMA;
- state->cs_dma_ops = &cs4231_eb2dma_ops;
- } else {
- ATRACE("cs_attach() apcdma", state);
- state->cs_dma_engine = APC_DMA;
- state->cs_dma_ops = &cs4231_apcdma_ops;
- }
- ddi_prop_free(prop_str);
- } else {
- ATRACE("cs_attach() no prop apcdma", state);
- state->cs_dma_engine = APC_DMA;
- state->cs_dma_ops = &cs4231_apcdma_ops;
- }
-
- /* cs_regs, cs_eb2_regs and cs_handles filled in later */
-
- (void) strcpy(&state->cs_dev_info.name[0], CS_DEV_NAME);
- /* always set to onboard1, not really correct, but very high runner */
- (void) strcpy(&state->cs_dev_info.config[0], CS_DEV_CONFIG_ONBRD1);
- /* version filled in below */
-
- /* most of what's left is filled in when the registers are mapped */
-
- ATRACE("cs_init_state() calling get_ports()", state);
- cs4231_get_ports(state, dip);
-
- /* Map in the registers */
- if (CS4231_DMA_MAP_REGS(dip, state, pbuf_size, cbuf_size) ==
- AUDIO_FAILURE) {
- goto error_regs;
- }
-
- state->cs_instance = ddi_get_instance(dip);
- state->cs_suspended = CS4231_NOT_SUSPENDED;
- state->cs_powered = CS4231_PWR_OFF;
- state->cs_busy_cnt = 0;
-
- return (AUDIO_SUCCESS);
-
-error_regs:
- ATRACE("cs_init_state() error_regs", state);
- mutex_destroy(&state->cs_lock);
-
- ATRACE("cs_init_state() returning failure", NULL);
-
- return (AUDIO_FAILURE);
-
-} /* cs4231_init_state */
-
-/*
- * cs4231_get_ports()
- *
- * Description:
- * Get which audiocs h/w version we have and use this to
- * determine the input and output ports as well whether or not
- * the hardware has internal loopbacks or not. We also have three
- * different ways for the properties to be specified, which we
- * also need to worry about.
- *
- * Vers Platform(s) DMA eng. audio-module** loopback
- * a SS-4+/SS-5+ apcdma no no
- * b Ultra-1&2 apcdma no yes
- * c positron apcdma no yes
- * d PPC - retired
- * e x86 - retired
- * f tazmo eb2dma Perigee no
- * g tazmo eb2dma Quark yes
- * h darwin+ eb2dma no N/A
- *
- * Vers model~ aux1* aux2*
- * a N/A N/A N/A
- * b N/A N/A N/A
- * c N/A N/A N/A
- * d retired
- * e retired
- * f SUNW,CS4231f N/A N/A
- * g SUNW,CS4231g N/A N/A
- * h SUNW,CS4231h cdrom none
- *
- * * = Replaces internal-loopback for latest property type, can be
- * set to "cdrom", "loopback", or "none".
- *
- * ** = For plugin audio modules only. Starting with darwin, this
- * property is replaces by the model property.
- *
- * ~ = Replaces audio-module.
- *
- * + = Has the capability of having a cable run from the internal
- * CD-ROM to the audio device.
- *
- * N/A = Not applicable, the property wasn't created for early
- * platforms, or the property has been retired.
- *
- * NOTE: Older tazmo and quark machines don't have the model property.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * dev_info_t *dip Pointer to the device's dev_info struct
- *
- * Returns:
- * void
- */
-static void
-cs4231_get_ports(CS_state_t *state, dev_info_t *dip)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- char *prop_str;
-
- ATRACE("Beginning cs4231_get_ports()", NULL);
-
- /* First we set the common ports, etc. */
- state->cs_defaults.play.avail_ports =
- AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT;
- state->cs_defaults.play.mod_ports =
- AUDIO_SPEAKER|AUDIO_HEADPHONE|AUDIO_LINE_OUT;
- state->cs_defaults.record.avail_ports =
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->cs_defaults.record.mod_ports |=
- AUDIO_MICROPHONE|AUDIO_LINE_IN|AUDIO_CODEC_LOOPB_IN;
- state->cs_cd_input_line = NO_INTERNAL_CD;
-
- /* now we try the new "model" property */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
- "model", &prop_str) == DDI_PROP_SUCCESS) {
- if (strcmp(prop_str, "SUNW,CS4231h") == 0) {
- /* darwin */
- ATRACE("cs_attach() NEW - darwin", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_H);
- state->cs_defaults.record.avail_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_defaults.play.mod_ports =
- AUDIO_SPEAKER;
- state->cs_defaults.record.avail_ports |= AUDIO_CD;
- state->cs_defaults.record.mod_ports |= AUDIO_CD;
- state->cs_cd_input_line = INTERNAL_CD_ON_AUX1;
- } else if (strcmp(prop_str, "SUNW,CS4231g") == 0) {
- /* quark audio module */
- ATRACE("cs_attach() NEW - quark", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_G);
- state->cs_defaults.record.avail_ports |= AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |= AUDIO_SUNVTS;
- } else if (strcmp(prop_str, "SUNW,CS4231f") == 0) {
- /* tazmo */
- ATRACE("cs_attach() NEW - tazmo", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_F);
- } else {
- ATRACE("cs_attach() NEW - unknown", state);
- (void) strcpy(&state->cs_dev_info.version[0], "?");
- audio_sup_log(ahandle, CE_NOTE,
- "!attach() unknown audio model: %s, some parts of "
- "audio may not work correctly",
- (prop_str ? prop_str : "unknown"));
- }
- ddi_prop_free(prop_str); /* done with the property */
- } else { /* now try the older "audio-module" property */
- if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "audio-module", &prop_str) ==
- DDI_PROP_SUCCESS) {
- switch (*prop_str) {
- case 'Q': /* quark audio module */
- ATRACE("cs_attach() OLD - quark", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_G);
- state->cs_defaults.record.avail_ports |=
- AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |=
- AUDIO_SUNVTS;
- break;
- case 'P': /* tazmo */
- ATRACE("cs_attach() OLD - tazmo", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_F);
- break;
- default:
- ATRACE("cs_attach() OLD - unknown", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- "?");
- audio_sup_log(ahandle, CE_NOTE,
- "!attach() unknown audio module: %s, some "
- "parts of audio may not work correctly",
- (prop_str ? prop_str : "unknown"));
- break;
- }
- ddi_prop_free(prop_str); /* done with the prop */
- } else { /* now try heuristics, ;-( */
- if (ddi_prop_get_int(DDI_DEV_T_ANY, dip,
- DDI_PROP_DONTPASS, "internal-loopback", B_FALSE)) {
- if (state->cs_dma_engine == EB2_DMA) {
- ATRACE("cs_attach() OLD - C", state);
- (void) strcpy(
- &state->cs_dev_info.version[0],
- CS_DEV_VERSION_C);
- } else {
- ATRACE("cs_attach() OLD - B", state);
- (void) strcpy(
- &state->cs_dev_info.version[0],
- CS_DEV_VERSION_B);
- }
- state->cs_defaults.record.avail_ports |=
- AUDIO_SUNVTS;
- state->cs_defaults.record.mod_ports |=
- AUDIO_SUNVTS;
- } else {
- ATRACE("cs_attach() ANCIENT - A", state);
- (void) strcpy(&state->cs_dev_info.version[0],
- CS_DEV_VERSION_A);
- state->cs_defaults.record.avail_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_defaults.record.mod_ports |=
- AUDIO_INTERNAL_CD_IN;
- state->cs_cd_input_line = INTERNAL_CD_ON_AUX1;
- }
- }
- }
-
- ATRACE("Finished in cs4231_get_ports()", NULL);
-
-} /* cs4231_get_ports() */
-
-/*
- * cs4231_power_up()
- *
- * Description:
- * Power up the Codec and restore the codec's registers.
- *
- * NOTE: Like the audiots driver, we don't worry about locking since
- * the only routines that may call us are attach() and power()
- * Both of which should be the only threads in the driver.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_power_up(CS_state_t *state)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- int i;
-
- ASSERT(mutex_owned(&state->cs_lock));
- ATRACE("in cs4231_power_up()", NULL);
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /* turn on the Codec */
- CS4231_DMA_POWER(state, CS4231_PWR_ON);
-
- /* reset the DMA engine(s) */
- CS4231_DMA_RESET(state);
-
- /*
- * Reload the Codec's registers, the DMA engines will be
- * taken care of when play and record start up again. But
- * first enable registers 16 -> 31.
- */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, MID_REG,
- __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR, state->cs_save[MID_REG],
- MID_VALID_MASK, __LINE__, thisfile);
-
- for (i = 0; i < CS4231_REGS; i++) {
- /* restore Codec registers */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- (i | IAR_MCE), __LINE__, thisfile);
- ddi_put8(handle, &CS4231_IDR, state->cs_save[i]);
- drv_usecwait(500); /* chip bug */
- }
- /* clear MCE bit */
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, 0, __LINE__,
- thisfile);
-
- ASSERT(state->cs_powered == CS4231_PWR_ON);
-
- ATRACE("cs_power() power up successful", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
-} /* cs4231_power_up() */
-
-/*
- * cs4231_power_down()
- *
- * Description:
- * Power down the Codec and save the codec's registers.
- *
- * NOTE: See the note in cs4231_power_up() about locking.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_power_down(CS_state_t *state)
-{
- ddi_acc_handle_t handle;
- int i;
-
- ASSERT(mutex_owned(&state->cs_lock));
- ATRACE("in cs4231_power_down()", NULL);
-
- handle = state->cs_handles.cs_codec_hndl;
-
- /*
- * We are powering down, so we don't need to do a thing with
- * the DMA engines. However, we do need to save the Codec
- * registers.
- */
-
- for (i = 0; i < CS4231_REGS; i++) {
- /* save Codec regs */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, i,
- __LINE__, thisfile);
- state->cs_save[i] = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* turn off the Codec */
- CS4231_DMA_POWER(state, CS4231_PWR_OFF);
-
- ASSERT(state->cs_powered == CS4231_PWR_OFF);
-
- ATRACE("cs_power() power down successful", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
-} /* cs4231_power_down() */
-
-/*
- * cs4231_set_gain()
- *
- * Description:
- * Set the play or record gain.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int stream Stream number for multi-stream Codecs,
- * which this isn't, so just ignore
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int gain The gain to set
- * int channels Number of channels, 1 or 2
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-/*ARGSUSED*/
-static int
-cs4231_set_gain(CS_state_t *state, int stream, int dir, int gain,
- int channel)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- uint8_t tmp_value;
- int rc = AUDIO_FAILURE;
-
- ATRACE("in cs_set_gain()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- if (dir == AUDIO_PLAY) { /* play gain */
- mutex_enter(&state->cs_lock);
- if (channel == 0) { /* left channel */
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, LDACO_REG, __LINE__, thisfile);
- } else { /* right channel */
- ASSERT(channel == 1);
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, RDACO_REG, __LINE__, thisfile);
- }
- /* NOTE: LDAC0_VALID_MASK == RDAC0_VALID_MASK, so either ok */
-
- /* we use cs4231_atten[] to linearize attenuation */
- if (state->cs_output_muted || gain == 0) {
- /* mute the output */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (cs4231_atten[gain]|LDACO_LDM), LDAC0_VALID_MASK,
- __LINE__, thisfile);
- /* NOTE: LDACO_LDM == RDACO_LDM, so either ok */
- } else {
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- cs4231_atten[gain], LDAC0_VALID_MASK,
- __LINE__, thisfile);
- ATRACE("cs_set_gain() play gain set",
- cs4231_atten[gain]);
-
- }
- rc = AUDIO_SUCCESS;
- mutex_exit(&state->cs_lock);
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- mutex_enter(&state->cs_lock);
- if (channel == 0) { /* left channel */
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, LADCI_REG, __LINE__, thisfile);
- tmp_value = ddi_get8(handle, &CS4231_IDR) &
- ~LADCI_GAIN_MASK;
- } else { /* right channel */
- ASSERT(channel == 1);
- cs4231_reg_select(ahandle, handle,
- &CS4231_IAR, RADCI_REG, __LINE__, thisfile);
- tmp_value = ddi_get8(handle, &CS4231_IDR) &
- ~RADCI_GAIN_MASK;
- }
- /* NOTE: LADCI_VALID_MASK == RADCI_VALID_MASK, so either ok */
-
- /* we shift right by 4 to go from 8-bit to 4-bit gain */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (tmp_value|(gain >> 4)), LADCI_VALID_MASK,
- __LINE__, thisfile);
- ATRACE("cs_set_gain() record gain set",
- (tmp_value|(gain >> 4)));
- rc = AUDIO_SUCCESS;
- mutex_exit(&state->cs_lock);
- }
-
- ATRACE("cs_set_gain() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_gain() */
-
-/*
- * cs4231_set_port()
- *
- * Description:
- * Set the play/record port.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int dir AUDIO_PLAY or AUDIO_RECORD, if
- * direction is important
- * int port The port to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The port could not been set
- */
-static int
-cs4231_set_port(CS_state_t *state, int dir, int port)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- uint8_t tmp_value;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in cs_set_port()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- handle = state->cs_handles.cs_codec_hndl;
-
- if (dir == AUDIO_PLAY) { /* output port(s) */
- /* figure out which output port(s) to turn on */
- tmp_value = 0;
-
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- MIOC_REG, __LINE__, thisfile);
- if (port & AUDIO_SPEAKER) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~MIOC_MONO_SPKR_MUTE,
- MIOC_VALID_MASK);
- tmp_value |= AUDIO_SPEAKER;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, MIOC_MONO_SPKR_MUTE,
- MIOC_VALID_MASK);
- }
-
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- PC_REG, __LINE__, thisfile);
- if (port & AUDIO_HEADPHONE) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~PC_HEADPHONE_MUTE,
- PC_VALID_MASK);
- tmp_value |= AUDIO_HEADPHONE;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, PC_HEADPHONE_MUTE,
- PC_VALID_MASK);
- }
-
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- PC_REG, __LINE__, thisfile);
- if (port & AUDIO_LINE_OUT) {
- AND_SET_BYTE(handle, &CS4231_IDR, ~PC_LINE_OUT_MUTE,
- PC_VALID_MASK);
- tmp_value |= AUDIO_LINE_OUT;
- } else {
- OR_SET_BYTE(handle, &CS4231_IDR, PC_LINE_OUT_MUTE,
- PC_VALID_MASK);
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("cs_ad_set_config() set out port", tmp_value);
-
- if (tmp_value != (port & 0x0ff)) {
- ATRACE_32("cs_ad_set_config() bad out port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
- } else {
- ASSERT(dir == AUDIO_RECORD);
-
- /*
- * Figure out which input port to set. Fortunately
- * the left and right port bit patterns are the same.
- */
- switch (port) {
- case AUDIO_NONE:
- tmp_value = 0;
- break;
- case AUDIO_MICROPHONE:
- tmp_value = LADCI_LMIC;
- break;
- case AUDIO_LINE_IN:
- tmp_value = LADCI_LLINE;
- break;
- case AUDIO_CD:
- tmp_value = LADCI_LAUX1;
- break;
- case AUDIO_CODEC_LOOPB_IN:
- tmp_value = LADCI_LLOOP;
- break;
- case AUDIO_SUNVTS:
- tmp_value = LADCI_LAUX1;
- break;
- default:
- /* unknown or inclusive input ports */
- ATRACE_32("cs_ad_set_config() bad in port", port);
- rc = AUDIO_FAILURE;
- goto done;
- }
-
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- LADCI_REG, __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (ddi_get8(handle, &CS4231_IDR) & ~LADCI_IN_MASK)|tmp_value,
- LADCI_VALID_MASK, __LINE__, thisfile);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR,
- RADCI_REG, __LINE__, thisfile);
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- (ddi_get8(handle, &CS4231_IDR) & ~RADCI_IN_MASK)|tmp_value,
- RADCI_VALID_MASK, __LINE__, thisfile);
- mutex_exit(&state->cs_lock);
- }
-
-done:
- ATRACE("cs_set_port() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_port() */
-
-/*
- * cs4231_set_monitor_gain()
- *
- * Description:
- * Set the monitor gain.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- * int gain The gain to set
- *
- * Returns:
- * AUDIO_SUCCESS The Codec parameter has been set
- * AUDIO_FAILURE The gain has not been set
- */
-static int
-cs4231_set_monitor_gain(CS_state_t *state, int gain)
-{
- audiohdl_t ahandle = state->cs_ahandle;
- ddi_acc_handle_t handle;
- int rc = AUDIO_SUCCESS;
-
- ATRACE("in cs_set_monitor gain()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- if (gain > AUDIO_MAX_GAIN) { /* sanity check */
- gain = AUDIO_MAX_GAIN;
- }
-
- handle = state->cs_handles.cs_codec_hndl;
- mutex_enter(&state->cs_lock);
- cs4231_reg_select(ahandle, handle, &CS4231_IAR, LC_REG,
- __LINE__, thisfile);
-
- if (gain == 0) {
- /* disable loopbacks when gain == 0 */
- cs4231_put8(ahandle, handle, &CS4231_IDR, LC_OFF,
- LC_VALID_MASK, __LINE__, thisfile);
- } else {
- /* we use cs4231_atten[] to linearize attenuation */
- cs4231_put8(ahandle, handle, &CS4231_IDR,
- ((cs4231_atten[gain] << 2) | LC_LBE), LC_VALID_MASK,
- __LINE__, thisfile);
- }
- mutex_exit(&state->cs_lock);
-
- ATRACE("cs_set_monitor_gain() returning", rc);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (rc);
-
-} /* cs4231_set_monitor_gain() */
-
-/*
- * cs4231_set_busy()
- *
- * Description:
- * This routine is called whenever a routine needs to guarantee
- * that it will not be suspended or the power removed by the power
- * manager. It will also block any routine while a suspend is
- * going on.
- *
- * CAUTION: This routine cannot be called by routines that will
- * block. Otherwise DDI_SUSPEND will be blocked for a
- * long time. And that is the wrong thing to do.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Set busy and powered up
- * AUDIO_FAILURE Couldn't power up, so not busy
- */
-static int
-cs4231_set_busy(CS_state_t *state)
-{
- ATRACE("in cs4231_set_busy()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->cs_lock);
-
- /* block if we are going to be suspended */
- while (state->cs_suspended == CS4231_SUSPENDED) {
- cv_wait(&state->cs_cv, &state->cs_lock);
- }
-
- /*
- * Okay, we aren't going to be suspended yet, so mark as busy.
- * This will keep us from being suspended when we release the lock.
- */
- ASSERT(state->cs_busy_cnt >= 0);
- state->cs_busy_cnt++;
-
- /* now can release the lock before we raise the power */
- mutex_exit(&state->cs_lock);
-
- /*
- * Mark as busy before we ask for power to be raised. This removes
- * the race condtion between the call to cs4231_power() and our call
- * to raise power. After we raise power we immediately mark as idle
- * so the count is still good.
- */
- (void) pm_busy_component(state->cs_dip, CS4231_COMPONENT);
- if (pm_raise_power(state->cs_dip, CS4231_COMPONENT, CS4231_PWR_ON) ==
- DDI_FAILURE) {
- /* match the busy call above */
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!%s%d:set_busy() power up failed",
- audiocs_name, state->cs_instance);
-
- mutex_enter(&state->cs_lock);
- state->cs_busy_cnt--; /* restore busy count */
- if (state->cs_busy_cnt == 0) {
- /* let DDI_SUSPEND continue */
- cv_broadcast(&state->cs_cv);
- }
- mutex_exit(&state->cs_lock);
-
- return (AUDIO_FAILURE);
- }
-
- /* power is up and we are marked as busy, so we are done */
-
- ATRACE("audiocs_set_busy() done", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- return (AUDIO_SUCCESS);
-
-} /* cs4231_set_busy() */
-
-/*
- * cs4231_set_idle()
- *
- * Description:
- * This routine reduces the busy count. It then does a cv_broadcast()
- * if the count is 0 so a waiting DDI_SUSPEND will continue forward.
- * It ends by resetting the power management timer.
- *
- * We don't do anything with power because the routine that is no longer
- * busy either doesn't need the hardware, or we are playing or recording
- * so the power won't come down anyway.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-cs4231_set_idle(CS_state_t *state)
-{
- ATRACE("in cs4231_set_idle()", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
- /* get the lock so we are safe */
- mutex_enter(&state->cs_lock);
-
- ASSERT(state->cs_suspended == CS4231_NOT_SUSPENDED);
-
- /* decrement the busy count */
- state->cs_busy_cnt--;
-
- /* if no longer busy, then we wake up a waiting SUSPEND */
- if (state->cs_busy_cnt == 0) {
- cv_broadcast(&state->cs_cv);
- }
-
- /* we're done, so unlock */
- mutex_exit(&state->cs_lock);
-
- /* reset the timer */
- (void) pm_idle_component(state->cs_dip, CS4231_COMPONENT);
-
- ATRACE("cs4231_set_idle() done", state);
- ASSERT(!mutex_owned(&state->cs_lock));
-
-} /* cs4231_set_idle() */
-
-
-/* ******* Global Local Routines ******************************************* */
-
-/*
- * cs4231_poll_ready()
- *
- * Description:
- * This routine waits for the Codec to complete its initialization
- * sequence and is done with its autocalibration.
- *
- * Early versions of the Codec have a bug that can take as long as
- * 15 seconds to complete its initialization. For these cases we
- * use a timeout mechanism so we don't keep the machine locked up.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The Codec is ready to continue
- * AUDIO_FAILURE The Codec isn't ready to continue
- */
-int
-cs4231_poll_ready(CS_state_t *state)
-{
- ddi_acc_handle_t handle = state->cs_handles.cs_codec_hndl;
- int x = 0;
- uint8_t iar;
- uint8_t idr;
-
- ATRACE("in cs_poll_ready()", state);
-
- ASSERT(state->cs_regs != NULL);
- ASSERT(handle != NULL);
-
- /* wait for the chip to initialize itself */
- iar = ddi_get8(handle, &CS4231_IAR);
-
- while ((iar & IAR_INIT) && x++ < CS4231_TIMEOUT) {
- drv_usecwait(50);
- iar = ddi_get8(handle, &CS4231_IAR);
- }
-
- if (x >= CS4231_TIMEOUT) {
- ATRACE("cs_poll_ready() timeout #1", state);
- return (AUDIO_FAILURE);
- }
-
- x = 0;
-
- /*
- * Now wait for the chip to complete its autocalibration.
- * Set the test register.
- */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
-
- idr = ddi_get8(handle, &CS4231_IDR);
-
- while ((idr & ESI_ACI) && x++ < CS4231_TIMEOUT) {
- drv_usecwait(50);
- idr = ddi_get8(handle, &CS4231_IDR);
- }
-
- if (x >= CS4231_TIMEOUT) {
- ATRACE("cs_poll_ready() timeout #2", state);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("cs_poll_ready() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* cs4231_poll_ready() */
-
-/*
- * cs4231_reg_select()
- *
- * Description:
- * Select a cs4231 register. The cs4231 has a hardware bug where a
- * register is not always selected the first time. We try and try
- * again until the proper register is selected or we time out and
- * print an error message.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * ddi_acc_handle_t handle A handle to the device's registers
- * uint8_t addr The register address to program
- * int reg The register to select
- * int line The line number where this function was
- * called
- * char * *thefile The name of the c file that called this
- * function
- *
- * Returns:
- * void
- */
-void
-cs4231_reg_select(audiohdl_t ahandle, ddi_acc_handle_t handle, uint8_t *addr,
- uint8_t reg, int line, char *thefile)
-{
- int x;
- uint8_t T;
-
- for (x = 0; x < CS4231_RETRIES; x++) {
- ddi_put8(handle, addr, reg);
- T = ddi_get8(handle, addr);
- if (T == reg) {
- break;
- }
- drv_usecwait(1000);
- }
-
- if (x == CS4231_RETRIES) {
- audio_sup_log(ahandle, CE_NOTE,
- "!Couldn't select register (%s, Line #%d 0x%02x 0x%02x)",
- thefile, line, T, reg);
- audio_sup_log(ahandle, CE_CONT,
- "!audio may not work correctly until it is stopped and "
- "restarted\n");
- }
-
-} /* cs4231_reg_select() */
-
-/*
- * cs4231_put8()
- *
- * Description:
- * Program a cs4231 register. The cs4231 has a hardware bug where a
- * register is not programmed properly the first time. We program a value,
- * then immediately read back the value and reprogram if nescessary.
- * We do this until the register is properly programmed or we time out and
- * print an error message.
- *
- * Arguments:
- * audiohdl_t ahandle Handle to this device
- * ddi_acc_handle_t handle A handle to the device's registers
- * uint8_t addr The register address to program
- * uint8_t mask Mask to not set reserved register bits
- * int val The value to program
- * int line The line number where this function was
- * called
- * char * *thefile The name of the c file that called this
- * function
- *
- * Returns:
- * void
- */
-void
-cs4231_put8(audiohdl_t ahandle, ddi_acc_handle_t handle, uint8_t *addr,
- uint8_t val, uint8_t mask, int line, char *thefile)
-{
- int x;
- uint8_t T;
-
- val &= mask;
-
- for (x = 0; x < CS4231_RETRIES; x++) {
- ddi_put8(handle, addr, val);
- T = ddi_get8(handle, addr);
- if (T == val) {
- break;
- }
- drv_usecwait(1000);
- }
-
- if (x == CS4231_RETRIES) {
- audio_sup_log(ahandle, CE_NOTE,
- "!Couldn't set value (%s, Line #%d 0x%02x 0x%02x)",
- thefile, line, T, val);
- audio_sup_log(ahandle, CE_CONT,
- "!audio may not work correctly until it is stopped and "
- "restarted\n");
- }
-
-} /* cs4231_put8() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c
deleted file mode 100644
index 6f55c57d35..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_apcdma.c
+++ /dev/null
@@ -1,1332 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * Platform specifc code for the APC DMA controller. The APC is an SBus
- * IC that includes play and record DMA engines and an interface for
- * the CS4231.
- */
-
-#include <sys/systm.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Attribute structure for the APC, used to create DMA handles.
- */
-static ddi_dma_attr_t apc_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000000fffLL, /* DMA counter register */
- 0x0000000000000001LL, /* DMA address alignment */
- 0x00000014, /* 4 and 16 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x0000000000000fffLL, /* maximum transfer size, 8k */
- 0x000000000000ffffLL, /* segment boundary, 32k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_BE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * Local routines
- */
-static uint_t apc_intr(caddr_t);
-static int apc_program_play(CS_state_t *, int, caddr_t *, int);
-
-/*
- * DMA ops vector functions
- */
-static int apc_map_regs(dev_info_t *, CS_state_t *, size_t, size_t);
-static void apc_unmap_regs(CS_state_t *);
-static void apc_reset(CS_state_t *);
-static int apc_add_intr(CS_state_t *);
-static void apc_rem_intr(dev_info_t *);
-static int apc_p_start(CS_state_t *);
-static void apc_p_pause(CS_state_t *);
-static void apc_p_restart(CS_state_t *);
-static void apc_p_stop(CS_state_t *);
-static int apc_r_start(CS_state_t *);
-static void apc_r_stop(CS_state_t *);
-static void apc_power(CS_state_t *, int);
-
-cs4231_dma_ops_t cs4231_apcdma_ops = {
- "APC DMA controller",
- apc_map_regs,
- apc_unmap_regs,
- apc_reset,
- apc_add_intr,
- apc_rem_intr,
- apc_p_start,
- apc_p_pause,
- apc_p_restart,
- apc_p_stop,
- apc_r_start,
- apc_r_stop,
- apc_power
-};
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-/*
- * apc_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * CS_state_t *state The device's state structure
- * size_t pbuf_size The size of the play DMA buffers to
- * allocate, we need two
- * size_t cbuf_size The size of the capture DMA buffers to
- * allocate, we need two
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-apc_map_regs(dev_info_t *dip, CS_state_t *state, size_t pbuf_size,
- size_t cbuf_size)
-{
- ddi_acc_handle_t *handle = &APC_HANDLE;
- uint_t dma_cookie_count;
- int rc;
-
- ATRACE("in apc_map_regs()", state);
-
- /* allocate two handles for play and two for record */
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(0) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(1) failed: %d", rc);
- goto error_ph0;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(2) failed: %d", rc);
- goto error_ph1;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &apc_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_alloc_handle(3) failed: %d", rc);
- goto error_rh0;
- }
-
- /* allocate the four DMA buffers, two for play and two for record */
- if (ddi_dma_mem_alloc(state->cs_ph[0], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[0], &state->cs_pml[0],
- &state->cs_pmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(0) failed");
- goto error_rh1;
- }
- if (ddi_dma_mem_alloc(state->cs_ph[1], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[1], &state->cs_pml[1],
- &state->cs_pmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(1) failed");
- goto error_pb0;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[0], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[0], &state->cs_cml[0],
- &state->cs_cmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(2) failed");
- goto error_pb1;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[1], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[1], &state->cs_cml[1],
- &state->cs_cmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_mem_alloc(3) failed");
- goto error_rb0;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[0], (struct as *)0,
- state->cs_pb[0], state->cs_pml[0], DDI_DMA_WRITE,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_pc[0],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(0) failed: %d",
- rc);
- goto error_rb1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[1], (struct as *)0,
- state->cs_pb[1], state->cs_pml[1], DDI_DMA_WRITE,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_pc[1],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(1) failed: %d",
- rc);
- goto error_pc0;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[0], (struct as *)0,
- state->cs_cb[0], state->cs_cml[0], DDI_DMA_READ,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_cc[0],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(2) failed: %d",
- rc);
- goto error_pc1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[1], (struct as *)0,
- state->cs_cb[1], state->cs_cml[1], DDI_DMA_READ,
- DDI_DMA_SLEEP, (caddr_t)0, &state->cs_cc[1],
- &dma_cookie_count)) != DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_dma_addr_bind_handle(3) failed: %d",
- rc);
- goto error_rc0;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* map in the registers, getting a handle */
- if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
- sizeof (cs4231_regs_t), &acc_attr, handle) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_map_regs() ddi_regs_map_setup() failed: %d", rc);
- goto error_rc1;
- }
-
- /* clear the CSR so we have all interrupts disabled */
- ddi_put32(*handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
-
- /* let the state structure know about the attributes */
- state->cs_dma_attr = &apc_attr;
-
- /* we start with play and record buffers 0 */
- state->cs_pbuf_toggle = 0;
- state->cs_cbuf_toggle = 0;
-
- ATRACE("apc_map_regs() returning success", state);
-
- return (AUDIO_SUCCESS);
-
-error_rc1:
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-error_rc0:
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
-error_pc1:
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
-error_pc0:
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
-error_rb1:
- ddi_dma_mem_free(&state->cs_cmh[1]);
-error_rb0:
- ddi_dma_mem_free(&state->cs_cmh[0]);
-error_pb1:
- ddi_dma_mem_free(&state->cs_pmh[1]);
-error_pb0:
- ddi_dma_mem_free(&state->cs_pmh[0]);
-error_rh1:
- ddi_dma_free_handle(&state->cs_ch[1]);
-error_rh0:
- ddi_dma_free_handle(&state->cs_ch[0]);
-error_ph1:
- ddi_dma_free_handle(&state->cs_ph[1]);
-error_ph0:
- ddi_dma_free_handle(&state->cs_ph[0]);
-error:
- ATRACE("apc_map_regs() returning failure", state);
-
- return (AUDIO_FAILURE);
-
-} /* apc_map_regs() */
-
-/*
- * apc_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocated the DMA handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_unmap_regs(CS_state_t *state)
-{
- ATRACE("in apc_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-
- ddi_dma_mem_free(&state->cs_pmh[0]);
- ddi_dma_mem_free(&state->cs_pmh[1]);
- ddi_dma_mem_free(&state->cs_cmh[0]);
- ddi_dma_mem_free(&state->cs_cmh[1]);
-
- ddi_dma_free_handle(&state->cs_ph[0]);
- ddi_dma_free_handle(&state->cs_ph[1]);
- ddi_dma_free_handle(&state->cs_ch[0]);
- ddi_dma_free_handle(&state->cs_ch[1]);
-
- ddi_regs_map_free(&APC_HANDLE);
-
- ATRACE("apc_unmap_regs() returning", state);
-
-} /* apc_unmap_regs() */
-
-/*
- * apc_reset()
- *
- * Description:
- * Reset both the play and record DMA engines. The engines are left
- * with interrupts and the DMA engine disabled.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo structure
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_reset(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_reset()", state);
-
- /*
- * The APC has a bug where the reset is not done
- * until you do the next pio to the APC. This
- * next write to the CSR causes the posted reset to
- * happen.
- */
-
- ddi_put32(handle, &APC_DMACSR, APC_RESET);
- ddi_put32(handle, &APC_DMACSR, APC_CLEAR_RESET_VALUE);
-
- ATRACE("apc_reset() returning", state);
-
-} /* apc_reset() */
-
-/*
- * apc_add_intr()
- *
- * Description:
- * Register the APC interrupts with the kernel.
- *
- * NOTE: This does NOT turn on interrupts.
- *
- * CAUTION: While the interrupts are added, the Codec interrupts are
- * not enabled.
- *
- * Arguments:
- * CS_state_t *state Pointer to the device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-apc_add_intr(CS_state_t *state)
-{
- dev_info_t *dip = state->cs_dip;
-
- ATRACE("in apc_add_intr()", state);
-
- /* first we make sure this isn't a high level interrupt */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_add_intr() unsupported high level interrupt");
- return (AUDIO_FAILURE);
- }
-
- /* okay to register the interrupt */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)NULL,
- (ddi_idevice_cookie_t *)NULL, apc_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!apc_add_intr() bad interrupt specification");
- return (AUDIO_FAILURE);
- }
-
- ATRACE("apc_add_intr() returning successful", state);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_add_intr() */
-
-/*
- * apc_rem_intr()
- *
- * Description:
- * Unregister the APC interrupts from the kernel.
- *
- * CAUTION: While the interrupts are removed, the Codec interrupts are
- * not disabled, but then, they never should have been on in
- * the first place.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * void
- */
-static void
-apc_rem_intr(dev_info_t *dip)
-{
- ATRACE("in apc_rem_intr()", dip);
-
- ddi_remove_intr(dip, 0, NULL);
-
- ATRACE("apc_rem_intr() returning", dip);
-
-} /* apc_rem_intr() */
-
-/*
- * apc_p_start()
- *
- * Description:
- * This routine starts the play DMA engine. This includes "hard" starts
- * where the DMA engine's registers need to be loaded as well as starting
- * after a pause.
- *
- * For hard starts the DMA engine is started by programming the Play Next
- * Virtual Address and then the Play Next Counter twice, and finally
- * enabling the play DMA engine.
- *
- * Starting after a pause is much eaiser, we just turn on the DMA GO bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully started
- * AUDIO_FAILURE Start failed
- */
-static int
-apc_p_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- int i;
- int samples;
-
- ATRACE("in apc_p_start()", state);
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples we want */
- samples = state->cs_play_sr * state->cs_play_ch /
- state->cs_ad_info.ad_play.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_play_ch) == 1) {
- ATRACE("apc_p_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("apc_p_start() samples per interrupt", samples);
-
- /* try to load 2 buffers worth to get things started */
- for (i = 0; i < 2; i++) {
- ATRACE_32("apc_p_start() calling apc_program_play()", samples);
- PLAY_COUNT = samples *
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- if (apc_program_play(state, samples, NULL, 0) <= 0) {
- ATRACE("apc_p_start() "
- "apc_program_play() returns no samples", state);
- break;
- }
- }
-
- /*
- * If there wasn't anything to get then we aren't active. This can
- * happen if an AUDIO_DRAIN was issued with no audio in the stream.
- */
- if (i == 0) {
- ATRACE("apc_p_start() nothing to do", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Even with just one DMA buffer loaded we can still play some audio.
- * Read the Codec Status Register so that we clear the Error and
- * Initialization register, Index 11, so we'll know when we get
- * a play underrun in the ISR. Then enable the play DMA engine,
- * including interrupts.
- */
-#ifdef DEBUG
- ATRACE_8("apc_p_start() Read the Codec status reg, clearing Index 11",
- ddi_get8(handle, &CS4231_STATUS));
-#else
- (void) ddi_get8(handle, &CS4231_STATUS); /* we only need a read */
-#endif
-
- ATRACE("apc_p_start() turn on play DMA engine", state);
- OR_SET_WORD(handle, &APC_DMACSR, APC_PLAY_ENABLE);
-
- state->cs_flags |= PDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_p_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_p_start() */
-
-/*
- * apc_p_pause()
- *
- * Description:
- * This routine pauses the play DMA engine. Buffers, FIFO, etc. are NOT
- * lost.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_pause(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_p_pause()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the PDMA_GO bit, pausing the DMA engine */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_PDMA_GO);
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- ATRACE("apc_p_pause() returning", state);
-
-} /* apc_p_pause() */
-
-/*
- * apc_p_restart()
- *
- * Description:
- * This routine restarts the play DMA engine after pauseing. Buffers,
- * FIFO, etc. Must be programmed and valid.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_restart(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_p_restart()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* start the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(handle, &CS4231_IDR, INTC_PEN, INTC_VALID_MASK);
-
- /* set the PDMA_GO bit, restarting the DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_PDMA_GO);
-
- ATRACE("apc_p_restart() returning", state);
-
-} /* apc_p_restart() */
-
-/*
- * apc_p_stop()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The DMA engine is stopped by using the PLAY_ABORT bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_p_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t reg;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_p_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* Set stopped flag */
- state->cs_flags |= APC_P_STOPPED;
-
- /* set the play abort bit to stop playing audio */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT)
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_PM) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- ATRACE("apc_p_stop() timeout", state);
- }
-#endif
-
- /* now clear the play enable and abort bits */
- AND_SET_WORD(handle, &APC_DMACSR, ~(APC_PDMA_GO|APC_P_ABORT));
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_p_stop() returning", state);
-
-} /* apc_p_stop() */
-
-/*
- * apc_r_start()
- *
- * Description:
- * This routine starts the record DMA engine. The DMA engine is never
- * paused for record, so a pause is equivalent to a stop. Thus all starts
- * are hard starts.
- *
- * For hard starts the DMA engine is started by programming the Record
- * Next Virtual Address and then the Record Next Counter twice, and
- * finally enabling the record DMA engine.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The capture DMA was started
- * AUDIO_FAILURE The capture DMA was not started
- */
-static int
-apc_r_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t csr;
- int bytes;
- int i;
- int samples;
- int x;
-
- ATRACE("in apc_r_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples to capture */
- samples = state->cs_record_sr * state->cs_record_ch /
- state->cs_ad_info.ad_record.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_record_ch) == 1) {
- ATRACE("apc_r_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("apc_r_start() samples per interrupt", samples);
-
- /* now convert the number of samples to the "size" in bytes */
- ASSERT(state->cs_record_prec == AUDIO_PRECISION_8 ||
- state->cs_record_prec == AUDIO_PRECISION_16);
- bytes = samples * (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE("apc_r_start() DMA count", bytes);
-
- /* make sure it's okay to program the Next Address/Count registers */
- csr = ddi_get32(handle, &APC_DMACSR);
- ATRACE_32("apc_r_start() CSR", csr);
- for (x = 0; !(csr & APC_CD) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* no reason to beat on the bus */
- csr = ddi_get32(handle, &APC_DMACSR);
- }
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE, "!apc_r_start() "
- "timeout waiting for Codec, record not started!");
- return (AUDIO_FAILURE);
- }
-
- /*
- * Program the DMA engine with both buffers. We MUST do both buffers
- * otherwise CAP_COUNT isn't going to set both byte counts.
- */
- for (i = 0; i < 2; i++) {
- /* read the CNVA, as per APC document */
- (void) ddi_get32(handle, &APC_DMACNVA);
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("apc_r_start() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_r_start() ddi_dma_sync() failed, recording "
- "stopped");
-
- /* send a cap. abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* wait for the pipeline to empty */
- csr = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(csr & APC_CX) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- csr = ddi_get32(handle, &APC_DMACSR);
- }
-
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_C_ABORT);
-
- return (AUDIO_FAILURE);
- }
-
- ATRACE_32("apc_r_start() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &APC_DMACNVA,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* now program the CNC reg., which enables the state machine */
- ATRACE_32("apc_r_start() next count", (uint_t)(bytes));
- ddi_put32(handle, &APC_DMACNC, (uint_t)(bytes));
- CAP_COUNT = bytes;
-
- /* now get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("apc_r_start() new toggle", state->cs_cbuf_toggle);
- }
-
- state->cs_flags |= RDMA_ENGINE_INITIALIZED;
-
- /* start the DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_CAP_ENABLE);
- ATRACE("apc_r_start() returning success", 0);
-
- return (AUDIO_SUCCESS);
-
-} /* apc_r_start() */
-
-/*
- * apc_r_stop()
- *
- * Description:
- * This routine stops the record DMA engine. It then sends any collected
- * data to the audio mixer.
- *
- * The DMA engine is stopped by using the CAP_ABORT bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-apc_r_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t reg;
- int samples;
- int x;
-
- ATRACE("in apc_r_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the record interrupts so the ISR doesn't get involved */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_CINTR_ENABLE);
-
- /* first, abort the record DMA engine */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_CX) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "apc_r_stop() timeout, record buffer flushed");
- }
-#endif
-
- /* clear the CXI interrupt bit, but CXI interrupt didn't go out */
- OR_SET_WORD(handle, &APC_DMACSR, APC_CXI_EN);
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- /* figure how many samples were recorded */
- samples = (CAP_COUNT - ddi_get32(handle, &APC_DMACC)) /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* send the captured audio to the mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_r_stop() ddi_dma_sync() failed, recorded audio lost");
- } else {
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->cs_lock);
- }
-
- AND_SET_WORD(handle, &APC_DMACSR, ~(APC_C_ABORT|APC_CAP_DISABLE));
-
- /* check that the pipeline is empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_CD) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "apc_r_stop() buffer pipeline not empty");
- }
-#endif
-
- state->cs_flags &= ~RDMA_ENGINE_INITIALIZED;
-
- ATRACE("apc_r_stop() returning", state);
-
-} /* apc_r_stop() */
-
-/*
- * apc_power()
- *
- * Description:
- * This routine turns the Codec off by using the COD_PDWN bit in the
- * apc chip. To turn power on we have to reset the APC, which clears
- * the COD_PDWN bit. However, this is a settling bug in the APC which
- * requires the driver to delay quite a while before we may continue.
- * Since this is the first time this feature has actually been used
- * it isn't too surprising that it has some problems.
- *
- * NOTE: The state structure must be locked when this routine is called.
- *
- * Arguments:
- * CS_state_t *state Ptr to the device's state structure
- * int level Power level to set
- *
- * Returns:
- * void
- */
-static void
-apc_power(CS_state_t *state, int level)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
-
- ATRACE("in apc_power()", state);
- ATRACE_32("apc_power() level", level);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- if (level == CS4231_PWR_ON) { /* turn power on */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_COD_PDWN);
- OR_SET_WORD(handle, &APC_DMACSR, APC_RESET);
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_RESET);
-
- /*
- * wait for state change,
- * __lock_lint tells warlock not to flag this delay()
- */
-#ifndef __lock_lint
- delay(drv_usectohz(CS4231_300MS));
-#endif
- state->cs_powered = CS4231_PWR_ON;
- } else { /* turn power off */
- ASSERT(level == CS4231_PWR_OFF);
- OR_SET_WORD(handle, &APC_DMACSR, APC_COD_PDWN);
- state->cs_powered = CS4231_PWR_OFF;
- }
-
- ATRACE_32("apc_power() done", ddi_get32(handle, &APC_DMACSR));
-
-} /* apc_power() */
-
-
-/* ******* Local Routines ************************************************** */
-
-/*
- * apc_intr()
- *
- * Description:
- * APC interrupt service routine, which services both play and capture
- * interrupts. First we find out why there was an interrupt, then we
- * take the appropriate action.
- *
- * Because this ISR deals with both play and record interrupts we have
- * to be careful to not lose an interrupt. So we service the record
- * interrupt first and save the incoming data until later. This is all
- * done without releasing the lock, thus there can be no race conditions.
- * Then we process the play interrupt. While processing the play interrupt
- * we have to release the lock. When this happens we send recorded data
- * to the mixer and then get the next chunk of data to play. If there
- * wasn't a play interrupt then we finish by sending the recorded data,
- * if any.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-apc_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t handle = APC_HANDLE;
- caddr_t rec_buf = NULL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int rec_samples;
- int samples;
- int x;
- uint8_t creg;
-
- ATRACE("in apc_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the APC CSR */
- csr = ddi_get32(handle, &APC_DMACSR);
- ATRACE_32("apc_intr() interrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & APC_IP)) {
- /* Interrupt received when stopping play */
- if (state->cs_flags & APC_P_STOPPED) {
- /* Clear stopped flag */
- state->cs_flags &= ~APC_P_STOPPED;
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_CLAIMED);
- } else if (csr & APC_PMI_EN) {
- /*
- * Clear device generated interrupt while play is
- * active (Only seen while playing and insane mode
- * switching)
- */
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_CLAIMED);
- } else {
- /* nope, this isn't our interrupt */
- mutex_exit(&state->cs_lock);
- ATRACE_32("apc_intr() device didn't send interrupt",
- csr);
- return (DDI_INTR_UNCLAIMED);
- }
- }
-
- /* Clear stopped flag */
- state->cs_flags &= ~APC_P_STOPPED;
-
- /* clear all interrupts we captured this time */
- ddi_put32(handle, &APC_DMACSR, csr);
- ATRACE_32("apc_intr() csr after clear", ddi_get32(handle, &APC_DMACSR));
-
- if (csr & APC_CINTR_MASK) {
- ATRACE("apc_intr(R) record interrupt", state);
-
- /* sync DMA memory before sending it to the audio mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr(R) ddi_dma_sync(#1) failed, recorded "
- "audio lost");
- } else {
- /* figure how many samples were recorded */
- ASSERT(ddi_get32(handle, &APC_DMACSR) & APC_CD);
- samples = CAP_COUNT /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* save the data for when we free the lock */
- rec_buf = CAP_DMA_BUF;
- rec_samples = samples;
- }
-
- /* sync the DMA buffer before it is going to be reused */
- ATRACE("apc_intr(R) dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr(R) ddi_dma_sync(#2) failed, recording "
- "disabled");
-
- /* send a play abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_C_ABORT);
-
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_C_ABORT);
- } else {
- ATRACE_32("apc_intr(R) next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* read the CNVA, as per APC document */
- (void) ddi_get32(handle, &APC_DMACNVA);
-
- /* now program the DMA buffer into the Next Address */
- ddi_put32(handle, &APC_DMACNVA,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* program the CNC reg., which enables the state mach */
- ATRACE_32("apc_intr(R) next count", (uint_t)CAP_COUNT);
- ddi_put32(handle, &APC_DMACNC, (uint_t)CAP_COUNT);
-
- /* now get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("apc_intr(R) new toggle",
- state->cs_cbuf_toggle);
-
- }
- /* we always claim the interrupt, even if DMA sync failed */
- rc = DDI_INTR_CLAIMED;
- }
-
- if (csr & APC_PINTR_MASK) {
- /* figure out the number of samples we want */
- samples = PLAY_COUNT /
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("apc_intr(P) samples to get", samples);
-
- /* try to load the next audio buffer, even if pipe is empty */
- samples = apc_program_play(state, samples, &rec_buf,
- rec_samples);
- ATRACE_32("apc_intr(P) samples apc_program_play() returned",
- samples);
-
- if (samples <= 0 && (csr & APC_PM)) {
- /*
- * There isn't any more data to play, so wait for
- * the pipe and the Codec FIFO to empty. Then turn
- * off the play DMA engine by aborting. Also, we should
- * note that simple play interrupts with no samples
- * are ignored, but acknowledged. We wait for the pipe
- * to empty before we declare the DMA engine is empty.
- */
- ATRACE_32("apc_intr(P) no more data, wait for FIFO",
- samples);
-
- /*
- * We wait for the Codec FIFO to underrun, this
- * implies that the APC pipe is also empty.
- */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, ESI_REG, __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /*
- * Clear the flag so if audio is restarted while in
- * am_play_shutdown() we can detect it and not mess
- * things up.
- */
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- /* now shutdown the play stream */
- ATRACE("apc_intr(P) shutdown play stream", state);
- mutex_exit(&state->cs_lock);
-
- /* send the captured audio to the mixer ASAP */
- if (rec_buf) {
- am_send_audio(state->cs_ahandle, rec_buf,
- AUDIO_NO_CHANNEL, rec_samples);
- rec_buf = NULL;
- }
-
- am_play_shutdown(state->cs_ahandle, NULL);
-
- mutex_enter(&state->cs_lock);
-
- /* make sure playing wasn't restarted when lock lost */
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("apc_intr() restart after shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /* reset the DMA engine, putting it in a known state */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT);
-
- /* wait for the pipeline to empty */
- reg = ddi_get32(handle, &APC_DMACSR);
- for (x = 0; !(reg & APC_PD) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(handle, &APC_DMACSR);
- }
-
- /* clear the abort bit */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_P_ABORT);
-
- /* disable the Codec */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, INTC_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN,
- INTC_VALID_MASK);
-
- /* and reset the status */
- ddi_put8(handle, &CS4231_STATUS, STATUS_RESET);
-
- ATRACE("apc_intr(P) Play DMA engine off", state);
- }
- rc = DDI_INTR_CLAIMED;
- ATRACE_32("apc_intr(P) done", rc);
- }
-
-done:
-
- /* APC error interrupt, not sure what to do here */
- if (csr & APC_EI) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
- /* update the kernel interrupt statistics */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- /* one last chance to send the captured audio to the mixer */
- if (rec_buf) {
- am_send_audio(state->cs_ahandle, rec_buf, AUDIO_NO_CHANNEL,
- rec_samples);
- }
-
- ATRACE_32("apc_intr() returning", rc);
-
- return (rc);
-
-} /* apc_intr() */
-
-/*
- * apc_program_play()
- *
- * Description:
- * This routine is used by apc_p_start() and apc_intr() to program
- * the play DMA engine with the next buffer full of audio.
- *
- * Arguments:
- * CS_state_t *state The device's state pointer
- * int samples The number of samples to be retrieved
- * from the mixer
- * caddr_t *rec_buf Ptr to data buffer for record
- * int rec_samples Num samples in record data buffer
- *
- * Returns:
- * 0 The buffer wasn't programmed, no audio
- * > 0 The buffer was programmed
- * AUDIO_FAILURE The buffer wasn't programmed
- */
-static int
-apc_program_play(CS_state_t *state, int samples, caddr_t *rec_buf,
- int rec_samples)
-{
- ddi_acc_handle_t handle = APC_HANDLE;
- uint_t precision;
- int rc;
-
- ATRACE_32("in apc_program_play()", samples);
-
- /* we need the precision to calculate the next count correctly */
- precision = state->cs_play_prec >> AUDIO_PRECISION_SHIFT;
- ATRACE_32("apc_program_play() precision", precision);
-
- /* send record audio, then get the first buffer's worth of audio */
- mutex_exit(&state->cs_lock);
-
- /* send the captured audio to the mixer */
- if (rec_buf && *rec_buf) {
- am_send_audio(state->cs_ahandle, *rec_buf, AUDIO_NO_CHANNEL,
- rec_samples);
- *rec_buf = NULL;
- }
-
- rc = am_get_audio(state->cs_ahandle, PLAY_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
-
- mutex_enter(&state->cs_lock);
- ATRACE_32("apc_program_play() am_get_audio() returned", rc);
-
- if (rc == AUDIO_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_program_play() am_get_audio() failed");
- return (AUDIO_FAILURE);
- } else if (rc == 0) {
- ATRACE("apc_program_play() am_get_audio() returned 0 samples",
- state);
- return (0);
- }
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("apc_program_play() dma buffer sync", state);
- if (ddi_dma_sync(PLAY_DMA_HANDLE, (off_t)0, (size_t)(rc * precision),
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!apc_program_play() ddi_dma_sync(#2) failed, audio lost");
-
- /* send a play abort, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &APC_DMACSR, APC_P_ABORT);
- /* now clear it */
- AND_SET_WORD(handle, &APC_DMACSR, ~APC_P_ABORT);
-
- return (AUDIO_FAILURE);
- }
-
- /* program the PNVA */
- ATRACE_32("apc_program_play() next address",
- (uint_t)PLAY_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &APC_DMAPNVA, (uint_t)PLAY_DMA_COOKIE.dmac_address);
-
- /* now program the PNC register, which enables the state machine */
- ATRACE_32("apc_program_play() next count", (uint_t)(rc * precision));
- ddi_put32(handle, &APC_DMAPNC, (uint_t)(rc * precision));
-
- /* now get ready for the next time we need a DMA buffer */
- AUDIO_TOGGLE(state->cs_pbuf_toggle);
- ATRACE_32("apc_program_play() new toggle", state->cs_pbuf_toggle);
-
- ATRACE_32("apc_program_play() returning", rc);
-
- return (rc);
-
-} /* apc_program_play() */
diff --git a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c b/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c
deleted file mode 100644
index 9349d1f45a..0000000000
--- a/usr/src/uts/sun/io/audio/sada/drv/audiocs/audio_4231_eb2dma.c
+++ /dev/null
@@ -1,1459 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-/*
- * Platform specifc code for the EB2 DMA controller. The EB2 is a PCI bus
- * IC that includes play and record DMA engines and an interface for
- * the CS4231.
- */
-
-#include <sys/systm.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/note.h>
-#include <sys/audio.h>
-#include <sys/audiovar.h>
-#include <sys/audio/audio_support.h>
-#include <sys/audio/audio_src.h>
-#include <sys/audio/audio_trace.h>
-#include <sys/mixer.h>
-#include <sys/audio/audio_mixer.h>
-#include <sys/audio/am_src1.h>
-#include <sys/audio/impl/audio_4231_impl.h>
-#include <sys/audio/audio_4231.h>
-
-/*
- * Attribute structure for the APC, used to create DMA handles.
- */
-static ddi_dma_attr_t eb2_attr = {
- DMA_ATTR_V0, /* version */
- 0x0000000000000000LL, /* dlim_addr_lo */
- 0x00000000ffffffffLL, /* dlim_addr_hi */
- 0x0000000000ffffffLL, /* DMA counter register */
- 0x0000000000000001LL, /* DMA address alignment */
- 0x00000074, /* 4 and 16 byte burst sizes */
- 0x00000001, /* min effective DMA size */
- 0x000000000000ffffLL, /* maximum transfer size, 8k */
- 0x000000000000ffffLL, /* segment boundary, 32k */
- 0x00000001, /* s/g list length, no s/g */
- 0x00000001, /* granularity of device, don't care */
- 0 /* DMA flags */
-};
-
-static ddi_device_acc_attr_t acc_attr = {
- DDI_DEVICE_ATTR_V0,
- DDI_STRUCTURE_BE_ACC,
- DDI_STRICTORDER_ACC
-};
-
-/*
- * Local routines
- */
-static uint_t eb2_rec_intr(caddr_t);
-static uint_t eb2_play_intr(caddr_t);
-static int eb2_program_play(CS_state_t *, int);
-
-/*
- * DMA ops vector functions
- */
-static int eb2_map_regs(dev_info_t *, CS_state_t *, size_t, size_t);
-static void eb2_unmap_regs(CS_state_t *);
-static void eb2_reset(CS_state_t *);
-static int eb2_add_intr(CS_state_t *);
-static void eb2_rem_intr(dev_info_t *);
-static int eb2_p_start(CS_state_t *);
-static void eb2_p_pause(CS_state_t *);
-static void eb2_p_restart(CS_state_t *);
-static void eb2_p_stop(CS_state_t *);
-static int eb2_r_start(CS_state_t *);
-static void eb2_r_stop(CS_state_t *);
-static void eb2_power(CS_state_t *, int);
-
-cs4231_dma_ops_t cs4231_eb2dma_ops = {
- "EB2 DMA controller",
- eb2_map_regs,
- eb2_unmap_regs,
- eb2_reset,
- eb2_add_intr,
- eb2_rem_intr,
- eb2_p_start,
- eb2_p_pause,
- eb2_p_restart,
- eb2_p_stop,
- eb2_r_start,
- eb2_r_stop,
- eb2_power
-};
-
-/* File name for the cs4231_put8() and cs4231_reg_select() routines */
-static char *thisfile = __FILE__;
-
-/*
- * eb2_map_regs()
- *
- * Description:
- * This routine allocates the DMA handles and the memory for the
- * DMA engines to use. It then binds each of the buffers to its
- * respective handle, getting a DMA cookie. Finally, the registers
- * are mapped in.
- *
- * NOTE: All of the ddi_dma_... routines sleep if they cannot get
- * memory. This means these calls will almost always succeed.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- * CS_state_t *state The device's state
- * int pbuf_size The size of the play DMA buffers to
- * allocate, we need two
- * int cbuf_size The size of the capture DMA buffers to
- * allocate, we need two
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-eb2_map_regs(dev_info_t *dip, CS_state_t *state, size_t pbuf_size,
- size_t cbuf_size)
-{
- uint_t dma_cookie_count;
- int rc;
-
- ATRACE("in eb2_map_regs()", state);
-
- /* allocate two handles for play and two for record */
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(0) failed: %d", rc);
- goto error;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ph[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(1) failed: %d", rc);
- goto error_ph0;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[0])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(2) failed: %d", rc);
- goto error_ph1;
- }
- if ((rc = ddi_dma_alloc_handle(dip, &eb2_attr, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_ch[1])) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_alloc_handle(3) failed: %d", rc);
- goto error_rh0;
- }
-
- /* allocate the four DMA buffers, two for play and two for record */
- if (ddi_dma_mem_alloc(state->cs_ph[0], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[0], &state->cs_pml[0],
- &state->cs_pmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(0) failed");
- goto error_rh1;
- }
- if (ddi_dma_mem_alloc(state->cs_ph[1], pbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_pb[1], &state->cs_pml[1],
- &state->cs_pmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(1) failed");
- goto error_pb0;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[0], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[0], &state->cs_cml[0],
- &state->cs_cmh[0]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(2) failed");
- goto error_pb1;
- }
- if (ddi_dma_mem_alloc(state->cs_ch[1], cbuf_size, &acc_attr,
- DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL,
- &state->cs_cb[1], &state->cs_cml[1],
- &state->cs_cmh[1]) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_mem_alloc(3) failed");
- goto error_rb0;
- }
-
- /* bind each of the buffers to a DMA handle */
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[0], (struct as *)0,
- state->cs_pb[0], pbuf_size, DDI_DMA_WRITE, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_pc[0], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(0) failed: %d",
- rc);
- goto error_rb1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ph[1], (struct as *)0,
- state->cs_pb[1], pbuf_size, DDI_DMA_WRITE, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_pc[1], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(1) failed: %d",
- rc);
- goto error_pc0;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[0], (struct as *)0,
- state->cs_cb[0], cbuf_size, DDI_DMA_READ, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_cc[0], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(2) failed: %d",
- rc);
- goto error_pc1;
- }
- ASSERT(dma_cookie_count == 1);
- if ((rc = ddi_dma_addr_bind_handle(state->cs_ch[1], (struct as *)0,
- state->cs_cb[1], cbuf_size, DDI_DMA_READ, DDI_DMA_SLEEP,
- (caddr_t)0, &state->cs_cc[1], &dma_cookie_count)) !=
- DDI_DMA_MAPPED) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_dma_addr_bind_handle(3) failed: %d",
- rc);
- goto error_rc0;
- }
- ASSERT(dma_cookie_count == 1);
-
- /* now, map the codec */
- if (ddi_regs_map_setup(dip, 0, (caddr_t *)&state->cs_regs, 0,
- sizeof (cs4231_pioregs_t), &acc_attr,
- &EB2_CODEC_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() codec failed: %d",
- rc);
- goto error_rc1;
- }
-
- /* next the play registers */
- acc_attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
- if (ddi_regs_map_setup(dip, 1,
- (caddr_t *)&state->cs_eb2_regs.play, 0,
- sizeof (cs4231_eb2regs_t), &acc_attr,
- &EB2_PLAY_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() play registers "
- "failed: %d", rc);
- goto error_dev1;
- }
-
- ASSERT(acc_attr.devacc_attr_endian_flags == DDI_STRUCTURE_LE_ACC);
-
- /* now the capture registers */
- if (ddi_regs_map_setup(dip, 2,
- (caddr_t *)&state->cs_eb2_regs.record, 0,
- sizeof (cs4231_eb2regs_t), &acc_attr,
- &EB2_REC_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() record registers "
- "failed: %d", rc);
- goto error_dev2;
- }
-
- /* finally the auxio register */
- if (ddi_regs_map_setup(dip, 3,
- (caddr_t *)&state->cs_eb2_regs.auxio, 0,
- sizeof (uint_t), &acc_attr,
- &EB2_AUXIO_HNDL) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_map_regs() ddi_regs_map_setup() audio register "
- "failed: %d", rc);
- goto error_dev2;
- }
-
- /* disable play and record interrupts */
- ddi_put32(EB2_PLAY_HNDL, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
- ddi_put32(EB2_REC_HNDL, &EB2_PLAY_CSR, EB2_RCLEAR_RESET_VALUE);
-
- /* let the state structure know about the attributes */
- state->cs_dma_attr = &eb2_attr;
-
- /* we start with play and record buffers 0 */
- state->cs_pbuf_toggle = 0;
- state->cs_cbuf_toggle = 0;
-
- ATRACE("eb2_map_regs() returning success", state);
-
- return (AUDIO_SUCCESS);
-
-error_dev2:
- ddi_regs_map_free(&EB2_REC_HNDL);
-error_dev1:
- ddi_regs_map_free(&EB2_PLAY_HNDL);
-error_dev0:
- ddi_regs_map_free(&EB2_CODEC_HNDL);
-error_rc1:
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-error_rc0:
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
-error_pc1:
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
-error_pc0:
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
-error_rb1:
- ddi_dma_mem_free(&state->cs_cmh[1]);
-error_rb0:
- ddi_dma_mem_free(&state->cs_cmh[0]);
-error_pb1:
- ddi_dma_mem_free(&state->cs_pmh[1]);
-error_pb0:
- ddi_dma_mem_free(&state->cs_pmh[0]);
-error_rh1:
- ddi_dma_free_handle(&state->cs_ch[1]);
-error_rh0:
- ddi_dma_free_handle(&state->cs_ch[0]);
-error_ph1:
- ddi_dma_free_handle(&state->cs_ph[1]);
-error_ph0:
- ddi_dma_free_handle(&state->cs_ph[0]);
-error:
- ATRACE("eb2_map_regs() returning failure", state);
-
- return (AUDIO_FAILURE);
-
-} /* eb2_map_regs() */
-
-/*
- * eb2_unmap_regs()
- *
- * Description:
- * This routine unbinds the DMA cookies, frees the DMA buffers,
- * deallocated the DAM handles, and finally unmaps the Codec's and
- * DMA engine's registers.
- *
- * Arguments:
- * CS_state_t *state The device's state
- *
- * Returns:
- * void
- */
-static void
-eb2_unmap_regs(CS_state_t *state)
-{
- ATRACE("in eb2_unmap_regs()", state);
-
- (void) ddi_dma_unbind_handle(state->cs_ph[0]);
- (void) ddi_dma_unbind_handle(state->cs_ph[1]);
- (void) ddi_dma_unbind_handle(state->cs_ch[0]);
- (void) ddi_dma_unbind_handle(state->cs_ch[1]);
-
- ddi_dma_mem_free(&state->cs_pmh[0]);
- ddi_dma_mem_free(&state->cs_pmh[1]);
- ddi_dma_mem_free(&state->cs_cmh[0]);
- ddi_dma_mem_free(&state->cs_cmh[1]);
-
- ddi_dma_free_handle(&state->cs_ph[0]);
- ddi_dma_free_handle(&state->cs_ph[1]);
- ddi_dma_free_handle(&state->cs_ch[0]);
- ddi_dma_free_handle(&state->cs_ch[1]);
-
- ddi_regs_map_free(&EB2_CODEC_HNDL);
- ddi_regs_map_free(&EB2_PLAY_HNDL);
- ddi_regs_map_free(&EB2_REC_HNDL);
- ddi_regs_map_free(&EB2_AUXIO_HNDL);
-
- ATRACE("eb2_unmap_regs() returning", state);
-
-} /* eb2_unmap_regs() */
-
-/*
- * eb2_reset()
- *
- * Description:
- * Reset both the play and record DMA engines. The engines are left
- * with interrupts and the DMA engine disabled.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo structure
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_reset(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t reg;
- int x;
-
- ATRACE("in eb2_reset()", state);
-
- /* start with the play side */
- ddi_put32(phandle, &EB2_PLAY_CSR, EB2_RESET);
- /* wait for play data to drain */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0; !(reg & EB2_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
- /* clear the reset bit and program for chaining */
- ddi_put32(phandle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
-
- /* now do the record side and program for chaining */
- ddi_put32(rhandle, &EB2_REC_CSR, EB2_RESET);
- /* wait for record data to drain */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; !(reg & EB2_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
- /* clear the reset bit */
- ddi_put32(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
-
- ATRACE("eb2_reset() returning", state);
-
-} /* eb2_reset() */
-
-/*
- * eb2_add_intr()
- *
- * Description:
- * Register the EB2 interrupts with the kernel.
- *
- * NOTE: This does NOT turn on interrupts.
- *
- * CAUTION: While the interrupts are added, the Codec interrupts are
- * not enabled.
- *
- * Arguments:
- * CS_state_t *state Pointer to the device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Registers successfully mapped
- * AUDIO_FAILURE Registers not successfully mapped
- */
-static int
-eb2_add_intr(CS_state_t *state)
-{
- dev_info_t *dip = state->cs_dip;
-
- ATRACE("in eb2_add_intr()", state);
-
- /* first we make sure these aren't high level interrupts */
- if (ddi_intr_hilevel(dip, 0) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() unsupported high level interrupt 0");
- return (AUDIO_FAILURE);
- }
- if (ddi_intr_hilevel(dip, 1) != 0) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() unsupported high level interrupt 1");
- return (AUDIO_FAILURE);
- }
-
- /* okay to register the interrupts */
- if (ddi_add_intr(dip, 0, (ddi_iblock_cookie_t *)0,
- (ddi_idevice_cookie_t *)0, eb2_rec_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() bad record interrupt specification");
- return (AUDIO_FAILURE);
- }
-
- if (ddi_add_intr(dip, 1, (ddi_iblock_cookie_t *)0,
- (ddi_idevice_cookie_t *)0, eb2_play_intr,
- (caddr_t)state) != DDI_SUCCESS) {
- audio_sup_log(state->cs_ahandle, CE_WARN,
- "!eb2_add_intr() bad play interrupt specification");
- ddi_remove_intr(dip, 0, NULL);
- return (AUDIO_FAILURE);
- }
-
- ATRACE("eb2_add_intr() returning successful", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_add_intr() */
-
-/*
- * eb2_rem_intr()
- *
- * Description:
- * Unregister the EB2 interrupts from the kernel.
- *
- * CAUTION: While the interrupts are removed, the Codec interrupts are
- * not disabled, but then, they never should have been on in
- * the first place.
- *
- * Arguments:
- * dev_info_t *dip Pointer to the device's devinfo
- *
- * Returns:
- * void
- */
-static void
-eb2_rem_intr(dev_info_t *dip)
-{
- ATRACE("in eb2_rem_intr()", dip);
-
- ddi_remove_intr(dip, 0, NULL);
- ddi_remove_intr(dip, 1, NULL);
-
- ATRACE("eb2_rem_intr() returning", dip);
-
-} /* eb2_rem_intr() */
-
-/*
- * eb2_p_start()
- *
- * Description:
- * This routine starts the play DMA engine. This includes "hard" starts
- * where the DMA engine's registers need to be loaded as well as starting
- * after a pause;
- *
- * For hard starts the DMA engine is started by programming the Play Next
- * Byte Register and the Play Next Address Register twice, and finally
- * enabling the DMA play engine.
- *
- * Starting after a pause is much eaiser, we just turn on the EN_DMA bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS Successfully started
- * AUDIO_FAILURE Start failed
- */
-static int
-eb2_p_start(CS_state_t *state)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- int i;
- int samples;
-
- ATRACE("in eb2_p_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples we want */
- samples = state->cs_play_sr * state->cs_play_ch /
- state->cs_ad_info.ad_play.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_play_ch) == 1) {
- ATRACE("eb2_p_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("eb2_p_start() samples per interrupt", samples);
-
- /* try to load 2 buffers worth to get things started */
- for (i = 0; i < 2; i++) {
- ATRACE_32("eb2_p_start() calling eb2_program_play()", samples);
- PLAY_COUNT = samples *
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- if (eb2_program_play(state, samples) <= 0) {
- ATRACE("eb2_p_start() "
- "eb2_program_play() returns no samples", state);
- break;
- }
-
- if (i == 0) {
- /* start playing before we load the next address */
- ATRACE("eb2_p_start() turn on play DMA engine", state);
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_PLAY_ENABLE);
- }
- }
-
- /*
- * If there wasn't anything to get then we aren't active. This can
- * happen if an AUDIO_DRAIN was issued with no audio in the stream.
- */
- if (i == 0) {
- ATRACE("eb2_p_start() nothing to do", state);
- return (AUDIO_FAILURE);
- }
-
- /*
- * Even with just one DMA buffer loaded we can still play some audio.
- * Read the Codec Status Register so that we clear the Error and
- * Initialization register, Index 11, so we'll know when we get
- * a play underrun in the ISR. Then enable the play DMA engine,
- * including interrupts.
- */
-#ifdef DEBUG
- ATRACE_8("eb2_p_start() Read the Codec status reg, clearing Index 11",
- ddi_get8(handle, &CS4231_STATUS));
-#else
- (void) ddi_get8(handle, &CS4231_STATUS); /* we only need a read */
-#endif
-
- state->cs_flags |= PDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_p_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_p_start() */
-
-/*
- * eb2_pause()
- *
- * Description:
- * This routine pauses the play DMA engine. Buffers, FIFO, etc. are NOT
- * lost.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_pause(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_p_pause()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the EN_DMA bit, pausing the engine */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_EN_DMA);
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(phandle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(phandle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(phandle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- ATRACE("eb2_p_pause() returning", state);
-
-} /* eb2_p_pause() */
-
-/*
- * eb2_p_restart()
- *
- * Description:
- * This routine restarts the play DMA engine after pausing. Buffers,
- * FIFO, etc. MUST be programmed and valid.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_restart(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
-
- ATRACE("in eb2_p_restart()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* start the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- OR_SET_BYTE(phandle, &CS4231_IDR, INTC_PEN, INTC_VALID_MASK);
-
- /* set the EN_DMA bit, restarting the engine */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_EN_DMA);
-
- ATRACE("eb2_p_restart() returning", state);
-
-} /* eb2_p_restart() */
-
-/*
- * eb2_p_stop()
- *
- * Description:
- * This routine stops the play DMA engine.
- *
- * The DMA engine is stopped by using the play RESET bit.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_p_stop(CS_state_t *state)
-{
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- uint_t reg;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_p_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* clear the play interrupts so the ISR doesn't get involved */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_PINTR_MASK);
-
- /* set the play RESET bit to stop playing audio */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- ATRACE("eb2_p_stop() timeout", state);
- }
-#endif
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* we wait for the Codec FIFO to underrun */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, ESI_REG,
- __LINE__, thisfile);
- creg = ddi_get8(phandle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(phandle, &CS4231_IDR);
- }
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, phandle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(phandle, &CS4231_IDR, ~INTC_PEN, INTC_VALID_MASK);
-
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_p_stop() returning", state);
-
-} /* eb2_p_stop() */
-
-/*
- * eb2_r_start()
- *
- * Description:
- * This routine starts the record DMA engine. The DMA engine is never
- * paused for record, so a puse is equivalent to a stop. Thus all starts
- * are hard starts.
- *
- * For hard starts the DMA engine is started by programming the Record
- * NExt Byte Register and then the Record Next Address Register twice,
- * and finally enabling the record DMA engine.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * CAUTION: This routine doesn't start the Codec because the first
- * interrupt causes a recursive mutex_enter.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * AUDIO_SUCCESS The capture DMA was started
- * AUDIO_FAILURE The capture DMA was not started
- */
-static int
-eb2_r_start(CS_state_t *state)
-{
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t csr;
- int bytes;
- int i;
- int samples;
- int x;
-
- ATRACE("in eb2_r_start()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* figure out the number of samples to capture */
- samples = state->cs_record_sr * state->cs_record_ch /
- state->cs_ad_info.ad_record.ad_int_rate;
- /* if stereo & sr = 11025 & ints = 50 then 441 samples, bad! - so fix */
- if ((samples % state->cs_record_ch) == 1) {
- ATRACE("eb2_r_start() samples not mod", samples);
- /* need to adjust */
- samples++;
- }
- ATRACE("eb2_r_start() samples per interrupt", samples);
-
- /* now convert the number of samples to the "size" in bytes */
- ASSERT(state->cs_record_prec == AUDIO_PRECISION_8 ||
- state->cs_record_prec == AUDIO_PRECISION_16);
- bytes = samples * (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE("eb2_r_start() DMA count", bytes);
-
- /* reset the DMA engine so we have a good starting place */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* no reason to beat on the bus */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_start() timeout waiting for Codec, record not "
- "started!");
- return (AUDIO_FAILURE);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* put into chaining mode */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RCLEAR_RESET_VALUE);
-
- /*
- * Program the DMA engine with both buffers. We MUST do both buffers
- * otherwise CAP_COUNT isn't going to set both byte counts.
- */
- for (i = 0; i < 2; i++) {
- /* sync the DMA buffer before it is going to be used */
- ATRACE("eb2_r_start() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_start() ddi_dma_sync() failed, recording "
- "stopped");
-
- /* reset the DMA engine */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0;
- (csr & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR,
- ~(EB2_RESET|EB2_EN_DMA));
-
- return (AUDIO_FAILURE);
- }
-
- /* for eb2 we first program the Next Byte Count Register */
- ATRACE_32("eb2_r_start() next count", (uint_t)bytes);
- ddi_put32(rhandle, &EB2_REC_BCR, (uint_t)bytes);
- CAP_COUNT = bytes;
- ATRACE_32("eb2_r_start() samples to send", samples);
-
- /* now program the Next Address Register - starts state mach */
- ATRACE_32("eb2_r_start() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(rhandle, &EB2_REC_ACR,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- if (i == 0) {
- /* start the DMA engine before loading the next addr */
- ATRACE("eb2_r_start() turn on rec DMA engine", state);
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_REC_ENABLE);
- }
-
- /* get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("eb2_r_start() new toggle", state->cs_cbuf_toggle);
- }
-
- state->cs_flags |= RDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_r_start() returning", state);
-
- return (AUDIO_SUCCESS);
-
-} /* eb2_r_start() */
-
-/*
- * eb2_r_stop()
- *
- * Description:
- * This routine stops the record DMA engine. It then sends any collected
- * data to the audio mixer.
- *
- * NOTE: The state structure must be locked before this routine is called.
- *
- * Arguments:
- * CS_state_t *state The device's state structure
- *
- * Returns:
- * void
- */
-static void
-eb2_r_stop(CS_state_t *state)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t reg;
- uint_t csr;
- int samples;
- int x;
-
- ATRACE("in eb2_r_stop()", state);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- /* stop the Codec */
- cs4231_reg_select(state->cs_ahandle, handle, &CS4231_IAR, INTC_REG,
- __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_CEN, INTC_VALID_MASK);
-
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (csr & EB2_CYC_PENDING) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1);
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- if (csr & EB2_INT_PEND) {
- state->cs_flags |= REC_INTR_PENDING;
- }
-
- /* set the record RESET bit to stop recording audio */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
-#ifdef DEBUG
- if (x >= CS4231_TIMEOUT) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "audiocs: eb2_r_stop() timeout, record buffer flushed");
- }
-#endif
-
- /* clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR, ~(EB2_RESET|EB2_EN_DMA));
-
- /* figure how many samples were recorded */
- samples = (CAP_COUNT - ddi_get32(rhandle, &EB2_REC_BCR)) /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- samples -= samples % state->cs_record_ch;
-
- /* send the captured audio to the mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0, DDI_DMA_SYNC_FORCPU) ==
- DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_r_stop() ddi_dma_sync() failed, recorded audio lost");
- } else {
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->cs_lock);
- }
-
- state->cs_flags &= ~RDMA_ENGINE_INITIALIZED;
-
- ATRACE("eb2_r_stop() returning", state);
-
-} /* eb2_r_stop() */
-
-/*
- * eb2_power()
- *
- * Description:
- * This routine turns the Codec on or off using the auxio register
- * in the eb2 device (cheerio or rio). Fortunately we don't need
- * to delay like we do with the APC.
- *
- * NOTE: The state structure must be locked when this routine is called.
- *
- * Arguments:
- * CS_state_t *state Ptr to the device's state structure
- * int level Power level to set
- *
- * Returns:
- * void
- */
-static void
-eb2_power(CS_state_t *state, int level)
-{
- ddi_acc_handle_t xhandle = EB2_AUXIO_HNDL;
-
- ATRACE("in eb2_power()", state);
- ATRACE_32("eb2_power() level", level);
-
- ASSERT(mutex_owned(&state->cs_lock));
-
- if (level == CS4231_PWR_ON) { /* turn power on */
- AND_SET_WORD(xhandle, EB2_AUXIO_REG, ~EB2_AUXIO_COD_PDWN);
- state->cs_powered = CS4231_PWR_ON;
- } else { /* turn power off */
- OR_SET_WORD(xhandle, EB2_AUXIO_REG, EB2_AUXIO_COD_PDWN);
- state->cs_powered = CS4231_PWR_OFF;
- }
-
- ATRACE_32("eb2_power() done", ddi_get32(xhandle, EB2_AUXIO_REG));
-
-} /* eb2_power() */
-
-
-/* ******* Local Routines ************************************************** */
-
-/*
- * eb2_rec_intr()
- *
- * Description:
- * EB2 record interrupt serivce routine. First we find out why there was
- * an interrupt, then we take the appropriate action
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-eb2_rec_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t rhandle = EB2_REC_HNDL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int samples;
- int x;
-
- ATRACE("in eb2_rec_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the EB2 record CSR */
- csr = ddi_get32(rhandle, &EB2_REC_CSR);
- ATRACE_32("eb2_rec_intr() intrrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & EB2_INT_PEND)) {
- /* Interrupt that's still being serviced */
- if (state->cs_flags & REC_INTR_PENDING) {
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /* nope, this isn't our interrupt */
- ATRACE_32("eb2_rec_intr() device didn't send interrupt", csr);
- if (state->cs_ksp) {
- KIOP(state)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
- mutex_exit(&state->cs_lock);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* clear all interrupts we captured at this time */
- ddi_put32(rhandle, &EB2_REC_CSR, (csr|EB2_TC));
- ATRACE_32("eb2_rec_intr() csr after clear",
- ddi_get32(rhandle, &EB2_REC_CSR));
-
- if (csr & EB2_TC) {
- ATRACE("eb2_rec_intr() record interrupt", state);
-
- /* sync DMA memory before sending it to the audio mixer */
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORCPU) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() ddi_dma_sync(#1) failed, recorded "
- "audio lost");
- } else {
- /* figure how many samples were recorded */
- samples = CAP_COUNT /
- (state->cs_record_prec >> AUDIO_PRECISION_SHIFT);
-
- /* send the captured audio to the mixer */
- mutex_exit(&state->cs_lock);
- am_send_audio(state->cs_ahandle, CAP_DMA_BUF,
- AUDIO_NO_CHANNEL, samples);
- mutex_enter(&state->cs_lock);
- }
-
- /* sync the DMA buffer before it is going to be reused */
- ATRACE("eb2_rec_intr() dma buffer sync", state);
- if (ddi_dma_sync(CAP_DMA_HANDLE, (off_t)0, 0,
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() ddi_dma_sync(#2) failed, recording"
- " disabled");
-
- /* reset the DMA engine */
- OR_SET_WORD(rhandle, &EB2_REC_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, it should be empty */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- for (x = 0;
- (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on bus */
- reg = ddi_get32(rhandle, &EB2_REC_CSR);
- }
-
- /* now clear the RESET and EN_DMA bits */
- AND_SET_WORD(rhandle, &EB2_REC_CSR,
- ~(EB2_RESET|EB2_EN_DMA));
- } else {
- ATRACE_32("eb2_rec_intr() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* first program the Next Byte Count Register */
- ATRACE_32("eb2_rec_intr() next count",
- (uint_t)CAP_COUNT);
- ddi_put32(rhandle, &EB2_REC_BCR, (uint_t)CAP_COUNT);
-
- /* now program the Next Add. Reg. - starts state mach */
- ATRACE_32("eb2_rec_intr() next address",
- (uint_t)CAP_DMA_COOKIE.dmac_address);
- ddi_put32(rhandle, &EB2_REC_ACR,
- (uint_t)CAP_DMA_COOKIE.dmac_address);
-
- /* get ready for the next DMA buffer */
- AUDIO_TOGGLE(state->cs_cbuf_toggle);
- ATRACE_32("eb2_rec_intr() new toggle",
- state->cs_cbuf_toggle);
- }
-
- /* we always claim the interrupt, even if DMA sync failed */
- rc = DDI_INTR_CLAIMED;
- } else if (csr & EB2_ERR_PEND) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- } else {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_rec_intr() unknown interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
-done:
- state->cs_flags &= ~REC_INTR_PENDING;
-
- /* update the kernel interrupt statistics */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- } else {
- KIOP(state)->intrs[KSTAT_INTR_SPURIOUS]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("eb2_rec_intr() returning", rc);
-
- return (rc);
-
-} /* eb2_rec_intr() */
-
-/*
- * eb2_play_intr()
- *
- * Description:
- * EB2 play interrupt serivce routine. First we find out why there was an
- * interrupt, then we take the appropriate action.
- *
- * Arguments:
- * caddr_t T Pointer to the interrupting device's state
- * structure
- *
- * Returns:
- * DDI_INTR_CLAIMED Interrupt claimed and processed
- * DDI_INTR_UNCLAIMED Interrupt not claimed, and thus ignored
- */
-static uint_t
-eb2_play_intr(caddr_t T)
-{
- CS_state_t *state = (CS_state_t *)T;
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- ddi_acc_handle_t phandle = EB2_PLAY_HNDL;
- uint_t csr;
- uint_t reg;
- int rc = DDI_INTR_UNCLAIMED;
- int samples;
- int x;
- uint8_t creg;
-
- ATRACE("in eb2_play_intr()", state);
-
- /* the state must be protected */
- mutex_enter(&state->cs_lock);
-
- /* get the EB2 play CSR */
- csr = ddi_get32(phandle, &EB2_PLAY_CSR);
- ATRACE_32("eb2_play_intr() interrupt CSR", csr);
-
- /* make sure this device sent the interrupt */
- if (!(csr & EB2_INT_PEND)) {
- mutex_exit(&state->cs_lock);
- /* nope, this isn't our interrupt */
- ATRACE_32("eb2_play_intr() device didn't send interrupt", csr);
- return (DDI_INTR_UNCLAIMED);
- }
-
- /* clear all interrupts we captured at this time */
- ddi_put32(phandle, &EB2_PLAY_CSR, (csr|EB2_TC));
- ATRACE_32("eb2_play_intr() csr after clear",
- ddi_get32(phandle, &EB2_PLAY_CSR));
-
- if (csr & EB2_TC) {
- samples = PLAY_COUNT /
- (state->cs_play_prec >> AUDIO_PRECISION_SHIFT);
- ATRACE_32("eb2_play_intr() samples to get", samples);
-
- /* try to load the next audio buffer */
- samples = eb2_program_play(state, samples);
- ATRACE_32("eb2_play_intr() samples eb2_program_play() returned",
- samples);
-
- if (samples <= 0 && !(csr & EB2_A_LOADED)) {
- /*
- * There isn't any more data to play, so wait for
- * the the Codec FIFO to empty. Then turn off the
- * play DMA engine by reseting it. Also, we should
- * note that a play interrupt with an ADDRESS loaded
- * but no samples is ignored, but acknowledged. We
- * wait for the ADDRESS to not be loaded before we
- * declare the DMA engine empty.
- */
- ATRACE_32("eb2_play_intr() no more data, wait for "
- "FIFO", samples);
-
- /*
- * We wait for the Codec FIFO to underrun. Unlike the
- * APC, we wouldn't be here if the pipe wasn't already
- * empty.
- */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, ESI_REG, __LINE__, thisfile);
- creg = ddi_get8(handle, &CS4231_IDR);
- for (x = 0; !(creg & ESI_PUR) && x < CS4231_TIMEOUT;
- x++) {
- drv_usecwait(1); /* don't beat on bus */
- creg = ddi_get8(handle, &CS4231_IDR);
- }
-
- /*
- * Clear the flag so if audio is restarted while in
- * am_play_shutdown() we can detect it and not mess
- * things up.
- */
- state->cs_flags &= ~PDMA_ENGINE_INITIALIZED;
-
- /* now shutdown the play stream */
- ATRACE("eb2_intr() shutdown play stream", state);
- mutex_exit(&state->cs_lock);
- am_play_shutdown(state->cs_ahandle, NULL);
- mutex_enter(&state->cs_lock);
-
- /* make sure playing wasn't restarted when lock lost */
- if (state->cs_flags & PDMA_ENGINE_INITIALIZED) {
- /* yes, it was, so we're done */
- ATRACE("eb2_intr() restart after shutdown", 0);
- rc = DDI_INTR_CLAIMED;
- goto done;
- }
-
- /*
- * Nope, play was not restarted so reset the
- * DMA eng, putting it into a known state
- */
- OR_SET_WORD(phandle, &EB2_PLAY_CSR, EB2_RESET);
-
- /* wait for the FIFO to drain, which it should be */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- for (x = 0;
- (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(phandle, &EB2_PLAY_CSR);
- }
-
- /* clear the reset bit */
- AND_SET_WORD(phandle, &EB2_PLAY_CSR, ~EB2_RESET);
-
- /* disable the Codec */
- cs4231_reg_select(state->cs_ahandle, handle,
- &CS4231_IAR, INTC_REG, __LINE__, thisfile);
- AND_SET_BYTE(handle, &CS4231_IDR, ~INTC_PEN,
- INTC_VALID_MASK);
-
- /* and reset the status */
- ddi_put8(handle, &CS4231_STATUS, STATUS_RESET);
-
- ATRACE("eb2_play_intr() Play DMA engine off", state);
- }
- rc = DDI_INTR_CLAIMED;
- ATRACE_32("eb2_play_intr() done", rc);
- } else if (csr & EB2_ERR_PEND) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_play_intr() error interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- } else {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_play_intr() unknown interrupt: 0x%x", csr);
- rc = DDI_INTR_CLAIMED;
- }
-
-done:
-
- /* update the kernel interrupt statisitcs */
- if (state->cs_ksp) {
- if (rc == DDI_INTR_CLAIMED) {
- KIOP(state)->intrs[KSTAT_INTR_HARD]++;
- }
- }
-
- mutex_exit(&state->cs_lock);
-
- ATRACE_32("eb2_play_intr() returning", rc);
-
- return (rc);
-
-} /* eb2_play_intr() */
-
-/*
- * eb2_program_play()
- *
- * Description:
- * This routine is used by eb2_p_start() and eb2_play_intr() to program
- * the play DMA engine with the next buffer full of audio.
- *
- * Arguments:
- * CS_state_t *state The device's state pointer
- * int samples The number of samples to be retrieved from the
- * mixer
- *
- * Returns:
- * 0 The buffer wasn't programmed, no audio
- * > 0 The buffer was programmed
- * AUDIO_FAILURE The buffer wasn't programmed
- */
-static int
-eb2_program_play(CS_state_t *state, int samples)
-{
- ddi_acc_handle_t handle = EB2_CODEC_HNDL;
- uint_t reg;
- uint_t precision;
- int x;
- int rc;
-
- ATRACE_32("in eb2_program_play()", samples);
-
- /* we need the precision to calculate the next count correctly */
- precision = state->cs_play_prec >> AUDIO_PRECISION_SHIFT;
- ATRACE_32("eb2_program_play() precision", precision);
-
- /* get the first buffer's worth of audio */
- mutex_exit(&state->cs_lock);
- rc = am_get_audio(state->cs_ahandle, PLAY_DMA_BUF, AUDIO_NO_CHANNEL,
- samples);
- mutex_enter(&state->cs_lock);
- ATRACE_32("eb2_program_play() am_get_audio() returned", rc);
-
- if (rc == AUDIO_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_program_play() am_get_audio() failed");
- return (AUDIO_FAILURE);
- } else if (rc == 0) {
- ATRACE("eb2_program_play() am_get_audio() returned 0 samples",
- state);
- return (0);
- }
-
- /* sync the DMA buffer before it is going to be used */
- ATRACE("eb2_program_play() dma buffer sync", state);
- if (ddi_dma_sync(PLAY_DMA_HANDLE, (off_t)0, (size_t)(rc * precision),
- DDI_DMA_SYNC_FORDEV) == DDI_FAILURE) {
- audio_sup_log(state->cs_ahandle, CE_NOTE,
- "!eb2_program_play() ddi_dma_sync(#2) failed");
-
- /* reset the DMA engine, this leaves the DMA engine ok */
- OR_SET_WORD(handle, &EB2_PLAY_CSR, EB2_RESET);
- /* wait for play data to drain */
- reg = ddi_get32(handle, &EB2_PLAY_CSR);
- for (x = 0; (reg & EB2_FIFO_DRAIN) && x < CS4231_TIMEOUT; x++) {
- drv_usecwait(1); /* don't beat on the bus */
- reg = ddi_get32(handle, &EB2_PLAY_CSR);
- }
- /* clear the reset bit */
- ddi_put32(handle, &EB2_PLAY_CSR, EB2_PCLEAR_RESET_VALUE);
-
- return (AUDIO_FAILURE);
- }
-
- /* make sure we are in NEXT mode */
- OR_SET_WORD(handle, &EB2_PLAY_CSR, EB2_EN_NEXT|EB2_EN_CNT);
-
- /* program the Next Byte Count Register */
- ATRACE_32("eb2_program_play() next count", (uint_t)(rc * precision));
- ddi_put32(handle, &EB2_PLAY_BCR, (uint_t)(rc * precision));
-
- /* now program the Next Address Register */
- ATRACE_32("eb2_program_play() next address",
- (uint_t)PLAY_DMA_COOKIE.dmac_address);
- ddi_put32(handle, &EB2_PLAY_ACR, (uint_t)PLAY_DMA_COOKIE.dmac_address);
-
- /* now get ready for the next time we need a DMA buffer */
- AUDIO_TOGGLE(state->cs_pbuf_toggle);
- ATRACE_32("eb2_program_play() new toggle", state->cs_pbuf_toggle);
-
- ATRACE_32("eb2_program_play() returning", rc);
-
- return (rc);
-
-} /* eb2_program_play() */
diff --git a/usr/src/uts/sun/sys/Makefile b/usr/src/uts/sun/sys/Makefile
index 38a2f0bfba..f4672bce99 100644
--- a/usr/src/uts/sun/sys/Makefile
+++ b/usr/src/uts/sun/sys/Makefile
@@ -20,11 +20,9 @@
#
#
-# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
-#ident "%Z%%M% %I% %E% SMI"
-#
# include global definitions
include ../../../Makefile.master
@@ -49,10 +47,6 @@ stp4020_reg.h stp4020_var.h \
ttymux.h ttymuxuser.h \
zsdev.h
-AUDIOHDRS= \
-audio_4231.h \
-audio1575.h
-
SCSIADHDRS= \
espcmd.h espreg.h espvar.h fascmd.h fasdma.h \
fasreg.h fasvar.h ifpio.h sfvar.h
@@ -73,7 +67,6 @@ ROOTDIRS= $(ROOTDIR) \
ROOTHDRS= $(HDRS:%=$(ROOTDIR)/%)
$(CLOSED_BUILD)ROOTHDRS += $(CLOSED_HDRS:%=$(ROOTDIR)/%)
-ROOTAUDHDRS= $(AUDIOHDRS:%=$(ROOTDIR)/audio/%)
ROOTFCHDRS= $(FCHDRS:%=$(ROOTDIR)/fc4/%)
ROOTSCSIADHDRS= $(SCSIADHDRS:%=$(ROOTDIR)/scsi/adapters/%)
$(CLOSED_BUILD)ROOTSCSIADHDRS += \
@@ -113,7 +106,6 @@ scsi/targets/%.check: scsi/targets/%.h
CHECKHDRS= \
$(HDRS:%.h=%.check) \
- $(AUDIOHDRS:%.h=audio/%.check) \
$(FCHDRS:%.h=fc4/%.check) \
$(SCSIADHDRS:%.h=scsi/adapters/%.check) \
$(SCSITARGHDRS:%.h=scsi/targets/%.check)
diff --git a/usr/src/uts/sun/sys/audio/audio1575.h b/usr/src/uts/sun/sys/audio/audio1575.h
deleted file mode 100644
index 0daab8ee76..0000000000
--- a/usr/src/uts/sun/sys/audio/audio1575.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO1575_H_
-#define _SYS_AUDIO1575_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audio1575 device driver
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define M1575_DEV_NAME "SUNW,audio1575"
-#define M1575_DEV_CONFIG "onboard1"
-#define M1575_DEV_VERSION "a"
-
-/*
- * Driver supported configuration information
- */
-#define M1575_NAME "audio1575"
-#define M1575_MOD_NAME "mixer audio driver"
-#define M1575_SAMPR5510 (5510)
-#define M1575_SAMPR6620 (6620)
-#define M1575_SAMPR8000 (8000)
-#define M1575_SAMPR9600 (9600)
-#define M1575_SAMPR11025 (11025)
-#define M1575_SAMPR16000 (16000)
-#define M1575_SAMPR18900 (18900)
-#define M1575_SAMPR22050 (22050)
-#define M1575_SAMPR27420 (27420)
-#define M1575_SAMPR32000 (32000)
-#define M1575_SAMPR33075 (33075)
-#define M1575_SAMPR37800 (37800)
-#define M1575_SAMPR44100 (44100)
-#define M1575_SAMPR48000 (48000)
-
-#define M1575_DEFAULT_SR M1575_SAMPR8000
-#define M1575_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define M1575_DEFAULT_PREC AUDIO_PRECISION_8
-#define M1575_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define M1575_DEFAULT_PGAIN (AUDIO_MAX_GAIN * 3/4)
-#define M1575_DEFAULT_RGAIN (127)
-#define M1575_DEFAULT_MONITOR_GAIN (0)
-#define M1575_DEFAULT_BAL AUDIO_MID_BALANCE
-#define M1575_INTS (175) /* default interrupt rate */
-#define M1575_MIN_INTS (25) /* minimum interrupt rate */
-#define M1575_MAX_INTS (5000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO1575_H_ */
diff --git a/usr/src/uts/sun/sys/audio/audio_4231.h b/usr/src/uts/sun/sys/audio/audio_4231.h
deleted file mode 100644
index 1f66c8cd1e..0000000000
--- a/usr/src/uts/sun/sys/audio/audio_4231.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
- */
-
-#ifndef _SYS_AUDIO_4231_H
-#define _SYS_AUDIO_4231_H
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Header file for the audiocs device driver.
- */
-
-/*
- * Values returned by the AUDIO_GETDEV ioctl()
- */
-#define CS_DEV_NAME "SUNW,CS4231"
-#define CS_DEV_CONFIG_ONBRD1 "onboard1"
-#define CS_DEV_VERSION "a" /* SS5 */
-#define CS_DEV_VERSION_A CS_DEV_VERSION
-#define CS_DEV_VERSION_B "b" /* Electron - internal loopback */
-#define CS_DEV_VERSION_C "c" /* Positron */
-#define CS_DEV_VERSION_D "d" /* PowerPC - Retired */
-#define CS_DEV_VERSION_E "e" /* x86 - Retired */
-#define CS_DEV_VERSION_F "f" /* Tazmo */
-#define CS_DEV_VERSION_G "g" /* Quark Audio Module */
-#define CS_DEV_VERSION_H "h" /* Darwin */
-
-/*
- * Driver supported configuration information
- */
-#define CS4231_NAME "audiocs"
-#define CS4231_MOD_NAME "CS4231 mixer audio driver"
-
-#define CS4231_SAMPR5510 (5510)
-#define CS4231_SAMPR6620 (6620)
-#define CS4231_SAMPR8000 (8000)
-#define CS4231_SAMPR9600 (9600)
-#define CS4231_SAMPR11025 (11025)
-#define CS4231_SAMPR16000 (16000)
-#define CS4231_SAMPR18900 (18900)
-#define CS4231_SAMPR22050 (22050)
-#define CS4231_SAMPR27420 (27420)
-#define CS4231_SAMPR32000 (32000)
-#define CS4231_SAMPR33075 (33075)
-#define CS4231_SAMPR37800 (37800)
-#define CS4231_SAMPR44100 (44100)
-#define CS4231_SAMPR48000 (48000)
-
-#define CS4231_DEFAULT_SR CS4231_SAMPR8000
-#define CS4231_DEFAULT_CH AUDIO_CHANNELS_MONO
-#define CS4231_DEFAULT_PREC AUDIO_PRECISION_8
-#define CS4231_DEFAULT_ENC AUDIO_ENCODING_ULAW
-#define CS4231_DEFAULT_PGAIN AUDIO_MID_GAIN
-#define CS4231_DEFAULT_RGAIN AUDIO_MID_GAIN
-#define CS4231_DEFAULT_MONITOR_GAIN (0)
-#define CS4231_DEFAULT_BAL AUDIO_MID_BALANCE /* MUST be mid */
-#define CS4231_INTS (175) /* default interrupt rate */
-#define CS4231_MIN_INTS (10) /* minimum interrupt rate */
-#define CS4231_MAX_INTS (2000) /* maximum interrupt rate */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO_4231_H */
diff --git a/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h b/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h
deleted file mode 100644
index 0e7397aa6d..0000000000
--- a/usr/src/uts/sun/sys/audio/impl/audio1575_impl.h
+++ /dev/null
@@ -1,766 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SYS_AUDIO1575_IMPL_H_
-#define _SYS_AUDIO1575_IMPL_H_
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Implementation specific header file for the audio1575 device driver.
- */
-
-#ifdef _KERNEL
-
-/* Misc. defines */
-#define M1575_IDNUM (0x5455)
-#define M1575_CONFIG_DEVICE_ID M1575_IDNUM
-#define M1575_CONFIG_VENDOR_ID (0x10b9)
-#define M1575_CONFIG_SUBSYSTEM_ID M1575_IDNUM
-#define M1575_CONFIG_SUBSYSTEM_VENDOR_ID M1575_CONFIG_VENDOR_ID
-#define M1575_AUDIO_PCICFG_SPACE (0)
-#define M1575_AUDIO_IO_SPACE (1)
-#define M1575_AUDIO_MEM_SPACE (2)
-
-#define M1575_MINPACKET (0)
-#define M1575_MAXPACKET (1*1024)
-#define M1575_HIWATER (64*1024)
-#define M1575_LOWATER (32*1024)
-#define M1575_LOOP_CTR (100)
-
-/* Gain and attenuation shift values */
-#define M1575_GAIN_SHIFT3 (3)
-#define M1575_GAIN_SHIFT4 (4)
-#define M1575_BYTE_SHIFT (8)
-
-/* audio direction */
-#define M1575_DMA_PCM_IN (1)
-#define M1575_DMA_PCM_OUT (2)
-
-/* last AC97 saved register */
-#define M1575_LAST_AC_REG (0x3a)
-
-/* Restore audio flags */
-#define M1575_INIT_RESTORE (0)
-#define M1575_INIT_NO_RESTORE ~M1575_INIT_RESTORE
-
-/* AC97 codec shadow reg to index macro */
-#define M1575_CODEC_REG(r) ((r) >> 1)
-
-/* play and record sample buffer counts */
-#define M1575_PLAY_BUFS (2)
-#define M1575_PLAY_BUF_MSK (M1575_PLAY_BUFS - 1)
-#define M1575_REC_BUFS (4)
-#define M1575_REC_BUF_MSK (M1575_REC_BUFS - 1)
-
-/* Buffer Descriptor List defines */
-#define M1575_BD_NUMS (32)
-#define M1575_BD_MSK (M1575_BD_NUMS - 1)
-#define M1575_BD_SIZE \
- (M1575_BD_NUMS * sizeof (m1575_bd_entry_t))
-
-/* default buffer size */
-#define M1575_BSIZE (8*1024)
-#define M1575_MOD_SIZE (16)
-#define M1575_PLAY_BUF_SZ (1024)
-#define M1575_RECORD_BUF_SZ (1024)
-#define M1575_BUF_MIN (512)
-#define M1575_BUF_MAX (8192)
-
-/* Audio channel defines */
-#define M1575_MAX_CHANNELS (32)
-#define M1575_MAX_HW_CHANNELS (6)
-#define M1575_MAX_IN_CHANNELS (1)
-#define M1575_MAX_OUT_CHANNELS \
- (M1575_MAX_HW_CHANNELS - M1575_MAX_IN_CHANNELS)
-#define M1575_INPUT_STREAM 1
-#define M1575_PORT_UNMUTE 0xffffffff
-
-/* kstat interrupt counter define */
-#define M1575_KIOP(X) ((kstat_intr_t *)(X->m1575_ksp->ks_data))
-
-/* AD1981B Specific Definitions */
-#define AC97_MISC_CONTROL_BIT_REGISTER 0x76
-#define MIC_20dB_GAIN 0x0000
-#define MIC_10dB_GAIN 0x0001
-#define MIC_30dB_GAIN 0x0010
-#define C2MIC 0x0040
-#define C1MIC 0x0000
-#define AC97_MIXER_ADC_GAIN_REGISTER 0x64
-#define MIXER_GAIN_MUTE 0x8000
-#define MIXER_0db_GAIN_ 0x0000
-/* Check for poweron status every 10 ms */
-#define AD1981_POWERON_DELAY_USEC 10000
-
-/* PCI CFG SPACE REGISTERS for Audio (Device 29, Function 0) */
-#define M1575_PCIID_REG 0x00 /* Vendor ID 32 */
-#define M1575_PCICS_REG 0x04 /* Cmd & Status 32 */
-#define M1575_PCIREV_REG 0x08 /* Class Code & RevId 32 */
-#define M1575_PCILT_REG 0x0C /* PCI latency 32 */
-#define M1575_PCIIO_REG 0x10 /* PCI IOBASE 32 */
-#define M1575_PCIMEM_REG 0x14 /* PCI MEMBASE 32 */
-#define M1575_PCIINT_REG 0x3C /* PCI INT Pin & Line 32 */
-#define M1575_PCIPMR_REG 0x42 /* Power Capabilities 16 */
-#define M1575_PCIPMCSR_REG 0x44 /* Power Cmd & Status 16 */
-#define M1575_PCISCCR_REG 0x48 /* System Cfg Cntrl 16 */
-#define M1575_PCIAPMUCR1_REG 0x54 /* Add. PMU Cntrl Reg 8 */
-#define M1575_PCISCRR_REG 0x57 /* Scratch Reg 8 */
-#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
-#define M1575_PCIGCC_REG 0x59 /* Global Clk Control 16 */
-#define M1575_PCIACD_REG 0x5C /* AC97 Codec Detect 8 */
-#define M1575_PCIMISC_REG 0x58 /* Misc Reg 8 */
-#define M1575_PCIGCLK_REG 0x59 /* Misc Reg 8 */
-#define M1575_PCIMSICTRL_REG 0x62 /* MSI Control Reg 16 */
-#define M1575_PCIMSIADDR_REG 0x64 /* MSI Address Reg 32 */
-#define M1575_PCIMSIDATA_REG 0x68 /* MSI Data Reg 16 */
-#define M1575_PCIMSIMASK_REG 0x6C /* MSI Data Reg 32 */
-#define M1575_PCIMSIPEND_REG 0x70 /* MSI Pend Reg 32 */
-
-/* Bit definitions for PCI AC97 Clk detect Reg */
-#define M1575_PCIACD_CLKDET 0x01
-#define M1575_PCIMISC_INTENB 0x40
-#define M1575_PCIINT_LINE 0x05
-
-/* Base Line Audio I/O Memory Registers */
-#define M1575_SCR_REG 0x00 /* System Control Reg 32 */
-#define M1575_SSR_REG 0x04 /* System System Reg 32 */
-#define M1575_DMACR_REG 0x08 /* DMA Control Reg 32 */
-#define M1575_FIFOCR1_REG 0x0C /* FIFO 1 Control Reg 32 */
-#define M1575_INTFCR_REG 0x10 /* Interface Ctrl Reg 32 */
-#define M1575_INTRCR_REG 0x14 /* Interrupt Ctrl Reg 32 */
-#define M1575_INTRSR_REG 0x18 /* Interrupt Status Reg 32 */
-#define M1575_FIFOCR2_REG 0x1C /* FIFO 2 Control Reg 32 */
-#define M1575_CPR_REG 0x20 /* Cmd Port Reg 32 */
-#define M1575_SPR_REG 0x24 /* Status Port Reg 32 */
-#define M1575_FIFOCR3_REG 0x2C /* FIFO 3 Control Reg 32 */
-#define M1575_TTSR_REG 0x30 /* Tx Tag Slot Reg 32 */
-#define M1575_RTSR_REG 0x34 /* Rx Tag Slot Reg 32 */
-#define M1575_CSPSR_REG 0x38 /* CSP Status Reg 32 */
-#define M1575_CASR_REG 0x3C /* Codec Access Sem Reg 32 */
-
-/* PCM IN Registers */
-#define M1575_PCMIBDBAR_REG 0x40 /* 32 */
-#define M1575_PCMICIV_REG 0x44 /* 8 */
-#define M1575_PCMILVIV_REG 0x45 /* 8 */
-#define M1575_PCMISR_REG 0x46 /* 16 */
-#define M1575_PCMIPICB_REG 0x48 /* 16 */
-#define M1575_PCMICR_REG 0x4B /* 8 */
-
-/* PCM OUT Registers */
-#define M1575_PCMOBDBAR_REG 0x50 /* 32 */
-#define M1575_PCMOCIV_REG 0x54 /* 8 */
-#define M1575_PCMOLVIV_REG 0x55 /* 8 */
-#define M1575_PCMOSR_REG 0x56 /* 16 */
-#define M1575_PCMOPICB_REG 0x58 /* 16 */
-#define M1575_PCMOCR_REG 0x5B /* 8 */
-
-/* MIC In Registers */
-#define M1575_MICIBDBAR_REG 0x60 /* 32 */
-#define M1575_MICICIV_REG 0x64 /* 8 */
-#define M1575_MICILVIV_REG 0x65 /* 8 */
-#define M1575_MICISR_REG 0x66 /* 16 */
-#define M1575_MICIPICB_REG 0x68 /* 16 */
-#define M1575_MICICR_REG 0x6B /* 8 */
-
-/* SPIDOF Registers */
-#define M1575_CSPOBDBAR_REG 0x70 /* 32 */
-#define M1575_CSPOCIV_REG 0x74 /* 8 */
-#define M1575_CSPOLVIV_REG 0x75 /* 8 */
-#define M1575_CSPOSR_REG 0x76 /* 16 */
-#define M1575_CSPOPICB_REG 0x78 /* 16 */
-#define M1575_CSPOCR_REG 0x7B /* 8 */
-
-/* PCM IN2 Registers */
-#define M1575_PCMI2BDBAR_REG 0xd0 /* 32 */
-#define M1575_PCMI2CIV_REG 0xd4 /* 8 */
-#define M1575_PCMI2LVIV_REG 0xd5 /* 8 */
-#define M1575_PCMI2SR_REG 0xd6 /* 16 */
-#define M1575_PCMI2PICB_REG 0xd8 /* 16 */
-#define M1575_PCMI2CR_REG 0xdB /* 8 */
-
-/* MIC2 IN2 Registers */
-#define M1575_MICI2BDBAR_REG 0xe0 /* 32 */
-#define M1575_MICI2CIV_REG 0xe4 /* 8 */
-#define M1575_MICI2LVIV_REG 0xe5 /* 8 */
-#define M1575_MICI2SR_REG 0xe6 /* 16 */
-#define M1575_MICI2PICB_REG 0xe8 /* 16 */
-#define M1575_MICI2CR_REG 0xeB /* 8 */
-
-/* Bits of FIFO Control Register1 */
-#define M1575_FIFOCR1_CSPORST 0x80000000 /* SPDIF Out Reset */
-#define M1575_FIFOCR1_MICIRST 0x00800000 /* MIC In Reset */
-#define M1575_FIFOCR1_PCMORST 0x00008000 /* PCM Out Reset */
-#define M1575_FIFOCR1_PCMIRST 0x00000080 /* PCM In Reset */
-
-/* Bits of FIFO Control Register2 */
-#define M1575_FIFOCR2_SPORST 0x80000000 /* SPDIF Out FIFO Reset */
-#define M1575_FIFOCR2_SPIRST 0x00800000 /* SPDIF In FIFO Reset */
-#define M1575_FIFOCR2_LFEORST 0x00008000 /* LFE Out FIFO Reset */
-#define M1575_FIFOCR2_CENORST 0x00000080 /* CENTER Out Reset */
-
-/* Bits of FIFO Control Register3 */
-#define M1575_FIFOCR3_PCMI2RST 0x00800000 /* PCM In2 FIFO Reset */
-#define M1575_FIFOCR3_MICI2RST 0x00008000 /* MIC In2 FIFO Reset */
-#define M1575_FIFOCR3_I2SIRST 0x00000080 /* I2S In FIFO Reset */
-
-/* Bits of DMA Control Register */
-#define M1575_DMACR_PCMISTART 0x00000001
-#define M1575_DMACR_PCMOSTART 0x00000002
-#define M1575_DMACR_MICISTART 0x00000004
-#define M1575_DMACR_CSPOSTART 0x00000008
-#define M1575_DMACR_CENOSTART 0x00000010
-#define M1575_DMACR_LFEOSTART 0x00000020
-#define M1575_DMACR_SPISTART 0x00000040
-#define M1575_DMACR_SPOSTART 0x00000080
-#define M1575_DMACR_I2SISTART 0x00000100
-#define M1575_DMACR_PCMI2START 0x00000200
-#define M1575_DMACR_MICI2START 0x00000400
-#define M1575_DMACR_PCMIPAUSE 0x00010000
-#define M1575_DMACR_PCMOPAUSE 0x00020000
-#define M1575_DMACR_MICIPAUSE 0x00040000
-#define M1575_DMACR_CSPOPAUSE 0x00080000
-#define M1575_DMACR_CENOPAUSE 0x00100000
-#define M1575_DMACR_LFEOPAUSE 0x00200000
-#define M1575_DMACR_SPIPAUSE 0x00400000
-#define M1575_DMACR_SPOPAUSE 0x00800000
-#define M1575_DMACR_I2SIPAUSE 0x01000000
-#define M1575_DMACR_PCMI2PAUSE 0x02000000
-#define M1575_DMACR_MICI2PAUSE 0x04000000
-
-#define M1575_DMACR_PAUSE_ALL 0x07ff0000
-
-/* Bits of INTRSR Interrupt Status Register */
-#define M1575_INTRSR_GPIOINTR 0x0000002
-#define M1575_INTRSR_SPRINTR 0x0000020
-#define M1575_INTRSR_CPRINTR 0x0000080
-#define M1575_INTRSR_PCMIINTR 0x0010000
-#define M1575_INTRSR_PCMOINTR 0x0020000
-#define M1575_INTRSR_MICIINTR 0x0040000
-#define M1575_INTRSR_CSPOINTR 0x0080000
-#define M1575_INTRSR_CENOINTR 0x0100000
-#define M1575_INTRSR_LFEOINTR 0x0200000
-#define M1575_INTRSR_SPIINTR 0x0400000
-#define M1575_INTRSR_SPOINTR 0x0800000
-#define M1575_INTRSR_I2SIINTR 0x1000000
-#define M1575_INTRSR_PCMI2INTR 0x2000000
-#define M1575_INTRSR_MICI2INTR 0x4000000
-
-#define M1575_INTR_MASK (M1575_INTRSR_GPIOINTR |\
- M1575_INTRSR_SPRINTR |\
- M1575_INTRSR_CPRINTR |\
- M1575_INTRSR_PCMIINTR |\
- M1575_INTRSR_PCMOINTR |\
- M1575_INTRSR_MICIINTR |\
- M1575_INTRSR_CSPOINTR |\
- M1575_INTRSR_CENOINTR |\
- M1575_INTRSR_LFEOINTR |\
- M1575_INTRSR_SPIINTR |\
- M1575_INTRSR_SPOINTR |\
- M1575_INTRSR_I2SIINTR |\
- M1575_INTRSR_PCMI2INTR|\
- M1575_INTRSR_MICI2INTR)
-
-#define M1575_UNUSED_INTR_MASK (M1575_INTRSR_GPIOINTR |\
- M1575_INTRSR_SPRINTR |\
- M1575_INTRSR_CPRINTR |\
- M1575_INTRSR_MICIINTR |\
- M1575_INTRSR_CSPOINTR |\
- M1575_INTRSR_CENOINTR |\
- M1575_INTRSR_LFEOINTR |\
- M1575_INTRSR_SPIINTR |\
- M1575_INTRSR_SPOINTR |\
- M1575_INTRSR_I2SIINTR |\
- M1575_INTRSR_PCMI2INTR|\
- M1575_INTRSR_MICI2INTR)
-
-/* Defines a generic clear for all MIC and PCM Status Registers */
-#define M1575_STATUS_CLR 0x001e
-
-/* Defines a generic RESET for all MIC and PCM Control Registers */
-#define M1575_CR_RR 0x02
-#define M1575_SR_DMACS 0x01
-
-/* Bits of PCM In Status Register */
-#define M1575_PCMISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_PCMISR_CELV 0x02
-#define M1575_PCMISR_LVBCI 0x04
-#define M1575_PCMISR_BCIS 0x08
-#define M1575_PCMISR_FIFOE 0x10
-
-/* Bits in PCM In Control Register */
-#define M1575_PCMICR_RR 0x02 /* Reset */
-#define M1575_PCMICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_PCMICR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits of PCM Out Status Register */
-#define M1575_PCMOSR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_PCMOSR_CELV 0x02
-#define M1575_PCMOSR_LVBCI 0x04
-#define M1575_PCMOSR_BCIS 0x08
-#define M1575_PCMOSR_FIFOE 0x10
-
-/* Bits in PCM Out Control Register */
-#define M1575_PCMOCR_RR 0x02 /* Reset */
-#define M1575_PCMOCR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_PCMOCR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits of MIC In Status Register */
-#define M1575_MICISR_DMACS 0x01 /* DMACS=0 if DMA Engine is IDLE */
-#define M1575_MICISR_CELV 0x02
-#define M1575_MICISR_LVBCI 0x04
-#define M1575_MICISR_BCIS 0x08
-#define M1575_MICISR_FIFOE 0x10
-
-/* Bits in PCM In Control Register */
-#define M1575_MICICR_RR 0x02 /* Reset */
-#define M1575_MICICR_LVBIE 0x04 /* Last valid Buffer Intr Enable */
-#define M1575_MICICR_IOCE 0x10 /* Intr On Completion Enable */
-
-/* Bits in System Control Register */
-#define M1575_SCR_WARMRST 0x00000001
-#define M1575_SCR_COLDRST 0x00000002
-#define M1575_SCR_DRENT 0x40000000
-#define M1575_SCR_MSTRST 0x80000000
-
-/* Bits in System Status Register */
-#define M1575_SSR_RSTBLK 0x00000002
-#define M1575_SSR_FACCS_MSK 0x00000018
-#define M1575_SSR_SCID 0x00000040
-
-/* Bits in Command Port Register */
-#define M1575_CPR_ACSCS 0x0100 /* Audio Codec for cmd 1=codec 2 */
-#define M1575_CPR_READ 0x0080
-
-/* Bits in Cmd Status Port Register */
-#define M1575_CSPSR_SUCC 0x08 /* cmd successful */
-#define M1575_CSPSR_RDRDY 0x02 /* ready for read cmd */
-#define M1575_CSPSR_WRRDY 0x01 /* ready for write cmd */
-#define M1575_PCMI2CR_RR 0x02 /* Reset */
-#define M1575_MICI2CR_RR 0x02 /* Reset */
-#define M1575_CSPOCR_RR 0x02 /* Reset */
-
-/* Bits in Interface Control Register */
-#define M1575_INTFCR_RSTREL 0x02000000
-#define M1575_INTFCR_RSTBLK 0x00200000
-#define M1575_INTFCR_MICENB 0x00100000
-#define M1575_INTFCR_PCMIENB 0x00080000
-#define M1575_INTFCR_MICI2ENB 0x00040000
-#define M1575_INTFCR_PCMI2ENB 0x00020000
-#define M1575_INTFCR_MICI2SEL 0x00008000
-#define M1575_INTFCR_MICISEL 0x00004000
-#define M1575_INTFCR_PCMOENB 0x00000002
-
-#define M1575_INTRCR_CPRINTR 0x00000080
-#define M1575_INTRCR_SPRINTR 0x00000020
-#define M1575_INTRCR_GPIOINTR 0x00000002
-
-/* Bits of Recv Tag Slot Register */
-#define M1575_RTSR_SACRDY 0x20u /* 2nd Audio Codec Rdy */
-#define M1575_RTSR_FACRDY 0x80u /* 1st Audio Codec Rdy */
-
-/* Semaphore busy */
-#define M1575_CASR_SEMBSY 0x80000000
-
-/* AD1981 codec vendor ID */
-#define AD1981_VID1 0x4144
-#define AD1981_VID2 0x5374
-
-/* AD1981B Codec Registers */
-#define AD1981_RESET_REG 0x00
-#define AD1981_MSTVOL_REG 0x02
-#define AD1981_HPHVOL_REG 0x04
-#define AD1981_MONOVOL_REG 0x06
-#define AD1981_MICVOL_REG 0x0E
-#define AD1981_CDVOL_REG 0x12
-#define AD1981_PCMOVOL_REG 0x18
-#define AD1981_RECSEL_REG 0x1A
-#define AD1981_RECGAIN_REG 0x1C
-#define AD1981_GENPUR_REG 0x20
-#define AD1981_PWRCSR_REG 0x26
-#define AD1981_EXTID_REG 0x28
-#define AD1981_EXTCSR_REG 0x2A
-#define AD1981_PCMDAC_REG 0x2C
-#define AD1981_PCMADC_REG 0x32
-#define AD1981_EQCTRL_REG 0x60
-#define AD1981_EQDATA_REG 0x62
-#define AD1981_MIXVOL_REG 0x64
-#define AD1981_MISCTRL_REG 0x76
-#define AD1981_VNDID1_REG 0x7C
-#define AD1981_VNDID2_REG 0x7E
-
-/* AD1981B Biquad filter definitions */
-#define AD1981_MAX_FILTERS 35
-#define AD1981_EQCTRL_EQM 0x8000
-#define AD1981_EQCTRL_SYM 0x0080
-
-/*
- * Equalizer Biquad Filter Coefficient Address offsets
- */
-struct m1575_biquad {
- uint16_t addr;
- uint16_t coeff;
-};
-typedef struct m1575_biquad m1575_biquad_t;
-
-/*
- * chunk buffer
- */
-struct m1575_bdlist_chunk {
- caddr_t data_buf; /* virtual address of buffer */
- uint32_t addr_phy; /* physical address of buffer */
- ddi_dma_handle_t dma_handle; /* dma handle */
- ddi_acc_handle_t acc_handle; /* access handle */
- size_t real_len; /* real len */
-};
-typedef struct m1575_bdlist_chunk m1575_bdlist_chunk_t;
-
-/*
- * sample buffer
- */
-struct m1575_sample_buf {
- boolean_t io_started; /* start/stop state for play/record */
- int avail; /* the number of available chunk(s) */
- uint8_t tail; /* For CPU, 1st available BD entry */
- uint8_t head; /* For CPU, 1st BD entry to reclaim */
- m1575_bdlist_chunk_t chunk[M1575_BD_NUMS];
-};
-typedef struct m1575_sample_buf m1575_sample_buf_t;
-
-/*
- * buffer descripter list entry, see M1575 datasheet
- */
-#define IOC 0x8000
-#define BUP 0x4000
-
-struct m1575_bd_entry {
- uint32_t buf_base; /* the address of the buffer */
- uint16_t buf_len; /* the number of samples */
- uint16_t buf_cmd;
-};
-typedef struct m1575_bd_entry m1575_bd_entry_t;
-
-/*
- * PCI config space register layout
- */
-struct audio1575_pci_regs {
- uint32_t vendor_dev_id; /* 00h - 03h */
- uint32_t cmd_status_reg; /* 04h - 07h */
- uint32_t class_code_rev_id; /* 08h - 0bh */
- uint32_t bist_cache; /* 0ch - 0fh */
- uint32_t io_base; /* 10h - 13h */
- uint32_t mem_base; /* 14h - 17h */
- uint32_t rsvd1[4]; /* 18h - 28h */
- uint32_t sub_ids; /* 2ch - 2fh */
- uint32_t rsvd2; /* 30h - 33h */
- uint32_t cap_ptr; /* 34h - 37h */
- uint32_t rsvd3; /* 38h - 3bh */
- uint32_t intr_line; /* 3ch - 3fh */
- uint16_t cap_id_next; /* 40h - 41h */
- uint16_t pm_cap; /* 42h - 43h */
- uint16_t pm_csr; /* 44h - 45h */
- uint8_t pm_csrbse; /* 46h - 46h */
- uint8_t data_reg; /* 47h - 47h */
- uint16_t sccr_reg; /* 48h - 49h */
- uint16_t subvendor_id; /* 50h - 51h */
- uint16_t subdevice_id; /* 52h - 53h */
- uint8_t apmucr1_reg; /* 54h */
- uint8_t apmucr2_reg; /* 55h */
- uint8_t itec; /* 56h */
- uint8_t scrr_reg; /* 57h */
- uint8_t misc_reg; /* 58h */
- uint8_t gcc_reg; /* 59h */
- uint16_t rsvd5; /* 5ah - 5bh */
- uint8_t ac97acd_reg; /* 5ch */
- uint8_t rsvd6[3]; /* 5dh - 5fh */
- uint8_t msi_capid; /* 60h */
- uint8_t msi_next; /* 61h */
- uint16_t msi_ctrl; /* 62h - 63h */
- uint32_t msi_addr; /* 64h - 67h */
- uint16_t msi_data; /* 68h - 69h */
- uint16_t rsvd7; /* 6ah - 6bh */
- uint32_t msi_mask; /* 6ch - 6fh */
- uint32_t msi_pend; /* 70h - 73h */
- uint16_t rsrvd8[39]; /* 74h - c1h */
- uint16_t smodem_devid; /* c2h - c3h */
-};
-typedef struct audio1575_pci_regs audio1575_pci_regs_t;
-
-/*
- * M1575 audio register layout
- */
-struct audio1575_audio_regs {
- uint32_t scr_reg; /* 00h - 03h */
- uint32_t ssr_reg; /* 04h - 07h */
- uint32_t dmacr_reg; /* 08h - 0bh */
- uint32_t fifocr1_reg; /* 0ch - 0fh */
- uint32_t intfcr_reg; /* 10h - 13h */
- uint32_t intrcr_reg; /* 14h - 17h */
- uint32_t intrsr_reg; /* 18h - 1bh */
- uint32_t fifocr2_reg; /* 1ch - 1fh */
- uint32_t cpr_reg; /* 20h - 23h */
- uint32_t spr_reg; /* 24h - 27h */
- uint32_t rsvd1; /* 28h - 2bh */
- uint32_t fifocr3_reg; /* 2ch - 2fh */
- uint32_t ttsr_reg; /* 30h - 33h */
- uint32_t rtsr_reg; /* 34h - 37h */
- uint32_t cspsr_reg; /* 38h - 3bh */
- uint32_t casr_reg; /* 3ch - 3fh */
- uint32_t pcmibdbar_reg; /* 40h - 43h */
- uint8_t pcmciv_reg; /* 44h - 44h */
- uint8_t pcmilviv_reg; /* 45h - 45h */
- uint16_t pcmisr_reg; /* 46h - 47h */
- uint16_t pcmipicb_reg; /* 48h - 49h */
- uint8_t rsvd2; /* 4ah - 4ah */
- uint8_t pcmicr_reg; /* 4bh - 4bh */
- uint32_t rsvd3; /* 4ch - 4fh */
- uint32_t pcmobdbar_reg; /* 50h - 53h */
- uint8_t pcmociv_reg; /* 54h - 54h */
- uint8_t pcmolviv_reg; /* 55h - 55h */
- uint16_t pcmosr_reg; /* 56h - 57h */
- uint16_t pcmopicb_reg; /* 58h - 59h */
- uint8_t rsvd4; /* 5ah - 5ah */
- uint8_t pcmocr_reg; /* 5bh - 5bh */
- uint32_t rsvd5; /* 5ch - 5fh */
- uint32_t micibdbar_reg; /* 60h - 63h */
- uint8_t miciciv_reg; /* 64h - 64h */
- uint8_t micilviv_reg; /* 65h - 65h */
- uint16_t micisr_reg; /* 66h - 67h */
- uint16_t micipicb_reg; /* 68h - 69h */
- uint8_t rsvd6; /* 6ah - 6ah */
- uint8_t micicr_reg; /* 6bh - 6bh */
- uint32_t rsvd7; /* 6ch - 6fh */
- uint32_t cspobdbar_reg; /* 70h - 53h */
- uint8_t cspociv_reg; /* 74h - 74h */
- uint8_t cspolviv_reg; /* 75h - 75h */
- uint16_t csposr_reg; /* 76h - 77h */
- uint16_t cspopicb_reg; /* 78h - 79h */
- uint8_t rsvd8; /* 7ah - 7ah */
- uint8_t cspocr_reg; /* 7bh - 7bh */
- uint32_t rsvd9[21]; /* 7ch - cfh */
- uint32_t pcmi2bdbar_reg; /* d0h - d3h */
- uint8_t pcmi2civ_reg; /* d4h - d4h */
- uint8_t pcmi2lviv_reg; /* d5h - d5h */
- uint16_t pcmi2sr_reg; /* d6h - d7h */
- uint16_t pcmi2picb_reg; /* d8h - d9h */
- uint8_t rsvd10; /* dah - dah */
- uint8_t pcmi2cr_reg; /* dbh - dbh */
- uint32_t rsvd11; /* dch - dfh */
- uint32_t mici2bdbar_reg; /* e0h - e3h */
- uint8_t mici2civ_reg; /* e4h - e4h */
- uint8_t mici2lviv_reg; /* e5h - e5h */
- uint16_t mici2sr_reg; /* e6h - e7h */
- uint16_t mici2picb_reg; /* e8h - e9h */
- uint8_t rsvd12; /* eah - eah */
- uint8_t mici2cr_reg; /* ebh - ebh */
- uint32_t rsvd13; /* ech - efh */
- uint32_t hvcsr_reg; /* f0h - f3h */
- uint32_t rsvd14[3]; /* f4h - ffh */
-};
-typedef struct audio1575_audio_regs audio1575_audio_regs_t;
-
-/*
- * audio1575_state_t per instance state and operation data
- */
-struct audio1575_state {
- kmutex_t m1575_intr_mutex; /* intr mutex */
- dev_info_t *m1575_dip; /* dev instance ptr */
- int m1575_inst; /* dev instance */
- int m1575_intr_type; /* intr type */
- uint_t m1575_intr_pri; /* intr priority */
- ddi_intr_handle_t *m1575_h_table; /* intr table ptr */
- audiohdl_t m1575_ahandle; /* audio handle */
- am_ad_info_t m1575_ad_info; /* audio device info */
- uint16_t m1575_codec_shadow[64]; /* shadow AC97 regs */
- ddi_acc_handle_t m1575_pci_regs_handle; /* pci config space */
- ddi_acc_handle_t m1575_am_regs_handle; /* audio i/o regs */
- ddi_acc_handle_t m1575_bm_regs_handle; /* audio mem regs */
- audio1575_pci_regs_t *m1575_pci_regs; /* base of pci regs */
- audio1575_audio_regs_t *m1575_am_regs; /* base of i/o regs */
- audio1575_audio_regs_t *m1575_bm_regs; /* base of mem regs */
- ddi_dma_handle_t m1575_bdl_dma_handle; /* for BDL */
- ddi_acc_handle_t m1575_bdl_acc_handle; /* acc handle of BDL */
- void *m1575_bdl_virtual; /* virt addr of BDL */
- size_t m1575_bdl_size; /* real len of BDL */
- m1575_bd_entry_t *m1575_bdl_virt_pin; /* vaddr PCMIN BDL */
- m1575_bd_entry_t *m1575_bdl_virt_pout; /* vaddr PCMOUT BDL */
- uint32_t m1575_bdl_phys_pin; /* physadr PCMIN BDL */
- uint32_t m1575_bdl_phys_pout; /* physadr PCMOUT BDL */
- audio_info_t m1575_defaults; /* default states */
- audio_device_t m1575_dev_info; /* audio device info */
- uint16_t m1575_vol_bits_mask; /* volume ctrl bits */
- kstat_t *m1575_ksp; /* kernel statistics */
- uint32_t m1575_flags; /* state flags */
- uint_t m1575_cdrom; /* 1= present, 0 not */
- uint_t m1575_mode; /* MIXER/COMPAT_MODE */
- uint_t m1575_psample_rate; /* play sample rate */
- uint_t m1575_pchannels; /* play channels */
- uint_t m1575_pprecision; /* play precision */
- uint_t m1575_csample_rate; /* record sample rate */
- uint_t m1575_cchannels; /* record channels */
- uint_t m1575_cprecision; /* record precision */
- uint_t m1575_output_port; /* current out port */
- uint_t m1575_input_port; /* current input port */
- uint_t m1575_monitor_gain; /* monitor gain */
- int m1575_csamples; /* pcmin samples/int */
- int m1575_psamples; /* pcmout samples/int */
- uint32_t m1575_res_flags; /* resource flags */
- m1575_sample_buf_t m1575_play_buf; /* buf for playback */
- int m1575_play_buf_size; /* size of in buf */
- m1575_sample_buf_t m1575_record_buf; /* buffer for record */
- int m1575_record_buf_size; /* size of in buffer */
-};
-typedef struct audio1575_state audio1575_state_t;
-
-/* audio1575_state_t.flags defines */
-#define M1575_DMA_PLAY_STARTED 0x0001u /* play DMA eng. initialized */
-#define M1575_DMA_PLAY_PAUSED 0x0002u /* play DMA engine paused */
-#define M1575_DMA_PLAY_EMPTY 0x0004u /* play DMA engine empty */
-#define M1575_DMA_RECD_STARTED 0x0010u /* record DMA engine started */
-#define M1575_DMA_SUSPENDED 0x0020u /* DMA suspended flag */
-
-/* bits of audio1575_state_t.m1575_res_flags */
-#define M1575_RS_PCI_REGS 0x0001
-#define M1575_RS_AM_REGS 0x0002
-#define M1575_RS_BM_REGS 0x0004
-#define M1575_RS_DMA_BDL_HANDLE 0x0008
-#define M1575_RS_DMA_BDL_MEM 0x0010
-#define M1575_RS_DMA_BDL_BIND 0x0020
-
-/* PCI Config register macros */
-#define M1575_PCI_GET8(reg) \
- ddi_get8(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_GET16(reg) \
- ddi_get16(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_GET32(reg) \
- ddi_get32(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)))
-
-#define M1575_PCI_PUT8(reg, val) \
- ddi_put8(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-#define M1575_PCI_PUT16(reg, val) \
- ddi_put16(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-#define M1575_PCI_PUT32(reg, val) \
- ddi_put32(statep->m1575_pci_regs_handle, \
- (void *)((char *)statep->m1575_pci_regs + (reg)), (val))
-
-/* audio i/o register macros */
-#define M1575_AM_GET8(reg) \
- ddi_get8(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_GET16(reg) \
- ddi_get16(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_GET32(reg) \
- ddi_get32(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)))
-
-#define M1575_AM_PUT8(reg, val) \
- ddi_put8(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-#define M1575_AM_PUT16(reg, val) \
- ddi_put16(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-#define M1575_AM_PUT32(reg, val) \
- ddi_put32(statep->m1575_am_regs_handle, \
- (void *)((char *)statep->m1575_am_regs + (reg)), (val))
-
-/* audio memory bus master registers */
-#define M1575_BM_GET8(reg) \
- ddi_get8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_GET16(reg) \
- ddi_get16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_GET32(reg) \
- ddi_get32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)))
-
-#define M1575_BM_PUT8(reg, val) { \
- uint8_t __T; \
- ddi_put8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get8(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#define M1575_BM_PUT16(reg, val) { \
- uint16_t __T; \
- ddi_put16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get16(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#define M1575_BM_PUT32(reg, val) { \
- uint32_t __T; \
- ddi_put32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg)), (val)); \
- __T = ddi_get32(statep->m1575_bm_regs_handle, \
- (void *)((char *)statep->m1575_bm_regs + (reg))); \
- if (__T != val) { \
- cmn_err(CE_NOTE, "audio1575: couldn't set " \
- "value (%d 0x%02x 0x%02x)", __LINE__, __T, val); \
- cmn_err(CE_CONT, "audio may not work " \
- "correctly until it is stopped and restarted"); \
- } \
-}
-
-#endif /* _KERNEL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SYS_AUDIO1575_IMPL_H_ */