LyogQ29weXJpZ2h0IKkgMTk5NC0xOTk5IEx1Y2VudCBUZWNobm9sb2dpZXMgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5Ny0xOTk5IFZpdGEgTnVvdmEgTGltaXRlZAogKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDAwLTIwMDcgVml0YSBOdW92YSBIb2xkaW5ncyBMaW1pdGVkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod3d3LnZpdGFudW92YS5jb20pCiAqIFJldmlzaW9ucyBDb3B5cmlnaHQgqSAyMDAwLTIwMDcgTHVjZW50IFRlY2hub2xvZ2llcyBJbmMuIGFuZCBvdGhlcnMKICoKICogTW9kaWZpZWQgZm9yIHRoZSBBa2Fyb3Mgb3BlcmF0aW5nIHN5c3RlbToKICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQogKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBHb29nbGUgSW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKICogU09GVFdBUkUuICovCgojcHJhZ21hIG9uY2UKCiNpbmNsdWRlIDxuZXQvaXAuaD4KCmVudW0gewoJUU1BWCA9IDY0ICogMTAyNCAtIDEsCglJUF9UQ1BQUk9UTyA9IDYsCgoJVENQNF9JUExFTiA9IDgsCglUQ1A0X1BIRFJTSVpFID0gMTIsCglUQ1A0X0hEUlNJWkUgPSAyMCwKCVRDUDRfVENCUEhEUlNaID0gNDAsCglUQ1A0X1BLVCA9IFRDUDRfSVBMRU4gKyBUQ1A0X1BIRFJTSVpFLAoKCVRDUDZfSVBMRU4gPSAwLAoJVENQNl9QSERSU0laRSA9IDQwLAoJVENQNl9IRFJTSVpFID0gMjAsCglUQ1A2X1RDQlBIRFJTWiA9IDYwLAoJVENQNl9QS1QgPSBUQ1A2X0lQTEVOICsgVENQNl9QSERSU0laRSwKCglUY3B0aW1lck9GRiA9IDAsCglUY3B0aW1lck9OID0gMSwKCVRjcHRpbWVyRE9ORSA9IDIsCglNQVhfVElNRSA9ICgxIDw8IDIwKSwJLyogRm9yZXZlciAqLwoJVENQX0FDSyA9IDUwLAkvKiBUaW1lZCBhY2sgc2VxdWVuY2UgaW4gbXMgKi8KCU1BWEJBQ0tNUyA9IDkgKiA2MCAqIDEwMDAsCS8qIGxvbmdlc3QgYmFja29mZiB0aW1lIChtcykgYmVmb3JlIGhhbmd1cCAqLwoKCVVSRyA9IDB4MjAsCS8qIERhdGEgbWFya2VkIHVyZ2VudCAqLwoJQUNLID0gMHgxMCwJLyogQWNrbm93bGVkZ2UgaXMgdmFsaWQgKi8KCVBTSCA9IDB4MDgsCS8qIFdob2xlIGRhdGEgcGlwZSBpcyBwdXNoZWQgKi8KCVJTVCA9IDB4MDQsCS8qIFJlc2V0IGNvbm5lY3Rpb24gKi8KCVNZTiA9IDB4MDIsCS8qIFBrdC4gaXMgc3luY2hyb25pc2UgKi8KCUZJTiA9IDB4MDEsCS8qIFN0YXJ0IGNsb3NlIGRvd24gKi8KCglFT0xPUFQgPSAwLAoJTk9PUE9QVCA9IDEsCglNU1NPUFQgPSAyLAoJTVNTX0xFTkdUSCA9IDQsCS8qIG1heCBzZWdtZW50IHNpemUgaGVhZGVyIG9wdGlvbiBsZW5ndGggKi8KCVdTT1BUID0gMywKCVdTX0xFTkdUSCA9IDMsCS8qIFdTIGhlYWRlciBvcHRpb24gbGVuZ3RoICovCglNQVhfV1NfVkFMVUUgPSAxNCwJLyogUkZDIHNwZWNpZmllZC4gIExpbWl0cyBhdmFpbGFibGUgd2luZG93IHRvIDJeMzAgKi8KCVRTX09QVCA9IDgsCglUU19MRU5HVEggPSAxMCwKCVRTX1NFTkRfUFJFUEFEID0gMiwJLyogRm9yIG5vbi1TWU5zLCBwcmUtcGFkIDIgbm9wcyBmb3IgMzIgYnl0ZSBhbGlnbm1lbnQgKi8KCVNBQ0tfT0tfT1BUID0gNCwKCVNBQ0tfT0tfTEVOR1RIID0gMiwKCVNBQ0tfT1BUID0gNSwKCU1TTDIgPSAxMCwKCU1TUFRJQ0sgPSA1MCwJLyogTWlsbGlzZWNvbmRzIHBlciB0aW1lciB0aWNrICovCglERUZfTVNTID0gMTQ2MCwJLyogRGVmYXVsdCBtZWFuIHNlZ21lbnQgKi8KCURFRl9NU1M2ID0gMTI4MCwJLyogRGVmYXVsdCBtZWFuIHNlZ21lbnQgKG1pbikgZm9yIHY2ICovCglTQUNLX1NVUFBPUlRFRCA9IFRSVUUsCS8qIFNBQ0sgaXMgb24gYnkgZGVmYXVsdCAqLwoJTUFYX05SX1NBQ0tTX1BFUl9QQUNLRVQgPSA0LAkvKiBsaW1pdGVkIGJ5IFRDUCdzIG9wdHMgc2l6ZSAqLwoJTUFYX05SX1NORF9TQUNLUyA9IDEwLAoJTUFYX05SX1JDVl9TQUNLUyA9IDMsCS8qIFdlIGNvdWxkIHRyeSBmb3IgNCwgYnV0IGRvbid0IG5lZWQgdG8gKi8KCURFRl9SVFQgPSA1MDAsCS8qIERlZmF1bHQgcm91bmQgdHJpcCAqLwoJREVGX0tBVCA9IDEyMDAwMCwJLyogRGVmYXVsdCB0aW1lIChtcykgYmV0d2VlbiBrZWVwIGFsaXZlcyAqLwoJVENQX0xJU1RFTiA9IDAsCS8qIExpc3RlbiBjb25uZWN0aW9uICovCglUQ1BfQ09OTkVDVCA9IDEsCS8qIE91dGdvaW5nIGNvbm5lY3Rpb24gKi8KCVNZTkFDS19SWFRJTUVSID0gMjUwLAkvKiBtcyBiZXR3ZWVuIFNZTkFDSyByZXRyYW5zbWl0cyAqLwoKCVRDUFJFWE1UVEhSRVNIID0gMywJLyogZHVwYWNrIHRocmVzaG9sZCBmb3IgcmVjb3ZlcnkgKi8KCVNBQ0tfUkVUUkFOU19SRUNPVkVSWSA9IDEsCglGQVNUX1JFVFJBTlNfUkVDT1ZFUlkgPSAyLAoJUlRPX1JFVFJBTlNfUkVDT1ZFUlkgPSAzLAoJQ1dJTkRfU0NBTEUgPSAxMCwJLyogaW5pdGlhbCBDV0lORCB3aWxsIGJlIE1TUyAqIHRoaXMgKi8KCglGT1JDRQkJCT0gMSA8PCAwLAoJQ0xPTkUJCQk9IDEgPDwgMSwKCUFDVElWRQkJCT0gMSA8PCAyLAoJU1lOQUNLCQkJPSAxIDw8IDMsCglUU08JCQkJPSAxIDw8IDQsCgoJUlRUTV9BTFBIQV9TSElGVCA9IDMsCS8qIGFscGhhID0gMS84ICovCglSVFRNX0JSQVZPX1NISUZUID0gMiwJLyogYnJhdm8gPSAxLzQgKGJldGEpICovCgoJQ2xvc2VkID0gMCwJLyogQ29ubmVjdGlvbiBzdGF0ZXMgKi8KCUxpc3RlbiwKCVN5bl9zZW50LAoJRXN0YWJsaXNoZWQsCglGaW53YWl0MSwKCUZpbndhaXQyLAoJQ2xvc2Vfd2FpdCwKCUNsb3NpbmcsCglMYXN0X2FjaywKCVRpbWVfd2FpdCwKCglNYXhsaW1ibyA9IDEwMDAsCS8qIG1heGltdW0gcHJvY3Mgd2FpdGluZyBmb3IgcmVzcG9uc2UgdG8gU1lOIEFDSyAqLwoJTkxIVCA9IDI1NiwJLyogaGFzaCB0YWJsZSBzaXplLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLwoJTEhUTUFTSyA9IE5MSFQgLSAxLAoKCUhhdmVXUyA9IDEgPDwgOCwKfTsKCnR5cGVkZWYgc3RydWN0IHRjcHRpbWVyIFRjcHRpbWVyOwpzdHJ1Y3QgdGNwdGltZXIgewoJVGNwdGltZXIgKm5leHQ7CglUY3B0aW1lciAqcHJldjsKCVRjcHRpbWVyICpyZWFkeW5leHQ7CglpbnQgc3RhdGU7Cgl1aW50NjRfdCBzdGFydDsKCXVpbnQ2NF90IGNvdW50OwoJdm9pZCAoKmZ1bmMpICh2b2lkICopOwoJdm9pZCAqYXJnOwp9OwoKc3RydWN0IHRjcGhkciB7Cgl1aW50OF90IHRjcHNwb3J0WzJdOwoJdWludDhfdCB0Y3BkcG9ydFsyXTsKCXVpbnQ4X3QgdGNwc2VxWzRdOwoJdWludDhfdCB0Y3BhY2tbNF07Cgl1aW50OF90IHRjcGZsYWdbMl07Cgl1aW50OF90IHRjcHdpblsyXTsKCXVpbnQ4X3QgdGNwY2tzdW1bMl07Cgl1aW50OF90IHRjcHVyZ1syXTsKCS8qIE9wdGlvbnMgc2VnbWVudCAqLwoJdWludDhfdCB0Y3BvcHRbMV07Cn07CgovKiB2NCBhbmQgdjYgcHNldWRvIGhlYWRlcnMgdXNlZCBmb3IgY2hlY2tzdW1taW5nIHRjcAogKgogKiBOb3RlIHRoZSBmaWVsZCBsYXlvdXQgaXMgdGhlIHNhbWUgZm9yIGEgcmVhbCBJUCBwYWNrZXQuICAiVW51c2VkIiBpbiB2NCBpcwogKiB0aGUgVFRMIHNsb3QsIGJ1dCBpdCdzIHRoZSAnemVyb3MnIGZvciB0aGUgVENQIFBIIGNzdW0uICBTaW1pbGFybHksIHRjcGxlbiBpcwogKiB0aGUgSVAgY3N1bSBzbG90LiAgTGF0ZXIgb24sIGl0J2xsIGdldCBvdmVyd3JpdHRlbiBpbiB0aGUgSVAgc3RhY2sgb3IgaW4KICogaGFyZHdhcmUuICBUaGUgc3RydWN0IHRjcDRoZHIgKG9yIHJhdGhlciBicC0+cnApIHdpbGwgYmUgY2FzdCB0byBhbiBJcDRoZHIuCiAqLwp0eXBlZGVmIHN0cnVjdCB0Y3A0aGRyIFRjcDRoZHI7CnN0cnVjdCB0Y3A0aGRyIHsKCXVpbnQ4X3QgdmlobDsJCQkJLyogVmVyc2lvbiBhbmQgaGVhZGVyIGxlbmd0aCAqLwoJdWludDhfdCB0b3M7CQkJCS8qIFR5cGUgb2Ygc2VydmljZSAqLwoJdWludDhfdCBsZW5ndGhbMl07CQkJLyogcGFja2V0IGxlbmd0aCAqLwoJdWludDhfdCBpZFsyXTsJCQkJLyogSWRlbnRpZmljYXRpb24gKi8KCXVpbnQ4X3QgZnJhZ1syXTsJCQkvKiBGcmFnbWVudCBpbmZvcm1hdGlvbiAqLwoJdWludDhfdCBVbnVzZWQ7Cgl1aW50OF90IHByb3RvOwoJdWludDhfdCB0Y3BsZW5bMl07Cgl1aW50OF90IHRjcHNyY1s0XTsKCXVpbnQ4X3QgdGNwZHN0WzRdOwoJc3RydWN0IHRjcGhkcjsKfTsKCnR5cGVkZWYgc3RydWN0IHRjcDZoZHIgVGNwNmhkcjsKc3RydWN0IHRjcDZoZHIgewoJdWludDhfdCB2Y2ZbNF07Cgl1aW50OF90IHBsb2FkbGVuWzJdOwoJdWludDhfdCBwcm90bzsKCXVpbnQ4X3QgdHRsOwoJdWludDhfdCB0Y3BzcmNbSVBhZGRybGVuXTsKCXVpbnQ4X3QgdGNwZHN0W0lQYWRkcmxlbl07CglzdHJ1Y3QgdGNwaGRyOwp9OwoKc3RydWN0IHNhY2tfYmxvY2sgewoJdWludDMyX3QgbGVmdDsKCXVpbnQzMl90IHJpZ2h0Owp9OwoKLyoKICogIHRoaXMgcmVwcmVzZW50cyB0aGUgY29udHJvbCBpbmZvCiAqICBmb3IgYSBzaW5nbGUgcGFja2V0LiAgSXQgaXMgZGVyaXZlZCBmcm9tCiAqICBhIHBhY2tldCBpbiBudG9odGNwezQsNn0oKSBhbmQgc3R1Y2sgaW50bwogKiAgYSBwYWNrZXQgaW4gaHRvbnRjcHs0LDZ9KCkuCiAqLwp0eXBlZGVmIHN0cnVjdCB0Y3AgVGNwOwpzdHJ1Y3QgdGNwIHsKCXVpbnQxNl90IHNvdXJjZTsKCXVpbnQxNl90IGRlc3Q7Cgl1aW50MzJfdCBzZXE7Cgl1aW50MzJfdCBhY2s7Cgl1aW50OF90IGZsYWdzOwoJdWludDE2X3Qgd3M7CQkJCS8qIHdpbmRvdyBzY2FsZSBvcHRpb24gKGlmIG5vdCB6ZXJvKSAqLwoJdWludDMyX3Qgd25kOwoJdWludDE2X3QgdXJnOwoJdWludDE2X3QgbXNzOwkJCQkvKiBtYXggc2VnbWVudCBzaXplIG9wdGlvbiAoaWYgbm90IHplcm8pICovCgl1aW50MTZfdCBsZW47CQkJCS8qIHNpemUgb2YgZGF0YSAqLwoJdWludDMyX3QgdHNfdmFsOwkJCS8qIHRpbWVzdGFtcCB2YWwgZnJvbSBzZW5kZXIgKi8KCXVpbnQzMl90IHRzX2VjcjsJCQkvKiB0aW1lc3RhbXAgZWNobyByZXNwb25zZSBmcm9tIHNlbmRlciAqLwoJYm9vbCBzYWNrX29rOwkJCQkvKiBoZWFkZXIgaGFkL3Nob3VsZCBoYXZlIFNBQ0tfUEVSTUlUVEVEICovCgl1aW50OF90IG5yX3NhY2tzOwoJc3RydWN0IHNhY2tfYmxvY2sgc2Fja3NbTUFYX05SX1NBQ0tTX1BFUl9QQUNLRVRdOwp9OwoKLyoKICogIHRoaXMgaGVhZGVyIGlzIG1hbGxvYydkIHRvIHRocmVhZCB0b2dldGhlciBmcmFnbWVudHMKICogIHdhaXRpbmcgdG8gYmUgY29hbGVzY2VkCiAqLwp0eXBlZGVmIHN0cnVjdCByZXNlcSBSZXNlcTsKc3RydWN0IHJlc2VxIHsKCVJlc2VxICpuZXh0OwoJVGNwIHNlZzsKCXN0cnVjdCBibG9jayAqYnA7Cgl1aW50MTZfdCBsZW5ndGg7Cn07CgovKgogKiAgdGhlIHFsb2NrIGluIHRoZSBDb252IGxvY2tzIHRoaXMgc3RydWN0dXJlCiAqLwp0eXBlZGVmIHN0cnVjdCB0Y3BjdGwgVGNwY3RsOwpzdHJ1Y3QgdGNwY3RsIHsKCXVpbnQ4X3Qgc3RhdGU7CQkJCS8qIENvbm5lY3Rpb24gc3RhdGUgKi8KCXVpbnQ4X3QgdHlwZTsJCQkJLyogTGlzdGVuaW5nIG9yIGFjdGl2ZSBjb25uZWN0aW9uICovCgl1aW50OF90IGNvZGU7CQkJCS8qIEljbXAgY29kZSAqLwoJc3RydWN0IHsKCQl1aW50MzJfdCB1bmE7CQkJLyogTGVmdCBlZGdlIG9mIHVuYWNrZWQgZGF0YSByZWdpb24gKi8KCQl1aW50MzJfdCBueHQ7CQkJLyogTmV4dCBzZXEgdG8gc2VuZCwgcmlnaHQgZWRnZSBvZiB1bmFja2VkICovCgkJdWludDMyX3QgcnR4OwkJCS8qIE5leHQgdG8gc2VuZCBmb3IgcmV0cmFucyAqLwoJCXVpbnQzMl90IHduZDsJCQkvKiBUY3Agc2VuZCB3aW5kb3cgKi8KCQl1aW50MzJfdCB1cmc7CQkJLyogVXJnZW50IGRhdGEgcG9pbnRlciAqLwoJCXVpbnQzMl90IHdsMjsKCQlpbnQgc2NhbGU7CQkJCS8qIGhvdyBtdWNoIHRvIHJpZ2h0IHNoaWZ0IHdpbmRvdyBmb3IgeG1pdCAqLwoJCXVpbnQzMl90IGluX2ZsaWdodDsJCS8qIGVzdGltYXRlIG9mIGhvdyBtdWNoIGlzIGluIGZsaWdodCAqLwoJCXVpbnQ4X3QgbG9zc19oaW50OwkJLyogbnVtYmVyIG9mIGxvc3MgaGludHMgcmN2ZCAqLwoJCXVpbnQ4X3Qgc2Fja19sb3NzX2hpbnQ7CS8qIEZvciBkZXRlY3Rpbmcgc2FjayByeG1pdCBsb3NzZXMgKi8KCQlib29sIGZsdXNoX3NhY2tzOwkJLyogVHdvIHRpbWVvdXRzIGluIGEgcm93ID09IGR1bXAgc2Fja3MgKi8KCQl1aW50OF90IHJlY292ZXJ5OwkJLyogbG9zcyByZWNvdmVyeSBmbGFnICovCgkJdWludDMyX3QgcmVjb3ZlcnlfcHQ7CS8qIHJpZ2h0IHdpbmRvdyBmb3IgcmVjb3ZlcnkgcG9pbnQgKi8KCQl1aW50OF90IG5yX3NhY2tzOwoJCXN0cnVjdCBzYWNrX2Jsb2NrIHNhY2tzW01BWF9OUl9TTkRfU0FDS1NdOwoJfSBzbmQ7CglzdHJ1Y3QgewoJCXVpbnQzMl90IG54dDsJCQkvKiBSZWNlaXZlIHBvaW50ZXIgdG8gbmV4dCB1aW50OF90IHNsb3QgKi8KCQl1aW50MzJfdCB3bmQ7CQkJLyogUmVjZWl2ZSB3aW5kb3cgaW5jb21pbmcgKi8KCQl1aW50MzJfdCB1cmc7CQkJLyogVXJnZW50IHBvaW50ZXIgKi8KCQlpbnQgYmxvY2tlZDsKCQlpbnQgdW5hOwkJCQkvKiB1bmFja2VkIGRhdGEgc2VncyAqLwoJCWludCBzY2FsZTsJCQkJLyogaG93IG11Y2ggdG8gbGVmdCBzaGlmdCB3aW5kb3cgZm9yIHJ4ICovCgkJdWludDhfdCBucl9zYWNrczsKCQlzdHJ1Y3Qgc2Fja19ibG9jayBzYWNrc1tNQVhfTlJfUkNWX1NBQ0tTXTsKCX0gcmN2OwoJdWludDMyX3QgaXNzOwkJCQkvKiBJbml0aWFsIHNlcXVlbmNlIG51bWJlciAqLwoJaW50IHNhd3dzb3B0OwkJCQkvKiB0cnVlIGlmIHdlIHNhdyBhIHdzb3B0IG9uIHRoZSBpbmNvbWluZyBTWU4gKi8KCXVpbnQzMl90IGN3aW5kOwkJCQkvKiBDb25nZXN0aW9uIHdpbmRvdyAqLwoJaW50IHNjYWxlOwkJCQkJLyogZGVzaXJlZCBzbmQuc2NhbGUgKi8KCXVpbnQzMl90IHNzdGhyZXNoOwkJCS8qIFNsb3cgc3RhcnQgdGhyZXNob2xkICovCglpbnQgaXJzOwkJCQkJLyogSW5pdGlhbCByZWNlaXZlZCBzcXVlbmNlICovCgl1aW50MTZfdCBtc3M7CQkJCS8qIE1heCBzZWdtZW50IHNpemUgKi8KCXVpbnQxNl90IHR5cGljYWxfbXNzOwkJLyogTVNTIGZvciBtb3N0IHBhY2tldHMgKDwgTVNTIGZvciBzb21lIG9wdHMpICovCglpbnQgcmVyZWN2OwkJCQkJLyogT3ZlcmxhcCBvZiBkYXRhIHJlcmVjZXZpdmVkICovCgl1aW50MzJfdCB3aW5kb3c7CQkJLyogUmVjZXZpdmUgd2luZG93ICovCgl1aW50OF90IGJhY2tvZmY7CQkJLyogRXhwb25lbnRpYWwgYmFja29mZiBjb3VudGVyICovCglpbnQgYmFja2Vkb2ZmOwkJCQkvKiBtcyB3ZSd2ZSBiYWNrZWQgb2ZmIGZvciByZXhtaXRzICovCgl1aW50OF90IGZsYWdzOwkJCQkvKiBTdGF0ZSBmbGFncyAqLwoJUmVzZXEgKnJlc2VxOwkJCQkvKiBSZXNlcXVlbmNpbmcgcXVldWUgKi8KCVRjcHRpbWVyIHRpbWVyOwkJCQkvKiBBY3Rpdml0eSB0aW1lciAqLwoJVGNwdGltZXIgYWNrdGltZXI7CQkJLyogQWNrbm93bGVkZ2UgdGltZXIgKi8KCVRjcHRpbWVyIHJ0dF90aW1lcjsJCQkvKiBSb3VuZCB0cmlwIHRpbWVyICovCglUY3B0aW1lciBrYXRpbWVyOwkJCS8qIGtlZXAgYWxpdmUgdGltZXIgKi8KCXVpbnQzMl90IHJ0dHNlcTsJCQkvKiBSb3VuZCB0cmlwIHNlcXVlbmNlICovCglpbnQgc3J0dDsJCQkJCS8qIFNob3J0ZW5lZCByb3VuZCB0cmlwICovCglpbnQgbWRldjsJCQkJCS8qIE1lYW4gZGV2aWF0aW9uIG9mIHJvdW5kIHRyaXAgKi8KCWludCBrYWNvdW50ZXI7CQkJCS8qIGNvdW50IGRvd24gZm9yIGtlZXAgYWxpdmUgKi8KCXVpbnQ2NF90IHNuZHN5bnRpbWU7CQkvKiB0aW1lIHN5biBzZW50ICovCgl1aW50NjRfdCB0aW1lOwkJCQkvKiB0aW1lIEZpbndhaXQyIHdhcyBzZW50ICovCglpbnQgbm9jaGVja3N1bTsJCQkJLyogbm9uLXplcm8gbWVhbnMgZG9uJ3Qgc2VuZCBjaGVja3N1bXMgKi8KCWludCBmbGdjbnQ7CQkJCQkvKiBudW1iZXIgb2YgZmxhZ3MgaW4gdGhlIHNlcXVlbmNlIChGSU4sU1lOKSAqLwoJdWludDMyX3QgdHNfcmVjZW50OwkJCS8qIHRpbWVzdGFtcCByZWNlaXZlZCBhcm91bmQgbGFzdF9hY2tfc2VudCAqLwoJdWludDMyX3QgbGFzdF9hY2tfc2VudDsJCS8qIHRvIGRldGVybWluZSB3aGVuIHRvIHVwZGF0ZSB0aW1lc3RhbXAgKi8KCWJvb2wgc2Fja19vazsJCQkJLyogQ2FuIHVzZSBTQUNLIGZvciB0aGlzIGNvbm5lY3Rpb24gKi8KCXN0cnVjdCBJcGlmYyAqaWZjOwkJCS8qIFVuY291bnRlZCByZWYgKi8KCgl1bmlvbiB7CgkJVGNwNGhkciB0Y3A0aGRyOwoJCVRjcDZoZHIgdGNwNmhkcjsKCX0gcHJvdG9oZHI7CQkJCQkvKiBwcm90b3R5cGUgaGVhZGVyICovCn07CgovKiBOZXcgY2FsbHMgYXJlIHB1dCBpbiBsaW1ibyByYXRoZXIgdGhhbiBoYXZpbmcgYSBjb252ZXJzYXRpb24gc3RydWN0dXJlCiAqICBhbGxvY2F0ZWQuICBUaHVzLCBhIFNZTiBhdHRhY2sgcmVzdWx0cyBpbiBsb3RzIG9mIGxpbWJvJ2QgY2FsbHMgYnV0IG5vdCBhbnkKICogIHJlYWwgQ29udiBzdHJ1Y3R1cmVzIG11Y2tpbmcgdGhpbmdzIHVwLiAgQ2FsbHMgaW4gbGltYm8gcmV4bWl0IHRoZWlyIFNZTiBBQ0sKICogIGV2ZXJ5IFNZTkFDS19SWFRJTUVSIG1zIHVwIHRvIDQgdGltZXMsIGkuZS4sIHRoZXkgZGlzYXBwZWFyIGFmdGVyIDEgc2Vjb25kLgogKgogKiAgSW4gcGFydGljdWxhciB0aGV5IGFyZW4ndCBvbiBhIGxpc3RlbmVyJ3MgcXVldWUgc28gdGhhdCB0aGV5IGRvbid0IGZpZ3VyZSBpbgogKiAgdGhlIGlucHV0IHF1ZXVlIGxpbWl0LgogKgogKiAgSWYgMS8yIG9mIGEgVDMgd2FzIGF0dGFja2luZyBTWU4gcGFja2V0cywgd2UnbGQgaGF2ZSBhIHBlcm1hbmVudCBxdWV1ZSBvZgogKiAgNzAwMDAgbGltYm8nZCBjYWxscy4gIE5vdCBncmVhdCBmb3IgYSBsaW5lYXIgbGlzdCBidXQgZG9hYmxlLiAgVGhlcmVmb3JlCiAqICB0aGVyZSBpcyBubyBoYXNoaW5nIG9mIHRoaXMgbGlzdC4KICovCnR5cGVkZWYgc3RydWN0IGxpbWJvIExpbWJvOwpzdHJ1Y3QgbGltYm8gewoJTGltYm8gKm5leHQ7CgoJdWludDhfdCBsYWRkcltJUGFkZHJsZW5dOwoJdWludDhfdCByYWRkcltJUGFkZHJsZW5dOwoJdWludDE2X3QgbHBvcnQ7Cgl1aW50MTZfdCBycG9ydDsKCXVpbnQzMl90IGlyczsJCQkJLyogaW5pdGlhbCByZWNlaXZlZCBzZXF1ZW5jZSAqLwoJdWludDMyX3QgaXNzOwkJCQkvKiBpbml0aWFsIHNlbnQgc2VxdWVuY2UgKi8KCXVpbnQxNl90IG1zczsJCQkJLyogbXNzIGZyb20gdGhlIG90aGVyIGVuZCAqLwoJdWludDE2X3QgcmN2c2NhbGU7CQkJLyogaG93IG11Y2ggdG8gc2NhbGUgcmN2ZCB3aW5kb3dzICovCgl1aW50MTZfdCBzbmRzY2FsZTsJCQkvKiBob3cgbXVjaCB0byBzY2FsZSBzZW50IHdpbmRvd3MgKi8KCXVpbnQ2NF90IGxhc3RzZW5kOwkJCS8qIGxhc3QgdGltZSB3ZSBzZW50IGEgc3luYWNrICovCgl1aW50OF90IHZlcnNpb247CQkJLyogdjQgb3IgdjYgKi8KCXVpbnQ4X3QgcmV4bWl0czsJCQkvKiBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zICovCglib29sIHNhY2tfb2s7CQkJCS8qIG90aGVyIHNpZGUgc2FpZCBTQUNLX09LICovCgl1aW50MzJfdCB0c192YWw7CQkJLyogdGltZXN0YW1wIHZhbCBmcm9tIHNlbmRlciAqLwoJc3RydWN0IElwaWZjICppZmM7CQkJLyogVW5jb3VudGVkIHJlZiAqLwp9OwoKZW51bSB7CgkvKiBNSUIgc3RhdHMgKi8KCU1heENvbm4sCglBY3RpdmVPcGVucywKCVBhc3NpdmVPcGVucywKCUVzdGFiUmVzZXRzLAoJQ3VyckVzdGFiLAoJSW5TZWdzLAoJT3V0U2VncywKCVJldHJhbnNTZWdzLAoJUmV0cmFuc1RpbWVvdXRzLAoJSW5FcnJzLAoJT3V0UnN0cywKCgkvKiBub24tTUlCIHN0YXRzICovCglDc3VtRXJycywKCUhsZW5FcnJzLAoJTGVuRXJycywKCU91dE9mT3JkZXIsCgoJTnN0YXRzCn07Cgp0eXBlZGVmIHN0cnVjdCB0Y3Bwcml2IFRjcHByaXY7CnN0cnVjdCB0Y3Bwcml2IHsKCS8qIExpc3Qgb2YgYWN0aXZlIHRpbWVycyAqLwoJcWxvY2tfdCB0bDsKCVRjcHRpbWVyICp0aW1lcnM7CgoJLyogaGFzaCB0YWJsZSBmb3IgbWF0Y2hpbmcgY29udmVyc2F0aW9ucyAqLwoJc3RydWN0IElwaHQgaHQ7CgoJLyogY2FsbHMgaW4gbGltYm8gd2FpdGluZyBmb3IgYW4gQUNLIHRvIG91ciBTWU4gQUNLICovCglpbnQgbmxpbWJvOwoJTGltYm8gKmxodFtOTEhUXTsKCgkvKiBmb3Iga2VlcGluZyB0cmFjayBvZiB0Y3BhY2twcm9jICovCglxbG9ja190IGFwbDsKCWludCBhY2twcm9jc3RhcnRlZDsKCgl1aW50MzJfdCBzdGF0c1tOc3RhdHNdOwp9OwoKc3RhdGljIGlubGluZSBpbnQgc2VxX3dpdGhpbih1aW50MzJfdCB4LCB1aW50MzJfdCBsb3csIHVpbnQzMl90IGhpZ2gpCnsKCWlmIChsb3cgPD0gaGlnaCkgewoJCWlmIChsb3cgPD0geCAmJiB4IDw9IGhpZ2gpCgkJCXJldHVybiAxOwoJfSBlbHNlIHsKCQlpZiAoeCA+PSBsb3cgfHwgeCA8PSBoaWdoKQoJCQlyZXR1cm4gMTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBzZXFfbHQodWludDMyX3QgeCwgdWludDMyX3QgeSkKewoJcmV0dXJuIChpbnQpKHggLSB5KSA8IDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHNlcV9sZSh1aW50MzJfdCB4LCB1aW50MzJfdCB5KQp7CglyZXR1cm4gKGludCkoeCAtIHkpIDw9IDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHNlcV9ndCh1aW50MzJfdCB4LCB1aW50MzJfdCB5KQp7CglyZXR1cm4gKGludCkoeCAtIHkpID4gMDsKfQoKc3RhdGljIGlubGluZSBpbnQgc2VxX2dlKHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCnsKCXJldHVybiAoaW50KSh4IC0geSkgPj0gMDsKfQoKc3RhdGljIGlubGluZSB1aW50MzJfdCBzZXFfbWF4KHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCnsKCXJldHVybiBzZXFfZ2UoeCwgeSkgPyB4IDogeTsKfQoKc3RhdGljIGlubGluZSB1aW50MzJfdCBzZXFfbWluKHVpbnQzMl90IHgsIHVpbnQzMl90IHkpCnsKCXJldHVybiBzZXFfbGUoeCwgeSkgPyB4IDogeTsKfQoKLyogQ2FsbGVyIG5lZWRzIHRvIGtub3cgd2UncmUgVENQIGFuZCB3aXRoIHRyYW5zcG9ydF9vZmZzZXQgc2V0LCB3aGljaCBpcwogKiB1c3VhbGx5IG9uIHRoZSBvdXRib3VuZCBuZXR3b3JrIHBhdGguICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcGhkciAqdGNwX2hkcihzdHJ1Y3QgYmxvY2sgKmJwKQp7CglyZXR1cm4gKHN0cnVjdCB0Y3BoZHIqKShicC0+cnAgKyBicC0+dHJhbnNwb3J0X29mZnNldCk7Cn0KCnN0YXRpYyBpbmxpbmUgc2l6ZV90IHRjcF9oZHJsZW4oc3RydWN0IGJsb2NrICpicCkKewoJc3RydWN0IHRjcGhkciAqaGRyID0gdGNwX2hkcihicCk7Cgl1aW50OF90IGRhdGFfb2Zmc2V0OwoKCWRhdGFfb2Zmc2V0ID0gaGRyLT50Y3BmbGFnWzBdID4+IDQ7CglyZXR1cm4gZGF0YV9vZmZzZXQgKiA0Owp9Cg==